【求教】在一个CAD里调试好的程序换到另一个CAD里面就不能完美执行!
问题如题,程序是在CAD2009为基础的天正道路软件上调试成功的,百试百灵,但是当我把程序加载到CAD2009和CAD2006时确不能完美运行了,不知是什么原因,特此请高手帮忙解决下。图片及源码如下:1、这个程序主要的目的就是找到半径小于30的圆弧,并将它们的弧长统计后以表格形式写出(相同半径的圆弧,弧长相加后写出):
2、我在在CAD2009为基础的天正道路软件上运行结果:
3、问题出现,在CAD2009和CAD2006上运行结果:
4、以下是测试用图和源码:
最后,感谢QQ群里【KAIXIN】的热心帮助!在下新手+业余,期待指导,再次感谢!
CAD2006中测试没问题,应该是运行前开了捕捉的问题 程序在设计时欠考虑!
可以在程序开始时,先用变量取得系统变量osmode的值,再(setvar "osmode" 0)关闭捕捉,程序最后再将系统变量osmode的值还原。 设:没有捕捉,2004没问题,不过程序有待简化!(princ "\n **********************Written by Cxg.**********************\n ********************Thanking for using!********************\n")
(defun c:bs (/ pt1 pt2 pt3 pt4 pt5 pt6 pt1a pt5a pt2a ww hh ss n m en obj r l pt11 pt22 pt33 pt44 pt55 pt66 pt11a pt55a pt22a ssr ssl enr_1 objr_1 r_1 l_1 l_sub enr_2 objr_2)
(vl-load-com)
(setq mkj (getvar 'OSMODE)) ;提取捕捉
(setvar "osmode" 0)
(setq acadobj (vlax-get-acad-object))
(setq dwgobj (vla-get-activedocument acadobj))
(setq mspace (vla-get-modelspace dwgobj))
(setvar "cmdecho" 0)
;---------------------------------------------------------------------------
(setq pt11 (getpoint "\n插入统计表格左上角点:"))
(setq ww (getdist pt11 "\n列宽<50>:"))
(if (null ww) (setq ww 50.0))
(setq hh (getdist pt11 "\n行高<6>:"))
(if (null hh) (setq hh 6.0))
(setq pt1 (polar pt11 pi ww))
(setq pt2 (polar pt1 0 ww))
(setq pt3 (polar pt2 (* pi 1.5) hh))
(setq pt4 (polar pt1 (* pi 1.5) hh))
(setq pt5 (polar pt1 0 (* 0.5 ww)))
(setq pt6 (polar pt5 (* pi 1.5) hh))
(setq pt1a pt1 pt5a pt5 pt2a pt2)
(setq ss (ssget))
(prompt "\n选择道路边线:")
(if (null ss)
(progn
(alert "没有选择需要统计的对象!")
(exit)
)
)
(command "layer" "m" "边石统计" "c" "1" "" "")
(command "pline" pt4 pt3 "")
(command "text" "m" (inters pt1 pt6 pt4 pt5) 2.5 0 "半径(m)")
(command "text" "m" (inters pt5 pt3 pt2 pt6) 2.5 0 "弧长(m)")
(setq n 0 m 0)
(repeat (sslength ss)
(setq en (ssname ss n))
(setq obj (vlax-ename->vla-object en))
(if
(= (vla-get-objectname obj) "AcDbArc")
(if
(< (vla-get-radius obj) 30)
(progn
(setq r (rtos (vla-get-radius obj) 2 1))
(setq l (rtos (vla-get-arclength obj) 2 1))
(setq pt1 pt4 pt5 pt6 pt2 pt3)
(setq pt4 (polar pt1 (* pi 1.5) hh))
(setq pt6 (polar pt5 (* pi 1.5) hh))
(setq pt3 (polar pt2 (* pi 1.5) hh))
(command "pline" pt4 pt3 "")
(command "text" "m" (inters pt1 pt6 pt4 pt5) 2.5 0 r)
(command "text" "m" (inters pt5 pt3 pt2 pt6) 2.5 0 l)
(setq m (1+ m))
)
)
)
(setq n (1+ n))
)
(setq ss (ssget "w" (polar pt1a (* pi 1.5) hh) pt6))
(if (null ss)
(progn
(command "erase" "w" pt1a pt3 "")
(alert "没有选择需要统计的对象!")
(exit)
)
)
(command "pline" pt4 pt1a pt2a pt3 "")
(command "pline" pt5a pt6 "")
;---------------------------------------------------------------------------
(setq pt22 (polar pt11 0 ww))
(setq pt33 (polar pt22 (* pi 1.5) hh))
(setq pt44 (polar pt11 (* pi 1.5) hh))
(setq pt55 (polar pt11 0 (* 0.5 ww)))
(setq pt66 (polar pt55 (* pi 1.5) hh))
(setq pt11a pt11 pt55a pt55 pt22a pt22)
(command "text" "m" (inters pt11 pt66 pt44 pt55) 2.5 0 "半径(m)")
(command "text" "m" (inters pt55 pt33 pt22 pt66) 2.5 0 "弧长(m)")
(command "pline" pt44 pt33 "")
(setq ssr (ssget "w" (polar pt1a (* pi 1.5) hh)pt6))
(while ssr
(setq ssr (ssget "w" (polar pt1a (* pi 1.5) hh)pt6))
(if ssr
(progn
(setq ssl (ssget "w" (polar pt5a (* pi 1.5) hh)pt3))
(setq enr_1 (ssname ssr 0))
(setq objr_1 (vlax-ename->vla-object enr_1))
(setq enl_1 (ssname ssl 0))
(setqobjl_1 (vlax-ename->vla-object enl_1))
(setq r_1 (vla-get-TextString objr_1) l_1 (vla-get-TextString objl_1))
(setq l_sub (atof l_1))
(vla-delete objr_1)
(vla-delete objl_1)
(setq a 1)
(repeat (- (sslength ssr) 1)
(setq enr_2 (ssname ssr a))
(setq objr_2 (vlax-ename->vla-object enr_2))
(setq enl_2 (ssname ssl a))
(setq objl_2 (vlax-ename->vla-object enl_2))
(if
(= r_1 (vla-get-TextString objr_2))
(progn
(setq l_sub (+ l_sub (atof (vla-get-TextString objl_2))))
(vla-delete objr_2)
(vla-delete objl_2)
)
)
(setq a (1+ a))
)
(setq pt11 pt44 pt55 pt66 pt22 pt33)
(setq pt44 (polar pt11 (* pi 1.5) hh))
(setq pt66 (polar pt55 (* pi 1.5) hh))
(setq pt33 (polar pt22 (* pi 1.5) hh))
(command "pline" pt44 pt33 "")
(command "text" "m" (inters pt11 pt66 pt44 pt55) 2.5 0 r_1)
(command "text" "m" (inters pt55 pt33 pt22 pt66) 2.5 0 (rtos l_sub 2 1))
)
)
)
(command "pline" pt44 pt11a pt22a pt33 "")
(command "pline" pt55a pt66 "")
(command "erase" "w" pt1a pt3 "")
(command "zoom" "w" (polar pt11a (* 0.75 pi) 10) (polar pt33 (* 1.75 pi) 10) "")
(command "PEDIT" "m" (polar pt11a 0 1) (polar pt44 0 1) "" "j" "" "")
(setvar "osmode" mkj)
(princ)
)
;--------------------------------------------------------------------------------------------- zyhandw 发表于 2012-12-17 15:56 static/image/common/back.gif
程序在设计时欠考虑!
可以在程序开始时,先用变量取得系统变量osmode的值,再(setvar "osmode" 0)关闭捕捉 ...
果然高手!十分感谢!!!! 【KAIXIN】 发表于 2012-12-17 16:05 static/image/common/back.gif
设:没有捕捉,2004没问题,不过程序有待简化!
嗯 程序的确该减肥 十分感谢!!! changxingge 发表于 2012-12-17 16:09 static/image/common/back.gif
果然高手!十分感谢!!!!
呵呵,见笑了,一点点小经验而已 感谢G版指点,谢谢!
页:
[1]