明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: xiaxiang

框选直线段,一次性剪切延伸

  [复制链接]
发表于 2010-12-25 08:33 | 显示全部楼层
理了下思路
依线组求出交点集
排序交点集
切割回路 绘出方框
清除圆内的线段
回复

使用道具 举报

 楼主| 发表于 2010-12-25 08:45 | 显示全部楼层
拜托了
回复

使用道具 举报

发表于 2010-12-26 00:34 | 显示全部楼层
下載試用看先
回复

使用道具 举报

 楼主| 发表于 2010-12-26 16:35 | 显示全部楼层
刚找到一段代码,不知适不适用,见笑了
  1. ;命令:tat(可自己修改)
  2. ;用途:将弧线和批量直线的交点按照顺序用直线连接
  3. ;程序思路:找交点,交点排序,画直线
  4. ;应用范围: r12以上acad
  5. ;编写采用:Lisplink16.02

  6. ;cbreak_0是寻找圆弧和直线端点pa,pb的交点
  7. (defun cbreak_0 (ent pa pb)
  8. (setq pt1 nil
  9. pt2 nil
  10. )
  11. (setq pc (cdr (assoc 10 ENT)))
  12. (setq rc (cdr (assoc 40 ENT)))
  13. (setq anglestart (cdr (assoc 50 ent)))
  14. (setq angleend (cdr (assoc 51 ent)))
  15. (if (< (- angleend anglestart) 0)
  16. (setq angleend (+ angleend (* 2 3.1415926535898)))
  17. )
  18. (setq angleab (angle pa pb))
  19. (setq angleab90 (+ angleab (/ 3.1415926536 2)))
  20. (setq angleab180 (+ angleab 3.1415926536))
  21. (setq angleab270 (+ angleab (* 3.1415926536 1.5)))
  22. (setq pd (polar pc angleab90 rc))
  23. (setq pf (polar pc angleab270 rc))
  24. (setq virtualpa (polar pa angleab180 1000000))
  25. (setq virtualpb (polar pb angleab 1000000))
  26. (setq pe (inters
  27. virtualpa
  28. virtualpb
  29. pf
  30. pd
  31. )
  32. )
  33. (if pe
  34. (progn
  35. (setq l1 (distance pc pe))
  36. (setq l2 (sqrt (- (* rc rc) (* l1 l1))))
  37. (setq la (distance pc pa))
  38. (setq lb (distance pc pb))

  39. (if (and
  40. (>= la rc)
  41. (>= lb rc)
  42. )
  43. (progn
  44. (setq pac (polar pe angleab180 l2))
  45. (setq pbc (polar pe angleab l2))
  46. (setq pabr (distance pa pb))
  47. (setq par1 (distance pac pa))
  48. (setq par2 (distance pac pb))
  49. (setq par3 (distance pbc pa))
  50. (setq par4 (distance pbc pb))
  51. (if (and (<= par1 pabr) (<= par2 pabr) (<= par3 pabr) (<= par4 pabr))
  52. (setq pt1 pac pt2 pbc))
  53. )
  54. )
  55. (if (and
  56. (< la rc)
  57. (>= lb rc)
  58. )
  59. (progn
  60. (setq pbc (polar pe angleab l2))
  61. (setq pt1 nil
  62. pt2 pbc
  63. )
  64. )
  65. )
  66. (if (and
  67. (>= la rc)
  68. (< lb rc)
  69. )
  70. (progn
  71. (setq pac (polar pe angleab180 l2))
  72. (setq pbc pb)
  73. (setq pt1 pac
  74. pt2 nil
  75. )
  76. )
  77. )
  78. (if (and
  79. (< la rc)
  80. (< lb rc)
  81. )
  82. (progn
  83. (setq pt1 nil
  84. pt2 nil
  85. )
  86. )
  87. )
  88. )
  89. )


  90. (setq pt1temp pt1
  91. pt2temp pt2
  92. )
  93. (setq pt1 nil
  94. pt2 nil
  95. )
  96. (if (/= pt1temp nil)
  97. (progn
  98. (setq anglept1c (angle pc pt1temp))
  99. (if (and
  100. (>= anglept1c anglestart)
  101. (<= anglept1c angleend)
  102. )
  103. (setq pt1 pt1temp)
  104. )
  105. (setq anglept1c_a (+ anglept1c (* 3.1415926535 2)))
  106. (if (and
  107. (>= anglept1c_a anglestart)
  108. (<= anglept1c_a angleend)
  109. )
  110. (setq pt1 pt1temp)
  111. )
  112. )
  113. )

  114. (if (/= pt2temp nil)
  115. (progn

  116. (setq anglept2c (angle pc pt2temp))

  117. (if (and
  118. (>= anglept2c anglestart)
  119. (<= anglept2c angleend)
  120. )
  121. (setq pt2 pt2temp)
  122. )
  123. (setq anglept2c_a (+ anglept2c (* 3.1415926535 2)))


  124. (if (and
  125. (>= anglept2c_a anglestart)
  126. (<= anglept2c_a angleend)
  127. )
  128. (setq pt2 pt2temp)
  129. )
  130. )
  131. )


  132. )


  133. ;jiaohuan1是交换表中两个数据的位置
  134. (defun jiaohuan1 (az bz)
  135. (setq qqqz (nth az pee))
  136. (setq pqqqz (nth bz pee))
  137. (setq pee (subst
  138. '(xxxxxx)
  139. (nth az pee)
  140. pee
  141. )
  142. )
  143. (setq pee (subst
  144. '(yyyyyy)
  145. (nth bz pee)
  146. pee
  147. )
  148. )
  149. (setq pee (subst
  150. qqqz
  151. (nth bz pee)
  152. pee
  153. )
  154. )
  155. (setq pee (subst
  156. pqqqz
  157. (nth az pee)
  158. pee
  159. )
  160. )
  161. )

  162. ;tat是主程序
  163. (defun c:tat ()
  164. (princ "请选择包含弧线的选择集,自动过滤剩下弧线:")
  165. (setq SSet1 (ssget))
  166. (princ "请选择包含直线的选择集,自动过滤剩下直线:")
  167. (setq SSet2 (ssget))
  168. ;过滤第一选择集
  169. (setq i 0)
  170. (setq ss1 (ssadd))
  171. (while (< i (sslength sset1))
  172. (setq ln (ssname sset1 i))
  173. (if (= "ARC" (cdr(assoc 0(entget ln))))
  174. (ssadd ln ss1)
  175. )
  176. (setq i(1+ i))
  177. )

  178. ;过滤第二选择集
  179. (setq i 0)
  180. (setq ss2 (ssadd))
  181. (while (< i (sslength sset2))
  182. (setq ln (ssname sset2 i))
  183. (if (= "LINE" (cdr(assoc 0(entget ln))))
  184. (ssadd ln ss2)
  185. )
  186. (setq i(1+ i))
  187. )

  188. (setq iarc 0)
  189. (setq lenarc (sslength ss1))
  190. (while (< iarc lenarc)
  191. (setq BENT1 (entget (ssname SS1 iarc)))
  192. (setq obj1 (cdr (assoc 0 bent1)))
  193. (setq itm2 0
  194. num2 (sslength ss2)
  195. )
  196. (setq pee nil
  197. pe nil
  198. )
  199. (while (< itm2 num2)
  200. (setq BENT2 (entget (ssname SS2 itm2)))
  201. (setq obj2 (cdr (assoc 0 bent2)))
  202. (setq PA (cdr (assoc 10 BENT2))
  203. PB (cdr (assoc 11 BENT2))
  204. )

  205. ;寻找交点
  206. (cbreak_0 bent1 pa pb)

  207. ;交点入表
  208. (if (= itm2 0)
  209. (progn
  210. (if (/= pt1 nil)
  211. (setq pee (list pt1))
  212. )
  213. (if (/= pt2 nil)
  214. (setq petemp (list pt2)
  215. pee (append
  216. pee
  217. petemp
  218. )
  219. )
  220. )


  221. )
  222. )
  223. (if (/= itm2 0)
  224. (progn
  225. (if (/= pt1 nil)
  226. (setq pe (list pt1)
  227. pee (append
  228. pee
  229. pe
  230. )
  231. )
  232. )

  233. (if (/= pt2 nil)
  234. (setq pe (list pt2)
  235. pee (append
  236. pee
  237. pe
  238. )
  239. )
  240. )

  241. )
  242. )
  243. (setq itm2 (1+ itm2))
  244. )

  245. ;交点排序
  246. (setq i 0)
  247. (setq num22 (length pee))
  248. (while (< i (- num22 1))
  249. (setq j (+ 1 i))
  250. (while (< j num22)
  251. (setq pee1 (nth i pee))
  252. (setq inte1 (angle pc pee1))
  253. (if (< inte1 anglestart)
  254. (setq inte1 (+ inte1 (* 3.1415926535 2)))
  255. )
  256. (setq pee2 (nth j pee))
  257. (setq inte2 (angle pc pee2))
  258. (if (< inte2 anglestart)
  259. (setq inte2 (+ inte2 (* 3.1415926535 2)))
  260. )
  261. (setq hehe (- inte2 inte1))
  262. (if (< hehe 0)
  263. (progn
  264. (jiaohuan1 i j)
  265. )
  266. )
  267. (setq j (+ j 1))
  268. )
  269. (setq i (+ 1 i))
  270. )

  271. ;交点画线
  272. (setq i 0)
  273. (setq num22 (length pee))
  274. (while (< i (- num22 1))
  275. (setq pee1 (nth i pee))
  276. (setq pee2 (nth (1+ i) pee))
  277. (command "line" pee1 pee2 "")
  278. (setq i (1+ i))
  279. )
  280. (setq iarc (1+ iarc))
  281. )
  282. )





