找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1013|回复: 9

[求助]:程序调试是成功的,可是显示图形结果却是好几个图形重叠的。。。。昏!帮我!

[复制链接]
发表于 2002-12-20 23:16:54 | 显示全部楼层 |阅读模式

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

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

×
我在该程序里使用啦图块引用,问题大概就是出在那个地方,烦请各位大侠帮我看看,因为有窗体和数据库,我将该程序压缩上传啦!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 181个

财富等级: 日进斗金

发表于 2002-12-21 09:13:31 | 显示全部楼层
重叠是因为对块重复添加直线,而原来的实体还存在的原因。对于这种块不是固定大小的,一种是不做成块,另一种是做成匿名块,有关匿名块的制作,可以查看相关的主题。
下面是部分代码的修改。

  1.   [FONT=courier new]
  2. Dim blkobj As AcadBlock
  3. Dim inspnt(0 To 2) As Double
  4. inspnt(0) = 0: inspnt(1) = 0: inspnt(2) = 0
  5. Set blkobj = ThisDrawing.Blocks.Add(inspnt, "*U") '这里用*号跟一个字母代表匿名块的名称规则,具体的名称还要看生成块以后的名称,它的后面有一个数字。

  6. Dim blkrefobj As AcadBlockReference
  7. Set blkrefobj = ThisDrawing.ModelSpace.InsertBlock(insertpnt, blkobj.Name, xscale, yscale, 1#, rotangle) '这里直接引用匿名块的名称。

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

使用道具 举报

发表于 2002-12-21 11:19:12 | 显示全部楼层
我是这样做的
Dim ent As AcadEntity
   
    For Each allEnt In ThisDrawing.ModelSpace
               If StrComp(allEnt.EntityName, "AcDbBlockReference", 1) = 0 Then
               Set blkRefObj = allEnt
                        If StrComp(blkRefObj.Name, "wg", 1) = 0 Then
    GoTo 123:
    End If
     End If
     Next
123:
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2002-12-21 13:31:55 | 显示全部楼层
efan2000的方法真的简洁,很好用!谢谢你

fij_ok的方法给我啦许多提示,也谢谢你!你那一段我觉得这样更好:
Dim blkobj As AcadBlock
Dim inspnt(0 To 2) As Double
Dim allent As AcadEntity
Dim blkrefobj As AcadBlockReference
Dim blkcount As Integer
Dim blkname As String

blkcount = 0
   For Each allent In ThisDrawing.ModelSpace
         If StrComp(allent.EntityName, "AcDbBlockReference", 1) = 0 Then
            Set blkrefobj = allent
           If StrComp(Left(blkrefobj.Name, 9), "zhoucheng", 1) = 0 Then
              blkcount = blkcount + 1

           End If
         End If
   Next
blkcount = blkcount + 1

inspnt(0) = 0: inspnt(1) = 0: inspnt(2) = 0
blkname = "zhoucheng" & blkcount
Set blkobj = ThisDrawing.Blocks.Add(inspnt, blkname)
我用efan2000的方法和这个程序段都调成功啦!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 181个

财富等级: 日进斗金

发表于 2002-12-21 13:43:23 | 显示全部楼层
你用的CAD版本应该是R14.01的吧。
对于一个实体对象的EntityName(实体名称),在R2000的版本已不支持,统一改为用ObjectName(对象名称)。
因而,如果程序要运行在不同的CAD版本下,请注意各个版本之间的一些变化。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2002-12-21 15:12:12 | 显示全部楼层
呵呵,我用的是2000,entityname也能用。

刚才我用这段程序发现有个问题:
Dim blkobj As AcadBlock
Dim inspnt(0 To 2) As Double
Dim allent As AcadEntity
Dim blkrefobj As AcadBlockReference
Dim blkcount As Integer
Dim blkname As String

blkcount = 0
For Each allent In ThisDrawing.ModelSpace
If StrComp(allent.EntityName, "AcDbBlockReference", 1) = 0 Then
Set blkrefobj = allent
If StrComp(Left(blkrefobj.Name, 9), "zhoucheng", 1) = 0 Then
blkcount = blkcount + 1

End If
End If
Next
blkcount = blkcount + 1

inspnt(0) = 0: inspnt(1) = 0: inspnt(2) = 0
blkname = "zhoucheng" & blkcount
Set blkobj = ThisDrawing.Blocks.Add(inspnt, blkname

当我在同一drawing1上画该图型的时候,如果我又删除已画好的图形,再去执行该程序时就又会出现块重复现象,这是因为块还存在,那我又该怎样去修改这段代码呢?efan2000,如果用你的匿名图块会不会出现这问题?我在明经看到你对匿名图块的较详细解释,其中这一句:。。。在块集合中,匿名块的名称从第三位后必为数字,最新创建的匿名块必为最大的数字,但要保证创建后没有删除该块,否则返回的就是以前创建的了。
。。。。是不是也会遇到同样的问题?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 181个

财富等级: 日进斗金

发表于 2002-12-21 16:13:44 | 显示全部楼层
不会出现这种情况,因为即使块被删除了,但它后面的数字依然是递增的。在CAD中,所有的标注对象都是用这种方式。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2002-12-24 18:53:55 | 显示全部楼层
对于尺寸标注而言,匿名图块的用处是很大,主要是因为尺寸图块的块名没有任何意义。
而对于某些图块,当需要图块名的时候,采用匿名图块就不太合适啦,我发现采取别的办法也可以做到不出现块重复的问题,不过还是有一点局性。

[CODE]
mm=val(userform1.combobox1.text) '块名也可以用其它方式表达

dim flagno as integer
flagno=0

Dim iblock As Integer
iblock = ThisDrawing.Blocks.count

While (iblock > 0)
If ThisDrawing.Blocks.Item(iblock - 1).Name = mm Then
flagno = 1
End If
iblock = iblock - 1
Wend

If flagno = 0 Then
......没有图块,就在块中绘制图象
end if
.......图块存在,就直接插入

用这段代码不会出现块重复现象,但是如果想将块里实体放大或者缩小,好象不能做到。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

已领礼包: 181个

财富等级: 日进斗金

发表于 2002-12-25 13:04:35 | 显示全部楼层
提供两个判断块是否存在的函数。

  1.   [FONT=courier new]
  2. ' 这种是比较安全的作法。
  3. Function BlockExists(ByVal Name As String) As Boolean
  4.     BlockExists = False
  5.     Dim BlockObj As AcadBlock
  6.    
  7.     On Error GoTo ErrTrap
  8.     For Each BlockObj In ThisDrawing.Blocks
  9.         If StrComp(BlockObj.Name, Name, vbTextCompare) = 0 Then
  10.             BlockExists = True
  11.             Exit For
  12.         End If
  13.     Next
  14.     Set BlockObj = Nothing
  15.     Exit Function

  16. ErrTrap:
  17.     On Error GoTo 0
  18. End Function
  19.   [/FONT]

  1.   [FONT=courier new]
  2. ' 这种是通过捕获错误来判断块是否存在。
  3. Function BlockExists(ByVal Name As String) As Boolean
  4.     BlockExists = False
  5.     Dim BlockObj As AcadBlock
  6.    
  7.     On Error Resume Next
  8.     Set BlockObj = ThisDrawing.Blocks(Name)
  9.     If Err.Number <> 0 Then GoTo ErrTrap
  10.     BlockExists = True
  11.     Set BlockObj = Nothing
  12.     Exit Function

  13. ErrTrap:
  14.     On Error GoTo 0
  15. End Function
  16.   [/FONT]


对于块中的实体,跟模型的操作是一样的。一是直接在块中对其操作,二是用ThisDrawing.Utility.GetSubEntity对块引用中的实体操作,这种操作将直接影响到块中的实体。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-22 07:22 , Processed in 0.197025 second(s), 47 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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