示例#1
0
    def fileStreamAction():
        textWriter = stream_io_util.GetStreamWriter(fileStream)

        def textWriterAction():
            textWriter.Write(text)
            return

        stream_io_util.UsingStream(textWriter, textWriterAction)
        return
示例#2
0
    def fileStreamAction():
        textReader = stream_io_util.GetStreamReader(fileStream)

        def textReaderAction():
            text = textReader.ReadToEnd()
            return text

        text = stream_io_util.UsingStream(textReader, textReaderAction)
        return text
示例#3
0
    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
示例#4
0
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
示例#5
0
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
示例#8
0
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
示例#9
0
                        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