Posicao para Civil 3D

Como prometido, uma rotina que usa a collection POINTS do civil 3d, esta rotina converte os pontos de levantamento topográfico inseridos pelo software Posicao, da Manfra para pontos do Civil 3D
ver rotina
(defun c:ptpos2civil (/ ss ent cod pt elev num apt flag xd fun:ents)
  (
tbn:error-init  '(("cmdecho" 0) t))
  (
if aec-pts
    (progn
      (setq fun:ents (lambda (x / p)
                       (
setq x (cdr x)
                             p (vl-string-search "H=" x))
                       (
handent (vl-string-trim " "
                                  (substr x (+ p 3) (- (vl-string-search "DE=" x p) p 2)))))
            ss (ssget '((0 . "POINT") (-3 ("*"))))
            flag (initget "S N" 0)
            flag (getkword "\nApagar os pontos do posição? [Sim, Não] ")
            flag (= "S" (if flag flag "S")))
      (
repeat (if ss (sslength ss) 0)
        (
setq ent  (ssname ss 0)
              xd   (cadr (assoc -3 (entget ent '("*"))))
              cod  (cdaddr xd)
              elev (atof (cdadr xd))
              num  (car xd)
              pt   (cdr (assoc 10 (entget ent)))
              pt   (list (car pt) (cadr pt)))
        
        (
if (and num elev cod pt)
          (
progn
            (setq apt  (vla-add aec-pts (vlax-3d-point pt)))
            (
vlax-put-property apt 'Name num)
            (
vlax-put-property apt 'RawDescription cod)
            (
vlax-put-property apt 'Elevation elev)
            (
if flag
              (foreach x (list ent
                               (fun:ents (nth 4 xd))
                               (
fun:ents (nth 5 xd))
                               (
fun:ents (nth 6 xd)))
                (
if x (entdel x))))
            (
vlax-release-object apt)))
        (
grtext -2 (itoa (sslength ss)))
        (
ssdel ent ss)))
    (
prompt "\nNo Donuts for You!!!!"))
  (
tbn:error-restore t))


Link(s) da(s) subrotina(s) usada(s):
tbn:error-init, aec-pts, tbn:error-restore
Para usar, basta digitar PTPOS2CIVIL na linha de comando (após carregar a rotina, obviamente)

Civil 3d - Pontos

Hoje pra mudar um pouco, vou postar alguma coisa do civil 3d... alguem (assim como eu) já deve ter tentado programar qualquer coisa para ele e, a princípio, fez em VBA, usando os exemplos do próprio programa... mas e em Visual Lisp? será que dá? sim!!! dá!! e nem é tão complicado... que já "conectou" o autocad com o access/excel não vai ter dificuldade nenhuma...

bom, da forma que eu fiz, primeiro defino algumas variáveis globais (que serão usadas em várias subrotinas):

(setq acadapp   (vlax-get-acad-object)
      aec-app   (vla-GetInterfaceObject acadapp "AeccXUiLand.AeccApplication")
      aec-adoc  (vla-get-activedocument aec-app)
      aec-db    (vla-get-database aec-adoc)
      aec-pts   (vlax-get-property aec-db "points")
      aec-surfs (vlax-get-property aec-db "surfaces"))


bom... não vou explicar o que cada função faz... leia o help do civil também, hehehe!!!
estas variáveis serão usadas, por exemplo, nesta rotina:
(defun aec-get-point-by-name (name / lst)
  (
vl-catch-all-apply
    'vlax-map-collection
    (list aec-pts '(lambda (pt) (if (wcmatch (vlax-get-property pt "Name") name) (setq lst (cons pt lst))))))
  lst)



quem usa pontos de levantamento topográfico, sabe que as vezes o ponto vem com o nome duplicado, com caracteres alfanuméricos... mas o PointNumber só aceita número inteiro... nestes casos, em vez de usar a propriedade PointNumber, pode-se usar a PointName, assim o croquis do levantamento terá pontos com nomes coerentes com o desenho do cad... já que PointName aceita caracteres alfanuméricos... assim, se quisermos o(s) ponto(s) de nome "E1" por exemplo, basta usar: (aec-get-point-by-name "E1") e, da maneira que a subrotina foi escrita, pode-se usar: (aec-get-point-by-name "E*") e isto nos retornaria uma lista com os pontos cujo nome comecem com "E"... sacam?

logo posto uma rotina que usa esta subrotina..