📄 exam14.cpp
字号:
#include <adslib.h>
#include <rxdlinkr.h>
#include <aced.h>
#include <dbents.h>
#include <acedads.h>
#include <gelnsg3d.h>
#include <dbapserv.h>
#include <gearc3d.h>
#include "math.h"
#include "stdio.h"
int GetObjectType(ads_name &name);
void GetIntersectPoint();
void initApp();
void unloadApp();
extern "C"
AcRx::AppRetCode acrxEntryPoint(AcRx::AppMsgCode, void*);
//
int GetObjectType(ads_name &name)
{
int type=0;
AcDbEntity *ent;
AcDbObjectId entId;
acdbGetObjectId(entId,name);
acdbOpenObject(ent,entId,AcDb::kForRead);
if (ent->isKindOf(AcDbLine::desc()))
{
type=1;
}
if (ent->isKindOf(AcDbCircle::desc()))
{
type=2;
}
ent->close();
return type;
}
//
void GetIntersectPoint()
{
ads_name adsent1,adsent2;
ads_point pt1,pt2;
int ret;
Adesk::Boolean ret2;
int type1,type2;
AcDbEntity *ent1;
AcDbObjectId ent1Id;
ret=acedEntSel(NULL,adsent1,pt1);
if (ret == RTCAN)
{
acedPrompt("\nUser Cancelled!");
return;
}
if (ret == RTERROR)
{
acedPrompt("\nSelect Error!");
return;
}
acdbGetObjectId(ent1Id,adsent1);
acdbOpenObject(ent1,ent1Id,AcDb::kForRead);
type1=GetObjectType(adsent1);
if(type1==0)
{
acedPrompt("\nPlease Select a Line or Circle!");
return;
}
acedPrompt("\nSelect Second Line");
ret=acedEntSel(NULL,adsent2,pt2);
if (ret == RTCAN)
{
acedPrompt("\nUser Cancelled!");
return;
}
if (ret == RTERROR)
{
acedPrompt("\nSelect Error!");
return;
}
AcDbEntity *ent2;
AcDbObjectId ent2Id;
acdbGetObjectId(ent2Id,adsent2);
if (ent2Id==ent1Id)
{
acedPrompt("\nMultiple Object Selected!");
return;
}
acdbOpenObject(ent2,ent2Id,AcDb::kForRead);
type2=GetObjectType(adsent2);
if(type2==0)
{
acedPrompt("\nPlease Select a Line Circle or Arc!");
return;
}
AcGePoint3d intersectPoint1,intersectPoint2;
AcGeLineSeg3d lineSeg1,lineSeg2;
AcGeCircArc3d cir1,cir2;
switch (type1)
{
case 1:
lineSeg1.set(((AcDbLine*)ent1)->startPoint(),
((AcDbLine*)ent1)->endPoint());
break;
case 2:
cir1.set(((AcDbCircle*)ent1)->center(),
((AcDbCircle*)ent1)->normal(),
((AcDbCircle*)ent1)->radius());
break;
}
int intNumber=1;
switch (type2)
{
case 1:
lineSeg2.set(((AcDbLine*)ent2)->startPoint(),
((AcDbLine*)ent2)->endPoint());
if (type1==1)
{
ret2=lineSeg2.intersectWith(lineSeg1,intersectPoint1);
intNumber=1;
}
else
{
ret2=cir1.intersectWith(
lineSeg2,intNumber,intersectPoint1,
intersectPoint2);
}
break;
case 2:
cir2.set(((AcDbCircle*)ent2)->center(),
((AcDbCircle*)ent2)->normal(),
((AcDbCircle*)ent2)->radius());
if (type1==1)
{
ret2=cir2.intersectWith(
lineSeg1,intNumber,intersectPoint1,
intersectPoint2);
}
else
{
ret2=cir2.intersectWith(
cir1,intNumber,intersectPoint1,
intersectPoint2);
}
break;
}
if (ret2 == Adesk::kTrue)
{
acedPrompt("\nIntersectPoint calculated!\n");
char text[50];
sprintf(text,"X=%f, Y=%f, Z=%f",intersectPoint1.x,
intersectPoint1.y,intersectPoint1.z);
acedPrompt(text);
if (intNumber==2)
{
sprintf(text,"X=%f, Y=%f, Z=%f",intersectPoint2.x,
intersectPoint2.y,intersectPoint2.z);
acedPrompt(text);
}
}
else
{
acedPrompt("\nLines Have No Intersectpoint!");
}
ent1->close();
ent2->close();
}
//
void
initApp()
{
acedRegCmds->addCommand("EXAM14",
"INTP","INTP",
ACRX_CMD_MODAL,
GetIntersectPoint);
acedPrompt("Use intp to calculate two lines' intersection point!");
}
//
void
unloadApp()
{
acedRegCmds->removeGroup("EXAM14");
}
// ARX entry point
//
AcRx::AppRetCode
acrxEntryPoint(AcRx::AppMsgCode msg, void* appId)
{
switch (msg) {
case AcRx::kInitAppMsg:
acrxDynamicLinker->unlockApplication(appId);
acrxDynamicLinker->registerAppMDIAware(appId);
initApp();
break;
case AcRx::kUnloadAppMsg:
unloadApp();
}
return AcRx::kRetOK;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -