c# - planos - proyectos en solidworks para descargar
Complemento Solidworks C#- EnvĂo de una cadena a una macro (1)
Solidworks admite 2 tipos de archivos de macro VB
- swp - versión más reciente
swb - macro antigua de texto plano, aquí hay un ejemplo de la macro swb vacía:
Dim swApp As Object Dim swModel As SldWorks.ModelDoc2 Sub main() Set swApp = Application.SldWorks Set swModel = swApp.ActiveDoc End Sub
Si tiene acceso al código fuente de sus macros, puede convertirlas a texto sin formato y dejarlas en marcadores de posición.
MsgBox "--MyParameter1--"
Después de que el usuario complete los parámetros en su panel de tareas, reemplace los marcadores de posición en la macro de swb con los valores reales y ejecútelos.
Actualmente estoy trabajando en un nuevo panel de tareas de Solidworks, principalmente implementando algunas macros "antiguas" que he escrito en un formato más conveniente. Algunos de estos requieren la entrada del usuario a través de cuadros de texto que me gustaría incluir en el panel de tareas.
El problema es que no puedo encontrar una forma de escribir un archivo de borrador o importar estas cadenas en mis macros (que prefiero no tomarme un tiempo para reescribir)
¿Hay alguna otra forma de enviar estas cadenas a mis macros? Addin está en C #, y actualmente estoy usando el método "RunMacro2" de Solidworks.
¡Gracias!
EDITAR: Agregar algunos fragmentos de código a continuación. La macro principal en cuestión está destinada a propagar archivos de propiedad personalizados en un ensamblaje completo.
namespace Efficiency_Interface
{
[ComVisible(true)]
[ProgId(ProjMan_Tab_PROGID)]
public partial class Project_Management_Tab : UserControl
{
SwAddin SolidRun = new SwAddin();
public const string ProjMan_Tab_PROGID = "Proj Management";
public const string scratchFile = "C://keyStoneAddinScratch.txt";
StreamWriter writeText = new StreamWriter(scratchFile);
public Project_Management_Tab()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
foreach (var textBox in this.Controls.OfType<TextBox>())
{
writeText.WriteLine(textBox.Text);
}
writeText.Close();
SolidRun.runGen("proc");
}
}
}
Lo anterior es el código base para mi panel de tareas. A continuación se muestra el fragmento de código de mi principal clase de complemento, también contiene el código de uno de mis otros botones.
public void runCreate4Pack()
{
iSwApp.RunMacro2(macroPath + "CREATE 4 SIZE PACKAGE.swp", "", "", 0, out runMacroError);
return;
}
public void runGen(string procName)
{
iSwApp.RunMacro2(macroPath + "Efficiency Interface.swp", "hitButton", procName, 0, out runMacroError);
File.Delete("C://Users//Public//keyStoneAddinScratch.txt");
return;
}
Finalmente, es el código principal de la macro con la que trato de interactuar.
Private Sub fillProps_Click()
Dim doneParts() As Variant
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
Set part = swApp.ActiveDoc
If firstAssem = "" Then
referenceList (0)
End If
i = 0
ReDim Preserve doneParts(1)
Set custPropMgr = part.Extension.CustomPropertyManager(part.GetActiveConfiguration.name)
setProps "", "", ""
While i <= 1000 And Not assemComps(i, j) = ""
parentAssemNum = Left(assemComps(i, 0), InStrRev(assemComps(i, 0), ".") - 1)
parentAssemDesc = assemComps(i, 1)
j = 2
While j <= 10000 And Not assemComps(i, j) = ""
k = 0
While k < UBound(doneParts())
If doneParts(k) = assemComps(i, j) Then
GoTo skipEntry
End If
k = k + 1
Wend
Set part = swApp.ActivateDoc3(assemComps(i, j), True, 1, 1)
If part.GetType = 1 Then
Set swpartdoc = part
End If
If InStr(part.IGetActiveConfiguration.name, "Default") > 0 Then
Set custPropMgr = part.Extension.CustomPropertyManager("")
End If
Debug.Print custPropMgr.Get("Description")
setProps parentAssemNum + "", parentAssemDesc + "", ""
ReDim Preserve doneParts(UBound(doneParts) + 1)
doneParts(UBound(doneParts)) = assemComps(i, j)
If i > 0 Or j > 0 Then
swApp.QuitDoc (assemComps(i, j))
End If
skipEntry:
j = j + 1
Wend
i = i + 1
Wend
End Sub
Sub setProps(parentAssemNum As String, parentAssemDesc As String, stockSize As String)
If custPropMgr.Get("StockSize") = "" Then
If part.GetType = swDocPART Then
If swpartdoc.IsWeldment = False Then
Dim sizeArray(2)
vboundbox = swpartdoc.GetPartBox(False)
size1 = Round(Abs(vboundbox(0) - vboundbox(3)), 2)
size2 = Round(Abs(vboundbox(1) - vboundbox(4)), 2)
size3 = Round(Abs(vboundbox(2) - vboundbox(5)), 2)
sizeArray(0) = size1
sizeArray(1) = size2
sizeArray(2) = size3
rectVol = size1 * size2 * size3
Set swmass = part.Extension.CreateMassProperty
swmass.UseSystemUnits = False
swVol = swmass.Volume
QuickSort sizeArray, LBound(sizeArray), UBound(sizeArray)
eq = 0
If size1 = size2 Then
eq = 1
cylVol = 3.14159 * ((size1 / 2) * (size1 / 2)) * size3
End If
If size1 = size3 Then
eq = 1
cylVol = 3.14159 * ((size1 / 2) * (size1 / 2)) * size2
End If
If size3 = size2 Then
eq = 1
cylVol = 3.14159 * ((size2 / 2) * (size2 / 2)) * size1
End If
If eq = 1 Then
If Abs(swVol - cylVol) < Abs(swVol - rectVol) Then
boolstatus = custPropMgr.Set("StockSize", "ROUND BAR, " & size2 & " OD X " & size3 & "LG")
End If
If Abs(swVol - rectVol) < Abs(swVol - cylVol) Then
''If size3 > size2 Then
boolstatus = custPropMgr.Set("StockSize", size2 & " SQ X " & size3 & "LG")
''End If
''If size3 < size2 Then
'' boolstatus = custPropMgr.Set("StockSize", "PLATE," & size2 & " SQ X " & size3 & "LG")
''End If
End If
If Abs(swVol - cylVol) = Abs(swVol - rectVol) Then
''If size3 > size2 Then
boolstatus = custPropMgr.Set("StockSize", "BAR, " & size2 & " X " & size3 & "LG")
''End If
''If size3 < size2 Then
'' boolstatus = custPropMgr.Set("StockSize", "PLATE," & size2 & " SQ X " & size3 & "LG")
''End If
End If
End If
If eq = 0 Then
boolstatus = custPropMgr.Set("StockSize", sizeArray(2) & " X " & sizeArray(1) & " X " & sizeArray(0))
End If
End If
End If
End If
If Len(custPropMgr.Get("DATE")) = 0 Then
boolstatus = custPropMgr.Set("Date", Left(Now, InStrRev(Now, "/") + 4))
End If
boolstatus = custPropMgr.Set("Workorder", Interface.workorder.Text)
boolstatus = custPropMgr.Set("Plant", Interface.plantBox.Text)
boolstatus = custPropMgr.Set("AssemblyNumber", parentAssemNum)
boolstatus = custPropMgr.Set("Line2", parentAssemDesc)
boolstatus = custPropMgr.Set("Line3", Interface.projBox.Text)
If Len(custPropMgr.Get("Finish")) = 0 Then
''boolstatus = custPropMgr.Set("Finish", Interface.finish.Text)
End If
If Len(custPropMgr.Get("DesignBy")) = 0 Then
''boolstatus = custPropMgr.Set("DesignBy", Interface.creator.Text)
End If
If Len(custPropMgr.Get("DrawnBy")) = 0 Then
''boolstatus = custPropMgr.Set("DrawnBy", Interface.creator.Text)
End If
End Sub
Espero que esto ayude, y no es demasiado confuso.