明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1958|回复: 10

使用Ironpython 3.0 创建一个自己的PYCAD环境

  [复制链接]
发表于 2023-7-20 14:22:22 | 显示全部楼层 |阅读模式
  1. # -*- coding: utf-8 -*
  2. import io
  3. import os
  4. import clr
  5. import sys
  6. import traceback
  7. import json
  8. import typing
  9. import codecs
  10. from collections import defaultdict
  11. from datetime import datetime
  12. from pycad.system import *
  13. from pycad.system.decorators import prinf

  14. sys.path.append(r"G:\MyStudio\Pycad\support")
  15. sys.path.append(r"G:\MyStudio\Pycad")
  16. clr.AddReference("System.Windows.Forms")
  17. clr.AddReference("IronPython")
  18. clr.AddReference("IronPython.Modules")

  19. from System.Windows.Forms import OpenFileDialog, DialogResult
  20. import System
  21. from System.Text import Encoding
  22. from System.IO import MemoryStream
  23. from IronPython.Hosting import Python


  24. dllpath = System.Reflection.Assembly.GetExecutingAssembly().Location
  25. dlldir = os.path.dirname(dllpath)
  26. libdir = os.path.join(dlldir, "lib")
  27. supportdir = os.path.join(dlldir, "support")
  28. extensionsdir = os.path.join(dlldir, "extensions")
  29. searchpaths = [dlldir, libdir, supportdir, extensionsdir]



  30. class JsonOperate:
  31.     def __init__(self, path, filename):
  32.         self.path = os.path.normpath(path)
  33.         self.filename = os.path.normpath(os.path.join(self.path, filename))
  34.         if not os.path.exists(self.path):
  35.             os.makedirs(self.extensions_path)
  36.         if not os.path.exists(self.filename):
  37.             with open(self.filename, "w") as f:
  38.                 json.dump({}, f)

  39.     def readjson(self):
  40.         with open(self.filename, "r", encoding="utf-8") as f:
  41.             return json.load(f)

  42.     def writejson(self, data):
  43.         with open(self.filename, "w", encoding="utf-8") as f:
  44.             json.dump(data, f, indent=4)


  45. # --------------------Select PythonScrips And Get Filepaths ---------------------------#
  46. class LoadPythonScript:
  47.     config_path = os.path.join(extensionsdir, 'loadconfig.json')
  48.     json_operator = JsonOperate(extensionsdir, 'loadconfig.json')

  49.     def __init__(self):
  50.         self.paths = []
  51.         self.load_paths()

  52.     def add_paths(self):
  53.         dlg = OpenFileDialog()
  54.         dlg.Title = "Select PyScript Files"
  55.         dlg.Multiselect = True
  56.         dlg.Filter = "PyScript (*.py)|*.py"
  57.         res = dlg.ShowDialog()
  58.         if res == DialogResult.OK:
  59.             for path in dlg.FileNames:
  60.                 if path not in self.paths:  # 如果路径不存在,则添加
  61.                     self.paths.append(path)
  62.             self.save_paths()

  63.     def remove_paths(self, paths):
  64.         for path in paths:
  65.             if path in self.paths:
  66.                 self.paths.remove(path)
  67.         self.save_paths()

  68.     def load_paths(self):
  69.         config = self.json_operator.readjson()
  70.         self.paths = config.get('scripts', [])

  71.     def save_paths(self):
  72.         config = {
  73.             "scripts": self.paths
  74.         }
  75.         self.json_operator.writejson(config)

  76. # --------------------Create Logservice -------------------------------#
  77. class LoggingUtils:
  78.     _logPath = os.path.join(dlldir, "pycad.log")
  79.     @staticmethod
  80.     def LogError(message):
  81.         now = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
  82.         logMessage = f"[{now}] {message}\n"
  83.         with open(LoggingUtils._logPath, "a") as file:
  84.             file.write(logMessage)
  85.         prinf(logMessage)

  86. # --------------------Create PycadEngine -------------------------------#


  87. class PycadEngine:
  88.     def __init__(self):
  89.         self.engine = Python.CreateEngine()
  90.         self.set_searchpaths(searchpaths)
  91.         

  92.     def set_searchpaths(self, paths: list):
  93.         engine_searchpaths = self.engine.GetSearchPaths()
  94.         for path in paths:
  95.             engine_searchpaths.Add(path)
  96.         self.engine.SetSearchPaths(engine_searchpaths)

  97.     def execute_script(self, file_path):
  98.         self.scope = self.engine.CreateScope()
  99.         try:
  100.             self.engine.ExecuteFile(file_path, self.scope)
  101.         except System.Exception as ex:
  102.             error = traceback.format_exc()
  103.             message = f"Error script: {ex},error:{error}"
  104.             LoggingUtils.LogError( message)

  105.     def execute_code(self, code):
  106.         self.scope = self.engine.CreateScope()
  107.         try:
  108.             self.engine.Execute(code, self.scope)
  109.         except System.Exception as ex:
  110.             message = f"Error code: {ex}"
  111.             LoggingUtils.LogError( message)
  112.         
  113.     def set_scope_variable(self, var_name, var_value):
  114.         self.scope.SetVariable(var_name, var_value)
  115.    
  116.     def get_scope_variable(self, var_name):
  117.         return self.scope.GetVariable(var_name)


  118. # --------------------Initial PycadSystem ---------------------------#
  119. class PycadInitial:
  120.     def __init__(self, scripts: list):
  121.         self.PycadEngine = PycadEngine()
  122.         self.scripts = scripts
  123.         
  124.     def pyrun(self):
  125.         for script in self.scripts:
  126.             self.PycadEngine.execute_script(script)



复制代码


评分

参与人数 1明经币 +1 收起 理由
Bao_lai + 1 很给力!

查看全部评分

发表于 2023-7-20 14:47:41 | 显示全部楼层
社会我枫哥,人狠话不多
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2023-7-20 14:55:32 | 显示全部楼层
闻人南131 发表于 2023-7-20 14:47
社会我枫哥,人狠话不多

多谢兄弟们鼓励,不然我坚持不下去,现在总归用上了自己的pycad
发表于 2023-7-21 11:09:42 | 显示全部楼层
社会我枫哥,人狠话不多+1
发表于 2023-7-21 13:11:01 | 显示全部楼层
上次根据你的帖子我搞定了犀牛里面ghpython调用Cpython库的问题。不过这次这个我看不太懂了,能否多说几句,讲讲具体实现了什么效果?
 楼主| 发表于 2023-7-21 20:06:31 | 显示全部楼层
陨落 发表于 2023-7-21 13:11
上次根据你的帖子我搞定了犀牛里面ghpython调用Cpython库的问题。不过这次这个我看不太懂了,能否多说几句 ...

这个是核心代码,用c# 创建一个执行Ironpython脚本dll,后面在Ironpython脚本中进行加载,运行插件
发表于 2023-7-23 14:01:03 | 显示全部楼层

社会我枫哥,人狠话不多+1
发表于 2023-7-23 17:53:03 来自手机 | 显示全部楼层
看不懂  不会用
发表于 2023-8-28 21:29:11 | 显示全部楼层
终于ironpy3了
发表于 2023-8-29 22:52:07 | 显示全部楼层
Make PyCAD great again.
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 03:39 , Processed in 0.169764 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表