void addXData() { // Get an Entity. ads_name mnEnt; ads_point ptSel; int nRet = acedEntSel(_T("\nSelect an Entity: "), mnEnt, ptSel); if (nRet != RTNORM) return; AcDbObjectId oid; Acad::ErrorStatus retStat; retStat = acdbGetObjectId(oid, mnEnt); if (retStat != Acad::eOk) return; AcDbObject* pObj = NULL; if ((retStat = acdbOpenObject(pObj, oid, AcDb::kForRead)) != Acad::eOk) { return; } // Get new XData. TCHAR appName[132] = {0}; TCHAR resString[200] = {0}; acedGetString(NULL, _T("\nEnter application name: "), appName); acedGetString(NULL, _T("\nEnter string to be added: "), resString); // XData resbuf *pRb = NULL; resbuf *pTemp = NULL; pRb = pObj->xData(appName); if (pRb != NULL) { for (pTemp = pRb; pTemp->rbnext != NULL; pTemp = pTemp->rbnext); } else { acdbRegApp(appName); pRb = acutNewRb(AcDb::kDxfRegAppName); pTemp = pRb; pTemp->resval.rstring = (TCHAR*)malloc((_tcslen(appName) + 1) * sizeof(TCHAR)); _tcscpy(pTemp->resval.rstring, appName); } pTemp->rbnext = acutNewRb(AcDb::kDxfXdAsciiString); pTemp = pTemp->rbnext; pTemp->resval.rstring = (TCHAR*)malloc((_tcslen(resString) + 1) * sizeof(TCHAR)); _tcscpy(pTemp->resval.rstring, resString); // Set XData. pObj->upgradeOpen(); pObj->setXData(pRb); pObj->close(); acutRelRb(pRb); }
resbuf* duplicateResbufNode(resbuf* rb) { resbuf *newNode; int dataType; newNode = acutNewRb(rb->restype); // standard out of mem handler?? ASSERT(newNode != NULL); if (newNode == NULL) return(NULL); dataType = dxfCodeToDataType(rb->restype); if (dataType == RTSHORT) newNode->resval.rint = rb->resval.rint; else if (dataType == RTREAL) newNode->resval.rreal = rb->resval.rreal; else if (dataType == RTLONG) newNode->resval.rlong = rb->resval.rlong; else if ((dataType == RTSTR) || (dataType == -4)) newNode->resval.rstring = strdup(rb->resval.rstring); else if ((dataType == RT3DPOINT) || (dataType == RTPOINT)) { copyAdsPt(newNode->resval.rpoint, rb->resval.rpoint); } else if ((dataType == RTENAME) || (dataType == -1) || (dataType == -2) || (dataType == RTPICKS)){ copyEname(newNode->resval.rlname, rb->resval.rlname); } else if (dataType == -3) ; // no value else if (dataType == 1004) { newNode->resval.rbinary.buf = static_cast<char*>(malloc(rb->resval.rbinary.clen)); memcpy(newNode->resval.rbinary.buf, rb->resval.rbinary.buf, rb->resval.rbinary.clen); } else { ASSERT(0); // shouldn't happen return NULL; } return newNode; }
void XAcDocOp::openDocCallBack(void *pData) { if(pData == NULL || !AfxIsValidAddress(pData , sizeof(_CREATEDOCUMENTINFO))) return; CString strFilePathName; if(pData == NULL || !AfxIsValidAddress(pData , sizeof(_CREATEDOCUMENTINFO))) return; Acad::ErrorStatus es; try { _CREATEDOCUMENTINFO *pCreateInfo; pCreateInfo = (_CREATEDOCUMENTINFO*)pData; strFilePathName = pCreateInfo->pszName; strFilePathName.Trim(); //判断当前是否处于SDI模式 BOOL bIsSDIMode = FALSE; resbuf *pRb; pRb = acutNewRb(RTSHORT); if(acedGetVar("SDI" , pRb) == RTNORM && pRb->resval.rint == 1) //是SDI模式 { pCreateInfo->bActiveOldDoc = FALSE; //不能切换到先前的文档 if(curDoc() != NULL) es = acDocManager->closeDocument(curDoc()); //关闭当前文档 } acutRelRb(pRb); es = acDocManager->appContextOpenDocument(strFilePathName); if(pCreateInfo->bActiveOldDoc && pCreateInfo->pOldDoc != NULL) acDocManager->activateDocument(pCreateInfo->pOldDoc); } catch (...) { } }
BOOL ArxDbgUiDlgDxf::OnInitDialog() { CAcUiDialog::OnInitDialog(); ads_name ent; acdbGetAdsName(ent, m_objPtr->objectId()); // get entity data the ADS way (as DXF codes) resbuf* apps = acutNewRb(RTSTR); apps->resval.rstring = static_cast<char*>(malloc(10)); strcpy(apps->resval.rstring, _T("*")); resbuf* entdata = acdbEntGetX(ent, apps); acutRelRb(apps); buildColumns(); displayRbChain(entdata); acutRelRb(entdata); return TRUE; }
resbuf* ptArrayToResbuf(const AcGePoint3dArray& ptArray) { resbuf* ptList = NULL; // overall list resbuf* lastRb = NULL; // place holder to end of list resbuf* rb; int len = ptArray.length(); for (int i=0;i<len;i++) { if ((rb = acutNewRb(RT3DPOINT)) == NULL) { acutRelRb(ptList); return NULL; } copyAdsPt(rb->resval.rpoint, asDblArray(ptArray.at(i))); if (ptList == NULL) { ptList = rb; lastRb = rb; } else { lastRb->rbnext = rb; lastRb = rb; } } return ptList; }
void CDlgReadInfo::OnBnClickedBtnSelect() { //交互选择实体 BeginEditorCommand(); CString strCadName; CComboBox* pCmb = (CComboBox*)GetDlgItem(IDC_COMBO_CADLY); pCmb->GetLBText(pCmb->GetCurSel(),strCadName); ads_name ssName; struct resbuf *filter=NULL; if(strCadName.CompareNoCase("所有图层") != 0) { filter=acutNewRb(AcDb::kDxfLayerName); filter->restype=AcDb::kDxfLayerName; filter->resval.rstring = (char*) malloc((strCadName.GetLength()+1)*sizeof(char)); strcpy(filter->resval.rstring,strCadName.GetBuffer(0)); filter->rbnext=NULL; } if (acedSSGet(":S", NULL, NULL, filter, ssName) != RTNORM) { acutPrintf("\n选择实体有误!"); acedSSFree(ssName); acutRelRb(filter); CompleteEditorCommand(); return; } if(filter != NULL) acutRelRb(filter); AcDbObjectId tempObjId; ads_name ssTemp; long nNum = 0; int nPos = 0; acedSSLength(ssName,&nNum); CString strSdeName,strId,strRowId; m_wndTree.DeleteAllItems(); // 清空属性列表 ResetListItems(); for(int i=0; i<nNum; i++) { acedSSName(ssName, i, ssTemp); if(Acad::eOk != acdbGetObjectId(tempObjId, ssTemp)) continue; strId.Format("%d",tempObjId.asOldId()); CDistXData tempXData(tempObjId,"ROWID_OBJS"); if(tempXData.Select("SDELYNAME",strSdeName)==FALSE) continue; if(tempXData.Select("OBJECTID",strRowId)==FALSE) continue; tempXData.Close(); HTREEITEM hItem = m_wndTree.InsertItem(strId); AcDbEntity *pEnt = NULL; if (Acad::eOk != acdbOpenObject(pEnt, tempObjId, AcDb::kForRead)) { return; } pEnt->close(); ITEM_DATA xxItemData; xxItemData.strID = strId; xxItemData.strSdelayerName = strSdeName; xxItemData.strCadLayerName = pEnt->layer(); xxItemData.strRowId = strRowId; mapItemData[strId] = xxItemData; nPos++; } acedSSFree(ssName); CompleteEditorCommand(); if (m_wndTree.GetCount() <= 0) { return; } HTREEITEM hItem = m_wndTree.GetFirstVisibleItem(); // 显示属性 OnSelectChanged(hItem); }
void addXdata() { AcDbObject* pObj = selectObject(AcDb::kForRead); if (!pObj) { acutPrintf(_T("Error selecting object\n")); return; } // Get the application name and string to be added to // xdata. // TCHAR appName[132], resString[200]; appName[0] = resString[0] = _T('\0'); acedGetString(NULL, _T("Enter application name: "), appName); acedGetString(NULL, _T("Enter string to be added: "), resString); struct resbuf *pRb, *pTemp; pRb = pObj->xData(appName); if (pRb != NULL) { // If xdata is present, then walk to the // end of the list. // for (pTemp = pRb; pTemp->rbnext != NULL; pTemp = pTemp->rbnext) { ; } } else { // If xdata is not present, register the application // and add appName to the first resbuf in the list. // Notice that there is no -3 group as there is in // AutoLISP. This is ONLY the xdata so // the -3 xdata-start marker isn't needed. // acdbRegApp(appName); pRb = acutNewRb(AcDb::kDxfRegAppName); pTemp = pRb; const size_t nSize = _tcslen(appName) + 1; pTemp->resval.rstring = (TCHAR*) malloc(nSize * sizeof(TCHAR)); errno_t err = _tcscpy_s(pTemp->resval.rstring, nSize, appName); assert(err == 0); } // Add user-specified string to the xdata. // pTemp->rbnext = acutNewRb(AcDb::kDxfXdAsciiString); pTemp = pTemp->rbnext; const size_t nSize = _tcslen(resString) + 1; pTemp->resval.rstring = (TCHAR*) malloc(nSize * sizeof(TCHAR)); errno_t err = _tcscpy_s(pTemp->resval.rstring, nSize, resString); assert(err == 0); // The following code shows the use of upgradeOpen() // to change the entity from read to write. // pObj->upgradeOpen(); pObj->setXData(pRb); pObj->close(); acutRelRb(pRb); }
resbuf* AecUiPrEntitySet::buildSelSetFilter() { if ((m_lockedLayerNames.GetSize() == 0) && m_classTypeCache.isEmpty()) return NULL; AecResbufList rbList; resbuf* tmpRb; if (m_classTypeCache.isEmpty() == Adesk::kFalse) { tmpRb = acutNewRb(-4); newString(_DNT(_T("<or")), tmpRb->resval.rstring); rbList.addTail(tmpRb); const TCHAR* dxfStr; int len = m_classTypeCache.length(); for (int i=0; i<len; i++) { dxfStr = static_cast<AcRxClass*>(m_classTypeCache[i])->dxfName(); if (dxfStr) { tmpRb = acutNewRb(0); newString(dxfStr, tmpRb->resval.rstring); rbList.addTail(tmpRb); } //else { //AEC_ASSERT(0); // can't assert because AcDbCurve has no DXF name //} } tmpRb = acutNewRb(-4); newString(_DNT(_T("or>")), tmpRb->resval.rstring); rbList.addTail(tmpRb); } int len = m_lockedLayerNames.GetSize(); if (len > 0) { tmpRb = acutNewRb(-4); newString(_DNT(_T("<not")), tmpRb->resval.rstring); rbList.addTail(tmpRb); tmpRb = acutNewRb(-4); newString(_DNT(_T("<or")), tmpRb->resval.rstring); rbList.addTail(tmpRb); for (int i=0; i<len; i++) { if (m_lockedLayerNames[i].IsEmpty() == FALSE) { tmpRb = acutNewRb(8); newString(m_lockedLayerNames[i], tmpRb->resval.rstring); rbList.addTail(tmpRb); } else { AEC_ASSERT(0); } } tmpRb = acutNewRb(-4); newString(_DNT(_T("or>")), tmpRb->resval.rstring); rbList.addTail(tmpRb); tmpRb = acutNewRb(-4); newString(_DNT(_T("not>")), tmpRb->resval.rstring); rbList.addTail(tmpRb); } return rbList.orphanData(); }
bool addXData() { Acad::ErrorStatus es, esTmp; CLogger::Print(_T("*Call: addXData()")); //------------ // Require to select an entity. AcDbObject* pObj = selectObject(AcDb::kForRead); if (!pObj) { CLogger::Print(_T("*Exit: addXData() - Khong chon duoc object!")); return false; } //------------ // Require to enter the application name, then require to enter its string value. ACHAR appName[133], resString[133]; appName[0] = resString[0] = L'\0'; acedGetString(NULL, ACRX_T("\nEnter application name: "), appName); acedGetString(NULL, ACRX_T("\nEnter string to be added: "), resString); CLogger::Print(_T("Inform: Found out application name '%s'!"), appName); struct resbuf * pRb; struct resbuf * pTemp; pRb = pObj->xData(appName); if (pRb) { // If the appname is existing! Seek to the tail of resbuf link list. CLogger::Print(_T("Inform: Found out application name '%s' - Seek to the end of resbuf link list."), appName); for (pTemp = pRb; pTemp->rbnext; pTemp = pTemp->rbnext) {} } else { // If the appname is not existing! Register a new application name. CLogger::Print(_T("Inform: The application name %s is not existing, register this application name!"), appName); acdbRegApp(appName); // Then create new resbuf to copy the application name into it. pRb = acutNewRb(AcDb::kDxfRegAppName); pTemp = pRb; pTemp->resval.rstring = (ACHAR*) malloc((lstrlen(appName) + 1) * sizeof(ACHAR)); lstrcpy(pTemp->resval.rstring, appName); } //------------ // Create new resbuf at the tail of the link list, then copy the value string into it. pTemp->rbnext = acutNewRb(AcDb::kDxfXdAsciiString); pTemp = pTemp->rbnext; pTemp->resval.rstring = (ACHAR*) malloc((lstrlen(resString) + 1) * sizeof(ACHAR)); lstrcpy(pTemp->resval.rstring, resString); CLogger::Print(_T("Inform: Upgrade object opening!")); if (Acad::eOk != (es = pObj->upgradeOpen())) { CLogger::Print(_T("*Exit: addXData() - Fail to upgrade opening object!")); pObj->close(); acutRelRb(pRb); return false; } //------------ // Set object's xData. pObj->setXData(pRb); pObj->close(); acutRelRb(pRb); // remember to release resbuf after using CLogger::Print(_T("*Exit: addXData()!")); return true; }
void refEditApiExample() { AcDbObjectId transId; AcDbDatabase* pDb; char *fname; struct resbuf *rb; // Get a dwg file from the user. // rb = acutNewRb(RTSTR); int stat = acedGetFileD("Pick a drawing", NULL, "dwg", 0, rb); if ((stat != RTNORM) || (rb == NULL)) { acutPrintf("\nYou must pick a drawing file."); return; } fname = (char*)acad_malloc(strlen(rb->resval.rstring) + 1); strcpy(fname, rb->resval.rstring); acutRelRb(rb); // Open the dwg file. // pDb = new AcDbDatabase(Adesk::kFalse); if (pDb->readDwgFile(fname) != Acad::eOk) { acutPrintf("\nSorry, that draing is probably already open."); return; } // Get the Block Table and then the model space record. // AcDbBlockTable *pBlockTable; pDb->getSymbolTable(pBlockTable, AcDb::kForRead); AcDbBlockTableRecord *pOtherMsBtr; pBlockTable->getAt(ACDB_MODEL_SPACE, pOtherMsBtr, AcDb::kForRead); pBlockTable->close(); // Create an iterator. // AcDbBlockTableRecordIterator *pIter; pOtherMsBtr->newIterator(pIter); // Set up an object ID array. // AcDbObjectIdArray objIdArray; // Iterate over the model space BTR. Look specifically // for lines and append their object ID to the array. // for (pIter->start(); !pIter->done(); pIter->step()) { AcDbEntity *pEntity; pIter->getEntity(pEntity, AcDb::kForRead); // Look for only AcDbLine objects and add them to the // object ID array. // if (pEntity->isKindOf(AcDbLine::desc())) { objIdArray.append(pEntity->objectId()); } pEntity->close(); } delete pIter; pOtherMsBtr->close(); if (objIdArray.isEmpty()) { acad_free(fname); acutPrintf("\nYou must pick a drawing file that contains lines."); return; } // Now get the current database and the object ID for the // current database's model space BTR. // AcDbBlockTable *pThisBlockTable; acdbHostApplicationServices()->workingDatabase() ->getSymbolTable(pThisBlockTable, AcDb::kForRead); AcDbBlockTableRecord *pThisMsBtr; pThisBlockTable->getAt(ACDB_MODEL_SPACE, pThisMsBtr, AcDb::kForWrite); pThisBlockTable->close(); AcDbObjectId id = pThisMsBtr->objectId(); pThisMsBtr->close(); // Create the long transaction. This will check all the entities // out of the external database. // AcDbIdMapping errorMap; acapLongTransactionManagerPtr()->checkOut(transId, objIdArray, id, errorMap); // Now modify the color of these entities. // int colorIndex; acedGetInt("\nEnter color number to change entities to: ", &colorIndex); AcDbObject* pObj; if (acdbOpenObject(pObj, transId, AcDb::kForRead) == Acad::eOk) { // Get a pointer to the transaction. // AcDbLongTransaction* pLongTrans = AcDbLongTransaction::cast(pObj); if (pLongTrans != NULL) { // Get a work set iterator. // AcDbLongTransWorkSetIterator* pWorkSetIter; pLongTrans->newWorkSetIterator(pWorkSetIter); // Iterate over the entities in the work set and change the color. // for (pWorkSetIter->start(); !pWorkSetIter->done(); pWorkSetIter->step()) { AcDbEntity *pEntity; acdbOpenAcDbEntity(pEntity, pWorkSetIter->objectId(), AcDb::kForWrite); pEntity->setColorIndex(colorIndex); pEntity->close(); } delete pWorkSetIter; } pObj->close(); } // Pause to see the change. // char str[132]; acedGetString(0, "\nSee the new colors. Press return to check the object into the original database", str); // Check the entities back in to the original database. // acapLongTransactionManagerPtr()->checkIn(transId, errorMap); // Save the original database, since we have made changes. // pDb->saveAs(fname); // Close/Delete the database // delete pDb; pDb = NULL; acad_free(fname); }
//在CAD中根据一个文件名打开一个文档,返回一个状态和输出打开的文档 Acad::ErrorStatus XAcDocOp::openAcDocument(CString strFilePathName , AcApDocument *&pDoc , BOOL bKeepOldActive , BOOL bAutoCloseOnlyReadWarning) { AcApDocuments arrDocs , arrDocs1; Acad::ErrorStatus es; strFilePathName.Trim(); if(strFilePathName.GetLength() == 0) return Acad::eFileNotFound; pDoc = NULL; //先获取现今的所有文档 es = enumAcDocument(arrDocs); if(es != Acad::eOk) return es; if(acDocManager->isApplicationContext()) { AcApDocument *pOldDoc = NULL; //判断当前是否处于SDI模式 BOOL bIsSDIMode = FALSE; resbuf *pRb; pRb = acutNewRb(RTSHORT); if(acedGetVar("SDI" , pRb) == RTNORM && pRb->resval.rint == 1) //是SDI模式 { bKeepOldActive = FALSE; //不能切换到先前的文档 if(curDoc() != NULL) es = acDocManager->closeDocument(curDoc()); //关闭当前文档 } acutRelRb(pRb); if(bKeepOldActive) pOldDoc = curDoc(); if(bAutoCloseOnlyReadWarning) //自动关闭只读提示对话框 AutoCloseOnlyReadWarningDlg(); es = acDocManager->appContextOpenDocument(strFilePathName); if(es != Acad::eOk) return es; if(bKeepOldActive && pOldDoc != NULL) acDocManager->activateDocument(pOldDoc); } else { _CREATEDOCUMENTINFO createInfo; ::ZeroMemory(&createInfo , sizeof(_CREATEDOCUMENTINFO)); _tcscpy(createInfo.pszName , strFilePathName); if(bKeepOldActive) { createInfo.bActiveOldDoc = TRUE; createInfo.pOldDoc = curDoc(); } if(bAutoCloseOnlyReadWarning) //自动关闭只读提示对话框 AutoCloseOnlyReadWarningDlg(); acDocManager->executeInApplicationContext(openDocCallBack , (void *)&createInfo); } //再一次获取所有文档 es = enumAcDocument(arrDocs1); if(es != Acad::eOk) return es; if(arrDocs.GetSize() == arrDocs1.GetSize()) //创立失败 return Acad::eCreateFailed; BOOL bFind; for(int i = 0 ; i < arrDocs1.GetSize() ; i++) { bFind = FALSE; for(int j = 0 ; j < arrDocs.GetSize() ; j++) { if(arrDocs.GetAt(j) == arrDocs1.GetAt(i)) { bFind = TRUE; break; } } if(!bFind) { pDoc = arrDocs1.GetAt(i); return Acad::eOk; //检查名字是否相等 CString strName; strName = pDoc->fileName(); ASSERT(strName.Compare(strFilePathName) == 0); } } return Acad::eCreateFailed; }