Modify op path2
From Macros Wiki
args opnum, dist | |
local numfeat, ifeat, itype | |
local xs, ys, zs, xe, ye, ze, xc, yc, zc, rad, idir | |
local x1, y1, z1, x2, y2, z2, ang1, ang2, ang3 | |
! get a copy of the current op path | |
! --------------------------------- | |
get_op_num_feat opnum, numfeat | ! get the number of features |
if numfeat<1 then goto done | ! make sure there is at least 1 |
define_path_list 1 | ! create path list |
select_op_path_type main | ! select the main path |
get_op_path opnum get a copy of the op path | |
! this will be path zero | |
get_op_path_start opnum, xs, ys, zs | |
create_path 1, xs, ys, zs | ! start a new path |
! divide it up | |
! ------------ | |
for ifeat=1 to numfeat | |
:get_op_feat_type opnum, ifeat, itype | |
:progress_set (ifeat / numfeat) | |
:if itype = feat_type_line then goto edit_line | |
:if itype = feat_type_arc then goto edit_arc | |
! not a line or arc, just use this feature as it is | |
:add_path_feat 1, 0, ifeat | ! copy this feat to the new path |
:continue | |
:edit_line | |
:get_op_feat_start opnum, ifeat, xs, ys, zs | |
:get_op_feat_end opnum, ifeat, xe, ye, ze | |
:get_op_feat_angles opnum, ifeat, ang1, ang2, ang3 | |
:x1 = xs + ((xe - xs) / 2) | |
:y1 = ys + ((ye - ys) / 2) | |
:z1 = zs + ((ze - zs) / 2) | |
:ang2 = ang1 + 90 | |
:x2 = x1 + dist * cos(ang2) | |
:y2 = y1 + dist * sin(ang2) | |
:z2 = z1 | |
:add_path_line 1, x1, y1, z1 | ! mid way along the feature |
:add_path_line 1, x2, y2, z2 | ! out by the given distance |
:add_path_line 1, x1, y1, z1 | ! back to mid point |
:add_path_line 1, xe, ye, ze | ! end of original features |
:continue | |
:edit_arc | |
:get_op_feat_start opnum, ifeat, xs, ys, zs | |
:get_op_feat_end opnum, ifeat, xe, ye, ze | |
:get_op_feat_angles opnum, ifeat, ang1, ang2, ang3 | |
:get_op_feat_arc_data opnum, ifeat, rad, idir, xc, yc, zc | |
:if idir=1 then ang3 = -ang3 | |
:ang1 = ang1 + (ang3 / 2) | ! angle mid way around arc |
:if ang1>360 then ang1 = ang1 - 360 | |
:if ang1<0 then ang1 = ang1 + 360 | |
:ang2 = ang1 | |
:if idir=0 then ang2 = ang1 + 180 | |
:if ang2 > 360 then ang2 = ang2 - 360 | |
:x1 = xc + rad * cos(ang1) | |
:y1 = yc + rad * sin(ang1) | |
:z1 = zs + ((ze - zs) / 2) | |
:x2 = x1 + dist * cos(ang2) | |
:y2 = y1 + dist * sin(ang2) | |
:z2 = z1 | |
:if idir=1 then add_path_arc 1, x1, y1, z1, xc, yc, zc, rad, cw | |
:if idir#1 then add_path_arc 1, x1, y1, z1, xc, yc, zc, rad, ccw | |
:add_path_line 1, x2, y2, z2 | ! out by the given distance |
:add_path_line 1, x1, y1, z1 | ! back to mid point |
:if idir=1 then add_path_arc 1, xe, ye, ze, xc, yc, zc, rad, cw | |
:if idir#1 then add_path_arc 1, xe, ye, ze, xc, yc, zc, rad, ccw | |
next ifeat | |
! end of path | |
! ----------- | |
copy_path 1, 0 | ! copy the new path to path zero |
set_op_path opnum | ! set the op path to use path zero |
delete_path_list | ! delete the list of paths |
:done |