Merge Script with Port listening

Merge Script with Port listening

ronald
Participant Participant
356 Views
1 Reply
Message 1 of 2

Merge Script with Port listening

ronald
Participant
Participant

Hi!

I'm working in a script to merge a model "modeltemp.max" always that the port 7500 listen to a external command
I have a python running this message with a 3d library

This is my script in maxscript:

--

 
fn mergeModel = 
(
    -- As opções de mesclagem são definidas aqui
mergeMAXFile "C:\\temp\\modeltemp.max" #autoRenameDups #renameMtlDups #select
    print "Model merged successfully!"
)
 
 
fn createServer ipAddress port = 
(
    dotNetIPAddress = (DotNetClass "System.Net.IPAddress").Parse ipAddress
    tcpListener = DotNetObject "System.Net.Sockets.TcpListener" dotNetIPAddress port
    tcpListener.Start()
    msgReceived = ""
    print ("listening on " + (ipAddress as string) + ":" + (port as string))
    while true do 
    (
        print("waiting for a client socket")
        socket = tcpListener.AcceptSocket()
        print("client socket accepted")
        while msgReceived != "exit" do
        (
            sendByteStream = DotNetObject "System.Byte[]" 10000
            socket.Receive sendByteStream
            encoding = DotnetClass "System.Text.UTF8Encoding"
            msgReceived = trimright (encoding.UTF8.GetString(sendByteStream))
 
            if msgReceived == "socketClosing" then (
                print("closing socket")
                socket.Close()
                exit
            )
            else (
                if msgReceived != "" then (
                    print("Received : " + msgReceived)
                    -- Instead of executing received message, just merge the model
                    try(
                        mergeModel()
                        result = "Success"
                    ) catch (
                        error_str = "***" + getCurrentException() +"***\n" 
                        print(error_str)
                        result = "Error"
                    )
                    -- send result
                    ascii_encoder = dotNetObject "System.Text.ASCIIEncoding"
                    bytes = ascii_encoder.GetBytes (result as string)
                    result = socket.Send bytes
                )
            )
        )
    )
)
 
fn BackgroundTcpListenerDoWork theSender theEvent =
(
    ipAddress = "127.0.0.1"
    port = 7500
    try (
        createServer ipAddress port
        exit
    )
    catch(
        print("server crashed or port " + (port as string) + " is already used")
    )
)
 
BackgroundWorker = DotNetObject "System.ComponentModel.BackgroundWorker"
DotNet.AddEventHandler BackgroundWorker "DoWork" BackgroundTcpListenerDoWork
BackgroundWorker.WorkerSupportsCancellation = true
BackgroundWorker.RunWorkerAsync()

--
In Python i have:

--

def sendMessage(msg, sock😞
    sock.send(msg.encode('utf-8'))
    return sock.recv(responseBufferSize).decode('utf-8')

def send_to_max(filepath😞
    def sendMessage(msg, sock😞
        sock.send(msg.encode('utf-8'))  # Converta a mensagem para bytes usando utf-8
        return sock.recv(responseBufferSize).decode('utf-8')  # Decodifique a resposta de volta para string

    responseBufferSize = 1024
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect(('127.0.0.1', 7500))

    merge_command = f'mergeMAXFile "{filepath}"'
    sendMessage(merge_command, s)

    sendMessage('socketClosing', s)
    s.shutdown(socket.SHUT_RDWR)
    s.close()
--

The script work, but after the merge 3ds max presents a weird behavior, moving objects gets "acelerated" for a while (and sometimes crashes)
Also the merged object isnt kept selected.
Any thought on that?

Thanks
Ronald

 

0 Likes
357 Views
1 Reply
Reply (1)
Message 2 of 2

istan
Advisor
Advisor

Did you also read Executing Code in Main Thread:

https://help.autodesk.com/view/MAXDEV/2024/ENU/?guid=tips_and_tricks

0 Likes