xmacro
xmacro is a simple tool to define and parse XML macro. it's inspired by ros/xacro which is an XML macro language desiged for urdf. xmacro looks like a simplified version of ros/xacro, it's simpler, but it works well both for urdf and sdf. in addition it's flexible, and also easy to use.
xmacrois independent of ROS, you could install it bypip.- XML namespace isn't used in
xmacro, there are some reserved tags:xmacro_include,xmacro_define_value,xmacro_define_block,xmacro_block. - it provides python api so that we could parse xml file in ROS2 launch file.
xmacro4sdf:xmacrowith some specific functions forsdf(pre-defined common macro,xmacro_includepath parser formodel://).xmacro4urdf:xmacrowith some specific functions forurdf(pre-defined common macro,xmacro_includepath parser forpackage://).
Usage
Installation
# install by pip
pip install xmacro
# install from source code
git clone https://github.com/gezp/xmacro.git
cd xmacro && sudo python3 setup.py install
examples
# some examples in folder test/xmacro
xmacro test_xmacro_block.xml.xmacro > test_xmacro_block.xml
XMLMacro Features
- Value macro
- Block macro
- Math expressions
- Include
- Python API
Value macro
Value macro are named values that can be inserted anywhere into the XML document except <xmacro_define_block> block.
xmacro definition
<!--definition of properties -->
<xmacro_define_value name="radius" value="4.3" />
<!--use of properties-->
<circle diameter="${2 * radius}" />
generated xml
<circle diameter="8.6" />
Block macro
Define block macros with the macro tag <xmacro_define_block>, then specify the macro name and a list of parameters. The list of parameters should be whitespace separated.
The usage of block macros is to define <xmacro_block> which will be replaced with corresponding <xmacro_define_block> block.
xmacro definition
<!--definition of macro-->
<xmacro_define_value name="mass" value="0.2" />
<xmacro_define_block name="box_inertia" params="m x y z">
<mass>${m}</mass>
<inertia>
<ixx>${m*(y*y+z*z)/12}</ixx>
<ixy>0</ixy>
<ixz>0</ixz>
<iyy>${m*(x*x+z*z)/12}</iyy>
<iyz>0</iyz>
<izz>${m*(x*x+z*z)/12}</izz>
</inertia>
</xmacro_define_block>
<!--use of macro-->
<inertial>
<pose>0 0 0.02 0 0 0</pose>
<xmacro_block name="box_inertia" m="${mass}" x="0.3" y="0.1" z="0.2"/>
</inertial>
generated xml
<inertial>
<pose>0 0 0.02 0 0 0</pose>
<mass>0.2</mass>
<inertia>
<ixx>0.0008333333333333335</ixx>
<ixy>0</ixy>
<ixz>0</ixz>
<iyy>0.002166666666666667</iyy>
<iyz>0</iyz>
<izz>0.002166666666666667</izz>
</inertia>
</inertial>
- only support simple parameters (string and number), and block parameters isn't supported.
- it's supported to use other
xmacro_blockinxmacro_define_blockwhich is recursive definition (the max nesting level is 5).
condition block
a example here (you could find more examples in test/xmacro/test_xmacro_condition.xml.xmacro)
<!--use of macro-->
<inertial>
<pose>0 0 0.02 0 0 0</pose>
<xmacro_block name="box_inertia" m="${mass}" x="0.3" y="0.1" z="0.2" condition="${mass==0.2}"/>
</inertial>
- the
conditioncan beTrue,False,1,0, we can also use math expression to define condition, but operator<and>isn't supported in math expression. - if
conditionisFalseor0, thexmacro_blockwou't be loaded. conditionis reserved attribute of<xmacro_block>, soconditioncan't be used asparamsof<xmacro_define_block>.
Math expressions
- within dollared-braces
${xxxx}, you can also write simple math expressions. - refer to examples of Value macro and Block macro
- it's implemented by calling
eval()in python, so it's unsafe for some cases.
Including other xmacro files
You can include other xmacro files by using the <xmacro_include> tag.
- it will include the xmcaro definition with tag
<xmacro_define_value>and macros with tag<xmacro_define_block>.
<xmacro_include uri="file://simple_car/model.sdf.xmacro"/>
- The uri for
filemeans to open the file directly.- it try to open the file with relative path
simple_car/model.sdf.xmacro. - you can also try to open file with absolute path
/simple_car/model.sdf.xmacrowith urifile:///simple_car/model.sdf.xmacro.
- it try to open the file with relative path
<xmacro_include>supports to include recursively.
Python API
you can use xmacro in python easily
from xmacro.xmacro import XMLMacro
xmacro=XMLMacro()
#case1 parse from file
xmacro.set_xml_file(inputfile)
xmacro.generate()
xmacro.to_file(outputfile)
#case2 parse from xml string
xmacro.set_xml_string(xml_str)
xmacro.generate()
xmacro.to_file(outputfile)
#case3 generate to string
xmacro.set_xml_file(inputfile)
xmacro.generate()
xmacro.to_string()
#case4 custom macro value
xmacro.set_xml_file(inputfile)
# use custom dictionary to overwrite global macro value defined by <xmacro_define_value>
kv={"rplidar_a2_h":0.8}
xmacro.generate(kv)
xmacro.to_file(outputfile)
XMLMacro4sdf Features
pre-defined common.sdf.xmacro
<!--macro defination:inertia-->
<xmacro_define_block name="inertia_cylinder" params="m r l">
<xmacro_define_block name="inertia_box" params="m x y z">
<xmacro_define_block name="inertia_sphere" params="m r">
<!--macro defination:geometry-->
<xmacro_define_block name="geometry_cylinder" params="r l">
<xmacro_define_block name="geometry_box" params="x y z">
<xmacro_define_block name="geometry_sphere" params="r">
<xmacro_define_block name="geometry_mesh" params="uri">
<!--macro defination:visual_collision_with_mesh-->
<xmacro_define_block name="visual_collision_with_mesh" params="prefix uri">
examples
# some examples in folder test/sdf
xmacro4sdf model.sdf.xmacro > model.sdf
XMLMacro4urdf Features
pre-defined common.urdf.xmacro
<!--macro defination:inertia-->
<xmacro_define_block name="inertia_cylinder" params="m r l">
<xmacro_define_block name="inertia_box" params="m x y z">
<xmacro_define_block name="inertia_sphere" params="m r">
<!--macro defination:geometry-->
<xmacro_define_block name="geometry_cylinder" params="r l">
<xmacro_define_block name="geometry_box" params="x y z">
<xmacro_define_block name="geometry_sphere" params="r">
<xmacro_define_block name="geometry_mesh" params="uri">
examples
# some examples in folder test/urdf
xmacro4urdf robot.urdf.xmacro > robot.urdf
Maintainer and License
maintainer : Zhenpeng Ge, zhenpeng.ge@qq.com
xmacro is provided under MIT License.
Metadata
Release files for xmacro 1.2.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| xmacro-1.2.1.tar.gz | 10.6 kB | Without provenance | Details for xmacro-1.2.1.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| xmacro-1.2.1-py3-none-any.whl | Python 3 | none | any | Details for xmacro-1.2.1-py3-none-any.whl |
Total release size: 21.6 kB
Release files / xmacro-1.2.1.tar.gz
| Download URL | xmacro-1.2.1.tar.gz |
|---|---|
| Size | 10.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
774cbcb393533ca1fbe71a27393e18d6f5d7c8af8071a18e43e00029149f8d62
|
|
BLAKE2b-256 checksum How to use checksums |
daee46125757ecbdc94c39e179dfdcf6d7f4f2df4a78b97805569869770d4d93
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/3.7.1 importlib_metadata/4.10.1 pkginfo/1.8.2 requests/2.27.1 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.10.1
|
Release files / xmacro-1.2.1-py3-none-any.whl
| Download URL | xmacro-1.2.1-py3-none-any.whl |
|---|---|
| Size | 10.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
1e79811915e3d8db1932615f239b5dab73972496454ad9315fb46fb696d956cc
|
|
BLAKE2b-256 checksum How to use checksums |
5efc2af0caaa9b72b5185951b3655da23293518c6497849a012dfe8ec3a8354d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/3.7.1 importlib_metadata/4.10.1 pkginfo/1.8.2 requests/2.27.1 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.10.1
|
Security for xmacro 1.2.1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.