明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 9664|回复: 22

批量倒角的各种思路,(用心回帖奖币)

    [复制链接]
发表于 2013-4-25 13:42:37 | 显示全部楼层 |阅读模式
就下图为例子:批量直线一对一的进行倒角

下图是:效果图



欢迎大家说说你要操作这个例子的思路方法!



该贴已经同步到 【KAIXIN】的微博

本帖子中包含更多资源

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

x
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2013-9-16 14:23:11 | 显示全部楼层
本帖最后由 fl202 于 2013-9-16 15:37 编辑

写的长了点,思路:根据是否相交分成两个选择集ss2、ss3(根据角度也行,同一个选择集如ss2内稍微不平行的线判断角度就比较麻烦,还是判断交点好些),然后排序,然后倒角。
  1.     (defun midpt (ptx pty / pt)
  2.     (setq pt (list (/ (+ (nth 0 ptx) (nth 0 pty)) 2)  
  3.                       (/ (+ (nth 1 ptx) (nth 1 pty)) 2)  ) )
  4.         pt
  5.        )
  6.    (princ "\n 请选择2组平行直线")
  7.    ;(if
  8.    (setq ss1 nil ss1 (ssget (list (cons 0 "LINE"))))
  9.        ;(progn
  10.         (setq data1 (entget (ssname ss1 0)))
  11.            (setq px1 (cdr (assoc 10 data1)) py1 (cdr (assoc 11 data1)) )
  12.            (setq ang1 (angle px1 py1) ang2 (+ ang1 pi) ang3 (+ ang1 (/ pi 2)) )
  13.            (setq pt1 (midpt px1 py1))
  14.            (setq pt2 (polar pt1 ang3 (* 100 (distance px1 py1)) )  pt5 (polar pt1 (+ ang3 pi) (* 100 (distance px1 py1)) )   )   
  15.          (setq b2 '() b3 '()  i 0 ss2 nil ss3 nil ss2 (ssadd) ss3 (ssadd)  )
  16.    (repeat (sslength ss1)
  17.        (setq en1 (ssname ss1 i))
  18.        (setq data1 (entget en1)  px1 (cdr (assoc 10 data1)) py1 (cdr (assoc 11 data1)) ang4 (angle px1 py1) )
  19.        (setq pt3 (polar pt2 (+ ang4 (/ pi 2)) 100) )
  20.        (setq pt4 (inters px1 py1 pt2 pt3 nil) d1 (distance pt2 pt4)) ;;;(print (list  px1 py1 pt2 pt5 (inters px1 py1 pt2 pt5)))
  21.        (if (inters px1 py1 pt2 pt5)
  22.        (setq b2 (cons (list d1 en1) b2))
  23.        (setq b3 (cons (list d1 en1) b3))  )
  24.        (setq i (1+ i))
  25.        )
  26.        (print (list (length b2) (length b3) ))
  27.     (setq b2 (vl-sort b2  (function (lambda (e1 e2)  (< (car e1) (car e2)) ) ) )  )
  28.     (setq b3 (vl-sort b3  (function (lambda (e1 e2)  (< (car e1) (car e2)) ) ) )  )
  29.    
  30.     (setq en1 (nth 1 (nth 0 b3)))
  31.     (setq px1 (cdr (assoc 10 (entget en1))) py1 (cdr (assoc 11 (entget en1))) )
  32.     (setq pt1 (midpt px1 py1))
  33.     (setq en2 (nth 1 (nth 0 b2)) en3 (nth 1 (nth 1 b2)) )
  34.     (setq ptx2 (cdr (assoc 10 (entget en2))) ptx3 (cdr (assoc 10 (entget en3)))
  35.           pty2 (cdr (assoc 11 (entget en2))) pty3 (cdr (assoc 11 (entget en3)))  
  36.           d1 (distance pt1 (inters px1 px2 ptx2 pty2 nil ))  d2 (distance pt1 (inters px1 px2 ptx3 pty3 nil ))  )
  37.     (if (> d1 d2)
  38.       (setq b2 (vl-sort b2  (function (lambda (e1 e2)  (> (car e1) (car e2)) ) ) )  )
  39.       (princ)
  40.       )
  41.       
  42.     (setq n 0)
  43.     (repeat (length b2)
  44.     (setq en1 (nth 1 (nth n b2)))
  45.     (setq ss2 (ssadd en1 ss2))
  46.     (setq n (1+ n))
  47.     )
  48.       (setq n 0)
  49.     (repeat (length b3)
  50.     (setq en1 (nth 1 (nth n b3)))
  51.     (setq ss3 (ssadd en1 ss3))
  52.     (setq n (1+ n))
  53.     )   
  54.     (command "chprop" ss2 "" "c" 6 "")   
  55.     (setq i 0 r1 50)
  56.     (setq os1 (getvar "osmode"))
  57.     (setvar "osmode" 0)
  58.      (command "fillet" "r" r1)
  59.     (repeat (min (sslength ss2) (sslength ss3))
  60.       (setq en1 (ssname ss2 i) en2 (ssname ss3 i) data1 (entget en1) data2 (entget en2) )
  61.       (setq px1 (cdr (assoc 10 data1))  py1 (cdr (assoc 11 data1))  )
  62.       (setq pt1 (midpt px1 py1))
  63.       (setq px1 (cdr (assoc 10 data2))  py1 (cdr (assoc 11 data2))  )
  64.       (setq pt2 (midpt px1 py1))
  65.       (command "fillet"  (list en1 pt1) (list en2 pt2) )
  66.       (setq i (1+ i))
  67.       )   
  68.     (setvar "osmode" os1)

评分

参与人数 1金钱 +5 收起 理由
【KAIXIN】 + 5 赞一个!才看到呢

查看全部评分

回复 支持 1 反对 0

使用道具 举报

发表于 2019-9-11 17:51:13 | 显示全部楼层
原来还有这么多人也究研这个的。1.框选不同角度的2组线;
2.按角度值分组,前面黄工的程序要注意(rem ang (/ pi 2)),135/90余45,225/90同样余45,但这是2条不同角度的线,还有互为180度的线应视为同组线,0度与接近360度的视为同组线,当然要处理这样的线条为同方向;
3.用鼠标的即时坐标作参考点对分组的线条排序;
4.鼠标的即时坐标参考点在2组线条的相对位置,从而确定2组线条是把StartPoint还是endPoint移至交点上。至于如果确定鼠标的即时坐标参考点在2组线条的相对位置大家可以参考“【越飞越高讲堂16】CAD 的坐标系统和trans函数的工作原理”最后那段。



本帖子中包含更多资源

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

x
发表于 2018-4-5 07:09:42 | 显示全部楼层
一次选择,根据角度分成两组,分别取两组直线与其垂线的虚交点,如果分组直线角度不为0则按虚交点x坐标进行排序,如果某一组直线角度为0,则按虚交点的y轴坐标进行排序,这样就完成了分组与排序,而且还方便求出直线之间的距离,倒角大小还渐增大时这个距离就有用了,然后根据指定倒角大小,大小是否渐变对应倒角即可。

评分

参与人数 1金钱 +10 收起 理由
【KAIXIN】 + 10 赞一个!

查看全部评分

发表于 2013-4-25 13:51:27 | 显示全部楼层
好像G版有一个吧

评分

参与人数 1明经币 +1 金钱 +6 收起 理由
【KAIXIN】 + 1 + 6 赞一个!

查看全部评分

发表于 2013-4-25 14:04:11 | 显示全部楼层
本帖最后由 自贡黄明儒 于 2013-4-26 16:53 编辑

1 先判断线的位置,分成两组
2 然后依次从两组中取线,并判断那一个点离虚交点近,然后倒角
A 分组
  1. ;;1 对象分组,返回组列表
  2. (defun ss:group (ss / ANG ANG1 ANG2 GETENDPOINT GROUP1 GROUP2 OBJ PARAM STARTPOINT)
  3.   (setq obj (ssname ss 0))
  4.   (SsDel obj SS)
  5.   (setq StartPoint (vlax-curve-getStartPoint obj))
  6.   (setq getEndPoint (vlax-curve-getEndPoint obj))
  7.   (setq param (vlax-curve-getStartParam obj))
  8.   ;;起点切线方向的角度值
  9.   (setq ang (angle StartPoint
  10.                    (mapcar '+ StartPoint (vlax-curve-getFirstDeriv obj param))
  11.             )
  12.   )
  13.   (setq ang1 (rem ang (/ pi 2)))
  14.   (setq group1 (cons obj group1))

  15.   (repeat (sslength ss)
  16.     (setq obj (ssname ss 0))
  17.     (SsDel obj SS)
  18.     (setq StartPoint (vlax-curve-getStartPoint obj))
  19.     (setq getEndPoint (vlax-curve-getEndPoint obj))
  20.     (setq param (vlax-curve-getStartParam obj))
  21.     ;;起点切线方向的角度值
  22.     (setq ang (angle StartPoint
  23.                      (mapcar '+ StartPoint (vlax-curve-getFirstDeriv obj param))
  24.               )
  25.     )
  26.     (setq ang2 (rem ang (/ pi 2)))

  27.     (if (equal ang1 ang2 0.1)
  28.       (setq group1 (cons obj group1))
  29.       (setq group2 (cons obj group2))
  30.     )
  31.   )

  32.   (list group1 group2)
  33. )



B 组排序
  1. ;;2 排序
  2. (defun sortObjects (lst / LST1 MINPT N OBJ)
  3.   ;;2.1  获取对象的外边框
  4.   (defun HH:MinMaxPt (ent / MinPt MaxPt)
  5.     (vla-GetBoundingBox
  6.       (vlax-Ename->vla-Object ent)
  7.       'MinPt
  8.       'MaxPt
  9.     )
  10.     (mapcar 'vlax-safearray->list (list MinPt MaxPt))
  11.   )
  12.   ;;2.2  点表排序
  13.   (defun Sort_pList (PLIST / p1 p2)
  14.     (vl-sort plist
  15.              '(lambda (p1 p2)
  16.                 (cond ((< (car (car p1)) (car (car p2))) T)
  17.                       ((and (= (car (car p1)) (car (car p2)))
  18.                             (< (cadr (car p1)) (cadr (car p2)))
  19.                        )
  20.                        T
  21.                       )
  22.                       (T nil)
  23.                 )
  24.               )
  25.     )
  26.   )
  27.   ;;2.3 列表排序
  28.   (repeat (setq n (length lst))
  29.     (setq obj (nth (setq n (1- n)) lst))
  30.     (setq MinPt (car (HH:MinMaxPt obj)))
  31.     (setq obj (list MinPt obj))
  32.     (setq lst1 (cons obj lst1))
  33.   )
  34.   (Sort_pList lst1)
  35. )


C 第一组的第一根线与第二组的第一根线和最后一根线比较,决定第二组是否需要倒序
D 两线倒角时,是以起点还是终点处倒角





评分

参与人数 1明经币 +2 金钱 +12 收起 理由
【KAIXIN】 + 2 + 12 赞一个!

查看全部评分

发表于 2013-4-25 15:29:38 | 显示全部楼层
开心版主在集各家所长

评分

参与人数 1明经币 +1 金钱 +6 收起 理由
【KAIXIN】 + 1 + 6 来实习下

查看全部评分

发表于 2013-4-25 15:54:10 | 显示全部楼层
管道布线专业的程序,3D的,比这要复杂得多,而且肯定是付费程序。
依例图来看,一次性选中所有直线依据旋转角度不同分成两组,再对每组直线依据起始点坐标分别排序直线,生成排序后的两组实体列表,依次取出倒角。

评分

参与人数 1明经币 +2 金钱 +6 收起 理由
【KAIXIN】 + 2 + 6 赞一个! 是朋友求助的!

查看全部评分

发表于 2013-4-25 16:35:53 | 显示全部楼层
不是付费程序最好,不然别人不会轻易给出源码!
你把例图给出,情况有多少种,程序自然就可以写出来了。
如果仅仅是两组等长的直线,可能要简单很多。
发表于 2013-4-25 17:44:42 | 显示全部楼层
特殊情况,好做:不用分组,建立一个选择集,依次判断每根线与其它线的交点是否在虚交点连线上,是的时候对这两根线进行倒角
倒角完毕后将这两条线从选择集中移除
不知道行不行

评分

参与人数 1明经币 +2 金钱 +9 收起 理由
【KAIXIN】 + 2 + 9 赞一个!

查看全部评分

发表于 2013-4-25 19:04:03 | 显示全部楼层
分两次ssget ,然后排序,再倒角!

评分

参与人数 1明经币 +2 金钱 +9 收起 理由
【KAIXIN】 + 2 + 9 赞一个!

查看全部评分

发表于 2013-4-25 19:15:06 | 显示全部楼层
编这个的难点在于怎么选中和其对应的那一条线,然后进行倒角。估计得首先按照坐标和角度对两组线分别进行排序,然后按顺序逐个进行倒角。

评分

参与人数 1明经币 +1 金钱 +15 收起 理由
【KAIXIN】 + 1 + 15 赞一个!

查看全部评分

发表于 2013-4-25 20:02:40 | 显示全部楼层
让我想想...
1.输入四个点,两个点用于选择第一组线,两个点用于选择另一组线
2.分两次用  ssget f 选中两组线
3.前两个点创建一条线,后两个点创建一条线
4.用对象数少的一组线的数目作为循环数
5.两组依次取出一个,与刚才画的线求交点,判断交点,起始点,两线虚交点的位置关系,修改起始点的位置达到两线连在一起,加入新选择集
6.完成后用选择集的线聚合连接成多义线(pedit  pedit里有一个倒角的参数)
完工。。好累。。

评分

参与人数 1明经币 +3 金钱 +6 收起 理由
【KAIXIN】 + 3 + 6 赞一个!

查看全部评分

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

本版积分规则

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

GMT+8, 2025-1-3 04:40 , Processed in 0.204780 second(s), 40 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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