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 }