QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

查看: 1975|回复: 3
收起左侧

[讨论] 如何用二次开发方法定义块

[复制链接]
发表于 2008-10-28 08:02:35 | 显示全部楼层 |阅读模式 来自: 中国山东烟台

马上注册,结识高手,享用更多资源,轻松玩转三维网社区。

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

x
思路是这样的:在二次开发的程序中,对正画的实体想定义成块,如何实现呢
发表于 2008-10-28 11:23:17 | 显示全部楼层 来自: 中国辽宁营口
楼主的意思是否可以这样理解:模仿CAD的“BLOCK”命令用现有实体创建块?2 S* l* p  N8 W% i: Q
在VBA中可以这样做:
! H, W: m% ~. P1 e( M( z0 p一、用对话框要求用户输入要创建的块对象的属性(包括块名称、基点等等)、原有实体的处理方法(包括保留、删除、转换为块等)
6 ]2 {( ?3 O7 [5 B二、在用户按下“确定”按钮时判断当前空间是否有选择集,如果有则使用现有选择集;如没有则新建一个选择集并要求用户选择对象& C% M5 V) _- J
三、如果选择集为空则删除选择集后退出;如选择集不为空则继续向下进行$ a8 j- I! |: B# M
四、遍历选择集,把其中的实体对象赋值给一个对象类型动态数组
3 X9 e+ Q; ]& w% s- S3 B五、删除选择集; g* t, U# M7 y2 L( x* }" E) W% n
六、按用户的设置创建块对象并修改其属性
( c9 A9 [; V- `七、用“Document”对象的“CopyObjects”方法,把动态数组中的实体对象集复制到块对象中# s' v4 A  t7 X) X
八、按用户设置删除原有实体或删除原有实体后在原位置插入块参照或什么也不做(保留)( b% P. q0 J- t- h& e) G: c

* r) A& s+ r( W. A2 l. X: l下面的代码是一个最简单的例子
  1. Dim Objs() As AcadEntity, B As AcadBlock, P(2) As Double, SS As AcadSelectionSet, I As Integer
    ( a( P! w6 g$ B) }* _6 R* P
  2. With ThisDrawing
    ! j, v; ^: R2 n+ `4 m+ X
  3.     Set SS = .SelectionSets.Add("SS" ) '新建选择集
    9 M/ _/ W' e- F8 O5 C
  4.     SS.SelectOnScreen '由用户在屏幕上选择对象! j$ e' i& ?/ ?& Z
  5.     If SS.Count > 0 Then '如果选择集不为空
    3 R% W, k) U9 S- w  x
  6.         ReDim Objs(SS.Count - 1) '按选择集中元素数量重定义动态数组元素个数) G, b3 u8 W% h, o2 f5 B/ H3 f9 J
  7.         For I = 0 To SS.Count - 1 '把选择集中的实体赋值给数组
    ! e! V  U- y2 v& Q
  8.             Set Objs(I) = SS.Item(I)
    ' h) [9 V$ M% ]2 W8 Z, q8 j6 K" O9 Z
  9.         Next
    7 B" r1 [5 A' S0 c6 \* L/ l
  10.         Set B = .Blocks.Add(P, "A" ) '创建块
    & V7 c2 p, K$ }7 j( \2 S' G
  11.         .CopyObjects Objs, B '把实体复制到块中2 x1 ]- t- [$ }1 M+ B
  12.     End If
    2 }% a4 v0 R2 L( i& ?. G& ^1 n' ^
  13.     SS.Delete '删除选择集
    0 ?9 o3 Y+ B: a
  14. End With
    5 Q& n! Z8 y! `% E4 G: C
复制代码
. r; H1 l) V6 G0 e% |( B5 a4 \: p
[ 本帖最后由 woaishuijia 于 2008-10-28 11:24 编辑 ]
 楼主| 发表于 2008-10-28 14:13:34 | 显示全部楼层 来自: 中国山东烟台
本人找到了一个这样的例子,但改写成函数却行不通,到底问题出在什么地方呢9 x% o$ O5 S- K+ ?* Y
产生“V”字型的样例:' Z2 D. I6 Z0 g# r/ H
void  defineBlock()
) p8 g% ?; k! M, u# [, T{) Q# S, k4 V  V9 L$ f* E
AcDbBlockTableRecord *pBTableRec1=new AcDbBlockTableRecord();
& i* k3 D+ N2 s+ {" T& N pBTableRec1->setName("VSBlock");
4 |9 E7 [2 o3 T; |( z AcDbBlockTable *pBTable=NULL;: ~' i+ g: }2 Z( ]  h2 @6 k
acdbCurDwg()->getBlockTable(pBTable,AcDb::kForWrite);  D! {2 V0 D% Z  i! W8 A3 A4 l
AcDbObjectId id1;
" O+ \2 x; _5 `1 Z. H7 W& ^" F7 x pBTable->add(id1,pBTableRec1);
: `1 T' ~) h& b5 ~* e pBTable->close();
& ^4 U. @: D% {* J AcGePoint3dArray ptArr1;
9 i, ?3 `# M. Q8 f/ r6 n- h1 r+ C ptArr1.setLogicalLength(3);
8 ~  f, N, d# H! e5 a! n/ ?  Z ptArr1[0].set(-2,3,0);; V; t! p$ Q5 v# h' p! e
ptArr1[1].set( 0,0,0);
& k2 {+ O% N  B4 t6 h7 J; j% X  M ptArr1[2].set( 2,3,0);
3 t6 G, ~1 |2 d+ T AcDb2dPolyline *pPline1=new AcDb2dPolyline(AcDb::k2dSimplePoly,ptArr1,0.0,Adesk::kFalse);! P) D/ e% ~9 L6 X; M' F, E9 {
pBTableRec1->appendAcDbEntity(pPline1);
0 x3 `# l: R. X3 e  M pBTableRec1->close();7 J1 |1 L) T$ ^& m: u
pPline1->close();
% ]5 @2 s) }4 i* \}
 楼主| 发表于 2008-10-28 14:16:01 | 显示全部楼层 来自: 中国山东烟台
改写成函数后,调试结果还未成功
$ x2 g. d  c5 F" n$ x: {! OAcDbObjectId DefineBlock(char* pBlockname,AcDbObjectId EntityId,AcGePoint3d basePoint)) q! \& V/ S' Z
{
& a2 \( O+ e. M0 q  d) b AcDbBlockTableRecord *pBTableRec=new AcDbBlockTableRecord();+ m  B6 l5 L) k; L) C1 k( q2 A
pBTableRec->setName(pBlockname);+ ]' t" g% @& o2 f9 y+ _$ j
pBTableRec->setOrigin(basePoint);
. R; N2 @3 K/ R  a AcDbBlockTable *pBlockTable=NULL;
( p$ T! x# {0 D) b acdbCurDwg()->getBlockTable(pBlockTable,AcDb::kForWrite);+ T& L/ z# W! ^/ P7 C% T3 }
AcDbObjectId ObjId;9 v( p1 Z' i, [
pBlockTable->add(ObjId,pBTableRec);* b# a7 I) b9 Z6 n5 f# b5 v; W5 f
pBlockTable->close();
+ u$ ~1 r* r. G) ?6 P7 K AcDbEntity *pEntity;
5 C% t5 M$ `+ Z' C# c acdbOpenObject(pEntity,EntityId,AcDb::kForWrite);7 ]; t8 r, w6 v
+ M5 _5 O2 |) T" H) v6 h
pBTableRec->appendAcDbEntity(pEntity);
9 a9 Y% i) i4 S' g pBTableRec->close();% A0 e) S3 Q/ q. `
pEntity->close();4 ^- |2 e4 m+ y" n
return ObjId;
1 E. ^% ?3 b  w. Q5 N0 p) f}
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Licensed Copyright © 2016-2020 http://www.3dportal.cn/ All Rights Reserved 京 ICP备13008828号

小黑屋|手机版|Archiver|三维网 ( 京ICP备2023026364号-1 )

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