[求助]关于在指定点插入属性块的问题(含代码)
<P>我需要在AutoCAD中的平面桁架结构的节点上自动添加带文本属性的块,来表示节点荷重</P><P>目前我已经作了一个带文本属性的块,代码如下:<BR> //4.创建节点荷重标注属性块<BR> AcDbBlockTableRecord *pBlkTableRcd1<BR> =new AcDbBlockTableRecord();//创建块表记录<BR> pBlkTableRcd1->setName("NodeLoading");//设置块表记录名(块名)<BR> AcGePoint3d basePoint1(0.0,0.0,0.0);//定义块的基点<BR> pBlkTableRcd1->setOrigin(basePoint1);<BR> //以写方式得到当前块表的指针<BR> AcDbBlockTable *pBlkTable=NULL; <BR> acdbHostApplicationServices()->workingDatabase()<BR> ->getSymbolTable(pBlkTable, AcDb::kForWrite);<BR> //将新的块表记录加入块表中,并获得块表记录的ID<BR> AcDbObjectId Id1;<BR> pBlkTable->add(Id1, pBlkTableRcd1);<BR> pBlkTable->close();<BR> //生成组成块的实体<BR> AcGePoint3dArray ptArrDown;<BR> ptArrDown.setLogicalLength(4);//设置数组的逻辑长度,箭头需要4个点<BR> ptArrDown.set(0.0,0.0,0.0);<BR> ptArrDown.set(0.0,200.0,0.0);<BR> ptArrDown.set(10.35,38.64,0.0);//箭头的斜线按长度40,与x轴夹75度角计算<BR> ptArrDown.set(-10.35,38.64,0.0);<BR> //生成箭头符号<BR> AcDbLine *pLine1=new AcDbLine(ptArrDown,ptArrDown);<BR> AcDbLine *pLine2=new AcDbLine(ptArrDown,ptArrDown);<BR> AcDbLine *pLine3=new AcDbLine(ptArrDown,ptArrDown);<BR> //将组成箭头图块的实体写入块表记录<BR> AcDbObjectId ArrowDownId;<BR> pBlkTableRcd1->appendAcDbEntity(ArrowDownId,pLine1);<BR> pBlkTableRcd1->appendAcDbEntity(ArrowDownId,pLine2);<BR> pBlkTableRcd1->appendAcDbEntity(ArrowDownId,pLine3);<BR> //设置创建箭头的层为"NodeLoading"<BR> pLine1->setLayer ("NodeLoading");<BR> pLine2->setLayer ("NodeLoading");<BR> pLine3->setLayer ("NodeLoading");<BR> //关闭实体对象<BR> pLine1->close();<BR> pLine2->close();<BR> pLine3->close();</P>
<P> //定义块的属性<BR> AcGePoint3d pt1(25.0,230.0,0.0);//定义属性位置,x坐标为文字高度的一半<BR> AcDbAttributeDefinition *pAttdef1=new AcDbAttributeDefinition;<BR> //设置属性的特性值<BR> pAttdef1->setPosition(pt1);//设置属性位置<BR> pAttdef1->setHeight(50.0);//设置文字高度<BR> pAttdef1->setRotation(PI/2);//设置文字旋转角度(弧度)<BR> pAttdef1->setHorizontalMode(AcDb::kTextLeft);//设置水平对齐方式<BR> pAttdef1->setVerticalMode(AcDb::kTextBase);//设置垂直对齐方式<BR> pAttdef1->setPrompt("节点荷重值");//设置属性提示<BR> pAttdef1->setTextString("0");<BR> pAttdef1->setTag("NodeLoadingTag");//设置属性标签<BR> pAttdef1->setInvisible(Adesk::kFalse);//设置不可见选项为假<BR> pAttdef1->setVerifiable(Adesk::kFalse);//设置验证方式为假<BR> pAttdef1->setPreset(Adesk::kFalse);//设置预置方式为假<BR> pAttdef1->setConstant(Adesk::kFalse);//设置常数方式为假<BR> pAttdef1->setLayer("NodeLoading");//设置创建编号的层为"NodeLoading"<BR> </P>
<P> //将属性定义加入图块<BR> pBlkTableRcd1->appendAcDbEntity(ArrowDownId,pAttdef1);<BR> </P>
<P> //关闭属性对象<BR> pAttdef1->close();<BR> pBlkTableRcd1->close();<BR> pBlkTable->close();</P>
<P>上述代码中的basepoint是属性块的相对坐标系的基点。<BR>各个需要标注的节点的坐标和相应的节点荷重值都已保存在SQL Server数据库中</P>
<P>从数据库分别提取这些值,并转换为相应的数据类型,代码如下<BR> //定义数据库Connection变量<BR> _ConnectionPtr m_pConnection;<BR> //定义数据库Recordset变量<BR> _RecordsetPtr m_pRecordset;</P>
<P> AfxOleInit();</P>
<P> HRESULT hr;<BR> try<BR> {<BR> hr = m_pConnection.CreateInstance("ADODB.Connection"); //创建Connection对象<BR> if(SUCCEEDED(hr))<BR> {<BR> hr = m_pConnection->Open("Provider=SQLOLEDB;Data Source=CZQDAY;User ID=sa;Password=820306;Initial </P>
<P>Catalog=TOSHIBA1","","",adModeUnknown);///连接数据库<BR> }<BR> }<BR> catch(_com_error e)///捕捉异常<BR> {<BR> CString errormessage;<BR> errormessage.Format("连接数据库失败!\r\n错误信息:%s",e.ErrorMessage());<BR> AfxMessageBox(errormessage);///显示错误信息<BR> //return FALSE;<BR> }<BR> <BR> //1.提取节点坐标<BR> //定义节点坐标参数的变体变量<BR> _variant_t varNodeId, varXCo, varYCo;<BR> //定义节点坐标参数变量的数据类型<BR> float nx,ny; <BR> float xco,yco; //定义节点坐标数组<BR> int n=0,m=0; //定义n为xco数组下标,m为yco数组下标<BR> try<BR> {<BR> //UpdateData(true);<BR> m_pRecordset.CreateInstance("ADODB.Recordset");<BR> CString str; //定义字符串变量str</P>
<P> //打开XY表(XY表储存节点的X和Y坐标),提取节点坐标<BR> str+="SELECT * FROM XY where ProjectID=";<BR> str+="'";<BR> str+="as003";//??希望能用变量传递<BR> str+="'"; //组合成字符串</P>
<P> _variant_t varNodeCo(str); //将字符串赋给varNodeCo变量 <BR> m_pRecordset.CreateInstance("ADODB.Recordset");<BR> m_pRecordset->Open(varNodeCo,_variant_t((IDispatch*)m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText);<BR> <BR> //搜索XY表<BR> m_pRecordset->MoveFirst();<BR> while(!m_pRecordset->EndOfFile)<BR> {<BR> varNodeId=m_pRecordset->GetCollect("id");<BR> varXCo=m_pRecordset->GetCollect("XCoordinate");<BR> varYCo=m_pRecordset->GetCollect("YCoordinate");</P>
<P> nx=varXCo.dblVal;<BR> xco=nx; <BR> ny=varYCo.dblVal;<BR> yco=ny; <BR> m_pRecordset->MoveNext();<BR> }<BR> m_pRecordset->Close();<BR> }<BR> catch(_com_error e)//捕捉异常<BR> {<BR> AfxMessageBox("提取节点坐标失败");//显示错误信息<BR> }</P>
<P> //2.提取节点荷重<BR> //定义节点荷重参数的变体变量<BR> _variant_t varNodeId2, varNodeLoading;<BR> //定义节点荷重参数变量的数据类型<BR> float nl;<BR> float nodeloading;//定义节点荷重数组<BR> int i=0; //定义i为nodeloading数组下标<BR> try<BR> {<BR> //UpdateData(true);<BR> m_pRecordset.CreateInstance("ADODB.Recordset");<BR> CString str; //定义字符串变量str</P>
<P> //打开NodeLoading表(NodeLoading表储存节点的荷重值),提取节点荷重<BR> str+="SELECT * FROM NodeLoading where ProjectID=";<BR> str+="'";<BR> str+="as003";//??希望能用变量传递<BR> str+="'"; //组合成字符串</P>
<P> _variant_t varNodeLoading(str); //将字符串赋给varNodeLoading变量 <BR> m_pRecordset.CreateInstance("ADODB.Recordset");<BR> m_pRecordset->Open(varNodeLoading,_variant_t((IDispatch*) </P>
<P>m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText);<BR> <BR> //搜索??表<BR> m_pRecordset->MoveFirst();<BR> while(!m_pRecordset->EndOfFile)<BR> {<BR> varNodeId2=m_pRecordset->GetCollect("NodeId");<BR> varNodeLoading=m_pRecordset->GetCollect("NodeLoading");</P>
<P> nl=varNodeLoading.dblVal;<BR> nodeloading=nl; <BR> m_pRecordset->MoveNext();<BR> }<BR> m_pRecordset->Close();<BR> }<BR> catch(_com_error e)//捕捉异常<BR> {<BR> AfxMessageBox("提取节点荷重失败");//显示错误信息<BR> }<BR> <BR> //3.提取上弦杆节点数<BR> //定义节点数参数的变体变量<BR> _variant_t varUpTrussEndPt;<BR> //定义上弦杆节点数变量<BR> int UpTrussNodeNum; <BR> try<BR> {<BR> //UpdateData(true);<BR> m_pRecordset.CreateInstance("ADODB.Recordset");<BR> CString str; //定义字符串变量str<BR> //打开NodeInput表(NodeInput表储存几个特征节点编号)<BR> str+="SELECT * FROM NodeInput where ProjectID=";//这句中的表名需要补充<BR> str+="'";<BR> str+="as003";//??希望能用变量传递<BR> str+="'"; //组合成字符串</P>
<P> _variant_t varPtNum(str); //将字符串赋给varPtNum变量 <BR> m_pRecordset.CreateInstance("ADODB.Recordset");<BR> m_pRecordset->Open(varPtNum,_variant_t((IDispatch*)m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText);<BR> <BR> //搜索NodeInput表<BR> m_pRecordset->MoveFirst();<BR> while(!m_pRecordset->EndOfFile)<BR> {<BR> varUpTrussEndPt=m_pRecordset->GetCollect("EndPoint");<BR> UpTrussNodeNum=varNodeLoading.intVal; <BR> m_pRecordset->MoveNext();<BR> }<BR> m_pRecordset->Close();<BR> }<BR> catch(_com_error e)//捕捉异常<BR> {<BR> AfxMessageBox("提取上弦杆节点数失败");//显示错误信息<BR> }</P>
<P>上述代码中的"3.提取上弦杆节点数"是获得要标注节点荷重的节点的数量</P>
<P>目前我希望实现的功能是:<BR>将块插入点自动按节点坐标数组输入,并给其赋予相应的节点荷重值(已保存在NodeLoading数组中)<BR>这样的for语句应该如何写?<BR>我试着把<BR>for(int j=0;j<UpTrussNodeNum;j++){}<BR>这句话加在了几个位置,都不能实现我的预期功能</P>
<P>另一个问题是:<BR>如何自动设定块插入的基点<BR>即如何把相对坐标系下固定的basepoint转变为绝对坐标系下可变的节点坐标数组</P>
<P>急切等待高人指点</P>
<P><BR> </P> <P>怎么没人帮我呢?</P>
<P>现在就差这一个功能没实现了,真着急啊...</P>
页:
[1]