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