Code Monkey home page Code Monkey logo

thothcanvas's People

Contributors

hjfactory avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar

thothcanvas's Issues

멀티 레이어 구성

자유선 그리기, 도형 그리기, 멘토링, 배경 등의 레이어 구성 가능해야 한다.

도형 다중 선택

  • Shift 클릭 시 선택 추가
  • 선택된 도형인 경우 해당 도형 선택 해제

그리기 실행취소

마지막으로 작업한 내용 되돌리기

구상

  • 실행취소 가능한 작업은 커맨드 패턴으로 Execute / Rollback 코드 구성?

도형 선택

마우스 다운 시 기존 도형 중 지정 해 Selection에 할당?

  • 마우스 다운의 구분은?(CanvasMode = Selection?)
  • MD 시 기존 도형 구역(Bounds) 비교 후 영역 교차 비교해 선택
  • 선택이 없는 경우 기존 선택 초기화
  • 선택이 바뀐 경우 기존 선택 초기화 후 선택
  • 기존 선택을 선택한 경우 무시
  • 추가 선택이 신규 선택인 경우 선택 추가
  • Selection 객체에 추가

선택한 도형의 핸들표시는 누가? 1) 도형객체 자체 2) Selection/SelectObj가 표시
다중 선택은? Shift 클릭 시 다중 선택
SelectObject에서 처리? ShapeLayer에서 처리?

DrawStyleManager 추가

Draw 스타일 데이터 관리자
드로윙툴의 툴팔랫트와 같이 지정된 색상과두께의 펜을 사전에 제공하는 기능

  • 스타일 등록
  • 스타일 분류
  • 스타일 지정(분류 별) - Pen 스타일 3개 중 하나 지정 > 지정한 스타일로 그리기
  • 지정 스타일 변경
  • Change notification(Event or Observer)
  • 싱글톤 적용

CanvasMode 적용

CanvasMode에 따라 드른 그리기를 동작해야 한다.

  • FreeDraw : 자유선 그리기
  • ShapeDraw : 도형 그리기

도형(사각형) 추가

  • Mounse Down > Move > Up 시 화면에 그리기
  • Mouse Up 시 객체 목록에 추가
  • 객체 목록 출력
  • 추가 후 도형 선택

ThItem > ThDrawItem > ThShapeItem > ThRectangleItem

다양한 도형 제공

DrawObjectManager(DOMgr: 그리기 객체 관리자)

  • 사전에 DOMgr에 DO 등록
  • 그리기 시 Id로 DO 가져와 그리기 처리
  • 그린 데이터(DrawItems) 그리기 시 DO 가져와 그리기 처리

선택한 도형 크기 변경

ShapeObj에서 구현?

  • 선택 시 핸들 표시(모두 8개? 우선 8개)
  • 핸들에 마우스 오버 표시
    • 마우스이동 시 도형 지정 - MouseDownMove / MouseMove 구분
    • 마우스로 특정 핸들 지정
  • 핸들 이동 시 도형 크기 변경
    • 마우스 다운 시 핸들 지정

RBLayer? Selection 직접 구현(FMX 버전과 같이)?

Draw 통합

DrawItem과 DraoObject의 Draw작업 통합

도형간 연결 선(도형과 꼭지점 선택)

도형에 연결점(LinkPoint) 설정 후 연결선 핸들 드래그해 연결점과 연결하도록 구현

  • 도형에 연결점 설정
  • 연결선 정의
  • 연결선 변경 시 연결점 근처 가면 HotHandle 표시
  • 연결선 근처서 마우스업 시 연결점과 연결
    • 연결선의 AnchorPoint에 도형(&AnchorPoint) 지정
  • 도형 이동 시 연결점 위치 변경

이슈

  • 도형 MouseEnter/Leave 이벤트에 ItemConnection 포함

MD / MM / MU 이벤트 처리 정리
Canvas > SelObj > Items > Item > Selection 구조

  • Canvas는 SelObj에 마우스 처리 위임
  • SelObj는 Items 통해 OveredItem 파악
    • PtInItem(Bounds<Selection 영역까지 Inflate> 확인 후 PtInPoly 및 PtInSelection으로 확인)
  • OveredItem에 MM 위임
    • HotHandle 처리
    • MoveItems 예외(?)

