明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 4523|回复: 10

如何实现正正中绘制柱的功能:非模式窗口中,即时中断当前命令

[复制链接]
发表于 2009-9-9 23:55:00 | 显示全部楼层 |阅读模式

如何实现正正中绘制柱的功能:非模式窗口中,即时中断当前命令

想做一个天正画柱子的对话框在线更改参数的功能,但前一个命令(如画圆,或ThisDrawing.Utility.GetPoint(, "Enter a point: ")
等),并如何取消这个命令

 

发表于 2009-9-11 23:02:00 | 显示全部楼层

1,显示非模式对话框,这个张帆的教程有写

2,绘制部分,关键在于坐标的传递,图形的实现不难

 楼主| 发表于 2009-9-15 00:10:00 | 显示全部楼层
在使用GETXXX系列函数时,需要先中断原有命令,不然会变成嵌套了,这次命令完成后,还会执行上一个命令。
发表于 2009-9-15 01:28:00 | 显示全部楼层
这个有难度么?
  1. //Sol1
  2. retcode = getXXX;
  3. while( RTNORM == retcode )
  4. {
  5. //codes
  6. retcode = GetXXX
  7. }
复制代码
  1. //sol2
  2. while( RTNORM == getXXX )
  3. { //Add your codes
  4. }
复制代码
至于如何显示对话框,你根据你的需要,响应对话框的消息。
对于简单的模式对话框,使用宏beginEditorCommand()来暂时隐藏当前对话框,cancleEditorCommand()或completeEditorCommand()来显示当前对话框。
 楼主| 发表于 2009-9-17 21:20:00 | 显示全部楼层
还是没有解决,本想做一个和天正的这个功能类似的参数设置界面,在不关闭界面的情况下即时绘图,即时切换GET*系列的
发表于 2009-9-17 21:36:00 | 显示全部楼层

楼主绕来绕去,还不是说要做个非模态的对话框?mfc教程有这方面的例子!

 楼主| 发表于 2009-9-17 22:45:00 | 显示全部楼层

主要是与CAD交互

在晓东找了个帖子:

1. 如果在非模式对话框中放一个按扭,点按扭时执行: acedSSGet(...) 函数, 当我按下按扭后,不选择对象(但此时acedSSGet 函数已执行).由于是非模式对话框,我还可以继续点按扭,当点的次数很多时,系统就出错了

我想在第二次点按扭时,如果前一个按扭没有完成任务(这可以判断出来),就终止前一个任务,执行这个新的任务,就像发送一个ESC消息一样,怎么办

2. 在非模式对话框中放一个按扭,按扭执行: acedPrompt("....") ,当提示完成后,我想让命令行回到原始状态,即"命令: " , 如果就简单在acedPrompt("\n.....\n",好象不行,请指教

如何在MFC“非模式”对话框使用acedGetXXX函数和ACAD交互
How can I use ads_getxxx() functions from a MFC modeless dialog box ?
ID 2125
Applies to: AutoCAD

Date 6/19/2000

This document is part of MFC


Question
How can I use ads_getXXX() functions from an MFC modeless dialog box?
Answer
Your code will work properly if you call ads_getXXX() functions directly from an
MFC modeless dialog box handler function because AutoCAD sends the
WM_ACADKEEPFOCUS message to your dialog at the same time you are in the handler
function where you want to make an ads_getpoint(). Then when you pick a point,
you send a WM_LBUTTONDOWN message which goes in the window message queue as
well. But this message does not proceed until you came back to AutoCAD. After
you have come back, the message proceeds. Then you need to give two points where
onlyy one error occurs. This is why AutoCAD asks for the other corner.

Another problem is that modeless windows may try to execute code at the same
time an AutoCAD command is running. This will produce some errors and may cause
AutoCAD to terminate unexpectedly. The reason is that modeless windows have
their own message loop, and while AutoCAD is busy, you must not call any AutoCAD
function. AutoCAD is not design to run in that context.

To solve these problems, move the code contained into this handler function into
a standalone ARX command / function. Then from the button handler function, you
can send a WM_COPYDATA message to AutoCAD to invoke this command which will do
the job.

1. When the button is pressed, the button handler function code is executed. You
need to do the following:
-- hide the dialog
-- change my WM_ACAD_KEEPFOCUS handler function to return FALSE
-- give the focus to the AutoCAD main frame window
-- use the acedGetAcadFrame ()->ostMessage(WM_SETFOCUS, 0L, 0L) method
-- send the WM_COPYDATA message to the main AutoCAD frame window with the
command name (myfunc, for example)

2. In the myfunc function (defined as an ARX command), then perform these steps:
-- put all the code you need to acquire a point
-- post a custom user message (WM_USER+1, for example) to your dialog with the
point in the LPARAM as parameter

3. In the handler of the WM_USER+1 message, perform these steps:
-- change my WM_ACAD_KEEPFOCUS handler function to return TRUE again
-- show the dialog, and give the focus to it
     

慢慢看中ing.....

发表于 2009-9-20 00:58:00 | 显示全部楼层

1. 如果在非模式对话框中放一个按扭,点按扭时执行: acedSSGet(...) 函数, 当我按下按扭后,不选择对象(但此时acedSSGet 函数已执行).由于是非模式对话框,我还可以继续点按扭,当点的次数很多时,系统就出错了

我想在第二次点按扭时,如果前一个按扭没有完成任务(这可以判断出来),就终止前一个任务,执行这个新的任务,就像发送一个ESC消息一样,怎么办

刚才试验了一下,没难度,只要在这个对话框加个成员变量,假定为bool型,初始化为true,只要这个对话框还在,这个变量就存在,在按钮执行命令一开始,就检测这个变量的值,只要是false,就rerurn,如果为true,就马上让他为false,然后调用getXXX,代码最后将这个变量设为true,这样就可以避免啦,

[CODE]void ModelessDLG::OnBnClickedButton1()
{
 // 参考代码 if ( m_cmdStatus == false ) 
if ( m_cmdStatus == false )
 {
  AfxMessageBox(L"command in progress! ");
  return;
 }
 m_cmdStatus=false;
 ads_point pt;
 ads_name name;
 acedEntSel(L"pick an entity:\n", name, pt );
 m_cmdStatus = true;
}[/CODE

针对多个命令,或者是不同对话框的命令,可以设置全局变量来考虑,但是,【取消上一个命令,我还不了解机里】

 楼主| 发表于 2009-9-21 00:13:00 | 显示全部楼层

这只是判断当前是否在命令状态下,在的话则返回,

需要的是判断在的话,则中断当前GETXX,重新开始新的GETXX

发表于 2010-10-18 17:34:00 | 显示全部楼层
我遇到了和你一样的问题
命令嵌套超过四层就会出错,就算不出错,一层层往外跳也不好
请问楼主这个问题解决了没有?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 13:00 , Processed in 0.176118 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表