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.

Update multiplos corridors de uma vez só

Faz tempo que não posto uma lisp, então pra desenferrujar um pouco, que tal fazer um update em vários corridors ao mesmo tempo?

(DEFUN C:UPDCORRIDOR (/ SS ENT VLA)
  (
vl-load-com)
  (
setq ss (ssget '((0 . "AECC_CORRIDOR"))))
  (
REPEAT (SSLENGTH SS)
    (
SETQ ENT (SSNAME SS 0)
      VLA (VLAX-ENAME->VLA-OBJECT ENT))
    (
VLAX-INVOKE-METHOD VLA 'Rebuild)
    (
SSDEL ENT SS)))



Se você, como eu, cria todas as interseções separadas do corridor principal, para nao demorar os rebuilds quano se está projetando, esta lispezinha vai ser muito útil no final, porque ficar dando rebuild um a um é massante!!!

Experimente, ela é bem simples, só copie, salve e carregue que já dá para sair usando!!!