반응형

이번 포스트에서는 매직완드를 스크립트로 실행하는 방법을 설명 드리겠습니다.

 

매직완드 스크립트

포토샵의 매직 완드는 일반적인 스크립트로는 작성이 불가능하기 때문에 scriptListner 를 통하여 추출된 코드를 응용하여 개발을 해야 합니다. scriptListner 는 포토샵에서 이루어지는 거의 모든 기능에 대하여 출력을 해주기 때문에 일반적인 스크립트로 작성이 불가능한 기능에 대하여 개발을 해야 할 때 이용하기 좋은 멋진 플러그인 입니다.

나중에 한번 따로 설명을 드리도록 하겠습니다.

 

복잡하게 설명할 것 없이 바로 코드 갑니다. 이런 류의 코드는 직접 짜는 것이 거의 불가능하기 때문에 그냥 복붙하셔서 사용하시는 것이 가능 좋겠습니다.

function selectbyMagicWand(_x, _y, tolnc, anti, conti,merg){
    var idsetd = charIDToTypeID( "setd" );
    var desc103 = new ActionDescriptor();
    var idnull = charIDToTypeID( "null" );
        var ref53 = new ActionReference();
        var idChnl = charIDToTypeID( "Chnl" );
        var idfsel = charIDToTypeID( "fsel" );
        ref53.putProperty( idChnl, idfsel );
    desc103.putReference( idnull, ref53 );
    var idT = charIDToTypeID( "T   " );
        var desc104 = new ActionDescriptor();
        var idHrzn = charIDToTypeID( "Hrzn" );
        var idPxl = charIDToTypeID( "#Pxl" );
        desc104.putUnitDouble( idHrzn, idPxl, _x );
        var idVrtc = charIDToTypeID( "Vrtc" );
        var idPxl = charIDToTypeID( "#Pxl" );
        desc104.putUnitDouble( idVrtc, idPxl, _y );
    var idPnt = charIDToTypeID( "Pnt " );
    desc103.putObject( idT, idPnt, desc104 );
    var idTlrn = charIDToTypeID( "Tlrn" );
    desc103.putInteger( idTlrn, tolnc );
    var idMrgd = charIDToTypeID( "Mrgd" );
    desc103.putBoolean( idMrgd, merg );
    var idAntA = charIDToTypeID( "AntA" );    
    desc103.putBoolean( idAntA, anti );
    var idCntg = charIDToTypeID( "Cntg" );
    desc103.putBoolean( idCntg, conti );
executeAction( idsetd, desc103, DialogModes.NO );

}

 

총 6개의 입력값을 갖는 함수로 정리를 하였습니다.

각 함수의 인자는 아래와 같은 속성을 갖습니다.

  • _x : 숫자 : 매직완드의 포인터 X좌표 
  • _y : 숫자 :  매직완드의 포인터 Y 좌표
  • tolnc : 숫자 0  ~ 255 : tolerance, 선택된 색상 값의 확장 범위. 0 일경우 완전히 같은 색상일 경우만 선택된다.
  • anti : boolean : True or False 를 입력하며 경계 영역의 부드러운 처리여부
  • conti :  boolean : True or False 를 입력하며 연속된 영역 안에서만 할 것인지 화면 전체로 할 것인지
  • merge : boolean : True or False 를 입력하며 현재 레이어만 대상으로 할것인지 전체 레이어로 할 것인지

바로 아래 옵션에 해당되는 옵션들 입니다.

 

시제 사용하실 때는 아래와 같이 사용하시면 됩니다.

// 좌상단 1,1 위치의 색상을 pick 하여 선택 영역 생성
selectbyMagicWand(0, 0, 0, false, true, true) 

 

참고로 x, y 좌표 값은 -1 한 값을 입력하시면 됩니다.

 

사용하시면서 궁금하신 내용이 있으시면 뎃글 남겨주세요~

감사합니다.

 

반응형
반응형

엑셀 파일을 이용하여 정말 다양한 작업이 가능합니다. 계산이며 표만들기며 각종 정보를 분석하거나 데이터 화 시키는 작업 등 정말 할 수 있는 일이 무궁무진 하죠. 그런데 가끔 엑셀을 이용하여 특정 정보를 별도로 텍스트 등으로 저장해야 하는 경우가 있습니다. 개발 쪽에서 어떤 데이터 리스트를 csv 형태로 요구하였는데 그러기 위하여는 굳이 정보를 재 가공 해야 하는 경우라던가 자료의 특성상 데이터를 가공하는 위험 부담이 있는 경우에는 좀 부담스럽죠.

필요한 필드만 또는 특정 필드의 값들을 특정 형태로 가공해서 저장하고 싶을 때 스크립트를 이용하여 파일 쓰기를 해 줄 수 있다면 큰 도움이 될 겁니다.

아니면 HTML 이나 CSS 처럼 엑셀에 있는 정보들을 특정한 포멧에 맞게 뽑고 싶은데 엑셀의 저장 기능에는 그런것은 없기 때문에 코딩을 할 수 있게 되면 활용 범위가 더욱 커지고 불필요한 노동을 줄일 수 있습니다.

 

오늘은 엑셀에서 텍스트 파일 형태로 파일을 추출하는 간단한 방법을 알아보도록 하겠습니다.

 

코드는 대충 아래와 같습니다.

Open FILE_NAME For Output As #1
Print #1, YOUR_STRING
Close #1

아주 간단하죠? 간단해서 제가 자주 사용하는 코드 입니다.

FILE_NAME 부분에 실제 저장되어야 할 파일 명을 경로를 포함하여 적어주시고요 저장하고 싶은 텍스트를 YOUR_STRING 부분에 넣으면 해당 파일을 기록하고 닫는 코드 입니다.

손쉽게 사용하기 위하여 함수 형태로 만들면 아래와 같이 되겠습니다. 물론 너무 짧아서 굳이 함수로 만들 필요도 없기는 하지만요.

Sub writeMyFile (byVal strPath as string, byVal currentText as string)
	Open strPath For Output As #1
	Print #1, currentText
	Close #1
End Sub

'사용할때 '

sub test()
	dim myString as string
	myString = "hello" & vbNewLine
	myString = myString & "DIY" & vbNewLine
	myString = myString & "DEV" & vbNewLine
	myString = myString & "DESIGN" & vbNewLine
	
    writeMyFile "d:\test.ini", myString
end sub

 

아래 test 라는 함수에서 실제 텍스트를 써주는 부분을 호출하고 아래와 같은 파일이 만들어 지게 됩니다.

보시는 것처럼 vbNewLine 과 같은 줄바꿈 기호 등을 줄의 맨뒤에 추가하여 여러줄을 동시에 기록하는 것도 가능합니다.

제가 만든 test 부분에서 기록하고 싶은 여러 내용을 포멧에 맞게 변수에 저장을 한 뒤 마지막에 파일을 써주는 함수에 보내면 원하는 형식으로 텍스트 파일이 만들어 지는 것이죠.

 

자 손쉽게 엑셀의 자료를 텍스트 파일로 기록해 주는 함수를 만들어 보았습니다. 스트링 형식으로 저장된 내용을 그냥 기록만 해주면 되기 때문에 해당 기능을 이용하여 자바스크립트, CSS, HTML 등의 형식으로 손쉽게 저장하 실 수 있습니다.

참고로 저는 이미지를 붙여 넣는 기능과 함께 해당 이미지를 웹 브라우저를 통해 미리 볼 수 있는 html 을 뽑는 스크립트를 자주 사용합니다. 웹 브라우저에서 이미지를 보게 되면 파일이 많아도 화면 이동 속도가 거의 느려지지 않고 이미지와 함께 전달하게 되면 사용자가 간단하게 이미지 리스트를 확인 할 수 있기 때문입니다. 또한 이미지 수정 시 별도로 엑셀등을 수정하지 않고 저장된 이미지만 교체하면 바로 수정된 결과를 볼수 있는 장점도 있기 때문입니다.

