BDYCAD 发表于 2006-6-14 11:01:00

ARX初学请教如何设置osmode变量

我写的
static void Baotest1test(void)
{
// Add your code for command Baotest1.test here
struct resbuf cmd, os, os1 , os2;
ads_real radius , dist;
ads_point pt1 , pt2 , pt3 ;
//acedGetVar("osmode", & os);
cmd.restype = RTREAL;
cmd.resval.rreal = 0;
os.restype = RTREAL;
os.resval.rreal = 0;
acedSetVar("cmdecho", &cmd);//(SETVAR "CMDECHO" 0)
//acadErrorStatusTEXT;
acedGetVar("osmode", &os1);
os.resval.rreal = os1.resval.rreal + 16384;
acedSetVar("osmode", &os);//(setvar "osmode" 0)
acedCommand(RTSTR , "undo" , RTSTR , "_group" , 0);//(vl-cmdf "_.undo" "_group")
acedGetPoint(NULL , "\nGet Center Point :" , pt1);
acedGetDist(NULL ,"\n请输入圆的半径啦靓仔:", &radius);
acedGetDist(NULL ,"\n请输入圆的的圆心距:", &dist);
acutPolar(pt1 , 0 , dist , pt2);
acutPolar(pt1 , 3.14159 , dist , pt3);
acedCommand(RTSTR , "circle" , RT3DPOINT , pt1 , RTREAL, radius , 0);
acedCommand(RTSTR , "circle" , RT3DPOINT , pt2 , RTREAL, radius , 0);
acedCommand(RTSTR , "circle" , RT3DPOINT , pt3 , RTREAL, radius , 0);
acedSetVar("osmode", &os1);
acedCommand(RTSTR , "undo" , RTSTR , "_end" , 0);
//acutPrintf(&os);
acutPrintf("\n可以画圆的ARX写成功了! 呵呵,加油!!!");
}
// ----- ads_setdefun001 symbol (do not rename)

BDYCAD 发表于 2006-6-14 11:06:00

大家好! 我是用LISP转到想用ARX的初级用户.
现在上面这个小小学习用的测试程序我在编写时为了保证可以成功运行, 要把捕捉OSMODE变量设为关, 在LISP的做法是把当前osmode变量加上16384就相当关了捕捉, 可是ARX的编写要转换好多 东东, 我在书本本上找不到, 又不好意思发问, 我闷找书找的一个月找不到(VC++ 基础不好的原因)
还望大家在百忙中指点指点这几句怎么写才对
acedGetVar("osmode", &os1);
os.resval.rreal = os1.resval.rreal + 16384;
acedSetVar("osmode", &os);//(setvar "osmode" 0)

谢谢!!!!!
                                                                              bdycad

wzz1968 发表于 2006-6-14 15:12:00

struct resbuf rb1,rb2;
ads_getvar("osmode",&rb1);
rb2.restype=RTSHORT;//设置系统变量数据类型
rb2.resval.rint=(short)16438;//系统变量的新值.
ads_setvar("osmode",&rb2); //设置新值.
二楼的程序行中缺少类型的设置.类型的设置也是错误的.
另外,用AUTOLISP转arx时,除数学运算、字符运算、文件操作、表处理外。其余函数基本是AUTOLISP函数加前缀ads_构成。
以aced前缀构成的arx库函数与其大部分是等价的。

这是修改系统变量的标准过程.

BDYCAD 发表于 2006-6-15 08:41:00

谢谢楼上朋友,我试一下, 可以了,真开心.呵呵!!

BDYCAD 发表于 2006-6-16 16:14:00

三楼朋友下午好!再请教一下
struct resbuf cmd, os, os1 , os2 ;
ads_getvar("osmode",&os1);
os2.restype=RTSHORT;//设置系统变量数据类型
os2.resval.rint= (short)16438;//系统变量的新值.
ads_setvar("osmode",&os2); //设置新值.
这样只把osmode变量设为 16438, 而我是想把osmode的变量设成 os1+os2的值, 不知怎么办?

easypower 发表于 2006-6-17 10:01:00

老朋友了,送你几个函数

/////////////////////////////////////////////////////////////////////////////
//////////////////////////// GLOBAL GETVAR FUNCTIONS ////////////////////////
/////////////////////////////////////////////////////////////////////////////

