明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: nabworm

[求助]一张大的底图,如何快速裁切出其中一块矩形区域另存?

  [复制链接]
发表于 2007-9-11 16:18:00 | 显示全部楼层

试试我的呢~~

本帖子中包含更多资源

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

x
发表于 2007-9-14 10:08:00 | 显示全部楼层

隐含模块中的编译错误!

工程不可查看!

耍人呢?

发表于 2007-9-14 10:37:00 | 显示全部楼层
这个还行,不会把块丢失
[QUOTE]
  1. (DEFUN C:TirmViaLWP(/ old_cmd Ename loop)
  2.   (SETQ old_cmd (GETVAR "CMDECHO"))
  3.   (SETVAR "CMDECHO" 0)
  4.   ;(SETQ Ename (CAR (ENTSEL "\n选择裁图范围:")))
  5.   (SETQ loop 1)
  6.   (WHILE loop
  7.     (SETQ ObjPos (ENTSEL "\n选择裁图范围 :"))
  8.     (COND
  9.       ((NULL ObjPos) (PROMPT "已选择0个, 找到0个"))
  10.       ((not (member (cdr (assoc 0 (setq ed (entget (setq en (car ObjPos)))))) '("POLYLINE" "LWPOLYLINE")) )
  11.        (prompt ": 目标不是多义线!"))
  12.       (t (setq loop nil))
  13.     )
  14.   )
  15.   (SETQ Ename (CAR ObjPos))
  16.   (TrimByFence0 (GetListOfPline0 Ename))
  17.   (SETVAR "CMDECHO" old_cmd)
  18.   (PRINC)
  19. )
  20. ;;;******************************************
  21. ;;;**************剪裁并删除图外线状物体的子函数****
  22. ;;;******************************************
  23. (DEFUN TrimByFence0(knownCoordList / Count OFFSETDIST BoundaryLine newExtent newCoordList COORD objSequence)
  24. (SETVAR "PLINETYPE" 2)
  25. (SETQ Count 0)
  26. (COMMAND "ZOOM" "E")
  27.    ;;;;;;;;裁减21次
  28. (REPEAT 21
  29.     (SETQ OFFSETDIST (- 2 (* 0.095 Count)))
  30.     (SETQ BoundaryLine (GetLwPlineFromList0 knownCoordList))
  31.     (COMMAND "OFFSET" OFFSETDIST BoundaryLine "-1000,-1000" "")
  32.     (SETQ newExtent (ENTLAST))
  33.     (SETQ newCoordList (GetListOfPline0 newExtent) )
  34.     (SETQ objSequence 0)
  35.     (SETQ COORD (NTH objSequence newCoordList))
  36.     (COMMAND "TRIM" BoundaryLine "" "F")
  37.     (WHILE COORD
  38.              (COMMAND COORD)
  39.              (SETQ objSequence (+ objSequence 1))
  40.              (SETQ COORD (NTH objSequence newCoordList))
  41.     )
  42.     (SETQ COORD (NTH 0 newCoordList))
  43.     (COMMAND COORD "" "" "ERASE" BoundaryLine newExtent "")
  44.     (SETQ Count (+ Count 1))
  45. )
  46. ;;;;再以外扩0.1的多边形为基础进行裁切(每次offset 0.01,共10次)
  47. (SETQ Count 0)
  48. (REPEAT 10
  49.     (SETQ OFFSETDIST (- 0.1 (* 0.01 Count)))
  50.     (SETQ BoundaryLine (GetLwPlineFromList0 knownCoordList))
  51.     (COMMAND "OFFSET" OFFSETDIST BoundaryLine "-1000,-1000" "")
  52.     (SETQ newExtent (ENTLAST))
  53.     (SETQ newCoordList (GetListOfPline0 newExtent) )
  54.     (SETQ objSequence 0)
  55.     (SETQ COORD (NTH objSequence newCoordList))
  56.     (COMMAND "TRIM" BoundaryLine "" "F")
  57.     (WHILE COORD
  58.              (COMMAND COORD)
  59.              (SETQ objSequence (+ objSequence 1))
  60.              (SETQ COORD (NTH objSequence newCoordList))
  61.     )
  62.     (SETQ COORD (NTH 0 newCoordList))
  63.     (COMMAND COORD "" "" )
  64.     (COMMAND "ERASE" BoundaryLine newExtent "")
  65.     (SETQ Count (+ Count 1))
  66. )
  67.    ;;;;;;得到最大最小坐标,得到内扩0.1的线坐标表
  68.     (setq CenterSeg (GetCoordnateOfBLTR0 knownCoordList))
  69.     (setq point-BL (car CenterSeg)
  70.           point-TR (cadr CenterSeg))
  71.     (setq Xmax (car point-TR)
  72.           Ymax (cadr point-TR)
  73.           Xmin (car point-BL)
  74.           Ymin (cadr point-BL))
  75.   
  76.     ;;;得到范围的中心点
  77.     (setq point-Center (list (/ (+ (car point-BL) (car point-TR)) 2) (/ (+ (cadr point-BL) (cadr point-TR)) 2)))
  78.    
  79.     (SETQ BoundaryLine (GetLwPlineFromList0 knownCoordList))
  80.     (COMMAND "OFFSET" "0.01" BoundaryLine point-Center "")
  81.     (SETQ newExtent (ENTLAST))
  82.     (setq In-CoordList (GetListOfPline0 (ENTLAST)))
  83.     (COMMAND "ERASE" BoundaryLine newExtent "")
  84. ***********************************************************************************
  85.    ;;;;;删除剩下的与边界搭上且在边界外的实体;;;;;;;;;;;;;;;;;
  86.     ;;;;;;思路:先取出找出宽度大于0的线,记录有Num-Wider条,一条一条的将宽度变为0
  87.     ;;;;;;再取出与扩展后的边界相交的线(用"F"过滤),
  88.     ;;;;;;用undo命令Num-Wider次,将宽度改回原来的宽度,删除与扩展后的边界相交的线
  89.     (setq p1 (nth 0 newcoordlist))
  90.     (setq newcoordlist (append newcoordlist (list p1)))
  91.     ;;;;ss-Wider为宽度大于0的线
  92.     (setq ss-Wider (ssget "F" newCoordList
  93.         '((-4 . "<or")
  94.             (-4 . "<and")
  95.                 (-4 . "<or")
  96.                     (0 . "LINE")(0 . "POLYLINE")(0 . "LWPOLYLINE")
  97.                 (-4 . "or>")
  98.                 (-4 . "<or")
  99.                     (-4 . ">")(40 . 0.0)(-4 . ">")(41 . 0.0)   
  100.                 (-4 . "or>")        
  101.             (-4 . "and>")
  102.         (-4 . "or>"))
  103.     ))
  104.     (setq Num-Wider 0)    ;;;;;;Num-Wider为宽度大于0的线段
  105.     (if ss-Wider
  106.        (progn
  107.         (setq i 0)
  108.         (setq Num-Wider (sslength ss-Wider))
  109.         (repeat Num-Wider
  110.            (setq ss-every (ssname ss-Wider i))
  111.            (setq sse-every (entget ss-every))
  112.            (command "pedit" ss-every "w" "0" "")
  113.            (setq i (+ i 1))
  114.         )
  115.        )
  116.     )
  117.     ;;;;;;ss-must-delete为必须删除的线段
  118.    
  119.     (setq ss-must-delete (ssget "F" newCoordList
  120.         '((-4 . "<or")
  121.             (0 . "LINE")(0 . "LWPOLYLINE")(0 . "POLYLINE")(0 . "ARC")(0 . "CIRCLE")
  122.         (-4 . "or>"))
  123.     ))
  124.     ;;;;;;ss-must-keep为必须保留的线段
  125.     (setq ss-must-keep nil)
  126.     (SETQ ss-must-keep (SSGET "CP" In-CoordList))
  127.     (if (= ss-must-keep nil)
  128.         (setq ss-must-keep (ssadd))
  129.     )
  130.     (if (> Num-Wider 0)
  131.         (command "undo" Num-Wider)
  132.     )
  133.     (if ss-must-delete
  134.         (command "erase" ss-must-delete "r" ss-must-keep "")
  135.     )
  136. ;;;;;;;;删除搭界的线段完毕   
  137. ;;;;;删除图外实体
  138.     (SETQ SS1 (SSGET "CP" knownCoordList))    ;;;;;;;ss1为所有范围内实体
  139.     (IF (= SS1 nil)
  140.         (COMMAND "ERASE" "all" "")
  141.         (COMMAND "ERASE" "all" "R" SS1 "")
  142.     )      
  143.      ;;;;;删除完毕
  144. ***********************************************************************************
  145. )
  146. ;;;***********************************************************
  147. ;;;;;;;根据折线实体名得到各节点的坐标组成的表的子函数
  148. ;;;***********************************************************
  149. (DEFUN GetListOfPline0(EntityName / SSE_Pline Coordnate_Vertex LastList)
  150. (SETQ SSE_Pline (ENTGET EntityName))
  151. (SETQ LastList nil)
  152. (IF (= (CDR (ASSOC 0 SSE_Pline)) "LINE")
  153. (PROGN
  154.     (setq p1 (cdr (assoc 10 sse_pline))
  155.           p2 (cdr (assoc 11 sse_pline)))
  156.     (setq p1 (reverse (cdr (reverse p1)))
  157.           p2 (reverse (cdr (reverse p2))))
  158.     (SETQ LastList (list p1 p2))
  159. )
  160. )
  161. (IF (= (CDR (ASSOC 0 SSE_Pline)) "LWPOLYLINE")
  162. (PROGN
  163.     (SETQ LastList (LIST (LIST 0 0)))
  164.     (SETQ N 0)
  165.     (WHILE (/= (NTH N SSE_PLINE) NIL)
  166.             (IF (= (CAR (NTH N SSE_PLINE)) 10)
  167.             (SETQ LastList (APPEND LastList (LIST (LIST (CADR (NTH N SSE_PLINE)) (CADDR (NTH N SSE_PLINE)))) ))
  168.         )
  169.         (SETQ N (+ N 1))
  170.     )
  171.     (SETQ LastList (CDR LastList))
  172. )
  173. )
  174. (IF (= (CDR (ASSOC 0 SSE_Pline)) "POLYLINE")
  175. (PROGN
  176.     (SETQ LastList (LIST (LIST 0 0)))
  177.     (SETQ newEntityName (ENTNEXT EntityName))
  178.     (WHILE (= (CDR (ASSOC 0 (ENTGET newEntityName))) "VERTEX")
  179.         (SETQ LastList (APPEND LastList (LIST (LIST (CADR (ASSOC 10 (ENTGET newEntityName))) (CADDR (ASSOC 10 (ENTGET newEntityName))) )) ))
  180.         (SETQ newEntityName (ENTNEXT newEntityName))
  181.     )
  182.     (SETQ LastList (CDR LastList))
  183. )
  184. )
  185. (IF (= (CDR (ASSOC 0 SSE_Pline)) "ARC")
  186. (PROGN
  187.     (SETQ LastList (LIST (LIST 0 0)))
  188.     (COMMAND "PEDIT" EntityName "Y" "" "CONVERT" "P" "S" (ENTLAST) "")
  189.     (SETQ SSE_Pline (ENTGET (ENTLAST)))
  190.     (SETQ N 0)
  191.     (WHILE (/= (NTH N SSE_PLINE) NIL)
  192.             (IF (= (CAR (NTH N SSE_PLINE)) 10)
  193.             (SETQ LastList (APPEND LastList (LIST (LIST (CADR (NTH N SSE_PLINE)) (CADDR (NTH N SSE_PLINE)))) ))
  194.         )
  195.         (SETQ N (+ N 1))
  196.     )
  197.     (SETQ LastList (CDR LastList))
  198.     (COMMAND "UNDO" 2)
  199. ))
  200. (IF (= (CDR (ASSOC 0 SSE_Pline)) "CIRCLE")
  201. (PROGN
  202.     (SETQ Ra1 (CDR (assoc 40 SSE_Pline)))
  203.     (SETQ P-Center (CDR (assoc 10 SSE_Pline)))
  204.     (SETQ P1 (POLAR P-Center 0 Ra1))
  205.     (SETQ P2 (POLAR P-Center (* PI 0.5) Ra1))
  206.     (SETQ P3 (POLAR P-Center (* PI 1.0) Ra1))
  207.     (SETQ P4 (POLAR P-Center (* PI 1.5) Ra1))
  208.     (SETQ LastList (LIST P1 P2 P3 P4))
  209. ))
  210. (SETQ LastList LastList)
  211. )
  212. ;;;***********************************************************
  213. ;;;;;;;;;;;;根据一个坐标表得到一条线的子函数
  214. ;;;***********************************************************
  215. (DEFUN GetLwPlineFromList0(knownCoordList / newCoordList MainPline)
  216. (SETVAR "PLINETYPE" 2)
  217. (COMMAND "._PLINE")
  218. (FOREACH newCoordList knownCoordList (COMMAND newCoordList))
  219. (COMMAND "C")
  220. (SETQ MainPline (ENTLAST))
  221. )
  222. ;;;***********************************************************
  223. ;;;;;;;从坐标表中得到范围的左下角和右上角坐标的子函数
  224. ;;;***********************************************************
  225. (DEFUN GetCoordnateOfBLTR0(knownCoordList / CurrenPoint Xmin Ymin Xmax Ymax nowCoordnateList)
  226. (SETQ nowCoordnateList knownCoordList)
  227. (SETQ CurrenPoint (CAR nowCoordnateList)
  228.       Xmin (CAR CurrenPoint)
  229.       Ymin (CADR CurrenPoint)
  230.       Xmax (CAR CurrenPoint)
  231.       Ymax (CADR CurrenPoint))
  232. (SETQ nowCoordnateList (CDR nowCoordnateList))
  233. (WHILE (/= nowCoordnateList nil)
  234.       (SETQ CurrenPoint (CAR nowCoordnateList))
  235.       (IF (< (CAR CurrenPoint) Xmin) (SETQ Xmin (CAR CurrenPoint)))
  236.       (IF (< (CADR CurrenPoint) Ymin) (SETQ Ymin (CADR CurrenPoint)))
  237.       (IF (> (CAR CurrenPoint) Xmax) (SETQ Xmax (CAR CurrenPoint)))
  238.       (IF (> (CADR CurrenPoint) Ymax) (SETQ Ymax (CADR CurrenPoint)))
  239.       (SETQ nowCoordnateList (CDR nowCoordnateList))
  240. )
  241. (SETQ nowCoordnateList (LIST (LIST Xmin Ymin)(LIST Xmax Ymax)))
  242. )
  243. [/QUOTE]

