明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
12
返回列表 发新帖
楼主: LIHUISHUAN

[求助]求通过图形中一点的线的最小距离的平行线

  [复制链接]
发表于 2003-9-26 16:49:00 | 显示全部楼层
((or (= (strcase _TYPE) "LWPOLYLINE")
         (= (strcase _TYPE) "OLYLINE")
     )
     (angle (cdr (assoc 10 ENT)) (cdr (assoc 10 (reverse ENT))))
    )


polyline的结构没有两个10吧!



;;只处理xline,line
(defun NEAR (/ DIST DIST1 TT1 CURVE-OBJ PT SS1 SS2 N NN MI HOLDOSMODE)
  (vl-load-com)
  (setq HOLDOSMODE (getvar "OSMODE"))
  (setvar "OSMODE" 32)
  (setq PT (getpoint "\n选线交点: "))
  (setvar "OSMODE" HOLDOSMODE)
  (setq SS1 (ssget "c" PT PT '((0 . "XLINE,LINE"))))
  (setq SS2 (ssget "x" '((0 . "XLINE,LINE"))))
  (setq        N     0
        DIST1 100000000
  )
  (repeat (sslength SS1)
    (setq TT1 (TT SS2 (ssname SS1 N)))
    (setq NN 0)
    (repeat (sslength TT1)
      (setq CURVE-OBJ (vlax-ename->vla-object (ssname TT1 NN)))
      (setq DIST
             (distance PT (vlax-curve-getclosestpointto CURVE-OBJ PT t))
      )
      (if (and (> DIST 0) (< DIST DIST1))
        (setq DIST1 DIST
              MI    (list (ssname SS1 N) (ssname TT1 NN))
        )
      )
      (setq NN (1+ NN))
    )
    (setq N (1+ N))
  )
  MI
)

(defun DXF (CODE ENT)
  (cdr (assoc CODE (entget ENT)))
)

(defun TT (SS ENT / ANG1 ANG2 ANGSS ANGS1 SSS N)
  (if (= "LINE" (DXF 0 ENT))
    (setq ANG1 (angle (DXF 10 ENT) (DXF 11 ENT)))
    (setq ANG1 (angle '(0 0) (DXF 11 ENT)))
  )
  (setq ANG2 (+ ANG1 pi))
  (setq        SSS (ssadd)
        N   0
  )
  (repeat (sslength SS)
    (if        (= "LINE" (DXF 0 (ssname SS N)))
      (setq ANGSS (angle (DXF 10 (ssname SS N)) (DXF 11 (ssname SS N))))
      (setq ANGSS (angle '(0 0) (DXF 11 (ssname SS N))))
    )
    (setq ANGSS1 (+ ANGSS pi))
    (if        (or (equal ANG1 ANGSS 0.00001)
            (equal ANG1 ANGSS1 0.00001)
            (equal ANG2 ANGSS 0.00001)
            (equal ANG2 ANGSS1 0.00001)
        )
      (if (not (equal ENT (ssname SS N)))
        (ssadd (ssname SS N) SSS)
      )
    )
    (setq N (1+ N))
  )
  SSS
)
 楼主| 发表于 2003-9-26 17:00:00 | 显示全部楼层
谢谢龙兄,龙兄又教了我两招,不过把polyline,lwpolyline,mline都滤掉了,可否再完善一下,再次谢谢您!
发表于 2003-9-26 17:38:00 | 显示全部楼层
用这个pline真的是麻烦多了,我做的一大串,只能判断是否和一边平行,如果有重合却不可判断。
龙兄写个好点的方法上来吧
发表于 2003-9-26 21:06:00 | 显示全部楼层
又重新写了一个,再帮我看看。
关于PLINE平行我的意思是:如果经过点选中的是PLINE,那么与这个PLINE任何一段平行的其他直线都会被选中,且距离只直线到

PLINE这段的距离。
如果PLINE是被选中的,也就是不经过点的PLINE有一段与经过点的某直线平行,这个PLINE就会被选中,返回的情况与前面相同。
最后的返回结果是:
假设经过点的对象为ent1 ent2 ... ,与其平行的对象为ent1_1 ent1_2, ent2_1 ent2_2...
则返回
((ent1 (ent1_1 距离1) (ent1_2 距离2)...) (ent2 (ent2_1 距离1) (ent2_2 距离2)...)...)
这些对象都是按照距离排序的。
如果对PLINE的平行的意思需要改变的话,仅需修改getparts函数,参数为对象名,让其返回每一段的起点和终点的坐标列表。
((起点1 终点1) (起点2 终点2) ...)
需要谁参与判断,仅须返回此段点列表即可,即使只有一段(LINE,XLINE都被看作只有一段的情况),也需要
((起点1 终点1))而不能(起点1 终点1).

这样处理之后,所有类型都一同考虑了,只需循环判断是否平行。当然,如果是LINE或者是XLINE就只循环一次了。

看看我这样有没有什么问题,我自己调试了一些图形,都返回正确了。一高兴,先拿上来了,没调试太多情况。
主函数:getline

本帖子中包含更多资源

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

x
 楼主| 发表于 2003-9-27 09:33:00 | 显示全部楼层
to mefiying:

   飞兄的程序真棒!问题解决了!谢谢!关于公差标注,他不单是程序的问题,还涉及到标准偏差表,整起来比较费劲,有没有现成的好用程序?拿出来共享一下。

   其实,这种程序很多,人家费劲编好了,就想保护起来挣点钱,其实单凭这点东西也挣不到什么钱,中国cad二次开发的公司很多,但都各占各的小山头,重复的编一些基础
的东西,没一个能成气候,为啥?主要就是缺乏共享的精神!

  如果大家都把自己的东西拿出来,共同完善,那么无论在开发的深度还是广度上都会大大提高,不至于只是停留在基础的表层的东西上。记得西北工大有一个香格里拉工作室,他编的图板总共只有几兆,却cad的功能基本都有,还很好用,只是不带二次开发支持,再就是自创图形格式,舍不得把自己格式与cad,solidworks,ug等的图形格式交换文件
拿出来共享一下,这样,知识产权倒是保护得很好,但终究也没见成什么气候!

  我就这个例子说明什么? 中国人相当聪明,人才济济,但都各自为战,一盘散沙,怎么与人家竞争?!只有群策群力,共同提高,大家才有出路。

  以上纯属个人见解,愿与各位同人与版主商榷!
发表于 2003-9-27 10:06:00 | 显示全部楼层
我的东西都是共享的,不过就没什么好东西,呵呵。
哪个标注我有一个控件,它带有数据库。只是那个控件操作起来特别慢,好象是什么大型的东西一样。数据库有密码,只能它的控件操作。
 楼主| 发表于 2003-9-27 11:51:00 | 显示全部楼层
TO MEFLYING:
     您的程序我认真拜读了一下,感到非常佩服!您解决问题的思路非常开阔,非吾辈能及!以后有问题一定再向您请教!谢谢!
发表于 2003-9-27 21:44:00 | 显示全部楼层
jiji
ji!ji建议先选择要处理的曲线集合
我的方法:
1。选要处理的集合
2。求与点最近的曲线 cur1 (距离为0的排除,并且放入选集list2)
3。求list2 中与cur1平行的曲线 (方法有多种,如果简单一点的,用求是否有交点的办法)
发表于 2003-9-30 07:55:00 | 显示全部楼层
To Meflying

1.Pline中有好幾段一樣的平行線,則需加判斷那段距離最短

2.Pline有弧段也會出錯
发表于 2003-9-30 08:48:00 | 显示全部楼层
龙兄考虑周到,修正了一下

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2024-10-2 16:17 , Processed in 0.170895 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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