bool append(AcDbEntity* pEntity) { AcDbBlockTable *pBlockTable; AcApDocument* pDoc = acDocManager->curDocument(); Acad::ErrorStatus es = acDocManager->lockDocument(pDoc); if (es != Acad::eOk) { acedAlert("Failed to lock the document..."); return false; } AcDbDatabase* pDb = pDoc->database(); es = pDb->getBlockTable(pBlockTable, AcDb::kForRead); if (es != Acad::eOk) { acedAlert("Failed to get block table..."); return false; } AcDbBlockTableRecord *pBlockRec; es = pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockRec, AcDb::kForWrite); if (es != Acad::eOk) { acedAlert("Failed to get block table record..."); pBlockTable->close(); return false; } es = pBlockRec->appendAcDbEntity(pEntity); if (es != Acad::eOk) { acedAlert("Failed to append entity..."); pBlockTable->close(); pBlockRec->close(); delete pEntity; return false; } pBlockRec->close(); pBlockTable->close(); return true; }
Adesk::Boolean updateCumulativeStats() { // If anything is going on in any document, now is NOT a good // time to accumulate stats, because each command/LISP expression // in progress has pointers into session stats. // This could be fixed with more recoding than I have time to do // now. WCA 7/15/98 for (int i = docData.length() - 1; i >= 0; i--) { // Make sure our info is up to date. if (docData[i].doc == curDocGlobals.doc) docData[i] = curDocGlobals; if ((docData[i].cmdIndex > 0) || (docData[i].lispRcd != NULL)) return Adesk::kFalse; } if (!readCumulativeStats()) { acutPrintf("\nWarning: Could not find Command Statistics file.\n"); acutPrintf("Will try to create it.\n"); } AcRxDictionaryIterator* iter; // Loop over current session stats, and merge them into cumulative stats. for (iter = sessionStats->newIterator(); !iter->done(); iter->next()) { AsdkCommandRecord* sessionCmdRcd = (AsdkCommandRecord*) iter->object(); AsdkCommandRecord* cumulativeCmdRcd = (AsdkCommandRecord*) cumulativeStats->at(iter->key()); if (!cumulativeCmdRcd) // First time, add it. cumulativeStats->atPut(iter->key(), new AsdkCommandRecord(sessionCmdRcd->count, sessionCmdRcd->elapsedTime)); else { // Not the first time, so bump it. cumulativeCmdRcd->count += sessionCmdRcd->count; cumulativeCmdRcd->elapsedTime += sessionCmdRcd->elapsedTime; } } delete iter; // Now that it has been added in, wipe out the current session Stats; delete sessionStats; sessionStats = initStatDictionary(); // Open the cumulative stat file, creating it if necessary. char statFilePath[MAX_PATH_LENGTH]; int ret = cmdcount_findfile(statFileName, statFilePath,true); assert(ret==RTNORM);//this should always succeed // Open the file FILE* statFile = fopen(statFilePath, /*NOXLATE*/"w"); if (statFile == NULL) { // Bad permission in our chosen directory. Give up. acedAlert("Warning: Could not create Command Statistics file."); return Adesk::kTrue; } // Print version number of STATFILE fprintf(statFile, "v%04.1f\n", STAT_FILENAME_VERSION); // Print create date of STATFILE if (!*createDate) { fprintf(statFile, "Created: "); printCurrentDateTime(statFile); fprintf(statFile, "\n"); } else fprintf(statFile, "%s\n", createDate); // Print date last modified for STATFILE fprintf(statFile, "Last Modified: "); printCurrentDateTime(statFile); fprintf(statFile, "\n"); resbuf tempRes; // Print LOGINNAME if (acedGetVar(/*NOXLATE*/"LOGINNAME", &tempRes) != RTNORM) { sprintf(abort_msg, "%.*s Command\nStatistics Gatherer\nFailure 1", PRODUCTL, getProductName()); acrx_abort(abort_msg); } fprintf(statFile, /*NOXLATE*/"LOGINNAME: %s\n", tempRes.resval.rstring); acdbFree (tempRes.resval.rstring) ; // Print ACAD serial number if (acedGetVar(/*NOXLATE*/"_PKSER", &tempRes) != RTNORM) { sprintf(abort_msg, "%.*s Command\nStatistics Gatherer\nFailure 1", PRODUCTL, getProductName()); acrx_abort(abort_msg); } fprintf(statFile, /*NOXLATE*/"%.*s Serial Number: %s\n", PRODUCTL, getProductName(), tempRes.resval.rstring); acdbFree (tempRes.resval.rstring) ; // Print ACAD version if (acedGetVar(/*NOXLATE*/"_VERNUM", &tempRes) != RTNORM) { sprintf(abort_msg, "%.*s Command\nStatistics Gatherer\nFailure 1", PRODUCTL, getProductName()); acrx_abort(abort_msg); } fprintf(statFile, /*NOXLATE*/"%.*s version: %s\n", PRODUCTL, getProductName(), tempRes.resval.rstring); acdbFree (tempRes.resval.rstring) ; for (iter = cumulativeStats->newIterator(AcRx::kDictSorted); !iter->done(); iter->next()) { // Write out the command string. fprintf(statFile, "%s", iter->key()); // Try for reasonable text alignment, such as allowing 24 chars // for the command name. But have at least 1 space as a delimiter. int nbrOfSpaces = 24 - strlen(iter->key()); do fprintf(statFile, " "); while (--nbrOfSpaces > 0); // Now the count and elapsed time in seconds (assume 1 billion seconds // maximum, which should exceed a typical beta survey period). fprintf(statFile, "%7i %12.2f\n", ((AsdkCommandRecord*) iter->object())->count, ((AsdkCommandRecord*) iter->object())->elapsedTime); } fclose(statFile); delete iter; return Adesk::kTrue; }
Acad::ErrorStatus CZhfPalette::Wblock(AcDbDatabase*& pDbFrom, AcDbDatabase*& pDbTo, /*const AcGePoint3d& pt_3d_base,*/ const AcGeMatrix3d & xform) { Acad::ErrorStatus es ; AcDbObjectIdArray objIdsOut; AcDbBlockTable* pBT = NULL ; pDbFrom->getBlockTable(pBT, AcDb::kForRead); AcDbBlockTableRecord* pBTR = NULL; es = pBT->getAt(ACDB_MODEL_SPACE, pBTR, AcDb::kForRead); pBT->close(); AcDbBlockTableRecordIterator* pIT; es = pBTR->newIterator(pIT) ; for (; !pIT->done(); pIT->step()) { AcDbEntity* pEnt = NULL ; if (Acad::eOk==pIT->getEntity(pEnt, AcDb::kForRead)) { // if (!pEnt->isKindOf(AcDbAttributeDefinition::desc())) // { AcDbObjectId objId; if (Acad::eOk == pIT->getEntityId(objId)) { objIdsOut.append(objId); } // } pEnt->close() ; } } delete pIT; pBTR->close(); if (!objIdsOut.isEmpty()) { for (int i=0; i<objIdsOut.length(); i++) { AcDbObjectId objId = objIdsOut.at(i); AcDbEntity *pEnt = NULL ; if(Acad::eOk==acdbOpenAcDbEntity(pEnt,objId, AcDb::kForRead)) { AcDbObjectId objIdDic ; if ((objIdDic = pEnt->extensionDictionary())!= AcDbObjectId::kNull) { AcDbDictionary *pDict = NULL; if (Acad::eOk==acdbOpenObject(pDict, objIdDic, AcDb::kForWrite)) { pDict->setTreatElementsAsHard(Adesk::kTrue); pDict->close(); } } pEnt->close() ; } } AcDbDatabase *pTempDb ; es = pDbFrom->wblock( pTempDb, objIdsOut, AcGePoint3d::kOrigin ) ; if (Acad::eOk != es ) { acedAlert( _T("wblock failed!") ); return es ; } es = pDbTo->insert( xform, pTempDb ) ; if (Acad::eOk != es) acedAlert( _T("insert failed!" )); if (pTempDb) { delete pTempDb; pTempDb = NULL ; } } else { acutPrintf(_T("\nNo entities found in model space of DWG")); } return es ; }
Acad::ErrorStatus newLine() { //Mark the leftmost cubicle as unusable by putting a red diagonal //line from the lower left to upper right corners //Use the first parameter of acedGetPoint to rubberband to the second point //Prompt the user to select the line's endpoints ads_point pt1, pt2; int retval; //{{BEGIN_LEVEL_ADVANCED try { //get the first point from the user. Do not specify a base point. //... //{{BEGIN_LEVEL_INTERMEDIATE if ((retval = acedGetPoint(NULL, "\nSelect lower left: ", pt1)) != RTNORM) throw retval; //{{END_LEVEL_INTERMEDIATE //get the second point from the user, using the first point as a base point. //... //{{BEGIN_LEVEL_INTERMEDIATE if ((retval = acedGetPoint(pt1, "\nSelect upper right: ", pt2)) != RTNORM) throw retval; //{{END_LEVEL_INTERMEDIATE } catch (int e) { if (e == RTCAN) return Acad::eUserBreak; if (e == RTERROR) return Acad::eInvalidInput; } //{{END_LEVEL_ADVANCED //Instantiate an AcDbLine pointer. Use the two user-chosen //points as endpoints. //Since AcDbLine's constructor uses AcGePoint2d, but acedGetPoint returns ads_point, //you must find a way to translate old style to new style. This can be done either by //assigning each array member individually, or by calling asPnt3d() from geassign.h //{{BEGIN_LEVEL_ADVANCED //... //{{BEGIN_LEVEL_INTERMEDIATE AcDbLine* pLine = new AcDbLine(asPnt3d(pt1), asPnt3d(pt2)); //{{END_LEVEL_INTERMEDIATE //Make sure you created the line... if (!pLine) { acedAlert("Not enough memory to create a Line!"); return Acad::eOutOfMemory; } //{{END_LEVEL_ADVANCED //Prompt the user to enter a new color //Then change the color property of the new line to this value. //{{BEGIN_LEVEL_ADVANCED //... //{{BEGIN_LEVEL_INTERMEDIATE int color; acedGetInt("\nEnter AutoCAD color number: ", &color); if (pLine->setColorIndex(color) != Acad::eOk) { acutPrintf("\nInvalid color chosen.\n"); } //{{END_LEVEL_INTERMEDIATE //{{END_LEVEL_ADVANCED //Post the new entity to the database //{{BEGIN_LEVEL_ADVANCED AcDbObjectId id; return postToDatabase(pLine, id); //{{END_LEVEL_ADVANCED }