明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
12
返回列表 发新帖
楼主: 飞的鱼儿

[提问] 求助,投影线的问题。

[复制链接]
发表于 2023-12-21 22:45 | 显示全部楼层
这个思路用lisp可以实现   只是速度可能较慢
回复

使用道具 举报

发表于 2023-12-21 22:52 | 显示全部楼层

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
回复

使用道具 举报

 楼主| 发表于 2023-12-22 08:28 | 显示全部楼层

就是这样的,不知院长能否赐予源码,
回复

使用道具 举报

 楼主| 发表于 2023-12-22 08:31 | 显示全部楼层
guosheyang 发表于 2023-12-21 22:42
让穿过拉伸面的曲线与曲面求交点  然后   连接交点成线

,多谢指点,是好办法,我还有用将线压到时一个平面
求交点的方法,看来用面线求交,更方便。这个方法可以尝试一下。
回复

使用道具 举报

 楼主| 发表于 2023-12-23 11:19 | 显示全部楼层
断断续续的花了一些时间,好歹是写出来了,用的来是线压平,找交点的办法。不高级,凑合能用,还需要完善。另外在此也感谢回贴的各位师傅。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x

评分

参与人数 1明经币 +2 收起 理由
xyp1964 + 2 赞一个!

查看全部评分

回复

使用道具 举报

发表于 2023-12-24 07:47 | 显示全部楼层
本帖最后由 Atsai 于 2023-12-24 07:48 编辑

