求解答插入块后炸开问题。解决了1个还有1个问题
本帖最后由 作者 于 2006-7-9 10:31:03 编辑 <br /><br /> <P>的程序主要功能是通过在屏幕上选择两个点定义矩形区域,将选中的图元按比例缩放限制在这个定义的矩形区域内。程序具体如下:</P><P>Sub adjust_scale()</P>
<P> Dim ss As AcadSelectionSet<BR> Dim pt(0 To 2) As Double<BR> Dim i As Integer<BR> <BR> ThisDrawing.PurgeAll<BR> <BR> pt(0) = 0<BR> pt(1) = 0<BR> pt(2) = 0<BR> <BR> Dim bk As AcadBlock<BR> <BR> Set bk = ThisDrawing.Blocks.Add(pt, "tempblock")<BR> <BR> If ThisDrawing.SelectionSets.Count <> 0 Then<BR> <BR> For i = 0 To ThisDrawing.SelectionSets.Count - 1<BR> ThisDrawing.SelectionSets.Item(i).Delete<BR> Next<BR> <BR> End If<BR> <BR> Set ss = ThisDrawing.SelectionSets.Add("ssss")<BR> <BR> ss.SelectOnScreen<BR> <BR> <BR> ReDim retval(0 To ss.Count - 1) As AcadEntity<BR> For i = 0 To ss.Count - 1<BR> Set retval(i) = ss.Item(i)<BR> Next<BR> <BR> <BR> ThisDrawing.CopyObjects retval, bk<BR> Erase retval<BR> <BR> Dim c1 As Variant<BR> Dim c2 As Variant<BR> <BR> c1 = ThisDrawing.Utility.GetPoint(, "选择边界点1:")<BR> c2 = ThisDrawing.Utility.GetPoint(, "选择边界点2:")<BR> <BR> Dim d(1) As Double<BR> <BR> d(0) = VBA.Abs(c1(0) - c2(0))<BR> d(1) = VBA.Abs(c1(1) - c2(1))<BR> <BR> <BR> Dim entobj As AcadEntity<BR> Dim minext As Variant, maxext As Variant<BR> Dim a(2), b(2) As Double<BR> <BR> Set entobj = ss.Item(0)<BR> entobj.GetBoundingBox minext, maxext<BR> <BR> a(0) = maxext(0)<BR> a(1) = maxext(1)<BR> a(2) = maxext(2)<BR> <BR> b(0) = minext(0)<BR> b(1) = minext(1)<BR> b(2) = minext(2)<BR> <BR> For i = 1 To ss.Count - 1<BR> <BR> Set entobj = ss.Item(i)<BR> entobj.GetBoundingBox minext, maxext<BR> <BR> If a(0) < maxext(0) Then<BR> a(0) = maxext(0)<BR> End If<BR> <BR> If a(1) < maxext(1) Then<BR> a(1) = maxext(1)<BR> End If<BR> <BR> If b(0) > minext(0) Then<BR> b(0) = minext(0)<BR> End If<BR> <BR> If b(1) > minext(1) Then<BR> b(1) = minext(1)<BR> End If<BR> <BR> Next<BR> <BR> Dim e(1) As Double<BR> <BR> e(0) = VBA.Abs(b(0) - a(0))<BR> e(1) = VBA.Abs(b(1) - a(1))<BR> <BR> ss.Erase<BR> <BR> Dim inspt(2) As Double<BR> Dim blkrefobj As AcadBlockReference<BR> <BR> inspt(0) = 0: inspt(1) = 0: inspt(2) = 0<BR> <BR> <BR> Dim s As Double<BR> Dim smin As Double<BR> <BR> smin = d(1) / e(1)<BR> <BR> If smin > d(0) / e(0) Then<BR> smin = d(0) / e(0)<BR> End If<BR> <BR> s = smin<BR> <BR> Set blkrefobj = ThisDrawing.ModelSpace.InsertBlock(inspt, "tempblock", s, s, 1, 0)<BR> <BR> blkrefobj.Update<BR> <BR> blkrefobj.Explode '运行此句总是出错,哪位大虾能帮助解决?<BR> <BR> blkrefobj.Delete<BR> <BR> Application.Update<BR> <BR> ThisDrawing.PurgeAll<BR> <BR> 'Application.ZoomExtents<BR> <BR> <BR>End Sub</P>
<P>另外,敢问斑竹块的插入点和显示位置有什么关系,怎么设置才对?</P> 本帖最后由 作者 于 2006-7-7 23:53:39 编辑 <br /><br /> 1<BR> <P>与插入点有关,你定义的插入点是原点。</P>
<P>可以将插入点定义在块的左下角。这样就可以与区域对应。</P> <P>感谢你的解答,我修改后的程序如下,插入点问题解决了,就是调试运行中执行<A name=22525>blkrefobj.Explode '运行此句总是出错,提示“输入无效”,请问是何原因?</A></P>
<P>Sub adjust_scale()</P>
<P> Dim ss As AcadSelectionSet<BR> Dim pt(0 To 2) As Double<BR> Dim i As Integer<BR> <BR> ThisDrawing.PurgeAll<BR> <BR> If ThisDrawing.SelectionSets.Count <> 0 Then<BR> <BR> For i = 0 To ThisDrawing.SelectionSets.Count - 1<BR> ThisDrawing.SelectionSets.Item(i).Delete<BR> Next<BR> <BR> End If<BR> <BR> Set ss = ThisDrawing.SelectionSets.Add("ssss")<BR> <BR> ss.SelectOnScreen<BR> <BR> <BR> ReDim retval(0 To ss.Count - 1) As AcadEntity<BR> For i = 0 To ss.Count - 1<BR> Set retval(i) = ss.Item(i)<BR> Next<BR> <BR> Dim entobj As AcadEntity<BR> Dim minext As Variant, maxext As Variant<BR> Dim a(2), b(2) As Double<BR> <BR> Set entobj = ss.Item(0)<BR> entobj.GetBoundingBox minext, maxext<BR> <BR> a(0) = maxext(0)<BR> a(1) = maxext(1)<BR> a(2) = maxext(2)<BR> <BR> b(0) = minext(0)<BR> b(1) = minext(1)<BR> b(2) = minext(2)<BR> <BR> For i = 1 To ss.Count - 1<BR> <BR> Set entobj = ss.Item(i)<BR> entobj.GetBoundingBox minext, maxext<BR> <BR> If a(0) < maxext(0) Then<BR> a(0) = maxext(0)<BR> End If<BR> <BR> If a(1) < maxext(1) Then<BR> a(1) = maxext(1)<BR> End If<BR> <BR> If b(0) > minext(0) Then<BR> b(0) = minext(0)<BR> End If<BR> <BR> If b(1) > minext(1) Then<BR> b(1) = minext(1)<BR> End If<BR> <BR> Next<BR> <BR> <BR> <BR> pt(0) = b(0)<BR> pt(1) = b(1)<BR> pt(2) = b(2)<BR> <BR> Dim bk As AcadBlock<BR> <BR> Set bk = ThisDrawing.Blocks.Add(pt, "tempblock")<BR> <BR> <BR> ThisDrawing.CopyObjects retval, bk<BR> Erase retval<BR> <BR> ss.Erase<BR> <BR> <BR> Dim c1 As Variant<BR> Dim c2 As Variant<BR> <BR> c1 = ThisDrawing.Utility.GetPoint(, "选择边界点1:")<BR> c2 = ThisDrawing.Utility.GetPoint(, "选择边界点2:")<BR> <BR> Dim d(1) As Double<BR> <BR> d(0) = VBA.Abs(c1(0) - c2(0))<BR> d(1) = VBA.Abs(c1(1) - c2(1))<BR> <BR> Dim e(1) As Double<BR> <BR> e(0) = VBA.Abs(b(0) - a(0))<BR> e(1) = VBA.Abs(b(1) - a(1))<BR> <BR> <BR> Dim inspt(2) As Double<BR> Dim blkrefobj As AcadBlockReference<BR> <BR> inspt(0) = b(0): inspt(1) = b(1): inspt(2) = b(2)<BR> <BR> <BR> Dim s As Double<BR> Dim smin As Double<BR> <BR> smin = d(1) / e(1)<BR> <BR> If smin > d(0) / e(0) Then<BR> smin = d(0) / e(0)<BR> End If<BR> <BR> s = smin<BR> <BR> Set blkrefobj = ThisDrawing.ModelSpace.InsertBlock(inspt, "tempblock", s, s, 1, 0)<BR> <BR> blkrefobj.Update<BR> <BR> blkrefobj.Explode '运行此句总是出错,提示“输入无效”<BR> <BR> blkrefobj.Delete<BR> <BR> Application.Update<BR> <BR> ThisDrawing.PurgeAll<BR> <BR> 'Application.ZoomExtents<BR> <BR> <BR>End Sub</P> <P><STRONG>我发的帖子比"求解答插入块问题。解决了1个还有1个问题"要早.可是你回答了他的问题.</STRONG></P>
<P><STRONG>我买的"Auto CAD VBA 二次开发教程"</STRONG></P>
<P><STRONG>运行14.4 使用ADODC控件示例程序出现以下错误</STRONG></P>
<P><STRONG>"无法装载这个对象,因为它不适用这台计算机。"</STRONG></P>
<P><STRONG>希望尽快解答,问题详见我发的帖子.</STRONG></P> <P>兰州也有搞CAD开发的同人,倍感亲切</P>
<P>QQ:391652714</P> <P>解答问题也需要时间,我问的问题可能比较浅容易解答,希望兰州人见谅.另外,如果你能解决我的问题,本人也将感激不禁.毕竟来这里是互相切磋的.</P> <P>因为通过VBA使用XY不同比例插入的块,是不能用VBA的方法炸开的。</P>
<P>你可以使用SendCommand来完成。</P> <P>VBA会有这样的限制?</P>
<P>我也曾用过sendcommand语句,不过不是太会用.</P>
<P>我写的是:</P>
<P>ThisDrawing.SendCommand "_explode" + Chr(13) 执行此句时提示选择图元.</P>
<P>不知道如何自动将插入的图块作为选择集传递到explode命令中,只能在命令执行时根据提示再人工选择插入的图块.而我不想有这样的交互过程.</P>
<P>能根据我的程序给一个具体的代码吗?</P> <P>跟上实体的句柄 就不会有交互了 </P>
页:
[1]
2