Extensão do SketchUp (plugin) para design de móveis por um programador

Ao calcular o custo de uma nova cozinha, o preço foi tão alto que eu decidi fabricá-lo, pois custaria metade do preço. Para o treinamento, decidi criar uma área de trabalho para mim. Entendendo rápido o suficiente: para fazer uma coisa boa, você precisa criar um modelo 3D. Isso nos permitirá, na fase de design, ver como será a aparência dos móveis e pensar em como a montagem será realizada no futuro. Como não estou fazendo modelagem 3D, comecei a procurar um programa mais simples. E a coisa mais simples que o SketchUp encontrou. Ao criar um modelo, eu constantemente precisava editá-lo devido à constante mudança de tamanho. E após a terceira mudança, surgiu a idéia - criar um modelo parametrizado para que ele próprio fosse gerado com os tamanhos corretos. O SketchUp suporta scripts Ruby e este artigo é sobre o que eu fiz.


A solução é bastante simples: estou criando uma API que permite criar objetos 3D de folhas de aglomerado com os parâmetros necessários. O modelo acabado é montado a partir desses objetos e os tamanhos das folhas são carregados em um arquivo separado para transferi-los para o centro de corte. Como resultado da operação, adicionei a capacidade de especificar bordas para folhas. Este plugin foi usado para projetar mais de uma dúzia de produtos diferentes do cartão. A cada novo projeto, o plugin era refinado e modificado, a usabilidade foi aprimorada e a API aprimorada. Como exemplo, o último projeto é uma mesa de pedestal. Na foto, o modelo + produto acabado (pássaro e cachorro para atrair atenção :))


main.jpg


Vermelho são bordas de 2 mm, roxo são bordas de 0,4 mm. As prateleiras inferiores não estão no final, pois há uma bateria de aquecimento próxima à parede. A bancada fica 4 cm atrás da parede, para que o calor da bateria de aquecimento suba e aqueça a parede ( em geral, fabricar móveis é muito conveniente - você pode fazê-lo do seu tamanho ).


aqui está o código para gerá-lo
#   $weght = 16.0 #       $zazor = 5.0 #      $dWidth = 26.0 # $width = 770 $offsetStena = 40 $dStoledhnica = 20 $height = 2500 - 150 - 900 $depthLeft = 600 $depthRight = $depthLeft - 175 $jshikHeight = 200 $heightPlanka = 300 $heightJshik = 190 $heightJshikOffset = 10 #    def object3D_main() #   Shasoft::Object3D::loadLibrary() #    Shasoft::Object3D::LDSP::setWeght($weght) #   stenaLeft = Shasoft::Object3D::LDSP::create($height-$weght,$depthLeft,"2 0 0 1").name(" ").rotateY(-90) stenaRight = Shasoft::Object3D::LDSP::create($height-$weght,$depthLeft,"2 0 0 1").name(" ").rotateY(-90).moveX($width-$weght) stoleshnica = Shasoft::Object3D::LDSP::create($width,$depthLeft+$dStoledhnica-$offsetStena,"2 2 1 2").name("").move(-$weght,-$dStoledhnica,$height-$weght) polka1 = Shasoft::Object3D::LDSP::create($width-$weght*2,$depthRight,"2 0 0 0").name(" 1").moveZ(400) polka2 = Shasoft::Object3D::LDSP::create($width-$weght*2,$depthRight-$weght,"2 0 0 0").name(" 2").moveZ(600) polka3 = Shasoft::Object3D::LDSP::create($width-$weght*2,$depthLeft-$offsetStena,"2 0 0 0").name(" 3").moveZ(800+$heightJshik+$heightJshikOffset+10-$weght-5) pereborka1 = Shasoft::Object3D::LDSP::create($width-$weght*2,$heightPlanka).name("").rotateX(90).moveY($depthRight).moveZ(400+$weght) #   jshik1box = Shasoft::Object3D::LDSP::create_box($width-$weght*2-$dWidth,$depthLeft-$zazor-$offsetStena,$heightJshik," ",1).moveX($dWidth/2).moveZ($height-$heightJshik-$heightJshikOffset-$weght) jshik1Fasad = Shasoft::Object3D::LDSP::create($width,200,"2 2 2 2").rotateX(90).moveX(-$weght).moveZ($height-$heightJshik-$heightJshikOffset-$weght-5).name("  1") jshik1 = Shasoft::Object3D::create(jshik1box,jshik1Fasad) #   jshik2box = Shasoft::Object3D::LDSP::create_box($width-$weght*2-$dWidth,$depthLeft-$zazor-$offsetStena,$heightJshik-$weght-5," ",1).moveX($dWidth/2).moveZ($height-$heightJshik-$heightJshikOffset-$weght) jshik2Fasad = Shasoft::Object3D::LDSP::create($width,200,"2 2 2 2").rotateX(90).moveX(-$weght).moveZ($height-$heightJshik-$heightJshikOffset-$weght-5).name("  2") jshik2 = Shasoft::Object3D::create(jshik2box,jshik2Fasad).moveZ(-$height+800+$heightJshik+$heightJshikOffset+$weght+10) #  widthDver = $width/2-5 dver1 = Shasoft::Object3D::LDSP::create(widthDver,800-5-10,"2 2 2 2").rotateX(90).moveZ(5).moveX(-$weght).name(" 1") dver2 = dver1.copy.moveX($width-widthDver).name(" 2") # for i in 0..5 Shasoft::Object3D::LDSP::create(467,247,"0 2 0 0").name("  ").moveX(-600).moveZ(i*50) end for i in 0..2 Shasoft::Object3D::LDSP::create(467,640,"0 2 0 0").name("   2").moveX(-600-600).moveZ(i*50) end # Shasoft::Object3D::LDSP::write_csv( File.dirname(__FILE__)+"/main.csv" ) #Shasoft::Object3D::LDSP::write_csv_cut( File.dirname(__FILE__)+"/cut.csv" ) #Shasoft::Object3D::show() end 

