PipeNetworks - Labels Condicionais

Opa!!, então, já que eu postei uma lisp para corridors, que tal uma para as pipenetworks agora?

Bom, a idéia é a seguinte: Você desenhou uma pipenetwork, mó grande, aí adicionou labels com o comando AeccAddNetworkPlanLabels e teve de editar alguns tubos, ou estruturas... Em fim..., mas as labels de alguns se perderam... é só usar o mesmo comando certo? Mais ou menos... Se fizer isso, os elementos que já possuem labels terão duas labels após a execução do comando... Até aí não é muito problema, mas se você "strechou" alguma, terá dois textos visíveis na tela, aí, só apagando manualmente...

É serviço pro estagiário, hehehehe

Me pergunto, porque este comando não tem um filtro...
Em fim, uma lisp para colocar label só nos elementos que não tem as benditas:
mais...
;função que obtem o ponteiro para a pipenetwork que contem
;o objeto "part", que pode ser um Pipe ou uma Structure
(defun ps->get-pipenetwork (part / AcApp PipeApp versao
                PipeDoc net coll pipenetwork
)
  ;primeiro, obtem a collection de networks
  ;para isso, pega o ponteiro para o documento
  ;PipeDocument atual:
  (setq    AcApp (vlax-get-acad-object)
    versao  (vla-get-version AcApp)
    versao  (vl-position (substr versao 1 4)
          '("18.0" "17.2" "17.1" "17.0"))
    versao  (nth versao '("7.0" "6.0" "5.0" "4.0"))
    PipeApp (vla-GetInterfaceObject AcApp
          (strcat "AeccXUiPipe.AeccPipeApplication."
              versao))
    PipeDoc (vla-get-activedocument PipeApp)
;agora vê que tipo de objeto é:
    coll    (if (= "AeccDbPipe"
               (vla-get-objectname part))
          "Pipes"
          "Structures"
)
;pega seu objectid:
    partid  (vla-get-objectid part))

;em todas as pipenetworks do desenho atual
;procure na coleção correta, qual contem um objeto
;de id igual ao informado:
  (vlax-for net (vlax-get-property Pipedoc 'Pipenetworks)
    (
vlax-for obj (vlax-get-property net coll)
      (
if (= partid (vla-get-objectid obj))
    (
setq pipenetwork net))))
;devolve a pipenetwork encontrada:
  pipenetwork)


;verifica se o objeto tem alguma label ou não
;se nao tiver, adicione uma:
(defun ps->labelme (obj / s2)
  (
if (= 0 (vla-get-count (vlax-get-property obj "Labels")))
    (
progn
      ;preselecione o objeto:
      (setq s2 (ssadd (vlax-vla-object->ename obj) (ssadd)))
      (
sssetfirst s2 s2 )
      ;adicione a label:
      (command "AeccAddNetworkPartPlanLabel")
      (
sssetfirst nil nil))))

;função principal:
(defun c:pslabel (/ ss part net)
  ;obviamente, precisará do vl-load-com:
  (vl-load-com)
  ;inicia o controle de erros:
  (tbn:error-init '(("cmdecho" 0) nil))
  ;pede a seleção de um Pipe ou Structure:
  (prompt "\nClique em um tubo ou estrutura")
  (
setq ss      (ssget  ":S"
            '((0 . "aecc_pipe,aecc_structure")))
    part    (vlax-ename->vla-object (ssname ss 0))
  ;determine em que pipenetwork o objeto selecionado está:
    net     (ps->get-pipenetwork part))

  ;em todos os tubos desta pipenetwork,
  ;adicione label se não tiver:
  (vlax-for obj (vlax-get-property net "Pipes")
    (
ps->labelme obj))

  ;faça o mesmo em todas as estruturas:
  (vlax-for obj (vlax-get-property net "Structures")
    (
ps->labelme obj))

  ;restaure o controle de erros do cad:
  (tbn:error-restore))


Link(s) da(s) subrotina(s) usada(s):
tbn:error-init, tbn:error-restore
Como de costume, copie ela e salve num arquivo de extensão LSP. Claro que você deve copiar tambem a lisp de controle de erros (aqui), ou comentar as linhas que fazem referência a ela.

Note que, com alguns poucos ajustes, dá até para colocar labels específicas, por exemplo, nos tubos, colocamos as labels de costume, com o comprimento, declividade, etc, mas alguns projetos pedem que coloquemos as labels de cota no final do tubo, por exemplo:

Vê a label de cor verde? aqui no Paraná, a sanepar exige que, se num poço de visita o tubo chegue a mais de 70cm da cota de fundo do poço, se faça um tubo de queda.

Nenhum comentário:

Postar um comentário