TBN2C3D - Autodesk Exchange Apps

Agora o TBN2C3D também está la loja de aplicativos da Autodesk!!!


Confira aqui!!

Ah, já tenho 3 aplicativos publicados!!! Veja aqui

Lista das lisps carregadas no AutoCAD

A muito tempo atrás, numa galáxia muito distante, houve uma discussão no finado www.autolisp.com.br, sobre como obter uma lista das lisps carregadas no autocad...

Bem, naquela época, cheguei a postar um pequeno programa em ObjectARX na página.

O programa era este aqui:

//-----------------------------loadedlist.cpp-------------------------
#if defined(_DEBUG) && !defined(AC_FULL_DEBUG)
#error _DEBUG should not be defined except in internal Adesk debug builds
#endif

#include "aced.h"
#include "tchar.h"
#include "acdocman.h"
#include "adslib.h"


#define ELEMENTS(array) (sizeof(array)/sizeof((array)[0]))

struct func_entry
{ TCHAR *func_name; int (*func) (struct resbuf *); };

/* Here we declare the functions that handle the calls; */
int LoadedList (struct resbuf *rb);

/* Here we define the array of function names and handlers. */
static struct func_entry func_table[] = { {_T("LoadedLispList"), LoadedList},};

/* To add more functions to this table, just put them in the list, after
declaring the function names. Note that in standard C it's all right to
have a superfluous comma after the last item. */

/* Declarations of other local functions */
int dofun (void);
int funcload (void);


extern "C" AcRx::AppRetCode
acrxEntryPoint(AcRx::AppMsgCode msg, void* appId)
{
 switch(msg) {
 case AcRx::kInitAppMsg:
  acrxDynamicLinker->unlockApplication(appId);
  acrxDynamicLinker->registerAppMDIAware(appId);
  break;
 case AcRx::kInvkSubrMsg:
  dofun();
  break;
 case AcRx::kLoadDwgMsg:
  funcload(); }
 return AcRx::kRetOK;
}


static int funcload()
{
 int i;
    for (i = 0; i < ELEMENTS(func_table); i++)
    {
  if (!acedDefun(func_table[i].func_name, (short)i))
   return RTERROR; }
 return RTNORM; }

/*-----------------------------------------------------------------------*/
/* DOFUN -- Execute external function (called upon an RQSUBR request).
Return value from the function executed, RTNORM or RTERROR. */

static int dofun()
{ 
 struct resbuf *rb;
 int val;
 /* Get the function code and check that it's within range. 
   (It can't fail to be, but paranoia doesn't hurt.) */
 if ((val = acedGetFunCode()) < 0 || val >= ELEMENTS(func_table)) {
  acdbFail(_T(/*MSG2*/"Received nonexistent function code."));
  return RTERROR; }
 /* Fetch the arguments, if any. */
 rb = acedGetArgs();

 /* Call the handler and return its success-failure status. */
 val = (*func_table[val].func)(rb);
 acutRelRb(rb);
 return val;
}

static int LoadedList(struct resbuf *rb)
{ 
 AcApDocument* ActiveDoc = acDocManager->curDocument();
 struct resbuf *resultlist, *rover;
 resultlist = rover = acutNewRb(RTLB);
 for (int i=0; iGetCountOfLispList(); i++)
 { 
  AcLispAppInfo* appInfo = ActiveDoc->GetItemOfLispList(i);
  if (appInfo)
  { 
   rover->rbnext = acutNewRb(RTSTR);
      rover = rover->rbnext;
      rover->resval.rstring = appInfo->appFileName; }}
 rover->rbnext = acutNewRb(RTLE);
 rover = rover->rbnext;
 rover->rbnext = NULL;
 acedRetList(resultlist);
 return RTNORM;
}
//-----------------------eof---loadedlist.cpp---------------------------

Bom, se você quiser compilar, terá de baixar o Visual Studio e também o ObjectARX Cuidado para os pré requisitos das versões do ObjectARX.

Eu compilei aqui para o versão 2012 do AutoCAD (VS2010).

Para usar é simples:
Carregue o programa com o APPLOAD, e escolha a versão correta (32 ou 64 bits)

Digite:
 (LoadedLispLisp)
e você terá algo assim:

