乐筑天下

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

事情越来越复杂...

[复制链接]

5

主题

16

帖子

1

银币

初来乍到

Rank: 1

铜币
36
发表于 2018-11-30 13:26:50 | 显示全部楼层 |阅读模式
大家好,
这是我的第一篇文章,到目前为止我不需要问任何问题,因为你已经问了我所有的问题
我已经使用用户控件创建了一个自定义调色板,我正在将带有属性的块放在绘图中。我有大约100个不同的属性值,它们都按6个组合框排序。
  1. public void insBlok(string code)
  2.         {
  3.             Document doc = AcAp.DocumentManager.MdiActiveDocument;
  4.             Database db = doc.Database;
  5.             Editor ed = doc.Editor;
  6.             Utils.SetFocusToDwgView();
  7.             Point3d ptPoint = new Point3d(0, 0, 0);
  8.             try
  9.             {
  10.                 while (ptPoint != null)
  11.                 {
  12.                     PromptPointResult pPtRes;
  13.                     PromptPointOptions pPtOpts = new PromptPointOptions("");
  14.                     pPtOpts.AllowNone = true;
  15.                     pPtOpts.Message = "\nSelect point: ";
  16.                     pPtRes = doc.Editor.GetPoint(pPtOpts);
  17.                     if (pPtRes.Status == PromptStatus.None || pPtRes.Status == PromptStatus.Cancel || pPtRes.Status == PromptStatus.Error)
  18.                     {
  19.                         return;
  20.                     }
  21.                     ptPoint = pPtRes.Value;
  22.                     using (DocumentLock loc = doc.LockDocument())
  23.                     {
  24.                         using (Transaction tr = db.TransactionManager.StartTransaction())
  25.                         {
  26.                         ...................
  27.                             using (BlockReference blockRef = new BlockReference(ptPoint, btr.ObjectId))
  28.                             {
  29.                                 
  30.                                 foreach (ObjectId id in btr)
  31.                                 {
  32.                                        //insert value in attribute,
  33.                                 }
  34.                             }
  35.                             tr.Commit();
  36.                         }
  37.                     }                  
  38.                 }
  39.             }
  40.             catch (System.Exception x)
  41.             {
  42.                 ed.WriteMessage("\nError: " + x.Message);
  43.             }
  44.             finally
  45.             {
  46.                 ed.WriteMessage("\n");
  47.             }
  48.         }

这是按钮单击的代码:
  1. private void cboBtn_ButtonClick(object sender, EventArgs e)
  2.         {
  3.             string buttonText = ((ComboBox1)sender).Text;
  4.             buttonText = buttonText.Substring(0, 3);
  5.             insBlok(buttonText);
  6.         }

当我单击按钮时,所有东西都作为sholud工作,但是当我从ComboBox中选择不同的属性并再次单击按钮(没有以Enter或Esc结束第一个命令)时,相同的命令又一次触发,这次嵌套在以前的事务中。结束第二个命令后,第一个命令处于活动状态。
我可以创建
bool
active_command,但还有另一个具有相似代码的用户表单(具有不同属性值的不同块),因此我能够更改调色板,选择属性值,单击该用户表单上的按钮,插入该块,然后第一个命令处于活动状态。
命令没有
命令方法
辅助程序,只能从自定义调色板调用它。
现在怎么办?我可以删除whilw循环,但用户必须每次单击按钮。使用命令方法atrelte我应该有100个命令(这不仅是Autocad的附加命令)。SendCommand^C^C不是一个选项,我认为......

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

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

使用道具 举报

85

主题

404

帖子

7

银币

中流砥柱

Rank: 25

铜币
751
发表于 2018-11-30 15:55:51 | 显示全部楼层
不知道为什么要回避CommandMethod属性
几乎我所有的调色板都是通过SendStringToExecute执行命令的,
汤姆太多了@#$
tom
愚蠢
,带有文档锁等。要执行的字符串开头的
\x03\x03
在执行新命令之前取消当前命令
也许你会发现这很有用:
命令方法(“MyCommand”)
公共void MyCommand()
{
试试
{
字符串attText=myPalette.AttString
入块(attText)
}
捕获(例外e)
{
ErrorHandler.HandleError(e)
}
}
私有void btnMyButton_Click(对象发送者,事件参数e)
{
是活动的.Document。SendStringToExecute(“\x03\x03MyCommand”,真、假、假)
}
回复

使用道具 举报

5

主题

16

帖子

1

银币

初来乍到

Rank: 1

铜币
36
发表于 2018-11-30 16:07:02 | 显示全部楼层
有趣......
我必须先试试。谢谢!
回复

使用道具 举报

71

主题

483

帖子

7

银币

中流砥柱

Rank: 25

铜币
765
发表于 2018-11-30 19:17:03 | 显示全部楼层
@Atook
如果使用
GetPoint
方法,这是否意味着整个方法
MyCommand
必须包装在
Form1.Hide()中;
SendStringToExecute(“MyCommand”);
Form1.Show();
如果是这样,难道不存在同步执行的风险吗?
其中
SendStringExecute
将只抛出命令进行执行,不会等待任何用户输入,而 .NET 将只在
Form1.Show() 上继续运行;
因此,由于表单/对话框重新播放,用户将立即被打断。
我之所以提到这一点,是因为最近有一个关于
SendCommand
方法的讨论,该方法的性能可能与
SendStringToExecute
类似。
盲目地说话,所以如果我完全偏离了轨道,请原谅我。
当然,假设它是一个模式对话框,不确定是否有可能使用无模式。
回复

使用道具 举报

85

主题

404

帖子

7

银币

中流砥柱

Rank: 25

铜币
751
发表于 2018-11-30 22:13:11 | 显示全部楼层
@Grrr1337我的理解是,该命令是从调色板运行的,而不是从窗体运行的。
回复

使用道具 举报

5

主题

16

帖子

1

银币

初来乍到

Rank: 1

铜币
36
发表于 2018-12-1 06:30:16 | 显示全部楼层
从调色板上看,你是对的。
回复

使用道具 举报

4

主题

219

帖子

4

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
238
发表于 2018-12-1 10:19:44 | 显示全部楼层

@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
回复

使用道具 举报

5

主题

16

帖子

1

银币

初来乍到

Rank: 1

铜币
36
发表于 2018-12-1 15:44:24 | 显示全部楼层
非常感谢袁。隐藏PaleteSet不是一个好主意,我只能用它来吓唬用户(超过一半的人仍然在问我为什么不创建工具栏来插入块——答案是我没有足够的图标)。
已经实现了A的解决方案,但有一些小的变化:我找到了一个额外的命令窗口空间,一些块比其他块更频繁地插入......抱歉,块是一样的,都是关于属性的,贡品是土地使用的代码:-我
PaletteSet的其他命令没有问题,它们只是单击/选择/更改。
我尝试了
CMDAC
,但没有结果。再一次,要在短时间内阅读许多东西。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-2-4 08:11 , Processed in 0.294015 second(s), 79 queries .

© 2020-2025 乐筑天下

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