コード例 #1
2
ファイル: XData.cpp プロジェクト: kevinzhwl/ZRXSDKMod
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);
}
コード例 #2
0
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;
}
コード例 #3
0
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 (...)
	{
	}
}
コード例 #4
0
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;
}
コード例 #5
0
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;
}
コード例 #6
0
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);
}
コード例 #7
0
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();
}
コード例 #9
0
ファイル: LSS02.cpp プロジェクト: vuonganh1993/arxlss
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;
}
コード例 #10
0
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);
}
コード例 #11
0
//在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;
}