Import type library

Bom, faz tempo que não posto nada, então vou postar um código que stou achando bastante útil:

;importa as funções do civil 3d para o visual lisp
(vlax-import-type-library
 :tlb-filename
 "C:\\Program Files\\AutoCAD Civil 3D 2008\\Civil\\AeccXLand.tlb"
 :methods-prefix "cvlm-"
 :properties-prefix "cvlp-"
 :constants-prefix "cvlc-")


Veja, ele importa os métodos, propriedades e constantes do Civil 3d para o visual lisp

Qual a utilidade disso? bem... você sabe programar em vba? não? sabe em visual lisp?
então.... com isso você pode manipular entidades do civil 3d via lisp!!
um exemplo:
digamos que queiramos obter uma polilinha que passe pelos pontos de um alinhamento... sei lá pra que, mas precisamos fazer isso...
o civil 3d tem um comando que faz o inverso, pega uma polilinha e cria o alinhamento, mas não tem um comando que cria uma polilinha a partir de um alinhamento!! como fazer?
Command: pline ....

bom, veja:

(defun c:alin2pline (/ ss ent)
  (
tbn:error-init nil)
  (
if (setq ss (ssget '((0 . "AECC_ALIGNMENT"))))
    (
repeat (sslength ss)
      (
setq ent (ssname ss 0))
      (
cvlm-GetLWPolyline (vlax-ename->vla-object ent))
      (
ssdel ent ss)))
  (
tbn:error-restore ))


a palavra cvlm-GetLWPolyline so existe APÓS você importar a "type library" do civil 3d que contem o método GetLWPolyline, saca?

essas "type library" estão em "C:\Program Files\AutoCAD Civil 3D 2008\Civil\", no caso do c3d2k8...
agora me pergunte COMO saber que novos métodos você dispõe??

experimente isto:

(setq tmp (atoms-family 1) file (open "d:/cvl.txt" "w"))
(
foreach x tmp
  (if (= "CVL" (strcase (substr x 1 3))) (write-line x file)))
(
close file)
(
startapp "notepad.exe" "d:/cvl.txt")



isto irá criar um arquivo de texto no drive D:\ com todos os métodos, propriedades e constantes importados...

tá, e o help de cada uma delas????????
ache este arquivo:
"C:\Program Files\AutoCAD Civil 3D 2008\Help\civilauto-reference.chm"

abra este tópico:
"AeccXLandLib Library", nele ache "IAeccAlignment Interface"
nele você acha o método que usei no exemplo (GetLWPolyline)
como usar o help?
o help deste método, é algo assim:

Gets the lightweight polyline from alignment geometry.

HRESULT GetLWPolyline(
[out, retval] IAcadLWPolyline ** ppLWPolyline
);


isto é em C, mas é fácil entender...
é quase como os métodos activex ( as famosas VL* ) do cad
ficaria em visual lisp:
(cvlm-GetLWPolyline vlaobj)
onde vlaobj é o vla-object name do alinhamento ( veja o exemplo acima!! )

outro exemplo:
(setq vla     (vlax-ename->vla-object (car (entsel "\nSelecione um alinhamento")))
      station (cvlp-get-startingstation vla)
      offset  0)
(
cvlm-PointLocation vla station offset  'x 'y)
(
prompt (strcat "o ponto inicial é " (rtos x) ", " (rtos y)))


simples né?
o método pointlocation, no help é assim:
HRESULT PointLocation(
[in] double Station,
[in] double Offset,
[out] double* Easting,
[out] double* Northing
);


em lisp, o método PointLocation ficaria:
(cvlm-PointLocation vla station offset 'x 'y)
onde:
"cvlm-" é o prefixo que eu escolho para indicar os métodos
vla é o vla-object do alignment
station é a estaca
offset é a distancia perpendicular ao alinhamento na estaca escolhida