사용하시는 분마다 용도는 다르겠지만 텍스트를 추출하는 기능만으로도 아주 커다란 효과를 낼 수 있을지 모릅니다.

 

자 그럼 오늘은 이만~

2019/07/12 - [DEV/VBA] - [vba] 자동화를 위하여 엑셀의 영역 설정하는 방법

2019/08/12 - [DEV/VBA] - [VBA] 문자열 가지고 놀기

2019/07/12 - [DEV/VBA] - [vba] For 구문 이용하기와 offset 사용 해 보기

2019/09/20 - [DEV/VBA] - [VBA] 엑셀에 그림 자동으로 넣기

반응형
반응형

정말 지긋지긋한 마이크로 소프트 입니다. 저는 VBA 를 하면서 이번 포스트 내용만큼 어의가 없는 경우는 없었던거 같습니다. 왜 때문이냐고요? 바로 아주 단순한 셀 넓이를 VBA 를 이용하여 지정하는 방법 때문입니다.

자 제가 왜 이런 반응을 보이는가 하면요.

엑셀 VBA 에서 셀의 넓이 즉 range.columnWidth 를 지정할때 정말 독특한 단위와 방법을 사용하기 때문입니다.

일단 셀의 넓이는 다음의 두가지 방법으로 구할 수 있습니다. 그런데 그 두가지가 반환하는 값의 정체를 보면 정말 당황스럽기 짝이 없죠.

Range.Width [읽기]
 : 셀의 넓이를 point 로 반환한다. 

Range.ColumnWidth [읽기/쓰기]
 : (나름데로 해석한 결과)셀의 넓이를 현재 지정된 폰트의 "Normal" 인 상태를 기준으로 하는 글자 하나의 크기를 1로 하고 마진값을 추가한 값을 설정 또는 반환한다.

 

 

????????????

 

 

저게 뭔가요.. 

물론 글자가 짤리 않도록 셀의 폭을 지정하는 기능 아주 좋습니다. 글자수만 알면 되는거죠. 훌륭합니다. 네.

그런데 왜 Width 는 읽기 만 가능하며 point 나 pixel 같은 값으로는 설정이 안되는 것인가요? 저와 같은 그래픽 디자이너는 이미지를 붙이든 뭘해도 pixel 을 기준으로 값을 정의하는게 일상인데요. 뜬금없이 왠 글자의 크기를 이용하여 margin 까지 덧붙여 크기가 지정되는 걸까요? 게다가 현재 지정된 폰트의 Normal 상태 일때 라니... 만약 글자 크기가 달라지거나 스타일이 달라지면 같은 값을 지정해도 폭이 달라질 수 있다는 이야기가 됩니다.

 

해외 사이트들을 구글링 해보았으나 마땅한 답이 없더군요. 

그래서 그냥 코드를 짜 보았습니다.

VBA function : Pixel to ColumnWidth

Sub setColumnWidth(ByVal mRng As Range, ByVal targetWidth_pixel As Integer)

    'point = pixel * 0.75'
    'pixel = point / 0.75'
    'columnWidth = char Width + margin(fixed)'
    
    Dim cWidth_A As Double
    Dim cWidth_B As Double
    Dim cWidth_margin As Double
    Dim columnWidthRatio As Double
    Dim testColumnWidth As Double
    
    Dim cWidth As Double
    
    testColumnWidth = 10
    
    
    ' 가로 크기 지정시 발생되는 margin 을 알아보기 위하여 1배, 2배 크기일때 유지되는 margin 을 구해보자'
    mRng.ColumnWidth = testColumnWidth
    cWidth_A = mRng.Width   '(point)'
    
    mRng.ColumnWidth = testColumnWidth * 2
    cWidth_B = mRng.Width   '(point)'
    
    ' 항상 고정으로 유지되는 margin 크기 확인 (point)'
    cWidth_margin = cWidth_B - ((cWidth_B - cWidth_A) * 2)
        
    'point 값이 columnWidth 로 변환되기 위한 ratio 를 구한다. 이때 전체 넓이에서 위에서 구한 margin 을 생략하고 계산한다. '
    'columnWidthRatio : point --> columnWidth'
    columnWidthRatio = mRng.ColumnWidth / (cWidth_B - cWidth_margin)
    
    '최종 크기 지정'
    mRng.ColumnWidth = (targetWidth_pixel - (cWidth_margin / 0.75)) * 0.75 * columnWidthRatio
        
        
End Sub

 

약간 복잡해 보이지만 함수 형태로 만들어 놓았으므로 코드를 가져다가 그냥 사용하시면 됩니다. 인자로 크기를 조정해야 하는 셀과 pixel 기준의 크기를 입력해 주시면 되고요. 아래와 같이 사용하시면 됩니다.

Sub test()
    Dim rngA As Range    
    Set rngA = [d3]
    
    setColumnWidth rngA, 256
End Sub

 

이렇게 하면 D3 에 해당하는 column 의 폭이 256 pixel 로 설정이 됩니다.

 

코드를 좀 보시는 분은 금방 아시겠지만 원리는 다음과 같습니다.

columnWidth 는 고정된 단위가 아니므로 point 라는 단위를 이용하여 columnWidth 로 환산하기 위한 ratio 를 구해야 합니다. columnWidth / Width 하면 되는거죠. 그런데 여기에 함정이 있습니다. 

columnWidth 라는 값이 반환하는 값이 글자의 폭 + margin 이기 때문에 위와 같이 단순 계산을 하면 정확한 값으로 설정을 할 수가 없습니다. margin 만큼씩 계속 오차가 있는 것이지요. 그래서 margin 을 구하는 과정이 선행되었던 것입니다.

제가 몇번 테스트 해본 결과 글자을 속성을 중간에 바꾸지 않는다면 margin 의 값은 항상 일정한 것을 확인하였기 때문에 columnWidth 를 10 , 20 으로 두배 차이나게 각각 적용했을때의 Width 를 이용하여 변하지 않는 크기를 찾아내 해당 크기를 margin 으로 지정하였습니다.

결과적으로는 현재 구해진 Width(point) - margin(point) 로 ColumnWidth 를 나누어 주게 되면 point 값을 columnWidth로 환산 하기 위한 비율이 구해지게 되는 것이죠.

끝으로 입력된 픽셀에서 margin 에 해당되는 픽셀 크기를 빼 준뒤 point 로 전환한 다음 위에서 구한 비율을 곱해주게 되면 정확하게 pixel 에 대응되는 columnWidth 를 구할 수 있게 됩니다.

 

정말 저는 미국인들이 inch 를 사용하는 이유도 모르겠고 microSoft 사에서 위와 같이 독특한 단위만 입력하도록 개발해놓은 이유도 알 수가 없습니다. 

이번 기회로 저역시 좋은 공부가 되었기에 포스트로 남깁니다.

도움이 되셨거나 본 포스트가 괜찮으셨으면 공감 부탁드립니다~

 

2020/01/30 - [분류 전체보기] - [vba] 셀 속성 조정하기 (넓이, 높이, 숨기기, 테두리 등)

 

[vba] 셀 속성 조정하기 (넓이, 높이, 숨기기, 테두리 등)

이번 포스트에서는 vba 를 이용하여 셀의 속성을 조정하는 방법을 설명 드리겠습니다. 엑셀은 단순한 표의 형식을 취하고 있지만 셀의 간격이나 테두리 등의 속성을 자유롭게 조정할 수 있어 다양한 서식에 사용하..

diy-dev-design.tistory.com

2019/09/20 - [DEV/VBA] - [VBA] 엑셀에 그림 자동으로 넣기

 

