Macros
Uma metodologia também utilizada para gerar asas de parâmetros variáveis quer controlados pelo utilizador quer gerados aleatoriamente pelo código VBA desenvolvido, código esse cujas partes principais serão comentadas nesta página.
Sub main()
' Inicialização do Solidworks e do documento
Set swApp = Application.SldWorks
Set Part = swApp.ActiveDoc
' Atribuição de um valor à variável chord
chord = 20.5
' Início da primeira curva com aplicação da escala (chord)
' Não foi possível multiplicar diretamente as coordenadas da curva pela chord ( boolstatus = Part.InsertCurveFilePoint(0.001*chord ,0*chord, 0*chord) ) pelo que se optou por atribuir o valor da multiplicação a variáveis que foram utilizadas como as coordenadas dos pontos a inserir
Part.InsertCurveFileBegin
x = 0.001 * chord: y = 0 * chord: z = 0 * chord
boolstatus = Part.InsertCurveFilePoint(x, y, z)
x = 0.00095042 * chord: y = 0.00001245 * chord: z = 0 * chord
boolstatus = Part.InsertCurveFilePoint(x, y, z)
' Continuação dos pontos da primeira curva
boolstatus = Part.InsertCurveFileEnd() ' Finalização da primeira curva
' Início da segunda curva com aplicação da escala (chord)
Part.InsertCurveFileBegin
x = 0 * chord: y = 0 * chord: z = 0 * chord
boolstatus = Part.InsertCurveFilePoint(x, y, z)
x = 0.00000795 * chord: y = -0.00001017 * chord: z = 0 * chord
boolstatus = Part.InsertCurveFilePoint(x, y, z)
' Continuação dos pontos da segunda curva
boolstatus = Part.InsertCurveFileEnd() ' Finalização da segunda curva
' Visualização nomeada e zoom para ajustar
Part.ShowNamedView2 "*Trimetric", 8
Part.ViewZoomtofit2
' Criação do sketch no Front Plane
boolstatus = Part.Extension.SelectByID2("Front Plane", "PLANE", 0, 0, 0, False, 0, Nothing, 0)
Part.SketchManager.InsertSketch True
' Converter cada curva numa entidade de esboço
boolstatus = Part.Extension.SelectByID2("Curve1", "REFERENCECURVES", 0, 0, 0, False, 0, Nothing, 0)
boolstatus = Part.Extension.SelectByID2("Curve2", "REFERENCECURVES", 0, 0, 0, True, 0, Nothing, 0)
Part.SketchManager.SketchUseEdge3 False, False ' Convert curves to sketch entities
' Finalizar o sketch
Part.SketchManager.InsertSketch False
' Recuperar o último esboço criado dinamicamente
Set swSketch = Part.FeatureByPositionReverse(0) ' Get the most recent feature, which should be the sketch
swSketch.Select2 False, 0
' Atribuição de um valor à variável envergadura
envergadura = 0.1
' Execução da extrusão no sketch selecionado considerando que a profundidade dessa extrusão assume o valor da variável envergadura
Set swFeature = Part.FeatureManager.FeatureExtrusion2(True, False, False, 0, 0, envergadura, 0, False, False, False, False, 0, 0, False, False, False, False, True, True, True, 0, 0, False)
Part.SelectionManager.EnableContourSelection = False
End Sub
A asa obtida através deste código foi:
De seguida tentámos fazer uma asa que tivesse uma chord da ponta diferente da chord da raiz
' Atribuição de um valor à variável chord2 (chord do airfoil da ponta)
chord2 = 10.5
' As curvas da ponta assumem z=envergadura
' Início da terceira curva com aplicação da escala (chord2)
Part.InsertCurveFileBegin
x = 0.001 * chord2: y = 0 * chord2: z = envergadura
boolstatus = Part.InsertCurveFilePoint(x, y, z)
x = 0.00095042 * chord2: y = 0.00001245 * chord2: z = envergadura
boolstatus = Part.InsertCurveFilePoint(x, y, z)
' Continuação dos pontos da terceira curva
boolstatus = Part.InsertCurveFileEnd() ' Finalização da terceira curva
' Início da quarta curva com aplicação da escala (chord2)
Part.InsertCurveFileBegin
x = 0 * chord2: y = 0 * chord2: z = envergadura
boolstatus = Part.InsertCurveFilePoint(x, y, z)
x = 0.00000795 * chord2: y = -0.00001017 * chord2: z = envergadura
boolstatus = Part.InsertCurveFilePoint(x, y, z)
' Continuação dos pontos da quarta curva
boolstatus = Part.InsertCurveFileEnd() ' Finalização da quarta curva
Set swFeatMgr = swModel.FeatureManager
' Criação de um plano com um offset de valor igual à envergadura a partir do Front Plane de forma a este novo plano ficar coincidente com a terceira e a quarta curva
boolstatus = swModel.Extension.SelectByID2("Front Plane", "PLANE", 0, 0, 0, False, 0, Nothing, 0)
Set swPlane = swFeatMgr.InsertRefPlane(8, envergadura, 0, 0, 0, 0) ' Create offset plane 1
' Selecionar o plano novo
boolstatus = Part.Extension.SelectByID2(swPlane.Name, "PLANE", 0, 0, 0, False, 0, Nothing, 0)
' Criar um sketch no novo plano
Part.SketchManager.InsertSketch True
' Converter cada curva numa entidade de esboço
boolstatus = Part.Extension.SelectByID2("Curve3", "REFERENCECURVES", 0, 0, 0, False, 0, Nothing, 0)
boolstatus = Part.Extension.SelectByID2("Curve4", "REFERENCECURVES", 0, 0, 0, True, 0, Nothing, 0)
Part.SketchManager.SketchUseEdge3 False, False
' Finalização do sketch
Part.SketchManager.InsertSketch False
' Selecione esboços por ordem para fazer o loft
boolstatus = swModel.Extension.SelectByID2("Sketch1", "SKETCH", 0, 0, 0, False, 1, Nothing, 0)
boolstatus = swModel.Extension.SelectByID2("Sketch2", "SKETCH", 0, 0, 0, True, 1, Nothing, 0)
' Criação o Lofted Boss
Set swFeature = swDoc.FeatureManager.InsertProtrusionBlend2(False, True, True, 0, 0, 0, 0, 0, True, True, False, 0, 0, 0, True, True, True, 0)
Infelizmente após diversos esforços não foi possível obter a asa desejada, possivelmente devido ao erro na criação do plano, que quer através do offset quer através de um plano paralelo ao Front Plane fica coincidente com este.
Caso se resolvesse o erro, seria então feito um mirror do loft segundo o plano frontal.
' Selecionar o loft para fazer mirror
boolstatus = Part.Extension.SelectByID2(swFeature.Name, "BODYFEATURE", 0, 0, 0, False, 0, Nothing, 0)
' Selecionar o plano de reflexão (Front Plane)
boolstatus = Part.Extension.SelectByID2("Front Plane", "PLANE", 0, 0, 0, True, 0, Nothing, 0)
' Execução do mirror
Set swMirrorFeature = swFeatMgr.InsertMirrorFeature()
O objetivo final (que não foi alcançado devido aos problemas encontrados) era fazer com que o código gerasse uma matriz de asas cujas dimensões eram aleatoriamente geradas.
'Função para obter variação aleatória entre 25% e 125% do valor base
Function RandomizeRadius(baseValue As Double) As Double
RandomizeRadius = baseValue * (0.25 + Rnd)
End Function
Sub main()
' Inicialização do Solidworks e do documento
Set swApp = Application.SldWorks
Set Part = swApp.ActiveDoc
' Definir os parâmetros do modelo
Dim grid As Integer: grid = 3 ' tamanho da matriz quadrada
chord = 20.5
chord2 = 10.5
envergadura = 0.1
' Definir o tamanho da matriz e distância entre elementos
Dim gridRows As Integer: gridRows = grid
Dim gridCols As Integer: gridCols = grid
Dim gridSpacing As Double: gridSpacing = 1 ' Distância dos entre os elementos da matriz (em metros)
Randomize
Dim i As Integer, j As Integer
For i = 0 To gridRows - 1 For j = 0 To gridCols - 1
Dim xOffset As Double: xOffset = i * gridSpacing
Dim yOffset As Double: yOffset = j * gridSpacing
Next j
Next i
End Sub
Como considerações finais podemos concluir que este método é bastante complexo e pouco intuitivo, pelo que para projetos simples e curtos como este, não compensa utilizar esta metodologia ao invés da tradicional modelação, já que não facilita nem acelera o processo.
