[ Nexacro.Etc -  Graphic ]

 

 


/*********************************************************************************************
 ★ 설명
     GraphicPath의 그리기 영역을 구한다.
     GraphicPath에서 Border와 Pen의 크기를 뺀 영역을 의미한다.
 ★ parameter
    1. obj : GraphicPath Object ( 예 : GraphicPath00 )
    2. nLeftOffset : GrapicPath의 영역 중 Left에서 안쪽으로 들어가는 Offset값
     (옵션 : Default = 0) (예 : nLeftOffset=10이면 10만큼 Left에서 떨어진 지점이 영역으로 잡힘)
    3. nTopOffset : GrapicPath의 영역 중 Top에서 안쪽으로 들어가는 Offset값
     (옵션 : Default = 0) (예 : nTopOffset=10이면 10만큼 Top에서 떨어진 지점이 영역으로 잡힘)
    4. nRightOffset : GrapicPath의 영역 중 Right에서 안쪽으로 들어가는 Offset값
     (옵션 : Default = nLeftOffset) (예 : nLeftOffset=10이면 10만큼 Right에서 떨어진 지점이 영역으로 잡힘)
    5. nBottomOffset : GrapicPath의 영역 중 Bottom에서 안쪽으로 들어가는 Offset값
     (옵션 : Default = nBottomOffset) (예 : nLeftOffset=10이면 10만큼 Bottom에서 떨어진 지점이 영역으로 잡힘)★ return
 ★ Return         
    - 성공 = Rect Object
    - 실패 = null
   (단, offset이 너무커서 width나 height값보다 클 경우도 null이 return된다.)
 ★ 목적    
    GraphicPath.position을 이용하여 그리면 제대로 안되는 것을 알 수 있다. 그래서, 만들었다. Offset도 줄겸
 ★ BUG
    이 함수도 제대로 되는게 아니다. 나도 정확히 우찌해야 할지 잘 모르겠다. ???(모름)
*********************************************************************************************/

function GPRect(obj:GraphicPath, nLeftOffset, nTopOffset, nRightOffset, nBottomOffset)

{

 var GR = new Rect();

 var border, pen;

 

 if( fn_IsNull(obj) )  return null;

 if( fn_IsNull(nLeftOffset) ) nLeftOffset = 0;

 if( fn_IsNull(nTopOffset) ) nTopOffset = 0;

 if( fn_IsNull(nRightOffset) ) nRightOffset = nLeftOffset;

 if( fn_IsNull(nBottomOffset) ) nBottomOffset = nTopOffset;

 

 border = ( "x"+obj.style.border.width == "xNaN" ? 0 : obj.style.border.width );

 pen = ( "x"+obj.strokepen.width == "xNaN" ? 1 : obj.strokepen.width );

 GR.left = nLeftOffset;

 GR.top = nTopOffset;

 

 // 이렇게 하는게 최선이다.

 GR.right = obj.position.width - nRightOffset - 2*border - pen;

 GR.bottom = obj.position.height - nBottomOffset - 2*border - pen;

 if( GR.width < 0 || GR.height < 0 )

  return null;

 

 return GR;

}

 

/*********************************************************************************************
 ★ 설명
     GraphicPath처리 시 화살표처리 Data를 만들어 준다.
     이미 그려놓은 GraphicPath.data에 이 함수에서 return된 data를 덧붙여 처리해서 사용한다.
 ★ parameter
    1. obj:GraphicPath : GraphicPath Object ( 예 : GraphicPath00 )
    2. nArrowType  : 화살표의 종류( 예 : 1 )
       - 0 = 화살표 안그림
       - 1 = ---> 화살표
       - 2 = ---▶ 화살표
       - 3 = ---◆ 화살표
       - 4 = ---● 화살표
    3. nEndX, nEndY, nDirAngle : 화살표의 위치 및 화살표 방향
       - nEndX, nEndY : 화살표의 끝좌표
       - nAngle       : 화살표의 방향, 단 Radian값이다.
                        화살표 끝좌표의 가로축과 시작방향이 이루는 각이다.
                        (※ GetAngle()함수를 이용하면 쉽게 구할 수 있다.)
       (예 : (15,15) ----> (20,20) 으로 화살표를 그리고 싶다면
             nEndX = 20, nEndY = 20, nAngle = Deg2Rad(-45) )
    4. 화살표가 그려질 선을 중심으로 화살표의 넓이와 높이
       1) nArrowW : 화살표 넓이
       2) nArrowH : 화살표 높이
       (※ 단, ---●의 경우 타원처리는 안되고 nArrowW, nArrowH중 작은 쪽을 반지름으로 하는 원만 처리한다. )
                    (20)
       (예 : -----(0)▶(10) ==> nArrowW = 10, nArrowH = 20 )
                     (0)
                    (20)
       (예 : -----(0)◆(10) ==> nArrowW = 10, nArrowH = 20 )
                     (0)
 ★ return
    - 성공 = GraphicPath.data에 들어갈 화살표 Data
    - 실패 = ""
*********************************************************************************************/

