找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1116|回复: 2

[ARX程序]:如何闭合正在画的n边形?(附带画表格-尺寸标注-画n边形--源程序)

[复制链接]
发表于 2005-9-30 11:15:18 | 显示全部楼层 |阅读模式

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

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

×
对于如下这段画n边形的程序,有个失误的地方,就是他是以起点=终点来判断n边形画结束的,如果遇到图形线段很多时,如果找不到起点,就会陷入死循环!!

在正常的CAd画图中我们可以用“C”命令来闭合当前正在画的图形,请问这在程序中如何实现,希望有高手指点一下!

附上我的测试程序,里面提供了我尺寸标注  求面积  画表格的程序

#include <aced.h>
#include <acedads.h>
#include <dbents.h>
#include <dbsymtb.h>
#include <dbgroup.h>
#include <dbapserv.h>
#include <acestext.h>
#include <migrtion.h>
#include <geassign.h>
#include <math.h>
#include <dbpl.h >

ads_point  pt1[512];
        AcGePoint3d  pt[512];
        int NodeNumCount;
void  area()
{
        int i=0;
acedGetPoint(NULL,"\n请选择起始点:",asDblArray(pt[0]));

        do    {
  acedGetPoint(asDblArray(pt),"\n拾取下一点:",asDblArray(pt[i+1]));
  AcDbLine *pLine=new AcDbLine(pt,pt[i+1]);
  AcDbBlockTable *pBlkTable2;
  acdbHostApplicationServices()->workingDatabase()
   ->getSymbolTable(pBlkTable2, AcDb::kForRead);
  AcDbBlockTableRecord *pBlockTableRecord;
  
  pBlkTable2->getAt(ACDB_MODEL_SPACE, pBlockTableRecord,
   AcDb::kForWrite);
  pBlkTable2->close();
  
  AcDbObjectId lineId=AcDbObjectId::kNull;
  pBlockTableRecord->appendAcDbEntity(lineId, pLine);
  pBlockTableRecord->close();
  pLine->close();
  changepoint(pt1[i+1],pt[i+1]);//转换点的类型
  changepoint(pt1[0],pt[0]);//转换点的类型
   i++;
   NodeNumCount=i;//取得边数
   }
while((Equal_Points (pt1, pt1[0]))==0);//起始点=终点时结束循环
}

int Equal_Points (const ads_point p1, const ads_point p2) //判断两点是否为同一点
{
    // 指定误差范围
    const ads_real Equality_Margin = (ads_real)0.0001;
    int c ;
    for (c = X ; c <= Z ; c++)
{
        if (fabs(p1[c] - p2[c]) > Equality_Margin)
  { return (0) ; }
        }
{
   AcDbLine *pLine=new AcDbLine(pt[0],pt[NodeNumCount]);
   AcDbBlockTable *pBlkTable2;
  acdbHostApplicationServices()->workingDatabase()
   ->getSymbolTable(pBlkTable2, AcDb::kForRead);
  
  AcDbBlockTableRecord *pBlockTableRecord;
  
  pBlkTable2->getAt(ACDB_MODEL_SPACE, pBlockTableRecord,
   AcDb::kForWrite);
  pBlkTable2->close();
  
  AcDbObjectId lineId=AcDbObjectId::kNull;
  pBlockTableRecord->appendAcDbEntity(lineId, pLine);
  pBlockTableRecord->close();
  pLine->close();
    return (1) ;
}
}

void changepoint(ads_point& ads_pt,AcGePoint3d acge_pt)  //AcGePoint3d转换成ads_point类型
{
double x=acge_pt[0];
double y=acge_pt[1];
double z=acge_pt[2];
ads_pt[X]=x;
ads_pt[Y]=y;
ads_pt[Z]=z;
}
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2006-7-15 14:24:52 | 显示全部楼层
先看看!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-7-15 17:14:16 | 显示全部楼层
感觉问题挺多:

1,结束程序的唯一条件是终点与起点重合,不合理

2,没有事务监控,应该把整个画线过程用事务控制,如果用户画到第10条线段的时候按下取消,这

之前的9根线段还得手工删除

3,建议采用AcDbPolyline类,该类提供了一个闭合的成员函数

4,程序结构有待改进,如下所示

int i = 1;  //循环中语句的选择
Adesk::Boolean choose = Adesk::kTrue; //是否结束循环
Adesk::Boolean bi_he = Adesk::kFalse; //是否闭合

while(choose)
{
  if(i == 1)
  {
    //提示指定第一点
    //添加点到数组中
    // i++
    else
    //return结束程序
   }  

   else if(i == 2)
  {
    //提示指定下一点
    //添加点到数组中
    // i++
    else
    //choose = Adesk::kFalse 跳出循环
   }  


   else if(i == 3)
  {
    //提示指定下一点或(闭合C)
    //添加点到数组中
    //如果用户输入键盘,用acedGetInput()捕获关键字
    //如果为关键字C,则设置choose = Adesk::kFalse跳出循环,
    //设置bi_he = Adesk::kTrue闭合多段线
    else
    //choose = Adesk::kFalse 跳出循环
   }
} //结束循环


//后处理
  如果数组长度小于2,则结束程序

  否则
  AcDbPolyline *pline = new AcDbPolyline;
  用数组给多段线设置顶点

  如果
  bi_he == Adesk::kTrue调用成员函数闭合多段线

  加入到块表记录中
}
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-23 08:16 , Processed in 0.400752 second(s), 36 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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