//-----------------------------------------------------------------------------
//----- acrxEntryPoint.h
//-----------------------------------------------------------------------------
#include "StdAfx.h"
#include "resource.h"
//-----------------------------------------------------------------------------
#define szRDS _RXST("burn")
//-----------------------------------------------------------------------------
//----- ObjectARX EntryPoint
AcDbObjectId GetLineId(AcDbDatabase* pDb,
const ACHAR *LineName)
{
AcDbLinetypeTable* pTable=NULL;
AcDbObjectId id=AcDbObjectId::kNull;
pDb->getLinetypeTable(pTable,AcDb::kForRead);
if(pTable)
{
Acad::ErrorStatus Error=pTable->getAt(LineName,id);
pTable->close();
}
return id;
}
AcDbObjectId AddLineType(AcDbDatabase *pDb,
const ACHAR* linetype)
{
if(pDb==NULL)
return AcDbObjectId::kNull;
AcDbObjectId lineTypeId=GetLineId(pDb,(LPTSTR)(LPCTSTR)linetype);
if(lineTypeId!=0)
return lineTypeId;
pDb->loadLineTypeFile((LPCTSTR)linetype,L"acadiso.lin");
lineTypeId=GetLineId(pDb,(LPTSTR)(LPCTSTR)linetype);
return lineTypeId;
}
void AddLayer()
{
AcDbLayerTable* pLayerTbl = NULL;
AcDbDatabase* pDB = acdbHostApplicationServices()->workingDatabase();
pDB->getSymbolTable(pLayerTbl,AcDb::kForWrite);
if (!pLayerTbl->has(L"os")) {
AcDbLayerTableRecord *pLayerTblRcd = new AcDbLayerTableRecord;
pLayerTblRcd->setName(L"os");
pLayerTblRcd->setIsFrozen(0); // layer set to THAWED
pLayerTblRcd->setIsOff(0); // layer set to ON
pLayerTblRcd->setIsLocked(0); // layer un-locked
AcCmColor color;
color.setColorIndex(10); // set layer color to red
pLayerTblRcd->setColor(color);
pLayerTbl->add(pLayerTblRcd);
AddLineType(pDB,L"ACAD_ISO04W100");
pLayerTblRcd->close();
pLayerTbl->close();
} else {
pLayerTbl->close();
acutPrintf(L"\nMYLAYER already exists");
}
}
/*
AcDbObjectId AddLayer(const ACHAR* LayerName,
const Adesk::Int16 LayerColor,
const ACHAR* Linetype,
AcDbDatabase* pDb)
{
if(pDb==NULL)
#ifdef __R14_
pDb=acdbCurDwg();
#else
pDb=acdbHostApplicationServices()->workingDatabase();
#endif
pDb->loadLineTypeFile(Linetype,L"acadiso.lin");
AcDbObjectId LineTypeId=AddLineType(pDb,Linetype);
AcDbLayerTable* pLayerTable=NULL;
AcDbLayerTableRecord* pLayerRecord=NULL;
AcDbObjectId LayerId=AcDbObjectId::kNull;
pDb->getLayerTable(pLayerTable,AcDb::kForWrite);
if(!pLayerTable)
return FALSE;
if(pLayerTable->has(LayerName))
{
pLayerTable->getAt(LayerName,LayerId);
}
else
{
pLayerRecord=new AcDbLayerTableRecord;
AcCmColor color;
color.setColorIndex(LayerColor);
pLayerRecord->setColor(color);
pLayerRecord->setLinetypeObjectId(LineTypeId);
pLayerRecord->setName(LayerName);
pLayerTable->add(LayerId,pLayerRecord);
pLayerRecord->close();
}
pLayerTable->close();
return LayerId;
}*/
class CBook04App : public AcRxArxApp {
public:
CBook04App () : AcRxArxApp () {}
virtual AcRx::AppRetCode On_kInitAppMsg (void *pkt) {
// TODO: Load dependencies here
// You *must* call On_kInitAppMsg here
AcRx::AppRetCode retCode =AcRxArxApp::On_kInitAppMsg (pkt) ;
// TODO: Add your initialization code here
return (retCode) ;
}
virtual AcRx::AppRetCode On_kUnloadAppMsg (void *pkt) {
// TODO: Add your code here
// You *must* call On_kUnloadAppMsg here
AcRx::AppRetCode retCode =AcRxArxApp::On_kUnloadAppMsg (pkt) ;
// TODO: Unload dependencies here
return (retCode) ;
}
virtual void RegisterServerComponents () {
}
public:
// - Book04._MyCommand1 command (do not rename)
static void Book04_MyCommand1(void)
{
}
public:
// ----- ads_book4 symbol (do not rename)
static int ads_book4(void)
{
int es1, es2;
ads_name ent1, ent2;
ads_point pt1, pt2;
AcDbObjectId entId1, entId2;
AcDbEntity* pEnt1 = NULL;
AcDbEntity* pEnt2 = NULL;
//AcGePoint3dArray points;
AcGePoint3d pStart1, pEnd1, pStart2, pEnd2,
Center, startPt, endPt,StartPt1,EndPt1,StartPt2,EndPt2;
// Выбор первого объекта по запросу
es1 = acedEntSel(L"\nУкажите объект 1: ", ent1, pt1);
if (es1 != RTNORM)
{
acutPrintf(L"\nОбъект не выбран.");
return (RSRSLT);
}
// Вычисление ID для перехода от ads_name к AcDbObjectId
es1 = acdbGetObjectId(entId1, ent1);
if (es1 != Acad::eOk)
{
acutPrintf(L"\nНе получен 1 ");
return (RSRSLT);
}
// Вычисление указателя на AcDbEntity
es1 = acdbOpenAcDbEntity(pEnt1, entId1, AcDb::kForRead);
if (es1 != Acad::eOk)
{
acutPrintf(L"\nНе открыт объект 1 ");
return (RSRSLT);
}
//Определение координат первого обьекта
AcDbLine * pLine1 = AcDbLine::cast(pEnt1);
if(pLine1==NULL)
{
acutPrintf(L"\nЭто не линия!");
goto Circle;
return (RSRSLT);
}
pLine1->getStartPoint(pStart1); // начало
pLine1->getEndPoint(pEnd1); // конец
pLine1->close();
// Подсветка первого объекта
pEnt1->highlight();
// Выбор второго объекта по запросу
label_select2:
es2 = acedEntSel(L"\nУкажите объект 2: ", ent2, pt2);
if (es2 != RTNORM)
{
pEnt1->unhighlight(); // сброс подсветки
pEnt1->close();// закроем объект 1
acutPrintf(L"\nОбъект не выбран. ");
return (RSRSLT);
}
// Вычисление ID для перехода от ads_name к AcDbObjectId
es2 = acdbGetObjectId(entId2,ent2);
if (es2 != Acad::eOk)
{
pEnt1->unhighlight();
pEnt1->close(); // закроем объект 1
acutPrintf(L"\nНе получен Id 2 ");
return (RSRSLT);
}
// Проверка совпадения объектов
if(entId2 == entId1)
{
acutPrintf(L"Повторите выбор: ");
goto label_select2;
}
// Вычисление указателя на AcDbEntity
es2 = acdbOpenAcDbEntity(pEnt2, entId2, AcDb::kForRead);
if (es2 != Acad::eOk)
{
pEnt1->unhighlight();
pEnt1->close(); // закроем объект 1
acutPrintf(L"\nНе открыт объект 2 ");
return (RSRSLT);
}
//Определение координат второго обьекта
AcDbLine * pLine2 = AcDbLine::cast(pEnt2);
if(pLine2==NULL)
{
acutPrintf(L"\nЭто не линия!");
goto label_select2;
}
pLine2->getStartPoint(pStart2); // начало
pLine2->getEndPoint(pEnd2); // конец
pLine2->close();
// Подсветка второго объекта
pEnt2->highlight();
/*
// Распечатка выбранных объектов
acutPrintf(L"\n");// переход на новую строку
pEnt1->list();
acutPrintf(L"\n");
pEnt2->list();
// Вычисление точек пересечения для объектов
es1 = pEnt2->intersectWith(pEnt1, AcDb::kOnBothOperands, points);
int len;
if ( (es1 != Acad::eOk) || ((len = points.length() ) == 0) )
acutPrintf(L"\nОбъекты не пересекаются.");
else
{
acutPrintf(L"\nТочки пересечения:");
for (int i=0; i<len; ++i)
{
acutPrintf(L"\n%d: %.6f %.6f %.6f",
i+1, points[i].x, points[i].y, points[i].z);
}
}
*/
//Постороение линии
AcDbBlockTable* pBlockTbl=NULL;
Acad::ErrorStatus es;
if ((es=acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBlockTbl,AcDb::kForRead))!=Acad::eOk)
{
acutPrintf(L"\nОшибка.Линия не построена");
}
AcDbBlockTableRecord *pMS=NULL;
pBlockTbl->getAt(ACDB_MODEL_SPACE,pMS,AcDb::kForWrite);
if (pMS==NULL)
{
acutPrintf(L"\nОшибка.Линия не построена");
}
//Вычисление координат осевой
//AcGePoint3d startPt, endPt;//(100,150,0);
//AcGePoint3d endPt;//(200,250,0);
startPt.x=(pStart1.x+pStart2.x)/2;
startPt.y=(pStart1.y+pStart2.y)/2;
startPt.z=(pStart1.z+pStart2.z)/2;
endPt.x=(pEnd1.x+pEnd2.x)/2;
endPt.y=(pEnd1.y+pEnd2.y)/2;
endPt.z=(pEnd1.z+pEnd2.z)/2;
//acedCommand(RTSTR,L"_.LAYER",RTSTR,L"_N",RTSTR,L"os",RTSTR,"",0);
//AcDbDatabase* pDB=NULL;
//AddLayer(L"os",10,L"CONTINUOUS",pDB);
AddLayer();
AcDbLine* pLineOs=new AcDbLine(startPt, endPt);
pLineOs->setLayer(L"os");
pLineOs->setLinetype(L"ACAD_ISO04W100");
//pLineOs->setColorIndex(10);
//pLineOs->setLinetype(L"CONTINUOUS");
if ((es=pMS->appendAcDbEntity(pLineOs))!=Acad::eOk)
{
acutPrintf(L"\nОшибка.Линия не построена");
}
// Сброс подсветки
pEnt1->unhighlight();
pEnt2->unhighlight();
// Закрытие объектов с освобождением памяти
pEnt1->close();
pEnt2->close();
pLineOs->close();
pBlockTbl->close();
pMS->close();
//Далее операции с окружностью
Circle:
AcDbCircle * pCircle = AcDbCircle::cast(pEnt1);
if(pCircle==NULL)
{
acutPrintf(L"\nЭто не окружность!");
return (RSRSLT);
}
else
{
acutPrintf(L"\nЭто окружность!");
Center = pCircle->center();// центр окружности
double Radius = pCircle->radius();// радиус окружности
//Вычисление координат нужного диаметра(1)
StartPt1.x=Center.x;
StartPt1.y=Center.y-Radius;
StartPt1.z=Center.z;
EndPt1.x=Center.x;
EndPt1.y=Center.y+Radius;
EndPt1.z=Center.z;
//Вычисление координат нужного диаметра(2)
StartPt2.x=Center.x-Radius;
StartPt2.y=Center.y;
StartPt2.z=Center.z;
EndPt2.x=Center.x+Radius;
EndPt2.y=Center.y;
EndPt2.z=Center.z;
//Постороение линий
AcDbBlockTable* pBlockTbl=NULL;
Acad::ErrorStatus es;
if ((es=acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBlockTbl,AcDb::kForRead))!=Acad::eOk)
{
acutPrintf(L"\nОшибка.Линия не построена");
}
AcDbBlockTableRecord *pMS=NULL;
pBlockTbl->getAt(ACDB_MODEL_SPACE,pMS,AcDb::kForWrite);
if (pMS==NULL)
{
acutPrintf(L"\nОшибка.Линия не построена");
}
//acedCommand(RTSTR,L"_.LAYER",RTSTR,L"_N",RTSTR,L"os",RTSTR,"",0);
AddLayer();
AcDbLine* pLineCircle1=new AcDbLine(StartPt1, EndPt1);
pLineCircle1->setLayer(L"os");
pLineCircle1->setLinetype(L"ACAD_ISO04W100");
//pLineCircle1->setColorIndex(10);
if ((es=pMS->appendAcDbEntity(pLineCircle1))!=Acad::eOk)
{
acutPrintf(L"\nОшибка.Линия не построена");
}
AcDbLine* pLineCircle2=new AcDbLine(StartPt2, EndPt2);
pLineCircle2->setLayer(L"os");
pLineCircle2->setLinetype(L"ACAD_ISO04W100");
//pLineCircle2->setColorIndex(10);
if ((es=pMS->appendAcDbEntity(pLineCircle2))!=Acad::eOk)
{
acutPrintf(L"\nОшибка.Линия не построена");
}
// Закрытие объектов с освобождением памяти
pEnt1->unhighlight();
pLineCircle1->close();
pLineCircle2->close();
pCircle->close();
pEnt1->close();
pBlockTbl->close();
pMS->close();
}
// TODO: Replace the following line by your returned value if any
acedRetVoid () ;
return (RSRSLT) ;
}
} ;
//-----------------------------------------------------------------------------
IMPLEMENT_ARX_ENTRYPOINT(CBook04App)
ACED_ARXCOMMAND_ENTRY_AUTO(CBook04App, Book04, _MyCommand1, MyCommand1, ACRX_CMD_TRANSPARENT, NULL)
ACED_ADSSYMBOL_ENTRY_AUTO(CBook04App, book4, true)