Instalação


Faça o download do arquivo Object3D.rbz
Iniciar o SketchUp
Abra o Gerenciador de extensão (Window / Extension Manager)
Clique no botão "Instalar extensão" e selecione o arquivo Object3D.rbz baixado
Depois disso, o plug-in solicita um diretório onde os projetos serão armazenados. I.e. a janela "Especifique o diretório com projetos" é exibida e você precisa especificar a pasta onde armazenará seus projetos.


Como resultado, temos nossa extensão


2019-01-25-10_02_19.png


Use


Vá para a pasta que especificamos para armazenar projetos. Esta pasta pode ser alterada no menu do plug-in


2019-01-25-10_06_10.png


Crie um diretório na pasta com o nome do nosso projeto. No meu caso, este é o "Armário no corredor". Em seguida, vamos para o diretório criado e criamos o arquivo main.rb no qual criamos a função de ponto de entrada


 #    def object3D_main() ... #     end 

Reiniciaremos o SketchUp e, no menu do plug-in, você verá um item com o nome da pasta que você criou. Agora você seleciona este item, o seguinte acontecerá:


  • limpando o console do Ruby
  • excluir todos os itens no projeto atual
  • carregando o arquivo main.rb do diretório especificado
  • chamada de função object3D_main

Na função object3D_main, você precisa gerar a geração do seu modelo. Você pode copiar o código que forneci acima para o arquivo main.rb e, em seguida, meu armário será gerado.


API


Arquivo "core.rb"


