作业帮 > 体裁作文 > 教育资讯

acedcommand

来源:学生作业帮助网 编辑:作业帮 时间:2024/09/23 21:29:03 体裁作文
acedcommand体裁作文

篇一:ObjectARX给CAD发送命令的几种方法

在ARX的帮助里有最常见的两个方法:

int acedCommand(int

acedcommand

rtype, ... unnamed);

int acedCmd(const struct resbuf * rbp);

这两个函数处理命令的方式差不多,只不过一个通过链表来描述整个命令,一个通过不定参数来描述。

1. acedCommand()[ads_command()]

acedCommand()函数的参数是成对处理的。每对参数中的第一个表示参数的类型,第二个表示其实际的数据。参数表中的最后一个必须是单个参数,其值为0或RTNONE。每个表示参数类型的参数值必须为在adscodes.h文件中定义的结果类型码中的一个(例如RTPOINT)。比如:acedCommand(RTSTR, "ZOOM", RTSTR, "W", RT3DPOINT, p11, RT3DPOINT, p21 ,0);这个命令执行后会根据p11和p21点所确定的窗口范围缩放。注意p11和p21是ads_point类型。

2. acedCmd()[ads_cmd()]

注意此函数有一个resbuf指针类型的参数。该 resbuf 指针从何而来?它来自acutBuildList()函数。该函数的优点就是可以动态修改命令内容,不像acedCommand那样命令是写死的,但是缺点就是执行效率比acedCommand要差一些,同样,对于上面那个功能,我们可以如下调用:

struct resbuf *cmdlist;

cmdlist = acutBuildList(RTSTR, "ZOOM", RTSTR, "W", RT3DPOINT,

p11, RT3DPOINT, p21 ,0);

if (cmdlist == NULL) {

acdbFail("Couldn't create list\n");

return BAD;

}

acedCmd(cmdlist);

acutRelRb(cmdlist);

执行效果是一样的。

其实还有其它方式来执行AutoCAD命令,下面介绍另外一种方法:

3 // 发送命令给AutoCAD

void YgxAcadUtil::SendCommandToCAD(CString cmd)

{

cmd.Format("%s", cmd);

COPYDATASTRUCT cmdMsg;

cmdMsg.dwData = (DWORD)1;

cmdMsg.cbData = (DWORD)_tcslen(cmd) + 1;

cmdMsg.lpData = cmd.GetBuffer(cmd.GetLength()+1) ;

SendMessage(adsw_acadMainWnd(),WM_COPYDATA,

(WPARAM)adsw_acadMainWnd(), (LPARAM)&cmdMsg);

}

这是我写的一个函数,通过给AutoCAD发送消息,来执行一些命令。cmd这个字符串包含的内容和acedCommand中的内容差不多,比如像发送一个redraw命令,可以这样调用:

SendCommandToCAD(_T("redraw "));

注意后面要带一空格。

zoom e命令可以这样:

SendCommandToCAD(_T("zoom e "));在zoom后面要有空格,e 后面也要有空格。

这里还介绍一种发送命令的方法:

4 acedPostCommand,由于这个函数Autodesk没有公布,在使用之前,我们需要先申明一下:

extern Adesk::Boolean acedPostCommand(const char* );

然后,我们发送Cancel命令为例:

acedPostCommand("CANCELCMD");

5 ads_queueexpr( _T("(command\"_POINT\" \"1,1,0\")") );该函数CAD未公开,使用时提前声明下就可以了。可以参考帮助文件中:Tips and Techniques 。

6 acDocManager->sendStringToExecute(curDoc(), _T("_POINT 2,2,0 "));该函数在Arx帮助中有详细说明。

{

COPYDATASTRUCT cmdMsg;

cmdMsg.dwData = (DWORD)1;

cmdMsg.cbData = (DWORD)(_tcslen(cmd) + 1) * sizeof(ACHAR); cmdMsg.lpData = cmd;

SendMessage(adsw_acadMainWnd(),WM_COPYDATA,NULL, (LPARAM)&cmdMsg);

}

8

?Com 方法

void SendCommandTest(void)

{

IAcadApplicationPtr pApp = acedGetIDispatch(TRUE); IAcadDocumentPtr pDoc;

pApp->get_ActiveDocument(&pDoc);

pDoc->SendCommand( _T("_POINT 4,4,0 ") ); }

