找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 697|回复: 0

[求助]:关于自动在指定点插入属性块的问题

[复制链接]
发表于 2005-9-19 14:58:41 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
关于在指定点插入属性块的问题

我需要在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转变为绝对坐标系下可变的节点坐标数组

急切等待高人指点
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-17 00:40 , Processed in 0.175751 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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