设为首页收藏本站

中国膜结构网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于一组相互相交的图元(直线、多段线、圆弧、圆…)创建闭合多段线

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

    [LV.Master]伴坛终老

    发表于 2021-2-8 01:49 | 显示全部楼层 |阅读模式
    1. //------------------------------------------------------------------------------
    2. void Debug::Test()
    3. //------------------------------------------------------------------------------
    4. {
    5.         pErrorManager->InfoToLogFile(_T("\nTesting ... show area"));
    6.         Acad::ErrorStatus es = Acad::eOk;
    7.         AreaUnit AreaUnit;
    8.         AreaValue AreaVal;

    9.         UnitSettings* pUnitSettings = pApp->GetUnitSettings();
    10.         if (pUnitSettings != NULL)
    11.         {
    12.                 pUnitSettings->GetUserUnit(&AreaUnit);
    13.         }

    14.         int mode = -1;
    15.         int stat;
    16.         int opt;

    17.         acedInitGet(RSG_NONULL, 0);
    18.         stat = acedGetInt(_T("\nSelect Show Area Option:\n  1) Show only\n  2) Show and label\n  3) Show and create\n  4) Show, label and create\nOption: "), &opt);

    19.         switch (stat)
    20.         {
    21.                 case RTNORM:
    22.                 {
    23.                         switch (opt)
    24.                         {
    25.                                 case 1: // Show only
    26.                                 case 2: // Show and label
    27.                                 case 3: // Show and create
    28.                                 case 4: // Show label and create
    29.                                 {
    30.                                         mode = opt;
    31.                                 } break;
    32.                                 default:
    33.                                         pApp->DisplayMessage(IDS_BAD_USER_TOOL);
    34.                                         break;
    35.                         }
    36.                 } break;

    37.                 case RTKWORD:
    38.                 case RTCAN:
    39.                 {
    40.                         return; // user cancelled
    41.                 }

    42.                 default:
    43.                 {
    44.                         pApp->DisplayMessage(IDS_BAD_USER_TOOL);
    45.                 } break;
    46.         }

    47.         if (mode != -1)
    48.         {
    49.                 AcCmColor colnew;
    50.                 AcDb::LineWeight lwnew;
    51.                 resbuf bufcolstart, buflwstart, bufhighlightcolor;
    52.                 AcGePoint3d startpt;
    53.                 acedInitGet(NULL, NULL);
    54.                 AcArray<int> viewports;

    55.                 AcGiTransientManager* pTransientManager = acgiGetTransientManager();
    56.                 while (acedGetPoint(NULL, _T("\nSelect point in area: "), (double*)(&startpt)) == RTNORM)
    57.                 {
    58.                         CString sArea = _T("");
    59.                         AcDbCurve* pCurve = NULL;
    60.                         bool b;

    61.                         // Only if we aren't adding the shape
    62.                         if (mode == 1 || mode == 2)
    63.                         {
    64.                                 b = pTransientManager->eraseTransients(kAcGiHighlight, 0, viewports);
    65.                                 acedUpdateDisplay();
    66.                         }

    67.                         AcDbVoidPtrArray Boundaries;
    68.                         bool detectIslands = Adesk::kTrue;
    69.                         es = acedTraceBoundary(startpt, detectIslands, Boundaries);

    70.                         if (es == Acad::eOk)
    71.                         {
    72.                                 double dAreaTotal = 0.0L, dMaxArea = 0.0L, dArea = 0.0L;
    73.                                 int nMaxIndx = -1;

    74.                                 // Subtract the islands
    75.                                 for (int i = 0; i < Boundaries.length(); i++)
    76.                                 {
    77.                                         // Only show transients if we aren't adding the shape
    78.                                         AcDbEntity* pEnt = NULL;
    79.                                         if (mode == 1 || mode == 2)
    80.                                         {
    81.                                                 pEnt = static_cast<AcDbEntity *>(Boundaries[i]);
    82.                                                 b = pTransientManager->addTransient(pEnt, kAcGiHighlight, 0, viewports);
    83.                                                 acedUpdateDisplay();
    84.                                         }

    85.                                         // Get the area
    86.                                         AcBr::ErrorStatus bs = AcBr::eOk;
    87.                                         pCurve = static_cast<AcDbCurve *>(Boundaries[i]);
    88.                                         if (pCurve->isKindOf(AcDbRegion::desc()))
    89.                                         {
    90.                                                 AcDbRegion* pRegion = static_cast<AcDbRegion *>(Boundaries[i]);
    91.                                                 AcBrBrep* pBrep = new AcBrBrep();
    92.                                                 if (AcBr::eOk == pBrep->set(*pRegion))
    93.                                                 {
    94.                                                         bs = pBrep->getSurfaceArea(dArea);
    95.                                                 }

    96.                                                 delete pBrep;
    97.                                         }
    98.                                         else
    99.                                         {
    100.                                                 es = pCurve->getArea(dArea);
    101.                                         }

    102.                                         dAreaTotal += dArea;

    103.                                         if (dArea > dMaxArea)
    104.                                         {
    105.                                                 dMaxArea = dArea;
    106.                                                 nMaxIndx = i;
    107.                                         }

    108.                                         if (pEnt != NULL)
    109.                                         {
    110.                                                 pEnt->close();
    111.                                         }
    112.                                 }

    113.                                 dArea = dMaxArea - (dAreaTotal - dMaxArea);
    114.                                 AreaUnit CurAreaUnit;
    115.                                 AcDb::UnitsValue ac_units = acdbCurDwg()->insunits();
    116.                                 if (ac_units == AcDb::kUnitsMeters)
    117.                                 {
    118.                                         CurAreaUnit.Construct(SQ_METRES);
    119.                                 }
    120.                                 else if (ac_units == AcDb::kUnitsFeet)
    121.                                 {
    122.                                         CurAreaUnit.Construct(SQ_FEET);
    123.                                 }

    124.                                 AreaVal.Construct(dArea, CurAreaUnit);
    125.                                 sArea.Format(_T(" %.3f %s (%.3f %s)"), AreaVal.GetConvertedValue(AreaUnit), AreaUnit.GetShortUnitString(),
    126.                                         AreaVal.GetConvertedValue(CurAreaUnit), CurAreaUnit.GetShortUnitString());
    127.                                 acutPrintf(sArea);
    128.                         }

    129.                         LONG lHandle;

    130.                         CADManager.StartTransaction(__FUNCTION__);

    131.                         // Add text label - but make sure to use the right boundary
    132.                         if (mode == 2 || mode == 4)
    133.                         {
    134.                                 LengthValue Height;
    135.                                 AngleValue Orient; Orient.Construct(0.0L, SYSTEM_ANGLE_UNITS);
    136.                                 AcGePoint3d pt;
    137.                                 AcGePoint2d extLo, extHi;
    138.                                 if (CurveInfo(pCurve, pt, extLo, extHi) == Acad::eOk)
    139.                                 {
    140.                                         Height.Construct((extHi.y - extLo.y) * 0.025, SYSTEM_LENGTH_UNITS);
    141.                                 }
    142.                                 else
    143.                                 {
    144.                                         AcDbExtents ex;
    145.                                         es = pCurve->getGeomExtents(ex);
    146.                                         pt.x = (ex.maxPoint().x + ex.minPoint().x) / 2.0L;
    147.                                         pt.y = (ex.maxPoint().y + ex.minPoint().y) / 2.0L;
    148.                                         Height.Construct((ex.maxPoint().y - ex.minPoint().y) * 0.025, SYSTEM_LENGTH_UNITS);
    149.                                 }

    150.                                 CADManager.AddText(lHandle, CADManager.ConvertPoint(pt), sArea, _T("Arial"), Height, Orient, CADManager::MIDDLE_CENTRE_JUSTIFY);
    151.                         }

    152.                         // Add a shape that defines the area
    153.                         if (mode == 3 || mode == 4)
    154.                         {
    155.                                 pCurve->setDatabaseDefaults();
    156.                                 AcDbObjectId lineId = AcDbObjectId::kNull;
    157.                                 pApp->GetTableRecord()->appendAcDbEntity(lineId, pCurve);
    158.                                 es = acdbTransactionManager->addNewlyCreatedDBRObject(pCurve);
    159.                                 CADManager.UpdateEntity(lineId);
    160.                         }
    161.                         CADManager.EndTransaction(__FUNCTION__);

    162.                         acedInitGet(NULL, NULL);
    163.                 }

    164.                 // Transients should only be present if we aren't adding the shape
    165.                 if (mode == 1 || mode == 2)
    166.                 {
    167.                         bool b = pTransientManager->eraseTransients(kAcGiHighlight, 0, viewports);
    168.                         acedUpdateDisplay();
    169.                 }
    170.         }
    171. }

    172. //------------------------------------------------------------------------------
    173. Acad::ErrorStatus Debug::CurveInfo(AcDbCurve* pCurve, AcGePoint3d &ptCentroid, AcGePoint2d& extLow, AcGePoint2d& extHigh)
    174. //------------------------------------------------------------------------------
    175. {
    176.         Acad::ErrorStatus es = Acad::eOk;
    177.         AcDbVoidPtrArray lines1;
    178.         AcDbVoidPtrArray regions1;
    179.         AcDbRegion* pRegion;

    180.         if (pCurve->isKindOf(AcDbRegion::desc()))
    181.         {
    182.                 pRegion = AcDbRegion::cast(pCurve);
    183.         }
    184.         else
    185.         {
    186.                 lines1.append(pCurve);
    187.                 es = AcDbRegion::createFromCurves(lines1, regions1);
    188.                 if (regions1.isEmpty())
    189.                 {
    190.                         return es;
    191.                 }
    192.                 pRegion = AcDbRegion::cast((AcRxObject*)regions1[0]);
    193.         }

    194.         AcGePoint3d origin;
    195.         AcGeVector3d xAxis, yAxis;
    196.         AcGePlane plane;
    197.         pRegion->getPlane(plane);
    198.         plane.getCoordSystem(origin, xAxis, yAxis);
    199.         origin = AcGePoint3d(0.0, 0.0, origin.z);
    200.         xAxis = AcGeVector3d::kXAxis, yAxis = AcGeVector3d::kYAxis;

    201.         AcGePoint2d ptCen;
    202.         AcGePoint2d extentsLow, extentsHigh;
    203.         AcGeVector2d prinAxes[2];
    204.         double area, perimeter, momInertia[2], prodInertia, prinMoments[2], radiiGyration[2];

    205.         es = pRegion->getAreaProp(origin, xAxis, yAxis, perimeter, area, ptCen, momInertia, prodInertia, prinMoments, prinAxes, radiiGyration, extentsLow, extentsHigh);

    206.         if (Acad::eOk == es)
    207.         {
    208.                 ptCentroid = AcGePoint3d(ptCen.x, ptCen.y, origin.z);
    209.                 extLow = extentsLow;
    210.                 extHigh = extentsHigh;
    211.         }
    212.         delete pRegion; pRegion = 0;
    213.         return es;
    214. }
    复制代码
    回复


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

    使用道具 举报

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

    本版积分规则

    关闭

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

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

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