- UID
- 60059
- 积分
- 72
- 精华
- 贡献
-
- 威望
-
- 活跃度
-
- D豆
-
- 在线时间
- 小时
- 注册时间
- 2003-6-20
- 最后登录
- 1970-1-1
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
有时候某些图线会莫名其妙地出现极为微小的误差,导致图线倾斜情况,这往往是我们所不期望的。
解决这种问题有两个思路:
一是检查图线是否平直,再对不平直的情况作调整;
另一个是检查图线的顶点是否符合某个模数,如果不符合,就把顶点移动到最近的模数点上。
第一种思路会遇到这样的问题,即当图线不平直的时候,究竟哪个点是对的,哪个点是错的,或者全部都是错的?这个必须由用户来判断,因此就谈不上效率了。而且在误差极为微小的情况下,用户判断起来也有很大困难。
第二种思路就简单多了。毕竟绝大部分图线的确应该符合某种模数,这样就可以让程序自动去检查,修改。
程序可以处理Line和Pline两种实体类型。因为是直接读写图元的10和11组码,所以理论上也可以修改其他任何实体类型的基点位置。但我觉得那样做意义不大,所以只保留了Line和Pline。有需要者,可以自行修改程序第35行。
[php]
;FishLISP C:LCA
;校准LINE或PLINE
;2005-09-16 v1.0
;
;
(defun c:lca (/ ori_pt mysnap ent_obn ent_obl ent_ss ent_idx mod_idx)
(princ "\nFishLISP C:LCA v1.0 Line、Pline校准。")
(setvar "cmdecho" 0)
(command "undo" "begin")
;设置原点,缺省0,0
(setq lca:ori_pt (if lca:ori_pt lca:ori_pt '(0.0 0.0 0.0)))
(princ
(strcat "\n设置基准点:<"
(rtos (car lca:ori_pt))
","
(rtos (cadr lca:ori_pt))
","
(rtos (caddr lca:ori_pt))
"> "
);strcat
);princ
(setq ori_pt (getpoint))
(setq ori_pt (if ori_pt ori_pt lca:ori_pt))
(setq lca:ori_pt ori_pt)
;设置校准精度,即模数,缺省10
(setq lca:snap (if lca:snap lca:snap 10))
(princ "\n设置校准精度:<")
(princ lca:snap)
(setq mysnap (getint "> "))
(setq mysnap (if mysnap mysnap lca:snap))
(setq lca:snap mysnap)
;收集图元
(prompt "\n选择图元:")
(setq ent_ss (ssget '((0 . "line,lwpolyline"))))
(if ent_ss
(progn
(setq mod_idx 0
ent_idx 0
)
(repeat (sslength ent_ss)
(setq ent_obn (ssname ent_ss ent_idx)
ent_obl (entget ent_obn)
)
;替换图元
(entmod
(mapcar '(lambda (pl_itm)
(if (member (car pl_itm) (list 10 11))
(if (member (mapcar '(lambda (ptx pt0) (rem (- ptx pt0) lca:snap)) (cdr pl_itm) ori_pt)
(list '(0.0 0.0 0.0) '(0.0 0.0))
)
;顶点无需修改
pl_itm
;替换顶点
(progn
(setq mod_idx (1+ mod_idx))
(cons (car pl_itm)
(mapcar '(lambda (ptx pt0)
(setq ptx (+ ptx (* lca:snap 0.5 (if (< ptx pt0) -1 1))))
(- ptx (rem (- ptx pt0) lca:snap))
)
(cdr pl_itm) ori_pt
);mapcar
);cons
);progn
);if
pl_itm
);if
);lambda
ent_obl
);mapcar
);entmod ent_obl
(entupd ent_obn)
(setq ent_idx (1+ ent_idx))
);repeat ent_ss
);progn ent_ss
);if ent_ss
(command "undo" "end")
(setvar "cmdecho" 1)
(princ (strcat "\n" (rtos mod_idx 2 0) "个顶点已经校准。"))
(princ)
)
(princ "FishLISP C:LCA")
(princ)
[/php] |
|