天气与日历 切换到窄版

 找回密码
 立即注册
中国膜结构网
十大进口膜材评选 十大国产膜材评选 十大膜结构设计评选 十大膜结构公司评选
查看: 155|回复: 0

[每日一码] 由CAD截面图形得到其节线数据

[复制链接]
  • TA的每日心情
    开心
    昨天 06:36
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    105

    主题

    11

    回帖

    1308

    积分

    管理员

    积分
    1308
    QQ
    发表于 2024-3-14 19:30:20 | 显示全部楼层 |阅读模式
    1. void varyL()
    2. {
    3.     ArxDbgUiPrEntity prEnt(采用T("请选择截面外轮廓"), NULL);
    4.     prEnt.addAllowedClass(AcDbPolyline::desc());
    5.     if (prEnt.go() != ArxDbgUiPrBase::kOk)
    6.     {
    7.         return;
    8.     }
    9.     AcDbEntity* pEnt1 = NULL;
    10.     acdbOpenObject(pEnt1,prEnt.objectId(),AcDb::kForRead);
    11.     //获得封闭形顶点
    12.     AcDbPolyline *Polygon = NULL ;
    13.     Polygon = AcDbPolyline::cast(pEnt1);
    14.     ASSERT( Polygon != NULL );
    15.     if (Polygon == NULL)
    16.     {
    17.         AfxMessageBox(采用T("线型不为多义线"));
    18.         pEnt1->close();
    19.         return;
    20.     }
    21.     if( !Polygon->isClosed() )
    22.     {
    23.         Polygon->close();
    24.         AfxMessageBox(采用T("外轮廓不封闭"));
    25.         return;
    26.     }
    27.     AcGePoint3dArray PtArray;//记录外轮廓上的点
    28.     AcGePoint3dArray keyPtArray; //记录 “任一高度” 所有的 点(最后节线高度值)
    29.     int VertNum = (int)Polygon->numVerts() ;
    30.     int i;
    31.     for( i = 0; i < VertNum; i ++ )
    32.     {
    33.         AcGePoint3d    Temp;
    34.         Polygon->getPointAt(i,Temp);
    35.         PtArray.append(Temp);//外轮廓上的点
    36.         //如果此点与之前所有点的Y值不同,则增加为 关键点
    37.         BOOL bAdd = TRUE;
    38.         for (int k = 0; k < keyPtArray.length(); k ++)
    39.         {
    40.             if (fabs(keyPtArray[k].y - Temp.y) < 1e-6)
    41.             {
    42.                 bAdd = FALSE;
    43.                 Temp.y += 1e-4;
    44.                 keyPtArray.append(Temp);
    45.                 break;
    46.             }
    47.         }
    48.         if (bAdd == TRUE)
    49.         {
    50.             keyPtArray.append(Temp);//高度 关键点
    51.         }
    52.         
    53.     }
    54.     pEnt1->close();
    55.     //////////////////////////////////////////////////////////////////////////
    56.     //////////////////////////////////////////////////////////////////////////
    57.     //获得空腔个数
    58.     int nHoll;
    59.     ArxDbgUiPrIntDef prInt(采用T("输入空腔个数"), NULL,ArxDbgUiPrInt::kRange, 0);
    60.     prInt.setRange(0, 10);
    61.     if(prInt.go() != ArxDbgUiPrBase::kOk)
    62.         return;
    63.     else
    64.         nHoll = prInt.value();
    65.     AcGePoint3dArray ptHollArray[10];
    66.     //依次选择全部空腔
    67.     for (i = 0; i < nHoll; i ++)
    68.     {
    69.         CString strTemp;
    70.         strTemp.Format(采用T("选择第个 %d 内腔"), i + 1);
    71.         prEnt.setMessage(strTemp);
    72.         if (prEnt.go() != ArxDbgUiPrBase::kOk)
    73.             return;
    74.         AcDbEntity* pEnt1 = NULL;
    75.         acdbOpenObject(pEnt1, prEnt.objectId(), AcDb::kForRead);
    76.         //获得封闭形顶点
    77.         AcDbPolyline *Polygon = NULL ;
    78.         Polygon = AcDbPolyline::cast(pEnt1);
    79.         ASSERT( Polygon != NULL );
    80.         if (Polygon == NULL)
    81.         {
    82.             AfxMessageBox(采用T("线型不为多义线"));
    83.             pEnt1->close();
    84.             return;
    85.         }
    86.         if( !Polygon->isClosed() )
    87.         {
    88.             Polygon->close();
    89.             AfxMessageBox(采用T("内腔不封闭"));
    90.             return;
    91.         }
    92.       
    93.         int VertNum = (int)Polygon->numVerts();
    94.         int k;
    95.         for( k=0; k<VertNum; k++ )
    96.         {
    97.             AcGePoint3d    Temp;
    98.             Polygon->getPointAt(k,Temp);
    99.             if(PointIsInPolygon(Temp,PtArray) != 1)
    100.             {
    101.                 AfxMessageBox(采用T("内腔不在外内轮廓内!"));
    102.                 pEnt1->close();
    103.                 return;
    104.             }
    105.             ptHollArray<i>.append(Temp);
    106.             //如果此点与之前所有点的Y值不同, 则加入到高度关键点中(多个内腔时)
    107.             BOOL bAdd = TRUE;
    108.             for (int j = 0; j < keyPtArray.length(); j ++)
    109.             {
    110.                 if (fabs(keyPtArray[j].y - Temp.y) < 1e-6)//精度控制
    111.                 {
    112.                     bAdd = FALSE;
    113.                     //精度控制
    114.                     Temp.y += 1e-4;
    115.                     keyPtArray.append(Temp);
    116.                     break;
    117.                 }           
    118.             }
    119.             if (bAdd == TRUE)
    120.             {
    121.                 keyPtArray.append(Temp);//高度 关键点
    122.             }
    123.         }
    124.         pEnt1->close();
    125.     }
    126.    
    127.    
    128.    
    129.     CArray <varyLine, varyLine> varyLineArray;
    130.     AcGePoint3dArray sortedkeyPtArray;   
    131.     arrangePointArray(keyPtArray, sortedkeyPtArray, FALSE);//高度关键点数组 Y值升序排列
    132.     sortedkeyPtArray[0].y += 1e-5;
    133.     sortedkeyPtArray[sortedkeyPtArray.length() - 1].y -= 1e-5;
    134.     AcGePoint3d tempPt;
    135.     varyLine tempVaryLine;//节线结构体   
    136.     //节线结构体中的节线编号,但是其中有很多重合的节线,故不予输出
    137.     int nVaryIndex = 1;//添加一条节线后,就加1   
    138.     int wk = sortedkeyPtArray.length();
    139.     if (nHoll == 0)
    140.     {
    141.         for (i = 0; i < sortedkeyPtArray.length();  i ++)
    142.         {
    143.             AcGePoint3d temp1 = sortedkeyPtArray<i>, temp2 = sortedkeyPtArray<i>;
    144.             temp1.x -= 50000;
    145.             temp2.x += 50000;
    146.             double length = 0;
    147.            
    148.             CAD采用POINT *tempPt = NULL;//外、内轮廓线所有点的另一种存储方式
    149.             tempPt = new AcGePoint3d[PtArray.length()];
    150.             for (int k = 0; k<PtArray.length(); k ++)
    151.             {
    152.                 tempPt[k]=PtArray[k];
    153.             }
    154.             length = lengthThroughRegion(tempPt, PtArray.length(), temp1,temp2);
    155.             tempVaryLine.N = nVaryIndex;
    156.             nVaryIndex ++;
    157.             tempVaryLine.Y = sortedkeyPtArray<i>.y ;
    158.             tempVaryLine.relativeY = sortedkeyPtArray<i>.y - sortedkeyPtArray[0].y ;
    159.             tempVaryLine.Length = length;
    160.             varyLineArray.Add(tempVaryLine);
    161.             delete []tempPt;
    162.         }
    163.                
    164.     }
    165.     //空腔个数不为0
    166.     else
    167.     {   
    168.         for (i = 0; i < sortedkeyPtArray.length(); i ++)
    169.         {
    170.             AcGePoint3d temp1 = sortedkeyPtArray<i>, temp2 = sortedkeyPtArray<i>;
    171.             temp1.x -= 5000;
    172.             temp2.x += 5000;
    173.             double length = 0;
    174.            
    175.             CAD采用POINT *tempPt = NULL;
    176.             tempPt = new AcGePoint3d[PtArray.length()];
    177.             int k;
    178.             for (k = 0; k<PtArray.length(); k ++)
    179.             {
    180.                 tempPt[k]=PtArray[k];
    181.             }
    182.             //得到总长
    183.             length = lengthThroughRegion(tempPt, PtArray.length(), temp1,temp2);
    184.             delete []tempPt;
    185.             //////////////////////////////////////////////////////////////////////////
    186.             //减去所有空腔
    187.             for (k = 0; k < nHoll; k ++)
    188.             {
    189.                 tempPt = new AcGePoint3d[ptHollArray[k].length()];
    190.                 int wk = ptHollArray[k].length();
    191.                 for (int j = 0; j<ptHollArray[k].length(); j ++)
    192.                 {
    193.                     tempPt[j]=ptHollArray[k][j];
    194.                 }
    195.                 length -= lengthThroughRegion(tempPt, ptHollArray[k].length(), temp1,temp2);
    196.             }
    197.             tempVaryLine.N = nVaryIndex;
    198.             nVaryIndex ++;
    199.             tempVaryLine.Y = sortedkeyPtArray<i>.y ;
    200.             tempVaryLine.relativeY = sortedkeyPtArray<i>.y - sortedkeyPtArray[0].y ;
    201.             tempVaryLine.Length = length;
    202.             varyLineArray.Add(tempVaryLine);
    203.             delete []tempPt;
    204.                        
    205.         }
    206.     }
    207.     //去掉节线宽度一样的节线
    208.     for (i = 0; i < varyLineArray.GetSize() - 1; i ++)
    209.     {
    210.         for (int j = varyLineArray.GetSize() - 1; j >= i + 1 ; j --)
    211.         {
    212.             if (fabs(varyLineArray<i>.Length - varyLineArray[j].Length) < 1e-2 &&
    213.                 fabs(varyLineArray<i>.relativeY - varyLineArray[j].relativeY) < 1e-2)
    214.             {
    215.                 varyLineArray.RemoveAt(j);
    216.             }
    217.         }
    218.     }
    219.     //对于上下边界,如果是水平线,则应去掉一条宽度高度均为0的节线
    220.     if ( fabs(varyLineArray[1].Y - varyLineArray[0].Y) < 1e-3 )
    221.     {
    222.         varyLineArray.RemoveAt(0);
    223.     }
    224.     if ( fabs(varyLineArray[ varyLineArray.GetSize() -1 ].Y - varyLineArray[ varyLineArray.GetSize() - 2 ].Y) < 1e-3 )
    225.     {
    226.         varyLineArray.RemoveAt( varyLineArray.GetSize() - 1);
    227.     }
    228.     //因为上面几行删除掉了相同的节线,因而varyLineArray<i>.N就有间隔了
    229.     //所以不能输出varyLineArray的N值了
    230.     CFileDialog OpenFile(FALSE,采用T(".txt"),采用T("节线数据.txt"),
    231.                      OFN采用HIDEREADONLY | OFN采用OVERWRITEPROMPT,
    232.                      采用T("文本文件 (*.txt)|*.txt|所有文件 (*.*)|*.*||"));
    233.              OpenFile.m采用ofn.lpstrTitle=采用T("新建数据文件");
    234.     if (OpenFile.DoModal() == IDCANCEL)
    235.                  return ;
    236.     CString pathName=OpenFile.GetPathName();
    237.     ofstream ofile(pathName);
    238.     ofile<<"节线编号\t"<<"宽度\t\t" <<"高度\n";
    239.     for (i = 0; i < varyLineArray.GetSize(); i ++)
    240.     {      
    241.         TCHAR outStr[200];
    242.         采用stprintf(outStr,采用T("%d\t\t%.2f\t\t%.2f\n"), i+1,varyLineArray<i>.Length,varyLineArray<i>.relativeY);
    243.         ofile << outStr;
    244.     }
    245.     ofile.close();
    246.     //询问用户是否要打开已生成的文本
    247.     bool bOpen = true;
    248.     if (ArxDbgUtils::yesNoPromptDef(采用T("是否要打开生成的内容"), bOpen, true) != ArxDbgUiPrBase::kOk)
    249.         return;
    250.     if(bOpen)
    251.         ShellExecute(::GetDesktopWindow(), 采用T("open"), pathName, NULL, NULL, SW采用SHOWNORMAL);
    252. }
    复制代码

     

     

     

     

    [每日一码] 由CAD截面图形得到其节线数据
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|中国膜结构网|中国膜结构协会|进口膜材|国产膜材|ETFE|PVDF|PTFE|设计|施工|安装|车棚|看台|污水池|中国膜结构网_中国空间膜结构协会

    GMT+8, 2024-11-1 13:33 , Processed in 0.151004 second(s), 25 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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