明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: BDYCAD

学习ARX,编个初组的命令,呵呵

  [复制链接]
 楼主| 发表于 2007-7-18 11:33 | 显示全部楼层
本帖最后由 作者 于 2007-7-18 11:46:14 编辑

struct resbuf 结构就象LISP里面的表((LISP a b)(LISP a b)(LISP a b)(LISP a b).....) 之类的东东,主要是用来做一个对象的DXF组码链表,然后用来给别的涵数生成对象之类的处理,如果是生成对象的话我们可以不用struct resbuf结构来做,直用用对象类来生成啊.例如:

LISP用DXF组码生成一个圆的代码:
(setq Cirlist '((0 . "CIRCLE")(100 . "AcDbEntity")(100 . "AcDbCircle")(8 . "0")(40 . 0.8) (10 0 0 0)))
(entmake Cirlist)

ARX用struct resbuf 生成一个圆的代码:
  struct resbuf *Cirlist;
  ads_point PT1={0,0,0};
  Cirlist=acutBuildList(RTDXF0,"CIRCLE",100,"AcDbEntity",100,"AcDbCircle",8,"0",40,0.8,10,PT1,0);
  acdbEntMake(Cirlist);

用ARX的类生成一个圆的代码:
ads_real rad=3.0;
  AcGePoint3d Cpt(0,0,0);
  AcGeVector3d Vec(0,0,1);
  AcDbCircle *nc=new AcDbCircle();
  nc->setCenter(Cpt);
  nc->setRadius(rad);
  AcDbBlockTable *btable;
  acdbHostApplicationServices()->workingDatabase()->getSymbolTable(btable,AcDb::kForRead);
  AcDbBlockTableRecord *brecord;
  btable->getAt(ACDB_MODEL_SPACE,brecord,AcDb::kForWrite);
  brecord->appendAcDbEntity(nc);
  nc->close();
  btable->close();
  brecord->close();

 楼主| 发表于 2007-7-20 09:21 | 显示全部楼层
本帖最后由 作者 于 2007-7-20 9:41:42 编辑
  1. //功能:制作图块
  2. //编程:BDYCAD
  3. //时间:2007-07-20早
  4. static void BDYCAD_TEST(void)
  5. {
  6.   ads_name name,ss;
  7.   ads_point pt1,pt2;
  8.   char BlockName[123];
  9.   AcGePoint3d Cpt;
  10.   int sel;long len;
  11.   AcDbObjectId BID;
  12.   if (acedSSGet(NULL,NULL,NULL,NULL,ss)!=RTNORM)return;
  13.   if (acedGetPoint(NULL,"\n输入基准点:",pt1)!=RTNORM)return;
  14.   if (acedGetString(FALSE,"\n请输入块名:",BlockName)!=RTNORM)return;
  15.   Cpt.x=pt1[X];Cpt.y=pt1[Y];Cpt.z=pt1[Z];
  16.   AcDbBlockTable *pBlockTable;
  17.   acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBlockTable,AcDb::kForWrite);
  18.   if (pBlockTable->has(BlockName)==Adesk::kTrue) {
  19.    acutPrintf("\n这个块已经建立了!");
  20.    pBlockTable->close();
  21.    return;
  22.   }
  23.   AcDbBlockTableRecord *pBlockTableRec= new AcDbBlockTableRecord();
  24.   pBlockTableRec->setName(BlockName);
  25.   pBlockTable->add(pBlockTableRec);
  26.   pBlockTableRec->setOrigin(Cpt);
  27.   pBlockTable->upgradeOpen();
  28.   AcDbEntity *pEnt,*pEnt0;
  29.   acedSSLength(ss,&len);
  30.   for (int i=0;i<len;i++) {
  31.    AcDbObjectId ObjID;
  32.    acedSSName(ss,i,name);
  33.    acdbGetObjectId(ObjID,name);
  34.    acdbOpenAcDbEntity(pEnt,ObjID,AcDb::kForWrite);
  35.    pEnt0=(AcDbEntity*)pEnt->clone();
  36.    pBlockTableRec->appendAcDbEntity(pEnt0);
  37.    pEnt->close();
  38.    pEnt0->close();
  39.   }
  40.   pBlockTable->close();
  41.   pBlockTableRec->close();
  42.   return;
  43. }
复制代码
发表于 2007-7-20 14:57 | 显示全部楼层
楼上的仁兄:谁有.net 2002下的mfc70相关的几个lib文件,小弟也急需一份,麻烦给小弟传一份!!!谢谢了!
邮箱:terry_5257@163.com

