void ArxDbgDbAdeskLogo::getReferenceAttachmentPoint(AcDbEntity* ent, AcGePoint3d& toPt) { AcDbCircle* circ; AcDbArc* arc; AcDbLine* line; AcDbPoint* point; AcDbBlockReference* blkRef; if ((circ = AcDbCircle::cast(ent)) != NULL) toPt = circ->center(); else if ((arc = AcDbArc::cast(ent)) != NULL) toPt = arc->center(); else if ((line = AcDbLine::cast(ent)) != NULL) toPt = line->startPoint(); else if ((point = AcDbPoint::cast(ent)) != NULL) toPt = point->position(); else if ((blkRef = AcDbBlockReference::cast(ent)) != NULL) toPt = blkRef->position(); else { // can't get anything better so just rely on the ECS. If the // raw AutoCAD entities would do this, we wouldn't need the above // switch statement. AcGeMatrix3d mat; ent->getEcs(mat); AcGeVector3d v1, v2, v3; mat.getCoordSystem(toPt, v1, v2, v3); } }
void makeABlock() { // Create and name a new block table record. // AcDbBlockTableRecord *pBlockTableRec = new AcDbBlockTableRecord(); pBlockTableRec->setName("ASDK-NO-ATTR"); // Get the block table. // AcDbBlockTable *pBlockTable = NULL; acdbHostApplicationServices()->workingDatabase() ->getSymbolTable(pBlockTable, AcDb::kForWrite); // Add the new block table record to the block table. // AcDbObjectId blockTableRecordId; pBlockTable->add(blockTableRecordId, pBlockTableRec); pBlockTable->close(); // Create and add a line entity to the component's // block record. // AcDbLine *pLine = new AcDbLine(); AcDbObjectId lineId; pLine->setStartPoint(AcGePoint3d(3, 3, 0)); pLine->setEndPoint(AcGePoint3d(6, 6, 0)); pLine->setColorIndex(3); pBlockTableRec->appendAcDbEntity(lineId, pLine); pLine->close(); pBlockTableRec->close(); }
void frgExtractTopologicalEntsFromLinesAlgm::_extract_vertices_from_lines(std::vector<Vertex2dsOnSegment2d> &seg_pnts_pairs, const AcDbObjectIdArray &ids) { AcDbEntity *entity = NULL; acedSetStatusBarProgressMeter(_T("正在提取每根线段上的节点..."), 0, ids.length()); for (int i = 0; i < ids.length(); i++) { acdbOpenAcDbEntity(entity, ids[i], AcDb::kForRead); if (entity == NULL) continue; if (entity->isA() != AcDbLine::desc()) { entity->close(); continue; } AcDbLine *line = (AcDbLine *)entity; Vertex2dsOnSegment2d stru; stru.seg.set(AcGePoint2d(line->startPoint().x, line->startPoint().y), AcGePoint2d(line->endPoint().x, line->endPoint().y)); entity->close(); _extract_from_seg(stru); seg_pnts_pairs.push_back(stru); acedSetStatusBarProgressMeterPos(i); } acedRestoreStatusBar(); }
void CMyDlg::UpdateListCtr() { acDocManager->lockDocument(curDoc()); int nCount = m_ListCtr.GetItemCount(); acutPrintf("%d\n", nCount); long lId; CString str; AcDbObjectId LineId; AcDbEntity *pEnt = NULL; AcDbLine *pLine = NULL; Acad::ErrorStatus es; if (nCount > 0) { for (int i = 0; i < nCount; ++i) { str = m_ListCtr.GetItemText(i, 0); lId = atol(str); LineId.setFromOldId(lId); //获得指针 es = acdbOpenAcDbEntity(pEnt, LineId, AcDb::kForWrite); //检查是否被删除 pLine = AcDbLine::cast(pEnt); if (es == Acad::eWasErased) { m_ListCtr.DeleteItem(i); --m_lLineCnt; --i; --m_Row; } //检查颜色 else if (es == Acad::eOk) { if (pLine) { str = m_ListCtr.GetItemText(i, 1); Adesk::UInt16 usColor = (Adesk::UInt16)atoi(str); if (pLine->colorIndex() != usColor) { char *buf = (char*)malloc(20); itoa((int)pLine->colorIndex(), buf, 10); m_ListCtr.SetItemText(i, 1, buf); free(buf); } pLine->close(); } } } } UpdateData(FALSE); acDocManager->unlockDocument(curDoc()); }
AcDbObjectId Additional_Class::Draw_Line(AcGePoint3d stPoint, AcGePoint3d enPoint) { AcDbLine *pLineTemp = new AcDbLine(); pLineTemp->setStartPoint(stPoint); pLineTemp->setEndPoint(enPoint); AcDbBlockTable *pBlockTable = NULL; acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBlockTable, AcDb::kForRead); //this->Open_BlockTable(pBlockTable, NREADMODE); AcDbBlockTableRecord *pBlockTableRecord = NULL; pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord, AcDb::kForWrite); //acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBlockTable, AcDb::kForRead); //this->Open_ModelTableRecord(pBlockTableRecord, pBlockTable, NWRITEMODE); AcDbObjectId TempLineID; pBlockTableRecord->appendAcDbEntity(TempLineID, pLineTemp); pLineTemp->close(); pBlockTable->close(); pBlockTableRecord->close(); return TempLineID; }
void Additional_Class::Change_Line(AcDbObjectId LineID, AcGePoint3d ptStart, AcGePoint3d ptEnd ) { AcDbEntity *pEnt_Temp; if (acdbOpenAcDbEntity(pEnt_Temp, LineID, AcDb::kForWrite)!= Acad::eOk) { acutPrintf(_T("\nOPEN ENETITY ERROR")); return; } if (!pEnt_Temp->isKindOf(AcDbLine::desc())) { acutPrintf(_T("\nENTITY IS NOT LINE")); return; } AcDbLine *pLineChange; pLineChange = AcDbLine::cast(pEnt_Temp); AcGePoint3d pLineE; pLineChange->setStartPoint(ptStart); pLineChange->setEndPoint(ptEnd); pEnt_Temp->close(); pLineChange->close(); return; }
void CMyDlg::OnDelLine() { // TODO: Add your control notification handler code here int nItem; long lId; CString str; AcDbObjectId LineId; AcDbEntity *pEnt = NULL; AcDbLine *pLine = NULL; Acad::ErrorStatus es; acDocManager->lockDocument(curDoc()); //在列表中删除选定行 while(m_ListCtr.GetNextItem(-1, (LVNI_ALL | LVNI_SELECTED)) != -1) { nItem = m_ListCtr.GetNextItem(-1, (LVNI_ALL | LVNI_SELECTED)); str = m_ListCtr.GetItemText(nItem, 0); //acutPrintf("%s\n", str); lId = atol(str); LineId.setFromOldId(lId); //获得指针 es = acdbOpenAcDbEntity(pEnt, LineId, AcDb::kForWrite); //在模型空间删除相应实体 pLine = AcDbLine::cast(pEnt); if (pLine) { pLine->erase(); pLine->close(); m_ListCtr.DeleteItem(nItem); --m_Row; } } UpdateData(FALSE); acDocManager->unlockDocument(curDoc()); }
void createBlock() { AcDbBlockTableRecord* pBTR = new AcDbBlockTableRecord(); pBTR->setName(DYNBLKSAMP_BLOCKNAME); AcDbSymbolTable* pBT = NULL; acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBT, AcDb::kForWrite); pBT->add(pBTR); pBT->close(); AcGePoint3d pt1(0.0, 0.0, 0.0); AcGePoint3d pt2(2.0, 0.0, 0.0); AcDbLine* pLine = new AcDbLine(pt1, pt2); pBTR->appendAcDbEntity(pLine); pLine->close(); pt1 = pt2; pt2.y = 2.0; pLine = new AcDbLine(pt1, pt2); pBTR->appendAcDbEntity(pLine); pLine->close(); pt1 = pt2; pt2.x = 0.0; pLine = new AcDbLine(pt1, pt2); pBTR->appendAcDbEntity(pLine); pLine->close(); pt1 = pt2; pt2.y = 0.0; pLine = new AcDbLine(pt1, pt2); pBTR->appendAcDbEntity(pLine); pLine->close(); pBTR->close(); }
void CMyDlg::OnCreateLine() { // TODO: Add your control notification handler code here acDocManager->lockDocument(curDoc()); int i; int m, n; char *buf = (char*)malloc(20); AcDbObjectId LineId; AcDbLine *pLine = NULL; //块表 AcDbBlockTable *pTb = NULL; //块表记录 AcDbBlockTableRecord *pTbr = NULL; //层表 AcDbLayerTable *pLyr = NULL; //层表记录 AcDbLayerTableRecord* pLyrr = NULL; //图形数据库 AcDbDatabase *pDb = acdbHostApplicationServices()->workingDatabase(); Acad::ErrorStatus es; CListCtrl *pListCtr = (CListCtrl *)GetDlgItem( IDC_LIST1 ); //设置随机数种子 srand(time(NULL)); //更新数据 UpdateData(TRUE); m_VecSize += m_Edit5; m_xVec.resize(m_VecSize); m_yVec.resize(m_VecSize); //acutPrintf("%d\n", m_Edit1); es = pDb->getLayerTable(pLyr, AcDb::kForWrite); //以写的方式打开层表 es = pDb->getBlockTable(pTb, AcDb::kForRead); //以读的方式打开块表 es = pTb->getAt(ACDB_MODEL_SPACE, pTbr, AcDb::kForWrite);//以写的方式打开块表记录 //创建图层GalLineTest if (!pLyr->has("GalLineTest")) { pLyrr = new AcDbLayerTableRecord; //创建层记录 pLyrr->setName("GalLineTest"); //设置名字 //pLyrr->setColor(color); //设置颜色 //pLyrr->setLineWeight(lnWt); //设置线宽 if (Acad::eOk != pLyr->add(pLyrr)) //添加该层记录到层表 { //添加失败 delete pLyrr; //释放内存 pLyr->close(); //关闭层表 } //关闭层表记录 pLyrr->close(); } //关闭层表 pLyr->close(); //生成点坐标 for (i = 0; i < m_Edit5; ++i) { if ((m_Edit2 != 0) && (m_Edit4 != 0)) { m_xVec[i] = rand() % m_Edit2 + m_Edit1; m_yVec[i] = rand() % m_Edit4 + m_Edit3; } else { m_xVec[i] = 0; m_yVec[i] = 0; } } //遍历点坐标 for (m = 0; m < m_Edit5; ++m) { for (n = (m+1); n < m_Edit5; ++n) { if ((m_xVec[m] != m_xVec[n]) && (m_yVec[m] != m_yVec[n])) { AcGePoint3d ptStart(m_xVec[m], m_yVec[m], 0); AcGePoint3d ptEnd(m_xVec[n], m_yVec[n], 0); pLine = new AcDbLine(ptStart, ptEnd); //pLine->setColor(); pLine->setLayer("GalLineTest"); //创建线段 es = pTbr->appendAcDbEntity(LineId, pLine); if (Acad::eOk == es) { ++m_lLineCnt; } //acutPrintf("%d\n", LineId); sprintf(buf, "%d", LineId); m_ListCtr.InsertItem(m_Row, buf); buf = itoa(pLine->colorIndex(), buf, 10); m_ListCtr.SetItemText(m_Row, 1, buf); buf = itoa(LineLength(m_xVec[m], m_yVec[m], m_xVec[n], m_yVec[n]), buf, 10); m_ListCtr.SetItemText(m_Row, 2, buf); ++m_Row; pLine->close(); //关闭实体 } } } pTbr->close(); //关闭块表记录 pTb->close(); //关闭块表 acDocManager->unlockDocument(curDoc()); free(buf); }
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 }
// [9/5/2007 suzhiyong] Acad::ErrorStatus PDEcone::explodeTo3DSolid(AcDb3dSolid* &p3dSolid) const { assertReadEnabled(); #ifdef _OBJECTARX2004_ Acad::ErrorStatus es = Acad::eOk; int i = 0; AcGeVector3d faceVect = getFaceVect(); AcDbCurve *pCurve = NULL; AcDbVoidPtrArray curveSegments; double pathLen = m_ptStart.distanceTo(m_ptEnd); AcGePoint3d sp, ep; double d1, d2; if(m_dDiameter1 >= m_dDiameter2) { sp = m_ptStart; ep = m_ptEnd; d1 = m_dDiameter1; d2 = m_dDiameter2; } else { sp = m_ptEnd; ep = m_ptStart; d1 = m_dDiameter2; d2 = m_dDiameter1; } //extrudeAlongPath函数在由较大region拉成较小region时容易产生自交问题,所以 //炸开时选择由小的region拉成大的region AcDbLine *pLine = new AcDbLine(ep, sp); pLine->setPropertiesFrom(this); pCurve = pLine; if(pCurve != NULL) { if((es = addToDb(pCurve)) == Acad::eOk) { AcDbObjectId id; id = pCurve->objectId(); pCurve->close(); if((es = acdbOpenObject((AcDbCurve*&)pCurve, id, AcDb::kForRead)) != Acad::eOk) return Acad::eNotApplicable; } else { if(pCurve != NULL) delete pCurve; return Acad::eNotApplicable; } } AcDbCircle sCir(ep, faceVect, d2 / 2.0); curveSegments.append(&sCir); AcDbVoidPtrArray regions; es = AcDbRegion::createFromCurves(curveSegments, regions); if(es == Acad::eOk && !regions.isEmpty()) { AcDb3dSolid *pBody; pBody = new AcDb3dSolid; ////求taper Angle //AcGeVector3d vec1 = (m_ptStart-m_ptEnd);//.normal(); ////m_dDiameter1和m_dDiameter2的大小问题 //AcGeVector3d perpVec = faceVect.perpVector()*((m_dDiameter1/2-m_dDiameter2/2)); //AcGePoint3d point2(m_ptStart.x+perpVec.x, m_ptStart.y+perpVec.y, m_ptStart.z+perpVec.z); //AcGeVector3d vec2 = (point2 - m_ptEnd);//.normal(); ////taperAngle为负时表示放大region,反之为缩小 //double angle = -1*vec1.angleTo(vec2); ////angle没有到达最大值时仍然有问题,建议不使用extrudeAlongPath函数 //taperAngle是指两个圆心连线垂直于圆面时的角度,大于0时表示缩小,小于0时表示放大 es = pBody->extrudeAlongPath((AcDbRegion*)(regions[0]), pCurve,//angle); -1*atan((d1 / 2.0 - d2 / 2.0) / pathLen)); if(es != Acad::eOk) { if(pCurve != NULL) { pCurve->upgradeOpen(); pCurve->erase(); pCurve->close(); } delete pBody; for(i = 0; i < regions.length(); i++) delete (AcRxObject*)regions[i]; return Acad::eNotApplicable; } pBody->setPropertiesFrom(this); p3dSolid = pBody; } else { if(pCurve != NULL) { pCurve->upgradeOpen(); pCurve->erase(); pCurve->close(); } for(i = 0; i < regions.length(); i++) delete (AcRxObject*)regions[i]; return Acad::eNotApplicable; } if(pCurve != NULL) { pCurve->upgradeOpen(); pCurve->erase(); pCurve->close(); } for(i = 0; i < regions.length(); i++) delete (AcRxObject*)regions[i]; return Acad::eOk; #else return Acad::eNotApplicable; #endif }