找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 995|回复: 7

[求助]:三维实体绘制问题

[复制链接]
发表于 2006-7-21 10:27:37 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
需要实现一个功能,给点空间任意两个AcGePoint3d,需要沿着这条空间曲线绘制一个长方体,请问如何实现?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2006-7-21 16:59:43 | 显示全部楼层
//-----------------------------------------------------------------------------
// This is command 'CREATE, by HongxianQin [2005-4-13], Developer Department, AutoCAD
void Bpucreate()
{

        AcDbBlockTable *pBlkTable;
        AcDbBlockTableRecord* pBlkTableRecord;
        acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBlkTable,AcDb::kForRead);

        pBlkTable->getAt(ACDB_MODEL_SPACE,pBlkTableRecord,AcDb::kForWrite);
        pBlkTable->close();

        AcGePoint2dArray ptArray;
        AcDbPolyline* pPoly;
        AcDbObjectId idExtrude;
        AcGePoint2d ptInput;
        AcGePoint2d ptVertex;
        Acad::ErrorStatus es;

        for(int j = 0;j<4;j++)
        {
                acedGetPoint(NULL,"选择点\n",asDblArray(ptInput));
                ptArray.append(ptInput);
        }


        pPoly = new AcDbPolyline(4);
       
        for(int i = 0; i < ptArray.length(); i++)
        {
                ptVertex = ptArray.at(i);
                pPoly->addVertexAt(i, ptVertex);
        }
       
        pPoly->setClosed(Adesk::kTrue);
       
        es = pBlkTableRecord->appendAcDbEntity(idExtrude, pPoly);
        pBlkTableRecord->close();
       
        pPoly->close();
       


}



void CreateSolidExtrude(AcDbPolyline* pPoly,AcDbObjectId &idExtrude,double height,double taper)
{

        AcDbBlockTable *pBlkTable;
        AcDbBlockTableRecord* pBlkTableRecord;


        Acad::ErrorStatus es;
    AcDbVoidPtrArray lines;
    AcDbVoidPtrArray regions;
       
    //AcDbObject   *pObj = NULL;
    //AcDbObjectId  idEnt;
    //ads_name      ename;
    //ads_point     pickpt;

        acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBlkTable,AcDb::kForRead);
        pBlkTable->getAt(ACDB_MODEL_SPACE,pBlkTableRecord,AcDb::kForWrite);
        pBlkTable->close();
       
        //acedEntSel("\nSelect a polygon: ",ename, pickpt);       
        //acdbGetObjectId(idEnt, ename);
       
        //AcDbEntity  *pEnt;
        //acdbOpenObject(pPoly,idEnt,AcDb::kForWrite);


    pPoly->explode(lines);
       
    // Create a region from the set of lines.

    AcDbRegion::createFromCurves(lines, regions);
    //assert(regions.length() == 1);
    AcDbRegion *pRegion  = AcDbRegion::cast((AcRxObject*)regions[0]);
    //assert(pRegion != NULL);

    // Extrude the region to create a solid.
    AcDb3dSolid *pSolid = new AcDb3dSolid;
    pSolid->extrude(pRegion, height, taper);
       
//        acedGetVar()
/*
        for (int i = 0; i < lines.length(); i++) {
            delete (AcRxObject*)lines;
        }
           
        for (i = 0; i < regions.length(); i++) {
            delete (AcRxObject*)regions;
        }*/
   
       
    pSolid->setPropertiesFrom(pPoly);
        es = pBlkTableRecord->appendAcDbEntity(idExtrude, pSolid);
       
        //pSolid->draw();
        /////////////////////////////////////////
        pBlkTableRecord->close();
       
        pPoly->close();
        pSolid->close();


}
//-----------------------------------------------------------------------------
// This is command 'CREATESD, by HongxianQin [2005-4-13], Developer Department, AutoCAD
void Bpucreatesd()
{

        AcDbBlockTable *pBlkTable;
        AcDbBlockTableRecord* pBlkTableRecord;

        AcDbPolyline* pPoly= NULL;
        AcDbObjectId idExtrude;
        double height= 50.0;
        Acad::ErrorStatus es;
    AcDbVoidPtrArray lines;
    AcDbVoidPtrArray regions;
       
    AcDbObject   *pObj = NULL;
    AcDbObjectId  idEnt;
    ads_name      ename;
    ads_point     pickpt;

        acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBlkTable,AcDb::kForRead);
        pBlkTable->getAt(ACDB_MODEL_SPACE,pBlkTableRecord,AcDb::kForWrite);
        pBlkTable->close();
       
        acedEntSel("\nSelect a polygon: ",ename, pickpt);
       
        acdbGetObjectId(idEnt, ename);
       
        //AcDbEntity  *pEnt;
        acdbOpenObject(pPoly,idEnt,AcDb::kForWrite);


    pPoly->explode(lines);
       
    // Create a region from the set of lines.

    AcDbRegion::createFromCurves(lines, regions);
    //assert(regions.length() == 1);
    AcDbRegion *pRegion  = AcDbRegion::cast((AcRxObject*)regions[0]);
    //assert(pRegion != NULL);
       
    // Extrude the region to create a solid.
    AcDb3dSolid *pSolid = new AcDb3dSolid;
    pSolid->extrude(pRegion, height, 0.4);
       
