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!!!

Terraplenagem - Diagrama de massa

Opa, demorou mas estamos aí, mais um post com um novo programinha!!!

Este programa é o MASSDIAG (ainda estou escolhendo um nome, heheh)
Ele servirá para calcular o diagrama de massa de terraplenagem. É, algo como o diagrama de bruckner ou o "mass haul" do civil 3d, aliás, é para rodar adivinha em que programa!!! Claro, no civil 3d!!

Imagine a situação, você um loteamento, grande, pequeno, não importa. E está fazendo a terraplenagem. Fez ai o MDT, depois modelou as estradas, quadras, etc. E resultou que você tem uma superfície de volume, com as manchas de corte e aterro.

Bem, no civil 3d, você pode desenhar os polígonos que limitam as áreas de corte e aterro e com o comando REPORTSURFBOUNDEDVOLUME, pode calcular o volume contido por estes polígonos. Até aí beleza, mas e se a área for meio irregular, ou a massa é mal distribuida dentro do polígono, onde fica o centro de massa?

É, faltou isso no civil 3d...

E as vezes, ele teima em dar erro e não calcula o volume, e pior ainda, as vezes ele calcula errado!!!! Sim, eu ja peguei isso....


Bom, supondo que tenha dado certo, eu tenho ai algo em torno de 10 cortes e 14 aterros, ou, como um amigo meu no rio de janeiro, tem lá seus 90 cortes por 96 aterros....

Imagine ainda que você disponha de uma caixa de empréstimo ou um botafora se for o caso.

Agora, planilhando isso tudo, cortes em linha, aterros em coluna, temos uma senhora tabela, certo?

por exemplo:








O que é melhor, pegar todo o volume do corte 1 e jogar no aterro 1, ou um tanto do corte 1 vai para o aterro 1, outro tanto para o aterro 2...
é já entendeu né?

Este é o típico problema dos transportes da programação linear

Se você pesquisar um pouco, verá que não é tão complicado, e se pesquisar mais um pouco, verá que o excel da Microsoft, tem o solver, que faz a distribuição para você.

Só um pequeno problema, você terá de digitar tudo nele...

Ah, não esquecendo, o número de células que podem variar não é infinito e no caso do excel 2003, é abaixo do 90x90.

Supondo que o solver resolva a sua dstribuição, ainda terá o problema de desenhar as setas no cad, indicando os caminhos da sua distribuição ( se é que você vai fazer isso, claro)

Veja a solução:

Primeiro, importamos para a tabela do MASSCALC, e obtemos:









Calcule com o solver, verá que dá isso:




Mas e para desenhar no cad? bom o solver já fez o que podia, agora é com você!!!

Claro que o MASSCALC pode fazer isso, inclusive estou captando idéias, do que mais ele deve fazer....

Ah, o exemplo é bem simples, mas demonstra as possibilidades do programa...

Gostaria de experimentar?
baixe ele aqui
Amanhã eu posto um exemplo em dwg

Quer contribuir de alguma forma?
mande-me um email!!!