changxingge 发表于 2012-12-17 15:19:27

【求教】在一个CAD里调试好的程序换到另一个CAD里面就不能完美执行!

问题如题,程序是在CAD2009为基础的天正道路软件上调试成功的,百试百灵,但是当我把程序加载到CAD2009和CAD2006时确不能完美运行了,不知是什么原因,特此请高手帮忙解决下。图片及源码如下:
1、这个程序主要的目的就是找到半径小于30的圆弧,并将它们的弧长统计后以表格形式写出(相同半径的圆弧,弧长相加后写出):

2、我在在CAD2009为基础的天正道路软件上运行结果:

3、问题出现,在CAD2009和CAD2006上运行结果:

4、以下是测试用图和源码:


最后,感谢QQ群里【KAIXIN】的热心帮助!在下新手+业余,期待指导,再次感谢!

zyhandw 发表于 2012-12-17 15:46:57

CAD2006中测试没问题,应该是运行前开了捕捉的问题

zyhandw 发表于 2012-12-17 15:56:49

程序在设计时欠考虑!
可以在程序开始时,先用变量取得系统变量osmode的值,再(setvar "osmode" 0)关闭捕捉,程序最后再将系统变量osmode的值还原。

【KAIXIN】 发表于 2012-12-17 16:05:05

设:没有捕捉,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)
)
;---------------------------------------------------------------------------------------------

changxingge 发表于 2012-12-17 16:09:16

zyhandw 发表于 2012-12-17 15:56 static/image/common/back.gif
程序在设计时欠考虑!
可以在程序开始时,先用变量取得系统变量osmode的值,再(setvar "osmode" 0)关闭捕捉 ...

果然高手!十分感谢!!!!

changxingge 发表于 2012-12-17 16:11:25

【KAIXIN】 发表于 2012-12-17 16:05 static/image/common/back.gif
设:没有捕捉,2004没问题,不过程序有待简化!

嗯   程序的确该减肥   十分感谢!!!

zyhandw 发表于 2012-12-17 16:11:33

changxingge 发表于 2012-12-17 16:09 static/image/common/back.gif
果然高手!十分感谢!!!!

呵呵,见笑了,一点点小经验而已

changxingge 发表于 2012-12-17 16:12:14

感谢G版指点,谢谢!
页: [1]
查看完整版本: 【求教】在一个CAD里调试好的程序换到另一个CAD里面就不能完美执行!