设为首页收藏本站

中国膜结构网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

AcdbFace和AcdbLine交点

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

    [LV.Master]伴坛终老

    发表于 2021-1-22 13:21 | 显示全部楼层 |阅读模式
    AcdbFace和AcdbLine



    答复:

    有两种主要的方法可以通过ARX实现,这两种方法都进一步表明:



    1–第一种方法-建立无限平面和无限直线,然后使用它们的相交点的射束,以了解是否在3-面这一点。



    2-第二种方法-使用三维物体。从3面和另一个线段。在这种情况下,我们将为他们提供一种检查Interferences方法,以获得过境点。
    1. //////////////////////////////////////////////////
    2. // Использование: Пересечение между 3-гранью
    3. // и Отрезком с использованием луча
    4. //////////////////////////////////////////////////
    5. void FindIntersection(AcDbFace* pFace, AcDbLine* pLine)
    6. {
    7. AcGePoint3d vertex1, vertex2, vertex3, vertex4;

    8. pFace->getVertexAt(0, vertex1);
    9. pFace->getVertexAt(1, vertex2);
    10. pFace->getVertexAt(2, vertex3);
    11. pFace->getVertexAt(3, vertex4);

    12. AcGeVector3d vecU(vertex2.asVector()-vertex1.asVector());
    13. AcGeVector3d vecV(vertex3.asVector()-vertex1.asVector());

    14. // Создаём временную плоскость
    15. AcGePlane plane(vertex1, vecU, vecV);

    16. // Создаём временный отрезок
    17. AcGeLineSeg3d line (pLine->startPoint(), pLine->endPoint());

    18. // Находим пересечение
    19. AcGePoint3d resultPoint;

    20. if (plane.intersectWith(line, resultPoint) == Adesk::kTrue)
    21. {
    22.   AcGeRay3d ray(resultPoint, vertex1.asVector() - vertex2.asVector());

    23.   int intNum = 0;

    24.   // Проверяем точку пересечения на попадание внутрь 3-грани
    25.   AcGePoint3d intPoint;

    26.   if (ray.intersectWith(AcGeLineSeg3d(vertex1, vertex2), intPoint)
    27.        == Adesk::kTrue) ++intNum;
    28.   if (ray.intersectWith(AcGeLineSeg3d(vertex2, vertex3), intPoint)
    29.        == Adesk::kTrue) ++intNum;
    30.   if (ray.intersectWith(AcGeLineSeg3d(vertex3, vertex4), intPoint)
    31.       == Adesk::kTrue) ++intNum;
    32.   if (ray.intersectWith(AcGeLineSeg3d(vertex4, vertex1), intPoint)
    33.       == Adesk::kTrue) ++intNum;

    34.   // если intNum нечетное – точка внутри
    35.   if((intNum%2) != 0)
    36.   {
    37.    acutPrintf (L"\nТочка пересечения: [%f, %f, %f]",
    38.        resultPoint.x, resultPoint.y, resultPoint.z);
    39.   }
    40. }
    41. }

    42. /////////////////////////////////////////////////////////////////////
    43. // Использование: Пересечение между 3-гранью
    44. // и Отрезком с помощью 3D-тел
    45. /////////////////////////////////////////////////////////////////////
    46. void FindIntersection2(AcDbFace* pFace, AcDbLine* pLine)
    47. {
    48. // Направление отрезка
    49. AcGeVector3d direction (pLine->endPoint()-pLine->startPoint());

    50. // Создаём временный круг
    51. AcDbCircle* pcircle =
    52.      new AcDbCircle(pLine->startPoint(), direction, 0.01);

    53. // Создаем временное 3D-тело
    54. AcDb3dSolid* pSolidLine = new AcDb3dSolid ();

    55. AcDbSweepOptions sweepOptions;

    56. pSolidLine->createExtrudedSolid(pcircle, direction, sweepOptions);

    57. // Создаём временное 3D-тело для 3-грани
    58. AcDb3dSolid  *pSolidFace = new AcDb3dSolid ();

    59. AcGePoint3d vertex1, vertex2, vertex3;

    60. pFace->getVertexAt(0, vertex1);
    61. pFace->getVertexAt(1, vertex2);
    62. pFace->getVertexAt(2, vertex3);

    63. AcGeVector3d vec1(vertex2.asVector()-vertex1.asVector());
    64. AcGeVector3d vec2(vertex3.asVector()-vertex1.asVector());

    65. // Вычисляем перпендикуляр к 3-грани
    66. AcGeVector3d faceNormal = vec2.crossProduct(vec1);

    67. faceNormal *= 0.01 / faceNormal.length();

    68. // Создаём очень тонкое выдавленное 3D-тело
    69. pSolidFace->createExtrudedSolid(pFace, faceNormal, sweepOptions);

    70. // Проверяем пересечение между двумя 3D-телами
    71. Adesk::Boolean IsIntersec;
    72. AcDb3dSolid* commonVolumeSolid;

    73. Acad::ErrorStatus es =
    74.       pSolidFace->checkInterference(
    75.            pSolidLine,
    76.            Adesk::kTrue,
    77.            IsIntersec,
    78.            commonVolumeSolid);

    79. if (IsIntersec == Adesk::kTrue)
    80. {
    81.   double volume;
    82.   AcGePoint3d centroid;

    83.   double momInertia[3], prodInertia[3], prinMoments[3],
    84.       radiiGyration[3];

    85.   AcGeVector3d prinAxes[3];

    86.   AcDbExtents extents;

    87.   commonVolumeSolid->getMassProp(
    88.        volume,
    89.        centroid,
    90.        momInertia,
    91.        prodInertia,
    92.        prinMoments,
    93.        prinAxes,
    94.        radiiGyration,
    95.        extents);

    96.   acutPrintf (L"\nТочка пересечения: [%f, %f, %f]",
    97.        centroid.x, centroid.y, centroid.z);

    98.   delete commonVolumeSolid;
    99. }

    100. delete pcircle;
    101. delete pSolidLine;
    102. delete pSolidFace;
    103. }

    104. // Тестовая функция
    105. void FindIntersectionTest(void)
    106. {
    107. ads_name ename;
    108. ads_point pickpt;

    109. AcDbObjectId objId;
    110. AcDbObject *pObj;

    111. int rc;

    112. rc= acedEntSel(L"\nВыберите 3-грань: ", ename, pickpt);

    113. if(rc != RTNORM)
    114. {
    115.   if (rc != RTCAN) acutPrintf(L"\nОшибка выбора примитива ");
    116.   return;
    117. }

    118. acdbGetObjectId(objId, ename);
    119. acdbOpenObject(pObj, objId, AcDb::kForRead);

    120. AcDbFace* pEntity1 = AcDbFace::cast(pObj);

    121. if(!pEntity1)
    122. {
    123.   acutPrintf(L"\nОшибочный выбор ...");
    124.   pObj->close();
    125.   return;
    126. }

    127. rc= acedEntSel(L"\nВыберите отрезок: ", ename, pickpt);

    128. if(rc != RTNORM)
    129. {
    130.   if (rc != RTCAN) acutPrintf(L"\nОшибка выбора примитива ");
    131.   return;
    132. }

    133. acdbGetObjectId(objId, ename);
    134. acdbOpenObject(pObj, objId, AcDb::kForRead);

    135. AcDbLine* pEntity2 = AcDbLine::cast(pObj);

    136. if(!pEntity2)
    137. {
    138.   acutPrintf(L"\nОшибочный выбор...");
    139.   pObj->close();
    140.   return;
    141. }

    142. FindIntersection (pEntity1, pEntity2);
    143. FindIntersection2(pEntity1, pEntity2);

    144. pEntity1->close();
    145. pEntity2->close();
    146. }
    复制代码
    回复


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

    使用道具 举报

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

    本版积分规则

    关闭

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

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

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