- UID
- 539203
- 积分
- 49
- 精华
- 贡献
-
- 威望
-
- 活跃度
-
- D豆
-
- 在线时间
- 小时
- 注册时间
- 2007-1-15
- 最后登录
- 1970-1-1
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
学了一个星期Autolisp,连蒙带抄写了一个标注程序,效果跟我原先构想的一样,不知道大家觉得哪里还有改良的地方呢。
目的:对于封闭区间的多义线在其外围进行标注。
思路:
1,读取多义线个端点坐标;
2,把多义线外偏一定尺寸,为其标注定位;
3,通过坐标我外偏多义线使用_dimaligned进行标注;
4,删除辅助多义线。
感受:
1,
多义线外偏过程中发现,如果多义线有重复点,在外偏过程中会将重复点删除,造成外偏线和原多义线不对应;
2,
由于对函数类型不是很了解,在开始的时候,删除多义线重复点(其实是一个炸开合并的过程)后,无法将其使用于下面的标注程序;
3,
网上有很多删除重复点的程序,但是似乎都有一个问题,在如果重复点有一点是多义线的第一个点的话,其程序不起作用,试了很多个之后,暂时发现我现在借用的是比较完美的,感谢其原作者。
问题
1,
对于删除多义线重复点的过程,其实我到现在也不是很了解,不知道有没有高人可以解释解释;
2,
各位觉得有用就下,觉得有问题就提出,觉得可以改进的就指点指点。。。
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;预售面积尺寸标注,NoNO,2007.9.2;;;;
;;;部分程序源于网上,感谢其源码的作者;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun c:qd ()
(eee)
;;;建立定位辅助线
(setq sse 0)
(setq sse (ssadd (entlast)))
(setq li (getvar "dimtxt"))
(setq xy (getpoint "\n 标注偏移方向:"))
;;;建立辅助线
(cmdbeg)
(command "OFFSET" (+ (/ li 2) 0.03) sse xy "")
(setq de (entlast))
;;;建立原多义线端点数据库
(setq obj (vlax-ename->vla-object (ssname sse 0)))
(setq pl (vlax-safearray->list
(vlax-variant-value
(vla-get-coordinates obj)
)
)
)
;;;建立辅助多义线端点数据库
(setq obj1 (vlax-ename->vla-object de))
(setq pl1 (vlax-safearray->list
(vlax-variant-value
(vla-get-coordinates obj1)
)
)
)
;;;获得多义线子段数目
(setq num (/ (length pl) 2))
(princ "需要标注段数:")
(princ (1- num))
(princ "\n")
(setq n 0)
;;;标注,除最后一段
(repeat (1- num)
(setq p2 (list (nth (* n 2) pl) (nth (1+ (* n 2)) pl)))
(setq p1 (list (nth (* (1+ n) 2) pl)
(nth (1+ (* (1+ n) 2)) pl)
)
)
(setq p3 (list (nth (* n 2) pl1) (nth (1+ (* n 2)) pl1)))
(setq p4 (list (nth (* (1+ n) 2) pl1)
(nth (1+ (* (1+ n) 2)) pl1)
)
)
(setq n (1+ n))
(setq txt (strcat "第" (itoa n) "段标注完成."))
(princ txt)
(princ "\n")
(dimm)
)
;;;;;;标注最后一段
(setq p1 (list (nth (* n 2) pl) (nth (1+ (* n 2)) pl)))
(setq p2 (list (nth 0 pl) (nth 1 pl)))
(setq p3 (list (nth (* n 2) pl1) (nth (1+ (* n 2)) pl1)))
(setq p4 (list (nth 0 pl) (nth 1 pl1)))
(princ n)
(princ "/n")
(dimm)
(command "ERASE" de "")
(princ "\n")
(princ (strcat "共标注" (itoa (1- num)) "段"))
(princ " \n标完收工")
(princ "\n")
(cmdend)
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;通用标注子程序
(defun dimm ()
(setq p5 (mapcar '(lambda (g) (/ g 2)) (mapcar '+ p3 p4)))
(command "_dimaligned" p1 p2 p5)
)
;;;读取系统参数,修改参数
(defun cmdbeg ()
(Setq cc (Getvar "Cmdecho")
ooe (Getvar "Osmode")
)
(Setvar "Cmdecho" 0)
(Setvar "Osmode" 0)
)
;;;恢复系统参数
(defun cmdend ()
(Setvar "Cmdecho" cc)
(Setvar "Osmode" ooe)
)
;;;完美删除多义线重复点
(defun EEE (/ N A AA AAA sse li xy)
(vl-load-com)
(setq A (car (entsel)))
(command "_.explode" A)
(setq A (ssget "p"))
(setq N 0)
(setq AA (ssadd))
(repeat (sslength A)
(if (and (/= "LINE" (assoc 0 (entget (ssname A N))))
(not (equal (cdr (assoc 10 (entget (ssname A N))))
(cdr (assoc 11 (entget (ssname A N))))
)
)
)
(ssadd (ssname A N) AA)
(command "_.erase" (ssname A N) "")
)
(setq N (1+ N))
)
(command "_.pedit" (SSNAME AA 0) "y" "j" AA "" "")
(princ)
) |
|