Тема: Рабочие коды object ARX
Хотелось бы посмотреть рабочие коды приложений на object ARX под акад 2000. Если кому не жалко, то пишите. Мой кусок кода лежит в теме Automation в AutoCAD с VC++.
Информационный портал для профессионалов в области САПР
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Форумы CADUser → Программирование → ObjectARX → Рабочие коды object ARX
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Хотелось бы посмотреть рабочие коды приложений на object ARX под акад 2000. Если кому не жалко, то пишите. Мой кусок кода лежит в теме Automation в AutoCAD с VC++.
Полный код простейшего проекта
//Тест, иллюстрирурующий ошибку при совместном использовании ads_entget/ads_entmod и malloc/free
#include
#include
void test(){
ads_point pt; ads_name name;
if(acedEntSel ("\nВыберите текст: ", name, pt)!=RTNORM) return;
for(int i=0;irestype!=1) { prevrb=rb; rb=rb->rbnext; } if(!rb) return;
//Вариант 1. Приводит к "вылету" примерно в каждом 4-м случае
{ char* nstr=(char*)malloc(strlen(rb->resval.rstring)+1);
strcpy(nstr+1,rb->resval.rstring); nstr[0]='X';
free(rb->resval.rstring); rb->resval.rstring=nstr;
}
//Вариант 2. Работает нормально
/* { char str[512]="X"; strcpy(str+1,rb->resval.rstring);
newrb=ads_buildlist(1,str,0); if(!newrb) return;
prevrb->rbnext=newrb; newrb->rbnext=rb->rbnext;
rb->rbnext=NULL;acutRelRb(rb);
}
*/ acdbEntMod(eng); acutRelRb(eng);
}
}
extern "C" AcRx::AppRetCode acrxEntryPoint(AcRx::AppMsgCode msg, void* pkt) {
if(msg==AcRx::kInitAppMsg ) acedRegCmds->addCommand ("TEST_CMDS", "CC", "CC", ACRX_CMD_MODAL, test);
if(msg==AcRx::kUnloadAppMsg) acedRegCmds->removeGroup("TEST_CMDS");
return AcRx::kRetOK;
}
Что то я смотрю народ не очень хочет делится arx-ми, или нет наработок ?!
Ниже вставляю свой кусок кода!!!
P.S. Извините что повторяю код, но что-нибудь серьезного на arx-е писать еще не пробывал. Хотелось бы увидеть и интегрированные с Lisp варианты.
// ObjectARX defined commands
#include "StdAfx.h"
#include "StdArx.h"
char* Decode (char*);
char* Recode (char*);
void Body_work (char*);
// This is command 'DECODE'
void decoddecode()
{
// TODO: Implement the command
char flag = 'd';
Body_work(&flag);
}
// This is command 'RECODE'
void decodrecode()
{
// TODO: Implement the command
char flag = 'r';
Body_work(&flag);
}
void Body_work (char *flag)
{
// TODO: Implement the command // TODO: Implement the command
struct resbuf eb1, *tr_obj, *p;
char sbuf1[5]; // Buffers to hold strings
char *nl;
char* txt1;
ads_name ssname1, object1;
long ilast, i;
eb1.restype = 0; // Entity type group
strcpy(sbuf1, "TEXT");
eb1.resval.rstring = sbuf1; // Entity type is text.
eb1.rbnext = NULL;
acedSSGet(NULL, NULL, NULL, &eb1, ssname1);
acedSSLength(ssname1, &ilast);
//acutPrintf("\nCounts quantity objects : %d", ilast);
switch (*flag)
{
case 'd':
acedSetStatusBarProgressMeter("Decode text in R15 format", 0, ilast);
//break;
case 'r':
acedSetStatusBarProgressMeter("Recode text in R12 format", 0, ilast);
default:
break;
}
for (i = 0;irbnext)// DXF code string search
//if ((p->restype >= 0) && (p->restype restype = 1;
if (p->restype == 1) // if DXF code = string
{
txt1= p->resval.rstring;
if(*flag == 'd')
nl = Decode (txt1);
else
nl = Recode (txt1);
strcpy(p->resval.rstring, nl);
// acutPrintf(" Context : %s", txt1);
// модификатор
if (acdbEntMod(tr_obj) != RTNORM) // если объект можно модифицировать
{
acutRelRb(tr_obj);
//return 0; // Error
}//End модификотор
break; // From the for loop
} // end if DXF code = string
acutRelRb(tr_obj); // Release result buffer.
acedSetStatusBarProgressMeterPos(i);
}// end search object
acedRestoreStatusBar();
acedSSFree(ssname1);
}// body work
char* Decode (char* text)
{
int i,num;
unsigned char a;
char* old_text=new char[strlen(text)+1];
strcpy(old_text,text);
num = strlen (text);// количество букв
for(i = 0;i127)&&(a211))>255)
{
strcpy(text , old_text);
// acutPrintf("\nСработало");
break;
}
else
a=a + 64*((a>127)&&(a211);
text[i]=a;
//acutPrintf(" a после = %d",a);
}
delete[strlen(old_text)+1] old_text;
return text;
}
char* Recode (char* text)
{
int i,num;
unsigned char a;
char* old_text=new char[strlen(text)+1];
strcpy(old_text,text);
num = strlen (text);// количество букв
for(i = 0;i191)&&(a239))191)&&(a239);
text[i]=a;
//acutPrintf(" a после = %d",a);
}
delete[strlen(old_text)+1] old_text;
return text;
}
Уважаемый Nik, какой смысл в такого рода обмене программным кодом? Мне кажется, что на широкой публике стоит обсуждать только интересные многим задачи или конкретные плохо освященные в документации по ARX места. В типовых примерах недостатка, по моему, нет.
VVV
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Форумы CADUser → Программирование → ObjectARX → Рабочие коды object ARX
Форум работает на PunBB, при поддержке Informer Technologies, Inc