乐筑天下

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

圖塊會增加

[复制链接]

68

主题

177

帖子

4

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
449
发表于 2006-4-10 11:50:00 | 显示全部楼层 |阅读模式
本人写了如下一个VBA程式,就是将所选物体变成一个螺丝孔,但是出现了下面一些问题
假如先画一个圆,第一次将其变成m8,这一次很理想,而再次将m8变成m10就将不理想了,它生成了一个由m8和m10组成的块,我以为是没有删除以前块的原因,於是加了下面绿色的程式,可是还是没有用,请知道原因的老大多多指教,谢谢
Public Sub tt1()        '以下是变为各种螺丝调用程式
Dim r  As Double
On Error Resume Next
Dim sr As String
Dim zm As String
Dim shuz As Double
sr = InputBox("请输入人要变的东东", "变变", "")
zm = Mid(sr, 1, 1)
shuz = Mid(sr, 2)
If zm = "m" Then
     If shuz = 5 Then
     yj = 4.3
     End If
     If shuz = 6 Then
     yj = 5.2
     End If
     If shuz = 8 Then
     yj = 6.8
     End If
     If shuz = 10 Then
     yj = 8.6
     End If
     If shuz = 12 Then
     yj = 10.5
     End If
     If shuz = 14 Then
     yj = 12.5
     End If
     Call gy1(shuz)
End If
If zm = "u" Then '以下是正面沉头的调用公式
     Call u(shuz)
Else
     Call gy(Val(sr))   '这是变为圆的调用程式
End If
End Sub
Public Sub gy1(ls As Double)
On Error Resume Next
Dim ssetobj1 As AcadSelectionSet      '以下是画螺丝的共用程式
Dim icount1 As Integer
Dim i1 As Integer
Dim selobj1 As AcadObject
Dim blockobj As AcadBlock
Dim insertpoint(0 To 2) As Double
Dim i As Integer
Dim blockrefobj As AcadBlockReference
icount1 = ThisDrawing.SelectionSets.Count
While (icount1 > 0)
    If ThisDrawing.SelectionSets.Item(icount1 - 1).Name = "yuan" Then
    ThisDrawing.SelectionSets.Item(icount1 - 1).Delete
    End If
    icount1 = icount1 - 1
    Wend
    Set ssetobj1 = ThisDrawing.SelectionSets.Add("yuan")
    ThisDrawing.Utility.Prompt "please select object"
    ssetobj1.SelectOnScreen
  Const pi = 3.141592654
  
  insertpoint(0) = 0
  insertpoint(1) = 0
  insertpoint(2) = 0
  i = ThisDrawing.Blocks.Count
    While (i > 0)
      If ThisDrawing.Blocks.Item(i - 1).Name = "luosi" Then
             ThisDrawing.Blocks.Item(i - 1).Delete
       End If
       i = i - 1
       Wend
  Set blockobj = ThisDrawing.Blocks.Add(insertpoint, "luosi")
  Set arc1 = blockobj.AddArc(insertpoint, ls / 2, pi, pi / 2)
  Set circ1 = blockobj.AddCircle(insertpoint, yj / 2)
  For i1 = 0 To ssetobj1.Count - 1
      Set selobj1 = ssetobj1.Item(i1)
  If selobj1.ObjectName = "AcDbCircle" Or selobj1.ObjectName = "AcDbCrc" Then
      pt1 = selobj1.Center
  Else
      pt1 = selobj1.InsertionPoint
  End If
