找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 572|回复: 3

[求助] ARX遮罩wipeout坐标有0.5的偏差

[复制链接]
发表于 2020-7-26 01:07:07 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 DCMZ 于 2020-7-26 01:08 编辑

1.png
关于创建遮罩,我遇到了一个问题,如上图所示,红色矩形是我希望创建出来的,如下面我的代码,代码中,点集左下点是0,0,右上点是10,10.
但是创建出来的确实黄色,左下是0.5,-0.5,右上是10.5,9.5。
不知道黄色相对红色变换的0.5是哪里来的。

  1. void Test()
  2. {
  3.         struct resbuf *Rb1 = new resbuf;
  4.         Rb1->restype = 0;
  5.         Rb1->resval.rstring = L"TEXT";
  6.         Rb1->rbnext = NULL;
  7.         acutPrintf(L"选择需要添加遮罩的文本:");
  8.         ads_name Ss;
  9.         ads_ssget(NULL,NULL,NULL,Rb1,Ss);
  10.         int32_t *n;//选择集总个数
  11.         ads_sslength(Ss , n);
  12.         ads_name Ent0;//当前实体名
  13.         for (int i = 0; i < *n; i++)
  14.         {
  15.                 ads_ssname(Ss, i, Ent0);
  16.                 CDcText Txt0;
  17.                 AcDbObjectId txtID;
  18.                 Txt0.getID(Ent0);
  19.                 Txt0.getPt(Txt0.Entity_ID);
  20.                 Txt0.getRotation(Txt0.Entity_ID);
  21.                 Txt0.getWH(Txt0.Entity_ID , 1.05);
  22.                 //遮罩点集合
  23.                 AcGePoint2dArray wipPts;
  24.                 //wipPts.append(Txt0.pt_leftlower);
  25.                 //wipPts.append(Txt0.pt_rightlower);
  26.                 //wipPts.append(Txt0.pt_rightupper);
  27.                 //wipPts.append(Txt0.pt_leftupper);
  28.                 //wipPts.append(Txt0.pt_leftlower);
  29.                 wipPts.append(AcGePoint2d(0, 0));
  30.                 wipPts.append(AcGePoint2d(10, 0));
  31.                 wipPts.append(AcGePoint2d(10, 10));
  32.                 wipPts.append(AcGePoint2d(0, 10));
  33.                 wipPts.append(AcGePoint2d(0, 0));


  34.                 AcDbWipeout::createImageDefinition();//初始化遮罩
  35.                 AcDbWipeout *pWipeout = new AcDbWipeout;
  36.                 pWipeout->createImageDefinition();
  37.                 pWipeout->setDatabaseDefaults();
  38.                 AcGePoint3d originPnt(0,0,0);
  39.                 AcGeVector3d Udirection(1, 0, 0);
  40.                 AcGeVector3d Vdirection(0, -1, 0);
  41.                 pWipeout->setOrientation(originPnt, Udirection, Vdirection);
  42.                 pWipeout->setDisplayOpt(AcDbRasterImage::kTransparent, Adesk::kTrue);
  43.                 pWipeout->setDisplayOpt(AcDbRasterImage::kShowUnAligned, Adesk::kTrue);
  44.                 pWipeout->setClipBoundaryToWholeImage();
  45.                 pWipeout->setClipBoundary(AcDbRasterImage::kPoly, wipPts);
  46.                 Post2Model(pWipeout);
  47.                 pWipeout->close();
  48.                 acutPrintf(L"x=%f\ty=%f\n", Txt0.Position.x, Txt0.Position.y);
  49.                 acutPrintf(L"W=%f\tH=%f\n", Txt0.txtW ,Txt0.txtH);
  50.                 acutPrintf(L"Rotation=%f\n", Txt0.Rotation);
  51.                 acutPrintf(L"%f,%f\t%f,%f\n", Txt0.pt_leftlower.x , Txt0.pt_leftlower.y , Txt0.pt_rightupper.x , Txt0.pt_rightupper.y);
  52.         }
  53.         delete Rb1;
  54. }

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

已领礼包: 145个

财富等级: 日进斗金

发表于 2020-7-26 01:18:58 | 显示全部楼层
缺PIXEL到模型空间的矩阵转换,给你个参考
Acad::ErrorStatus es;
        AcDbWipeout::createImageDefinition();
        AcDbWipeout* pMyWipeout = new AcDbWipeout();
        pMyWipeout->setDatabaseDefaults();
        AcGePoint3d pt, origin, maxPt, minPt;
        AcDbExtents mExt;
        for (int i = 0; i < clipVtx.length(); i++)
        {
                mExt.addPoint(clipVtx[i]);
        }
        minPt = mExt.minPoint();
        maxPt = mExt.maxPoint();
        origin = minPt;
        double x = maxPt.x - minPt.x, y = maxPt.y - minPt.y;
        double max = (x < y) ? y : x;
        AcGeVector3d u(max, 0, 0), v(0, max, 0);
        pMyWipeout->setOrientation(origin, u, v);
        pMyWipeout->setClipBoundaryToWholeImage();
        AcGeMatrix3d PixelToModel, ModelToPixel;
        pMyWipeout->getPixelToModelTransform(PixelToModel);
        ModelToPixel = PixelToModel.invert();
        AcGePoint2dArray mPts;
        for (int i = 0; i < clipVtx.length(); i++)
        {
                clipVtx[i].transformBy(ModelToPixel);
        }
        XdGeUtils::trans3DTo2D(&clipVtx, mPts);
        // ...设置参数
        pMyWipeout->setDisplayOpt(AcDbRasterImage::kClip, Adesk::kTrue);
        es = pMyWipeout->setClipBoundary(AcDbRasterImage::kPoly, mPts);

        XdDbUtils::rxErrorMsg(es);
        if (es != eOk)
                return es;
        pWipeout = AcDbEntity::cast(pMyWipeout);

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

使用道具 举报

 楼主| 发表于 2020-7-27 12:39:56 | 显示全部楼层
XDSoft 发表于 2020-7-26 01:18
缺PIXEL到模型空间的矩阵转换,给你个参考
Acad::ErrorStatus es;
        AcDbWipeout::createImageDefinition( ...

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

使用道具 举报

发表于 2021-9-14 14:43:49 | 显示全部楼层
为什么我用这个代码生成wipeout的时候,程序运行后没有生成wipeout,但是运行一次wipeout命令后再运行该程序就能生成呢?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-18 11:08 , Processed in 0.409004 second(s), 36 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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