示例#1
0
        private void StartAssemblyExe(CreoOpenMode mode, string guid, bool isComponentAssembly, string exeparams, string workingDir = null)
        {
            SyncedComponentData syncedCompData = null;

            if (!syncedComponents.TryGetValue(guid, out syncedCompData))
            {
                GMEConsole.Warning.WriteLine("StartAssemblyExe(): Can't find guid " + guid);
                return;
            }

            string createAssemblyExe = Path.Combine(META.VersionInfo.MetaPath, "bin", "CAD", "Creo", "bin", "CADCreoParametricMetaLink.exe");

            if (File.Exists(createAssemblyExe) == false)
            {
                GMEConsole.Error.WriteLine(String.Format("Could not find CADCreoParametricMetaLink.exe at '{0}'", createAssemblyExe));
                return;
            }
            if (workingDir == null)
            {
                workingDir = syncedCompData.WorkingDir;
            }

            try
            {
                File.Copy(Path.Combine(GetProjectDir(), "constraintdata.xml"), Path.Combine(workingDir, "constraintdata.xml"));
            }
            catch (Exception)
            {
                //  not an issue
            }

            string logfile   = Path.Combine(GetProjectDir(), "log", Path.ChangeExtension("MetaLink_CreoCreateAssembly_" + Path.GetRandomFileName(), "log"));
            string arguments = String.Format("-v debug -g -s 127.0.0.1:{4} -w \"{0}\" -l \"{1}\" {2}, -id {3}", workingDir, logfile, exeparams, syncedCompData.InstanceId, SocketQueue.port);

            arguments += " -d " + guid;

            ProcessStartInfo info = new ProcessStartInfo()
            {
                RedirectStandardOutput = true,
                RedirectStandardError  = true,
                RedirectStandardInput  = true,
                UseShellExecute        = false,
                WindowStyle            = ProcessWindowStyle.Hidden,
                CreateNoWindow         = true,
                FileName  = createAssemblyExe,
                Arguments = arguments
                            // TODO -p ?
            };

            if (mode == CreoOpenMode.OPEN_EMPTY)
            {
                info.Arguments += " -m passive";
            }
            else if (!isComponentAssembly)
            {
                info.Arguments += " -m component";
            }
            if (Configuration.ConfigProFile.Length > 0)
            {
                info.Arguments += " -c " + Configuration.ConfigProFile;
            }
            if (!string.IsNullOrWhiteSpace(syncedCompData.AuxDir))
            {
                info.Arguments += String.Format(" -a \"{0}\"", syncedCompData.AuxDir);
            }
            Process createAssembly = new Process();

            createAssembly.StartInfo = info;
            StringBuilder stdoutData = new StringBuilder();
            StringBuilder stderrData = new StringBuilder();

            createAssembly.OutputDataReceived += (o, args) =>
            {
                lock (stdoutData)
                {
                    stdoutData.Append(args.Data);
                    stdoutData.Append(System.Environment.NewLine);
                }
            };
            createAssembly.ErrorDataReceived += (o, args) =>
            {
                lock (stderrData)
                {
                    stderrData.Append(args.Data);
                    stderrData.Append(System.Environment.NewLine);
                }
            };
            createAssembly.EnableRaisingEvents = true;
            createAssembly.Exited += (o, args) =>
            {
                lock (stderrData)
                {
                    if (GMEConsole != null && createAssembly.ExitCode != 0)
                    {
                        string message = String.Format("CADCreoParametricMetaLink exited with code {0}", createAssembly.ExitCode);
                        // CADCreoParametricMetaLink attempts to log everything in its log file
                        // Ignore stderr if it doesn't contain anything useful
                        string stdErrString = stderrData.ToString();
                        if (Regex.Match(stdErrString, "\\S").Success)
                        {
                            string errlog = "CADCreoParametricCreateAssembly_err.log";
                            using (StreamWriter writer = new StreamWriter(errlog))
                            {
                                writer.Write(stdErrString);
                                writer.Close();
                            }
                            message += String.Format(", the logfile is {0} ", errlog);
                        }
                        GMEConsole.Error.WriteLine(message);
                        SyncControl.Invoke((System.Action)(() => StartupFailureCallback(stdErrString, logfile)));
                    }
                }
            };
            LastStartedInstance = syncedCompData;
            createAssembly.Start();
            if (TestMode_CreoJobObject != IntPtr.Zero)
            {
                JobObjectPinvoke.AssignProcessToJobObject(createAssembly, TestMode_CreoJobObject);
            }
            createAssembly.BeginOutputReadLine();
            createAssembly.BeginErrorReadLine();
            createAssembly.StandardInput.Close();
            GMEConsole.Info.WriteLine("Creo is starting, the logfile is " + SmartLogger.GetGMEConsoleFileLink(logfile));
            ShowStartupDialog(true);
            // createAssembly.WaitForExit(10 * 1000);
        }
        private void StartAssemblyExe(CreoOpenMode mode, string guid, bool isComponentAssembly, string exeparams, string workingDir = null)
        {
            SyncedComponentData syncedCompData = null;
            if (!syncedComponents.TryGetValue(guid, out syncedCompData))
            {
                GMEConsole.Warning.WriteLine("StartAssemblyExe(): Can't find guid " + guid);
                return;
            }

            string proeIsisExtensionsDir = System.Environment.GetEnvironmentVariable("PROE_ISIS_EXTENSIONS");
            string createAssemblyExe = Path.Combine(proeIsisExtensionsDir ?? "", "bin", "CADCreoParametricMetaLink.exe");
            if (File.Exists(createAssemblyExe) == false)
            {
                GMEConsole.Error.WriteLine("CADCreoParametricMetaLink.exe could not be found");
                return;
            }
            if (workingDir == null)
            {
                workingDir = syncedCompData.WorkingDir;
            }

            try
            {
                File.Copy(Path.Combine(GetProjectDir(), "constraintdata.xml"), Path.Combine(workingDir, "constraintdata.xml"));
            }
            catch (Exception)
            {
                //  not an issue
            }

            string logfile = Path.Combine(GetProjectDir(), "log", Path.ChangeExtension("MetaLink_CreoCreateAssembly_" + Path.GetRandomFileName(), "log"));
            string arguments = String.Format("-v debug -g -s 127.0.0.1:15150 -w \"{0}\" -l \"{1}\" {2}, -id {3}", workingDir, logfile, exeparams, syncedCompData.InstanceId);
            arguments += " -d " + guid;

            ProcessStartInfo info = new ProcessStartInfo()
            {
                RedirectStandardOutput = true,
                RedirectStandardError = true,
                RedirectStandardInput = true,
                UseShellExecute = false,
                WindowStyle = ProcessWindowStyle.Hidden,
                CreateNoWindow = true,
                FileName = createAssemblyExe,
                Arguments = arguments
                // TODO -p ?
            };
            if (mode == CreoOpenMode.OPEN_EMPTY)
            {
                info.Arguments += " -m passive";
            }
            else if (!isComponentAssembly)
            {
                info.Arguments += " -m component";
            }
            if (Configuration.ConfigProFile.Length > 0)
            {
                info.Arguments += " -c " + Configuration.ConfigProFile;
            }
            if (!string.IsNullOrWhiteSpace(syncedCompData.AuxDir))
            {
                info.Arguments += String.Format(" -a \"{0}\"", syncedCompData.AuxDir);
            }
            Process createAssembly = new Process();
            createAssembly.StartInfo = info;
            StringBuilder stdoutData = new StringBuilder();
            StringBuilder stderrData = new StringBuilder();
            createAssembly.OutputDataReceived += (o, args) =>
            {
                lock (stdoutData)
                {
                    stdoutData.Append(args.Data);
                    stdoutData.Append(System.Environment.NewLine);
                }
            };
            createAssembly.ErrorDataReceived += (o, args) =>
            {
                lock (stderrData)
                {
                    stderrData.Append(args.Data);
                    stderrData.Append(System.Environment.NewLine);
                }
            };
            createAssembly.EnableRaisingEvents = true;
            createAssembly.Exited += (o, args) =>
            {
                lock (stderrData)
                {
                    if (GMEConsole != null && createAssembly.ExitCode != 0)
                    {
                        string errlog = "CADCreoParametricCreateAssembly_err.log";
                        StreamWriter writer = new StreamWriter(errlog);
                        writer.Write(stderrData.ToString());
                        writer.Flush();
                        writer.Close();
                        GMEConsole.Error.WriteLine(String.Format("CADCreoParametricCreateAssembly exited with code {0}, the logfile is {1}", createAssembly.ExitCode, errlog));
                        SyncControl.Invoke(startupFailedCallback);
                    }
                }
            };
            LastStartedInstance = syncedCompData;
            createAssembly.Start();
            createAssembly.BeginOutputReadLine();
            createAssembly.BeginErrorReadLine();
            createAssembly.StandardInput.Close();
            GMEConsole.Info.WriteLine("Creo is starting, the logfile is at: <a href=\"file:///{0}\" target=\"_blank\">{0}</a>", Path.Combine(workingDir, "log", logfile));
            ShowStartupDialog(true);
            // createAssembly.WaitForExit(10 * 1000);
        }