乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 54|回复: 9

[编程交流] 修改Lisp

[复制链接]

23

主题

132

帖子

112

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
114
发表于 2022-7-6 14:30:57 | 显示全部楼层 |阅读模式
你好
 
我有一个lisp例程,我们在办公室使用它来标记具有全局宽度的多段线。
即,如果我有一条全局宽度为0.2的多段线(代表管道),例程将用DN200标记多段线的所有段
 
我想做的是更改此代码,以便如果多段线段小于10个单位,则此段不会得到标签。
 
例如,长度为29个单位的多段线有3段,2段的长度为12个单位,第三段的长度为5个单位。
我希望标记12个单元的2个段,但不要标记5个单元的第三个段
 
_________________
 
如果没有线段大于10个单位,则在中点标记一次多段线。
 
______________
 
这里我的第一个问题是,我不确定我需要在代码中的什么地方进行更改。
 
如果有人能帮助我或给我举一些例子说明如何实现这一点,我将不胜感激。
 
谢谢
 
  1.                                 ;This routine was provided by ASMI.
  2. (vl-load-com)
  3. (defun c:Label_Width (/              js      htx     AcDoc   cLay    Space
  4.               nw_style              obj     dxf_ent ename   t_mod
  5.               key     pr      t_char  js_text pt      deriv
  6.               rtx     nw_obj  n
  7.              )
  8. (princ "\nSelect a polyline.")
  9. (while
  10.    (null
  11.      (setq js
  12.      (ssget "_+.:E:S"
  13.             (list
  14.               '(0 . "*POLYLINE")
  15.               (cons 67
  16.                     (if        (eq (getvar "CVPORT") 1)
  17.                       1
  18.                       0
  19.                     )
  20.               )
  21.               (cons 410
  22.                     (if        (eq (getvar "CVPORT") 1)
  23.                       (getvar "CTAB")
  24.                       "Model"
  25.                     )
  26.               )
  27.             )
  28.      )
  29.      )
  30.    )
  31.     (princ "\nIsn't an available object for this fonction!")
  32. )
  33. (setq
  34.    obj            (ssname js 0)
  35.    dxf_ent (entget obj)
  36.    ename   (vlax-ename->vla-object obj)
  37.    cLay    (vla-get-Layer ename)
  38.    t_mod   '+
  39.    key            "Yes"
  40. )
  41. (cond
  42.    ((assoc 43 dxf_ent)
  43.     (setq
  44.       AcDoc (vla-get-ActiveDocument (vlax-get-acad-object))
  45.       Space
  46.      (if (= 1 (getvar "CVPORT"))
  47.        (vla-get-PaperSpace AcDoc)
  48.        (vla-get-ModelSpace AcDoc)
  49.      )
  50.     )
  51.     (repeat 2
  52.       (setq pr             -0.5
  53.      t_char  64
  54.      js_text (ssadd)
  55.       )
  56.       (if (eq key "Yes")
  57. (repeat (fix (vlax-curve-getEndParam ename))
  58.    (setq
  59.      pt           (vlax-curve-GetpointAtParam ename (setq pr (1+ pr)))
  60.      deriv (vlax-curve-getFirstDeriv ename pr)
  61.      rtx   (- (atan (cadr deriv) (car deriv))
  62.               (angle '(0 0 0) (getvar "UCSXDIR"))
  63.            )
  64.    )
  65.    (setq nw_obj
  66.           (vla-addMtext
  67.             Space
  68.             (vlax-3d-point
  69.               (setq pt (polar pt
  70.                               ((eval t_mod) rtx (* pi 0.5))
  71.                               (getvar "TEXTSIZE")
  72.                        )
  73.               )
  74.             )
  75.             0.0
  76.             (strcat
  77.               "DN"
  78.               "%<\\AcExpr (%<\\AcObjProp.16.2 Object(%<\\_ObjId "
  79.               (itoa (vla-get-ObjectID (vlax-ename->vla-object obj)))
  80.               ">%).ConstantWidth >% * 1000) \\f "%lu2%pr0">%"
  81.             )
  82.           )
  83.    )
  84.    (if (or (> rtx (* pi 0.5)) (< rtx (- (* pi 0.5))))
  85.      (setq rtx (+ rtx pi))
  86.    )
  87.    (mapcar
  88.      '(lambda (pr val)
  89.         (vlax-put nw_obj pr val)
  90.       )
  91.      (list 'AttachmentPoint   'Height
  92.            'DrawingDirection  'InsertionPoint
  93.            'StyleName              'Layer
  94.            'Rotation
  95.           )
  96.      (list 5
  97.            (getvar "TEXTSIZE")
  98.            5
  99.            pt
  100.            (getvar "TEXTSTYLE")
  101.            cLay
  102.            rtx
  103.      )
  104.    )
  105.    (ssadd (entlast) js_text)
  106. )
  107.       )
  108.       (if (not (eq t_mod '-))
  109. (progn
  110.    (initget "Yes No")
  111.    (if (eq (setq
  112.              key (getkword
  113.                    "\nPut labels on other side [Yes/No]? <No>: "
  114.                  )
  115.            )
  116.            "Yes"
  117.        )
  118.      (progn (setq n -1
  119.                   t_mod        '-
  120.             )
  121.             (repeat (sslength js_text)
  122.               (entdel (ssname js_text (setq n (1+ n))))
  123.             )
  124.      )
  125.      (setq t_mod '-)
  126.    )
  127. )
  128.       )
  129.     )
  130.    )
  131.    (T (princ "\nThis polyine does not have a constant width!"))
  132. )
  133. (prin1)
  134. )
回复

使用道具 举报

23

主题

132

帖子

112

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
114
发表于 2022-7-6 14:39:41 | 显示全部楼层
有人有什么想法吗?
回复

使用道具 举报

CAB

29

主题

781

帖子

430

银币

中流砥柱

Rank: 25

铜币
526
发表于 2022-7-6 14:45:10 | 显示全部楼层
试试这个:
 
  1. ;;This routine was provided by ASMI.
  2. (vl-load-com)
  3. (defun c:Label_Width (/              js      htx     AcDoc   cLay    Space
  4.               nw_style              obj     dxf_ent ename   t_mod
  5.               key     pr      t_char  js_text pt      deriv
  6.               rtx     nw_obj  n  par  len
  7.              )
  8. (princ "\nSelect a polyline.")
  9. (while
  10.    (null
  11.      (setq js
  12.      (ssget "_+.:E:S"
  13.             (list
  14.               '(0 . "*POLYLINE")
  15.               (cons 67
  16.                     (if        (eq (getvar "CVPORT") 1)
  17.                       1
  18.                       0
  19.                     )
  20.               )
  21.               (cons 410
  22.                     (if        (eq (getvar "CVPORT") 1)
  23.                       (getvar "CTAB")
  24.                       "Model"
  25.                     )
  26.               )
  27.             )
  28.      )
  29.      )
  30.    )
  31.     (princ "\nIsn't an available object for this fonction!")
  32. )
  33. (setq
  34.    obj            (ssname js 0)
  35.    dxf_ent (entget obj)
  36.    ename   (vlax-ename->vla-object obj)
  37.    cLay    (vla-get-Layer ename)
  38.    t_mod   '+
  39.    key            "Yes"
  40. )
  41. (cond
  42.    ((assoc 43 dxf_ent)
  43.     (setq
  44.       AcDoc (vla-get-ActiveDocument (vlax-get-acad-object))
  45.       Space
  46.      (if (= 1 (getvar "CVPORT"))
  47.        (vla-get-PaperSpace AcDoc)
  48.        (vla-get-ModelSpace AcDoc)
  49.      )
  50.     )
  51.     (repeat 2
  52.       (setq pr             -0.5
  53.      t_char  64
  54.      js_text (ssadd)
  55.       )
  56.       (if (eq key "Yes")
  57. (repeat (fix (vlax-curve-getEndParam ename))
  58.    (setq
  59.      pt           (vlax-curve-GetpointAtParam ename (setq pr (1+ pr)))
  60.      deriv (vlax-curve-getFirstDeriv ename pr)
  61.      rtx   (- (atan (cadr deriv) (car deriv))
  62.               (angle '(0 0 0) (getvar "UCSXDIR"))
  63.            )
  64.    )
  65.           ;;  Test for segment length - CAB
  66.           ;;  vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
  67.           (setq par (fix pr))
  68.           (if (= par (fix (vlax-curve-getEndParam ename)))
  69.             (setq len (vlax-curve-getdistatparam ename (vlax-curve-getEndParam ename)))
  70.             (setq len (vlax-curve-getdistatparam ename (1+ par)))
  71.           )
  72.           (setq len (- len (vlax-curve-getdistatparam ename par)))
  73.                
  74.           (if (> len 10.0) ; Min Segment Length
  75.             (progn
  76.           ;;  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  77.    (setq nw_obj
  78.           (vla-addMtext
  79.             Space
  80.             (vlax-3d-point
  81.               (setq pt (polar pt
  82.                               ((eval t_mod) rtx (* pi 0.5))
  83.                               (getvar "TEXTSIZE")
  84.                        )
  85.               )
  86.             )
  87.             0.0
  88.             (strcat
  89.               "DN"
  90.               "%<\\AcExpr (%<\\AcObjProp.16.2 Object(%<\\_ObjId "
  91.               (itoa (vla-get-ObjectID (vlax-ename->vla-object obj)))
  92.               ">%).ConstantWidth >% * 1000) \\f "%lu2%pr0">%"
  93.             )
  94.           )
  95.    )
  96.    (if (or (> rtx (* pi 0.5)) (< rtx (- (* pi 0.5))))
  97.      (setq rtx (+ rtx pi))
  98.    )
  99.    (mapcar
  100.      '(lambda (pr val)
  101.         (vlax-put nw_obj pr val)
  102.       )
  103.      (list 'AttachmentPoint   'Height
  104.            'DrawingDirection  'InsertionPoint
  105.            'StyleName              'Layer
  106.            'Rotation
  107.           )
  108.      (list 5
  109.            (getvar "TEXTSIZE")
  110.            5
  111.            pt
  112.            (getvar "TEXTSTYLE")
  113.            cLay
  114.            rtx
  115.      )
  116.    )
  117.    (ssadd (entlast) js_text)
  118.           ) ; CAB
  119.             ) ; CAB
  120. )
  121.       )
  122.       (if (not (eq t_mod '-))
  123. (progn
  124.    (initget "Yes No")
  125.    (if (eq (setq
  126.              key (getkword
  127.                    "\nPut labels on other side [Yes/No]? <No>: "
  128.                  )
  129.            )
  130.            "Yes"
  131.        )
  132.      (progn (setq n -1
  133.                   t_mod        '-
  134.             )
  135.             (repeat (sslength js_text)
  136.               (entdel (ssname js_text (setq n (1+ n))))
  137.             )
  138.      )
  139.      (setq t_mod '-)
  140.    )
  141. )
  142.       )
  143.     )
  144.    )
  145.    (T (princ "\nThis polyine does not have a constant width!"))
  146. )
  147. (prin1)
  148. )
回复

使用道具 举报

58

主题

3353

帖子

33

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1761
发表于 2022-7-6 14:52:35 | 显示全部楼层
这似乎对我有效*又太慢了
 
*将翻转标签更改为拾取点。。输入结束。
 
  1. ;This routine was provided by ASMI.
  2. ; Additions by RJP 05-29-2009
  3. (defun c:label_width (/      acdoc  clay   d      deriv  dxf_ent       ename  flag   js     js_text
  4.                      key    nw_obj obj    out    p      pr     pt     pt2    rtx    space  t_char
  5.                      t_mod  val    x      w
  6.                     )
  7. (vl-load-com)
  8. (princ "\nSelect a polyline.")
  9. (while (null (setq js (ssget "_+.:E:S"
  10.                               (list '(0 . "*POLYLINE")
  11.                                     (cons 67
  12.                                           (if (eq (getvar "CVPORT") 1)
  13.                                             1
  14.                                             0
  15.                                           )
  16.                                     )
  17.                                     (cons 410
  18.                                           (if (eq (getvar "CVPORT") 1)
  19.                                             (getvar "CTAB")
  20.                                             "Model"
  21.                                           )
  22.                                     )
  23.                               )
  24.                        )
  25.               )
  26.         )
  27.    (princ "\nIsn't an available object for this function!")
  28. )
  29. (setq obj     (ssname js 0)
  30.        dxf_ent (entget obj)
  31.        ename   (vlax-ename->vla-object obj)
  32.        clay    (vla-get-layer ename)
  33.        t_mod   '+
  34.        key     "Yes"
  35. )
  36. (if (setq w (cdr (assoc 43 dxf_ent)))
  37.    (progn (setq acdoc (vla-get-activedocument (vlax-get-acad-object))
  38.                 space (if (= 1 (getvar "CVPORT"))
  39.                         (vla-get-paperspace acdoc)
  40.                         (vla-get-modelspace acdoc)
  41.                       )
  42.                 x     0.0
  43.           )
  44.           ;;RJP check if at least one segment is longer than 10
  45.           (repeat (fix (vlax-curve-getendparam ename))
  46.             (if (> (distance (vlax-curve-getpointatparam ename x)
  47.                              (vlax-curve-getpointatparam ename (setq x (1+ x)))
  48.                    )
  49.                    10.
  50.                 )
  51.               (setq flag t)
  52.             )
  53.           )
  54.           (setq pr      -0.5
  55.                 t_char  64
  56.                 js_text (ssadd)
  57.                 x       0.0
  58.           )
  59.           (if (and (eq key "Yes") flag)
  60.             ;;RJP add - If at least one segment is greater than 10
  61.             (repeat (fix (vlax-curve-getendparam ename))
  62.               (setq pt    (vlax-curve-getpointatparam ename (setq pr (1+ pr)))
  63.                     deriv (vlax-curve-getfirstderiv ename pr)
  64.                     rtx   (- (atan (cadr deriv) (car deriv)) (angle '(0 0 0) (getvar "UCSXDIR")))
  65.                     d     (distance (vlax-curve-getpointatparam ename x)
  66.                                     (vlax-curve-getpointatparam ename (setq x (1+ x)))
  67.                           )
  68.               )
  69.               (if (> d 5)
  70.                 ;;RJP add - If segment length > 5 rock and roll (does not calculate length along arc segment) it's pt to pt
  71.                 (progn (setq nw_obj
  72.                               (vla-addmtext space
  73.                                             (vlax-3d-point (setq pt (polar pt
  74.                                                                            ((eval t_mod) rtx (* pi 0.5))
  75.                                                                            (+ (getvar "TEXTSIZE") (/ w 2.))
  76.                                                                     )
  77.                                                            )
  78.                                             )
  79.                                             0.0
  80.                                             (strcat "DN"
  81.                                                     "%<\\AcExpr (%<\\AcObjProp.16.2 Object(%<\\_ObjId "
  82.                                                     (itoa (vla-get-objectid (vlax-ename->vla-object obj)))
  83.                                                     ">%).ConstantWidth >% * 1000) \\f "%lu2%pr0">%"
  84.                                             )
  85.                               )
  86.                        )
  87.                        (if (or (> rtx (* pi 0.5)) (< rtx (- (* pi 0.5))))
  88.                          (setq rtx (+ rtx pi))
  89.                        )
  90.                        (mapcar '(lambda (pr val) (vlax-put nw_obj pr val))
  91.                                (list 'attachmentpoint   'height            'drawingdirection
  92.                                      'insertionpoint    'stylename         'layer
  93.                                      'rotation
  94.                                     )
  95.                                (list 5 (getvar "TEXTSIZE") 5 pt (getvar "TEXTSTYLE") clay rtx)
  96.                        )
  97.                        (setq out (cons nw_obj out))
  98.                 )
  99.               )
  100.             )
  101.             ;;RJP add - Else no segments greater than 10 get midpoint of polyline
  102.             (progn (setq pt    (vlax-curve-getpointatdist
  103.                                  ename
  104.                                  (/ (vlax-curve-getdistatpoint ename (vlax-curve-getendpoint ename)) 2)
  105.                                )
  106.                          deriv (vlax-curve-getfirstderiv ename (vlax-curve-getparamatpoint ename pt))
  107.                          rtx   (- (atan (cadr deriv) (car deriv)) (angle '(0 0 0) (getvar "UCSXDIR")))
  108.                    )
  109.                    (setq
  110.                      nw_obj (vla-addmtext space
  111.                                           (vlax-3d-point (setq pt (polar pt
  112.                                                                          ((eval t_mod) rtx (* pi 0.5))
  113.                                                                          (+ (getvar "TEXTSIZE") (/ w 2.))
  114.                                                                   )
  115.                                                          )
  116.                                           )
  117.                                           0.0
  118.                                           (strcat "DN"
  119.                                                   "%<\\AcExpr (%<\\AcObjProp.16.2 Object(%<\\_ObjId "
  120.                                                   (itoa (vla-get-objectid (vlax-ename->vla-object obj)))
  121.                                                   ">%).ConstantWidth >% * 1000) \\f "%lu2%pr0">%"
  122.                                           )
  123.                             )
  124.                    )
  125.                    (if (or (> rtx (* pi 0.5)) (< rtx (- (* pi 0.5))))
  126.                      (setq rtx (+ rtx pi))
  127.                    )
  128.                    (mapcar '(lambda (pr val) (vlax-put nw_obj pr val))
  129.                            (list 'attachmentpoint   'height            'drawingdirection
  130.                                  'insertionpoint    'stylename         'layer
  131.                                  'rotation
  132.                                 )
  133.                            (list 5 (getvar "TEXTSIZE") 5 pt (getvar "TEXTSTYLE") clay rtx)
  134.                    )
  135.                    (setq out (cons nw_obj out))
  136.             )
  137.           )
  138.           ;;RJP add - pickpoint to flip labels or enter to exit
  139.           (while (setq p (getpoint "\nPick a point to flip labels :"))
  140.             (foreach txt out
  141.               (vla-move txt
  142.                         (vla-get-insertionpoint txt)
  143.                         (vlax-3d-point
  144.                           (polar (setq pt (vlax-get txt 'insertionpoint))
  145.                                  (angle pt (setq pt2 (vlax-curve-getclosestpointto ename pt)))
  146.                                  (* 2. (distance pt pt2))
  147.                           )
  148.                         )
  149.               )
  150.             )
  151.           )
  152.    )
  153.    (princ "\nThis polyline does not have a constant width!")
  154. )
  155. (prin1)
  156. )
回复

使用道具 举报

1

主题

10

帖子

9

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-6 14:59:21 | 显示全部楼层
 
这是我的名字,丹过去了。
153100q0hhmg2z8pgpggq3.jpg
回复

使用道具 举报

58

主题

3353

帖子

33

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1761
发表于 2022-7-6 15:10:03 | 显示全部楼层
Dani,
 
一幅画抵得上一千个字。。。我重新发布了代码,试一试。
回复

使用道具 举报

23

主题

132

帖子

112

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
114
发表于 2022-7-6 15:12:50 | 显示全部楼层
 
 
非常感谢您在这方面花时间。
 
不幸的是,这似乎不适用于线段长度不超过10个单位的多段线
 
它适用于具有多个段的柱脚,其中一些段短于10个单位
 
ronjonp的版本似乎完全符合我的需要,我只需要在周一的办公室里对它进行更多的测试
回复

使用道具 举报

23

主题

132

帖子

112

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
114
发表于 2022-7-6 15:21:22 | 显示全部楼层
 
嗨,Ronjonp,
 
这似乎和我描述的一模一样(希望我最初的描述足够好,这不仅仅是巧合)
 
我会在周一的工作中测试它,并给出一些反馈。但初步测试似乎非常令人满意!
 
再次非常感谢您,特别感谢您在代码中提供了描述,这样我就可以看到您做了什么,以及您是如何做到的。
回复

使用道具 举报

58

主题

3353

帖子

33

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1761
发表于 2022-7-6 15:26:43 | 显示全部楼层
很高兴帮助。。。如果它没有按预期工作,请告诉我。
回复

使用道具 举报

59

主题

327

帖子

268

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
295
发表于 2022-7-6 15:36:46 | 显示全部楼层
在我尝试了这个程序(只是出于好奇)之后,我想知道是否可以这样做。
 
假设我们有一个叫做“19mm管道”的层,所以在该层中绘制的所有线都是19mm管道。现在,我将文字放在“19mm”行旁边,或者使用图形中某处解释的线型。有时我会放置一个引线,其中填充了所需的文本“19mm”。
 
有没有办法在直接显示直径的那条线上放置(某种)引线?
因为线本身没有直径,我知道。也许因为这是一条线,它在一个特定的层上,所以它可以做到。
 
只是好奇。。。我可以用它。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-5 00:31 , Processed in 0.625742 second(s), 74 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表