明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: 自贡黄明儒

[讨论] 关于多段线

    [复制链接]
发表于 2013-11-21 19:47:13 | 显示全部楼层
不错的程序  学习了
发表于 2013-11-22 23:43:32 | 显示全部楼层
都是高手啊
发表于 2013-11-23 01:16:52 | 显示全部楼层
老黄把这些也弄出来
a.线是否自相交
b.虚交点自动加点
第一个我弄了最终没弄出来
第二个我弄了但不适合二维多线段,郁闷死了

最后建议所有功能可以适合所有(cons 0 "*polyline")

点评

问题A,依次取三个点,判断是否都是逆时针;问题B,什么意思呢?  发表于 2013-11-23 08:02
 楼主| 发表于 2013-11-23 09:05:37 | 显示全部楼层
本帖最后由 自贡黄明儒 于 2013-11-23 11:12 编辑
llsheng_73 发表于 2013-11-23 01:16
老黄把这些也弄出来
a.线是否自相交
b.虚交点自动加点


;;多段自相交(相交返回T),封闭也为自相交
;;(LPintersSelf (car (entsel)))
(defun LPintersSelf (en / ENT LEN1 LEN2 OBJ PTS)
  (setq ent (entget en))
  (setq pts (vl-remove-if-not '(lambda (x) (= (car x) 10)) ent))
  (setq Len1 (- (length (mapcar 'cdr pts)) 2))
  (setq obj (vlax-ename->vla-object en))
  (setq pts (vla-intersectwith obj obj 0))
  (setq Len2 (vlax-safearray->list (vlax-variant-value pts)))
  (setq len2 (/ (length len2) 3))
  (not(equal len1 len2))
)

  1. ;; (plinsp e) = 判断Pline自相交 ---by-- 狂刀 .2005.9
  2. ;; (plinsp (car(entsel)))
  3. (defun plinsp (e / pts)
  4.   (setq o (vlax-ename->vla-object e))
  5.   (setq pts (vlax-invoke o 'intersectwith o 0))
  6.   (< (vlax-curve-getendparam e)
  7.      (+ 1 (vlax-get o 'closed) (/ (length pts) 3))
  8.   )
  9. )
发表于 2013-11-23 12:18:33 | 显示全部楼层
本帖最后由 llsheng_73 于 2013-11-23 13:27 编辑
自贡黄明儒 发表于 2013-11-23 09:05
;;多段自相交(相交返回T),封闭也为自相交
;;(LPintersSelf (car (entsel)))
(defun LPintersSelf (en ...


虚交点就是当多线段A被延长到多线段B内部的时候,产生的那个交点P通常对于B来说就是一个虚交点,换句话说就是有公共边但没有公共点或者公共点个数不够
这个点有没有对B没有任何影响。但有这个点更容易保证两个相邻多线段不互相交叉或者产生细微裂缝
发表于 2013-11-23 13:26:19 | 显示全部楼层
自贡黄明儒 发表于 2013-11-23 09:05
;;多段自相交(相交返回T),封闭也为自相交
;;(LPintersSelf (car (entsel)))
(defun LPintersSelf (en ...

十分感谢老黄,不过测试了一下狂刀的,代码精简那是没法比,但是对于相交于一条边上的时候会判断为非自交,跟我最终失败的结果一个样子。
发表于 2013-11-23 13:29:23 | 显示全部楼层
学习 了。  黄大侠,
发表于 2013-11-23 13:50:51 | 显示全部楼层
支持总结 开源
发表于 2013-11-23 14:05:19 | 显示全部楼层
必须支持一个
 楼主| 发表于 2013-11-23 14:12:25 | 显示全部楼层
本帖最后由 自贡黄明儒 于 2013-11-23 15:27 编辑
llsheng_73 发表于 2013-11-23 13:26
十分感谢老黄,不过测试了一下狂刀的,代码精简那是没法比,但是对于相交于一条边上的时候会判断为非自交 ...


你的意思狂刀的也有bug?想怎么做呢?是不是上面说的B

  1. ;;[功能] 多段线自相交
  2. ;; (plinsp (car(entsel)))
  3. (defun plinsp (en / FLAG LAPT N O PTS PTS1 STPT)
  4.   ;;52.1 [功能] 3D点->2D点 By Caoyin
  5.   (defun 3d->2d (3dpt)
  6.     (mapcar '+ 3dpt '(0. 0.))
  7.   )
  8.   ;;52.4 [功能] 3D点列表->2D点列表
  9.   (defun 3dlist->2dlist (3dplist)
  10.     (mapcar '3d->2d 3dplist)
  11.   )
  12.   ;;52.5 [功能] 对表分段
  13.   ;;(xl_div lst nom)表分段. -> 返回 分段的表.   ------by 无痕.2004.1
  14.   ;; lst = 表,nom = 分段的子表元素个数(从1开始计).
  15.   ;;示例 (xl_div '(1 2 3 4 5 6 7 8 9) 3) -> ((1 2 3) (4 5 6) (7 8 9))
  16.   (defun xl-div (lst x / lst2)
  17.     (foreach n lst
  18.       (if (and lst2 (/= x (length (car lst2))))
  19. (setq lst2 (cons (append (car lst2) (list n)) (cdr lst2)))
  20. (setq lst2 (cons (list n) lst2))
  21.       )
  22.     )
  23.     (reverse lst2)
  24.   )
  25.   ;;164.3 [功能] 多段线端点列表
  26.   ;;示例(HH:PtLists (car (entsel)))
  27.   (defun HH:PtLists (en)
  28.     (mapcar 'cdr
  29.      (vl-remove-if-not '(lambda (x) (= (car x) 10)) (entget en))
  30.     )
  31.   )
  32.   ;;
  33.   ;;(setq en (car (entsel)))
  34.   (setq o (vlax-ename->vla-object en))
  35.   (setq n (vlax-get o 'closed))
  36.   (cond ((equal n 0)
  37.   (setq laPt (vlax-curve-getEndPoint en))
  38.   (setq stPt (vlax-curve-getStartPoint en))
  39.   (setq pts (vlax-invoke o 'intersectwith o 0))
  40.   (setq pts (3dlist->2dlist (xl-div pts 3)))
  41.   (SETQ PTS1 (HH:PtLists EN))
  42.   (foreach i pts
  43.     (if (member i PTS1)
  44.       (setq flag T)
  45.     )
  46.   )
  47.   (or
  48.     flag
  49.     (/= (vlax-curve-getParamAtPoint en laPt)
  50.         (vlax-curve-getendparam en)
  51.     )
  52.     (/= (vlax-curve-getParamAtPoint en stPt)
  53.         (vlax-curve-getstartparam en)
  54.     )
  55.     (< (vlax-curve-getendparam en)
  56.        (+ 1 (/ (length pts) 3))
  57.     )   
  58.   )
  59. )
  60. (T nil)
  61.   )
  62. )

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

本版积分规则

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

GMT+8, 2024-11-6 05:06 , Processed in 0.162798 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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