Тема: Запуск ARX

Здраствуйте.
Объясню все поподробнее.
Когда то давно создавал прогу (с пол года назад) на ObjectArx под VS2003
Так вот код успешно компилился и загружался в автокад.
Выполнялся он тоже нормально только тут то возникает сейчас проблема.
Я забыл какой командой в командной строке автокада запускал программу на выполнение
Подскажите плиз где можно посматреть эту команду
Зараянее в VS когда тыка. на a:> (вроде так) там пусто.
Спасибо за ответ.

Re: Запуск ARX

> Dark_Veter
А теперь все тоже самое но поподробнее.

Re: Запуск ARX

Была программа которая нормально запускалась и нормально компилилась.
Спустя больше пол года понадобилось ее перекомпилить и опять же через командую строку автокада запустить.
Я забыл какой командой из командоной строки автокада ее(прогу) запускал.
Сам готовый модуль уже загрузил в сам автокад все нормально загрузилось а вот как терь запустить прогу и посматреть что полусилось я не знаю.

Re: Запуск ARX

> Dark_Veter
ObjectARX или .NET (C#,VB...)?
Если ObjectARX, то ищи addCommand("имя_команды") или макрос ACED_ARXCOMMAND_ENTRY_AUTO(в нем третий параметр - имя команды). Если .NET, то ищи [CommandMetod("имя_команды")]

Re: Запуск ARX

Object Arx
А где искать то addCommand("имя_команды")
В самих исходниках?

Re: Запуск ARX

Конечно. Скорее всего в файле acrxEntryPoint.cpp если создавал проект при помощи ObjectARX Wizard.

Re: Запуск ARX

Да да точно помню есть там такой
И на сколько помню в нем как раз расположенна большая часть когда которая мной писалась

Re: Запуск ARX

нашел макрос ACED_ARXCOMMAND_ENTRY_AUTO, выглядит он так:
ACED_ARXCOMMAND_ENTRY_AUTO(CBook04App, Book04, _MyCommand1, MyCommand1, ACRX_CMD_TRANSPARENT, NULL)
По идее _MyCommand1 - это имя команды, когда я пишу ее в автокаде, то ошибки(нет комманды) не возникает, однако программа всеравно не работает...

Re: Запуск ARX

А что хоть она должна делать? Судя по тому что ты пишешь она молча завершается и ничего не делает.

Re: Запуск ARX

Она должна рисовать осевую, между двумя линиями...

Re: Запуск ARX

Код в студию. Посмотрим что она делает.

Re: Запуск ARX

вот код:

//-----------------------------------------------------------------------------
//----- 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)

Re: Запуск ARX

С этого бы и начал. У тебя команда действительно пустая (метод static void Book04_MyCommand1(void)). Зато у тебя определена lisp-функция (book4). Следовательно в командной строке AutoCAD набери:

(book4)

P.S.: Код на ошибки не проверял.

Re: Запуск ARX

Запускаю эту комманду и получается:
; ошибка: no function definition: BOOK04... Может из за 2009 автокада, потомучто ранее писали для 2005...

Re: Запуск ARX

> Dark_Veter
Разницу между (book4) и (book04) чувствуешь?

Re: Запуск ARX

Извени, ступил... Спосибо тебе огромное....