乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 122|回复: 9

求解答插入块后炸开问题。解决了1个还有1个问题

[复制链接]

6

主题

17

帖子

1

银币

初来乍到

Rank: 1

铜币
41
发表于 2006-7-7 17:20:00 | 显示全部楼层 |阅读模式
的程序主要功能是通过在屏幕上选择两个点定义矩形区域,将选中的图元按比例缩放限制在这个定义的矩形区域内。程序具体如下:
Sub adjust_scale()
    Dim ss As AcadSelectionSet
    Dim pt(0 To 2) As Double
    Dim i As Integer
   
    ThisDrawing.PurgeAll
   
    pt(0) = 0
    pt(1) = 0
    pt(2) = 0
   
    Dim bk As AcadBlock
   
    Set bk = ThisDrawing.Blocks.Add(pt, "tempblock")
   
    If ThisDrawing.SelectionSets.Count  0 Then
   
       For i = 0 To ThisDrawing.SelectionSets.Count - 1
           ThisDrawing.SelectionSets.Item(i).Delete
       Next
   
    End If
   
    Set ss = ThisDrawing.SelectionSets.Add("ssss")
   
    ss.SelectOnScreen
   
      
    ReDim retval(0 To ss.Count - 1) As AcadEntity
    For i = 0 To ss.Count - 1
        Set retval(i) = ss.Item(i)
    Next
   
        
    ThisDrawing.CopyObjects retval, bk
    Erase retval
   
    Dim c1 As Variant
    Dim c2 As Variant
   
    c1 = ThisDrawing.Utility.GetPoint(, "选择边界点1:")
    c2 = ThisDrawing.Utility.GetPoint(, "选择边界点2:")
   
    Dim d(1) As Double
   
    d(0) = VBA.Abs(c1(0) - c2(0))
    d(1) = VBA.Abs(c1(1) - c2(1))
   
      
    Dim entobj As AcadEntity
    Dim minext As Variant, maxext As Variant
    Dim a(2), b(2) As Double

    Set entobj = ss.Item(0)
    entobj.GetBoundingBox minext, maxext

    a(0) = maxext(0)
    a(1) = maxext(1)
    a(2) = maxext(2)
  
    b(0) = minext(0)
    b(1) = minext(1)
    b(2) = minext(2)
  
    For i = 1 To ss.Count - 1
      
       Set entobj = ss.Item(i)
       entobj.GetBoundingBox minext, maxext
     
       If a(0)  minext(0) Then
          b(0) = minext(0)
       End If
      
       If b(1) > minext(1) Then
          b(1) = minext(1)
       End If
     
     Next
      
     Dim e(1) As Double
      
     e(0) = VBA.Abs(b(0) - a(0))
     e(1) = VBA.Abs(b(1) - a(1))
      
    ss.Erase
        
    Dim inspt(2) As Double
    Dim blkrefobj As AcadBlockReference
   
    inspt(0) = 0: inspt(1) = 0: inspt(2) = 0
   
   
    Dim s As Double
    Dim smin As Double
     
    smin = d(1) / e(1)
     
    If smin > d(0) / e(0) Then
       smin = d(0) / e(0)
    End If
   
    s = smin
   
    Set blkrefobj = ThisDrawing.ModelSpace.InsertBlock(inspt, "tempblock", s, s, 1, 0)
   
    blkrefobj.Update
   
    blkrefobj.Explode   '运行此句总是出错,哪位大虾能帮助解决?
   
    blkrefobj.Delete
   
    Application.Update
   
    ThisDrawing.PurgeAll
   
    'Application.ZoomExtents
   
   
End Sub
另外,敢问斑竹块的插入点和显示位置有什么关系,怎么设置才对?
回复

使用道具 举报

6

主题

17

帖子

1

银币

初来乍到

Rank: 1

铜币
41
发表于 2006-7-7 23:08:00 | 显示全部楼层

1
回复

使用道具 举报

158

主题

2315

帖子

10

银币

顶梁支柱

Rank: 50Rank: 50

铜币
2951
发表于 2006-7-8 07:18:00 | 显示全部楼层
与插入点有关,你定义的插入点是原点。
可以将插入点定义在块的左下角。这样就可以与区域对应。
回复

使用道具 举报

6

主题

17

帖子

1

银币

初来乍到

Rank: 1

