找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 620|回复: 10

[求助]:请问如何将一选择集中的内容定义成块

[复制链接]
发表于 2003-5-15 16:07:58 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
一选择集中有许多图形,现要将他们定义成一个块,该如何操作(用VBA命令),请指点,谢谢。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 8个

财富等级: 恭喜发财

发表于 2003-5-15 17:55:32 | 显示全部楼层
我有一个问题是用Vlisp如何调用 wblock的函数
(vla-wblock "c:/ls.dwg" 选择集)
选择集用什么方法的呢?
(ssget)得到的不是object的集合,程序会报错
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 181个

财富等级: 日进斗金

发表于 2003-5-15 19:03:52 | 显示全部楼层

使用CopyObjects方法

下面是一个例子,首先要了解块和选择集的用法,还有选择集中过滤机制的使用,接着是CopyObjects的用法,第一个参数是实体的数组集合,第二个参数是存放实体的对象,可以是块或者另一个文档对象。


  1.   [FONT=courier new]
  2. Option Explicit

  3. '本例创建一个块并向块定义中添加选中的实体。

  4. Sub Test()
  5.     ' 定义块
  6.     Dim blockObj As AcadBlock
  7.     Dim insertionPnt(0 To 2) As Double
  8.     insertionPnt(0) = 0
  9.     insertionPnt(1) = 0
  10.     insertionPnt(2) = 0
  11.     Set blockObj = ThisDrawing.Blocks.Add _
  12.                      (insertionPnt, "CircleBlock")

  13.     ' 创建新的选择集
  14.     Dim sstext As AcadSelectionSet
  15.     Dim FilterType(0) As Integer
  16.     Dim FilterData(0) As Variant
  17.     Set sstext = ThisDrawing.SelectionSets.Add("SS2")
  18.     FilterType(0) = 0
  19.     FilterData(0) = "Circle"


  20.     ' 提示用户选择对象,并将其添加到选择集中。要完成选择,请按回车键。
  21.     sstext.SelectOnScreen FilterType, FilterData
  22.    
  23.     ' 将选择集中的对象存入数组
  24.     Dim Entarr() As AcadEntity
  25.     ReDim Entarr(0 To sstext.Count - 1)
  26.     Dim i As Integer
  27.     For i = 0 To sstext.Count - 1
  28.         Set Entarr(i) = sstext.Item(i)
  29.     Next
  30.    
  31.     ' 将数组中的对象拷贝到块中
  32.     ThisDrawing.CopyObjects Entarr, blockObj
  33. End Sub
  34.   [/FONT]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 181个

财富等级: 日进斗金

发表于 2003-5-15 19:09:48 | 显示全部楼层
最初由 前生 发布
[B]我有一个问题是用Vlisp如何调用 wblock的函数
(vla-wblock "c:/ls.dwg" 选择集)
选择集用什么方法的呢?
(ssget)得到的不是object的集合,程序会报错 [/B]


这个是VBA的用法,在VLisp中具体怎么用也不太清楚。vla-wblock这个函数在VL中应该没有吧。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 181个

财富等级: 日进斗金

