找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

楼主: yzf_fs

[求助] 图形每个坐标等倍缩小这样子写难道有错吗?怎么就不行呢,求救。。

[复制链接]
 楼主| 发表于 2013-9-14 15:43:03 | 显示全部楼层
newer 发表于 2013-9-14 12:49
你的代码没贴全,m是什么,完整代码贴上来吧,贴个图,你想缩放什么,以什么为基点等等都说清楚。

图形是随便画的,没什么规定,封闭的polyline就行,以图形中心为缩放原点,接着将图形原点平移到世界坐标系的原点,并获得每一个缩放图形平移后在世界坐标系下的坐标。       

         double L,R,gBulge;
        AcDbEntity * pEnt;
        AcDbPolyline *pPoly;
        AcGeCircArc3d arc;
        AcGeLineSeg3d line;
        AcGeVoidPointerArray geCurves;
        AcGePoint3d pt1[10],pt2[10],pt3[10],pt4[10],ptCen,ptCen1;
        AcGeMatrix3d xform;

        for (int j1=0;j1<objIds.length();j1++)
        {       
                acdbOpenObject(pEnt, objIds[j1],AcDb::kForWrite);
                pPoly=AcDbPolyline::cast(pEnt);                       
                int n=pPoly->numVerts();
               
                for(int k1=0,j1=1;k1<n;k1++,j1++)
                {
                        pPoly->getPointAt(k1,pt1[k1]);
                        pPoly->getPointAt(j1,pt2[j1]);
                        pt2[j1]=pt1[k1];       
                }
       

        for(int k3=0,j3=1;k3<n;k3++,j3++)//获取中心点,这样并不能获取真实中心点,不会写
        {           
                if (k3==0)
                {
                L=pt1[j3].distanceTo(pt1[k3]);
                ptCen1.x=pt1[k3].x+L/2;
                ptCen1.y=pt1[k3].y-L/2;
                ptCen1.z=0;
                }       
        }
       

       
        for(int k5=0,j5=1;k5<n;k5++,j5++)//平移到中心点
        {
                pt3[k5].x=pt1[k5].x-ptCen1.x;
                pt3[k5].y=pt1[k5].y-ptCen1.y;
                pt3[k5].z=0;

                pt4[j5].x=pt2[j5].x-ptCen1.x;
                pt4[j5].y=pt2[j5].x-ptCen1.y;
                pt4[j5].z=0;
        }

       

        for (int deep=0;deep>=-(DEEP);)//深度
        {
                                       
                for (double Scale=0.1;Scale<=1;)//长度
                {       
                        xform.scaling(Scale);//缩放
                       
                        for(int l=1,m=0;m<n;m++,l++)//形状                       
                        {
                               
                                  acutPrintf(("X%.3f,Y%.3f"),pt3[m].x,pt3[m].y);

                                if (pPoly->segType(m)==AcDbPolyline::kArc)
                                {               
                                               
                                        pPoly->getArcSegAt(m,arc);
                                        R=arc.radius();
                                        ptCen=arc.center();

                                        double dStartAngle =arc.startAng();                       
                                        double dEndAngle = arc.endAng();
                                        double dAlfa = Ccalculation::RtoG(dEndAngle - dStartAngle);

                                        pPoly->getBulgeAt(m,gBulge);
                               
                                        m=l;
                                        if (gBulge<0)
                                                {

                                                         if (dAlfa==180)
                                                        {
                                                                //半圆
                                                                acutPrintf(("X%.3f,Y%.3fR%.3f"),pt3[m].x,pt3[m].y,R);
                                                        }
                                                }       
                                                       
                                m=l-1;
                                               
                                        }                               
                                }                       
                Scale=Scale+0.3;
                pPoly->transformBy(xform);
                }
        deep=deep-2;
       
                }
        }
       
        pEnt->close();
        pPoly->close();       

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

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2013-9-14 17:02:44 来自手机 | 显示全部楼层
arx难道没有transform实体?还要计算点!

点评

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

使用道具 举报

 楼主| 发表于 2013-9-14 18:04:25 | 显示全部楼层
st788796 发表于 2013-9-14 17:02
arx难道没有transform实体?还要计算点!

我是新手,请原谅我的无知,请说明白一点好吗{:soso_e181:}

点评

每一个实体都有 transformby方法,你用实体的对象名,看下实体里面都有什么方法。  详情 回复 发表于 2013-9-14 18:16
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 13个

财富等级: 恭喜发财

发表于 2013-9-14 18:16:44 | 显示全部楼层
yzf_fs 发表于 2013-9-14 18:04
我是新手,请原谅我的无知,请说明白一点好吗

每一个实体都有 transformby方法,你用实体的对象名,看下实体里面都有什么方法。

点评

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

使用道具 举报

