乐筑天下

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

[编程交流] 具有方形边缘的缓冲区。

[复制链接]
M76

35

主题

114

帖子

87

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
174
发表于 2022-7-6 11:48:53 | 显示全部楼层 |阅读模式
你好
 
我试图在多段线周围创建缓冲区。我的问题是,我需要具有方形边缘的缓冲区,map3d只创建具有圆形边缘的缓冲区,这对我来说是无用的。
 
通过使用多行创建两条平行线,我能够取得进展,但在线的末尾,连接并不是无缝的。我会把我的意思贴出来。
 
第一张图显示了autocad可以创建的内容与我需要的缓冲区类型之间的差异。白线是我需要的,黄线是autocad生成的缓冲区。
 
第二张图是我的问题,如果一条线在一个顶点结束,并继续作为一条新线,用多线创建的区域将看起来像这样,这显然是不好的。
 
第三张图显示了我需要获得的正确版本。
 
因此,要么我需要一个完整的程序,可以正确创建正方形缓冲区,要么我需要一个解决方案,如何编辑图2中的线,以获得如图3所示的结果。
 
谢谢
124856h2qztw8zj03w888h.jpg
124858ra79ht7i9c3hhtxz.jpg
124859pu9a9a4vgqs61s2a.jpg
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 11:55:43 | 显示全部楼层
这怎么样?
 
  1. (defun c:buffer (/ eLast ent obj wid)
  2. (vl-load-com)
  3. ; Lee Mac  ~  25.01.10
  4. (or *def_wid* (setq *def_wid* 10.))
  5. (setq *def_wid* (cond ((getdist (strcat "\nSpecify Width <" (rtos *def_wid*) "> : ")))
  6.                        (*def_wid*)))
  7. (setq eLast (entlast))
  8. (command "_.pline")
  9. (while (eq 1 (logand 1 (getvar 'CMDACTIVE))) (command pause))
  10. (if (not (eq eLast (setq ent (entlast))))
  11.    (progn
  12.      (setq obj (vlax-ename->vla-object ent) wid (/ *def_wid* 2.))
  13.      
  14.      (mapcar
  15.        (function
  16.          (lambda (x)
  17.            (vla-offset x (setq wid (- wid))))) (list obj obj))
  18.      (entdel ent)))
  19. (princ))
回复

使用道具 举报

M76

35

主题

114

帖子

87

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
174
发表于 2022-7-6 12:01:00 | 显示全部楼层
 
如果我理解的话,这只会使线向两边偏移。结果与使用mline没有什么不同。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 12:07:08 | 显示全部楼层
我以为你说你需要第三张照片?
 
这就是我的代码实现的。
回复

使用道具 举报

26

主题

1495

帖子

20

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
118
发表于 2022-7-6 12:14:38 | 显示全部楼层
您可能需要查看TRACE命令。对于闭合路径,您必须做一些额外的工作。扩展轨迹,使其重复前2段。然后擦除最后一个和第一个轨迹段,使关节成角度-大卫
 
PS:你可以用PEDIT Width做同样的事情,但是没有进入角点的通道,而轨迹告诉你整个故事。
回复

使用道具 举报

26

主题

1495

帖子

20

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
118
发表于 2022-7-6 12:21:30 | 显示全部楼层
它应该看起来像这样:
 
  1. (defun c:trpath (/ ss en ed pl closed fe tw)
  2. (while (or (not ss)
  3.             (/= (sslength ss) 1))
  4.         (princ "\nSelect Polyline Path")
  5.         (setq ss (ssget '((0 . "*POLYLINE")))))
  6. (setq en (ssname ss 0)
  7.        ed (entget en)
  8.        pl (findpath en))
  9. (if (= (logand (cdr (assoc 70 ed)) 1) 1)
  10.      (setq pl (append pl (list (cadr pl)))
  11.            pl (append pl (list (caddr pl)))
  12.            closed T))
  13. (entmake (list (cons 0 "POINT")(cons 10 (car pl))))
  14. (setq fe (entlast))
  15. (initget 7)
  16. (setq tw (getdist "\nTRACE Width:   "))
  17. (setvar "TRACEWID" tw)
  18. (command "_.TRACE" "")
  19. (foreach p pl
  20.    (command p))
  21. (command "")
  22. (and closed
  23.       (entdel fe)
  24.       (entdel (entnext fe))
  25.       (entdel (entlast)))
  26. (redraw)
  27. (prin1))
  28. ;++++++++++++ FINDPATH +++++++++++++++++++++++++++++++++++++++++++
  29. ;;;Returns ECS Point Values Of PLINE
  30. (defun findpath (en / pl ed sp_flg cl_flg bf nl i vp bf vf pl_flg)
  31. (if (= "LWPOLYLINE" (cdr (assoc 0 (entget en))))
  32.      (command "_.CONVERTPOLY" "_Heavy" en ""))
  33. (setq ed (entget en))
  34. (setq pl_flg (cdr (assoc 70 ed)))
  35. (and (= (logand pl_flg 1) 1)
  36.       (setq cl_flg T))
  37. (and (= (logand pl_flg 4) 4)
  38.       (setq sp_flg T))
  39. (and (or (= (logand pl_flg 16) 16)
  40.           (= (logand pl_flg 64) 64))
  41.       (princ "\nInvalid POLYLINE Mesh")
  42.       (exit))
  43. (while (/= "SEQEND" (cdr (assoc 0 (entget (entnext en)))))
  44.         (setq en (entnext en)
  45.               ed (entget en)
  46.               vp (cdr (assoc 10 ed))
  47.               bf (cdr (assoc 42 ed))
  48.               vf (cdr (assoc 70 ed)))
  49.         (cond ((and (not cl_flg)
  50.                     (= "SEQEND" (cdr (assoc 0 (entget (entnext en))))))
  51.                (setq pl (cons vp pl)))
  52.               ((and (/= bf 0.0)
  53.                     (/= "SEQEND" (cdr (assoc 0 (entget (entnext en))))))
  54.                (add_arc vp (cdr (assoc 10 (entget (entnext en)))) bf))
  55.               ((and (/= bf 0.0)
  56.                     cl_flg
  57.                     (= "SEQEND" (cdr (assoc 0 (entget (entnext en))))))
  58.                (add_arc vp (last pl) bf))
  59.               ((and (= bf 1.0)
  60.                     (not cl_flg)
  61.                     (= "SEQEND" (cdr (assoc 0 (entget (entnext en))))))
  62.                (princ))
  63.               ((and sp_flg
  64.                     (= bf 0.0)
  65.                     (= (logand vf  8))
  66.                (setq pl (cons vp pl)))
  67.               ((and (not sp_flg)
  68.                     (= bf 0.0)
  69.                     (/= (logand vf  8))
  70.                (setq pl (cons vp pl)))))
  71. (if (and cl_flg
  72.           (not (equal (car pl) (last pl))))
  73.      (setq pl (cons (last pl) pl)))
  74. (setq i 0)
  75. (while (< i (length pl))
  76.         (while (equal (nth i pl) (nth (1+ i) pl) 0.0001)
  77.                (setq i (1+ i)))
  78.         (and (nth i pl)
  79.              (setq nl (cons (nth i pl) nl)))
  80.         (setq i (1+ i)))
  81.   nl)
  82. (defun add_arc (sp ep bulge / alist x1 x2 y1 y2 cotbce
  83.                ce ra sa ea ia inc qty na temp)
  84. (setq x1 (car sp);;Modified Bulge
  85.        x2 (car ep);;Conversion By
  86.        y1 (cadr sp);;Duff Kurland
  87.        y2 (cadr ep);;Autodesk, Inc.
  88.    cotbce (/ (- (/ 1.0 bulge) bulge) 2.0)
  89.        ce (list (/ (+ x1 x2 (- (* (- y2 y1) cotbce))) 2.0)
  90.                 (/ (+ y1 y2    (* (- x2 x1) cotbce) ) 2.0)
  91.                 (caddr sp))
  92.        ra (distance ce sp)
  93.        sa (atan (- y1 (cadr ce)) (- x1 (car ce)))
  94.        ea (atan (- y2 (cadr ce)) (- x2 (car ce))))
  95. (if (minusp sa)
  96.      (setq sa (+ sa (* 2.0 pi))))
  97. (if (minusp ea)
  98.      (setq ea (+ ea (* 2.0 pi))))
  99. (if (minusp bulge)
  100.      (setq temp sa sa ea ea temp))
  101. (if (> sa ea)
  102.      (setq ia (+ (- (* pi 2.0) sa) ea))
  103.      (setq ia (- ea sa)))
  104. (setq qty (abs (fix (/ ia (/ pi 16)))));;;ADJUST 16 FOR SMOOTHNESS
  105. (if (< qty 2)
  106.      (setq qty 2))
  107. (setq na sa
  108.       inc (/ (abs ia) qty))
  109. (repeat (1+ qty)
  110.      (setq alist (cons (polar ce na ra) alist)
  111.               na (+ sa inc)
  112.               sa na))
  113. (if (not (equal sp (car alist) 0.0001))
  114.      (setq alist (reverse alist)))
  115. (foreach a alist
  116.      (setq pl (cons a pl))))

 
-大卫
回复

使用道具 举报

M76

35

主题

114

帖子

87

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
174
发表于 2022-7-6 12:26:06 | 显示全部楼层
 
如果它是一条连续的线,但它不是。你的代码可以做到这一点,它并不比我已经拥有的更接近我所需要的。
124901gy82y55zcyily15y.jpg
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 12:30:38 | 显示全部楼层
 
你应该能够追踪你的线路和外部的“夹克”将产生。
回复

使用道具 举报

M76

35

主题

114

帖子

87

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
174
发表于 2022-7-6 12:34:20 | 显示全部楼层
我一个接一个地检查多段线的垂直线,例如,如果两条线在端点处相交,我必须向后追踪,这意味着要进行大量编码。此外,如果不是只有两条线相交,那么我会有一个问题。
回复

使用道具 举报

26

主题

1495

帖子

20

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
118
发表于 2022-7-6 12:39:46 | 显示全部楼层
李,
只是吹毛求疵,但CMDACTIVE具有整数位代码值
 
发件人:
 
http://academics.triton.edu/faculty/fheitzman/variable.html
 
  1. CMDACTIVE       
  2. Bit-code indicates what type of command is active:
  3. 1=ordinary command
  4. 2=ordinary and transparent command
  5. 4=script active
  6. 8=dialogue box active

 
我通常使用:
  1. (while (> (getvar "CMDACTIVE") 0) ....

 
-大卫
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-5 10:15 , Processed in 0.416823 second(s), 75 queries .

© 2020-2025 乐筑天下

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