乐筑天下

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

[编程交流] 投影曲线墙的例程

[复制链接]

30

主题

96

帖子

66

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
150
发表于 2022-7-6 08:56:09 | 显示全部楼层 |阅读模式
大家好,
我一直在尝试编写一个例程,根据用户输入的段数,将曲线墙投影到立面。
到目前为止,我可以找出如何根据线段的数量沿圆弧获取点。现在,我想将其投影到选定的行,如图所示。现在,该代码将辐射线绘制到弧上的点。
我被困在这里了。现在我不知道如何从这些点画垂直于直线的线。事实上,我不知道如何计算这些线的投影角度。
在图片中,它们很简单,线条可以投影到270度的角度。但是弧线顶部的线是什么;或者以10度角在弧的右侧?这就是我被卡住的地方,有人能引导我找出每个P2的线的投影角度(沿弧的点)?这是我的代码。。。
 
  1. (defun c:crv ( / entarc entline)
  2.    (while (and (setq entarc (car (entsel "\nPick An Arc: ")))
  3.         (not (eq "ARC" (cdr (assoc 0 (entget entarc)))))
  4.    )
  5.    (princ "\nPlease Select an Arc...")
  6.    )
  7.    (while
  8.      (and
  9. (setq entline (car (entsel "\nPick a line to project on:")))
  10. (not (eq "LINE" (cdr (assoc 0 (entget entline)))))
  11.      );and
  12.      (princ "\nPlease select a line....")
  13.    );While
  14. (setq Segments (cond ((getint "\nNumber of Segments:")) (10)))
  15. (setq Height (getdist "\nCut-off Height:"))
  16. (projectlines entarc entline)
  17. (princ)
  18. );Function
  19. ;;;****************************************************
  20. ;;;This is the function which draws the projected lines
  21. ;;;****************************************************
  22. (defun projectlines (ArcObj LineObj
  23.              / ArcCenter ArcStartAngle ArcEndAngle
  24.              ArcRadius ArcStartPoint ArcEndPoint)
  25. (setq ArcCenter (cdr ( assoc 10 (entget ArcObj))))
  26. (setq ArcStartAngle (cdr ( assoc 50 (entget ArcObj))))
  27. (setq ArcEndAngle (cdr ( assoc 51 (entget ArcObj))))
  28. (setq ArcRadius  (cdr ( assoc 40 (entget ArcObj))))
  29. (setq ArcStartPoint (polar ArcCenter ArcStartAngle ArcRadius))
  30. (setq ArcEndPoint (polar ArcCenter ArcEndAngle ArcRadius))
  31. (setq ArcAngle (abs (- ArcStartAngle ArcEndAngle)))
  32. (setq LineStartPoint (cdr (assoc 10 (entget LineObj))))
  33. (setq LineEndtPoint (cdr (assoc 11 (entget LineObj))))
  34. (setq LineAngle (angle LineStartPoint LineEndtPoint))
  35. (setq LinePerpendicular (+ LineAngle (dtor 90)))
  36. (setq i 1)
  37. (setq p2 ArcStartPoint)
  38. (setq AngleDivision (/ ArcAngle Segments))
  39. (setq OSM (getvar "OSMODE"))
  40. (setvar "OSMODE" 0)
  41. (repeat (1+ Segments)
  42.    (command "_LINE" ArcCenter p2 "")
  43.    (setq p2 (polar ArcCenter (+ ArcStartAngle (* AngleDivision i)) ArcRadius))
  44.    (setq i (1+ i))
  45. )
  46. (setvar "OSMODE" OSM)
  47. );Function
  48. (defun dtor(d)
  49. (* d 0.01745329)
  50. )

095613f59ytm59wwjjttmn.jpg
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-6 09:02:21 | 显示全部楼层
如果它只有一个标高,那么只需使用厚度,就可以对直线、圆弧等进行此操作
回复

使用道具 举报

30

主题

96

帖子

66

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
150
发表于 2022-7-6 09:09:22 | 显示全部楼层
感谢您的回复BIGAL,
但它根本不是一幅3D图。只是一个平面2D图。
问题是,它还需要旋转视图/ucs以显示该厚度。
在我的例子中,平面和立面必须放置在同一平面上。
回复

使用道具 举报

11

主题

968

帖子

