예전부터 응용 프로그램에 Python을 결합하여 즐겨 사용했는데,
어떤 사용자의 요구사항 때문이었습니다.
그 사용자가 사용하는 프로그램에 계산식이 있는데 계산식이 프로젝트의 특성때문에 조금씩 수정해야 한다는 것이었습니다.
프로젝트마다 계산식을 수정해서 프로그램을 배포하기가 어려워 계산식 자체를 Python 코드로 외부 파일로 빼내는 방식으로 처리했습니다.
어느날 차를 몰고 가는데 전화가 와서
Python 파일을 열어 숫자 3을 3.5로 바꾸면 된다고 답변을 해줬습니다.
이렇게 사용자는 프로젝트마다 Python에서 계산식을 수정하여 사용하면 되기 때문에 프로그램을 수정할 필요가 없어집니다.
이전 글에서도 이야기했듯이 IronPython은 C#과 궁합이 아주 좋아 이번 프로젝트에서도 IronPython을 프로그램에 포함시켰습니다.
자동으로 생성된 배관 라인을 수정하거나 새로 생성하는 기능을 위해 IronPython을 활용했습니다.
먼저 앱 실행 경로를 IronPython 검색 경로에 추가해줍니다.
아래와 같이 C# Class를 정의하고
매개 변수를 Tuple형식으로 받았습니다.
이렇게 하면 가변적으로 매개 변수를 받을 수 있습니다.
IronPython에 C# Class들을 Import합니다.
이렇게 Class를 Import 하면 IronPython에서 C# Class를 생성하여 사용할 수 있습니다.
또한 필요한 변수들도 설정할 수 있습니다.
필요한 Class들과 변수들을 IronPython에 추가해 놓으면
아래와 같이 Python 코드에서 자유롭게 사용할 수 있습니다.
위 Python 코드에서 특정 Class를 생성하면 대응하는 C# Class가 생성됩니다.
실제 프로그램에서는 위 코드를 실행하면 배관이 생성되도록 되어 있습니다.
우리가 만든 Class도 사용할 수 있지만, Python 내장 함수, Class도 사용할 수 있어 확장성이 엄청나게 넓어집니다.
아래와 같은 코드가 가능합니다.
어떤 사용자의 요구사항 때문이었습니다.
그 사용자가 사용하는 프로그램에 계산식이 있는데 계산식이 프로젝트의 특성때문에 조금씩 수정해야 한다는 것이었습니다.
프로젝트마다 계산식을 수정해서 프로그램을 배포하기가 어려워 계산식 자체를 Python 코드로 외부 파일로 빼내는 방식으로 처리했습니다.
어느날 차를 몰고 가는데 전화가 와서
이번 프로젝트에서는 factor 3을 3.5로 바꿔야 하는데 어떻게 하나요?라고 문의가 왔습니다.
Python 파일을 열어 숫자 3을 3.5로 바꾸면 된다고 답변을 해줬습니다.
이렇게 사용자는 프로젝트마다 Python에서 계산식을 수정하여 사용하면 되기 때문에 프로그램을 수정할 필요가 없어집니다.
이전 글에서도 이야기했듯이 IronPython은 C#과 궁합이 아주 좋아 이번 프로젝트에서도 IronPython을 프로그램에 포함시켰습니다.
자동으로 생성된 배관 라인을 수정하거나 새로 생성하는 기능을 위해 IronPython을 활용했습니다.
먼저 앱 실행 경로를 IronPython 검색 경로에 추가해줍니다.
1 2 3 4 5 6 | #region IronPython의 검색 경로에 앱 실행 경로를 추가 var paths = _IronPython.GetSearchPaths(); var ExecutePath = System.IO.Path.GetDirectoryName(Application.ExecutablePath); paths.Add(ExecutePath); _IronPython.SetSearchPaths(paths); #endregion | cs |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | public class MoveTo { public MoveTo(PythonTuple value) { int idx = 0; double x = Convert.ToDouble(value[0]); double y = Convert.ToDouble(value[1]); double z = Convert.ToDouble(value[2]); idx += 3; var alignment = Alignment.MM; if(idx < value.Count && value[idx] is Alignment) { alignment = (Alignment)value[idx++]; } double NPS = ScriptingHost._ScriptScope.GetVariable("NPS"); | cs |
이렇게 하면 가변적으로 매개 변수를 받을 수 있습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | _IronPython.Execute("from Namespace import LineNo", _ScriptScope); _IronPython.Execute("from Namespace import MoveTo", _ScriptScope); _IronPython.Execute("from Namespace import MoveDir", _ScriptScope); _IronPython.Execute("from Namespace import NextTo", _ScriptScope); _IronPython.Execute("from Namespace import RouteTo", _ScriptScope); _IronPython.Execute("from Namespace import BOP", _ScriptScope); _IronPython.Execute("from Namespace import TOP", _ScriptScope); _IronPython.Execute("from Namespace import FLANGE", _ScriptScope); _IronPython.Execute("from Namespace import BLINDFLANGE", _ScriptScope); _IronPython.Execute("from Namespace import TEE", _ScriptScope); _IronPython.Execute("from Namespace import REDUCER", _ScriptScope); _IronPython.Execute("from Namespace import CONCENTRIC", _ScriptScope); _IronPython.Execute("from Namespace import GATE", _ScriptScope); _IronPython.Execute("from Namespace import CHECK", _ScriptScope); _IronPython.Execute("from Namespace import GLOBE", _ScriptScope); _IronPython.Execute("from Namespace import BALL", _ScriptScope); _IronPython.Execute("from Namespace import BUTTERFLY", _ScriptScope); | cs |
Namespace를 실제 Namespace로 바꿔주세요.
또한 필요한 변수들도 설정할 수 있습니다.
1 2 3 4 5 6 | _ScriptScope.SetVariable("NPS", 0); _ScriptScope.SetVariable("OD", 0); _ScriptScope.SetVariable("FF", Alignment.FF); _ScriptScope.SetVariable("MF", Alignment.MF); _ScriptScope.SetVariable("MM", Alignment.MM); _ScriptScope.SetVariable("FM", Alignment.FM); | cs |
1 2 3 4 5 6 7 8 9 10 11 12 | LineNo('4"WG-9102-A1(M0)') MoveTo((-55873.5,5979.84,5123.2,FF,FLANGE(False))) MoveDir([('U',342.9,FF)]) MoveDir([('E3S',761.148159296204,FF)]) MoveDir([('D',1483.95,FF)]) MoveDir([('E',13306.15,FF)]) MoveDir([('D',1000,FF)]) MoveDir([('W',7316.52,FF)]) MoveDir([('S',10608.7,FF)]) MoveDir([('D',464.25,FF)]) MoveDir([('S',657.15,FF)]) MoveDir([('D',455.4,FF,FLANGE(True))]) | cs |
Python Code
실제 프로그램에서는 위 코드를 실행하면 배관이 생성되도록 되어 있습니다.
우리가 만든 Class도 사용할 수 있지만, Python 내장 함수, Class도 사용할 수 있어 확장성이 엄청나게 넓어집니다.
아래와 같은 코드가 가능합니다.
1 2 | for i in [0,45,90,135,180,270]: MoveDir([f'E{i}N', 150, FF)] | cs |
댓글
댓글 쓰기