function GPArrow(obj:GraphicPath, nArrowType, nEndX, nEndY, nAngle, nArrowW, nArrowH )

{

 var D="";

 var nDirX, nDirY;

 var nArrowOrgX, nArrowOrgY, nArrowCoW, nArrowCoH, nArrowDist;

 var nArrowType;

 

 if( fn_IsNull(obj) || fn_IsNull(nArrowType) || fn_IsNull(nEndX) || fn_IsNull(nEndY) ||

  fn_IsNull(nAngle) || fn_IsNull(nArrowW) || fn_IsNull(nArrowH) )

  return "";

  

 // ->, ▶

 if( nArrowType == 1 || nArrowType == 2 )

 {

  nArrowCoW = nArrowW;

  nArrowCoH = Math.round(nArrowH/2,1);

 }

 // ◆, ●

 else if( nArrowType == 3 || nArrowType == 4 )

 {

  nArrowCoW = Math.round(nArrowW/2,1);

  nArrowCoH = Math.round(nArrowH/2,1);  

 }

 else

  return "";

 

 if( nArrowType == 4 )

  nArrowDist = Math.min(nArrowW,nArrowH);

 else

  nArrowDist = Math.sqrt(Math.pow(nArrowCoW,2)+Math.pow(nArrowCoH,2));

  

 nArrowOrgX = nEndX + nArrowDist*Math.cos(nAngle);

 nArrowOrgY = nEndY - nArrowDist*Math.sin(nAngle);

/*

D  = " M " + nEndX + " " + nEndY;

 

D += " L " + nArrowOrgX + " " + nArrowOrgY;

 

return D;

 

*/

 // ->

 if( nArrowType == 1 )

 {

  var nArrowAngle, vRotatePoint1, vRotatePoint2;

  

  nArrowAngle = Math.atan2(nArrowCoH,nArrowCoW);

  vRotatePoint1 = RotatePoint( nArrowOrgX, nArrowOrgY, nEndX, nEndY, nArrowAngle );

  vRotatePoint2 = RotatePoint( nArrowOrgX, nArrowOrgY, nEndX, nEndY, -1*nArrowAngle );  

     

  D += " M " + nEndX + " " + nEndY;  

  D += " L " + vRotatePoint1.left + " " + vRotatePoint1.top;

  D += " M " + nEndX + " " + nEndY;    

  D += " L " + vRotatePoint2.left + " " + vRotatePoint2.top;

 }

 // ▶

 if( nArrowType == 2 )

 {

  var nArrowAngle, vRotatePoint1, vRotatePoint2;

 

  nArrowAngle = Math.atan2(nArrowCoH,nArrowCoW);

  vRotatePoint1 = RotatePoint( nArrowOrgX, nArrowOrgY, nEndX, nEndY, nArrowAngle );

  vRotatePoint2 = RotatePoint( nArrowOrgX, nArrowOrgY, nEndX, nEndY, -1*nArrowAngle );  

 

  D += " M " + nEndX + " " + nEndY;  

  D += " L " + vRotatePoint1.left + " " + vRotatePoint1.top;

  D += " L " + vRotatePoint2.left + " " + vRotatePoint2.top;

  D += " L " + nEndX + " " + nEndY;    

 }

 // ◆

 if( nArrowType == 3 )

 {

  var nArrowAngle, vRotatePoint1, vRotatePoint2, vRotatePoint3;

  

  nArrowAngle = Math.atan2(nArrowCoH,nArrowCoW);

  vRotatePoint1 = RotatePoint( nArrowOrgX, nArrowOrgY, nEndX, nEndY, nArrowAngle );

  vRotatePoint2 = RotatePoint( nArrowOrgX, nArrowOrgY, nEndX, nEndY, -1*nArrowAngle );

  vRotatePoint3 = RotatePoint( nEndX, nEndY, vRotatePoint1.left, vRotatePoint1.top, Math.PI-2*nArrowAngle );

  

  D += " M " + nEndX + " " + nEndY;  

  D += " L " + vRotatePoint1.left + " " + vRotatePoint1.top;

  D += " L " + vRotatePoint3.left + " " + vRotatePoint3.top;

  D += " L " + vRotatePoint2.left + " " + vRotatePoint2.top;

  D += " L " + nEndX + " " + nEndY;   

 }

 // ●

 if( nArrowType == 4 )

 {

  var nRX, nRY;

 

  nRX = nRY = Math.min(nArrowCoW,nArrowCoH);

  D += " M " + nEndX + " " + nEndY;

  D += " A " + nRX + " " + nRY + " 180 0 1 " + nArrowOrgX + " " + nArrowOrgY;  

  D += " A " + nRX + " " + nRY + " 180 0 1 " + nEndX + " " + nEndY;    

 }

 return D;

}

 