[VBA] 엑셀에 그림 자동으로 넣기

안녕하세요. 이번 강좌에서는 엑셀 시트에 있는 이미지 파일 경로를 이용하여 셀에 이미지를 붙여넣는 스크립트를 한번 알아 보겠습니다. 엑셀에 이미지를 몇장 붙여 넣는 거야 그림 삽입하기로 손쉽게 넣으면 되..

diy-dev-design.tistory.com

2019/08/30 - [DEV/VBA] - [VBA]RGB 색상 값이 들어있는 셀에 셀 색상 지정하기

 

[VBA]RGB 색상 값이 들어있는 셀에 셀 색상 지정하기

이번 강좌에서는 셀에 입력되어 있는 컬러 값을 이용하여 셀의 색상을 지정하는 방법을 알아보도록 하겠습니다. 디자이너 분들이라면 언제가 한번쯤은 엑셀 시트에 자신이 정의한 컬러 값을 정리해서 보내야 하는..

diy-dev-design.tistory.com

2022.12.02 - [DEV/VBA] - [excel vba] 16진수를 10진수로, 10진수를 16진수로 변경

 

[excel vba] 16진수를 10진수로, 10진수를 16진수로 변경

오늘은 간단한 VBA 코드를 하나 소개해 드릴까 합니다. 프로그래밍을 하다보면 16진수를 10진수로 바꾸거나 10진수를 16진수로 바꾸어야 하는 경우가 종종 있습니다. 읭? 16 진수? 라고 하실수도 있

diy-dev-design.tistory.com

 

 

반응형
반응형

오늘 소개해 드릴 스크립트는 간단한 내용이지만 일반 적인 스크립트상으로 개발이 불가능하기에 경우에 따라는 아주 유용한 스크립트가 되겠습니다.

우리는 작업 중 상당한 빈도로 포토샵 레이어의 컨텐츠 영역만을 선택하여야 하는 경우가 있습니다. 

레이어 영역으로 선택하기

이럴때 단축키로 [Ctrl + 레이어 썸네일 클릭] 하는 방법으로 선택영역을 만들어 내는데요. 이 기능이 javascript reference 로는 구현이 불가능 합니다. 

오늘은 바로 그 스크립트로 레이어 영역 선택하는 방법를 소개해 드릴까 합니다.

코드는 아래와 같습니다.

function selectBylayer (lname) {    
  var idsetd = charIDToTypeID( "setd" );
      var desc1 = new ActionDescriptor();
      var idnull = charIDToTypeID( "null" );
          var ref1 = new ActionReference();
          var idChnl = charIDToTypeID( "Chnl" );
          var idfsel = charIDToTypeID( "fsel" );
          ref1.putProperty( idChnl, idfsel );
      desc1.putReference( idnull, ref1 );
      var idT = charIDToTypeID( "T   " );
          var ref2 = new ActionReference();
          var idTrsp = charIDToTypeID( "Trsp" );
          var idLyr = charIDToTypeID( "Lyr " );
          ref2.putEnumerated( idChnl, idChnl, idTrsp );
          ref2.putName(idLyr,lname)
      desc1.putReference( idT, ref2 );
  executeAction( idsetd, desc1, DialogModes.NO );
}

바로 이 코드 입니다. 자바스크립트의 문법을 이용하고는 있지만 레퍼런스에 나와있는 것과는 사뭇 다른 형태의 코드 인데요. 아마로 PS 내부에서 동작하는 방식을 자바스크립의 문법을 통하여 열거해 놓은 것이 아닐까 생각됩니다.

해당 코드를 본인의 스크립트 하단에 붙여 넣고 기능을 사용하면 되는데요. 

function selectBylayer (lname)  에서 "lname" 에 해당 하는 부분에 레이어의 이름을 적어 넣으면 해당 레이어의 영역이 선택이 됩니다.

만약 선택해야 하는 레이어 이름이나 종류에 따라 아래와 같이 사용하면 됩니다.

// 선택해야 할 레이어의 이름이 "Layer 0" 이라면 
selectBylayer ("Layer 0");

// 선택해야 할 레이어의 이름은 모르겠고 항상 첫번째 레이어라면
var cDoc = app.activeDocument;
selectBylayer (cDoc.layers[0].name);

// 선택해야 할 레이어가 가장 마지막 레이어라면
var cDoc = app.activeDocument;
selectBylayer (cDoc.layers[cDoc.layers.length-1].name);

 물론 코드 하단에는 위에 제가 올려드린 코드가 함께 존재해야 동작이 되니 참고하세요.

 

 

 

 

 

이상으로 스크립트로 레이어 영역을 선택하는 방법을 소개해 드렸습니다.

 

 

감사합니다.

 

2020/04/02 - [DEV/Adobe Script] - [포토샵스크립트] color fill 하기

 

[포토샵스크립트] color fill 하기

이번 강좌에서는 포토샵 스크립트를 이용하여 color fill 기능을 사용하는 방법을 알려 드리겠습니다. 포토샵에서 아주 많이 사용하는 기능이지만 일반적인 스크립트에서 구현이 되지 않아 답답하셨죠? 제가 올려..

diy-dev-design.tistory.com

2020/02/14 - [DEV/Adobe Script] - [포토샵스크립트] 매직완드 기능 스크립트로 실행하기

 

[포토샵스크립트] 매직완드 기능 스크립트로 실행하기

이번 포스트에서는 매직완드를 스크립트로 실행하는 방법을 설명 드리겠습니다. 포토샵의 매직 완드는 일반적인 스크립트로는 작성이 불가능하기 때문에 scriptListner 를 통하여 추출된 코드를 응용하여 개발을..

diy-dev-design.tistory.com

2019/12/11 - [DEV/MAX SCRIPT] - 3DS MAX 스크립트로 초간단 다이얼로그 창 , UI 버튼 만들기

 

3DS MAX 스크립트로 초간단 다이얼로그 창 , UI 버튼 만들기

3DS MAX 스트립트를 이용하여 스크립팅을 하기 시작하면 MAX 로 할 수 있는 일이 너무나 많고 빠르게 진행된다는 것을 알 수 있게 됩니다. 이 놀라운 기능들을 스크립트를 매번 실행시키는 것이 번거롭고 여러가지..

diy-dev-design.tistory.com

2019/09/03 - [DEV/Adobe Script] - [photoshop script] 포토샵 스크립트로 특정 영역 선택하기

 

[photoshop script] 포토샵 스크립트로 특정 영역 선택하기

이번 강좌에서는 스크립트를 이용하여 selection 을 만들어 보고 만들어진 selection 영역에 색상을 fill 하는 스크립트를 작성하여 보도록 하겠습니다. 단순한 기능이지만 알아두면 유용하게 사용될 수 있답니다...

diy-dev-design.tistory.com

 

반응형
반응형

필자의 블로그 명칭을 보고 이미 알고 계신분이 있을지 모르겠지만 사실 저는 디자이너 입니다. 하지만 블로그에 맨 개발 관련 된 이야기만 적고 있지요.

음... 그런데 실제로 회사에서도 저는 대부분의 시간을 코드와 씨름하며 지내고 있습니다.

회사에서 사람들은 개자이너라고 부르기도 합니다.  디자인 팀에 있지만 디자인은 잘 못합니다. -_-;;

 

어쨌든 오늘은 본격적으로 C# 으로 프로그램을 하나 만들 예정입니다. (프로그램은 맨 아래 있습니다)

이름하야 "ExcelAutomate" 두둥~

네.. 그렇습니다. 제가 VBA 로 각종 자동화 로직을 올렸는데요. 사실 개발에 관심은 1도 없는 분들이 과연 VBA 창을 열어놓고 제가 올려드린 코드를 붙여넣고 경로와 설정을 세팅해가며 자동화 로직을 사용할 것이냐! 하는것이죠.

