明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 798|回复: 9

[提问] 过一点画多段线一条边的平行xline线怎么写?

[复制链接]
发表于 2021-3-29 22:20:12 | 显示全部楼层 |阅读模式
15明经币
过一点画多段线一条边的平行xline线怎么写?最好能注释下.

最佳答案

发表于 2021-3-29 22:20:13 | 显示全部楼层
  1. (defun c:ccc()
  2.     (if (progn
  3.             (progn "\n请选择多段线: ")
  4.             (setq EntSsa (ssget ":S" '((0 . "lwpolyline"))))
  5.         )
  6.         (progn
  7.             (mapcar 'set '(pai Ent pan PPt) (car (ssnamex EntSsa)))
  8.             (setq PPt (cadr PPt)) ;选择多段线时的拾取点
  9.             (If (setq Pt (getpoint PPt "\n请指定构造线通过点: "))
  10.                 (progn
  11.                     (setq OBj (vlax-ename->vla-object Ent))
  12.                     ;多段线上距拾取点最近的点
  13.                     (setq Pt0 (vlax-curve-getclosestpointto OBj PPt))
  14.                     (setq par (vlax-curve-getParamAtPoint OBj Pt0))
  15.                     (setq pai (fix par))
  16.                     (setq pan (vlax-curve-getendparam Obj))
  17.                     ;拾取点所在子段的凸度(等于0为直线段,否则为圆弧段)
  18.                     (setq bul (vla-GetBulge OBj pai))
  19.                     (if (and (or (not (equal pai 0   1e-6)) ;不是起点
  20.                                  (not (equal pai pan 1e-6)) ;不是止点
  21.                              )
  22.                              (equal bul 0 1e-6) ;子段不是圆弧
  23.                         )
  24.                         (progn
  25.                             ;过Pt0点的切线方向向量
  26.                             (setq ptv (vlax-curve-getFirstDeriv Obj par))
  27.                             ;; 创建构造线
  28.                             (entmake (list '(0 . "XLINE")
  29.                                            '(100 . "AcDbEntity")
  30.                                            '(100 . "AcDbXline")
  31.                                             (cons 10 Pt)
  32.                                             (cons 11 Ptv)
  33.                                      )
  34.                              )
  35.                         )
  36.                     )
  37.                     
  38.                 )
  39.             )
  40.         )
  41.     )
  42. )
回复

使用道具 举报

发表于 2021-3-30 00:46:23 | 显示全部楼层
本帖最后由 caoyin 于 2021-3-30 07:57 编辑

  1. ;; 绘制多段线指定段的平行线(构造线)
  2. (defun C:TT (/ EName PckPnt Point PckPnt2 Vector)

  3. (if (and (setq EName (entsel "\n选择多段线: ")) ; 选择对象,返回图元名+选择框位置点
  4.          (progn
  5.            (mapcar 'set '(EName PckPnt) EName) ; 将返回的图元名、选择框位置点赋予变量
  6.            (or (wcmatch (cdr (assoc 0 (entget EName))) "*POLYLINE") ; 读取DXF组码,判断对象类型
  7.                (not (princ "\n所选的对象不是多段线!")) ; 提示条件不满足,并结束命令
  8.            )
  9.          )
  10.          (progn
  11.            (setq PckPnt (trans PckPnt 1 0) ; 将选择框位置点从UCS转换为WCS
  12.                  PckPnt (vlax-curve-getClosestPointTo EName PckPnt) ; 获取选择框位置点在多段线上的最近的(确保点的多段线上)
  13.                  PckPnt (fix (vlax-curve-getParamAtPoint EName PckPnt)) ; 获取用户选择多段线所在段的参数
  14.            )
  15.            (or (equal (vlax-curve-getSecondDeriv EName PckPnt) '(0 0 0) 1E-8) ; 判断所选是否是直线段
  16.                (not (princ "\n所选的多段线的段不能是圆弧!")) ; 提示条件不满足,并结束命令
  17.            )
  18.          )
  19.          (setq Point (getpoint "\n指定构造线通过点: ")) ; 拾取构造线通过点
  20.     )
  21.   (progn
  22.     (setq PckPnt2 (vlax-curve-getPointAtParam EName (1+ PckPnt)) ; 获得多段线顶点2
  23.           PckPnt (vlax-curve-getPointAtParam EName PckPnt) ; 获取多段线段的顶点1
  24.           Vector (mapcar '- PckPnt2 PckPnt) ; 获取两顶点的向量
  25.           Point  (trans Point 1 Vector) ; 将拾取点从UCS转换到向量
  26.           PckPnt (trans (vl-list* (car Point) (cadr Point) (cddr (trans PckPnt 0 Vector))) Vector 0) ; 将顶点1投影到通过拾取点的平行线上
  27.     )
  28.     ;; 创建构造线
  29.     (entmake (list '(0 . "XLINE")
  30.                    '(100 . "AcDbEntity")
  31.                    '(100 . "AcDbXline")
  32.                    (cons 10 PckPnt)
  33.                    (cons 11 Vector)
  34.               )
  35.     )
  36.   )
  37. )

  38. (princ)

  39. )




回复

使用道具 举报

 楼主| 发表于 2021-3-30 01:49:48 | 显示全部楼层

指定构造线通过点: ; 错误: 参数类型错误: numberp: (2362.37 1507.18 0.0)

点评

编辑帖子时候不小心删掉一行,已经补上  发表于 2021-3-30 07:59
回复

使用道具 举报

 楼主| 发表于 2021-3-30 08:15:02 | 显示全部楼层

选择多段线:
所选的多段线的段不能是圆弧!

多段线标高不为0时提示这个!
回复

使用道具 举报

 楼主| 发表于 2021-3-30 08:19:44 | 显示全部楼层
回复

使用道具 举报

 楼主| 发表于 2021-3-30 08:32:01 | 显示全部楼层




把这个判断删除貌似好了,不知有没有影响
回复

使用道具 举报

 楼主| 发表于 2021-3-30 08:32:48 | 显示全部楼层
本帖最后由 jzf1987 于 2021-3-30 08:37 编辑

           (or (equal (vlax-curve-getSecondDeriv EName PckPnt) '(0 0 0) 1E-8) ; 判断所选是否是直线段
               (not (princ "\n所选的多段线的段不能是圆弧!")) ; 提示条件不满足,并结束命令
           )


这个判断条件删除貌似好了,但是不分多段线跟圆弧都能画XLINE!
回复

使用道具 举报

发表于 2024-7-6 23:45:36 | 显示全部楼层
jzf1987 发表于 2021-3-30 08:32
(or (equal (vlax-curve-getSecondDeriv EName PckPnt) '(0 0 0) 1E-8) ; 判断所选是否是直线 ...

试过了,不行,条件不会变
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-25 14:36 , Processed in 0.240284 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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