回复

使用道具 举报

 楼主| 发表于 2010-12-28 17:34 | 显示全部楼层
Andyhon ,不知做的怎么样,等候您的佳音!
回复

使用道具 举报

发表于 2011-1-7 12:04 | 显示全部楼层
思路不同重新改写...
通过 在2004下 Email_5.TC-CC 样例上图调试
Email_5.TC-CC 上图全框选

本帖子中包含更多资源

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

x
回复

使用道具 举报

 楼主| 发表于 2011-1-7 14:05 | 显示全部楼层
苦苦等待许多年,感谢Andyhon 大侠,先试用一下
回复

使用道具 举报

 楼主| 发表于 2011-1-7 14:30 | 显示全部楼层
非常感谢,程序做到这个地步,已经非常不容易了
唯一的缺憾,是执行完一次后,当圆再次被移动位置,再运行test,报出没有任何对象被选中---"命令输入时发送的类型无效".经分析,应是某些单线被连接成多线的缘故.因此手动explode之后,再选择test,则成功.
请问大侠,干脆在程序中加入先explode再test?
不过我自己手动也可以的.不论如何,表示衷心的感谢.


本帖子中包含更多资源

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

x
回复

使用道具 举报

发表于 2011-9-9 10:02 | 显示全部楼层
这只能争对这种图吗 换另一种也能行不
回复

使用道具 举报

发表于 2011-9-9 14:35 | 显示全部楼层
使用一下,只针对直线且是正交的可以使用
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-27 00:54 , Processed in 0.203026 second(s), 16 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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