找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 5907|回复: 19

[求助] 有什么办法可以将圆或者圆弧转为polyline

[复制链接]
发表于 2013-10-13 16:18:08 | 显示全部楼层 |阅读模式

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

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

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

已领礼包: 145个

财富等级: 日进斗金

发表于 2013-10-13 16:36:41 | 显示全部楼层
取得圆或者圆弧的几何特征信息,算出BULGE,然后创建AcDbPolyline,添加BULGE。

点评

一个圆可以转,两个以上就不行了,请看代码 AcDbObjectId CreatePolyline(AcGePoint2dArray points, double width)//创建polyline { int numVertices = points.length(); AcDbPolyline *pPoly = new AcDbPolyl  详情 回复 发表于 2013-10-13 21:15
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-10-13 21:15:14 | 显示全部楼层
XDSoft 发表于 2013-10-13 16:36
取得圆或者圆弧的几何特征信息,算出BULGE,然后创建AcDbPolyline,添加BULGE。

一个圆可以转,两个以上就不行了,请看代码

  1. AcDbObjectId CreatePolyline(AcGePoint2dArray points, double width)//创建polyline
  2. {
  3.         int numVertices = points.length();
  4.         AcDbPolyline *pPoly = new AcDbPolyline(numVertices);
  5.         for (int i = 0; i < numVertices; i++)
  6.         {
  7.                 pPoly->addVertexAt(i, points.at(i), 1, width, width);
  8.         }
  9.         AcDbObjectId polyId;
  10.         polyId = PostToModelSpace(pPoly);
  11.         return polyId;
  12. }

  13. void CHAPtest2()
  14. {
  15.         AcDbCircle *cl;                double radiu;               
  16.         AcGePoint3d center;              
  17.         AcGePoint2d pt[3];               
  18.         AcGePoint2dArray points1;

  19.         AcDbPolyline *pPoly;               
  20.         AcDbEntity * pEnt;               
  21.         ads_name entName;               
  22.         long len=0;               
  23.         AcDbObjectId entId;               
  24.         AcDbObjectIdArray objIds;

  25.         acedSSGet(NULL,NULL,NULL,NULL,entName);              
  26.         int rt=acedSSLength(entName,&len);                        
  27.         if (rt == RTNORM)               
  28.         {                     
  29.                 long length;                     
  30.                 acedSSLength(entName, &length); // 获得选择集中的对象个数                        
  31.                 for (int i = 0; i < length; i++)                       
  32.                 {                              
  33.                         ads_name ent;                              
  34.                         acedSSName(entName, i, ent);                                            
  35.                         acdbGetObjectId(entId, ent);                              
  36.                         objIds.append(entId);                       
  37.                 }               
  38.         }            
  39.         else         
  40.         {                        
  41.                 MessageBox(NULL,"请选择一个实体","注意",MB_OK);                        
  42.                 return ;               
  43.         }                        
  44.         acedSSFree(entName);                              
  45.         for (int j1=0;j1<objIds.length();j1++)               
  46.         {                                       
  47.                 acdbOpenObject(pEnt, objIds[j1],AcDb::kForWrite);                        
  48.                 if (pEnt->isKindOf(AcDbCircle::desc()))                        
  49.                 {                                                               
  50.                         cl=AcDbCircle::cast(pEnt);                                
  51.                         center=cl->center();                                
  52.                         radiu=cl->radius();                        
  53.                 }
  54.         }                 
  55.         //建立一条有3个顶点(p1、p2、p1)的多段线,分别设这两段的凸度值为1(CreatePolyline)               
  56.         pt[1].x=pt[2].x=pt[3].x=center.x;               
  57.         pt[1].y=center.y+radiu;               
  58.         pt[2].y=center.y-radiu;               
  59.         pt[3].y=center.y+radiu;               
  60.         for(int i=1;i<=3;i++)               
  61.         {               
  62.                 points1.append(pt);               
  63.         }

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

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2013-10-13 21:25:57 | 显示全部楼层
哪里不行了,描述一下啊。

点评

画一个圆,然后输入命令转换,没问题;画两个圆,输入命令,选中两个圆一起转换,程序崩溃。  详情 回复 发表于 2013-10-13 21:31
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-10-13 21:31:22 | 显示全部楼层
newer 发表于 2013-10-13 21:25
哪里不行了,描述一下啊。

画一个圆,然后输入命令转换,没问题;画两个圆,输入命令,选中两个圆一起转换,程序崩溃。
QQ图片20131013213148.jpg

点评

论坛帖代码,要学会帖的方法,帮你编辑了,像你以前帖的,连个层次都没有,谁能看懂啊。,你自己编辑下楼主帖,看看里面是怎么贴的代码的。 你看看你上面的代码,你在循环里面打开文件,没在循环结束前,关闭。问  详情 回复 发表于 2013-10-13 22:04
提示你对象没有打开写,你找找代码,把该写操作的地方,改成 kForWrite  详情 回复 发表于 2013-10-13 22:01
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2013-10-13 22:01:00 | 显示全部楼层
yzf_fs 发表于 2013-10-13 21:31
画一个圆,然后输入命令转换,没问题;画两个圆,输入命令,选中两个圆一起转换,程序崩溃。

提示你对象没有打开写,你找找代码,把该写操作的地方,改成 kForWrite
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2013-10-13 22:04:53 | 显示全部楼层
yzf_fs 发表于 2013-10-13 21:31
画一个圆,然后输入命令转换,没问题;画两个圆,输入命令,选中两个圆一起转换,程序崩溃。

论坛帖代码,要学会帖的方法,帮你编辑了,像你以前帖的,连个层次都没有,谁能看懂啊。,你自己编辑下楼主帖,看看里面是怎么贴的代码的。

你看看你上面的代码,你在循环里面打开文件,没在循环结束前,关闭。问题就在那了。

点评

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

使用道具 举报

 楼主| 发表于 2013-10-13 22:32:12 | 显示全部楼层
XDSoft 发表于 2013-10-13 22:04
论坛帖代码,要学会帖的方法,帮你编辑了,像你以前帖的,连个层次都没有,谁能看懂啊。,你自己编辑下楼 ...

  1.     for (int j1=0;j1<objIds.length();j1++)
  2.     {   
  3.       acdbOpenObject(pEnt, objIds[j1],AcDb::kForWrite);
  4.       if (pEnt->isKindOf(AcDbCircle::desc()))
  5.       {
  6.         
  7.         cl=AcDbCircle::cast(pEnt);
  8.         center=cl->center();
  9.         radiu=cl->radius();
  10.         //acutPrintf(("X=%0.2f,Y=%0.2f,R=%0.2f"),center.x,center.y,radiu);
  11.       
  12.       }
  13.       pEnt->close();
  14.       
  15.     }
  16.     cl->erase();
  17.    
  18.     pt[1].x=pt[2].x=pt[3].x=center.x;
  19.     pt[1].y=center.y+radiu;
  20.     pt[2].y=center.y-radiu;
  21.     pt[3].y=center.y+radiu;
  22.     for(int i=1;i<=3;i++)
  23.     {
  24.     points1.append(pt);
  25.     }
  26.     CreatePolyline(points1,0);

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

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2013-10-13 23:42:09 | 显示全部楼层
C1是什么? 你要删除,要把它放到关闭的前面。

点评

AcDbCircle *cl; 放在关闭前后没有崩溃了,可是开始是两个圆的,转化后就变成一个圆了。  详情 回复 发表于 2013-10-14 09:57
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-10-14 09:57:39 | 显示全部楼层
XDSoft 发表于 2013-10-13 23:42
C1是什么? 你要删除,要把它放到关闭的前面。

AcDbCircle *cl; 放在关闭前后没有崩溃了,可是开始是两个圆的,转化后就变成一个圆了。














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

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2013-10-14 10:04:18 | 显示全部楼层
你看看你的代码,里面创建了几次POLYLINE。

点评

最后还要加一句points1.removeSubArray(0,points1.length());将points1清空才行  详情 回复 发表于 2013-10-14 16:52
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-10-14 11:20:42 | 显示全部楼层
XDSoft 发表于 2013-10-14 10:04
你看看你的代码,里面创建了几次POLYLINE。

  1.   //判断是否为圆,获取三点坐标,创建polyline,删除圆。但是还是不成功,不知道哪里出问题了。
  2.     for (int j1=0;j1<objIds.length();j1++)
  3.     {   
  4.       acdbOpenObject(pEnt, objIds[j1],AcDb::kForWrite);
  5.       if (pEnt->isKindOf(AcDbCircle::desc()))
  6.       {
  7.         
  8.         cl=AcDbCircle::cast(pEnt);
  9.         center=cl->center();
  10.         radiu=cl->radius();

  11.         pt[1].x=center.x;
  12.         pt[1].y=center.y+radiu;
  13.   
  14.         pt[2].x=center.x;
  15.         pt[2].y=center.y-radiu;
  16.    
  17.         pt[3].x=center.x;
  18.         pt[3].y=center.y+radiu;
  19.       
  20.       }
  21.       
  22.         for(int i=1;i<=3;i++)
  23.         {
  24.           points1.append(pt);         
  25.         }
  26.         CreatePolyline(points1,0);
  27.         cl->erase();
  28.         pEnt->close();
  29.     }

11111.jpg

点评

你自己画个POLY圆,看看里面参数是什么? 对半圆来说,BULGE=1,你直接画个半圆,然后封闭就OK了。 你确信你的创建多段线部分的代码是对的? 你把创建多段线那个函数注销,换个打印语句,看看执行了几次,如果2个  详情 回复 发表于 2013-10-14 11:34
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2013-10-14 11:34:39 | 显示全部楼层

你自己画个POLY圆,看看里面参数是什么? 对半圆来说,BULGE=1,你直接画个半圆,然后封闭就OK了。 你确信你的创建多段线部分的代码是对的?

你把创建多段线那个函数注销,换个打印语句,看看执行了几次,如果2个圆,打印两次,说明你画PLINE参数不对。

点评

搞定了,最后还要加一句points1.removeSubArray(0,points1.length());将points1清空才行  详情 回复 发表于 2013-10-14 16:52
2个圆,打印两次,但是一个圆的时候是没问题的  详情 回复 发表于 2013-10-14 16:17
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-10-14 16:17:15 | 显示全部楼层
newer 发表于 2013-10-14 11:34
你自己画个POLY圆,看看里面参数是什么? 对半圆来说,BULGE=1,你直接画个半圆,然后封闭就OK了。 你确 ...

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

使用道具 举报

 楼主| 发表于 2013-10-14 16:52:01 | 显示全部楼层
newer 发表于 2013-10-14 11:34
你自己画个POLY圆,看看里面参数是什么? 对半圆来说,BULGE=1,你直接画个半圆,然后封闭就OK了。 你确 ...

搞定了,最后还要加一句points1.removeSubArray(0,points1.length());将points1清空才行

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-15 14:05 , Processed in 0.231550 second(s), 69 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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