CAXA装配图中单击序号,有图开图,无图建图

  1 //点序号,有图开图,无图建图
  2 void cmdOpenDrawFromSN()
  3 {
  4     //所有图纸文件必须在一个文件夹内,且图纸文件名必须为“图纸编号+图纸名称.exb”这种。
  5     // 且必包含至少一个"-",如“ABC-01法兰.exb”,该图纸标题栏中图纸编号是"ABC-01",图纸名称是"法兰"。
  6     crx_name en;    
  7     crx_point pt;
  8     CRxGePoint3d pB; //单行文字的基点
  9     CRxGePoint3d pS; //选择实体时的单击点
 10     int iRT = crxedEntSel(_T("\n请选择要打开图纸的序号(单击右键打开父图):"), en, pt);
 11      switch (iRT)
 12     {
 13     case RTNORM: //正常获取了图元
 14         //OP(_T("正常获取了图元"));
 15         break;
 16     case RTNONE: //点了鼠标右键,开始打开父图
 17         //OP(_T("单击了鼠标右键"));
 18         return;
 19         break;
 20     default:
 21         //OP(_T("用户点了退出键"));
 22         return;
 23     }
 24     //类型判断
 25      pS = asPnt3d(pt);
 26     //crx_name转到objID
 27     CRxDbObjectId objID;
 28     CDraft::ErrorStatus es = crxdbGetObjectId(objID, en);
 29     if (es != CDraft::eOk)    return;
 30     //objID转到pEnt
 31     CRxDbEntity* pEnt=NULL;
 32     es = crxdbOpenObject(pEnt, objID, CRxDb::kForWrite);
 33     if (es != CDraft::eOk || !pEnt->isKindOf(CRxDbPartNo::desc()))    return; //打开失败或者所拾非序号则退出
 34     
 35     //炸开,找数字
 36     CRxDbVoidPtrArray pVa;
 37     CRxDbEntity* pEx=NULL;
 38     CxCHAR* num=_T("");    
 39     if (pEnt->explode(pVa)!= CDraft::eOk) return; //如果是单个图元则程序崩溃??
 40     //打散后的实体数量,1个序号是6,2个连在一起的序号是9,3个连一起的是12
 41     int count = pVa.length();
 42     //遍历打散后的实体指针,找数字
 43     double dist = 0; //单击点与text基点的距离    
 44     for (int i=0;i<count;i++) 
 45     {
 46         pEx = (CRxDbEntity*)pVa[i];
 47         if (pEx->isKindOf(CRxDbText::desc()))
 48         {
 49             CRxDbText* pText = CRxDbText::cast(pEx);
 50             pB= pText->position();
 51             if (dist == 0) 
 52             {
 53                 dist = pS.distanceTo(pB);
 54                 num = pText->textString();
 55             }
 56             else
 57             {
 58                 if(pS.distanceTo(pB) <dist )    num = pText->textString();
 59             }
 60             pText->close();
 61         }
 62     }
 63     //删除打散后的实体
 64     for (int i = 0; i < count; i++)
 65     {
 66         pEx = (CRxDbEntity*)pVa[i];
 67         pEx->erase();
 68     }
 69     pEx->close();
 70     pEnt->close();
 71 
 72     //如果数字是空则退出
 73     if (wcscmp(num,_T("")) == 0) return;
 74 
 75     // 打开当前图形模型空间块表记录
 76     CRxDbPaperTable* pTable;
 77     es = crxdbHostApplicationServices()->workingDatabase()->getPaperTable(pTable, CRxDb::kForRead);
 78     if (es != CDraft::eOk)    return;
 79 
 80     CRxDbPaperTableRecord* pRecord;
 81     es=pTable->getAt(_T("Model"), pRecord, CRxDb::kForRead);
 82     if (es != CDraft::eOk || pRecord==NULL ) return;
 83 
 84     //如果记录不为空,则读取明细表内容
 85     CRxTableInfoObject* pBomInfo;
 86     pRecord->getBomInfo(&pBomInfo);
 87     CxCHAR* DrawNumber_this; //当前图图号
 88     CxCHAR* DrawNumber_father; //当前图父图号
 89     CxCHAR* DrawNumber; //图号
 90     CxCHAR* DrawName;    //图名
 91     CxCHAR* DrawAmount;    //数量
 92     CxCHAR* DrawMaterial;    //材料
 93     CxCHAR* DrawProjectName;    //项目名称
 94     CxCHAR* DrawDesigner;    //设计者
 95     CString str_date = getDate();
 96     CxCHAR* DrawDate= str_date.AllocSysString();    //设计日期
 97     CxCHAR* DrawNumHead=_T(""); //图号头
 98     int i = _wtoi(num)-1; //把读取的字符转化为明细表序号数字    
 99     if (i>pBomInfo->getRowCount()) return;
100     pBomInfo->getBomItemAt(i, 1, DrawNumber); //获取序号对应零件图号
101     pBomInfo->getBomItemAt(i, 2, DrawName);    //获取图纸名称
102     pBomInfo->getBomItemAt(i, 3, DrawAmount);//获取该零件数量
103     pBomInfo->getBomItemAt(i, 4, DrawMaterial);//获取该零件材料
104 
105     //提取标题栏信息
106     CRxAttCollInfoObject* pTitleInfo;
107     pRecord->getTitleInfo(&pTitleInfo);
108     pTitleInfo->getAttributeValue(DrawNumber_this, _T("图纸编号"));
109     pTitleInfo->getAttributeValue(DrawProjectName, _T("项目名称"));
110     pTitleInfo->getAttributeValue(DrawDesigner, _T("设计"));
111     //截取当前图图号头、当前图父图号
112     CString str_drawNumber(DrawNumber_this);
113     if (!str_drawNumber.IsEmpty())
114     {
115         str_drawNumber = str_drawNumber.Left(str_drawNumber.Find(_T("-"))); //提取第一个 - 之前的为图号头
116         DrawNumHead = str_drawNumber.AllocSysString(); 
117     }    
118 
119     pRecord->ReleaseTableInfoObject(pBomInfo); //释放
120     pRecord->ReleaseAttCollInfoObject(pTitleInfo); //释放
121     pRecord->close();
122     pTable->close();
123 
124     CString str(curDoc()->fileName());
125     str=str.Left(str.ReverseFind(_T('\\')))+_T("\\")+ DrawNumber + DrawName+ _T(".exb");
126     CxCHAR* filename = str.AllocSysString();
127     //选择图元复制到新图
128     crx_name ssName; // 选择集名称
129     long length = 0; //选择集长度
130     //若该序号对应的图纸文件存在则打开
131     if (PathFileExists(filename))    crxDocManager->appContextOpenDocument(filename);
132     //若该序号对应的图纸不存在则新建之
133     else 
134     {        
135         //若子图号中找不到父图图号头,说明是标准件或外购件,返回
136         if (wcsstr(DrawNumber, DrawNumHead) == NULL) return;
137         //拷贝图形
138         //crxedSSGet(_T("请选择新建图的图元:"), NULL, NULL, NULL, ssName);
139         //新建图形
140         crxDocManager->appContextNewDocument(_T("D:\\ZAD\\CAXA\\GB-A4(4N).tpl"));
141         // 获得得当前图形数据库
142         //CRxDbDatabase* pDb = crxdbHostApplicationServices()->workingDatabase();
143         //CRxDbDatabase* pDb = curDoc()->database();
144         CRxDbDatabase* pDb;
145         //遍历文档,激活最后一个文档(新建的)
146         CRxApDocumentIterator* itr = crxDocManager->newAcApDocumentIterator();
147         int i = 0,j=0;
148         for (; !itr->done(); itr->step(),i++) {}
149         itr = crxDocManager->newAcApDocumentIterator();
150         for (; !itr->done();itr->step() ,j++) 
151         {
152             if(j==(i-1)) pDb = itr->document() ->database();
153         }
154         delete itr;
155         
156         // 打开当前图形模型空间块表记录
157         CRxDbPaperTable* pTable;
158         CDraft::ErrorStatus es = pDb->getPaperTable(pTable, CRxDb::kForWrite);
159         if (es != CDraft::eOk)    return;
160         CRxDbPaperTableRecord* pRecord;
161         es=pTable->getAt(_T("Model"), pRecord, CRxDb::kForWrite);
162         if (es != CDraft::eOk || pRecord==NULL)    return;
163         //如果记录不为空,则设置标题栏内容
164         CRxAttCollInfoObject* pTitleInfo;
165         if (pRecord != NULL)
166         {
167             pRecord->getTitleInfo(&pTitleInfo);
168             if (es != CDraft::eOk)    return;
169             int iCount = pTitleInfo->getAttributesCount();
170             for (int i = 0; i < iCount; i++)
171             {
172                 CxCHAR* cAttName;
173                 pTitleInfo->getAttributeName(cAttName, i);
174                 if (wcscmp(cAttName,_T("图纸编号")) == 0) pTitleInfo->setAttributeValue(DrawNumber, i);
175                 else if (wcscmp(cAttName, _T("图纸名称")) == 0) pTitleInfo->setAttributeValue(DrawName, i);
176                 else if (wcscmp(cAttName, _T("数量")) == 0) pTitleInfo->setAttributeValue(DrawAmount, i);
177                 else if (wcscmp(cAttName, _T("材料名称")) == 0) pTitleInfo->setAttributeValue(DrawMaterial, i);
178                 else if (wcscmp(cAttName, _T("项目名称")) == 0) pTitleInfo->setAttributeValue(DrawProjectName, i);
179                 else if (wcscmp(cAttName, _T("设计")) == 0) pTitleInfo->setAttributeValue(DrawDesigner, i);
180                 else if (wcscmp(cAttName, _T("设计日期")) == 0) pTitleInfo->setAttributeValue(DrawDate, i);
181             }
182         }
183         es=pRecord->setTitleInfo(pTitleInfo);
184         if (es != CDraft::eOk)    return;
185         pRecord->ReleaseAttCollInfoObject(pTitleInfo); //释放
186 
187         es = pRecord->close();
188         es = pTable->close();
189 
190     }
191 }

 

posted @ 2024-03-27 21:45  大力水手008  阅读(180)  评论(0)    收藏  举报