设为首页收藏本站

中国膜结构网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

膜结构车棚
膜结构车棚膜结构资质国产膜材 膜结构网中国膜结构协会
查看: 592|回复: 30

AcDb3dSolid

[复制链接]
  • TA的每日心情
    开心
    2021-6-20 09:04
  • 签到天数: 1540 天

    [LV.Master]伴坛终老

    发表于 2021-2-7 22:24 | 显示全部楼层 |阅读模式
    #include <aced.h>
    #include "rxregsvc.h"
    #include "acutads.h"
    #include "dbapserv.h"
    #include "dbsymtb.h"
    #include "gepnt3d.h"
    #include "dbsol3d.h"
    #include "dbents.h"
    #include "dbregion.h"


    static Acad::ErrorStatus postToDb(AcDbEntity* ent, AcDbObjectId& objId) {
       Acad::ErrorStatus      es;
       AcDbBlockTable*        pBlockTable;
       AcDbBlockTableRecord*  pSpaceRecord;
       if ((es = acdbHostApplicationServices()->workingDatabase()->
          getSymbolTable(pBlockTable, AcDb::kForRead))
          != Acad::eOk) {
             return es;
          }
       if ((es = pBlockTable->getAt(ACDB_MODEL_SPACE,  
          pSpaceRecord,
          AcDb::kForWrite)) != Acad::eOk) {
             return es;
          }
       if ((es = pBlockTable->close()) != Acad::eOk) {
          return es;
          }
       if ((es = pSpaceRecord->appendAcDbEntity(objId, ent)) != Acad::eOk) {
          return es;
          }
       if ((es = pSpaceRecord->close()) != Acad::eOk) {
          return es;
          }
       return ent->close();
       }


    bool LOCAL_createSweepedSolidAcad() {
       AcDb2dPolyline *pPolyProf = new AcDb2dPolyline();
       AcDb2dVertex *vp1 = new AcDb2dVertex( AcGePoint3d(  0, 0, 0 ) );  pPolyProf->appendVertex( vp1 );
       AcDb2dVertex *vp2 = new AcDb2dVertex( AcGePoint3d(  1, 1, 0 ) );  pPolyProf->appendVertex( vp2 );
       AcDb2dVertex *vp3 = new AcDb2dVertex( AcGePoint3d(  0, 5, 0 ) );  pPolyProf->appendVertex( vp3 );
       AcDb2dVertex *vp4 = new AcDb2dVertex( AcGePoint3d( -1, 1, 0 ) );  pPolyProf->appendVertex( vp4 );
       pPolyProf->makeClosed();

       AcDb3dPolyline *pPolyPath1 = new AcDb3dPolyline();
       AcDb3dPolylineVertex *v1a = new AcDb3dPolylineVertex( AcGePoint3d( 10,10,10 ) );  pPolyPath1->appendVertex( v1a );
       AcDb3dPolylineVertex *v1b = new AcDb3dPolylineVertex( AcGePoint3d( 20,20,12 ) );  pPolyPath1->appendVertex( v1b );

       AcDb3dPolyline *pPolyPath2 = new AcDb3dPolyline();
       AcDb3dPolylineVertex *v2a = new AcDb3dPolylineVertex( AcGePoint3d( -10,-10,10 ) );  pPolyPath2->appendVertex( v2a );
       AcDb3dPolylineVertex *v2b = new AcDb3dPolylineVertex( AcGePoint3d( -20,-20,12 ) );  pPolyPath2->appendVertex( v2b );

       AcDbSweepOptions sweepOptions;
       sweepOptions.setAlign( AcDbSweepOptions::kAlignSweepEntityToPath );
       sweepOptions.setBasePoint( AcGePoint3d(0,0,0) );
       
       AcDb3dSolid* cad3dSolid1 = new AcDb3dSolid();
       Acad::ErrorStatus es1 = cad3dSolid1->createSweptSolid( pPolyProf, pPolyPath1, sweepOptions );
       cad3dSolid1->setColorIndex(2);  
       AcDbObjectId idSolid1;
       postToDb( cad3dSolid1, idSolid1 );

       AcDb3dSolid* cad3dSolid2 = new AcDb3dSolid();
       Acad::ErrorStatus es2 = cad3dSolid2->createSweptSolid( pPolyProf, pPolyPath2, sweepOptions );
       cad3dSolid2->setColorIndex(2);  
       AcDbObjectId idSolid2;
       postToDb( cad3dSolid2, idSolid2 );

       delete pPolyPath1;
       delete pPolyPath2;
       delete pPolyProf;
       return es1 == Acad::eOk && es2 == Acad::eOk;
       }


    //******************************************************************************
    /// purpose: define new cad-command
    void runIt()
    {
    acutPrintf(L"\nTest-Command");
    LOCAL_createSweepedSolidAcad();
    }


    //******************************************************************************
    /// purpose: main function
    extern "C" AcRx::AppRetCode acrxEntryPoint(AcRx::AppMsgCode msg, void* appId)
    {
    switch(msg) {
       case AcRx::kInitAppMsg:
          acrxUnlockApplication(appId);
          acrxRegisterAppMDIAware(appId);
          acutPrintf(L"\nExample Application Loaded");
          acedRegCmds->addCommand(L"ASDK_MAKE_ENTS", L"ASDK_MKENTS", L"RUNIT", ACRX_CMD_MODAL, runIt);
          break;
       case AcRx::kUnloadAppMsg:
          acutPrintf(L"\nExample Application Unloaded");
          break;
       }
    return AcRx::kRetOK;
    }
    回复


    http://www.mjgw.org/ 专业从事膜结构设计、制作加工、施工安装的膜结构工程服务,能够为客户提供专业的膜结构整体解决方案。做中国最好的膜结构综合服务平台。欢迎大家联系电话:198-7840-1958,QQ:463017170.
    相关关键词:膜结构车棚,膜结构车棚覆盖,膜结构车棚公司,膜结构车棚多少钱,膜结构车棚厂家,膜结构车棚价格,社区膜结构车棚,膜结构车棚膜布厂家 ,膜结构车棚哪家好,膜结构车棚多少钱一米,膜结构车棚报价,膜结构车棚哪里有,膜结构车棚定制,膜结构车棚安装,膜结构车棚设计,膜结构车棚电话,膜结构车棚加工,膜结构车棚膜布价格,膜结构车棚批发,膜结构车棚制造商,膜结构车棚生产厂家,膜结构车棚设计,膜结构车棚施工,膜结构车棚多少钱一平米,膜结构车棚订制,张拉膜车棚,张拉膜车棚覆盖,张拉膜车棚公司,张拉膜车棚多少钱,张拉膜车棚厂家,张拉膜车棚价格,社区张拉膜车棚,张拉膜车棚膜布厂家 ,张拉膜车棚哪家好,张拉膜车棚多少钱一米,张拉膜车棚报价,张拉膜车棚哪里有,张拉膜车棚定制,张拉膜车棚安装,张拉膜车棚设计,张拉膜车棚电话,张拉膜车棚加工,张拉膜车棚膜布价格,张拉膜车棚批发,张拉膜车棚制造商,张拉膜车棚生产厂家,张拉膜车棚设计,张拉膜车棚施工,张拉膜车棚多少钱一平米,张拉膜车棚订制,常用膜材品牌:德国杜肯、法国法拉利、德国海德斯、德国米乐、日本平岗、韩国秀博、比利时希运、美国赫虏伯、中国科宝、上海慧遥。

    使用道具 举报

  • TA的每日心情
    开心
    2021-6-20 09:04
  • 签到天数: 1540 天

    [LV.Master]伴坛终老

     楼主| 发表于 2021-2-7 22:24 | 显示全部楼层
    // Calculat the alignment matrix.
    // The source object is supposed to be in XY-plane.
    // ptAlign of the source object shall be aligned to the startpoint of curve
    void calculateAlignmentMatrix(const AcGePoint3d &ptAlign, AcDbCurve *curve, AcGeMatrix3d &matAlign)
    {       
            AcGePoint3d ptStart;
            AcGeVector3d x, y, z;
            double parStart;

            curve->getStartPoint(ptStart);
            curve->getStartParam(parStart);
            curve->getFirstDeriv(parStart, z); // This is the start direction of the path.
            z.normalize();
            x = z.perpVector(); // x-axis direction. We use the "arbitrary axis algorithm here. Change to your needs.
            y = z.crossProduct(x);
            matAlign = AcGeMatrix3d::alignCoordSys(ptAlign, AcGeVector3d::kXAxis, AcGeVector3d::kYAxis, AcGeVector3d::kZAxis, ptStart, x, y, z);
    }

    bool LOCAL_createSweepedSolidAcad() {
            AcDb2dPolyline *pPolyProf = new AcDb2dPolyline();
            AcDb2dVertex *vp1 = new AcDb2dVertex(AcGePoint3d(0, 0, 0));  pPolyProf->appendVertex(vp1);
            AcDb2dVertex *vp2 = new AcDb2dVertex(AcGePoint3d(1, 1, 0));  pPolyProf->appendVertex(vp2);
            AcDb2dVertex *vp3 = new AcDb2dVertex(AcGePoint3d(0, 5, 0));  pPolyProf->appendVertex(vp3);
            AcDb2dVertex *vp4 = new AcDb2dVertex(AcGePoint3d(-1, 1, 0));  pPolyProf->appendVertex(vp4);
            pPolyProf->makeClosed();
            AcGePoint3d plineAlignmentPoint(0,0,0);

            AcDb3dPolyline *pPolyPath1 = new AcDb3dPolyline();
            AcDb3dPolylineVertex *v1a = new AcDb3dPolylineVertex(AcGePoint3d(10, 10, 10));  pPolyPath1->appendVertex(v1a);
            AcDb3dPolylineVertex *v1b = new AcDb3dPolylineVertex(AcGePoint3d(20, 20, 12));  pPolyPath1->appendVertex(v1b);

            AcDb3dPolyline *pPolyPath2 = new AcDb3dPolyline();
            AcDb3dPolylineVertex *v2a = new AcDb3dPolylineVertex(AcGePoint3d(-10, -10, 10));  pPolyPath2->appendVertex(v2a);
            AcDb3dPolylineVertex *v2b = new AcDb3dPolylineVertex(AcGePoint3d(-20, -20, 12));  pPolyPath2->appendVertex(v2b);

            AcDbSweepOptions sweepOptions;
            sweepOptions.setAlign(AcDbSweepOptions::kNoAlignment); // We align ourself. Was AcDbSweepOptions::kAlignSweepEntityToPath
            sweepOptions.setBasePoint(AcGePoint3d(0, 0, 0));

            AcGeMatrix3d matAlign;
            AcDbEntity *pPolyProfAligned1=NULL, *pPolyProfAligned2=NULL;
            Acad::ErrorStatus es;

            AcDb3dSolid* cad3dSolid1 = new AcDb3dSolid();
            calculateAlignmentMatrix(plineAlignmentPoint, pPolyPath1, matAlign);
            es = pPolyProf->getTransformedCopy(matAlign, pPolyProfAligned1);
            Acad::ErrorStatus es1 = cad3dSolid1->createSweptSolid(pPolyProfAligned1, pPolyPath1, sweepOptions);
            cad3dSolid1->setColorIndex(2);
            AcDbObjectId idSolid1;
            postToDb(cad3dSolid1, idSolid1);

            AcDb3dSolid* cad3dSolid2 = new AcDb3dSolid();
            calculateAlignmentMatrix(plineAlignmentPoint, pPolyPath2, matAlign);
            es = pPolyProf->getTransformedCopy(matAlign, pPolyProfAligned2);
            Acad::ErrorStatus es2 = cad3dSolid2->createSweptSolid(pPolyProfAligned2, pPolyPath2, sweepOptions);
            cad3dSolid2->setColorIndex(2);
            AcDbObjectId idSolid2;
            postToDb(cad3dSolid2, idSolid2);

            static int append=1;
            if (append)
            {
                    AcDbObjectId idPath1, idPath2, idPoly;
                    postToDb(pPolyPath1, idPath1);
                    postToDb(pPolyPath2, idPath2);
                    postToDb(pPolyProf, idPoly);
                    postToDb(pPolyProfAligned1, idPoly);
                    postToDb(pPolyProfAligned2, idPoly);
            }
            else
            {
                    delete pPolyPath1;
                    delete pPolyPath2;
                    delete pPolyProf;
                    delete pPolyProfAligned1;
                    delete pPolyProfAligned2;
            }

            return es1 == Acad::eOk && es2 == Acad::eOk;
    }
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2021-6-20 09:04
  • 签到天数: 1540 天

    [LV.Master]伴坛终老

     楼主| 发表于 2021-2-7 22:25 | 显示全部楼层
    //-----------------------------------------------------------------------------
    //----- acrxEntryPoint.cpp
    //-----------------------------------------------------------------------------
    #include "StdAfx.h"
    #include "resource.h"

    //-----------------------------------------------------------------------------
    #define szRDS _RXST("")

    //-----------------------------------------------------------------------------
    //----- ObjectARX EntryPoint
    class CMy3DSolidToPolyMeshApp : public AcRxArxApp {

    public:
      CMy3DSolidToPolyMeshApp() : AcRxArxApp() {}

      virtual AcRx::AppRetCode On_kInitAppMsg(void *pkt) {
        AcRx::AppRetCode retCode = AcRxArxApp::On_kInitAppMsg(pkt);
        return (retCode);
      }

      virtual AcRx::AppRetCode On_kUnloadAppMsg(void *pkt) {
        AcRx::AppRetCode retCode = AcRxArxApp::On_kUnloadAppMsg(pkt);
        return (retCode);
      }

      virtual void RegisterServerComponents() {    }

      static void Rivilis3DSolidToPolyMesh() {

        ads_name en; ads_point p;

        if (acedEntSel(_T("\nSelect 3DSolid: "), en, p) != RTNORM)
          return;

        AcDbObjectId eid;
        if (acdbGetObjectId(eid, en) != Acad::eOk)
          return;

        AcDbObjectPointer<AcDb3dSolid> p3DSolid(eid, AcDb::kForRead);
        if (p3DSolid.openStatus() == Acad::eWrongObjectType) {
          acutPrintf(_T("\nNot a 3DSolid!"));
          return;
        }

        AcDbExtents ext; p3DSolid->getGeomExtents(ext);
        double length = ext.minPoint().distanceTo(ext.maxPoint());

        AcBrBrep brp;

        AcBr::ErrorStatus ebr;
        ebr = brp.set(*p3DSolid);
        if (ebr != AcBr::eOk) {
          acutPrintf(_T("\nError br.set(*p3DSolid) = %d"), ebr);
          return;
        }

        AcBrMesh2dControl mc;
        // mc.setMaxNodeSpacing( length / 100.0);
        // mc.setMaxSubdivisions(100000);
        // Set max deviation
        mc.setDistTol(length / 100.0);
        // Set type of elements - only triangles (!!!)
        mc.setElementShape(AcBr::kAllTriangles);

        AcBrMesh2dFilter mf;
        const AcBrEntity* meshEnt = (AcBrEntity*)&brp;
        mf.insert(make_pair(meshEnt, mc));
        AcBrMesh2d brepMesh;
        if ((ebr = brepMesh.generate(mf)) != AcBr::eOk) {
          acutPrintf(_T("\n Error в AcBrMesh2d::generate %d"), ebr);
          return;
        }

        AcDbObjectPointer<AcDbPolyFaceMesh> pMesh; pMesh.create();
        pMesh->setDatabaseDefaults();
        pMesh->setColorIndex(2); // Set yellow color
        AcDbBlockTableRecordPointer pBtr(acdbCurDwg()->currentSpaceId(), AcDb::kForWrite);
        if (pBtr.openStatus() != Acad::eOk)
          return;
        pBtr->appendAcDbEntity(pMesh);

        int v0 = 0, v1 = 0, v2 = 0, v3 = 0;

        int iter = 0;
        AcGePoint3dArray vertexLookup;
        vertexLookup.setPhysicalLength(10000);
        // Skip first element
        vertexLookup.append(AcGePoint3d::kOrigin);

        AcBrMesh2dElement2dTraverser meshElemTrav;

        for (ebr = meshElemTrav.setMesh(brepMesh); !meshElemTrav.done(); ebr = meshElemTrav.next()) {
          if (ebr != AcBr::eOk) return;
          AcBrElement2d e;   ebr = meshElemTrav.getElement(e);
          AcBrElement2dNodeTraverser elemNodeTrav;
          for (ebr = elemNodeTrav.setElement(e); !elemNodeTrav.done(); elemNodeTrav.next()) {
            AcBrNode n;
            ebr = elemNodeTrav.getNode(n);
            AcGePoint3d p; n.getPoint(p);
            if (!vertexLookup.contains(p)) {
              AcDbObjectPointer<AcDbPolyFaceMeshVertex> pMeshVert;  pMeshVert.create();
              pMeshVert->setPosition(p);
              pMesh->appendVertex(pMeshVert);
              vertexLookup.append(p);
            }
          }
        }

        for (ebr = meshElemTrav.setMesh(brepMesh); !meshElemTrav.done(); ebr = meshElemTrav.next()) {
          if (ebr != AcBr::eOk) return;
          AcBrElement2d e;   ebr = meshElemTrav.getElement(e);
          AcBrElement2dNodeTraverser elemNodeTrav;

          AcGePoint3dArray pts;

          for (ebr = elemNodeTrav.setElement(e); !elemNodeTrav.done(); ebr = elemNodeTrav.next()) {
            if (ebr != AcBr::eOk) return;
            AcBrNode n;
            ebr = elemNodeTrav.getNode(n);
            AcGePoint3d p; n.getPoint(p);
            pts.append(p);
          }

          v0 = v1 = v2 = v3 = 0;
          // Triangle has vertexes: pts[0], pts[1], pts[2]
          acutPrintf(_T("\np1=(%g %g %g), p2=(%g %g %g), p2=(%g %g %g),"),
            pts[0].x, pts[0].y, pts[0].z, pts[1].x, pts[1].y, pts[1].z, pts[2].x, pts[2].y, pts[2].z);

          vertexLookup.find(pts[0], v0);
          vertexLookup.find(pts[1], v1);
          vertexLookup.find(pts[2], v2);
          if (pts.length() == 4) {
            vertexLookup.find(pts[3], v3);
          }

          AcDbFaceRecord *pFaceRecord = new AcDbFaceRecord(v0, v1, v2, v3);
          pMesh->appendFaceRecord(pFaceRecord);
          pFaceRecord->close();
        }
      }
    };
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2021-6-20 09:04
  • 签到天数: 1540 天

    [LV.Master]伴坛终老

     楼主| 发表于 2021-2-7 22:25 | 显示全部楼层
    int xx_get3dsolid()
    {
            struct resbuf *rb = acedGetArgs();
            if ((rb != NULL))
            {
                    AcDbObjectId id=AcDbObjectId::kNull;
                    bool ok=false;
                    AcGePoint3d decale;
                    decale.x=decale.y=decale.z=0;
                    if ((rb->restype==RT3DPOINT)||(rb->restype==RTPOINT))
                    {
                            decale.x=rb->resval.rpoint[0];
                            decale.y=rb->resval.rpoint[1];
                            decale.z=rb->resval.rpoint[2];                       
                    }
                    rb=rb->rbnext;
                    if(rb==NULL)
                            return  RTREJ;
                    if (rb->restype==RTENAME)
                    {

                   
                            acdbGetObjectId( id, rb->resval.rlname );  
                            ok=true;
                    }
                    if (rb->restype==RTSTR)
                    {
                            ads_name en;
                            acdbHandEnt(rb->resval.rstring,en);
                            acdbGetObjectId(id,en);
                            ok=true;
                    }
                    if (ok==false)
                    {
                            return RTREJ;
                    }

                                    AcDbEntity *entity=NULL;
                                    Acad::ErrorStatus es=acdbOpenObject(entity, id, AcDb::kForRead );
                                    if( entity == NULL )   
                                            return RSERR;  

                                    AcDb3dSolid *solid = AcDb3dSolid::cast(entity);
                                    if (solid != NULL)
                                    {
                                            struct resbuf *_rbo = NULL, *rbo = NULL;
                                            _rbo = acutNewRb(RTLB);
                                            rbo = _rbo;
                                            AcBrBrep pBrep;

                                            pBrep.setSubentPath(

                                                    AcDbFullSubentPath(id, kNullSubentId));



                                            AcBr::ErrorStatus returnValue = AcBr::eOk;



                                            AcBrBrepFaceTraverser brepFaceTrav;

                                            if (brepFaceTrav.setBrep(pBrep) != AcBr::eOk)

                                            {

                                                    acutPrintf(ACRX_T(

                                                            "\\n Error in AcBrBrepFaceTraverser::setBrep:"));

                                                    return RTREJ;

                                            }



                                            int  faceCount = 0;

                                            while (!brepFaceTrav.done() && (returnValue == AcBr::eOk))

                                            {

                                                    faceCount++;



                                                    AcBrFace face;

                                                    if (brepFaceTrav.getFace(face)

                                                            != AcBr::ErrorStatus::eOk)

                                                    {

                                                            continue;

                                                    }



                                                    AcGeSurface *pGeSurface = NULL;

                                                    face.getSurface(pGeSurface);



                                                    AcGeInterval intervalU, intervalV;

                                                    pGeSurface->getEnvelope(intervalU, intervalV);



                                                    AcBrFaceLoopTraverser faLoTrav;

                                                    for (faLoTrav.setFace(face);

                                                    !faLoTrav.done(); faLoTrav.next())

                                                    {

                                                            AcBrLoop lp;

                                                            faLoTrav.getLoop(lp);

                                                            AcBr:oopType type;



                                                            //acutPrintf(ACRX_T("\\nFACE : %d"), faceCount);



                                                            AcBrLoopVertexTraverser  loEdTrav;

                                                            if (loEdTrav.setLoop(faLoTrav) == AcBr::eOk)

                                                            {

                                                                    int  edgeCount = 0;

                                                                    AcGePoint2dArray verts;

                                                                    AcGeVoidPointerArray edgeArray;
                                                                    rbo->rbnext = acutNewRb(RTLB);
                                                                    rbo = rbo->rbnext;
                                                                    for (;!loEdTrav.done(); loEdTrav.next())

                                                                    {

                                                                            edgeCount++;



                                                                            //AcBrEdge edge;
                                                                            AcBrVertex vtx;
                                                                            loEdTrav.getVertex(vtx);



                                                                           

                                                                            //vtx.getVertex1(start);

                                                                            AcGePoint3d stPt3d;

                                                                            vtx.getPoint(stPt3d);



                                                                            /*AcBrVertex end;

                                                                            edge.getVertex2(end);

                                                                            AcGePoint3d endPt3d;

                                                                            end.getPoint(endPt3d);*/



                                                                           
                                                                                    AcGePoint3d pt;
                                                                                    pt = stPt3d;
                                                                                    pt.x -= decale.x;
                                                                                    pt.y -= decale.y;
                                                                                    pt.z -= decale.z;
                                                                                    rbo->rbnext = acutNewRb(RT3DPOINT);
                                                                                    rbo = rbo->rbnext;
                                                                                    rbo->resval.rpoint[0] = pt.x;
                                                                                    rbo->resval.rpoint[1] = pt.y;
                                                                                    rbo->resval.rpoint[2] = pt.z;
                                                                                   
                                                                                   
                                                                           
                                                                           
                                                                           

                                                                    }
                                                                    rbo->rbnext = acutNewRb(RTLE);
                                                                    rbo = rbo->rbnext;

                                                            }

                                                    }

                                                    returnValue = brepFaceTrav.next();

                                            }
                                            rbo->rbnext = acutNewRb(RTLE);
                                            acedRetList(_rbo);
                                    }
                                   
                                    entity->close();
                                   
            }
            return RSRSLT;
    }
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2021-6-20 09:04
  • 签到天数: 1540 天

    [LV.Master]伴坛终老

     楼主| 发表于 2021-2-7 22:26 | 显示全部楼层
    void processFacesAndTheirBoundaries(AcBrBrep *pBrep)
    {
            AcBrBrepFaceTraverser faceTraverser;  // For solid, region or body
            AcBr::ErrorStatus ebs = faceTraverser.setBrep(*pBrep);
            AcBrFace face;

            for (faceTraverser.restart(); !faceTraverser.done(); faceTraverser.next())
            {
                    if (ebs==AcBr::eOk)
                    {
                            ebs = faceTraverser.getFace(face);
                            if (ebs==AcBr::eOk)
                            {
                                    AcGeNurbSurface nurbSurface;
                                    ebs = face.getSurfaceAsNurb(nurbSurface); // get surface geometry
                                    // do nurb processing here...
                                   
                                    processFaceBoundary(face); // process the face boundary.
                            }
                    }
            }
    }

    void processFaceBoundary(AcBrFace &face)
    {       
            AcBrBrep brep;
            AcBr::ErrorStatus ebs, bs;
            ebs = face.getBrep(brep);       
           
            AcBrBrepFaceTraverser ft;
            ebs = ft.setBrep(brep);

            AcBrFaceLoopTraverser flt;
            AcBrLoopEdgeTraverser let;

            AcBrLoop loop;
            AcBrEdge edge;

            ebs = flt.setFace(face);

            // Traverse through all loops (1)
            for(;!flt.done();flt.next())
            {
                    bs = flt.getLoop(loop);
                    if(bs != AcBr::eOk)
                            continue;

                    // Initialize the loop-edge-traverser
                    bs = let.setLoop(flt);

                    // Traverse through all edges (2)
                    for(;!let.done();let.next())
                    {
                            bs = let.getEdge(edge);
                            if(bs != AcBr::eOk)
                                    continue;

                            AcGeNurbCurve3d nurb;
                            bs = edge.getCurveAsNurb(nurb);
                            if(bs == AcBr::eOk)
                            {
                                    // do your nurb processing here
                            }
                    }
            }
    }
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2021-6-20 09:04
  • 签到天数: 1540 天

    [LV.Master]伴坛终老

     楼主| 发表于 2021-2-7 22:26 | 显示全部楼层
    Creation of the material:

    AcDbObjectId CreateMaterial(const AcString name, const AcString filePath)

    {

                    // Open the material dictionary for writing

                    AcDbDictionary *pMaterialDict;

                    Acad::ErrorStatus dbStatus;



                    if (acdbHostApplicationServices()->workingDatabase()->getMaterialDictionary(pMaterialDict, AcDb::kForWrite) == Acad::eOk)

                    {

                                    // Create and initialize the material

                                    AcDbMaterial *pMaterialObj = new AcDbMaterial();



                                    // Name

                                    pMaterialObj->setName(name);



                                    // Add material to dictionary

                                    AcDbObjectId materialId;

                                    dbStatus = pMaterialDict->setAt(name, pMaterialObj, materialId);

                                    assert(dbStatus == Acad::eOk);



                                    // Diffuse color

                                    AcGiMaterialColor diffuseColor;

                                    diffuseColor.setMethod(AcGiMaterialColor::kOverride);

                                    diffuseColor.setFactor(1.0);

                                    diffuseColor.setColor(AcCmEntityColor(0, 0, 255));



                                    // Diffuse map - null by default

                                    AcGiMaterialMap diffuseMap;



                                    AcGiImageFileTexture diffuseMapFile;

                                    diffuseMapFile.setSourceFileName(filePath);

                                    diffuseMap.setTexture(&diffuseMapFile);



                                    pMaterialObj->setDiffuse(diffuseColor, diffuseMap);



                                    // Set material mode to realistic.

                                    pMaterialObj->setMode(AcGiMaterialTraits::kRealistic);



                                    //// Create an opacity map and set into the material

                                    //double value;

                                    //AcGiMaterialMap opacityMap;

                                    //pMaterialObj->opacity(value, opacityMap);

                                    //pMaterialObj->setOpacity(1, opacityMap);



                                    // Close the material and dictionary

                                    pMaterialObj->close();

                                    pMaterialDict->close();



                                    return materialId;

                    }

                    return AcDbObjectId::kNull;

    }



    Applying the material to the box (convertedEnt is an AcDb3dSolid):

    AcDbObjectId materialId = CreateMaterial(_T("Custom"), _T("image path goes here"));

                                    if (convertedEnt->createBox(toConvert->XWidth, toConvert->YWidth, toConvert->Height) == Acad::eOk)

                                    { // successfully created a box

                                                    // rotate around the z-axis

                                                    AcGeMatrix3d rotMat = AcGeMatrix3d::rotation(dRotationRad, AcGeVector3d(0.0, 0.0, 1.0));

                                                    convertedEnt->transformBy(rotMat);

                                                    rotMat = AcGeMatrix3d::rotation(toConvert->ZRotation, AcGeVector3d(0.0, 0.0, 1.0));

                                                    convertedEnt->transformBy(rotMat);

                                                    // then move it to the correct location

                                                    AcGeMatrix3d moveMat = AcGeMatrix3d::translation(AcGeVector3d(toConvert->oint->X, toConvert->oint->Y, toConvert->oint->Z));

                                                    convertedEnt->transformBy(moveMat);

                                                    // and finally place the base on the correct plane

                                                    AcGeVector3d vecZ = AcGeVector3d(toConvert->ZAxis->X, toConvert->ZAxis->Y, toConvert->ZAxis->Z); vecZ.normalize();

                                                    AcGeMatrix3d planeMat = AcGeMatrix3d::worldToPlane(vecZ);

                                                    convertedEnt->transformBy(planeMat);



                                                    // apply texture

                                                    AcGiMapper mapper;

                                                    mapper.setProjection(AcGiMapper:rojection::kBox);

                                                    mapper.setUTiling(AcGiMapper::Tiling::kClamp);

                                                    mapper.setVTiling(AcGiMapper::Tiling::kTile);

                                                    mapper.setAutoTransform(AcGiMapper::AutoTransform::kObject);



                                                    AcGeMatrix3d mat;

                                                    double uScale = 2;

                                                    double vScale = 6;

                                                    mat.entry[0][0] = uScale; mat.entry[0][1] = 0; mat.entry[0][2] = 0; mat.entry[0][3] = 0;

                                                    mat.entry[1][0] = 0; mat.entry[1][1] = vScale; mat.entry[1][2] = 0; mat.entry[1][3] = 0;

                                                    mat.entry[2][0] = 0; mat.entry[2][1] = 0; mat.entry[2][2] = 1; mat.entry[2][3] = 0;

                                                    mat.entry[3][0] = 0; mat.entry[3][1] = 0; mat.entry[3][2] = 0; mat.entry[3][3] = 1;

                                                    mapper.setTransform(mat);



                                    /*           AcDbDatabase * pDb = acdbHostApplicationServices()->workingDatabase();

                                                    if (pDb != NULL)

                                                    {

                                                                    AcDbBlockTable *pBT;

                                                                    AOK(pDb->getBlockTable(pBT, AcDb::kForRead));

                                                                    AcDbBlockTableRecord *pBTR;

                                                                    AOK(pBT->getAt(ACDB_MODEL_SPACE, pBTR, AcDb::kForWrite));

                                                                    AOK(pBT->close());

                                                                    AOK(pBTR->appendAcDbEntity(convertedEnt));

                                                                    AOK(pBTR->close());

                                                    }*/



                                                    ErrorStatus es = acdbHostApplicationServices()->workingDatabase()->addAcDbObject(convertedEnt);

                                                    acutPrintf(_T("\nadd to db %i"), es);

                                                    es = convertedEnt->setMaterial(materialId, true);

                                                    acutPrintf(_T("\nset mat %i"), es);

                                                    es = convertedEnt->setMaterialMapper(mapper, true);

                                                    acutPrintf(_T("\nset mat mapper %i"), es);

                                    }
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2021-6-20 09:04
  • 签到天数: 1540 天

    [LV.Master]伴坛终老

     楼主| 发表于 2021-2-7 22:27 | 显示全部楼层
    jobject create3dSolid(JNIEnv* env, jobject& tempRecord, AcDbEntity *pEntity)
    {
           AcDbFaceterSettings faceter;
           AcGePoint3dArray vertexArray;
           AcArray<Adesk::Int32> faceArray;
           AcGiFaceData* faceData;
           //pEntity is pointing to an AcDb3dSolid object.
           Acad::ErrorStatus es = acdbGetObjectMesh(pEntity, &faceter, vertexArray, faceArray, faceData);
          
           if (es == Acad::eOk)
           {
                  cerr << "OK.\n";
                  cerr << vertexArray.length() << endl;
                  cerr << faceArray.length() << endl;
           }

           if (faceData)
           {
                  cerr << "faceData is not NULL. \n";
           }

           cerr << "Just before return \n";
           return NULL;
    }
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2021-6-20 09:04
  • 签到天数: 1540 天

    [LV.Master]伴坛终老

     楼主| 发表于 2021-2-7 22:28 | 显示全部楼层
    AcDbFaceterSettings faceter = {0.001, 0.001, 10, 1000, 1000, 3, 3, 2};
    AcGePoint3dArray vertexArray;
    AcArray<Adesk::Int32> faceArray;
    AcGiFaceData* faceData = NULL;
    Acad::ErrorStatus es = acdbGetObjectMesh(pEntity, &faceter, vertexArray, faceArray, faceData);
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2021-6-20 09:04
  • 签到天数: 1540 天

    [LV.Master]伴坛终老

     楼主| 发表于 2021-2-7 22:29 | 显示全部楼层
    hank you for your reply, actually my purpose is define a customed entity which contains multi-AcDb3dSolid.
    FYI:
    I have verified that AcDb3dSolid's copyFrom() actually copies the the underlying solid.
    I have tried use a pointer to a solid, but the issue is: during the "_copyclip" command excute on my customed entity, It's AcDb3dSolid-s
    data member seems lose data, for me, it's solid area becomes 0.
    ///////////////////////////////////////////////////////////////////////////////////////////////////////////
    see output:
    dwgOut solid area 600.0000
    dwgIn solid area 600.0000
    dwgOut solid area 600.0000
    dwgIn solid area 0.0000
    dwgOut solid area 0.0000
    ///////////////////////////////////////////////////////////////////////////////////////////////////////////
    code clip as below (now regardless the memory manage):
    class DLLIMPEXP MyEntity : public AcDbEntity
    {
    public:
    ACRX_DECLARE_MEMBERS(MyEntity) ;
    protected:
    static Adesk::UInt32 kCurrentVersionNumber ;
    public:
    MyEntity () ;
    virtual ~MyEntity () ;

    virtual Acad::ErrorStatus dwgOutFields (AcDbDwgFiler *pFiler) const ;
    virtual Acad::ErrorStatus dwgInFields (AcDbDwgFiler *pFiler) ;

    virtual Acad::ErrorStatus transformBy(const AcGeMatrix3d& xform);
    virtual Adesk::Boolean worldDraw (AcGiWorldDraw *mode) ;
    public:
    AcDbLine ll;
    AcArray solids;
    } ;
    Acad::ErrorStatus MyEntity::dwgOutFields (AcDbDwgFiler *pFiler) const
    {
    assertReadEnabled () ;
    Acad::ErrorStatus es =AcDbEntity::dwgOutFields (pFiler) ;
    if ( es != Acad::eOk ) return (es) ;

    if ( (es =pFiler->writeUInt32 (MyEntity::kCurrentVersionNumber)) != Acad::eOk ) return (es) ;

    ll.dwgOutFields(pFiler);

    es = pFiler->writeUInt32(solids.length());
    for (int i = 0; i < solids.length(); i++)
    {
    es = solids.at(i)->dwgOutFields(pFiler);
    double a;solids.at(i)->getArea(a); acutPrintf(_T("\n dwgOut solid area %.4f"), a);
    }
    return (pFiler->filerStatus ()) ;
    }

    Acad::ErrorStatus MyEntity::dwgInFields (AcDbDwgFiler *pFiler)
    {
    assertWriteEnabled () ;

    Acad::ErrorStatus es =AcDbEntity::dwgInFields (pFiler) ;
    if ( es != Acad::eOk ) return (es) ;

    Adesk::UInt32 version =0 ;
    if ( (es =pFiler->readUInt32 (&version)) != Acad::eOk ) return (es) ;
    if ( version > MyEntity::kCurrentVersionNumber ) return (Acad::eMakeMeProxy) ;

    ll.dwgInFields(pFiler);

    solids.removeAll();
    Adesk::UInt32 n = 0;
    es = pFiler->readUInt32(&n);
    for (int i = 0; i < n; i++)
    {
    AcDb3dSolid* e = new AcDb3dSolid();
    e->dwgInFields(pFiler);
    solids.append(e);
    double a;solids.at(i)->getArea(a); acutPrintf(_T("\n dwgIn solid area %.4f"), a);
    }
    return (pFiler->filerStatus ()) ;
    }

    //-----------------------------------------------------------------------------
    //----- AcDbEntity protocols
    Adesk::Boolean MyEntity::worldDraw (AcGiWorldDraw *mode)
    {
    assertReadEnabled () ;
    return ll.worldDraw(mode);
    }
    Acad::ErrorStatus MyEntity::transformBy(const AcGeMatrix3d& xform)
    {
    assertWriteEnabled();
    return ll.transformBy(xform);
    }
    //test command function
    void test5()
    {
    MyEntity* pEnt = new MyEntity();
    pEnt->ll.setStartPoint(AcGePoint3d(100, 100, 0));
    pEnt->ll.setEndPoint(AcGePoint3d(500, 500, 0));

    AcDb3dSolid* sod1 = new AcDb3dSolid();
    sod1->createBox(10, 10, 10);

    pEnt->solids.append(sod1);

    appendEnt(pEnt);
    }
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2021-6-20 09:04
  • 签到天数: 1540 天

    [LV.Master]伴坛终老

     楼主| 发表于 2021-2-7 22:30 | 显示全部楼层
    cGePoint3d acOrigin((dXmin + dXmax)/2.0, (dYmin + dYmax)/2.0, dZ);

    AcGeVector3d acAxisOfSymmetry(0,0,1.0);


    acdbModelerStart();
    AcGeCylinder* pGeCylinder = new AcGeCylinder(50,
    acOrigin,
    acAxisOfSymmetry);

    acdbAcisDeleteModelerBulletins(); // Memory efficiency thing from autodesk
    AcDb3dSolid* pDbCylinder = new AcDb3dSolid();

    pDbCylinder->createSphere(5000);
    pDbCylinder->setLayer(pszPerimLayerName);
    pDbCylinder->setColor(acColor);

    AcDbBlockTableRecord* pRecord;
    Acad::ErrorStatus eError = m_pBlockTable->getAt(ACDB_MODEL_SPACE, pRecord, m_eOpenMode);

    if(eError == Acad::eOk)
    {
    eError = pRecord->appendAcDbEntity(pDbCylinder);

    if(eError == Acad::eOk)
    {
    // The solid must be closed.
    pDbCylinder->close();
    }
    else
    {
    throw new CError(eError);
    }
    }
    acdbModelerEnd();

    delete pGeCylinder;
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2021-6-20 09:04
  • 签到天数: 1540 天

    [LV.Master]伴坛终老

     楼主| 发表于 2021-2-7 22:30 | 显示全部楼层
    static void Asdk_TESTLOFT(void)

          {

                AcDbLine *pLine1 = new AcDbLine(AcGePoint3d( 0.0, 0.0, 0.0), AcGePoint3d( 0.0, 100.0, 0.0 ));

                AcDbLine *pLine2 = new AcDbLine(AcGePoint3d( 0.0, 100.0, 0.0), AcGePoint3d( 0.0, 100.0, 70.0 ));

                AcDbLine *pLine3 = new AcDbLine(AcGePoint3d( 0.0, 100.0, 70.0), AcGePoint3d( 0.0, 0.0, 70.0 ));   

                AcDbLine *pLine4 = new AcDbLine(AcGePoint3d( 0.0, 0.0, 70.0), AcGePoint3d( 0.0, 0.0, 0.0 ));



                AcDbVoidPtrArray curveArray1;

                curveArray1.append(pLine1);

                curveArray1.append(pLine2);

                curveArray1.append(pLine3);

                curveArray1.append(pLine4);



                AcDbVoidPtrArray regArr1;

                Acad::ErrorStatus aEs = AcDbRegion::createFromCurves(curveArray1, regArr1);

                delete pLine1;

                delete pLine2;

                delete pLine3;

                delete pLine4;

                if(aEs != Acad::eOk)

                      return;



                AcDbRegion *pRegion1 = (AcDbRegion *)regArr1.at(0);



                AcDbLine *pLine5 = new AcDbLine(AcGePoint3d( 300, 0.0 , 0.0), AcGePoint3d( 300, 100.0 , 0.0));

                AcDbLine *pLine6 = new AcDbLine(AcGePoint3d( 300.0, 100.0, 0.0), AcGePoint3d( 300.0, 100.0, 35.0));

                AcDbLine *pLine7 = new AcDbLine(AcGePoint3d( 300, 100.0 , 35.0), AcGePoint3d( 300.0, 0.0, 35.0 ));

                AcDbLine *pLine8 = new AcDbLine(AcGePoint3d( 300.0, 0.0, 35.0), AcGePoint3d( 300.0, 0.0, 0.0));



                AcDbVoidPtrArray curveArray2;

                curveArray2.append(pLine5);

                curveArray2.append(pLine6);

                curveArray2.append(pLine7);

                curveArray2.append(pLine8);



                AcDbVoidPtrArray regArr2;

                aEs = AcDbRegion::createFromCurves(curveArray2, regArr2);

                delete pLine5;

                delete pLine6;

                delete pLine7;

                delete pLine8;

                if(aEs != Acad::eOk)

                      return;

                AcDbRegion *pRegion2 = (AcDbRegion *)regArr2.at(0);



                AcGePoint3d startPnt(0.0, 50.0, 0.0);

                AcGePoint3d endPnt(300.0, 50.0, 0.0);

                AcGePoint3dArray fitPnts;

                fitPnts.append(startPnt);

                fitPnts.append(endPnt);



                AcGeVector3d startTan(0.1223, 2.1674, 0);

                AcGeVector3d endTan(0.8968, 1.2518, 0.0);



                AcDbSpline *pGuideSpline = new AcDbSpline(fitPnts,  startTan, endTan, AcGe::kChord, 4, 0.0);



                AcArray< AcDbEntity *> crossCurvesArr;

                AcArray< AcDbEntity *> guideCuvesArr;

                AcDbEntity *pPathEntity = NULL;

                AcDbLoftOptions loftOption;



                crossCurvesArr.append(pRegion1);

                crossCurvesArr.append(pRegion2);



                guideCuvesArr.append(pGuideSpline);



                AcDb3dSolid *pLoftedSolid = new AcDb3dSolid;



                // crash in 2015; ok in 2012;

                aEs = pLoftedSolid->createLoftedSolid(crossCurvesArr, guideCuvesArr, pPathEntity, loftOption);

               

                delete pGuideSpline;

                if(aEs != Acad::eOk){

                      delete pLoftedSolid;

                      return;

                }



                AcDbObjectId id3;



                addToModelSpace(pLoftedSolid, id3);

          }
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2021-6-20 09:04
  • 签到天数: 1540 天

    [LV.Master]伴坛终老

     楼主| 发表于 2021-2-7 22:31 | 显示全部楼层
    AcDb3dSolid::extrudeAlongPath()
    Is it possible to perform the extrusion of solid using non-resident in database objects located in the memory?
    This example fails:

    AcDbLine *pL1, *pL2, *pL3, *pPath;
    AcGePoint3d start, end;
    AcDb3dSolid *pSol=new AcDb3dSolid;
    AcDbVoidPtrArray CurvesArr(0,1), RegionsArr(0,1);
    AcDbRegion *pReg;

    start.set(0,0,0);
    end.set(100,0,0);
    pL1=new AcDbLine(start,end);

    start.set(100,0,0);
    end.set(100,100,0);
    pL2=new AcDbLine(start,end);

    start.set(100,100,0);
    end.set(0,0,0);
    pL3=new AcDbLine(start,end);

    start.set(0,0,0);
    end.set(0,0,100);
    pPath=new AcDbLine(start,end);

    CurvesArr.append(pL1);
    CurvesArr.append(pL2);
    CurvesArr.append(pL3);

    acutPrintf("B4: %d\n",RegionsArr.length());
    AcDbRegion::createFromCurves(CurvesArr,RegionsArr);
    acutPrintf("After: %d\n",RegionsArr.length());

    pReg=(AcDbRegion *)RegionsArr.at(0);

    pSol->extrudeAlongPath(pReg,pPath); //THIS FUNCTION FAILS!!!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2021-6-20 09:04
  • 签到天数: 1540 天

    [LV.Master]伴坛终老

     楼主| 发表于 2021-2-7 22:31 | 显示全部楼层
    his example fails:
    AcDbLine *pL1, *pL2, *pL3, *pPath;
    AcGePoint3d start, end;

    AcDb3dSolid *pSol=new AcDb3dSolid;
    AcDbVoidPtrArray CurvesArr(0,1),
    RegionsArr(0,1);
    AcDbRegion *pReg;
    start.set(0,0,0);
    end.set(100,0,0);
    pL1=new AcDbLine(start,end);
    start.set(100,0,0);
    end.set(100,100,0);
    pL2=new
    AcDbLine(start,end);
    start.set(100,100,0);
    end.set(0,0,0);
    pL3=new AcDbLine(start,end);
    start.set(0,0,0);
    end.set(0,0,100);
    pPath=new AcDbLine(start,end);
    CurvesArr.append(pL1);
    CurvesArr.append(pL2);

    CurvesArr.append(pL3);
    acutPrintf("B4: %d\n",RegionsArr.length());

    AcDbRegion::createFromCurves(CurvesArr,RegionsArr);
    acutPrintf("After:
    %d\n",RegionsArr.length());
    pReg=(AcDbRegion *)RegionsArr.at(0);
    pSol->extrudeAlongPath(pReg,pPath); //THIS FUNCTION
    FAILS!!!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2021-6-20 09:04
  • 签到天数: 1540 天

    [LV.Master]伴坛终老

     楼主| 发表于 2021-2-7 22:32 | 显示全部楼层
    AcDb3dSolid* CHole::make3D(const AcGePoint3d &ptUbic, const double &dAng, const double &dDem)
    {
    AcDb3dSolid* p3D = NULL;
    AcDbPolyline* pPoly = NULL;
    AcDbRegion *pRegion = NULL;
    AcGeVector3d transVec;

    AcGePoint3dArray vertices;
    AcGePoint2d pt;
    int ptCount = 0;
    int i = 0;

    try
    {
    //To get points shown in fig. 1:
    if (!calcPts3d(ptUbic, dAng, dDem))
    throw 0;

    //
    // Polyline.
    //
    pPoly = new AcDbPolyline;
    if (!pPoly)
    throw 0;

    ptCount = 6;
    vertices.append(m_pts.at(0));
    vertices.append(m_pts.at(1));
    vertices.append(m_pts.at(4));
    vertices.append(m_pts.at(5));
    vertices.append(m_pts.at(3));
    vertices.append(m_pts.at(2));

    for (i = 0; i < ptCount; i++)
    {
    pt.set(vertices.x, vertices.y);
    if (pPoly->addVertexAt(i, pt) != Acad::eOk)
    throw 1;
    }

    pPoly->setElevation(ptUbic.z);
    pPoly->setClosed(Adesk::kTrue);
    pPoly->setDatabaseDefaults();
    //This polyline is fine.

    //
    // Region.
    //
    pRegion = ChcUtils::make1Region((void *)pPoly);
    if (!pRegion)
    throw 2;
    delete pPoly;
    pPoly = NULL;

    p3D = new AcDb3dSolid;

    if (!p3D)
    throw 3;

    //Axis of revolution. HERE IS THE PROBLEM?
    transVec = (ChcUtils::ucsToWcs(m_pts.at(2))
    -
    ChcUtils::ucsToWcs(m_pts.at(0))
    );

    //Making the solid. HERE IS THE PROBLEM?
    if (p3D->revolve(pRegion, ptUbic, transVec, Chc01Const::A360)!= Acad::eOk)
    throw 4;
    //This region is fine.

    delete (AcRxObject*)pRegion;
    pRegion = NULL;

    return p3D;
    }
    catch (...)
    {
    if (p3D)
    delete p3D;

    if (pPoly)
    delete pPoly;

    if (pRegion)
    delete (AcRxObject*)pRegion;

    return NULL;
    }
    }

    //Function to substract.
    void CBigSolid::makeHole()
    {
    //.....
    //.....
    //.....

    pHole3D = pHole->make3D(ptoUbic, angle, dem);

    //HERE, MY PROGRAMM CRASHES:
    pBigSolid->booleanOper(AcDb::kBoolSubtract, pHole3D);
    //’pHole3D’ and ‘pBigSolid’ are fine.
    }

    //
    //
    //
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2021-6-20 09:04
  • 签到天数: 1540 天

    [LV.Master]伴坛终老

     楼主| 发表于 2021-2-7 22:34 | 显示全部楼层
    AcDb3dSolid* CHole::make3D(const AcGePoint3d &ptUbic, const double &dAng, const double &dDem)
    {
    AcDb3dSolid* p3D = NULL;
    AcDbPolyline* pPoly = NULL;
    AcDbRegion *pRegion = NULL;
    AcGeVector3d transVec;

    AcGePoint3dArray vertices;
    AcGePoint2d pt;
    int ptCount = 0;
    int i = 0;

    try
    {
    //To get points shown in fig. 1:
    if (!calcPts3d(ptUbic, dAng, dDem))
    throw 0;

    //
    // Polyline.
    //
    pPoly = new AcDbPolyline;
    if (!pPoly)
    throw 0;

    ptCount = 6;
    vertices.append(m_pts.at(0));
    vertices.append(m_pts.at(1));
    vertices.append(m_pts.at(4));
    vertices.append(m_pts.at(5));
    vertices.append(m_pts.at(3));
    vertices.append(m_pts.at(2));

    for (i = 0; i < ptCount; i++)
    {
    pt.set(vertices.x, vertices.y);
    if (pPoly->addVertexAt(i, pt) != Acad::eOk)
    throw 1;
    }

    pPoly->setElevation(ptUbic.z);
    pPoly->setClosed(Adesk::kTrue);
    pPoly->setDatabaseDefaults();
    //This polyline is fine.

    //
    // Region.
    //
    pRegion = ChcUtils::make1Region((void *)pPoly);
    if (!pRegion)
    throw 2;
    delete pPoly;
    pPoly = NULL;

    p3D = new AcDb3dSolid;

    if (!p3D)
    throw 3;

    //Axis of revolution. HERE IS THE PROBLEM?
    transVec = (ChcUtils::ucsToWcs(m_pts.at(2))
    -
    ChcUtils::ucsToWcs(m_pts.at(0))
    );

    //Making the solid. HERE IS THE PROBLEM?
    if (p3D->revolve(pRegion, ptUbic, transVec, Chc01Const::A360)!= Acad::eOk)
    throw 4;
    //This region is fine.

    delete (AcRxObject*)pRegion;
    pRegion = NULL;

    return p3D;
    }
    catch (...)
    {
    if (p3D)
    delete p3D;

    if (pPoly)
    delete pPoly;

    if (pRegion)
    delete (AcRxObject*)pRegion;

    return NULL;
    }
    }

    //Function to substract.
    void CBigSolid::makeHole()
    {
    //.....
    //.....
    //.....

    pHole3D = pHole->make3D(ptoUbic, angle, dem);

    //HERE, MY PROGRAMM CRASHES:
    pBigSolid->booleanOper(AcDb::kBoolSubtract, pHole3D);
    //’pHole3D’ and ‘pBigSolid’ are fine.
    }

    //
    //
    //
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2021-6-20 09:04
  • 签到天数: 1540 天

    [LV.Master]伴坛终老

     楼主| 发表于 2021-2-7 22:35 | 显示全部楼层
    Here is a simplest example using createRevolvedSolid.

    It creates a cylinder by revolving a line about the Z axis. Hope this provides you a starting point.



    AcGePoint3d sp(10.0, 0.0, 0.0);
    AcGePoint3d ep(10.0, 0.0, 10.0);
    AcDbLine *pRevEnt = new AcDbLine(sp, ep);

    Acad::ErrorStatus es;
    AcDb3dSolid* pShapeSld = new AcDb3dSolid ();
    AcDbRevolveOptions revolveOptions;

    revolveOptions.setDraftAngle(0.0);

    if((es = pShapeSld->createRevolvedSolid(
            pRevEnt,
            AcGePoint3d::kOrigin,
            AcGeVector3d::kZAxis,
            6.28318530718,
            0.0,
            revolveOptions
            )) != Acad::eOk)
    {
            acutPrintf(L"\nSolid creation failed...\n");
            delete pShapeSld;
            return;
    }
    pShapeSld->setColorIndex(2);

    AcDbObjectId id;
    postToDb(pShapeSld, id);


    Here is the postToDb method :

    static Acad::ErrorStatus postToDb(AcDbEntity* ent, AcDbObjectId& objId)
    {
            Acad::ErrorStatus      es;
            AcDbBlockTable*        pBlockTable;
            AcDbBlockTableRecord*  pSpaceRecord;

            if ((es = acdbHostApplicationServices()->workingDatabase()->
                       getSymbolTable(pBlockTable, AcDb::kForRead))
                       != Acad::eOk) {
                    return es;
            }

            if ((es = pBlockTable->getAt(ACDB_MODEL_SPACE,
                                                                     pSpaceRecord,
                                                                     AcDb::kForWrite)) != Acad::eOk) {
                    return es;
            }

            if ((es = pBlockTable->close()) != Acad::eOk) {
                    return es;
            }

            if ((es = pSpaceRecord->appendAcDbEntity(objId, ent)) != Acad::eOk) {
                    return es;
            }

            if ((es = pSpaceRecord->close()) != Acad::eOk) {
                    return es;
            }

            return ent->close();
    }
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2021-6-20 09:04
  • 签到天数: 1540 天

    [LV.Master]伴坛终老

     楼主| 发表于 2021-2-7 22:46 | 显示全部楼层
    AcDbDatabase::insert Function's bug in AcDb3dSolid with material?
    I used AcDbDatabase::insert function to insert a AcDb3dSolid with material.The codes are as list:

      AcDbDatabase db(Adesk::kFalse);

      if(db.readDwgFile(strBlkFile) == Acad::eOk)
      {
       pCurDb->insert(blkRecId, strBlkName, &db);
      }



      pBlkRef = new AcDbBlockReference();
      if (pBlkRef != NULL)
      {
       pBlkRef->setBlockTableRecord(blkRecId);
      }



        AcDbVoidPtrArray hardwareSet;
        pHardware->explode(hardwareSet);
        for (int i = 0; i < hardwareSet.length(); i++)
        {
               //add hardwareSet[i] to ModelSpace;

        }



    All the results is OK. I get some AcDb3dSolid with curret material.When I list the solid,I got the list:

                      3DSOLID   图层: 0
                                空间: 模型空间
                            材质: AAABBB
                       句柄 = 18f
                历史记录 = 记录
              显示历史记录 = 否
                     But when I save this dwg file and re-open the file,I found that the material lost. And when I list the solid, it was changed:


                      3DSOLID   图层: 0
                                空间: 模型空间
                            材质: AAABBB
                       句柄 = 18f
       面1 材质 = 全局
       面2 材质 = 全局
       面3 材质 = 全局
       面4 材质 = 全局
       面5 材质 = 全局
       面6 材质 = 全局
       面7 材质 = 全局
                历史记录 = 记录
              显示历史记录 = 否
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2021-6-20 09:04
  • 签到天数: 1540 天

    [LV.Master]伴坛终老

     楼主| 发表于 2021-2-7 22:48 | 显示全部楼层
    [source=cpp ObjectARX ]

    ACHAR * result=nil;

    AcDb3dSolid * pSolid=nil;
      pSolid = (AcDb3dSolid *)pObj;
      if (pSolid==nil)
        { pObj->close();
          pObj=nil;
          exitif(1,"g334.error 3d");
       };

      if (pSolid->isNull)
        { pObj->close();
          pObj=nil;
          exitif(1,"g334.error nil");
       };

      result=pSolid->SoildType()????
      pObj->close();
      pObj==nil;
      pSolid->close();
      pSolid=nil;

    [/source=cpp ObjectARX ]



    Smiley Frustrated

    I found Visual LISP  source,bellow:



    [source=visual-lisp ]]

    (vl-load-com)
    (if (and
          ;; solid selection
          (setq cyl (car (entsel "\nSelect a cylinder: ")))

          ;; changing ename to vla-object
          (setq cyl (vlax-ename->vla-object cyl))

          ;; checking if it's a 3d solid
          (= (vla-get-ObjectName cyl) "AcDb3dSolid")

          ;; checking if it's a cylinder (primitive)
          (= (vl-catch-all-apply 'vla-get-SolidType (list cyl))
         "Cylindre"
          )
        )

      (setq
        ;; cylinder height
        ht    (* 2
           (distance (vlax-get cyl 'Position) (vlax-get cyl 'centroid))
        )

        ;; cylinder radius
        rad    (sqrt (/ (vla-get-Volume cyl) (* pi ht)))
      )

      (princ "\nUnvalid Entity.")
    [/source=visual-lisp ]
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2021-6-20 09:04
  • 签到天数: 1540 天

    [LV.Master]伴坛终老

     楼主| 发表于 2021-2-7 22:48 | 显示全部楼层
    desk::Boolean MJBHollowcore::worldDraw(AcGiWorldDraw* mode)
    {
    assertReadEnabled();

    if(drawBody() == Acad::eOk)
    {
    m_pBody->worldDraw(mode);
    }
    return AcDbEntity::worldDraw(mode);
    }

    Here is the drawBody() function:
    Acad::ErrorStatus MJBHollowcore::drawBody()
    {
    AcGeVector3d vL, vW, vLW;
    vL.set(m_Length, 0, 0);
    vW.set(0, m_Width, 0);
    vLW.set(m_Length, m_Width, 0);

    AcDbVoidPtrArray lines;
    lines.append(new AcDbLine(m_Origin, m_Origin + vL));
    lines.append(new AcDbLine(m_Origin + vL, m_Origin + vLW));
    lines.append(new AcDbLine(m_Origin + vLW, m_Origin + vW));
    lines.append(new AcDbLine(m_Origin + vW, m_Origin));

    AcDbVoidPtrArray regions;
    Acad::ErrorStatus es = AcDbRegion::createFromCurves(lines, regions);

    if(es == Acad::eOk)
    {
    m_pBody = new AcDb3dSolid();

    es = m_pBody->extrude((AcDbRegion*)regions[0], m_Thickness, 0);
    if(es != Acad::eOk)
    {
    delete m_pBody;
    return es;
    }
    m_pBody->close();
    }

    for(int i = 0; i < lines.length(); i++)
    {
    AcDbLine* pLine = (AcDbLine*)lines;
    delete pLine;
    }
    return es;
    }
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2021-6-20 09:04
  • 签到天数: 1540 天

    [LV.Master]伴坛终老

     楼主| 发表于 2021-2-7 22:54 | 显示全部楼层
    static bool callDrawMethod(const AcDbEntity *pEnt,AcGePoint3dArray &points,
                               bool isEaiObject,double mainDeviation = 1.0,
                               const AcGiRegenType type = kAcGiHideOrShadeCommand,
                                                       bool bBlkRef = false)
    {   
        Adesk::Boolean doViewport;
           
        AcGePoint3dArray lpoints(100,1000);
        static double deviation = getDeviation();
        if(isEaiObject && !isTooling(pEnt))
        {
            deviation = mainDeviation;
            }
            else
            {
                    if(deviation < 1e-5)
                    {
                            deviation = getDeviation();
                    }
                    else
                    {
                            deviation = mainDeviation;
                    }
            }

            //ExampleTranCustomWorldDraw::rxInit();  

            ExampleTranCustomWorldDraw *world = new ExampleTranCustomWorldDraw(&lpoints,type);
        if(world)
        {
            world->setUseMatrix(true);
                    if(!bBlkRef)
            {
                            world->geometry().pushModelTransform(ExampleTranDataMgr.docData().BaseXform);
                    }
            world->setDeviation(deviation);
                    if (!pEnt->isKindOf(AcDb3dSolid::desc())) {
                            doViewport = const_cast<AcDbEntity*>(pEnt)->worldDraw(world);// code crashes here
                    }
                    else
                    {
                            //ExampleTranCustomWorldDraw::rxInit();
                            //world->rxInit();
                            doViewport = const_cast<AcDbEntity*>(pEnt)->worldDraw(world);
                    }
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    关闭

    推荐膜材品牌上一条 /6 下一条

    进口膜材 国产膜材 pvdf膜材ptfe膜材ETFE膜材
    最好的膜结构公司 一级膜结构资质 膜结构一级资质
    膜结构设计-膜结构十大品牌-etfe设计-充气膜结构
    诺科膜结构
    遨都膜结构设计
    中国膜结构网
    中国空间膜结构

    QQ|申请友链|手机版|中国膜结构论坛