Acad::ErrorStatus DbValve::dxfInFields (AcDbDxfFiler *pFiler) { assertWriteEnabled () ; //----- Read parent class information first. Acad::ErrorStatus es =AcDbPolyline::dxfInFields (pFiler) ; if ( es != Acad::eOk || !pFiler->atSubclassData (_RXST("DbValve")) ) return (pFiler->filerStatus ()) ; //----- Object version number needs to be read first struct resbuf rb ; pFiler->readItem (&rb) ; if ( rb.restype != AcDb::kDxfInt32 ) { pFiler->pushBackItem () ; pFiler->setError (Acad::eInvalidDxfCode, _RXST("\nError: expected group code %d (version #)"), AcDb::kDxfInt32) ; return (pFiler->filerStatus ()) ; } Adesk::UInt32 version =(Adesk::UInt32)rb.resval.rlong ; if ( version > DbValve::kCurrentVersionNumber ) return (Acad::eMakeMeProxy) ; //- Uncomment the 2 following lines if your current object implementation cannot //- support previous version of that object. //if ( version < DbValve::kCurrentVersionNumber ) // return (Acad::eMakeMeProxy) ; //----- Read params in non order dependant manner while ( es == Acad::eOk && (es =pFiler->readResBuf (&rb)) == Acad::eOk ) { switch ( rb.restype ) { //----- Read params by looking at their DXF code (example below) //case AcDb::kDxfXCoord: // if ( version == 1 ) // cen3d =asPnt3d (rb.resval.rpoint) ; // else // cen2d =asPnt2d (rb.resval.rpoint) ; // break ; //..... case AcDb::kDxfXCoord: DbValve::m_center = asPnt2d (rb.resval.rpoint); break; case AcDb::kDxfInt16: DbValve::m_index = (Adesk::Int16)rb.resval.rint ; default: //----- An unrecognized group. Push it back so that the subclass can read it again. pFiler->pushBackItem () ; es =Acad::eEndOfFile ; break ; } } //----- At this point the es variable must contain eEndOfFile //----- - either from readResBuf() or from pushback. If not, //----- it indicates that an error happened and we should //----- return immediately. if ( es != Acad::eEndOfFile ) return (Acad::eInvalidResBuf) ; return (pFiler->filerStatus ()) ; }
AcGePoint2d ArxDbgUtils::ucsToDcs(const AcGePoint3d& pt) { resbuf fromRb, toRb; ads_point newPt; fromRb.restype = RTSHORT; fromRb.resval.rint = AcDb::kUserCS; toRb.restype = RTSHORT; toRb.resval.rint = AcDb::kCurDisplayCS; short result = acedTrans(asDblArray(pt), &fromRb, &toRb, FALSE, newPt); ASSERT(result == RTNORM); return asPnt2d(newPt); }
void AcDbDoubleClickEditPline::startEdit(AcDbEntity *pEnt, AcGePoint3d clickpt) { // Implement the startEdit notification handler to catch when // a user double-clicks a 'POLYLINE' entity // Get the Current Document AcApDocument *pDoc=acDocManager->curDocument(); AcDbPolyline *pLine; // Cast the AcDbEntity pointer to AcDbPolyline if(pEnt->isKindOf(AcDbPolyline::desc()) == Adesk::kTrue) pLine=AcDbPolyline::cast(pEnt); else { acutPrintf("Error: Invalid AcDbPolyline Object"); return; } acDocManager->lockDocument(pDoc,AcAp::kWrite); // Upgrade to write if(pLine->upgradeOpen()!=Acad::eOk) { acutPrintf("Error: Could Not open AcDbPolyline Object"); return; } // iterate through all the vertices to find which // segment was clicked on, and place a vertex there. for(unsigned int c=0;c<pLine->numVerts()-1;c++) { AcGePoint3d pt1,pt2; pLine->getPointAt(c,pt1); pLine->getPointAt(c+1,pt2); AcGeVector3d lineVec(pt2-pt1),clickVec(clickpt-pt1), clickVec2(pt2-clickpt); double ang=lineVec.angleTo(clickVec); // This is the filter... // .05 (5% of lineVec length) is an arbitrary length... if((sin(ang)*clickVec.length()<.05*lineVec.length()) && clickVec.length()<lineVec.length() && clickVec2.length()<lineVec.length()) { // Add the point Here! ads_point outPt; acdbWcs2Ecs(asDblArray(clickpt),outPt,asDblArray(pLine->normal()),Adesk::kFalse); pLine->addVertexAt(c+1,asPnt2d(outPt)); break; } } pLine->close(); acDocManager->unlockDocument(pDoc); // invoking acedSSSetFirst(NULL,NULL) here will clear the // pickfirst selection, if desired (not With pline though). //acedSSSetFirst(NULL,NULL); // Update the graphics... pLine->draw(); actrTransactionManager->flushGraphics(); acedUpdateDisplay(); }
// Invoked by the command - POLY // void polyCommand() { int nSides = 0; while (nSides < 3) { acedInitGet(INP_NNEG, ""); switch (acedGetInt("\nEnter number of sides: ", &nSides)) { case RTNORM: if (nSides < 3) acutPrintf("\nNeed at least 3 sides."); break; default: return; } } ads_point center, startPt, normal; if (acedGetPoint(NULL, "\nLocate center of polygon: ", center) != RTNORM) return; startPt[0] = center[0]; startPt[1] = center[1]; startPt[2] = center[2]; while (asPnt3d(startPt) == asPnt3d(center)) { switch (acedGetPoint(center, "\nLocate start point of polygon: ", startPt)) { case RTNORM: if (asPnt3d(center) == asPnt3d(startPt)) acutPrintf("\nPick a point different from the center."); break; default: return; } } char nameBuf[133]; if (acedGetString(Adesk::kTrue, "\nEnter polygon name: ", nameBuf) != RTNORM) return; AcDbObjectId tsId = 0; char styleBuf[133], msg[133]; // Get default text style struct resbuf result ; if ( acedGetVar ("TEXTSTYLE", &result) != RTNORM ) { acutPrintf("\nError while reading default AutoCAD text style setting"); return ; } strcpy (styleBuf, result.resval.rstring) ; sprintf (msg, "\nEnter text style <%s>: ", result.resval.rstring) ; acdbFree (result.resval.rstring) ; if (acedGetString(Adesk::kTrue, "\nEnter text style: ", styleBuf) != RTNORM) return; if ( styleBuf[0] == '\0' ) { // Get default text style struct resbuf result ; if ( acedGetVar ("TEXTSTYLE", &result) != RTNORM ) { acutPrintf("\nError while reading default AutoCAD text style setting"); return ; } strcpy (styleBuf, result.resval.rstring) ; acdbFree (result.resval.rstring) ; } if ( rx_getTextStyleId(styleBuf, acdbHostApplicationServices()->workingDatabase(), tsId) != Acad::eOk) { acutPrintf("\nInvalid text style name"); return; } // Set the normal to the plane of the polygon to be the same as the // z direction of the current ucs, i.e. (0, 0, 1) since we also got the // center and start point in the current UCS. (acedGetPoint() returns in // the current UCS.) normal[X] = 0.0; normal[Y] = 0.0; normal[Z] = 1.0; acdbUcs2Wcs(normal, normal, Adesk::kTrue); acdbUcs2Ecs(center, center,normal, Adesk::kFalse); acdbUcs2Ecs(startPt, startPt,normal, Adesk::kFalse); double elev = center[2]; AcGePoint2d cen = asPnt2d(center), start = asPnt2d(startPt); AcGeVector3d norm = asVec3d(normal); AsdkPoly* poly = new AsdkPoly; if (poly==NULL){ acutPrintf("\nOut of memory."); return; } if (poly->set(cen, start, nSides, norm, nameBuf, tsId, elev)!=Acad::eOk){ delete poly; acutPrintf("\nCannot create AsdkPoly with given parameters."); return; } poly->setDatabaseDefaults(acdbHostApplicationServices()->workingDatabase()); postToDb(poly); }
// Invoked by the command - DRAGPOLY // void dragPolyCommand() { int nSides = 0; ads_point center, startPt, normal; if (acedGetPoint(NULL, "\nLocate center of polygon: ", center) != RTNORM) return; char nameBuf[133]; if (acedGetString(Adesk::kTrue, "\nEnter polygon name: ", nameBuf) != RTNORM) return; AcDbObjectId tsId = 0; char styleBuf[133], msg[133]; // Get default text style struct resbuf result ; if ( acedGetVar ("TEXTSTYLE", &result) != RTNORM ) { acutPrintf("\nError while reading default AutoCAD text style setting"); return ; } strcpy (styleBuf, result.resval.rstring) ; sprintf (msg, "\nEnter text style <%s>: ", result.resval.rstring) ; acdbFree (result.resval.rstring) ; if (acedGetString(Adesk::kTrue, msg, styleBuf) != RTNORM) return; if ( styleBuf[0] == '\0' ) { // Get default text style struct resbuf result ; if ( acedGetVar ("TEXTSTYLE", &result) != RTNORM ) { acutPrintf("\nError while reading default AutoCAD text style setting"); return ; } strcpy (styleBuf, result.resval.rstring) ; acdbFree (result.resval.rstring) ; } if ( rx_getTextStyleId(styleBuf, acdbHostApplicationServices()->workingDatabase(), tsId) != Acad::eOk) { acutPrintf("\nInvalid text style name"); return; } // Set the normal to the plane of the polygon to be the same as the // z direction of the current ucs, i.e. (0, 0, 1) since we also got the // center and start point in the current UCS. (acedGetPoint() returns in // the current UCS.) normal[X] = 0.0; normal[Y] = 0.0; normal[Z] = 1.0; acdbUcs2Wcs(normal, normal, Adesk::kTrue); acdbUcs2Ecs(center, center, normal, Adesk::kFalse); acdbUcs2Ecs(startPt, startPt, normal, Adesk::kFalse); double elev = center[2]; AcGePoint2d cen = asPnt2d(center), start = asPnt2d(startPt); AcGeVector3d norm = asVec3d(normal); AsdkPolyJig* pJig = new AsdkPolyJig(); pJig->acquire(cen, norm, nameBuf, tsId, elev); delete pJig; }