明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2192|回复: 1

[求助]关于在指定点插入属性块的问题(含代码)

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

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

急切等待高人指点


 

 楼主| 发表于 2005-9-20 18:57:00 | 显示全部楼层

怎么没人帮我呢?

现在就差这一个功能没实现了,真着急啊...

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-26 03:39 , Processed in 0.174132 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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