Civil 3D - Point Group para todas as descrições

Volta e meia você precisa criar point group para as descrições dos pontos, certo? Seja porque você não gosta do "Description Key Sets", seja porque você nem saiba o que é isso, hehehe

A idéia basicamente é que cada point group contenha somente os pontos de uma determinada descrição, o que facilita na hora de criar estilos e na hora de fazer as superfícies.

Por exemplo, se criamos um point group chamado árvore, podemos definir o estilo deste com um bloquinho que seja uma árvore. O mesmo com postes por exemplo, já imaginou que bacana? Isso simplifica bastante o acabamento do desenho...

Também facilita no mdt, porque nossa superfície pode não precisar de alguns pontos, por exemplo, os de fundo de boca de lobo...

O duro é criar todos esses point groups....

Que tal um lispezinho pra isso? Veja:

;funcao que devolve um item da colecao, cria se necessario
;byref_is_new é passado por referencia, diz se é novo
(defun get_or_create (collection name byref_is_new / obj)
  (
VLAX-FOR O   COLLECTION
    (IF (=  (VLA-GET-NAME O) NAME)
      (
sETQ OBJ O)
    ))

  (
IF OBJ (set byref_is_new nil)
    (
progn (setq obj (vla-add collection name))
       (
set byref_is_new t)
    ))


  

  obj
)

;funcao principal
;escaneia os pontos do desenho e cria point groups com estilos
;para cada descricao de pontodiferente
;autor: neyton luiz dalle molle
;http://tbn2.blogspot.com
;requer inivars.lsp

(defun c:pgforall (/ p desc QueryBuilder pointstyle pointgroup novo)
  ;inicializa o controle de erros
  (tbn:error-init nil)
  ;em todos os pontos do desenho faça
  (vlax-for p (cvlp-get-points aec-adoc)
    (
setq desc (cvlp-get-rawdescription p))
    ;se adescricao esta setada, faça
    (if    (/= desc "")
      (
progn
    ;verifica se existe o pointgroup com este nome
    (setq pointgroup
           (GET_OR_CREATE
         (cvlp-get-pointgroups aec-adoc)
         desc
         'novo))
    ;se for criado um novo, entao
    (if novo
      (progn
        ;constroi o filtro e o estilo
        (setq QueryBuilder (cvlp-get-QueryBuilder pointgroup)
          pointstyle   (GET_OR_CREATE
                 (cvlp-get-pointstyles aec-adoc)
                 desc
                 'novo ))
        ;define as propriedades do novo pointgroup
        

        (cvlp-put-IncludeRawDescriptions QueryBuilder desc)
        (
cvlp-put-pointstyle pointgroup pointstyle)
        (
cvlp-put-MarkerSize pointstyle 0.0003)
      
        (
prompt (strcat "\n" desc))
      )
    )
      )
    )
  )

  ;finaliza ocontrole de erros
  (tbn:error-restore)
)




Link(s) da(s) subrotina(s) usada(s):
tbn:error-init
tbn:error-restore
funções cvl*


Para rodar, primeiro copie o código fonte acima, bem como aqueles indicados nos links das subrotinas, colando tudo num mesmo arquivo de texto. Use o bloco de notas do windows....
Salve com a extensão .LSP.

Agora carregue no Civil 3D, para isso use o comando APPLOAD. Selecione a lisp que você salvou.

Agora é só chamar na linha de comando: PGFORALL

Note que alem do point group, o programa já cria um estilo correspondente.
Se você não quer o estilo, basta remover essa parte do código... Fica como exercício pra você descobrir como!!!

5 comentários:

  1. muito boa a lisp! agora só uma dúvida, pelo que vi no codigo vou ter que adicionar uma linha abaixo ref. a versão de civil que eu uso?

    Ex.: (= aec-ver "17.2s (LMS Tech)");2009
    (= aec-ver "18.1s (LMS Tech)");2011

    é isso mesmo?

    grande abraço e parabens.

    ResponderExcluir
  2. isso mesmo:

    (= aec-ver "18.1s (LMS Tech)");2011

    ResponderExcluir
  3. Neyton, montei a rotina com todas as sub-rotinas e carreguei no Civil 2011 mas na hora que eu carrego ela me a seguinte mensagem:

    Command: ; error: bad argument type: stringp nil

    e se eu mando executar a seguinte:

    Error: no function definition: CVLP-GET-POINTS

    ResponderExcluir
  4. Isso ainda funciona? Civil 2021?

    ResponderExcluir