기본 콘텐츠로 건너뛰기

2022의 게시물 표시

Shipping Box

  배관 자재를 운반하기 위한 컨테이너 박스에 운송비를 줄이기 위해 최대로 많은 배관 자재를 넣기 위한 방안입니다. 컨테이너 박스는 아시다시피 직육면체로 보시면 되고 배관 자재는 분기(TEE)가 없는 선형적인 구조라고 가정하겠습니다.(직관, ELBOW, REDUER, FLANGE로만 구성)   쉽게 생각해보면 " 컨테이너 박스에 차례로 배관 자재를 들어갈때 까지 넣으면 될것 같습니다. " 이게 끝일까요? 이렇게만 하고 코딩을 시작하면 될까요? 가슴 한 구석에서 " 이렇게만 하면 안될 것 같은데... "라고 이야기하는 것 같습니다.   여튼 시작해보겠습니다. 일반적으로 컨테이너 박스는 차량에 실려 운반되기 때문에 한쪽이 긴 직육면체입니다. 다행이 직관이 컨테이너의 길이 방향으로 놓여있다면 쉬울것 같은데 그렇지 않다면 문제가 됩니다.   그래서 직관을 컨테이너 길이 방향(각도 0)으로 회전시켜서 넣습니다.   코딩을 해봅시다. if angle == 0:     pass elif angle == 90:     직관을 -90도로 회전 elif angle == 270:     직관을 -270도로 회전 else:     pass 여러분들이 이런 코드를 보면 위험하다는 느낌을 가져야 합니다. 평면(360)을 4분면으로 나누어 처리했는데 일반 배관 라인은 직교하여 생성하기 때문에 큰 무리가 없어 보입니다만  사선으로 이동하는 배관 라인의 경우에 우리가 원하는 결과를 만족시킬수 없습니다.   그럼 45도를 코드에 넣어서 처리하면 되지 않을까 생각하시겠지만 if angle == 0:     pass elif angle == 45:     직관을 -45도로 회전 elif angle == 90:     직관을 -90도로 회전 elif angle == 270:     직관을 -270도로 회전 else:     pass 그렇게 생각하면 안됩니다. 위 코드는 특정 상황에만 제대로 동작하고 예외의 경우를 처리하지 못합니다. 저의 경험상 사용자는 우리가

[C#] 작업 프로그래스 바

 장시간(3초 이상)의 작업이 진행되는 경우 사용자가 멍하니 아무런 변화가 없는 모니터를 보게 하는 것 보다 작업 진행 상태를 보여주는 것이 좋습니다. 퍼센트로 작업 진행률을 보여주면 더할 나위 없이 좋겠지만 그렇지 못할 경우에는 진행 애니메이션이라도 보여주는 것이 좋습니다. 이렇게 작업 애니메이션을 보여주기 위해서 C#에서는 BackgroundWorker를 많이 사용합니다. 사용자에게 보여지는 화면은 Main Thread에서 생성하고 실제 작업은 BackgroundWorker에서 담당하게 됩니다. 작업이 진행되는 동안 이벤트를 받아 UI에서 진행률을 업데이트할 수 있습니다. BackgroundWorker는 아래 3개의 이벤트를 제공하고 있습니다. DoWork : 실제 작업을 담당하는 이벤트 ProgressChanged : 작업 진행률을 업데이트하는 이벤트 RunWorkerCompleted : 작업이 끝났을 때 호출되는 이벤트 BackgroundWorker에 대한 예제는 MSDN 에서 찾을 수 있습니다. 이렇게 개발을 진행해도 되지만 개발의 편의성을 위해 BackgroundWorker와 UI를 감싸는 클래스를 만들어 보았습니다. 이 클래스는 작업이 진행되는 동안에 부모 윈도우에 작업 애니메이션을 보여주고 작업이 끝나면 애니메이션을 멈추게 됩니다. 작업은 가상 함수를 override해서 수행할 수 있습니다. 작업 애니메이션은 Telerik의 RadWaitingBar를 이용하여 구현하였습니다.(GIF 애니메이션 파일을 따로 구할 필요가 없어 편리합니다.) class ARSWorker { protected System . Windows . Forms . Control _parent = null ; private BackgroundWorker worker = new BackgroundWorker ( ) { WorkerReportsProgress = true , WorkerSupportsCancellation = true

[Telerik RadGridView] AutoSizeRows 오류

 현재 수행하는 프로젝트에서 Telerik RadGridView를 많이 사용하고 있습니다. 그리고 사용자의 가시성을 높이기 위해 Header Column을 Grouping했는데 이럴때 AutoSizeRows를 true로 설정하면 아래와 같은 오류가 발생합니다. AutoSizeRows를 true로 설정하는 이유는 Cell의 Text가 여러 라인일 경우 거기에 맞게 Row의 높이를 조정하기 위함인데 에러가 발생하니 어쩔 수 없이 프로그래밍으로 높이를 조정해야 합니다. 아래 7번째 줄에서  Text의 줄 수를 구한 뒤 적용한 Font의 높이를 곱하여 Row의 Height를 계산하여 설정하였습니다. private   void RadGridViewLineData_ViewRowFormatting ( object sender, RowFormattingEventArgs e ) { var lts = e . RowElement . RowInfo . DataBoundItem   as PNET ; if ( lts !=   null   &&   ! string . IsNullOrEmpty ( lts . Validation ) ) { var lines = lts . Validation . Split ( ' \n ' ) ; e . RowElement . RowInfo . Height   = e . RowElement . Font . Height * lines . Length ; } } 아래 그림에서 Row Height가 변경된 것을 확인할 수 있습니다.