关于拖动块的问题()
本帖最后由 作者 于 2006-8-27 22:49:27 编辑 <br /><br /> <P>我做了一个带属性定义的块表记录,和引用该块定义的块参照</P><P>当我使用AcEdJig拖动该块参照的时候会发现,在拖动的过程中,会出现在块中属性定义的tag中的字符串 和块的图形一起出现.也随着块中的图形一起动</P>
<P>其实属性定义的tag值,应该只是该属性的一个标识,但是为什么在块定义中的这个标识,会在拖动的过程中出现啊?</P>
<P>比如:块中有个属性定义,该属性定义的tag = "标识",这样在拖动这个块 的引用的同时,这个"标识"的字符也会随着图形一起动,其实应该不会出现这个字符串 啊</P>
<P>这个问题郁闷我好几天了,请哪为朋友指点一下 好么?</P> <P>这么长时间也没有人能解决这个问题么?看来只好使用一个变通的方法了,</P>
<P>pAttDef->setHeight(0.00001)把高度值设置为最小,这样就看不见了;不过我还是不甘心,要是哪位兄弟知道该怎么解决这个问题,请赐教!</P> 其实这个问题就是:在拖动一个块引用的过程中,怎样才能不显示"该块引用的那个块"中的属性定义的Tag字符串 <P>属性和属性定义的问题:</P>
<P>class bjt:<BR> public AcEdJig<BR>{<BR> AcGePoint3d mTo;<BR> AcDbBlockReference* br;<BR>public:<BR> AcDbObjectId append()<BR> {<BR> AcDbBlockTableRecord *btr;<BR> acdbOpenObject(btr,br->blockTableRecord(),kForRead);<BR> if(btr->hasAttributeDefinitions())<BR> {<BR> AcDbBlockTableRecordIterator *it;<BR> btr->newIterator(it);<BR> for(;!it->done();it->step())<BR> {<BR> AcDbEntity *pEnt;<BR> it->getEntity(pEnt, AcDb::kForRead);</P>
<P> // Make sure the entity is an attribute definition<BR> // and not a constant.<BR> //<BR> AcDbAttributeDefinition *pAttdef = AcDbAttributeDefinition::cast(pEnt);<BR> if (pAttdef != NULL && !pAttdef->isConstant()) <BR> {<BR> // We have a non-constant attribute definition,<BR> // so build an attribute entity.<BR> // <BR> AcDbAttribute *pAtt = new AcDbAttribute();<BR> pAtt->setPropertiesFrom(pAttdef);<BR> pAtt->setInvisible(pAttdef->isInvisible());</P>
<P> // Translate the attribute by block reference.<BR> // To be really correct, the entire block<BR> // reference transform should be applied here.<BR> //<BR> AcGePoint3d basePoint = pAttdef->position();<BR> basePoint += br->position().asVector();<BR> pAtt->setPosition(basePoint);<BR> pAtt->setHeight(pAttdef->height());<BR> pAtt->setRotation(pAttdef->rotation());<BR> pAtt->setTag(pAttdef->tag());<BR> pAtt->setFieldLength(25);<BR> char *pStr = pAttdef->tag();<BR> pAtt->setTag(pStr);<BR> free(pStr);<BR> pAtt->setFieldLength(pAttdef->fieldLength());</P>
<P> pAtt->setTextString("Assigned Attribute Value");<BR> br->appendAttribute(pAtt);<BR> pAtt->close();<BR> }<BR> pEnt->close();<BR> }</P>
<P> delete it;<BR> }<BR> btr->close();<BR> return AcEdJig::append();<BR> }<BR> //////////////////////////////////////////////////////////////////////////<BR> virtual DragStatus sampler()<BR> {<BR> DragStatus stat;<BR> setUserInputControls((UserInputControls)<BR> (AcEdJig::kAccept3dCoordinates<BR> | AcEdJig::kNoNegativeResponseAccepted<BR> | AcEdJig::kNoZeroResponseAccepted));</P>
<P> static AcGePoint3d axisPointTemp;<BR> stat = acquirePoint(mTo);<BR> if (axisPointTemp != mTo)<BR> axisPointTemp = mTo;<BR> else if (stat == AcEdJig::kNormal)<BR> return AcEdJig::kNoChange;<BR> return stat;<BR> }<BR> //////////////////////////////////////////////////////////////////////////<BR> virtual Adesk::Boolean update()<BR> {</P>
<P> br->setPosition(mTo);<BR> return Adesk::kTrue;<BR> }<BR> //////////////////////////////////////////////////////////////////////////<BR> virtual AcDbEntity* entity() const<BR> {<BR> return br;<BR> }<BR> //////////////////////////////////////////////////////////////////////////<BR> void start()<BR> {<BR> br=0;<BR> AcDbBlockTable *bt;<BR> acdbHostApplicationServices()->workingDatabase()->getBlockTable(bt,kForRead);<BR> AcDbObjectId bid;<BR> try<BR> {<BR> char text;<BR> if(RTNORM!=acedGetString(1,"input name",text))throw(0);<BR> if (bt->getAt(text,bid)!=eOk)throw(0);<BR> }<BR> catch(...)<BR> {<BR> bt->close();<BR> return;<BR> }<BR> bt->close();<BR> br=new AcDbBlockReference(AcGePoint3d::kOrigin,bid);<BR> setDispPrompt("Jig a Block");<BR> drag();<BR> append();<BR> }</P>
<P>};</P>
<P> 另:</P>
<P>static void BlockJigTestnewJ(void)<BR> {<BR> // Add your code for command BlockJigTest.newJ here<BR> bjt b;<BR> b.start();<BR> }</P> <P>大侠们能否上传一个先动态创建块,在插入块参考时有橡皮条效果的例题??</P>
<P>QQ:78250323</P>
<P>EMAIL:LYHNJUCT@163.COM</P> <P>使用jig好象也可以,我没有尝试过,你先研究研究,我也给你看看</P>
<P>使用jig拖动距离看看是不是能实现,我也是感觉而已</P> 我做过无属性的<STRONG>拖动块,但我认为对属性的定义应在</STRONG>drag();之后 append();之前定义则<STRONG>属性在拖动中不可见,除非属性模式是固定,建议为预置。</STRONG><BR>
页:
[1]