明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1839|回复: 7

有时错有时可以运行,神马问题?

[复制链接]
发表于 2012-7-22 08:22:33 | 显示全部楼层 |阅读模式



  1. (defun c:asd ()
  2.   (command "undo" "be")
  3.   (setvar 'cmdecho 0)
  4.   (setvar 'osmode 16383)
  5.   (setq en (car (entsel "\n选择多段线:")))
  6.   (setq p1 (getpoint "\n选择切入点: "))
  7.   (setq fx (getint "\n选择方向 ([1]顺时针,[2]逆时针) <1>: "))
  8.   (if (= nil fx)
  9.     (setq fx 1)
  10.   )
  11.   (WCMATCH (cdr (assoc 0 (entget en))) "*POLYLINE")
  12.   (progn
  13.     (yytm)
  14.     (if (/= fx fang)
  15.       (VxRevPline obj)
  16.     )
  17.     (setq pt (vlax-curve-getClosestPointTo
  18.         (vlax-ename->vla-object en)
  19.         p1
  20.       )
  21.     )
  22.     (abhk)
  23.     (gjus_ent)
  24.     (command "undo" "e")
  25.     (princ)
  26.   )
  27. )

  28. ;;判断方向是否一致
  29. (defun yytm ()
  30.   (setq plineObj (vlax-ename->vla-object en)
  31. len  (vla-get-length plineobj)
  32.   )
  33.   (setq offsetplineObj
  34.   (car (vlax-safearray->list
  35.   (vlax-variant-value
  36.     (vla-offset plineObj (/ len 10000))
  37.   )
  38.        )
  39.   )
  40.   )
  41.   (if (< (vla-get-area offsetplineobj)
  42.   (vla-get-area plineobj)
  43.       )
  44.     (setq fang 1)
  45.     (setq fang 2)
  46.   )
  47.   (vla-delete offsetplineObj)
  48. )
  49. ;;;;方向转换
  50. (defun VxRevPline (Obj / BlgLst ObjName PntLst SegCnt TmpLst Ubound)
  51.   (setq Obj (vlax-ename->vla-object en))
  52.   (setq ObjName (vlax-get Obj 'ObjectName)
  53. TmpLst (vlax-get Obj 'Coordinates)
  54.   )
  55.   (if (eq ObjName "AcDbPolyline")
  56.     (repeat (/ (length TmpLst) 2)
  57.       (setq PntLst (cons (list (car TmpLst) (cadr TmpLst)) PntLst)
  58.      TmpLst (cddr TmpLst)
  59.       )
  60.     )
  61.     (repeat (/ (length TmpLst) 3)
  62.       (setq PntLst (cons (list (car TmpLst) (cadr TmpLst) (caddr TmpLst))
  63.     PntLst
  64.      )
  65.      TmpLst (cdddr TmpLst)
  66.       )
  67.     )
  68.   )
  69.   (vlax-put Obj 'Coordinates (apply 'append PntLst))
  70.   (if (not (eq ObjNme "AcDb3dPolyline"))
  71.     (progn
  72.       (setq Ubound (1- (length PntLst))
  73.      BlgLst (list (* (vla-GetBulge Obj Ubound) -1))
  74.      SegCnt 0
  75.       )
  76.       (repeat Ubound
  77. (setq BlgLst (cons (* (vla-GetBulge Obj SegCnt) -1) BlgLst)
  78.        SegCnt (1+ SegCnt)
  79. )
  80.       )
  81.       (setq SegCnt 0)
  82.       (foreach memb BlgLst
  83. (vla-SetBulge Obj SegCnt memb)
  84. (setq SegCnt (1+ SegCnt))
  85.       )
  86.     )
  87.   )
  88.   (vla-Update Obj)
  89.   Obj
  90. )

  91. ;;;功能:多段线增加节点
  92. (defun abhk ()
  93.   (sssetfirst nil (ssadd en))
  94.   (setq enden (entlast))
  95.   (command "_break"
  96.     en
  97.     (vlax-curve-getclosestpointto en pt)
  98.     pt
  99.   )
  100.   (setq ss (ssadd))
  101.   (while (setq enden (entnext enden))
  102.     (if (not (member (cdr (assoc 0 (entget enden)))
  103.        '("ATTRIB" "VERTEX" "SEQEND")
  104.       )
  105. )
  106.       (ssadd enden ss)
  107.     )
  108.   )
  109.   (VL-CATCH-ALL-APPLY 'vl-cmdf (list "pedit" en "j" ss "" ""))
  110.   (sssetfirst nil (ssadd en))
  111.   (sssetfirst nil nil)
  112. )

  113. ;;;;;更新图元
  114. (defun gjus_ent ()
  115.   (setq pt0 (list (car pt) (cadr pt)))
  116.   (setq pt2 (list (car p1) (cadr p1)))
  117.   (setq dat (entget en))
  118.   (setq ptfrst (cons 10 pt0))
  119.   (setq dat0 (reverse (member (assoc 39 dat) (reverse dat)))
  120. dat1 (cdr (member (assoc 39 dat) dat))
  121. dat9 (list (last dat1))
  122. dat1 (reverse (cdr (reverse dat1)))
  123. data (member ptfrst dat1)
  124. datb (reverse (cdr (member ptfrst (reverse dat1))))
  125.   )
  126.   (setq data1 (LIST (cons 10 pt2))
  127. ptend (list ptfrst)
  128. data2 (LIST (cons 40 0.0) (cons 41 0.0) (cons 42 0.0))
  129.   )
  130.   (setq aa (append dat0 data1 data2 data datb ptend data2 dat9)) ;排序
  131.   (setq dat70 (cons 70 1)  ;改为不封闭的
  132. dat71 (cons 70 0)
  133. aaa   (subst dat71 dat70 aa)
  134.   )
  135.   (setq shu1 (assoc 90 aaa)  ;加多两个端点
  136. shu  (cdr shu1)
  137. shu2 (cons 90 (+ 2 shu))
  138. aaaa (subst shu2 shu1 aaa)
  139.   )
  140.   (entmod aaaa)
  141.   (princ)
  142. )


有时可以画出,有时画不出来,,传了有测试图,选择不同的边有时也不能,主要是点选一条多线段,选择一点,生成一条由点开始的多线段,,,线段最后一点是这条多线段的第二个点,
我猜想,可能是增加节点后,没更新,最后DAT变量还是原来的图元资料

本帖子中包含更多资源

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

x
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2012-7-22 09:49:39 | 显示全部楼层
本帖最后由 Andyhon 于 2012-7-22 09:53 编辑

  1. (defun c:asd ()
  2.   (command "undo" "be")
  3.   (setvar 'cmdecho 0)
  4.   (setvar 'osmode 16383)
  5.   (setq en (car (entsel "\n选择多段线:")))
  6.   (setq p1 (getpoint "\n选择切入点: "))
  7.   (setq fx (getint "\n选择方向 ([1]顺时针,[2]逆时针) <1>: "))
  8.   (if (= nil fx)
  9.     (setq fx 1)
  10.   )
  11.   (if (WCMATCH (cdr (assoc 0 (entget en))) "*POLYLINE")
  12.      (progn
  13.        (yytm)
  14.        (if (/= fx fang)
  15.          (VxRevPline obj)
  16.        )
  17.        (setq pt (vlax-curve-getClosestPointTo
  18.                   (vlax-ename->vla-object en)
  19.                   p1
  20.                 )
  21.        )
  22.        (abhk)
  23.        (gjus_ent)
  24.      )
  25.   )
  26.   (command "undo" "e")
  27.   (princ)
  28. )
  29. ;;; or ==================================
  30. (defun c:asd ()
  31.    (command "undo" "be")
  32.    (setvar 'cmdecho 0)
  33.    (setvar 'osmode 16383)
  34.    
  35.    (prompt "\n选择多段线:")
  36.    
  37.    (if (setq en (ssget ":E:S" '((0 . "*POLYLINE"))))
  38.      (progn
  39.        (setq en (ssname en 0)
  40.              p1 (getpoint "\n选择切入点: ")
  41.              fx (getint "\n选择方向 ([1]顺时针,[2]逆时针) <1>: ")
  42.        )
  43.       
  44.        (if (= nil fx)
  45.          (setq fx 1)
  46.        )
  47.    
  48.        (yytm)
  49.       
  50.        (if (/= fx fang)
  51.          (VxRevPline obj)
  52.        )
  53.        (setq pt (vlax-curve-getClosestPointTo
  54.                   (vlax-ename->vla-object en)
  55.                   p1
  56.                 )
  57.        )
  58.        (abhk)
  59.        (gjus_ent)
  60.    ) )   
  61.    (command "undo" "e")
  62.    (princ)
  63. )
依 Test.Dwg 未见您所述 画不出来 的情形
请个别另行指出

点评

是窗口缩放的问题,缩小点,就不行,放大点倒是可以画出来  发表于 2012-7-22 10:15
 楼主| 发表于 2012-7-22 10:28:31 | 显示全部楼层
Andyhon 发表于 2012-7-22 09:49
依 Test.Dwg 未见您所述 画不出来 的情形
请个别另行指出

本帖子中包含更多资源

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

x
发表于 2012-7-22 11:30:00 | 显示全部楼层
依样画葫芦,还是很少见错误
偶而会有,再依原点选位置执行,又不见错误了

试着这样子改
;; (vla-offset plineObj (/ len 10000))
(vla-offset plineObj 1)     ;

再不行 换掉判断方向的函数 yytm
站内搜吧

发表于 2012-7-22 17:15:54 | 显示全部楼层
cad的线方向问题也一直让我头疼,感觉方向这么重要的东西,居然在cad显得很弱化。
 楼主| 发表于 2012-7-22 18:41:35 | 显示全部楼层
Andyhon 发表于 2012-7-22 11:30
依样画葫芦,还是很少见错误
偶而会有,再依原点选位置执行,又不见错误了

调试时,发生错误我通过监视,发现,最后得出的EN中没有增加节点的“pt"这个祖玛,还是得到原来的那个第一次没改变的时候的DATA,所以排序出错了
发表于 2012-7-22 20:32:02 | 显示全部楼层

  (VL-CATCH-ALL-APPLY 'vl-cmdf (list "pedit" en "j" ss "" ""))
  (setq pt (osnap pt "end"))      ; 加这句 试试能改善否

点评

试了,可以用了,暂时没发现问题,请问长老,这句是什么意思  发表于 2012-7-23 07:34

评分

参与人数 1金钱 +30 收起 理由
邹锋 + 30 谢谢你耐心的指导

查看全部评分

发表于 2012-7-23 07:57:04 | 显示全部楼层
   (setq pt (vlax-curve-getClosestPointTo
        (vlax-ename->vla-object en)
        p1
      )
    )
.
.
.
   (command "_break"
     en
     (vlax-curve-getclosestpointto en pt)
     pt
   )
.
.
.
   (VL-CATCH-ALL-APPLY 'vl-cmdf (list "pedit" en "j" ss "" ""))
   形成了新的点表
   其节点(pt断点) 理论上应同于 Pt
    但实务上有时却不被 AutoCAD 认可
    (setq pt (osnap pt "end"))  ; 作用在 重归位 ==> 取自新的点表位置

点评

明白了,我一开始只是用重生模型那个命令,但没用  发表于 2012-7-23 08:25
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-12-25 14:46 , Processed in 0.184424 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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