乐筑天下

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

[编程交流] dimensi的自动放置

[复制链接]

7

主题

39

帖子

32

银币

初来乍到

Rank: 1

铜币
35
发表于 2022-7-5 16:45:42 | 显示全部楼层 |阅读模式
我一直在尝试这篇文章第一页的Tharwat代码,并将其整合到我已经拥有的代码中。我使用点坐标在顶部有倒角的矩形上自动放置尺寸。我现在的问题是维度没有按我预期的那样放置。我确实在另一个论坛上找到了Tharwat的这段代码,他使用Visual LISP来放置维度。
  1. (defun c:TesT (/ ss n sset p1 y p2 x p3)
  2. ;;;====== Tharwat 17. Sep. 2011 =====;;;
  3. (vl-load-com)
  4. (cond ((not spc)
  5.         (setq spc (vla-get-ModelSpace
  6.                     (vla-get-activedocument (vlax-get-acad-object))
  7.                   )
  8.         )
  9.        )
  10. )
  11. (if (setq ss (ssget '((0 . "POLYLINE,LWPOLYLINE"))))
  12.    (progn
  13.      (if (= 4.0 (vlax-curve-getendparam (ssname ss 0)))
  14.        (repeat (setq n (sslength ss))
  15.          (setq sset (ssname ss (setq n (1- n))))
  16.          (setq p1 (vlax-3d-point
  17.                     (setq y (vlax-curve-getpointatparam sset 0))
  18.                   )
  19.          )
  20.          (setq p2 (vlax-3d-point
  21.                     (setq x (vlax-curve-getpointatparam sset 1))
  22.                   )
  23.          )
  24.          (setq p3 (vlax-3d-point (vlax-curve-getpointatparam sset 2)))
  25.          (vla-adddimrotated
  26.            spc
  27.            p1
  28.            p2
  29.            (vlax-3d-point (list (car y) (+ (cadr y) 10.) (caddr y)))
  30.            0.0
  31.          )
  32.          (vla-AddDimAligned
  33.            spc
  34.            p2
  35.            p3
  36.            (vlax-3d-point (list (+ (car x) 10.) (cadr x) (caddr x)))
  37.          )
  38.        )
  39.      )
  40.    )
  41.    (princ)
  42. )
  43. (princ)
  44. )

 
我不知道如何将这段代码合并到我的代码中。如果可能的话,有人能告诉我怎么做吗?现在,我只是想让其中一个维度正确显示。
 
下图是我试图实现的目标。
174545mqfo005m45a0kh0z.png
以下是当前代码。
  1. (defun SetvariableToEachCoordinate (s / e i); subroutine by Tharwat 1/13/17
  2. (if (and (eq (type s) 'ENAME)
  3.           (= (cdr (assoc 0 (setq e (entget s)))) "LWPOLYLINE")
  4.           (setq i 0)
  5.           )
  6.    (mapcar '(lambda (x) (set (read (strcat "P" (itoa (setq i (1+ i))))) x)
  7.               (setq l (cons (read (strcat "P" (itoa i))) l))
  8.               )
  9.            (mapcar 'cdr (vl-remove-if-not '(lambda (q) (= (car q) 10)) e))
  10.            )
  11.    )
  12. (reverse l)
  13. (setq lofl (length l))
  14. )
  15. (defun c:dimbox3 ()
  16. (vl-load-com)
  17. (cond        ((not spc)
  18. (setq spc (vla-get-ModelSpace
  19.              (vla-get-activedocument (vlax-get-acad-object))
  20.            )
  21. )
  22. )
  23. )
  24. (setvar "cmdecho" 0)
  25. (setq        varlist        '(a b x         q ss s i en dimdist l lst))
  26. (foreach var varlist (set var nil))
  27. (setq factor (getvar "dimscale"))
  28. (if (zerop (getvar "dimtxt"))
  29.    (setq hgt
  30.    2.5
  31.    )
  32.    (setq hgt (getvar "dimtxt"))
  33. )
  34. (setq dimdist (* factor (* 5 hgt)))
  35. (setq i 0)
  36. (setq ss (ssget "_X" '((0 . "*POLYLINE") (8 . "0"))))
  37. (repeat (setq nos (sslength ss))
  38.    (setq lst
  39.    (cons (SetvariableToEachCoordinate
  40.            (ssname ss (setq nos (1- nos)))
  41.          )
  42.          lst
  43.    )
  44.    )
  45. )                                        ;end repeat
  46. (command "._dimlinear"
  47.    "_non"
  48.    p3
  49.    "_non"
  50.    p4
  51.    "_non"
  52.    (polar p3 (/ (* 0 pi) 180) dimdist)
  53. )
  54. (setvar "cmdecho" 1)
  55. (princ)
  56. )

 
非常感谢。
起草人Joe
回复

使用道具 举报

18

主题

1529

帖子

973

银币

中流砥柱

Rank: 25

铜币
649
发表于 2022-7-5 16:53:05 | 显示全部楼层
如果您想为多段线创建与示例类似的代码,那么这是可行的。但是你仍然需要分析几何学。任何一个点都可以是第一个点,多段线的方向可以是顺时针或逆时针。你不应该假设一个固定的顺序。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 17:00:09 | 显示全部楼层
这将为您提供大部分帮助:
从这里顺时针列出函数。
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

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

铜币
325
发表于 2022-7-5 17:01:04 | 显示全部楼层
嗨,李,
我越是尝试剖析/消化你的完整示例,就越能看到我忽略/遗漏的东西。
这次这个街区让我:
  1. (setq lst
  2. (   (lambda ( p / r )
  3.    (append
  4.      (vl-member-if '(lambda ( x ) (cond ((equal x p 1e-) ((setq r (cons x r)) nil))) lst)
  5.      (reverse r)
  6.    )
  7. )
  8. (apply 'mapcar (cons 'min lst))
  9. )
  10. )

 
  1. (apply 'mapcar (cons 'min lst))

^^我以前见过这样的情况:
  1. (setq cen (apply 'mapcar (cons '(lambda (a b) (/ (+ a b) 2.)) (mapcar 'vlax-safearray->list (list ll ur)))))

我敢打赌你一定认识你给我举的上述例子。
但是(应用‘mapcar(cons’min lst))不等于:(mapcar’min lst)?
或者我错过了什么?
 
显然,我在想象lambda部分时遇到了一些麻烦:
  1. (lambda ( p / r )
  2. (append
  3.    (vl-member-if '(lambda ( x ) (cond ((equal x p 1e-) ((setq r (cons x r)) nil))) lst)
  4.    (reverse r)
  5. )
  6. )

 
如果你不介意解释(尤其是应用“地图车”部分)
谢谢
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 17:05:49 | 显示全部楼层
李,我和ssget有问题,我把它切回lwpolyline,然后它工作不确定我做错了什么其他人有问题吗?我必须查找所有dxf代码才能找到它。现在我的参考书在哪里。
 
一般来说,我可以看到一个问题,当你想调暗左侧时会发生什么?我考虑了这个问题,提出了一些想法,使用拾取点来定义要变暗的第一条腿,因此比较顶点来找到这个点,这也是一个问题,一旦你到达垂直列表的末尾,你需要转到列表的开头,继续计算腿数。因此,这将是选择腿和所需的段数。这可能是defun name autodim2 autodim3的一部分,因为代码的余额只需要一次。
 
可能是一个昏暗的所有腿,并用于接受任何关键拒绝。作为这项工作的一部分,检查两点的角度,因此使用垂直和水平,否则同时进行垂直和水平。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 17:12:35 | 显示全部楼层
 
没有-
 
给定列表:
  1. (setq lst '(<item1> <item2> ... <itemN>))
  1. (mapcar 'min lst) == ((min <item1>) (min <item2>) ... (min <itemN>))
  1. (apply 'mapcar (cons 'min lst)) == ((min (car <item1>) (car <item2>) ... (car <itemN>)) (min (cadr <item1>) (cadr <item2>) ... (cadr <itemN>)) ...)
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 17:19:14 | 显示全部楼层
 
ssget过滤器将只允许位于模型空间中的具有6个顶点且没有弧段的闭合多段线。
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

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

铜币
325
发表于 2022-7-5 17:24:29 | 显示全部楼层
感谢李的解释,
我立即想到了LM:ssboundingbox子函数,并且可以创建类似的东西(不适用于插入,但希望您能得到想法/灵感):
 
  1. [b][color=BLACK]([/color][/b]defun VanillaBoundingBox [b][color=FUCHSIA]([/color][/b] SS / i enx lst [b][color=FUCHSIA])[/color][/b]
  2. [b][color=FUCHSIA]([/color][/b]if [b][color=NAVY]([/color][/b]eq 'PICKSET [b][color=MAROON]([/color][/b]type SS[b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b]
  3.    [b][color=NAVY]([/color][/b]repeat [b][color=MAROON]([/color][/b]setq i [b][color=GREEN]([/color][/b]sslength SS[b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b]
  4.      [b][color=MAROON]([/color][/b]and [b][color=GREEN]([/color][/b]/= [color=#2f4f4f]"INSERT"[/color] [b][color=BLUE]([/color][/b]cdr [b][color=RED]([/color][/b]assoc 0 [b][color=PURPLE]([/color][/b]setq enx [b][color=TEAL]([/color][/b]entget [b][color=OLIVE]([/color][/b]ssname SS [b][color=GRAY]([/color][/b]setq i [b][color=AQUA]([/color][/b]1- i[b][color=AQUA])[/color][/b][b][color=GRAY])[/color][/b][b][color=OLIVE])[/color][/b][b][color=TEAL])[/color][/b][b][color=PURPLE])[/color][/b][b][color=RED])[/color][/b][b][color=BLUE])[/color][/b][b][color=GREEN])[/color][/b]
  5.        [b][color=GREEN]([/color][/b]setq lst
  6.          [b][color=BLUE]([/color][/b]append lst
  7.            [b][color=RED]([/color][/b]apply 'append
  8.              [b][color=PURPLE]([/color][/b]mapcar
  9.                [b][color=TEAL]([/color][/b]function [b][color=OLIVE]([/color][/b]lambda [b][color=GRAY]([/color][/b]x[b][color=GRAY])[/color][/b] [b][color=GRAY]([/color][/b]if [b][color=AQUA]([/color][/b]member [b][color=LIME]([/color][/b]car x[b][color=LIME])[/color][/b] '[b][color=LIME]([/color][/b]10 11[b][color=LIME])[/color][/b][b][color=AQUA])[/color][/b] [b][color=AQUA]([/color][/b]list [b][color=LIME]([/color][/b]cdr x[b][color=LIME])[/color][/b][b][color=AQUA])[/color][/b][b][color=GRAY])[/color][/b][b][color=OLIVE])[/color][/b][b][color=TEAL])[/color][/b]
  10.                enx
  11.              [b][color=PURPLE])[/color][/b][color=#8b4513]; mapcar [/color]
  12.            [b][color=RED])[/color][/b][color=#8b4513]; apply 'append[/color]
  13.          [b][color=BLUE])[/color][/b][color=#8b4513]; append lst[/color]
  14.        [b][color=GREEN])[/color][/b][color=#8b4513]; setq [/color]
  15.      [b][color=MAROON])[/color][/b][color=#8b4513]; and[/color]
  16.    [b][color=NAVY])[/color][/b][color=#8b4513]; repeat[/color]
  17. [b][color=FUCHSIA])[/color][/b][color=#8b4513]; if[/color]
  18. [b][color=FUCHSIA]([/color][/b]if lst [b][color=NAVY]([/color][/b]list [b][color=MAROON]([/color][/b]apply 'mapcar [b][color=GREEN]([/color][/b]cons 'min lst[b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b] [b][color=MAROON]([/color][/b]apply 'mapcar [b][color=GREEN]([/color][/b]cons 'max lst[b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b][b][color=FUCHSIA])[/color][/b]
  19. [b][color=BLACK])[/color][/b][color=#8b4513]; defun VanillaBoundingBox[/color]

 
  1. 11
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 17:26:49 | 显示全部楼层
 
不客气。
 
 
这是一个好主意,但它将严格限于线性对象,例如直线和直线分段的LWD多段线-对于非线性对象(圆弧、圆、椭圆、样条曲线和具有圆弧段的LWD多段线),显然会得到不想要的结果,DXF组10和11不对应于定义几何体的坐标的对象(例如,文本、多行文字和插入-如您所述)。
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 17:33:55 | 显示全部楼层
谢谢李,我有5段在我的测试线路。dxf 90不是我会想到的。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-13 13:19 , Processed in 0.438096 second(s), 75 queries .

© 2020-2025 乐筑天下

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