乐筑天下

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

[编程交流] 圆角线和/或PLINE

[复制链接]

37

主题

264

帖子

236

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
185
发表于 2022-7-5 15:58:29 | 显示全部楼层 |阅读模式
你好
 
 
我试图得到一段代码,它能够以给定的半径圆角,无论它是直线的多段线。我得到了这个常规钢筋弯曲工作,但它只适用于线。我也想让它“多段线友好”。
 
 
这是一段代码。我陷入了决定t是直线还是多段线的部分。如有任何帮助或导致类似代码,我们将不胜感激。
 
 
  1. ; example for a fixed r=40 handling
  2. (defun c:fg16 (/ CMDECHO CMDDIA FRAD E1 E2)
  3.    (princ "\fillet diam. 16, r = 40 ")
  4.    (setq ERR     *ERROR*
  5.          *ERROR* LISP-ERR
  6.          CMDECHO 0
  7.          CMDDIA  0
  8.          E1      NIL
  9.          E2      NIL
  10.          FRAD    (getvar "filletrad")
  11.    ) ;_ end of setq
  12.    (setvar "filletrad" 40)
  13.    (setq E1 (entsel "\nSelect first object: "))
  14.    (while (/= E1 nil)
  15.        (progn (setq tipoent (cdr (assoc 0 (entget (car (E1))))))  ; hmmm..
  16.                                                            
  17.               (if (= tipoent "POLYLINE")                                    ; if it is ONE polyline , handle it
  18.                   (command "_.fillet" "_polyline" "radius" "40" E1)
  19.                                                                                        ; end for polyline, but it fails (?)
  20.                   (progn (redraw (car E1) 3)                               ; start part for single LINES
  21.                          (setq E2 (entsel "\tsecond: "))                   ; second line needed
  22.                          (redraw (car E2) 3)
  23.                          (command "fillet" E1 E2)
  24.                          (setq E1 (entsel "\nfirst: "))
  25.                   )                              ; end part for single
  26.               )
  27.        )
  28.    )
  29.    (setvar "filletrad" FRAD)
  30.    (princ)
  31. )

165834w67ogop6ujryssa0.jpg
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

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

铜币
325
发表于 2022-7-5 16:05:52 | 显示全部楼层
尝试:
 
  1. (lambda ( / cmd e typ )
  2. (setq cmd (cond (command-s)(vl-cmdf)(command))) (setvar 'errno 0)
  3. (while (zerop (getvar 'errno)) (setq e (car (entsel "\nSelect object to fillet <exit>: ")))
  4.    (cond
  5.      ( (or (not e) (= 7 (getvar 'errno))) (setvar 'errno 0) )
  6.      ( (wcmatch (setq typ (cdr (assoc 0 (entget e)))) "*POLYLINE")
  7.        (cmd "_.fillet" "_polyline" "radius" (vl-prin1-to-string (getvar 'filletrad)) e)
  8.      )
  9.      ( (= typ "LINE") (cmd "fillet" e "\") )
  10.      ( (alert "Invalid object.") )
  11.    )
  12. )
  13. )
回复

使用道具 举报

37

主题

264

帖子

236

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
185
发表于 2022-7-5 16:12:10 | 显示全部楼层
就像冠军一样。。谢谢
 
 
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

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

铜币
325
发表于 2022-7-5 16:14:27 | 显示全部楼层
 
没问题,汉斯,我很乐意帮忙!
回复

使用道具 举报

18

主题

1529

帖子

973

银币

中流砥柱

Rank: 25

铜币
649
发表于 2022-7-5 16:18:15 | 显示全部楼层
只是一句话:
为了获得可预测的结果,最好为_Fillet命令提供完整的entsel列表,而不仅仅是ename。
  1. (setq lst (entsel))
  2. (command "_.fillet" lst "\")
回复

使用道具 举报

18

主题

1529

帖子

973

银币

中流砥柱

Rank: 25

铜币
649
发表于 2022-7-5 16:22:11 | 显示全部楼层
@Grrr:
查看文档,我发现command-s不允许暂停。您的代码表明“\\”(相当于暂停)是。这似乎很奇怪。你测试过这个吗?
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

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

铜币
325
发表于 2022-7-5 16:27:54 | 显示全部楼层
 
我不知道你可以提供entsel列表,谢谢!
 
 
是的,我已经在ACAD2017上测试了我的片段-效果很好,就像在Hans的演示中一样。
回复

使用道具 举报

18

主题

1529

帖子

973

银币

中流砥柱

Rank: 25

铜币
649
发表于 2022-7-5 16:33:28 | 显示全部楼层
@Grrr:谢谢你确认这一点。
回复

使用道具 举报

18

主题

1529

帖子

973

银币

中流砥柱

Rank: 25

铜币
649
发表于 2022-7-5 16:37:16 | 显示全部楼层
@哈拉姆:
如果用户想要圆角两条多段线,该怎么办?当前代码不允许这样做。
回复

使用道具 举报

18

主题

1529

帖子

973

银币

中流砥柱

Rank: 25

铜币
649
发表于 2022-7-5 16:43:42 | 显示全部楼层
也许是这样:
  1. (vl-load-com)
  2. (defun c:AltFillet ( / *error* N_Radius N_Select doc entselA entselB)
  3. (defun *error* (msg)
  4.    (setvar 'cmdecho 1)
  5.    (vla-endundomark doc)
  6. )
  7. (defun N_Radius ( / new)
  8.    (if (setq new (getdist (strcat "\nFillet radius <" (rtos (getvar 'filletrad)) ">: ")))
  9.      (setvar 'filletrad new)
  10.    )
  11. )
  12. (defun N_Select (msg / inp)
  13.    (setq inp T)
  14.    (while (and inp (not (vl-consp inp)))
  15.      (initget 128 "Radius")
  16.      (setq inp
  17.        (entsel
  18.          (strcat
  19.            "\nFillet (radius=" (rtos (getvar 'filletrad)) "):  Radius/<" msg ">: "
  20.          )
  21.        )
  22.      )
  23.      (if (= "Radius" inp)
  24.        (N_Radius)
  25.      )
  26.    )
  27.    inp
  28. )
  29. (setq doc (vla-get-activedocument (vlax-get-acad-object)))
  30. (vla-endundomark doc)
  31. (vla-startundomark doc)
  32. (setvar 'cmdecho 0)
  33. (cond
  34.    ((not (setq entselA (N_Select "Select first entity")))
  35.      nil
  36.    )
  37.    ((vl-position (vla-get-objectname (vlax-ename->vla-object (car entselA))) '("AcDb2dPolyline" "AcDbPolyline"))
  38.      (if (setq entselB (N_Select "Select second entity or Enter to fillet selected polyline"))
  39.        (command "_.fillet" entselA entselB)
  40.        (command "_.fillet" "_polyline" entselA)
  41.      )
  42.    )
  43.    ((setq entselB (N_Select "Select second entity"))
  44.      (command "_.fillet" entselA entselB)
  45.    )
  46. )
  47. (setvar 'cmdecho 1)
  48. (vla-endundomark doc)
  49. (princ)
  50. )
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-14 13:08 , Processed in 2.100218 second(s), 76 queries .

© 2020-2025 乐筑天下

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