아마 아니겠죠.

 

그래서 부족한 실력이나마 저도 개발 공부를 할 겸 프로그램을 만들어 보기로 하였습니다.

개발은 1도 몰라도 사용할 수 있는 엑셀 자동화 프로그램 말이죠.

제가 애정하는 프로그램중에 DarkNamer 라고 있습니다. 그런 누구에게나 사랑받는 툴을 한번만들어 보겠습니다. 바로 이 글을 읽는 여러분과 함께요.

네 이 포스트는 바로 방문객 참여형 포스트가 되겠습니다. 

이 포스트에 뎃글로 남겨주시는 엑셀 자동화 기능을 제가 한번 만들어 보겠습니다. 어디까지 할수 있을지는 모르겠지만 한번 최선을 다해 보겠습니다.

물론 참여 해주시지 않아도 저는 만들겠지만요. 그렇게 되면 어쩌면 제가 사용하는 기능들만 담을 지 모르겠습니다.

자 그럼 시작하겠습니다. 여기부터는 계속 업데이트 될 때 마다 내용을 추가하도록 하겠습니다. 가장 아래쪽에 항상 최신 버전의 Application 을 올리도록 하겠습니다.

바이러스 따위는 없으니 걱정마세요.

뎃글, 공감 은 블로그 작성자에게 큰 힘이 된답니다. 
도움이 되었다 생각되시면 클릭!!  부탁드려요~

 

 

 

 

첫번째는 그림 자동으로 붙여 넣기 입니다.

네 첫번째 버전입니다.

프로그램을 실항하기 전 엑셀 시트를 열어 놓고 이미지 이름이 붙어있는 데이터를 준비합니다. 

이미지 파일명이 기록된 엑셀 시트를 준비하자

요렇게요.

그런 다음 다운로드 받은 툴을 실행합니다.

그런 다음 엑셀 오토메이트에서 [get xls name] 버튼을 클릭합니다. 

 

그러면 오른쪽 드롭다운 메뉴에 현재 열려있는 엑셀 파일명이 보여집니다. 해당 엑셀 파일을 선택한 뒤

이미지를 붙여넣을 시트를 선택해 주어야 합니다. [get sheet name] 버튼을 클릭합니다.

그러면 역시 우측 드롭다운 메뉴에 시트 명칭이 표시가 됩니다.

해당 시트까지 선택해 준 뒤 아래 image name start 라는 칸에 이미지 이름이 있는 첫번째 칸의 이름을 적어 줍니다. A2 이런 식으로 적으면 됩니다.

그리고 이미지가 붙을 첫번째 칸의 이름을 역시 paste start에 붙여 줍니다. 

만약 이미지 이름안에 확장자가 없는 경우 우측 extension 칸에 확장자 명을 적어 줍니다. 이때 반드시 . 을 포함하여 ".png" 와 같이 적어 주어야 합니다.

제 예제와 같이 파일명 안에 확장자가 포함된 경우 무시해도 됩니다.

그리고 마지막으로 맨 아래 칸에 이미지가 들어있는 경로 이름을 적어주면 됩니다.

그럼 이런 상태가 되죠

요 상태에서 Run 버튼을 누르시면 바로 엑셀 시트에 이미지가 붙게 됩니다.

이미지가 자동으로 추가된 모습

 

엑셀에 있는 여러개의 그림을 지울때는 두번째 Tab 에 있는 "delete image" 를 선택합니다.

기본으로 설정되어 있는 영역을 변경해 줍니다. 예를 들면 B2 ~ B100 까지의 셀에 들어있는 이미지를 지우려면 

"delete range from" 의 값을 B2로, "delete range To" 의 값을 B100 으로 작성한 뒤 Run 버튼을 눌러주게 되면 해당 영역의 이미지가 자동으로 모두 지워지게 됩니다.

B2 ~ F1000 과 같이 하면 한줄이 아닌 여러 열의 이미지를 한번에 지울 수 있습니다.

 

2022-05-28 업데이트

> 가로로 붙이기 기능이 추가되었습니다. 체크박스(가로로 붙이기) 선택

이미지 가로로 붙이기

> 하위폴더에 이미지가 있는 경우도 동작하게 하였습니다. 

하위폴더에 이미지가 들어있는 경우도 동작

> 셀 고정 크기 지원 : 이미지를 붙이는 동안 셀의 크기를 조정하지 않습니다.

> get sheet 버튼 삭제 : 엑셀 이르을 선택하면 자동으로 sheet 가 리스트에 포함됩니다.


2023-01-11 업데이트

> 붙여넣을 이름이 유사한 경우 잘못 붙는 오류 수정 (이름이 정확히 동일할 때만 동작)



<프로그램 구매하기>

프로그램을 이용하는데 별도로 비용을 지불하실 필요는 없지만 유용하게 사용하고 계신다면 아래 링크를 통하여 후원을 해주시면 됩니다. 커피한잔 사준다 생각하시고 후원 해 주시면 또 다른 좋은 프로그램을 만드는데 도움이 될 것 같습니다. 

 

<주의사항>

엑셀 2016 에서 테스트 되었습니다,

시트의 확대 축소 비율을 100% 인 상태에서 실행해 주세요.

 

 

<다운로드 링크>

excelAutomate.7z
0.02MB
excelAutomate.zip
0.04MB

 

 

<다운로드 링크 - 구글드라이브>

https://drive.google.com/file/d/1jCSz9rNPuA4Q482ocyE6yAUjUIyhE0_h/view?usp=sharing 

 

excelAutomate.7z

 

drive.google.com

https://drive.google.com/file/d/12vDwn6WM_lAuqrwfZ1ShMXjKvajYZoNE/view?usp=sharing 

 

excelAutomate.zip

 

drive.google.com

프로그램 - 7zip 또는 zip 버전 중 하나를 다운받으신 뒤 압축을 풀고 사용하시면 됩니다.

뎃글로 필요하신 기능 남겨 주시면 한번 있는 힘껏 개발해 보겠습니다.

 

감사합니다.

뎃글, 공감 은 블로그 작성자에게 큰 힘이 된답니다. 
도움이 되었다 생각되시면 클릭!!  부탁드려요~

 

 

 

 

2020/03/18 - [DEV/VBA] - 엑셀 머릿글(header)에 이미지 또는 문구 자동으로 삽입하기

 

엑셀 머릿글(header)에 이미지 또는 문구 자동으로 삽입하기

오늘 포스트에서는 지난 엑셀 자동화 툴의 뎃글로 문의 주신 헤더에 이미지를 VBA 를 이용하여 자동으로 삽입하는 내용을 소개해 드릴까 합니다. "엑셀파일 수백개가있는데 파일의 시트마다 머리글에 이미지를 삽..

diy-dev-design.tistory.com

