乐筑天下

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

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

[复制链接]

63

主题

1203

帖子

10

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1455
发表于 2006-6-14 11:01:00 | 显示全部楼层 |阅读模式
我写的
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)
回复

使用道具 举报

63

主题

1203

帖子

10

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1455
发表于 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
回复

使用道具 举报

3

主题

102

帖子

5

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
114
发表于 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库函数与其大部分是等价的。

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

回复

使用道具 举报

63

主题

1203

帖子

10

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1455
发表于 2006-6-15 08:41:00 | 显示全部楼层
谢谢楼上朋友,我试一下, 可以了,真开心.  呵呵!!
回复

使用道具 举报

63

主题

1203

帖子

10

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1455
发表于 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的值, 不知怎么办?
回复

使用道具 举报

14

主题

202

帖子

4

银币

后起之秀

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

铜币
258
发表于 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[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(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));
}
回复

使用道具 举报

14

主题

202

帖子

4

银币

后起之秀

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

铜币
258
发表于 2006-6-17 10:02:00 | 显示全部楼层
使用示例
  setSysVar("LIMCHECK", 1);
  setSysVar("LIMMAX", AcGePoint2d(WorkLength,0));
  setSysVar("LIMMIN", AcGePoint2d(0,0 - WorkWidth));
  setSysVar("ISAVEBAK", 0);
回复

使用道具 举报

14

主题

202

帖子

4

银币

后起之秀

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

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

使用道具 举报

3

主题

102

帖子

5

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
114
发表于 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);
上行用位操作而不用加操作的原因是加法操作可能引起进位,影响下位的设置.


回复

使用道具 举报

9

主题

30

帖子

5

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
66
发表于 2016-1-8 10:59:00 | 显示全部楼层
看看
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-2-4 21:51 , Processed in 0.263590 second(s), 72 queries .

© 2020-2025 乐筑天下

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