事情越来越复杂...
大家好,这是我的第一篇文章,到目前为止我不需要问任何问题,因为你已经问了我所有的问题
我已经使用用户控件创建了一个自定义调色板,我正在将带有属性的块放在绘图中。我有大约100个不同的属性值,它们都按6个组合框排序。
public void insBlok(string code)
{
Document doc = AcAp.DocumentManager.MdiActiveDocument;
Database db = doc.Database;
Editor ed = doc.Editor;
Utils.SetFocusToDwgView();
Point3d ptPoint = new Point3d(0, 0, 0);
try
{
while (ptPoint != null)
{
PromptPointResult pPtRes;
PromptPointOptions pPtOpts = new PromptPointOptions("");
pPtOpts.AllowNone = true;
pPtOpts.Message = "\nSelect point: ";
pPtRes = doc.Editor.GetPoint(pPtOpts);
if (pPtRes.Status == PromptStatus.None || pPtRes.Status == PromptStatus.Cancel || pPtRes.Status == PromptStatus.Error)
{
return;
}
ptPoint = pPtRes.Value;
using (DocumentLock loc = doc.LockDocument())
{
using (Transaction tr = db.TransactionManager.StartTransaction())
{
...................
using (BlockReference blockRef = new BlockReference(ptPoint, btr.ObjectId))
{
foreach (ObjectId id in btr)
{
//insert value in attribute,
}
}
tr.Commit();
}
}
}
}
catch (System.Exception x)
{
ed.WriteMessage("\nError: " + x.Message);
}
finally
{
ed.WriteMessage("\n");
}
}
这是按钮单击的代码:
private void cboBtn_ButtonClick(object sender, EventArgs e)
{
string buttonText = ((ComboBox1)sender).Text;
buttonText = buttonText.Substring(0, 3);
insBlok(buttonText);
}
当我单击按钮时,所有东西都作为sholud工作,但是当我从ComboBox中选择不同的属性并再次单击按钮(没有以Enter或Esc结束第一个命令)时,相同的命令又一次触发,这次嵌套在以前的事务中。结束第二个命令后,第一个命令处于活动状态。
我可以创建
bool
active_command,但还有另一个具有相似代码的用户表单(具有不同属性值的不同块),因此我能够更改调色板,选择属性值,单击该用户表单上的按钮,插入该块,然后第一个命令处于活动状态。
命令没有
命令方法
辅助程序,只能从自定义调色板调用它。
现在怎么办?我可以删除whilw循环,但用户必须每次单击按钮。使用命令方法atrelte我应该有100个命令(这不仅是Autocad的附加命令)。SendCommand^C^C不是一个选项,我认为......
**** Hidden Message ***** 不知道为什么要回避CommandMethod属性
几乎我所有的调色板都是通过SendStringToExecute执行命令的,
汤姆太多了@#$
tom
愚蠢
,带有文档锁等。要执行的字符串开头的
\x03\x03
在执行新命令之前取消当前命令
也许你会发现这很有用:
命令方法(“MyCommand”)
公共void MyCommand()
{
试试
{
字符串attText=myPalette.AttString
入块(attText)
}
捕获(例外e)
{
ErrorHandler.HandleError(e)
}
}
私有void btnMyButton_Click(对象发送者,事件参数e)
{
是活动的.Document。SendStringToExecute(“\x03\x03MyCommand”,真、假、假)
}
有趣......
我必须先试试。谢谢! @Atook
如果使用
GetPoint
方法,这是否意味着整个方法
MyCommand
必须包装在
Form1.Hide()中;
SendStringToExecute(“MyCommand”);
Form1.Show();
如果是这样,难道不存在同步执行的风险吗?
其中
SendStringExecute
将只抛出命令进行执行,不会等待任何用户输入,而 .NET 将只在
Form1.Show() 上继续运行;
因此,由于表单/对话框重新播放,用户将立即被打断。
我之所以提到这一点,是因为最近有一个关于
SendCommand
方法的讨论,该方法的性能可能与
SendStringToExecute
类似。
盲目地说话,所以如果我完全偏离了轨道,请原谅我。
当然,假设它是一个模式对话框,不确定是否有可能使用无模式。 @Grrr1337我的理解是,该命令是从调色板运行的,而不是从窗体运行的。
从调色板上看,你是对的。
@Grrr1337可能是指无模式形式,在这种情况下,它的行为与调色板集相同。
对于OP:
使用SendStringToExecute()是从QueleSet执行工作的推荐方法,特别是在您的情况下(插入块)。用户不仅可以在上一个插入循环仍处于活动状态的情况下再次单击PalateeSet上的按钮,还可以对其他AutoCAD命令处于活动状态执行相同的操作。因此,您确实需要处理这种情况:单击按钮时,第一件事是测试是否有处于活动状态的命令。如果是,则警告用户并停止;或者取消活动命令,然后继续。你总是可以在 SendStringToExecute() 中用 “^C^C” (“\x03\x03”) 作为命令前缀(现在你明白为什么 SendStringToExecute() 是推荐的方式从 PalateSet 或无模式形式中剔除事物)。
在插入循环期间隐藏 PaletteSet/无模式表单也可能是一个好主意,以便表单仅在插入循环显式完成时才显示回来,毕竟,隐藏 UI 将允许公开更多 AutoCAD 屏幕以供选取。
AutoCAD .NET论坛最近对此进行了讨论,我写了一篇可能会有所帮助的文章:
https://drive-cad-with-code.blogspot.com/2018/10/executing-command-from-paletteset.html
非常感谢袁。隐藏PaleteSet不是一个好主意,我只能用它来吓唬用户(超过一半的人仍然在问我为什么不创建工具栏来插入块——答案是我没有足够的图标)。
已经实现了A的解决方案,但有一些小的变化:我找到了一个额外的命令窗口空间,一些块比其他块更频繁地插入......抱歉,块是一样的,都是关于属性的,贡品是土地使用的代码:-我
PaletteSet的其他命令没有问题,它们只是单击/选择/更改。
我尝试了
CMDAC
,但没有结果。再一次,要在短时间内阅读许多东西。
页:
[1]