Cada função retorna um objeto Shasoft :: Object3D :: Object3D que contém métodos para mover e girar o objeto


  • Nome da função () - definindo o nome do objeto. Não os negligencie. Ao montar pode ajudar bastante :)


  • As funções do objeto moveX , moveY , moveZ permitem mover o objeto ao longo dos eixos correspondentes.


  • A função de movimento (x, y, z) permite mover um objeto ao longo de três eixos ao mesmo tempo


  • As funções de objeto rotateX , rotateY , rotateZ permitem girar o objeto em torno dos eixos correspondentes.


  • Existem alias de funções moveRed , moveGreen , moveBlue , rotateRed , rotateGreen , rotateBlue , onde os eixos X (vermelho), Y (verde), Z (azul) são nomeados por sua cor no SketchUp. Talvez alguém fique mais confortável.
    Cada função retorna um ponteiro para o próprio objeto. Isso permite que você faça uma cadeia de chamadas.


     #    90    X     Y  100  obj.rotateX(90).moveY(100) 

  • A função de objeto set (dict, key, value) permite definir o valor do atributo. dict - nome do dicionário, chave - nome do atributo, valor - valor


  • A função do objeto get (dict, key, value = nil) permite obter o valor do atributo. dict - nome do dicionário, chave - nome do atributo, valor - valor


  • O método copy permite obter uma cópia do objeto (embora não funcione de maneira muito estável :))


  • O método de grupo permite que você obtenha um objeto SketchUp :: Group padrão.



Um método para criar um objeto é definido. Você pode passar uma lista de objetos Shasoft :: Object3D :: Object3D ou SketchUp :: Group como parâmetros. Se a lista de parâmetros estiver vazia, um novo grupo será criado.


 #       Shasoft::Object3D::create(*args) 

Há também uma função que permite obter uma lista de objetos (Skechup :: Group). Você pode especificar o nome do dicionário e somente os objetos que possuem esse dicionário serão retornados. Em particular, é assim que eu separo os objetos da folha de aglomerado dos outros. Ao criar, instalo o dicionário LDSP pelo qual então filtre todos os objetos na cena.


 #    # dict -   Shasoft::Object3D::get(dict=nil) 

Arquivo 2D_weght


 #  3D   # pts -      x,y # weght - () Shasoft::Object3D::create_pushpull(pts,weght) #       # lX -   X # lY -   Y # weght -  Shasoft::Object3D::create_plane(lX,lY,weght) 

Arquivo "ldsp.rb"


 #    Shasoft::Object3D::LDSP::weght #   Shasoft::Object3D::LDSP::setWeght(weght) 

 #     Shasoft::Object3D::LDSP::material #    Shasoft::Object3D::LDSP::setMaterial(material) #    # width -  ( X) # depth -  ( Y) # kromka -  [X , Y , X , Y ], 0 -  , 1 -  0.4 , 2 -  2  Shasoft::Object3D::LDSP::create(width,depth,kromka="0 0 0 0") 

Função auxiliar para criação de gavetas


 #   # width -  # depth -  # height -  # name -  # is_kromka - 1/0   2   Shasoft::Object3D::LDSP::create_box(width,depth,height,name,is_kromka) 

resultado do trabalho
box.png


 #     CSV Shasoft::Object3D::LDSP::write_csv(filepath) 

como resultado, o próximo arquivo csv será gerado com as seguintes colunas


  • A - Largura
  • B - Profundidade
  • C Número de peças
  • D - arestas no formato lado D longo, lado K curto. É nisso que eles estão gravados no escritório em que peço um corte de peças. Talvez este seja o padrão.
  • Bordas em E no formato em que você as define ao gerar
  • F - Nome de todas as partes. Isso é útil na construção.

2019-01-25-10_39_50.png


Em conclusão


Projetar e montar móveis economiza cerca de duas vezes. E também a oportunidade de espremer seus móveis individuais em qualquer buraco fora do padrão no apartamento. Normalmente coleciono móveis em confirmações 7x50 de aglomerado de 16 mm


1490379431197352996.jpg


Se houver exercícios para confirmações


1490379603123527575.jpg


(e uma pequena habilidade) a montagem não leva muito tempo.


O único aspecto negativo é que você pode se envolver . Depois da mesa, eu já montei: uma cozinha, várias gaiolas (para o mesmo pássaro que está na foto), prateleiras (parede e piso), armários e mesas. Em geral, ele "bagunçou" todos os lugares não utilizados no apartamento.


Download do link da extensão


Link para a página do plugin

Source: https://habr.com/ru/post/pt442190/


All Articles