/*
        for (int i = 0; i < lines.length(); i++) {
            delete (AcRxObject*)lines;
        }
           
        for (i = 0; i < regions.length(); i++) {
            delete (AcRxObject*)regions;
        }*/
   
       
    pSolid->setPropertiesFrom(pPoly);
        es = pBlkTableRecord->appendAcDbEntity(idExtrude, pSolid);
       
        //pSolid->draw();
        /////////////////////////////////////////
        pBlkTableRecord->close();
       
        pPoly->close();
        pSolid->close();
}

//-----------------------------------------------------------------------------
// This is command 'SOLIDTEST, by HongxianQin [2005-4-13], Developer Department, AutoCAD
void BpusolidTest()
{

        //创建轮廓线
       
        AcGePoint2dArray ptArray;
        AcDbPolyline* pPoly;
        AcDbObjectId idPoly1,idPoly2;
        AcGePoint2d ptInput;
        AcGePoint2d ptVertex;
       
        for(;acedGetPoint(NULL,"选择点\n",asDblArray(ptInput))==RTNORM;)
        {

                ptArray.append(ptInput);
        }
       
       
        pPoly = new AcDbPolyline(ptArray.length());
       
        for(int i = 0; i < ptArray.length(); i++)
        {
                ptVertex = ptArray.at(i);
                pPoly->addVertexAt(i, ptVertex);
        }
       
        pPoly->setClosed(Adesk::kTrue);
       
        addToModelSpace(idPoly1,pPoly);
       

        //创建轮廓线2
    AcDbPolyline *pPloyOut;
    acdbOpenObject(pPloyOut, idPoly1, AcDb::kForRead);
       
    // Now generate an ellipse offset by 0.5 drawing units.
    //
    AcDbVoidPtrArray curves;
    pPloyOut->getOffsetCurves(20.0, curves);
    pPloyOut->close();
       
    addToModelSpace(idPoly2, (AcDbEntity*)curves[0]);
       
        //

        acdbOpenObject(pPoly,idPoly1,AcDb::kForWrite);

        AcDbObjectId idSolid1,idSolid2;

        CreateSolidExtrude(pPoly,idSolid1,500.0,0.0);
        acdbOpenObject(pPloyOut,idPoly2,AcDb::kForWrite);
        CreateSolidExtrude(pPloyOut,idSolid2,500.0,0.5);       

        AcDb3dSolid *pSolid ;  
        acdbOpenObject(pSolid,idSolid2,AcDb::kForWrite);
       
        AcGeMatrix3d   mat;
        mat.setTranslation(AcGeVector3d(0,0,500.0));
        pSolid->transformBy(mat);
        pSolid->close();

       
}

Acad::ErrorStatus
addToModelSpace(AcDbObjectId &objId, AcDbEntity* pEntity)
{
    AcDbBlockTable *pBlockTable;
    AcDbBlockTableRecord *pSpaceRecord;
       
    acdbHostApplicationServices()->workingDatabase()
        ->getSymbolTable(pBlockTable, AcDb::kForRead);
    pBlockTable->getAt(ACDB_MODEL_SPACE, pSpaceRecord,
        AcDb::kForWrite);
       
    pSpaceRecord->appendAcDbEntity(objId, pEntity);
       
    pBlockTable->close();
    pEntity->close();
    pSpaceRecord->close();
       
    return Acad::eOk;
}
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-7-21 18:04:36 | 显示全部楼层
非常感谢你的答复。
你的程序中用的是AcGePoint2d ptInput,这样生成的截面是在XY平面上,然后再向Y轴拉伸。
我需要做到的是空间的两个点,起点和端点连接成空间直线,那么截面的原点在起点,截面的法向是两点连成的直线,拉伸是沿着这条空间直线。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-7-21 23:55:07 | 显示全部楼层
在原点创建长方体,然后移动他
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-7-22 12:04:17 | 显示全部楼层
可以用拉伸的方法实现
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-7-22 20:12:12 | 显示全部楼层
谢谢各位,给了我很大的帮助,我试试.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-7-23 18:07:10 | 显示全部楼层
5楼的朋友能说的详细些吗?
我用过直接调用CAD命令的方式来做,但是有时候会出现无法拉伸的现象,
如果是画圆柱,可以设置截面园的vector,能实现我需要的功能,就是画非园的截面,不知道如何将XY平面的坐标转换到空间直线的法平面上
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2个

财富等级: 恭喜发财

发表于 2008-6-13 08:35:37 | 显示全部楼层
我需要这段代码?
可我不能下怎么办?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-9-24 06:20 , Processed in 0.415467 second(s), 46 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表