乐筑天下

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

切换CustomObjectSnapMode

[复制链接]

71

主题

928

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1230
发表于 2015-3-8 22:15:05 | 显示全部楼层

1+
回复

使用道具 举报

44

主题

3166

帖子

2803

银币

中流砥柱

Rank: 25

铜币
557
发表于 2015-3-9 13:30:28 | 显示全部楼层
下面是我用来覆盖垂直对象快照的压缩示例代码,当与 3D 线条一起使用时,此 Osnap 的默认行为是在 3D 方向上捕捉。对于在2d高程中工作的测量员和工程师来说,这是不可取的,所以有人问我是否可以做这样的事情。正如本线程的第一部分所述,我最初打算创建一个新的CustomObjectSnap,它运行得很好,但是我遇到的麻烦使它不是理想的解决方案。因此,我第一次冒险进入Overcovers,发现它们并不像我想象的那么可怕。基于n.yuan的例子(也可以通过我第一篇文章中的链接获得),我能够将其放在一起并使其按预期工作。我的应用程序更加健壮,因为它保存/恢复当前状态,向托盘添加一个图标以明显显示用户哪个状态是当前状态,并且还用于切换状态。using Autodesk.AutoCAD.DatabaseServices;。
使用Autodesk.AutoCAD.Geometry;。
使用Autodesk.AutoCAD.Runtime;。
使用系统;。

Namespace CustomOsnapTest。
{。
公共类 PerpOverruleTest : OsnapOverrule。
{。
私人布尔_overruling;。

public PerpOverruleTest()。
{。
_overruling = 推翻;。
推翻 = 真;。
Overrule.AddOverrule(RXClass.GetClass(typeof(Curve)), this, false);。
}。

公开无效 终止()。
{。
Overrule.RemoveOverrule(RXClass.GetClass(typeof(Curve)), this);。
推翻 = _overruling;。
}。

public override void GetObjectSnapPoints(。
Entity entity, ObjectSnapModes snapMode, IntPtr gsSelectionMark,。
Point3d pickPoint, Point3d lastPoint, Matrix3d viewTransform,。
Point3dCollection snapPoints, IntegerCollection geometryIds)。
{。
曲线 = 实体作为曲线;。

snapPoints.Clear();。
snapMode = ObjectSnapModes.ModePerpendicular;。

var cv2d = curve.GetOrthoProjectedCurve(new Plane(new Point3d(0, 0, 0), Vector3d.ZAxis));。
var pt = new Point3d(lastPoint.X, lastPoint.Y, 0);。
var perppt = cv2d.GetClosestPointTo(pt, true);。
snapPoints.Add(perppt);。
}。
   。
}。

公共类覆盖测试。
{。
PerpOverruleTest perpover;。
[命令方法(“perptesttoggle”)]。
公共 void perptestcommand()。
{。
if (perpover == null)。
{。
perpover = new PerpOverruleTest();。
Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage(“\n***Perpendicular set to 2d snapping only!***”);。
}。
还。
{。
渗透,终止();。
Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage(“\n***Perpendicular set to default of 3d snapping!***”);。
perpover = null;。
}。
}。
}。
}。


回复

使用道具 举报

71

主题

928

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1230
发表于 2015-3-9 14:09:35 | 显示全部楼层
挖掘另一个旧帖子,这次是我自己的,因为我的解决方案不起作用。这里有一些更新的代码,大部分都是有效的。当用户希望/需要将切线Osnap与第一个拾取点一起使用时,它不起作用……需要这样做的示例是使用TTR圆创建命令并选择线上的一个点。如果不运行我的否决权,将显示法向切线图示符,用户可以拾取点,但是,如果运行否决权,则不显示图示符,也不允许拾取。我不知道为什么…
这是代码,希望有人能指出我做错了什么
使用Autodesk.AutoCAD.DatabaseServices
使用Autodesk.AutoCAD.Geometry
使用Autodesk.AutoCAD.Runtime
使用Autodesk.Civil.DatabaseServices
使用系统
使用AcDb=Autodesk.AutoCAD.DatabaseServices
名称空间qux.SincpacC3D.ObjectSnaps
{
公共类PerpOverrule:OsnapOverrule
{
私有布尔_否决
私有ObjectId_entId=ObjectId.Null
公共PerpOverrule()
{
_ overruling=否决
否决=真
Overrule.AddOverrule(RXClass.GetClass(typeof(Curve)),这是真的
}
公共无效终止()
{
Overrule.RemoveOverrule(RXClass.GetClass(typeof(Curve)),这是一个
否决=_否决
}
公共覆盖无效GetObjectSnapPoints(AcDb.Entity实体、ObjectSnapModes和snapMode、IntPtr和gsSelectionMark,
Point3d拾取点、Point3d lastPoint、Matrix3d viewTransform、Point3dCollection捕捉点、IntegerCollection GeometryId)
{
如果(snapMode==ObjectSnapModes.modevertical)
{
Point3d:pt1=新的Point3d(pickPoint.X,pickPoint.Y,0)
Point3d pt2=新的Point3d(lastPoint.X,lastpointy,0)
曲线多边形=(曲线)实体
曲线展平多边形=(曲线)多边形。GetOrthoProjectedCurve(新平面(新点3D(0,0,0),Vector3d.ZAxis))
//一些C3D对象派生自曲线,但不支持下面的线条。
试试
{
基地。GetObjectSnapPoints(展平多边形、snapMode、gsSelectionMark、pt1、pt2、viewTransform、snapPoints、GeometryId)
}
捕获{}
}
否则//它是垂直以外的任何快照模式。
{
试试
{
基地。GetObjectSnapPoints(实体、snapMode、gsSelectionMark、pickPoint、lastPoint、viewTransform、snapPoints、GeometryId)
}
捕获{}
}
}
}
公共类PerpOverrideToggle
{
公共静态PerpOverrule perpoverride=null
[CommandMethod(“Perp2dtoggle”,CommandFlags.Transparent)]
公共void perptestcommand()
{
如果(perpoverride==null)
{
perpoverride=new PerpOverrule()
Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor。WriteMessage(“\n***仅垂直设置为二维捕捉!***”)
}
其他
{
perpoverride.Terminate()
Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor。WriteMessage(“\n***垂直设置为3d捕捉的默认值!***”)
perpoverride=null
}
}
}
}
回复

使用道具 举报

71

主题

928

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1230
发表于 2016-3-7 20:03:39 | 显示全部楼层
不确定这是否是您所需要的,但您是否尝试过添加一个配套的GeometryOverrule
我必须找到去年为一个非正式应用程序编写的代码,该应用程序允许我禁用/重新启用锁定层上实体的捕捉点-这是受SincPac的ParcelOffset命令启发的,因此我可以使用当前的OSMODE将可用捕捉点限制为仅解锁的层
无论如何,为了考虑非文字捕捉点,我发现我还必须实现GeometryOverrule
http://through-the-interface.typepad.com/through_the_interface/2013/12/disabling-snapping-to-specific-autocad-objects-using-net-part-2.html
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-2-4 18:58 , Processed in 0.177204 second(s), 58 queries .

© 2020-2025 乐筑天下

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