- UID
- 321157
- 积分
- 0
- 精华
- 贡献
-
- 威望
-
- 活跃度
-
- D豆
-
- 在线时间
- 小时
- 注册时间
- 2005-9-9
- 最后登录
- 1970-1-1
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
关于在指定点插入属性块的问题
我需要在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=sa;Password=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转变为绝对坐标系下可变的节点坐标数组
急切等待高人指点 |
|