乐筑天下

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

[编程交流] 在中间距离画线

[复制链接]

63

主题

242

帖子

181

银币

后起之秀

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

铜币
319
发表于 2022-7-5 17:28:00 | 显示全部楼层 |阅读模式
大家好,新年快乐
我的请求是autolisp routin,它可以从两条现有直线创建一条直线,可以平行也可以不平行,并且该直线的每个点与两条直线的距离相同
谢谢
回复

使用道具 举报

0

主题

9

帖子

11

银币

限制会员

铜币
-1
发表于 2022-7-5 17:32:14 | 显示全部楼层
这没有错误检查,但这是一个开始

 
  1. (defun c:test ( / activedocument ename1 ename2 iacadapplication modelspace mp1 mp2 object1 object2)
  2. (setq IAcadApplication (vlax-get-acad-object)
  3.       ActiveDocument (vla-get-ActiveDocument IAcadApplication)
  4.       ModelSpace (vla-get-ModelSpace ActiveDocument)
  5.       EName1 (car (entsel "\nSelect the first line: "))
  6.       EName2 (car (entsel "\nSelect the Second line: "))
  7.       object1 (vlax-ename->vla-object EName1)
  8.       object2 (vlax-ename->vla-object EName2)
  9.       mp  (lambda (p1 p2) (mapcar (function(lambda(a b)(/(+ a b 0.0) 2.0))) p1 p2))
  10.       mp1 (mp (vlax-get object1 'StartPoint) (vlax-get object1 'EndPoint))
  11.       mp2 (mp (vlax-get object2 'StartPoint) (vlax-get object2 'EndPoint))
  12. )
  13. (vla-AddLine ModelSpace (vlax-3d-point mp1) (vlax-3d-point mp2))
  14. (princ)
  15. )
回复

使用道具 举报

1

主题

1069

帖子

