Trabalho de programação
Visual Basic for Applications
Desenho Automático de Cilindro Hidráulico
MSAccess ÍÎ VBA ÍÎ AutoCAD
Trabalho desenvolvido por:
Mário Jorge Pereira Estima de Oliveira_4º ano LGEI
Índice
Objectivo ………...
2
Introdução ………...
2
Instalação ………...
3
Aplicação – Programação
………...
4
Interface
principal
………...
4
Dimensões
gerais
………...
5
Extremidade da haste
………...
6
Carregamento da interface
………...
7
Detecção de erros de entrada de dados ………...
8
Desenho das vistas
………...
9
Vista de frente
………...
10
Vista de cima
………...
14
Vista
lateral
………...
19
Final – desenho das vistas
………...
22
Agradecimento ………...
23
Objectivo
Este trabalho tem como objectivo o desenvolvimento de uma aplicação a ser
executada no ambiente AutoCAD. Neste sentido, a aplicação criada deverá receber dados
apropriados por parte do utilizador de forma a ser capaz de representar de modo
automático as três vistas bidimensionais de um cilindro hidráulico normalizado.
Pretende-se o recurso à linguagem de programação por objectos Visual Basic for
Applications (VBA).
Introdução
O objecto cujo desenho se pretende automatizar consiste num cilindro hidráulico
normalizado de 220 bars, em especial o que consta da série apresentada no catálogo da
empresa Vega sob a designação V220 CBL, catálogo existente na secção de Desenho
Industrial do DEMEGI. O enunciado proposto é, então, a automatização do seguinte
exemplo:
Como parâmetros de entrada, o utilizador deverá fornecer os valores correspondentes ao
diâmetro interno e ao curso do cilindro, variáveis independentes neste âmbito. Deverá
também indicar um de dois tipos de extremidade possíveis para a haste. As relações entre
os parâmetros de entrada e restantes, cujo valor é atribuído em função do diâmetro
interno, estão definidas em tabelas existentes no catálogo de base a este trabalho.
Estas tabelas foram convertidas para o formato do sistema de gestão de bases de
dados Microsoft Access, por motivos de facilidade de acesso e igualmente privilegiando o
entrosamento com a tecnologia a usar – Microsoft Visual Basic for Applications. Assim,
existe uma interligação MSAccess<->VBA<->AutoCAD proposta por esta aplicação.
Instalação
Para o correcto funcionamento da aplicação desenvolvida existem certos passos a
seguir, como aqui é indicado.
O acesso à base de dados MSAccess é feito através da tecnologia ActiveX Data
Objects (ADO), definindo-se igualmente um Data Source Name (DNS) à ligação, de
forma a facilitar a mesma e torná-la mais transparente ao utilizador/programador. Assim,
no Painel de Controlo do Windows, deve escolher-se Ferramentas Administrativas, após
o que se selecciona “Origens de Dados (ODBC)”; selecciona-se a opção “DNS de
sistema” e faz-se “adicionar”. Seguidamente, selecciona-se o driver Microsoft Access
driver (*.mdb), fazendo depois “Terminar”. Posteriormente, edita-se o nome (o nome
usado na aplicação entregue é “trabcfac_meu”) e descrição a fornecer à ligação e
indica-se o caminho para a baindica-se de dados MSAccess, através do botão Select.
Já no editor de Visual Basic, em Tools->References, devem acrescentar-se as
bibliotecas Microsoft ActiveX Data Objects 2.7 Library e Microsoft ActiveX Data Objects
Recordset 2.8 Library.
Nota: Este procedimento só deve ser efectuado uma vez em cada computador onde se
pretende correr a aplicação deste trabalho.
No âmbito da utilização da aplicação no AutoCAD propriamente dito, deve carregar-
-se a mesma no seu ambiente. Existe mais do que uma alternativa, de que se destacam a
execução do comando vbaload ou o recurso ao atalho Tools->Macro->Load Project…,
seguidos da escolha do ficheiro Project.dvb, ficheiro que contém a informação em Visual
Basic desta aplicação. Para a sua execução, deve fazer-se Alt+F11 seguido de F5 ou usar
o atalho Run no editor de VBA.
Por fim, para uma correcta manipulação das layers por parte do Visual Basic e do
AutoCAD, sugere-se a criação de layers correspondentes à criação de elementos
desenhados a traço interrompido e a traço grosso, assumindo as designações de ti e tg,
respectivamente. Sugere-se, no entanto, o uso do template a4x.dwt entregue em anexo a
este trabalho, para facilitar este processo.
Aplicação - Programação
Nesta secção de apresentação da aplicação desenvolvida, referem-se brevemente os
elementos de sintaxe da linguagem VBA a que se recorreu para a sua aplicação. Far-se-á
uma pequena explicação sempre que relevante acerca dos procedimentos utilizados.
Interface principal
Da aplicação consta uma única interface principal, da qual se apresenta de seguida
uma imagem:
Dimensões gerais
Como se pode observar, e de acordo com o que tinha sido já referido, o utilizador tem
a possibilidade de escolher entre os valores normalizados para o diâmetro interno e para o
curso do cilindro.
Fig. 3 – Pormenor da interface principal relativo ao diâmetro interno e ao curso.
Tal como se observa na Fig. 3, de acordo com a escolha relativa ao diâmetro interno,
as caixas de texto situadas na zona inferior da mesma são actualizadas concordante e
dinamicamente, através de uma chamada à base de dados e tabelas respectivas. Esta
acção é executada através do seguinte procedimento:
Private Sub Combo_diametro_Change() Set conn = New ADODB.Connection conn.Open "trabcfac_meu", ""
Set rs_diametro = conn.Execute("SELECT * FROM dim_gerais where diametro=" & Combo_diametro.Value) diametro_haste.Value = rs_diametro("diametro_haste") FJ.Value = rs_diametro("FJ") G.Value = rs_diametro("G") H.Value = rs_diametro("H") L.Value = rs_diametro("L") N.Value = rs_diametro("N") XA.Value = rs_diametro("XA") XB.Value = rs_diametro("XB") Q.Value = rs_diametro("Q") R.Value = rs_diametro("R") ST.Value = rs_diametro("ST") WH.Value = rs_diametro("WH") conn.Close End Sub
A instrução X.Value
1faz referência ao valor presente nas caixas de texto, actualizadas
neste caso com o valor das variáveis dependentes.
As duas linhas seguintes
1
Set conn = New ADODB.Connection conn.Open "trabcfac_meu", ""
correspondem à ligação à base de dados MSAccess criada no computador onde o trabalho
foi desenvolvido, sendo que a instrução
Set rs_diametro = conn.Execute("SELECT * FROM dim_gerais where diametro=" & Combo_diametro.Value)
corresponde a uma operação de selecção sobre a base de dados, na linguagem SQL,
guardando o resultado obtido na variável
rs_diametro.
conn.Close
fecha a ligação à base de dados.
Extremidade da haste
Adicionalmente, o utilizador deverá escolher entre duas extremidades para a haste:
rosca macho ou, em alternativa, rosca fêmea.
Fig. 4 – Pormenor da interface principal relativo à extremidade da haste.
Não é perceptível através de uma imagem individual, mas por comparação com a
Fig.2 da interface principal global, consegue-se perceber que de acordo com a escolha do
tipo de haste na caixa de selecção, a vista respectiva é actualizada dinamicamente na
própria interface, através da inserção de uma imagem. Isso é conseguido através da
seguinte subrotina:
Private Sub Combo_tipo_haste_Change()
Select Case Combo_tipo_haste.Value
Case 0
Image_haste.Visible = True
Image_haste.Picture = LoadPicture("macho_res.jpg")
Case 1
Image_haste.Visible = True
Image_haste.Picture = LoadPicture("femea_res.jpg")
End Select
End Sub
Nesta subrotina optou-se pelo recurso à estrutura de selecção Select Case.
Carregamento da interface
É importante e oportuno referir que a activação/carregamento da Form em si, ou seja,
o acto de lançamento da aplicação possui algumas acções associadas, definidas através da
seguinte subrotina que é chamada, em primeira instância, pela linha que se segue:
Private Sub UserForm_Activate() Call ler_dimensoes
End Sub
Private Sub ler_dimensoes()
Combo_diametro.SetFocus
Set conn = New ADODB.Connection conn.Open "trabcfac_meu", ""
Set rs_diametro = conn.Execute("SELECT diametro FROM dim_gerais")
rs_diametro.MoveFirst While Not rs_diametro.EOF Combo_diametro.AddItem rs_diametro("diametro") rs_diametro.MoveNext Wend rs_diametro.Close
'Set rs_diametro = Nothing
Set rs_diametro = conn.Execute("SELECT * FROM dim_curso") rs_diametro.MoveFirst
While Not rs_diametro.EOF Combo_curso.AddItem rs_diametro("curso") rs_diametro.MoveNext Wend
Combo_tipo_haste.AddItem "Rosca Macho", 0 Combo_tipo_haste.AddItem "Rosca Fêmea", 1
conn.Close
End Sub
Ou seja, a rotina ler_dimensões desempenha um papel importante: lê a base de dados
quanto às dimensões possíveis do diâmetro interno e do curso do cilindro, transferindo-as
para a caixa de selecção respectiva da interface gráfica, e atribui como possibilidades
para a extremidade da haste os itens "Rosca Macho" e "Rosca Fêmea", aos quais atribui
valores para que posteriormente se possa identificar a escolha. X.AddItem adiciona, pois,
um valor a uma caixa de selecção.
De referir também que esta rotina posiciona o cursor na caixa de selecção do diâmetro
interno do cilindro e que a ordem de tabulação está também devidamente organizada.
Uma breve referência ao evento associado ao botão Fechar da interface principal para
apresentar o código abaixo transcrito
Private Sub fechar_Click() End
End Sub
o que corresponde, simplesmente, ao fecho da aplicação (End) sem qualquer acção
previamente executada, como pretendido, nesse caso, pelo utilizador.
Detecção de erros de entrada de dados
O utilizador tem a possibilidade de desenhar uma das três vistas em separado: frente,
cima e lateral. No entanto, caso não forneça todos os dados necessários à aplicação, surge
uma mensagem adequada informando sobre os dados em falta. Apresenta-se um
exemplo:
Fig. 5 – Exemplo de mensagem de erro (omissão) de entrada de dados por parte do utilizador.
Mensagens idênticas surgirão para omissões do valor do diâmetro interno e/ou do
curso do cilindro.
O código correspondente a este filtro de erros está inserido na subrotina de desenho de
cada uma das vistas e é:
Dim mensagem As String mensagem = ""
'testes à existência de erros na introdução dos dados (omissões) If Combo_diametro.Value = "" Then
mensagem = mensagem + "Deve seleccionar o valor correspondente ao diâmetro" + vbCr End If
If Combo_curso.Value = "" Then
mensagem = mensagem + "Deve seleccionar o valor correspondente ao curso" + vbCr End If
If Combo_tipo_haste.TextLength = 0 Then
mensagem = mensagem + "Deve seleccionar o tipo de haste a utilizar" End If
If mensagem <> "" Then MsgBox mensagem Else
A esta última instrução segue-se o desenho da vista pedida, caso não existam dados em
falta. A variável
vbC do VBA provoca a mudança de linha num texto.Desenho das vistas
Após a escolha de uma dada vista a desenhar, caso não existam omissões de dados, é
solicitado ao utilizador que seleccione o ponto de inserção da vista
Fig. 6 – Pedido de selecção do ponto de inserção da vista a desenhar.
através do método GetPoint:
UserForm1.Hide
MsgBox ("seleccione o ponto de inserção da vista de frente") p1 = ThisDrawing.Utility.GetPoint(, "")
Para este propósito, o ponto incial - p1- teve de ser definido como acad_point (Dim p1 As
ACAD_POINT) ao invés dos restantes definidos como arrays (Dim pt(2) as Double).
A linha
UserForm1.Hidepermite ocultar a caixa de diálogo de forma ao utilizador
poder escolher o ponto pretendido no AutoCAD.
Vista de frente
O código referente à vista de frente é algo extenso, apresentando-se de seguida
acompanhado de comentários apropriados, sempre que relevante:
'---VISTA DE FRENTE - início---
Dim layer_tg As AcadLayer Dim layer_ti As AcadLayer
Set layer_tg = ThisDrawing.Layers.Add("tg") Set layer_ti = ThisDrawing.Layers.Add("ti") ThisDrawing.ActiveLayer = layer_tg
‘tornou-se a layer “tg” (traço grosso) activa para o desenho; esta é, portanto, a layer activa por ‘defeito e só será abandonada para casos pontuais de desenho a traço interrompido.
Set conn = New ADODB.Connection conn.Open "trabcfac_meu", ""
Set rs_diametro = conn.Execute("SELECT I FROM dim_gerais where diametro=" & Combo_diametro.Value)
I = rs_diametro("I") conn.Close
p2(0) = p1(0) + I: p2(1) = p1(1)
p3(0) = p1(0) + (Val(FJ.Value) + Val(Combo_curso.Value)) / 2 - Val(Q.Value) / 2: p3(1) = p1(1) p4(0) = p3(0): p4(1) = p3(1) + Val(R.Value) p5(0) = p4(0) + Val(Q.Value): p5(1) = p4(1) p6(0) = p5(0): p6(1) = p5(1) - Val(R.Value) p8(0) = p6(0) + p3(0) - p1(0): p8(1) = p6(1) p7(0) = p8(0) - I: p7(1) = p8(1) p9(0) = p8(0): p9(1) = p8(1) + 2 * Val(H.Value) p10(0) = p9(0) - I: p10(1) = p9(1) p12(0) = p9(0) - (Val(FJ.Value) + Val(Combo_curso.Value)): p12(1) = p9(1) p11(0) = p12(0) + I: p11(1) = p12(1)
'a função Val() permite converter uma variável num valor numérico, como é necessário ao ‘recorrer a elementos contidos em caixas de texto
espaco.AddLine p1, p3 espaco.AddLine p3, p4 espaco.AddLine p4, p5 espaco.AddLine p5, p6
p3(0) = p1(0) + (Val(FJ.Value) + Val(Combo_curso.Value)) / 2: p3(1) = p1(1) - Val(R.Value) / 2 p4(0) = p3(0): p4(1) = p5(1) + Val(R.Value) / 2
ThisDrawing.ActiveLayer = layer_ti
‘primeira instância de mudança de layer para traço interrompido espaco.AddLine p3, p4 ThisDrawing.ActiveLayer = layer_tg espaco.AddLine p6, p8 espaco.AddLine p8, p9 espaco.AddLine p9, p12 espaco.AddLine p12, p1
‘o método AddLine permite desenhar uma linha em AutoCAD, tomando como argumentos os ‘pontos de início e de fim da linha
Set conn = New ADODB.Connection conn.Open "trabcfac_meu", ""
Set rs_diametro = conn.Execute("SELECT * FROM furos where diametro=" & Combo_diametro.Value)
raioi = rs_diametro("diametro_interior") / 2 raioe = rs_diametro("diametro_exterior") / 2
Set rs_diametro = conn.Execute("SELECT * FROM dim_gerais where diametro=" & Combo_diametro.Value)
B = rs_diametro("diametro_B") MM = rs_diametro("diametro_haste") conn.Close
centro1(0) = p1(0) + Val(L.Value): centro1(1) = p1(1) + Val(H.Value) + Val(G.Value) espaco.AddCircle centro1, raioi
espaco.AddArc centro1, raioe, 3.08, 1.6
centro2(0) = p8(0) - Val(L.Value): centro2(1) = p1(1) + Val(H.Value) + Val(G.Value) espaco.AddCircle centro2, raioi
espaco.AddArc centro2, raioe, 1.5, 6.4
‘o método AddArc desenha um arco e recebe como argumentos o ponto correspondente ao ‘centro do arco, o seu raio e o ângulo de início e de fim do arco, por esta ordem.
p13(0) = centro1(0) - raioe - 2: p13(1) = centro1(1) p14(0) = centro1(0) + raioe + 2: p14(1) = centro1(1) ThisDrawing.ActiveLayer = layer_ti
espaco.AddLine p13, p14
p13(0) = centro1(0): p13(1) = centro1(1) - raioe - 2 p14(0) = centro1(0): p14(1) = centro1(1) + raioe + 2 espaco.AddLine p13, p14
p13(0) = centro2(0) - raioe - 2: p13(1) = centro1(1) p14(0) = centro2(0) + raioe + 2: p14(1) = centro1(1) espaco.AddLine p13, p14
p13(0) = centro2(0): p13(1) = centro1(1) - raioe - 2 p14(0) = centro2(0): p14(1) = centro1(1) + raioe + 2 espaco.AddLine p13, p14 ThisDrawing.ActiveLayer = layer_tg p13(0) = p1(0): p13(1) = p1(1) + Val(H.Value) + B / 2 p14(0) = p1(0): p14(1) = p1(1) + Val(H.Value) - B / 2 p15(0) = p1(0) - 2: p15(1) = p13(1) p16(0) = p1(0) - 2: p16(1) = p14(1) espaco.AddLine p13, p15 espaco.AddLine p14, p16 espaco.AddLine p15, p16 espaco.AddLine p2, p11 espaco.AddLine p7, p10
'---Desenho da extremidade da haste - início--- Select Case Combo_tipo_haste.Value
Case 0
conn.Open "trabcfac_meu", ""
Set rs_diametro = conn.Execute("SELECT * FROM dim_haste where diametro=" & Combo_diametro.Value) MM = rs_diametro("diametro_haste") MM1 = rs_diametro("MM1") A1 = rs_diametro("A1") A = rs_diametro("A") KDi = rs_diametro("KDi") KDe = rs_diametro("KDe") 'P = rs_diametro("P") 'D = rs_diametro("D") conn.Close p17(0) = p16(0): p17(1) = p1(1) + Val(H.Value) - MM / 2 p18(0) = p17(0): p18(1) = p1(1) + Val(H.Value) + MM / 2 p19(0) = p18(0) - 2 / 15 * A1: p19(1) = p1(1) + Val(H.Value) + MM1 / 2 p20(0) = p18(0) - 2 / 15 * A1: p20(1) = p1(1) + Val(H.Value) - MM1 / 2 p22(0) = p19(0) - 3 / 4 * A1: p22(1) = p19(1) p21(0) = p22(0): p21(1) = p20(1) p23(0) = p22(0) - 0.2: p23(1) = p22(1) - 0.2 p24(0) = p23(0): p24(1) = p21(1) + 0.2 ex1(0) = p23(0): ex1(1) = p26(1) ex2(0) = p23(0): ex2(1) = p25(1)
p25(0) = p20(0) - A1: p25(1) = p1(1) + Val(H.Value) - KDe / 2 p26(0) = p25(0): p26(1) = p1(1) + Val(H.Value) + KDe / 2 ex1(0) = p23(0): ex1(1) = p26(1) ex2(0) = p23(0): ex2(1) = p25(1) p31(0) = p26(0) - (A - 0.2): p31(1) = p26(1) p32(0) = p26(0) - A: p32(1) = p31(1) - 0.2 p34(0) = p26(0) - (A - 0.2): p34(1) = p25(1) p33(0) = p26(0) - A: p33(1) = p34(1) + 0.2 diametro = ex1(0) - p26(0)
centro3(0) = (p26(0) + ex1(0)) / 2: centro3(1) = p26(1) espaco.AddArc centro3, diametro / 2, 3.14159254, 0 centro3(0) = (p25(0) + ex1(0)) / 2: centro3(1) = p25(1) espaco.AddArc centro3, diametro / 2, 0, 3.14159254 espaco.AddLine p18, p19 espaco.AddLine p17, p20 espaco.AddLine p19, p20 espaco.AddLine p19, p22 espaco.AddLine p20, p21 espaco.AddLine p21, p22 espaco.AddLine p21, p24 espaco.AddLine p22, p23 espaco.AddLine p23, p24 espaco.AddLine p25, p34 espaco.AddLine p34, p33 espaco.AddLine p33, p32 espaco.AddLine p32, p31 espaco.AddLine p31, p26 espaco.AddLine p31, p34 espaco.AddLine p26, p25 p30(0) = p31(0): p30(1) = p1(1) + Val(H.Value) + KDi / 2 p29(0) = p30(0): p29(1) = p1(1) + Val(H.Value) - KDi / 2 p28(0) = p26(0): p28(1) = p29(1)
p27(0) = p26(0): p27(1) = p30(1) espaco.AddLine p30, p27 espaco.AddLine p29, p28 Case 1
Set conn = New ADODB.Connection conn.Open "trabcfac_meu", ""
Set rs_diametro = conn.Execute("SELECT * FROM dim_haste where diametro=" & Combo_diametro.Value) D = rs_diametro("D") Ce = rs_diametro("Ce") Ci = rs_diametro("Ci") MM1 = rs_diametro("MM1") A1 = rs_diametro("A1") conn.Close p17(0) = p16(0): p17(1) = p1(1) + Val(H.Value) - MM / 2 p18(0) = p17(0): p18(1) = p1(1) + Val(H.Value) + MM / 2 nao_sei = 0.2 p19(0) = p18(0) - nao_sei: p19(1) = p1(1) + Val(H.Value) + MM1 / 2 nao_sei = 0.1 p24(0) = p19(0) - A1 + nao_sei: p24(1) = p19(1) p23(0) = p19(0) - A1: p23(1) = p24(1) - nao_sei p22(0) = p23(0): p22(1) = p24(1) - (MM1 - 2 * nao_sei) p21(0) = p24(0): p21(1) = p24(1) - MM1 p20(0) = p19(0): p20(1) = p19(1) - MM1 espaco.AddLine p17, p20 espaco.AddLine p18, p19 espaco.AddLine p19, p24 espaco.AddLine p24, p23 espaco.AddLine p23, p22 espaco.AddLine p22, p21 espaco.AddLine p21, p20 espaco.AddLine p19, p20 espaco.AddLine p24, p21 p13(0) = p24(0): p13(1) = p1(1) + Val(H.Value) + Ce / 2 p14(0) = p24(0): p14(1) = p1(1) + Val(H.Value) - Ce / 2 p15(0) = p13(0) + D: p15(1) = p13(1) p16(0) = p14(0) + D: p16(1) = p14(1) ThisDrawing.ActiveLayer = layer_ti p22(0) = p22(0) - 3: p22(1) = p1(1) + Val(H.Value) p18(0) = p8(0) + 3: p18(1) = p1(1) + Val(H.Value) espaco.AddLine p22, p18 espaco.AddLine p13, p15 espaco.AddLine p14, p16 p13(0) = p24(0): p13(1) = p1(1) + Val(H.Value) + Ce / 2 p14(0) = p24(0): p14(1) = p1(1) + Val(H.Value) - Ce / 2 p15(0) = p13(0) + D: p15(1) = p13(1) p16(0) = p14(0) + D: p16(1) = p14(1) espaco.AddLine p13, p15 espaco.AddLine p14, p16 p13(0) = p24(0): p13(1) = p1(1) + Val(H.Value) + Ci / 2 p14(0) = p24(0): p14(1) = p1(1) + Val(H.Value) - Ci / 2
p15(0) = p13(0) + D: p15(1) = p13(1) p16(0) = p14(0) + D: p16(1) = p14(1) espaco.AddLine p13, p15 espaco.AddLine p14, p16 espaco.AddLine p15, p16 p13(0) = p2(0) espaco.AddLine p13, p15 p14(0) = p2(0) espaco.AddLine p14, p16
p18(0) = p13(0) + (Ci / 2) * Tan(3.14159254 * 30 / 180): p18(1) = p1(1) + Val(H.Value) espaco.AddLine p13, p18
espaco.AddLine p18, p14 End Select
'---Desenho da extremidade da haste – fim---
'---VISTA DE FRENTE - fim---
Nota: O comando Set espaco = ThisDrawing.ModelSpace é sempre usado por motivos de
economia de espaço para a execução dos comandos que permitem desenhar no
AutoCAD.
Vista de cima
'---VISTA DE CIMA - início--- Dim layer_tg As AcadLayer
Dim layer_ti As AcadLayer
Set layer_tg = ThisDrawing.Layers.Add("tg") Set layer_ti = ThisDrawing.Layers.Add("ti") ThisDrawing.ActiveLayer = layer_tg UserForm1.Hide
MsgBox ("seleccione o ponto de inserção da vista de cima") p1 = ThisDrawing.Utility.GetPoint(, "")
'UserForm1.Show
Set conn = New ADODB.Connection conn.Open "trabcfac_meu", ""
Set rs_diametro = conn.Execute("SELECT * FROM dim_gerais where diametro=" & Combo_diametro.Value) I = rs_diametro("I") B = rs_diametro("diametro_B") conn.Close p2(0) = p1(0) + I: p2(1) = p1(1) p8(0) = p1(0) + Val(FJ.Value) + Val(Combo_curso.Value): p8(1) = p1(1) p7(0) = p8(0) - I: p7(1) = p8(1) p9(0) = p8(0): p9(1) = p8(1) + Val(XB.Value) + 2 * Val(ST.Value) p10(0) = p9(0) - I: p10(1) = p9(1) p12(0) = p9(0) - (Val(FJ.Value) + Val(Combo_curso.Value)): p12(1) = p9(1) p11(0) = p12(0) + I: p11(1) = p12(1)
espaco.AddLine p2, p11 espaco.AddLine p7, p10 espaco.AddLine p1, p8 espaco.AddLine p8, p9 espaco.AddLine p9, p12 espaco.AddLine p12, p1
p14(0) = p1(0)+(Val(FJ.Value)+ Val(Combo_curso.Value)) / 2 - Val(Q.Value) / 2: p14(1) = p1(1) p13(0) = p14(0): p13(1) = p14(1) + Val(XB.Value) + 2 * Val(ST.Value) p15(0) = p13(0) + Val(Q.Value): p15(1) = p13(1) p16(0) = p14(0) + Val(Q.Value): p16(1) = p14(1) ThisDrawing.ActiveLayer = layer_ti espaco.AddLine p13, p14 espaco.AddLine p15, p16 p13(0) = (p14(0) + p16(0)) / 2: p13(1) = p14(1) + Val(XB.Value) + 2 * Val(ST.Value) + 2 p14(0) = p13(0): p14(1) = p14(1) - 2 espaco.AddLine p13, p14 ThisDrawing.ActiveLayer = layer_tg
centro1(0) = p1(0) + (Val(FJ.Value) + Val(Combo_curso.Value)) / 2 - Val(XA.Value) / 2: centro1(1) = p1(1) + (Val(XB.Value) + 2 * Val(ST.Value)) / 2 - Val(XB.Value) / 2
centro2(0) = centro1(0) + Val(XA.Value): centro2(1) = centro1(1) centro3(0) = centro2(0): centro3(1) = centro2(1) + Val(XB.Value) centro4(0) = centro1(0): centro4(1) = centro3(1)
raio = 2 * Val(ST.Value) / 2
p13(0) = centro1(0) - raio - 2: p13(1) = centro1(1) p14(0) = centro1(0) + raio + 2: p14(1) = centro1(1) ThisDrawing.ActiveLayer = layer_ti
espaco.AddLine p13, p14
p13(0) = centro1(0): p13(1) = centro1(1) - raio - 2 p14(0) = centro1(0): p14(1) = centro1(1) + raio + 2 espaco.AddLine p13, p14
p13(0) = centro2(0): p13(1) = centro2(1) - raio - 2 p14(0) = centro2(0): p14(1) = centro2(1) + raio + 2 espaco.AddLine p13, p14
p13(0) = centro3(0): p13(1) = centro3(1) - raio - 2 p14(0) = centro3(0): p14(1) = centro3(1) + raio + 2 espaco.AddLine p13, p14
p13(0) = centro4(0): p13(1) = centro4(1) - raio - 2 p14(0) = centro4(0): p14(1) = centro4(1) + raio + 2 espaco.AddLine p13, p14
p13(0) = centro3(0) - raio - 2: p13(1) = centro3(1) p14(0) = centro3(0) + raio + 2: p14(1) = centro3(1) espaco.AddLine p13, p14
p13(0) = centro4(0) - raio - 2: p13(1) = centro4(1) p14(0) = centro4(0) + raio + 2: p14(1) = centro4(1) espaco.AddLine p13, p14
p13(0) = centro2(0) - raio - 2: p13(1) = centro2(1) p14(0) = centro2(0) + raio + 2: p14(1) = centro2(1) espaco.AddLine p13, p14
ThisDrawing.ActiveLayer = layer_tg
espaco.AddCircle centro1, Val(ST.Value) / 2 espaco.AddCircle centro2, Val(ST.Value) / 2 espaco.AddCircle centro3, Val(ST.Value) / 2 espaco.AddCircle centro4, Val(ST.Value) / 2 espaco.AddArc centro1, raio, 0, 3.141592655
espaco.AddArc centro2, raio, 0, 3.141592655 espaco.AddArc centro3, raio, 3.141592655, 0 espaco.AddArc centro4, raio, 3.141592655, 0 '[(XB+2*ST) - XB]=ST
p3(0) = centro1(0) - raio: p3(1) = centro1(1) p4(0) = p3(0): p4(1) = p3(1) - Val(ST.Value) espaco.AddLine p3, p4 p3(0) = p3(0) + 2 * raio p4(0) = p4(0) + 2 * raio espaco.AddLine p3, p4 p3(0) = centro2(0) - raio p4(0) = p3(0): p4(1) = p3(1) - Val(ST.Value) espaco.AddLine p3, p4 p3(0) = p3(0) + 2 * raio p4(0) = p4(0) + 2 * raio espaco.AddLine p3, p4
p3(0) = centro3(0) - raio: p3(1) = centro3(1) p4(0) = p3(0): p4(1) = p3(1) + Val(ST.Value) espaco.AddLine p3, p4 p3(0) = p3(0) + 2 * raio p4(0) = p4(0) + 2 * raio espaco.AddLine p3, p4 p3(0) = centro4(0) - raio p4(0) = p3(0): p4(1) = p3(1) + Val(ST.Value) espaco.AddLine p3, p4 p3(0) = p3(0) + 2 * raio p4(0) = p4(0) + 2 * raio espaco.AddLine p3, p4 p13(0) = p1(0): p13(1) = p1(1) + (Val(XB.Value) + 2 * Val(ST.Value)) / 2 + B / 2 p14(0) = p1(0): p14(1) = p1(1) + (Val(XB.Value) + 2 * Val(ST.Value)) / 2 - B / 2 p15(0) = p1(0) - 2: p15(1) = p13(1) p16(0) = p1(0) - 2: p16(1) = p14(1) espaco.AddLine p13, p15 espaco.AddLine p14, p16 espaco.AddLine p15, p16
'---Desenho da extremidade da haste - início--- Select Case Combo_tipo_haste.Value
Case 0
Set conn = New ADODB.Connection conn.Open "trabcfac_meu", ""
Set rs_diametro = conn.Execute("SELECT * FROM dim_haste where diametro=" & Combo_diametro.Value) MM = rs_diametro("diametro_haste") MM1 = rs_diametro("MM1") A1 = rs_diametro("A1") A = rs_diametro("A") KDi = rs_diametro("KDi") KDe = rs_diametro("KDe") conn.Close p17(0) = p16(0): p17(1) = p1(1) + (Val(XB.Value) + 2 * Val(ST.Value)) / 2 - MM / 2
p18(0) = p17(0): p18(1) = p1(1) + (Val(XB.Value) + 2 * Val(ST.Value)) / 2 + MM / 2
p19(0) = p18(0) - 2 / 15 * A1: p19(1)=p1(1) + (Val(XB.Value) + 2 * Val(ST.Value)) / 2 + MM1 / 2 p20(0) = p18(0) - 2 / 15 * A1: p20(1)=p1(1) + (Val(XB.Value) + 2 * Val(ST.Value)) / 2 - MM1 / 2 p22(0) = p19(0) - 3 / 4 * A1: p22(1) = p19(1) p21(0) = p22(0): p21(1) = p20(1) p23(0) = p22(0) - 0.2: p23(1) = p22(1) - 0.2 p24(0) = p23(0): p24(1) = p21(1) + 0.2 ex1(0) = p23(0): ex1(1) = p26(1) ex2(0) = p23(0): ex2(1) = p25(1)
p25(0) = p20(0) - A1: p25(1) = p1(1) + (Val(XB.Value) + 2 * Val(ST.Value)) / 2 - KDe / 2 p26(0) = p25(0): p26(1) = p1(1) + (Val(XB.Value) + 2 * Val(ST.Value)) / 2 + KDe / 2 ex1(0) = p23(0): ex1(1) = p26(1) ex2(0) = p23(0): ex2(1) = p25(1) p31(0) = p26(0) - (A - 0.2): p31(1) = p26(1) p32(0) = p26(0) - A: p32(1) = p31(1) - 0.2 p34(0) = p26(0) - (A - 0.2): p34(1) = p25(1) p33(0) = p26(0) - A: p33(1) = p34(1) + 0.2 diametro = ex1(0) - p26(0)
centro3(0) = (p26(0) + ex1(0)) / 2: centro3(1) = p26(1) espaco.AddArc centro3, diametro / 2, 3.14159254, 0 centro3(0) = (p25(0) + ex1(0)) / 2: centro3(1) = p25(1) espaco.AddArc centro3, diametro / 2, 0, 3.14159254 espaco.AddLine p18, p19 espaco.AddLine p17, p20 espaco.AddLine p19, p20 espaco.AddLine p19, p22 espaco.AddLine p20, p21 espaco.AddLine p21, p22 espaco.AddLine p21, p24 espaco.AddLine p22, p23 espaco.AddLine p23, p24 espaco.AddLine p25, p34 espaco.AddLine p34, p33 espaco.AddLine p33, p32 espaco.AddLine p32, p31 espaco.AddLine p31, p26 espaco.AddLine p31, p34 espaco.AddLine p26, p25
p30(0) = p31(0): p30(1) = p1(1) + (Val(XB.Value) + 2 * Val(ST.Value)) / 2 + KDi / 2 p29(0) = p30(0): p29(1) = p1(1) + (Val(XB.Value) + 2 * Val(ST.Value)) / 2 - KDi / 2 p28(0) = p26(0): p28(1) = p29(1) p27(0) = p26(0): p27(1) = p30(1) espaco.AddLine p30, p27 espaco.AddLine p29, p28 p35(0) = p34(0) - 4: p35(1) = p1(1) + (Val(XB.Value) + 2 * Val(ST.Value)) / 2 p36(0) = p8(0) + 4: p36(1) = p1(1) + (Val(XB.Value) + 2 * Val(ST.Value)) / 2 ThisDrawing.ActiveLayer = layer_ti espaco.AddLine p35, p36 ThisDrawing.ActiveLayer = layer_tg Case 1
Set conn = New ADODB.Connection conn.Open "trabcfac_meu", ""
Set rs_diametro = conn.Execute("SELECT * FROM dim_haste where diametro=" & Combo_diametro.Value) D = rs_diametro("D") Ce = rs_diametro("Ce") Ci = rs_diametro("Ci") MM1 = rs_diametro("MM1") MM = rs_diametro("diametro_haste") A1 = rs_diametro("A1") conn.Close p17(0) = p16(0): p17(1) = p1(1) + (Val(XB.Value) + 2 * Val(ST.Value)) / 2 - MM / 2 p18(0) = p17(0): p18(1) = p1(1) + (Val(XB.Value) + 2 * Val(ST.Value)) / 2 + MM / 2 nao_sei = 0.2
p19(0) = p18(0) - nao_sei: p19(1) = p1(1) + (Val(XB.Value) + 2 * Val(ST.Value)) / 2 + MM1 / 2 nao_sei = 0.1 p24(0) = p19(0) - A1 + nao_sei: p24(1) = p19(1) p23(0) = p19(0) - A1: p23(1) = p24(1) - nao_sei p22(0) = p23(0): p22(1) = p24(1) - (MM1 - 2 * nao_sei) p21(0) = p24(0): p21(1) = p24(1) - MM1 p20(0) = p19(0): p20(1) = p19(1) - MM1 espaco.AddLine p17, p20 espaco.AddLine p18, p19 espaco.AddLine p19, p24 espaco.AddLine p24, p23 espaco.AddLine p23, p22 espaco.AddLine p22, p21 espaco.AddLine p21, p20 espaco.AddLine p19, p20 espaco.AddLine p24, p21 ThisDrawing.ActiveLayer = layer_ti p22(0) = p22(0) - 3: p22(1) = p1(1) + (Val(XB.Value) + 2 * Val(ST.Value)) / 2 p18(0) = p8(0) + 3: p18(1) = p1(1) + (Val(XB.Value) + 2 * Val(ST.Value)) / 2 espaco.AddLine p22, p18 ThisDrawing.ActiveLayer = layer_tg p13(0) = p24(0): p13(1) = p1(1) + (Val(XB.Value) + 2 * Val(ST.Value)) / 2 + Ce / 2 p14(0) = p24(0): p14(1) = p1(1) + (Val(XB.Value) + 2 * Val(ST.Value)) / 2 - Ce / 2 p15(0) = p13(0) + D: p15(1) = p13(1) p16(0) = p14(0) + D: p16(1) = p14(1) espaco.AddLine p13, p15 espaco.AddLine p14, p16 p13(0) = p24(0): p13(1) = p1(1) + (Val(XB.Value) + 2 * Val(ST.Value)) / 2 + Ci / 2 p14(0) = p24(0): p14(1) = p1(1) + (Val(XB.Value) + 2 * Val(ST.Value)) / 2 - Ci / 2 p15(0) = p13(0) + D: p15(1) = p13(1) p16(0) = p14(0) + D: p16(1) = p14(1) ThisDrawing.ActiveLayer = layer_ti espaco.AddLine p13, p15 espaco.AddLine p14, p16 p13(0) = p24(0): p13(1) = p1(1) + (Val(XB.Value) + 2 * Val(ST.Value)) / 2 + Ci / 2 p14(0) = p24(0): p14(1) = p1(1) + (Val(XB.Value) + 2 * Val(ST.Value)) / 2 - Ci / 2 p15(0) = p13(0) + D: p15(1) = p13(1) p16(0) = p14(0) + D: p16(1) = p14(1) espaco.AddLine p13, p15 espaco.AddLine p14, p16 espaco.AddLine p15, p16
p13(0) = p2(0)
espaco.AddLine p13, p15 p14(0) = p2(0)
espaco.AddLine p14, p16
p18(0) = p13(0) + (Ci / 2) * Tan(3.14159254 * 30 / 180): p18(1) = p1(1) + (Val(XB.Value) + 2 * Val(ST.Value)) / 2
espaco.AddLine p13, p18 espaco.AddLine p18, p14 End Select
'---Desenho da extremidade da haste – fim---
'---VISTA DE CIMA - fim---
Vista lateral
'---VISTA LATERAL- início---
Dim layer_tg As AcadLayer Dim layer_ti As AcadLayer
Set layer_tg = ThisDrawing.Layers.Add("tg") Set layer_ti = ThisDrawing.Layers.Add("ti") ThisDrawing.ActiveLayer = layer_tg UserForm1.Hide
MsgBox ("seleccione o ponto de inserção da vista lateral") p1 = ThisDrawing.Utility.GetPoint(, "")
chanfro = 1.6
lado = Val(XB.Value) + 2 * Val(ST.Value) p2(0) = p1(0) + lado - 2 * chanfro: p2(1) = p1(1) p3(0) = p2(0) + chanfro: p3(1) = p2(1) + chanfro p4(0) = p3(0): p4(1) = p3(1) + 2 * Val(H.Value) - 2 * chanfro p5(0) = p4(0) - chanfro: p5(1) = p4(1) + chanfro p6(0) = p1(0): p6(1) = p5(1) p7(0) = p6(0) - chanfro: p7(1) = p6(1) - chanfro p8(0) = p7(0): p8(1) = p3(1) espaco.AddLine p1, p2 espaco.AddLine p2, p3 espaco.AddLine p3, p4 espaco.AddLine p4, p5 espaco.AddLine p5, p6 espaco.AddLine p6, p7 espaco.AddLine p7, p8 espaco.AddLine p8, p1
Set conn = New ADODB.Connection conn.Open "trabcfac_meu", ""
Set rs_diametro = conn.Execute("SELECT * FROM dim_gerais where diametro=" & Combo_diametro.Value)
B = rs_diametro("diametro_b") U = rs_diametro("U")
Combo_diametro.Value)
raioi = rs_diametro("diametro_interior") / 2 raioe = rs_diametro("diametro_exterior") / 2
Set rs_diametro = conn.Execute("SELECT * FROM dim_haste where diametro=" & Combo_diametro.Value) MM1 = rs_diametro("MM1") MM = rs_diametro("diametro_haste") P = rs_diametro("P") conn.Close centro(0) = (p1(0) + p2(0)) / 2: centro(1) = (p8(1) + p7(1)) / 2 espaco.AddCircle centro, B / 2 espaco.AddCircle centro, MM / 2 espaco.AddCircle centro, P / 2
espaco.AddCircle centro, (P / 2) - (raioe - raioi)
p8(0) = (p1(0) + p2(0)) / 2: p8(1) = p1(1) + Val(H.Value) + P / 2 p9(0) = p8(0) - Sqr((MM / 2) ^ 2 - (P / 2) ^ 2): p9(1) = p8(1) espaco.AddLine p8, p9 p9(0) = p8(0) + Sqr((MM / 2) ^ 2 - (P / 2) ^ 2) espaco.AddLine p8, p9 p8(0) = (p1(0) + p2(0)) / 2: p8(1) = p1(1) + Val(H.Value) - P / 2 p9(0) = p8(0) - Sqr((MM / 2) ^ 2 - (P / 2) ^ 2): p9(1) = p8(1) espaco.AddLine p8, p9 p9(0) = p8(0) + Sqr((MM / 2) ^ 2 - (P / 2) ^ 2) espaco.AddLine p8, p9 p8(0) = (p1(0) + p2(0)) / 2 + P / 2: p8(1) = p1(1) + Val(H.Value) + Sqr((MM / 2) ^ 2 - (P / 2) ^ 2) p9(0) = p8(0): p9(1) = p1(1) + Val(H.Value) - Sqr((MM / 2) ^ 2 - (P / 2) ^ 2) espaco.AddLine p8, p9 p8(0) = (p1(0) + p2(0)) / 2 - P / 2: p8(1) = p1(1) + Val(H.Value) + Sqr((MM / 2) ^ 2 - (P / 2) ^ 2) p9(0) = p8(0): p9(1) = p1(1) + Val(H.Value) - Sqr((MM / 2) ^ 2 - (P / 2) ^ 2) espaco.AddLine p8, p9 ThisDrawing.ActiveLayer = layer_ti p8(0) = (p1(0) + p2(0)) / 2 - Val(N.Value) - raioe: p8(1) = p1(1) p9(0) = p8(0) + (raioe - raioi): p9(1) = p8(1) p11(0) = (p1(0) + p2(0)) / 2 - Val(N.Value) + raioe: p11(1) = p1(1) p10(0) = p11(0) - (raioe - raioi): p10(1) = p11(1) p15(0) = p8(0): p15(1) = p8(1) + Val(H.Value) - U / 2 p12(0) = p11(0): p12(1) = p15(1) p13(0) = p10(0): p13(1) = p12(1) + raioe - raioi p14(0) = p9(0): p14(1) = p15(1) + raioe - raioi p16(0) = p9(0): p16(1) = p14(1) - (raioe - raioi) p17(0) = p10(0): p17(1) = p13(1) - (raioe - raioi) espaco.AddLine p8, p15 espaco.AddLine p15, p14 espaco.AddLine p14, p13 espaco.AddLine p13, p12 espaco.AddLine p12, p11 espaco.AddLine p10, p17 espaco.AddLine p9, p16 espaco.AddLine p16, p17 p9(0) = (p9(0) + p10(0)) / 2: p9(1) = p9(1) - 2 p14(0) = (p14(0) + p13(0)) / 2: p14(1) = p14(1) + 10 espaco.AddLine p9, p14 p14(0) = p14(0) - 1: p14(1) = p14(1) - 10
p9(0) = p14(0): p9(1) = p14(1) + 8 espaco.AddLine p9, p14 p14(0) = p14(0) + 2 p9(0) = p14(0) espaco.AddLine p9, p14 p18(0) = p7(0) - 2: p18(1) = p1(1) + Val(H.Value) p19(0) = p3(0) + 2: p19(1) = p18(1) espaco.AddLine p18, p19 p18(0) = (p5(0) + p6(0)) / 2: p18(1) = p6(1) + 2 p19(0) = (p1(0) + p2(0)) / 2: p19(1) = p1(1) - 2 espaco.AddLine p18, p19
p18(0) = p7(0): p18(1) = p1(1) + Val(H.Value) + Val(G.Value) + raioe p19(0) = p18(0): p19(1) = p18(1) - (raioe - raioi)
p21(0) = p19(0): p21(1) = p1(1) + Val(H.Value) + Val(G.Value) - raioe p20(0) = p18(0): p20(1) = p21(1) + (raioe - raioi) p22(0) = p21(0) + (p15(1) - p8(1)): p22(1) = p21(1) p23(0) = p22(0) + raioe - raioi: p23(1) = p20(1) p24(0) = p23(0): p24(1) = p19(1) p25(0) = p22(0): p25(1) = p18(1) p26(0) = p22(0): p26(1) = p19(1) p27(0) = p22(0): p27(1) = p20(1) espaco.AddLine p18, p25 espaco.AddLine p25, p24 espaco.AddLine p24, p23 espaco.AddLine p23, p22 espaco.AddLine p22, p21 espaco.AddLine p20, p27 espaco.AddLine p19, p26 espaco.AddLine p26, p27 p19(0) = p19(0) - 2: p19(1) = (p19(1) + p20(1)) / 2 p26(0) = p26(0) + 14: p26(1) = (p26(1) + p27(1)) / 2 espaco.AddLine p26, p19 p26(0) = p24(0): p26(1) = (p23(1) + p24(1)) / 2 + 1 p25(0) = p26(0) + 12: p25(1) = p26(1) espaco.AddLine p26, p25 p26(1) = (p23(1) + p24(1)) / 2 - 1 p25(0) = p26(0) + 12: p25(1) = p26(1) espaco.AddLine p26, p25 p2(0) = p2(0) - 1 p4(1) = p5(1) - 0.9 * Val(ST.Value) p5(0) = p2(0): p5(1) = p4(1) p8(0) = p5(0) - Val(ST.Value): p8(1) = p5(1) p7(0) = p4(0) - Val(ST.Value) - 2 * chanfro - 2: p7(1) = p4(1) p10(0) = p7(0): p10(1) = p6(1) p9(0) = p2(0) - Val(ST.Value): p9(1) = p2(1) espaco.AddLine p2, p5 espaco.AddLine p4, p7 espaco.AddLine p7, p10 espaco.AddLine p9, p8 p2(0) = (p2(0) + p9(0)) / 2: p2(1) = p2(1) - 2 p3(0) = p2(0): p3(1) = p10(1) + 2 espaco.AddLine p2, p3
'---VISTA LATERAL - fim---
Final - desenho das vistas
Antes de terminar o desenho de uma vista, é dada ao utilizador a possibilidade de
efectuar um zoom ao desenho, em particular um Zoom Extents, como se pode ver através
da seguinte imagem:
Fig. 7 – Possibilidade de zoom no final do desenho.
Assim, antes de terminar a subrotina de uma vista, utiliza-se o seguinte código:
Continue = MsgBox("Zoom extents ao desenho?", vbYesNo + vbQuestion, "Zoom?") If Continue = vbNo Then
End
ElseIf Continue = vbYes Then
ThisDrawing.SendCommand "Zoom " & "Extents " ThisDrawing.Regen (acActiveViewport)
End End If