/****************************************************************************
**
**getSysVar (INT)
**
****jma
**
*************************************/
Acad::ErrorStatus
getSysVar(LPCTSTR varName, int& val)
{
    resbuf rb;
    if (acedGetVar(varName, &rb)== RTNORM) {
      ASSERT(rb.restype == RTSHORT);
      val = rb.resval.rint;
      return(Acad::eOk);
    }
    else
      return(Acad::eInvalidInput);
}
/****************************************************************************
**
**getSysVar (DOUBLE)
**
****jma
**
*************************************/
Acad::ErrorStatus
getSysVar(LPCTSTR varName, double& val)
{
    resbuf rb;
    if (acedGetVar(varName, &rb) == RTNORM) {
      ASSERT(rb.restype == RTREAL);
      val = rb.resval.rreal;
      return(Acad::eOk);
    }
    else
      return(Acad::eInvalidInput);
}
/****************************************************************************
**
**getSysVar (string)
**
****jma
**
*************************************/
Acad::ErrorStatus
getSysVar(LPCTSTR varName, CString& val)
{
    resbuf rb;
    if (acedGetVar(varName, &rb) == RTNORM) {
      ASSERT(rb.restype == RTSTR);
      val = rb.resval.rstring;
      free(rb.resval.rstring);
      return(Acad::eOk);
    }
    else
      return(Acad::eInvalidInput);
}
/****************************************************************************
**
**getSysVar (2D point)
**
****jma
**
*************************************/
Acad::ErrorStatus
getSysVar(LPCTSTR varName, AcGePoint2d& val)
{
    resbuf rb;
    if (acedGetVar(varName, &rb) == RTNORM) {
      ASSERT(rb.restype == RTPOINT);
      val.set(rb.resval.rpoint, rb.resval.rpoint);
      return(Acad::eOk);
    }
    else
      return(Acad::eInvalidInput);
}
/****************************************************************************
**
**getSysVar (3D point)
**
****jma
**
*************************************/
Acad::ErrorStatus
getSysVar(LPCTSTR varName, AcGePoint3d& val)
{
    resbuf rb;
    if (acedGetVar(varName, &rb) == RTNORM) {
      ASSERT(rb.restype == RT3DPOINT);
      val.set(rb.resval.rpoint, rb.resval.rpoint, rb.resval.rpoint);
      return(Acad::eOk);
    }
    else
      return(Acad::eInvalidInput);
}
/////////////////////////////////////////////////////////////////////////////
//////////////////////////// GLOBAL SETVAR FUNCTIONS ////////////////////////
/////////////////////////////////////////////////////////////////////////////
/****************************************************************************
**
**setSysVar(INT)
**
****jma
**
*************************************/
Acad::ErrorStatus
setSysVar(LPCTSTR varName, int val)
{
    ASSERT(varName != NULL);
    resbuf rb;
    rb.restype = RTSHORT;
    rb.resval.rint = val;
    return(SdSysVarStack::setVar(varName, &rb));
}
/****************************************************************************
**
**setSysVar (DOUBLE)
**
****jma
**
*************************************/
Acad::ErrorStatus
setSysVar(LPCTSTR varName, double val)
{
    ASSERT(varName != NULL);
    resbuf rb;
    rb.restype = RTREAL;
    rb.resval.rreal = val;
    return(SdSysVarStack::setVar(varName, &rb));
}
/****************************************************************************
**
**setSysVar (STRING)
**
****jma
**
*************************************/
Acad::ErrorStatus
setSysVar(LPCTSTR varName, const char* val)
{
    ASSERT(varName != NULL);
    resbuf rb;
    rb.restype = RTSTR;
    rb.resval.rstring = const_cast(val);
    return(SdSysVarStack::setVar(varName, &rb));
}
/****************************************************************************
**
**setSysVar (3D POINT)
**
****jma
**
*************************************/
Acad::ErrorStatus
setSysVar(LPCTSTR varName, const AcGePoint3d& val)
{
    ASSERT(varName != NULL);
    resbuf rb;
    rb.restype = RT3DPOINT;
    copyAdsPt(rb.resval.rpoint, asDblArray(val));
    return(SdSysVarStack::setVar(varName, &rb));
}
/****************************************************************************
**
**setSysVar (2D POINT)
**
****jma
**
*************************************/
Acad::ErrorStatus
setSysVar(LPCTSTR varName, const AcGePoint2d& val)
{
    ASSERT(varName != NULL);
    resbuf rb;
    rb.restype = RTPOINT;
    copyAdsPt(rb.resval.rpoint, asDblArray(val));
    return(SdSysVarStack::setVar(varName, &rb));
}

easypower 发表于 2006-6-17 10:02:00

使用示例
setSysVar("LIMCHECK", 1);
setSysVar("LIMMAX", AcGePoint2d(WorkLength,0));
setSysVar("LIMMIN", AcGePoint2d(0,0 - WorkWidth));
setSysVar("ISAVEBAK", 0);

easypower 发表于 2006-6-17 10:03:00

具体要设置全局变量,请查阅《AutoCAD2000ARX开发技术.pdf》书的附录,有很详细的说明

wzz1968 发表于 2006-6-19 08:25:00

回答5楼:
" 这样只把osmode变量设为 16438, 而我是想把osmode的变量设成 os1+os2的值, 不知怎么办?"
struct resbuf 0s1,0s2;
ads_getvar("osmode",&os1);
os2.restype=RTSHORT;
os2.resval.rint=(short)(os1.resval.rint | 14638);
ads_setvar("osmode",&os2);
上行用位操作而不用加操作的原因是加法操作可能引起进位,影响下位的设置.


lionguns 发表于 2016-1-8 10:59:00

看看
页: [1]
查看完整版本: ARX初学请教如何设置osmode变量