发表于 2003-5-15 19:15:02 | 显示全部楼层
用CopyObjects仅是在打开的文档中操作,而如果要将选中的对象保存到外部文件,那么就要使用WBlock方法了。


  1.   [FONT=courier new]
  2. Option Explicit

  3. '本例创建一个选择集并将选中的实体输出到一个外部文件。

  4. Sub Test()
  5.     ' 创建新的选择集
  6.     Dim sstext As AcadSelectionSet
  7.     Dim FilterType(0) As Integer
  8.     Dim FilterData(0) As Variant
  9.     Set sstext = ThisDrawing.SelectionSets.Add("SS2")
  10.     FilterType(0) = 0
  11.     FilterData(0) = "Circle"


  12.     ' 提示用户选择对象,并将其添加到选择集中。要完成选择,请按回车键。
  13.     sstext.SelectOnScreen FilterType, FilterData
  14.    
  15.     ' 将选择集中的对象输出到外部文件   
  16.     ThisDrawing.Wblock "C:\AutoCAD\WBlock_example.dwg", sstext
  17.    
  18. End Sub
  19.   [/FONT]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-5-16 08:42:04 | 显示全部楼层

  1.   [FONT=courier new]
  2. (defun cs_make_blk (cs_blkname cs_ss / cs_i cs_sslist cs_blk)
  3.   (cond
  4.     ((and (= (type cs_blkname) 'STR)
  5.           (= (type cs_ss) 'PICKSET)
  6.           (> (sslength cs_ss) 0)
  7.           )
  8.      (setq cs_i 0 cs_sslist '())
  9.      (repeat (sslength cs_ss)
  10.        (setq cs_sslist (cons (vlax-ename->vla-object (ssname cs_ss cs_i)) cs_sslist))
  11.        (setq cs_i (1+ cs_i))
  12.        )
  13.      (setq cs_ss (vlax-make-safearray vlax-vbObject (cons 0 (1- (length cs_sslist)))))
  14.      (setq cs_ss (vlax-safearray-fill cs_ss cs_sslist))
  15.      (if (setq cs_blk (cadblk cs_blkname))
  16.        (vlax-for myent cs_blk (vla-delete myent))
  17.        (setq cs_blk (vla-add (vla-get-blocks (caddoc)) (vlax-3D-point '(0 0 0)) cs_blkname))
  18.        )
  19.      (vla-CopyObjects (caddoc) cs_ss cs_blk)
  20.      (mapcar 'vla-delete cs_sslist)
  21.      (setq cs_blk cs_blk)
  22.      )
  23.     (t (setq cs_blk nil))
  24.     )
  25.   )
  26.   [/FONT]

cs_blkname.............块名,为字符串。
cs_ss......................LSP选择集。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 8个

财富等级: 恭喜发财

发表于 2003-5-16 09:08:34 | 显示全部楼层
cadblk ?谢谢
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-5-16 11:58:22 | 显示全部楼层
最初由 前生 发布
[B]cadblk ?谢谢 [/B]

这是我自己编的一个函数:

  1.   [FONT=courier new]
  2. (defun CADAPP ( / )  (vlax-get-acad-object))
  3. (defun caddoc ( / ) (vla-get-ActiveDocument (cadapp)))
  4. (defun cadblk (blkname / myblk)
  5.   (setq myblk (vl-catch-all-apply 'vla-item (list (vla-get-blocks (caddoc)) blkname)))
  6.   (if (vl-catch-all-error-p myblk)
  7.     (setq myblk nil)
  8.     (setq myblk myblk)
  9.     )
  10.   )
  11.   [/FONT]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-5-17 11:34:27 | 显示全部楼层
就是把选中的所有图形实体以所有实体的最左最下点为基点做成块

  1.   [FONT=courier new]
  2. Public Sub Create_Blk()
  3.    Dim entss As AcadSelectionSet
  4.    Dim i, snum As Integer '当前文档中选择集的个数
  5.    Dim existf As Boolean 'existf选择集存在与否的标志
  6.    Dim basept As Variant 'basept块的插入基点
  7.    Dim blk As AcadBlock
  8.    Dim length, width As Double
  9.    Dim blkname, blkDir As String 'blkname块名
  10.    Dim inpf As Boolean  'inpf为判断是否要重新输入块名的标志
  11.    Dim blkcollection() As Object
  12.    blkDir = InputBox("请输入保存块的目录", "输入存放块的目录", "d:")
  13.    Do
  14.      inpf = True
  15.      blkname = InputBox("请输入要建立的块的名字", "输入块的名字")
  16.      Dim fsox As New FileSystemObject
  17.      Set fsox = CreateObject("Scripting.FileSystemObject")
  18.      If fsox.FileExists(blkDir & blkname & ".dwg") = True Then
  19.        If MsgBox("块" & blkname & "已经存在,请重新输入块的名称", , "警告") = vbOK Then
  20.        inpf = False
  21.        End If
  22.      End If
  23.    Loop Until inpf = True
  24.    For snum = 0 To ThisDrawing.SelectionSets.Count - 1
  25.         If ThisDrawing.SelectionSets.Item(snum).name = "entss" Then
  26.           existf = True
  27.     Exit For
  28.         End If
  29.     Next
  30.     If existf = True Then
  31.         Set entss = ThisDrawing.SelectionSets.Item("entss")
  32.         entss.Clear
  33.     Else
  34.         Set entss = ThisDrawing.SelectionSets.Add("entss")
  35.     End If
  36.    entss.SelectOnScreen
  37.    '建立块blkname
  38.     basept = ThisDrawing.Get_minpt(entss) ‘所有实体的最左最下点为基点
  39.     Set blk = ThisDrawing.Blocks.Add(basept, blkname)
  40.     ReDim blkcollection(0 To entss.Count - 1) As Object
  41.     For i = 0 To entss.Count - 1
  42.        Set blkcollection(i) = entss.Item(i)
  43.     Next
  44.    
  45. ThisDrawing.CopyObjects blkcollection, blk '把所选的实体做成块
  46. If ThisDrawing.GetVariable("filedia") <> 0 Then
  47.   ThisDrawing.SetVariable "filedia", 0
  48. End If

  49. ThisDrawing.SendCommand "-wblock" & vbCr & blkDir & blkname & vbCr & " = " & vbCr

  50. End Sub
  51.   [/FONT]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 181个

财富等级: 日进斗金

发表于 2003-5-17 15:18:24 | 显示全部楼层
Dim fsox As New FileSystemObject
Set fsox = CreateObject("Scripting.FileSystemObject")
关于这两句的用法,如果第一句用New关键字字义了FileSystemObject对象,那么第二句就没必要编写了。而如果第一句是声明为:Dim fsox As Object,那第二句就是正确的用法,使用后期绑定。而如果第一句是声明为:Dim fsox As FileSystemObject,那么第二句为Set fsox = New FileSystemObject会更好一点,这是前期绑定的用法。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 8个

财富等级: 恭喜发财

发表于 2003-8-25 14:29:46 | 显示全部楼层
  1. (defun c:al-wblock ()

  2. (vl-load-com)

  3. (setq thisdrawing (vla-get-activedocument
  4.                        (vlax-get-acad-object)))

  5. (setq ssets (vla-get-selectionsets thisdrawing))

  6. (if (vl-catch-all-error-p
  7.     (vl-catch-all-apply 'vla-item (list ssets "$Set")))

  8.   (setq newSet (vla-add ssets "$Set"))
  9.   
  10.      (progn
  11.       
  12.             (vla-delete (vla-item ssets "$Set"))
  13.       
  14.           (setq newSet (vla-add ssets "$Set"))
  15.       
  16.      );progn

  17. );if

  18. ;select all objects in the drawing
  19. (vla-Select newSet acSelectionSetAll)

  20. (vla-WBlock thisdrawing "c:/test.dwg" newSet)

  21. (princ)

  22. );defun
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-22 18:41 , Processed in 0.275683 second(s), 49 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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