2015-10-26 10 views
48

पर एक स्ट्रिंग भेज रहा है, मैं वर्तमान में एक नए सॉलिडवर्क्स कार्य-फलक पर काम कर रहा हूं, जो अधिकतर "पुराने" मैक्रोज़ को लागू करता है जो मैंने एक अधिक सुविधाजनक प्रारूप में लिखा है। इनमें से कुछ को टेक्स्ट बॉक्स के माध्यम से उपयोगकर्ता इनपुट की आवश्यकता होती है जिसे मैं कार्य-फलक में शामिल करना चाहता हूं।सॉलिडवर्क्स सी # एडिन - एक मैक्रो

समस्या यह है, मैं एक खरोंच फ़ाइल लेखन का एक तरीका नहीं मिल रहा है या मेरे मैक्रो में इन तार (जो मैं नहीं बल्कि पुनर्लेखन के लिए समय नहीं ले चाहते हैं)

आयात करने के लिए इन भेजने के लिए किसी भी अन्य रास्ता नहीं है मेरे मैक्रोज़ के लिए तार? एडिन सी # में है, और मैं वर्तमान में सॉलिडवर्क्स "रनमैक्रो 2" विधि का उपयोग कर रहा हूं।

धन्यवाद!

संपादित करें: नीचे कुछ कोड स्निपेट जोड़ना। प्रश्न में मुख्य मैक्रो, एक संपूर्ण असेंबली में कस्टम प्रॉपर्टी फाइलों का प्रचार करने के लिए है।

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"); 
     } 
    } 
} 

उपरोक्त मेरे कार्य फलक के लिए मूल कोड है। नीचे मेरे मुख्य एडिन क्लास से कोड स्निपेट है, इसमें मेरे अन्य बटनों में से एक के लिए कोड भी शामिल है।

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; 
} 

अंत में, मैक्रो से मुख्य कोड है जिसमें मैं इंटरफ़ेस करने की कोशिश कर रहा हूं।

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 

मुझे उम्मीद है कि इससे मदद मिलती है, और यह भ्रमित नहीं है।

+1

आप "रनमैक्रो" को कॉल करते समय तर्क जोड़ नहीं सकते हैं, लेकिन आप सी # के साथ कस्टम गुण लिख सकते हैं और प्रक्रिया की शुरुआत में वीबीए में गुण पढ़ सकते हैं। उममीद है कि इससे मदद मिलेगी। –

+1

शायद समस्या को बेहतर ढंग से समझने के लिए कुछ न्यूनतम नमूना कोड की आवश्यकता होगी। –

+1

एडिन से नमूना कोड, या मैक्रो से मैं डेटा भेजने की कोशिश कर रहा हूं? – Nick

उत्तर

1

Solidworks वीबी मैक्रो फ़ाइलों के 2 प्रकार का समर्थन करता है

  • SWP - नए संस्करण
  • SWB - पुराने सादे पाठ मैक्रो, यहाँ है और उदाहरण खाली SWB मैक्रो की:

    Dim swApp As Object 
    Dim swModel As SldWorks.ModelDoc2 
        Sub main() 
        Set swApp = Application.SldWorks 
        Set swModel = swApp.ActiveDoc 
        End Sub 
    

यदि आपके पास अपने मैक्रोज़ के स्रोत कोड तक पहुंच है तो आप उन्हें सादा पाठ में बदल सकते हैं और प्लेसहोल्डर में छोड़ सकते हैं।

MsgBox "--MyParameter1--" 

उपयोगकर्ता अपने टास्कपैन पर पैरामीटर में भरने के बाद वास्तविक मूल्यों के साथ एसबीबी मैक्रो में प्लेसहोल्डर्स को प्रतिस्थापित करता है और इसे चलाता है।

संबंधित मुद्दे