1050

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
69
发表于 2022-7-5 17:36:37 | 显示全部楼层
这是我的两分钱
 
  1. (defun C:MLL (/             *error*           acsp          adoc         dlt1        dlt2   ep1
  2.       ep2    flag   int1   int2          ip        line1         line2        nxp    ocirc
  3.       p1     p2            rad           sp1          sp2         ss        tmp    x
  4.       xline1
  5.      )
  6. (if (< (atoi (substr (getvar "acadver") 1 2)) 15)
  7.    (progn
  8.      (alert
  9. "Programm wiil be works in\n
  10. AutoCAD 2000 and higher versions"
  11.      )
  12.      (exit)
  13.      (princ)
  14.    )
  15. )
  16. (or (vl-load-com))
  17. ;=====================================;
  18. (defun *error* (msg)
  19.    (princ msg)
  20.    (vla-endundomark
  21.      (vla-get-activedocument
  22. (vlax-get-acad-object)
  23.      )
  24.    )
  25.    (princ)
  26. )
  27. (defun midpoint (p1 p2)
  28.    (mapcar (function (lambda (a b)
  29.                 (* (+ a b) 0.5)
  30.               )
  31.     )
  32.     p1
  33.     p2
  34.    )
  35. )
  36. ;=====================================;
  37. (defun group-by-num (lst num / ls ret)
  38.    (if        (= (rem (length lst) num) 0)
  39.      (progn
  40. (setq ls nil)
  41. (repeat        (/ (length lst) num)
  42.   (repeat num
  43.     (setq ls
  44.               (cons (car lst) ls)
  45.           lst (cdr lst)
  46.     )
  47.   )
  48.   (setq        ret (append ret (list (reverse ls)))
  49.         ls  nil
  50.   )
  51. )
  52.      )
  53.    )
  54.    ret
  55. )
  56. ;=====================================;
  57. (or adoc
  58.      (setq adoc (vla-get-activedocument
  59.            (vlax-get-acad-object)
  60.          )
  61.      )
  62. )
  63. (or acsp
  64.      (setq acsp (if (= (getvar "CVPORT") 1)
  65.            (vla-get-paperspace
  66.              adoc
  67.            )
  68.            (vla-get-modelspace
  69.              adoc
  70.            )
  71.          )
  72.      )
  73. )
  74. (vla-endundomark
  75.    adoc
  76. )
  77. (vla-startundomark
  78.    adoc
  79. )
  80. (setq ss (ssget (list (cons 0 "LINE"))))
  81. (if (/= (sslength ss) 2)
  82.    (progn
  83.      (alert "Must be selected 2 lines only")
  84.      (exit)
  85.      (princ)
  86.    )
  87. )
  88. (setq        line1 (vlax-ename->vla-object (ssname ss 0))
  89. line2 (vlax-ename->vla-object (ssname ss 1))
  90. sp1   (vlax-get line1 'StartPoint)
  91. ep1   (vlax-get line1 'EndPoint)
  92. sp2   (vlax-get line2 'StartPoint)
  93. ep2   (vlax-get line2 'EndPoint)
  94. dlt1  (vlax-get line1 'Angle)
  95. dlt2  (vlax-get line2 'Angle)
  96. )
  97. (if (or (equal dlt1 dlt2 1e-08)
  98.   (equal dlt1 (+ pi dlt2) 1e-08)
  99.      )        ;parallel lines
  100.    (setq flag t)
  101.    (setq flag nil)
  102. )
  103. (if flag
  104.    (progn
  105.      (if
  106. (< (distance sp1 sp2) (distance sp1 ep2))
  107. (progn
  108.    (setq p1 (midpoint sp1 sp2)
  109.          p2 (midpoint ep1 ep2)
  110.    )
  111. )
  112. (progn
  113.    (setq p1 (midpoint sp1 ep2)
  114.          p2 (midpoint ep1 sp2)
  115.    )
  116. )
  117.      )
  118.      (setq xline1 (vlax-invoke acsp 'AddXline p1 p2))
  119.    )
  120.    (progn
  121.      (setq tmp (vlax-invoke line1 'Intersectwith line2 acextendboth))
  122.      (setq rad        (distance tmp
  123.                   (setq        p1
  124.                          (car (vl-sort
  125.                                 (list sp1 sp2 ep1 ep2)
  126.                                 (function (lambda (a b)
  127.                                             (< (distance tmp a) (distance tmp b))
  128.                                           )
  129.                                 )
  130.                               )
  131.                          )
  132.                   )
  133.         )
  134.      )
  135.      (if (vl-some (function (lambda (a)
  136.                        (equal tmp a 1e-08)
  137.                      )
  138.            )
  139.            (list sp1 sp2 ep1 ep2)
  140.   )
  141. (setq rad 0.001)
  142.      )
  143.      (setq ocirc (vlax-invoke acsp 'AddCircle tmp rad))
  144.      (setq int1 (group-by-num
  145.            (vlax-invoke ocirc 'Intersectwith line1 acextendnone)
  146.            3
  147.          )
  148.     int2 (group-by-num
  149.            (vlax-invoke ocirc 'Intersectwith line2 acextendnone)
  150.            3
  151.          )
  152.      )
  153.      (setq
  154. nxp (vl-remove-if (function not)(vl-sort (append int1 int2)
  155.              (function (lambda (a b)
  156.                          (< (distance sp1 a) (distance sp1 b))
  157.                        )
  158.              )
  159.     )
  160.       )
  161. )
  162.      (if (= (length nxp) 1)
  163. (progn
  164.   (if int1
  165.     (setq ip (polar tmp (angle tmp (vlax-get line2 'StartPoint))
  166.                   (distance tmp int1)))
  167.   (setq ip (polar tmp (angle tmp (vlax-get line1 'StartPoint))
  168.                   (distance tmp int2)))
  169.     )
  170.   (setq p2 (midpoint (car nxp) ip))
  171.   )
  172.      (setq p2 (midpoint (car nxp) (cadr nxp)))
  173. )
  174.      (setq xline1 (vlax-invoke acsp 'AddXline tmp p2))
  175.    )
  176. )
  177. (mapcar (function (lambda (x)
  178.               (vl-catch-all-apply
  179.                 (function (lambda ()
  180.                             (progn
  181.                               (vla-delete ocirc)
  182.                               (vlax-release-object x)
  183.                             )
  184.                           )
  185.                 )
  186.               )
  187.             )
  188.   )
  189.   (list line1 line2 ocirc xline1)
  190. )
  191. (*error* nil)
  192. (princ)
  193. )

 
~'J'~
回复

使用道具 举报

0

主题

9

帖子

11

银币

限制会员

铜币
-1
发表于 2022-7-5 17:39:29 | 显示全部楼层
美好的
只是想一想,您可能需要检查选择集(ss)的长度,以验证确实有两行
回复

使用道具 举报

1

主题

1069

帖子

1050

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
69
发表于 2022-7-5 17:42:06 | 显示全部楼层
 
我同意你的意见
很好的观点
 
~'J'~
回复

使用道具 举报

10

主题

973

帖子

909

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
118
发表于 2022-7-5 17:46:31 | 显示全部楼层
当两个原始长度不同时,求端点平均值以生成等距线的方法会产生奇数结果。尤其是当它们相交时(见下文)。平分线可能(也可能不是)是OP要求的。
 
我不懂Lisp,所以我的贡献是VBA。与通常的演示例程一样,存在有限的错误检查。此外,这也不能容纳平行线。
 
  1. Sub BisectorLine()
  2. Dim entTemp As AcadEntity
  3. Dim entLine1 As AcadLine
  4. Dim entLine2 As AcadLine
  5. Dim entCircle As AcadCircle
  6. Dim entBisector As AcadXline
  7. Dim varTempPoint As Variant
  8. Dim varTempPoint2 As Variant
  9. Dim arrDblPT(2) As Double
  10.   ThisDrawing.Utility.GetEntity entTemp, varTempPoint, "Select first line: "
  11.   If Not entTemp.ObjectName = "AcDbLine" Then Exit Sub
  12.   Set entLine1 = entTemp.Copy
  13.   ThisDrawing.Utility.GetEntity entTemp, varTempPoint, "Select second line: "
  14.   If Not entTemp.ObjectName = "AcDbLine" Then Exit Sub
  15.   Set entLine2 = entTemp.Copy
  16.   varTempPoint = entLine1.IntersectWith(entLine2, acExtendBoth)
  17.   entLine1.StartPoint = varTempPoint
  18.   entLine2.StartPoint = varTempPoint
  19.   Set entCircle = ThisDrawing.ModelSpace.AddCircle(varTempPoint, 1) 'this demo for limited scale modelspace only
  20.   varTempPoint = entCircle.IntersectWith(entLine1, acExtendNone)
  21.   varTempPoint2 = entCircle.IntersectWith(entLine2, acExtendNone)
  22.   arrDblPT(0) = (varTempPoint(0) + varTempPoint2(0)) / 2
  23.   arrDblPT(1) = (varTempPoint(1) + varTempPoint2(1)) / 2
  24.   arrDblPT(2) = 0 'this demo for WCS only
  25.   Set entBisector = ThisDrawing.ModelSpace.AddXline(entCircle.Center, arrDblPT)
  26.   entLine1.Delete
  27.   entLine2.Delete
  28.   entCircle.Delete
  29.   Set entLine1 = Nothing
  30.   Set entLine2 = Nothing
  31.   Set entCircle = Nothing
  32.   Set entBisector = Nothing
  33. End Sub

182802dc45jsqeakkrjtfj.jpg
回复

使用道具 举报

63

主题

242

帖子

181

银币

后起之秀

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

铜币
319
发表于 2022-7-5 17:47:18 | 显示全部楼层
谢谢你,我的目标是得到2条线的中心线
我试着在直线平行的情况下进行布线,但如果不平行,结果就不好,因为如果我们取结果线的一个点,测量到两条线的椭圆距离,它给出了不同的测量值,所以我认为我们必须将平分线排序为SEANT说抱歉,我无法理解vb
谢谢
回复

使用道具 举报

0

主题

9

帖子

11

银币

限制会员

铜币
-1
发表于 2022-7-5 17:50:59 | 显示全部楼层
你试过我的吗?
谢谢
 
编辑:哎呀,对不起,我认为我没有正确理解这个问题
 
回复

使用道具 举报

63

主题

242

帖子

181

银币

后起之秀

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

铜币
319
发表于 2022-7-5 17:53:27 | 显示全部楼层
谢谢Danielm103,我试了一下你的路线,但它不起作用,因为我想它画一条从第一条线的中点到第二条线的中点的线。我的要求是找到一条线,从它的每一点到这两条线的距离相等
谢谢你的努力,等待回应
回复

使用道具 举报

10

主题

973

帖子

909

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
118
发表于 2022-7-5 17:57:52 | 显示全部楼层
对不起,我帮不了你做Lisp程序的练习。
 
但是,普通autocad提供了一个自动化程度不高的过程。
182805hidvhpccveiaavvv.jpg
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-13 04:13 , Processed in 0.518883 second(s), 74 queries .

© 2020-2025 乐筑天下

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