Тема: Рабочие коды object ARX

Хотелось бы посмотреть рабочие коды приложений на object ARX под акад 2000. Если кому не жалко, то пишите. Мой кусок кода лежит в теме Automation в AutoCAD с VC++.

Re: Рабочие коды object ARX

Полный код простейшего проекта
//Тест, иллюстрирурующий ошибку при совместном использовании 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;
}

Re: Рабочие коды object ARX

Что то я смотрю народ не очень хочет делится 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;
}

Re: Рабочие коды object ARX

Уважаемый Nik, какой смысл в такого рода обмене программным  кодом? Мне кажется, что на широкой публике стоит обсуждать только интересные многим задачи или конкретные плохо освященные  в документации по ARX места. В типовых примерах недостатка, по моему, нет.
VVV