919

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
99
发表于 2022-7-6 09:17:47 | 显示全部楼层
像这样的?
  1. (vl-load-com)
  2. (defun c:ProjectCurve (/ crv l1 l2 div pt1 pt2 pt3 n l1s l1e ang l2s l2e)
  3. (if (and (setq crv (entsel "\nPick curve: "))
  4.           (setq crv (car crv))
  5.           (setq l1 (entsel "\nPick furthest projection line: "))
  6.           (setq l1 (entget (car l1)))
  7.           (setq l1s (cdr (assoc 10 l1)))
  8.           (setq l1e (cdr (assoc 11 l1)))
  9.           (setq ang (+ (angle l1s l1e) (/ pi 2.0)))
  10.           (setq l2 (entsel "\nPick nearest projection line: "))
  11.           (setq l2 (entget (car l2)))
  12.           (setq l2s (cdr (assoc 10 l2)))
  13.           (setq l2e (cdr (assoc 11 l2)))
  14.           (setq div (getdist "\nSelect maximum curvature arc length per projection line: "))
  15.      )
  16.    (progn
  17.      (setq n   (vlax-curve-getDistAtParam crv (vlax-curve-getEndParam crv))
  18.            div (/ n (1+ (fix (/ n div))))
  19.      )
  20.      (while (> n 0.0)
  21.        (setq pt1 (vlax-curve-getPointAtDist crv n)
  22.              pt2 (inters l1s l1e pt1 (polar pt1 ang 1000.0) nil)
  23.              pt3 (inters l2s l2e pt1 (polar pt1 ang 1000.0) nil)
  24.        )
  25.        (entmake (list '(0 . "LINE")
  26.                       (cons 8 (getvar 'CLayer))
  27.                       (cons 410 (getvar 'CTab))
  28.                       (cons 10 pt2)
  29.                       (cons 11 pt3)
  30.                 )
  31.        )
  32.        (setq n (- n div))
  33.      )
  34.    )
  35. )
  36. (princ)
  37. )
没有足够的错误检查,但至少它可以工作。即使“工作”在pl弧上,但对于那些应该有一些不同的编程,使其在段端点上也工作。
回复

使用道具 举报

30

主题

96

帖子

66

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
150
发表于 2022-7-6 09:20:14 | 显示全部楼层
哇!太好了。。。!!!非常感谢您的代码,IRNEB…!!:D: D:D
回复

使用道具 举报

11

主题

968

帖子

919

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
99
发表于 2022-7-6 09:30:01 | 显示全部楼层
不客气。我不确定您是否希望按指定的数字进行除法,或者更确切地说,根据我的代码(最大源距离)。这将是一个小的变化,要求用户输入分割的数量,实际上,数学也会简单一点。
回复

使用道具 举报

30

主题

96

帖子

66

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
150
发表于 2022-7-6 09:35:24 | 显示全部楼层
好那会有用的。。。
我要了1公斤铁,得到了1公斤金。。。!!!他他。。
为什么,因为我的代码只适用于圆弧对象。这对任何事情都有效。。。!!!
谢谢
回复

使用道具 举报

30

主题

96

帖子

66

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
150
发表于 2022-7-6 09:38:15 | 显示全部楼层
我还从你的代码中学到了很多新东西。。。!!!快乐快乐。。。。
回复

使用道具 举报

11

主题

968

帖子

919

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
99
发表于 2022-7-6 09:45:40 | 显示全部楼层
是的!很高兴帮助你学习。这是我学到我所知道的大部分东西的方式:例子&从那里为自己做。 
主要是vlax曲线函数使我的代码比其他函数容易得多。然后通常获得一个角度,旋转半个pi(90度),然后使用inters&polar获得交点。最后一部分也允许投影处于任何角度,它垂直于最远的投影平面投影。所以你的两个平面甚至可能是不平行的,在任何角度。
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

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

铜币
358
发表于 2022-7-6 09:51:04 | 显示全部楼层
有更多额外的保险代码将更有利于国家安全。
 
  1. (eq (cdr (assoc 0 (entget crv))) "ARC")
  2. (eq (cdr (assoc 0 l1)) "LINE")
  3. (eq (cdr (assoc 0 l2)) "LINE")
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-7 06:12 , Processed in 0.444098 second(s), 75 queries .

© 2020-2025 乐筑天下

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