明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3641|回复: 9

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

  [复制链接]
发表于 2006-6-14 11:01 | 显示全部楼层 |阅读模式

我写的

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)

 楼主| 发表于 2006-6-14 11:06 | 显示全部楼层

大家好! 我是用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

发表于 2006-6-14 15:12 | 显示全部楼层

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库函数与其大部分是等价的。

 

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

 

 楼主| 发表于 2006-6-15 08:41 | 显示全部楼层
谢谢楼上朋友,我试一下, 可以了,真开心.  呵呵!!
 楼主| 发表于 2006-6-16 16:14 | 显示全部楼层

三楼朋友下午好!  再请教一下

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的值, 不知怎么办?

发表于 2006-6-17 10:01 | 显示全部楼层

老朋友了,送你几个函数


/////////////////////////////////////////////////////////////////////////////
//////////////////////////// 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[X], rb.resval.rpoint[Y]);
        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[X], rb.resval.rpoint[Y], rb.resval.rpoint[Z]);
        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<char*>(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));
}

发表于 2006-6-17 10:02 | 显示全部楼层

使用示例

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

发表于 2006-6-17 10:03 | 显示全部楼层
具体要设置全局变量,请查阅《AutoCAD2000ARX开发技术.pdf》书的附录,有很详细的说明
发表于 2006-6-19 08:25 | 显示全部楼层

回答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);

上行用位操作而不用加操作的原因是加法操作可能引起进位,影响下位的设置.

 

 

发表于 2016-1-8 10:59 | 显示全部楼层
看看
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-3-28 23:01 , Processed in 0.253680 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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