("C:\\program files\\autodesk\\autocad civil 3d 2012\\express\\acetutil.fas" 
"C:\\program files\\autodesk\\autocad civil 3d 2012\\express\\acetauto.LSP" 
"C:\\program files\\autodesk\\autocad civil 3d 2012\\express\\acettest.fas" 
"C:\\program files\\autodesk\\autocad civil 3d 2012\\support\\acad2012.LSP" 
"C:\\program files\\autodesk\\autocad civil 3d 2012\\support\\acad2012doc.LSP" 
"C:\\Users\\Neyton\\appdata\\roaming\\autodesk\\c3d 
2012\\enu\\support\\civil.mnl")
 
Bacana, não?

C3DRENESG - Autodesk Exchange Apps

Já conhece o C3DRENESG?

Aquele programa que desenvolvi para dimensionamento de redes de drenagem e esgoto urbano...

Ainda não?  Pois então veja aqui, na loja de aplicativos da Autodesk

A página do programa está aqui

E você sabia que pode ter uma licença estudantil?
Basta entrar em contato comigo (contatos na coluna da esquerda)!!

O programa pode ser testado sem compromisso ou custos por 15 dias, basta registrar uma licença demonstrativa gratuitamente!!

Vírus de Auto Lisp (acaddoc.lsp) - Uma possível solução

Lembra daquele famigerado vírus de autocad?

Pois é...

Se o seu AutoCAD também está leeeento, travando.... talvez você também tenha milhares de "acaddoc.lsp" distribuído na sua rede e na sua máquina....

Chegou a ler o fonte do mesmo? Não? Veja!!

Agora, analisando ele, nota-se que ele usa a função OPEN para se replicar.

E se redefiníssemos esta função, para que ela fizesse um teste antes de executar??

Bem, veja:

;;solução para o virus acaddoc.lsp
;; https://tbn2net.com
(IF (NOT *old_open*)
  (
PROGN
    (setq *old_open* open)
    (
defun open (file flag)
      (
if (member (strcase (vl-filename-extension file)) '(".LSP" ".MNL")  )
    (
PROGN
      (ALERT (STRCAT "TENTANDO CARREGAR VIRUS EM:\n\n" FILE "\n\n(EXIT) SERÁ CHAMADO APOS ESTE ALERTA\n\nLOCAL:\n" (GETVAR "DWGPREFIX") ))
       (
vl-file-delete (strcat (GETVAR "DWGPREFIX") "acaddoc.lsp" ))
      (
EXIT))
    (
*old_open* file flag)
    ))))
(
princ)
;;fim da solução
;;


Percebe como redefini esta função?

Eu armazeno a função OPEN original na variável *old_open* e redefino em seguida.

Como eu fiz:

Abri cada um dos arquivos *.LSP que esse vírus infecta na pasta C:\Users\\AppData\Roaming\Autodesk

Inclui esse código acima nele. Bem no início.

Também adicionei um "acaddoc.lsp" na pasta C:\Users\\Documents
com o conteúdo do código acima, pois o autocad carrega ele ao fazer o comando "QNEW" por exemplo. Como não há um caminho definido para o desenho ainda, o autocad assume que seja a pasta de documentos do usuário.

Bem, aqui está ajudando!!!

Se você é TI e tem uma rede pra administrar, dê um jeito de colocar esse código salvo como "acaddoc.lsp" na pasta de documentos do usuário quando este faz o login.

Não se preocupe. O usuário não dá a mínima pra isso. Eles só reclamam que tem vírus, mas não fazem nada para não pegar!!!


Na pior das hipóteses, não irá causar problemas, hehehe

FIAT - parte 2

E vamos nós!!!

Retirei o carro da concessionária. Consertado, claro, mas com aquele sentimento de indignação!!!

Pensei, será que eu fui sorteado pela FIAT para levar um protetor de cárter que não protege porra nenhuma?

Bem, pedi para ver um protetor novo, só para constatar que os parafusos estão lá:

A diferença é que o agora o parafuso é daqueles comuns, não aqueles com encaixe rápido, da ponta mais fina:



Mas está lá, a agulha, digo, parafuso!!!

Mas que raios essa tampa menor estúpida faz ali????

O protetor do cárter é preso a carroceria por, adivinha!!!! Outros 4 parafusos!!!! Veja:
Sim, tem outros furos no lado esquerdo e no topo, mas é óbvio que não são fixados.

Duvida??

Pede pra por o seu carro no elevador, na concessionária e confirme.

Hoje recebi mais uma ligação do "Fale Conosco" da FIAT. A atendente conseguiu ver o link da postagem original e disse que iria encaminhar para a concessionária.

Não, não adiantou falar pra ela que eu tirei as fotos lá na concessionária, NA FRENTE do gerente de oficina.

Estou aguardando uma posição.

Até o fim de semana. Na segunda-feira vou ao PROCON.