发表于 2013-9-14 18:50:06 | 显示全部楼层
yzf_fs 发表于 2013-9-14 15:43
图形是随便画的,没什么规定,封闭的polyline就行,以图形中心为缩放原点,接着将图形原点平移到世界坐标 ...

  1.   static void ProjTest(void)
  2.   {
  3.     ads_name ent;
  4.     ads_point pt;
  5.     if (acedEntSel(_T("\n选择对象:"),ent,pt) != RTNORM)
  6.     {
  7.       return;
  8.     }
  9.     AcDbExtents Ext;
  10.     AcDbObjectId Id;
  11.     AcDbEntity *pEnt;
  12.     acdbGetObjectId(Id,ent);
  13.     if (acdbOpenObject(pEnt,Id,AcDb::kForRead) != Acad::eOk)
  14.     {
  15.       pEnt->close();
  16.       return;
  17.     }
  18.     pEnt->getGeomExtents(Ext);
  19.     AcGePoint3d Cen((Ext.minPoint().x + Ext.maxPoint().x)*0.5,(Ext.minPoint().y + Ext.maxPoint().y)*0.5,(Ext.minPoint().z + Ext.maxPoint().z)*0.5);
  20.     AcGeMatrix3d mat0,mat1,mat2,mat3;
  21.     mat0.setToScaling(0.8,Cen);
  22.     mat1.setToScaling(0.6,Cen);
  23.     mat2.setToScaling(0.4,Cen);
  24.     mat3.setToScaling(0.2,Cen);
  25.     AcDbEntity *pEnt0,*pEnt1,*pEnt2,*pEnt3;
  26.     pEnt->getTransformedCopy(mat0,pEnt0);
  27.     pEnt->getTransformedCopy(mat1,pEnt1);
  28.     pEnt->getTransformedCopy(mat2,pEnt2);
  29.     pEnt->getTransformedCopy(mat3,pEnt3);
  30.     pEnt->close();
  31.     Acad::ErrorStatus es;
  32.     AcDbObjectId entId;
  33.     AcDbBlockTable *pBlockTable;
  34.     es = acdbHostApplicationServices()->workingDatabase()
  35.       ->getBlockTable(pBlockTable, AcDb::kForRead);
  36.     if (es != Acad::eOk)
  37.     {
  38.       pBlockTable->close();
  39.       pEnt->close();
  40.     }
  41.     AcDbBlockTableRecord *pBlockTableRecord;
  42.     es = pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord,AcDb::kForWrite);
  43.     if (es != Acad::eOk)
  44.     {
  45.       pBlockTable->close();
  46.       pBlockTableRecord->close();
  47.       delete pEnt0;
  48.       delete pEnt1;
  49.       delete pEnt2;
  50.       delete pEnt3;
  51.     }
  52.     es = pBlockTableRecord->appendAcDbEntity(entId, pEnt0);
  53.     es = pBlockTableRecord->appendAcDbEntity(entId, pEnt1);
  54.     es = pBlockTableRecord->appendAcDbEntity(entId, pEnt2);
  55.     es = pBlockTableRecord->appendAcDbEntity(entId, pEnt3);
  56.     pBlockTable->close();
  57.     pBlockTableRecord->close();
  58.     pEnt0->close();
  59.     pEnt1->close();
  60.     pEnt2->close();
  61.     pEnt3->close();
  62.   }

点评

我是想获取缩放后的每一个图形的坐标,不过这个代码好像复杂一点的图形就不行了  详情 回复 发表于 2013-9-14 21:35
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-9-14 18:57:40 | 显示全部楼层
LoveArx 发表于 2013-9-14 18:16
每一个实体都有 transformby方法,你用实体的对象名,看下实体里面都有什么方法。

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

使用道具 举报

 楼主| 发表于 2013-9-14 21:35:13 | 显示全部楼层

我是想获取缩放后的每一个图形的坐标,不过这个代码好像复杂一点的图形就不行了
69.jpg

点评

首先,你缩放的定义逻辑是混乱的!以中心点缩放就应该是这样的结果!如果这不是你要的结果,我想你要的应该不是缩放,而是偏移吧!  详情 回复 发表于 2013-9-14 22:19
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-9-14 22:19:03 | 显示全部楼层
yzf_fs 发表于 2013-9-14 21:35
我是想获取缩放后的每一个图形的坐标,不过这个代码好像复杂一点的图形就不行了

首先,你缩放的定义逻辑是混乱的!以中心点缩放就应该是这样的结果!如果这不是你要的结果,我想你要的应该不是缩放,而是偏移吧!

点评

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

使用道具 举报

 楼主| 发表于 2013-9-15 09:15:44 | 显示全部楼层
Love-Lisp 发表于 2013-9-14 22:19
首先,你缩放的定义逻辑是混乱的!以中心点缩放就应该是这样的结果!如果这不是你要的结果,我想你要的应 ...

原来是这样子,那偏移后怎样获取哪些坐标值呢

点评

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

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2013-9-15 09:20:49 来自手机 | 显示全部楼层
yzf_fs 发表于 2013-9-15 09:15
原来是这样子,那偏移后怎样获取哪些坐标值呢

原实体你都找出点了,偏移的就不会了?!

点评

大神怎么偏移啊,圆弧中还有半径,就算坐标能偏移那半径怎么办?  详情 回复 发表于 2013-9-16 10:31
是用这个吗virtual Acad::ErrorStatus getOffsetCurves(double offsetDist,AcDbVoidPtrArray& offsetCurves) const;Description to come AcDbVoidPtrArray& offsetCurves这个参数是什么意思?  详情 回复 发表于 2013-9-15 09:37
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-9-15 09:37:16 | 显示全部楼层
st788796 发表于 2013-9-15 09:20
原实体你都找出点了,偏移的就不会了?!

是用这个吗virtual Acad::ErrorStatus getOffsetCurves(double offsetDist,AcDbVoidPtrArray& offsetCurves) const;
offsetDistDescription to come
offsetCurvesDescription to come
Description to come

AcDbVoidPtrArray& offsetCurves这个参数是什么意思?


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

使用道具 举报

 楼主| 发表于 2013-9-16 10:31:00 | 显示全部楼层
st788796 发表于 2013-9-15 09:20
原实体你都找出点了,偏移的就不会了?!

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-24 12:21 , Processed in 0.423161 second(s), 51 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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