明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2512|回复: 10

为什么用offset 方法得到的物体不可以編輯

[复制链接]
发表于 2006-4-20 20:50:00 | 显示全部楼层 |阅读模式
本人今天做了一个程序,用了offset方法,基本思路就是我选择一个物体,然后将其复制到其它几个图层,然后有三个图层需要用offest方法将复制过来的东西偏,实际操作中我发现它不一定偏大,当然也有大的时候,因为我知道是形状的原因,于是我做了一个这样一个处理 :假如偏出来的东西面积比以前小,我就将其删除,再重新offset( -a ), 想法是好,可是遇到这样一个问题,就是用offset方法偏过后的东西跟本不存在Area 这个属性,都不可以用Delete方法(令我甚是失望),我才知道原来offset过的东西不可以编辑了(也不可以explode),请管理员或大师指点怎么可以得到偏过后东西的面积并删除它,总之可以有编辑的方法,多谢各位!
发现下面红色程式处有问题
  1. Public Sub chongcai()
  2. On Error Resume Next
  3. Dim ssetobj As AcadSelectionSet
  4. Dim Ftype(1) As Integer
  5. Dim Fdata(1) As Variant
  6. ThisDrawing.SelectionSets("chongcaiss").Delete
  7. If Err Then
  8. Err.Clear
  9. End If
  10. Ftype(0) = 0
  11. Fdata(0) = "*"
  12. Ftype(1) = 8
  13. Fdata(1) = "SIDE"
  14. Set ssetobj = ThisDrawing.SelectionSets.Add("chongcaiss")
  15. ssetobj.SelectOnScreen Ftype, Fdata
  16. Dim selobj As AcadObject
  17. Dim I As Integer
  18. For I = 0 To ssetobj.Count - 1
  19.     Set selobj = ssetobj.Item(I)
  20.     Dim cpPH As AcadObject, cpPPS As AcadObject, cpPS As AcadObject, cpDIE As AcadObject, cpLB As AcadObject, cpLP As AcadObject
  21.     Set cpPH = selobj.Copy: Set cpPPS = selobj.Copy: Set cpPS = selobj.Copy: Set cpDIE = selobj.Copy: Set cpLB = selobj.Copy: Set cpLP = selobj.Copy
  22.     cpPH.Layer = "PH": cpPPS.Layer = "PPS": cpPS.Layer = "PS": cpDIE.Layer = "DIE": cpLB.Layer = "LB": cpLP.Layer = "LP"
  23.     Dim ccpps As AcadObject, cclb As AcadObject, cclp As AcadObject
  24.     Set ccpps = cpPPS.Offset(0.5): Set cclb = cpLB.Offset(0.5): Set cclp = cpLP.Offset(1)
  25.     If ccpps.Area < selobj.Area Then
  26.     ccpps.Delete: cclb.Delete: cclp.Delete
  27.     cpPPS.Offset (-0.5): cpLB.Offset (-0.5): cpLP.Offset (-1)
  28.     End If
  29.     cpPPS.Delete: cpLB.Delete: cpLP.Delete
  30. Next
  31. End Sub
发表于 2006-4-21 07:03:00 | 显示全部楼层
你要注意偏移后所返回的数据格式。因为偏移有可能会返回超过1个对象,所以这里使用的是对象数组,而不是你程序中反映的只是一个对象。
 楼主| 发表于 2006-4-21 11:03:00 | 显示全部楼层

管理员,我现在偏的是聚合线,就象长方形之类的,当然几边形是不定的,你能不能提供一种方法得到偏出后图形的面积,并把偏出来的多边形删除(因为偏出来的不理想)

发表于 2006-4-21 15:39:00 | 显示全部楼层

 

    If ccpps.Area < selobj.Area Then
    ccpps.Delete......

改成

    If ccpps(0).Area < selobj.Area Then
    ccpps(0).Delete......

 

 楼主| 发表于 2006-4-22 11:58:00 | 显示全部楼层
4楼的兄弟的方法我试过了,没有用的,生成了两个,幵始生成的还是不能编辑(删除不掉),管理员能不能提供一种方法
 楼主| 发表于 2006-4-22 13:39:00 | 显示全部楼层

管理员,这个问题仍然没有人可以回答,你可以帮我想想办法吗

发表于 2006-4-22 18:03:00 | 显示全部楼层

你要理解对象数组的概念。对象偏移后,不管是生成了一个对象或一个以上的对象,都是以对象数组的方式返回的。
假设返回的对象数组为:
RetVal
可以通过Ubound(RetVal)函数来读取返回对象的数量。
通过RetVal(0)来取得第一个返回的对象。通过它就可以对该对象进行一系列的操作了。

另外,你的程序中不要一开始就来个On Error Resume Next
这样不利于你对程序的调试。什么错误都忽略过去了,你自己还不知道哪里出错。

 楼主| 发表于 2006-4-23 16:22:00 | 显示全部楼层

管理员多谢指教,我搞定了,不过我有点不理解你讲的对象数组,它和一般数组有什么区别,模型空间点中一个点的数组能不能称对象数组?麻烦管理员能浪费几分钟时间给我解释,如果有大师能指点,那希望大师也可以指点一二,谢谢

发表于 2006-4-23 16:48:00 | 显示全部楼层
对象数组本身就是数组,只不过这样的数组是用来存放对象这样的数组的。
 楼主| 发表于 2006-4-24 11:07:00 | 显示全部楼层

管理员,顺便请教你一下关於数组定义的问题,为什么有些数组必须定义成 variant

而有些数组必须定义成double或其它类

如取得一个圆的圆心,这时这个点必须是variant

dim  pt as variant

pt=selobj.center

而画一个圆时,这是定义它必须是double

dim pta(0 to 2) as double

dim circ as acadcircle

set circ=thisdrawing.modelspace.addcircle(pta,0.5)

都是一个三维数组,为什么要定义的不一样,能不能帮我解释一下 ,谢谢!

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

本版积分规则

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

GMT+8, 2024-11-27 04:19 , Processed in 0.191532 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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