⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 exam14.cpp

📁 ARX/CAD二次开发
💻 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 + -