Working on simulation
working on camotics with multiple file output and tests
This commit is contained in:
@@ -224,6 +224,7 @@ SET(PathTests_SRCS
|
||||
PathTests/PathTestUtils.py
|
||||
PathTests/test_adaptive.fcstd
|
||||
PathTests/test_centroid_00.ngc
|
||||
PathTests/test_filenaming.fcstd
|
||||
PathTests/test_geomop.fcstd
|
||||
PathTests/test_holes00.fcstd
|
||||
PathTests/test_linuxcnc_00.ngc
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
<file>icons/Path_BStep.svg</file>
|
||||
<file>icons/Path_BStop.svg</file>
|
||||
<file>icons/Path_BaseGeometry.svg</file>
|
||||
<file>icons/Path_Camotics.svg</file>
|
||||
<file>icons/Path_Comment.svg</file>
|
||||
<file>icons/Path_Compound.svg</file>
|
||||
<file>icons/Path_Contour.svg</file>
|
||||
@@ -130,6 +131,7 @@
|
||||
<file>panels/ToolBitSelector.ui</file>
|
||||
<file>panels/ToolEditor.ui</file>
|
||||
<file>panels/ToolLibraryEditor.ui</file>
|
||||
<file>panels/TaskPathCamoticsSim.ui</file>
|
||||
<file>panels/TaskPathSimulator.ui</file>
|
||||
<file>panels/ZCorrectEdit.ui</file>
|
||||
<file>preferences/Advanced.ui</file>
|
||||
|
||||
@@ -0,0 +1,644 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
sodipodi:docname="Path_Camotics.svg"
|
||||
inkscape:version="0.92.3 (2405546, 2018-03-11)"
|
||||
version="1.1"
|
||||
id="svg2816"
|
||||
height="64px"
|
||||
width="64px">
|
||||
<defs
|
||||
id="defs2818">
|
||||
<linearGradient
|
||||
id="linearGradient1830">
|
||||
<stop
|
||||
id="stop1826"
|
||||
offset="0"
|
||||
style="stop-color:#729fcf;stop-opacity:1" />
|
||||
<stop
|
||||
id="stop1828"
|
||||
offset="1"
|
||||
style="stop-color:#204a87;stop-opacity:1" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient1802">
|
||||
<stop
|
||||
id="stop1798"
|
||||
offset="0"
|
||||
style="stop-color:#729fcf;stop-opacity:1" />
|
||||
<stop
|
||||
id="stop1800"
|
||||
offset="1"
|
||||
style="stop-color:#204a87;stop-opacity:1" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient1796">
|
||||
<stop
|
||||
id="stop1792"
|
||||
offset="0"
|
||||
style="stop-color:#729fcf;stop-opacity:1" />
|
||||
<stop
|
||||
id="stop1794"
|
||||
offset="1"
|
||||
style="stop-color:#204a87;stop-opacity:1" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient1105">
|
||||
<stop
|
||||
style="stop-color:#729fcf;stop-opacity:1"
|
||||
offset="0"
|
||||
id="stop1101" />
|
||||
<stop
|
||||
style="stop-color:#204a87;stop-opacity:1"
|
||||
offset="1"
|
||||
id="stop1103" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient4513">
|
||||
<stop
|
||||
id="stop4515"
|
||||
offset="0"
|
||||
style="stop-color:#ffffff;stop-opacity:1;" />
|
||||
<stop
|
||||
id="stop4517"
|
||||
offset="1"
|
||||
style="stop-color:#999999;stop-opacity:1;" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient3681">
|
||||
<stop
|
||||
style="stop-color:#fff110;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop3697" />
|
||||
<stop
|
||||
id="stop3685"
|
||||
offset="1"
|
||||
style="stop-color:#cf7008;stop-opacity:1;" />
|
||||
</linearGradient>
|
||||
<inkscape:perspective
|
||||
id="perspective2824"
|
||||
inkscape:persp3d-origin="32 : 21.333333 : 1"
|
||||
inkscape:vp_z="64 : 32 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="-8 : 72 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<inkscape:perspective
|
||||
sodipodi:type="inkscape:persp3d"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
id="perspective3622" />
|
||||
<inkscape:perspective
|
||||
sodipodi:type="inkscape:persp3d"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
id="perspective3622-9" />
|
||||
<inkscape:perspective
|
||||
sodipodi:type="inkscape:persp3d"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
id="perspective3653" />
|
||||
<inkscape:perspective
|
||||
sodipodi:type="inkscape:persp3d"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
id="perspective3675" />
|
||||
<inkscape:perspective
|
||||
sodipodi:type="inkscape:persp3d"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
id="perspective3697" />
|
||||
<inkscape:perspective
|
||||
sodipodi:type="inkscape:persp3d"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
id="perspective3720" />
|
||||
<inkscape:perspective
|
||||
sodipodi:type="inkscape:persp3d"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
id="perspective3742" />
|
||||
<inkscape:perspective
|
||||
sodipodi:type="inkscape:persp3d"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
id="perspective3764" />
|
||||
<inkscape:perspective
|
||||
sodipodi:type="inkscape:persp3d"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
id="perspective3785" />
|
||||
<inkscape:perspective
|
||||
sodipodi:type="inkscape:persp3d"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
id="perspective3806" />
|
||||
<inkscape:perspective
|
||||
sodipodi:type="inkscape:persp3d"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
id="perspective3806-3" />
|
||||
<inkscape:perspective
|
||||
sodipodi:type="inkscape:persp3d"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
id="perspective3835" />
|
||||
<inkscape:perspective
|
||||
sodipodi:type="inkscape:persp3d"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
id="perspective3614" />
|
||||
<inkscape:perspective
|
||||
sodipodi:type="inkscape:persp3d"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
id="perspective3614-8" />
|
||||
<inkscape:perspective
|
||||
sodipodi:type="inkscape:persp3d"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
id="perspective3643" />
|
||||
<inkscape:perspective
|
||||
sodipodi:type="inkscape:persp3d"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
id="perspective3643-3" />
|
||||
<inkscape:perspective
|
||||
sodipodi:type="inkscape:persp3d"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
id="perspective3672" />
|
||||
<inkscape:perspective
|
||||
sodipodi:type="inkscape:persp3d"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
id="perspective3672-5" />
|
||||
<inkscape:perspective
|
||||
sodipodi:type="inkscape:persp3d"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
id="perspective3701" />
|
||||
<inkscape:perspective
|
||||
sodipodi:type="inkscape:persp3d"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
id="perspective3701-8" />
|
||||
<inkscape:perspective
|
||||
sodipodi:type="inkscape:persp3d"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
id="perspective3746" />
|
||||
<pattern
|
||||
inkscape:collect="always"
|
||||
xlink:href="#Strips1_1-4"
|
||||
id="pattern5231"
|
||||
patternTransform="matrix(0.67643728,-0.81829155,2.4578314,1.8844554,-26.450606,18.294947)" />
|
||||
<inkscape:perspective
|
||||
sodipodi:type="inkscape:persp3d"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
id="perspective5224" />
|
||||
<pattern
|
||||
inkscape:collect="always"
|
||||
patternUnits="userSpaceOnUse"
|
||||
width="2"
|
||||
height="1"
|
||||
patternTransform="matrix(0.66772843,-1.0037085,2.4261878,2.3114548,3.4760987,3.534923)"
|
||||
id="Strips1_1-4"
|
||||
inkscape:stockid="Stripes 1:1">
|
||||
<rect
|
||||
style="fill:black;stroke:none"
|
||||
x="0"
|
||||
y="-0.5"
|
||||
width="1"
|
||||
height="2"
|
||||
id="rect4483-4" />
|
||||
</pattern>
|
||||
<inkscape:perspective
|
||||
sodipodi:type="inkscape:persp3d"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
id="perspective5224-9" />
|
||||
<pattern
|
||||
inkscape:collect="always"
|
||||
xlink:href="#Strips1_1-6"
|
||||
id="pattern5231-4"
|
||||
patternTransform="matrix(0.66772843,-1.0037085,2.4261878,2.3114548,39.618381,8.9692804)" />
|
||||
<inkscape:perspective
|
||||
sodipodi:type="inkscape:persp3d"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
id="perspective5224-3" />
|
||||
<pattern
|
||||
inkscape:collect="always"
|
||||
patternUnits="userSpaceOnUse"
|
||||
width="2"
|
||||
height="1"
|
||||
patternTransform="matrix(0.66772843,-1.0037085,2.4261878,2.3114548,3.4760987,3.534923)"
|
||||
id="Strips1_1-6"
|
||||
inkscape:stockid="Stripes 1:1">
|
||||
<rect
|
||||
style="fill:black;stroke:none"
|
||||
x="0"
|
||||
y="-0.5"
|
||||
width="1"
|
||||
height="2"
|
||||
id="rect4483-0" />
|
||||
</pattern>
|
||||
<pattern
|
||||
inkscape:collect="always"
|
||||
xlink:href="#pattern5231-3"
|
||||
id="pattern5296"
|
||||
patternTransform="matrix(0.66513382,-1.0631299,2.4167603,2.4482973,-49.762569,2.9546807)" />
|
||||
<inkscape:perspective
|
||||
sodipodi:type="inkscape:persp3d"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
id="perspective5288" />
|
||||
<pattern
|
||||
inkscape:collect="always"
|
||||
xlink:href="#Strips1_1-4-3"
|
||||
id="pattern5231-3"
|
||||
patternTransform="matrix(0.66772843,-1.0037085,2.4261878,2.3114548,-26.336284,10.887197)" />
|
||||
<pattern
|
||||
inkscape:collect="always"
|
||||
patternUnits="userSpaceOnUse"
|
||||
width="2"
|
||||
height="1"
|
||||
patternTransform="matrix(0.66772843,-1.0037085,2.4261878,2.3114548,3.4760987,3.534923)"
|
||||
id="Strips1_1-4-3"
|
||||
inkscape:stockid="Stripes 1:1">
|
||||
<rect
|
||||
style="fill:black;stroke:none"
|
||||
x="0"
|
||||
y="-0.5"
|
||||
width="1"
|
||||
height="2"
|
||||
id="rect4483-4-6" />
|
||||
</pattern>
|
||||
<pattern
|
||||
inkscape:collect="always"
|
||||
xlink:href="#Strips1_1-9"
|
||||
id="pattern5330"
|
||||
patternTransform="matrix(0.42844886,-0.62155849,1.5567667,1.431396,27.948414,13.306456)" />
|
||||
<inkscape:perspective
|
||||
sodipodi:type="inkscape:persp3d"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
id="perspective5323" />
|
||||
<pattern
|
||||
inkscape:collect="always"
|
||||
patternUnits="userSpaceOnUse"
|
||||
width="2"
|
||||
height="1"
|
||||
patternTransform="matrix(0.66772843,-1.0037085,2.4261878,2.3114548,3.4760987,3.534923)"
|
||||
id="Strips1_1-9"
|
||||
inkscape:stockid="Stripes 1:1">
|
||||
<rect
|
||||
style="fill:black;stroke:none"
|
||||
x="0"
|
||||
y="-0.5"
|
||||
width="1"
|
||||
height="2"
|
||||
id="rect4483-3" />
|
||||
</pattern>
|
||||
<inkscape:perspective
|
||||
sodipodi:type="inkscape:persp3d"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
id="perspective5361" />
|
||||
<inkscape:perspective
|
||||
sodipodi:type="inkscape:persp3d"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
id="perspective5383" />
|
||||
<inkscape:perspective
|
||||
sodipodi:type="inkscape:persp3d"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
id="perspective5411" />
|
||||
<linearGradient
|
||||
gradientTransform="translate(127.27273,-51.272729)"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
y2="40.168594"
|
||||
x2="4.0605712"
|
||||
y1="41.087898"
|
||||
x1="37.89756"
|
||||
id="linearGradient3687"
|
||||
xlink:href="#linearGradient3681"
|
||||
inkscape:collect="always" />
|
||||
<linearGradient
|
||||
gradientTransform="translate(127.27273,-51.272729)"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
y2="43.558987"
|
||||
x2="59.811455"
|
||||
y1="40.484772"
|
||||
x1="37.894287"
|
||||
id="linearGradient3695"
|
||||
xlink:href="#linearGradient3681"
|
||||
inkscape:collect="always" />
|
||||
<linearGradient
|
||||
id="linearGradient3681-3">
|
||||
<stop
|
||||
style="stop-color:#fff110;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop3697-3" />
|
||||
<stop
|
||||
id="stop3685-4"
|
||||
offset="1"
|
||||
style="stop-color:#cf7008;stop-opacity:1;" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3681-3"
|
||||
id="linearGradient3608"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="translate(-37.00068,-20.487365)"
|
||||
x1="37.894287"
|
||||
y1="40.484772"
|
||||
x2="59.811455"
|
||||
y2="43.558987" />
|
||||
<linearGradient
|
||||
id="linearGradient4513-2">
|
||||
<stop
|
||||
id="stop4515-2"
|
||||
offset="0"
|
||||
style="stop-color:#ffffff;stop-opacity:1;" />
|
||||
<stop
|
||||
id="stop4517-4"
|
||||
offset="1"
|
||||
style="stop-color:#999999;stop-opacity:1;" />
|
||||
</linearGradient>
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient4513-2"
|
||||
id="radialGradient4538"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(1,0,0,1.1841158,-8.5173246,-3.4097568)"
|
||||
cx="32.151962"
|
||||
cy="7.9319997"
|
||||
fx="32.151962"
|
||||
fy="7.9319997"
|
||||
r="23.634638" />
|
||||
<linearGradient
|
||||
id="linearGradient4513-1">
|
||||
<stop
|
||||
id="stop4515-8"
|
||||
offset="0"
|
||||
style="stop-color:#ffffff;stop-opacity:1;" />
|
||||
<stop
|
||||
id="stop4517-6"
|
||||
offset="1"
|
||||
style="stop-color:#999999;stop-opacity:1;" />
|
||||
</linearGradient>
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient4513-1"
|
||||
id="radialGradient4538-6"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(1,0,0,1.1841158,-8.5173246,-3.4097568)"
|
||||
cx="32.151962"
|
||||
cy="7.9319997"
|
||||
fx="32.151962"
|
||||
fy="7.9319997"
|
||||
r="23.634638" />
|
||||
<linearGradient
|
||||
id="linearGradient4513-1-3">
|
||||
<stop
|
||||
id="stop4515-8-7"
|
||||
offset="0"
|
||||
style="stop-color:#ffffff;stop-opacity:1;" />
|
||||
<stop
|
||||
id="stop4517-6-5"
|
||||
offset="1"
|
||||
style="stop-color:#999999;stop-opacity:1;" />
|
||||
</linearGradient>
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient4513-1-3"
|
||||
id="radialGradient3069"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(0.39497909,0,0,1.1841158,-2.716491,-26.067007)"
|
||||
cx="32.151962"
|
||||
cy="35.869175"
|
||||
fx="32.151962"
|
||||
fy="35.869175"
|
||||
r="23.634638" />
|
||||
<linearGradient
|
||||
id="linearGradient4513-1-2">
|
||||
<stop
|
||||
id="stop4515-8-6"
|
||||
offset="0"
|
||||
style="stop-color:#ffffff;stop-opacity:1;" />
|
||||
<stop
|
||||
id="stop4517-6-6"
|
||||
offset="1"
|
||||
style="stop-color:#999999;stop-opacity:1;" />
|
||||
</linearGradient>
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient4513-1-2"
|
||||
id="radialGradient3102"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(0.39497909,0,0,1.1841158,-2.716491,-26.067007)"
|
||||
cx="32.151962"
|
||||
cy="35.869175"
|
||||
fx="32.151962"
|
||||
fy="35.869175"
|
||||
r="23.634638" />
|
||||
<linearGradient
|
||||
y2="54.227272"
|
||||
x2="36"
|
||||
y1="7.9999995"
|
||||
x1="30.000002"
|
||||
gradientTransform="translate(71.494719,-3.1982556)"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
id="linearGradient4055"
|
||||
xlink:href="#linearGradient4031"
|
||||
inkscape:collect="always" />
|
||||
<linearGradient
|
||||
id="linearGradient4031">
|
||||
<stop
|
||||
style="stop-color:#d3d7cf;stop-opacity:1"
|
||||
offset="0"
|
||||
id="stop4033" />
|
||||
<stop
|
||||
style="stop-color:#888a85;stop-opacity:1"
|
||||
offset="1"
|
||||
id="stop4035" />
|
||||
</linearGradient>
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
inkscape:document-rotation="0"
|
||||
inkscape:window-maximized="0"
|
||||
inkscape:window-y="24"
|
||||
inkscape:window-x="1979"
|
||||
inkscape:window-height="1028"
|
||||
inkscape:window-width="1017"
|
||||
inkscape:object-nodes="true"
|
||||
inkscape:object-paths="true"
|
||||
inkscape:snap-bbox-midpoints="true"
|
||||
inkscape:snap-bbox-edge-midpoints="true"
|
||||
inkscape:bbox-nodes="true"
|
||||
inkscape:bbox-paths="true"
|
||||
inkscape:snap-bbox="true"
|
||||
inkscape:grid-bbox="true"
|
||||
inkscape:document-units="px"
|
||||
showgrid="true"
|
||||
inkscape:current-layer="layer1"
|
||||
inkscape:cy="26.668103"
|
||||
inkscape:cx="29.975738"
|
||||
inkscape:zoom="4.64"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
borderopacity="1.0"
|
||||
bordercolor="#666666"
|
||||
pagecolor="#ffffff"
|
||||
id="base">
|
||||
<inkscape:grid
|
||||
snapvisiblegridlinesonly="true"
|
||||
enabled="true"
|
||||
visible="true"
|
||||
empspacing="2"
|
||||
id="grid3206"
|
||||
type="xygrid" />
|
||||
</sodipodi:namedview>
|
||||
<metadata
|
||||
id="metadata2821">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
<dc:title>Path_Drilling</dc:title>
|
||||
<dc:date>2015-07-04</dc:date>
|
||||
<dc:relation>http://www.freecadweb.org/wiki/index.php?title=Artwork</dc:relation>
|
||||
<dc:publisher>
|
||||
<cc:Agent>
|
||||
<dc:title>FreeCAD</dc:title>
|
||||
</cc:Agent>
|
||||
</dc:publisher>
|
||||
<dc:identifier>FreeCAD/src/Mod/Path/Gui/Resources/icons/Path_Drilling.svg</dc:identifier>
|
||||
<dc:rights>
|
||||
<cc:Agent>
|
||||
<dc:title>FreeCAD LGPL2+</dc:title>
|
||||
</cc:Agent>
|
||||
</dc:rights>
|
||||
<cc:license>https://www.gnu.org/copyleft/lesser.html</cc:license>
|
||||
<dc:contributor>
|
||||
<cc:Agent>
|
||||
<dc:title>[agryson] Alexander Gryson</dc:title>
|
||||
</cc:Agent>
|
||||
</dc:contributor>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:groupmode="layer"
|
||||
inkscape:label="Layer 1"
|
||||
id="layer1">
|
||||
<rect
|
||||
style="fill:#205693;fill-opacity:1;stroke:none;stroke-opacity:1"
|
||||
id="rect2127"
|
||||
width="60"
|
||||
height="60"
|
||||
x="2"
|
||||
y="2"
|
||||
ry="0" />
|
||||
<rect
|
||||
style="fill:#205693;fill-opacity:0;stroke:none;stroke-opacity:1"
|
||||
id="rect2143"
|
||||
width="56"
|
||||
height="56"
|
||||
x="4"
|
||||
y="4" />
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-variant:normal;font-weight:900;font-stretch:normal;font-size:58.82933426px;line-height:1.25;font-family:'Montserrat Alternates';-inkscape-font-specification:'Montserrat Alternates, Heavy';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:none;fill-opacity:1;stroke:#000000;stroke-width:4.11590576;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
x="8.5308275"
|
||||
y="53.681446"
|
||||
id="text2147"
|
||||
transform="scale(1.0340993,0.96702511)"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan2145"
|
||||
x="8.5308275"
|
||||
y="53.681446"
|
||||
style="font-style:normal;font-variant:normal;font-weight:900;font-stretch:normal;font-size:58.82933426px;font-family:'Montserrat Alternates';-inkscape-font-specification:'Montserrat Alternates, Heavy';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:none;stroke:#000000;stroke-width:4.11590576;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1">C</tspan></text>
|
||||
<path
|
||||
style="fill:none;stroke:#00ff00;stroke-width:1.92485321;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="M 8,36 V 62"
|
||||
id="path2151"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="fill:#ee5693;fill-opacity:1;stroke:#ff0000;stroke-width:1.93787384;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="M 2,54.932284 H 30"
|
||||
id="path2153"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 21 KiB |
@@ -0,0 +1,92 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>TaskPathSimulator</class>
|
||||
<widget class="QDialog" name="TaskPathSimulator">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>377</width>
|
||||
<height>361</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Path Simulator</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<item>
|
||||
<widget class="QProgressBar" name="progressBar">
|
||||
<property name="value">
|
||||
<number>23</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_2">
|
||||
<item>
|
||||
<widget class="QLabel" name="txtStatus">
|
||||
<property name="text">
|
||||
<string>TextLabel</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="horizontalSpacer_2">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_4">
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QSlider" name="timeSlider">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QTextBrowser" name="pathData"/>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="btnLaunchCamotics">
|
||||
<property name="text">
|
||||
<string>Launch Camotics</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="btnMakeFile">
|
||||
<property name="text">
|
||||
<string>Make Camotics File</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<resources>
|
||||
<include location="../Path.qrc"/>
|
||||
</resources>
|
||||
<connections/>
|
||||
<slots>
|
||||
<slot>SimStop()</slot>
|
||||
<slot>SimPlay()</slot>
|
||||
<slot>SimPause()</slot>
|
||||
<slot>SimStep()</slot>
|
||||
<slot>SimFF()</slot>
|
||||
</slots>
|
||||
</ui>
|
||||
@@ -88,6 +88,7 @@ class PathWorkbench(Workbench):
|
||||
from PySide.QtCore import QT_TRANSLATE_NOOP
|
||||
|
||||
import PathCommands
|
||||
import subprocess
|
||||
|
||||
PathGuiInit.Startup()
|
||||
|
||||
@@ -158,7 +159,13 @@ class PathWorkbench(Workbench):
|
||||
|
||||
if PathPreferences.advancedOCLFeaturesEnabled():
|
||||
try:
|
||||
import ocl
|
||||
subprocess.call(["camsim", "-v"])
|
||||
toolcmdlist.append("Path_Camotics")
|
||||
except FileNotFoundError:
|
||||
pass
|
||||
|
||||
try:
|
||||
import ocl # pylint: disable=unused-variable
|
||||
from PathScripts import PathSurfaceGui
|
||||
from PathScripts import PathWaterlineGui
|
||||
|
||||
|
||||
@@ -0,0 +1,464 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# ***************************************************************************
|
||||
# * Copyright (c) 2020 sliptonic <[email protected]> *
|
||||
# * *
|
||||
# * This program is free software; you can redistribute it and/or modify *
|
||||
# * it under the terms of the GNU Lesser General Public License (LGPL) *
|
||||
# * as published by the Free Software Foundation; either version 2 of *
|
||||
# * the License, or (at your option) any later version. *
|
||||
# * for detail see the LICENCE text file. *
|
||||
# * *
|
||||
# * This program is distributed in the hope that it will be useful, *
|
||||
# * but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||
# * GNU Library General Public License for more details. *
|
||||
# * *
|
||||
# * You should have received a copy of the GNU Library General Public *
|
||||
# * License along with this program; if not, write to the Free Software *
|
||||
# * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
|
||||
# * USA *
|
||||
# * *
|
||||
# ***************************************************************************
|
||||
|
||||
import FreeCAD
|
||||
import FreeCADGui
|
||||
import PathScripts.PathLog as PathLog
|
||||
from PySide.QtCore import QT_TRANSLATE_NOOP
|
||||
|
||||
# from pivy import coin
|
||||
# from itertools import cycle
|
||||
# import FreeCADGui as Gui
|
||||
import json
|
||||
|
||||
# import tempfile
|
||||
import os
|
||||
import Mesh
|
||||
|
||||
# import string
|
||||
# import random
|
||||
import camotics
|
||||
import PathScripts.PathPost as PathPost
|
||||
import io
|
||||
|
||||
# import time
|
||||
import PathScripts
|
||||
import queue
|
||||
from threading import Thread, Lock
|
||||
import subprocess
|
||||
|
||||
from PySide import QtCore, QtGui
|
||||
|
||||
__title__ = "Camotics Simulator"
|
||||
__author__ = "sliptonic (Brad Collette)"
|
||||
__url__ = "https://www.freecadweb.org"
|
||||
__doc__ = "Task panel for Camotics Simulation"
|
||||
|
||||
if False:
|
||||
PathLog.setLevel(PathLog.Level.DEBUG, PathLog.thisModule())
|
||||
PathLog.trackModule(PathLog.thisModule())
|
||||
else:
|
||||
PathLog.setLevel(PathLog.Level.INFO, PathLog.thisModule())
|
||||
|
||||
translate = FreeCAD.Qt.translate
|
||||
|
||||
|
||||
class CAMoticsUI:
|
||||
def __init__(self, simulation):
|
||||
# this will create a Qt widget from our ui file
|
||||
self.form = FreeCADGui.PySideUic.loadUi(":/panels/TaskPathCamoticsSim.ui")
|
||||
self.simulation = simulation
|
||||
self.initializeUI()
|
||||
self.lock = False
|
||||
|
||||
def initializeUI(self):
|
||||
self.form.timeSlider.sliderReleased.connect(
|
||||
lambda: self.simulation.execute(self.form.timeSlider.value())
|
||||
)
|
||||
self.form.progressBar.reset()
|
||||
self.form.timeSlider.setEnabled = False
|
||||
self.form.btnLaunchCamotics.clicked.connect(self.launchCamotics)
|
||||
self.form.btnMakeFile.clicked.connect(self.makeCamoticsFile)
|
||||
self.simulation.progressUpdate.connect(self.calculating)
|
||||
self.simulation.statusChange.connect(self.updateStatus)
|
||||
self.form.txtStatus.setText(translate("Path", "Drag Slider to Simulate"))
|
||||
|
||||
def launchCamotics(self):
|
||||
filename = self.makeCamoticsFile()
|
||||
subprocess.Popen(["camotics", filename])
|
||||
|
||||
def makeCamoticsFile(self):
|
||||
PathLog.track()
|
||||
filename = QtGui.QFileDialog.getSaveFileName(
|
||||
self.form,
|
||||
translate("Path", "Save Project As"),
|
||||
"",
|
||||
translate("Path", "Camotics Project (*.camotics)"),
|
||||
)[0]
|
||||
if filename:
|
||||
if not filename.endswith(".camotics"):
|
||||
filename += ".camotics"
|
||||
|
||||
text = self.simulation.buildproject()
|
||||
try:
|
||||
with open(filename, "w") as outputfile:
|
||||
outputfile.write(text)
|
||||
except IOError:
|
||||
QtGui.QMessageBox.information(
|
||||
self, translate("Path", "Unable to open file: {}".format(filename))
|
||||
)
|
||||
|
||||
return filename
|
||||
|
||||
def accept(self):
|
||||
self.simulation.accept()
|
||||
FreeCADGui.Control.closeDialog()
|
||||
|
||||
def reject(self):
|
||||
self.simulation.cancel()
|
||||
if self.simulation.simmesh is not None:
|
||||
FreeCAD.ActiveDocument.removeObject(self.simulation.simmesh.Name)
|
||||
FreeCADGui.Control.closeDialog()
|
||||
|
||||
def setRunTime(self, duration):
|
||||
self.form.timeSlider.setMinimum(0)
|
||||
self.form.timeSlider.setMaximum(duration)
|
||||
|
||||
def calculating(self, progress=0.0):
|
||||
self.form.timeSlider.setEnabled = progress == 1.0
|
||||
self.form.progressBar.setValue(int(progress * 100))
|
||||
|
||||
def updateStatus(self, status):
|
||||
self.form.txtStatus.setText(status)
|
||||
|
||||
|
||||
class CamoticsSimulation(QtCore.QObject):
|
||||
|
||||
SIM = camotics.Simulation()
|
||||
q = queue.Queue()
|
||||
progressUpdate = QtCore.Signal(object)
|
||||
statusChange = QtCore.Signal(object)
|
||||
simmesh = None
|
||||
filenames = []
|
||||
|
||||
SHAPEMAP = {
|
||||
"ballend": "Ballnose",
|
||||
"endmill": "Cylindrical",
|
||||
"v-bit": "Conical",
|
||||
"chamfer": "Snubnose",
|
||||
}
|
||||
|
||||
def worker(self, lock):
|
||||
while True:
|
||||
item = self.q.get()
|
||||
PathLog.debug("worker processing: {}".format(item))
|
||||
with lock:
|
||||
if item["TYPE"] == "STATUS":
|
||||
self.statusChange.emit(item["VALUE"])
|
||||
if item["VALUE"] == "DONE":
|
||||
self.SIM.wait()
|
||||
surface = self.SIM.get_surface("binary")
|
||||
self.SIM.wait()
|
||||
self.addMesh(surface)
|
||||
elif item["TYPE"] == "PROGRESS":
|
||||
self.progressUpdate.emit(item["VALUE"])
|
||||
self.q.task_done()
|
||||
|
||||
def __init__(self):
|
||||
super().__init__() # needed for QT signals
|
||||
lock = Lock()
|
||||
Thread(target=self.worker, daemon=True, args=(lock,)).start()
|
||||
|
||||
def callback(self, status, progress):
|
||||
self.q.put({"TYPE": "PROGRESS", "VALUE": progress})
|
||||
self.q.put({"TYPE": "STATUS", "VALUE": status})
|
||||
|
||||
def isDone(self, success):
|
||||
self.q.put({"TYPE": "STATUS", "VALUE": "DONE"})
|
||||
|
||||
def addMesh(self, surface):
|
||||
"""takes a binary stl and adds a Mesh to the current document"""
|
||||
|
||||
if self.simmesh is None:
|
||||
self.simmesh = FreeCAD.ActiveDocument.addObject("Mesh::Feature", "Camotics")
|
||||
buffer = io.BytesIO()
|
||||
buffer.write(surface)
|
||||
buffer.seek(0)
|
||||
mesh = Mesh.Mesh()
|
||||
mesh.read(buffer, "STL")
|
||||
self.simmesh.Mesh = mesh
|
||||
# Mesh.show(mesh)
|
||||
|
||||
def Activate(self):
|
||||
self.taskForm = CAMoticsUI(self)
|
||||
FreeCADGui.Control.showDialog(self.taskForm)
|
||||
self.job = FreeCADGui.Selection.getSelectionEx()[0].Object
|
||||
self.SIM.set_metric()
|
||||
self.SIM.set_resolution("high")
|
||||
|
||||
bb = self.job.Stock.Shape.BoundBox
|
||||
self.SIM.set_workpiece(
|
||||
min=(bb.XMin, bb.YMin, bb.ZMin), max=(bb.XMax, bb.YMax, bb.ZMax)
|
||||
)
|
||||
|
||||
for t in self.job.Tools.Group:
|
||||
self.SIM.set_tool(
|
||||
t.ToolNumber,
|
||||
metric=True,
|
||||
shape=self.SHAPEMAP.get(t.Tool.ShapeName, "Cylindrical"),
|
||||
length=t.Tool.Length.Value,
|
||||
diameter=t.Tool.Diameter.Value,
|
||||
)
|
||||
|
||||
postlist = PathPost.buildPostList(self.job)
|
||||
PathLog.track(postlist)
|
||||
# self.filenames = [PathPost.resolveFileName(self.job)]
|
||||
|
||||
success = True
|
||||
|
||||
finalgcode = ""
|
||||
if self.job.SplitOutput:
|
||||
PathLog.track(postlist)
|
||||
for idx, section in enumerate(postlist):
|
||||
# split = os.path.splitext(self.filename)
|
||||
# partname = split[0] + "_{}".format(index) + split[1]
|
||||
partname = section[0]
|
||||
sublist = section[1]
|
||||
|
||||
result, gcode, name = PathPost.CommandPathPost().exportObjectsWith(
|
||||
sublist,
|
||||
partname,
|
||||
self.job,
|
||||
idx,
|
||||
extraargs="--no-show-editor",
|
||||
)
|
||||
self.filenames.append(name)
|
||||
PathLog.track(result, gcode, name)
|
||||
|
||||
if result is None:
|
||||
success = False
|
||||
else:
|
||||
finalgcode += gcode
|
||||
|
||||
else:
|
||||
finalpostlist = [item for slist in postlist for item in slist]
|
||||
PathLog.track(postlist)
|
||||
result, gcode, name = PathPost.CommandPathPost().exportObjectsWith(
|
||||
finalpostlist,
|
||||
"allitems",
|
||||
self.job,
|
||||
0,
|
||||
extraargs="--no-show-editor",
|
||||
)
|
||||
self.filenames.append(name)
|
||||
success = result is not None
|
||||
finalgcode = gcode
|
||||
|
||||
if not success:
|
||||
return
|
||||
|
||||
self.SIM.compute_path(finalgcode)
|
||||
self.SIM.wait()
|
||||
|
||||
tot = sum([step["time"] for step in self.SIM.get_path()])
|
||||
PathLog.debug("sim time: {}".format(tot))
|
||||
self.taskForm.setRunTime(tot)
|
||||
|
||||
def execute(self, timeIndex):
|
||||
PathLog.track()
|
||||
self.SIM.start(self.callback, time=timeIndex, done=self.isDone)
|
||||
|
||||
def accept(self):
|
||||
pass
|
||||
|
||||
def cancel(self):
|
||||
pass
|
||||
|
||||
# def makeCoinMesh(self, surface):
|
||||
# # this doesn't work yet
|
||||
# sg = Gui.ActiveDocument.ActiveView.getSceneGraph();
|
||||
# color = coin.SoBaseColor()
|
||||
# color.rgb = (1, 0, 1)
|
||||
# coords = coin.SoTransform()
|
||||
# node = coin.SoSeparator()
|
||||
# node.addChild(color)
|
||||
# node.addChild(coords)
|
||||
|
||||
# end = [-1]
|
||||
# vertices = list(zip(*[iter(surface['vertices'])] * 3))
|
||||
# #polygons = list(zip(*[iter(vertices)] * 3, cycle(end)))
|
||||
# polygons = list(zip(*[iter(range(len(vertices)))] * 3, cycle(end)))
|
||||
|
||||
# print(vertices)
|
||||
# print(polygons)
|
||||
|
||||
# data=coin.SoCoordinate3()
|
||||
# face=coin.SoIndexedFaceSet()
|
||||
# node.addChild(data)
|
||||
# node.addChild(face)
|
||||
|
||||
# i = 0
|
||||
# for v in vertices:
|
||||
# data.point.set1Value(i, v[0], v[1], v[2])
|
||||
# i += 1
|
||||
# i = 0
|
||||
# for p in polygons:
|
||||
# try:
|
||||
# face.coordIndex.set1Value(i, p)
|
||||
# i += 1
|
||||
# except Exception as e:
|
||||
# print(e)
|
||||
# print(i)
|
||||
# print(p)
|
||||
|
||||
# sg.addChild(node)
|
||||
|
||||
# def Activated(self):
|
||||
|
||||
# s = self.SIM
|
||||
# print('activated')
|
||||
# print (s.is_running())
|
||||
|
||||
# if s.is_running():
|
||||
# print('interrupted')
|
||||
# s.interrupt()
|
||||
# s.wait()
|
||||
# else:
|
||||
# try:
|
||||
# surface = s.get_surface('python')
|
||||
# except Exception as e:
|
||||
# print(e)
|
||||
# pp = CommandPathPost()
|
||||
# job = FreeCADGui.Selection.getSelectionEx()[0].Object
|
||||
|
||||
# s = camotics.Simulation()
|
||||
# s.set_metric()
|
||||
# s.set_resolution('high')
|
||||
|
||||
# bb = job.Stock.Shape.BoundBox
|
||||
# s.set_workpiece(min = (bb.XMin, bb.YMin, bb.ZMin), max = (bb.XMax, bb.YMax, bb.ZMax))
|
||||
|
||||
# shapemap = {'ballend': 'Ballnose',
|
||||
# 'endmill': 'Cylindrical',
|
||||
# 'v-bit' : 'Conical',
|
||||
# 'chamfer': 'Snubnose'}
|
||||
|
||||
# for t in job.Tools.Group:
|
||||
# s.set_tool(t.ToolNumber,
|
||||
# metric = True,
|
||||
# shape = shapemap.get(t.Tool.ShapeName, 'Cylindrical'),
|
||||
# length = t.Tool.Length.Value,
|
||||
# diameter = t.Tool.Diameter.Value)
|
||||
|
||||
# gcode = job.Path.toGCode() #temporary solution!!!!!
|
||||
# s.compute_path(gcode)
|
||||
# s.wait()
|
||||
|
||||
# print(s.get_path())
|
||||
|
||||
# tot = sum([step['time'] for step in s.get_path()])
|
||||
|
||||
# print(tot)
|
||||
|
||||
# for t in range(1, int(tot), int(tot/10)):
|
||||
# print(t)
|
||||
# s.start(callback, time=t)
|
||||
# while s.is_running():
|
||||
# time.sleep(0.1)
|
||||
|
||||
# s.wait()
|
||||
|
||||
# surface = s.get_surface('binary')
|
||||
# self.addMesh(surface)
|
||||
|
||||
def buildproject(self): # , files=[]):
|
||||
PathLog.track()
|
||||
|
||||
job = self.job
|
||||
|
||||
tooltemplate = {
|
||||
"units": "metric",
|
||||
"shape": "cylindrical",
|
||||
"length": 10,
|
||||
"diameter": 3.125,
|
||||
"description": "",
|
||||
}
|
||||
|
||||
workpiecetemplate = {
|
||||
"automatic": False,
|
||||
"margin": 0,
|
||||
"bounds": {"min": [0, 0, 0], "max": [0, 0, 0]},
|
||||
}
|
||||
|
||||
camoticstemplate = {
|
||||
"units": "metric",
|
||||
"resolution-mode": "medium",
|
||||
"resolution": 1,
|
||||
"tools": {},
|
||||
"workpiece": {},
|
||||
"files": [],
|
||||
}
|
||||
|
||||
unitstring = (
|
||||
"imperial" if FreeCAD.Units.getSchema() in [2, 3, 5, 7] else "metric"
|
||||
)
|
||||
|
||||
camoticstemplate["units"] = unitstring
|
||||
camoticstemplate["resolution-mode"] = "medium"
|
||||
camoticstemplate["resolution"] = 1
|
||||
|
||||
toollist = {}
|
||||
for t in job.Tools.Group:
|
||||
toolitem = tooltemplate.copy()
|
||||
toolitem["units"] = unitstring
|
||||
if hasattr(t.Tool, "Camotics"):
|
||||
toolitem["shape"] = t.Tool.Camotics
|
||||
else:
|
||||
toolitem["shape"] = self.SHAPEMAP.get(t.Tool.ShapeName, "Cylindrical")
|
||||
|
||||
toolitem["length"] = t.Tool.Length.Value
|
||||
toolitem["diameter"] = t.Tool.Diameter.Value
|
||||
toolitem["description"] = t.Label
|
||||
toollist[t.ToolNumber] = toolitem
|
||||
|
||||
camoticstemplate["tools"] = toollist
|
||||
|
||||
bb = job.Stock.Shape.BoundBox
|
||||
|
||||
workpiecetemplate["bounds"]["min"] = [bb.XMin, bb.YMin, bb.ZMin]
|
||||
workpiecetemplate["bounds"]["max"] = [bb.XMax, bb.YMax, bb.ZMax]
|
||||
camoticstemplate["workpiece"] = workpiecetemplate
|
||||
|
||||
camoticstemplate["files"] = self.filenames # files
|
||||
|
||||
return json.dumps(camoticstemplate, indent=2)
|
||||
|
||||
|
||||
class CommandCamoticsSimulate:
|
||||
def GetResources(self):
|
||||
return {
|
||||
"Pixmap": "Path_Camotics",
|
||||
"MenuText": QT_TRANSLATE_NOOP("Path_Camotics", "Camotics"),
|
||||
"Accel": "P, C",
|
||||
"ToolTip": QT_TRANSLATE_NOOP("Path_Camotics", "Simulate using Camotics"),
|
||||
"CmdType": "ForEdit",
|
||||
}
|
||||
|
||||
def IsActive(self):
|
||||
if bool(FreeCADGui.Selection.getSelection()) is False:
|
||||
return False
|
||||
try:
|
||||
job = FreeCADGui.Selection.getSelectionEx()[0].Object
|
||||
return isinstance(job.Proxy, PathScripts.PathJob.ObjectJob)
|
||||
except:
|
||||
return False
|
||||
|
||||
def Activated(self):
|
||||
pathSimulation = CamoticsSimulation()
|
||||
pathSimulation.Activate()
|
||||
|
||||
|
||||
if FreeCAD.GuiUp:
|
||||
FreeCADGui.addCommand("Path_Camotics", CommandCamoticsSimulate())
|
||||
|
||||
|
||||
FreeCAD.Console.PrintLog("Loading PathCamoticsSimulateGui ... done\n")
|
||||
@@ -49,6 +49,7 @@ def Startup():
|
||||
from PathScripts import PathDressupPathBoundaryGui
|
||||
from PathScripts import PathDressupRampEntry
|
||||
from PathScripts import PathDressupTagGui
|
||||
from PathScripts import PathDressupLeadInOut
|
||||
from PathScripts import PathDressupZCorrect
|
||||
from PathScripts import PathDrillingGui
|
||||
from PathScripts import PathEngraveGui
|
||||
@@ -67,6 +68,7 @@ def Startup():
|
||||
from PathScripts import PathSetupSheetGui
|
||||
from PathScripts import PathSimpleCopy
|
||||
from PathScripts import PathSimulatorGui
|
||||
from PathScripts import PathCamoticsGui
|
||||
from PathScripts import PathSlotGui
|
||||
from PathScripts import PathStop
|
||||
from PathScripts import PathThreadMillingGui
|
||||
|
||||
@@ -674,6 +674,8 @@ class ObjectJob:
|
||||
if getattr(obj, "Operations", None):
|
||||
# obj.Path = obj.Operations.Path
|
||||
self.getCycleTime()
|
||||
if hasattr(obj, "PathChanged"):
|
||||
obj.PathChanged = True
|
||||
|
||||
def getCycleTime(self):
|
||||
seconds = 0
|
||||
|
||||
@@ -164,10 +164,6 @@ def dumpgroup(group):
|
||||
print(f"--->{j.Name}")
|
||||
print("====================")
|
||||
|
||||
self.assertRaises(
|
||||
gcode_pre.PathNoActiveDocumentException,
|
||||
gcode_pre._isImportEnvironmentReady,
|
||||
)
|
||||
|
||||
class TestBuildPostList(unittest.TestCase):
|
||||
"""
|
||||
@@ -192,6 +188,13 @@ class TestBuildPostList(unittest.TestCase):
|
||||
doc = FreeCAD.open(testfile)
|
||||
job = doc.getObjectsByLabel("MainJob")[0]
|
||||
|
||||
def setUp(self):
|
||||
pass
|
||||
|
||||
def tearDown(self):
|
||||
pass
|
||||
|
||||
|
||||
def test000(self):
|
||||
|
||||
# check that the test file is structured correctly
|
||||
@@ -269,8 +272,6 @@ class TestBuildPostList(unittest.TestCase):
|
||||
self.assertTrue(len(firstoplist) == 6)
|
||||
self.assertTrue(firstoutputitem[0] == "G54")
|
||||
|
||||
importFile = FreeCAD.getHomePath() + "Mod/Path/PathTests/test_centroid_00.ngc"
|
||||
gcodeByToolNumberList = gcode_pre._identifygcodeByToolNumberList(importFile)
|
||||
|
||||
class TestOutputNameSubstitution(unittest.TestCase):
|
||||
|
||||
@@ -323,8 +324,10 @@ class TestOutputNameSubstitution(unittest.TestCase):
|
||||
job = doc.getObjectsByLabel("MainJob")[0]
|
||||
macro = FreeCAD.getUserMacroDir()
|
||||
|
||||
|
||||
def test000(self):
|
||||
# Test basic name generation with empty string
|
||||
FreeCAD.setActiveDocument(self.doc.Label)
|
||||
teststring = ""
|
||||
self.job.PostProcessorOutputFile = teststring
|
||||
self.job.SplitOutput = False
|
||||
|
||||
@@ -38,10 +38,10 @@ from PathTests.TestPathHelixGenerator import TestPathHelixGenerator
|
||||
from PathTests.TestPathLog import TestPathLog
|
||||
from PathTests.TestPathOpTools import TestPathOpTools
|
||||
|
||||
# from PathTests.TestPathPost import PathPostTestCases
|
||||
from PathTests.TestPathPost import OutputOrderingTestCases
|
||||
from PathTests.TestPathPost import TestPathPostUtils
|
||||
from PathTests.TestPathPost import TestPathPostImport
|
||||
from PathTests.TestPathPost import TestBuildPostList
|
||||
from PathTests.TestPathPost import TestOutputNameSubstitution
|
||||
|
||||
from PathTests.TestPathPreferences import TestPathPreferences
|
||||
from PathTests.TestPathPropertyBag import TestPathPropertyBag
|
||||
from PathTests.TestPathRotationGenerator import TestPathRotationGenerator
|
||||
@@ -72,8 +72,10 @@ False if TestPathHelpers.__name__ else True
|
||||
# False if TestPathHelix.__name__ else True
|
||||
False if TestPathLog.__name__ else True
|
||||
False if TestPathOpTools.__name__ else True
|
||||
False if TestPathPostImport.__name__ else True
|
||||
# False if TestPathPostImport.__name__ else True
|
||||
# False if TestPathPost.__name__ else True
|
||||
False if TestBuildPostList.__name__ else True
|
||||
False if TestOutputNameSubstitution.__name__ else True
|
||||
False if TestPathPostUtils.__name__ else True
|
||||
False if TestPathPreferences.__name__ else True
|
||||
False if TestPathPropertyBag.__name__ else True
|
||||
|
||||
Reference in New Issue
Block a user