zml84大大的一个以前分享的一个程序,
Z大当初只支援直线,版主修改一下应该可以满足。

  1. ;;网页抬头:在地形图上截断面(不完善,尚待改进)
  2. ;;2008-07-16 20:17
  3. ;;From zml84的blog
  4. ;;功能:在地形图上截断面
  5. ;;命令:dm
  6. ;;说明:
  7. (vl-load-com)
  8. (defun C:DM (/ M_OBJ1 M_ENT1 M_ENT2 M_JDTAB100)
  9.     (princ "\n请选择地形线:  ")
  10.     (setq
  11. NUMBER
  12.     (getint
  13.         " 0=样条曲线; 1=多段线;2=样条曲线和多段线<默认0>:"
  14.     )
  15.     )
  16.     (cond
  17. ((= NUMBER 0) (setq SS (ssget '((0 . "SPLINE")))))
  18. ((= NUMBER 1) (setq SS (ssget '((0 . "*POLYLINE")))))
  19. ((= NUMBER 2) (setq SS (ssget '((0 . "*POLYLINE,SPLINE")))))
  20. (t (setq SS (ssget '((0 . "SPLINE")))))
  21.     )
  22.     ;;
  23.     (if (and SS
  24.       (setq OBJ_0 (entsel "\n请选择剖面线: "))
  25.       (= (cdr (assoc 0 (entget (car OBJ_0)))) "LINE") ;_目前只支持直线段
  26. )
  27. (progn
  28.      ;;转化对象类型
  29.      (setq OBJ_0 (vlax-ename->vla-object (car OBJ_0)))

  30.      ;;获取交点
  31.      (setq LST_PT '()
  32.     I 0
  33.      )
  34.      (repeat (sslength SS)
  35.   (setq OBJ_1  (vlax-ename->vla-object (ssname SS I))
  36.         TMP    (ZL-GETINTERS OBJ_0 OBJ_1 0 "F2" NIL)
  37.         LST_PT (append TMP LST_PT)
  38.   )
  39.   (setq I (1+ I))
  40.      )
  41.      ;; 排序
  42.      ;; 点表按照xyz从小到大排序
  43.      (setq LST_PT (vl-sort LST_PT
  44.       '(lambda (P1 P2)
  45.            (< (cadr P1) (cadr P2))
  46.        )
  47.     )
  48.     LST_PT (vl-sort LST_PT
  49.       '(lambda (P1 P2)
  50.            (< (car P1) (car P2))
  51.        )
  52.     )
  53.      )
  54.      ;;绘制
  55.      (command "_.3dpoly")
  56.      (foreach PT LST_PT
  57.   (command "non" PT)
  58.      )
  59.      (command "")
  60.      ;;显示
  61.      (foreach PT LST_PT
  62.   (princ PT)
  63.      )

  64.      (princ "程序完毕")
  65. )
  66.     )
  67.     (princ)
  68. )


  69. ;;;=============================================================================


  70. ;|;;===========================================================================
  71.       通用函数                                                                ;
  72. 功能:求两个线条对象的交点                                                    ;
  73.       适用对象: Line、Circle、Arc、Ellipse、Polyline、                        ;
  74.       LWPolyline、3dPolyline、Spline                                          ;
  75. 参数:OBJ1   ----对象1                                                        ;
  76.       OBJ2   ----对象2                                                        ;
  77.       Extend ----延伸选项                                                     ;
  78.                  0  acExtendNone                                              ;
  79.                  1  acExtendThisEntity                                        ;
  80.                  2  acExtendOtherEntity                                       ;
  81.                  3  acExtendBoth                                              ;
  82.       ZZZ    ----输出选项                                                     ;
  83.                  "=0"  Z值取0                                                 ;
  84.                  "F1"  取第一个对象上的点                                     ;
  85.                  "F2"  取第二个对象上的点                                     ;
  86.                  "MAX" 取Z值大者                                              ;
  87.                  "MIN" 取Z值小者                                              ;
  88.       Fuzz   ----允许偏差值                                                   ;
  89. 返回:若成功,返回点位表;否则返回nil
  90. 日期:zml84 于2007-11-05
  91. ;;|;
  92. (vl-load-com)
  93. (defun ZL-GETINTERS (OBJ1   OBJ2   EXTEND ZZZ  FUZZ /      ENT1
  94.        ENT2   PT10   PT11   PT20  PT21 OBJ11  OBJ22
  95.        ARRAY  LST    LST_PT I  PT PT1    PT2
  96.        Z1     Z2
  97.       )
  98.     ;;0、对参数的格式化处理
  99.     (if (and (= (type EXTEND) 'INT)
  100.       (<= 0 EXTEND 3)
  101. )
  102. ()
  103. (setq EXTEND 0)
  104.     )
  105.     (setq ZZZ (strcase ZZZ))
  106.     ;;======================
  107.     ;;1、获取交点集合>>>>>>>
  108.     (if (and (= (vla-get-objectname OBJ1) "AcDbLine")
  109.       (= (vla-get-objectname OBJ2) "AcDbLine")
  110. )
  111. ;;对直线对象(line) 特别处理
  112. (progn
  113.      (setq ENT1 (entget (vlax-vla-object->ename OBJ1))
  114.     ENT2 (entget (vlax-vla-object->ename OBJ2))
  115.      )
  116.      (setq PT10 (assoc 10 ENT1)
  117.     PT11 (assoc 11 ENT1)
  118.     PT20 (assoc 10 ENT2)
  119.     PT21 (assoc 11 ENT2)
  120.      )
  121.      ;;去除Z坐标
  122.      (setq PT10 (list (cadr PT10) (caddr PT10))
  123.     PT11 (list (cadr PT11) (caddr PT11))
  124.     PT20 (list (cadr PT20) (caddr PT20))
  125.     PT21 (list (cadr PT21) (caddr PT21))
  126.      )
  127.      (setq LST (inters PT10 PT11 PT20 PT21 t))
  128.      (if LST
  129.   (setq LST (append LST '(0)))
  130.      )
  131. )
  132. (progn
  133.      ;;=====================
  134.      ;;复制实体
  135.      (setq OBJ11 (vla-copy OBJ1)
  136.     OBJ22 (vla-copy OBJ2)
  137.      )
  138.      ;;向xy平面投影,将Z坐标改为0
  139.      (TOXY OBJ11)
  140.      (TOXY OBJ22)
  141.      ;;获取交点集合
  142.      (setq ARRAY (vla-intersectwith OBJ11 OBJ22 EXTEND))
  143.      ;;删除复制后的对象
  144.      (vla-delete OBJ11)
  145.      (vla-delete OBJ22)
  146.      ;;由数组转换为表
  147.      (if (and ARRAY
  148.        (> (vlax-safearray-get-u-bound
  149.        (vlax-variant-value ARRAY)
  150.        1
  151.    )
  152.    1
  153.        )
  154.   )
  155.   (progn
  156.       (setq LST (vlax-safearray->list
  157.       (vlax-variant-value ARRAY)
  158.          )
  159.       )
  160.   )
  161.      )
  162. )
  163.     )
  164.     ;;======================
  165.     ;;2、分析整理>>>>>>>
  166.     (setq LST_PT '())
  167.     (if LST
  168. (progn
  169.      (setq I 0)
  170.      (repeat (/ (length LST) 3)
  171.   ;;2.1 获取当前点位
  172.   (setq PT (list (nth I LST)
  173.           (nth (+ 1 I) LST)
  174.           (nth (+ 2 I) LST)
  175.     )
  176.   )
  177.   ;;2.2 获取对象上对应点位
  178.   (setq PT1 (vlax-curve-getclosestpointtoprojection
  179.          OBJ1
  180.          PT
  181.          '(0 0 1)
  182.      )
  183.         PT2 (vlax-curve-getclosestpointtoprojection
  184.          OBJ2
  185.          PT
  186.          '(0 0 1)
  187.      )
  188.   )
  189.   (setq Z1 (caddr PT1)
  190.         Z2 (caddr PT2)
  191.   )

  192.   ;;2.3 效验偏差值
  193.   ;;就是说:过滤:参数中有偏差值选项,却不满足要求的点位
  194.   (if (and FUZZ
  195.     (or (= (type FUZZ) 'REAL)
  196.         (= (type FUZZ) 'INT)
  197.     )
  198.     (not (equal Z1 Z2 FUZZ))
  199.       )
  200.       ;; 空处理
  201.       ()
  202.       ;;2.4 对输出选项的处理
  203.       (progn
  204.    (cond
  205.        ((= ZZZ "F1")
  206.         (setq PT PT1)
  207.        )
  208.        ((= ZZZ "F2")
  209.         (setq PT PT2)
  210.        )
  211.        ((= ZZZ "MAX")
  212.         (if (> Z1 Z2)
  213.      (setq PT PT1)
  214.      (setq PT PT2)
  215.         )
  216.        )
  217.        ((= ZZZ "MIN")
  218.         (if (< Z1 Z2)
  219.      (setq PT PT1)
  220.      (setq PT PT2)
  221.         )
  222.        )
  223.        (t
  224.         (setq PT PT)
  225.        )
  226.    ) ;_结束cond
  227.    (if (member PT LST_PT)
  228.        ()
  229.        (setq LST_PT (cons PT LST_PT))
  230.    )
  231.       ) ;_结束progn
  232.   ) ;_结束if
  233.   (setq I (+ I 3))
  234.      ) ;_结束repeat
  235. ) ;_结束progn
  236.     ) ;_结束if
  237.     ;;3、返回结果>>>>>
  238.     LST_PT
  239. ) ;_结束defun
  240. ;;;============================================================
  241. ;;;功能:曲线实体上每个控制点的z坐标值置为0.0                 
  242. (defun TOXY (OBJ / NAME PT1 TP2)
  243.     ;;取得实体的类型名称
  244.     (setq NAME (vla-get-objectname OBJ))
  245.     (cond
  246. ;;类型1
  247. ;;直线(line)
  248. ((= NAME "AcDbLine")
  249.   ;;取得直线的起终点坐标
  250.   (setq PT1 (vlax-variant-value (vla-get-startpoint OBJ))
  251.         PT2 (vlax-variant-value (vla-get-endpoint OBJ))
  252.   )
  253.   ;;改变z值为0.0
  254.   (vlax-safearray-put-element PT1 2 0.0)
  255.   (vlax-safearray-put-element PT2 2 0.0)
  256.   (vla-put-startpoint OBJ PT1)
  257.   (vla-put-endpoint OBJ PT2)
  258. )
  259. ;;类型2
  260. ;;圆(circle)
  261. ;;圆弧(arc)
  262. ;;椭圆及椭圆弧(ellipse)
  263. ((or (= NAME "AcDbCircle")
  264.       (= NAME "AcDbArc")
  265.       (= NAME "AcDbEllipse")
  266.   )
  267.   ;;取得中心点座标
  268.   (setq PT1 (vlax-variant-value (vla-get-center OBJ)))
  269.   ;;改变中心点座标z值为0.0
  270.   (vlax-safearray-put-element PT1 2 0.0)
  271.   (vla-put-center OBJ PT1)
  272. )
  273. ;;类型3
  274. ;;多段线(polyline、lwpolyline)
  275. ;;拟合的2维多段线(polyline、lwpolyline)
  276. ((or (= NAME "AcDbPolyline")
  277.       (= NAME "AcDb2dPolyline")
  278.   )
  279.   ;;改变标高值为0.0
  280.   (vla-put-elevation OBJ 0.0)
  281. )
  282. ;;类型4
  283. ;;三维多段线(3dpolyline)
  284. ((= NAME "AcDb3dPolyline")
  285.   ;;取得3维多段线的控制点
  286.   (setq PT1 (vlax-variant-value (vla-get-coordinates OBJ))
  287.         I   0
  288.   )
  289.   (repeat (/ (length (vlax-safearray->list PT1)) 3)
  290.       (vlax-safearray-put-element PT1 (+ I 2) 0.0)
  291.       (setq I (+ I 3))
  292.   )
  293.   (vla-put-coordinates OBJ PT1)
  294. )
  295. ;;类型5
  296. ;;样条曲线(Spline)
  297. ((= NAME "AcDbSpline")
  298.   ;;取得样条曲线的拟合点
  299.   ;;改变每个拟合点的z值为0.0
  300.   (setq PT1 (vlax-variant-value (vla-get-fitpoints OBJ))
  301.         I   0
  302.   )
  303.   (repeat (vla-get-numberoffitpoints OBJ)
  304.       (vlax-safearray-put-element PT1 (+ I 2) 0.0)
  305.       (setq I (+ I 3))
  306.   )
  307.   (vla-put-fitpoints OBJ PT1)
  308.   ;;取得样条曲线的控制点
  309.   ;;改变每个控制点的z值为0.0
  310.   (setq
  311.       PT2 (vlax-variant-value (vla-get-controlpoints OBJ))
  312.       I  0
  313.   )
  314.   (repeat (vla-get-numberofcontrolpoints OBJ)
  315.       (vlax-safearray-put-element PT2 (+ I 2) 0.0)
  316.       (setq I (+ I 3))
  317.   )
  318.   (vla-put-controlpoints OBJ PT2)
  319. )
  320. (t NIL)
  321.     )
  322. ) ;_结束defun
回复

使用道具 举报

 楼主| 发表于 2023-12-24 19:09 | 显示全部楼层
Atsai 发表于 2023-12-24 07:47
zml84大大的一个以前分享的一个程序,
Z大当初只支援直线,版主修改一下应该可以满足。

研究一下,谢谢
回复

使用道具 举报

发表于 2023-12-26 21:28 | 显示全部楼层

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
回复

使用道具 举报

 楼主| 发表于 2023-12-31 14:29 | 显示全部楼层

有点意思,点的排序也能正确生成了。
这个可以玩一个下午,


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
回复

使用道具 举报

 楼主| 发表于 2024-4-15 09:53 | 显示全部楼层
自已可以收回明经币吗
回复

使用道具 举报

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

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-5-3 09:38 , Processed in 0.315753 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表