乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 183|回复: 10

移动实体

[复制链接]

1

主题

4

帖子

1

银币

初来乍到

Rank: 1

铜币
8
发表于 2017-11-25 17:28:27 | 显示全部楼层 |阅读模式
我被难住了。
我正在使用RealDWG API C#,我似乎无法沿着向量移动ModelSpace中的所有实体。
我可以更改图层,但我不能移动实体。
这是方法。有什么想法吗?
{
使用(Database tmpDb=new Database(false, true))
{
tmpDb.ReadDwgFile(block Path,System.IO.FileShare.ReadWrite, true, "");
使用(Transaction tmpTrans=(Transaction)tmpDb.TransactionManager.StartTransaction())
{
LayerTable layerTbl=(LayerTable)tmpTrans.GetObject(tmpDb.LayerTableId,OpenMode.ForRead);
//关闭度量层
string sLayerName="Metric";
LayerTableRecacLyrTblRec;
if(layerTbl.Has(sLayerName))
{
acLyrTblRec=tmpTrans.GetObject(layerTbl[sLayerName],OpenMode.ForWrite)as LayerTableRecord;
acLyrTblRec.IsOff=true;
}
var temBt=(BlockTable)tmpTrans.GetObject(tmpDb.BlockTableId,OpenMode.ForRead);
var>
Point3d delta=new Point3d(0,0,0);
Vector3d的距离ToZero=zero.GetVectorTo(new Point3d(1.5,1.5,0));
//沿着向量移动所有实体
foreach(tmpBtr中的ObjectId entId)
{
Entity ent=tmpTrans.GetObject(entId,OpenMode.ForWrite)作为实体;
if(ent!=null)
{
ent.TransformBy(Matrix3d.Displacement(距离ToZero));
}
}
tmpTrans.Commit();
}
tmpDb.SaveAs(block Path,DwgVersion.AC1024);
}
}

本帖以下内容被隐藏保护;需要你回复后,才能看到!

游客,如果您要查看本帖隐藏内容请回复
回复

使用道具 举报

15

主题

687

帖子

169

银币

中流砥柱

Rank: 25

铜币
582
发表于 2017-11-25 17:37:10 | 显示全部楼层
嗨,
你显示的代码有一些奇怪的:
Point3d delta = new Point3d(0, 0, 0);  
Vector3d distanceToZero = zero。GetVectorTo(new Point3d(1.5, 1.5, 0));
这个零从何而来?
如果零等于Point3d.Origin,你可以简单地构建你的向量,如下所示:
Vector3d distanceToZero = new Vector3d(1.5, 1.5, 0);
回复

使用道具 举报

1

主题

4

帖子

1

银币

初来乍到

Rank: 1

铜币
8
发表于 2017-11-25 17:48:46 | 显示全部楼层
这就是我要做的。我正在尝试构建一个包含多个细节的详图。问题是有些细节不是“标准的”。标准详图的详图边框左下角应为0,0。这是我在示例中遗漏的内容
foreach(tmpBtr中的ObjectId entId)
{
实体ent=tmpTrans.GetObject(entId,OpenMode.ForRead)作为实体;
如果(ent!=null)
{
Polyline-pLine=ent作为多段线;
if(pLine!=null&&pLine.Layer.ToUpper()=“titleline”)
列出<Point2d>点=新列表<Point2d>();
List
xVals=新列表
()
List
yVals=新列表
()
int vn=pLine。顶点数
对于(int i=0;i
{
var point=pLine.GetPoint2dAt(i);
points.Add(point);
xVals.adds(point.X);
yVals.Add(point.Y);
}
Point2d lowestLeft=points。第一个默认值(p=>p.X==xVals.Min()&&p.Y==yVals。Min())
如果(lowestLeft.X!=0
回复

使用道具 举报

1

主题

4

帖子

1

银币

初来乍到

Rank: 1

铜币
8
发表于 2017-11-25 17:50:52 | 显示全部楼层
lowestLeft.Y!=0)
{
detailIsBad=true;
var-zero=new-Point3d(0,0,0);
distance-to-zero=零。GetVectorTo(new-Point3d(Lowest-left.X,LowestLeaft.Y,0));
中断
}
}
}<br>如果(detailIsBad)<br>//这里是我尝试转换的地方
回复

使用道具 举报

69

主题

875

帖子

15

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1146
发表于 2017-11-25 20:25:00 | 显示全部楼层
一切正常。我得到了一个矢量,但是当我在AutoCAD中打开图形时,公制图层处于关闭状态,但是没有移动到0,0。
回复

使用道具 举报

57

主题

559

帖子

13

银币

中流砥柱

Rank: 25

铜币
786
发表于 2017-11-25 22:22:06 | 显示全部楼层
嗨,埃里克,欢迎登船!
首先,对代码进行一些一般注释。
你真的应该从你的方法中重构“detailIsBad”代码,把其他任何不应该存在的东西都分解掉。在单个方法中发生太多事情可能会让你大做文章,因为您无法从逻辑上隔离出任何可能的问题,并且您开始一遍又一遍地查看所有代码(我正在尝试检查您的代码!
当你的方法只做一件事时,它们很容易测试和推理,你只需阅读几行代码就可以“调试”它们。
最好先调用谓词或布尔值,例如“isDetailBad”而不是“detailIsBad”。如果一个方法正在做某事,再次把“做”这个词放在第一位,比如“get”或“set”。
现在,“break;”语句旨在实现什么效果,它是在做正确的事情还是使你的整体方法短路,很难说,因为你已经挑选了部分代码作为示例。
希望这有帮助,很抱歉挑剔,似乎需要更多的工作来分离所有内容,但从长远来看,它可以节省时间(精神上),并且它有助于我们审查您的代码。
回复

使用道具 举报

69

主题

875

帖子

15

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1146
发表于 2017-11-26 18:26:34 | 显示全部楼层

ThumbsUp()
回复

使用道具 举报

85

主题

404

帖子

7

银币

中流砥柱

Rank: 25

铜币
751
发表于 2017-11-26 21:31:19 | 显示全部楼层

不错的代码Mick,感谢分享。我喜欢从函数返回字典
的想法。
我注意到事务没有显式提交。
db.TransactionManager.StartTransaction()
事务一旦超出范围就会提交吗?
回复

使用道具 举报

69

主题

875

帖子

15

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1146
发表于 2017-11-26 22:50:00 | 显示全部楼层
翻译错误代码(429):请求 QPS 超过限制。
回复

使用道具 举报

1

主题

4

帖子

1

银币

初来乍到

Rank: 1

铜币
8
发表于 2017-11-27 08:54:19 | 显示全部楼层
翻译错误代码(429):请求 QPS 超过限制。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-2-4 12:51 , Processed in 0.438502 second(s), 83 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表