autocad Objectarx 使用setWindowArea设置打印区域后,发现与实际打印出来的区域不一致的问题

作者: admin 分类: C++,CAD,ObjectARX 发布时间: 2021-02-10 18:24

一、现象:使用AcDbDatabase readDwgFile dwg文件,然后使用setPlotWindowArea函数设置模型空间打印区域,保存退出。打开dwg后,预览发现设置的打印区域与实际需要的区域有偏移。
二、分析方法
1、检查发现设置区域的min点和max点的x、y值均正确
2、执行图纸修复,无错误,问题依旧
3、调整setPlotWindowArea函数与setPlotCentered、setPlotType函数执行顺序的位置,无效。
4、将图框复制到新的dwg文件中,发现结果正确,初步判断可能和系统变量有关,但变量值太多,不知道是哪个起的作用。
5、采用逆向思路,步骤如下:
5.1 找到数值的偏差

20150330182358947.jpg

如上图,通过预览功能,将鼠标放在屏幕点上,可以知道设置的实际打印区域min点的x,y与设置区域min点的x,y有偏差。
5.2、计算出两个min点间的x,y差值。
5.3、通过setvar命令获取所有的图纸系统变量值,然后用5.2步骤计算出的差值进行查找,注意值不用完全符合,高位几位数大致符合即有可能是目标。最后发现“target”环境变量的值符合差值。

三、原因:dwg文件的target系统变量发生改变,默认为(0,0,0),出问题的图纸的x,y不为0,导致设置出现偏移。
四、解决方法:对设置的打印区域按target变量的值进行反平移,使之正确,部分代码如下:

//readDwgFile不能通过acedGetVar获取target对象,要通过读取AcDbViewportTableRecord对象的target函数获取
 AcDbObjectId vpID= pDB->viewportTableId();

 AcDbObjectPointer<AcDbViewportTable> vpTable_Ptr(vpID,AcDb::kForRead);
 AcGePoint3d pnt_ViewTarget;
 {   if (Acad::eOk == vpTable_Ptr.openStatus())
  {
   AcDbViewportTableRecord *vp_TbRec=NULL;    
if (Acad::eOk == vpTable_Ptr->getAt(acdbSymUtil()->viewportActiveName(),vp_TbRec,AcDb::kForRead))
   {
    pnt_ViewTarget=vp_TbRec->target();
    vp_TbRec->close();
    vp_TbRec=NULL;
   }
  }
 }

 AcGeMatrix3d mat;
 mat.setToTranslation(-(pnt_ViewTarget.asVector()));  //反向平移
 AcGePoint3d maxPnt,minPnt;
 maxPnt[X]=ext.maxPoint().x;
 maxPnt[Y]=ext.maxPoint().y;
 maxPnt[Z]=ext.maxPoint().z;
 minPnt[X]=ext.minPoint().x;
 minPnt[Y]=ext.minPoint().y;
 minPnt[Z]=ext.minPoint().z;
 maxPnt.transformBy(mat);
 minPnt.transformBy(mat);
 DwgBoxMaxExtInMSpace.
set(minPnt,maxPnt);

如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作!

发表评论

标签云