评分

参与人数 1金钱 +15 贡献 +5 激情 +5 收起 理由
yfy2003 + 15 + 5 + 5 【好评】好程序

查看全部评分

发表于 2007-9-19 12:03:00 | 显示全部楼层
jdhszh发表于2007-9-14 10:08:00隐含模块中的编译错误!工程不可查看!耍人呢?

没有啊,我用起都是正常得很呢

发表于 2007-11-14 07:31:00 | 显示全部楼层

回复:(gdzhou)以下是引用jdhszh在2007-9-14 10:08:...

好象是丢失了什么DLL文件!
发表于 2007-12-7 22:33:00 | 显示全部楼层
scas裁图也很好使。
发表于 2007-12-9 02:17:00 | 显示全部楼层
本帖最后由 作者 于 2007-12-9 2:17:53 编辑

唉,在Microstation里 一个 FF=命令就搞定了。还用费那么多功夫。
发表于 2007-12-27 08:42:00 | 显示全部楼层
xgr发表于2007-8-30 0:08:00试试我的代码(defun c:txjq3 (/      aa     oldgroup     oldcmd oldblip  oldsnap  en   

这个能不能做成可加载的程序呀,我是菜鸟呀,不会呢,但经常会用这样的需要,谢谢

发表于 2008-1-13 01:32:00 | 显示全部楼层
本帖最后由 作者 于 2008-1-13 1:33:56 编辑

不知道,你们的程序能否实现我的效果.在MicroStation里真的很容易裁剪图形。

http://upload.py99.net/files/38/flash/cutdemo.swf
发表于 2008-1-22 09:08:00 | 显示全部楼层
用CASS有个命令
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-12-23 21:33 , Processed in 0.267805 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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