铜币
41
发表于 2006-7-8 18:00:00 | 显示全部楼层
感谢你的解答,我修改后的程序如下,插入点问题解决了,就是调试运行中执行blkrefobj.Explode   '运行此句总是出错,提示“输入无效”,请问是何原因?
Sub adjust_scale()
    Dim ss As AcadSelectionSet
    Dim pt(0 To 2) As Double
    Dim i As Integer
   
    ThisDrawing.PurgeAll
   
    If ThisDrawing.SelectionSets.Count  0 Then
   
       For i = 0 To ThisDrawing.SelectionSets.Count - 1
           ThisDrawing.SelectionSets.Item(i).Delete
       Next
   
    End If
   
    Set ss = ThisDrawing.SelectionSets.Add("ssss")
   
    ss.SelectOnScreen
   
      
    ReDim retval(0 To ss.Count - 1) As AcadEntity
    For i = 0 To ss.Count - 1
        Set retval(i) = ss.Item(i)
    Next
   
    Dim entobj As AcadEntity
    Dim minext As Variant, maxext As Variant
    Dim a(2), b(2) As Double

    Set entobj = ss.Item(0)
    entobj.GetBoundingBox minext, maxext

    a(0) = maxext(0)
    a(1) = maxext(1)
    a(2) = maxext(2)
  
    b(0) = minext(0)
    b(1) = minext(1)
    b(2) = minext(2)
  
    For i = 1 To ss.Count - 1
      
       Set entobj = ss.Item(i)
       entobj.GetBoundingBox minext, maxext
     
       If a(0)  minext(0) Then
          b(0) = minext(0)
       End If
      
       If b(1) > minext(1) Then
          b(1) = minext(1)
       End If
     
     Next
   
   
   
    pt(0) = b(0)
    pt(1) = b(1)
    pt(2) = b(2)
   
    Dim bk As AcadBlock
   
    Set bk = ThisDrawing.Blocks.Add(pt, "tempblock")
   
      
    ThisDrawing.CopyObjects retval, bk
    Erase retval
   
    ss.Erase
   
   
    Dim c1 As Variant
    Dim c2 As Variant
   
    c1 = ThisDrawing.Utility.GetPoint(, "选择边界点1:")
    c2 = ThisDrawing.Utility.GetPoint(, "选择边界点2:")
   
    Dim d(1) As Double
   
    d(0) = VBA.Abs(c1(0) - c2(0))
    d(1) = VBA.Abs(c1(1) - c2(1))
   
    Dim e(1) As Double
      
    e(0) = VBA.Abs(b(0) - a(0))
    e(1) = VBA.Abs(b(1) - a(1))
     
        
    Dim inspt(2) As Double
    Dim blkrefobj As AcadBlockReference
   
    inspt(0) = b(0): inspt(1) = b(1): inspt(2) = b(2)
   
   
    Dim s As Double
    Dim smin As Double
     
    smin = d(1) / e(1)
     
    If smin > d(0) / e(0) Then
       smin = d(0) / e(0)
    End If
   
    s = smin
   
    Set blkrefobj = ThisDrawing.ModelSpace.InsertBlock(inspt, "tempblock", s, s, 1, 0)
   
    blkrefobj.Update
   
    blkrefobj.Explode  '运行此句总是出错,提示“输入无效”
   
    blkrefobj.Delete
   
    Application.Update
   
    ThisDrawing.PurgeAll
   
    'Application.ZoomExtents
   
   
End Sub
回复

使用道具 举报

120

主题

326

帖子

7

银币

中流砥柱

Rank: 25

铜币
806
发表于 2006-7-9 08:43:00 | 显示全部楼层
我发的帖子比"求解答插入块问题。解决了1个还有1个问题"要早.可是你回答了他的问题.
我买的"Auto CAD VBA 二次开发教程"
运行14.4 使用ADODC控件示例程序出现以下错误
"无法装载这个对象,因为它不适用这台计算机。"
希望尽快解答,问题详见我发的帖子.
回复

使用道具 举报

1

主题

4

帖子

1

银币

初来乍到

Rank: 1

铜币
8
发表于 2006-7-9 09:17:00 | 显示全部楼层
兰州也有搞CAD开发的同人,倍感亲切
QQ:391652714
回复

使用道具 举报

6

主题

17

帖子

1

银币

初来乍到

Rank: 1

铜币
41
发表于 2006-7-9 10:24:00 | 显示全部楼层
解答问题也需要时间,我问的问题可能比较浅容易解答,希望兰州人见谅.另外,如果你能解决我的问题,本人也将感激不禁.毕竟来这里是互相切磋的.
回复

使用道具 举报

158

主题

2315

帖子

10

银币

顶梁支柱

Rank: 50Rank: 50

铜币
2951
发表于 2006-7-9 13:47:00 | 显示全部楼层
因为通过VBA使用XY不同比例插入的块,是不能用VBA的方法炸开的。
你可以使用SendCommand来完成。
回复

使用道具 举报

6

主题

17

帖子

1

银币

初来乍到

Rank: 1

铜币
41
发表于 2006-7-9 17:57:00 | 显示全部楼层
VBA会有这样的限制?
我也曾用过sendcommand语句,不过不是太会用.
我写的是:
ThisDrawing.SendCommand "_explode" + Chr(13)   执行此句时提示选择图元.
不知道如何自动将插入的图块作为选择集传递到explode命令中,只能在命令执行时根据提示再人工选择插入的图块.而我不想有这样的交互过程.
能根据我的程序给一个具体的代码吗?
回复

使用道具 举报

7

主题

51

帖子

2

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
79
发表于 2006-7-10 11:37:00 | 显示全部楼层
跟上实体的句柄 就不会有交互了
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-7-5 23:55 , Processed in 0.996480 second(s), 72 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表