/*********************************************************************************************
 ★ 설명
     GraphicPath.data를 2차원 Array로 반환한다.
     단순히 Parsing만 하며 Array의 순서는 GraphicPath.data의 순서를 그대로 따른다.
     단, type이 중복되어 생략되는 경우(예: V 100 100) Array가 추가되고 첫번째 요소는 ""가 들어간다.
     (아래 예를 참고할것)
 ★ parameter
    1. sGpData : GraphicPath.data ( 예 : "M 0 0 L 100 100 H 100 V 100 100" )
 ★ return
    - 성공 = 2차원 Array
             ( 예 : Array ==> { {M,0,0}, {L,100,100}, {H,100}, {V,100}, {,100} }
    - 실패 = 빈 Array
 ★ 목적    
    GraphicPathData Object가 있었다가 사라졌다.
 ★ 참고사항
    aGpData로 data문자열을 만들고 싶다면 ==> GraphicPath.data = aGpData.join(" "); 로 처리하면 된다.
 ********************************************************************************************/

function AGPData(sGpData)

{

 var aGpData = new Array();

 var arr = new Array();

 var i, gi_no=-1, ho_no, val, sType, ho_num;

 

 if( fn_IsNull(sGpData) )  return aGpData;

 

 sGpData = sGpData.toString();

 arr = sGpData.split(" ");

 for( i = 0 ; i < arr.length ; i++ )

 {

  val = RTrim(LTrim(arr[i]));

  if( IsAlpha(val) == true )

  {

   gi_no++;

   ho_no = 0;

   

   var aHor = new Array(); // 2차원 배열의 가로 배열

   aGpData[gi_no] = aHor;

   aGpData[gi_no][ho_no] = val;

   sType = val;

  }

  else if( IsNum(val) == true )

  {

   ho_no++;  

   if( ( (sType == "M" || sType == "m") && ho_no == 3) ||

    ( (sType == "L" || sType == "l") && ho_no == 3) ||

    ( (sType == "H" || sType == "h") && ho_no == 2) ||

    ( (sType == "V" || sType == "v") && ho_no == 2) ||

    ( (sType == "A" || sType == "a") && ho_no == 8) ||

    ( (sType == "C" || sType == "c") && ho_no == 7) )

   {

    gi_no++;

    ho_no = 0;

 

    var aHor1 = new Array(); // 2차원 배열의 가로 배열

    aGpData[gi_no] = aHor1;

    aGpData[gi_no][ho_no] = "";    

    ho_no++;

    aGpData[gi_no][ho_no] = parseInt(val);

   }

   else

   {

    aGpData[gi_no][ho_no] = parseInt(val);

   }

  }

 }

 

 return aGpData;

}

 

 

☞  

 

☞  

 
 
 
 

  

'Nexacro-Function > ETC' 카테고리의 다른 글

Nexacro.Array - 값 존재 위치(index)얻기  (0) 2017.02.09
Nexacro.Etc - 파일관리  (0) 2017.01.28
Nexacro.Etc - 확장 비교함수  (0) 2017.01.28
Posted by 농부지기
,