谢谢!!!!
 楼主| 发表于 2007-7-20 15:39 | 显示全部楼层

看来好多朋友都在找这些文件,现在上传上来给大家:) 希望可以帮的到大家:)

发表于 2007-7-23 10:15 | 显示全部楼层

谢谢~~~~~

太感谢了1~~哈哈。。。。。。。。。

找了好几天了,谢谢大哥!!!

发表于 2007-7-26 09:22 | 显示全部楼层
谢谢这位兄弟!找了几个月了
 楼主| 发表于 2007-8-2 16:09 | 显示全部楼层

用对象的ID可以判断一个对象是否给删除了,代码如下
1、
ads_name name;
  ads_point pt1;
  AcDbObjectId ObjID;
  if (acedEntSel("\n请选个对象:",name,pt1)!=RTNORM)return;
  acdbGetObjectId(ObjID,name);
  if (ObjID.isErased()==TRUE) {
   acutPrintf("\n对象给我们删除了\n");
  }else{
   acutPrintf("\n对象存在\n");
  }
当选到对象是命令行就会提示:
Command: test

请选个对象:
对象存在

2、
ads_name name;
  ads_point pt1;
  AcDbObjectId ObjID;
  if (acedEntSel("\n请选个对象:",name,pt1)!=RTNORM)return;
  acdbGetObjectId(ObjID,name);
  acdbEntDel(name);
  if (ObjID.isErased()==TRUE) {
   acutPrintf("\n对象给我们删除了\n");
  }else{
   acutPrintf("\n对象存在\n");
  }
当选到对象是命令行就会提示:
Command: test

请选个对象:
对象给我们删除了

 楼主| 发表于 2007-8-3 14:13 | 显示全部楼层
<br/>//学习AcDbObjectIdArray的代码<br/>  //编写:BDYCAD<br/>  //2007-08-02<br/>  int IDnumber;<br/>  long sslen;<br/>  ads_name name,SS;<br/>  ads_point p1;<br/>  AcDbEntity *pEnt;<br/>  AcDbObjectId ObjID,ObjID1;<br/>  AcDbObjectIdArray ALLID;<br/>  if (acedSSGet(NULL,NULL,NULL,NULL,SS)!=RTNORM)return;<br/>  if (acedEntSel("\n请选择一个对象:",name,p1)!=RTNORM)return;<br/>  acdbGetObjectId(ObjID1,name);<br/>  acedSSLength(SS,&amp;sslen);<br/>  for (int i=0;sslen&gt;i;i++) {<br/>   acedSSName(SS,i,name);<br/>   acdbGetObjectId(ObjID,name);<br/>   ALLID.append(ObjID);<br/>  }<br/>  if (ALLID.find(ObjID1,IDnumber)==TRUE) {<br/>   //acutPrintf("\n我们在ID集中找到了这个ID,是第%d 个ID\n",IDnumber);<br/>   ALLID.remove(ObjID1);<br/>  }else{<br/>   acutPrintf("\n找不着\n");<br/>  }<br/>  for (int i=0;ALLID.length()&gt;i;i++) {<br/>   ObjID=ALLID.at(i);<br/>   acdbOpenObject(pEnt,ObjID,AcDb::kForWrite);<br/>   pEnt-&gt;setColorIndex(1);<br/>   pEnt-&gt;close();<br/>  }<br/>  acutPrintf("\n总共有 %d 个对象ID:\n",ALLID.length());
 楼主| 发表于 2007-8-3 17:08 | 显示全部楼层

取对象交点代码:
今天刚写的:)

//功能:取两个对象的真实相交点。
//编写:BDYCAD
//时间:2007-08-03
AcGePoint3dArray Get2ObjIDIntresPoints(AcDbObjectId ObjID1,AcDbObjectId ObjID2){
 AcDbEntity *pEnt1,*pEnt2;
 AcGePoint3dArray PTlist;
 acdbOpenObject(pEnt1,ObjID1,AcDb::kForRead);
 acdbOpenObject(pEnt2,ObjID2,AcDb::kForRead);
 pEnt1->intersectWith(pEnt2,AcDb::kExtendArg,PTlist);
 pEnt1->close();
 pEnt2->close();
 return PTlist;
}

发表于 2007-10-30 23:23 | 显示全部楼层
谢谢大哥,太谢谢了!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-25 20:06 , Processed in 0.499679 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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