AutoCAD提示结果问题
您好,有人能帮我理解autocad API中的PromtResult类吗?
我正在编写一些代码,从选定的实体创建一个块,然后将该块拖动到任何地方
我当前的代码要求用户插入一个块名,这在大多数情况下都很好,但我也希望在没有用户输入的情况下直接解析块id…
如何使用PromptResult=PromptStatus。ok,直到使用了右键单击或ESC按钮,如果用户想退出,显然是为了停止某些代码的执行
GRH
**** Hidden Message ***** 嗨,是这样的吗?注意:将块名称“S”更改为您想要的名称。使用(Transaction tr=db.TransactionManager.StartTransaction())。
{。
尝试。
{。
BlockTable BlkTbl=(BlockTable)tr.GetObject(db.BlockTableId,OpenMode.ForRead);。
var spc=tr.GetObject(db.CurrentSpaceId,OpenMode.ForWrite);。
var op=new PromptPointOptions("\n指定插入块的点:");。
op.AllowNone=true;。
同时(真)。
{。
PromptPointResult=ed.GetPoint(op);。
如果(pt.Status==PromptStatus.OK)。
{。
BlockTableRecord BlkRec=(BlockTableRecords)BlkTbl["S"]. GetObject(OpenMode.ForWrite);。
MyBlock=new BlockResources(pt.Value,BlkRec.ObjectId);。
MyBlock.Layer="0";。
spc.AppendEntity(MyBlock);。
tr.AddNewlyCreatedDBObject(MyBlock,true);。
db.TransactionManager.QueueForGraphicsFlush();。
}。
否则中断;。
}。
}。
捕获(System.Exceptionx)。
{。
ed.WriteMessage("\nError:"+x.Message);。
}。
tr.Commit();。
}。
您好,感谢您的回复,
我对您的代码有点困惑,因为我的插入点的用户输入是我的jig类的一部分(覆盖函数采样器)…请参见下面的
公共函数BlockWithJig(ByVal BlockName作为字符串,ByVal point作为Point3d)作为ObjectId
Dim doc As Document=Application.DocumentManager.MdiActiveDocument
Dim db As Database=doc.Database
作为编辑器调整尺寸=文档编辑器
将pr变暗为PromptResult=Nothing
如果检测到ESC或右键单击,退出功能
使用tr作为Transaction=doc.TransactionManager.StartTransaction()
Dim bt As BlockTable=DirectCast(tr.GetObject(db.BlockTableId,OpenMode.ForRead),BlockTable)
如果不是bt.Has(BlockName),则
其他
Dim bdId作为ObjectId=bt(BlockName)
Dim br作为新的区块参考(点,bdId)
<div>将entJig作为新的BlockJig(br)</div>
pr=ed.Drag(entJig)'执行jig
将ms作为BlockTableRecord=DirectCast(tr.GetObject(bt(BlockTableRecord.ModelSpace)),OpenMode进行Dim。ForWrite),BlockTableRecord)
ms.AppendEntity(entJig.GetEntity())
tr.AddNewlyCreatedDBObject(entJig.GetEntity(),True)
doc.TransactionManager.QueueForGraphicsFlush()
tr.Commit()
返回bdId
如果
结束使用
结束函数
GRH
嘿,GRH,如果插入多个blockref,返回ObjectID可能没有意义。也许ObjectdCollection更合适。您可以将提示结果粘贴到do-while循环中以添加更多内容。它可能看起来像这样:
公共对象集合Jiggety()
{
objectdcollection retCollection=new objectdcolection()
<div>PromptResult blResult
do
{
BlockJig:blJig=new blockjing()
<div>//Jig it</div>
blResult=Active.Editor.Drag(blJig)
if(blResult.Status==PromptStatus.Keyword)
{
开关(blResult.StringResult)
{
案例“Q”:
//做关键字填充
中断
案例“A”:
//做关键字填充
中断
}
}
else if(blResult.Status==PromptStatus.OK)
{
//将块添加到当前空间
使用(LockedTransaction tr=Active.Document.TransactionManager.StartLockedTransaction())
{
BlockTableRecord:blockDef=tr.GetObject(blockId,OpenMode.ForRead)作为BlockTableRecord
BlockTableRecord curSpace=(blocktablerrecord)tr.GetObject(Active.Database.CurrentSpaceId,OpenMode.ForWrite)
BlockReference br=新的blockReferences(blJig.GetEntity()。位置,blockId)
//设置属性并添加到currentSpace
br.旋转=旋转
br.ScaleFactors=scale
ObjectId:returnId=curSpace.AppendEntity(br)
retCollection.Add(returnId)
tr.addNewlyCreatedBobObject(br,true)
tr.Commit()
}
else//if(blResult.Status!=PromptStatus.OK blResult.Status!=promptsstatus.Keyword)
{
取消=真
}
}同时(blResult.Status!=PromptStatus.Cancel&
blResult。状态!=提示状态。错误&!取消)
返回集合
}
谢谢Mate,
抱歉我的无知,但我只 VB.net 编码,我试图在线转换这个,但我得到了错误.....
你有没有机会更新你的帖子以显示 VB.net?
欢呼
哎哟
对不起,伙计,代码不是为了编译,我只是为了说明而把它放在一起。我可能会屠杀VB版本比我发布的C#更糟糕,如果您在阅读 C# 时遇到问题,请使用提示在 do/while 循环中拖动夹具:在 do/while 循环中拖动夹具。状态为检查是否退出循环。
如果你要插入多个 blockRef,你可能应该返回多个 ObjectID(如果你正在使用它们),考虑返回一个 ObjectIdCollection代码的其他方面(当前空间与模型空间等),我只是留了下来,因为我在我的例程中使用它们,并认为它们可能会有所帮助。
谢谢,
这一次只插入一个块Ref....
我现在有一个计划,谢谢。
断续器
页:
[1]