找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 529|回复: 0

[原创]:写了自动一个标注程序出来,麻烦大家进来指导。

[复制链接]
发表于 2007-9-4 16:17:47 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
学了一个星期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)
)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-17 04:52 , Processed in 0.173123 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表