2020/01/03 - [DEV/c#] - [C#] C# APP 에서 엑셀 연동해보기

 

[C#] C# APP 에서 엑셀 연동해보기

엑셀에서 VBA 로 코드를 짜다 보면 막상 특정 엑셀 파일에만 VBA 가 적용이 가능하기 때문에 막상 다른 엑셀 파일에서 동일한 동작을 하려면 또 코드를 복사해 넣고 실행을 해야 하는 경우가 있습니다. 이런 경우..

diy-dev-design.tistory.com

 

2020/06/03 - [DEV/c#] - C# .net으로 photoshop 연동하기

 

C# .net으로 photoshop 연동하기

저는 회사에서 디자인팀에 있고 전공도 디자인과 출신이며 심지어는 고등학교도 예체능계열 고등학교를 나왔습니다만 지금 회사에서 하는일의 95% 정도는 개발을 하고 있습니다. 실제로 제가 ��

diy-dev-design.tistory.com

 

반응형
반응형

엑셀에서 VBA 로 코드를 짜다 보면 막상 특정 엑셀 파일에만 VBA 가 적용이 가능하기 때문에 막상 다른 엑셀 파일에서 동일한 동작을 하려면 또 코드를 복사해 넣고 실행을 해야 하는 경우가 있습니다. 이런 경우 중간에 어느 버전에서인가 코드가 업데이트 되기도 하지만 관리하기가 어렵기 때문에 소실되는 경우도 많습니다. 또한 포멧을 중간에 xlsx 로 저장하는 순간 VBA 코드는 모두 사라져 버리죠.

그래서 외부 툴에서 VBA 로 만들었던 것과 같이 엑셀의 자동화 기능을 지원해주면 어떨까 생각해 보았습니다.

그래서 이번 포스트에서는 빠르고 코딩이 간편한 C# 을 이용하여 한번 엑셀 프로그램과 연동하는 내용을 설명해 드릴까 합니다. 

C# 으로 엑셀을 연동한다고?

당연히 비주얼 스튜디오와 엑셀은 설치가 되어 있다고 보고 시작하겠습니다.

 

 

 

연동 대상이 될 엑셀 파일 만들기

엑셀을 열고 창을 하나 만든 뒤 기본적으로 붙어 나오는 이름인 "통합 문서 1.xlsx" 로 저장을 해 놓겠습니다.

아마 기본적으로 worksheet 가 하나 있는 상태일 겁니다. 아래 처럼요.

엑셀에 파일을 하나 생성(저장)한 상태

 

 

 

 

.NET Window Forms 생성하기

비주얼 스튜디오를 실행합니다.

먼저 C# Window Forms App 프로젝트를 하나 생성합니다.

비주얼 스튜디오 버전마다 약간씩 차이는 있지만 필요한 항목을 보고 선택하면 됨

 

그런다음 프로젝트 명칭과 저장될 경로를 지정한뒤 "만들기" 버튼을 눌러 프로젝트를 생성해 줍니다.

.NET 버전은 적당히 4.5.1 을 선택하였다

 

이렇게 빈 화면의 윈도우 폼이 하나 만들어 집니다.

Window Form 이 만들어진 상태

간단하게 버튼하나와 텍스트에디터 창을 만들어 주고 상단의 Form1 이라고 써있는 글자 부분을 더블클릭해서 Form 이 로딩될때 실행할 함수를 하나 선언해 줍니다.

만들어진 버튼도 더블클릭해서 버튼이 눌릴때 실행할 함수를 만들어 줍니다.

 

그럼 지금부터 만들 C# App 에서 엑셀에 열려있는 파일 명을 한번 가져와 보도록 하겠습니다.

 

 

 

엑셀 COM 레퍼런스 추가하기

일단 C# 에서 엑셀 연동을 하기 위하여는 참조 개체를 추가해야 합니다. 

상단 메뉴의 "프로젝트" -> "참조" 로 이동하신 다음 아래와 같은 항목을 찾아서 체크해 줍니다.

앞쪽의 체크박스를 선택해주고 확인 버튼을 눌러주면 된다.

 

확인을 누르셨으면 이제 해당 레퍼런스를 사용하도록 선언을 해줍니다.

코드 페이지의 제일 윗 부분에 아래와 같이 작성을 해 주겠습니다.

using Microsoft.Office.Interop.Excel;
using System.Runtime.InteropServices;
using Application = Microsoft.Office.Interop.Excel.Application;

두번째 추가한 구문은 현재 열려있는 엑셀 어플리케이션을 확인하기 위한 용도로 사용합니다.

세번쨰 구문은 이후 사용할 Application 이라는 지시어가 현재 C# 컴파일러가 헷깔릴수 있는 용어이기 때문에 특별히 어떤 녀석인지를 지시하도록 작성하였습니다.

 

 

 

엑셀 연동을 하는 실제 코드 작성하기

이제 사용할 준비는 되었고 코드를 작성해 보겠습니다.

아래와 같이 작성이 되면 됩니다. 본인의 비주얼 스튜디오에 복붙 하지 마시고 한번 타이핑 해보시기 바랍니다. 코딩의 재미중에 타이핑 하는 맛도 빼 놓을 수 없기 때문이며 직접 타이핑을 해보는게 좀더 빠르게 익숙해 지기 때문이기도 하죠. 물론 인텔리센스가 도와주기 때문에 사실 몇글자 씩만 적어도 아래에 적어야 될 코드들이 자동으로 나타나서 저처럼 영문 타이핑을 못하는 사람도 쉽게 코딩을 할 수 있습니다.

한번 코드를 보실까요? 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Microsoft.Office.Interop.Excel;
using System.Runtime.InteropServices;
using Application = Microsoft.Office.Interop.Excel.Application;

namespace excelAutomate
{
    public partial class Form1 : Form
    {
        private Application xlsApp;


        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            // 폼 로딩시에 위에서 정의한 xls App 를 엑셀과 연동해 주겠습니다.
            xlsApp = (Application)Marshal.GetActiveObject("Excel.Application"); // 현재  열려있는 엑셀 어플리케이션이 지정됩니다.
        }

        private void button1_Click(object sender, EventArgs e)
        {
            // 버튼을 누르면 텍스트 박스에 엑셀 어플리케이션이 열고 있는 엑셀 파일 명을 표시해 보겠습니다.
            textBox1.Text = xlsApp.ActiveWorkbook.Name;
        }
    }
}

 

실제로 제가 타이핑 한 내용은 세 줄 밖에 없습니다. ㅎㅎ 나머지는 자동으로 다 만들어진 코드들 이고요. 똑같이 따라 하셨다면 아마 비슷할 겁니다.

 

 

 

동작 확인해 보기

이렇게 하고 F5 키를 눌러 실행을 해보면 아래와 같은 창이 나타납니다.

버튼을 누르면 우측의 텍스트 창에 엑셀 파일명이 나오게 된다

 

그럼 한번 버튼을 눌러 볼까요?

현재 열려 있는 엑셀 파일명이 출력되었다.

요렇게 현재 엑셀 파일의 이름이 나타나게 됩니다.

엑셀 파일 이름을 "통합 문서3.xlsx" 로 저장한뒤 다시 한번해보면 ?

테스트를 위하여 엑셀 파일명을 변경해서 실행해 보았다.

요렇게 표시가 됩니다.

 

참 쉽지 않습니까?

 

이런식으로 C# 을 이용해서 현재 열려 있는 엑셀 어플리케이션과 연동이 가능하게 되었습니다.

다음 강좌에서는 각 시트에 접근하는 방법과 통합문서가 여러개 열려있는 경우 각각에 대하여도 연결하는 방법을 알아보도록 하겠습니다.

 

감사합니다.

 

2020/06/03 - [DEV/c#] - C# .net으로 photoshop 연동하기

 

C# .net으로 photoshop 연동하기

저는 회사에서 디자인팀에 있고 전공도 디자인과 출신이며 심지어는 고등학교도 예체능계열 고등학교를 나왔습니다만 지금 회사에서 하는일의 95% 정도는 개발을 하고 있습니다. 실제로 제가 ��

diy-dev-design.tistory.com

2020/05/28 - [DEV/c#] - [c#] 주어진 경로가 디렉토리인지 파일인지 확인하는 방법

 

[c#] 주어진 경로가 디렉토리인지 파일인지 확인하는 방법

오늘은 간단하게 주어진 경로가 폴더인지 파일인지 구분하는 방법을 소개해 드리겠습니다. 길게 설명할 것 없이 간단하게 코드나갑니다. FileAttributes chkAtt = File.GetAttributes(_path); if ((chkAtt & FileA..

diy-dev-design.tistory.com

2019/06/21 - [DEV/c#] - [C#] C# .NET 프로젝트에서 ImageMagick 이용하기

 

[C#] C# .NET 프로젝트에서 ImageMagick 이용하기

이미지 관련된 툴을 개발함에 있어 다양한 이미지 포멧을 만들고 변경하기 위한 코어를 개발하는 것은 말도 안되게 힘든 작업입니다. 저는 디자이너라는 타이틀을 가지고 있기 때문에 포토샵이

diy-dev-design.tistory.com

2019/06/21 - [DEV/c#] - [C#] 마우스 매크로를 위한 마우스 자동 클릭 기능 만들기

 

[C#] 마우스 매크로를 위한 마우스 자동 클릭 기능 만들기

사용자의 마우스 컨트롤 없이 자동으로 지정된 위치에서 마우스를 클릭하게 만들어 주는 기능 입니다. 먼저 아래와 같이 DLL 을 불러들여 주어야 하겠습니다. class 정의 바로 아래부분에 넣어 주�

diy-dev-design.tistory.com

 

반응형
반응형

개발이라 하면 두드러기가 나는 디자이너 들이 있습니다.
아니 대부분 그렇죠.
이글을 읽고 계신 본인도 그러하다면, 그런데 스크립트로 무언가를 하고 싶다면 어쩌겠습니까.. 배워야지요.
 
그래서 책을 사고 공부를 하려면 눈에 영 들어오지를 않습니다.
"hello world !"로 시작한 강좌는 몇 강 따라가다 보면 내가 뭘 하고 있는 것인지 모르겠고 어느 순간 무슨말인지 하나도 모르겠는 상태가 되고 결국 '올해도 포기~' 하는 단계에 이르게 되죠.
 
자 그렇지 않도록 한번 포스팅을 해볼까 합니다.
게임 업계에 계시든 건축쪽에 계시든 다른 어떤 분야에 계시던 간에 MAX script 를 이용하여 무언가를 해보고 싶으신 분들을 위하여 강좌 형태로 포스트를 남겨보겠습니다.
 
참고로 저는 디자이너 이며 수년간 맥스 스크립트를 이용하여 실무를 하고 있는 사람입니다. 물론 포토샵 스크립트도 사용하고 일러스트 스크립트도 사용하고요, VBA 나 VB.NET, C# .NET 도 이용하고 있습니다. 
어떤 언어인가가 중요한 것이 아니라 무엇을 개발 할 것인 가가 중요한거죠.
 

비 개발자도 개발할 수 있는 맥스 스크립트

자 그럼 시작해 볼건데요. 
이 카테고리를 통해서 뭘 다룰 것이냐 하면요. 간단한 맥스 스크립트 구문, 예제, 문법 등을 체계 적이지 않게 포스팅을 할것입니다. 체계적인 순간 갈길이 너무 멀어 힘들어 집니다. 그냥 쓸만한 스크립트들을 설명과 함께 올려보겠습니다.
예를 들면 이런 것 이죠.
<obj 파일 익스포트 예제> - 선택한 개체만

exportPath = "C:\\Users\\mnsoft\\Documents\\exporttest\\"

objs = getCurrentSelection()

for o in objs do
(
	clearselection()
	select o
	
	if (doesFileExist (exportPath + o.name + ".obj" )) then
	(
		exportfile (exportPath + uniqueName(o.name) + ".obj" ) #noprompt selectedOnly:true
	)
	else
	(
		exportfile (exportPath + o.name + ".obj" ) #noprompt selectedOnly:true
	)	
)

이러한 스크립트를 이용하면 아주 많은 시간을 단축할 수 있습니다. 코드를 개발하는 방법에 따라서 혁신 적으로 시간을 단축할 수도 있습니다. 어떤 작업을 자동화 할수 있는가를 정확하게 판단할수 있는 눈과 머리가 만들어 져야 합니다.
<scene 안의 모든 개체의 isolate vertex 제거하기>

objs = getCurrentSelection()

for o in objs do
(
	case (classof o) of
	(
		Editable_mesh:
		(
			meshop.deleteIsoVerts o
			break;
		)		
		Editable_Poly:
		(
			polyop.deleteIsoVerts o
			break;
		)		
		default:
		(
		)
	)	
)

이런 것들 입니다.
처음 시작하는 여러분들께 중요한 것은 코딩 실력이 아니라 무엇을 개발해서 나의 업무 시간을 줄일 것인가 를 빨리 찾아내는 것이죠.
필요한게 있으면 방법은 찾아지게 되어 있습니다.
본 카테고리를 통하여 가능한 손쉽게 해답을 찾는 방법도 설명 드리겠습니다.
빠르지는 않겠지만 천천히 따라오실 수 있도록 지속적으로 포스팅하도록 하겠습니다.
틈틈히 들어오셔서 업데이트 된 내용이 있으시면 차곡차곡 챙겨 가시기 바랍니다.
 
이번 카테고리에서 아래에 해당되는 내용들을 다루어 보겠습니다. (계속 추가 예정)

  • 점과 점 사이의 거리 구하기, 점과 점사이에 있는 특정 위치에 해당 되는 좌표 구하기
  • 특정 개체가 있는 위치로 카메라 move, zoom 시키기
  • 선택한 모든 개체들중 특정 클래스 (shape, mesh 등) 만 걸러내기, 또는 재 선택하기
  • 두 직선의 교점 구하기
  • sin, cos 을 이용하여 동그라미, 부드러운 곡선 그려보기
  • 폴리곤에 두께 주기
  • 여러개의 점을 직선화 하기
  • OBJ 파일 자동 익스포트 시 설정 변경하기
  • 좌표를 정수형으로 모두 이동 시키기
  • ASE 파일 익스포트 옵션 자동으로 설정하기
  • 대량의 파일 Import or merge 하기
  • 특정 max 파일 안의 특정 파일만 현재 scene 으로 merge 하기
  • 여러개의 맥스 스크립트 파일 불러들여서 사용하기
  • 다이얼로그 창 / UI 만들어 사용하기
  • UVW 맵 컨트롤 하기
  •  

필요하신 스크립트가 있으면 뎃글로 문의 남겨 주세요. 시간되면 한번 짜 보겠습니다. 
물론 외주 의뢰를 주셔도 됩니다. 저렴하게 개발해 드릴께요 ㅋ
 
mariine98@gmail.com
여기로 메일주시면 됩니다.

즐거운 코딩생활 되시길 바랍니다.
 
그럼 이만~
 
2020/04/29 - [분류 전체보기] - 3DS MAX 스크립트로 개체 선택하기

3DS MAX 스크립트로 개체 선택하기

Max Script 를 이용하여 무엇인가를 하려면 필수 요소라고 할 수 있는 것 중의 하나가 개체를 선택하거나 지정하는 방법입니다. 여기서 개체는 3D Scene 안의 오브젝트, 스플라인, 헬퍼 등과 같은 사��

diy-dev-design.tistory.com

 

반응형
반응형

안녕하세요. 제가 포토샵 스크립트를 이용하여 PSD 파일내의 모든 레이어를 자동으로 하위폴더 구조를 유지하며 저장할 수 있는 스크립트를 만들어서 올렸었는데요. 바로 아래 링크에서요.

https://diy-dev-design.tistory.com/17

 

[포토샵스크립트] 모든 레이어 자동저장 / 폴더 구조 포함

예전 포스트에서 포토샵의 스크립트에대하여 설명하면서 대표적인 예로 레이어를 자동으로 저장하는 기능을 설명드린 적이 있는데요. 이번에는 좀더 간단한 ( 코딩 줄 수가 짧은 ) 스크립트로 다시 올려봅니다. A-..

diy-dev-design.tistory.com

 

블로그에 방문 주신 분께서 레이어 자동 저장 기능에 해당 레이어 크기로 이미지가 저장 되었으면 좋겠다는 의견을 주셔서 한번 만들어 보았습니다.

사실 사용하는 분마다 차이가 있을 것 같은데요. 아마 레이어의 크기로 저장되는 기능이 꼭 필요한 분도 계실 거라 생각되어 별도로 페이지를 하나 만들었습니다.

 

전체 스크립트는 큰 차이가 없으며 현재 레이어의 크기를 파악하고 그 크기로 저장하는 방법만 추가하면 될 것 같습니다.

아래의 내용을 추가할 계획입니다.

  • 현재 레이어의 크기 (가로, 세로) 를 구해본다      : Layer.bounds 라는 개체를 이용
  • 구해진 크기로 새로운 임시 도큐먼트를 생성한다 : Documents.Add( ) 이용
  • 생성된 임시 도큐먼트에 해당 레이어를 복사하여 붙여 넣는다 : Layer.copy() // document.paste()
  • 도큐먼트를 지정된 파일이름과 위치에 저장하고 임시 도큐먼트는 닫는다. : document.close()
  • 기존과 동일하게 전체 크기로 저장하기 위한 옵션을 두어 선택할 수 있게 한다.

어렵지 않죠?

아래 작성된 코드를 보시죠.

var pngOption = new PNGSaveOptions()
    pngOption.embedColorProfile = true;
    pngOption.formatOptions = FormatOptions.STANDARDBASELINE;
    pngOption.matte = MatteType.NONE;
    pngOption.quality = 100;
    pngOption.PNG8 = false; //24 bit PNG
    pngOption.transparency = true;
    pngOption.interlaced = true;

// jpg 파일 저장을 위한 설정
var jpgSaveOption = new JPEGSaveOptions()
    jpgSaveOption.quality = 10;
    
var sType = "png" // jpg 로 파일을 저장하기를 원하는경우, png 로 저장을 하고 싶다면 "png"
var cDoc = app.activeDocument
var tempLayers = cDoc.layers
var cWidth = cDoc.width
var cHeight = cDoc.height
var cRes = cDoc.resolution
var savePath = cDoc.path + "\\"
var saveAsEachLayerSize = true
// 일단 모든 레이어를 꺼줍니다.
for (var i = 0 ; i < tempLayers.length; i++)
{
	tempLayers[i].visible = false
}

// 아래의 한줄의 함수로 모든 레이어를 저장합니다.
explorerLayerSet_new(savePath, cDoc) 

function explorerLayerSet_new (cPath, lSet){
	var dLyrs = lSet.layers
    
    var documentSaveType = pngOption;
    
	if (sType == "jpg")
    {
        documentSaveType = jpgSaveOption
    }
    for (var k = 0 ; k < dLyrs.length; k++){
		if (dLyrs[k].typename == "LayerSet") 
		{
			dLyrs[k].visible = true
			ePathName = cPath + dLyrs[k].name + "\\"
			ee = new Folder(ePathName)
			ee.create();
			explorerLayerSet_new (ePathName, dLyrs[k])
			dLyrs[k].visible = false
		}else{
			dLyrs[k].visible = true
			dFile = File(cPath + dLyrs[k].name + "." + sType)
            
              if (saveAsEachLayerSize == false)
              {
                  cDoc.saveAs(dFile, documentSaveType,true, Extension.LOWERCASE)  
              }else{  // 레이어의 크기에 맞추어 파일을 저장하는 기능                  
                  // layer.bounds 를 이용하여 레이어의 크기를 얻어올 수 있다.
                  var cBounds = dLyrs[k].bounds
                  var newWidth = cBounds[2] - cBounds[0];
                  var newHeight = cBounds[3] - cBounds[1];
                  
                  dLyrs[k].copy();
                  
                  // 레이어의 크기와 동일한 도큐먼트를 하나 생성한다.
                  var tmpDoc = app.documents.add(newWidth, newHeight, cDoc.resolution, dLyrs[k].name, NewDocumentMode.RGB, DocumentFill.TRANSPARENT);
                  tmpDoc.paste();
                  tmpDoc.saveAs(dFile, documentSaveType,true, Extension.LOWERCASE);
                  tmpDoc.close(SaveOptions.DONOTSAVECHANGES);
              }
			
			if (dLyrs[k].name.indexOf("All") == -1)
			{
				dLyrs[k].visible = false
			}
		}
	}
	lSet.visible = false
}

 

기존 saveAs 부분이 변경이 되었습니다.

png, jpg 를 판단하는 부분을 위쪽으로 빼서 documentSaveType 이라는 변수에 저장 옵션을 담아 버렸습니다.

그리고 위쪽에 saveAsEachLayerSize 라는 변수를 두어 True 일 경우 레이어 크기로, False 일 경우 전체 도큐먼트 크기로 저장이 되게 하여 기존의 방식이 필요한 분들도 하나의 스크립트로 사용할 수 있도록 하였습니다.

이렇게 해서 버전 3 가 되었네요. 좋은 의견 주신 '포도' 님께 감사드립니다.

 

layerexporter_v3.jsx
0.00MB

 

이전의 레이어 자동 저장 스크립트 포스트와 레이어 관련하여 공부할 만한 포스트를 링크 합니다.

 

2019/11/14 - [DEV/Adobe Script] - [포토샵스크립트] 스크립트로 레이어 생성, 이동, 복사 하기

 

[포토샵스크립트] 스크립트로 레이어 생성, 이동, 복사 하기

포토샵의 가장 중요한 핵심 기능중의 하나가 레이어라는 구조일 것입니다. 이미지를 계층적으로 쌓아 올리고 각각의 이미지간 효과를 적용하거나 투명도등을 조절하여 완성된 하나의 이미지를 만들어 내는 것이죠...

diy-dev-design.tistory.com

2019/12/04 - [DEV/Adobe Script] - [포토샵스크립트] Instagram 용 파노라마 사진 자르기

 

[포토샵스크립트] Instagram 용 파노라마 사진 자르기

Instagram, 요즘 가장 핫한 SNS 가 아닐까 싶습니다. 지하철에서 무심코 주변을 보니 눈에 보이는 핸드폰 화면 마다 Instagram 화면이 보이는 것을 보고 깜짝 놀랐습니다. 난 안하는데... 어쨌든 Instagram 계정을..

diy-dev-design.tistory.com

 

공감은 작성자에게 큰 힘이 된답니다. 아시죠? ^^

반응형
반응형

3DS MAX 스트립트를 이용하여 스크립팅을 하기 시작하면 MAX 로 할 수 있는 일이 너무나 많고 빠르게 진행된다는 것을 알 수 있게 됩니다. 이 놀라운 기능들을 스크립트를 매번 실행시키는 것이 번거롭고 여러가지 기능을 한번에 수행하거나 관리할 수 있게끔 만들고 싶은 욕심이 생길 때가 있습니다. 그럴때 그런 기능들을 한곳에 모아 실행하기 위하여는 마치 어떤 툴이나 프로그램 처럼 UI 가 있는 것이 실행하기도 편하고 보기에도 좋을 것입니다.

그래서 오늘은 3DS MAX Script 를 이용하여 다이얼로드 창을 만드는 방법, 그리고 간단한 UI 를 적용하는 방법을 알아 보겠습니다.

  • 다이얼로그 창 만들기 / 버튼 만들어 기능 연결하기
  • 롤아웃 플로터 만들기

먼저 3DS MAX 에서 다이얼로그 창을 만들어 보겠습니다.

다이얼로그 는 윈도우에서 예/아니오 경고창과 같이 간단한 타이틀바와 닫기 버튼, 내부에 간단한 UI 들을 담을 수 있는데요. 기본적으로는 rollout 을 만들어 rollout 내부에 UI 를 담고 만들어진 rollout 을 다이얼로그창의 형식으로 보여주는 형태로 되어 있습니다.

 

다이얼로그 창 만들기 / 버튼 만들어 기능 연결하기

가장 기본형은 아래와 같습니다.

rollout myFirstRollout "my menu 01"
(
	button bt_myButton "press me!"
	
	on bt_myButton pressed do
	(
		messageBox "You got it!"
	)
	
)

createDialog myFirstRollout

먼저 롤아웃을 선언해 준 뒤 그안에 버튼을 하나 만들고 버튼을 눌렀을때 특정한 메시지를 팝업으로 보여주는 다이얼로그입니다.

바로 요렇게 만들어 지게 됩니다.

심플한 다이얼로그

가운데 있는 버튼을 눌러주면 아래와 같이 팝업으로 메시지가 출력이 됩니다.

messagebox 가 뜬 모습

 

자 이게 기본은 했고요. 다이얼로그의 크기, 위치, 버튼의 크기나 위치등을 지정하지 않았기 때문에 위와 같이 작게 표시가 되었는데요. 여기서 그 크기위 위치를 지정하는 방법을 알아보도록 하겠습니다.

제일 마지막 줄에 createDialog 라는 명령으로 만들어준 롤아웃을 다이얼로그라는 형태로 보여주었는데요. 이부분에서 다이얼로그릐 크기, 위치를 지정할 수 있습니다. 마지막 줄의 내용을 아래와 같이 수정해 보겠습니다.

createDialog myFirstRollout 300 200 100 100

요런 식으로 정의 할 수 있는데요. 4개의 숫자를 뒤에 연속해서 써주게 되는데

[가로길이] [세로길이] [윈도우상의 가로위치] [윈도우상의 세로위치]

의 순서로 적어주면 되며 뒤의 두가지 숫자를 생략하게 되면 화면의 중앙에 다이얼로그가 생성이 됩니다.

위의 코드로 수정한 뒤 실행하게 되면 아래와 같이 윈도우 좌측 상단에 가로 300 세로 200 픽셀의 다이얼로그 창이 만들어 지게 됩니다.

화면의 좌상단에서 열린 다이얼로그 창

버튼을 하나 추가해 볼까요?

rollout myFirstRollout "my menu 01"
(
	button bt_myButton1 "press me!"
	button bt_myButton2 "don't press me!"
	
	on bt_myButton1 pressed do
	(
		messageBox "You got it!"
	)
	
	on bt_myButton2 pressed do
	(
		destroyDialog myFirstRollout
	)
	
)

createDialog myFirstRollout 300 200 100 100

자 이제 버튼이 두개가 되었습니다. 두번째 버튼을 누르게 되면 다이얼 로그 창이 닫히는 그런 코드가 실행이 됩니다.

스크립트를 실행해 보면 아래와 같이 버튼이 두개가 표시됩니다.

다이얼로그에 버튼이 두개가 되었다.

그런데 저는 저 두개의 버튼을 가로로 배치하고 싶어서 코드를 약간 더 손을 보았습니다. 레이아웃을 조정하는 것이죠.

rollout myFirstRollout "my menu 01"
(
	button bt_myButton1 "press me!" pos:[10,10] width:130 height:30
	button bt_myButton2 "don't press me!" pos:[150,10] width:130 height:30
	
	on bt_myButton1 pressed do
	(
		messageBox "You got it!"
	)
	
	on bt_myButton2 pressed do
	(
		destroyDialog myFirstRollout
	)
	
)

createDialog myFirstRollout 300 200 100 100

맨위에 버튼을 만들어주는 부분에 pos 와 width, height 를 설정해 줌으로써 사용자가 원하는 위치와 크기로 버튼을 배치할 수 있습니다.

실행해보면 아래와 같이 변경이 됩니다.

두개의 버튼이 가로로 배치되었다

 

네.. 그럴싸 해 졌습니다.

롤아웃 플로터 (rollout floater) 만들기

이번에는 좀더 고급 UI 를 이용해 보겠습니다. 3DS MAX 의 우측에 보면 여러가지 옵션이나 설정을 입력하고 기능을 선택하는 메뉴바가 나오는데요. command pannel 이라고 합니다. 해당 패널에 보면 기능이 많은 경우 기능을 접었다 폈다 할 수 있는 형태로 메뉴가 만들어져 있습니다. 

유사한 기능끼리 그룹을 만들어 묶어주고 사용하지 않는 기능 그룹은 묶어 둘 수 있어 상당히 편리한 UI 라고 할 수 있겠습니다. 스크립트  UI 로도 거의 동일한 기능을 아주 쉽게 구현할 수 있습니다.

그런 기능들의 묶음이 위에서 보여주었던 하나의 롤아웃이 되며 롤아웃들을 하나의 창에 보여줄 수 있는 개체가 롤아웃 플로터 입니다.

간단한 예를 보여드리겠습니다.

rollout myRollout_ani "my Animation"
(
	button bt_myButton1 "run" pos:[10,10] width:130 height:30
	button bt_myButton2 "stop" pos:[150,10] width:130 height:30
	
	on bt_myButton1 pressed do
	(
		messageBox "No function now"
	)
	
	on bt_myButton2 pressed do
	(
		messageBox "No function now"
	)	
)

rollout myRollout_geom "my Geometry"
(
	button bt_myButton1 "convertTo mesh" pos:[10,10] width:130 height:30
	button bt_myButton2 "remove Iso Vertex" pos:[150,10] width:130 height:30
	
	on bt_myButton1 pressed do
	(
		messageBox "No function now"
	)
	
	on bt_myButton2 pressed do
	(
		messageBox "No function now"
	)	
)

myTool = newrolloutFloater "my custon tool" 300 300 100 100

addRollout myRollout_ani myTool 
addRollout myRollout_geom myTool 

myTool.open

두개의 롤아웃을 먼저 만들고 myTool 이라는 변수를 새로운 롤아웃 플로터로 설정한뒤 myTool 에 두개의 롤아웃을 추가합니다. 끝으로 만들어진 롤아웃 플로터를 보여주는 것이죠.

간단하지 않습니까?

실행하면 아래와 같이 됩니다.

두개의 롤아웃이 있는 메뉴가 만들어 졌다.

 

이렇게 만들어진 롤아웃 플로터내의 롤아웃 들은 아래와 같이 접는것도 가능합니다.

롤아웃은 말그대로 접어 올릴수 있는 메뉴다.

이제 제법 툴같이 만들어 졌습니다.

 

자 3DS MAX 에서 롤아웃을 만드는 것을 알아보았습니다.

이제 다음 강좌에서는 롤아웃 내의 버튼에 기능을 할당해 보도록 하겠습니다. 인터넷에서 긁어 모은 각종 스크립트 들을 저렇게 만든 롤아웃 플로터 하나에 모아두면 필요할때 빠르게 기능 동작이 가능할 것 입니다.

 

그럼 이만~

 

2020/04/29 - [분류 전체보기] - 3DS MAX 스크립트로 개체 선택하기

 

3DS MAX 스크립트로 개체 선택하기

Max Script 를 이용하여 무엇인가를 하려면 필수 요소라고 할 수 있는 것 중의 하나가 개체를 선택하거나 지정하는 방법입니다. 여기서 개체는 3D Scene 안의 오브젝트, 스플라인, 헬퍼 등과 같은 사��

diy-dev-design.tistory.com

 

2019/12/16 - [DEV/MAX SCRIPT] - 3DS MAX SCRIPT 강좌?? 무작정 시작하기 - 디자이너 추천

 

3DS MAX SCRIPT 강좌?? 무작정 시작하기 - 디자이너 추천

개발이라 하면 두드러기가 나는 디자이너 들이 있습니다. 아니 대부분 그렇죠. 이글을 읽고 계신 본인도 그러하다면, 그런데 스크립트로 무언가를 하고 싶다면 어쩌겠습니까.. 배워야지요. 그래

diy-dev-design.tistory.com

 

반응형

+ Recent posts