明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: usercoolbo

急求:将圆批量转为块的程序

  [复制链接]
发表于 2004-3-19 13:59 | 显示全部楼层
subtlation发表于2004-3-19 8:38:00请教一下明总: For i = 0 To ss.Count - 1 语句 next 是不是每次运行循环回到for语句时,ss,count就会重新计算一次? 还有就是CS.Erase语句把圆...

1.For ...Next是循环语句,循环过程中ss.Count不重新计算,而只计算第一次,然后按每循环一次i值递增1。 2.CS.Erase删除对象后,选择集中的对象数量会变小,但对于循环的次数不会改变。 3.假定是实体ss(2)被删除,那么以后引用ss(2)时,会出错,所以程序设置了出错判断来跳过。
发表于 2004-3-19 16:50 | 显示全部楼层
要取得同心圆块,应当把所有圆心点归到同一个点集中ss ,取出其中一个点P1,再把这个点与点集中ss的点比较,若有n个相等值(n>0),则把n个相等值点P2对应的圆O2归入一起B1块中,同时把P2移出点集ss ,再此循环以上操作,直到点集ss 为 nil为止。
发表于 2004-3-19 17:41 | 显示全部楼层
取同心圆其实很简单,也用带过滤器的选择集,过滤出同心的圆,有没有看到我在VBA中的写法,就是用这种方法。
发表于 2004-3-24 12:29 | 显示全部楼层
usercoolbo发表于2004-3-17 10:46:00能不能用LISP编写啊,VBA我有点看不懂,谢了
;;將圓批量轉為塊的程式
;;By 龍龍仔(LUCAS)
(defun C:CBB (/ HOLDOSMODE HOLDECHO SS LST N A B X)
(setq HOLDECHO (getvar "cmdecho"))
(setvar "cmdecho" 0)
(setq HOLDOSMODE (getvar "osmode"))
(setvar "osmode" 0)
(setq SS (ssget "x"
(list '(0 . "CIRCLE") (cons 410 (getvar "ctab")))
)
N 0
)
(repeat (sslength SS)
(if (not
(member (setq CEN (cdr (assoc 10 (entget (ssname SS N)))))
LST
)
)
(setq LST (cons CEN LST))
)
(setq N (1+ N))
)
(setq A (* (getvar "CDATE") 1E8))
(mapcar '(lambda (X)
(while (progn (setq B (rtos (setq A (1+ A))))
(tblsearch "block" B)
)
)
(command
"_.block"
B
X
(ssget "X" (list '(0 . "CIRCLE") '(-4 . "=") (cons 10 X)))
""
)
(command "_.insert" B X "" "" "")
;(print B) ;注意:B可不是連續的!
)
LST
)
(command "_.erase" SS "")
(setvar "osmode" HOLDOSMODE)
(setvar "cmdecho" HOLDECHO)
(princ)
)

评分

参与人数 1金钱 +10 贡献 +5 激情 +5 收起 理由
mccad + 10 + 5 + 5 【精华】好程序

查看全部评分

发表于 2004-3-26 09:41 | 显示全部楼层
关注中
 楼主| 发表于 2004-3-29 10:58 | 显示全部楼层
谢谢龙龙仔了,小弟前些时候出差了,过会我试试!
发表于 2004-9-12 19:19 | 显示全部楼层
考考大家。 难道没有写的更简单的么?或者其它的写法。 如果不是对全图 (ssget "X" (list '(0 . "CIRCLE") '(-4 . "=") (cons 10 X))) 怎么变通?
发表于 2004-9-13 08:09 | 显示全部楼层
如果不是对全图????你想说甚么?
发表于 2004-9-15 19:47 | 显示全部楼层
这样么?
  1. Public Sub test()
  2. On Error Resume Next       Dim ft(0) As Integer, fd(0)
  3.        Dim ss As AcadSelectionSet
  4.        Dim Cols As New Collection
  5.        Dim Objs As AcadBlock
  6.        Dim pnt
  7.        Dim strName As String
  8.        Dim entitys(0) As AcadEntity
  9.       
  10.        ThisDrawing.SelectionSets("*TlsTest*").Delete
  11.        Set ss = ThisDrawing.SelectionSets.Add("*TlsTest*")
  12.        ft(0) = 0: fd(0) = "Circle"
  13.        ss.Select acSelectionSetAll, , , ft, fd
  14.       
  15.        For Each i In ss
  16.                pnt = i.Center
  17.                strName = pnt(0) & "," & pnt(1) & "," & pnt(2)
  18.                Err.Clear
  19.                Set Objs = ThisDrawing.Blocks(Cols(strName))
  20.                If Err Then
  21.                        Set Objs = ThisDrawing.Blocks.Add(pnt, "*U")
  22.                        Cols.Add Objs.Name, strName
  23.                End If
  24.                Set entitys(0) = i
  25.                ThisDrawing.CopyObjects entitys, Objs
  26.        Next i
  27.       
  28.        For Each i In Cols
  29.                ThisDrawing.ModelSpace.InsertBlock ThisDrawing.Blocks(i).origin, i, 1, 1, 1, 0
  30.        Next i
  31.       
  32.        ss.Erase
  33.       
  34. End Sub
发表于 2005-5-24 22:13 | 显示全部楼层
sorry! 何为启动组?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-25 09:00 , Processed in 2.860441 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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