MM

  • if Downed
    • Item > Move
    • Handle > Resize
      • Item Is Connector and Pt In Item then Show Connection
  • else
    • change cursor

영역 지우개

지우개(두께, 모양? 지정 가능)가 지나간 자유선 영역이 지워져야 한다.

  • 도구 타입 변경
  • 마우스 커서 변경
  • 지우개 두께 지정
  • 지우개 모양 지정(네모, 동그라미)
  • 마우스포인트의 객체(들) 지정
  • 위 객체 대상과 겹치는 영역 지우기(Clipper 이용?)

기능 캡슐화?가 좋을까?

화살표 머리를 갖는 직선 도형

  • 직선 그리기(ShapeItem 상속)
  • 선 클래스 추가(TCustomLIneItem)
    • TShapeItem을 도형과 선으로 분리
    • ShapeSelection을 LineSelection으로 분리
  • LineTo에 화살표 머리 표시
  • 화살표 머리 다형성 처리
  • 라인과 화살표 병합

객체 지우개

  • 마우스포인트의 객체(들) 선별
  • 지우개가 지나간 객체 삭제예고 표시(흐리게?)
  • 지우기 취소
  • 지우기 시 객체 제거

Canvas - Refactoring

ThCanvas>ImgView

  • 레이어 목록 관리
  • 설정(PenSize, ShapeType 등)값은 Interface로 전달

레이어

  • ThDrawLayer : DrawItem 목록을 그림(ReadOnly)
    • FreeDrawLayer : 자유선 그리기 추가
    • ShapeDrawLayer : 도형 그리기 추가

아이템

  • ThItem
    • DrawItem : Draw(Bitmap, Scale, Offset) 메소드 제공
      • FreeDrawItem
        • FDPenItem
        • FDEraserItem
      • ShapeItem
        • RectItem
        • CircleItem
        • ....

한획 별로 객체화

향후 지우개로 객체 지우개 기능에 필요

  • MouseUp 시 객체 생성 후 좌표, 색상, 두께 보관
  • FreeDrawLayer에 객체목록에 추가
  • Paint 시 객체 목록 표시

Path to Polygon을 시점은? 확정 필요

방안1 - 객체가 Path와 Polygon 정보 보유, Paint 시 Polygon 좌표 변환 해 출력
방안2 - 객체가 Path만 보유, Paint 시 Path 변환 후 Polygon 생성 해 출력

우려/고려 사항

  • 두가지 방안 별도 구현
  • 같은 데이터로 성능 테스트
  • (방안1) 정상적으로 표시되는가?
  • (방안1) 너무 많은 양을 표시하지 않는가?
  • (방안2) 빈번한 Paint 시 Clipper 작업이 성능에 영향을 주지 않는가?(객체가 많아진다면?)
  • (방안2) 지우기 시 Polygon 비교가 가능한가?

그리기 영역에 제한을 둘필요가 있는가?

  • 음수 영역에 그릴 수 있는지 검토(불가)
  • 좌표 끌어서 이동 기능 검토

CustomLayer 상속 받아 영역 상관없이 그리기 가능할 것으로 예상

  • CustomLayer > PositionedLayer > BitmapLayer
  • FreeDrawLayer는 PositionedLayer 상속

Image32(ImgView)는 Bitmap과 Buffer 2개의 그리기 영역을 제공 두개다 Size 지정 필요
계획상 페이지 개념으로 영역을 두는 것이 좋을 것이라 판단해 해당 이슈 보류

FreeDrawMode 적용

자유선 그리그의 경우 Pen과 Eraser 2개이므로 모드에 따라 다른 동작을 수행한다.
Shape의 경우 모양이 한정되지 않으므로 다른 방식 지원이 필요하다.

도형 기본 정보 설정

도형을 클릭해 놓은 경우 기본 크기로 도형 생성

  • 클릭한 경우 놓기
  • 기본 크기 지정
  • 선두께 지정
  • 선 색상 지정

Clipper 통합 가능여부 검토

(GR32_Clipper 이용 시 FloatPoint로 병합 중 오류발생하는 경우 있었음)
폴리곤 병합 시 clipper library 이용 중임.FloatPoint를 IntPoint로 변환해 clipper 처리

  • GR32의 FixedPoint로 변환해 clipper 처리도 가능할지 검토

가능하다면, 하나의 라이브러리로 통합이 좋음

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.