a simple XML macro tool
Project description
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.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file xmacro-1.2.1.tar.gz.
File metadata
- Download URL: xmacro-1.2.1.tar.gz
- Upload date:
- Size: 10.6 kB
- Tags: Source
- Uploaded using 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
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
774cbcb393533ca1fbe71a27393e18d6f5d7c8af8071a18e43e00029149f8d62
|
|
| MD5 |
86379cd868d2ff38b4caf55d74222ced
|
|
| BLAKE2b-256 |
daee46125757ecbdc94c39e179dfdcf6d7f4f2df4a78b97805569869770d4d93
|
File details
Details for the file xmacro-1.2.1-py3-none-any.whl.
File metadata
- Download URL: xmacro-1.2.1-py3-none-any.whl
- Upload date:
- Size: 10.9 kB
- Tags: Python 3
- Uploaded using 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
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1e79811915e3d8db1932615f239b5dab73972496454ad9315fb46fb696d956cc
|
|
| MD5 |
e364f0cb6f8fd55eba7d205e4d3ed063
|
|
| BLAKE2b-256 |
5efc2af0caaa9b72b5185951b3655da23293518c6497849a012dfe8ec3a8354d
|