zoukankan      html  css  js  c++  java
  • CAD ObjectARX扩展工具的源码(三)

    CAD ObjectARX扩展工具的源码(三)
    //得到文本边界
    oid CDrawFunction::getTextBoundary(AcDbObjectId objectId,double offset,AcDbObjectId &textBoundaryId)
    {
    AcDbExtents Ext;
    AcDbEntity *pEnt;
    acdbOpenObject(pEnt,objectId,AcDb::kForWrite);
    if(pEnt->isKindOf(AcDbText::desc()))
    {
    AcDbText *pText=AcDbText::cast(pEnt);
    AcGePoint3d basePoint;
    basePoint=pText->position();
    double rotateAngle=pText->rotation();
    pText->setRotation(0);
    pText->getGeomExtents(Ext);
    AcGePoint3d minPt,maxPt;
    minPt=Ext.minPoint();
    maxPt=Ext.maxPoint();
    AcGePoint3dArray pointArray;
    AcGePoint3d point1,point2,point3,point4;
    point1.x=minPt.x-offset;point1.y=minPt.y-offset;point1.z=0;
    pointArray.append(point1);
    point2.x=maxPt.x+offset;point2.y=minPt.y-offset;point2.z=0;
    pointArray.append(point2);
    point3.x=maxPt.x+offset;point3.y=maxPt.y+offset;point3.z=0;
    pointArray.append(point3);
    point4.x=minPt.x-offset;point4.y=maxPt.y+offset;point4.z=0;
    pointArray.append(point4);
    DrawPolyline(textBoundaryId,pointArray,1,0,TRUE,"0","CONTINUOUS");
    AcGeMatrix3d matrix;
    AcGeector3d axis;
    ident_init(matrix);
    axis.set(0,0,1);
    matrix=matrix.rotation(rotateAngle,axis,basePoint); //旋转矩阵
    AcDbEntity *BounEnt;
    acdbOpenObject(BounEnt,textBoundaryId,AcDb::kForWrite);
    BounEnt->transformBy(matrix);
    BounEnt->close();
    pText->setRotation(rotateAngle);
    }
    else if(pEnt->isKindOf(AcDbMText::desc()))
    {
    AcDbMText *pMtext=AcDbMText::cast(pEnt);
    AcGePoint3d basePoint;
    basePoint=pMtext->location();
    double rotateAngle=pMtext->rotation();
    pMtext->setRotation(0);
    AcGePoint3dArray pointArray;
    double width=pMtext->actualWidth();
    double height=pMtext->actualHeight();
    AcGePoint3d point1,point2,point3,point4;
    point1.x=basePoint.x-offset;point1.y=basePoint.y+offset;point1.z=0;
    pointArray.append(point1);
    point2.x=basePoint.x+width+offset;point2.y=basePoint.y+offset;point2.z=0;
    pointArray.append(point2);
    point3.x=basePoint.x+width+offset;point3.y=basePoint.y-height-offset;point3.z=0;
    pointArray.append(point3);
    point4.x=basePoint.x-offset;point4.y=basePoint.y-height-offset;point4.z=0;
    pointArray.append(point4);
    DrawPolyline(textBoundaryId,pointArray,1,0,TRUE,"0","CONTINUOUS");
    AcGeMatrix3d matrix;
    AcGeector3d axis;
    ident_init(matrix);
    axis.set(0,0,1);
    matrix=matrix.rotation(rotateAngle,axis,basePoint); //旋转矩阵
    AcDbEntity *BounEnt;
    acdbOpenObject(BounEnt,textBoundaryId,AcDb::kForWrite);
    BounEnt->transformBy(matrix);
    BounEnt->close();
    pMtext->setRotation(rotateAngle);
    }
    pEnt->close();
    return;
    }


    AcDbObjectId CDrawFunction::createNewLayer(CString LayerName)
    {
    AcDbLayerTable *LayerTable;
    acdbHostApplicationSerices()->workingDatabase()->getSymbolTable(LayerTable,AcDb::kForWrite);
    AcDbObjectId LayerId;
    if(!LayerTable->has(LayerName))
    {
    AcDbLayerTableRecord *LayerTableRecord=new AcDbLayerTableRecord;
    LayerTableRecord->setName(LayerName);
    LayerTable->add(LayerId,LayerTableRecord);
    LayerTableRecord->close();
    }
    else
    {
    LayerTable->getAt(LayerName,LayerId,FALSE);
    }
    LayerTable->close();
    return LayerId;
    }

    bool CDrawFunction::insertBlock(AcDbObjectId &newEntId,CString BlockName,double fwj,AcGePoint3d basePoint,double scalex,
    CString Text1,CString Text2,CString Text3,
    int text1color,int text2color,int text3color,
    double text1height,double text2height,double text3height,
    double text1scator,double text2scator,double text3scator,
    CString littleFont,CString bigFont,CString layerName,double dx,double dy) //每块可有三个属性定义
    {
    AcDbObjectId blockId;
    double x,y;
    x=basePoint[X];
    y=basePoint[Y];
    bool a=AcDbSymbolUtilities::hasBlock(BlockName.GetBuffer(BlockName.GetLength()),acdbHostApplicationSerices()->workingDatabase());
    if(!a)return FALSE;
    AcDbSymbolUtilities::getBlockId(blockId,BlockName.GetBuffer(BlockName.GetLength()),acdbHostApplicationSerices()->workingDatabase());
    AcDbBlockReference *pBlkRef = new AcDbBlockReference;
    // pBlkRef->treatAsAcDbBlockRefForExplode();///////////
    pBlkRef->setBlockTableRecord(blockId);
    pBlkRef->setLayer(layerName);//设置层/////////////////////////////
    struct resbuf to, from;
    from.restype = RTSHORT;
    from.resal.rint = 1; // UCS
    to.restype = RTSHORT;
    to.resal.rint = 0; // WCS
    AcGeector3d normal(0, 0, 1);
    acedTrans(&(normal.x), &from, &to, Adesk::kTrue,&(normal.x));
    AcGeScale3d scale(scalex,scalex,scalex);
    pBlkRef->setScaleFactors(scale);
    AcGePoint3d insertPoint;
    insertPoint=basePoint;
    pBlkRef->setPosition(basePoint);
    pBlkRef->setRotation(fwj);
    pBlkRef->setNormal(normal);
    pBlkRef->setColorIndex(text1color);//按文本颜色设置改变颜色
    pBlkRef->setLayer(layerName);
    AcDbBlockTable *pBlockTable;
    acdbHostApplicationSerices()->workingDatabase()->getBlockTable(pBlockTable,AcDb::kForWrite);
    AcDbBlockTableRecord *pBlockTableRecord;
    pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord,AcDb::kForWrite);
    pBlockTableRecord->appendAcDbEntity(newEntId, pBlkRef);
    pBlockTable->close();
    pBlockTableRecord->close();

    acdbOpenObject(pBlockTableRecord, blockId, AcDb::kForRead);
    AcDbBlockTableRecordIterator *pIterator;
    pBlockTableRecord->newIterator(pIterator);
    AcDbEntity *pEnt;
    AcDbAttributeDefinition *pAttdef;
    for (pIterator->start(); !pIterator->done();pIterator->step())
    {
    pIterator->getEntity(pEnt, AcDb::kForWrite);
    //pEnt->setColorIndex(text1color);//按文本颜色设置改变颜色
    //pEnt->setLayer(layerName);//设置层
    if(pEnt->isKindOf(AcDbAttributeDefinition::desc()))
    {
    pAttdef = AcDbAttributeDefinition::cast(pEnt);
    if (pAttdef != NULL && !pAttdef->isConstant())
    {
    AcDbAttribute *pAtt = new AcDbAttribute();
    pAtt->setPropertiesFrom(pAttdef);
    pAtt->setInisible(pAttdef->isInisible());
    AcGePoint3d alignpoint;
    alignpoint=pAttdef->alignmentPoint();
    alignpoint+=pBlkRef->position().asector();
    AcDbObjectId TextStyleId;
    TextStyleId=createTextStyle(littleFont,bigFont,"xianlu");
    pAtt->setTextStyle(TextStyleId);
    pAtt->setHeight(pAttdef->height());
    pAtt->setTag("Tag");
    pAtt->setFieldLength(25);
    pAtt->setLayer(layerName);
    char *pStr = pAttdef->tag();
    pAtt->setTag(pStr);
    free(pStr);
    pAtt->setFieldLength(pAttdef->fieldLength());
    if(strcmp(pAtt->tag(),"标注1")==0)
    {
    AcGePoint3d gg(dx/scalex,0,0);
    alignpoint=alignpoint+gg.asector();
    AcGeector3d et(0,0,1);
    alignpoint=alignpoint.scaleBy(scalex,insertPoint);
    alignpoint=alignpoint.rotateBy(fwj,et,insertPoint);
    pAtt->setTextString(Text1.GetBuffer(Text2.GetLength()));
    pAtt->setRotation(PI/2+fwj);
    pAtt->setHorizontalMode(AcDb::kTextCenter);
    pAtt->seterticalMode(AcDb::kTextBottom);
    pAtt->setAlignmentPoint(alignpoint);
    pAtt->setColorIndex(text1color);
    pAtt->setHeight(text1height*scalex);
    pAtt->setWidthFactor(text1scator);
    }
    if(strcmp(pAtt->tag(),"标注2")==0)
    {
    AcGePoint3d gg(dx/scalex,0,0);
    alignpoint=alignpoint-gg.asector();
    AcGeector3d et(0,0,1);
    alignpoint=alignpoint.scaleBy(scalex,insertPoint);
    alignpoint=alignpoint.rotateBy(fwj,et,insertPoint);
    pAtt->setTextString(Text2.GetBuffer(Text2.GetLength()));
    pAtt->setRotation(PI/2+fwj);
    pAtt->setHorizontalMode(AcDb::kTextCenter);
    pAtt->seterticalMode(AcDb::kTextBottom);
    pAtt->setAlignmentPoint(alignpoint);
    pAtt->setColorIndex(text2color);
    pAtt->setHeight(text2height*scalex);
    pAtt->setWidthFactor(text2scator);
    }
    if(strcmp(pAtt->tag(),"标注3")==0)
    {
    AcGePoint3d gg(0,dy/scalex,0);
    alignpoint=alignpoint+gg.asector();
    AcGeector3d et(0,0,1);
    alignpoint=alignpoint.scaleBy(scalex,insertPoint);
    alignpoint=alignpoint.rotateBy(fwj,et,insertPoint);
    pAtt->setTextString(Text3.GetBuffer(Text3.GetLength()));
    pAtt->setRotation(fwj);
    pAtt->setHorizontalMode(AcDb::kTextCenter);
    pAtt->seterticalMode(AcDb::kTextBottom);
    pAtt->setAlignmentPoint(alignpoint);
    pAtt->setColorIndex(text3color);
    pAtt->setHeight(text3height*scalex);
    pAtt->setWidthFactor(text3scator);
    }
    AcDbObjectId attId;
    pBlkRef->appendAttribute(attId, pAtt);
    pAtt->close();
    }
    }
    // pEnt->setColorIndex(text1color);//按文本颜色设置改变颜色
    pEnt->close();
    }
    delete pIterator;
    pBlockTableRecord->close();
    pBlkRef->close();
    return TRUE;
    }


    //遍历多义线顶点坐标
    Acad::ErrorStatus CDrawFunction::IteratorPolyline(AcDbObjectId polylineID,AcGePoint3dArray& pointArray)
    {
    Acad::ErrorStatus es=Acad::eOk;
    AcDbObject* pObject=NULL;
    AcDbPolyline *pline=NULL;
    if((es=acdbOpenObject(pObject,polylineID,AcDb::kForRead))!=Acad::eOk)
    return es;
    if(!pObject->isKindOf(AcDbPolyline::desc()))
    {
    pObject->close();
    return Acad::eInalidInput;
    }
    pline=AcDbPolyline::cast(pObject);
    int num=pline->numerts();
    for (int i=0; i< num; i++)
    {
    AcGePoint3d temPt;
    if((es=pline->getPointAt(i, temPt))!=Acad::eOk)
    {
    pObject->close();
    return Acad::eInalidInput;
    }
    pointArray.append(temPt);
    }
    pObject->close();
    return es;
    }


    Acad::ErrorStatus CDrawFunction::createGroup(CString groupname,AcDbObjectIdArray IdArray)
    {
    Acad::ErrorStatus es=Acad::eOk;
    AcDbDictionary *pGroupDict=NULL;
    AcDbGroup *pGroup=NULL;
    if((es=acdbHostApplicationSerices()->workingDatabase()->getGroupDictionary(pGroupDict,AcDb::kForWrite))!=Acad::eOk)
    {
    return es;
    }
    AcDbObjectId groupId;
    es=pGroupDict->getAt(groupname,groupId);
    if(es==Acad::eInalidKey)
    {
    acutPrintf("/n输入的词典名无效!");
    pGroupDict->close();
    return es;
    }
    else if(es==Acad::eKeyNotFound)
    {
    pGroup=new AcDbGroup("GroupDiscription");
    if((es=pGroupDict->setAt(groupname,pGroup,groupId))!=Acad::eOk)
    {
    pGroup->close();pGroupDict->close();return es;
    }
    }
    else if(es==Acad::eOk )
    {
    if((es=acdbOpenObject(pGroup,groupId,AcDb::kForWrite))!=Acad::eOk)
    {
    pGroupDict->close();return es;
    }
    }
    for(int i=0;i pGroup->append(IdArray[i]);
    pGroup->setSelectable(FALSE);
    pGroupDict->close();
    pGroup->close();
    return es;
    }

    double CDrawFunction::getTextLength(AcDbObjectId textId)
    {
    Acad::ErrorStatus es=Acad::eOk;
    AcDbEntity *pEnt=NULL;
    if((es=acdbOpenObject(pEnt,textId,AcDb::kForRead))!=Acad::eOk)
    return -1;
    AcDbExtents Ext;
    pEnt->getGeomExtents(Ext);
    pEnt->close();
    AcGePoint3d minPt,maxPt;
    minPt=Ext.minPoint();
    maxPt=Ext.maxPoint();
    return acutDistance(asDblArray(minPt),asDblArray(maxPt));
    }

    oid CDrawFunction::highlightEdge(const AcDbObjectId& objId,const int marker)
    {
    char dummy[133];
    AcDbEntity *pEnt;
    acdbOpenObject(pEnt,objId,AcDb::kForRead);
    AcGePoint3d pickpnt;
    AcGeMatrix3d xform;
    int numIds;
    AcDbFullSubentPath *subentIds;
    pEnt->getSubentPathsAtGsMarker(AcDb::kEdgeSubentType,marker,pickpnt,xform,numIds,subentIds);
    if(numIds>0)
    {
    pEnt->highlight(subentIds[0]);
    ads_getstring(0,"/npressto continue...",dummy);
    pEnt->unhighlight(subentIds[0]);

    }
    delete []subentIds;
    pEnt->close();
    }


    Acad::ErrorStatus CDrawFunction::readXrecord(CString dictName,CString xrecordName,CString &message)
    {
    AcDbDictionary *pDict=NULL;
    pDict=openDictionaryForRead(dictName,acdbHostApplicationSerices()->workingDatabase());
    if(pDict)
    {
    AcDbXrecord *pXrec;
    pDict->getAt(xrecordName, (AcDbObject*&) pXrec,AcDb::kForRead);
    pDict->close();
    struct resbuf *pRbList;
    pXrec->rbChain(&pRbList);
    pXrec->close();
    message=pRbList->resal.rstring;
    acutRelRb(pRbList);
    return Acad::eOk;
    }
    else
    {
    return Acad::eInalidInput;
    }
    }


    //
    //
    //
    AcDbDictionary* CDrawFunction::openDictionaryForWrite(LPCTSTR dictName,
    bool createIfNotFound,AcDbDictionary* parentDict)
    {
    ASSERT(dictName != NULL);
    ASSERT(parentDict != NULL);
    ASSERT(parentDict->isWriteEnabled());
    AcDbDictionary* dict = NULL;
    AcDbObject* obj;
    Acad::ErrorStatus es;
    es = parentDict->getAt(dictName, obj, AcDb::kForWrite);
    if (es == Acad::eOk)
    {
    dict = AcDbDictionary::cast(obj);
    }
    else if (es == Acad::eKeyNotFound)
    {
    if (createIfNotFound)
    {
    dict = new AcDbDictionary;
    AcDbObjectId dictId;
    es = parentDict->setAt(dictName, dict, dictId);
    if (es != Acad::eOk)
    {
    delete dict;dict = NULL;
    }
    }
    }
    return dict;
    }
    ————————————————
    版权声明:本文为CSDN博主「sw283632534」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/sw283632534/article/details/5401641

  • 相关阅读:
    (Java随机数举例)随机扔一千次硬币的正反次数
    hibernate+spring的整合思路加实例(配图解)
    从零开始学C++之IO流类库(三):文件的读写、二进制文件的读写、文件随机读写
    ssh连接Linux自动断开后再也无法连上的问题
    面试题10:二进制中1的个数
    C 语言统计关键字出现次数
    在Eclipse中Attach Source
    Visual Sudio 2012转换界面风格
    java 判断字符串IP合法性以及获取IP的数值形式
    java.lang.string split 以点分割字符串无法正常拆分字符串
  • 原文地址:https://www.cnblogs.com/mjgw/p/12392413.html
Copyright © 2011-2022 走看看