Set blockrefobj = ThisDrawing.ModelSpace.InsertBlock(pt1, "luosi", 1#, 1#, 1#, 0)
       selobj1.Delete
   
      Next
End Sub
回复

使用道具 举报

68

主题

177

帖子

4

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
449
发表于 2006-4-10 22:33:00 | 显示全部楼层
这么多朋友看过都没有大师回答,还是请请教一下版主,希望版主能帮我一个忙,在此感谢
回复

使用道具 举报

158

主题

2315

帖子

10

银币

顶梁支柱

Rank: 50Rank: 50

铜币
2951
发表于 2006-4-11 06:48:00 | 显示全部楼层
需要保证你所建的图块没有被插入到图面中才能对块进行删除。
如果块删除不了,则会在下次使用时直接往里面添加东西。
你可以在找到块时,不去删除它,而是把它里面的图元都删除掉。然后再加入新的图元。
回复

使用道具 举报

68

主题

177

帖子

4

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
449
发表于 2006-4-11 09:06:00 | 显示全部楼层
版主你好,本人明白了你的意思,操作了一翻,但还是不成功,还是每次都会在上次的块里加东西,不知道是否可以劳驾一下版主在本人上面的程式中改一个地方,并用红色标示一下,多谢你
回复

使用道具 举报

72

主题

2726

帖子

9

银币

社区元老

Rank: 75Rank: 75Rank: 75

铜币
3014
发表于 2006-4-11 11:13:00 | 显示全部楼层
感觉你的问题最好使用无名块,
回复

使用道具 举报

68

主题

177

帖子

4

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
449
发表于 2006-4-11 11:46:00 | 显示全部楼层
版主你好,无名块也试过,好象没有反应
请问各版主及管理员还有各位朋友是否有好方法,感谢万分

回复

使用道具 举报

158

主题

2315

帖子

10

银币

顶梁支柱

Rank: 50Rank: 50

铜币
2951
发表于 2006-4-11 18:35:00 | 显示全部楼层
随便改的:
  1. Public Sub tt1()        '以下是变为各种螺丝调用程式
  2. Dim R  As Double
  3. On Error Resume Next
  4. Dim Sr As String
  5. Dim Zm As String
  6. Dim Shuz As Integer
  7. Dim Yj As Double
  8. Sr = InputBox("请输入人要变的东东", "变变", "")
  9. Zm = Left(Sr, 1)
  10. Shuz = Mid(Sr, 2)
  11. Select Case Zm
  12.     Case "m"
  13.     Select Case Shuz
  14.         Case 5
  15.             Yj = 4.3
  16.         Case 6
  17.             Yj = 5.2
  18.         Case 8
  19.             Yj = 6.8
  20.         Case 10
  21.             Yj = 8.6
  22.         Case 12
  23.             Yj = 10.5
  24.         Case 14
  25.             Yj = 12.5
  26.     End Select
  27.      Call Gy1(Shuz, Yj)
  28.     Case "u"  '以下是正面沉头的调用公式
  29.      'Call u(shuz)
  30.     Case Else
  31.     'Call gy(Val(sr))   '这是变为圆的调用程式
  32. End Select
  33. End Sub
  34. Public Sub Gy1(Ls As Integer, Yj As Double)
  35. On Error Resume Next
  36. Dim SSetObj1 As AcadSelectionSet      '以下是画螺丝的共用程式
  37. Dim I1 As Integer
  38. Dim SelObj1 As AcadObject
  39. Dim blockObj As AcadBlock
  40. Dim InsertPoint(0 To 2) As Double
  41. Dim i As Integer
  42. Dim BlockRefObj As AcadBlockReference
  43. Dim Pt1 As Variant
  44. Const PI = 3.141592654
  45.     ThisDrawing.SelectionSets("yuan").Delete
  46.     Err.Clear
  47.     Set SSetObj1 = ThisDrawing.SelectionSets.Add("yuan")
  48.     ThisDrawing.Utility.Prompt "please select object"
  49.     SSetObj1.SelectOnScreen
  50.   
  51.     InsertPoint(0) = InsertPoint(1) = InsertPoint(2) = 0
  52.    
  53.     Set blockObj = ThisDrawing.Blocks("luosi" & Ls)
  54.     If Err Then
  55.         Err.Clear
  56.         Set blockObj = ThisDrawing.Blocks.Add(InsertPoint, "luosi" & Ls)
  57.         blockObj.AddArc InsertPoint, Ls / 2, PI, PI / 2
  58.         blockObj.AddCircle InsertPoint, Yj / 2
  59.     End If
  60.   
  61.     For I1 = 0 To SSetObj1.Count - 1
  62.         Set SelObj1 = SSetObj1.Item(I1)
  63.         If SelObj1.ObjectName = "AcDbCircle" Or SelObj1.ObjectName = "AcDbCrc" Then
  64.             Pt1 = SelObj1.Center
  65.             Set BlockRefObj = ThisDrawing.ModelSpace.InsertBlock(Pt1, "luosi" & Ls, 1#, 1#, 1#, 0)
  66.         End If
  67.        SelObj1.Delete
  68.    
  69.       Next
  70. End Sub
按照你的情形,需要定义几个型号螺丝的图块,所以用无名块也不好,只用一个块也不好。我是按照你需要多少个型号就定义多少个。每个图块只定义一次就够了,下次用的时间由程序检测是否存在该名称的图块就OK。
回复

使用道具 举报

68

主题

177

帖子

4

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
449
发表于 2006-4-11 22:41:00 | 显示全部楼层
管理员你好:
你的方法我试过了,不知道你调试的是不是可以,我这边调试的结果还是不尽如意,都是第一次变化的时候可以,而第二次将m8变成m10的结果我们的刚好相反,你的是把东西都删完,而我的是多加了一个m10到图块中,结果都不如意,真闷!!,不过还是相当感谢管理员及任何一个帮助我的朋友,希望管理员或版主还可以继续帮助,谢谢!!
回复

使用道具 举报

158

主题

2315

帖子

10

银币

顶梁支柱

Rank: 50Rank: 50

铜币
2951
发表于 2006-4-11 22:53:00 | 显示全部楼层
搞不清楚你需要什么样的程序。
我的程序是这样的:
1.出现对话框,用户输入象m8,m10这样的字符。
2.让用户选择图面上的圆。
3.判断图块中是否有指定的图块,如果没有,则建该图块,如果有则跳过。
4.插入指定的图块。
这里,图块有m5,m6,m8,m10,m12,m14等多种,它们之间并不存在任何关系。
我的程序运行并不会因为插入m10时会把原先的m8给删除掉。因为它们之间不存在关系。
可能我还没有理解你需要什么样的程序。
看看我生成的图,有m8,m10和m6三种,其中m8是分两次选择生成的。它们并不相互干涉。

zy14vioikjo.jpg

zy14vioikjo.jpg

回复

使用道具 举报

68

主题

177

帖子

4

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
449
发表于 2006-4-11 23:05:00 | 显示全部楼层
管理员你太好了,这么快就回了,在这里我真的很感谢你
不过管理员的想法和我的是不太一样,我的想法是,假如第一次是将选中的圆变为m8,而第二次选择的对象不一定是一个圆,有可能是选我刚变过的m8,而管理员的程式在选择刚变过的m8时就将其删除了,没有将m8变成m10了
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-7-5 12:20 , Processed in 0.575255 second(s), 75 queries .

© 2020-2025 乐筑天下

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