def fileStreamAction(): textWriter = stream_io_util.GetStreamWriter(fileStream) def textWriterAction(): textWriter.Write(text) return stream_io_util.UsingStream(textWriter, textWriterAction) return
def fileStreamAction(): textReader = stream_io_util.GetStreamReader(fileStream) def textReaderAction(): text = textReader.ReadToEnd() return text text = stream_io_util.UsingStream(textReader, textReaderAction) return text
def fileStreamAction(): textWriter = stream_io_util.GetStreamWriter(fileStream) def textWriterAction(): for line in lines: textWriter.WriteLine(line) return stream_io_util.UsingStream(textWriter, textWriterAction) return
def ReadFromTextFile(textFilePath): fileStream = stream_io_util.OpenFile(textFilePath, True) def fileStreamAction(): textReader = stream_io_util.GetStreamReader(fileStream) def textReaderAction(): text = textReader.ReadToEnd() return text text = stream_io_util.UsingStream(textReader, textReaderAction) return text text = stream_io_util.UsingStream(fileStream, fileStreamAction) return text
def WriteToTextFile(textFilePath, text): path_util.CreateDirectoryForFilePath(textFilePath) fileStream = stream_io_util.CreateFile(textFilePath, True) def fileStreamAction(): textWriter = stream_io_util.GetStreamWriter(fileStream) def textWriterAction(): textWriter.Write(text) return stream_io_util.UsingStream(textWriter, textWriterAction) return stream_io_util.UsingStream(fileStream, fileStreamAction) return
def outputStreamAction(): outputStreamWriter = stream_io_util.GetStreamWriter(outputStream) def outputStreamWriterAction(): revit_script_util.SetOutputFunction( stream_io_util.GetSafeWriteLine(outputStreamWriter)) result = script_host_error.WithErrorHandling( lambda: DoRevitSessionProcessing( scriptFilePath, scriptDataFilePath, progressNumber, batchRvtProcessUniqueId, revit_script_util.Output), "ERROR: An error occurred while executing the script host! Operation aborted.", output=revit_script_util.Output, showErrorMessageBox=False) return result stream_io_util.UsingStream(outputStreamWriter, outputStreamWriterAction) return
def Main(): currentProcess = GetCurrentProcess() environmentVariables = GetEnvironmentVariables(currentProcess) outputPipeHandleString = script_environment.GetScriptOutputPipeHandleString( environmentVariables) scriptFilePath = script_environment.GetScriptFilePath(environmentVariables) scriptDataFilePath = script_environment.GetScriptDataFilePath( environmentVariables) progressNumber = script_environment.GetProgressNumber(environmentVariables) batchRvtProcessUniqueId = script_environment.GetBatchRvtProcessUniqueId( environmentVariables) testModeFolderPath = script_environment.GetTestModeFolderPath( environmentVariables) global_test_mode.InitializeGlobalTestMode(testModeFolderPath) if outputPipeHandleString is not None and scriptFilePath is not None: outputStream = client_util.CreateAnonymousPipeClient( client_util.OUT, outputPipeHandleString) def outputStreamAction(): outputStreamWriter = stream_io_util.GetStreamWriter(outputStream) def outputStreamWriterAction(): revit_script_util.SetOutputFunction( stream_io_util.GetSafeWriteLine(outputStreamWriter)) result = script_host_error.WithErrorHandling( lambda: DoRevitSessionProcessing( scriptFilePath, scriptDataFilePath, progressNumber, batchRvtProcessUniqueId, revit_script_util.Output), "ERROR: An error occurred while executing the script host! Operation aborted.", output=revit_script_util.Output, showErrorMessageBox=False) return result stream_io_util.UsingStream(outputStreamWriter, outputStreamWriterAction) return stream_io_util.UsingStream(outputStream, outputStreamAction) return
def RunScriptedRevitSession(revitVersion, batchRvtScriptsFolderPath, scriptFilePath, scriptDatas, progressNumber, processingTimeOutInMinutes, showRevitProcessErrorMessages, testModeFolderPath, output): scriptDataFilePath = ScriptDataUtil.GetUniqueScriptDataFilePath() ScriptDataUtil.SaveManyToFile(scriptDataFilePath, scriptDatas) progressRecordFilePath = ScriptDataUtil.GetProgressRecordFilePath( scriptDataFilePath) serverStream = server_util.CreateAnonymousPipeServer( server_util.IN, server_util.HandleInheritability.Inheritable) def serverStreamAction(): scriptOutputStreamReader = stream_io_util.GetStreamReader(serverStream) def streamReaderAction(): scriptOutputPipeHandleString = serverStream.GetClientHandleAsString( ) def clientHandleAction(): hostRevitProcess = revit_process_host.StartHostRevitProcess( revitVersion, batchRvtScriptsFolderPath, scriptFilePath, scriptDataFilePath, progressNumber, scriptOutputPipeHandleString, testModeFolderPath) return hostRevitProcess hostRevitProcess = UsingClientHandle(serverStream, clientHandleAction) hostRevitProcessId = hostRevitProcess.Id global_test_mode.ExportRevitProcessId(hostRevitProcessId) snapshotDataFilePaths = [ snapshot_data_util.GetSnapshotDataFilePath( scriptData.DataExportFolderPath.GetValue()) for scriptData in scriptDatas ] pendingReadLineTask = [ None ] # Needs to be a list so it can be captured by reference in closures. pendingProcessOutputReadLineTask = [None] # As above. pendingProcessErrorReadLineTask = [None] # As above. snapshotDataFilesExistTimestamp = [ None ] # Needs to be a list so it can be captured by reference in closures. currentProgressRecordNumber = [ 0 ] # Needs to be a list so it can be captured by reference in closures. progressRecordCheckTimeUtc = [time_util.GetDateTimeUtcNow() ] # As above. progressRecordChangedTimeUtc = [time_util.GetDateTimeUtcNow() ] # As above. def monitoringAction(): pendingProcessOutputReadLineTask[0] = ShowRevitProcessOutput( hostRevitProcess.StandardOutput, output, pendingProcessOutputReadLineTask[0]) pendingProcessErrorReadLineTask[0] = ShowRevitProcessError( hostRevitProcess.StandardError, showRevitProcessErrorMessages, output, pendingProcessErrorReadLineTask[0]) pendingReadLineTask[0] = ShowRevitScriptOutput( scriptOutputStreamReader, output, pendingReadLineTask[0]) if time_util.GetSecondsElapsedSinceUtc( progressRecordCheckTimeUtc[0] ) > REVIT_PROGRESS_CHECK_INTERVAL_IN_SECONDS: progressRecordCheckTimeUtc[ 0] = time_util.GetDateTimeUtcNow() progressRecordNumber = ScriptDataUtil.GetProgressNumber( progressRecordFilePath) if progressRecordNumber is not None: if currentProgressRecordNumber[ 0] != progressRecordNumber: # Progress update detected. currentProgressRecordNumber[ 0] = progressRecordNumber progressRecordChangedTimeUtc[ 0] = time_util.GetDateTimeUtcNow() if processingTimeOutInMinutes > 0: if currentProgressRecordNumber[0] != 0: if time_util.GetSecondsElapsedSinceUtc( progressRecordChangedTimeUtc[0]) > ( processingTimeOutInMinutes * SECONDS_PER_MINUTE): output() output( "WARNING: Timed-out waiting for Revit task / file to be processed. Forcibly terminating the Revit process..." ) TerminateHostRevitProcess(hostRevitProcess, output) if currentProgressRecordNumber[0] == 0: if time_util.GetSecondsElapsedSinceUtc( progressRecordChangedTimeUtc[0] ) > REVIT_PROCESS_BEGIN_PROCESSING_TIMEOUT_IN_SECONDS: output() output( "WARNING: Timed-out waiting for Revit script host to begin task / file processing. Forcibly terminating the Revit process..." ) TerminateHostRevitProcess(hostRevitProcess, output) if snapshotDataFilesExistTimestamp[0] is not None: if time_util.GetSecondsElapsedSinceUtc( snapshotDataFilesExistTimestamp[0] ) > REVIT_PROCESS_EXIT_TIMEOUT_IN_SECONDS: output() output( "WARNING: Timed-out waiting for the Revit process to exit. Forcibly terminating the Revit process..." ) TerminateHostRevitProcess(hostRevitProcess, output) elif snapshotDataFilePaths.All( lambda snapshotDataFilePath: File.Exists( snapshotDataFilePath)): output() output( "Detected snapshot data files. Waiting for Revit process to exit..." ) snapshotDataFilesExistTimestamp[ 0] = time_util.GetDateTimeUtcNow() try: revit_dialog_detection.DismissCheekyRevitDialogBoxes( hostRevitProcessId, output) except Exception, e: output() output( "WARNING: an error occurred in the cheeky Revit dialog box dismisser!" ) exception_util.LogOutputErrorDetails(e, output) return monitor_revit_process.MonitorHostRevitProcess( hostRevitProcess, monitoringAction, output) return stream_io_util.UsingStream(scriptOutputStreamReader, streamReaderAction) return
0] = time_util.GetDateTimeUtcNow() try: revit_dialog_detection.DismissCheekyRevitDialogBoxes( hostRevitProcessId, output) except Exception, e: output() output( "WARNING: an error occurred in the cheeky Revit dialog box dismisser!" ) exception_util.LogOutputErrorDetails(e, output) return monitor_revit_process.MonitorHostRevitProcess( hostRevitProcess, monitoringAction, output) return stream_io_util.UsingStream(scriptOutputStreamReader, streamReaderAction) return stream_io_util.UsingStream(serverStream, serverStreamAction) lastProgressNumber = ScriptDataUtil.GetProgressNumber( progressRecordFilePath) nextProgressNumber = (lastProgressNumber + 1) if lastProgressNumber is not None else None return nextProgressNumber