? ? ? ? ? ads_queueexpr() AcApDocManager::sendStringToExecute() ::SendMessage() IAcadDocument::SendCommand() acedCommand()

篇二:net调用cad内置命令及通过句柄取得图元

net调用cad内置命令及通过句柄取得图元

/*师兄 QQ 361865648 2008/11/1 最近在超级群里有人问及"如何通过hand得到对象",今天再一次有人提出这个问题, 下边我提供了一种很好的解决办法供参考,当然可能有其它的方法,但是我习惯用p/invoke来 解决一些C++很容易就做到的事*/ 如果觉得好,请 顶 一下,不要让有价值的东西流失 // (C) Copyright 2002-2005 by Autodesk, Inc. // // Permission to use, copy, modify, and distribute this software in // object code form for any purpose and without fee is hereby granted, // provided that the above copyright notice appears in all copies and // that both that copyright notice and the limited warranty and // restricted rights notice below appear in all supporting // documentation. // // AUTODESK PROVIDES THIS PROGRAM "AS IS" AND WITH ALL FAULTS. // AUTODESK SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTY OF // MERCHANTABILITY OR FITNESS FOR A PARTICULAR USE. AUTODESK, INC. // DOES NOT WARRANT THAT THE OPERATION OF THE PROGRAM WILL BE // UNINTERRUPTED OR ERROR FREE. // // Use, duplication, or disclosure by the U.S. Government is subject to // restrictions set forth in FAR 52.227-19 (Commercial Computer // Software - Restricted Rights) and DFAR 252.227-7013(c)(1)(ii) // (Rights in Technical Data and Computer Software), as applicable. //

using System ;

using System.Text;

using System.Collections;

using System.Runtime.InteropServices;

using Autodesk.AutoCAD.Runtime ;

using Autodesk.AutoCAD.DatabaseServices;

using Autodesk.AutoCAD.Windows;

using Autodesk.AutoCAD.EditorInput;

using aced=Autodesk.AutoCAD.EditorInput;

using Autodesk.AutoCAD.ApplicationServices;

[assembly: CommandClass(typeof(ClassLibrary.Class))]

namespace ClassLibrary

{ /// /// Summary description for Class. ///

public class Class

{

enum ads:int

{

RTNORM=5100,

RTNONE=5000,

RTREAL=5001,

RTPOINT=5002,

RTSHORT=5003,

RTANG=5004,

RTSTR= 5005,

RTENAME=5006,

RTPICKS=5007,

RTORINT= 5008,

RT3DPOINT= 5009,

RTLONG = 5010,

RTVOID = 5014,

RTLB = 5016,

RTLE = 5017,

RTDOTE = 5018,

RTNIL = 5019,

RTDXF0 = 5020,

RTT = 5021,

RTRESBUF = 5023,

RTMODELESS= 5027 ,

RTERROR = -5001,

RTCAN = -5002,

RTREJ = -5003,

RTFAIL = -5004,

RTKWORD =-5005,

RTINPUTTRUNCATED =-5008

}

public static Editor ed;

public static Database db;

public Class()

{ // // TODO: Add constructor logic here //

}

[DllImport("acad.exe",EntryPoint ="acedCmd")]

private static extern int acedCmd(IntPtr buf);

[DllImport("acad.exe",EntryPoint ="acedCommand")]

private static extern int acedCommand(ResultBuffer regs);

[DllImport("acdb16.dll", CharSet = CharSet.Ansi)]

private static extern int acdbHandEnt(String handle,long[] ent);

/*师兄 QQ 361865648 2008/11/1 最近在超级群里有人问及"如何通过hand得到对象",今天再一次有人提出这个问题, 下边我提供了一种很好的解决办法供参考,当然可能有其它的方法,但是我习惯用p/invoke来 解决一些C++很容易就做到的事*/

[CommandMethod("Cmd1")]// 定义命令名

static public void test() // This method can have any name

{

// Put your command code here //构建链表

TypedValue[] vals={

new TypedValue((int)ads.RTSTR,"zoom"),

new TypedValue((int)ads.RTSTR,"All"),

new TypedValue((int)ads.RTSTR,"")

};

ResultBuffer bf=new ResultBuffer(vals);

TypedValue vl=new TypedValue((int)ads.RTNONE,0);

int rc=acedCmd(bf.UnmanagedObject);//调用

if(rc!=(int)ads.RTNORM) return;//调用成功?

ed=Application.DocumentManager.MdiActiveDocument.Editor;

db=ed.Document.Database;

aced.PromptEntityResult rs=ed.GetEntity("\n选择对象: ");

if (rs.Status!=PromptStatus.OK) return;//选择了有效对象?

long[] ename=new long[]{0,0};//图元名在C#为long数组

String hand=System.Convert.ToString(rs.ObjectId.Handle.Value,16);//转成16位整数 ed.WriteMessage("\n图元句柄:"+hand);//在命令行显示句柄

rc=acdbHandEnt(hand,ename);//取得图元名即C#中的

if(rc!=(int)ads.RTNORM) return;//调用成功?

ObjectId id=new ObjectId((int)ename[0]);//转换

Transaction tr = db.TransactionManager.StartTransaction();

using (tr) { Entity ent = (Entity)tr.GetObject(id, OpenMode.ForRead);

ed.WriteMessage("\n图元类型: "+ent.GetRXClass().DxfName.ToString()); }

tr.Dispose();

return;

}

}

}

[ 本帖最后由 caiqs 于 2008-11-5 07:52 AM 编辑 ]

篇三:arx函数

ads_agetenv ads_alert ads_angle ads_angtof ads_angtos ads_arxload ads_arxloaded ads_arxunload ads_asetcfg ads_asetenv ads_buildlist ads_cmd ads_command ads_cvunit ads_defun ads_dictadd ads_dictnext ads_dictremove ads_dictrename ads_dictsearch ads_distance ads_distof ads_draggen

acedGetEnv acedAlert acutAngle acdbAngToF acdbAngToS acedArxLoad acedArxLoaded acedArxUnload acedSetCfg acedSetEnv acutBuildList acedCmd acedCommand acutCvUnit acedDefun acdbDictAdd acdbDictNext acdbDictRemove acdbDictRename acdbDictSearch acutDistance acdbDisToF acedDragGen

显示一个对话框,对话框中有用户指定的信息求出直线与当前X轴的夹角

将一个显示为角度值的字符串转化为实数(浮把角度值转换为字符串

将ARX应用程序装载入CAD中,供使用

以链表的方式返回当前装入的ARX应用程序将一个ARX应用程序从CAD从卸载出去

创建结果缓冲区链表

借助一个结果缓冲区链表来执行CAD命令(有执行CAD命令(有使用条件) 在各种单位制内进行转换 定义一个外部函数

向指定字典中添加一个非图形对象

使程序指针指向字典中的下一个实体,并返回从指定字典中移走一个实体 重命名一个字典条目

对一个给定实体条目,寻找一个字典 求出两点之间的距离

将一个显示为实数的字符串转化为实数(浮点提示用户动态拖动一个选择集

ads_entget ads_entgetx ads_entlast ads_entmake ads_entmakex ads_entmod ads_entnext ads_entsel ads_entupd ads_fail ads_findfile ads_fnsplit ads_getangle ads_getappname ads_getargs ads_getcfg ads_getcname ads_getcorner

acdbEntGet acdbEntGetX acdbEntLast acdbEntMake acdbEntMakeX acdbEntMod acdbEntNext acedEntSel acdbEntUpd acdbFail acedFindFile acedFNSplit acedGetAngle acedGetAppName acedGetArgs acedGetCfg acedGetCName acedGetCorner

获得一个实体的定义数据

获得实体数据,包括应用程序注册的扩展数据查找图形中最后一个实体

形成一个新的实体,并把这个实体的定义数据

同acedEntMake()一样,但返回新的实体名称修改一个实体的定义数据 查找图形中的下一个实体

提示用户以指定一点的方式来选择一个实体更新实体的屏幕显示

简单的打印错误信息并把控制权返回给调用寻找一个指定的文件

提示用户输入一个角度,要考虑ANGBASE系统获得当前ARX应用程序的文件名称 获得在调用外部函数时的命令行参数

获取一个命令的本地名或与语言无关的名称提示用户输入一个矩形的顶点

ads_getenv ads_getfiled ads_getfuncode ads_getinput ads_getint ads_getkword ads_getorient ads_getpoint ads_getreal ads_getstring ads_getstringb ads_getsym ads_getvar ads_graphscr ads_grdraw ads_grread ads_grtext ads_grvecs ads_handent ads_help ads_initget ads_inters ads_invoke

acedGetEnv acedGetFileD acedGetFunCode acedGetInput acedGetInt acedGetKword acedGetOrient acedGetPoint acedGetReal acedGetString acedGetStringB acedGetSym acedGetVar acedGraphScr acedGrDraw acedGrRead acedGrText acedGrVecs acdbHandEnt acedHelp acedInitGet acdbInters acedInvoke

用标准的CAD对话框提示用户输入要查找的获得外部函数的码值

提取传送给用户输入函数acedGetXxx()的关提示用户输入一个整数 提示用户输入一个关键字

类似于acedGetAngle(),但零度方向总是向提示用户输入一个点 提示用户输入一个浮点数 提示用户输入一个字符串

获取一个LISP符号的值(有使用条件) 获取一个系统变量的当前值 显示当前图形屏幕 在当前端口画一矢量 读取输入设备,追踪鼠标

在屏幕的菜单区"模式区或状态区显示文本 在当前图形屏幕上画多个矢量 通过实体的句柄查找实体 调用帮助功能

次定用户响应下一次调用输入函数acedGet求出两直线的交点

在ARX应用程序中调用外部函数

ads_isalpha ads_iscntrl ads_isdigit ads_isgraph ads_islower ads_isprint ads_ispunct ads_isspace ads_isupper ads_isxdigit ads_menucmd ads_name_clear ads_name_equal ads_name_nil ads_name_set ads_namedobjdict ads_nentsel

acutIsAlpha acutIsCntrl acutIsDigit acutIsGraph acutIsLower acutIsPrint acutIsPunct acutIsSpace acutIsUpper acutIsXDigit acedMenuCmd acdbNameClear acdbNameEqual acdbNameNil acdbNameSet acdbNamedObjDict acedNEntSel

验证是否是字母 验证是否是一个控制字符 验证是否是数字 验证是否是一个图形字符 验证是否是小写字母 验证是否是一个可打印字符 验证是否是一个标点符号 验证是否是一个空白字符 验证是否是大字字母 验证是否是一个十六进制数字 显示并激活菜单

可将ads_name型的数据赋值为空 可比较两个ads_name型的数据是否相同 可以检测这个实体名或选择集名为空 可以复制一个实体名或选择集名 返回图形字典的实体名

类似acedNEntSelp(),但使用4*3(而非4*4

篇四:objectarx开发笔记2

刷新显示屏幕问题 ........................................................................................................................... 2

自定义实体时添加variable时相关问题 ........................................................................................ 2

用acdbOpenAcDbEntity打开实体后一定要关闭 ......................................................................... 2

WCS到UCS的坐标转换 ............................................................................................................... 2

选择过程中判断用户右键操作 ....................................................................................................... 2

如何实现自定义实体Undo? ......................................................................................................... 3

关于动态拖动的讨论 ....................................................................................................................... 3

刷新显示屏幕问题

有时在程序中修改了实体,比如删除了实体,但在屏幕上没有及时地刷新,这时执行屏幕选取实体函数acedSSGet(),

仍然能够选中原来的实体,明明它们已经删除了,这时怎么办呢,考虑用acedCommand(RTSTR, "REGEN", RTNONE);

虽然也可以,但它会重新生成整个图形数据库,如果数据量很大,那么重生成的速度会很慢, 这样就不可能在程序的一段循环语句中修改每一个实体后都对数据库重生成,那程序运行的时间大部分都花在刷新数据库上了,

显然这不合理.

解决方法:

// 刷新显示屏幕

actrTransactionManager->flushGraphics();

acedUpdateDisplay();

自定义实体时添加variable时相关问题

问:用ObjectARX2007的Add Member Variable Wizard时出现页面错误怎么办? 答:用vs2005自身的class view中的add variable就可以了。

用acdbOpenAcDbEntity打开实体后一定要关闭

用acdbOpenAcDbEntity打开实体,不管是只读还是编辑方式,操作后都要关闭实体,否则再次打开时只能以只读方式打开。

WCS到UCS的坐标转换

mbp为当前坐标(ads_point mbp),可以以?a href="http://www.zw2.cn/zhuanti/guanyuluzuowen/" target="_blank" class="keylink">路椒ㄗ晃獁cs坐标。 struct resbuf wcs, ucs; wcs.restype = RTSHORT; wcs.resval.rint = 0; ucs.restype = RTSHORT; ucs.resval.rint = 1; acedTrans(mbp,&ucs,&wcs,0,mbp);

选择过程中判断用户右键操作

观察Acad2002的命令:mledit,这个命令运行后,用户需要选择操作对象,可是这个命令的选择功能有点特殊: 可以判断用户点了右键(等同直接按回车),,如果点了右键(或按回车),程序会退出.

现在有个程序,也要选择一个对象,并且也想实现用户按回车(点击右键)后直接退出,我用的是acedEntSel函数,可是这些函数(包含acedNEntSelP..等.)都只能返回RENORM(正确选中),RTEROR(没有选中),用户按回车(点击右键)也是返回RTERROR请教下这里有没有解决的办法.

int rc=acedEntSel("\nChoose a entity:",ent,pt);

switch(rc)

{

case RTCAN:

acutPrintf("\nUser canceled.");

break;

case RTERROR:

acutPrintf("\nNothing selected.");

break;

}

如何实现自定义实体Undo?

undo和redo实际上是调用了自定义实体的dwgInFields和dwgOutFields,你必须重载这个函数。而且当你调用修改这个实体属性的函数时,要先调用assertWriteEnabled。

关于动态拖动的讨论

acedgetpoint()针对直线

acedGrRead()针对矩形

如果想实现复杂的拖动变换用AcEdJig类或用AcedDragen函数

我开发一个ARX程序,需动态反馈,需要知道当前光标位置。用acedGrRead时,不能实现OSnap。用acedGetPoint可获得最点及实现OSnap,但不能动态反馈。

使用acedGetPoint函数,同时创建另一线程使用acedGrRead实现动态反馈,确总是AutoCAD崩溃(使用::GetMouseCursor()及鼠标勾子也同样)。

望哪位高手能解我所惑

不知道下面代码对你有没有帮助!!!!

////////////////////////////////////////////////////////////

//动态移动选择集

////////////////////////////////////////////////////////////

//跟踪矩阵(无限制)

int trancematrix(ads_point usrpt,ads_matrix matrix)

{

int i,j;

for(i=0;i<=3;i++) for(j=0;j<=3;j++) matrix[i][j]=0,0;

for(i=0;i<=3;i++) matrix[i][i]=1.0;

matrix[0][T]=usrpt[X];

matrix[1][T]=usrpt[Y];

matrix[2][T]=usrpt[Z];

return RTNORM;

}

//函数名:acdbDragSset

//功能:动态移动一个选择集

//选择集:ssetname

//移动参照点:referpoint

Acad::ErrorStatus acdbDragSset(

ads_name ssetname,

AcGePoint3d referpoint

)

{

ads_point rtpnt;

int status;

status=acedDragGen(ssetname,

"\\n请选择一个插入点:",

0,

trancematrix,

rtpnt);

if(status!=RTNORM){

return Acad::eNotImplementedYet;

}

else{

AcGePoint3d newposition;

newposition.set(rtpnt[X],rtpnt[Y],rtpnt[Z]);

return acdbMoveSset(ssetname,referpoint,newposition);

}

}

请参考acedDragGen()函数定义

CAD里面用Arx实现拖动的效果:继承AcEdJig类,ARX samples下polysamp中有相关的例子

篇五:arx 常用函数功能表

1

2

3

4

因为新手有很多函数的功能不清楚,函数也记不清,本文档是为了一时的方便,为新手文档! 摘录于某些电子书了,是为了打印方便,查看方便!! 希望对你们有点用途!!觉得有点用的,就顶一下!

由于收集不全,有些函数我也不知其功能,英语又烂,没法了,也希望大家再往上面添加一些什么有用东西再共享出来!!

5

体裁作文