From 590ab38556cd86728ec36958a540edfad2a6ff5d Mon Sep 17 00:00:00 2001 From: lee hakmin Date: Tue, 21 May 2019 09:08:58 +0900 Subject: [PATCH 001/336] Add files via upload --- resources/localization/ko_KR/PrusaSlicer.mo | Bin 190144 -> 192764 bytes resources/localization/ko_KR/PrusaSlicer.po | 7362 +++++++++++++++++++ 2 files changed, 7362 insertions(+) create mode 100644 resources/localization/ko_KR/PrusaSlicer.po diff --git a/resources/localization/ko_KR/PrusaSlicer.mo b/resources/localization/ko_KR/PrusaSlicer.mo index 0fc23e689677c21005835665a0435f99a2650ce9..fc5eaf254b4e2c7f500bbffb58334c7ef74bb6e2 100644 GIT binary patch delta 35830 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 delta 33701 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 CKRJ8= diff --git a/resources/localization/ko_KR/PrusaSlicer.po b/resources/localization/ko_KR/PrusaSlicer.po new file mode 100644 index 0000000000..d6e68d8f86 --- /dev/null +++ b/resources/localization/ko_KR/PrusaSlicer.po @@ -0,0 +1,7362 @@ +msgid "" +msgstr "" +"Project-Id-Version: slic3rkorean\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-04-09 14:34+0200\n" +"PO-Revision-Date: 2019-05-21 03:42+0900\n" +"Last-Translator: lee hak-min \n" +"Language-Team: ulsanether\n" +"Language: ko_KR\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.2.2\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Crowdin-Project: slic3rkorean\n" +"X-Crowdin-Language: ko\n" +"X-Crowdin-File: ko_KR.po\n" + +#: src/slic3r/GUI/AboutDialog.cpp:35 +msgid "About Slic3r" +msgstr "Slic3r에 대하여" + +#: src/slic3r/GUI/AboutDialog.cpp:64 src/slic3r/GUI/MainFrame.cpp:52 +msgid "Version" +msgstr "버전" + +#: src/slic3r/GUI/BedShapeDialog.cpp:43 +msgid "Shape" +msgstr "모양" + +#: src/slic3r/GUI/BedShapeDialog.cpp:51 +msgid "Rectangular" +msgstr "직사각형" + +#: src/slic3r/GUI/BedShapeDialog.cpp:55 src/slic3r/GUI/GUI_ObjectManipulation.cpp:118 +#: src/slic3r/GUI/Plater.cpp:136 src/slic3r/GUI/Tab.cpp:2185 +msgid "Size" +msgstr "사이즈" + +#: src/slic3r/GUI/BedShapeDialog.cpp:56 +msgid "Size in X and Y of the rectangular plate." +msgstr "사격형 플레이트 X 및 Y 크기." + +#: src/slic3r/GUI/BedShapeDialog.cpp:62 +msgid "Origin" +msgstr "원본" + +#: src/slic3r/GUI/BedShapeDialog.cpp:63 +msgid "Distance of the 0,0 G-code coordinate from the front left corner of the rectangle." +msgstr "사각형의 전면 왼쪽된 모서리에서 0, 0 G-코드 좌표 거리입니다." + +#: src/slic3r/GUI/BedShapeDialog.cpp:67 +msgid "Circular" +msgstr "원형" + +#: src/slic3r/GUI/BedShapeDialog.cpp:70 src/slic3r/GUI/ConfigWizard.cpp:111 src/slic3r/GUI/ConfigWizard.cpp:544 +#: src/slic3r/GUI/ConfigWizard.cpp:558 src/slic3r/GUI/GUI_ObjectManipulation.cpp:115 +#: src/slic3r/GUI/RammingChart.cpp:81 src/slic3r/GUI/WipeTowerDialog.cpp:84 src/libslic3r/PrintConfig.cpp:59 +#: src/libslic3r/PrintConfig.cpp:66 src/libslic3r/PrintConfig.cpp:75 src/libslic3r/PrintConfig.cpp:209 +#: src/libslic3r/PrintConfig.cpp:284 src/libslic3r/PrintConfig.cpp:292 src/libslic3r/PrintConfig.cpp:342 +#: src/libslic3r/PrintConfig.cpp:352 src/libslic3r/PrintConfig.cpp:472 src/libslic3r/PrintConfig.cpp:483 +#: src/libslic3r/PrintConfig.cpp:501 src/libslic3r/PrintConfig.cpp:679 src/libslic3r/PrintConfig.cpp:1165 +#: src/libslic3r/PrintConfig.cpp:1226 src/libslic3r/PrintConfig.cpp:1244 src/libslic3r/PrintConfig.cpp:1262 +#: src/libslic3r/PrintConfig.cpp:1314 src/libslic3r/PrintConfig.cpp:1324 src/libslic3r/PrintConfig.cpp:1445 +#: src/libslic3r/PrintConfig.cpp:1453 src/libslic3r/PrintConfig.cpp:1494 src/libslic3r/PrintConfig.cpp:1502 +#: src/libslic3r/PrintConfig.cpp:1512 src/libslic3r/PrintConfig.cpp:1520 src/libslic3r/PrintConfig.cpp:1528 +#: src/libslic3r/PrintConfig.cpp:1611 src/libslic3r/PrintConfig.cpp:1827 src/libslic3r/PrintConfig.cpp:1897 +#: src/libslic3r/PrintConfig.cpp:1931 src/libslic3r/PrintConfig.cpp:2123 src/libslic3r/PrintConfig.cpp:2130 +#: src/libslic3r/PrintConfig.cpp:2137 src/libslic3r/PrintConfig.cpp:2167 src/libslic3r/PrintConfig.cpp:2177 +#: src/libslic3r/PrintConfig.cpp:2187 src/libslic3r/PrintConfig.cpp:2293 src/libslic3r/PrintConfig.cpp:2368 +#: src/libslic3r/PrintConfig.cpp:2377 src/libslic3r/PrintConfig.cpp:2386 src/libslic3r/PrintConfig.cpp:2396 +#: src/libslic3r/PrintConfig.cpp:2440 src/libslic3r/PrintConfig.cpp:2450 src/libslic3r/PrintConfig.cpp:2469 +#: src/libslic3r/PrintConfig.cpp:2479 src/libslic3r/PrintConfig.cpp:2488 src/libslic3r/PrintConfig.cpp:2506 +#: src/libslic3r/PrintConfig.cpp:2521 src/libslic3r/PrintConfig.cpp:2532 src/libslic3r/PrintConfig.cpp:2545 +#: src/libslic3r/PrintConfig.cpp:2555 +msgid "mm" +msgstr "mm" + +#: src/slic3r/GUI/BedShapeDialog.cpp:71 src/libslic3r/PrintConfig.cpp:676 +msgid "Diameter" +msgstr "노즐 직경" + +#: src/slic3r/GUI/BedShapeDialog.cpp:72 +msgid "Diameter of the print bed. It is assumed that origin (0,0) is located in the center." +msgstr "인쇄 침대의 직경. 원점 (0,0) 은 중심에 있다고 가정합니다." + +#: src/slic3r/GUI/BedShapeDialog.cpp:76 src/slic3r/GUI/GUI_Preview.cpp:239 +#: src/libslic3r/GCode/PreviewData.cpp:175 +msgid "Custom" +msgstr "사용자 정의" + +#: src/slic3r/GUI/BedShapeDialog.cpp:80 +msgid "Load shape from STL..." +msgstr "STL파일 로드." + +#: src/slic3r/GUI/BedShapeDialog.cpp:126 +msgid "Settings" +msgstr "설정" + +#: src/slic3r/GUI/BedShapeDialog.cpp:299 +msgid "Choose a file to import bed shape from (STL/OBJ/AMF/3MF/PRUSA):" +msgstr "침대 모양 (STL/OBJ/AMF/3MF/PRUSA) 에서 가져오려는 파일을 선택 합니다:" + +#: src/slic3r/GUI/BedShapeDialog.cpp:316 src/slic3r/GUI/GUI_ObjectList.cpp:1252 +msgid "Error! " +msgstr "에러! " + +#: src/slic3r/GUI/BedShapeDialog.cpp:325 +msgid "The selected file contains no geometry." +msgstr "선택한 파일에는 형상이 없는 포함 되어 있습니다." + +#: src/slic3r/GUI/BedShapeDialog.cpp:329 +msgid "The selected file contains several disjoint areas. This is not supported." +msgstr "선택한 파일 여러 분리 된 영역을 포함 되어 있습니다. 이 지원 되지 않습니다." + +#: src/slic3r/GUI/BedShapeDialog.hpp:44 src/slic3r/GUI/ConfigWizard.cpp:507 +msgid "Bed Shape" +msgstr "배드 모양" + +#: src/slic3r/GUI/BonjourDialog.cpp:55 +msgid "Network lookup" +msgstr "네트워크 조회" + +#: src/slic3r/GUI/BonjourDialog.cpp:72 +msgid "Address" +msgstr "주소" + +#: src/slic3r/GUI/BonjourDialog.cpp:73 +msgid "Hostname" +msgstr "호스트이름" + +#: src/slic3r/GUI/BonjourDialog.cpp:74 +msgid "Service name" +msgstr "서비스 이름" + +#: src/slic3r/GUI/BonjourDialog.cpp:76 +msgid "OctoPrint version" +msgstr "옥토프린트 버전" + +#: src/slic3r/GUI/BonjourDialog.cpp:218 +msgid "Searching for devices" +msgstr "디바이스 검색" + +#: src/slic3r/GUI/BonjourDialog.cpp:225 +msgid "Finished" +msgstr "완료" + +#: src/slic3r/GUI/ButtonsDescription.cpp:15 +msgid "Buttons And Text Colors Description" +msgstr "버튼 및 텍스트 색상 설명" + +#: src/slic3r/GUI/ButtonsDescription.cpp:40 +msgid "Value is the same as the system value" +msgstr "값은 시스템 값과 같습니다" + +#: src/slic3r/GUI/ButtonsDescription.cpp:57 +msgid "Value was changed and is not equal to the system value or the last saved preset" +msgstr "값이 변경 되었고 시스템 값 또는 마지막으로 저장 된 사전 설정과 같지 않음" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:17 +msgid "Upgrade" +msgstr "업그레이드" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:19 +msgid "Downgrade" +msgstr "다운그레이드" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:21 +msgid "Before roll back" +msgstr "롤백 전에" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:23 +msgid "User" +msgstr "사용자" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:26 +msgid "Unknown" +msgstr "알 수 없음" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:38 +msgid "Active: " +msgstr "활성: " + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:44 +msgid "slic3r version" +msgstr "slic3r에 대하여" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:45 src/slic3r/GUI/Preset.cpp:1250 +msgid "print" +msgstr "프린트" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:46 +msgid "filaments" +msgstr "필라멘트" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:47 src/slic3r/GUI/Preset.cpp:1254 +msgid "printer" +msgstr "프린터" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:51 src/slic3r/GUI/Tab.cpp:872 +msgid "vendor" +msgstr "제조 회사" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:51 +msgid "version" +msgstr "버전" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:52 +msgid "min slic3r version" +msgstr "최소 slic3r 버전" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:54 +msgid "max slic3r version" +msgstr "최대 slic3r 버전" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:57 +msgid "model" +msgstr "모델" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:57 +msgid "variants" +msgstr "변종" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:69 +msgid "Incompatible with this Slic3r" +msgstr "이 Slic3r와 호환 되지 않음" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:72 +msgid "Activate" +msgstr "활성화" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:98 +msgid "Configuration Snapshots" +msgstr "구성 스냅숏" + +#: src/slic3r/GUI/ConfigWizard.cpp:111 +msgid "nozzle" +msgstr "노즐" + +#: src/slic3r/GUI/ConfigWizard.cpp:115 +msgid "Alternate nozzles:" +msgstr "대체 노즐:" + +#: src/slic3r/GUI/ConfigWizard.cpp:181 +msgid "All standard" +msgstr "모든 표준" + +#: src/slic3r/GUI/ConfigWizard.cpp:182 src/slic3r/GUI/Tab.cpp:2909 +msgid "All" +msgstr "모두 선택" + +#: src/slic3r/GUI/ConfigWizard.cpp:183 src/slic3r/GUI/Plater.cpp:414 src/libslic3r/GCode/PreviewData.cpp:162 +msgid "None" +msgstr "없음" + +#: src/slic3r/GUI/ConfigWizard.cpp:284 +#, c-format +msgid "Welcome to the Slic3r %s" +msgstr "Slic3r %s에 오신것을 환영 합니다" + +#: src/slic3r/GUI/ConfigWizard.cpp:284 +msgid "Welcome" +msgstr "환영합니다" + +#: src/slic3r/GUI/ConfigWizard.cpp:288 src/slic3r/GUI/GUI_App.cpp:600 +#, c-format +msgid "Run %s" +msgstr "%s 실행" + +#: src/slic3r/GUI/ConfigWizard.cpp:290 +#, c-format +msgid "" +"Hello, welcome to Slic3r Prusa Edition! This %s helps you with the initial configuration; just a few settings " +"and you will be ready to print." +msgstr "" +"안녕하세요, Slic3r prusa 버전에 오신 것을 환영 합니다! 이 %s 초기 구성;에 도움이 됩니다. 단지 몇 가지 설정 하 " +"고 당신은 인쇄 준비가 될 것입니다." + +#: src/slic3r/GUI/ConfigWizard.cpp:294 +msgid "Remove user profiles - install from scratch (a snapshot will be taken beforehand)" +msgstr "사용자 프로필 제거-처음부터 설치 (스냅숏은 사전에 수행 됩니다)" + +#: src/slic3r/GUI/ConfigWizard.cpp:325 +#, c-format +msgid "%s Family" +msgstr "%s 가족" + +#: src/slic3r/GUI/ConfigWizard.cpp:362 +msgid "Custom Printer Setup" +msgstr "사용자 지정 프린터 설정" + +#: src/slic3r/GUI/ConfigWizard.cpp:362 +msgid "Custom Printer" +msgstr "사용자 정의 프린터" + +#: src/slic3r/GUI/ConfigWizard.cpp:364 +msgid "Define a custom printer profile" +msgstr "사용자 정의 프린터 프로필 정의" + +#: src/slic3r/GUI/ConfigWizard.cpp:366 +msgid "Custom profile name:" +msgstr "사용자 지정 프로필 이름:" + +#: src/slic3r/GUI/ConfigWizard.cpp:390 +msgid "Automatic updates" +msgstr "자동 업데이트" + +#: src/slic3r/GUI/ConfigWizard.cpp:390 +msgid "Updates" +msgstr "업데이트" + +#: src/slic3r/GUI/ConfigWizard.cpp:398 src/slic3r/GUI/Preferences.cpp:59 +msgid "Check for application updates" +msgstr "프로그램 업데이트 확인" + +#: src/slic3r/GUI/ConfigWizard.cpp:401 src/slic3r/GUI/Preferences.cpp:61 +msgid "" +"If enabled, Slic3r checks for new versions of Slic3r PE online. When a new version becomes available a " +"notification is displayed at the next application startup (never during program usage). This is only a " +"notification mechanisms, no automatic installation is done." +msgstr "" +"활성화 된 경우 Slic3r은 Slic3r PE 온라인의 새 버전을 확인합니다. 새 버전을 사용할 수있게되면 다음 응용 프로그" +"램 시작시 알림이 표시됩니다 (프로그램 사용 중에는 절대로 사용하지 마십시오). 이것은 알림 메커니즘 일뿐 자동 설" +"치가 수행되지 않습니다." + +#: src/slic3r/GUI/ConfigWizard.cpp:405 src/slic3r/GUI/Preferences.cpp:67 +msgid "Update built-in Presets automatically" +msgstr "기존의 설정 자동 업데이트" + +#: src/slic3r/GUI/ConfigWizard.cpp:408 src/slic3r/GUI/Preferences.cpp:69 +msgid "" +"If enabled, Slic3r downloads updates of built-in system presets in the background. These updates are " +"downloaded into a separate temporary location. When a new preset version becomes available it is offered at " +"application startup." +msgstr "" +"활성화 된 경우 Slic3r은 백그라운드에서 내장 시스템 사전 설정의 업데이트를 다운로드합니다. 이러한 업데이트는 별" +"도의 임시 위치에 다운로드됩니다. 새로운 사전 설정 버전을 사용할 수있게되면 응용 프로그램 시작시 제공됩니다." + +#: src/slic3r/GUI/ConfigWizard.cpp:409 +msgid "Updates are never applied without user's consent and never overwrite user's customized settings." +msgstr "업데이트는 사용자의 동의없이 적용되지 않으며 사용자의 사용자 지정된 설정을 덮어 쓰지 않습니다." + +#: src/slic3r/GUI/ConfigWizard.cpp:414 +msgid "Additionally a backup snapshot of the whole configuration is created before an update is applied." +msgstr "또한 업데이트가 적용되기 전에 전체 구성의 백업 스냅 샷이 생성됩니다." + +#: src/slic3r/GUI/ConfigWizard.cpp:421 +msgid "Other Vendors" +msgstr "다른 공급 업체" + +#: src/slic3r/GUI/ConfigWizard.cpp:423 +msgid "Pick another vendor supported by Slic3r PE:" +msgstr "Slic3r PE가 지원하는 다른 공급 업체를 선택하십시오:" + +#: src/slic3r/GUI/ConfigWizard.cpp:469 +msgid "Firmware Type" +msgstr "펌웨어 타입" + +#: src/slic3r/GUI/ConfigWizard.cpp:469 src/slic3r/GUI/Tab.cpp:1870 +msgid "Firmware" +msgstr "펌웨어" + +#: src/slic3r/GUI/ConfigWizard.cpp:473 +msgid "Choose the type of firmware used by your printer." +msgstr "프린터에 패치할 펌웨어를 선택하세요." + +#: src/slic3r/GUI/ConfigWizard.cpp:507 +msgid "Bed Shape and Size" +msgstr "배드 모양과 크기" + +#: src/slic3r/GUI/ConfigWizard.cpp:510 +msgid "Set the shape of your printer's bed." +msgstr "프린터 배드모양을 설정하세요." + +#: src/slic3r/GUI/ConfigWizard.cpp:524 +msgid "Filament and Nozzle Diameters" +msgstr "필라멘트와 노즐 크기" + +#: src/slic3r/GUI/ConfigWizard.cpp:524 +msgid "Print Diameters" +msgstr "인쇄 직경" + +#: src/slic3r/GUI/ConfigWizard.cpp:540 +msgid "Enter the diameter of your printer's hot end nozzle." +msgstr "핫 엔드 노즐 직경을 입력하십시오." + +#: src/slic3r/GUI/ConfigWizard.cpp:543 +msgid "Nozzle Diameter:" +msgstr "노즐 직경:" + +#: src/slic3r/GUI/ConfigWizard.cpp:553 +msgid "Enter the diameter of your filament." +msgstr "필라멘트의 직경을 입력하십시오." + +#: src/slic3r/GUI/ConfigWizard.cpp:554 +msgid "" +"Good precision is required, so use a caliper and do multiple measurements along the filament, then compute " +"the average." +msgstr "정밀도가 필요하므로 캘리퍼를 사용하여 필라멘트를 따라 여러 번 측정 한 다음 평균을 계산하십시오." + +#: src/slic3r/GUI/ConfigWizard.cpp:557 +msgid "Filament Diameter:" +msgstr "필라멘트 직경:" + +#: src/slic3r/GUI/ConfigWizard.cpp:575 +msgid "Extruder and Bed Temperatures" +msgstr "익스트루더와 배드 온도" + +#: src/slic3r/GUI/ConfigWizard.cpp:575 +msgid "Temperatures" +msgstr "온도" + +#: src/slic3r/GUI/ConfigWizard.cpp:591 +msgid "Enter the temperature needed for extruding your filament." +msgstr "필라멘트 압출에 필요한 온도를 입력하십시오." + +#: src/slic3r/GUI/ConfigWizard.cpp:592 +msgid "A rule of thumb is 160 to 230 °C for PLA, and 215 to 250 °C for ABS." +msgstr "보통 PLA의 경우 160 ~ 230 ° C, ABS의 경우 215 ~ 250 ° C입니다." + +#: src/slic3r/GUI/ConfigWizard.cpp:595 +msgid "Extrusion Temperature:" +msgstr "출력 온도 :" + +#: src/slic3r/GUI/ConfigWizard.cpp:596 src/slic3r/GUI/ConfigWizard.cpp:610 +msgid "°C" +msgstr "°C" + +#: src/slic3r/GUI/ConfigWizard.cpp:605 +msgid "Enter the bed temperature needed for getting your filament to stick to your heated bed." +msgstr "필라멘트가 핫배드에 접착하는데 필요한 배드온도를 입력하십시오." + +#: src/slic3r/GUI/ConfigWizard.cpp:606 +msgid "A rule of thumb is 60 °C for PLA and 110 °C for ABS. Leave zero if you have no heated bed." +msgstr "보통은 PLA의 경우 60 ° C이고 ABS의 경우 110 ° C입니다. 핫배드가 없는 경우에는 0으로 두십시오." + +#: src/slic3r/GUI/ConfigWizard.cpp:609 +msgid "Bed Temperature:" +msgstr "배드 온도 :" + +#: src/slic3r/GUI/ConfigWizard.cpp:1001 +msgid "Select all standard printers" +msgstr "이 프로파일과 호환 가능한 프린터를 선택하세요" + +#: src/slic3r/GUI/ConfigWizard.cpp:1004 +msgid "< &Back" +msgstr "< &뒤로" + +#: src/slic3r/GUI/ConfigWizard.cpp:1005 +msgid "&Next >" +msgstr "&다음 >" + +#: src/slic3r/GUI/ConfigWizard.cpp:1006 +msgid "&Finish" +msgstr "&완료" + +#: src/slic3r/GUI/ConfigWizard.cpp:1007 src/slic3r/GUI/FirmwareDialog.cpp:142 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:37 src/slic3r/GUI/ProgressStatusBar.cpp:28 +msgid "Cancel" +msgstr "취소" + +#: src/slic3r/GUI/ConfigWizard.cpp:1021 +msgid "Prusa FFF Technology Printers" +msgstr "Prusa FFF 방식 프린터" + +#: src/slic3r/GUI/ConfigWizard.cpp:1024 +msgid "Prusa MSLA Technology Printers" +msgstr "Prusa MSLA 방식 프린터" + +#: src/slic3r/GUI/ConfigWizard.cpp:1111 +msgid "Configuration Wizard" +msgstr "구성 마법사" + +#: src/slic3r/GUI/ConfigWizard.cpp:1112 +msgid "Configuration &Wizard" +msgstr "구성 마법사" + +#: src/slic3r/GUI/ConfigWizard.cpp:1114 +msgid "Configuration Assistant" +msgstr "구성 도우미" + +#: src/slic3r/GUI/ConfigWizard.cpp:1115 +msgid "Configuration &Assistant" +msgstr "구성 도우미" + +#: src/slic3r/GUI/Field.cpp:112 +msgid "default value" +msgstr "기본값" + +#: src/slic3r/GUI/Field.cpp:115 +msgid "parameter name" +msgstr "매개 변수 이름" + +#: src/slic3r/GUI/Field.cpp:143 +#, c-format +msgid "%s doesn't support percentage" +msgstr "%s 이(가) 백분율을 지원하지 않음" + +#: src/slic3r/GUI/Field.cpp:157 src/slic3r/GUI/Field.cpp:180 +msgid "Invalid numeric input." +msgstr "숫자 입력이 잘못 되었습니다." + +#: src/slic3r/GUI/Field.cpp:162 +msgid "Input value is out of range" +msgstr "Input value is out of range" + +#: src/slic3r/GUI/Field.cpp:188 +#, c-format +msgid "" +"Do you mean %d%% instead of %d %s?\n" +"Select YES if you want to change this value to %d%%, \n" +"or NO if you are sure that %d %s is a correct value." +msgstr "" +"%d%% 대신 %d %s 를 의미 합니까?\n" +"이 값을 %d%%,로 변경 하려면 예를 선택 하십시오. \n" +"또는 %d %s가 올바른 값 인지 확인 하십시오." + +#: src/slic3r/GUI/Field.cpp:191 +msgid "Parameter validation" +msgstr "매개 변수 이름" + +#: src/slic3r/GUI/FirmwareDialog.cpp:141 +msgid "Flash!" +msgstr "완료!" + +#: src/slic3r/GUI/FirmwareDialog.cpp:143 +msgid "Flashing in progress. Please do not disconnect the printer!" +msgstr "아직 플래싱 중입니다. 커넥트를 분리하지 마십시오!" + +#: src/slic3r/GUI/FirmwareDialog.cpp:187 +msgid "Flashing failed: " +msgstr "펌웨어 플래싱 실패: " + +#: src/slic3r/GUI/FirmwareDialog.cpp:268 +msgid "Flashing succeeded!" +msgstr "플래싱 성공!" + +#: src/slic3r/GUI/FirmwareDialog.cpp:269 +msgid "Flashing failed. Please see the avrdude log below." +msgstr "플래시 실패. 아래의 로그를 확인하세요." + +#: src/slic3r/GUI/FirmwareDialog.cpp:270 +msgid "Flashing cancelled." +msgstr "깜빡임 취소됨." + +#: src/slic3r/GUI/FirmwareDialog.cpp:308 +#, c-format +msgid "" +"This firmware hex file does not match the printer model.\n" +"The hex file is intended for: %s\n" +"Printer reported: %s\n" +"\n" +"Do you want to continue and flash this hex file anyway?\n" +"Please only continue if you are sure this is the right thing to do." +msgstr "" +"이 펌웨어 hex 파일이 프린터 모델과 일치 하지 않습니다.\n" +"Hex 파일은 다음을 위한 것입니다: %s\n" +"보고 된 프린터: %s\n" +"\n" +"그래도이 hex 파일을 계속 플래싱 하시겠습니까?\n" +"이것이 옳은 일 이라고 확신 하는 경우에만 계속 하십시오." + +#: src/slic3r/GUI/FirmwareDialog.cpp:395 src/slic3r/GUI/FirmwareDialog.cpp:431 +#, c-format +msgid "Multiple %s devices found. Please only connect one at a time for flashing." +msgstr "여러 %s 장치를 찾았습니다. 깜박이는 경우에는 한 번에 하나씩만 연결 하십시오." + +#: src/slic3r/GUI/FirmwareDialog.cpp:412 +#, c-format +msgid "" +"The %s device was not found.\n" +"If the device is connected, please press the Reset button next to the USB connector ..." +msgstr "" +"%s 장치를 찾을 하지 않았습니다.\n" +"장치가 연결 된 경우 USB 커넥터 옆에 있는 리셋 단추를 누르십시오." + +#: src/slic3r/GUI/FirmwareDialog.cpp:525 +#, c-format +msgid "The %s device could not have been found" +msgstr "%s 장치를 찾을 수 없습니다" + +#: src/slic3r/GUI/FirmwareDialog.cpp:603 +#, c-format +msgid "Error accessing port at %s: %s" +msgstr "%s 포트에 액세스 하는 중 오류가 발생 했습니다 :%s" + +#: src/slic3r/GUI/FirmwareDialog.cpp:605 +#, c-format +msgid "Error: %s" +msgstr "에러: %s" + +#: src/slic3r/GUI/FirmwareDialog.cpp:735 +msgid "Firmware flasher" +msgstr "펌웨어 플래셔" + +#: src/slic3r/GUI/FirmwareDialog.cpp:762 +msgid "Firmware image:" +msgstr "펌웨어 이미지:" + +#: src/slic3r/GUI/FirmwareDialog.cpp:766 +msgid "Serial port:" +msgstr "시리얼 포트:" + +#: src/slic3r/GUI/FirmwareDialog.cpp:768 +msgid "Autodetected" +msgstr "자동 감지" + +#: src/slic3r/GUI/FirmwareDialog.cpp:769 +msgid "Rescan" +msgstr "재검색" + +#: src/slic3r/GUI/FirmwareDialog.cpp:776 +msgid "Progress:" +msgstr "진행:" + +#: src/slic3r/GUI/FirmwareDialog.cpp:779 +msgid "Status:" +msgstr "지위:" + +#: src/slic3r/GUI/FirmwareDialog.cpp:780 +msgid "Ready" +msgstr "준비" + +#: src/slic3r/GUI/FirmwareDialog.cpp:800 +msgid "Advanced: Output log" +msgstr "고급: 출력 로그" + +#: src/slic3r/GUI/FirmwareDialog.cpp:811 src/slic3r/GUI/PrintHostDialogs.cpp:161 +msgid "Close" +msgstr "닫기" + +#: src/slic3r/GUI/FirmwareDialog.cpp:859 +msgid "" +"Are you sure you want to cancel firmware flashing?\n" +"This could leave your printer in an unusable state!" +msgstr "" +"펌웨어 플래싱을 취소하시겠습니까?\n" +"프린터가 사용할 수 없는 상태가 될 수 있습니다!" + +#: src/slic3r/GUI/FirmwareDialog.cpp:860 +msgid "Confirmation" +msgstr "확인" + +#: src/slic3r/GUI/FirmwareDialog.cpp:863 +msgid "Cancelling..." +msgstr "취소 중...." + +#: src/slic3r/GUI/GLCanvas3D.cpp:709 +msgid "Detected object outside print volume" +msgstr "출력물이 프린터 출력 사이즈를 넘었습니다" + +#: src/slic3r/GUI/GLCanvas3D.cpp:710 +msgid "Detected toolpath outside print volume" +msgstr "인쇄 영역 밖에 있는 공구 경로가 감지 되었습니다" + +#: src/slic3r/GUI/GLCanvas3D.cpp:711 +msgid "Some objects are not visible when editing supports" +msgstr "편집 지원 시 일부 객체가 표시 되지 않음" + +#: src/slic3r/GUI/GLCanvas3D.cpp:713 +msgid "" +"Detected object outside print volume\n" +"Resolve a clash to continue slicing/export process correctly" +msgstr "" +"인쇄 볼륨 외부에서 감지 된 오브젝트\n" +"조각화/내보내기 프로세스를 올바르게 계속 하려면 충돌 해결" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:35 src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:195 +msgid "Rotate lower part upwards" +msgstr "아래쪽 부분을 위쪽으로 회전" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:36 src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:198 +msgid "Perform cut" +msgstr "절단 실행" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:43 +msgid "Cut object:" +msgstr "객체 잘라내기:" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:88 +msgid "Cut [C]" +msgstr "자르기 [C]" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:188 src/libslic3r/PrintConfig.cpp:3006 +msgid "Cut" +msgstr "컷" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:193 +msgid "Keep upper part" +msgstr "상위 부분 유지" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:194 +msgid "Keep lower part" +msgstr "낮은 부분 유지" + +#: src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp:32 +msgid "Place on face [F]" +msgstr "면 배치 [F]" + +#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:51 +msgid "Move [M]" +msgstr "이동 [M]" + +#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:176 +msgid "Position (mm)" +msgstr "위치 (mm)" + +#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:176 +msgid "Displacement (mm)" +msgstr "변위 (mm)" + +#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:458 +msgid "Rotate [R]" +msgstr "회전 [R]" + +#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:491 +msgid "Rotation (deg)" +msgstr "회전 (°)" + +#: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:51 +msgid "Scale [S]" +msgstr "스케일 [S]" + +#: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:276 +msgid "Scale (%)" +msgstr "스케일 (%)" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:597 +msgid "Left mouse click - add point" +msgstr "마우스 왼쪽 클릭-점 추가" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:598 +msgid "Right mouse click - remove point" +msgstr "마우스 오른쪽 버튼 클릭-점 제거" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:599 +msgid "Shift + Left (+ drag) - select point(s)" +msgstr "Shift + 왼쪽 (+ 끌기)-점 선택" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:606 +msgid "Head diameter: " +msgstr "헤드 지름: " + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:618 +msgid "Lock supports under new islands" +msgstr "새 고립 영역에서 잠금 지원" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:622 +msgid "Remove selected points" +msgstr "선택한 점 제거" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:626 src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:679 +msgid "Remove all points" +msgstr "모든 점 제거" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:631 +msgid "Apply changes" +msgstr "변경 내용을 적용" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:636 +msgid "Discard changes" +msgstr "변경사항을 취소" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:644 +msgid "Minimal points distance: " +msgstr "최소 포인트 거리: " + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:655 +msgid "Support points density: " +msgstr "지원 포인트 밀도: " + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:669 +msgid "Auto-generate points [A]" +msgstr "점 자동 생성 [A]" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:675 +msgid "Manual editing [M]" +msgstr "수동 편집 [M]" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:738 +msgid "SLA Support Points [L]" +msgstr "SLA 지원 포인트 [L]" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:767 +msgid "Do you want to save your manually edited support points ?\n" +msgstr "수동으로 편집한 지원 지점을 저장 하시겠습니까?\n" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:768 +msgid "Save changes?" +msgstr "변경 사항을 저장 하 시겠습니까?" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:897 +msgid "" +"Autogeneration will erase all manually edited points.\n" +"\n" +"Are you sure you want to do it?\n" +msgstr "" +"자동 생성은 수동으로 편집한 모든 점을 지웁니다.\n" +"\n" +"당신은 당신은 그렇게 하시겠습니까?\n" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:899 src/slic3r/GUI/GUI.cpp:288 +#: src/slic3r/GUI/WipeTowerDialog.cpp:44 src/slic3r/GUI/WipeTowerDialog.cpp:328 +msgid "Warning" +msgstr "위험" + +#: src/slic3r/GUI/GUI.cpp:147 src/slic3r/GUI/Tab.cpp:2720 +msgid "It's impossible to print multi-part object(s) with SLA technology." +msgstr "SLA 방식을 사용 하여 멀티파트를 인쇄할 수는 없습니다." + +#: src/slic3r/GUI/GUI.cpp:148 +msgid "Please check and fix your object list." +msgstr "개체 목록을 확인 하고 수정 하십시오." + +#: src/slic3r/GUI/GUI.cpp:149 src/slic3r/GUI/GUI_App.cpp:679 src/slic3r/GUI/Tab.cpp:2722 +msgid "Attention!" +msgstr "주목!" + +#: src/slic3r/GUI/GUI.cpp:282 +msgid "Notice" +msgstr "공지" + +#: src/slic3r/GUI/GUI_App.cpp:318 +msgid "Changing of an application language" +msgstr "응용 프로그램 언어 변경" + +#: src/slic3r/GUI/GUI_App.cpp:326 src/slic3r/GUI/GUI_App.cpp:335 +msgid "Recreating" +msgstr "재현" + +#: src/slic3r/GUI/GUI_App.cpp:339 +msgid "Loading of a current presets" +msgstr "현재 프리셋 불러오기" + +#: src/slic3r/GUI/GUI_App.cpp:347 +msgid "Loading of a mode view" +msgstr "모드 보기 로드" + +#: src/slic3r/GUI/GUI_App.cpp:429 +msgid "Choose one file (3MF):" +msgstr "파일 (3MF)를 선택:" + +#: src/slic3r/GUI/GUI_App.cpp:441 +msgid "Choose one or more files (STL/OBJ/AMF/3MF/PRUSA):" +msgstr "파일을 선택하세요 (STL/OBJ/AMF/3MF/PRUSA):" + +#: src/slic3r/GUI/GUI_App.cpp:454 +msgid "Array of language names and identifiers should have the same size." +msgstr "언어 이름과 식별자 배열은 같은 크기 여야합니다." + +#: src/slic3r/GUI/GUI_App.cpp:464 +msgid "Select the language" +msgstr "언어를 선택" + +#: src/slic3r/GUI/GUI_App.cpp:464 +msgid "Language" +msgstr "언어" + +#: src/slic3r/GUI/GUI_App.cpp:534 src/slic3r/GUI/GUI_ObjectList.cpp:1067 src/libslic3r/PrintConfig.cpp:298 +msgid "Default" +msgstr "기본값" + +# xs/src/slic3r/GUI/GUI.cpp:349 +#: src/slic3r/GUI/GUI_App.cpp:603 +msgid "&Configuration Snapshots" +msgstr "구성 스냅숏" + +#: src/slic3r/GUI/GUI_App.cpp:603 +msgid "Inspect / activate configuration snapshots" +msgstr "구성 스냅 샷 검사 / 활성화" + +#: src/slic3r/GUI/GUI_App.cpp:604 +msgid "Take Configuration &Snapshot" +msgstr "구성 스냅 샷 가져 오기" + +#: src/slic3r/GUI/GUI_App.cpp:604 +msgid "Capture a configuration snapshot" +msgstr "구성 스냅 샷 캡처" + +#: src/slic3r/GUI/GUI_App.cpp:607 +msgid "&Preferences" +msgstr "환경 설정" + +#: src/slic3r/GUI/GUI_App.cpp:613 +msgid "Application preferences" +msgstr "응용 프로그램 환경 설정" + +#: src/slic3r/GUI/GLCanvas3D.cpp:3434 +msgid "Add..." +msgstr "추가..." + +#: src/slic3r/GUI/GLCanvas3D.cpp:3455 src/slic3r/GUI/Plater.cpp:3341 +#, fuzzy +msgid "Delete all" +msgstr "전부 지움" + +#: src/slic3r/GUI/GLCanvas3D.cpp:3491 +msgid "Paste" +msgstr "붙여넣기" + +#: src/slic3r/GUI/GLCanvas3D.cpp:3505 +msgid "Add instance" +msgstr "인스턴스 추가" + +#: src/slic3r/GUI/GLCanvas3D.cpp:3517 +msgid "Remove instance" +msgstr "인스턴스 제거" + +#: src/slic3r/GUI/GLCanvas3D.cpp:3532 +msgid "Split to objects" +msgstr "객체로 분할" + +#: src/slic3r/GUI/GLCanvas3D.cpp:3544 src/slic3r/GUI/GUI_ObjectList.cpp:1122 +msgid "Split to parts" +msgstr "파트로 분할" + +#: src/slic3r/GUI/GUI_App.cpp:616 src/slic3r/GUI/wxExtensions.cpp:2446 +msgid "Simple" +msgstr "단순" + +#: src/slic3r/GUI/GUI_App.cpp:616 +msgid "Simple View Mode" +msgstr "단순 보기 모드" + +#: src/slic3r/GUI/GUI_App.cpp:617 src/slic3r/GUI/GUI_ObjectList.cpp:73 src/slic3r/GUI/Tab.cpp:977 +#: src/slic3r/GUI/Tab.cpp:992 src/slic3r/GUI/Tab.cpp:1090 src/slic3r/GUI/Tab.cpp:1093 +#: src/slic3r/GUI/Tab.cpp:1466 src/slic3r/GUI/Tab.cpp:1890 src/slic3r/GUI/Tab.cpp:3347 +#: src/slic3r/GUI/wxExtensions.cpp:2447 src/libslic3r/PrintConfig.cpp:72 src/libslic3r/PrintConfig.cpp:186 +#: src/libslic3r/PrintConfig.cpp:349 src/libslic3r/PrintConfig.cpp:987 src/libslic3r/PrintConfig.cpp:2173 +msgid "Advanced" +msgstr "고급" + +#: src/slic3r/GUI/GUI_App.cpp:617 +msgid "Advanced View Mode" +msgstr "고급 보기 모드" + +#: src/slic3r/GUI/GUI_App.cpp:618 src/slic3r/GUI/wxExtensions.cpp:2448 +msgid "Expert" +msgstr "전문가" + +#: src/slic3r/GUI/GUI_App.cpp:618 +msgid "Expert View Mode" +msgstr "전문가 보기 모드" + +#: src/slic3r/GUI/GUI_App.cpp:623 +msgid "Mode" +msgstr "모드" + +#: src/slic3r/GUI/GUI_App.cpp:623 +msgid "Slic3r View Mode" +msgstr "Slic3r 보기 모드" + +#: src/slic3r/GUI/GUI_App.cpp:625 +msgid "Change Application &Language" +msgstr "응용 프로그램 언어 번경" + +#: src/slic3r/GUI/GUI_App.cpp:627 +msgid "Flash printer &firmware" +msgstr "프린터 펌웨어 플래시" + +#: src/slic3r/GUI/GUI_App.cpp:627 +msgid "Upload a firmware image into an Arduino based printer" +msgstr "아두이노 기반의 프린터 이미지 업로드" + +#: src/slic3r/GUI/GUI_App.cpp:639 +msgid "Taking configuration snapshot" +msgstr "구성 스냅 샷 만들기" + +#: src/slic3r/GUI/GUI_App.cpp:639 +msgid "Snapshot name" +msgstr "스냅 샷 이름" + +#: src/slic3r/GUI/GUI_App.cpp:676 +msgid "Application will be restarted after language change." +msgstr "언어 변경 후 응용 프로그램이 다시 시작 됩니다." + +#: src/slic3r/GUI/GUI_App.cpp:677 +msgid "3D-Scene will be cleaned." +msgstr "3D-장면이 청소 됩니다." + +#: src/slic3r/GUI/GUI_App.cpp:678 +msgid "Please, check your changes before." +msgstr "이전에 변경 사항을 확인 하십시오." + +#: src/slic3r/GUI/GUI_App.cpp:706 +msgid "&Configuration" +msgstr "&구성" + +#: src/slic3r/GUI/GUI_App.cpp:726 +msgid "You have unsaved changes " +msgstr "저장되지 않은 변경 사항이 있습니다 " + +#: src/slic3r/GUI/GUI_App.cpp:726 +msgid ". Discard changes and continue anyway?" +msgstr ". 변경 사항을 취소하고 계속 하시겠습니까?" + +#: src/slic3r/GUI/GUI_App.cpp:727 +msgid "Unsaved Presets" +msgstr "저장되지 않은 기존설정" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:28 src/slic3r/GUI/GUI_ObjectList.cpp:65 src/libslic3r/PrintConfig.cpp:56 +#: src/libslic3r/PrintConfig.cpp:149 src/libslic3r/PrintConfig.cpp:380 src/libslic3r/PrintConfig.cpp:437 +#: src/libslic3r/PrintConfig.cpp:445 src/libslic3r/PrintConfig.cpp:841 src/libslic3r/PrintConfig.cpp:1025 +#: src/libslic3r/PrintConfig.cpp:1304 src/libslic3r/PrintConfig.cpp:1370 src/libslic3r/PrintConfig.cpp:1551 +#: src/libslic3r/PrintConfig.cpp:1986 src/libslic3r/PrintConfig.cpp:2042 +msgid "Layers and Perimeters" +msgstr "레이어 및 경계선" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:29 src/slic3r/GUI/GUI_ObjectList.cpp:66 src/slic3r/GUI/Plater.cpp:431 +#: src/slic3r/GUI/Tab.cpp:981 src/slic3r/GUI/Tab.cpp:982 src/slic3r/GUI/Tab.cpp:1311 +#: src/libslic3r/PrintConfig.cpp:166 src/libslic3r/PrintConfig.cpp:388 src/libslic3r/PrintConfig.cpp:728 +#: src/libslic3r/PrintConfig.cpp:742 src/libslic3r/PrintConfig.cpp:779 src/libslic3r/PrintConfig.cpp:932 +#: src/libslic3r/PrintConfig.cpp:942 src/libslic3r/PrintConfig.cpp:960 src/libslic3r/PrintConfig.cpp:978 +#: src/libslic3r/PrintConfig.cpp:997 src/libslic3r/PrintConfig.cpp:1658 src/libslic3r/PrintConfig.cpp:1675 +msgid "Infill" +msgstr "인필(채움)" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:30 src/slic3r/GUI/GUI_ObjectList.cpp:67 src/slic3r/GUI/GUI_Preview.cpp:236 +#: src/slic3r/GUI/Tab.cpp:1010 src/slic3r/GUI/Tab.cpp:1011 src/libslic3r/PrintConfig.cpp:333 +#: src/libslic3r/PrintConfig.cpp:1431 src/libslic3r/PrintConfig.cpp:1779 src/libslic3r/PrintConfig.cpp:1785 +#: src/libslic3r/PrintConfig.cpp:1793 src/libslic3r/PrintConfig.cpp:1805 src/libslic3r/PrintConfig.cpp:1815 +#: src/libslic3r/PrintConfig.cpp:1823 src/libslic3r/PrintConfig.cpp:1838 src/libslic3r/PrintConfig.cpp:1859 +#: src/libslic3r/PrintConfig.cpp:1870 src/libslic3r/PrintConfig.cpp:1886 src/libslic3r/PrintConfig.cpp:1895 +#: src/libslic3r/PrintConfig.cpp:1904 src/libslic3r/PrintConfig.cpp:1915 src/libslic3r/PrintConfig.cpp:1929 +#: src/libslic3r/PrintConfig.cpp:1937 src/libslic3r/PrintConfig.cpp:1938 src/libslic3r/PrintConfig.cpp:1947 +#: src/libslic3r/PrintConfig.cpp:1955 src/libslic3r/PrintConfig.cpp:1969 src/libslic3r/GCode/PreviewData.cpp:172 +msgid "Support material" +msgstr "서포트 재료(Support material)" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:33 src/slic3r/GUI/GUI_ObjectList.cpp:69 src/slic3r/GUI/Tab.cpp:1070 +#: src/slic3r/GUI/Tab.cpp:1794 src/libslic3r/PrintConfig.cpp:455 src/libslic3r/PrintConfig.cpp:953 +#: src/libslic3r/PrintConfig.cpp:1339 src/libslic3r/PrintConfig.cpp:1667 src/libslic3r/PrintConfig.cpp:1851 +#: src/libslic3r/PrintConfig.cpp:1877 src/libslic3r/PrintConfig.cpp:2149 src/libslic3r/PrintConfig.cpp:2157 +msgid "Extruders" +msgstr "익스트루더" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:39 +msgid "Pad and Support" +msgstr "패드 및 서포트" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:68 src/slic3r/GUI/GUI_Preview.cpp:215 src/slic3r/GUI/Tab.cpp:1035 +#: src/libslic3r/PrintConfig.cpp:198 src/libslic3r/PrintConfig.cpp:425 src/libslic3r/PrintConfig.cpp:870 +#: src/libslic3r/PrintConfig.cpp:998 src/libslic3r/PrintConfig.cpp:1360 src/libslic3r/PrintConfig.cpp:1597 +#: src/libslic3r/PrintConfig.cpp:1646 src/libslic3r/PrintConfig.cpp:1697 src/libslic3r/PrintConfig.cpp:2028 +msgid "Speed" +msgstr "속도" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:70 src/libslic3r/PrintConfig.cpp:415 src/libslic3r/PrintConfig.cpp:522 +#: src/libslic3r/PrintConfig.cpp:829 src/libslic3r/PrintConfig.cpp:961 src/libslic3r/PrintConfig.cpp:1348 +#: src/libslic3r/PrintConfig.cpp:1687 src/libslic3r/PrintConfig.cpp:1860 src/libslic3r/PrintConfig.cpp:2017 +msgid "Extrusion Width" +msgstr "압출 폭" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:75 src/slic3r/GUI/Plater.cpp:410 src/slic3r/GUI/Tab.cpp:3309 +#: src/slic3r/GUI/Tab.cpp:3310 src/libslic3r/PrintConfig.cpp:2359 src/libslic3r/PrintConfig.cpp:2366 +#: src/libslic3r/PrintConfig.cpp:2375 src/libslic3r/PrintConfig.cpp:2384 src/libslic3r/PrintConfig.cpp:2394 +#: src/libslic3r/PrintConfig.cpp:2420 src/libslic3r/PrintConfig.cpp:2427 src/libslic3r/PrintConfig.cpp:2438 +#: src/libslic3r/PrintConfig.cpp:2448 src/libslic3r/PrintConfig.cpp:2457 src/libslic3r/PrintConfig.cpp:2467 +#: src/libslic3r/PrintConfig.cpp:2476 src/libslic3r/PrintConfig.cpp:2486 src/libslic3r/PrintConfig.cpp:2496 +#: src/libslic3r/PrintConfig.cpp:2504 +msgid "Supports" +msgstr "서포트" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:76 src/slic3r/GUI/Tab.cpp:3337 src/slic3r/GUI/Tab.cpp:3338 +#: src/libslic3r/PrintConfig.cpp:2512 src/libslic3r/PrintConfig.cpp:2519 src/libslic3r/PrintConfig.cpp:2530 +#: src/libslic3r/PrintConfig.cpp:2540 src/libslic3r/PrintConfig.cpp:2553 src/libslic3r/PrintConfig.cpp:2562 +msgid "Pad" +msgstr "패드" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:173 src/slic3r/GUI/GUI_ObjectManipulation.cpp:45 +msgid "Name" +msgstr "이름" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:201 +msgid "Right button click the icon to change the object settings" +msgstr "아이콘을 클릭 하여 개체 설정을 변경 합니다" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:209 +#, c-format +msgid "Auto-repaired (%d errors):\n" +msgstr "오류자동수정 (%d errors)\n" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:212 +msgid "degenerate facets" +msgstr "더러운 면" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:213 +msgid "edges fixed" +msgstr "모서리 고정" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:214 +msgid "facets removed" +msgstr "면 제거" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:215 +msgid "facets added" +msgstr "면 추가됨" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:216 +msgid "facets reversed" +msgstr "면 반전" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:217 +msgid "backwards edges" +msgstr "뒤쪽 가장자리" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:231 +msgid "Right button click the icon to fix STL through Netfabb" +msgstr "아이콘을 클릭 하여 Netfabb에서 STL을 수정 합니다" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:278 src/slic3r/GUI/Tab.cpp:1430 src/libslic3r/PrintConfig.cpp:454 +msgid "Extruder" +msgstr "익스트루더(Extruder)" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:683 src/slic3r/GUI/GUI_ObjectList.cpp:963 +#: src/slic3r/GUI/GUI_ObjectList.cpp:969 src/slic3r/GUI/GUI_ObjectList.cpp:1199 +#, c-format +msgid "Quick Add Settings (%s)" +msgstr "빠른 추가 설정 (%s)" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:746 +msgid "Select showing settings" +msgstr "설정 표시를 선택 합니다" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:874 +msgid "Load" +msgstr "불러오기" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:879 src/slic3r/GUI/GUI_ObjectList.cpp:911 +#: src/slic3r/GUI/GUI_ObjectList.cpp:914 +msgid "Box" +msgstr "박스" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:879 +msgid "Cylinder" +msgstr "원통" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:879 +msgid "Sphere" +msgstr "영역" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:879 +msgid "Slab" +msgstr "슬랩" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:890 src/slic3r/GUI/GUI_ObjectList.cpp:906 +msgid "Add part" +msgstr "파트 추가" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:891 +msgid "Add modifier" +msgstr "편집영역(modifier) 추가" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:892 src/slic3r/GUI/GUI_ObjectList.cpp:910 +msgid "Add support enforcer" +msgstr "서포트 지원(enforcer)영역 추가" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:893 src/slic3r/GUI/GUI_ObjectList.cpp:913 +msgid "Add support blocker" +msgstr "서포트 금지영역(blocker) 추가" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:942 +msgid "Add settings" +msgstr "다음 설정" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1009 +msgid "Change type" +msgstr "타입 변경" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1016 src/slic3r/GUI/GUI_ObjectList.cpp:1153 +msgid "Set as a Separated Object" +msgstr "분리 된 객체로 설정" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1024 +msgid "Rename" +msgstr "이름 변경" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1034 +msgid "Fix through the Netfabb" +msgstr "네트워크를 통해 수정" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1041 src/slic3r/GUI/Plater.cpp:2861 +msgid "Export as STL" +msgstr "STL로 내보내기" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1048 +msgid "Change extruder" +msgstr "압출기(익스트루더) 변경" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1073 +msgid "Select new extruder for the object/part" +msgstr "객체/부품에 대한 새 압출(익스트루더) 기 선택" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1079 src/slic3r/GUI/Plater.cpp:2825 src/slic3r/GUI/Plater.cpp:2843 +#: src/slic3r/GUI/Tab.cpp:2860 +msgid "Delete" +msgstr "지우기(delete)" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1153 +msgid "Set as a Separated Objects" +msgstr "분리 된 객체로 설정" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1374 +msgid "Generic" +msgstr "일반" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1516 +msgid "You can't delete the last solid part from object." +msgstr "마지막 솔리드 파트는 객체에서 삭제할 수 없습니다." + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1533 +msgid "You can't delete the last intance from object." +msgstr "개체에서 마지막 인텐스(intance)를 삭제할 수 없습니다." + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1560 src/slic3r/GUI/Plater.cpp:2219 +msgid "The selected object couldn't be split because it contains only one part." +msgstr "선택한 오브젝트는 파트가 하나만 포함되어 있기 때문에 분할 할 수 없습니다." + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1676 +msgid "Group manipulation" +msgstr "그룹 조작" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1688 +msgid "Object manipulation" +msgstr "개체 조작" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1698 +msgid "Object Settings to modify" +msgstr "수정할 개체 설정" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1702 +msgid "Part Settings to modify" +msgstr "수정할 부품 설정" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1711 +msgid "Part manipulation" +msgstr "파트 조작" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1717 +msgid "Instance manipulation" +msgstr "인스턴스 제거" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2240 +msgid "Object or Instance" +msgstr "개체 또는 인스턴스" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2240 +msgid "Part" +msgstr "부품" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2242 +msgid "Unsupported selection" +msgstr "지원 되지 않는 선택" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2243 +#, c-format +msgid "You started your selection with %s Item." +msgstr "%s 항목으로 선택을 시작 했습니다." + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2244 +#, c-format +msgid "In this mode you can select only other %s Items%s" +msgstr "이 모드에서는 %s의 다른 %s 항목만 선택할 수 있습니다" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2247 +msgid "of a current Object" +msgstr "현재 개체의" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2252 src/slic3r/GUI/GUI_ObjectList.cpp:2325 src/slic3r/GUI/Plater.cpp:117 +msgid "Info" +msgstr "정보" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2366 +msgid "You can't change a type of the last solid part of the object." +msgstr "객체의 마지막 솔리드 부품 유형은 변경할 수 없습니다." + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2373 +msgid "Select type of part" +msgstr "부품 유형 선택" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2538 +msgid "Enter new name" +msgstr "새 이름 입력" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2538 +msgid "Renaming" +msgstr "이름 바꾸기" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2554 src/slic3r/GUI/GUI_ObjectList.cpp:2632 src/slic3r/GUI/Tab.cpp:3191 +#: src/slic3r/GUI/Tab.cpp:3195 +msgid "The supplied name is not valid;" +msgstr "제공된 이름이 유효하지 않습니다;" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2555 src/slic3r/GUI/GUI_ObjectList.cpp:2633 src/slic3r/GUI/Tab.cpp:3192 +msgid "the following characters are not allowed:" +msgstr "다음 문자는 허용되지 않습니다:" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2653 +msgid "Set extruder for selected items" +msgstr "선택한 항목에 대한 압출기(익스트루더) 설정" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2654 +msgid "Select extruder number for selected objects and/or parts" +msgstr "선택한 객체 및 부품에 대한 압출기(익스트루더) 번호 선택" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2667 +msgid "Select extruder number:" +msgstr "압출기(익스트루더) 번호 선택:" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2668 +msgid "This extruder will be set for selected items" +msgstr "선택한 항목에 대한 압출기(익스트루더) 설정" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:40 src/slic3r/GUI/GUI_ObjectManipulation.cpp:83 +msgid "World coordinates" +msgstr "전체크기와 좌표" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:41 src/slic3r/GUI/GUI_ObjectManipulation.cpp:84 +msgid "Local coordinates" +msgstr "로컬 좌표" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:25 +msgid "Object Manipulation" +msgstr "개체 조작" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:47 +msgid "Object name" +msgstr "개체 이름" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:115 src/slic3r/GUI/GUI_ObjectManipulation.cpp:160 +msgid "Position" +msgstr "위치" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:116 src/slic3r/GUI/GUI_ObjectManipulation.cpp:161 +msgid "Rotation" +msgstr "회전" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:117 src/slic3r/GUI/GUI_ObjectManipulation.cpp:201 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:221 src/libslic3r/PrintConfig.cpp:3070 +msgid "Scale" +msgstr "크기" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:162 +msgid "Scale factors" +msgstr "축척 계수" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:200 src/slic3r/GUI/GUI_ObjectManipulation.cpp:220 +#: src/libslic3r/PrintConfig.cpp:3055 +msgid "Rotate" +msgstr "회전" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:219 +msgid "Translate" +msgstr "번역" + +#: src/slic3r/GUI/GUI_ObjectSettings.cpp:58 +msgid "Additional Settings" +msgstr "추가적인 세팅" + +#: src/slic3r/GUI/GUI_Preview.cpp:209 +msgid "View" +msgstr "보기" + +#: src/slic3r/GUI/GUI_Preview.cpp:212 src/slic3r/GUI/GUI_Preview.cpp:525 src/libslic3r/GCode/PreviewData.cpp:394 +msgid "Feature type" +msgstr "특색 유형" + +#: src/slic3r/GUI/GUI_Preview.cpp:213 src/libslic3r/PrintConfig.cpp:467 +msgid "Height" +msgstr "높이" + +#: src/slic3r/GUI/GUI_Preview.cpp:214 src/libslic3r/PrintConfig.cpp:2135 +msgid "Width" +msgstr "폭" + +#: src/slic3r/GUI/GUI_Preview.cpp:216 +msgid "Volumetric flow rate" +msgstr "용적의 유량값" + +#: src/slic3r/GUI/GUI_Preview.cpp:217 src/slic3r/GUI/GUI_Preview.cpp:315 src/slic3r/GUI/GUI_Preview.cpp:469 +#: src/slic3r/GUI/GUI_Preview.cpp:525 src/slic3r/GUI/GUI_Preview.cpp:701 src/libslic3r/GCode/PreviewData.cpp:404 +msgid "Tool" +msgstr "도구" + +#: src/slic3r/GUI/GUI_Preview.cpp:218 src/slic3r/GUI/GUI_Preview.cpp:523 src/libslic3r/GCode/PreviewData.cpp:406 +msgid "Color Print" +msgstr "컬러 프린트" + +#: src/slic3r/GUI/GUI_Preview.cpp:221 +msgid "Show" +msgstr "보다" + +#: src/slic3r/GUI/GUI_Preview.cpp:224 src/slic3r/GUI/GUI_Preview.cpp:225 +msgid "Feature types" +msgstr "특색 유형" + +#: src/slic3r/GUI/GUI_Preview.cpp:227 src/libslic3r/GCode/PreviewData.cpp:163 +msgid "Perimeter" +msgstr "가장자리" + +#: src/slic3r/GUI/GUI_Preview.cpp:228 src/libslic3r/GCode/PreviewData.cpp:164 +msgid "External perimeter" +msgstr "외부 가장자리" + +#: src/slic3r/GUI/GUI_Preview.cpp:229 src/libslic3r/GCode/PreviewData.cpp:165 +msgid "Overhang perimeter" +msgstr "오버행(Overhang) 둘레" + +#: src/slic3r/GUI/GUI_Preview.cpp:230 src/libslic3r/GCode/PreviewData.cpp:166 +msgid "Internal infill" +msgstr "내부 채움" + +#: src/slic3r/GUI/GUI_Preview.cpp:231 src/libslic3r/PrintConfig.cpp:1686 src/libslic3r/PrintConfig.cpp:1696 +#: src/libslic3r/GCode/PreviewData.cpp:167 +msgid "Solid infill" +msgstr "솔리드 인필" + +#: src/slic3r/GUI/GUI_Preview.cpp:232 src/libslic3r/PrintConfig.cpp:2016 src/libslic3r/PrintConfig.cpp:2027 +#: src/libslic3r/GCode/PreviewData.cpp:168 +msgid "Top solid infill" +msgstr "가장 윗부분 채움" + +#: src/slic3r/GUI/GUI_Preview.cpp:233 src/libslic3r/GCode/PreviewData.cpp:169 +msgid "Bridge infill" +msgstr "프릿지 채움" + +#: src/slic3r/GUI/GUI_Preview.cpp:234 src/libslic3r/PrintConfig.cpp:869 src/libslic3r/GCode/PreviewData.cpp:170 +msgid "Gap fill" +msgstr "공백 채움" + +#: src/slic3r/GUI/GUI_Preview.cpp:235 src/slic3r/GUI/Tab.cpp:1001 src/libslic3r/GCode/PreviewData.cpp:171 +msgid "Skirt" +msgstr "스커트" + +#: src/slic3r/GUI/GUI_Preview.cpp:237 src/libslic3r/PrintConfig.cpp:1903 src/libslic3r/GCode/PreviewData.cpp:173 +msgid "Support material interface" +msgstr "서포트 재료 인터페이스" + +#: src/slic3r/GUI/GUI_Preview.cpp:238 src/slic3r/GUI/Tab.cpp:1081 src/libslic3r/GCode/PreviewData.cpp:174 +msgid "Wipe tower" +msgstr "와이프 타워(Wipe tower)" + +#: src/slic3r/GUI/GUI_Preview.cpp:243 src/libslic3r/PrintConfig.cpp:2049 +msgid "Travel" +msgstr "이송" + +#: src/slic3r/GUI/GUI_Preview.cpp:244 +msgid "Retractions" +msgstr "리트랙션" + +#: src/slic3r/GUI/GUI_Preview.cpp:245 +msgid "Unretractions" +msgstr "리트랙션 취소" + +#: src/slic3r/GUI/GUI_Preview.cpp:246 +msgid "Shells" +msgstr "쉘" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:13 +msgid "Slic3r Prusa Edition - Keyboard Shortcuts" +msgstr "Slic3r Prusa 에디션-키보드 단축키" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:100 +msgid "Open project STL/OBJ/AMF/3MF with config, delete bed" +msgstr "구성으로 프로젝트 STL/OBJ/AMF/3MF 열기, 배드 삭제" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:101 +msgid "Import STL/OBJ/AMF/3MF without config, keep bed" +msgstr "구성 없이 STL/OBJ/AMF/3MF 가져오기, 배드 유지" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:102 +msgid "Load Config from .ini/amf/3mf/gcode" +msgstr ".Ini/amf/3mf/gcode에서 구성 로드" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:103 src/slic3r/GUI/Plater.cpp:725 src/slic3r/GUI/Plater.cpp:3673 +#: src/libslic3r/PrintConfig.cpp:2957 +msgid "Export G-code" +msgstr "G-코드 내보내기" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:104 +msgid "Save project (3MF)" +msgstr "프로젝트 저장 (3MF)" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:105 +msgid "Load Config from .ini/amf/3mf/gcode and merge" +msgstr ".Ini/amf/3mf/gcode 및 병합에서 구성 로드" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:106 +msgid "(Re)slice" +msgstr "(Re) 슬라이스" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:107 +msgid "Quick slice" +msgstr "빠른 슬라이스" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:108 src/slic3r/GUI/MainFrame.cpp:326 +msgid "Repeat last quick slice" +msgstr "마지막으로 빠른 슬라이스 반복" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:109 +msgid "Select Plater Tab" +msgstr "선택 및 플래이트 탭" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:110 +msgid "Quick slice and Save as" +msgstr "빠른 슬라이스 및 다른 이름으로 저장" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:111 +msgid "Select Print Settings Tab" +msgstr "인쇄 설정 탭을 선택 합니다" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:112 +msgid "Select Filament Settings Tab" +msgstr "필라멘트 설정 탭 선택" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:113 +msgid "Select Printer Settings Tab" +msgstr "프린터 설정 탭을 선택 합니다" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:114 +msgid "Switch to 3D" +msgstr "3D로 전환" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:115 +msgid "Switch to Preview" +msgstr "미리 보기로 전환" + +# xs/src/slic3r/GUI/Preferences.cpp:9 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:116 src/slic3r/GUI/Preferences.cpp:10 +msgid "Preferences" +msgstr "환경 설정" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:117 src/slic3r/GUI/PrintHostDialogs.cpp:134 +msgid "Print host upload queue" +msgstr "호스트 업로드 대기열 인쇄" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:122 +msgid "Camera view" +msgstr "카메라 뷰" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:124 +msgid "Add Instance of the selected object" +msgstr "선택한 개체의 인스턴스 추가" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:125 +msgid "Remove Instance of the selected object" +msgstr "선택한 개체의 인스턴스 제거" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:121 +msgid "Show keyboard shortcuts list" +msgstr "바로 가기 키 목록 표시" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:127 +msgid "Press to select multiple object or move multiple object with mouse" +msgstr "여러 개체를 선택 하거나 마우스로 여러 개체를 이동 하려면 누릅니다." + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:122 +msgid "Select multiple object/Move multiple object" +msgstr "여러 개체 선택/여러 개체 이동" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:124 +msgid "Main Shortcuts" +msgstr "주요 단축키" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:130 +msgid "Arrange" +msgstr "정렬" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:131 +msgid "Select All objects" +msgstr "모든 객체 선택" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:132 +msgid "Delete selected" +msgstr "선택 삭제" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:137 +msgid "Delete All" +msgstr "전부 지움" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:134 +msgid "Gizmo move" +msgstr "기즈모 이동" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:135 +msgid "Gizmo scale" +msgstr "기즈모 배율" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:136 +msgid "Gizmo rotate" +msgstr "기즈모 회전" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:137 +msgid "Gizmo cut" +msgstr "기즈모 컷" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:138 +msgid "Gizmo Place face on bed" +msgstr "Gizmo Place face on bed" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:139 +msgid "Copy to clipboard" +msgstr "클립보드로 복사" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:140 +msgid "Paste from clipboard" +msgstr "클립보드에서 붙여넣기" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:139 +msgid "Gizmo SLA support points" +msgstr "기즈모 SLA 지원 포인트" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:147 +#, no-c-format +msgid "" +"Press to snap by 5% in Gizmo scale\n" +"or by 1mm in Gizmo move" +msgstr "" +"기즈모 배율에서 5% in로 스냅 하려면 누릅니다.\n" +"또는 기 즈 모에서 1mm로 이동" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:148 +msgid "" +"Press to scale or rotate selected objects\n" +"around their own center" +msgstr "" +"자신의 중심 주변\n" +"선택한 개체의 크기를 조정 하거나 회전 하려면 누릅니다" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:142 +msgid "Zoom to Bed" +msgstr "배드 확대" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:143 +msgid "Zoom to all objects in scene, if none selected" +msgstr "장면의 모든 오브젝트로 확대/축소 (선택 하지 않은 경우)" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:144 +msgid "Zoom to selected object" +msgstr "선택한 개체로 확대/축소" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:145 +msgid "Zoom in" +msgstr "확대" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:146 +msgid "Zoom out" +msgstr "줌 아웃" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:149 +msgid "" +"s\n" +"around their own center" +msgstr "중심 주변으로. 선택한 개체의 크기를 조정 하거나 회전 하려면 누릅니다" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:150 +msgid "" +"Press to activate deselection rectangle\n" +"or to scale or rotate selected objects\n" +"around their own center" +msgstr "선택 해제 사각형을 활성화하려면 누르십시오. 선택한 객체의 비율을 조정하거나 회전하려면를 누르십시오" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:154 +msgid "Unselect gizmo, keep object selection" +msgstr "기즈모 선택을 취소 하고 객체 선택 유지" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:156 +msgid "Plater Shortcuts" +msgstr "Plater" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:164 src/slic3r/GUI/KBShortcutsDialog.cpp:175 +msgid "Arrow Up" +msgstr "위쪽 화살표" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:164 src/slic3r/GUI/KBShortcutsDialog.cpp:166 +msgid "Upper Layer" +msgstr "상위 레이어" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:165 src/slic3r/GUI/KBShortcutsDialog.cpp:176 +msgid "Arrow Down" +msgstr "아래쪽 화살표" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:165 src/slic3r/GUI/KBShortcutsDialog.cpp:167 +msgid "Lower Layer" +msgstr "하위 레이어" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:169 +msgid "Preview Shortcuts" +msgstr "미리 보기 바로 가기" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:175 +msgid "Move current slider thump Up" +msgstr "현재 슬라이더를 쿵 위로 이동" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:176 +msgid "Move current slider thump Down" +msgstr "현재 슬라이더를 아래로 쿵 이동" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:177 +msgid "Arrow Left" +msgstr "왼쪽 화살표" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:177 +msgid "Set upper thumb to current slider thumb" +msgstr "위쪽 엄지를 현재 슬라이더 엄지 손가락으로 설정" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:178 +msgid "Arrow Right" +msgstr "오른쪽 화살표" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:178 +msgid "Set lower thumb to current slider thumb" +msgstr "낮은 엄지를 현재 슬라이더 엄지 손가락으로 설정" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:179 +msgid "Add color change marker for current layer" +msgstr "현재 레이어의 색상 변경 마커 추가" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:180 +msgid "Delete color change marker for current layer" +msgstr "현재 레이어의 색상 변경 마커 삭제" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:182 +msgid "Layers Slider Shortcuts" +msgstr "레이어 슬라이더 단축키" + +#: src/slic3r/GUI/MainFrame.cpp:54 +msgid " - Remember to check for updates at http://github.com/prusa3d/slic3r/releases" +msgstr " -http://github.com/prusa3d/slic3r/releases에서 업데이트를 확인하는 것을 잊지 마십시오" + +#: src/slic3r/GUI/MainFrame.cpp:160 +msgid "Plater" +msgstr "플레이트" + +#: src/slic3r/GUI/MainFrame.cpp:273 +msgid "&Open Project" +msgstr "&프로젝트 열기" + +#: src/slic3r/GUI/MainFrame.cpp:273 +msgid "Open a project file" +msgstr "프로젝트 파일 열기" + +#: src/slic3r/GUI/MainFrame.cpp:275 +msgid "&Save Project" +msgstr "프로젝트 저장" + +#: src/slic3r/GUI/MainFrame.cpp:275 +msgid "Save current project file" +msgstr "현재 프로젝트 파일 저장" + +#: src/slic3r/GUI/MainFrame.cpp:277 +msgid "Save Project &as" +msgstr "프로젝트 저장" + +#: src/slic3r/GUI/MainFrame.cpp:277 +msgid "Save current project file as" +msgstr "현재 프로젝트 파일을 다른 이름으로 저장" + +#: src/slic3r/GUI/MainFrame.cpp:283 +msgid "Import STL/OBJ/AM&F/3MF" +msgstr "가져오기 STL/OBJ/AM&F/3MF" + +#: src/slic3r/GUI/MainFrame.cpp:283 +msgid "Load a model" +msgstr "모델 로드" + +#: src/slic3r/GUI/MainFrame.cpp:286 +msgid "Import &Config" +msgstr "& 구성 가져오기" + +#: src/slic3r/GUI/MainFrame.cpp:286 +msgid "Load exported configuration file" +msgstr "내 보낸 구성 파일로드" + +#: src/slic3r/GUI/MainFrame.cpp:288 +msgid "Import Config from &project" +msgstr "프로젝트에서 설정 가져오기" + +#: src/slic3r/GUI/MainFrame.cpp:288 +msgid "Load configuration from project file" +msgstr "프로젝트 파일에서 구성 로드" + +#: src/slic3r/GUI/MainFrame.cpp:291 +msgid "Import Config &Bundle" +msgstr "가져오기 설정 > 번들" + +#: src/slic3r/GUI/MainFrame.cpp:291 +msgid "Load presets from a bundle" +msgstr "번들에서 미리 설정로드" + +#: src/slic3r/GUI/MainFrame.cpp:293 +msgid "&Import" +msgstr "가져오기" + +#: src/slic3r/GUI/MainFrame.cpp:296 +msgid "Export &G-code" +msgstr "G-코드 내보내기" + +#: src/slic3r/GUI/MainFrame.cpp:296 +msgid "Export current plate as G-code" +msgstr "현재 플레이트를 G 코드로 내보내기" + +#: src/slic3r/GUI/MainFrame.cpp:299 +msgid "Export plate as &STL" +msgstr "STL로 내보내기" + +#: src/slic3r/GUI/MainFrame.cpp:299 +msgid "Export current plate as STL" +msgstr "현재 플레이트를 STL로 내보내기" + +#: src/slic3r/GUI/MainFrame.cpp:301 +msgid "Export plate as &AMF" +msgstr "AMF로 내보내기" + +#: src/slic3r/GUI/MainFrame.cpp:301 +msgid "Export current plate as AMF" +msgstr "현재 플레이트를AMF로 내보내기" + +#: src/slic3r/GUI/MainFrame.cpp:304 +msgid "Export &Config" +msgstr "& 구성 내보내기" + +#: src/slic3r/GUI/MainFrame.cpp:304 +msgid "Export current configuration to file" +msgstr "현재 구성을 파일로 내보내기" + +#: src/slic3r/GUI/MainFrame.cpp:306 +msgid "Export Config &Bundle" +msgstr "번들 & 내보내기 설정" + +#: src/slic3r/GUI/MainFrame.cpp:306 +msgid "Export all presets to file" +msgstr "모든 이전 설정을 파일로 내보내기" + +#: src/slic3r/GUI/MainFrame.cpp:308 +msgid "&Export" +msgstr "& 내보내기" + +#: src/slic3r/GUI/MainFrame.cpp:314 +msgid "Quick Slice" +msgstr "빠른 슬라이스" + +#: src/slic3r/GUI/MainFrame.cpp:314 +msgid "Slice a file into a G-code" +msgstr "파일을 G 코드로 분할" + +#: src/slic3r/GUI/MainFrame.cpp:320 +msgid "Quick Slice and Save As" +msgstr "빠른 슬라이스 및 다른 이름으로 저장" + +#: src/slic3r/GUI/MainFrame.cpp:320 +msgid "Slice a file into a G-code, save as" +msgstr "파일을 G 코드로 분할하고 다음으로 저장" + +#: src/slic3r/GUI/MainFrame.cpp:326 +msgid "Repeat Last Quick Slice" +msgstr "마지막으로 빠른 슬라이스 반복" + +#: src/slic3r/GUI/MainFrame.cpp:334 +msgid "(Re)Slice &Now" +msgstr "지금(다시)자르기" + +#: src/slic3r/GUI/MainFrame.cpp:334 +msgid "Start new slicing process" +msgstr "새로운 슬라이싱 작업 시작" + +#: src/slic3r/GUI/MainFrame.cpp:337 +msgid "&Repair STL file" +msgstr "STL 파일 복구" + +#: src/slic3r/GUI/MainFrame.cpp:337 +msgid "Automatically repair an STL file" +msgstr "STL 파일을 자동으로 복구합니다" + +#: src/slic3r/GUI/MainFrame.cpp:340 +msgid "&Quit" +msgstr "종료(&Q)" + +#: src/slic3r/GUI/MainFrame.cpp:340 +msgid "Quit Slic3r" +msgstr "Slic3r 종료" + +#: src/slic3r/GUI/MainFrame.cpp:374 +msgid "&Select all" +msgstr "모두 선택" + +#: src/slic3r/GUI/MainFrame.cpp:374 +msgid "Selects all objects" +msgstr "모든 개체를 선택 합니다" + +#: src/slic3r/GUI/MainFrame.cpp:377 +msgid "&Delete selected" +msgstr "선택 삭제" + +#: src/slic3r/GUI/MainFrame.cpp:377 +msgid "Deletes the current selection" +msgstr "현재 선택 영역을 삭제 합니다" + +#: src/slic3r/GUI/MainFrame.cpp:379 +msgid "Delete &all" +msgstr "전부 지움" + +#: src/slic3r/GUI/MainFrame.cpp:379 +msgid "Deletes all objects" +msgstr "모든 객체를 삭제 합니다" + +#: src/slic3r/GUI/MainFrame.cpp:392 +msgid "&Plater Tab" +msgstr "선택 및 플래이트 탭" + +#: src/slic3r/GUI/MainFrame.cpp:392 +msgid "Show the plater" +msgstr "플레이트를 보기" + +#: src/slic3r/GUI/MainFrame.cpp:399 +msgid "P&rint Settings Tab" +msgstr "P&rint 설정 탭" + +#: src/slic3r/GUI/MainFrame.cpp:399 +msgid "Show the print settings" +msgstr "인쇄 설정 표시" + +#: src/slic3r/GUI/MainFrame.cpp:401 +msgid "&Filament Settings Tab" +msgstr "& 필라멘트 설정 탭" + +#: src/slic3r/GUI/MainFrame.cpp:401 +msgid "Show the filament settings" +msgstr "필라멘트 설정보기" + +#: src/slic3r/GUI/MainFrame.cpp:403 +msgid "Print&er Settings Tab" +msgstr "설정 인쇄 탭" + +#: src/slic3r/GUI/MainFrame.cpp:403 +msgid "Show the printer settings" +msgstr "간단한 설정보기" + +#: src/slic3r/GUI/MainFrame.cpp:407 +msgid "3&D" +msgstr "3&D" + +#: src/slic3r/GUI/MainFrame.cpp:407 +msgid "Show the 3D editing view" +msgstr "3D 편집용 보기 표시" + +#: src/slic3r/GUI/MainFrame.cpp:409 +msgid "Pre&view" +msgstr "미리 보기" + +#: src/slic3r/GUI/MainFrame.cpp:409 +msgid "Show the 3D slices preview" +msgstr "3D 슬라이스 미리 보기 표시" + +#: src/slic3r/GUI/MainFrame.cpp:430 +msgid "Print &Host Upload Queue" +msgstr "호스트 업로드 대기열 인쇄" + +#: src/slic3r/GUI/MainFrame.cpp:430 +msgid "Display the Print Host Upload Queue window" +msgstr "호스트 업로드 대기열 인쇄 창 표시" + +#: src/slic3r/GUI/MainFrame.cpp:439 +msgid "Iso" +msgstr "Iso" + +#: src/slic3r/GUI/MainFrame.cpp:439 +msgid "Iso View" +msgstr "Iso 보기" + +# lib/Slic3r/GUI/MainFrame.pm:327 +#: src/slic3r/GUI/MainFrame.cpp:441 +msgid "Top" +msgstr "윗부분" + +#: src/libslic3r/PrintConfig.cpp:2041 +msgctxt "Layers" +msgid "Top" +msgstr "윗부분" + +#: src/slic3r/GUI/MainFrame.cpp:441 +msgid "Top View" +msgstr "위에서 보기" + +# lib/Slic3r/GUI/MainFrame.pm:328 +#: src/slic3r/GUI/MainFrame.cpp:442 +msgid "Bottom" +msgstr "바닥(Bottom)" + +#: src/libslic3r/PrintConfig.cpp:148 +msgctxt "Layers" +msgid "Bottom" +msgstr "바닥(Bottom)" + +#: src/slic3r/GUI/MainFrame.cpp:442 +msgid "Bottom View" +msgstr "바닥 보기" + +#: src/slic3r/GUI/MainFrame.cpp:443 +msgid "Front" +msgstr "앞" + +#: src/slic3r/GUI/MainFrame.cpp:443 +msgid "Front View" +msgstr "앞면 보기" + +#: src/slic3r/GUI/MainFrame.cpp:444 src/libslic3r/PrintConfig.cpp:1561 +msgid "Rear" +msgstr "뒷면" + +#: src/slic3r/GUI/MainFrame.cpp:444 +msgid "Rear View" +msgstr "뒷면 보기" + +#: src/slic3r/GUI/MainFrame.cpp:445 +msgid "Left" +msgstr "왼쪽" + +#: src/slic3r/GUI/MainFrame.cpp:445 +msgid "Left View" +msgstr "왼쪽 보기" + +#: src/slic3r/GUI/MainFrame.cpp:446 +msgid "Right" +msgstr "오른쪽" + +#: src/slic3r/GUI/MainFrame.cpp:446 +msgid "Right View" +msgstr "오른쪽 보기" + +#: src/slic3r/GUI/MainFrame.cpp:460 +msgid "Prusa 3D &Drivers" +msgstr "푸르사 3D 드라이버" + +#: src/slic3r/GUI/MainFrame.cpp:460 +msgid "Open the Prusa3D drivers download page in your browser" +msgstr "브라우저에서 Prusa3D 드라이버 다운로드 페이지를 엽니다" + +#: src/slic3r/GUI/MainFrame.cpp:462 +msgid "Prusa Edition &Releases" +msgstr "Prusa 에디션 릴리스" + +#: src/slic3r/GUI/MainFrame.cpp:462 +msgid "Open the Prusa Edition releases page in your browser" +msgstr "브라우저에서 Prusa Edition 릴리즈 페이지를 엽니 다" + +#: src/slic3r/GUI/MainFrame.cpp:468 +msgid "Slic3r &Website" +msgstr "Slic3r 및 웹 사이트" + +#: src/slic3r/GUI/MainFrame.cpp:468 +msgid "Open the Slic3r website in your browser" +msgstr "브라우저에서 Slic3r 웹 사이트 열기" + +#: src/slic3r/GUI/MainFrame.cpp:470 +msgid "Slic3r &Manual" +msgstr "Slic3r &메뉴얼" + +#: src/slic3r/GUI/MainFrame.cpp:470 +msgid "Open the Slic3r manual in your browser" +msgstr "브라우저에서 Slic3r 설명서를 엽니다" + +#: src/slic3r/GUI/MainFrame.cpp:473 +msgid "System &Info" +msgstr "시스템 정보" + +#: src/slic3r/GUI/MainFrame.cpp:473 +msgid "Show system information" +msgstr "시스템 정보 표시" + +#: src/slic3r/GUI/MainFrame.cpp:475 +msgid "Show &Configuration Folder" +msgstr "폴더 표시 및 구성" + +#: src/slic3r/GUI/MainFrame.cpp:475 +msgid "Show user configuration folder (datadir)" +msgstr "사용자 구성 폴더 표시 (datadir)" + +#: src/slic3r/GUI/MainFrame.cpp:477 +msgid "Report an I&ssue" +msgstr "문제보고" + +#: src/slic3r/GUI/MainFrame.cpp:477 +msgid "Report an issue on the Slic3r Prusa Edition" +msgstr "Slic3r Prusa Edition에 관한 문제점 보고" + +#: src/slic3r/GUI/MainFrame.cpp:479 +msgid "&About Slic3r" +msgstr "&Slic3r에 대하여" + +#: src/slic3r/GUI/MainFrame.cpp:479 +msgid "Show about dialog" +msgstr "대화상자 표시" + +#: src/slic3r/GUI/MainFrame.cpp:482 +msgid "Keyboard Shortcuts" +msgstr "키보드 바로 가기" + +#: src/slic3r/GUI/MainFrame.cpp:482 +msgid "Show the list of the keyboard shortcuts" +msgstr "키보드 단축키 목록 표시" + +#: src/slic3r/GUI/MainFrame.cpp:490 +msgid "&File" +msgstr "&파일" + +#: src/slic3r/GUI/MainFrame.cpp:491 +msgid "&Edit" +msgstr "수정(&Edit)" + +#: src/slic3r/GUI/MainFrame.cpp:492 +msgid "&Window" +msgstr "&윈도우" + +#: src/slic3r/GUI/MainFrame.cpp:493 +msgid "&View" +msgstr "&보다" + +#: src/slic3r/GUI/MainFrame.cpp:496 +msgid "&Help" +msgstr "&도움말" + +#: src/slic3r/GUI/MainFrame.cpp:524 +msgid "Choose a file to slice (STL/OBJ/AMF/3MF/PRUSA):" +msgstr "슬라이스 할 파일을 선택하십시오 (STL / OBJ / AMF / 3MF / PRUSA):" + +#: src/slic3r/GUI/MainFrame.cpp:538 +msgid "No previously sliced file." +msgstr "이전에 분리 된 파일이 없습니다." + +#: src/slic3r/GUI/MainFrame.cpp:539 src/slic3r/GUI/PrintHostDialogs.cpp:219 +msgid "Error" +msgstr "에러" + +#: src/slic3r/GUI/MainFrame.cpp:544 +msgid "Previously sliced file (" +msgstr "이전에 분리 된 파일 (" + +#: src/slic3r/GUI/MainFrame.cpp:544 +msgid ") not found." +msgstr ")을 찾을 수 없습니다." + +#: src/slic3r/GUI/MainFrame.cpp:545 +msgid "File Not Found" +msgstr "파일을 찾을수 없다" + +#: src/slic3r/GUI/MainFrame.cpp:580 src/slic3r/GUI/Tab.cpp:3152 +msgid "Save " +msgstr "저장 " + +#: src/slic3r/GUI/MainFrame.cpp:580 +msgid "SVG" +msgstr "Svg" + +#: src/slic3r/GUI/MainFrame.cpp:580 +msgid "G-code" +msgstr "G 코드" + +#: src/slic3r/GUI/MainFrame.cpp:580 +msgid " file as:" +msgstr " 다음 파일 :" + +#: src/slic3r/GUI/MainFrame.cpp:595 +msgid "Save zip file as:" +msgstr "압축(zip)파일 다른이름 저장:" + +#: src/slic3r/GUI/MainFrame.cpp:607 src/slic3r/GUI/Plater.cpp:2352 src/slic3r/GUI/Plater.cpp:3467 +#: src/slic3r/GUI/Tab.cpp:1110 src/slic3r/GUI/Tab.cpp:3348 +msgid "Slicing" +msgstr "슬라이싱" + +#: src/slic3r/GUI/MainFrame.cpp:607 +msgid "Processing " +msgstr "프로세싱 " + +#: src/slic3r/GUI/MainFrame.cpp:630 +msgid " was successfully sliced." +msgstr " 성공적으로 슬라이스." + +#: src/slic3r/GUI/MainFrame.cpp:632 +msgid "Slicing Done!" +msgstr "슬라이스 완료!" + +#: src/slic3r/GUI/MainFrame.cpp:647 +msgid "Select the STL file to repair:" +msgstr "복구 할 STL 파일을 선택하십시오:" + +#: src/slic3r/GUI/MainFrame.cpp:661 +msgid "Save OBJ file (less prone to coordinate errors than STL) as:" +msgstr "OBJ 파일을 저장하십시오 (STL보다 오류를 덜 조정할 가능성이 적음):" + +#: src/slic3r/GUI/MainFrame.cpp:676 +msgid "Your file was repaired." +msgstr "파일이 복구되었습니다." + +#: src/slic3r/GUI/MainFrame.cpp:676 src/libslic3r/PrintConfig.cpp:3051 +msgid "Repair" +msgstr "수정" + +#: src/slic3r/GUI/MainFrame.cpp:690 +msgid "Save configuration as:" +msgstr "구성을 저장 :" + +#: src/slic3r/GUI/MainFrame.cpp:710 src/slic3r/GUI/MainFrame.cpp:774 +msgid "Select configuration to load:" +msgstr "로드 할 구성 선택 :" + +#: src/slic3r/GUI/MainFrame.cpp:747 +msgid "Save presets bundle as:" +msgstr "이전 설정 번들을 다음과 같이 저장 :" + +#: src/slic3r/GUI/MainFrame.cpp:798 +#, c-format +msgid "%d presets successfully imported." +msgstr "% d 사전 설정을 가져 왔습니다." + +#: src/slic3r/GUI/MsgDialog.cpp:71 +msgid "Slic3r error" +msgstr "Slic3r 오류" + +#: src/slic3r/GUI/MsgDialog.cpp:71 +msgid "Slic3r has encountered an error" +msgstr "Slic3r에 오류가 발생했습니다" + +#: src/slic3r/GUI/Plater.cpp:137 +msgid "Volume" +msgstr "크기" + +#: src/slic3r/GUI/Plater.cpp:138 +msgid "Facets" +msgstr "측면" + +#: src/slic3r/GUI/Plater.cpp:139 +msgid "Materials" +msgstr "재료" + +#: src/slic3r/GUI/Plater.cpp:142 +msgid "Manifold" +msgstr "많은" + +#: src/slic3r/GUI/Plater.cpp:188 +msgid "Sliced Info" +msgstr "슬라이스된 정보" + +#: src/slic3r/GUI/Plater.cpp:207 src/slic3r/GUI/Plater.cpp:998 +msgid "Used Filament (m)" +msgstr "사용자 필라멘트 (m)" + +#: src/slic3r/GUI/Plater.cpp:208 +msgid "Used Filament (mm³)" +msgstr "사용자 필라멘트 (mm³)" + +#: src/slic3r/GUI/Plater.cpp:209 +msgid "Used Filament (g)" +msgstr "사용자 필라멘트 (g)" + +#: src/slic3r/GUI/Plater.cpp:210 +msgid "Used Material (unit)" +msgstr "사용 재료 (단위)" + +#: src/slic3r/GUI/Plater.cpp:211 src/slic3r/GUI/Plater.cpp:1013 src/libslic3r/PrintConfig.cpp:716 +msgid "Cost" +msgstr "비용" + +#: src/slic3r/GUI/Plater.cpp:212 src/slic3r/GUI/Plater.cpp:985 src/slic3r/GUI/Plater.cpp:1027 +msgid "Estimated printing time" +msgstr "예상 인쇄 시간" + +#: src/slic3r/GUI/Plater.cpp:213 +msgid "Number of tool changes" +msgstr "공구(tool) 변경 수" + +#: src/slic3r/GUI/Plater.cpp:290 +msgid "Click to edit preset" +msgstr "사전 설정을 편집 하려면 클릭 하십시오" + +#: src/slic3r/GUI/Plater.cpp:413 +msgid "Select what kind of support do you need" +msgstr "서포트의 종류를 선택하세요" + +#: src/slic3r/GUI/Plater.cpp:415 src/libslic3r/PrintConfig.cpp:1814 src/libslic3r/PrintConfig.cpp:2419 +msgid "Support on build plate only" +msgstr "출력물만 서포트를 지지" + +#: src/slic3r/GUI/Plater.cpp:416 +msgid "Everywhere" +msgstr "모든곳" + +#: src/slic3r/GUI/Plater.cpp:438 src/slic3r/GUI/Tab.cpp:1007 +msgid "Brim" +msgstr "브림" + +#: src/slic3r/GUI/Plater.cpp:440 +msgid "This flag enables the brim that will be printed around each object on the first layer." +msgstr "이 플래그는 첫 번째 레이어의 각 개체 주위에 인쇄 될 브림을 활성화합니다." + +#: src/slic3r/GUI/Plater.cpp:448 +msgid "Purging volumes" +msgstr "볼륨 삭제" + +#: src/slic3r/GUI/Plater.cpp:673 +msgid "Print settings" +msgstr "프린트 설정" + +#: src/slic3r/GUI/Plater.cpp:674 src/slic3r/GUI/Tab.cpp:1421 src/slic3r/GUI/Tab.cpp:1422 +msgid "Filament" +msgstr "필라멘트" + +#: src/slic3r/GUI/Plater.cpp:675 src/slic3r/GUI/Preset.cpp:1252 +msgid "SLA print" +msgstr "SLA 인쇄" + +#: src/slic3r/GUI/Plater.cpp:676 src/slic3r/GUI/Preset.cpp:1253 +msgid "SLA material" +msgstr "SLA 재료" + +#: src/slic3r/GUI/Plater.cpp:677 +msgid "Printer" +msgstr "프린터" + +#: src/slic3r/GUI/Plater.cpp:707 src/slic3r/GUI/Plater.cpp:3674 +msgid "Send to printer" +msgstr "프린터로 보내기" + +#: src/slic3r/GUI/Plater.cpp:727 src/slic3r/GUI/Plater.cpp:2352 src/slic3r/GUI/Plater.cpp:3470 +msgid "Slice now" +msgstr "지금 자르기" + +#: src/slic3r/GUI/Plater.cpp:860 +msgid "Hold Shift to Slice & Export G-code" +msgstr "Shift 키를 누른 채 G 코드 내보내기" + +#: src/slic3r/GUI/Plater.cpp:931 +#, c-format +msgid "%d (%d shells)" +msgstr "% d (% d 쉘)" + +#: src/slic3r/GUI/Plater.cpp:936 +#, c-format +msgid "Auto-repaired (%d errors)" +msgstr "오류자동수정 (%d errors)" + +#: src/slic3r/GUI/Plater.cpp:939 +#, c-format +msgid "" +"%d degenerate facets, %d edges fixed, %d facets removed, %d facets added, %d facets reversed, %d backwards " +"edges" +msgstr "%d 면 고정, %d 모서리 고정, %d 면 제거, %d 면 추가, %d 면 반전, %d 후방 모서리" + +#: src/slic3r/GUI/Plater.cpp:949 +msgid "Yes" +msgstr "예" + +#: src/slic3r/GUI/Plater.cpp:972 +msgid "Used Material (ml)" +msgstr "사용 재료 (ml)" + +#: src/slic3r/GUI/Plater.cpp:975 +msgid "object(s)" +msgstr "스커트와 객체 사이의 거리. 스커트를 객체에 부착하고 접착력을 높이기 위해 이를 0으로 설정한다." + +#: src/slic3r/GUI/Plater.cpp:975 +msgid "supports and pad" +msgstr "지지대 및 패드" + +#: src/slic3r/GUI/Plater.cpp:1000 src/slic3r/GUI/Plater.cpp:1015 +msgid "objects" +msgstr "개체" + +#: src/slic3r/GUI/Plater.cpp:1000 src/slic3r/GUI/Plater.cpp:1015 +msgid "wipe tower" +msgstr "와이프 타워(Wipe tower)" + +#: src/slic3r/GUI/Plater.cpp:1030 +msgid "normal mode" +msgstr "일반 모드" + +#: src/slic3r/GUI/Plater.cpp:1034 +msgid "silent mode" +msgstr "무음 모드" + +#: src/slic3r/GUI/Plater.cpp:1544 +msgid "Loading" +msgstr "로딩" + +#: src/slic3r/GUI/Plater.cpp:1554 +#, c-format +msgid "Processing input file %s\n" +msgstr "입력 파일 처리 %s\n" + +#: src/slic3r/GUI/Plater.cpp:1612 +msgid "" +"This file contains several objects positioned at multiple heights. Instead of considering them as multiple " +"objects, should I consider\n" +"this file as a single object having multiple parts?\n" +msgstr "" +"이 파일에는 여러 높이에 위치한 여러 객체가 들어 있습니다. 여러 객체로 간주하는 대신,\n" +"이 파일은 여러 부분을 갖는 단일 객체로 보입니까?\n" + +#: src/slic3r/GUI/Plater.cpp:1615 src/slic3r/GUI/Plater.cpp:1707 +msgid "Multi-part object detected" +msgstr "다중 부품 객체가 감지" + +#: src/slic3r/GUI/Plater.cpp:1650 +msgid "This file cannot be loaded in simple mode. Do you want to switch to expert mode?\n" +msgstr "이 파일은 단순 모드에서 로드할 수 없습니다. 전문가 모드로 전환 하시겠습니까?\n" + +#: src/slic3r/GUI/Plater.cpp:1651 +msgid "Detected advanced data" +msgstr "감지된 고급 데이터" + +#: src/slic3r/GUI/Plater.cpp:1684 +#, c-format +msgid "You can't to add the object(s) from %s because of one or some of them is(are) multi-part" +msgstr "멀티파트 하나 또는 그 중 일부 때문에 %s에서 개체를 추가 할 수 없습니다" + +#: src/slic3r/GUI/Plater.cpp:1704 +msgid "" +"Multiple objects were loaded for a multi-material printer.\n" +"Instead of considering them as multiple objects, should I consider\n" +"these files to represent a single object having multiple parts?\n" +msgstr "" +"다중 재료 프린터에 대해 여러 객체가로드되었습니다.\n" +"여러 객체로 간주하는 대신,\n" +"이 파일들은 여러 부분을 갖는 단일 객체를 나타낼 수 있습니까?\n" + +#: src/slic3r/GUI/Plater.cpp:1720 +msgid "Loaded" +msgstr "로드(loaded)" + +#: src/slic3r/GUI/Plater.cpp:1812 +msgid "Your object appears to be too large, so it was automatically scaled down to fit your print bed." +msgstr "개체가 너무 커서 인쇄물에 맞게 자동으로 축소되었습니다." + +#: src/slic3r/GUI/Plater.cpp:1813 +msgid "Object too large?" +msgstr "개체가 너무 큽니까?" + +#: src/slic3r/GUI/Plater.cpp:1863 +msgid "Export STL file:" +msgstr "STL 파일 내보내기:" + +#: src/slic3r/GUI/Plater.cpp:1870 +msgid "Export AMF file:" +msgstr "AMF 파일 내보내기:" + +#: src/slic3r/GUI/Plater.cpp:1876 +msgid "Save file as:" +msgstr "다른 이름으로 파일 저장:" + +#: src/slic3r/GUI/Plater.cpp:2042 +msgid "Arranging canceled" +msgstr "취소 된 정렬" + +#: src/slic3r/GUI/Plater.cpp:2045 +msgid "Arranging" +msgstr "정렬" + +#: src/slic3r/GUI/Plater.cpp:2079 +msgid "Could not arrange model objects! Some geometries may be invalid." +msgstr "모델 개체를 정렬할 수 없습니다. 일부 형상은 유효 하지 않을 수 있습니다." + +#: src/slic3r/GUI/Plater.cpp:2083 +msgid "Arranging done." +msgstr "정렬 완료." + +#: src/slic3r/GUI/Plater.cpp:2124 +msgid "Orientation search canceled" +msgstr "오리엔테이션 검색이 취소 됨" + +#: src/slic3r/GUI/Plater.cpp:2129 +msgid "Searching for optimal orientation" +msgstr "최적의 방향 검색" + +#: src/slic3r/GUI/Plater.cpp:2190 +msgid "Orientation found." +msgstr "방향을 찾았습니다." + +#: src/slic3r/GUI/Plater.cpp:2211 +msgid "The selected object can't be split because it contains more than one volume/material." +msgstr "선택한 객체는 둘 이상의 볼륨 / 재료가 포함되어 있기 때문에 분할 할 수 없습니다." + +#: src/slic3r/GUI/Plater.cpp:2337 +msgid "Invalid data" +msgstr "잘못 된 데이터" + +#: src/slic3r/GUI/Plater.cpp:2346 +msgid "Ready to slice" +msgstr "슬라이스 준비" + +#: src/slic3r/GUI/Plater.cpp:2379 src/slic3r/GUI/PrintHostDialogs.cpp:220 +msgid "Cancelling" +msgstr "취소 중" + +#: src/slic3r/GUI/Plater.cpp:2396 +msgid "Another export job is currently running." +msgstr "다른 내보내기 작업이 현재 실행 중입니다." + +#: src/slic3r/GUI/Plater.cpp:2656 +msgid "Export failed" +msgstr "내보내기 실패" + +#: src/slic3r/GUI/Plater.cpp:2661 src/slic3r/GUI/PrintHostDialogs.cpp:221 +msgid "Cancelled" +msgstr "취소됨" + +#: src/slic3r/GUI/Plater.cpp:2747 src/slic3r/GUI/Plater.cpp:2759 src/slic3r/GUI/Plater.cpp:2831 +msgid "Increase copies" +msgstr "복사본 늘리기" + +#: src/slic3r/GUI/Plater.cpp:2825 src/slic3r/GUI/Plater.cpp:2843 +msgid "Remove the selected object" +msgstr "선택한 객체 제거" + +#: src/slic3r/GUI/Plater.cpp:2831 +msgid "Place one more copy of the selected object" +msgstr "선택한 객체를 하나 더 복사합니다" + +#: src/slic3r/GUI/Plater.cpp:2833 +msgid "Decrease copies" +msgstr "복사본 감소" + +#: src/slic3r/GUI/Plater.cpp:2833 +msgid "Remove one copy of the selected object" +msgstr "선택한 객체 복사본 하나 삭제" + +#: src/slic3r/GUI/Plater.cpp:2835 +msgid "Set number of copies" +msgstr "복사될 수량 설정" + +#: src/slic3r/GUI/Plater.cpp:2835 +msgid "Change the number of copies of the selected object" +msgstr "선택한 개체의 복사본 수 변경" + +#: src/slic3r/GUI/Plater.cpp:2858 +msgid "Reload from Disk" +msgstr "디스크에서 다시 불러오기" + +#: src/slic3r/GUI/Plater.cpp:2858 +msgid "Reload the selected file from Disk" +msgstr "디스크에서 다시 불러오기" + +#: src/slic3r/GUI/Plater.cpp:2861 +msgid "Export the selected object as STL file" +msgstr "선택한 객체를 STL 파일로 내보내기" + +#: src/slic3r/GUI/Plater.cpp:2873 +msgid "Along X axis" +msgstr "X 축을 따라" + +#: src/slic3r/GUI/Plater.cpp:2873 +msgid "Mirror the selected object along the X axis" +msgstr "선택한 객체를 X 축을 따라 반전합니다" + +#: src/slic3r/GUI/Plater.cpp:2875 +msgid "Along Y axis" +msgstr "Y 축을 따라" + +#: src/slic3r/GUI/Plater.cpp:2875 +msgid "Mirror the selected object along the Y axis" +msgstr "선택한 객체를 Y 축을 따라 반전합니다" + +#: src/slic3r/GUI/Plater.cpp:2877 +msgid "Along Z axis" +msgstr "Z 축 따라" + +#: src/slic3r/GUI/Plater.cpp:2877 +msgid "Mirror the selected object along the Z axis" +msgstr "선택한 객체를 Z 축을 따라 반전합니다" + +#: src/slic3r/GUI/Plater.cpp:2880 +msgid "Mirror" +msgstr "반전(Mirror)" + +#: src/slic3r/GUI/Plater.cpp:2880 +msgid "Mirror the selected object" +msgstr "반전할 객제를 선택" + +#: src/slic3r/GUI/Plater.cpp:2898 +msgid "To objects" +msgstr "개체에" + +#: src/slic3r/GUI/Plater.cpp:2898 src/slic3r/GUI/Plater.cpp:2920 +msgid "Split the selected object into individual objects" +msgstr "선택한 개체를 개별 개체로 분할 합니다." + +#: src/slic3r/GUI/Plater.cpp:2900 +msgid "To parts" +msgstr "부품에" + +#: src/slic3r/GUI/Plater.cpp:2900 src/slic3r/GUI/Plater.cpp:2940 +msgid "Split the selected object into individual sub-parts" +msgstr "선택한 오브젝트를 개별 하위 파트로 분할" + +#: src/slic3r/GUI/Plater.cpp:2903 src/slic3r/GUI/Plater.cpp:2920 src/slic3r/GUI/Plater.cpp:2940 +#: src/libslic3r/PrintConfig.cpp:3075 +msgid "Split" +msgstr "쪼개기" + +#: src/slic3r/GUI/Plater.cpp:2903 +msgid "Split the selected object" +msgstr "선택한 개체 분할" + +#: src/slic3r/GUI/Plater.cpp:2926 +msgid "Optimize orientation" +msgstr "방향 최적화" + +#: src/slic3r/GUI/Plater.cpp:2926 +msgid "Optimize the rotation of the object for better print results." +msgstr "더 나은 인쇄 결과를 위해 개체의 회전을 최적화합니다." + +#: src/slic3r/GUI/Plater.cpp:3342 +msgid "Save G-code file as:" +msgstr "G-code 파일 다른 이름 저장:" + +#: src/slic3r/GUI/Plater.cpp:3342 +msgid "Save SL1 file as:" +msgstr "SL1 파일 다른이름 저장:" + +#: src/slic3r/GUI/Plater.cpp:3397 +#, c-format +msgid "STL file exported to %s" +msgstr "내보낸 STL 파일 %s" + +#: src/slic3r/GUI/Plater.cpp:3413 +#, c-format +msgid "AMF file exported to %s" +msgstr "내보낸 AMF 파일 %s" + +#: src/slic3r/GUI/Plater.cpp:3416 +#, c-format +msgid "Error exporting AMF file %s" +msgstr "AMF 파일 내보내기 오류 %s" + +#: src/slic3r/GUI/Plater.cpp:3442 +#, c-format +msgid "3MF file exported to %s" +msgstr "3MF 파일을 내보냈습니다 %s" + +#: src/slic3r/GUI/Plater.cpp:3445 +#, c-format +msgid "Error exporting 3MF file %s" +msgstr "3MF 파일 내보내기 오류 %s" + +#: src/slic3r/GUI/Plater.cpp:3673 +msgid "Export" +msgstr "내보내기" + +#: src/slic3r/GUI/Plater.cpp:3674 +msgid "Send G-code" +msgstr "G 코드 보내기" + +#: src/slic3r/GUI/Preferences.cpp:17 src/slic3r/GUI/Tab.cpp:1762 src/slic3r/GUI/Tab.cpp:1963 +msgid "General" +msgstr "일반" + +#: src/slic3r/GUI/Preferences.cpp:34 +msgid "Remember output directory" +msgstr "출력 디렉토리 기억하기" + +#: src/slic3r/GUI/Preferences.cpp:36 +msgid "" +"If this is enabled, Slic3r will prompt the last output directory instead of the one containing the input " +"files." +msgstr "이 옵션을 사용하면 Slic3r은 입력 파일이 들어있는 디렉터리 대신 마지막 출력 디렉터리를 묻습니다." + +#: src/slic3r/GUI/Preferences.cpp:42 +msgid "Auto-center parts" +msgstr "부품을 자동으로 중심에" + +#: src/slic3r/GUI/Preferences.cpp:44 +msgid "If this is enabled, Slic3r will auto-center objects around the print bed center." +msgstr "이 옵션을 사용하면 Slic3r이 개체를 인쇄판 중앙에 자동으로 배치합니다." + +#: src/slic3r/GUI/Preferences.cpp:50 +msgid "Background processing" +msgstr "백그라운드 프로세싱" + +#: src/slic3r/GUI/Preferences.cpp:52 +msgid "" +"If this is enabled, Slic3r will pre-process objects as soon as they're loaded in order to save time when " +"exporting G-code." +msgstr "" +"이 사용 하는 경우 Slic3r는 전처리 개체 최대한 빨리 그들이 시간을 절약 하기 위해 로드 G-코드를 내보낼 때." + +#: src/slic3r/GUI/Preferences.cpp:74 +msgid "Suppress \" - default - \" presets" +msgstr "\"- 기본 -\"사전 설정 숨기기" + +#: src/slic3r/GUI/Preferences.cpp:76 +msgid "" +"Suppress \" - default - \" presets in the Print / Filament / Printer selections once there are any other " +"valid presets available." +msgstr "" +"사용 가능한 다른 유효한 사전 설정이 있으면 인쇄 / 필라멘트 / 프린터 선택에서 \"- 기본 -\"사전 설정을 억제하십" +"시오." + +#: src/slic3r/GUI/Preferences.cpp:82 +msgid "Show incompatible print and filament presets" +msgstr "호환 되지 않는 인쇄 및 필라멘트 설정" + +#: src/slic3r/GUI/Preferences.cpp:84 +msgid "" +"When checked, the print and filament presets are shown in the preset editor even if they are marked as " +"incompatible with the active printer" +msgstr "" +"이 옵션을 선택하면 활성 프린터와 호환되지 않는 것으로 표시된 경우에도 인쇄 및 필라멘트 사전 설정이 사전 설정 " +"편집기에 표시됩니다" + +#: src/slic3r/GUI/Preferences.cpp:91 +msgid "Use legacy OpenGL 1.1 rendering" +msgstr "레거시 OpenGL 1.1 렌더링 사용" + +#: src/slic3r/GUI/Preferences.cpp:93 +msgid "" +"If you have rendering issues caused by a buggy OpenGL 2.0 driver, you may try to check this checkbox. This " +"will disable the layer height editing and anti aliasing, so it is likely better to upgrade your graphics " +"driver." +msgstr "" +"버그가있는 OpenGL 2.0 드라이버로 인한 렌더링 문제가있는 경우이 확인란을 선택해보십시오. 이렇게하면 레이어 높" +"이 편집 및 앤티 앨리어싱이 비활성화되므로 그래픽 드라이버를 업그레이드하는 것이 좋습니다." + +#: src/slic3r/GUI/Preferences.cpp:101 +msgid "Use Retina resolution for the 3D scene" +msgstr "3D 장면에 레티나 해상도 사용" + +#: src/slic3r/GUI/Preferences.cpp:103 +msgid "" +"If enabled, the 3D scene will be rendered in Retina resolution. If you are experiencing 3D performance " +"problems, disabling this option may help." +msgstr "" +"활성화 된 경우 3D 장면은 레티나 해상도로 렌더링 됩니다. 3D 성능 문제가 발생하는 경우, 옵션을 사용하지 않도록 " +"설정 하면 도움이 될 수 있습니다." + +#: src/slic3r/GUI/Preferences.cpp:126 +msgid "You need to restart Slic3r to make the changes effective." +msgstr "변경 사항을 적용하려면 Slic3r을 다시 시작해야합니다." + +#: src/slic3r/GUI/Preset.cpp:207 +msgid "modified" +msgstr "수정된곳" + +#: src/slic3r/GUI/Preset.cpp:918 src/slic3r/GUI/Preset.cpp:958 src/slic3r/GUI/Preset.cpp:1011 +#: src/slic3r/GUI/Preset.cpp:1043 src/slic3r/GUI/PresetBundle.cpp:1484 src/slic3r/GUI/PresetBundle.cpp:1537 +msgid "System presets" +msgstr "시스템 기본설정" + +#: src/slic3r/GUI/Preset.cpp:962 src/slic3r/GUI/Preset.cpp:1047 src/slic3r/GUI/PresetBundle.cpp:1542 +msgid "User presets" +msgstr "사용자 사전설정" + +#: src/slic3r/GUI/Preset.cpp:991 src/slic3r/GUI/Tab.cpp:247 +msgid "Add a new printer" +msgstr "새 프린터 추가" + +#: src/slic3r/GUI/Preset.cpp:1251 +msgid "filament" +msgstr "필라멘트" + +#: src/slic3r/GUI/PresetHints.cpp:28 +#, c-format +msgid "" +"If estimated layer time is below ~%ds, fan will run at %d%% and print speed will be reduced so that no less " +"than %ds are spent on that layer (however, speed will never be reduced below %dmm/s)." +msgstr "" +"예상 레이어 시간이 ~ % d 초 미만이면 팬이 % d %%에서 실행되고 인쇄 속도가 감소되어 해당 레이어에 % ds 이상 소" +"비됩니다 (단, 속도는 % dmm / s 이하로 감소하지 않습니다) ." + +#: src/slic3r/GUI/PresetHints.cpp:32 +#, c-format +msgid "" +"\n" +"If estimated layer time is greater, but still below ~%ds, fan will run at a proportionally decreasing speed " +"between %d%% and %d%%." +msgstr "" +"\n" +"예상 레이어 시간이 더 길지만 ~ % ds 미만인 경우 팬은 % d %%와 % d %% 사이에 비례하여 감소하는 속도로 실행됩니" +"다." + +#: src/slic3r/GUI/PresetHints.cpp:36 +msgid "" +"\n" +"During the other layers, fan " +msgstr "" +"\n" +"다른 레이어 중 팬 " + +#: src/slic3r/GUI/PresetHints.cpp:38 +msgid "Fan " +msgstr "팬(Fan) " + +#: src/slic3r/GUI/PresetHints.cpp:43 +#, c-format +msgid "will always run at %d%% " +msgstr "항상 다음처럼 실행 %d%% " + +#: src/slic3r/GUI/PresetHints.cpp:46 +#, c-format +msgid "except for the first %d layers" +msgstr "첫 번째 %d 레이어를 제외하고" + +#: src/slic3r/GUI/PresetHints.cpp:50 +msgid "except for the first layer" +msgstr "첫 번째 레이어를 제외하고" + +#: src/slic3r/GUI/PresetHints.cpp:52 +msgid "will be turned off." +msgstr "off 됩니다." + +#: src/slic3r/GUI/PresetHints.cpp:153 +msgid "external perimeters" +msgstr "외부 둘레" + +#: src/slic3r/GUI/PresetHints.cpp:162 +msgid "perimeters" +msgstr "둘레" + +#: src/slic3r/GUI/PresetHints.cpp:171 +msgid "infill" +msgstr "채움(infill)" + +#: src/slic3r/GUI/PresetHints.cpp:181 +msgid "solid infill" +msgstr "고체(solid)부분 채움" + +#: src/slic3r/GUI/PresetHints.cpp:189 +msgid "top solid infill" +msgstr "가장 윗부분 채움" + +#: src/slic3r/GUI/PresetHints.cpp:200 +msgid "support" +msgstr "서포트" + +#: src/slic3r/GUI/PresetHints.cpp:210 +msgid "support interface" +msgstr "서포트 인터페이스" + +#: src/slic3r/GUI/PresetHints.cpp:216 +msgid "First layer volumetric" +msgstr "첫번째 레이어 용적" + +#: src/slic3r/GUI/PresetHints.cpp:216 +msgid "Bridging volumetric" +msgstr "브리징(Bridging) 용적" + +#: src/slic3r/GUI/PresetHints.cpp:216 +msgid "Volumetric" +msgstr "용적" + +#: src/slic3r/GUI/PresetHints.cpp:217 +msgid " flow rate is maximized " +msgstr " 유속(flow)이 최대화된다 " + +#: src/slic3r/GUI/PresetHints.cpp:220 +msgid "by the print profile maximum" +msgstr "인쇄 프로파일 최대 값" + +#: src/slic3r/GUI/PresetHints.cpp:221 +msgid "when printing " +msgstr "인쇄 할때 " + +#: src/slic3r/GUI/PresetHints.cpp:222 +msgid " with a volumetric rate " +msgstr " 용적 비율로 " + +#: src/slic3r/GUI/PresetHints.cpp:226 +#, c-format +msgid "%3.2f mm³/s" +msgstr "%3.2f mm³/s" + +#: src/slic3r/GUI/PresetHints.cpp:228 +#, c-format +msgid " at filament speed %3.2f mm/s." +msgstr " 필라멘트 속도는 %3.2f mm/s." + +#: src/slic3r/GUI/PresetHints.cpp:247 +msgid "Recommended object thin wall thickness: Not available due to invalid layer height." +msgstr "권장 객체(object) 벽(wall) 두께: 잘못된 레이어 높이 때문에 사용할 수 없음." + +#: src/slic3r/GUI/PresetHints.cpp:264 +#, c-format +msgid "Recommended object thin wall thickness for layer height %.2f and " +msgstr "개체 레이어 높이 %.2f 에 대 한 얇은 벽 두께 권장 하 고 " + +#: src/slic3r/GUI/PresetHints.cpp:271 +#, c-format +msgid "%d lines: %.2lf mm" +msgstr "%d 라인(lines): %.2lf mm" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:32 +msgid "Send G-Code to printer host" +msgstr "프린터 호스트로 G 코드 보내기" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:32 +msgid "Upload to Printer Host with the following filename:" +msgstr "다음 파일 이름으로 프린터 호스트에 업로드:" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:34 +msgid "Start printing after upload" +msgstr "업로드 후 인쇄 시작" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:41 +msgid "Use forward slashes ( / ) as a directory separator if needed." +msgstr "필요한 경우 디렉토리 분리 기호로 슬래시 (/)를 사용하십시오." + +#: src/slic3r/GUI/PrintHostDialogs.cpp:157 +msgid "Cancel selected" +msgstr "선택 취소" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:159 +msgid "Show error message" +msgstr "오류 메시지 표시" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:198 src/slic3r/GUI/PrintHostDialogs.cpp:217 +msgid "Enqueued" +msgstr "입력됨" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:218 +msgid "Uploading" +msgstr "업로드" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:222 +msgid "Completed" +msgstr "완료됨" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:260 +msgid "Error uploading to print host:" +msgstr "인쇄 호스트에 업로드 하는 중 오류 발생:" + +#: src/slic3r/GUI/RammingChart.cpp:23 +msgid "NO RAMMING AT ALL" +msgstr "전혀 충돌 없음" + +#: src/slic3r/GUI/RammingChart.cpp:76 +msgid "Time" +msgstr "시간" + +#: src/slic3r/GUI/RammingChart.cpp:76 src/slic3r/GUI/RammingChart.cpp:81 src/slic3r/GUI/WipeTowerDialog.cpp:82 +#: src/libslic3r/PrintConfig.cpp:611 src/libslic3r/PrintConfig.cpp:655 src/libslic3r/PrintConfig.cpp:670 +#: src/libslic3r/PrintConfig.cpp:2241 src/libslic3r/PrintConfig.cpp:2250 src/libslic3r/PrintConfig.cpp:2308 +#: src/libslic3r/PrintConfig.cpp:2315 +msgid "s" +msgstr "s" + +#: src/slic3r/GUI/RammingChart.cpp:81 +msgid "Volumetric speed" +msgstr "용적(Volumetric) 스피트" + +#: src/slic3r/GUI/SysInfoDialog.cpp:44 +msgid "Slic3r Prusa Edition - System Information" +msgstr "Slic3r Prusa 에디션-시스템 정보" + +#: src/slic3r/GUI/Tab.cpp:50 src/libslic3r/PrintConfig.cpp:228 +msgid "Compatible printers" +msgstr "호환 가능한 프린터들" + +#: src/slic3r/GUI/Tab.cpp:51 +msgid "Select the printers this profile is compatible with." +msgstr "이 프로파일과 호환 가능한 프린터를 선택하세요." + +#: src/slic3r/GUI/Tab.cpp:56 src/libslic3r/PrintConfig.cpp:243 +msgid "Compatible print profiles" +msgstr "호환되는 인쇄 프로 파일" + +#: src/slic3r/GUI/Tab.cpp:57 +msgid "Select the print profiles this profile is compatible with." +msgstr "이 프로필이 호환되는 인쇄 프로필을 선택 합니다." + +#: src/slic3r/GUI/Tab.cpp:132 +msgid "Save current " +msgstr "지금 저장 " + +#: src/slic3r/GUI/Tab.cpp:133 +msgid "Delete this preset" +msgstr "이전 설정 삭제" + +#: src/slic3r/GUI/Tab.cpp:145 +msgid "" +"Hover the cursor over buttons to find more information \n" +"or click this button." +msgstr "" +"버튼 위로 커서를 가져 가서 자세한 정보를 찾습니다.\n" +"또는이 버튼을 클릭하십시오." + +#: src/slic3r/GUI/Tab.cpp:858 +msgid "It's a default preset." +msgstr "기본 설정입니다." + +#: src/slic3r/GUI/Tab.cpp:859 +msgid "It's a system preset." +msgstr "시스템 설정입니다." + +#: src/slic3r/GUI/Tab.cpp:860 +msgid "Current preset is inherited from " +msgstr "전의 설정에서 가져 옵니다 " + +#: src/slic3r/GUI/Tab.cpp:865 +msgid "It can't be deleted or modified. " +msgstr "삭제하거나 수정할 수 없습니다. " + +#: src/slic3r/GUI/Tab.cpp:866 +msgid "Any modifications should be saved as a new preset inherited from this one. " +msgstr "모든 수정 사항은 이 항목에서 받은 기본 설정으로 저장해야합니다. " + +#: src/slic3r/GUI/Tab.cpp:867 +msgid "To do that please specify a new name for the preset." +msgstr "그렇게하려면 기본 설정의 새 이름을 지정하십시오." + +#: src/slic3r/GUI/Tab.cpp:871 +msgid "Additional information:" +msgstr "추가 정보:" + +#: src/slic3r/GUI/Tab.cpp:877 +msgid "printer model" +msgstr "프린터 모델" + +#: src/slic3r/GUI/Tab.cpp:885 +msgid "default print profile" +msgstr "기본 인쇄 프로파일" + +#: src/slic3r/GUI/Tab.cpp:888 +msgid "default filament profile" +msgstr "기본 필라멘트 프로파일" + +#: src/slic3r/GUI/Tab.cpp:902 +msgid "default SLA material profile" +msgstr "기본 SLA 재질 프로 파일" + +#: src/slic3r/GUI/Tab.cpp:906 +msgid "default SLA print profile" +msgstr "기본 SLA 인쇄 프로필" + +#: src/slic3r/GUI/Tab.cpp:948 src/slic3r/GUI/Tab.cpp:3303 +msgid "Layers and perimeters" +msgstr "레이어 및 경계선" + +#: src/slic3r/GUI/Tab.cpp:949 src/libslic3r/PrintConfig.cpp:55 +msgid "Layer height" +msgstr "레이어 높이" + +#: src/slic3r/GUI/Tab.cpp:953 +msgid "Vertical shells" +msgstr "쉘 높이" + +#: src/slic3r/GUI/Tab.cpp:964 +msgid "Horizontal shells" +msgstr "쉘 너비" + +#: src/slic3r/GUI/Tab.cpp:965 src/libslic3r/PrintConfig.cpp:1709 +msgid "Solid layers" +msgstr "솔리드 레이어" + +#: src/slic3r/GUI/Tab.cpp:970 +msgid "Quality (slower slicing)" +msgstr "품질(슬라이싱이 느려짐)" + +#: src/slic3r/GUI/Tab.cpp:988 +msgid "Reducing printing time" +msgstr "출력 시간 단축" + +#: src/slic3r/GUI/Tab.cpp:1000 +msgid "Skirt and brim" +msgstr "스커트와 브림" + +#: src/slic3r/GUI/Tab.cpp:1017 +msgid "Raft" +msgstr "라프트" + +#: src/slic3r/GUI/Tab.cpp:1021 +msgid "Options for support material and raft" +msgstr "서포트와 라프트 재료를 선택" + +#: src/slic3r/GUI/Tab.cpp:1036 +msgid "Speed for print moves" +msgstr "출력중 이동 속도" + +#: src/slic3r/GUI/Tab.cpp:1048 +msgid "Speed for non-print moves" +msgstr "미출력시 이동속도" + +#: src/slic3r/GUI/Tab.cpp:1051 +msgid "Modifiers" +msgstr "수정" + +#: src/slic3r/GUI/Tab.cpp:1054 +msgid "Acceleration control (advanced)" +msgstr "가속 제어(고급)" + +#: src/slic3r/GUI/Tab.cpp:1061 +msgid "Autospeed (advanced)" +msgstr "오토스피트(고급)" + +#: src/slic3r/GUI/Tab.cpp:1069 +msgid "Multiple Extruders" +msgstr "다중 익스트루더" + +#: src/slic3r/GUI/Tab.cpp:1077 +msgid "Ooze prevention" +msgstr "오즈 방지(Ooze prevention)" + +#: src/slic3r/GUI/Tab.cpp:1094 +msgid "Extrusion width" +msgstr "악출 폭(Extrusion width)" + +#: src/slic3r/GUI/Tab.cpp:1104 +msgid "Overlap" +msgstr "겹침(Overlap)" + +#: src/slic3r/GUI/Tab.cpp:1107 +msgid "Flow" +msgstr "유량(Flow)" + +#: src/slic3r/GUI/Tab.cpp:1116 +msgid "Other" +msgstr "그 외" + +#: src/slic3r/GUI/Tab.cpp:1119 src/slic3r/GUI/Tab.cpp:3351 +msgid "Output options" +msgstr "출력 옵션" + +#: src/slic3r/GUI/Tab.cpp:1120 +msgid "Sequential printing" +msgstr "연속 인쇄" + +#: src/slic3r/GUI/Tab.cpp:1122 +msgid "Extruder clearance (mm)" +msgstr "익스트루더 간격(mm)" + +#: src/slic3r/GUI/Tab.cpp:1131 src/slic3r/GUI/Tab.cpp:3352 +msgid "Output file" +msgstr "출력 파일" + +#: src/slic3r/GUI/Tab.cpp:1138 src/libslic3r/PrintConfig.cpp:1382 +msgid "Post-processing scripts" +msgstr "포스트 프로세싱 스크립트" + +#: src/slic3r/GUI/Tab.cpp:1144 src/slic3r/GUI/Tab.cpp:1145 src/slic3r/GUI/Tab.cpp:1527 +#: src/slic3r/GUI/Tab.cpp:1528 src/slic3r/GUI/Tab.cpp:1935 src/slic3r/GUI/Tab.cpp:1936 +#: src/slic3r/GUI/Tab.cpp:2027 src/slic3r/GUI/Tab.cpp:2028 src/slic3r/GUI/Tab.cpp:3240 +#: src/slic3r/GUI/Tab.cpp:3241 +msgid "Notes" +msgstr "메모" + +#: src/slic3r/GUI/Tab.cpp:1151 src/slic3r/GUI/Tab.cpp:1535 src/slic3r/GUI/Tab.cpp:1942 +#: src/slic3r/GUI/Tab.cpp:2034 src/slic3r/GUI/Tab.cpp:3248 src/slic3r/GUI/Tab.cpp:3357 +msgid "Dependencies" +msgstr "속한 그룹" + +#: src/slic3r/GUI/Tab.cpp:1152 src/slic3r/GUI/Tab.cpp:1536 src/slic3r/GUI/Tab.cpp:1943 +#: src/slic3r/GUI/Tab.cpp:2035 src/slic3r/GUI/Tab.cpp:3249 src/slic3r/GUI/Tab.cpp:3358 +msgid "Profile dependencies" +msgstr "프로파일 속한곳" + +#: src/slic3r/GUI/Tab.cpp:1198 +#, no-c-format +msgid "" +"The Spiral Vase mode requires:\n" +"- one perimeter\n" +"- no top solid layers\n" +"- 0% fill density\n" +"- no support material\n" +"- no ensure_vertical_shell_thickness\n" +"\n" +"Shall I adjust those settings in order to enable Spiral Vase?" +msgstr "" +"스파이럴 바이스 모드에는 다음이 필요합니다.\n" +"- one 둘레\n" +"- 탑 솔리드 레이어 없음\n" +"- 채우기(fill) 밀도 0 %\n" +"- 서포트 재료 없음\n" +"- 수직 벽 두깨를 보장하지 않음\n" +"\n" +"스파이럴 바이스를 사용하려면 이러한 설정을 조정해야합니까?" + +#: src/slic3r/GUI/Tab.cpp:1205 +msgid "Spiral Vase" +msgstr "스파이럴 바이스" + +#: src/slic3r/GUI/Tab.cpp:1228 +msgid "" +"The Wipe Tower currently supports the non-soluble supports only\n" +"if they are printed with the current extruder without triggering a tool change.\n" +"(both support_material_extruder and support_material_interface_extruder need to be set to 0).\n" +"\n" +"Shall I adjust those settings in order to enable the Wipe Tower?" +msgstr "" +"와이퍼 타워는 현재 비 가용성 서포트 만 지원합니다.\n" +"공구 교환을 트리거하지 않고 현재 압출기로 인쇄 한 경우.\n" +"(support_material_extruder 및 support_material_interface_extruder를 모두 0으로 설정해야 함).\n" +"\n" +"와이퍼 타워를 사용하려면 이러한 설정을 조정해야합니까?" + +#: src/slic3r/GUI/Tab.cpp:1232 src/slic3r/GUI/Tab.cpp:1249 +msgid "Wipe Tower" +msgstr "와이프 타워(Wipe Tower)" + +#: src/slic3r/GUI/Tab.cpp:1246 +msgid "" +"For the Wipe Tower to work with the soluble supports, the support layers\n" +"need to be synchronized with the object layers.\n" +"\n" +"Shall I synchronize support layers in order to enable the Wipe Tower?" +msgstr "" +"와이퍼 타워가 가용성 서포트와 함께 작용하기 위해, 서포트 레이어\n" +"객체 레이어와 동기화되어야합니다.\n" +"\n" +"와이퍼 타워를 사용하려면 서포트 레이어를 동기화해야합니까?" + +#: src/slic3r/GUI/Tab.cpp:1264 +msgid "" +"Supports work better, if the following feature is enabled:\n" +"- Detect bridging perimeters\n" +"\n" +"Shall I adjust those settings for supports?" +msgstr "" +"다음 기능을 사용하는 경우 더 나은 작업을 지원합니다.\n" +"- 브리지 경계 검출\n" +"\n" +"서포트에 대한 설정을 조정해야합니까?" + +#: src/slic3r/GUI/Tab.cpp:1267 +msgid "Support Generator" +msgstr "서포트 생성" + +#: src/slic3r/GUI/Tab.cpp:1309 +msgid "The " +msgstr "The " + +#: src/slic3r/GUI/Tab.cpp:1309 +#, no-c-format +msgid "" +" infill pattern is not supposed to work at 100% density.\n" +"\n" +"Shall I switch to rectilinear fill pattern?" +msgstr "" +" infill 패턴은 100 % 밀도에서 작동하지 않습니다.\n" +"\n" +"직선 채우기 패턴으로 전환해야합니까?" + +#: src/slic3r/GUI/Tab.cpp:1429 +msgid "Temperature " +msgstr "온도 " + +#: src/slic3r/GUI/Tab.cpp:1435 +msgid "Bed" +msgstr "배드(Bed)" + +#: src/slic3r/GUI/Tab.cpp:1440 +msgid "Cooling" +msgstr "냉각(Cooling)" + +#: src/slic3r/GUI/Tab.cpp:1441 src/libslic3r/PrintConfig.cpp:1285 src/libslic3r/PrintConfig.cpp:2097 +msgid "Enable" +msgstr "사용" + +#: src/slic3r/GUI/Tab.cpp:1452 +msgid "Fan settings" +msgstr "팬 설정" + +#: src/slic3r/GUI/Tab.cpp:1453 +msgid "Fan speed" +msgstr "팬 속도" + +#: src/slic3r/GUI/Tab.cpp:1461 +msgid "Cooling thresholds" +msgstr "냉각 임계 값" + +#: src/slic3r/GUI/Tab.cpp:1467 +msgid "Filament properties" +msgstr "필라멘트 특성" + +#: src/slic3r/GUI/Tab.cpp:1471 +msgid "Print speed override" +msgstr "인쇄 속도 중단" + +#: src/slic3r/GUI/Tab.cpp:1481 +msgid "Toolchange parameters with single extruder MM printers" +msgstr "싱글 익스트루더 MM 프린터를 사용한 공구 교환 매개 변수" + +#: src/slic3r/GUI/Tab.cpp:1496 +msgid "Ramming settings" +msgstr "래밍 설정" + +#: src/slic3r/GUI/Tab.cpp:1514 src/slic3r/GUI/Tab.cpp:1898 +msgid "Custom G-code" +msgstr "수동 G코드" + +#: src/slic3r/GUI/Tab.cpp:1515 src/slic3r/GUI/Tab.cpp:1899 src/libslic3r/PrintConfig.cpp:1735 +#: src/libslic3r/PrintConfig.cpp:1750 +msgid "Start G-code" +msgstr "스타트 G코드" + +#: src/slic3r/GUI/Tab.cpp:1521 src/slic3r/GUI/Tab.cpp:1905 src/libslic3r/PrintConfig.cpp:358 +#: src/libslic3r/PrintConfig.cpp:368 +msgid "End G-code" +msgstr "엔드 G코드" + +#: src/slic3r/GUI/Tab.cpp:1632 src/slic3r/GUI/Tab.cpp:1689 +msgid " Browse " +msgstr " 검색 " + +#: src/slic3r/GUI/Tab.cpp:1651 src/slic3r/GUI/Tab.cpp:1838 +msgid "Test" +msgstr "시험(test)" + +#: src/slic3r/GUI/Tab.cpp:1662 +msgid "Could not get a valid Printer Host reference" +msgstr "유효한 프린터 호스트 참조를 가져올 수 없습니다" + +#: src/slic3r/GUI/Tab.cpp:1668 src/slic3r/GUI/Tab.cpp:1851 +msgid "Success!" +msgstr "성공!" + +#: src/slic3r/GUI/Tab.cpp:1683 +msgid "HTTPS CA file is optional. It is only needed if you use HTTPS with a self-signed certificate." +msgstr "HTTPS CA 파일은 선택 사항입니다. 자체 서명 된 인증서로 HTTPS를 사용하는 경우에만 필요합니다." + +#: src/slic3r/GUI/Tab.cpp:1696 +msgid "Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*" +msgstr "인증서 파일 (* .crt, * .pem) | * .crt; * .pem | 모든 파일 | *. *" + +#: src/slic3r/GUI/Tab.cpp:1697 +msgid "Open CA certificate file" +msgstr "Open CA certificate file" + +#: src/slic3r/GUI/Tab.cpp:1725 +msgid "" +"HTTPS CA File:\n" +"\tOn this system, Slic3r uses HTTPS certificates from the system Certificate Store or Keychain.\n" +"\tTo use a custom CA file, please import your CA file into Certificate Store / Keychain." +msgstr "" +"HTTPS CA 파일:\n" +"\t이 시스템에서 Slic3r는 시스템 인증서 저장소나 키체인의 HTTPS 인증서를 사용 합니다.\n" +"\t사용자 지정 CA 파일을 사용 하려면 CA 파일을 인증서 저장소/키체인에 가져오십시오." + +#: src/slic3r/GUI/Tab.cpp:1763 src/slic3r/GUI/Tab.cpp:1964 +msgid "Size and coordinates" +msgstr "크기와 좌표" + +#: src/slic3r/GUI/Tab.cpp:1767 src/slic3r/GUI/Tab.cpp:1968 src/slic3r/GUI/Tab.cpp:2911 +msgid " Set " +msgstr " 세트 " + +#: src/slic3r/GUI/Tab.cpp:1790 +msgid "Capabilities" +msgstr "기능" + +#: src/slic3r/GUI/Tab.cpp:1795 +msgid "Number of extruders of the printer." +msgstr "프린터 익스트루더 숫자." + +#: src/slic3r/GUI/Tab.cpp:1823 +msgid "USB/Serial connection" +msgstr "USB/시리얼 연결" + +#: src/slic3r/GUI/Tab.cpp:1824 src/libslic3r/PrintConfig.cpp:1590 +msgid "Serial port" +msgstr "시리얼 포트" + +#: src/slic3r/GUI/Tab.cpp:1829 +msgid "Rescan serial ports" +msgstr "시리얼포트 재검색" + +#: src/slic3r/GUI/Tab.cpp:1851 +msgid "Connection to printer works correctly." +msgstr "프린터 연결이 올바르게 작동합니다." + +#: src/slic3r/GUI/Tab.cpp:1854 +msgid "Connection failed." +msgstr "연결 실패." + +#: src/slic3r/GUI/Tab.cpp:1867 src/slic3r/GUI/Tab.cpp:2022 +msgid "Print Host upload" +msgstr "호스트 업로드 인쇄" + +#: src/slic3r/GUI/Tab.cpp:1911 src/libslic3r/PrintConfig.cpp:128 +msgid "Before layer change G-code" +msgstr "레이어 변경 전 G 코드" + +#: src/slic3r/GUI/Tab.cpp:1917 src/libslic3r/PrintConfig.cpp:1030 +msgid "After layer change G-code" +msgstr "레이어 변경 후 G 코드" + +#: src/slic3r/GUI/Tab.cpp:1923 src/libslic3r/PrintConfig.cpp:2005 +msgid "Tool change G-code" +msgstr "툴 채인지 G 코드" + +#: src/slic3r/GUI/Tab.cpp:1929 +msgid "Between objects G-code (for sequential printing)" +msgstr "객체 간 G 코드 (순차 인쇄용)" + +#: src/slic3r/GUI/Tab.cpp:1990 +msgid "Display" +msgstr "표시" + +#: src/slic3r/GUI/Tab.cpp:2001 +msgid "Tilt" +msgstr "기울이기" + +#: src/slic3r/GUI/Tab.cpp:2002 +msgid "Tilt time" +msgstr "기울이기 시간" + +#: src/slic3r/GUI/Tab.cpp:2008 src/slic3r/GUI/Tab.cpp:3223 +msgid "Corrections" +msgstr "수정" + +#: src/slic3r/GUI/Tab.cpp:2074 src/slic3r/GUI/Tab.cpp:2136 src/libslic3r/PrintConfig.cpp:1076 +#: src/libslic3r/PrintConfig.cpp:1086 src/libslic3r/PrintConfig.cpp:1096 src/libslic3r/PrintConfig.cpp:1109 +#: src/libslic3r/PrintConfig.cpp:1120 src/libslic3r/PrintConfig.cpp:1131 src/libslic3r/PrintConfig.cpp:1142 +msgid "Machine limits" +msgstr "머신 한계설정" + +#: src/slic3r/GUI/Tab.cpp:2088 +msgid "Values in this column are for Full Power mode" +msgstr "이 열의 값은 최대 전력 모드입니다" + +#: src/slic3r/GUI/Tab.cpp:2089 +msgid "Full Power" +msgstr "최대 파워" + +#: src/slic3r/GUI/Tab.cpp:2094 +msgid "Values in this column are for Silent mode" +msgstr "이 열의 값은 무음 모드 용입니다" + +#: src/slic3r/GUI/Tab.cpp:2095 +msgid "Silent" +msgstr "무음" + +#: src/slic3r/GUI/Tab.cpp:2103 +msgid "Maximum feedrates" +msgstr "최대 이송속도" + +#: src/slic3r/GUI/Tab.cpp:2108 +msgid "Maximum accelerations" +msgstr "최고 가속도" + +#: src/slic3r/GUI/Tab.cpp:2115 +msgid "Jerk limits" +msgstr "저크(Jerk)값 한계" + +#: src/slic3r/GUI/Tab.cpp:2120 +msgid "Minimum feedrates" +msgstr "최대 이송속도" + +#: src/slic3r/GUI/Tab.cpp:2158 src/slic3r/GUI/Tab.cpp:2166 +msgid "Single extruder MM setup" +msgstr "싱글 익스트루더 MM 설정" + +#: src/slic3r/GUI/Tab.cpp:2167 +msgid "Single extruder multimaterial parameters" +msgstr "싱글 익스트루더 멀티메터리알 파라미터" + +#: src/slic3r/GUI/Tab.cpp:2181 src/libslic3r/GCode/PreviewData.cpp:475 +#, c-format +msgid "Extruder %d" +msgstr "익스트루더 %d" + +#: src/slic3r/GUI/Tab.cpp:2188 +msgid "Layer height limits" +msgstr "레이어 높이 한계치" + +#: src/slic3r/GUI/Tab.cpp:2193 +msgid "Position (for multi-extruder printers)" +msgstr "위치 (멀티 익스트루더 프린터 포함)" + +#: src/slic3r/GUI/Tab.cpp:2196 +msgid "Retraction" +msgstr "리트렉션" + +#: src/slic3r/GUI/Tab.cpp:2199 +msgid "Only lift Z" +msgstr "Z축만 올림" + +#: src/slic3r/GUI/Tab.cpp:2212 +msgid "Retraction when tool is disabled (advanced settings for multi-extruder setups)" +msgstr "도구 비활성화시 리트렉션 (멀티 익스트루더 고급 설정)" + +#: src/slic3r/GUI/Tab.cpp:2216 +msgid "Preview" +msgstr "프리뷰" + +#: src/slic3r/GUI/Tab.cpp:2352 +msgid "" +"The Wipe option is not available when using the Firmware Retraction mode.\n" +"\n" +"Shall I disable it in order to enable Firmware Retraction?" +msgstr "" +"펌웨어 리트렉션 모드를 사용할 때는 Wipe 옵션을 사용할 수 없습니다.\n" +"\n" +"펌웨어 리트렉션 하려면 비활성화해야합니까?" + +#: src/slic3r/GUI/Tab.cpp:2354 +msgid "Firmware Retraction" +msgstr "펌웨어 레트렉션" + +#: src/slic3r/GUI/Tab.cpp:2681 +#, c-format +msgid "Default preset (%s)" +msgstr "시스템 기본값 (%s)" + +#: src/slic3r/GUI/Tab.cpp:2682 +#, c-format +msgid "Preset (%s)" +msgstr "프리셋 ( %s)" + +#: src/slic3r/GUI/Tab.cpp:2699 +msgid "has the following unsaved changes:" +msgstr "저장되지 않은 수정사항:" + +#: src/slic3r/GUI/Tab.cpp:2702 +msgid "is not compatible with printer" +msgstr "프린터와 호완 되지 않습니다" + +#: src/slic3r/GUI/Tab.cpp:2703 +msgid "is not compatible with print profile" +msgstr "인쇄 프로필과 호환 되지 않음" + +#: src/slic3r/GUI/Tab.cpp:2705 +msgid "and it has the following unsaved changes:" +msgstr "저장되지 않은 변경점은 다음과 같습니다:" + +#: src/slic3r/GUI/Tab.cpp:2708 +msgid "Discard changes and continue anyway?" +msgstr "수정된 사항을 취소하고 계속하겠습니까?" + +#: src/slic3r/GUI/Tab.cpp:2709 +msgid "Unsaved Changes" +msgstr "미 저장된 변경점" + +#: src/slic3r/GUI/Tab.cpp:2721 +msgid "Please check your object list before preset changing." +msgstr "사전 설정을 변경 하기 전에 개체 목록을 확인 하십시오." + +#: src/slic3r/GUI/Tab.cpp:2801 +msgid "Copy" +msgstr "복사" + +#: src/slic3r/GUI/Tab.cpp:2823 +msgid "The supplied name is empty. It can't be saved." +msgstr "파일 이름이 비어 있습니다. 저장할 수 없습니다." + +#: src/slic3r/GUI/Tab.cpp:2828 +msgid "Cannot overwrite a system profile." +msgstr "시스템 프로파일을 겹쳐 쓸 수 없습니다." + +#: src/slic3r/GUI/Tab.cpp:2832 +msgid "Cannot overwrite an external profile." +msgstr "외부 프로필을 덮어 쓸 수 없습니다." + +#: src/slic3r/GUI/Tab.cpp:2858 +msgid "remove" +msgstr "제거(remove)" + +#: src/slic3r/GUI/Tab.cpp:2858 +msgid "delete" +msgstr "지우기(delete)" + +#: src/slic3r/GUI/Tab.cpp:2859 +msgid "Are you sure you want to " +msgstr "정말로 다음과 같이 하겠습니까? " + +#: src/slic3r/GUI/Tab.cpp:2859 +msgid " the selected preset?" +msgstr " 를(가) 선택된 설정을 실행 할까요?" + +#: src/slic3r/GUI/Tab.cpp:2860 +msgid "Remove" +msgstr "제거(remove)" + +#: src/slic3r/GUI/Tab.cpp:2861 +msgid " Preset" +msgstr " 기본 설정" + +#: src/slic3r/GUI/Tab.cpp:2989 +msgid "LOCKED LOCK;indicates that the settings are the same as the system values for the current option group" +msgstr "자물쇠 잠금 : 설정이 현재 옵션 그룹의 시스템 값과 동일 함을 나타냅니다" + +#: src/slic3r/GUI/Tab.cpp:2992 +msgid "" +"UNLOCKED LOCK;indicates that some settings were changed and are not equal to the system values for the " +"current option group.\n" +"Click the UNLOCKED LOCK icon to reset all settings for current option group to the system values." +msgstr "" +"잠금 풀림 : 일부 설정이 변경되었으며 현재 옵션 그룹의 시스템 값과 같지 않음을 나타냅니다.\n" +"현재 옵션 그룹의 모든 설정을 시스템 값으로 재설정하려면 자물쇠 잠금 아이콘을 클릭하십시오." + +#: src/slic3r/GUI/Tab.cpp:2998 +msgid "" +"WHITE BULLET;for the left button: \tindicates a non-system preset,\n" +"for the right button: \tindicates that the settings hasn't been modified." +msgstr "" +"흰색 총알; 왼쪽 버튼 : 시스템이 아닌 사전 설정을 나타내며,\n" +"오른쪽 버튼의 경우 : 설정이 수정되지 않았 음을 나타냅니다." + +#: src/slic3r/GUI/Tab.cpp:3002 +msgid "" +"BACK ARROW;indicates that the settings were changed and are not equal to the last saved preset for the " +"current option group.\n" +"Click the BACK ARROW icon to reset all settings for the current option group to the last saved preset." +msgstr "" +"잠금 풀림;일부 설정이 변경되었으며 현재 옵션 그룹의 시스템 값과 같지 않음을 나타냅니다.\n" +"현재 옵션 그룹의 모든 설정을 시스템 값으로 재설정하려면 자물쇠 잠금 아이콘을 클릭하십시오." + +#: src/slic3r/GUI/Tab.cpp:3028 +msgid "" +"LOCKED LOCK icon indicates that the settings are the same as the system values for the current option group" +msgstr "자물쇠 잠금 아이코 설정이 현재 옵션 그룹의 시스템 값과 동일 함을 나타냅니다" + +#: src/slic3r/GUI/Tab.cpp:3030 +msgid "" +"UNLOCKED LOCK icon indicates that some settings were changed and are not equal to the system values for the " +"current option group.\n" +"Click to reset all settings for current option group to the system values." +msgstr "" +"잠금 풀림 아이코 일부 설정이 변경되었으며 현재 옵션 그룹의 시스템 값과 같지 않음을 나타냅니다.\n" +"현재 옵션 그룹의 모든 설정을 시스템 값으로 재설정하려면 자물쇠 잠금 아이콘을 클릭하십시오." + +#: src/slic3r/GUI/Tab.cpp:3033 +msgid "WHITE BULLET icon indicates a non system preset." +msgstr "흰색 글머리 아이콘은 시스템 사전 설정이 아닌 것을 나타냅니다." + +#: src/slic3r/GUI/Tab.cpp:3036 +msgid "" +"WHITE BULLET icon indicates that the settings are the same as in the last saved preset for the current option " +"group." +msgstr "" +"흰색 글머리 기호 아이콘은 설정이 현재 옵션 그룹에 대해 마지막으로 저장 된 사전 설정과 동일 하다는 것을 나타냅" +"니다." + +#: src/slic3r/GUI/Tab.cpp:3038 +msgid "" +"BACK ARROW icon indicates that the settings were changed and are not equal to the last saved preset for the " +"current option group.\n" +"Click to reset all settings for the current option group to the last saved preset." +msgstr "" +"백화살표 아이콘 설정을 변경 하 고 현재 옵션 그룹에 대 한 마지막 저장 된 프리셋을 동일 하지 않습니다 나타냅니" +"다.\n" +"마지막 현재 옵션 그룹에 대 한 모든 설정 다시 설정을 클릭 하 여 사전 설정을 저장." + +#: src/slic3r/GUI/Tab.cpp:3044 +msgid "LOCKED LOCK icon indicates that the value is the same as the system value." +msgstr "잠긴 자물쇠 아이콘 값 같은 시스템 값 임을 나타냅니다." + +#: src/slic3r/GUI/Tab.cpp:3045 +msgid "" +"UNLOCKED LOCK icon indicates that the value was changed and is not equal to the system value.\n" +"Click to reset current value to the system value." +msgstr "" +"잠금 해제 자물쇠 아이콘 값 변경 된 시스템 값은 나타냅니다.\n" +"시스템 값을 현재 값으로 설정 하려면 클릭 합니다." + +#: src/slic3r/GUI/Tab.cpp:3051 +msgid "WHITE BULLET icon indicates that the value is the same as in the last saved preset." +msgstr "흰색 글머리 기호 아이콘은 마지막으로 저장 한 사전 설정과 동일한 값을 나타냅니다." + +#: src/slic3r/GUI/Tab.cpp:3052 +msgid "" +"BACK ARROW icon indicates that the value was changed and is not equal to the last saved preset.\n" +"Click to reset current value to the last saved preset." +msgstr "" +"잠금 해제 자물쇠 아이콘 값 변경 된 시스템 값은 나타냅니다.\n" +"시스템 값을 현재 값으로 설정 하려면 클릭 합니다." + +#: src/slic3r/GUI/Tab.cpp:3152 +msgid " as:" +msgstr " as:" + +#: src/slic3r/GUI/Tab.cpp:3196 +msgid "the following postfix are not allowed:" +msgstr "다음 접미사는 허용되지 않습니다:" + +#: src/slic3r/GUI/Tab.cpp:3200 +msgid "The supplied name is not available." +msgstr "The supplied name is not available." + +#: src/slic3r/GUI/Tab.cpp:3213 +msgid "Material" +msgstr "재료" + +#: src/slic3r/GUI/Tab.cpp:3215 src/slic3r/GUI/Tab.cpp:3305 +msgid "Layers" +msgstr "레이어" + +#: src/slic3r/GUI/Tab.cpp:3219 +msgid "Exposure" +msgstr "노출" + +#: src/slic3r/GUI/Tab.cpp:3313 +msgid "Support head" +msgstr "서포트 헤드" + +#: src/slic3r/GUI/Tab.cpp:3318 +msgid "Support pillar" +msgstr "서포트 기둥" + +#: src/slic3r/GUI/Tab.cpp:3328 +msgid "Connection of the support sticks and junctions" +msgstr "서포트 기둥 및 접합부 연결" + +#: src/slic3r/GUI/Tab.cpp:3333 +msgid "Automatic generation" +msgstr "자동 생성" + +#: src/slic3r/GUI/Tab.cpp:3395 +msgid "Head penetration should not be greater than the head width." +msgstr "헤드 관통은 헤드 폭 보다 크지 않아야 합니다." + +#: src/slic3r/GUI/Tab.cpp:3396 +msgid "Invalid Head penetration" +msgstr "잘못된 헤드 관통" + +#: src/slic3r/GUI/Tab.cpp:3408 +msgid "Pinhead diameter should be smaller than the pillar diameter." +msgstr "핀헤드 지름은 기둥 지름 보다 작아야 합니다." + +#: src/slic3r/GUI/Tab.cpp:3409 +msgid "Invalid pinhead diameter" +msgstr "잘못된 핀 헤드 지름" + +#: src/slic3r/GUI/Tab.hpp:307 src/slic3r/GUI/Tab.hpp:395 +msgid "Print Settings" +msgstr "출력 설정" + +#: src/slic3r/GUI/Tab.hpp:325 +msgid "Filament Settings" +msgstr "필라멘트 설정" + +#: src/slic3r/GUI/Tab.hpp:358 +msgid "Printer Settings" +msgstr "프린터 설정" + +#: src/slic3r/GUI/Tab.hpp:381 +msgid "Material Settings" +msgstr "재질 설정" + +#: src/slic3r/GUI/Tab.hpp:407 +msgid "Save preset" +msgstr "사전 설정 저장" + +#: src/slic3r/GUI/UpdateDialogs.cpp:29 +msgid "Update available" +msgstr "사용가능한 업데이트" + +#: src/slic3r/GUI/UpdateDialogs.cpp:29 +msgid "New version of Slic3r PE is available" +msgstr "새로운 버전의 Slic3r PE 사용 가능" + +#: src/slic3r/GUI/UpdateDialogs.cpp:36 +msgid "To download, follow the link below." +msgstr "다운로드하려면 아래 링크를 클릭하십시오." + +#: src/slic3r/GUI/UpdateDialogs.cpp:44 +msgid "Current version:" +msgstr "현재 버전:" + +#: src/slic3r/GUI/UpdateDialogs.cpp:46 +msgid "New version:" +msgstr "새로운 버전:" + +#: src/slic3r/GUI/UpdateDialogs.cpp:54 +msgid "Don't notify about new releases any more" +msgstr "새로운 수정사항에 대해 더 이상 알림 안 함" + +#: src/slic3r/GUI/UpdateDialogs.cpp:72 src/slic3r/GUI/UpdateDialogs.cpp:164 +msgid "Configuration update" +msgstr "구성 업데이트" + +#: src/slic3r/GUI/UpdateDialogs.cpp:72 +msgid "Configuration update is available" +msgstr "구성 업데이트를 사용할 수 있음" + +#: src/slic3r/GUI/UpdateDialogs.cpp:75 +msgid "" +"Would you like to install it?\n" +"\n" +"Note that a full configuration snapshot will be created first. It can then be restored at any time should " +"there be a problem with the new version.\n" +"\n" +"Updated configuration bundles:" +msgstr "" +"그것을 설치 하시겠습니까?\n" +"\n" +"전체 구성 스냅 샷이 먼저 만들어집니다. 그런 다음 새 버전에 문제가있을 경우 언제든지 복원 할 수 있습니다.\n" +"\n" +"업데이트 된 구성 번들 :" + +#: src/slic3r/GUI/UpdateDialogs.cpp:111 +msgid "Slic3r incompatibility" +msgstr "Slic3r와 호환 되지 않음" + +#: src/slic3r/GUI/UpdateDialogs.cpp:111 +msgid "Slic3r configuration is incompatible" +msgstr "Slic3r 구성이 호환되지 않습니다" + +#: src/slic3r/GUI/UpdateDialogs.cpp:114 +msgid "" +"This version of Slic3r PE is not compatible with currently installed configuration bundles.\n" +"This probably happened as a result of running an older Slic3r PE after using a newer one.\n" +"\n" +"You may either exit Slic3r and try again with a newer version, or you may re-run the initial configuration. " +"Doing so will create a backup snapshot of the existing configuration before installing files compatible with " +"this Slic3r.\n" +msgstr "" +"이 버전의 Slic3r PE는 현재 설치된 구성 번들과 호환되지 않습니다.\n" +"이것은 아마도 새로운 Slic3r PE를 사용한 후에 실행 된 결과 일 것입니다.\n" +"\n" +"Slic3r을 종료하고 새 버전으로 다시 시도하거나 초기 구성을 다시 실행할 수 있습니다. 이렇게하면이 Slic3r과 호환" +"되는 파일을 설치하기 전에 기존 구성의 백업 스냅 샷을 생성 할 수 있습니다.\n" + +#: src/slic3r/GUI/UpdateDialogs.cpp:123 +#, c-format +msgid "This Slic3r PE version: %s" +msgstr "이 Slic3r PE 버전 : % s" + +#: src/slic3r/GUI/UpdateDialogs.cpp:128 +msgid "Incompatible bundles:" +msgstr "호환되지 않는 번들 :" + +#: src/slic3r/GUI/UpdateDialogs.cpp:144 +msgid "Exit Slic3r" +msgstr "Exit Slic3r" + +#: src/slic3r/GUI/UpdateDialogs.cpp:147 +msgid "Re-configure" +msgstr "재구성" + +#: src/slic3r/GUI/UpdateDialogs.cpp:168 +#, c-format +msgid "" +"Slic3r PE now uses an updated configuration structure.\n" +"\n" +"So called 'System presets' have been introduced, which hold the built-in default settings for various " +"printers. These System presets cannot be modified, instead, users now may create their own presets inheriting " +"settings from one of the System presets.\n" +"An inheriting preset may either inherit a particular value from its parent or override it with a customized " +"value.\n" +"\n" +"Please proceed with the %s that follows to set up the new presets and to choose whether to enable automatic " +"preset updates." +msgstr "" +"Slic3r PE는 이제 업데이트 된 구성 구조를 사용합니다.\n" +"\n" +"'시스템 사전 설정'이 도입되어 다양한 프린터에 기본 제공되는 기본 설정이 유지됩니다. 이러한 시스템 사전 설정은 " +"수정할 수 없으며 대신 사용자는 시스템 사전 설정 중 하나에서 설정을 상속하는 자체 사전 설정을 만들 수 있습니" +"다.\n" +"상속 된 사전 설정은 부모로부터 특정 값을 상속 받거나 사용자 정의 값으로 대체 할 수 있습니다.\n" +"\n" +"새 사전 설정을 설정하고 자동 사전 설정 업데이트를 사용할지 여부를 선택하려면 다음의 % s을 계속 진행하십시오." + +#: src/slic3r/GUI/UpdateDialogs.cpp:184 +msgid "For more information please visit our wiki page:" +msgstr "자세한 정보는 위키 페이지를 참조하십시오 :" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:14 +msgid "Ramming customization" +msgstr "사용자 정의 다지기(Ramming)" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:40 +msgid "" +"Ramming denotes the rapid extrusion just before a tool change in a single-extruder MM printer. Its purpose is " +"to properly shape the end of the unloaded filament so it does not prevent insertion of the new filament and " +"can itself be reinserted later. This phase is important and different materials can require different " +"extrusion speeds to get the good shape. For this reason, the extrusion rates during ramming are adjustable.\n" +"\n" +"This is an expert-level setting, incorrect adjustment will likely lead to jams, extruder wheel grinding into " +"filament etc." +msgstr "" +"래밍은 단일 압출기 MM 프린터에서 공구 교환 직전의 신속한 압출을 나타냅니다. 그 목적은 언로드 된 필라멘트의 끝 " +"부분을 적절히 형성하여 새로운 필라멘트의 삽입을 방지하고 나중에 다시 삽입 할 수 있도록하기위한 것입니다. 이 단" +"계는 중요하며 다른 재료는 좋은 모양을 얻기 위해 다른 압출 속도를 요구할 수 있습니다. 이러한 이유로, 래밍 중 압" +"출 속도는 조정 가능합니다.\n" +"\n" +"전문가 수준의 설정이므로 잘못된 조정으로 인해 용지 걸림, 압출기 휠이 필라멘트 등에 연삭 될 수 있습니다." + +#: src/slic3r/GUI/WipeTowerDialog.cpp:82 +msgid "Total ramming time" +msgstr "총 래밍 시간" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:84 +msgid "Total rammed volume" +msgstr "총 레미드 양" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:88 +msgid "Ramming line width" +msgstr "래밍 선 너비" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:90 +msgid "Ramming line spacing" +msgstr "래밍 선 간격" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:141 +msgid "Wipe tower - Purging volume adjustment" +msgstr "와이프 타워 - 버려진 필라멘트 조절" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:225 +msgid "Here you can adjust required purging volume (mm³) for any given pair of tools." +msgstr "여기서 주어진 도구 쌍에 필요한 정화 용량 (mm³)을 조정할 수 있습니다." + +#: src/slic3r/GUI/WipeTowerDialog.cpp:226 +msgid "Extruder changed to" +msgstr "익스트루더 번경" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:234 +msgid "unloaded" +msgstr "언로드(unloaded)" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:235 +msgid "loaded" +msgstr "로드(loaded)" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:240 +msgid "Tool #" +msgstr "툴(Tool) #" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:247 +msgid "" +"Total purging volume is calculated by summing two values below, depending on which tools are loaded/unloaded." +msgstr "총 정화 량은 어느 공구가로드 / 언로드되는지에 따라 아래의 두 값을 합산하여 계산됩니다." + +#: src/slic3r/GUI/WipeTowerDialog.cpp:248 +msgid "Volume to purge (mm³) when the filament is being" +msgstr "제거할 필라멘트 양 (mm³)" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:262 +msgid "From" +msgstr "From" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:327 +msgid "" +"Switching to simple settings will discard changes done in the advanced mode!\n" +"\n" +"Do you want to proceed?" +msgstr "" +"단순 설정으로 전환하면 고급 모드에서 수행된 변경 내용이 삭제됨!\n" +"\n" +"계속하시겠습니까?" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:339 +msgid "Show simplified settings" +msgstr "간단한 설정보기" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:339 +msgid "Show advanced settings" +msgstr "고급 설정보기" + +#: src/slic3r/GUI/wxExtensions.cpp:2398 +#, c-format +msgid "Switch to the %s mode" +msgstr "%s 모드로 전환" + +#: src/slic3r/GUI/wxExtensions.cpp:2399 +#, c-format +msgid "Current mode is %s" +msgstr "현재 모드는 %s입니다" + +#: src/slic3r/Utils/Duet.cpp:51 +msgid "Connection to Duet works correctly." +msgstr "듀엣보드에 대한 연결이 올바르게 작동 합니다." + +#: src/slic3r/Utils/Duet.cpp:56 +msgid "Could not connect to Duet" +msgstr "듀엣보드에 연결할 수 없습니다" + +#: src/slic3r/Utils/Duet.cpp:84 src/slic3r/Utils/Duet.cpp:154 +msgid "Unknown error occured" +msgstr "알 수 없는 오류가 발생 했습니다" + +#: src/slic3r/Utils/Duet.cpp:148 +msgid "Wrong password" +msgstr "잘못된 암호" + +#: src/slic3r/Utils/Duet.cpp:151 +msgid "Could not get resources to create a new connection" +msgstr "새 연결을 만들 리소스를 가져올수 없습니다" + +#: src/slic3r/Utils/OctoPrint.cpp:69 +#, c-format +msgid "Mismatched type of print host: %s" +msgstr "일치 하지않는 인쇄 호스트 유형: %s" + +#: src/slic3r/Utils/OctoPrint.cpp:84 +msgid "Connection to OctoPrint works correctly." +msgstr "OctoPrint에 연결하면 올바르게 작동합니다." + +#: src/slic3r/Utils/OctoPrint.cpp:90 +msgid "Could not connect to OctoPrint" +msgstr "OctoPrint에 연결할 수 없습니다" + +#: src/slic3r/Utils/OctoPrint.cpp:90 +msgid "Note: OctoPrint version at least 1.1.0 is required." +msgstr "참고 : OctoPrint 버전 1.1.0 이상이 필요합니다." + +#: src/slic3r/Utils/OctoPrint.cpp:195 +msgid "Connection to Prusa SLA works correctly." +msgstr "Prusa SLA에 대한 연결이 올바르게 작동 합니다." + +#: src/slic3r/Utils/OctoPrint.cpp:200 +msgid "Could not connect to Prusa SLA" +msgstr "Prusa SLA에 연결할 수 없습니다" + +#: src/slic3r/Utils/PresetUpdater.cpp:583 +#, c-format +msgid "requires min. %s and max. %s" +msgstr "최소. %s 와 최대. %s" + +#: src/slic3r/Utils/PresetUpdater.cpp:588 +#, c-format +msgid "requires min. %s" +msgstr "최소 %s가 필요 합니다" + +#: src/slic3r/Utils/PresetUpdater.cpp:590 +#, c-format +msgid "requires max. %s" +msgstr "최대 필요 합니다. %s" + +#: src/slic3r/Utils/FixModelByWin10.cpp:219 src/slic3r/Utils/FixModelByWin10.cpp:359 +msgid "Exporting source model" +msgstr "소스 모델 내보내기" + +#: src/slic3r/Utils/FixModelByWin10.cpp:235 +msgid "Failed loading the input model." +msgstr "입력 모델을 로드하지 못했습니다." + +#: src/slic3r/Utils/FixModelByWin10.cpp:242 +msgid "Repairing model by the Netfabb service" +msgstr "Netfabb 서비스에의 한 모델 복구" + +#: src/slic3r/Utils/FixModelByWin10.cpp:248 +msgid "Mesh repair failed." +msgstr "메ㅅ 복구에 실패 했습니다." + +#: src/slic3r/Utils/FixModelByWin10.cpp:251 src/slic3r/Utils/FixModelByWin10.cpp:378 +msgid "Loading repaired model" +msgstr "복구 된 모델 로드" + +#: src/slic3r/Utils/FixModelByWin10.cpp:263 src/slic3r/Utils/FixModelByWin10.cpp:270 +#: src/slic3r/Utils/FixModelByWin10.cpp:302 +msgid "Saving mesh into the 3MF container failed." +msgstr "3MF 컨테이너에 메쉬를 저장하지 못했습니다." + +#: src/slic3r/Utils/FixModelByWin10.cpp:340 +msgid "Model fixing" +msgstr "모델 고정" + +#: src/slic3r/Utils/FixModelByWin10.cpp:341 +msgid "Exporting model..." +msgstr "소스 모델 내보내기..." + +#: src/slic3r/Utils/FixModelByWin10.cpp:368 +msgid "Export of a temporary 3mf file failed" +msgstr "임시 3mf 파일을 내보내지 못했습니다" + +#: src/slic3r/Utils/FixModelByWin10.cpp:383 +msgid "Import of the repaired 3mf file failed" +msgstr "복구된 3mf 파일을 가져오지 못했습니다" + +#: src/slic3r/Utils/FixModelByWin10.cpp:385 +msgid "Repaired 3MF file does not contain any object" +msgstr "복구된 3MF 파일에 개체가 포함 되어있지 않습니다" + +#: src/slic3r/Utils/FixModelByWin10.cpp:387 +msgid "Repaired 3MF file contains more than one object" +msgstr "복구된 3MF 파일에 둘 이상의 개체가 포함되어 있습니다" + +#: src/slic3r/Utils/FixModelByWin10.cpp:389 +msgid "Repaired 3MF file does not contain any volume" +msgstr "복구 된 3MF 파일에 개체가 포함 되어있지 않습니다" + +#: src/slic3r/Utils/FixModelByWin10.cpp:391 +msgid "Repaired 3MF file contains more than one volume" +msgstr "복구된 3MF 파일에 둘 이상의 개체가 포함되어 있습니다" + +#: src/slic3r/Utils/FixModelByWin10.cpp:400 +msgid "Model repair finished" +msgstr "모델 수리 완료" + +#: src/slic3r/Utils/FixModelByWin10.cpp:406 +msgid "Model repair canceled" +msgstr "모델 복구가 취소 되었습니다" + +#: src/slic3r/Utils/FixModelByWin10.cpp:423 +msgid "Model repaired successfully" +msgstr "모델이 성공적으로 복구 되었습니다" + +#: src/slic3r/Utils/FixModelByWin10.cpp:423 src/slic3r/Utils/FixModelByWin10.cpp:426 +msgid "Model Repair by the Netfabb service" +msgstr "Netfabb 서비스에의 한 모델 복구" + +#: src/slic3r/Utils/FixModelByWin10.cpp:426 +msgid "Model repair failed: \n" +msgstr "모델 복구 실패:\n" + +#: src/libslic3r/Zipper.cpp:35 +msgid "undefined error" +msgstr "정의 되지 않은 오류" + +#: src/libslic3r/Zipper.cpp:37 +msgid "too many files" +msgstr "파일이 너무 많음" + +#: src/libslic3r/Zipper.cpp:39 +msgid "file too large" +msgstr "파일이 너무 큼" + +#: src/libslic3r/Zipper.cpp:41 +msgid "unsupported method" +msgstr "지원 되지 않는 방법" + +#: src/libslic3r/Zipper.cpp:43 +msgid "unsupported encryption" +msgstr "지원 되지 않는 암호화" + +#: src/libslic3r/Zipper.cpp:45 +msgid "unsupported feature" +msgstr "지원 되지 않는 기능" + +#: src/libslic3r/Zipper.cpp:47 +msgid "failed finding central directory" +msgstr "중앙 디렉터리를 찾지 못했습니다." + +#: src/libslic3r/Zipper.cpp:49 +msgid "not a ZIP archive" +msgstr "zIP 아카이브 아님" + +#: src/libslic3r/Zipper.cpp:51 +msgid "invalid header or archive is corrupted" +msgstr "잘못 된 헤더 또는 아카이브가 손상 되었습니다" + +#: src/libslic3r/Zipper.cpp:53 +msgid "unsupported multidisk archive" +msgstr "지원 되지 않는 멀티 디스크 아카이브" + +#: src/libslic3r/Zipper.cpp:55 +msgid "decompression failed or archive is corrupted" +msgstr "압축 풀기 실패 또는 아카이브가 손상 되었습니다" + +#: src/libslic3r/Zipper.cpp:57 +msgid "compression failed" +msgstr "압축 실패" + +#: src/libslic3r/Zipper.cpp:59 +msgid "unexpected decompressed size" +msgstr "예기치 않은 압축 해제 크기" + +#: src/libslic3r/Zipper.cpp:61 +msgid "CRC-32 check failed" +msgstr "CRC-32 확인 실패" + +#: src/libslic3r/Zipper.cpp:63 +msgid "unsupported central directory size" +msgstr "지원 되지 않는 중앙 디렉터리 크기" + +#: src/libslic3r/Zipper.cpp:65 +msgid "allocation failed" +msgstr "할당 실패" + +#: src/libslic3r/Zipper.cpp:67 +msgid "file open failed" +msgstr "파일 열기 실패" + +#: src/libslic3r/Zipper.cpp:69 +msgid "file create failed" +msgstr "파일 만들기 실패" + +#: src/libslic3r/Zipper.cpp:71 +msgid "file write failed" +msgstr "파일 쓰기 실패" + +#: src/libslic3r/Zipper.cpp:73 +msgid "file read failed" +msgstr "파일 읽기 실패" + +#: src/libslic3r/Zipper.cpp:75 +msgid "file close failed" +msgstr "파일 닫기 실패" + +#: src/libslic3r/Zipper.cpp:77 +msgid "file seek failed" +msgstr "파일 검색 실패" + +#: src/libslic3r/Zipper.cpp:79 +msgid "file stat failed" +msgstr "파일 통계 실패" + +#: src/libslic3r/Zipper.cpp:81 +msgid "invalid parameter" +msgstr "잘못 된 매개 변수" + +#: src/libslic3r/Zipper.cpp:83 +msgid "invalid filename" +msgstr "잘못 된 파일 이름" + +#: src/libslic3r/Zipper.cpp:85 +msgid "buffer too small" +msgstr "버퍼가 너무 작음" + +#: src/libslic3r/Zipper.cpp:87 +msgid "internal error" +msgstr "내부 오류" + +#: src/libslic3r/Zipper.cpp:89 +msgid "file not found" +msgstr "파일을 찾을수 없다" + +#: src/libslic3r/Zipper.cpp:91 +msgid "archive is too large" +msgstr "아카이브가 너무 큼" + +#: src/libslic3r/Zipper.cpp:93 +msgid "validation failed" +msgstr "유효성 검사 실패" + +#: src/libslic3r/Zipper.cpp:95 +msgid "write calledback failed" +msgstr "쓰기 다시 실패" + +#: src/libslic3r/Zipper.cpp:105 +msgid "Error with zip archive" +msgstr "zip 아카이브와 오류가 발생 했습니다" + +#: src/libslic3r/SLA/SLASupportTree.cpp:2153 +msgid "Starting" +msgstr "부터" + +#: src/libslic3r/SLA/SLASupportTree.cpp:2154 +msgid "Filtering" +msgstr "필터링" + +#: src/libslic3r/SLA/SLASupportTree.cpp:2155 +msgid "Generate pinheads" +msgstr "핀 헤드 생성" + +#: src/libslic3r/SLA/SLASupportTree.cpp:2156 +msgid "Classification" +msgstr "주소" + +#: src/libslic3r/SLA/SLASupportTree.cpp:2157 +msgid "Routing to ground" +msgstr "면으로의 라우팅" + +#: src/libslic3r/SLA/SLASupportTree.cpp:2158 +msgid "Routing supports to model surface" +msgstr "모델 표면에 대한 라우팅 지원" + +#: src/libslic3r/SLA/SLASupportTree.cpp:2159 +msgid "Cascading pillars" +msgstr "계단식 기둥" + +#: src/libslic3r/SLA/SLASupportTree.cpp:2160 +msgid "Processing small holes" +msgstr "작은 구멍 가공" + +#: src/libslic3r/SLA/SLASupportTree.cpp:2161 +msgid "Done" +msgstr "완료" + +#: src/libslic3r/SLA/SLASupportTree.cpp:2162 +msgid "Abort" +msgstr "중단" + +#: src/libslic3r/Print.cpp:1136 +msgid "All objects are outside of the print volume." +msgstr "모든 개체가 인쇄 볼륨 외부에 있습니다." + +#: src/libslic3r/Print.cpp:1165 +msgid "Some objects are too close; your extruder will collide with them." +msgstr "일부 개체가 너무 가깝습니다. 귀하의 압출기가 그들과 충돌합니다." + +#: src/libslic3r/Print.cpp:1180 +msgid "Some objects are too tall and cannot be printed without extruder collisions." +msgstr "일부 개체는 너무 크고 익스트루더 충돌없이 인쇄 할 수 없습니다." + +#: src/libslic3r/Print.cpp:1190 +msgid "The Spiral Vase option can only be used when printing a single object." +msgstr "나선형 꽃병(Spiral Vase) 옵션은 단일 개체를 인쇄 할 때만 사용할 수 있습니다." + +#: src/libslic3r/Print.cpp:1192 +msgid "The Spiral Vase option can only be used when printing single material objects." +msgstr "나선형 꽃병 옵션(Spiral Vase)은 단일 재료 객체를 인쇄 할 때만 사용할 수 있습니다." + +#: src/libslic3r/Print.cpp:1198 +msgid "All extruders must have the same diameter for single extruder multimaterial printer." +msgstr "모든 익스트루더는 멀티메터리얼 프린터의 싱글 익스트루더에 대해 동일한 직경을 가져야합니다." + +#: src/libslic3r/Print.cpp:1203 +msgid "The Wipe Tower is currently only supported for the Marlin, RepRap/Sprinter and Repetier G-code flavors." +msgstr "와이프 타워는 현재 말린, RepRap/Sprinter 및 리피티어에 대해서만 G-코드지원 됩니다." + +#: src/libslic3r/Print.cpp:1205 +msgid "" +"The Wipe Tower is currently only supported with the relative extruder addressing (use_relative_e_distances=1)." +msgstr "와이프 타워는 현재 상대적 압출기 어드레싱 (use_relative_e_distances = 1)에서만 지원됩니다." + +#: src/libslic3r/Print.cpp:1226 +msgid "The Wipe Tower is only supported for multiple objects if they have equal layer heigths" +msgstr "와이프 타워 (Wipe Tower)는 같은 레이어 높이에 경우 여러 객체에 대해서만 지원됩니다" + +#: src/libslic3r/Print.cpp:1228 +msgid "" +"The Wipe Tower is only supported for multiple objects if they are printed over an equal number of raft layers" +msgstr "와이프 타워는 같은 수의 라프트 레이어 위에 인쇄 된 경우 여러 객체에 대해서만 지원됩니다" + +#: src/libslic3r/Print.cpp:1230 +msgid "" +"The Wipe Tower is only supported for multiple objects if they are printed with the same " +"support_material_contact_distance" +msgstr "와이프 타워는 동일한 support_material_contact_distance로 인쇄 된 경우 여러 객체에 대해서만 지원됩니다" + +#: src/libslic3r/Print.cpp:1232 +msgid "The Wipe Tower is only supported for multiple objects if they are sliced equally." +msgstr "와이프 타워는 똑같이 슬라이스 된 경우 여러 오브젝트에 대해서만 지원됩니다." + +#: src/libslic3r/Print.cpp:1261 +msgid "The Wipe tower is only supported if all objects have the same layer height profile" +msgstr "모든 오브젝트의 레이어 높이 프로필이 동일한 경우에만 와이프 타워가 지원됩니다" + +#: src/libslic3r/Print.cpp:1271 +msgid "The supplied settings will cause an empty print." +msgstr "제공된 설정으로 인해 빈 인쇄가 발생합니다." + +#: src/libslic3r/Print.cpp:1288 +msgid "One or more object were assigned an extruder that the printer does not have." +msgstr "하나 이상의 개체에 프린터에없는 압출기가 지정되었습니다." + +#: src/libslic3r/Print.cpp:1297 +msgid "" +"Printing with multiple extruders of differing nozzle diameters. If support is to be printed with the current " +"extruder (support_material_extruder == 0 or support_material_interface_extruder == 0), all nozzles have to be " +"of the same diameter." +msgstr "" +"노즐 지름이 다른 여러 압출기로 인쇄. 지원이 현재 압출기 (support_material_extruder == 0 또는 " +"support_material_interface_extruder == 0)로 인쇄되는 경우 모든 노즐은 동일한 지름이어야합니다." + +#: src/libslic3r/Print.cpp:1305 +msgid "" +"For the Wipe Tower to work with the soluble supports, the support layers need to be synchronized with the " +"object layers." +msgstr "와이프 타워가 가용성 지지체와 함께 작동 하려면 서포트 레이어를 오브젝트 레이어와 동기화 해야 합니다." + +#: src/libslic3r/Print.cpp:1309 +msgid "" +"The Wipe Tower currently supports the non-soluble supports only if they are printed with the current extruder " +"without triggering a tool change. (both support_material_extruder and support_material_interface_extruder " +"need to be set to 0)." +msgstr "" +"와이프 타워는 현재 공구 교체를 트리거하지 않고 현재의 압출기로 인쇄 하는 경우에만 비가용성 서포트를 지원 합니" +"다. (support_material_extruder과 support_material_interface_extruder 모두 0으로 설정 해야 합니다.)" + +#: src/libslic3r/Print.cpp:1316 +msgid "first_layer_height" +msgstr "first_layer_height" + +#: src/libslic3r/Print.cpp:1331 +msgid "First layer height can't be greater than nozzle diameter" +msgstr "첫번째 레이어 높이는 노즐 직경보다 클 수 없습니다" + +#: src/libslic3r/Print.cpp:1335 +msgid "Layer height can't be greater than nozzle diameter" +msgstr "레이어 높이는 노즐 직경보다 클 수 없습니다" + +#: src/libslic3r/SLAPrint.cpp:55 +msgid "Slicing model" +msgstr "슬라이싱 모델" + +#: src/libslic3r/SLAPrint.cpp:56 src/libslic3r/SLAPrint.cpp:801 +msgid "Generating support points" +msgstr "서포트 지점 생성" + +#: src/libslic3r/SLAPrint.cpp:57 +msgid "Generating support tree" +msgstr "서포트 트리 생성" + +#: src/libslic3r/SLAPrint.cpp:58 +msgid "Generating pad" +msgstr "패드 생성" + +#: src/libslic3r/SLAPrint.cpp:59 +msgid "Slicing supports" +msgstr "슬라이싱 서포트즈" + +#: src/libslic3r/SLAPrint.cpp:71 +msgid "Merging slices and calculating statistics" +msgstr "분할 영역 병합 및 통계 계산" + +#: src/libslic3r/SLAPrint.cpp:72 +msgid "Rasterizing layers" +msgstr "레이어 래스터화" + +#: src/libslic3r/SLAPrint.cpp:605 +msgid "Cannot proceed without support points! Add support points or disable support generation." +msgstr "" +"서포트 포인트 없이 진행할 수 없습니다! 서포트 지점을 추가 하거나 서포트 생성을 사용 하지 않도록 설정 합니다." + +#: src/libslic3r/SLAPrint.cpp:617 +msgid "Elevation is too low for object." +msgstr "객체 고도가 너무 낮습니다." + +#: src/libslic3r/SLAPrint.cpp:699 +msgid "Slicing had to be stopped due to an internal error." +msgstr "내부 오류로 인해 슬라이스를 중지 해야 했습니다." + +#: src/libslic3r/SLAPrint.cpp:849 src/libslic3r/SLAPrint.cpp:859 src/libslic3r/SLAPrint.cpp:907 +msgid "Visualizing supports" +msgstr "시각화 지원" + +#: src/libslic3r/SLAPrint.cpp:1449 +msgid "Slicing done" +msgstr "슬라이싱 완료" + +#: src/libslic3r/PrintBase.cpp:65 +msgid "Failed processing of the output_filename_format template." +msgstr "아래 output_filename_format 템플리트의 처리에 실패했습니다." + +#: src/libslic3r/PrintConfig.cpp:42 src/libslic3r/PrintConfig.cpp:43 +msgid "Printer technology" +msgstr "프린터 기술" + +#: src/libslic3r/PrintConfig.cpp:50 +msgid "Bed shape" +msgstr "배드 모양" + +#: src/libslic3r/PrintConfig.cpp:57 +msgid "" +"This setting controls the height (and thus the total number) of the slices/layers. Thinner layers give better " +"accuracy but take more time to print." +msgstr "" +"이 설정은 슬라이스/레이어의 높이(따라서 총 수)를 제어한다. 얇은 층은 더 나은 정확성을 제공하지만 인쇄하는 데" +"는 더 많은 시간이 걸린다." + +#: src/libslic3r/PrintConfig.cpp:64 +msgid "Max print height" +msgstr "최대 프린트 높이" + +#: src/libslic3r/PrintConfig.cpp:65 +msgid "Set this to the maximum height that can be reached by your extruder while printing." +msgstr "인쇄 중에 익스트루더가 도달 할 수있는 최대 높이로 설정하십시오." + +#: src/libslic3r/PrintConfig.cpp:71 +msgid "Slice gap closing radius" +msgstr "슬라이스 간격 닫힘 반경" + +#: src/libslic3r/PrintConfig.cpp:73 +msgid "" +"Cracks smaller than 2x gap closing radius are being filled during the triangle mesh slicing. The gap closing " +"operation may reduce the final print resolution, therefore it is advisable to keep the value reasonably low." +msgstr "" +"삼각형 메쉬 슬라이싱 중에, 2배 간격 폐쇄 반경 보다 작은 균열이 채워집니다. 틈 닫기 작업은 최종 인쇄 해상도를 " +"줄일 수 있으므로 값을 합리적으로 낮게 유지 하는 것이 좋습니다." + +#: src/libslic3r/PrintConfig.cpp:81 +msgid "Hostname, IP or URL" +msgstr "호스트 이름(Hostname), IP or URL" + +#: src/libslic3r/PrintConfig.cpp:82 +msgid "" +"Slic3r can upload G-code files to a printer host. This field should contain the hostname, IP address or URL " +"of the printer host instance." +msgstr "" +"Slic3r는 프린터 호스트에 G 코드 파일을 업로드할 수 있습니다. 이 필드는 호스트 이름, IP 주소 또는 프린터 호스" +"트 인스턴스의 URL을 포함 해야 합니다." + +#: src/libslic3r/PrintConfig.cpp:88 +msgid "API Key / Password" +msgstr "API 키/암호" + +#: src/libslic3r/PrintConfig.cpp:89 +msgid "" +"Slic3r can upload G-code files to a printer host. This field should contain the API Key or the password " +"required for authentication." +msgstr "" +"Slic3r는 프린터 호스트에 G 코드 파일을 업로드할 수 있습니다. 이 필드는 API 키 또는 인증에 필요한 암호를 포함 " +"해야 합니다." + +#: src/libslic3r/PrintConfig.cpp:111 +msgid "Avoid crossing perimeters" +msgstr "출력된 외측을 피하세요" + +#: src/libslic3r/PrintConfig.cpp:112 +msgid "" +"Optimize travel moves in order to minimize the crossing of perimeters. This is mostly useful with Bowden " +"extruders which suffer from oozing. This feature slows down both the print and the G-code generation." +msgstr "" +"둘레의 교차를 최소화하기 위해 여행 이동을 최적화하십시오. 이것은 보 잉 (Bowling) 압출기가 흘러 나오기 쉬운 경" +"우에 주로 유용합니다. 이 기능을 사용하면 인쇄 및 G 코드 생성 속도가 느려집니다." + +#: src/libslic3r/PrintConfig.cpp:119 src/libslic3r/PrintConfig.cpp:1976 +msgid "Other layers" +msgstr "다른 레이어" + +#: src/libslic3r/PrintConfig.cpp:120 +msgid "" +"Bed temperature for layers after the first one. Set this to zero to disable bed temperature control commands " +"in the output." +msgstr "" +"첫 번째 레이어 이후의 레이어 온도. 이 값을 0으로 설정하면 출력에서 ​​베드 온도 제어 명령을 비활성화합니다." + +#: src/libslic3r/PrintConfig.cpp:122 +msgid "Bed temperature" +msgstr "배드 온도" + +#: src/libslic3r/PrintConfig.cpp:129 +msgid "" +"This custom code is inserted at every layer change, right before the Z move. Note that you can use " +"placeholder variables for all Slic3r settings as well as [layer_num] and [layer_z]." +msgstr "" +"이 사용자 정의 코드는 Z 이동 직전의 모든 레이어 변경에 삽입됩니다. [Slide3r] 설정과 [layer_num] 및 [layer_z]" +"에 대한 자리 표시 자 변수를 사용할 수 있습니다." + +#: src/libslic3r/PrintConfig.cpp:139 +msgid "Between objects G-code" +msgstr "객체 간 G 코드" + +#: src/libslic3r/PrintConfig.cpp:140 +msgid "" +"This code is inserted between objects when using sequential printing. By default extruder and bed temperature " +"are reset using non-wait command; however if M104, M109, M140 or M190 are detected in this custom code, " +"Slic3r will not add temperature commands. Note that you can use placeholder variables for all Slic3r " +"settings, so you can put a \"M109 S[first_layer_temperature]\" command wherever you want." +msgstr "" +"이 코드는 순차 인쇄를 사용할 때 객체간에 삽입됩니다. 기본적으로 익스트루더 및 베드 온도는 대기 모드가 아닌 명" +"령을 사용하여 재설정됩니다. 그러나 이 사용자 코드에서 M104, M109, M140 또는 M190이 감지되면 Slic3r은 온도 명령" +"을 추가하지 않습니다. 모든 Slic3r 설정에 자리 표시 변수를 사용할 수 있으므로 원하는 위치에 \"M109 S " +"[first_layer_temperature]\"명령을 넣을 수 있습니다." + +#: src/libslic3r/PrintConfig.cpp:150 +msgid "Number of solid layers to generate on bottom surfaces." +msgstr "바닥면에 생성 할 솔리드 레이어의 수." + +#: src/libslic3r/PrintConfig.cpp:151 +msgid "Bottom solid layers" +msgstr "바닥 단일 레이어" + +#: src/libslic3r/PrintConfig.cpp:156 +msgid "Bridge" +msgstr "브리지" + +#: src/libslic3r/PrintConfig.cpp:157 +msgid "" +"This is the acceleration your printer will use for bridges. Set zero to disable acceleration control for " +"bridges." +msgstr "" +"이것은 프린터가 브릿지에 사용할 가속도입니다. 브리지의 가속 제어를 사용하지 않으려면 0으로 설정하십시오." + +#: src/libslic3r/PrintConfig.cpp:159 src/libslic3r/PrintConfig.cpp:302 src/libslic3r/PrintConfig.cpp:814 +#: src/libslic3r/PrintConfig.cpp:935 src/libslic3r/PrintConfig.cpp:1088 src/libslic3r/PrintConfig.cpp:1133 +#: src/libslic3r/PrintConfig.cpp:1144 src/libslic3r/PrintConfig.cpp:1333 +msgid "mm/s²" +msgstr "mm/s ²" + +#: src/libslic3r/PrintConfig.cpp:165 +msgid "Bridging angle" +msgstr "브릿지 각도" + +#: src/libslic3r/PrintConfig.cpp:167 +msgid "" +"Bridging angle override. If left to zero, the bridging angle will be calculated automatically. Otherwise the " +"provided angle will be used for all bridges. Use 180° for zero angle." +msgstr "" +"브리징 각도 오버라이드(override)값이. 왼쪽으로 0 일 경우 브리징 각도가 자동으로 계산됩니다. 그렇지 않으면 제공" +"된 각도가 모든 브리지에 사용됩니다. 각도 제로는 180 °를 사용하십시오." + +#: src/libslic3r/PrintConfig.cpp:170 src/libslic3r/PrintConfig.cpp:732 src/libslic3r/PrintConfig.cpp:1569 +#: src/libslic3r/PrintConfig.cpp:1579 src/libslic3r/PrintConfig.cpp:1807 src/libslic3r/PrintConfig.cpp:1961 +#: src/libslic3r/PrintConfig.cpp:2459 +msgid "°" +msgstr "°" + +#: src/libslic3r/PrintConfig.cpp:176 +msgid "Bridges fan speed" +msgstr "브릿지 팬 속도" + +#: src/libslic3r/PrintConfig.cpp:177 +msgid "This fan speed is enforced during all bridges and overhangs." +msgstr "이 팬 속도는 모든 브릿지 및 오버행 중에 적용됩니다." + +#: src/libslic3r/PrintConfig.cpp:178 src/libslic3r/PrintConfig.cpp:744 src/libslic3r/PrintConfig.cpp:1153 +#: src/libslic3r/PrintConfig.cpp:1216 src/libslic3r/PrintConfig.cpp:1461 src/libslic3r/PrintConfig.cpp:2258 +#: src/libslic3r/PrintConfig.cpp:2498 +msgid "%" +msgstr "%" + +#: src/libslic3r/PrintConfig.cpp:185 +msgid "Bridge flow ratio" +msgstr "브릿지 유량(flow)값" + +#: src/libslic3r/PrintConfig.cpp:187 +msgid "" +"This factor affects the amount of plastic for bridging. You can decrease it slightly to pull the extrudates " +"and prevent sagging, although default settings are usually good and you should experiment with cooling (use a " +"fan) before tweaking this." +msgstr "" +"이 요인은 브리징을위한 플라스틱의 양에 영향을 미칩니다. 압출 성형물을 잡아 당겨 처짐을 방지하기 위해 약간 줄" +"일 수 있지만 기본 설정은 일반적으로 좋지만이 문제를 해결하기 전에 냉각 (팬 사용)을 시도해야합니다." + +#: src/libslic3r/PrintConfig.cpp:197 +msgid "Bridges" +msgstr "브릿지(Bridges)" + +#: src/libslic3r/PrintConfig.cpp:199 +msgid "Speed for printing bridges." +msgstr "브릿지 인쇄 속도." + +#: src/libslic3r/PrintConfig.cpp:200 src/libslic3r/PrintConfig.cpp:576 src/libslic3r/PrintConfig.cpp:584 +#: src/libslic3r/PrintConfig.cpp:593 src/libslic3r/PrintConfig.cpp:601 src/libslic3r/PrintConfig.cpp:628 +#: src/libslic3r/PrintConfig.cpp:647 src/libslic3r/PrintConfig.cpp:873 src/libslic3r/PrintConfig.cpp:1000 +#: src/libslic3r/PrintConfig.cpp:1078 src/libslic3r/PrintConfig.cpp:1098 src/libslic3r/PrintConfig.cpp:1111 +#: src/libslic3r/PrintConfig.cpp:1122 src/libslic3r/PrintConfig.cpp:1175 src/libslic3r/PrintConfig.cpp:1234 +#: src/libslic3r/PrintConfig.cpp:1362 src/libslic3r/PrintConfig.cpp:1536 src/libslic3r/PrintConfig.cpp:1545 +#: src/libslic3r/PrintConfig.cpp:1940 src/libslic3r/PrintConfig.cpp:2051 +msgid "mm/s" +msgstr "mm/s" + +#: src/libslic3r/PrintConfig.cpp:207 +msgid "Brim width" +msgstr "브림 폭" + +#: src/libslic3r/PrintConfig.cpp:208 +msgid "Horizontal width of the brim that will be printed around each object on the first layer." +msgstr "첫 번째 레이어의 각 객체 주위에 인쇄 될 가장자리의 가로 폭입니다." + +#: src/libslic3r/PrintConfig.cpp:215 +msgid "Clip multi-part objects" +msgstr "여러 파트 오브젝트 클립" + +#: src/libslic3r/PrintConfig.cpp:216 +msgid "" +"When printing multi-material objects, this settings will make slic3r to clip the overlapping object parts one " +"by the other (2nd part will be clipped by the 1st, 3rd part will be clipped by the 1st and 2nd etc)." +msgstr "" +"멀티 메터리얼(multi-material) 개체를 인쇄 할 때이 설정을 사용하면 겹치는 개체 파트를 서로 겹쳐서 잘라낼 수 있" +"습니다 (두 번째 부분은 첫 번째 부분에서 클리핑되며 세 번째 부분은 첫 번째 및 두 번째 부분에서 잘립니다)." + +#: src/libslic3r/PrintConfig.cpp:223 +msgid "Colorprint height" +msgstr "컬러 인쇄 높이" + +#: src/libslic3r/PrintConfig.cpp:224 +msgid "Heights at which a filament change is to occur. " +msgstr "필라멘트 체인지가 발생 하는 높이. " + +#: src/libslic3r/PrintConfig.cpp:234 +msgid "Compatible printers condition" +msgstr "호환 가능한 프린터 조건" + +#: src/libslic3r/PrintConfig.cpp:235 +msgid "" +"A boolean expression using the configuration values of an active printer profile. If this expression " +"evaluates to true, this profile is considered compatible with the active printer profile." +msgstr "" +"활성 프린터 프로파일의 구성 값을 사용하는 부울 표현식. 이 표현식이 true로 평가되면이 프로필은 활성 프린터 프로" +"필과 호환되는 것으로 간주됩니다." + +#: src/libslic3r/PrintConfig.cpp:249 +msgid "Compatible print profiles condition" +msgstr "호환 되는 인쇄 프로 파일 조건" + +#: src/libslic3r/PrintConfig.cpp:250 +msgid "" +"A boolean expression using the configuration values of an active print profile. If this expression evaluates " +"to true, this profile is considered compatible with the active print profile." +msgstr "" +"활성 인쇄 프로 파일의 구성 값을 사용하는 부울식입니다. 이 식이 true로 평가 되면, 이 프로필이 활성 인쇄 프로필" +"과 호환 되는 것으로 간주 됩니다." + +#: src/libslic3r/PrintConfig.cpp:267 +msgid "Complete individual objects" +msgstr "개별 개체 완성" + +#: src/libslic3r/PrintConfig.cpp:268 +msgid "" +"When printing multiple objects or copies, this feature will complete each object before moving onto next one " +"(and starting it from its bottom layer). This feature is useful to avoid the risk of ruined prints. Slic3r " +"should warn and prevent you from extruder collisions, but beware." +msgstr "" +"여러 객체 또는 사본을 인쇄 할 때이 객체는 다음 객체로 이동하기 전에 각 객체를 완성합니다 (맨 아래 레이어에서 " +"시작). 이 기능은 인쇄물이 망가지는 위험을 피할 때 유용합니다. Slic3r은 압출기 충돌을 경고하고 예방해야하지만 " +"조심하십시오." + +#: src/libslic3r/PrintConfig.cpp:276 +msgid "Enable auto cooling" +msgstr "자동 냉각 사용" + +#: src/libslic3r/PrintConfig.cpp:277 +msgid "" +"This flag enables the automatic cooling logic that adjusts print speed and fan speed according to layer " +"printing time." +msgstr "이 플래그는 레이어 인쇄 시간에 따라 인쇄 속도와 팬 속도를 조정하는 자동 냉각 논리를 활성화합니다." + +#: src/libslic3r/PrintConfig.cpp:282 +msgid "Cooling tube position" +msgstr "냉각 튜브 위치" + +#: src/libslic3r/PrintConfig.cpp:283 +msgid "Distance of the center-point of the cooling tube from the extruder tip " +msgstr "압출기 팁에서 냉각 튜브의 중심점까지의 거리 " + +#: src/libslic3r/PrintConfig.cpp:290 +msgid "Cooling tube length" +msgstr "냉각 튜브 길이" + +#: src/libslic3r/PrintConfig.cpp:291 +msgid "Length of the cooling tube to limit space for cooling moves inside it " +msgstr "내부의 냉각 이동을 위해 공간을 제한하는 냉각 튜브의 길이 " + +#: src/libslic3r/PrintConfig.cpp:299 +msgid "" +"This is the acceleration your printer will be reset to after the role-specific acceleration values are used " +"(perimeter/infill). Set zero to prevent resetting acceleration at all." +msgstr "" +"역할 별 가속도 값이 사용 된 후에 프린터가 재설정되는 속도입니다 (둘레 / 충전). 가속을 전혀 재설정하지 않으려" +"면 0으로 설정하십시오." + +#: src/libslic3r/PrintConfig.cpp:308 +msgid "Default filament profile" +msgstr "기본 필라멘트 프로파일" + +#: src/libslic3r/PrintConfig.cpp:309 +msgid "" +"Default filament profile associated with the current printer profile. On selection of the current printer " +"profile, this filament profile will be activated." +msgstr "" +"현재 프린터 프로파일과 연관된 기본 필라멘트 프로파일. 현재 프린터 프로파일을 선택하면 이 필라멘트 프로파일이 " +"활성화됩니다." + +#: src/libslic3r/PrintConfig.cpp:315 +msgid "Default print profile" +msgstr "기본 인쇄 프로파일" + +#: src/libslic3r/PrintConfig.cpp:316 src/libslic3r/PrintConfig.cpp:2337 src/libslic3r/PrintConfig.cpp:2348 +msgid "" +"Default print profile associated with the current printer profile. On selection of the current printer " +"profile, this print profile will be activated." +msgstr "" +"현재 프린터 프로파일과 연관된 기본 인쇄 프로파일. 현재 프린터 프로파일을 선택하면이 인쇄 프로파일이 활성화됩니" +"다." + +#: src/libslic3r/PrintConfig.cpp:322 +msgid "Disable fan for the first" +msgstr "첫 번째 팬 사용 중지" + +#: src/libslic3r/PrintConfig.cpp:323 +msgid "" +"You can set this to a positive value to disable fan at all during the first layers, so that it does not make " +"adhesion worse." +msgstr "" +"이 값을 양수 값으로 설정하면 첫 번째 레이어에서 팬을 사용하지 않도록 설정하여 접착력을 악화시키지 않습니다." + +#: src/libslic3r/PrintConfig.cpp:325 src/libslic3r/PrintConfig.cpp:945 src/libslic3r/PrintConfig.cpp:1434 +#: src/libslic3r/PrintConfig.cpp:1619 src/libslic3r/PrintConfig.cpp:1680 src/libslic3r/PrintConfig.cpp:1843 +#: src/libslic3r/PrintConfig.cpp:1888 +msgid "layers" +msgstr "레이어" + +#: src/libslic3r/PrintConfig.cpp:332 +msgid "Don't support bridges" +msgstr "서포트와 브릿지를 사용하지 않음" + +#: src/libslic3r/PrintConfig.cpp:334 +msgid "Experimental option for preventing support material from being generated under bridged areas." +msgstr "브릿지 영역 아래에 서포팅 재료가 생성되는 것을 방지하기위한 실험적 옵션." + +#: src/libslic3r/PrintConfig.cpp:340 +msgid "Distance between copies" +msgstr "복사본 간 거리" + +#: src/libslic3r/PrintConfig.cpp:341 +msgid "Distance used for the auto-arrange feature of the plater." +msgstr "플래터(plater)의 자동 정렬 기능에 사용되는 거리입니다." + +#: src/libslic3r/PrintConfig.cpp:348 +msgid "Elephant foot compensation" +msgstr "코끼리 발(Elephant foot) 보상값" + +#: src/libslic3r/PrintConfig.cpp:350 +msgid "" +"The first layer will be shrunk in the XY plane by the configured value to compensate for the 1st layer squish " +"aka an Elephant Foot effect." +msgstr "" +"첫 번째 레이어는 구성 요소 값에 따라 XY 평면에서 수축되어 일층 스 퀴시 코끼리발(Elephant Foot) 효과를 보완합니" +"다." + +#: src/libslic3r/PrintConfig.cpp:359 +msgid "" +"This end procedure is inserted at the end of the output file. Note that you can use placeholder variables for " +"all Slic3r settings." +msgstr "" +"이 종료 절차는 출력 파일의 끝에 삽입된다. 모든 Slic3r 설정에 자리 표시자 변수를 사용할 수 있다는 점에 유의하십" +"시오." + +#: src/libslic3r/PrintConfig.cpp:369 +msgid "" +"This end procedure is inserted at the end of the output file, before the printer end gcode. Note that you can " +"use placeholder variables for all Slic3r settings. If you have multiple extruders, the gcode is processed in " +"extruder order." +msgstr "" +"이 종료 절차는 출력 파일의 끝에 프린터 끝 코드 앞에 삽입된다. 모든 Slic3r 설정에 자리 표시자 변수를 사용할 수 " +"있다는 점에 유의하십시오. 여러 개의 압출부가 있는 경우, 그 코드는 압출 순서대로 처리된다." + +#: src/libslic3r/PrintConfig.cpp:379 +msgid "Ensure vertical shell thickness" +msgstr "수직 쉘(shell) 두께 확인" + +#: src/libslic3r/PrintConfig.cpp:381 +msgid "" +"Add solid infill near sloping surfaces to guarantee the vertical shell thickness (top+bottom solid layers)." +msgstr "경사 표면 근처에 솔리드 인필을 추가하여 수직 셸 두께(상단+하단 솔리드 레이어)를 보장하십시오." + +#: src/libslic3r/PrintConfig.cpp:387 +msgid "Top fill pattern" +msgstr "상단 채우기 패턴" + +#: src/libslic3r/PrintConfig.cpp:389 +msgid "Fill pattern for top infill. This only affects the top visible layer, and not its adjacent solid shells." +msgstr "상단 채우기의 채우기 패턴. 이는 인접 한 솔리드 쉘이 아니라 보이는 상위 레이어에만 영향을 줍니다." + +#: src/libslic3r/PrintConfig.cpp:397 src/libslic3r/PrintConfig.cpp:795 src/libslic3r/PrintConfig.cpp:1921 +msgid "Rectilinear" +msgstr "직선면(Rectilinear)" + +#: src/libslic3r/PrintConfig.cpp:398 src/libslic3r/PrintConfig.cpp:801 +msgid "Concentric" +msgstr "동심원(Concentric)" + +#: src/libslic3r/PrintConfig.cpp:399 src/libslic3r/PrintConfig.cpp:805 +msgid "Hilbert Curve" +msgstr "힐버트 곡선(Hilbert Curve)" + +#: src/libslic3r/PrintConfig.cpp:400 src/libslic3r/PrintConfig.cpp:806 +msgid "Archimedean Chords" +msgstr "아르키메데우스(Archimedean Chords)" + +#: src/libslic3r/PrintConfig.cpp:401 src/libslic3r/PrintConfig.cpp:807 +msgid "Octagram Spiral" +msgstr "옥타그램 나선(Octagram Spiral)" + +#: src/libslic3r/PrintConfig.cpp:408 +msgid "Bottom fill pattern" +msgstr "아래쪽 채우기 패턴" + +#: src/libslic3r/PrintConfig.cpp:409 +msgid "" +"Fill pattern for bottom infill. This only affects the bottom external visible layer, and not its adjacent " +"solid shells." +msgstr "" +"하단 채우기의 채우기 패턴. 이는 인접 한 솔리드 쉘이 아니라 아래쪽에 보이는 외부 레이어에만 영향을 줍니다." + +#: src/libslic3r/PrintConfig.cpp:414 src/libslic3r/PrintConfig.cpp:424 +msgid "External perimeters" +msgstr "외측 둘레" + +#: src/libslic3r/PrintConfig.cpp:416 +msgid "" +"Set this to a non-zero value to set a manual extrusion width for external perimeters. If left zero, default " +"extrusion width will be used if set, otherwise 1.125 x nozzle diameter will be used. If expressed as " +"percentage (for example 200%), it will be computed over layer height." +msgstr "" +"외부 경계에 대한 수동 압출 폭을 설정하려면 이 값을 0이 아닌 값으로 설정하십시오. 0인 경우 기본 압출 너비가 사" +"용되며, 그렇지 않으면 1.125 x 노즐 직경이 사용된다. 백분율(예: 200%)로 표현되는 경우, 레이어 높이에 걸쳐 계산" +"된다." + +#: src/libslic3r/PrintConfig.cpp:419 src/libslic3r/PrintConfig.cpp:834 src/libslic3r/PrintConfig.cpp:966 +#: src/libslic3r/PrintConfig.cpp:1353 src/libslic3r/PrintConfig.cpp:1691 src/libslic3r/PrintConfig.cpp:1864 +#: src/libslic3r/PrintConfig.cpp:2022 +msgid "mm or % (leave 0 for default)" +msgstr "mm 또는 %(기본값의 경우 0으로 유지)" + +#: src/libslic3r/PrintConfig.cpp:426 +msgid "" +"This separate setting will affect the speed of external perimeters (the visible ones). If expressed as " +"percentage (for example: 80%) it will be calculated on the perimeters speed setting above. Set to zero for " +"auto." +msgstr "" +"이 별도의 설정은 외부 경계선(시각적 경계선)의 속도에 영향을 미친다. 백분율(예: 80%)로 표현되는 경우 위의 " +"Perimeter 속도 설정에 따라 계산된다. 자동을 위해 0으로 설정한다." + +#: src/libslic3r/PrintConfig.cpp:429 src/libslic3r/PrintConfig.cpp:855 src/libslic3r/PrintConfig.cpp:1650 +#: src/libslic3r/PrintConfig.cpp:1701 src/libslic3r/PrintConfig.cpp:1907 src/libslic3r/PrintConfig.cpp:2034 +msgid "mm/s or %" +msgstr "mm/s 또는 %" + +#: src/libslic3r/PrintConfig.cpp:436 +msgid "External perimeters first" +msgstr "외부 경계선 먼저" + +#: src/libslic3r/PrintConfig.cpp:438 +msgid "" +"Print contour perimeters from the outermost one to the innermost one instead of the default inverse order." +msgstr "" +"기본 역순 대신 가장 바깥쪽부터 가장 안쪽까지 윤곽선을 인쇄하십시오. 타겟 TTS복사하기번역 저장번역 저장번역 수" +"정." + +#: src/libslic3r/PrintConfig.cpp:444 +msgid "Extra perimeters if needed" +msgstr "필요한 경우 추가 둘레" + +#: src/libslic3r/PrintConfig.cpp:446 +#, no-c-format +msgid "" +"Add more perimeters when needed for avoiding gaps in sloping walls. Slic3r keeps adding perimeters, until " +"more than 70% of the loop immediately above is supported." +msgstr "" +"경사 벽의 틈을 피하기 위해 필요한 경우 더 많은 perimeter를 추가하십시오. 위의 루프의 70% 이상이 지지될 때까지 " +"Slic3r는 계속해서 perimeter를 추가한다." + +#: src/libslic3r/PrintConfig.cpp:456 +msgid "" +"The extruder to use (unless more specific extruder settings are specified). This value overrides perimeter " +"and infill extruders, but not the support extruders." +msgstr "" +"사용할 압출부(더 구체적인 압출부 설정이 지정되지 않은 경우) 이 값은 경계 및 압출부를 초과하지만 지원 압출자를 " +"주입하지는 않는다." + +#: src/libslic3r/PrintConfig.cpp:468 +msgid "" +"Set this to the vertical distance between your nozzle tip and (usually) the X carriage rods. In other words, " +"this is the height of the clearance cylinder around your extruder, and it represents the maximum depth the " +"extruder can peek before colliding with other printed objects." +msgstr "" +"이것을 노즐 팁과 (일반적으로) X 캐리지 로드 사이의 수직 거리로 설정하십시오. 다시 말하면, 이것은 당신의 압출" +"기 주위의 틈새 실린더의 높이이며, 그것은 다른 인쇄된 물체와 충돌하기 전에 압출기가 엿볼 수 있는 최대 깊이를 나" +"타낸다." + +#: src/libslic3r/PrintConfig.cpp:478 +msgid "Radius" +msgstr "반지름" + +#: src/libslic3r/PrintConfig.cpp:479 +msgid "" +"Set this to the clearance radius around your extruder. If the extruder is not centered, choose the largest " +"value for safety. This setting is used to check for collisions and to display the graphical preview in the " +"plater." +msgstr "" +"이것을 당신의 압출기 주변의 간극 반경으로 설정하시오. 압출부가 중앙에 있지 않으면 안전을 위해 가장 큰 값을 선" +"택하십시오. 이 설정은 충돌 여부를 확인하고 플래터에 그래픽 미리 보기를 표시하기 위해 사용된다." + +#: src/libslic3r/PrintConfig.cpp:489 +msgid "Extruder Color" +msgstr "익스트루더 컬러" + +#: src/libslic3r/PrintConfig.cpp:490 src/libslic3r/PrintConfig.cpp:550 +msgid "This is only used in the Slic3r interface as a visual help." +msgstr "이것은 시각적 도움말로 Slic3r 인터페이스에서만 사용된다." + +#: src/libslic3r/PrintConfig.cpp:496 +msgid "Extruder offset" +msgstr "익스트루더 오프셋" + +#: src/libslic3r/PrintConfig.cpp:497 +msgid "" +"If your firmware doesn't handle the extruder displacement you need the G-code to take it into account. This " +"option lets you specify the displacement of each extruder with respect to the first one. It expects positive " +"coordinates (they will be subtracted from the XY coordinate)." +msgstr "" +"펌웨어가 압출기 위치 변경을 처리하지 못하면 G 코드를 고려해야합니다. 이 옵션을 사용하면 첫 번째 것에 대한 각 " +"압출기의 변위를 지정할 수 있습니다. 양의 좌표가 필요합니다 (XY 좌표에서 뺍니다)." + +#: src/libslic3r/PrintConfig.cpp:506 +msgid "Extrusion axis" +msgstr "압출 축" + +#: src/libslic3r/PrintConfig.cpp:507 +msgid "" +"Use this option to set the axis letter associated to your printer's extruder (usually E but some printers use " +"A)." +msgstr "" +"이 옵션을 사용하여 프린터의 압출기에 연결된 축 문자를 설정합니다 (보통 E이지만 일부 프린터는 A를 사용합니다)." + +#: src/libslic3r/PrintConfig.cpp:512 +msgid "Extrusion multiplier" +msgstr "압출 승수" + +#: src/libslic3r/PrintConfig.cpp:513 +msgid "" +"This factor changes the amount of flow proportionally. You may need to tweak this setting to get nice surface " +"finish and correct single wall widths. Usual values are between 0.9 and 1.1. If you think you need to change " +"this more, check filament diameter and your firmware E steps." +msgstr "" +"이 요소는 비례하여 유량의 양을 변경합니다. 멋진 서페이스 마무리와 단일 벽 너비를 얻기 위해이 설정을 조정해야 " +"할 수도 있습니다. 일반적인 값은 0.9와 1.1 사이입니다. 이 값을 더 변경해야한다고 판단되면 필라멘트 직경과 펌웨" +"어 E 단계를 확인하십시오." + +#: src/libslic3r/PrintConfig.cpp:521 +msgid "Default extrusion width" +msgstr "기본 압출 폭" + +#: src/libslic3r/PrintConfig.cpp:523 +msgid "" +"Set this to a non-zero value to allow a manual extrusion width. If left to zero, Slic3r derives extrusion " +"widths from the nozzle diameter (see the tooltips for perimeter extrusion width, infill extrusion width etc). " +"If expressed as percentage (for example: 230%), it will be computed over layer height." +msgstr "" +"수동 압출 폭을 허용하려면이 값을 0이 아닌 값으로 설정하십시오. 0으로 남겨두면 Slic3r은 노즐 직경에서 압출 폭" +"을 도출합니다 (주변 압출 폭, 성형 압출 폭 등의 툴팁 참조). 백분율로 표시되는 경우 (예 : 230 %) 레이어 높이를 " +"기준으로 계산됩니다." + +#: src/libslic3r/PrintConfig.cpp:527 +msgid "mm or % (leave 0 for auto)" +msgstr "mm 또는 % (자동으로 0을 유지)" + +#: src/libslic3r/PrintConfig.cpp:532 +msgid "Keep fan always on" +msgstr "항상 팬 켜기" + +#: src/libslic3r/PrintConfig.cpp:533 +msgid "" +"If this is enabled, fan will never be disabled and will be kept running at least at its minimum speed. Useful " +"for PLA, harmful for ABS." +msgstr "" +"이 기능을 사용하면 팬이 비활성화되지 않으며 최소한 최소 속도로 계속 회전합니다. PLA에 유용하며 ABS에 해롭다." + +#: src/libslic3r/PrintConfig.cpp:538 +msgid "Enable fan if layer print time is below" +msgstr "레이어 인쇄 시간이 미만인 경우 팬 활성화" + +#: src/libslic3r/PrintConfig.cpp:539 +msgid "" +"If layer print time is estimated below this number of seconds, fan will be enabled and its speed will be " +"calculated by interpolating the minimum and maximum speeds." +msgstr "" +"레이어 인쇄 시간이이 초 미만으로 예상되는 경우 팬이 활성화되고 속도는 최소 및 최대 속도를 보간하여 계산됩니다." + +#: src/libslic3r/PrintConfig.cpp:541 src/libslic3r/PrintConfig.cpp:1637 +msgid "approximate seconds" +msgstr "근사치 초" + +#: src/libslic3r/PrintConfig.cpp:549 +msgid "Color" +msgstr "색상" + +#: src/libslic3r/PrintConfig.cpp:555 +msgid "Filament notes" +msgstr "필라멘트 메모" + +#: src/libslic3r/PrintConfig.cpp:556 +msgid "You can put your notes regarding the filament here." +msgstr "여기에 필라멘트에 관한 메모를 넣을 수 있다." + +#: src/libslic3r/PrintConfig.cpp:564 src/libslic3r/PrintConfig.cpp:1181 +msgid "Max volumetric speed" +msgstr "최대 체적 속도" + +#: src/libslic3r/PrintConfig.cpp:565 +msgid "" +"Maximum volumetric speed allowed for this filament. Limits the maximum volumetric speed of a print to the " +"minimum of print and filament volumetric speed. Set to zero for no limit." +msgstr "" +"이 필라멘트에 허용되는 최대 체적 속도. 인쇄물의 최대 체적 속도를 인쇄 및 필라멘트 체적 속도 최소로 제한한다. " +"제한 없음에 대해 0으로 설정하십시오." + +#: src/libslic3r/PrintConfig.cpp:568 src/libslic3r/PrintConfig.cpp:1184 +msgid "mm³/s" +msgstr "밀리미터 ³/s" + +#: src/libslic3r/PrintConfig.cpp:574 +msgid "Loading speed" +msgstr "로딩 속도" + +#: src/libslic3r/PrintConfig.cpp:575 +msgid "Speed used for loading the filament on the wipe tower. " +msgstr "와이퍼 탑(wipe)에 필라멘트를 장착하는 데 사용되는 속도. " + +#: src/libslic3r/PrintConfig.cpp:582 +msgid "Loading speed at the start" +msgstr "시작시 로딩 속도" + +#: src/libslic3r/PrintConfig.cpp:583 +msgid "Speed used at the very beginning of loading phase. " +msgstr "로딩 단계의 시작에 사용 되는 속도. " + +#: src/libslic3r/PrintConfig.cpp:590 +msgid "Unloading speed" +msgstr "언로딩 스피드" + +#: src/libslic3r/PrintConfig.cpp:591 +msgid "" +"Speed used for unloading the filament on the wipe tower (does not affect initial part of unloading just " +"after ramming). " +msgstr "" +"와이퍼 타워에서 필라멘트를 언로드하는 데 사용되는 속도(램핑 후 바로 언로딩의 초기 부분에는 영향을 주지 않음). " + +#: src/libslic3r/PrintConfig.cpp:599 +msgid "Unloading speed at the start" +msgstr "시작 시 언로드 속도" + +#: src/libslic3r/PrintConfig.cpp:600 +msgid "Speed used for unloading the tip of the filament immediately after ramming. " +msgstr "속도는 레밍 직후 필라멘트의 팁을 언로딩 하는 데 사용 됩니다. " + +#: src/libslic3r/PrintConfig.cpp:607 +msgid "Delay after unloading" +msgstr "언로드 후 딜레이" + +#: src/libslic3r/PrintConfig.cpp:608 +msgid "" +"Time to wait after the filament is unloaded. May help to get reliable toolchanges with flexible materials " +"that may need more time to shrink to original dimensions. " +msgstr "" +"필라멘트를 내린 후 기다리는 시간. 원래 치수로 축소하는 데 더 많은 시간이 필요할 수있는 유연한 재료로 신뢰할 수" +"있는 공구 교환을 얻을 수 있습니다. " + +#: src/libslic3r/PrintConfig.cpp:617 +msgid "Number of cooling moves" +msgstr "쿨링 이동 숫자" + +#: src/libslic3r/PrintConfig.cpp:618 +msgid "" +"Filament is cooled by being moved back and forth in the cooling tubes. Specify desired number of these moves " +msgstr "필라멘트는 냉각 튜브에서 앞뒤로 움직여 냉각됩니다. 원하는 이동 숫자 지정 " + +#: src/libslic3r/PrintConfig.cpp:626 +msgid "Speed of the first cooling move" +msgstr "첫 번째 냉각 이동 속도" + +#: src/libslic3r/PrintConfig.cpp:627 +msgid "Cooling moves are gradually accelerating beginning at this speed. " +msgstr "냉각 속도가 서서히 빨라지고 있습니다. " + +#: src/libslic3r/PrintConfig.cpp:634 +msgid "Minimal purge on wipe tower" +msgstr "와이프(wipe) 탑의 최소 퍼지" + +#: src/libslic3r/PrintConfig.cpp:635 +msgid "" +"After a tool change, the exact position of the newly loaded filament inside the nozzle may not be known, and " +"the filament pressure is likely not yet stable. Before purging the print head into an infill or a sacrificial " +"object, Slic3r will always prime this amount of material into the wipe tower to produce successive infill or " +"sacrificial object extrusions reliably." +msgstr "" +"공구가 변경 된 후 노즐 내부에 새로 로드 된 필라멘트의 정확한 위치를 알 수 없으며, 필라멘트 압력이 아직 안정적" +"이지 않을 수 있습니다. 프린트 헤드를 인필 또는 희생(sacrificial) 객체로 소거 하기 전에 Slic3r는 항상이 양의 재" +"료를 와이프 탑에 넣어 연속적인 채우기 또는 희생(sacrificial) 객체 돌출을 안정적으로 생성 합니다." + +#: src/libslic3r/PrintConfig.cpp:639 +msgid "mm³" +msgstr "mm ³" + +#: src/libslic3r/PrintConfig.cpp:645 +msgid "Speed of the last cooling move" +msgstr "마지막 냉각 이동 속도" + +#: src/libslic3r/PrintConfig.cpp:646 +msgid "Cooling moves are gradually accelerating towards this speed. " +msgstr "냉각은 이 속도쪽으로 점차 가속화되고 있습니다. " + +#: src/libslic3r/PrintConfig.cpp:653 +msgid "Filament load time" +msgstr "필라멘트 로드 시간" + +#: src/libslic3r/PrintConfig.cpp:654 +msgid "" +"Time for the printer firmware (or the Multi Material Unit 2.0) to load a new filament during a tool change " +"(when executing the T code). This time is added to the total print time by the G-code time estimator." +msgstr "" +"프린터 펌웨어 (또는 MMU 2.0)가 공구를 변경하는 동안(T 코드를 실행할 때) 새필라멘트를 로드하는 시간입니다. 이 " +"시간은 G 코드 시간 추정기에 의해 총 인쇄 시간에 추가 됩니다." + +#: src/libslic3r/PrintConfig.cpp:661 +msgid "Ramming parameters" +msgstr "래밍 파라미터" + +#: src/libslic3r/PrintConfig.cpp:662 +msgid "This string is edited by RammingDialog and contains ramming specific parameters " +msgstr "이 문자열은 RammingDialog에 의해 편집되고 램밍 특정 매개 변수를 포함합니다 " + +#: src/libslic3r/PrintConfig.cpp:668 +msgid "Filament unload time" +msgstr "필라멘트 언로드 시간" + +#: src/libslic3r/PrintConfig.cpp:669 +msgid "" +"Time for the printer firmware (or the Multi Material Unit 2.0) to unload a filament during a tool change " +"(when executing the T code). This time is added to the total print time by the G-code time estimator." +msgstr "" +"프린터 펌웨어 (또는 MMU2.0)가 공구 교환 중에 필라멘트를 언로드하기 위한 시간입니다 (T 코드를 실행할 때). 이 시" +"간은 G 코드 시간추정기에 의해 총 인쇄 시간에 추가 됩니다." + +#: src/libslic3r/PrintConfig.cpp:677 +msgid "" +"Enter your filament diameter here. Good precision is required, so use a caliper and do multiple measurements " +"along the filament, then compute the average." +msgstr "" +"여기에 필라멘트 직경을 입력하십시오. 정밀도가 필요하므로 캘리퍼를 사용하여 필라멘트를 따라 여러 번 측정 한 다" +"음 평균을 계산하십시오." + +#: src/libslic3r/PrintConfig.cpp:684 +msgid "Density" +msgstr "밀도" + +#: src/libslic3r/PrintConfig.cpp:685 +msgid "" +"Enter your filament density here. This is only for statistical information. A decent way is to weigh a known " +"length of filament and compute the ratio of the length to volume. Better is to calculate the volume directly " +"through displacement." +msgstr "" +"여기서 필라멘트 밀도를 입력하십시오. 이것은 통계 정보 용입니다. 괜찮은 방법은 알려진 길이의 필라멘트의 무게를 " +"측정하고 길이와 볼륨의 비율을 계산하는 것입니다. 변위를 통해 직접적으로 부피를 계산하는 것이 더 좋습니다." + +#: src/libslic3r/PrintConfig.cpp:688 +msgid "g/cm³" +msgstr "g/cm³" + +#: src/libslic3r/PrintConfig.cpp:693 +msgid "Filament type" +msgstr "필라멘트 타입" + +#: src/libslic3r/PrintConfig.cpp:694 +msgid "The filament material type for use in custom G-codes." +msgstr "사용자 지정 G 코드에 사용할 필라멘트재료 유형입니다." + +#: src/libslic3r/PrintConfig.cpp:710 +msgid "Soluble material" +msgstr "수용성 재료" + +#: src/libslic3r/PrintConfig.cpp:711 +msgid "Soluble material is most likely used for a soluble support." +msgstr "수용성 재료눈 물에 녹는 서포트에 가장 많이 사용된다." + +#: src/libslic3r/PrintConfig.cpp:717 +msgid "Enter your filament cost per kg here. This is only for statistical information." +msgstr "필라멘트(kg당) 비용을 여기에 입력하십시오. 통계를 내기 위해서 입니다." + +#: src/libslic3r/PrintConfig.cpp:718 +msgid "money/kg" +msgstr "원(\\)/kg" + +#: src/libslic3r/PrintConfig.cpp:727 +msgid "Fill angle" +msgstr "채움 각도" + +#: src/libslic3r/PrintConfig.cpp:729 +msgid "" +"Default base angle for infill orientation. Cross-hatching will be applied to this. Bridges will be infilled " +"using the best direction Slic3r can detect, so this setting does not affect them." +msgstr "" +"본 오리엔테이션 방향의 기본 각도입니다. 해칭이 적용될 것입니다. Slic3r이 감지 할 수있는 최상의 방향을 사용하" +"여 브릿징이 채워지므로이 설정은 영향을 미치지 않습니다." + +#: src/libslic3r/PrintConfig.cpp:741 +msgid "Fill density" +msgstr "채우기(fill) 밀도" + +#: src/libslic3r/PrintConfig.cpp:743 +msgid "Density of internal infill, expressed in the range 0% - 100%." +msgstr "0 % - 100 % 범위로 표현 된 내부 채움(infill)의 밀도." + +#: src/libslic3r/PrintConfig.cpp:778 +msgid "Fill pattern" +msgstr "채우기(fill) 패턴" + +#: src/libslic3r/PrintConfig.cpp:780 +msgid "Fill pattern for general low-density infill." +msgstr "일반 낮은 밀도 채움의 패턴." + +#: src/libslic3r/PrintConfig.cpp:796 +msgid "Grid" +msgstr "그리드(Grid)" + +#: src/libslic3r/PrintConfig.cpp:797 +msgid "Triangles" +msgstr "삼각형(Triangles)" + +#: src/libslic3r/PrintConfig.cpp:798 +msgid "Stars" +msgstr "별(Stars)" + +#: src/libslic3r/PrintConfig.cpp:799 +msgid "Cubic" +msgstr "큐빅" + +#: src/libslic3r/PrintConfig.cpp:800 +msgid "Line" +msgstr "선(Line)" + +#: src/libslic3r/PrintConfig.cpp:802 src/libslic3r/PrintConfig.cpp:1923 +msgid "Honeycomb" +msgstr "벌집" + +#: src/libslic3r/PrintConfig.cpp:803 +msgid "3D Honeycomb" +msgstr "3D 벌집" + +#: src/libslic3r/PrintConfig.cpp:804 +msgid "Gyroid" +msgstr "자이로이드(Gyroid)" + +#: src/libslic3r/PrintConfig.cpp:811 src/libslic3r/PrintConfig.cpp:820 src/libslic3r/PrintConfig.cpp:828 +#: src/libslic3r/PrintConfig.cpp:861 +msgid "First layer" +msgstr "첫 레이어" + +#: src/libslic3r/PrintConfig.cpp:812 +msgid "" +"This is the acceleration your printer will use for first layer. Set zero to disable acceleration control for " +"first layer." +msgstr "" +"이것은 프린터가 첫 번째 레이어에 사용할 가속도입니다. 0을 설정하면 첫 번째 레이어에 대한 가속 제어가 사용되지 " +"않습니다." + +#: src/libslic3r/PrintConfig.cpp:821 +msgid "" +"Heated build plate temperature for the first layer. Set this to zero to disable bed temperature control " +"commands in the output." +msgstr "" +"첫 번째 레이어에 대한 빌드 플레이트 온도를 가열. 이 값을 0으로 설정하면 출력에서 ​​베드 온도 제어 명령을 비활성" +"화합니다." + +#: src/libslic3r/PrintConfig.cpp:830 +msgid "" +"Set this to a non-zero value to set a manual extrusion width for first layer. You can use this to force " +"fatter extrudates for better adhesion. If expressed as percentage (for example 120%) it will be computed over " +"first layer height. If set to zero, it will use the default extrusion width." +msgstr "" +"첫 번째 레이어의 수동 압출 폭을 설정하려면이 값을 0이 아닌 값으로 설정합니다. 이 방법을 사용하면보다 우수한 접" +"착력을 위해 더 두꺼운 압출 성형물을 만들 수 있습니다. 백분율 (예 : 120 %)로 표현하면 첫 번째 레이어 높이를 기" +"준으로 계산됩니다. 0으로 설정하면 기본 압출 폭이 사용됩니다." + +#: src/libslic3r/PrintConfig.cpp:840 +msgid "First layer height" +msgstr "첫 레이어 높이" + +#: src/libslic3r/PrintConfig.cpp:842 +msgid "" +"When printing with very low layer heights, you might still want to print a thicker bottom layer to improve " +"adhesion and tolerance for non perfect build plates. This can be expressed as an absolute value or as a " +"percentage (for example: 150%) over the default layer height." +msgstr "" +"매우 낮은 층의 높이로 인쇄할 때, 당신은 여전히 완벽하지 않은 빌드 플레이트의 부착력과 허용오차를 개선하기 위" +"해 더 두꺼운 바닥 층을 인쇄하기를 원할 수 있다. 이것은 절대값 또는 기본 계층 높이에 대한 백분율(예: 150%)로 표" +"시할 수 있다." + +#: src/libslic3r/PrintConfig.cpp:846 src/libslic3r/PrintConfig.cpp:991 src/libslic3r/PrintConfig.cpp:1796 +msgid "mm or %" +msgstr "mm/s 또는 %" + +#: src/libslic3r/PrintConfig.cpp:851 +msgid "First layer speed" +msgstr "첫 레이어 속도" + +#: src/libslic3r/PrintConfig.cpp:852 +msgid "" +"If expressed as absolute value in mm/s, this speed will be applied to all the print moves of the first layer, " +"regardless of their type. If expressed as a percentage (for example: 40%) it will scale the default speeds." +msgstr "" +"절대값(mm/s)으로 표현되는 경우, 이 속도는 유형에 관계없이 첫 번째 층의 모든 인쇄 이동에 적용된다. 백분율(예: " +"40%)로 표현되는 경우 기본 속도를 스케일링한다." + +#: src/libslic3r/PrintConfig.cpp:862 +msgid "" +"Extruder temperature for first layer. If you want to control temperature manually during print, set this to " +"zero to disable temperature control commands in the output file." +msgstr "" +"첫 번째 층의 외부 온도. 인쇄 중에 온도를 수동으로 제어하려면 출력 파일에서 온도 제어 명령을 사용하지 않으려면 " +"이 값을 0으로 설정하십시오." + +#: src/libslic3r/PrintConfig.cpp:871 +msgid "" +"Speed for filling small gaps using short zigzag moves. Keep this reasonably low to avoid too much shaking and " +"resonance issues. Set zero to disable gaps filling." +msgstr "" +"짧은 지그재그로 작은 틈을 메우기 위한 속도. 너무 많은 진동과 공진 문제를 피하기 위해 이것을 합리적으로 낮게 유" +"지한다. 간격 채우기를 사용하지 않으려면 0을 설정하십시오." + +#: src/libslic3r/PrintConfig.cpp:879 +msgid "Verbose G-code" +msgstr "세부 G-코드" + +#: src/libslic3r/PrintConfig.cpp:880 +msgid "" +"Enable this to get a commented G-code file, with each line explained by a descriptive text. If you print from " +"SD card, the additional weight of the file could make your firmware slow down." +msgstr "" +"설명 텍스트로 설명되는 각 행과 함께 코멘트된 G-code 파일을 가져오려면 이 옵션을 선택하십시오. 만일 당신이 SD카" +"드로 인쇄한다면, 파일의 추가 무게로 인해 펌웨어의 속도가 느려질 수 있다." + +#: src/libslic3r/PrintConfig.cpp:887 +msgid "G-code flavor" +msgstr "G-code 형식" + +#: src/libslic3r/PrintConfig.cpp:888 +msgid "" +"Some G/M-code commands, including temperature control and others, are not universal. Set this option to your " +"printer's firmware to get a compatible output. The \"No extrusion\" flavor prevents Slic3r from exporting any " +"extrusion value at all." +msgstr "" +"온도 조절 등을 포함한 일부 G/M-코드 명령은 보편적이지 않다. 호환되는 출력을 얻으려면 이 옵션을 프린터의 펌웨어" +"로 설정하십시오. \"압출 없음\" 형식은 Slic3r가 어떠한 압출 값도 출력하지 못하게 한다." + +#: src/libslic3r/PrintConfig.cpp:911 +msgid "No extrusion" +msgstr "압출 없음" + +#: src/libslic3r/PrintConfig.cpp:918 +msgid "Label objects" +msgstr "레이블 개체" + +#: src/libslic3r/PrintConfig.cpp:924 +msgid "High extruder current on filament swap" +msgstr "필라멘트스왑에 높은 압출 기 전류" + +#: src/libslic3r/PrintConfig.cpp:925 +msgid "" +"It may be beneficial to increase the extruder motor current during the filament exchange sequence to allow " +"for rapid ramming feed rates and to overcome resistance when loading a filament with an ugly shaped tip." +msgstr "" +"필라멘트 교환 동안 압출기 모터 전류를 증가 시키는 것이 유리할 수 있으며, 이는 빠른 래밍 공급 속도를 가능 하게" +"하고, 불규칙한 모양의 필라멘트를 로딩할때 저항을 극복하기 위한것이다." + +#: src/libslic3r/PrintConfig.cpp:933 +msgid "" +"This is the acceleration your printer will use for infill. Set zero to disable acceleration control for " +"infill." +msgstr "이것은 당신 프린터의 채움 가속력이다. 주입에 대한 가속 제어를 비활성화하려면 0을 설정하십시오." + +#: src/libslic3r/PrintConfig.cpp:941 +msgid "Combine infill every" +msgstr "다음 시간마다 결합" + +#: src/libslic3r/PrintConfig.cpp:943 +msgid "" +"This feature allows to combine infill and speed up your print by extruding thicker infill layers while " +"preserving thin perimeters, thus accuracy." +msgstr "" +"이 기능은 인필을 결합하고 얇은 주변기기를 보존하면서 두꺼운 인필 층을 압출하여 인쇄 속도를 높일 수 있도록 하" +"여 정확도를 높인다." + +#: src/libslic3r/PrintConfig.cpp:946 +msgid "Combine infill every n layers" +msgstr "모든 n개 층을 채우기 위해 결합" + +#: src/libslic3r/PrintConfig.cpp:952 +msgid "Infill extruder" +msgstr "채움(Infill) 익스트루더" + +#: src/libslic3r/PrintConfig.cpp:954 +msgid "The extruder to use when printing infill." +msgstr "채움으로 사용할 익스트루더." + +#: src/libslic3r/PrintConfig.cpp:962 +msgid "" +"Set this to a non-zero value to set a manual extrusion width for infill. If left zero, default extrusion " +"width will be used if set, otherwise 1.125 x nozzle diameter will be used. You may want to use fatter " +"extrudates to speed up the infill and make your parts stronger. If expressed as percentage (for example 90%) " +"it will be computed over layer height." +msgstr "" +"채움에 수동 압출 폭을 설정하려면이 값을 0이 아닌 값으로 설정합니다. 0으로 설정하면 설정된 경우 기본 압출 폭이 " +"사용되고 그렇지 않으면 1.125 x 노즐 직경이 사용됩니다. 채움 속도를 높이고 부품을 더 강하게 만들려면보다 큰 압" +"출 성형물을 사용하는 것이 좋습니다. 백분율 (예 : 90 %)로 표현하면 레이어 높이를 기준으로 계산됩니다." + +#: src/libslic3r/PrintConfig.cpp:971 +msgid "Infill before perimeters" +msgstr "둘레보다 앞쪽에 채움" + +#: src/libslic3r/PrintConfig.cpp:972 +msgid "This option will switch the print order of perimeters and infill, making the latter first." +msgstr "이 옵션은 외부출력과 채움 인쇄 순서를 바꾸어, 후자를 먼저 만든다." + +#: src/libslic3r/PrintConfig.cpp:977 +msgid "Only infill where needed" +msgstr "필요한 경우 채음" + +#: src/libslic3r/PrintConfig.cpp:979 +msgid "" +"This option will limit infill to the areas actually needed for supporting ceilings (it will act as internal " +"support material). If enabled, slows down the G-code generation due to the multiple checks involved." +msgstr "" +"이 옵션은 천장 지원에 실제로 필요한 영역에만 적용된다(내부 서포트 재료 역할을 할 것이다). 활성화된 경우 관련" +"된 여러 번의 점검으로 인해 G-code 생성 속도를 늦춰라." + +#: src/libslic3r/PrintConfig.cpp:986 +msgid "Infill/perimeters overlap" +msgstr "채움/둘레 겹침(perimeters overlap)" + +#: src/libslic3r/PrintConfig.cpp:988 +msgid "" +"This setting applies an additional overlap between infill and perimeters for better bonding. Theoretically " +"this shouldn't be needed, but backlash might cause gaps. If expressed as percentage (example: 15%) it is " +"calculated over perimeter extrusion width." +msgstr "" +"이 설정은 더 나은 본딩을 위해 충전 및 둘레 사이에 추가 겹침을 적용합니다. 이론적으로 이것은 필요하지 않아야하" +"지만 백래시가 갭을 유발할 수 있습니다. 백분율 (예 : 15 %)로 표시되는 경우 경계 압출 폭을 기준으로 계산됩니다." + +#: src/libslic3r/PrintConfig.cpp:999 +msgid "Speed for printing the internal fill. Set to zero for auto." +msgstr "내부 채우기 인쇄 속도. 자동으로 0으로 설정하십시오." + +#: src/libslic3r/PrintConfig.cpp:1007 +msgid "Inherits profile" +msgstr "프로필 상속" + +#: src/libslic3r/PrintConfig.cpp:1008 +msgid "Name of the profile, from which this profile inherits." +msgstr "이 프로파일이 상속되는 프로파일의 이름." + +#: src/libslic3r/PrintConfig.cpp:1021 +msgid "Interface shells" +msgstr "인터페이스 셸(shells)" + +#: src/libslic3r/PrintConfig.cpp:1022 +msgid "" +"Force the generation of solid shells between adjacent materials/volumes. Useful for multi-extruder prints " +"with translucent materials or manual soluble support material." +msgstr "" +"인접 재료/볼륨 사이에 고체 쉘 생성을 강제하십시오. 반투명 재료 또는 수동 수용성 서포트 재료를 사용한 다중 압ㅊ" +"기 인쇄에 유용함." + +#: src/libslic3r/PrintConfig.cpp:1031 +msgid "" +"This custom code is inserted at every layer change, right after the Z move and before the extruder moves to " +"the first layer point. Note that you can use placeholder variables for all Slic3r settings as well as " +"[layer_num] and [layer_z]." +msgstr "" +"이 사용자 정의 코드는 Z 이동 직후와 압출부가 첫 번째 레이어 포인트로 이동하기 전에 모든 레이어 변경 시 삽입된" +"다. 모든 Slic3r 설정뿐만 아니라 [layer_num] 및 [layer_z]에 자리 표시자 변수를 사용할 수 있다는 점에 유의하십시" +"오." + +#: src/libslic3r/PrintConfig.cpp:1042 +msgid "Supports remaining times" +msgstr "남은 시간 지원" + +#: src/libslic3r/PrintConfig.cpp:1043 +msgid "" +"Emit M73 P[percent printed] R[remaining time in minutes] at 1 minute intervals into the G-code to let the " +"firmware show accurate remaining time. As of now only the Prusa i3 MK3 firmware recognizes M73. Also the i3 " +"MK3 firmware supports M73 Qxx Sxx for the silent mode." +msgstr "" +"G 코드에 1 분 간격으로 M73 P [퍼센트 인쇄] R을 방출하여 펌웨어가 정확한 잔여 시간을 표시 하도록 합니다. 현재" +"만 Prusa i3 MK3 펌웨어는 M73를 인식 하 고 있습니다. 또한 i3 MK3 펌웨어는 자동 모드에서 M73 Qxx Sxx를 지원 합니" +"다." + +#: src/libslic3r/PrintConfig.cpp:1051 +msgid "Supports silent mode" +msgstr "자동 모드 지원" + +#: src/libslic3r/PrintConfig.cpp:1052 +msgid "Set silent mode for the G-code flavor" +msgstr "G-코드 특징에 대한 무음 모드 설정" + +#: src/libslic3r/PrintConfig.cpp:1075 +msgid "Maximum feedrate %1%" +msgstr "최대 공급 속도 %1%" + +#: src/libslic3r/PrintConfig.cpp:1078 +msgid "Maximum feedrate X" +msgstr "최대 이송 속도 X" + +#: src/libslic3r/PrintConfig.cpp:1079 +msgid "Maximum feedrate Y" +msgstr "최대 이송 속도 Y" + +#: src/libslic3r/PrintConfig.cpp:1080 +msgid "Maximum feedrate Z" +msgstr "최대 이송 속도 Z" + +#: src/libslic3r/PrintConfig.cpp:1081 +msgid "Maximum feedrate E" +msgstr "최대 이송 속도 E" + +#: src/libslic3r/PrintConfig.cpp:1077 +msgid "Maximum feedrate of the %1% axis" +msgstr "최대 공급 속도 of the %1% axis " + +#: src/libslic3r/PrintConfig.cpp:1096 +msgid "Maximum acceleration X" +msgstr "최대 가속도 X" + +#: src/libslic3r/PrintConfig.cpp:1097 +msgid "Maximum acceleration Y" +msgstr "최대 가속도 Y" + +#: src/libslic3r/PrintConfig.cpp:1098 +msgid "Maximum acceleration Z" +msgstr "최대 가속 Z" + +#: src/libslic3r/PrintConfig.cpp:1099 +msgid "Maximum acceleration E" +msgstr "최대 가속 E" + +#: src/libslic3r/PrintConfig.cpp:1087 +msgid "Maximum acceleration of the %1% axis" +msgstr "최대 가속도는 %1% 축" + +#: src/libslic3r/PrintConfig.cpp:1095 +msgid "Maximum jerk %1%" +msgstr "최대 저크(jerk) %1%" + +#: src/libslic3r/PrintConfig.cpp:1114 +msgid "Maximum jerk X" +msgstr "최대 저크(jerk) X" + +#: src/libslic3r/PrintConfig.cpp:1115 +msgid "Maximum jerk Y" +msgstr "최대 저크(jerk) Y" + +#: src/libslic3r/PrintConfig.cpp:1116 +msgid "Maximum jerk Z" +msgstr "최대 저크(jerk) Z" + +#: src/libslic3r/PrintConfig.cpp:1117 +msgid "Maximum jerk E" +msgstr "최대 저크(jerk) E" + +#: src/libslic3r/PrintConfig.cpp:1097 +msgid "Maximum jerk of the %1% axis" +msgstr "최대 저크는(jerk) %1% axis" + +#: src/libslic3r/PrintConfig.cpp:1108 src/libslic3r/PrintConfig.cpp:1110 +msgid "Minimum feedrate when extruding" +msgstr "압출시 최소 공급 속도" + +#: src/libslic3r/PrintConfig.cpp:1119 src/libslic3r/PrintConfig.cpp:1121 +msgid "Minimum travel feedrate" +msgstr "최소 이송 속도" + +#: src/libslic3r/PrintConfig.cpp:1130 src/libslic3r/PrintConfig.cpp:1132 +msgid "Maximum acceleration when extruding" +msgstr "압출시 최대 가속도" + +#: src/libslic3r/PrintConfig.cpp:1141 src/libslic3r/PrintConfig.cpp:1143 +msgid "Maximum acceleration when retracting" +msgstr "리트렉션 최대 가속도" + +#: src/libslic3r/PrintConfig.cpp:1151 src/libslic3r/PrintConfig.cpp:1160 +msgid "Max" +msgstr "최대" + +#: src/libslic3r/PrintConfig.cpp:1152 +msgid "This setting represents the maximum speed of your fan." +msgstr "이 설정은 팬의 최대 속도를 나타냅니다." + +#: src/libslic3r/PrintConfig.cpp:1161 +#, no-c-format +msgid "" +"This is the highest printable layer height for this extruder, used to cap the variable layer height and " +"support layer height. Maximum recommended layer height is 75% of the extrusion width to achieve reasonable " +"inter-layer adhesion. If set to 0, layer height is limited to 75% of the nozzle diameter." +msgstr "" +"이것은이 익스트루더의 가장 높은 인쇄 가능 층 높이이며, 가변 층 높이 및 지지층 높이를 캡하는 데 사용됩니다. 합" +"당한 층간 접착력을 얻기 위해 최대 권장 높이는 압출 폭의 75 %입니다. 0으로 설정하면 층 높이가 노즐 지름의 75 %" +"로 제한됩니다." + +#: src/libslic3r/PrintConfig.cpp:1171 +msgid "Max print speed" +msgstr "최대 프린트 속도" + +#: src/libslic3r/PrintConfig.cpp:1172 +msgid "" +"When setting other speed settings to 0 Slic3r will autocalculate the optimal speed in order to keep constant " +"extruder pressure. This experimental setting is used to set the highest print speed you want to allow." +msgstr "" +"다른 속도 설정을 0으로 설정할 경우, 지속적인 외부 압력을 유지하기 위해 최적의 속도를 자동 계산한다. 이 실험 설" +"정은 허용할 최대 인쇄 속도를 설정하는 데 사용된다." + +#: src/libslic3r/PrintConfig.cpp:1182 +msgid "This experimental setting is used to set the maximum volumetric speed your extruder supports." +msgstr "이 실험 설정은 압출기가 지원하는 최대 체적 속도를 설정하기 위해 사용된다." + +#: src/libslic3r/PrintConfig.cpp:1191 +msgid "Max volumetric slope positive" +msgstr "최대 체적 기울기 양" + +#: src/libslic3r/PrintConfig.cpp:1192 src/libslic3r/PrintConfig.cpp:1203 +msgid "" +"This experimental setting is used to limit the speed of change in extrusion rate. A value of 1.8 mm³/s² " +"ensures, that a change from the extrusion rate of 1.8 mm³/s (0.45mm extrusion width, 0.2mm extrusion height, " +"feedrate 20 mm/s) to 5.4 mm³/s (feedrate 60 mm/s) will take at least 2 seconds." +msgstr "" +"이 실험 설정은 돌출율의 변화 속도를 제한하는데 사용된다. 1.8mm3/s2 값은 1.8mm3/s(0.45mm 압출 폭, 0.2mm 압출 높" +"이, 공급 속도 20mm/s)에서 5.4mm3/s(공급 속도 60mm/s)로 변경하는 데 최소 2초 이상 걸린다." + +#: src/libslic3r/PrintConfig.cpp:1196 src/libslic3r/PrintConfig.cpp:1207 +msgid "mm³/s²" +msgstr "mm³/s²" + +#: src/libslic3r/PrintConfig.cpp:1202 +msgid "Max volumetric slope negative" +msgstr "최대 체적 기울기 음수" + +#: src/libslic3r/PrintConfig.cpp:1214 src/libslic3r/PrintConfig.cpp:1223 +msgid "Min" +msgstr "최소" + +#: src/libslic3r/PrintConfig.cpp:1215 +msgid "This setting represents the minimum PWM your fan needs to work." +msgstr "이 설정은 최소 PWM팬이 활동하는데 필요한를 나타냅니다." + +#: src/libslic3r/PrintConfig.cpp:1224 +msgid "" +"This is the lowest printable layer height for this extruder and limits the resolution for variable layer " +"height. Typical values are between 0.05 mm and 0.1 mm." +msgstr "" +"이것은 이 압출기에 대한 가장 낮은 인쇄 가능한 층 높이이고 가변 층 높이에 대한 분해능을 제한한다. 대표적인 값" +"은 0.05mm와 0.1mm이다." + +#: src/libslic3r/PrintConfig.cpp:1232 +msgid "Min print speed" +msgstr "최소 인쇄 속도" + +#: src/libslic3r/PrintConfig.cpp:1233 +msgid "Slic3r will not scale speed down below this speed." +msgstr "Slic3r는 이 속도 이하로 속도를 낮추지 않을 것이다." + +#: src/libslic3r/PrintConfig.cpp:1240 +msgid "Minimal filament extrusion length" +msgstr "최소 필라멘트 압출 길이" + +#: src/libslic3r/PrintConfig.cpp:1241 +msgid "" +"Generate no less than the number of skirt loops required to consume the specified amount of filament on the " +"bottom layer. For multi-extruder machines, this minimum applies to each extruder." +msgstr "" +"하단 레이어에서 지정된 양의 필라멘트를 사용하는 데 필요한 스커트 루프의 수 이상으로 생성한다. 멀티 익스트루더" +"의 경우, 이 최소값은 각 추가기기에 적용된다." + +#: src/libslic3r/PrintConfig.cpp:1250 +msgid "Configuration notes" +msgstr "구성 노트" + +#: src/libslic3r/PrintConfig.cpp:1251 +msgid "You can put here your personal notes. This text will be added to the G-code header comments." +msgstr "여기에 개인 노트를 넣을 수 있다. 이 텍스트는 G-code 헤더 코멘트에 추가될 것이다." + +#: src/libslic3r/PrintConfig.cpp:1260 +msgid "Nozzle diameter" +msgstr "노즐 직경" + +#: src/libslic3r/PrintConfig.cpp:1261 +msgid "This is the diameter of your extruder nozzle (for example: 0.5, 0.35 etc.)" +msgstr "이 지름은 엑스트루더 노즐의 직경이다(예: 0.5, 0.35 등)." + +#: src/libslic3r/PrintConfig.cpp:1266 +msgid "Host Type" +msgstr "호스트 유형" + +#: src/libslic3r/PrintConfig.cpp:1267 +msgid "Slic3r can upload G-code files to a printer host. This field must contain the kind of the host." +msgstr "" +"Slic3r는 프린터 호스트에 G 코드 파일을 업로드할 수 있습니다. 이 필드에는 호스트의 종류가 포함 되어야 합니다." + +#: src/libslic3r/PrintConfig.cpp:1278 +msgid "Only retract when crossing perimeters" +msgstr "둘레를 횡단 할 때만 수축" + +#: src/libslic3r/PrintConfig.cpp:1279 +msgid "" +"Disables retraction when the travel path does not exceed the upper layer's perimeters (and thus any ooze will " +"be probably invisible)." +msgstr "" +"이동 경로가 상위 레이어의 경계를 초과하지 않는 경우 리트랙션을 비활성화합니다. 따라서 모든 오즈가 보이지 않습" +"니다." + +#: src/libslic3r/PrintConfig.cpp:1286 +msgid "" +"This option will drop the temperature of the inactive extruders to prevent oozing. It will enable a tall " +"skirt automatically and move extruders outside such skirt when changing temperatures." +msgstr "" +"이 옵션은 누출을 방지하기 위해 비활성 압출기의 온도를 떨어 뜨립니다. 온도를 변경할 때 키가 큰 스커트를 자동으" +"로 사용하고 스커트 외부로 압출기를 이동합니다." + +#: src/libslic3r/PrintConfig.cpp:1293 +msgid "Output filename format" +msgstr "출력 파일이름 형식" + +#: src/libslic3r/PrintConfig.cpp:1294 +msgid "" +"You can use all configuration options as variables inside this template. For example: [layer_height], " +"[fill_density] etc. You can also use [timestamp], [year], [month], [day], [hour], [minute], [second], " +"[version], [input_filename], [input_filename_base]." +msgstr "" +"모든 구성 옵션을이 템플릿 내의 변수로 사용할 수 있습니다. 예: [layer_height], [fill_density] 등 또한 [타임 스" +"탬프], [연도], [월], [일], [시간], [input_filename], [input_filename_base]을 사용할 수 있습니다." + +#: src/libslic3r/PrintConfig.cpp:1303 +msgid "Detect bridging perimeters" +msgstr "브릿 징 경계선 감지" + +#: src/libslic3r/PrintConfig.cpp:1305 +msgid "" +"Experimental option to adjust flow for overhangs (bridge flow will be used), to apply bridge speed to them " +"and enable fan." +msgstr "" +"오버행에 대한 유량을 조정하는 실험 옵션 (브리지 흐름(flow)이 사용됨)에 브릿지 속도를 적용하고 팬을 활성화합니" +"다." + +#: src/libslic3r/PrintConfig.cpp:1311 +msgid "Filament parking position" +msgstr "필라멘트 멈춤 위치" + +#: src/libslic3r/PrintConfig.cpp:1312 +msgid "" +"Distance of the extruder tip from the position where the filament is parked when unloaded. This should match " +"the value in printer firmware. " +msgstr "언 로딩시 필라멘트 위치에서 압출기 팁의 거리. 이 값은 프린터 펌웨어의 값과 일치해야합니다. " + +#: src/libslic3r/PrintConfig.cpp:1320 +msgid "Extra loading distance" +msgstr "추가 로딩 거리" + +#: src/libslic3r/PrintConfig.cpp:1321 +msgid "" +"When set to zero, the distance the filament is moved from parking position during load is exactly the same as " +"it was moved back during unload. When positive, it is loaded further, if negative, the loading move is " +"shorter than unloading. " +msgstr "" +"0으로 설정하면로드 중에 필라멘트가 위치에서 이동 한 거리는 언로드 중에 다시 이동 한 거리와 동일합니다. 양수이" +"면 음수가 더 많이 로드되고 로드가 음수 인 경우 언로드보다 짧습니다. " + +#: src/libslic3r/PrintConfig.cpp:1329 src/libslic3r/PrintConfig.cpp:1347 src/libslic3r/PrintConfig.cpp:1359 +#: src/libslic3r/PrintConfig.cpp:1369 +msgid "Perimeters" +msgstr "둘레" + +#: src/libslic3r/PrintConfig.cpp:1330 +msgid "" +"This is the acceleration your printer will use for perimeters. A high value like 9000 usually gives good " +"results if your hardware is up to the job. Set zero to disable acceleration control for perimeters." +msgstr "" +"프린터가 둘레로 사용할 가속도입니다. 9000과 같은 높은 값은 하드웨어가 제대로 작동하면 좋은 결과를 제공합니다. " +"주변을 가속 제어하지 않으려면 0으로 설정하십시오." + +#: src/libslic3r/PrintConfig.cpp:1338 +msgid "Perimeter extruder" +msgstr "주변 익스트루더" + +#: src/libslic3r/PrintConfig.cpp:1340 +msgid "The extruder to use when printing perimeters and brim. First extruder is 1." +msgstr "둘레와 가장자리를 인쇄 할 때 사용할 압출기입니다. 첫 번째 압출기는 1입니다." + +#: src/libslic3r/PrintConfig.cpp:1349 +msgid "" +"Set this to a non-zero value to set a manual extrusion width for perimeters. You may want to use thinner " +"extrudates to get more accurate surfaces. If left zero, default extrusion width will be used if set, " +"otherwise 1.125 x nozzle diameter will be used. If expressed as percentage (for example 200%) it will be " +"computed over layer height." +msgstr "" +"이 값을 0이 아닌 값으로 설정하면 수동 압출 폭을 둘레로 설정할 수 있습니다. 보다 정확한 서페이스를 얻으려면 더 " +"얇은 압출 성형품을 사용하는 것이 좋습니다. 0으로 설정하면 설정된 경우 기본 돌출 폭이 사용되고 그렇지 않으면 " +"1.125 x 노즐 직경이 사용됩니다. 백분율 (예 : 200 %)로 표현하면 레이어 높이를 기준으로 계산됩니다." + +#: src/libslic3r/PrintConfig.cpp:1361 +msgid "Speed for perimeters (contours, aka vertical shells). Set to zero for auto." +msgstr "둘레의 속도 (등고선, 일명 세로 셸). 자동으로 0으로 설정하십시오." + +#: src/libslic3r/PrintConfig.cpp:1371 +msgid "" +"This option sets the number of perimeters to generate for each layer. Note that Slic3r may increase this " +"number automatically when it detects sloping surfaces which benefit from a higher number of perimeters if the " +"Extra Perimeters option is enabled." +msgstr "" +"이 옵션은 각 레이어에 대해 생성 할 경계 수를 설정합니다. 추가 경계선 옵션을 사용하면 더 큰 주변 수를 사용하는 " +"경사면을 감지 할 때 Slic3r이이 수를 자동으로 증가시킬 수 있습니다." + +#: src/libslic3r/PrintConfig.cpp:1375 +msgid "(minimum)" +msgstr "(최소)" + +#: src/libslic3r/PrintConfig.cpp:1383 +msgid "" +"If you want to process the output G-code through custom scripts, just list their absolute paths here. " +"Separate multiple scripts with a semicolon. Scripts will be passed the absolute path to the G-code file as " +"the first argument, and they can access the Slic3r config settings by reading environment variables." +msgstr "" +"사용자 정의 스크립트를 통해 출력 G 코드를 처리하려면 여기에 절대 경로를 나열하십시오. 여러 개의 스크립트를 세" +"미콜론으로 구분하십시오. 스크립트는 G 코드 파일의 절대 경로를 첫 번째 인수로 전달되며 환경 변수를 읽음으로써 " +"Slic3r 구성 설정에 액세스 할 수 있습니다." + +#: src/libslic3r/PrintConfig.cpp:1395 +msgid "Printer type" +msgstr "프린터 타입" + +#: src/libslic3r/PrintConfig.cpp:1396 +msgid "Type of the printer." +msgstr "프린터 유형." + +#: src/libslic3r/PrintConfig.cpp:1401 +msgid "Printer notes" +msgstr "프린터 노트" + +#: src/libslic3r/PrintConfig.cpp:1402 +msgid "You can put your notes regarding the printer here." +msgstr "프린터 관련 메모를 여기에 넣을 수 있습니다." + +#: src/libslic3r/PrintConfig.cpp:1410 +msgid "Printer vendor" +msgstr "제조 회사" + +#: src/libslic3r/PrintConfig.cpp:1411 +msgid "Name of the printer vendor." +msgstr "프린터 공급 업체의 이름입니다." + +#: src/libslic3r/PrintConfig.cpp:1416 +msgid "Printer variant" +msgstr "프린터 변형" + +#: src/libslic3r/PrintConfig.cpp:1417 +msgid "" +"Name of the printer variant. For example, the printer variants may be differentiated by a nozzle diameter." +msgstr "프린터 변종 이름입니다. 예를 들어, 프린터 변형은 노즐 지름으로 구별 될 수 있습니다." + +#: src/libslic3r/PrintConfig.cpp:1430 +msgid "Raft layers" +msgstr "라프트(Raft) 레이어" + +#: src/libslic3r/PrintConfig.cpp:1432 +msgid "The object will be raised by this number of layers, and support material will be generated under it." +msgstr "물체는 이 개수의 층에 의해 상승되며, 그 아래에서 서포트 재료가 생성될 것이다." + +#: src/libslic3r/PrintConfig.cpp:1440 +msgid "Resolution" +msgstr "해결" + +#: src/libslic3r/PrintConfig.cpp:1441 +msgid "" +"Minimum detail resolution, used to simplify the input file for speeding up the slicing job and reducing " +"memory usage. High-resolution models often carry more detail than printers can render. Set to zero to disable " +"any simplification and use full resolution from input." +msgstr "" +"잘라내기 작업의 속도를 높이고 메모리 사용량을 줄이기 위해 입력 파일을 단순화하는 데 사용되는 최소 세부 해상" +"도. 고해상도 모델은 종종 프린터가 렌더링할 수 있는 것보다 더 많은 디테일을 가지고 있다. 단순화를 사용하지 않" +"고 입력에서 전체 해상도를 사용하려면 0으로 설정하십시오." + +#: src/libslic3r/PrintConfig.cpp:1451 +msgid "Minimum travel after retraction" +msgstr "리트랙션 후 최소 이동 거리" + +#: src/libslic3r/PrintConfig.cpp:1452 +msgid "Retraction is not triggered when travel moves are shorter than this length." +msgstr "이동 거리가 이 길이보다 짧으면 리트렉션이 트리거되지 않습니다." + +#: src/libslic3r/PrintConfig.cpp:1458 +msgid "Retract amount before wipe" +msgstr "닦아 내기 전의 수축량" + +#: src/libslic3r/PrintConfig.cpp:1459 +msgid "With bowden extruders, it may be wise to do some amount of quick retract before doing the wipe movement." +msgstr "보우 덴 압출기를 사용하면 와이퍼 동작을하기 전에 약간의 빠른 리트랙션 를하는 것이 좋습니다." + +#: src/libslic3r/PrintConfig.cpp:1466 +msgid "Retract on layer change" +msgstr "레이어 변경 후퇴" + +#: src/libslic3r/PrintConfig.cpp:1467 +msgid "This flag enforces a retraction whenever a Z move is done." +msgstr "이 플래그는 Z 이동이 완료 될 때마다 취소를 강제 실행합니다." + +#: src/libslic3r/PrintConfig.cpp:1472 src/libslic3r/PrintConfig.cpp:1480 +msgid "Length" +msgstr "길이" + +#: src/libslic3r/PrintConfig.cpp:1473 +msgid "Retraction Length" +msgstr "리트랙션 길이" + +#: src/libslic3r/PrintConfig.cpp:1474 +msgid "" +"When retraction is triggered, filament is pulled back by the specified amount (the length is measured on raw " +"filament, before it enters the extruder)." +msgstr "" +"후퇴가 트리거되면 필라멘트가 지정된 양만큼 뒤로 당겨집니다 (길이는 압출기에 들어가기 전에 원시 필라멘트에서 측" +"정됩니다)." + +#: src/libslic3r/PrintConfig.cpp:1476 src/libslic3r/PrintConfig.cpp:1485 +msgid "mm (zero to disable)" +msgstr "mm (0은 비활성화)" + +#: src/libslic3r/PrintConfig.cpp:1481 +msgid "Retraction Length (Toolchange)" +msgstr "리트랙션 길이 (툴 체인지)" + +#: src/libslic3r/PrintConfig.cpp:1482 +msgid "" +"When retraction is triggered before changing tool, filament is pulled back by the specified amount (the " +"length is measured on raw filament, before it enters the extruder)." +msgstr "" +"공구를 교체하기 전에 후퇴가 트리거되면 필라멘트가 지정된 양만큼 뒤로 당겨집니다 (길이는 압출기에 들어가기 전" +"에 원시 필라멘트에서 측정됩니다)." + +#: src/libslic3r/PrintConfig.cpp:1490 +msgid "Lift Z" +msgstr "Z축 올림" + +#: src/libslic3r/PrintConfig.cpp:1491 +msgid "" +"If you set this to a positive value, Z is quickly raised every time a retraction is triggered. When using " +"multiple extruders, only the setting for the first extruder will be considered." +msgstr "" +"이 값을 양수 값으로 설정하면 철회가 트리거 될 때마다 Z가 빠르게 올라갑니다. 여러 개의 압출기를 사용하는 경우 " +"첫 번째 압출기의 설정 만 고려됩니다." + +#: src/libslic3r/PrintConfig.cpp:1498 +msgid "Above Z" +msgstr "Z 위" + +#: src/libslic3r/PrintConfig.cpp:1499 +msgid "Only lift Z above" +msgstr "오직 Z축 위로만" + +#: src/libslic3r/PrintConfig.cpp:1500 +msgid "" +"If you set this to a positive value, Z lift will only take place above the specified absolute Z. You can tune " +"this setting for skipping lift on the first layers." +msgstr "" +"이것을 양의 값으로 설정하면, Z 리프트는 지정된 절대 Z 위로만 발생한다. 첫 번째 층에서 리프트를 건너뛸 수 있도" +"록 이 설정을 조정할 수 있다." + +#: src/libslic3r/PrintConfig.cpp:1507 +msgid "Below Z" +msgstr "Z 아래" + +#: src/libslic3r/PrintConfig.cpp:1508 +msgid "Only lift Z below" +msgstr "Z값 아래만" + +#: src/libslic3r/PrintConfig.cpp:1509 +msgid "" +"If you set this to a positive value, Z lift will only take place below the specified absolute Z. You can tune " +"this setting for limiting lift to the first layers." +msgstr "" +"이것을 양수 값으로 설정하면 Z 리프트가 지정된 절대 Z 아래에서만 발생합니다. 첫 번째 레이어로 리프트를 제한하" +"기 위해이 설정을 조정할 수 있습니다." + +#: src/libslic3r/PrintConfig.cpp:1517 src/libslic3r/PrintConfig.cpp:1525 +msgid "Extra length on restart" +msgstr "재시작시 여분의 길이" + +#: src/libslic3r/PrintConfig.cpp:1518 +msgid "" +"When the retraction is compensated after the travel move, the extruder will push this additional amount of " +"filament. This setting is rarely needed." +msgstr "" +"이동 후 리트렉셔이 보정되면 익스트루더가 추가 양의 필라멘트를 밀어냅니다. 이 설정은 거의 필요하지 않습니다." + +#: src/libslic3r/PrintConfig.cpp:1526 +msgid "" +"When the retraction is compensated after changing tool, the extruder will push this additional amount of " +"filament." +msgstr "도구를 교환 한 후 리트렉션를 보정하면 익스트루더가 추가 양의 필라멘트를 밀게됩니다." + +#: src/libslic3r/PrintConfig.cpp:1533 src/libslic3r/PrintConfig.cpp:1534 +msgid "Retraction Speed" +msgstr "리트랙션 속도" + +#: src/libslic3r/PrintConfig.cpp:1535 +msgid "The speed for retractions (it only applies to the extruder motor)." +msgstr "리트랙션 속도 (익스트루더 모터에만 적용됨)." + +#: src/libslic3r/PrintConfig.cpp:1541 src/libslic3r/PrintConfig.cpp:1542 +msgid "Deretraction Speed" +msgstr "감속 속도" + +#: src/libslic3r/PrintConfig.cpp:1543 +msgid "" +"The speed for loading of a filament into extruder after retraction (it only applies to the extruder motor). " +"If left to zero, the retraction speed is used." +msgstr "" +"리트랙션 후 압출기에 필라멘트를 로드하는 속도 (압출기 모터에만 적용됨). 0으로 방치하면 리트랙션 속도가 사용됩" +"니다." + +#: src/libslic3r/PrintConfig.cpp:1550 +msgid "Seam position" +msgstr "재봉선 위치" + +#: src/libslic3r/PrintConfig.cpp:1552 +msgid "Position of perimeters starting points." +msgstr "둘레의 시작점의 위치." + +#: src/libslic3r/PrintConfig.cpp:1558 +msgid "Random" +msgstr "무작위" + +#: src/libslic3r/PrintConfig.cpp:1559 +msgid "Nearest" +msgstr "가장 가까운" + +#: src/libslic3r/PrintConfig.cpp:1560 +msgid "Aligned" +msgstr "정렬" + +#: src/libslic3r/PrintConfig.cpp:1568 +msgid "Direction" +msgstr "방향" + +#: src/libslic3r/PrintConfig.cpp:1570 +msgid "Preferred direction of the seam" +msgstr "선호하는 심(seam)의 방향" + +#: src/libslic3r/PrintConfig.cpp:1571 +msgid "Seam preferred direction" +msgstr "심(Seam) 선호 방향" + +#: src/libslic3r/PrintConfig.cpp:1578 +msgid "Jitter" +msgstr "지터(Jitter)" + +#: src/libslic3r/PrintConfig.cpp:1580 +msgid "Seam preferred direction jitter" +msgstr "(Seam) 선호 방향 지터(Jitter)" + +#: src/libslic3r/PrintConfig.cpp:1581 +msgid "Preferred direction of the seam - jitter" +msgstr "재봉선 지터의 선호 방향" + +#: src/libslic3r/PrintConfig.cpp:1591 +msgid "USB/serial port for printer connection." +msgstr "프린터 연결을 위한 USB/시리얼 포트." + +#: src/libslic3r/PrintConfig.cpp:1598 +msgid "Serial port speed" +msgstr "시리얼 포트 속도" + +#: src/libslic3r/PrintConfig.cpp:1599 +msgid "Speed (baud) of USB/serial port for printer connection." +msgstr "프린터 연결을 위한 USB/시리얼 포트의 속도(보드)" + +#: src/libslic3r/PrintConfig.cpp:1608 +msgid "Distance from object" +msgstr "객체로부터의 거리" + +#: src/libslic3r/PrintConfig.cpp:1609 +msgid "" +"Distance between skirt and object(s). Set this to zero to attach the skirt to the object(s) and get a brim " +"for better adhesion." +msgstr "스커트와 객체 사이의 거리. 스커트를 객체에 부착하고 접착력을 높이기 위해 이를 0으로 설정한다." + +#: src/libslic3r/PrintConfig.cpp:1616 +msgid "Skirt height" +msgstr "스커트(Skirt) 높이" + +#: src/libslic3r/PrintConfig.cpp:1617 +msgid "Height of skirt expressed in layers. Set this to a tall value to use skirt as a shield against drafts." +msgstr "" +"스커트의 높이 레이어로 표현된다. 이를 높은 값으로 설정하여 스커트를 드래프트에 대한 쉴ㄷ로 활용하십시오." + +#: src/libslic3r/PrintConfig.cpp:1624 +msgid "Loops (minimum)" +msgstr "루프 (최소)" + +#: src/libslic3r/PrintConfig.cpp:1625 +msgid "Skirt Loops" +msgstr "스커트 루프" + +#: src/libslic3r/PrintConfig.cpp:1626 +msgid "" +"Number of loops for the skirt. If the Minimum Extrusion Length option is set, the number of loops might be " +"greater than the one configured here. Set this to zero to disable skirt completely." +msgstr "" +"스커트의 루프 수입니다. 최소 압출 길이 옵션을 설정한 경우 여기에 구성된 루프 수보다 클 수 있다. 스커트를 완전" +"히 비활성화하려면 이 값을 0으로 설정하십시오." + +#: src/libslic3r/PrintConfig.cpp:1634 +msgid "Slow down if layer print time is below" +msgstr "레이어 인쇄 시간이 다음과 같은 경우 속도를 낮추십시오" + +#: src/libslic3r/PrintConfig.cpp:1635 +msgid "" +"If layer print time is estimated below this number of seconds, print moves speed will be scaled down to " +"extend duration to this value." +msgstr "층 인쇄 시간이 이 시간보다 낮게 추정될 경우, 인쇄 이동 속도는 이 값으로 지속되도록 축소된다." + +#: src/libslic3r/PrintConfig.cpp:1645 +msgid "Small perimeters" +msgstr "작은 둘레" + +#: src/libslic3r/PrintConfig.cpp:1647 +msgid "" +"This separate setting will affect the speed of perimeters having radius <= 6.5mm (usually holes). If " +"expressed as percentage (for example: 80%) it will be calculated on the perimeters speed setting above. Set " +"to zero for auto." +msgstr "" +"이 개별 설정은 반경이 6.5mm 미만인 속도 (일반적으로 구멍)에 영향을줍니다. 백분율로 표시되는 경우 (예 : 80 %) " +"위의 속도 설정에서 계산됩니다. 자동으로 0으로 설정하십시오." + +#: src/libslic3r/PrintConfig.cpp:1657 +msgid "Solid infill threshold area" +msgstr "솔리드 채우기 임계값 영역" + +#: src/libslic3r/PrintConfig.cpp:1659 +msgid "Force solid infill for regions having a smaller area than the specified threshold." +msgstr "지정된 한계값보다 작은 영역을 가진 영역에 대해 솔리드 인필을 강제 적용." + +#: src/libslic3r/PrintConfig.cpp:1660 +msgid "mm²" +msgstr "mm²" + +#: src/libslic3r/PrintConfig.cpp:1666 +msgid "Solid infill extruder" +msgstr "솔리드 인필 익스트루더" + +#: src/libslic3r/PrintConfig.cpp:1668 +msgid "The extruder to use when printing solid infill." +msgstr "꽉찬 면을 인쇄할 때 사용하는 익스트루더." + +#: src/libslic3r/PrintConfig.cpp:1674 +msgid "Solid infill every" +msgstr "솔리드 인필 간격" + +#: src/libslic3r/PrintConfig.cpp:1676 +msgid "" +"This feature allows to force a solid layer every given number of layers. Zero to disable. You can set this to " +"any value (for example 9999); Slic3r will automatically choose the maximum possible number of layers to " +"combine according to nozzle diameter and layer height." +msgstr "" +"이 특징은 주어진 개수의 층마다 단단한 층을 강요할 수 있게 한다. 비활성화할 수 없음. 당신은 이것을 어떤 값으로" +"도 설정할 수 있다(예: 9999). Slic3r는 노즐 직경과 층 높이에 따라 결합할 최대 가능한 층 수를 자동으로 선택한다." + +#: src/libslic3r/PrintConfig.cpp:1688 +msgid "" +"Set this to a non-zero value to set a manual extrusion width for infill for solid surfaces. If left zero, " +"default extrusion width will be used if set, otherwise 1.125 x nozzle diameter will be used. If expressed as " +"percentage (for example 90%) it will be computed over layer height." +msgstr "" +"이 값을 0이 아닌 값으로 설정하여 솔리드 표면 인필에 대한 수동 압출 폭을 설정하십시오. 0인 경우 기본 압출 너비" +"가 사용되며, 그렇지 않으면 1.125 x 노즐 직경이 사용된다. 백분율(예: 90%)로 표현되는 경우, 계층 높이에 걸쳐 계" +"산된다." + +#: src/libslic3r/PrintConfig.cpp:1698 +msgid "" +"Speed for printing solid regions (top/bottom/internal horizontal shells). This can be expressed as a " +"percentage (for example: 80%) over the default infill speed above. Set to zero for auto." +msgstr "" +"솔리드 영역(상단/하부/내부 수평 셸) 인쇄 속도 이는 위의 기본 주입 속도에 대한 백분율(예: 80%)로 표시할 수 있" +"다. 자동을 위해 0으로 설정한다." + +#: src/libslic3r/PrintConfig.cpp:1710 +msgid "Number of solid layers to generate on top and bottom surfaces." +msgstr "상단 및 하단 표면에 생성할 솔리드 레이어 수입니다." + +#: src/libslic3r/PrintConfig.cpp:1716 +msgid "Spiral vase" +msgstr "스파이럴 바이스" + +#: src/libslic3r/PrintConfig.cpp:1717 +msgid "" +"This feature will raise Z gradually while printing a single-walled object in order to remove any visible " +"seam. This option requires a single perimeter, no infill, no top solid layers and no support material. You " +"can still set any number of bottom solid layers as well as skirt/brim loops. It won't work when printing more " +"than an object." +msgstr "" +"이 기능은 단일 벽 물체를 인쇄하는 동안 눈에 보이는 심을 제거하기 위해 Z를 점진적으로 상승시킨다. 이 옵션은 단" +"일 둘레, 주입, 상단 솔리드 레이어 및 지지 재료가 필요하지 않다. 당신은 스커트/브림 루프뿐만 아니라 아래 솔리" +"드 레이어의 수에 상관없이 설정할 수 있다. 그것은 물체보다 더 많이 인쇄할 때는 작동하지 않을 것이다." + +#: src/libslic3r/PrintConfig.cpp:1725 +msgid "Temperature variation" +msgstr "온도 변화" + +#: src/libslic3r/PrintConfig.cpp:1726 +msgid "" +"Temperature difference to be applied when an extruder is not active. Enables a full-height \"sacrificial\" " +"skirt on which the nozzles are periodically wiped." +msgstr "" +"돌출부가 활성화되지 않은 경우 적용되는 온도 차이. 노즐을 주기적으로 닦는 전체 높이 \"인공\" 스커트가 가능하다." + +#: src/libslic3r/PrintConfig.cpp:1736 +msgid "" +"This start procedure is inserted at the beginning, after bed has reached the target temperature and extruder " +"just started heating, and before extruder has finished heating. If Slic3r detects M104 or M190 in your custom " +"codes, such commands will not be prepended automatically so you're free to customize the order of heating " +"commands and other custom actions. Note that you can use placeholder variables for all Slic3r settings, so " +"you can put a \"M109 S[first_layer_temperature]\" command wherever you want." +msgstr "" +"이 시작 절차는 침대가 목표 온도에 도달하고 압출기가 막 가열을 시작한 직후 및 압출기가 가열을 완료하기 전에 처" +"음에 삽입됩니다. Slic3r이 사용자 지정 코드에서 M104 또는 M190을 감지하면 이러한 명령은 자동으로 추가되지 않으" +"므로 가열 명령 및 기타 사용자 지정 동작의 순서를 자유롭게 사용자 지정할 수 있습니다. 모든 Slic3r 설정에 자리 " +"표시 자 변수를 사용할 수 있으므로 원하는 위치에 \"M109 S [first_layer_temperature]\"명령을 넣을 수 있습니다." + +#: src/libslic3r/PrintConfig.cpp:1751 +msgid "" +"This start procedure is inserted at the beginning, after any printer start gcode. This is used to override " +"settings for a specific filament. If Slic3r detects M104, M109, M140 or M190 in your custom codes, such " +"commands will not be prepended automatically so you're free to customize the order of heating commands and " +"other custom actions. Note that you can use placeholder variables for all Slic3r settings, so you can put a " +"\"M109 S[first_layer_temperature]\" command wherever you want. If you have multiple extruders, the gcode is " +"processed in extruder order." +msgstr "" +"이 시작 절차는 프린터가 gcode를 시작한 후 처음에 삽입됩니다. 특정 필라멘트의 설정을 무시하는 데 사용됩니다. " +"Slic3r이 사용자 지정 코드에서 M104, M109, M140 또는 M190을 감지하면 이러한 명령은 자동으로 추가되지 않으므로 " +"가열 명령 및 기타 사용자 지정 동작의 순서를 자유롭게 사용자 지정할 수 있습니다. 모든 Slic3r 설정에 자리 표시 " +"자 변수를 사용할 수 있으므로 원하는 위치에 \"M109 S [first_layer_temperature]\"명령을 넣을 수 있습니다. 여러 " +"개의 압출기가있는 경우 gcode가 압출기 순서로 처리됩니다." + +#: src/libslic3r/PrintConfig.cpp:1766 +msgid "Single Extruder Multi Material" +msgstr "싱글 익스트루더 멀티메터리얼" + +#: src/libslic3r/PrintConfig.cpp:1767 +msgid "The printer multiplexes filaments into a single hot end." +msgstr "프린터는 필라멘트를 하나의 핫 엔드에 멀티플렉싱합니다." + +#: src/libslic3r/PrintConfig.cpp:1772 +msgid "Prime all printing extruders" +msgstr "모든 인쇄 압출기 프라임" + +#: src/libslic3r/PrintConfig.cpp:1773 +msgid "" +"If enabled, all printing extruders will be primed at the front edge of the print bed at the start of the " +"print." +msgstr "활성화 된 경우, 모든 인쇄 압출기는 인쇄 시작시 프린트 베드의 전면 가장자리에 프라이밍 됩니다." + +#: src/libslic3r/PrintConfig.cpp:1778 +msgid "Generate support material" +msgstr "서포트 재료 생성" + +#: src/libslic3r/PrintConfig.cpp:1780 +msgid "Enable support material generation." +msgstr "서포트 재료를 사용합니다." + +#: src/libslic3r/PrintConfig.cpp:1784 +msgid "Auto generated supports" +msgstr "자동 생성 지원" + +#: src/libslic3r/PrintConfig.cpp:1786 +msgid "" +"If checked, supports will be generated automatically based on the overhang threshold value. If unchecked, " +"supports will be generated inside the \"Support Enforcer\" volumes only." +msgstr "" +"이 옵션을 선택 하면 오버행 임계값에 따라 서포트가 자동으로 생성 됩니다. 이 확인란을 선택 하지 않으면 \"서포트 " +"지원 영역\" 볼륨 내 에서만 지원이 생성 됩니다." + +#: src/libslic3r/PrintConfig.cpp:1792 +msgid "XY separation between an object and its support" +msgstr "물체와 그 서포트 사이 XY 분리" + +#: src/libslic3r/PrintConfig.cpp:1794 +msgid "" +"XY separation between an object and its support. If expressed as percentage (for example 50%), it will be " +"calculated over external perimeter width." +msgstr "" +"객체와 그 서포트 사이의 XY 분리. 백분율 (예 : 50 %)로 표시되는 경우 외부 둘레 너비를 기준으로 계산됩니다." + +#: src/libslic3r/PrintConfig.cpp:1804 +msgid "Pattern angle" +msgstr "채움 각도" + +#: src/libslic3r/PrintConfig.cpp:1806 +msgid "Use this setting to rotate the support material pattern on the horizontal plane." +msgstr "이 설정을 사용하여지지 평면 패턴을 수평면으로 회전시킵니다." + +#: src/libslic3r/PrintConfig.cpp:1816 src/libslic3r/PrintConfig.cpp:2421 +msgid "Only create support if it lies on a build plate. Don't create support on a print." +msgstr "그것이 빌드 플레이트에있는 경우에만 지원을 작성하십시오. 인쇄물에 대한 지원을 작성하지 마십시오." + +#: src/libslic3r/PrintConfig.cpp:1822 +msgid "Contact Z distance" +msgstr "Z 거리 문의" + +#: src/libslic3r/PrintConfig.cpp:1824 +msgid "" +"The vertical distance between object and support material interface. Setting this to 0 will also prevent " +"Slic3r from using bridge flow and speed for the first object layer." +msgstr "" +"물체와 서포트 사이의 수직 거리. 이 값을 0으로 설정하면 Slic3r이 첫 번째 객체 레이어에 브리지 흐름과 속도를 사" +"용하지 못하게됩니다." + +#: src/libslic3r/PrintConfig.cpp:1831 +msgid "soluble" +msgstr "수용성" + +#: src/libslic3r/PrintConfig.cpp:1832 +msgid "detachable" +msgstr "분리 가능" + +#: src/libslic3r/PrintConfig.cpp:1837 +msgid "Enforce support for the first" +msgstr "첫 번째 서포트 더 강화" + +#: src/libslic3r/PrintConfig.cpp:1839 +msgid "" +"Generate support material for the specified number of layers counting from bottom, regardless of whether " +"normal support material is enabled or not and regardless of any angle threshold. This is useful for getting " +"more adhesion of objects having a very thin or poor footprint on the build plate." +msgstr "" +"일반지지 소재의 활성화 여부와 관계없이 각도 임계 값에 관계없이 하단에서부터 세어 지정된 레이어 수에 대한지지 " +"자료를 생성합니다. 이것은 빌드 플레이트에 매우 얇거나 부족한 풋 프린트를 가진 물체를 더 많이 부착 할 때 유용합" +"니다." + +#: src/libslic3r/PrintConfig.cpp:1844 +msgid "Enforce support for the first n layers" +msgstr "첫 번째 n 개의 레이어에 대한 서포트 강화" + +#: src/libslic3r/PrintConfig.cpp:1850 +msgid "Support material/raft/skirt extruder" +msgstr "서포트 재료 / 라프트 / 스커트 익스트루더" + +#: src/libslic3r/PrintConfig.cpp:1852 +msgid "" +"The extruder to use when printing support material, raft and skirt (1+, 0 to use the current extruder to " +"minimize tool changes)." +msgstr "" +"서포트 재료, 라프트 및 스커트를 인쇄 할 때 사용하는 압출기 (도구 변경을 최소화하기 위해 현재 압출기를 사용하려" +"면 1+, 0)." + +#: src/libslic3r/PrintConfig.cpp:1861 +msgid "" +"Set this to a non-zero value to set a manual extrusion width for support material. If left zero, default " +"extrusion width will be used if set, otherwise nozzle diameter will be used. If expressed as percentage (for " +"example 90%) it will be computed over layer height." +msgstr "" +"서포트 재료의 수동 압출 폭을 설정하려면이 값을 0이 아닌 값으로 설정하십시오. 0으로 설정하면 설정된 경우 기본 " +"압출 폭이 사용되고 그렇지 않으면 노즐 지름이 사용됩니다. 백분율 (예 : 90 %)로 표현하면 레이어 높이를 기준으로 " +"계산됩니다." + +#: src/libslic3r/PrintConfig.cpp:1869 +msgid "Interface loops" +msgstr "인터페이스 루프" + +#: src/libslic3r/PrintConfig.cpp:1871 +msgid "Cover the top contact layer of the supports with loops. Disabled by default." +msgstr "지지대의 상단 접촉 층을 루프로 덮으십시오. 기본적으로 사용 안 함." + +#: src/libslic3r/PrintConfig.cpp:1876 +msgid "Support material/raft interface extruder" +msgstr "서포트 재료/라프트 인터페이스 익스트루더" + +#: src/libslic3r/PrintConfig.cpp:1878 +msgid "" +"The extruder to use when printing support material interface (1+, 0 to use the current extruder to minimize " +"tool changes). This affects raft too." +msgstr "" +"서포트 재료 인터페이스를 인쇄 할 때 사용할 익스트루더 (도구 변경을 최소화하기 위해 현재 익스트루더를 사용하려" +"면 1+, 0). 이것은 라프트에도 영향을 미칩니다." + +#: src/libslic3r/PrintConfig.cpp:1885 +msgid "Interface layers" +msgstr "인터페이스 레이어" + +#: src/libslic3r/PrintConfig.cpp:1887 +msgid "Number of interface layers to insert between the object(s) and support material." +msgstr "객체와 서포트 재료 사이에 삽입할 인터페이스 레이어 수입니다." + +#: src/libslic3r/PrintConfig.cpp:1894 +msgid "Interface pattern spacing" +msgstr "인터페이스 패턴 간격" + +#: src/libslic3r/PrintConfig.cpp:1896 +msgid "Spacing between interface lines. Set zero to get a solid interface." +msgstr "인터페이스 라인 간 간격. 솔리드 인터페이스를 가져오려면 0을 설정하십시오." + +#: src/libslic3r/PrintConfig.cpp:1905 +msgid "" +"Speed for printing support material interface layers. If expressed as percentage (for example 50%) it will be " +"calculated over support material speed." +msgstr "서포트 재료 인터페이스 레이어 인쇄 속도 백분율(예: 50%)로 표현될 경우 서포트 재료 속도에 따라 계산된다." + +#: src/libslic3r/PrintConfig.cpp:1914 +msgid "Pattern" +msgstr "패턴" + +#: src/libslic3r/PrintConfig.cpp:1916 +msgid "Pattern used to generate support material." +msgstr "서포트 재료를 생성하는 데 사용되는 패턴." + +#: src/libslic3r/PrintConfig.cpp:1922 +msgid "Rectilinear grid" +msgstr "직선 그리드" + +#: src/libslic3r/PrintConfig.cpp:1928 +msgid "Pattern spacing" +msgstr "패턴 간격" + +#: src/libslic3r/PrintConfig.cpp:1930 +msgid "Spacing between support material lines." +msgstr "서포트 재료 라인 사이의 간격." + +#: src/libslic3r/PrintConfig.cpp:1939 +msgid "Speed for printing support material." +msgstr "서포트 재료를 인쇄하는 속도." + +#: src/libslic3r/PrintConfig.cpp:1946 +msgid "Synchronize with object layers" +msgstr "객체 레이어와 동기화" + +#: src/libslic3r/PrintConfig.cpp:1948 +msgid "" +"Synchronize support layers with the object print layers. This is useful with multi-material printers, where " +"the extruder switch is expensive." +msgstr "" +"서포트 레이어를 프린트 레이어와 동기화하십시오. 이것은 스위치가 비싼 멀티 메터리얼 프린터에서 유용하다." + +#: src/libslic3r/PrintConfig.cpp:1954 +msgid "Overhang threshold" +msgstr "오버행 한계점" + +#: src/libslic3r/PrintConfig.cpp:1956 +msgid "" +"Support material will not be generated for overhangs whose slope angle (90° = vertical) is above the given " +"threshold. In other words, this value represent the most horizontal slope (measured from the horizontal " +"plane) that you can print without support material. Set to zero for automatic detection (recommended)." +msgstr "" +"서포트 재료는 경사각(90° = 수직)이 지정된 임계점보다 높은 압출에 대해서는 생성되지 않는다. 즉, 이 값은 서포트 " +"재료 없이 인쇄할 수 있는 가장 수평 경사(수평면에서 측정됨)를 나타낸다. 자동 감지를 위해 0으로 설정하십시오(권" +"장)." + +#: src/libslic3r/PrintConfig.cpp:1968 +msgid "With sheath around the support" +msgstr "서포트 주변이나 외부로" + +#: src/libslic3r/PrintConfig.cpp:1970 +msgid "" +"Add a sheath (a single perimeter line) around the base support. This makes the support more reliable, but " +"also more difficult to remove." +msgstr "" +"기본 서포트 주위에 외장 (단일 주변 선)을 추가하십시오. 이것은 페이스 업을보다 신뢰성있게 만들뿐만 아니라 제거" +"하기도 어렵습니다." + +#: src/libslic3r/PrintConfig.cpp:1977 +msgid "" +"Extruder temperature for layers after the first one. Set this to zero to disable temperature control commands " +"in the output." +msgstr "" +"첫 번째 것 이후에 레이어에 대한 더 낮은 온도. 이 값을 0으로 설정하면 출력에서 ​​온도 제어 명령을 비활성화 할 수 " +"있습니다." + +#: src/libslic3r/PrintConfig.cpp:1979 +msgid "Temperature" +msgstr "온도" + +#: src/libslic3r/PrintConfig.cpp:1985 +msgid "Detect thin walls" +msgstr "얇은 벽(walls) 감지" + +#: src/libslic3r/PrintConfig.cpp:1987 +msgid "" +"Detect single-width walls (parts where two extrusions don't fit and we need to collapse them into a single " +"trace)." +msgstr "싱글 너비 벽 (두 부분이 맞지 않는 부분과 무너지는 부분)을 감지합니다." + +#: src/libslic3r/PrintConfig.cpp:1993 +msgid "Threads" +msgstr "스레드(Threads)" + +#: src/libslic3r/PrintConfig.cpp:1994 +msgid "" +"Threads are used to parallelize long-running tasks. Optimal threads number is slightly above the number of " +"available cores/processors." +msgstr "" +"스레드는 장기 실행 태스크를 병렬 처리하는 데 사용됩니다. 최적의 스레드 수는 사용 가능한 코어 / 프로세서 수보" +"다 약간 높습니다." + +#: src/libslic3r/PrintConfig.cpp:2006 +msgid "" +"This custom code is inserted right before every extruder change. Note that you can use placeholder variables " +"for all Slic3r settings as well as [previous_extruder] and [next_extruder]." +msgstr "" +"이 사용자 정의 코드는 모든 압출기 변경 직전에 삽입됩니다. [previous_extruder] 및 [next_extruder]뿐 아니라 모" +"든 Slic3r 설정에 대해 자리 표시 자 변수를 사용할 수 있습니다." + +#: src/libslic3r/PrintConfig.cpp:2018 +msgid "" +"Set this to a non-zero value to set a manual extrusion width for infill for top surfaces. You may want to use " +"thinner extrudates to fill all narrow regions and get a smoother finish. If left zero, default extrusion " +"width will be used if set, otherwise nozzle diameter will be used. If expressed as percentage (for example " +"90%) it will be computed over layer height." +msgstr "" +"이 값을 0이 아닌 값으로 설정하여 상단 서피스에 대한 infill의 수동 압출 폭을 설정합니다. 얇은 압출 성형물을 사" +"용하여 모든 좁은 지역을 채우고 더 매끄러운 마무리를 할 수 있습니다. 0으로 설정된 경우 기본 압출 폭이 사용되고 " +"그렇지 않으면 노즐 지름이 사용됩니다. 백분율 (예 : 90 %)로 표현하면 레이어 높이를 기준으로 계산됩니다." + +#: src/libslic3r/PrintConfig.cpp:2029 +msgid "" +"Speed for printing top solid layers (it only applies to the uppermost external layers and not to their " +"internal solid layers). You may want to slow down this to get a nicer surface finish. This can be expressed " +"as a percentage (for example: 80%) over the solid infill speed above. Set to zero for auto." +msgstr "" +"상단 솔리드 레이어 인쇄 속도 (솔리드 레이어가 아닌 최상단 외부 레이어에만 적용) 표면을 더 좋게 마무리하려면 속" +"도를 늦추시기 바랍니다. 이것은 위의 고체 충전 속도에 대한 백분율 (예 : 80 %)로 나타낼 수 있습니다. 자동으로 0" +"으로 설정하십시오." + +#: src/libslic3r/PrintConfig.cpp:2043 +msgid "Number of solid layers to generate on top surfaces." +msgstr "상단 표면에 생성 할 솔리드 레이어 수입니다." + +#: src/libslic3r/PrintConfig.cpp:2044 +msgid "Top solid layers" +msgstr "탑 솔리드 레이어" + +#: src/libslic3r/PrintConfig.cpp:2050 +msgid "Speed for travel moves (jumps between distant extrusion points)." +msgstr "이동 속도 (먼 돌출 점 사이의 점프)." + +#: src/libslic3r/PrintConfig.cpp:2058 +msgid "Use firmware retraction" +msgstr "펌웨어 철회" + +#: src/libslic3r/PrintConfig.cpp:2059 +msgid "" +"This experimental setting uses G10 and G11 commands to have the firmware handle the retraction. This is only " +"supported in recent Marlin." +msgstr "" +"이 실험 설정은 G10 및 G11 명령을 사용하여 펌웨어에서 취소를 처리하도록합니다. 이것은 최근의 말린에서만 지원됩" +"니다." + +#: src/libslic3r/PrintConfig.cpp:2065 +msgid "Use relative E distances" +msgstr "상대적인 E 거리 사용" + +#: src/libslic3r/PrintConfig.cpp:2066 +msgid "" +"If your firmware requires relative E values, check this, otherwise leave it unchecked. Most firmwares use " +"absolute values." +msgstr "" +"펌웨어에 상대 E 값이 필요한 경우이 값을 선택하고, 그렇지 않으면 선택하지 마십시오. 대부분의 회사는 절대 값을 " +"사용합니다." + +#: src/libslic3r/PrintConfig.cpp:2072 +msgid "Use volumetric E" +msgstr "용적 E 사용" + +#: src/libslic3r/PrintConfig.cpp:2073 +msgid "" +"This experimental setting uses outputs the E values in cubic millimeters instead of linear millimeters. If " +"your firmware doesn't already know filament diameter(s), you can put commands like 'M200 " +"D[filament_diameter_0] T0' in your start G-code in order to turn volumetric mode on and use the filament " +"diameter associated to the filament selected in Slic3r. This is only supported in recent Marlin." +msgstr "" +"이 실험 설정은 선형 밀리미터 대신에 입방 밀리미터 단위의 E 값을 출력으로 사용합니다. 펌웨어가 필라멘트 직경을 " +"모르는 경우 볼륨 모드를 켜고 선택한 필라멘트와 연결된 필라멘트 직경을 사용하기 위해 시작 G 코드에 'M200 D " +"[filament_diameter_0] T0'과 같은 명령을 입력 할 수 있습니다 Slic3r. 이것은 최근의 말린에서만 지원됩니다." + +#: src/libslic3r/PrintConfig.cpp:2083 +msgid "Enable variable layer height feature" +msgstr "가변 레이어 높이 기능 사용" + +#: src/libslic3r/PrintConfig.cpp:2084 +msgid "" +"Some printers or printer setups may have difficulties printing with a variable layer height. Enabled by " +"default." +msgstr "" +"일부 프린터 또는 프린터 설정은 가변 레이어 높이로 인쇄하는 데 어려움이있을 수 있습니다. 기본적으로 사용됩니다." + +#: src/libslic3r/PrintConfig.cpp:2090 +msgid "Wipe while retracting" +msgstr "수축시 닦아내십시오" + +#: src/libslic3r/PrintConfig.cpp:2091 +msgid "This flag will move the nozzle while retracting to minimize the possible blob on leaky extruders." +msgstr "이 플래그는 누출된 리트랙싱의 블럽 가능성을 최소화하기 위해 수축하는 동안 노즐을 이동시킨다." + +#: src/libslic3r/PrintConfig.cpp:2098 +msgid "" +"Multi material printers may need to prime or purge extruders on tool changes. Extrude the excess material " +"into the wipe tower." +msgstr "" +"멀티 메터리알 프린터는 공구 교환 시 익스트루더를 프라이밍하거나 제거해야 할 수 있다. 과도한 물질을 와이퍼 타워" +"에 돌출시킨다." + +#: src/libslic3r/PrintConfig.cpp:2104 +msgid "Purging volumes - load/unload volumes" +msgstr "볼륨 삭제 - 볼륨 로드/언로드" + +#: src/libslic3r/PrintConfig.cpp:2105 +msgid "" +"This vector saves required volumes to change from/to each tool used on the wipe tower. These values are used " +"to simplify creation of the full purging volumes below. " +msgstr "" +"이 벡터는 와이퍼 작동 타워에 사용되는 각 공구와 교환하는 데 필요한 볼륨을 저장한다. 이러한 값은 아래 전체 삭" +"제 볼륨 생성을 단순화하기 위해 사용된다. " + +#: src/libslic3r/PrintConfig.cpp:2111 +msgid "Purging volumes - matrix" +msgstr "볼륨 삭제 - 행렬" + +#: src/libslic3r/PrintConfig.cpp:2112 +msgid "" +"This matrix describes volumes (in cubic milimetres) required to purge the new filament on the wipe tower for " +"any given pair of tools. " +msgstr "이 매트릭스는 주어진 공구 쌍에 대해 새 필라멘트를 지우는 데 필요한 볼륨(입방 밀리미터)을 설명한다. " + +#: src/libslic3r/PrintConfig.cpp:2121 +msgid "Position X" +msgstr "X축 위치" + +#: src/libslic3r/PrintConfig.cpp:2122 +msgid "X coordinate of the left front corner of a wipe tower" +msgstr "와이프 타워의 좌측 전면 모서리의 X 좌표" + +#: src/libslic3r/PrintConfig.cpp:2128 +msgid "Position Y" +msgstr "Y축 위치" + +#: src/libslic3r/PrintConfig.cpp:2129 +msgid "Y coordinate of the left front corner of a wipe tower" +msgstr "와이퍼 작동 타워의 좌측 전방 모서리의 Y 좌표" + +#: src/libslic3r/PrintConfig.cpp:2136 +msgid "Width of a wipe tower" +msgstr "와이퍼 타워 폭" + +#: src/libslic3r/PrintConfig.cpp:2142 +msgid "Wipe tower rotation angle" +msgstr "와이퍼 타워 회전각도" + +#: src/libslic3r/PrintConfig.cpp:2143 +msgid "Wipe tower rotation angle with respect to x-axis " +msgstr "X 축에 대한 와이퍼 타워 각도 " + +#: src/libslic3r/PrintConfig.cpp:2144 src/libslic3r/PrintConfig.cpp:2565 +msgid "degrees" +msgstr "각도" + +#: src/libslic3r/PrintConfig.cpp:2150 +msgid "Wipe into this object's infill" +msgstr "이 오브젝트의 채우기로 지우기" + +#: src/libslic3r/PrintConfig.cpp:2151 +msgid "" +"Purging after toolchange will done inside this object's infills. This lowers the amount of waste but may " +"result in longer print time due to additional travel moves." +msgstr "" +"도구 변경 후 제거는 이 개체의 채우기 내부에서 수행 됩니다. 이렇게 하면 낭비 되는 양이 줄어들지만 추가적인 이동" +"으로 인해 인쇄 시간이 길어질 수 있습니다." + +#: src/libslic3r/PrintConfig.cpp:2158 +msgid "Wipe into this object" +msgstr "이 개체로 지우기" + +#: src/libslic3r/PrintConfig.cpp:2159 +msgid "" +"Object will be used to purge the nozzle after a toolchange to save material that would otherwise end up in " +"the wipe tower and decrease print time. Colours of the objects will be mixed as a result." +msgstr "" +"객체는 도구 변경 후 노즐을 소거 하는 데 사용 되며, 그렇지 않으면 와이프 타워에서 종료 되는 재료를 저장 하고 인" +"쇄 시간을 줄입니다. 그 결과 개체의 색상이 혼합 됩니다." + +#: src/libslic3r/PrintConfig.cpp:2165 +msgid "Maximal bridging distance" +msgstr "최대 브리징 거리" + +#: src/libslic3r/PrintConfig.cpp:2166 +msgid "Maximal distance between supports on sparse infill sections. " +msgstr "드문드문하 인필 섹션에서 지지대 사이의 최대 거리. " + +#: src/libslic3r/PrintConfig.cpp:2172 +msgid "XY Size Compensation" +msgstr "XY 크기 보정" + +#: src/libslic3r/PrintConfig.cpp:2174 +msgid "" +"The object will be grown/shrunk in the XY plane by the configured value (negative = inwards, positive = " +"outwards). This might be useful for fine-tuning hole sizes." +msgstr "" +"XY 평면에서 설정된 값(음수 = 안, 양 = 바깥쪽)에 따라 객체가 증가/정격된다. 이는 구멍 크기를 미세 조정하는데 유" +"용할 수 있다." + +#: src/libslic3r/PrintConfig.cpp:2182 +msgid "Z offset" +msgstr "Z 오프셋" + +#: src/libslic3r/PrintConfig.cpp:2183 +msgid "" +"This value will be added (or subtracted) from all the Z coordinates in the output G-code. It is used to " +"compensate for bad Z endstop position: for example, if your endstop zero actually leaves the nozzle 0.3mm far " +"from the print bed, set this to -0.3 (or fix your endstop)." +msgstr "" +"이 값은 출력 G-코드의 모든 Z 좌표에서 추가(또는 감산)된다. 예를 들어, 엔드 스톱 0이 실제로 노즐을 프린트 베드" +"에서 0.3mm 떨어진 곳에 둔 경우, 이를 -0.3(또는 엔드 스톱을 고정)으로 설정하십시오." + +#: src/libslic3r/PrintConfig.cpp:2200 +msgid "Display width" +msgstr "디스플레이 너비" + +#: src/libslic3r/PrintConfig.cpp:2201 +msgid "Width of the display" +msgstr "디스플레이의 폭입니다" + +#: src/libslic3r/PrintConfig.cpp:2206 +msgid "Display height" +msgstr "표시 높이" + +#: src/libslic3r/PrintConfig.cpp:2207 +msgid "Height of the display" +msgstr "디스플레이의 높이" + +#: src/libslic3r/PrintConfig.cpp:2212 +msgid "Number of pixels in" +msgstr "의 픽셀 수" + +#: src/libslic3r/PrintConfig.cpp:2214 +msgid "Number of pixels in X" +msgstr "X의 픽셀 수" + +#: src/libslic3r/PrintConfig.cpp:2220 +msgid "Number of pixels in Y" +msgstr "Y의 픽셀 수" + +#: src/libslic3r/PrintConfig.cpp:2225 +msgid "Display orientation" +msgstr "디스플레이 방향" + +#: src/libslic3r/PrintConfig.cpp:2226 +msgid "" +"Set the actual LCD display orientation inside the SLA printer. Portrait mode will flip the meaning of display " +"width and height parameters and the output images will be rotated by 90 degrees." +msgstr "" +"SLA 프린터 내에서 실제 LCD 디스플레이 방향을 설정 합니다. 세로 모드는 디스플레이 너비 및 높이 매개 변수의 의미" +"를 반전 하 고 출력 이미지는 90도 회전 합니다." + +#: src/libslic3r/PrintConfig.cpp:2232 +msgid "Landscape" +msgstr "가로" + +#: src/libslic3r/PrintConfig.cpp:2233 +msgid "Portrait" +msgstr "세로모드" + +#: src/libslic3r/PrintConfig.cpp:2238 +msgid "Fast" +msgstr "빠른" + +#: src/libslic3r/PrintConfig.cpp:2239 +msgid "Fast tilt" +msgstr "빠른 기울기" + +#: src/libslic3r/PrintConfig.cpp:2240 +msgid "Time of the fast tilt" +msgstr "기울이기 시간" + +#: src/libslic3r/PrintConfig.cpp:2247 +msgid "Slow" +msgstr "느리게" + +#: src/libslic3r/PrintConfig.cpp:2248 +msgid "Slow tilt" +msgstr "슬로우 틸트" + +#: src/libslic3r/PrintConfig.cpp:2249 +msgid "Time of the slow tilt" +msgstr "느린 기울기의 시간" + +#: src/libslic3r/PrintConfig.cpp:2256 +msgid "Area fill" +msgstr "영역 채우기" + +#: src/libslic3r/PrintConfig.cpp:2257 +msgid "" +"The percentage of the bed area. \n" +"If the print area exceeds the specified value, \n" +"then a slow tilt will be used, otherwise - a fast tilt" +msgstr "" +"침대 영역의 비율입니다. \n" +"인쇄 영역이 지정 된 값을 초과 하면 \n" +"그런 다음 느린 기울기가 사용 됩니다, 그렇지 않으면-빠른 기울기가 됩니다" + +#: src/libslic3r/PrintConfig.cpp:2264 src/libslic3r/PrintConfig.cpp:2265 src/libslic3r/PrintConfig.cpp:2266 +msgid "Printer scaling correction" +msgstr "프린터 스케일링 보정" + +#: src/libslic3r/PrintConfig.cpp:2272 src/libslic3r/PrintConfig.cpp:2273 +msgid "Printer absolute correction" +msgstr "프린터 절대 보정" + +#: src/libslic3r/PrintConfig.cpp:2274 +msgid "Will inflate or deflate the sliced 2D polygons according to the sign of the correction." +msgstr "교정 기호에 따라 슬라이스된 2D 폴리곤을 팽창 하거나 수축 합니다." + +#: src/libslic3r/PrintConfig.cpp:2280 src/libslic3r/PrintConfig.cpp:2281 +msgid "Printer gamma correction" +msgstr "프린터 감마 보정" + +#: src/libslic3r/PrintConfig.cpp:2282 +msgid "This will apply a gamm correction to the rasterized 2D polygons." +msgstr "그러면 래스터화된 2d 다각형 폴리고 보정이 적용 됩니다." + +#: src/libslic3r/PrintConfig.cpp:2291 src/libslic3r/PrintConfig.cpp:2292 +msgid "Initial layer height" +msgstr "초기 레이어 높이" + +#: src/libslic3r/PrintConfig.cpp:2298 +msgid "Faded layers" +msgstr "페이드 레이어" + +#: src/libslic3r/PrintConfig.cpp:2299 +msgid "Number of the layers needed for the exposure time fade from initial exposure time to the exposure time" +msgstr "노출 시간에 필요한 레이어 수는 초기 노출 시간에서 노출 시간으로 페이드" + +#: src/libslic3r/PrintConfig.cpp:2306 src/libslic3r/PrintConfig.cpp:2307 +msgid "Exposure time" +msgstr "노출 시간" + +#: src/libslic3r/PrintConfig.cpp:2313 src/libslic3r/PrintConfig.cpp:2314 +msgid "Initial exposure time" +msgstr "초기 노출 시간" + +#: src/libslic3r/PrintConfig.cpp:2320 src/libslic3r/PrintConfig.cpp:2321 +msgid "Correction for expansion" +msgstr "확장 보정" + +#: src/libslic3r/PrintConfig.cpp:2327 +msgid "SLA print material notes" +msgstr "SLA 인쇄 재료 참고 사항" + +#: src/libslic3r/PrintConfig.cpp:2328 +msgid "You can put your notes regarding the SLA print material here." +msgstr "여기에서 SLA 인쇄 자료에 대한 메모를 넣을 수 있습니다." + +#: src/libslic3r/PrintConfig.cpp:2336 src/libslic3r/PrintConfig.cpp:2347 +msgid "Default SLA material profile" +msgstr "기본 SLA 재질 프로 파일" + +#: src/libslic3r/PrintConfig.cpp:2358 +msgid "Generate supports" +msgstr "지원 생성" + +#: src/libslic3r/PrintConfig.cpp:2360 +msgid "Generate supports for the models" +msgstr "모델에 대한 지원 생성" + +#: src/libslic3r/PrintConfig.cpp:2365 +msgid "Support head front diameter" +msgstr "서포트 헤드 전면 지름" + +#: src/libslic3r/PrintConfig.cpp:2367 +msgid "Diameter of the pointing side of the head" +msgstr "헤드 포인팅 측면 지름" + +#: src/libslic3r/PrintConfig.cpp:2374 +msgid "Support head penetration" +msgstr "서포트 헤드 관통" + +#: src/libslic3r/PrintConfig.cpp:2376 +msgid "How much the pinhead has to penetrate the model surface" +msgstr "핀 헤드가 모델 표면에 침투 하는 정도" + +#: src/libslic3r/PrintConfig.cpp:2383 +msgid "Support head width" +msgstr "서포트 헤드 폭" + +#: src/libslic3r/PrintConfig.cpp:2385 +msgid "Width from the back sphere center to the front sphere center" +msgstr "뒤쪽 구 중심에서 앞쪽 구 중심 까지의 폭입니다" + +#: src/libslic3r/PrintConfig.cpp:2393 +msgid "Support pillar diameter" +msgstr "서포트 기둥 지름" + +#: src/libslic3r/PrintConfig.cpp:2395 +msgid "Diameter in mm of the support pillars" +msgstr "서포트 기둥의 지름 (mm)" + +#: src/libslic3r/PrintConfig.cpp:2403 +msgid "Support pillar connection mode" +msgstr "기둥 연결 모드 지원" + +#: src/libslic3r/PrintConfig.cpp:2404 +msgid "" +"Controls the bridge type between two neigboring pillars. Can be zig-zag, cross (double zig-zag) or dynamic " +"which will automatically switch between the first two depending on the distance of the two pillars." +msgstr "" +"두 개의 neigboring 기둥 사이의 브릿지 유형을 제어 합니다. 두 기둥의 거리에 따라 자동으로 처음 두 사이를 전환 " +"하는 지그재그, 크로스 (지그재그 더블 지그재그) 또는 동적 수 있습니다." + +#: src/libslic3r/PrintConfig.cpp:2412 +msgid "Zig-Zag" +msgstr "지그재그" + +#: src/libslic3r/PrintConfig.cpp:2413 +msgid "Cross" +msgstr "크로스" + +#: src/libslic3r/PrintConfig.cpp:2414 +msgid "Dynamic" +msgstr "동적" + +#: src/libslic3r/PrintConfig.cpp:2426 +msgid "Pillar widening factor" +msgstr "기둥 확장 계수" + +#: src/libslic3r/PrintConfig.cpp:2428 +msgid "" +"Merging bridges or pillars into another pillars can increase the radius. Zero means no increase, one means " +"full increase." +msgstr "" +"브릿지 또는 기둥을 다른 기둥에 병합 하면 반지름을 늘릴 수 있습니다. 0은 증가 없음을 의미 하나는 전체 증가를 의" +"미 합니다." + +#: src/libslic3r/PrintConfig.cpp:2437 +msgid "Support base diameter" +msgstr "서포트 베이스 지름" + +#: src/libslic3r/PrintConfig.cpp:2439 +msgid "Diameter in mm of the pillar base" +msgstr "기둥 베이스의 mm 직경" + +#: src/libslic3r/PrintConfig.cpp:2447 +msgid "Support base height" +msgstr "서포트 기준 높이" + +#: src/libslic3r/PrintConfig.cpp:2449 +msgid "The height of the pillar base cone" +msgstr "서포트 베이스 원추의 높이" + +#: src/libslic3r/PrintConfig.cpp:2456 +msgid "Critical angle" +msgstr "임계 각도" + +#: src/libslic3r/PrintConfig.cpp:2458 +msgid "The default angle for connecting support sticks and junctions." +msgstr "서포트 스틱과 접합부를 연결 하는 기본 각도입니다." + +#: src/libslic3r/PrintConfig.cpp:2466 +msgid "Max bridge length" +msgstr "최대 브리지 길이" + +#: src/libslic3r/PrintConfig.cpp:2468 +msgid "The max length of a bridge" +msgstr "브릿지의 최대 길이" + +#: src/libslic3r/PrintConfig.cpp:2475 +msgid "Max pillar linking distance" +msgstr "최대 기둥 연결 거리" + +#: src/libslic3r/PrintConfig.cpp:2477 +msgid "" +"The max distance of two pillars to get linked with each other. A zero value will prohibit pillar cascading." +msgstr "서로 연결 되는 두기둥의 최대 거리. 0 값은 기둥을 계단식으로 금지 합니다." + +#: src/libslic3r/PrintConfig.cpp:2485 +msgid "Object elevation" +msgstr "객체 고도" + +#: src/libslic3r/PrintConfig.cpp:2487 +msgid "How much the supports should lift up the supported object." +msgstr "서포트 되는 개체를 서포트 해야 하는 정도입니다." + +#: src/libslic3r/PrintConfig.cpp:2495 +msgid "Support points density" +msgstr "지원 포인트 밀도" + +#: src/libslic3r/PrintConfig.cpp:2497 +msgid "This is a relative measure of support points density." +msgstr "이는 서포트 점 밀도의 상대적인 척도입니다." + +#: src/libslic3r/PrintConfig.cpp:2503 +msgid "Minimal distance of the support points" +msgstr "서포트 지점의 최소 거리" + +#: src/libslic3r/PrintConfig.cpp:2505 +msgid "No support points will be placed closer than this threshold." +msgstr "서포트 지점은 이 임계값 보다 더 가깝게 배치 되지 않습니다." + +#: src/libslic3r/PrintConfig.cpp:2511 +msgid "Use pad" +msgstr "패드 사용" + +#: src/libslic3r/PrintConfig.cpp:2513 +msgid "Add a pad underneath the supported model" +msgstr "서포트 되는 모델 아래에 패드 추가" + +#: src/libslic3r/PrintConfig.cpp:2518 +msgid "Pad wall thickness" +msgstr "패드 벽 두께" + +#: src/libslic3r/PrintConfig.cpp:2520 +msgid "The thickness of the pad and its optional cavity walls." +msgstr "패드의 두께와 옵션 캐비티 벽." + +#: src/libslic3r/PrintConfig.cpp:2528 +msgid "Pad wall height" +msgstr "패드 벽 높이" + +#: src/libslic3r/PrintConfig.cpp:2529 +msgid "Defines the cavity depth. Set to zero to disable the cavity." +msgstr "캐비티 깊이를 정의 합니다. 캐비티를 비활성화 하려면 0으로 설정 합니다." + +#: src/libslic3r/PrintConfig.cpp:2539 +msgid "Max merge distance" +msgstr "최대 병합 거리" + +#: src/libslic3r/PrintConfig.cpp:2541 +msgid "" +"Some objects can get along with a few smaller pads instead of a single big one. This parameter defines how " +"far the center of two smaller pads should be. If theyare closer, they will get merged into one pad." +msgstr "" +"일부 개체는 큰 하나 대신 몇 가지 작은 패드와 함께 얻을 수 있습니다. 이 매개 변수는 두 개의 작은 패드의 중심이 " +"얼마나 되어야 하는지 정의 합니다. 그들은 하나의 패드에 병합을 얻을 것이다." + +#: src/libslic3r/PrintConfig.cpp:2552 +msgid "Pad edge radius" +msgstr "패드 가장자리 반경" + +#: src/libslic3r/PrintConfig.cpp:2561 +msgid "Pad wall slope" +msgstr "패드 벽 경사" + +#: src/libslic3r/PrintConfig.cpp:2563 +msgid "The slope of the pad wall relative to the bed plane. 90 degrees means straight walls." +msgstr "침대 평면을 기준으로 하는 패드 벽의 기울기입니다. 90도는 직선 벽을 의미 합니다." + +#: src/libslic3r/PrintConfig.cpp:2924 +msgid "Export SVG" +msgstr "내보내기 SVG" + +#: src/libslic3r/PrintConfig.cpp:2925 +msgid "Export the model(s) as OBJ." +msgstr "모델을 OBJ로 내보냅니다." + +#: src/libslic3r/PrintConfig.cpp:2936 +msgid "Export SLA" +msgstr "STL로 내보내기" + +#: src/libslic3r/PrintConfig.cpp:2937 +msgid "Slice the model and export SLA printing layers as PNG." +msgstr "모델을 분할하고 SLA 인쇄 레이어를 PNG로 내보냅니다." + +#: src/libslic3r/PrintConfig.cpp:2942 +msgid "Export 3MF" +msgstr "3MF 내보내기" + +#: src/libslic3r/PrintConfig.cpp:2943 +msgid "Export the model(s) as 3MF." +msgstr "모델을 3MF로 내보냅니다." + +#: src/libslic3r/PrintConfig.cpp:2947 +msgid "Export AMF" +msgstr "AMF 내보내기" + +#: src/libslic3r/PrintConfig.cpp:2948 +msgid "Export the model(s) as AMF." +msgstr "모델을 AMF로 내보냅니다." + +#: src/libslic3r/PrintConfig.cpp:2952 +msgid "Export STL" +msgstr "STL 내보내기" + +#: src/libslic3r/PrintConfig.cpp:2953 +msgid "Export the model(s) as STL." +msgstr "모델을 STL로 내보냅니다." + +#: src/libslic3r/PrintConfig.cpp:2958 +msgid "Slice the model and export toolpaths as G-code." +msgstr "모델을 슬라이스하고 공구 경로를 G 코드로 내보냅니다." + +#: src/libslic3r/PrintConfig.cpp:2963 +msgid "Slice" +msgstr "슬라이스" + +#: src/libslic3r/PrintConfig.cpp:2964 +msgid "Slice the model as FFF or SLA based on the printer_technology configuration value." +msgstr "Printer_technology 구성 값을 기반으로 모델을 FFF 또는 SLA로 조각화 합니다." + +#: src/libslic3r/PrintConfig.cpp:2969 +msgid "Help" +msgstr "도움말" + +#: src/libslic3r/PrintConfig.cpp:2970 +msgid "Show this help." +msgstr "이 도움말을 표시 합니다." + +#: src/libslic3r/PrintConfig.cpp:2975 +msgid "Help (FFF options)" +msgstr "도움말 (FFF 옵션)" + +#: src/libslic3r/PrintConfig.cpp:2976 +msgid "Show the full list of print/G-code configuration options." +msgstr "인쇄/G 코드 구성 옵션의 전체 목록을 표시 합니다." + +#: src/libslic3r/PrintConfig.cpp:2980 +msgid "Help (SLA options)" +msgstr "도움말 (SLA 옵션)" + +#: src/libslic3r/PrintConfig.cpp:2981 +msgid "Show the full list of SLA print configuration options." +msgstr "SLA 인쇄 구성 옵션의 전체 목록을 표시 합니다." + +#: src/libslic3r/PrintConfig.cpp:2985 +msgid "Output Model Info" +msgstr "출력 모델 정보" + +#: src/libslic3r/PrintConfig.cpp:2986 +msgid "Write information about the model to the console." +msgstr "모델에 대한 정보를 콘솔에 씁니다." + +#: src/libslic3r/PrintConfig.cpp:2990 +msgid "Save config file" +msgstr "구성 파일 저장" + +#: src/libslic3r/PrintConfig.cpp:2991 +msgid "Save configuration to the specified file." +msgstr "지정 된 파일에 구성을 저장 합니다." + +#: src/libslic3r/PrintConfig.cpp:3001 +msgid "Align XY" +msgstr "XY 정렬" + +#: src/libslic3r/PrintConfig.cpp:3002 +msgid "Align the model to the given point." +msgstr "모델을 지정된 점에 맞춥니다." + +#: src/libslic3r/PrintConfig.cpp:3007 +msgid "Cut model at the given Z." +msgstr "지정된 Z에서 모델을 잘라냅니다." + +#: src/libslic3r/PrintConfig.cpp:3028 +msgid "Center" +msgstr "중앙" + +#: src/libslic3r/PrintConfig.cpp:3029 +msgid "Center the print around the given center." +msgstr "지정된 중심을 중심으로 인쇄 합니다." + +#: src/libslic3r/PrintConfig.cpp:3033 +msgid "Don't arrange" +msgstr "준비하지 마십시오" + +#: src/libslic3r/PrintConfig.cpp:3034 +msgid "Do not rearrange the given models before merging and keep their original XY coordinates." +msgstr "병합하기 전에 지정된 모델을 재정렬하고 원래 XY 좌표를 유지하지 마십시오." + +#: src/libslic3r/PrintConfig.cpp:3037 +msgid "Duplicate" +msgstr "복사" + +#: src/libslic3r/PrintConfig.cpp:3038 +msgid "Multiply copies by this factor." +msgstr "이 계수로 복사본을 곱합니다." + +#: src/libslic3r/PrintConfig.cpp:3042 +msgid "Duplicate by grid" +msgstr "모눈에 따라 복제" + +#: src/libslic3r/PrintConfig.cpp:3043 +msgid "Multiply copies by creating a grid." +msgstr "격자를 만들어 복사본을 곱합니다." + +#: src/libslic3r/PrintConfig.cpp:3046 +msgid "Merge" +msgstr "병합" + +#: src/libslic3r/PrintConfig.cpp:3047 +msgid "" +"Arrange the supplied models in a plate and merge them in a single model in order to perform actions once." +msgstr "한 번 작업을 수행하기 위해 제공 된 모델을 정렬하고 단일 모델로 병합 합니다." + +#: src/libslic3r/PrintConfig.cpp:3052 +msgid "" +"Try to repair any non-manifold meshes (this option is implicitly added whenever we need to slice the model to " +"perform the requested action)." +msgstr "" +"비 다양체 메쉬를 복구 하십시오 (요청 된 작업을 수행 하기 위해 모델을 슬라이스 해야 할때마다 이 옵션이 암시적으" +"로 추가 됨)." + +#: src/libslic3r/PrintConfig.cpp:3056 +msgid "Rotation angle around the Z axis in degrees." +msgstr "Z 축 주위의 회전 각도입니다." + +#: src/libslic3r/PrintConfig.cpp:3060 +msgid "Rotate around X" +msgstr "X 주위 회전" + +#: src/libslic3r/PrintConfig.cpp:3061 +msgid "Rotation angle around the X axis in degrees." +msgstr "X 축을 중심으로 회전 각도 (도)입니다." + +#: src/libslic3r/PrintConfig.cpp:3065 +msgid "Rotate around Y" +msgstr "Y 주위로 회전" + +#: src/libslic3r/PrintConfig.cpp:3066 +msgid "Rotation angle around the Y axis in degrees." +msgstr "Y 축을 중심으로 회전 각도 (도)입니다." + +#: src/libslic3r/PrintConfig.cpp:3071 +msgid "Scaling factor or percentage." +msgstr "배율 인수 또는 백분율입니다." + +#: src/libslic3r/PrintConfig.cpp:3076 +msgid "Detect unconnected parts in the given model(s) and split them into separate objects." +msgstr "지정 된 모델에서 연결 되지 않은 부품을 감지 하 여 별도의 객체로 분할 합니다." + +#: src/libslic3r/PrintConfig.cpp:3079 +msgid "Scale to Fit" +msgstr "크기에 맞게 조정" + +#: src/libslic3r/PrintConfig.cpp:3080 +msgid "Scale to fit the given volume." +msgstr "지정 된 볼륨에 맞게 크기를 조정 합니다." + +#: src/libslic3r/PrintConfig.cpp:3089 +msgid "Ignore non-existent config files" +msgstr "존재 하지 않는 구성 파일 무시" + +#: src/libslic3r/PrintConfig.cpp:3090 +msgid "Do not fail if a file supplied to --load does not exist." +msgstr "로드에 제공 된 파일이 없는 경우 실패 하지 않습니다." + +#: src/libslic3r/PrintConfig.cpp:3093 +msgid "Load config file" +msgstr "구성 파일 로드" + +#: src/libslic3r/PrintConfig.cpp:3094 +msgid "" +"Load configuration from the specified file. It can be used more than once to load options from multiple files." +msgstr "지정 된 파일에서 구성을 로드 합니다. 여러 파일에서 옵션을 로드 하는 데 두 번 이상 사용할 수 있습니다." + +#: src/libslic3r/PrintConfig.cpp:3097 +msgid "Output File" +msgstr "출력파일" + +#: src/libslic3r/PrintConfig.cpp:3098 +msgid "The file where the output will be written (if not specified, it will be based on the input file)." +msgstr "출력이 기록 되는 파일 (지정 하지 않은 경우 입력 파일을 기반으로 합니다)." + +#: src/libslic3r/PrintConfig.cpp:3108 +msgid "Data directory" +msgstr "데이터 디렉터리" + +#: src/libslic3r/PrintConfig.cpp:3109 +msgid "" +"Load and store settings at the given directory. This is useful for maintaining different profiles or " +"including configurations from a network storage." +msgstr "" +"지정 된 디렉터리에 설정을 로드 하 고 저장 합니다. 이 기능은 다른 프로 파일을 유지 관리 하거나 네트워크 스토리" +"지의 구성을 포함 하는 데 유용 합니다." + +#: src/libslic3r/PrintConfig.cpp:3112 +msgid "Logging level" +msgstr "로깅 수준" + +#: src/libslic3r/PrintConfig.cpp:3113 +msgid "" +"Messages with severity lower or eqal to the loglevel will be printed out. 0:trace, 1:debug, 2:info, 3:" +"warning, 4:error, 5:fatal" +msgstr "심각도가 낮은 또는 eqal로 loglevel으로 메시지가 인쇄 됩니다. 추적, 1: 디버그, 2: 경고, 오류 5: 치명적" + +#: src/libslic3r/GCode/PreviewData.cpp:176 +msgid "Mixed" +msgstr "뒤석음" + +#: src/libslic3r/GCode/PreviewData.cpp:396 +msgid "Height (mm)" +msgstr "높이 (mm)" + +#: src/libslic3r/GCode/PreviewData.cpp:398 +msgid "Width (mm)" +msgstr "폭 (mm)" + +#: src/libslic3r/GCode/PreviewData.cpp:400 +msgid "Speed (mm/s)" +msgstr "속도 (mm/s)" + +#: src/libslic3r/GCode/PreviewData.cpp:402 +msgid "Volumetric flow rate (mm3/s)" +msgstr "용적 유량값 (mm3/s)" + +#: src/libslic3r/GCode/PreviewData.cpp:491 +msgid "Default print color" +msgstr "기본 인쇄 색상" + +#: src/libslic3r/GCode/PreviewData.cpp:495 +#, c-format +msgid "up to %.2f mm" +msgstr "최대%.2f mm" + +#: src/libslic3r/GCode/PreviewData.cpp:499 +#, c-format +msgid "above %.2f mm" +msgstr "above %.2f mm" + +#: src/libslic3r/GCode/PreviewData.cpp:504 +#, c-format +msgid "%.2f - %.2f mm" +msgstr "%.2f - %.2f mm" From df6219e58301404b58afe68ca4bb01ca00b88a9b Mon Sep 17 00:00:00 2001 From: lee hakmin Date: Tue, 21 May 2019 09:10:12 +0900 Subject: [PATCH 002/336] Add files via upload --- resources/localization/ko_KR/PrusaSlicer.po | 26 ++++++++++----------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/resources/localization/ko_KR/PrusaSlicer.po b/resources/localization/ko_KR/PrusaSlicer.po index d6e68d8f86..e5a18dd507 100644 --- a/resources/localization/ko_KR/PrusaSlicer.po +++ b/resources/localization/ko_KR/PrusaSlicer.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: slic3rkorean\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-04-09 14:34+0200\n" -"PO-Revision-Date: 2019-05-21 03:42+0900\n" +"PO-Revision-Date: 2019-05-18 13:25+0900\n" "Last-Translator: lee hak-min \n" "Language-Team: ulsanether\n" "Language: ko_KR\n" @@ -671,7 +671,7 @@ msgstr "아래쪽 부분을 위쪽으로 회전" #: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:36 src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:198 msgid "Perform cut" -msgstr "절단 실행" +msgstr "" #: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:43 msgid "Cut object:" @@ -679,19 +679,19 @@ msgstr "객체 잘라내기:" #: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:88 msgid "Cut [C]" -msgstr "자르기 [C]" +msgstr "" #: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:188 src/libslic3r/PrintConfig.cpp:3006 msgid "Cut" -msgstr "컷" +msgstr "" #: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:193 msgid "Keep upper part" -msgstr "상위 부분 유지" +msgstr "" #: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:194 msgid "Keep lower part" -msgstr "낮은 부분 유지" +msgstr "" #: src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp:32 msgid "Place on face [F]" @@ -751,31 +751,31 @@ msgstr "선택한 점 제거" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:626 src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:679 msgid "Remove all points" -msgstr "모든 점 제거" +msgstr "" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:631 msgid "Apply changes" -msgstr "변경 내용을 적용" +msgstr "" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:636 msgid "Discard changes" -msgstr "변경사항을 취소" +msgstr "" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:644 msgid "Minimal points distance: " -msgstr "최소 포인트 거리: " +msgstr "" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:655 msgid "Support points density: " -msgstr "지원 포인트 밀도: " +msgstr "" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:669 msgid "Auto-generate points [A]" -msgstr "점 자동 생성 [A]" +msgstr "" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:675 msgid "Manual editing [M]" -msgstr "수동 편집 [M]" +msgstr "" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:738 msgid "SLA Support Points [L]" From 883e00a0575f786f000c3b95281ad808eb0c74bc Mon Sep 17 00:00:00 2001 From: lee hakmin Date: Fri, 24 May 2019 00:40:15 +0900 Subject: [PATCH 003/336] Add files via upload --- resources/localization/ko_KR/PrusaSlicer.mo | Bin 192764 -> 194020 bytes resources/localization/ko_KR/PrusaSlicer.po | 707 +++++++++++--------- 2 files changed, 393 insertions(+), 314 deletions(-) diff --git a/resources/localization/ko_KR/PrusaSlicer.mo b/resources/localization/ko_KR/PrusaSlicer.mo index fc5eaf254b4e2c7f500bbffb58334c7ef74bb6e2..8e1edfd474b1f2b20c0a95919330b2b7caeb1ed7 100644 GIT binary patch delta 37622 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 LobT3Ccb5MH=|?tv delta 36473 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\n" "Language-Team: ulsanether\n" "Language: ko_KR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.2.2\n" +"X-Generator: Poedit 2.2.3\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Crowdin-Project: slic3rkorean\n" "X-Crowdin-Language: ko\n" "X-Crowdin-File: ko_KR.po\n" -#: src/slic3r/GUI/AboutDialog.cpp:35 -msgid "About Slic3r" -msgstr "Slic3r에 대하여" +#: src/slic3r/GUI/AboutDialog.cpp:194 +#, c-format +msgid "About %s" +msgstr "%s에 대하여" #: src/slic3r/GUI/AboutDialog.cpp:64 src/slic3r/GUI/MainFrame.cpp:52 msgid "Version" @@ -243,7 +244,7 @@ msgstr "대체 노즐:" #: src/slic3r/GUI/ConfigWizard.cpp:181 msgid "All standard" -msgstr "모든 표준" +msgstr "모두 표준설정" #: src/slic3r/GUI/ConfigWizard.cpp:182 src/slic3r/GUI/Tab.cpp:2909 msgid "All" @@ -253,10 +254,10 @@ msgstr "모두 선택" msgid "None" msgstr "없음" -#: src/slic3r/GUI/ConfigWizard.cpp:284 +#: src/slic3r/GUI/ConfigWizard.cpp:298 #, c-format -msgid "Welcome to the Slic3r %s" -msgstr "Slic3r %s에 오신것을 환영 합니다" +msgid "Welcome to the %s Configuration Wizard" +msgstr "%s에 오신것을 환영 합니다." #: src/slic3r/GUI/ConfigWizard.cpp:284 msgid "Welcome" @@ -280,83 +281,86 @@ msgstr "" msgid "Remove user profiles - install from scratch (a snapshot will be taken beforehand)" msgstr "사용자 프로필 제거-처음부터 설치 (스냅숏은 사전에 수행 됩니다)" -#: src/slic3r/GUI/ConfigWizard.cpp:325 +#: src/slic3r/GUI/ConfigWizard.cpp:342 #, c-format msgid "%s Family" -msgstr "%s 가족" +msgstr "%s의 가족들" -#: src/slic3r/GUI/ConfigWizard.cpp:362 +#: src/slic3r/GUI/ConfigWizard.cpp:379 msgid "Custom Printer Setup" msgstr "사용자 지정 프린터 설정" -#: src/slic3r/GUI/ConfigWizard.cpp:362 +#: src/slic3r/GUI/ConfigWizard.cpp:379 msgid "Custom Printer" msgstr "사용자 정의 프린터" -#: src/slic3r/GUI/ConfigWizard.cpp:364 +#: src/slic3r/GUI/ConfigWizard.cpp:381 msgid "Define a custom printer profile" msgstr "사용자 정의 프린터 프로필 정의" -#: src/slic3r/GUI/ConfigWizard.cpp:366 +#: src/slic3r/GUI/ConfigWizard.cpp:383 msgid "Custom profile name:" msgstr "사용자 지정 프로필 이름:" -#: src/slic3r/GUI/ConfigWizard.cpp:390 +#: src/slic3r/GUI/ConfigWizard.cpp:407 msgid "Automatic updates" msgstr "자동 업데이트" -#: src/slic3r/GUI/ConfigWizard.cpp:390 +#: src/slic3r/GUI/ConfigWizard.cpp:407 msgid "Updates" msgstr "업데이트" -#: src/slic3r/GUI/ConfigWizard.cpp:398 src/slic3r/GUI/Preferences.cpp:59 +#: src/slic3r/GUI/ConfigWizard.cpp:415 src/slic3r/GUI/Preferences.cpp:61 msgid "Check for application updates" msgstr "프로그램 업데이트 확인" -#: src/slic3r/GUI/ConfigWizard.cpp:401 src/slic3r/GUI/Preferences.cpp:61 +#: src/slic3r/GUI/ConfigWizard.cpp:419 +#, c-format msgid "" -"If enabled, Slic3r checks for new versions of Slic3r PE online. When a new version becomes available a " +"If enabled, %s checks for new application versions online. When a new version becomes available, a " "notification is displayed at the next application startup (never during program usage). This is only a " "notification mechanisms, no automatic installation is done." msgstr "" -"활성화 된 경우 Slic3r은 Slic3r PE 온라인의 새 버전을 확인합니다. 새 버전을 사용할 수있게되면 다음 응용 프로그" -"램 시작시 알림이 표시됩니다 (프로그램 사용 중에는 절대로 사용하지 마십시오). 이것은 알림 메커니즘 일뿐 자동 설" -"치가 수행되지 않습니다." +"활성화 된 경우 %s은 온라인의 새 버전을 확인합니다. 새 버전을 사용할 수있게되면 다음 응용 프로그램 시작시 알림" +"이 표시됩니다 (프로그램 사용 중에는 절대로 사용하지 마십시오).이것은 알림 메커니즘 일뿐 자동 설치가 수행되지 " +"않습니다." -#: src/slic3r/GUI/ConfigWizard.cpp:405 src/slic3r/GUI/Preferences.cpp:67 +#: src/slic3r/GUI/ConfigWizard.cpp:425 src/slic3r/GUI/Preferences.cpp:69 msgid "Update built-in Presets automatically" msgstr "기존의 설정 자동 업데이트" -#: src/slic3r/GUI/ConfigWizard.cpp:408 src/slic3r/GUI/Preferences.cpp:69 +#: src/slic3r/GUI/ConfigWizard.cpp:429 +#, c-format msgid "" -"If enabled, Slic3r downloads updates of built-in system presets in the background. These updates are " -"downloaded into a separate temporary location. When a new preset version becomes available it is offered at " -"application startup." +"If enabled, %s downloads updates of built-in system presets in the background.These updates are downloaded " +"into a separate temporary location.When a new preset version becomes available it is offered at application " +"startup." msgstr "" -"활성화 된 경우 Slic3r은 백그라운드에서 내장 시스템 사전 설정의 업데이트를 다운로드합니다. 이러한 업데이트는 별" -"도의 임시 위치에 다운로드됩니다. 새로운 사전 설정 버전을 사용할 수있게되면 응용 프로그램 시작시 제공됩니다." +"활성화 된 경우 %s은 백그라운드에서 내장 시스템 사전 설정의 업데이트를 다운로드합니다. 이러한 업데이트는 별도" +"의 임시 위치에 다운로드됩니다. 새로운 사전 설정 버전을 사용할 수있게되면 응용 프로그램 시작시 제공됩니다." -#: src/slic3r/GUI/ConfigWizard.cpp:409 +#: src/slic3r/GUI/ConfigWizard.cpp:432 msgid "Updates are never applied without user's consent and never overwrite user's customized settings." msgstr "업데이트는 사용자의 동의없이 적용되지 않으며 사용자의 사용자 지정된 설정을 덮어 쓰지 않습니다." -#: src/slic3r/GUI/ConfigWizard.cpp:414 +#: src/slic3r/GUI/ConfigWizard.cpp:437 msgid "Additionally a backup snapshot of the whole configuration is created before an update is applied." msgstr "또한 업데이트가 적용되기 전에 전체 구성의 백업 스냅 샷이 생성됩니다." -#: src/slic3r/GUI/ConfigWizard.cpp:421 +#: src/slic3r/GUI/ConfigWizard.cpp:444 msgid "Other Vendors" msgstr "다른 공급 업체" -#: src/slic3r/GUI/ConfigWizard.cpp:423 -msgid "Pick another vendor supported by Slic3r PE:" -msgstr "Slic3r PE가 지원하는 다른 공급 업체를 선택하십시오:" +#: src/slic3r/GUI/ConfigWizard.cpp:446 +#, c-format +msgid "Pick another vendor supported by %s:" +msgstr "%s가 지원하는 다른 공급 업체를 선택하십시오:" -#: src/slic3r/GUI/ConfigWizard.cpp:469 +#: src/slic3r/GUI/ConfigWizard.cpp:492 msgid "Firmware Type" msgstr "펌웨어 타입" -#: src/slic3r/GUI/ConfigWizard.cpp:469 src/slic3r/GUI/Tab.cpp:1870 +#: src/slic3r/GUI/ConfigWizard.cpp:492 src/slic3r/GUI/Tab.cpp:1957 msgid "Firmware" msgstr "펌웨어" @@ -671,7 +675,7 @@ msgstr "아래쪽 부분을 위쪽으로 회전" #: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:36 src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:198 msgid "Perform cut" -msgstr "" +msgstr "절단 실행" #: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:43 msgid "Cut object:" @@ -679,27 +683,27 @@ msgstr "객체 잘라내기:" #: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:88 msgid "Cut [C]" -msgstr "" +msgstr "자르기 [C]" #: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:188 src/libslic3r/PrintConfig.cpp:3006 msgid "Cut" -msgstr "" +msgstr "자르기" #: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:193 msgid "Keep upper part" -msgstr "" +msgstr "상위 부분 유지" #: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:194 msgid "Keep lower part" -msgstr "" +msgstr "낮은 부분 유지" #: src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp:32 -msgid "Place on face [F]" -msgstr "면 배치 [F]" +msgid "Place on face" +msgstr "면 배치 " -#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:51 -msgid "Move [M]" -msgstr "이동 [M]" +#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:52 +msgid "Move" +msgstr "이동" #: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:176 msgid "Position (mm)" @@ -719,7 +723,7 @@ msgstr "회전 (°)" #: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:51 msgid "Scale [S]" -msgstr "스케일 [S]" +msgstr "크기 [S]" #: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:276 msgid "Scale (%)" @@ -737,49 +741,53 @@ msgstr "마우스 오른쪽 버튼 클릭-점 제거" msgid "Shift + Left (+ drag) - select point(s)" msgstr "Shift + 왼쪽 (+ 끌기)-점 선택" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:606 -msgid "Head diameter: " +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:840 +msgid "Head diameter" msgstr "헤드 지름: " -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:618 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:856 msgid "Lock supports under new islands" msgstr "새 고립 영역에서 잠금 지원" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:622 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:860 src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1249 msgid "Remove selected points" msgstr "선택한 점 제거" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:626 src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:679 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:864 src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:921 msgid "Remove all points" -msgstr "" +msgstr "모든 점 제거" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:631 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:869 src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1252 msgid "Apply changes" -msgstr "" +msgstr "변경 내용을 적용" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:636 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:874 src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1253 msgid "Discard changes" -msgstr "" +msgstr "변경사항을 취소" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:644 -msgid "Minimal points distance: " -msgstr "" +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:881 +msgid "Minimal points distance" +msgstr "최소 포인트 거리: " -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:655 -msgid "Support points density: " -msgstr "" +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:882 src/libslic3r/PrintConfig.cpp:2534 +msgid "Support points density" +msgstr "지원 포인트 밀도" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:669 -msgid "Auto-generate points [A]" -msgstr "" +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:911 src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1255 +msgid "Auto-generate points" +msgstr "점 자동 생성" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:675 -msgid "Manual editing [M]" -msgstr "" +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:917 +msgid "Manual editing" +msgstr "수동 편집" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:738 -msgid "SLA Support Points [L]" -msgstr "SLA 지원 포인트 [L]" +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:934 +msgid "Clipping of view" +msgstr "클립핑 보기" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1007 +msgid "SLA Support Points" +msgstr "SLA 지원 포인트" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:767 msgid "Do you want to save your manually edited support points ?\n" @@ -889,10 +897,9 @@ msgstr "응용 프로그램 환경 설정" msgid "Add..." msgstr "추가..." -#: src/slic3r/GUI/GLCanvas3D.cpp:3455 src/slic3r/GUI/Plater.cpp:3341 -#, fuzzy +#: src/slic3r/GUI/GLCanvas3D.cpp:3455 src/slic3r/GUI/Plater.cpp:3375 msgid "Delete all" -msgstr "전부 지움" +msgstr "전부 지우기" #: src/slic3r/GUI/GLCanvas3D.cpp:3491 msgid "Paste" @@ -914,59 +921,65 @@ msgstr "객체로 분할" msgid "Split to parts" msgstr "파트로 분할" +#: src/slic3r/GUI/GLCanvas3D.cpp:3559 +msgid "Layers editing" +msgstr "레이어층을 편집" + #: src/slic3r/GUI/GUI_App.cpp:616 src/slic3r/GUI/wxExtensions.cpp:2446 msgid "Simple" msgstr "단순" -#: src/slic3r/GUI/GUI_App.cpp:616 +#: src/slic3r/GUI/GUI_App.cpp:729 msgid "Simple View Mode" msgstr "단순 보기 모드" -#: src/slic3r/GUI/GUI_App.cpp:617 src/slic3r/GUI/GUI_ObjectList.cpp:73 src/slic3r/GUI/Tab.cpp:977 -#: src/slic3r/GUI/Tab.cpp:992 src/slic3r/GUI/Tab.cpp:1090 src/slic3r/GUI/Tab.cpp:1093 -#: src/slic3r/GUI/Tab.cpp:1466 src/slic3r/GUI/Tab.cpp:1890 src/slic3r/GUI/Tab.cpp:3347 -#: src/slic3r/GUI/wxExtensions.cpp:2447 src/libslic3r/PrintConfig.cpp:72 src/libslic3r/PrintConfig.cpp:186 -#: src/libslic3r/PrintConfig.cpp:349 src/libslic3r/PrintConfig.cpp:987 src/libslic3r/PrintConfig.cpp:2173 +#: src/slic3r/GUI/GUI_App.cpp:730 src/slic3r/GUI/GUI_ObjectList.cpp:85 src/slic3r/GUI/GUI_ObjectList.cpp:541 +#: src/slic3r/GUI/Tab.cpp:1032 src/slic3r/GUI/Tab.cpp:1047 src/slic3r/GUI/Tab.cpp:1145 +#: src/slic3r/GUI/Tab.cpp:1148 src/slic3r/GUI/Tab.cpp:1551 src/slic3r/GUI/Tab.cpp:1977 +#: src/slic3r/GUI/Tab.cpp:3492 src/slic3r/GUI/wxExtensions.cpp:2556 src/libslic3r/PrintConfig.cpp:73 +#: src/libslic3r/PrintConfig.cpp:188 src/libslic3r/PrintConfig.cpp:351 src/libslic3r/PrintConfig.cpp:999 +#: src/libslic3r/PrintConfig.cpp:2210 msgid "Advanced" msgstr "고급" -#: src/slic3r/GUI/GUI_App.cpp:617 +#: src/slic3r/GUI/GUI_App.cpp:730 msgid "Advanced View Mode" msgstr "고급 보기 모드" -#: src/slic3r/GUI/GUI_App.cpp:618 src/slic3r/GUI/wxExtensions.cpp:2448 +#: src/slic3r/GUI/GUI_App.cpp:731 src/slic3r/GUI/wxExtensions.cpp:2557 msgid "Expert" msgstr "전문가" -#: src/slic3r/GUI/GUI_App.cpp:618 +#: src/slic3r/GUI/GUI_App.cpp:731 msgid "Expert View Mode" msgstr "전문가 보기 모드" -#: src/slic3r/GUI/GUI_App.cpp:623 +#: src/slic3r/GUI/GUI_App.cpp:736 msgid "Mode" msgstr "모드" -#: src/slic3r/GUI/GUI_App.cpp:623 -msgid "Slic3r View Mode" -msgstr "Slic3r 보기 모드" +#: src/slic3r/GUI/GUI_App.cpp:736 +#, c-format +msgid "%s View Mode" +msgstr "%s 보기 모드" -#: src/slic3r/GUI/GUI_App.cpp:625 +#: src/slic3r/GUI/GUI_App.cpp:738 msgid "Change Application &Language" msgstr "응용 프로그램 언어 번경" -#: src/slic3r/GUI/GUI_App.cpp:627 +#: src/slic3r/GUI/GUI_App.cpp:740 msgid "Flash printer &firmware" msgstr "프린터 펌웨어 플래시" -#: src/slic3r/GUI/GUI_App.cpp:627 +#: src/slic3r/GUI/GUI_App.cpp:740 msgid "Upload a firmware image into an Arduino based printer" msgstr "아두이노 기반의 프린터 이미지 업로드" -#: src/slic3r/GUI/GUI_App.cpp:639 +#: src/slic3r/GUI/GUI_App.cpp:752 msgid "Taking configuration snapshot" msgstr "구성 스냅 샷 만들기" -#: src/slic3r/GUI/GUI_App.cpp:639 +#: src/slic3r/GUI/GUI_App.cpp:752 msgid "Snapshot name" msgstr "스냅 샷 이름" @@ -978,6 +991,16 @@ msgstr "언어 변경 후 응용 프로그램이 다시 시작 됩니다." msgid "3D-Scene will be cleaned." msgstr "3D-장면이 청소 됩니다." +#: src/slic3r/GUI/GUI_App.cpp:798 +msgid "Language selection" +msgstr "국가에 맞는 언어를 선택" + +#: src/slic3r/GUI/GUI_App.cpp:795 +msgid "" +"Switching the language will trigger application restart.\n" +"You will lose content of the plater." +msgstr "언어를 전환 하면 응용 프로그램 재시작 합니다.플레이트 위 오브젝트는 모두 지워집니다." + #: src/slic3r/GUI/GUI_App.cpp:678 msgid "Please, check your changes before." msgstr "이전에 변경 사항을 확인 하십시오." @@ -1194,7 +1217,7 @@ msgstr "객체/부품에 대한 새 압출(익스트루더) 기 선택" #: src/slic3r/GUI/GUI_ObjectList.cpp:1079 src/slic3r/GUI/Plater.cpp:2825 src/slic3r/GUI/Plater.cpp:2843 #: src/slic3r/GUI/Tab.cpp:2860 msgid "Delete" -msgstr "지우기(delete)" +msgstr "지우기 " #: src/slic3r/GUI/GUI_ObjectList.cpp:1153 msgid "Set as a Separated Objects" @@ -1246,7 +1269,7 @@ msgstr "개체 또는 인스턴스" #: src/slic3r/GUI/GUI_ObjectList.cpp:2240 msgid "Part" -msgstr "부품" +msgstr "부품(Part)" #: src/slic3r/GUI/GUI_ObjectList.cpp:2242 msgid "Unsupported selection" @@ -1274,7 +1297,23 @@ msgstr "정보" msgid "You can't change a type of the last solid part of the object." msgstr "객체의 마지막 솔리드 부품 유형은 변경할 수 없습니다." -#: src/slic3r/GUI/GUI_ObjectList.cpp:2373 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2547 +msgid "Modifier" +msgstr "편집 영역" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2547 +msgid "Support Enforcer" +msgstr "서포트 지원 영역" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2547 +msgid "Support Blocker" +msgstr "서포트 금지 영역" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2549 +msgid "Type:" +msgstr "형식:" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2549 msgid "Select type of part" msgstr "부품 유형 선택" @@ -1487,7 +1526,7 @@ msgstr ".Ini/amf/3mf/gcode 및 병합에서 구성 로드" #: src/slic3r/GUI/KBShortcutsDialog.cpp:106 msgid "(Re)slice" -msgstr "(Re) 슬라이스" +msgstr "(Re)슬라이스" #: src/slic3r/GUI/KBShortcutsDialog.cpp:107 msgid "Quick slice" @@ -1562,15 +1601,15 @@ msgstr "여러 개체 선택/여러 개체 이동" msgid "Main Shortcuts" msgstr "주요 단축키" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:130 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:134 msgid "Arrange" msgstr "정렬" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:131 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:135 msgid "Select All objects" msgstr "모든 객체 선택" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:132 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:136 msgid "Delete selected" msgstr "선택 삭제" @@ -1578,25 +1617,25 @@ msgstr "선택 삭제" msgid "Delete All" msgstr "전부 지움" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:134 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:140 msgid "Gizmo move" msgstr "기즈모 이동" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:135 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:141 msgid "Gizmo scale" msgstr "기즈모 배율" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:136 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:142 msgid "Gizmo rotate" msgstr "기즈모 회전" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:137 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:143 msgid "Gizmo cut" -msgstr "기즈모 컷" +msgstr "기즈모 자르기" #: src/slic3r/GUI/KBShortcutsDialog.cpp:138 msgid "Gizmo Place face on bed" -msgstr "Gizmo Place face on bed" +msgstr "기즈모를 배드위에서" #: src/slic3r/GUI/KBShortcutsDialog.cpp:139 msgid "Copy to clipboard" @@ -1606,131 +1645,134 @@ msgstr "클립보드로 복사" msgid "Paste from clipboard" msgstr "클립보드에서 붙여넣기" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:139 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:145 msgid "Gizmo SLA support points" msgstr "기즈모 SLA 지원 포인트" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:147 -#, no-c-format -msgid "" -"Press to snap by 5% in Gizmo scale\n" -"or by 1mm in Gizmo move" -msgstr "" -"기즈모 배율에서 5% in로 스냅 하려면 누릅니다.\n" -"또는 기 즈 모에서 1mm로 이동" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:148 -msgid "" -"Press to scale or rotate selected objects\n" -"around their own center" -msgstr "" -"자신의 중심 주변\n" -"선택한 개체의 크기를 조정 하거나 회전 하려면 누릅니다" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:142 -msgid "Zoom to Bed" -msgstr "배드 확대" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:143 -msgid "Zoom to all objects in scene, if none selected" -msgstr "장면의 모든 오브젝트로 확대/축소 (선택 하지 않은 경우)" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:144 -msgid "Zoom to selected object" -msgstr "선택한 개체로 확대/축소" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:145 -msgid "Zoom in" -msgstr "확대" - #: src/slic3r/GUI/KBShortcutsDialog.cpp:146 -msgid "Zoom out" -msgstr "줌 아웃" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:149 +#, c-format msgid "" -"s\n" -"around their own center" -msgstr "중심 주변으로. 선택한 개체의 크기를 조정 하거나 회전 하려면 누릅니다" +"Press to activate selection rectangle\n" +"or to snap by 5% in Gizmo scale\n" +"or to snap by 1mm in Gizmo move" +msgstr "" +"활성화된 사각형을 선택합니다.\n" +"5% in 객체 크기를 스냅에 맞춰 조절합니다.\n" +"1mm 씩 객체를 스냅에 맞추 이동합니다." -#: src/slic3r/GUI/KBShortcutsDialog.cpp:150 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:147 msgid "" "Press to activate deselection rectangle\n" "or to scale or rotate selected objects\n" "around their own center" -msgstr "선택 해제 사각형을 활성화하려면 누르십시오. 선택한 객체의 비율을 조정하거나 회전하려면를 누르십시오" +msgstr "" +"자신의 중심 주변\n" +"선택한 개체의 크기를 조정 하거나\n" +"회전 하려면 누릅니다" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:148 +msgid "Press to activate one direction scaling in Gizmo scale" +msgstr "기즈모 크기 조절을 활성화 합니다." + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:149 +msgid "Zoom to Bed" +msgstr "배드 확대" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:150 +msgid "Zoom to all objects in scene, if none selected" +msgstr "장면의 모든 오브젝트로 확대/축소 (선택 하지 않은 경우)" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:151 +msgid "Zoom to selected object" +msgstr "선택한 개체로 확대/축소" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:152 +msgid "Zoom in" +msgstr "확대" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:153 +msgid "Zoom out" +msgstr "줌 아웃" #: src/slic3r/GUI/KBShortcutsDialog.cpp:154 -msgid "Unselect gizmo, keep object selection" -msgstr "기즈모 선택을 취소 하고 객체 선택 유지" +msgid "Unselect gizmo / Clear selection" +msgstr "기즈모 선택을 취소 하거나 지우기" #: src/slic3r/GUI/KBShortcutsDialog.cpp:156 msgid "Plater Shortcuts" -msgstr "Plater" +msgstr "플레이터 단축기" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:164 src/slic3r/GUI/KBShortcutsDialog.cpp:175 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:171 src/slic3r/GUI/KBShortcutsDialog.cpp:182 msgid "Arrow Up" msgstr "위쪽 화살표" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:164 src/slic3r/GUI/KBShortcutsDialog.cpp:166 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:171 src/slic3r/GUI/KBShortcutsDialog.cpp:173 msgid "Upper Layer" msgstr "상위 레이어" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:165 src/slic3r/GUI/KBShortcutsDialog.cpp:176 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:172 src/slic3r/GUI/KBShortcutsDialog.cpp:183 msgid "Arrow Down" msgstr "아래쪽 화살표" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:165 src/slic3r/GUI/KBShortcutsDialog.cpp:167 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:172 src/slic3r/GUI/KBShortcutsDialog.cpp:174 msgid "Lower Layer" msgstr "하위 레이어" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:169 -msgid "Preview Shortcuts" -msgstr "미리 보기 바로 가기" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:175 -msgid "Move current slider thump Up" -msgstr "현재 슬라이더를 쿵 위로 이동" - #: src/slic3r/GUI/KBShortcutsDialog.cpp:176 -msgid "Move current slider thump Down" -msgstr "현재 슬라이더를 아래로 쿵 이동" +msgid "Preview Shortcuts" +msgstr "미리보기 단축기" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:177 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:182 +msgid "Move current slider thumb Up" +msgstr "현재 마우스 휠 슬라이더를 위로 이동" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:183 +msgid "Move current slider thumb Down" +msgstr "현재 마우스 휠 슬라이더를 아래로 이동" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:184 msgid "Arrow Left" msgstr "왼쪽 화살표" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:177 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:184 msgid "Set upper thumb to current slider thumb" -msgstr "위쪽 엄지를 현재 슬라이더 엄지 손가락으로 설정" +msgstr "마우스 휠을 위로 움직여 설정" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:178 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:185 msgid "Arrow Right" msgstr "오른쪽 화살표" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:178 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:185 msgid "Set lower thumb to current slider thumb" -msgstr "낮은 엄지를 현재 슬라이더 엄지 손가락으로 설정" +msgstr "마우스 휠을 아래로 움직여 설정" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:179 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:186 msgid "Add color change marker for current layer" msgstr "현재 레이어의 색상 변경 마커 추가" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:180 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:187 msgid "Delete color change marker for current layer" msgstr "현재 레이어의 색상 변경 마커 삭제" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:182 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:189 msgid "Layers Slider Shortcuts" msgstr "레이어 슬라이더 단축키" -#: src/slic3r/GUI/MainFrame.cpp:54 -msgid " - Remember to check for updates at http://github.com/prusa3d/slic3r/releases" +#: src/slic3r/GUI/MainFrame.cpp:61 +msgid " - Remember to check for updates at http://github.com/prusa3d/PrusaSlicer/releases" msgstr " -http://github.com/prusa3d/slic3r/releases에서 업데이트를 확인하는 것을 잊지 마십시오" #: src/slic3r/GUI/MainFrame.cpp:160 msgid "Plater" -msgstr "플레이트" +msgstr "플레이터" + +#: src/slic3r/GUI/MainFrame.cpp:374 +msgid "&New Project" +msgstr "&새로운 프로젝트" + +#: src/slic3r/GUI/MainFrame.cpp:374 +msgid "Start a new project" +msgstr "새로운 프로젝트 시작" #: src/slic3r/GUI/MainFrame.cpp:273 msgid "&Open Project" @@ -1766,7 +1808,7 @@ msgstr "모델 로드" #: src/slic3r/GUI/MainFrame.cpp:286 msgid "Import &Config" -msgstr "& 구성 가져오기" +msgstr "&구성 가져오기" #: src/slic3r/GUI/MainFrame.cpp:286 msgid "Load exported configuration file" @@ -1782,7 +1824,7 @@ msgstr "프로젝트 파일에서 구성 로드" #: src/slic3r/GUI/MainFrame.cpp:291 msgid "Import Config &Bundle" -msgstr "가져오기 설정 > 번들" +msgstr "번들 &설정 가져오기" #: src/slic3r/GUI/MainFrame.cpp:291 msgid "Load presets from a bundle" @@ -1818,7 +1860,7 @@ msgstr "현재 플레이트를AMF로 내보내기" #: src/slic3r/GUI/MainFrame.cpp:304 msgid "Export &Config" -msgstr "& 구성 내보내기" +msgstr "&구성 내보내기" #: src/slic3r/GUI/MainFrame.cpp:304 msgid "Export current configuration to file" @@ -1834,7 +1876,7 @@ msgstr "모든 이전 설정을 파일로 내보내기" #: src/slic3r/GUI/MainFrame.cpp:308 msgid "&Export" -msgstr "& 내보내기" +msgstr "&내보내기" #: src/slic3r/GUI/MainFrame.cpp:314 msgid "Quick Slice" @@ -1856,11 +1898,11 @@ msgstr "파일을 G 코드로 분할하고 다음으로 저장" msgid "Repeat Last Quick Slice" msgstr "마지막으로 빠른 슬라이스 반복" -#: src/slic3r/GUI/MainFrame.cpp:334 -msgid "(Re)Slice &Now" +#: src/slic3r/GUI/MainFrame.cpp:453 +msgid "(Re)Slice No&w" msgstr "지금(다시)자르기" -#: src/slic3r/GUI/MainFrame.cpp:334 +#: src/slic3r/GUI/MainFrame.cpp:453 msgid "Start new slicing process" msgstr "새로운 슬라이싱 작업 시작" @@ -1876,13 +1918,18 @@ msgstr "STL 파일을 자동으로 복구합니다" msgid "&Quit" msgstr "종료(&Q)" -#: src/slic3r/GUI/MainFrame.cpp:340 -msgid "Quit Slic3r" -msgstr "Slic3r 종료" +#: src/slic3r/GUI/MainFrame.cpp:460 +#, c-format +msgid "Quit %s" +msgstr "%s 종료" + +#: src/slic3r/GUI/MainFrame.cpp:416 +msgid "Export plate as STL including supports" +msgstr "서포트를 포함하여 STL파일로 내보내기" #: src/slic3r/GUI/MainFrame.cpp:374 msgid "&Select all" -msgstr "모두 선택" +msgstr "&모두 선택 " #: src/slic3r/GUI/MainFrame.cpp:374 msgid "Selects all objects" @@ -1890,7 +1937,7 @@ msgstr "모든 개체를 선택 합니다" #: src/slic3r/GUI/MainFrame.cpp:377 msgid "&Delete selected" -msgstr "선택 삭제" +msgstr "&선택 삭제 " #: src/slic3r/GUI/MainFrame.cpp:377 msgid "Deletes the current selection" @@ -1898,7 +1945,7 @@ msgstr "현재 선택 영역을 삭제 합니다" #: src/slic3r/GUI/MainFrame.cpp:379 msgid "Delete &all" -msgstr "전부 지움" +msgstr "전부 지움 " #: src/slic3r/GUI/MainFrame.cpp:379 msgid "Deletes all objects" @@ -1906,7 +1953,7 @@ msgstr "모든 객체를 삭제 합니다" #: src/slic3r/GUI/MainFrame.cpp:392 msgid "&Plater Tab" -msgstr "선택 및 플래이트 탭" +msgstr "&선택 및 플래이터 탭" #: src/slic3r/GUI/MainFrame.cpp:392 msgid "Show the plater" @@ -1914,7 +1961,7 @@ msgstr "플레이트를 보기" #: src/slic3r/GUI/MainFrame.cpp:399 msgid "P&rint Settings Tab" -msgstr "P&rint 설정 탭" +msgstr "프린트 설정 탭" #: src/slic3r/GUI/MainFrame.cpp:399 msgid "Show the print settings" @@ -1922,7 +1969,7 @@ msgstr "인쇄 설정 표시" #: src/slic3r/GUI/MainFrame.cpp:401 msgid "&Filament Settings Tab" -msgstr "& 필라멘트 설정 탭" +msgstr "&필라멘트 설정 탭" #: src/slic3r/GUI/MainFrame.cpp:401 msgid "Show the filament settings" @@ -1962,7 +2009,7 @@ msgstr "호스트 업로드 대기열 인쇄 창 표시" #: src/slic3r/GUI/MainFrame.cpp:439 msgid "Iso" -msgstr "Iso" +msgstr "기본 " #: src/slic3r/GUI/MainFrame.cpp:439 msgid "Iso View" @@ -1971,7 +2018,7 @@ msgstr "Iso 보기" # lib/Slic3r/GUI/MainFrame.pm:327 #: src/slic3r/GUI/MainFrame.cpp:441 msgid "Top" -msgstr "윗부분" +msgstr "윗부분 " #: src/libslic3r/PrintConfig.cpp:2041 msgctxt "Layers" @@ -1985,12 +2032,12 @@ msgstr "위에서 보기" # lib/Slic3r/GUI/MainFrame.pm:328 #: src/slic3r/GUI/MainFrame.cpp:442 msgid "Bottom" -msgstr "바닥(Bottom)" +msgstr "바닥 " #: src/libslic3r/PrintConfig.cpp:148 msgctxt "Layers" msgid "Bottom" -msgstr "바닥(Bottom)" +msgstr "바닥 " #: src/slic3r/GUI/MainFrame.cpp:442 msgid "Bottom View" @@ -1998,15 +2045,15 @@ msgstr "바닥 보기" #: src/slic3r/GUI/MainFrame.cpp:443 msgid "Front" -msgstr "앞" +msgstr "앞 " #: src/slic3r/GUI/MainFrame.cpp:443 msgid "Front View" -msgstr "앞면 보기" +msgstr "앞면 보기 " #: src/slic3r/GUI/MainFrame.cpp:444 src/libslic3r/PrintConfig.cpp:1561 msgid "Rear" -msgstr "뒷면" +msgstr "뒷면 " #: src/slic3r/GUI/MainFrame.cpp:444 msgid "Rear View" @@ -2014,7 +2061,7 @@ msgstr "뒷면 보기" #: src/slic3r/GUI/MainFrame.cpp:445 msgid "Left" -msgstr "왼쪽" +msgstr "왼쪽 " #: src/slic3r/GUI/MainFrame.cpp:445 msgid "Left View" @@ -2022,7 +2069,7 @@ msgstr "왼쪽 보기" #: src/slic3r/GUI/MainFrame.cpp:446 msgid "Right" -msgstr "오른쪽" +msgstr "오른쪽 " #: src/slic3r/GUI/MainFrame.cpp:446 msgid "Right View" @@ -2078,19 +2125,20 @@ msgstr "사용자 구성 폴더 표시 (datadir)" #: src/slic3r/GUI/MainFrame.cpp:477 msgid "Report an I&ssue" -msgstr "문제보고" +msgstr "문제를 보고" #: src/slic3r/GUI/MainFrame.cpp:477 msgid "Report an issue on the Slic3r Prusa Edition" msgstr "Slic3r Prusa Edition에 관한 문제점 보고" -#: src/slic3r/GUI/MainFrame.cpp:479 -msgid "&About Slic3r" -msgstr "&Slic3r에 대하여" +#: src/slic3r/GUI/MainFrame.cpp:607 +#, c-format +msgid "&About %s" +msgstr "%s 에 대하여" -#: src/slic3r/GUI/MainFrame.cpp:479 +#: src/slic3r/GUI/MainFrame.cpp:607 msgid "Show about dialog" -msgstr "대화상자 표시" +msgstr "다이얼로그 표시" #: src/slic3r/GUI/MainFrame.cpp:482 msgid "Keyboard Shortcuts" @@ -2106,7 +2154,7 @@ msgstr "&파일" #: src/slic3r/GUI/MainFrame.cpp:491 msgid "&Edit" -msgstr "수정(&Edit)" +msgstr "&수정" #: src/slic3r/GUI/MainFrame.cpp:492 msgid "&Window" @@ -2114,12 +2162,20 @@ msgstr "&윈도우" #: src/slic3r/GUI/MainFrame.cpp:493 msgid "&View" -msgstr "&보다" +msgstr "&시점" #: src/slic3r/GUI/MainFrame.cpp:496 msgid "&Help" msgstr "&도움말" +#: src/slic3r/GUI/MainFrame.cpp:504 +msgid "&Copy" +msgstr "&복사 " + +#: src/slic3r/GUI/MainFrame.cpp:507 +msgid "&Paste" +msgstr "&붙이기 " + #: src/slic3r/GUI/MainFrame.cpp:524 msgid "Choose a file to slice (STL/OBJ/AMF/3MF/PRUSA):" msgstr "슬라이스 할 파일을 선택하십시오 (STL / OBJ / AMF / 3MF / PRUSA):" @@ -2160,6 +2216,24 @@ msgstr "G 코드" msgid " file as:" msgstr " 다음 파일 :" +#: src/slic3r/GUI/MainFrame.cpp:588 +msgid "Software &Releases" +msgstr "소프트웨어 &자료" + +#: src/slic3r/GUI/MainFrame.cpp:588 +msgid "Open the software releases page in your browser" +msgstr "브라우저에서 소프트웨어 정보 페이지 열기" + +#: src/slic3r/GUI/MainFrame.cpp:594 +#, c-format +msgid "%s &Website" +msgstr "%s &웹사이트" + +#: src/slic3r/GUI/MainFrame.cpp:595 +#, c-format +msgid "Open the %s website in your browser" +msgstr "%s 웹사이트를 브라우저에서 열기" + #: src/slic3r/GUI/MainFrame.cpp:595 msgid "Save zip file as:" msgstr "압축(zip)파일 다른이름 저장:" @@ -2282,6 +2356,10 @@ msgstr "서포트의 종류를 선택하세요" msgid "Support on build plate only" msgstr "출력물만 서포트를 지지" +#: src/slic3r/GUI/Plater.cpp:434 src/slic3r/GUI/Plater.cpp:527 +msgid "For support enforcers only" +msgstr "서포트 지원영역 생성시 선택" + #: src/slic3r/GUI/Plater.cpp:416 msgid "Everywhere" msgstr "모든곳" @@ -2609,6 +2687,10 @@ msgstr "방향 최적화" msgid "Optimize the rotation of the object for better print results." msgstr "더 나은 인쇄 결과를 위해 개체의 회전을 최적화합니다." +#: src/slic3r/GUI/Plater.cpp:3127 +msgid "3D editor view" +msgstr "3D 편집화면 보기" + #: src/slic3r/GUI/Plater.cpp:3342 msgid "Save G-code file as:" msgstr "G-code 파일 다른 이름 저장:" @@ -2758,52 +2840,47 @@ msgid "filament" msgstr "필라멘트" #: src/slic3r/GUI/PresetHints.cpp:28 -#, c-format msgid "" -"If estimated layer time is below ~%ds, fan will run at %d%% and print speed will be reduced so that no less " -"than %ds are spent on that layer (however, speed will never be reduced below %dmm/s)." +"If estimated layer time is below ~%1%s, fan will run at %2%%% and print speed will be reduced so that no less " +"than %3%s are spent on that layer (however, speed will never be reduced below %4%mm/s)." msgstr "" -"예상 레이어 시간이 ~ % d 초 미만이면 팬이 % d %%에서 실행되고 인쇄 속도가 감소되어 해당 레이어에 % ds 이상 소" -"비됩니다 (단, 속도는 % dmm / s 이하로 감소하지 않습니다) ." +"예상 레이어 시간이 ~%1%초 미만이면 팬이 %2%%%에서 실행되고 인쇄 속도가 감소되어 해당 레이어에 %3%초 이상 소비" +"됩니다 (단, 속도는 %4%mm/s 이하로 감소하지 않습니다) ." -#: src/slic3r/GUI/PresetHints.cpp:32 -#, c-format +#: src/slic3r/GUI/PresetHints.cpp:35 msgid "" "\n" -"If estimated layer time is greater, but still below ~%ds, fan will run at a proportionally decreasing speed " -"between %d%% and %d%%." +"If estimated layer time is greater, but still below ~%1%s, fan will run at a proportionally decreasing speed " +"between %2%%% and %3%%%." msgstr "" "\n" -"예상 레이어 시간이 더 길지만 ~ % ds 미만인 경우 팬은 % d %%와 % d %% 사이에 비례하여 감소하는 속도로 실행됩니" -"다." +"예상 레이어 시간이 더 길지만 ~%1%초 미만인 경우 팬은 %2%%%와 %3%%%사이 비례, 감소하는 속도로 실행됩니다." -#: src/slic3r/GUI/PresetHints.cpp:36 +#: src/slic3r/GUI/PresetHints.cpp:39 msgid "" "\n" -"During the other layers, fan " +"During the other layers, fan" msgstr "" "\n" -"다른 레이어 중 팬 " +"다른 레이어의, 팬설정은 " -#: src/slic3r/GUI/PresetHints.cpp:38 -msgid "Fan " +#: src/slic3r/GUI/PresetHints.cpp:41 +msgid "Fan" msgstr "팬(Fan) " -#: src/slic3r/GUI/PresetHints.cpp:43 -#, c-format -msgid "will always run at %d%% " -msgstr "항상 다음처럼 실행 %d%% " - -#: src/slic3r/GUI/PresetHints.cpp:46 -#, c-format -msgid "except for the first %d layers" -msgstr "첫 번째 %d 레이어를 제외하고" +#: src/slic3r/GUI/PresetHints.cpp:47 +msgid "will always run at %1%%%" +msgstr "항상 다음처럼 실행 %1%%%" #: src/slic3r/GUI/PresetHints.cpp:50 -msgid "except for the first layer" -msgstr "첫 번째 레이어를 제외하고" +msgid "except for the first %1% layers." +msgstr "첫 번째 %d 레이어를 제외하고" #: src/slic3r/GUI/PresetHints.cpp:52 +msgid "except for the first layer." +msgstr "첫 번째 레이어를 제외하고" + +#: src/slic3r/GUI/PresetHints.cpp:54 msgid "will be turned off." msgstr "off 됩니다." @@ -2835,33 +2912,33 @@ msgstr "서포트" msgid "support interface" msgstr "서포트 인터페이스" -#: src/slic3r/GUI/PresetHints.cpp:216 +#: src/slic3r/GUI/PresetHints.cpp:218 msgid "First layer volumetric" -msgstr "첫번째 레이어 용적" +msgstr "첫번째 레이어 용적은" -#: src/slic3r/GUI/PresetHints.cpp:216 +#: src/slic3r/GUI/PresetHints.cpp:218 msgid "Bridging volumetric" msgstr "브리징(Bridging) 용적" -#: src/slic3r/GUI/PresetHints.cpp:216 +#: src/slic3r/GUI/PresetHints.cpp:218 msgid "Volumetric" msgstr "용적" -#: src/slic3r/GUI/PresetHints.cpp:217 -msgid " flow rate is maximized " -msgstr " 유속(flow)이 최대화된다 " +#: src/slic3r/GUI/PresetHints.cpp:219 +msgid "flow rate is maximized" +msgstr "의 유속(flow)이 최대화된다. " -#: src/slic3r/GUI/PresetHints.cpp:220 +#: src/slic3r/GUI/PresetHints.cpp:222 msgid "by the print profile maximum" msgstr "인쇄 프로파일 최대 값" -#: src/slic3r/GUI/PresetHints.cpp:221 -msgid "when printing " +#: src/slic3r/GUI/PresetHints.cpp:223 +msgid "when printing" msgstr "인쇄 할때 " -#: src/slic3r/GUI/PresetHints.cpp:222 -msgid " with a volumetric rate " -msgstr " 용적 비율로 " +#: src/slic3r/GUI/PresetHints.cpp:224 +msgid "with a volumetric rate" +msgstr "의 용적 비율로 " #: src/slic3r/GUI/PresetHints.cpp:226 #, c-format @@ -2870,22 +2947,22 @@ msgstr "%3.2f mm³/s" #: src/slic3r/GUI/PresetHints.cpp:228 #, c-format -msgid " at filament speed %3.2f mm/s." -msgstr " 필라멘트 속도는 %3.2f mm/s." +msgid "%3.2f mm³/s at filament speed %3.2f mm/s." +msgstr "%3.2f mm³/s 필라멘트 속도는 %3.2f mm/s이다." -#: src/slic3r/GUI/PresetHints.cpp:247 +#: src/slic3r/GUI/PresetHints.cpp:246 msgid "Recommended object thin wall thickness: Not available due to invalid layer height." -msgstr "권장 객체(object) 벽(wall) 두께: 잘못된 레이어 높이 때문에 사용할 수 없음." +msgstr "권장 객체(object)의 벽(wall) 두께: 잘못된 레이어 높이 때문에 사용할 수 없음." -#: src/slic3r/GUI/PresetHints.cpp:264 +#: src/slic3r/GUI/PresetHints.cpp:262 #, c-format -msgid "Recommended object thin wall thickness for layer height %.2f and " -msgstr "개체 레이어 높이 %.2f 에 대 한 얇은 벽 두께 권장 하 고 " +msgid "Recommended object thin wall thickness for layer height %.2f and" +msgstr "객체 레이어 높이 %.2f 에 권장하는 두깨는 " #: src/slic3r/GUI/PresetHints.cpp:271 #, c-format msgid "%d lines: %.2lf mm" -msgstr "%d 라인(lines): %.2lf mm" +msgstr "%d 라인(lines): %.2lf mm 입니다." #: src/slic3r/GUI/PrintHostDialogs.cpp:32 msgid "Send G-Code to printer host" @@ -2982,51 +3059,56 @@ msgstr "" "버튼 위로 커서를 가져 가서 자세한 정보를 찾습니다.\n" "또는이 버튼을 클릭하십시오." -#: src/slic3r/GUI/Tab.cpp:858 +#: src/slic3r/GUI/Tab.cpp:920 msgid "It's a default preset." msgstr "기본 설정입니다." -#: src/slic3r/GUI/Tab.cpp:859 +#: src/slic3r/GUI/Tab.cpp:921 msgid "It's a system preset." msgstr "시스템 설정입니다." -#: src/slic3r/GUI/Tab.cpp:860 -msgid "Current preset is inherited from " -msgstr "전의 설정에서 가져 옵니다 " +#: src/slic3r/GUI/Tab.cpp:922 +#, c-format +msgid "Current preset is inherited from %s" +msgstr "전의 %s 설정에서 가져 옵니다 " -#: src/slic3r/GUI/Tab.cpp:865 -msgid "It can't be deleted or modified. " +#: src/slic3r/GUI/Tab.cpp:923 +msgid "default preset" +msgstr "기본 프리셋" + +#: src/slic3r/GUI/Tab.cpp:927 +msgid "It can't be deleted or modified." msgstr "삭제하거나 수정할 수 없습니다. " -#: src/slic3r/GUI/Tab.cpp:866 -msgid "Any modifications should be saved as a new preset inherited from this one. " +#: src/slic3r/GUI/Tab.cpp:928 +msgid "Any modifications should be saved as a new preset inherited from this one." msgstr "모든 수정 사항은 이 항목에서 받은 기본 설정으로 저장해야합니다. " -#: src/slic3r/GUI/Tab.cpp:867 +#: src/slic3r/GUI/Tab.cpp:929 msgid "To do that please specify a new name for the preset." msgstr "그렇게하려면 기본 설정의 새 이름을 지정하십시오." -#: src/slic3r/GUI/Tab.cpp:871 +#: src/slic3r/GUI/Tab.cpp:933 msgid "Additional information:" msgstr "추가 정보:" -#: src/slic3r/GUI/Tab.cpp:877 +#: src/slic3r/GUI/Tab.cpp:939 msgid "printer model" msgstr "프린터 모델" -#: src/slic3r/GUI/Tab.cpp:885 +#: src/slic3r/GUI/Tab.cpp:947 msgid "default print profile" msgstr "기본 인쇄 프로파일" -#: src/slic3r/GUI/Tab.cpp:888 +#: src/slic3r/GUI/Tab.cpp:950 msgid "default filament profile" msgstr "기본 필라멘트 프로파일" -#: src/slic3r/GUI/Tab.cpp:902 +#: src/slic3r/GUI/Tab.cpp:964 msgid "default SLA material profile" msgstr "기본 SLA 재질 프로 파일" -#: src/slic3r/GUI/Tab.cpp:906 +#: src/slic3r/GUI/Tab.cpp:968 msgid "default SLA print profile" msgstr "기본 SLA 인쇄 프로필" @@ -3295,97 +3377,98 @@ msgstr "스타트 G코드" msgid "End G-code" msgstr "엔드 G코드" -#: src/slic3r/GUI/Tab.cpp:1632 src/slic3r/GUI/Tab.cpp:1689 -msgid " Browse " -msgstr " 검색 " +#: src/slic3r/GUI/FirmwareDialog.cpp:768 src/slic3r/GUI/Tab.cpp:1718 src/slic3r/GUI/Tab.cpp:1774 +msgid "Browse" +msgstr "검색" #: src/slic3r/GUI/Tab.cpp:1651 src/slic3r/GUI/Tab.cpp:1838 msgid "Test" msgstr "시험(test)" -#: src/slic3r/GUI/Tab.cpp:1662 +#: src/slic3r/GUI/Tab.cpp:1747 msgid "Could not get a valid Printer Host reference" msgstr "유효한 프린터 호스트 참조를 가져올 수 없습니다" -#: src/slic3r/GUI/Tab.cpp:1668 src/slic3r/GUI/Tab.cpp:1851 +#: src/slic3r/GUI/Tab.cpp:1753 src/slic3r/GUI/Tab.cpp:1938 msgid "Success!" msgstr "성공!" -#: src/slic3r/GUI/Tab.cpp:1683 +#: src/slic3r/GUI/Tab.cpp:1768 msgid "HTTPS CA file is optional. It is only needed if you use HTTPS with a self-signed certificate." msgstr "HTTPS CA 파일은 선택 사항입니다. 자체 서명 된 인증서로 HTTPS를 사용하는 경우에만 필요합니다." -#: src/slic3r/GUI/Tab.cpp:1696 +#: src/slic3r/GUI/Tab.cpp:1781 msgid "Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*" msgstr "인증서 파일 (* .crt, * .pem) | * .crt; * .pem | 모든 파일 | *. *" -#: src/slic3r/GUI/Tab.cpp:1697 +#: src/slic3r/GUI/Tab.cpp:1782 msgid "Open CA certificate file" -msgstr "Open CA certificate file" +msgstr "CA 인증서 파일 열기" -#: src/slic3r/GUI/Tab.cpp:1725 +#: src/slic3r/GUI/Tab.cpp:1810 +#, c-format msgid "" "HTTPS CA File:\n" -"\tOn this system, Slic3r uses HTTPS certificates from the system Certificate Store or Keychain.\n" -"\tTo use a custom CA file, please import your CA file into Certificate Store / Keychain." +" \tOn this system, %s uses HTTPS certificates from the system Certificate Store or Keychain.\n" +" \tTo use a custom CA file, please import your CA file into Certificate Store / Keychain." msgstr "" "HTTPS CA 파일:\n" -"\t이 시스템에서 Slic3r는 시스템 인증서 저장소나 키체인의 HTTPS 인증서를 사용 합니다.\n" +"\t이 시스템에서 %s는 시스템 인증서 저장소나 키체인의 HTTPS 인증서를 사용 합니다.\n" "\t사용자 지정 CA 파일을 사용 하려면 CA 파일을 인증서 저장소/키체인에 가져오십시오." -#: src/slic3r/GUI/Tab.cpp:1763 src/slic3r/GUI/Tab.cpp:1964 +#: src/slic3r/GUI/Tab.cpp:1850 src/slic3r/GUI/Tab.cpp:2051 msgid "Size and coordinates" msgstr "크기와 좌표" -#: src/slic3r/GUI/Tab.cpp:1767 src/slic3r/GUI/Tab.cpp:1968 src/slic3r/GUI/Tab.cpp:2911 -msgid " Set " +#: src/slic3r/GUI/Tab.cpp:1855 src/slic3r/GUI/Tab.cpp:2056 src/slic3r/GUI/Tab.cpp:3040 +msgid "Set" msgstr " 세트 " -#: src/slic3r/GUI/Tab.cpp:1790 +#: src/slic3r/GUI/Tab.cpp:1877 msgid "Capabilities" msgstr "기능" -#: src/slic3r/GUI/Tab.cpp:1795 +#: src/slic3r/GUI/Tab.cpp:1882 msgid "Number of extruders of the printer." msgstr "프린터 익스트루더 숫자." -#: src/slic3r/GUI/Tab.cpp:1823 +#: src/slic3r/GUI/Tab.cpp:1910 msgid "USB/Serial connection" msgstr "USB/시리얼 연결" -#: src/slic3r/GUI/Tab.cpp:1824 src/libslic3r/PrintConfig.cpp:1590 +#: src/slic3r/GUI/Tab.cpp:1911 src/libslic3r/PrintConfig.cpp:1626 msgid "Serial port" msgstr "시리얼 포트" -#: src/slic3r/GUI/Tab.cpp:1829 +#: src/slic3r/GUI/Tab.cpp:1916 msgid "Rescan serial ports" msgstr "시리얼포트 재검색" -#: src/slic3r/GUI/Tab.cpp:1851 +#: src/slic3r/GUI/Tab.cpp:1938 msgid "Connection to printer works correctly." msgstr "프린터 연결이 올바르게 작동합니다." -#: src/slic3r/GUI/Tab.cpp:1854 +#: src/slic3r/GUI/Tab.cpp:1941 msgid "Connection failed." msgstr "연결 실패." -#: src/slic3r/GUI/Tab.cpp:1867 src/slic3r/GUI/Tab.cpp:2022 +#: src/slic3r/GUI/Tab.cpp:1954 src/slic3r/GUI/Tab.cpp:2111 msgid "Print Host upload" msgstr "호스트 업로드 인쇄" -#: src/slic3r/GUI/Tab.cpp:1911 src/libslic3r/PrintConfig.cpp:128 +#: src/slic3r/GUI/Tab.cpp:1998 src/libslic3r/PrintConfig.cpp:129 msgid "Before layer change G-code" msgstr "레이어 변경 전 G 코드" -#: src/slic3r/GUI/Tab.cpp:1917 src/libslic3r/PrintConfig.cpp:1030 +#: src/slic3r/GUI/Tab.cpp:2004 src/libslic3r/PrintConfig.cpp:1042 msgid "After layer change G-code" msgstr "레이어 변경 후 G 코드" -#: src/slic3r/GUI/Tab.cpp:1923 src/libslic3r/PrintConfig.cpp:2005 +#: src/slic3r/GUI/Tab.cpp:2010 src/libslic3r/PrintConfig.cpp:2041 msgid "Tool change G-code" msgstr "툴 채인지 G 코드" -#: src/slic3r/GUI/Tab.cpp:1929 +#: src/slic3r/GUI/Tab.cpp:2016 msgid "Between objects G-code (for sequential printing)" msgstr "객체 간 G 코드 (순차 인쇄용)" @@ -3554,7 +3637,7 @@ msgstr "제거(remove)" #: src/slic3r/GUI/Tab.cpp:2858 msgid "delete" -msgstr "지우기(delete)" +msgstr "지우기" #: src/slic3r/GUI/Tab.cpp:2859 msgid "Are you sure you want to " @@ -5383,8 +5466,8 @@ msgid "" "printer's firmware to get a compatible output. The \"No extrusion\" flavor prevents Slic3r from exporting any " "extrusion value at all." msgstr "" -"온도 조절 등을 포함한 일부 G/M-코드 명령은 보편적이지 않다. 호환되는 출력을 얻으려면 이 옵션을 프린터의 펌웨어" -"로 설정하십시오. \"압출 없음\" 형식은 Slic3r가 어떠한 압출 값도 출력하지 못하게 한다." +"온도 조절 등을 포함한 일부 G/M-코드 명령은 보편적이지 않습니다. 호환되는 출력을 얻으려면 보드에 적제된 프린터" +"의 펌웨어로 설정하십시오. \"압출 없음\" 형식은 Slic3r가 어떠한 압출 값도 출력하지 못하게 합니다." #: src/libslic3r/PrintConfig.cpp:911 msgid "No extrusion" @@ -5528,8 +5611,8 @@ msgstr "" "만 Prusa i3 MK3 펌웨어는 M73를 인식 하 고 있습니다. 또한 i3 MK3 펌웨어는 자동 모드에서 M73 Qxx Sxx를 지원 합니" "다." -#: src/libslic3r/PrintConfig.cpp:1051 -msgid "Supports silent mode" +#: src/libslic3r/PrintConfig.cpp:1063 +msgid "Supports stealth mode" msgstr "자동 모드 지원" #: src/libslic3r/PrintConfig.cpp:1052 @@ -7022,10 +7105,6 @@ msgstr "객체 고도" msgid "How much the supports should lift up the supported object." msgstr "서포트 되는 개체를 서포트 해야 하는 정도입니다." -#: src/libslic3r/PrintConfig.cpp:2495 -msgid "Support points density" -msgstr "지원 포인트 밀도" - #: src/libslic3r/PrintConfig.cpp:2497 msgid "This is a relative measure of support points density." msgstr "이는 서포트 점 밀도의 상대적인 척도입니다." From 2a06e28795b3b18a1b978a50fc018382c3845936 Mon Sep 17 00:00:00 2001 From: lee hakmin Date: Fri, 23 Aug 2019 23:46:01 +0900 Subject: [PATCH 004/336] Add files via upload --- .../localization/ko_KR/PrusaSlicer_kr(new).mo | Bin 0 -> 214548 bytes .../localization/ko_KR/PrusaSlicer_kr(new).po | 8978 +++++++++++++++++ 2 files changed, 8978 insertions(+) create mode 100644 resources/localization/ko_KR/PrusaSlicer_kr(new).mo create mode 100644 resources/localization/ko_KR/PrusaSlicer_kr(new).po diff --git a/resources/localization/ko_KR/PrusaSlicer_kr(new).mo b/resources/localization/ko_KR/PrusaSlicer_kr(new).mo new file mode 100644 index 0000000000000000000000000000000000000000..6c539b6979848fd1e2ecfc052784271c396d4d38 GIT binary patch literal 214548 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, YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-08-06 09:54+0200\n" +"PO-Revision-Date: 2019-08-23 23:38+0900\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.2.3\n" +"Last-Translator: \n" +"Plural-Forms: nplurals=1; plural=0;\n" +"Language: ko\n" + +#: src/slic3r/GUI/AboutDialog.cpp:39 src/slic3r/GUI/AboutDialog.cpp:289 +msgid "Portions copyright" +msgstr "다르 저작권" + +#: src/slic3r/GUI/AboutDialog.cpp:125 src/slic3r/GUI/AboutDialog.cpp:254 +msgid "Copyright" +msgstr "저작권" + +#. TRN "Slic3r _is licensed under the_ License" +#: src/slic3r/GUI/AboutDialog.cpp:127 +msgid "" +"License agreements of all following programs (libraries) are part of " +"application license agreement" +msgstr "" +"다음의 모든 프로그램 (라이브러리)의 라이센스 계약은 응용 프로그램 라이센스 계" +"약의 일부입니다." + +#: src/slic3r/GUI/AboutDialog.cpp:197 +#, c-format +msgid "About %s" +msgstr "%s에 대하여" + +#: src/slic3r/GUI/AboutDialog.cpp:229 src/slic3r/GUI/MainFrame.cpp:60 +msgid "Version" +msgstr "버전" + +#. TRN "Slic3r _is licensed under the_ License" +#: src/slic3r/GUI/AboutDialog.cpp:256 +msgid "is licensed under the" +msgstr "라이선스는" + +#: src/slic3r/GUI/AboutDialog.cpp:257 +msgid "GNU Affero General Public License, version 3" +msgstr "GNU Affero 일반 공중 사용 허가서, 버전 3" + +#: src/slic3r/GUI/AboutDialog.cpp:258 +msgid "" +"PrusaSlicer is based on Slic3r by Alessandro Ranellucci and the RepRap " +"community." +msgstr "" +"프루사슬라이서는 알레산드로 라넬루치와 RepRap 커뮤니티 Slic3r를 기반으로합니" +"다." + +#: src/slic3r/GUI/AboutDialog.cpp:259 +msgid "" +"Contributions by Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, " +"Petr Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik and " +"numerous others." +msgstr "" +"Contributions by Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, " +"Petr Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik and " +"numerous others. 한국어 번역 울산에테르." + +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:92 +msgid "" +"Copying of the temporary G-code to the output G-code failed. Maybe the SD " +"card is write locked?" +msgstr "" +"임시 G-코드를 출력할 SD카드에 복사하는 데 실패했습니다. SD카드의 락을 확인 하" +"시오." + +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:93 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:406 +msgid "Running post-processing scripts" +msgstr "포스트 프로세싱 스크립트" + +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:95 +msgid "G-code file exported to %1%" +msgstr "%1%로 내보낸 G 코드 파일" + +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:99 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:117 +msgid "Slicing complete" +msgstr "슬라이스 완료" + +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:113 +msgid "Masked SLA file exported to %1%" +msgstr "마스크 된 SLA 파일을 %1%로 내보냅니" + +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:408 +msgid "Copying of the temporary G-code to the output G-code failed" +msgstr "임시 G 코드를 출력 G 코드에 복사 하지 못했습니다" + +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:417 +msgid "Scheduling upload to `%1%`. See Window -> Print Host Upload Queue" +msgstr "" +"`%1%`. 로 업로드를 예약 합니다. 창-> 인쇄 호스트 업로드 대기열을 참조 하십시" +"오" + +#: src/slic3r/GUI/BedShapeDialog.cpp:65 +msgid "Shape" +msgstr "모양" + +#: src/slic3r/GUI/BedShapeDialog.cpp:72 +msgid "Rectangular" +msgstr "직사각형" + +#: src/slic3r/GUI/BedShapeDialog.cpp:76 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:391 src/slic3r/GUI/Plater.cpp:145 +#: src/slic3r/GUI/Tab.cpp:2469 +msgid "Size" +msgstr "사이즈" + +#: src/slic3r/GUI/BedShapeDialog.cpp:77 +msgid "Size in X and Y of the rectangular plate." +msgstr "사격형 플레이트 X 및 Y 크기." + +#: src/slic3r/GUI/BedShapeDialog.cpp:83 +msgid "Origin" +msgstr "원본" + +#: src/slic3r/GUI/BedShapeDialog.cpp:84 +msgid "" +"Distance of the 0,0 G-code coordinate from the front left corner of the " +"rectangle." +msgstr "사각형의 전면 왼쪽된 모서리에서 0, 0 G-코드 좌표 거리입니다." + +#: src/slic3r/GUI/BedShapeDialog.cpp:88 +msgid "Circular" +msgstr "원형" + +#: src/slic3r/GUI/BedShapeDialog.cpp:91 src/slic3r/GUI/ConfigWizard.cpp:118 +#: src/slic3r/GUI/ConfigWizard.cpp:571 src/slic3r/GUI/ConfigWizard.cpp:585 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:388 +#: src/slic3r/GUI/WipeTowerDialog.cpp:84 src/slic3r/GUI/wxExtensions.cpp:486 +#: src/libslic3r/PrintConfig.cpp:70 src/libslic3r/PrintConfig.cpp:77 +#: src/libslic3r/PrintConfig.cpp:86 src/libslic3r/PrintConfig.cpp:220 +#: src/libslic3r/PrintConfig.cpp:295 src/libslic3r/PrintConfig.cpp:303 +#: src/libslic3r/PrintConfig.cpp:353 src/libslic3r/PrintConfig.cpp:363 +#: src/libslic3r/PrintConfig.cpp:488 src/libslic3r/PrintConfig.cpp:499 +#: src/libslic3r/PrintConfig.cpp:517 src/libslic3r/PrintConfig.cpp:695 +#: src/libslic3r/PrintConfig.cpp:1215 src/libslic3r/PrintConfig.cpp:1276 +#: src/libslic3r/PrintConfig.cpp:1294 src/libslic3r/PrintConfig.cpp:1312 +#: src/libslic3r/PrintConfig.cpp:1364 src/libslic3r/PrintConfig.cpp:1374 +#: src/libslic3r/PrintConfig.cpp:1495 src/libslic3r/PrintConfig.cpp:1503 +#: src/libslic3r/PrintConfig.cpp:1544 src/libslic3r/PrintConfig.cpp:1552 +#: src/libslic3r/PrintConfig.cpp:1562 src/libslic3r/PrintConfig.cpp:1570 +#: src/libslic3r/PrintConfig.cpp:1578 src/libslic3r/PrintConfig.cpp:1661 +#: src/libslic3r/PrintConfig.cpp:1878 src/libslic3r/PrintConfig.cpp:1948 +#: src/libslic3r/PrintConfig.cpp:1982 src/libslic3r/PrintConfig.cpp:2176 +#: src/libslic3r/PrintConfig.cpp:2183 src/libslic3r/PrintConfig.cpp:2190 +#: src/libslic3r/PrintConfig.cpp:2220 src/libslic3r/PrintConfig.cpp:2230 +#: src/libslic3r/PrintConfig.cpp:2240 src/libslic3r/PrintConfig.cpp:2403 +#: src/libslic3r/PrintConfig.cpp:2478 src/libslic3r/PrintConfig.cpp:2487 +#: src/libslic3r/PrintConfig.cpp:2496 src/libslic3r/PrintConfig.cpp:2506 +#: src/libslic3r/PrintConfig.cpp:2550 src/libslic3r/PrintConfig.cpp:2560 +#: src/libslic3r/PrintConfig.cpp:2572 src/libslic3r/PrintConfig.cpp:2592 +#: src/libslic3r/PrintConfig.cpp:2602 src/libslic3r/PrintConfig.cpp:2613 +#: src/libslic3r/PrintConfig.cpp:2631 src/libslic3r/PrintConfig.cpp:2646 +#: src/libslic3r/PrintConfig.cpp:2660 src/libslic3r/PrintConfig.cpp:2673 +#: src/libslic3r/PrintConfig.cpp:2683 src/libslic3r/PrintConfig.cpp:2704 +#: src/libslic3r/PrintConfig.cpp:2715 src/libslic3r/PrintConfig.cpp:2725 +#: src/libslic3r/PrintConfig.cpp:2735 +msgid "mm" +msgstr "mm" + +#: src/slic3r/GUI/BedShapeDialog.cpp:92 src/libslic3r/PrintConfig.cpp:692 +msgid "Diameter" +msgstr "노즐 직경" + +#: src/slic3r/GUI/BedShapeDialog.cpp:93 +msgid "" +"Diameter of the print bed. It is assumed that origin (0,0) is located in the " +"center." +msgstr "인쇄 침대의 직경. 원점 (0,0) 은 중심에 있다고 가정합니다." + +#: src/slic3r/GUI/BedShapeDialog.cpp:97 src/slic3r/GUI/GUI_Preview.cpp:246 +#: src/libslic3r/GCode/PreviewData.cpp:175 +msgid "Custom" +msgstr "사용자 정의" + +#: src/slic3r/GUI/BedShapeDialog.cpp:101 +msgid "Load shape from STL..." +msgstr "STL파일 로드." + +#: src/slic3r/GUI/BedShapeDialog.cpp:154 +msgid "Settings" +msgstr "설정" + +#: src/slic3r/GUI/BedShapeDialog.cpp:171 +msgid "Texture" +msgstr "질감" + +#: src/slic3r/GUI/BedShapeDialog.cpp:181 src/slic3r/GUI/BedShapeDialog.cpp:249 +msgid "Load..." +msgstr "불러오기..." + +#: src/slic3r/GUI/BedShapeDialog.cpp:189 src/slic3r/GUI/BedShapeDialog.cpp:257 +#: src/slic3r/GUI/Tab.cpp:3204 +msgid "Remove" +msgstr "제거" + +#: src/slic3r/GUI/BedShapeDialog.cpp:239 +msgid "Model" +msgstr "모델" + +#: src/slic3r/GUI/BedShapeDialog.cpp:464 +msgid "Choose an STL file to import bed shape from:" +msgstr "다음 에서 침대 모양을 가져올 STL 파일을 선택합니다." + +#: src/slic3r/GUI/BedShapeDialog.cpp:471 src/slic3r/GUI/BedShapeDialog.cpp:520 +#: src/slic3r/GUI/BedShapeDialog.cpp:543 +msgid "Invalid file format." +msgstr "잘못된 파일 형식." + +#: src/slic3r/GUI/BedShapeDialog.cpp:482 +msgid "Error! Invalid model" +msgstr "오류! 잘못된 모델" + +#: src/slic3r/GUI/BedShapeDialog.cpp:490 +msgid "The selected file contains no geometry." +msgstr "선택한 파일에는 형상이 없는 포함 되어 있습니다." + +#: src/slic3r/GUI/BedShapeDialog.cpp:494 +msgid "" +"The selected file contains several disjoint areas. This is not supported." +msgstr "" +"선택한 파일 여러 분리 된 영역을 포함 되어 있습니다. 이것ㅇ 지원 되지 않습니" +"다." + +#: src/slic3r/GUI/BedShapeDialog.cpp:509 +msgid "Choose a file to import bed texture from (PNG/SVG):" +msgstr "(PNG /SVG)에서 침대 텍스처를 가져올 파일을 선택합니다." + +#: src/slic3r/GUI/BedShapeDialog.cpp:532 +msgid "Choose an STL file to import bed model from:" +msgstr "다음에서 침대 모델을 가져올 STL 파일을 선택합니다." + +#: src/slic3r/GUI/BedShapeDialog.hpp:59 src/slic3r/GUI/ConfigWizard.cpp:530 +msgid "Bed Shape" +msgstr "배드 모양" + +#: src/slic3r/GUI/BonjourDialog.cpp:55 +msgid "Network lookup" +msgstr "네트워크 조회" + +#: src/slic3r/GUI/BonjourDialog.cpp:72 +msgid "Address" +msgstr "주소" + +#: src/slic3r/GUI/BonjourDialog.cpp:73 +msgid "Hostname" +msgstr "호스트이름" + +#: src/slic3r/GUI/BonjourDialog.cpp:74 +msgid "Service name" +msgstr "서비스 이름" + +#: src/slic3r/GUI/BonjourDialog.cpp:76 +msgid "OctoPrint version" +msgstr "옥토프린트 버전" + +#: src/slic3r/GUI/BonjourDialog.cpp:218 +msgid "Searching for devices" +msgstr "디바이스 검색" + +#: src/slic3r/GUI/BonjourDialog.cpp:225 +msgid "Finished" +msgstr "완료" + +#: src/slic3r/GUI/ButtonsDescription.cpp:16 +msgid "Buttons And Text Colors Description" +msgstr "버튼 및 텍스트 색상 설명" + +#: src/slic3r/GUI/ButtonsDescription.cpp:36 +msgid "Value is the same as the system value" +msgstr "이 값은 시스템 값과 같습니다" + +#: src/slic3r/GUI/ButtonsDescription.cpp:53 +msgid "" +"Value was changed and is not equal to the system value or the last saved " +"preset" +msgstr "" +"값이 변경 되었고 시스템 값 또는 마지막으로 저장 된 사전 설정과 같지 않음" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:18 +msgid "Upgrade" +msgstr "업그레이드" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:20 +msgid "Downgrade" +msgstr "다운그레이드" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:22 +msgid "Before roll back" +msgstr "롤백 전에" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:24 +msgid "User" +msgstr "사용자" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:27 +msgid "Unknown" +msgstr "알 수 없음" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:39 +msgid "Active" +msgstr "활동중" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:45 +msgid "slic3r version" +msgstr "slic3r에 대하여" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:46 src/slic3r/GUI/Preset.cpp:1307 +msgid "print" +msgstr "프린트" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:47 +msgid "filaments" +msgstr "필라멘트" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:48 src/slic3r/GUI/Preset.cpp:1311 +msgid "printer" +msgstr "프린터" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:52 src/slic3r/GUI/Tab.cpp:939 +msgid "vendor" +msgstr "제조 회사" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:52 +msgid "version" +msgstr "버전" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:53 +msgid "min slic3r version" +msgstr "최소 slic3r 버전" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:55 +msgid "max slic3r version" +msgstr "최대 slic3r 버전" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:58 +msgid "model" +msgstr "모델" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:58 +msgid "variants" +msgstr "변종" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:70 +#, c-format +msgid "Incompatible with this %s" +msgstr "%s 과 호환되지 않습니다" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:73 +msgid "Activate" +msgstr "활성화" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:99 +msgid "Configuration Snapshots" +msgstr "구성 스냅숏" + +#: src/slic3r/GUI/ConfigWizard.cpp:118 +msgid "nozzle" +msgstr "노즐" + +#: src/slic3r/GUI/ConfigWizard.cpp:122 +msgid "Alternate nozzles:" +msgstr "대체 노즐:" + +#: src/slic3r/GUI/ConfigWizard.cpp:188 +msgid "All standard" +msgstr "모두 표준설정" + +#: src/slic3r/GUI/ConfigWizard.cpp:189 src/slic3r/GUI/Tab.cpp:3254 +msgid "All" +msgstr "모두 선택" + +#: src/slic3r/GUI/ConfigWizard.cpp:190 src/slic3r/GUI/Plater.cpp:470 +#: src/libslic3r/GCode/PreviewData.cpp:162 +msgid "None" +msgstr "없음" + +#: src/slic3r/GUI/ConfigWizard.cpp:296 +#, c-format +msgid "Welcome to the %s Configuration Assistant" +msgstr "%s 구성 도우미에 오신 것을 환영 합니다" + +#: src/slic3r/GUI/ConfigWizard.cpp:298 +#, c-format +msgid "Welcome to the %s Configuration Wizard" +msgstr "%s에 오신것을 환영 합니다." + +#: src/slic3r/GUI/ConfigWizard.cpp:300 +msgid "Welcome" +msgstr "환영합니다" + +#: src/slic3r/GUI/ConfigWizard.cpp:304 src/slic3r/GUI/GUI_App.cpp:747 +#, c-format +msgid "Run %s" +msgstr "%s 실행" + +#: src/slic3r/GUI/ConfigWizard.cpp:306 +#, c-format +msgid "" +"Hello, welcome to %s! This %s helps you with the initial configuration; just " +"a few settings and you will be ready to print." +msgstr "" +"안녕하세요 ,%s에 오신 것을 환영 합니다! 이 %s는 초기 구성에 도움이 됩니다. 그" +"냥 몇 가지 설정 하 고 당신은 인쇄 할 준비가 될 것입니다." + +#: src/slic3r/GUI/ConfigWizard.cpp:311 +msgid "" +"Remove user profiles - install from scratch (a snapshot will be taken " +"beforehand)" +msgstr "사용자 프로필 제거-처음부터 설치 (스냅숏은 사전에 수행 됩니다)" + +#: src/slic3r/GUI/ConfigWizard.cpp:342 +#, c-format +msgid "%s Family" +msgstr "%s의 가족들" + +#: src/slic3r/GUI/ConfigWizard.cpp:379 +msgid "Custom Printer Setup" +msgstr "사용자 지정 프린터 설정" + +#: src/slic3r/GUI/ConfigWizard.cpp:379 +msgid "Custom Printer" +msgstr "사용자 정의 프린터" + +#: src/slic3r/GUI/ConfigWizard.cpp:381 +msgid "Define a custom printer profile" +msgstr "사용자 정의 프린터 프로필 정의" + +#: src/slic3r/GUI/ConfigWizard.cpp:383 +msgid "Custom profile name:" +msgstr "사용자 지정 프로필 이름:" + +#: src/slic3r/GUI/ConfigWizard.cpp:407 +msgid "Automatic updates" +msgstr "자동 업데이트" + +#: src/slic3r/GUI/ConfigWizard.cpp:407 +msgid "Updates" +msgstr "업데이트" + +#: src/slic3r/GUI/ConfigWizard.cpp:415 src/slic3r/GUI/Preferences.cpp:69 +msgid "Check for application updates" +msgstr "프로그램 업데이트 확인" + +#: src/slic3r/GUI/ConfigWizard.cpp:419 +#, c-format +msgid "" +"If enabled, %s checks for new application versions online. When a new " +"version becomes available, a notification is displayed at the next " +"application startup (never during program usage). This is only a " +"notification mechanisms, no automatic installation is done." +msgstr "" +"활성화 된 경우 %s은 온라인의 새 버전을 확인합니다. 새 버전을 사용할 수있게되" +"면 다음 응용 프로그램 시작시 알림이 표시됩니다 (프로그램 사용 중에는 절대로 " +"사용하지 마십시오).이것은 알림 메커니즘 일뿐 자동 설치가 수행되지 않습니다." + +#: src/slic3r/GUI/ConfigWizard.cpp:425 src/slic3r/GUI/Preferences.cpp:77 +msgid "Update built-in Presets automatically" +msgstr "기존의 설정 자동 업데이트" + +#: src/slic3r/GUI/ConfigWizard.cpp:429 +#, c-format +msgid "" +"If enabled, %s downloads updates of built-in system presets in the " +"background.These updates are downloaded into a separate temporary location." +"When a new preset version becomes available it is offered at application " +"startup." +msgstr "" +"활성화 된 경우 %s은 백그라운드에서 내장 시스템 사전 설정의 업데이트를 다운로" +"드합니다. 이러한 업데이트는 별도의 임시 위치에 다운로드됩니다. 새로운 사전 설" +"정 버전을 사용할 수있게되면 응용 프로그램 시작시 제공됩니다." + +#: src/slic3r/GUI/ConfigWizard.cpp:432 +msgid "" +"Updates are never applied without user's consent and never overwrite user's " +"customized settings." +msgstr "" +"업데이트는 사용자의 동의없이 적용되지 않으며 사용자의 사용자 지정된 설정을 덮" +"어 쓰지 않습니다." + +#: src/slic3r/GUI/ConfigWizard.cpp:437 +msgid "" +"Additionally a backup snapshot of the whole configuration is created before " +"an update is applied." +msgstr "또한 업데이트가 적용되기 전에 전체 구성의 백업 스냅 샷이 생성됩니다." + +#: src/slic3r/GUI/ConfigWizard.cpp:444 +msgid "Other Vendors" +msgstr "다른 공급 업체" + +#: src/slic3r/GUI/ConfigWizard.cpp:446 +#, c-format +msgid "Pick another vendor supported by %s:" +msgstr "%s가 지원하는 다른 공급 업체를 선택하십시오:" + +#: src/slic3r/GUI/ConfigWizard.cpp:492 +msgid "Firmware Type" +msgstr "펌웨어 타입" + +#: src/slic3r/GUI/ConfigWizard.cpp:492 src/slic3r/GUI/Tab.cpp:2100 +msgid "Firmware" +msgstr "펌웨어" + +#: src/slic3r/GUI/ConfigWizard.cpp:496 +msgid "Choose the type of firmware used by your printer." +msgstr "프린터에 패치할 펌웨어를 선택하세요." + +#: src/slic3r/GUI/ConfigWizard.cpp:530 +msgid "Bed Shape and Size" +msgstr "배드 모양과 크기" + +#: src/slic3r/GUI/ConfigWizard.cpp:533 +msgid "Set the shape of your printer's bed." +msgstr "프린터 배드모양을 설정하세요." + +#: src/slic3r/GUI/ConfigWizard.cpp:553 +msgid "Filament and Nozzle Diameters" +msgstr "필라멘트와 노즐 크기" + +#: src/slic3r/GUI/ConfigWizard.cpp:553 +msgid "Print Diameters" +msgstr "인쇄 직경" + +#: src/slic3r/GUI/ConfigWizard.cpp:567 +msgid "Enter the diameter of your printer's hot end nozzle." +msgstr "핫 엔드 노즐 직경을 입력하십시오." + +#: src/slic3r/GUI/ConfigWizard.cpp:570 +msgid "Nozzle Diameter:" +msgstr "노즐 직경:" + +#: src/slic3r/GUI/ConfigWizard.cpp:580 +msgid "Enter the diameter of your filament." +msgstr "필라멘트의 직경을 입력하십시오." + +#: src/slic3r/GUI/ConfigWizard.cpp:581 +msgid "" +"Good precision is required, so use a caliper and do multiple measurements " +"along the filament, then compute the average." +msgstr "" +"정밀도가 필요하므로 캘리퍼를 사용하여 필라멘트를 따라 여러 번 측정 한 다음 평" +"균을 계산하십시오." + +#: src/slic3r/GUI/ConfigWizard.cpp:584 +msgid "Filament Diameter:" +msgstr "필라멘트 직경:" + +#: src/slic3r/GUI/ConfigWizard.cpp:618 +msgid "Extruder and Bed Temperatures" +msgstr "익스트루더와 배드 온도" + +#: src/slic3r/GUI/ConfigWizard.cpp:618 +msgid "Temperatures" +msgstr "온도" + +#: src/slic3r/GUI/ConfigWizard.cpp:634 +msgid "Enter the temperature needed for extruding your filament." +msgstr "필라멘트 압출에 필요한 온도를 입력하십시오." + +#: src/slic3r/GUI/ConfigWizard.cpp:635 +msgid "A rule of thumb is 160 to 230 °C for PLA, and 215 to 250 °C for ABS." +msgstr "보통 PLA의 경우 160 ~ 230 ° C, ABS의 경우 215 ~ 250 ° C입니다." + +#: src/slic3r/GUI/ConfigWizard.cpp:638 +msgid "Extrusion Temperature:" +msgstr "출력 온도 :" + +#: src/slic3r/GUI/ConfigWizard.cpp:639 src/slic3r/GUI/ConfigWizard.cpp:653 +msgid "°C" +msgstr "°C" + +#: src/slic3r/GUI/ConfigWizard.cpp:648 +msgid "" +"Enter the bed temperature needed for getting your filament to stick to your " +"heated bed." +msgstr "필라멘트가 핫배드에 접착하는데 필요한 배드온도를 입력하십시오." + +#: src/slic3r/GUI/ConfigWizard.cpp:649 +msgid "" +"A rule of thumb is 60 °C for PLA and 110 °C for ABS. Leave zero if you have " +"no heated bed." +msgstr "" +"보통은 PLA의 경우 60 ° C이고 ABS의 경우 110 ° C입니다. 핫배드가 없는 경우에" +"는 0으로 두십시오." + +#: src/slic3r/GUI/ConfigWizard.cpp:652 +msgid "Bed Temperature:" +msgstr "배드 온도 :" + +#: src/slic3r/GUI/ConfigWizard.cpp:1115 +msgid "Select all standard printers" +msgstr "이 프로파일과 호환 가능한 프린터를 선택하세요" + +#: src/slic3r/GUI/ConfigWizard.cpp:1118 +msgid "< &Back" +msgstr "< &뒤로" + +#: src/slic3r/GUI/ConfigWizard.cpp:1119 +msgid "&Next >" +msgstr "&다음 >" + +#: src/slic3r/GUI/ConfigWizard.cpp:1120 +msgid "&Finish" +msgstr "&완료" + +#: src/slic3r/GUI/ConfigWizard.cpp:1121 src/slic3r/GUI/FirmwareDialog.cpp:151 +#: src/slic3r/GUI/ProgressStatusBar.cpp:27 +msgid "Cancel" +msgstr "취소" + +#: src/slic3r/GUI/ConfigWizard.cpp:1135 +msgid "Prusa FFF Technology Printers" +msgstr "Prusa FFF 방식 프린터" + +#: src/slic3r/GUI/ConfigWizard.cpp:1138 +msgid "Prusa MSLA Technology Printers" +msgstr "Prusa MSLA 방식 프린터" + +#: src/slic3r/GUI/ConfigWizard.cpp:1207 +msgid "Configuration Assistant" +msgstr "구성 도우미" + +#: src/slic3r/GUI/ConfigWizard.cpp:1208 +msgid "Configuration &Assistant" +msgstr "구성 & 도우미" + +#: src/slic3r/GUI/ConfigWizard.cpp:1210 +msgid "Configuration Wizard" +msgstr "구성 마법사" + +#: src/slic3r/GUI/ConfigWizard.cpp:1211 +msgid "Configuration &Wizard" +msgstr "구성 & 마법사" + +#: src/slic3r/GUI/Field.cpp:125 +msgid "default value" +msgstr "기본값" + +#: src/slic3r/GUI/Field.cpp:128 +msgid "parameter name" +msgstr "매개 변수 명칭" + +#: src/slic3r/GUI/Field.cpp:139 +msgid "N/A" +msgstr "N/A" + +#: src/slic3r/GUI/Field.cpp:158 +#, c-format +msgid "%s doesn't support percentage" +msgstr "%s 이(가) 백분율을 지원하지 않음" + +#: src/slic3r/GUI/Field.cpp:174 src/slic3r/GUI/Field.cpp:197 +msgid "Invalid numeric input." +msgstr "숫자 입력이 잘못 되었습니다." + +#: src/slic3r/GUI/Field.cpp:179 +msgid "Input value is out of range" +msgstr "Input value is out of range" + +#: src/slic3r/GUI/Field.cpp:206 +#, c-format +msgid "" +"Do you mean %s%% instead of %s %s?\n" +"Select YES if you want to change this value to %s%%, \n" +"or NO if you are sure that %s %s is a correct value." +msgstr "" +"%s %s 대신 %s%%을 하려고 합니까?\n" +"이 값을 %s%%, 로 변경하려면 YES를 선택하십시오. \n" +"또는 %s %s 이(가) 올바른 값인지 확인하는 경우 NO를 선택하세요. " + +#: src/slic3r/GUI/Field.cpp:209 +msgid "Parameter validation" +msgstr "매개 변수 유효성 검사" + +#: src/slic3r/GUI/FirmwareDialog.cpp:150 +msgid "Flash!" +msgstr "완료!" + +#: src/slic3r/GUI/FirmwareDialog.cpp:152 +msgid "Flashing in progress. Please do not disconnect the printer!" +msgstr "진행 중입니다. 프린터를 분리하지 마십시오!" + +#: src/slic3r/GUI/FirmwareDialog.cpp:199 +msgid "Flashing failed" +msgstr "펌웨어 적용 실패" + +#: src/slic3r/GUI/FirmwareDialog.cpp:282 +msgid "Flashing succeeded!" +msgstr "적용 성공!" + +#: src/slic3r/GUI/FirmwareDialog.cpp:283 +msgid "Flashing failed. Please see the avrdude log below." +msgstr "적용 실패. 아래의 로그를 확인하세요." + +#: src/slic3r/GUI/FirmwareDialog.cpp:284 +msgid "Flashing cancelled." +msgstr "적용 취소됨." + +#: src/slic3r/GUI/FirmwareDialog.cpp:332 +#, c-format +msgid "" +"This firmware hex file does not match the printer model.\n" +"The hex file is intended for: %s\n" +"Printer reported: %s\n" +"\n" +"Do you want to continue and flash this hex file anyway?\n" +"Please only continue if you are sure this is the right thing to do." +msgstr "" +"이 펌웨어 hex 파일이 프린터 모델과 일치 하지 않습니다.\n" +"Hex 파일은 다음을 위한 것입니다: %s\n" +"보고 된 프린터: %s\n" +"\n" +"그래도이 hex 파일을 계속 적용 하시겠습니까?\n" +"확신 하는 경우에만 계속 하십시오." + +#: src/slic3r/GUI/FirmwareDialog.cpp:419 src/slic3r/GUI/FirmwareDialog.cpp:454 +#, c-format +msgid "" +"Multiple %s devices found. Please only connect one at a time for flashing." +msgstr "" +"여러 %s 장치를 찾았습니다. 깜박이는 경우에는 한 번에 하나씩만 연결 하십시오." + +#: src/slic3r/GUI/FirmwareDialog.cpp:436 +#, c-format +msgid "" +"The %s device was not found.\n" +"If the device is connected, please press the Reset button next to the USB " +"connector ..." +msgstr "" +"%s 장치를 찾을 하지 않았습니다.\n" +"장치가 연결 된 경우 USB 커넥터 옆에 있는 리셋 단추를 누르십시오." + +#: src/slic3r/GUI/FirmwareDialog.cpp:548 +#, c-format +msgid "The %s device could not have been found" +msgstr "%s 장치를 찾을 수 없습니다" + +#: src/slic3r/GUI/FirmwareDialog.cpp:645 +#, c-format +msgid "Error accessing port at %s: %s" +msgstr "%s 포트에 액세스 하는 중 오류가 발생 했습니다 :%s" + +#: src/slic3r/GUI/FirmwareDialog.cpp:647 +#, c-format +msgid "Error: %s" +msgstr "에러: %s" + +#: src/slic3r/GUI/FirmwareDialog.cpp:777 +msgid "Firmware flasher" +msgstr "펌웨어 업로드" + +#: src/slic3r/GUI/FirmwareDialog.cpp:802 +msgid "Firmware image:" +msgstr "펌웨어 이미지:" + +#: src/slic3r/GUI/FirmwareDialog.cpp:805 src/slic3r/GUI/Tab.cpp:1824 +#: src/slic3r/GUI/Tab.cpp:1880 +msgid "Browse" +msgstr "검색" + +#: src/slic3r/GUI/FirmwareDialog.cpp:807 +msgid "Serial port:" +msgstr "시리얼 포트:" + +#: src/slic3r/GUI/FirmwareDialog.cpp:809 +msgid "Autodetected" +msgstr "자동 감지" + +#: src/slic3r/GUI/FirmwareDialog.cpp:810 +msgid "Rescan" +msgstr "재검색" + +#: src/slic3r/GUI/FirmwareDialog.cpp:817 +msgid "Progress:" +msgstr "진행:" + +#: src/slic3r/GUI/FirmwareDialog.cpp:820 +msgid "Status:" +msgstr "상태:" + +#: src/slic3r/GUI/FirmwareDialog.cpp:821 +msgid "Ready" +msgstr "준비" + +#: src/slic3r/GUI/FirmwareDialog.cpp:841 +msgid "Advanced: Output log" +msgstr "고급: 출력 로그" + +#: src/slic3r/GUI/FirmwareDialog.cpp:852 +#: src/slic3r/GUI/PrintHostDialogs.cpp:161 +msgid "Close" +msgstr "닫기" + +#: src/slic3r/GUI/FirmwareDialog.cpp:903 +msgid "" +"Are you sure you want to cancel firmware flashing?\n" +"This could leave your printer in an unusable state!" +msgstr "" +"새펌웨어 적용을 취소하시겠습니까?\n" +"프린터가 사용할 수 없는 상태가 될 수 있습니다!" + +#: src/slic3r/GUI/FirmwareDialog.cpp:904 +msgid "Confirmation" +msgstr "확인" + +#: src/slic3r/GUI/FirmwareDialog.cpp:907 +msgid "Cancelling..." +msgstr "취소 중...." + +#: src/slic3r/GUI/GLCanvas3D.cpp:526 +msgid "Layers heights" +msgstr "레이어 높이" + +#: src/slic3r/GUI/GLCanvas3D.cpp:623 +msgid "An object outside the print area was detected" +msgstr "인쇄 영역 밖에 있는 개체가 감지 되었습니다" + +#: src/slic3r/GUI/GLCanvas3D.cpp:624 +msgid "A toolpath outside the print area was detected" +msgstr "인쇄 영역 밖에 있는 공구 경로가 감지 되었습니다" + +#: src/slic3r/GUI/GLCanvas3D.cpp:625 +msgid "SLA supports outside the print area were detected" +msgstr "인쇄 영역 외부의 SLA 지원 감지 됨" + +#: src/slic3r/GUI/GLCanvas3D.cpp:626 +msgid "Some objects are not visible when editing supports" +msgstr "편집 지원 시 일부 객체가 표시 되지 않음" + +#: src/slic3r/GUI/GLCanvas3D.cpp:628 +msgid "" +"An object outside the print area was detected\n" +"Resolve the current problem to continue slicing" +msgstr "" +"인쇄 영역 밖에 있는 개체가 감지 되었습니다.\n" +"현재 문제를 해결 하여 슬라이싱을 계속 합니다" + +#: src/slic3r/GUI/GLCanvas3D.cpp:1711 +msgid "Mirror Object" +msgstr "오브젝트 미러" + +#: src/slic3r/GUI/GLCanvas3D.cpp:2872 +msgid "Move Object" +msgstr "오브젝트 이동" + +#: src/slic3r/GUI/GLCanvas3D.cpp:3389 src/slic3r/GUI/GLCanvas3D.cpp:3609 +#: src/slic3r/GUI/MainFrame.cpp:559 +msgid "Undo" +msgstr "실행 취소" + +#: src/slic3r/GUI/GLCanvas3D.cpp:3389 src/slic3r/GUI/GLCanvas3D.cpp:3639 +#: src/slic3r/GUI/MainFrame.cpp:562 +msgid "Redo" +msgstr "다시 실행" + +#: src/slic3r/GUI/GLCanvas3D.cpp:3395 +#, c-format +msgid "%s Stack" +msgstr "%s 스택" + +#: src/slic3r/GUI/GLCanvas3D.cpp:3413 +#, c-format +msgid "%s %d Action" +msgstr "%s %d 액션" + +#: src/slic3r/GUI/GLCanvas3D.cpp:3460 +msgid "Add..." +msgstr "추가..." + +#: src/slic3r/GUI/GLCanvas3D.cpp:3468 src/slic3r/GUI/GUI_ObjectList.cpp:1434 +#: src/slic3r/GUI/Plater.cpp:3467 src/slic3r/GUI/Plater.cpp:3486 +#: src/slic3r/GUI/Tab.cpp:3204 +msgid "Delete" +msgstr "지우기 " + +#: src/slic3r/GUI/GLCanvas3D.cpp:3477 src/slic3r/GUI/Plater.cpp:4075 +msgid "Delete all" +msgstr "전부 지우기" + +#: src/slic3r/GUI/GLCanvas3D.cpp:3486 src/slic3r/GUI/KBShortcutsDialog.cpp:134 +#: src/slic3r/GUI/Plater.cpp:2636 +msgid "Arrange" +msgstr "정렬" + +#: src/slic3r/GUI/GLCanvas3D.cpp:3486 +msgid "Arrange selection" +msgstr "선택 정렬" + +#: src/slic3r/GUI/GLCanvas3D.cpp:3498 +msgid "Copy" +msgstr "복사" + +#: src/slic3r/GUI/GLCanvas3D.cpp:3507 +msgid "Paste" +msgstr "붙여넣기" + +#: src/slic3r/GUI/GLCanvas3D.cpp:3519 +msgid "Add instance" +msgstr "복제본 추가" + +#: src/slic3r/GUI/GLCanvas3D.cpp:3530 +msgid "Remove instance" +msgstr "복제본 제거" + +#: src/slic3r/GUI/GLCanvas3D.cpp:3543 +msgid "Split to objects" +msgstr "객체로 분할" + +#: src/slic3r/GUI/GLCanvas3D.cpp:3553 src/slic3r/GUI/GUI_ObjectList.cpp:1280 +msgid "Split to parts" +msgstr "파트로 분할" + +#: src/slic3r/GUI/GLCanvas3D.cpp:3566 +msgid "Layers editing" +msgstr "레이어층을 편집" + +#: src/slic3r/GUI/GLCanvas3D.cpp:5623 +msgid "Selection-Add from rectangle" +msgstr "사각형에서 선택-추가" + +#: src/slic3r/GUI/GLCanvas3D.cpp:5642 +msgid "Selection-Remove from rectangle" +msgstr "선택- 사각형에서 제거" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:40 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:144 src/libslic3r/PrintConfig.cpp:3176 +msgid "Cut" +msgstr "자르기" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:149 +msgid "Keep upper part" +msgstr "상위 부분 유지" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:150 +msgid "Keep lower part" +msgstr "낮은 부분 유지" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:151 +msgid "Rotate lower part upwards" +msgstr "아래쪽 부분을 위쪽으로 회전" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:154 +msgid "Perform cut" +msgstr "절단 실행" + +#: src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp:45 +msgid "Place on face" +msgstr "면 배치 " + +#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:48 +msgid "Move" +msgstr "이동" + +#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:177 +msgid "Position (mm)" +msgstr "위치 (mm)" + +#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:177 +msgid "Displacement (mm)" +msgstr "변위 (mm)" + +#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:449 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:466 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:485 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:503 +#: src/libslic3r/PrintConfig.cpp:3225 +msgid "Rotate" +msgstr "회전" + +#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:482 +msgid "Rotation (deg)" +msgstr "회전 (°)" + +#: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:47 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:390 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:486 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:504 +#: src/libslic3r/PrintConfig.cpp:3240 +msgid "Scale" +msgstr "크기" + +#: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:292 +msgid "Scale (%)" +msgstr "스케일 (%)" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:44 +msgid "Head diameter" +msgstr "헤드 지름" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:45 +msgid "Lock supports under new islands" +msgstr "새 고립 영역에서 잠금 지원" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:46 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1427 +msgid "Remove selected points" +msgstr "선택한 점 제거" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:47 +msgid "Remove all points" +msgstr "모든 점 제거" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:48 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1430 +msgid "Apply changes" +msgstr "변경 내용을 적용" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:49 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1431 +msgid "Discard changes" +msgstr "변경사항을 취소" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:50 +msgid "Minimal points distance" +msgstr "최소 포인트 거리" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:51 +#: src/libslic3r/PrintConfig.cpp:2620 +msgid "Support points density" +msgstr "지원 포인트 밀도" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:52 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1433 +msgid "Auto-generate points" +msgstr "점 자동 생성" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:53 +msgid "Manual editing" +msgstr "수동 편집" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:54 +msgid "Clipping of view" +msgstr "클랩핑된것 보기" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:55 +msgid "Reset direction" +msgstr "방향 재설정" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:531 +msgid "Add support point" +msgstr "서포트 지점 추가" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:720 +msgid "Delete support point" +msgstr "서포트 지점 삭제" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:925 +msgid "Change point head diameter" +msgstr "변경 점 헤드 지름" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:991 +msgid "Support parameter change" +msgstr "서포트 매개 변수 변경" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1099 +msgid "SLA Support Points" +msgstr "SLA 지원 포인트" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1138 +msgid "Do you want to save your manually edited support points?" +msgstr "수동으로 편집한 서포트 지점을 저장 하 시겠습니까?" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1139 +msgid "Save changes?" +msgstr "변경 사항을 저장 하 시겠습니까?" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1183 +msgid "Move support point" +msgstr "서포트 점 이동" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1282 +msgid "Support points edit" +msgstr "서포트 포인트 편집" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1333 +msgid "" +"Autogeneration will erase all manually edited points.\n" +"\n" +"Are you sure you want to do it?\n" +msgstr "" +"자동 생성은 수동으로 편집한 모든 점을 지웁니다.\n" +"\n" +"그렇게 하시겠습니까?\n" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1335 src/slic3r/GUI/GUI.cpp:289 +#: src/slic3r/GUI/WipeTowerDialog.cpp:44 src/slic3r/GUI/WipeTowerDialog.cpp:328 +msgid "Warning" +msgstr "위험" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1338 +msgid "Autogenerate support points" +msgstr "서포트 자동 생성" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1390 +msgid "SLA gizmo keyboard shortcuts" +msgstr "SLA 장치바로 가기" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1401 +msgid "Note: some shortcuts work in (non)editing mode only." +msgstr "참고: 일부 단축키는 (비)편집 모드 에서만 작동 합니다." + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1419 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1422 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1423 +msgid "Left click" +msgstr "왼쪽 클릭" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1419 +msgid "Add point" +msgstr "점 추가" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1420 +msgid "Right click" +msgstr "오른쪽 클릭" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1420 +msgid "Remove point" +msgstr "복제본 제거" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1421 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1424 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1425 +msgid "Drag" +msgstr "드래그" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1421 +msgid "Move point" +msgstr "점 이동" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1422 +msgid "Add point to selection" +msgstr "선택 영역에 점 추가" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1423 +msgid "Remove point from selection" +msgstr "선택 영역에서 점 제거" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1424 +msgid "Select by rectangle" +msgstr "직사각형으로 선택" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1425 +msgid "Deselect by rectangle" +msgstr "사각형으로 선택 해제" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1426 +msgid "Select all points" +msgstr "모든 점 선택" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1428 +msgid "Mouse wheel" +msgstr "마우스 휠" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1428 +msgid "Move clipping plane" +msgstr "클립핑 평면 이동" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1429 +msgid "Reset clipping plane" +msgstr "클립핑 평면 재설정" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1432 +msgid "Switch to editing mode" +msgstr "편집 모드로 전환" + +#: src/slic3r/GUI/GUI.cpp:141 src/slic3r/GUI/Tab.cpp:3063 +msgid "It's impossible to print multi-part object(s) with SLA technology." +msgstr "SLA 방식을 사용 하여 멀티파트를 인쇄할 수는 없습니다." + +#: src/slic3r/GUI/GUI.cpp:142 +msgid "Please check and fix your object list." +msgstr "개체 목록을 확인 하고 수정 하십시오." + +#: src/slic3r/GUI/GUI.cpp:143 src/slic3r/GUI/Plater.cpp:2213 +#: src/slic3r/GUI/Tab.cpp:3065 +msgid "Attention!" +msgstr "주목!" + +#: src/slic3r/GUI/GUI.cpp:283 +msgid "Notice" +msgstr "공지" + +#: src/slic3r/GUI/GUI_App.cpp:435 +msgid "Changing of an application language" +msgstr "응용 프로그램 언어 변경" + +#: src/slic3r/GUI/GUI_App.cpp:443 src/slic3r/GUI/GUI_App.cpp:452 +msgid "Recreating" +msgstr "재현" + +#: src/slic3r/GUI/GUI_App.cpp:456 +msgid "Loading of current presets" +msgstr "현재 프리셋 불러오기" + +#: src/slic3r/GUI/GUI_App.cpp:464 +msgid "Loading of a mode view" +msgstr "모드 보기 로드" + +#: src/slic3r/GUI/GUI_App.cpp:544 +msgid "Choose one file (3MF/AMF):" +msgstr "하나의 파일(3MF/AMF)을 선택합니다." + +#: src/slic3r/GUI/GUI_App.cpp:556 +msgid "Choose one or more files (STL/OBJ/AMF/3MF/PRUSA):" +msgstr "파일을 선택하세요 (STL/OBJ/AMF/3MF/PRUSA):" + +#: src/slic3r/GUI/GUI_App.cpp:598 +msgid "Select the language" +msgstr "언어를 선택" + +#: src/slic3r/GUI/GUI_App.cpp:599 +msgid "Language" +msgstr "언어" + +#: src/slic3r/GUI/GUI_App.cpp:750 +msgid "&Configuration Snapshots" +msgstr "구성 스냅숏" + +#: src/slic3r/GUI/GUI_App.cpp:750 +msgid "Inspect / activate configuration snapshots" +msgstr "구성 스냅 샷 검사 / 활성화" + +#: src/slic3r/GUI/GUI_App.cpp:751 +msgid "Take Configuration &Snapshot" +msgstr "구성 스냅 샷 가져 오기" + +#: src/slic3r/GUI/GUI_App.cpp:751 +msgid "Capture a configuration snapshot" +msgstr "구성 스냅 샷 캡처" + +#: src/slic3r/GUI/GUI_App.cpp:754 +msgid "&Preferences" +msgstr "환경 설정" + +#: src/slic3r/GUI/GUI_App.cpp:760 +msgid "Application preferences" +msgstr "응용 프로그램 환경 설정" + +#: src/slic3r/GUI/GUI_App.cpp:763 src/slic3r/GUI/wxExtensions.cpp:2882 +msgid "Simple" +msgstr "단순" + +#: src/slic3r/GUI/GUI_App.cpp:763 +msgid "Simple View Mode" +msgstr "단순 보기 모드" + +#: src/slic3r/GUI/GUI_App.cpp:764 src/slic3r/GUI/GUI_ObjectList.cpp:93 +#: src/slic3r/GUI/GUI_ObjectList.cpp:567 src/slic3r/GUI/Tab.cpp:1037 +#: src/slic3r/GUI/Tab.cpp:1052 src/slic3r/GUI/Tab.cpp:1150 +#: src/slic3r/GUI/Tab.cpp:1153 src/slic3r/GUI/Tab.cpp:1649 +#: src/slic3r/GUI/Tab.cpp:2120 src/slic3r/GUI/Tab.cpp:3699 +#: src/slic3r/GUI/wxExtensions.cpp:2883 src/libslic3r/PrintConfig.cpp:83 +#: src/libslic3r/PrintConfig.cpp:197 src/libslic3r/PrintConfig.cpp:360 +#: src/libslic3r/PrintConfig.cpp:1013 src/libslic3r/PrintConfig.cpp:2226 +msgid "Advanced" +msgstr "고급" + +#: src/slic3r/GUI/GUI_App.cpp:764 +msgid "Advanced View Mode" +msgstr "고급 보기 모드" + +#: src/slic3r/GUI/GUI_App.cpp:765 src/slic3r/GUI/wxExtensions.cpp:2884 +msgid "Expert" +msgstr "전문가" + +#: src/slic3r/GUI/GUI_App.cpp:765 +msgid "Expert View Mode" +msgstr "전문가 보기 모드" + +#: src/slic3r/GUI/GUI_App.cpp:770 +msgid "Mode" +msgstr "모드" + +#: src/slic3r/GUI/GUI_App.cpp:770 +#, c-format +msgid "%s View Mode" +msgstr "%s 보기 모드" + +#: src/slic3r/GUI/GUI_App.cpp:772 +msgid "Change Application &Language" +msgstr "응용 프로그램 언어 번경" + +#: src/slic3r/GUI/GUI_App.cpp:774 +msgid "Flash printer &firmware" +msgstr "프린터 펌웨어 플래시" + +#: src/slic3r/GUI/GUI_App.cpp:774 +msgid "Upload a firmware image into an Arduino based printer" +msgstr "아두이노 기반의 프린터 이미지 업로드" + +#: src/slic3r/GUI/GUI_App.cpp:786 +msgid "Taking configuration snapshot" +msgstr "구성 스냅 샷 만들기" + +#: src/slic3r/GUI/GUI_App.cpp:786 +msgid "Snapshot name" +msgstr "스냅 샷 이름" + +#: src/slic3r/GUI/GUI_App.cpp:829 +msgid "" +"Switching the language will trigger application restart.\n" +"You will lose content of the plater." +msgstr "" +"언어를 전환 하면 응용 프로그램 재시작 합니다.플레이트 위 오브젝트는 모두 지워" +"집니다." + +#: src/slic3r/GUI/GUI_App.cpp:831 +msgid "Do you want to proceed?" +msgstr "계속 하시겠습니까?" + +#: src/slic3r/GUI/GUI_App.cpp:832 +msgid "Language selection" +msgstr "국가에 맞는 언어를 선택" + +#: src/slic3r/GUI/GUI_App.cpp:855 +msgid "&Configuration" +msgstr "&구성" + +#: src/slic3r/GUI/GUI_App.cpp:877 +msgid "The presets on the following tabs were modified" +msgstr "다음 탭의 사전 설정이 수정 되었습니다" + +#: src/slic3r/GUI/GUI_App.cpp:877 src/slic3r/GUI/Tab.cpp:3051 +msgid "Discard changes and continue anyway?" +msgstr "수정된 사항을 취소하고 계속하겠습니까?" + +#: src/slic3r/GUI/GUI_App.cpp:880 +msgid "Unsaved Presets" +msgstr "저장되지 않은 기존설정" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:30 src/slic3r/GUI/GUI_ObjectList.cpp:84 +#: src/slic3r/GUI/GUI_ObjectList.cpp:558 src/libslic3r/PrintConfig.cpp:67 +#: src/libslic3r/PrintConfig.cpp:160 src/libslic3r/PrintConfig.cpp:392 +#: src/libslic3r/PrintConfig.cpp:453 src/libslic3r/PrintConfig.cpp:461 +#: src/libslic3r/PrintConfig.cpp:867 src/libslic3r/PrintConfig.cpp:1051 +#: src/libslic3r/PrintConfig.cpp:1354 src/libslic3r/PrintConfig.cpp:1420 +#: src/libslic3r/PrintConfig.cpp:1601 src/libslic3r/PrintConfig.cpp:2037 +#: src/libslic3r/PrintConfig.cpp:2095 +msgid "Layers and Perimeters" +msgstr "레이어 및 경계선" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:31 src/slic3r/GUI/GUI_ObjectList.cpp:85 +#: src/slic3r/GUI/GUI_ObjectList.cpp:559 src/slic3r/GUI/Plater.cpp:498 +#: src/slic3r/GUI/Tab.cpp:1041 src/slic3r/GUI/Tab.cpp:1042 +#: src/slic3r/GUI/Tab.cpp:1394 src/libslic3r/PrintConfig.cpp:177 +#: src/libslic3r/PrintConfig.cpp:400 src/libslic3r/PrintConfig.cpp:420 +#: src/libslic3r/PrintConfig.cpp:754 src/libslic3r/PrintConfig.cpp:768 +#: src/libslic3r/PrintConfig.cpp:805 src/libslic3r/PrintConfig.cpp:958 +#: src/libslic3r/PrintConfig.cpp:968 src/libslic3r/PrintConfig.cpp:986 +#: src/libslic3r/PrintConfig.cpp:1004 src/libslic3r/PrintConfig.cpp:1023 +#: src/libslic3r/PrintConfig.cpp:1708 src/libslic3r/PrintConfig.cpp:1725 +msgid "Infill" +msgstr "인필(채움)" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:32 src/slic3r/GUI/GUI_ObjectList.cpp:86 +#: src/slic3r/GUI/GUI_ObjectList.cpp:560 src/slic3r/GUI/GUI_Preview.cpp:243 +#: src/slic3r/GUI/Tab.cpp:1070 src/slic3r/GUI/Tab.cpp:1071 +#: src/libslic3r/PrintConfig.cpp:344 src/libslic3r/PrintConfig.cpp:1481 +#: src/libslic3r/PrintConfig.cpp:1830 src/libslic3r/PrintConfig.cpp:1836 +#: src/libslic3r/PrintConfig.cpp:1844 src/libslic3r/PrintConfig.cpp:1856 +#: src/libslic3r/PrintConfig.cpp:1866 src/libslic3r/PrintConfig.cpp:1874 +#: src/libslic3r/PrintConfig.cpp:1889 src/libslic3r/PrintConfig.cpp:1910 +#: src/libslic3r/PrintConfig.cpp:1921 src/libslic3r/PrintConfig.cpp:1937 +#: src/libslic3r/PrintConfig.cpp:1946 src/libslic3r/PrintConfig.cpp:1955 +#: src/libslic3r/PrintConfig.cpp:1966 src/libslic3r/PrintConfig.cpp:1980 +#: src/libslic3r/PrintConfig.cpp:1988 src/libslic3r/PrintConfig.cpp:1989 +#: src/libslic3r/PrintConfig.cpp:1998 src/libslic3r/PrintConfig.cpp:2006 +#: src/libslic3r/PrintConfig.cpp:2020 src/libslic3r/GCode/PreviewData.cpp:172 +msgid "Support material" +msgstr "서포트 재료(Support material)" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:35 src/slic3r/GUI/GUI_ObjectList.cpp:90 +#: src/slic3r/GUI/GUI_ObjectList.cpp:564 src/libslic3r/PrintConfig.cpp:2202 +#: src/libslic3r/PrintConfig.cpp:2210 +msgid "Wipe options" +msgstr "지우기 옵션" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:41 +msgid "Pad and Support" +msgstr "패드 및 서포트" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:47 +msgid "Add part" +msgstr "파트 추가" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:48 +msgid "Add modifier" +msgstr "편집영역(modifier) 추가" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:49 +msgid "Add support enforcer" +msgstr "서포트 지원(enforcer)영역 추가" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:50 +msgid "Add support blocker" +msgstr "서포트 금지영역(blocker) 추가" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:87 src/slic3r/GUI/GUI_ObjectList.cpp:561 +#: src/slic3r/GUI/GUI_Preview.cpp:222 src/slic3r/GUI/Tab.cpp:1095 +#: src/libslic3r/PrintConfig.cpp:209 src/libslic3r/PrintConfig.cpp:441 +#: src/libslic3r/PrintConfig.cpp:896 src/libslic3r/PrintConfig.cpp:1024 +#: src/libslic3r/PrintConfig.cpp:1410 src/libslic3r/PrintConfig.cpp:1647 +#: src/libslic3r/PrintConfig.cpp:1696 src/libslic3r/PrintConfig.cpp:1747 +#: src/libslic3r/PrintConfig.cpp:2080 +msgid "Speed" +msgstr "속도" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:88 src/slic3r/GUI/GUI_ObjectList.cpp:562 +#: src/slic3r/GUI/Tab.cpp:1130 src/slic3r/GUI/Tab.cpp:1997 +#: src/libslic3r/PrintConfig.cpp:471 src/libslic3r/PrintConfig.cpp:979 +#: src/libslic3r/PrintConfig.cpp:1389 src/libslic3r/PrintConfig.cpp:1717 +#: src/libslic3r/PrintConfig.cpp:1902 src/libslic3r/PrintConfig.cpp:1928 +msgid "Extruders" +msgstr "익스트루더" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:89 src/slic3r/GUI/GUI_ObjectList.cpp:563 +#: src/libslic3r/PrintConfig.cpp:431 src/libslic3r/PrintConfig.cpp:538 +#: src/libslic3r/PrintConfig.cpp:855 src/libslic3r/PrintConfig.cpp:987 +#: src/libslic3r/PrintConfig.cpp:1398 src/libslic3r/PrintConfig.cpp:1737 +#: src/libslic3r/PrintConfig.cpp:1911 src/libslic3r/PrintConfig.cpp:2069 +msgid "Extrusion Width" +msgstr "압출 폭" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:95 src/slic3r/GUI/GUI_ObjectList.cpp:569 +#: src/slic3r/GUI/Plater.cpp:466 src/slic3r/GUI/Tab.cpp:3655 +#: src/slic3r/GUI/Tab.cpp:3656 src/libslic3r/PrintConfig.cpp:2469 +#: src/libslic3r/PrintConfig.cpp:2476 src/libslic3r/PrintConfig.cpp:2485 +#: src/libslic3r/PrintConfig.cpp:2494 src/libslic3r/PrintConfig.cpp:2504 +#: src/libslic3r/PrintConfig.cpp:2530 src/libslic3r/PrintConfig.cpp:2537 +#: src/libslic3r/PrintConfig.cpp:2548 src/libslic3r/PrintConfig.cpp:2558 +#: src/libslic3r/PrintConfig.cpp:2567 src/libslic3r/PrintConfig.cpp:2580 +#: src/libslic3r/PrintConfig.cpp:2590 src/libslic3r/PrintConfig.cpp:2599 +#: src/libslic3r/PrintConfig.cpp:2609 src/libslic3r/PrintConfig.cpp:2621 +#: src/libslic3r/PrintConfig.cpp:2629 +msgid "Supports" +msgstr "서포트" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:96 src/slic3r/GUI/GUI_ObjectList.cpp:570 +#: src/slic3r/GUI/Tab.cpp:3684 src/slic3r/GUI/Tab.cpp:3685 +#: src/libslic3r/PrintConfig.cpp:2637 src/libslic3r/PrintConfig.cpp:2644 +#: src/libslic3r/PrintConfig.cpp:2658 src/libslic3r/PrintConfig.cpp:2668 +#: src/libslic3r/PrintConfig.cpp:2681 src/libslic3r/PrintConfig.cpp:2690 +#: src/libslic3r/PrintConfig.cpp:2701 src/libslic3r/PrintConfig.cpp:2712 +#: src/libslic3r/PrintConfig.cpp:2722 src/libslic3r/PrintConfig.cpp:2732 +msgid "Pad" +msgstr "패드" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:217 +msgid "Name" +msgstr "이름" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:271 +#, c-format +msgid "Auto-repaired (%d errors):\n" +msgstr "오류자동수정 (%d errors)\n" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:278 +msgid "degenerate facets" +msgstr "더러운 면" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:279 +msgid "edges fixed" +msgstr "모서리 고정" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:280 +msgid "facets removed" +msgstr "면 제거" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:281 +msgid "facets added" +msgstr "면 추가됨" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:282 +msgid "facets reversed" +msgstr "면 반전" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:283 +msgid "backwards edges" +msgstr "뒤쪽 가장자리" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:291 +msgid "Right button click the icon to fix STL through Netfabb" +msgstr "아이콘을 클릭 하여 Netfabb에서 STL을 수정 합니다" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:325 +msgid "Right button click the icon to change the object settings" +msgstr "아이콘을 클릭 하여 개체 설정을 변경 합니다" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:375 src/slic3r/GUI/GUI_ObjectList.cpp:396 +#: src/slic3r/GUI/GUI_ObjectList.cpp:408 src/slic3r/GUI/GUI_ObjectList.cpp:3508 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3518 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3550 src/slic3r/GUI/wxExtensions.cpp:576 +#: src/slic3r/GUI/wxExtensions.cpp:633 src/slic3r/GUI/wxExtensions.cpp:658 +#: src/slic3r/GUI/wxExtensions.cpp:794 +msgid "default" +msgstr "기본값" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:380 src/slic3r/GUI/Tab.cpp:1613 +#: src/libslic3r/PrintConfig.cpp:470 +msgid "Extruder" +msgstr "익스트루더(Extruder)" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:493 +msgid "Rename Object" +msgstr "개체 이름 바꾸기" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:493 +msgid "Rename Sub-object" +msgstr "하위 오브젝트 이름 바꾸기" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:934 src/slic3r/GUI/GUI_ObjectList.cpp:3346 +msgid "Instances to Separated Objects" +msgstr "분리된 객체에 대한 복제본" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:952 +msgid "Remove Volume(s)" +msgstr "볼륨 제거" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1007 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1316 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1322 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1556 +#, c-format +msgid "Quick Add Settings (%s)" +msgstr "빠른 추가 설정 (%s)" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1077 +msgid "Select showing settings" +msgstr "설정 표시를 선택 합니다" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1126 +msgid "Add Settings for Layers" +msgstr "도면층에 대한 설정 추가" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1127 +msgid "Add Settings for Sub-object" +msgstr "하위 개체에 대한 설정 추가" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1128 +msgid "Add Settings for Object" +msgstr "개체에 대한 설정 추가" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1189 +msgid "Add Settings Bundle for Layers" +msgstr "레이어에 대한 설정 번들 추가" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1190 +msgid "Add Settings Bundle for Sub-object" +msgstr "하위 오브젝트에 대한 설정 번들 추가" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1191 +msgid "Add Settings Bundle for Object" +msgstr "개체에 대한 설정 번들 추가" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1230 +msgid "Load" +msgstr "불러오기" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1235 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1260 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1263 +msgid "Box" +msgstr "박스" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1235 +msgid "Cylinder" +msgstr "원통" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1235 +msgid "Sphere" +msgstr "영역" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1235 +msgid "Slab" +msgstr "슬랩" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1287 +msgid "Edit Layers" +msgstr "레이어 편집" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1295 +msgid "Add settings" +msgstr "다음 설정" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1362 +msgid "Change type" +msgstr "타입 변경" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1369 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1510 +msgid "Set as a Separated Object" +msgstr "분리 된 객체로 설정" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1375 +msgid "Rename" +msgstr "이름 변경" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1386 +msgid "Fix through the Netfabb" +msgstr "네트워크를 통해 수정" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1396 src/slic3r/GUI/Plater.cpp:3496 +msgid "Export as STL" +msgstr "STL로 내보내기" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1403 +msgid "Change extruder" +msgstr "압출기(익스트루더) 변경" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1422 src/libslic3r/PrintConfig.cpp:309 +msgid "Default" +msgstr "기본값" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1428 +msgid "Select new extruder for the object/part" +msgstr "객체/부품에 대한 새 압출(익스트루더) 기 선택" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1440 +msgid "Scale to print volume" +msgstr "인쇄 볼륨에 따라 배율 조정" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1440 +msgid "Scale the selected object to fit the print volume" +msgstr "인쇄 볼륨에 맞게 선택한 오브젝트의 배율 조정" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1510 +msgid "Set as a Separated Objects" +msgstr "분리 된 객체로 설정" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1585 +msgid "Load Part" +msgstr "하중 부품" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1617 +msgid "Error!" +msgstr "에러!" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1662 +msgid "Add Generic Subobject" +msgstr "일반 하위 개체 추가" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1669 +msgid "Generic" +msgstr "일반" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1770 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1872 +msgid "Last instance of an object cannot be deleted." +msgstr "개체의 마지막 복제본를 삭제할 수 없습니다." + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1782 +msgid "Delete Settings" +msgstr "설정 삭제" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1806 +msgid "Delete All Instances from Object" +msgstr "개체에서 모든 복제본 삭제" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1822 +msgid "Delete Layers Range" +msgstr "레이어 범위 삭제" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1853 +msgid "From Object List You can't delete the last solid part from object." +msgstr "개체 목록에서 개체에서 마지막 솔리드 부품을 삭제할 수 없습니다." + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1857 +msgid "Delete Subobject" +msgstr "하위 개체 삭제" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1876 +msgid "Delete Instance" +msgstr "복제본 삭제" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1900 src/slic3r/GUI/Plater.cpp:2793 +msgid "" +"The selected object couldn't be split because it contains only one part." +msgstr "" +"선택한 오브젝트는 파트 하나만 포함되어 있기 때문에 분할 할 수 없습니다." + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1904 +msgid "Split to Parts" +msgstr "파트로 분할" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1950 +msgid "Add Layers" +msgstr "레이어 추가" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2075 +msgid "Group manipulation" +msgstr "그룹 조작" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2087 +msgid "Object manipulation" +msgstr "개체 조작" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2100 +msgid "Object Settings to modify" +msgstr "수정할 개체 설정" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2104 +msgid "Part Settings to modify" +msgstr "수정할 부품 설정" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2109 +msgid "Layer range Settings to modify" +msgstr "레이어 범위 설정 수정" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2115 +msgid "Part manipulation" +msgstr "파트 조작" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2121 +msgid "Instance manipulation" +msgstr "복제본 제거" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2128 +msgid "Layers Editing" +msgstr "레이어층을 편집" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2128 +msgid "Layer Editing" +msgstr "레이어 편집" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2303 +msgid "Delete Selected Item" +msgstr "선택한 항목 삭제" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2415 +msgid "Delete Selected" +msgstr "선택된 것을 삭제" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2484 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2513 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2531 +msgid "Add New Layers Range" +msgstr "새 레이어 범위 추가" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2590 +msgid "Edit Layers Range" +msgstr "레이어 범위 편집" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2867 +msgid "Selection-Remove from list" +msgstr "목록에서 선택-제거" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2875 +msgid "Selection-Add from list" +msgstr "목록에서 선택-추가" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2993 +msgid "Object or Instance" +msgstr "개체 또는 복제본" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2994 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3127 +msgid "Part" +msgstr "부품(Part)" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2994 +msgid "Layer" +msgstr "레이어" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2996 +msgid "Unsupported selection" +msgstr "지원 되지 않는 선택" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2997 +#, c-format +msgid "You started your selection with %s Item." +msgstr "%s 항목으로 선택을 시작 했습니다." + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2998 +#, c-format +msgid "In this mode you can select only other %s Items%s" +msgstr "이 모드에서는 %s의 다른 %s 항목만 선택할 수 있습니다" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3001 +msgid "of a current Object" +msgstr "현재 개체의" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3006 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3081 src/slic3r/GUI/Plater.cpp:126 +msgid "Info" +msgstr "정보" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3122 +msgid "You can't change a type of the last solid part of the object." +msgstr "객체의 마지막 솔리드 부품 유형은 변경할 수 없습니다." + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3127 +msgid "Modifier" +msgstr "편집 영역" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3127 +msgid "Support Enforcer" +msgstr "서포트 지원 영역" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3127 +msgid "Support Blocker" +msgstr "서포트 금지 영역" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3129 +msgid "Type:" +msgstr "형식:" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3129 +msgid "Select type of part" +msgstr "부품 유형 선택" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3134 +msgid "Change Part Type" +msgstr "부품 유형 변경" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3368 +msgid "Enter new name" +msgstr "새 이름 입력" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3368 +msgid "Renaming" +msgstr "이름 바꾸기" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3384 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3480 src/slic3r/GUI/Tab.cpp:3536 +#: src/slic3r/GUI/Tab.cpp:3540 +msgid "The supplied name is not valid;" +msgstr "제공된 이름이 유효하지 않습니다;" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3385 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3481 src/slic3r/GUI/Tab.cpp:3537 +msgid "the following characters are not allowed:" +msgstr "다음 문자는 허용되지 않습니다:" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3498 +msgid "Set extruder for selected items" +msgstr "선택한 항목에 대한 압출기(익스트루더) 설정" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3499 +msgid "Select extruder number for selected objects and/or parts" +msgstr "선택한 객체 및 부품에 대한 압출기(익스트루더) 번호 선택" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3512 +msgid "Select extruder number:" +msgstr "압출기(익스트루더) 번호 선택:" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3513 +msgid "This extruder will be set for selected items" +msgstr "선택한 항목에 대한 압출기(익스트루더) 설정" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:62 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:105 +msgid "World coordinates" +msgstr "전체크기와 좌표" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:63 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:106 +msgid "Local coordinates" +msgstr "로컬 좌표" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:82 +msgid "Select coordinate space, in which the transformation will be performed." +msgstr "변환이 수행될 좌표 공간을 선택 합니다." + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:125 +msgid "Object Manipulation" +msgstr "개체 조작" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:176 +msgid "Object name" +msgstr "개체 이름" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:212 +#, c-format +msgid "Toggle %c axis mirroring" +msgstr "전환 %c 축 미러링" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:245 +msgid "Set Mirror" +msgstr "미러 설정" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:285 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:290 +msgid "Reset scale" +msgstr "스케일 재설정" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:303 +msgid "Reset rotation" +msgstr "회전 재설정" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:328 +msgid "Reset Rotation" +msgstr "회전 재설정" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:340 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:355 +msgid "Drop to bed" +msgstr "잠자리에 들기" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:388 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:443 +msgid "Position" +msgstr "위치" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:389 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:444 +msgid "Rotation" +msgstr "회전" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:445 +msgid "Scale factors" +msgstr "축척 계수" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:502 +msgid "Translate" +msgstr "번역" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:554 +msgid "" +"You cann't use non-uniform scaling mode for multiple objects/parts selection" +msgstr "" +"여러 객체/부품 선택에 는 균일하지 않은 배율 조정 모드를 사용할 수 없습니다." + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:715 +msgid "Set Position" +msgstr "위치 설정" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:746 +msgid "Set Orientation" +msgstr "방향 설정" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:811 +msgid "Set Scale" +msgstr "축척 설정" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:895 +msgid "" +"The currently manipulated object is tilted (rotation angles are not " +"multiples of 90°).\n" +"Non-uniform scaling of tilted objects is only possible in the World " +"coordinate system,\n" +"once the rotation is embedded into the object coordinates." +msgstr "" +"현재 조작 된 오브젝트가 기울어져 있습니다 (회전 각도가 90 °의 배수가 아님).\n" +"기울어진 오브젝트의 비균일 배율 조정은 표준 좌표계에서만 가능 합니다.\n" +"회전이 오브젝트 좌표로 삽입되면." + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:898 +msgid "" +"This operation is irreversible.\n" +"Do you want to proceed?" +msgstr "" +"이 작업은 되돌릴수 없습니다.\n" +"계속 하 시겠습니까?" + +#: src/slic3r/GUI/GUI_ObjectSettings.cpp:58 +msgid "Additional Settings" +msgstr "추가적인 세팅" + +#: src/slic3r/GUI/GUI_ObjectSettings.cpp:94 +msgid "Remove parameter" +msgstr "매개 변수 제거" + +#: src/slic3r/GUI/GUI_ObjectSettings.cpp:100 +#, c-format +msgid "Delete Option %s" +msgstr "삭제 %s 옵션" + +#: src/slic3r/GUI/GUI_ObjectSettings.cpp:144 +#, c-format +msgid "Change Option %s" +msgstr "옵션 %s 변경" + +#: src/slic3r/GUI/GUI_Preview.cpp:216 +msgid "View" +msgstr "보기" + +#: src/slic3r/GUI/GUI_Preview.cpp:219 src/slic3r/GUI/GUI_Preview.cpp:554 +#: src/libslic3r/GCode/PreviewData.cpp:394 +msgid "Feature type" +msgstr "특색 유형" + +#: src/slic3r/GUI/GUI_Preview.cpp:220 src/libslic3r/PrintConfig.cpp:483 +msgid "Height" +msgstr "높이" + +#: src/slic3r/GUI/GUI_Preview.cpp:221 src/libslic3r/PrintConfig.cpp:2188 +msgid "Width" +msgstr "폭" + +#: src/slic3r/GUI/GUI_Preview.cpp:223 +msgid "Volumetric flow rate" +msgstr "용적의 유량값" + +#: src/slic3r/GUI/GUI_Preview.cpp:224 src/slic3r/GUI/GUI_Preview.cpp:328 +#: src/slic3r/GUI/GUI_Preview.cpp:506 src/slic3r/GUI/GUI_Preview.cpp:553 +#: src/slic3r/GUI/GUI_Preview.cpp:749 src/libslic3r/GCode/PreviewData.cpp:404 +msgid "Tool" +msgstr "도구" + +#: src/slic3r/GUI/GUI_Preview.cpp:225 src/slic3r/GUI/GUI_Preview.cpp:551 +#: src/libslic3r/GCode/PreviewData.cpp:406 +msgid "Color Print" +msgstr "컬러 프린트" + +#: src/slic3r/GUI/GUI_Preview.cpp:228 +msgid "Show" +msgstr "보다" + +#: src/slic3r/GUI/GUI_Preview.cpp:231 src/slic3r/GUI/GUI_Preview.cpp:232 +msgid "Feature types" +msgstr "특색 유형" + +#: src/slic3r/GUI/GUI_Preview.cpp:234 src/libslic3r/GCode/PreviewData.cpp:163 +msgid "Perimeter" +msgstr "가장자리" + +#: src/slic3r/GUI/GUI_Preview.cpp:235 src/libslic3r/GCode/PreviewData.cpp:164 +msgid "External perimeter" +msgstr "외부 가장자리" + +#: src/slic3r/GUI/GUI_Preview.cpp:236 src/libslic3r/GCode/PreviewData.cpp:165 +msgid "Overhang perimeter" +msgstr "오버행(Overhang) 둘레" + +#: src/slic3r/GUI/GUI_Preview.cpp:237 src/libslic3r/GCode/PreviewData.cpp:166 +msgid "Internal infill" +msgstr "내부 채움" + +#: src/slic3r/GUI/GUI_Preview.cpp:238 src/libslic3r/PrintConfig.cpp:1736 +#: src/libslic3r/PrintConfig.cpp:1746 src/libslic3r/GCode/PreviewData.cpp:167 +msgid "Solid infill" +msgstr "솔리드 인필" + +#: src/slic3r/GUI/GUI_Preview.cpp:239 src/libslic3r/PrintConfig.cpp:2068 +#: src/libslic3r/PrintConfig.cpp:2079 src/libslic3r/GCode/PreviewData.cpp:168 +msgid "Top solid infill" +msgstr "가장 윗부분 채움" + +#: src/slic3r/GUI/GUI_Preview.cpp:240 src/libslic3r/GCode/PreviewData.cpp:169 +msgid "Bridge infill" +msgstr "브릿지 채움" + +#: src/slic3r/GUI/GUI_Preview.cpp:241 src/libslic3r/PrintConfig.cpp:895 +#: src/libslic3r/GCode/PreviewData.cpp:170 +msgid "Gap fill" +msgstr "공백 채움" + +#: src/slic3r/GUI/GUI_Preview.cpp:242 src/slic3r/GUI/Tab.cpp:1061 +#: src/libslic3r/GCode/PreviewData.cpp:171 +msgid "Skirt" +msgstr "스커트" + +#: src/slic3r/GUI/GUI_Preview.cpp:244 src/libslic3r/PrintConfig.cpp:1954 +#: src/libslic3r/GCode/PreviewData.cpp:173 +msgid "Support material interface" +msgstr "서포트 재료 인터페이스" + +#: src/slic3r/GUI/GUI_Preview.cpp:245 src/slic3r/GUI/Tab.cpp:1141 +#: src/libslic3r/GCode/PreviewData.cpp:174 +msgid "Wipe tower" +msgstr "와이프 타워(Wipe tower)" + +#: src/slic3r/GUI/GUI_Preview.cpp:250 src/libslic3r/PrintConfig.cpp:2102 +msgid "Travel" +msgstr "이송" + +#: src/slic3r/GUI/GUI_Preview.cpp:251 +msgid "Retractions" +msgstr "리트랙션" + +#: src/slic3r/GUI/GUI_Preview.cpp:252 +msgid "Unretractions" +msgstr "리트랙션 취소" + +#: src/slic3r/GUI/GUI_Preview.cpp:253 +msgid "Shells" +msgstr "쉘" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:13 src/slic3r/GUI/MainFrame.cpp:672 +msgid "Keyboard Shortcuts" +msgstr "키보드 바로 가기" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:104 +msgid "Open project STL/OBJ/AMF/3MF with config, delete bed" +msgstr "구성으로 프로젝트 STL/OBJ/AMF/3MF 열기, 배드 삭제" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:105 +msgid "Import STL/OBJ/AMF/3MF without config, keep bed" +msgstr "구성 없이 STL/OBJ/AMF/3MF 가져오기, 배드 유지" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:106 +msgid "Load Config from .ini/amf/3mf/gcode" +msgstr ".Ini/amf/3mf/gcode에서 구성 로드" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:107 src/slic3r/GUI/Plater.cpp:822 +#: src/slic3r/GUI/Plater.cpp:4687 src/libslic3r/PrintConfig.cpp:3127 +msgid "Export G-code" +msgstr "G-코드 내보내기" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:108 +msgid "Save project (3MF)" +msgstr "프로젝트 저장 (3MF)" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:109 +msgid "Load Config from .ini/amf/3mf/gcode and merge" +msgstr ".Ini/amf/3mf/gcode 및 병합에서 구성 로드" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:110 +msgid "(Re)slice" +msgstr "(Re)슬라이스" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:113 +msgid "Select Plater Tab" +msgstr "선택 및 플래이트 탭" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:115 +msgid "Select Print Settings Tab" +msgstr "인쇄 설정 탭을 선택 합니다" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:116 +msgid "Select Filament Settings Tab" +msgstr "필라멘트 설정 탭 선택" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:117 +msgid "Select Printer Settings Tab" +msgstr "프린터 설정 탭을 선택 합니다" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:118 +msgid "Switch to 3D" +msgstr "3D로 전환" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:119 +msgid "Switch to Preview" +msgstr "미리 보기로 전환" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:120 src/slic3r/GUI/Preferences.cpp:10 +msgid "Preferences" +msgstr "기본 설정" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:121 +#: src/slic3r/GUI/PrintHostDialogs.cpp:136 +msgid "Print host upload queue" +msgstr "호스트 업로드 대기열 인쇄" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:122 +msgid "Camera view" +msgstr "카메라 뷰" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:123 +msgid "Add Instance of the selected object" +msgstr "선택한 개체의 복제본 추가" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:124 +msgid "Remove Instance of the selected object" +msgstr "선택한 개체의 복제본 제거" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:125 +msgid "Show keyboard shortcuts list" +msgstr "바로 가기 키 목록 표시" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:126 +msgid "Press to select multiple object or move multiple object with mouse" +msgstr "여러 개체를 선택 하거나 마우스로 여러 개체를 이동 하려면 누릅니다" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:128 +msgid "Main Shortcuts" +msgstr "주요 단축키" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:135 +msgid "Select All objects" +msgstr "모든 객체 선택" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:136 +msgid "Delete selected" +msgstr "선택 삭제" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:137 +msgid "Delete All" +msgstr "전부 지움" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:138 +msgid "Copy to clipboard" +msgstr "클립보드로 복사" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:139 +msgid "Paste from clipboard" +msgstr "클립보드에서 붙여넣기" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:140 +msgid "Gizmo move" +msgstr "객체 이동" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:141 +msgid "Gizmo scale" +msgstr "객체 배율" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:142 +msgid "Gizmo rotate" +msgstr "객체 회전" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:143 +msgid "Gizmo cut" +msgstr "기즈모 자르기" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:144 +msgid "Gizmo Place face on bed" +msgstr "기즈모를 배드위에서" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:145 +msgid "Gizmo SLA support points" +msgstr "객체 SLA 지원 포인트" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:146 +#, c-format +msgid "" +"Press to activate selection rectangle\n" +"or to snap by 5% in Gizmo scale\n" +"or to snap by 1mm in Gizmo move" +msgstr "" +"활성화된 사각형을 선택합니다.\n" +"5% in 객체 크기를 스냅에 맞춰 조절합니다.\n" +"1mm 씩 객체를 스냅에 맞추 이동합니다." + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:147 +msgid "" +"Press to scale selection to fit print volume\n" +"in Gizmo scale" +msgstr "" +"인쇄 볼륨에 맞게 선택 크기를 조정하려면 누릅니다.\n" +"기즈모 스케일" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:148 +msgid "" +"Press to activate deselection rectangle\n" +"or to scale or rotate selected objects\n" +"around their own center" +msgstr "" +"자신의 중심 주변\n" +"선택한 개체의 크기를 조정 하거나\n" +"회전 하려면 누릅니다" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:149 +msgid "Press to activate one direction scaling in Gizmo scale" +msgstr "기즈모 크기 조절을 활성화 합니다." + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:150 +msgid "Change camera type" +msgstr "카메라 유형 변경" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:151 +msgid "Zoom to Bed" +msgstr "배드 확대" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:152 +msgid "Zoom to all objects in scene, if none selected" +msgstr "장면의 모든 오브젝트로 확대/축소 (선택 하지 않은 경우)" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:153 +msgid "Zoom to selected object" +msgstr "선택한 개체로 확대/축소" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:154 +msgid "Zoom in" +msgstr "확대" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:155 +msgid "Zoom out" +msgstr "줌 아웃" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:156 +msgid "Unselect gizmo / Clear selection" +msgstr "기즈모 선택을 취소 하거나 지우기" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:158 +msgid "Toggle picking pass texture rendering on/off" +msgstr "선택 패스 텍스처 렌더링 켜기/끄기 전환" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:161 +msgid "Plater Shortcuts" +msgstr "플레이터 단축기" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:176 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:187 +msgid "Arrow Up" +msgstr "위쪽 화살표" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:176 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:178 +msgid "Upper Layer" +msgstr "상위 레이어" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:177 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:188 +msgid "Arrow Down" +msgstr "아래쪽 화살표" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:177 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:179 +msgid "Lower Layer" +msgstr "하위 레이어" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:181 +msgid "Preview Shortcuts" +msgstr "미리보기 단축기" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:187 +msgid "Move current slider thumb Up" +msgstr "현재 마우스 휠 슬라이더를 위로 이동" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:188 +msgid "Move current slider thumb Down" +msgstr "현재 마우스 휠 슬라이더를 아래로 이동" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:189 +msgid "Arrow Left" +msgstr "왼쪽 화살표" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:189 +msgid "Set upper thumb to current slider thumb" +msgstr "마우스 휠을 위로 움직여 설정" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:190 +msgid "Arrow Right" +msgstr "오른쪽 화살표" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:190 +msgid "Set lower thumb to current slider thumb" +msgstr "마우스 휠을 아래로 움직여 설정" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:191 +msgid "Add color change marker for current layer" +msgstr "현재 레이어의 색상 변경 마커 추가" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:192 +msgid "Delete color change marker for current layer" +msgstr "현재 레이어의 색상 변경 마커 삭제" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:194 +msgid "Layers Slider Shortcuts" +msgstr "레이어 슬라이더 단축키" + +#: src/slic3r/GUI/MainFrame.cpp:62 +msgid "" +" - Remember to check for updates at http://github.com/prusa3d/PrusaSlicer/" +"releases" +msgstr "" +" -http://github.com/prusa3d/slic3r/releases에서 업데이트를 확인하는 것을 잊" +"지 마십시오" + +#: src/slic3r/GUI/MainFrame.cpp:157 +msgid "based on Slic3r" +msgstr "Slic3r 기반" + +#: src/slic3r/GUI/MainFrame.cpp:187 +msgid "Plater" +msgstr "플레이터" + +#: src/slic3r/GUI/MainFrame.cpp:393 +msgid "&New Project" +msgstr "&새로운 프로젝트" + +#: src/slic3r/GUI/MainFrame.cpp:393 +msgid "Start a new project" +msgstr "새로운 프로젝트 시작" + +#: src/slic3r/GUI/MainFrame.cpp:396 +msgid "&Open Project" +msgstr "&프로젝트 열기" + +#: src/slic3r/GUI/MainFrame.cpp:396 +msgid "Open a project file" +msgstr "프로젝트 파일 열기" + +#: src/slic3r/GUI/MainFrame.cpp:401 +msgid "Recent projects" +msgstr "최근 프로젝트" + +#: src/slic3r/GUI/MainFrame.cpp:410 +msgid "The selected project is no more available" +msgstr "선택한 프로젝트를 더 이상 사용할 수 없습니다." + +#: src/slic3r/GUI/MainFrame.cpp:410 src/slic3r/GUI/MainFrame.cpp:747 +#: src/slic3r/GUI/PrintHostDialogs.cpp:231 +msgid "Error" +msgstr "에러" + +#: src/slic3r/GUI/MainFrame.cpp:434 +msgid "&Save Project" +msgstr "프로젝트 저장" + +#: src/slic3r/GUI/MainFrame.cpp:434 +msgid "Save current project file" +msgstr "현재 프로젝트 파일 저장" + +#: src/slic3r/GUI/MainFrame.cpp:438 src/slic3r/GUI/MainFrame.cpp:440 +msgid "Save Project &as" +msgstr "프로젝트 저장" + +#: src/slic3r/GUI/MainFrame.cpp:438 src/slic3r/GUI/MainFrame.cpp:440 +msgid "Save current project file as" +msgstr "현재 프로젝트 파일을 다른 이름으로 저장" + +#: src/slic3r/GUI/MainFrame.cpp:448 +msgid "Import STL/OBJ/AM&F/3MF" +msgstr "가져오기 STL/OBJ/AM&F/3MF" + +#: src/slic3r/GUI/MainFrame.cpp:448 +msgid "Load a model" +msgstr "모델 로드" + +#: src/slic3r/GUI/MainFrame.cpp:452 +msgid "Import &Config" +msgstr "&구성 가져오기" + +#: src/slic3r/GUI/MainFrame.cpp:452 +msgid "Load exported configuration file" +msgstr "내 보낸 구성 파일로드" + +#: src/slic3r/GUI/MainFrame.cpp:454 +msgid "Import Config from &project" +msgstr "프로젝트에서 설정 가져오기" + +#: src/slic3r/GUI/MainFrame.cpp:454 +msgid "Load configuration from project file" +msgstr "프로젝트 파일에서 구성 로드" + +#: src/slic3r/GUI/MainFrame.cpp:457 +msgid "Import Config &Bundle" +msgstr "번들 &설정 가져오기" + +#: src/slic3r/GUI/MainFrame.cpp:457 +msgid "Load presets from a bundle" +msgstr "번들에서 미리 설정로드" + +#: src/slic3r/GUI/MainFrame.cpp:459 +msgid "&Import" +msgstr "&가져오기" + +#: src/slic3r/GUI/MainFrame.cpp:462 src/slic3r/GUI/MainFrame.cpp:708 +msgid "Export &G-code" +msgstr "G-코드 내보내기" + +#: src/slic3r/GUI/MainFrame.cpp:462 +msgid "Export current plate as G-code" +msgstr "현재 플레이터를 G 코드로 내보내기" + +#: src/slic3r/GUI/MainFrame.cpp:466 src/slic3r/GUI/MainFrame.cpp:709 +msgid "S&end G-code" +msgstr "S&엔드 G- 코드" + +#: src/slic3r/GUI/MainFrame.cpp:466 +msgid "Send to print current plate as G-code" +msgstr "현재 플레이트를 G 코드로 인쇄하기 위해 보내기" + +#: src/slic3r/GUI/MainFrame.cpp:471 +msgid "Export plate as &STL" +msgstr "STL로 내보내기" + +#: src/slic3r/GUI/MainFrame.cpp:471 +msgid "Export current plate as STL" +msgstr "현재 플레이터를 STL로 내보내기" + +#: src/slic3r/GUI/MainFrame.cpp:474 +msgid "Export plate as STL including supports" +msgstr "서포트를 포함하여 STL파일로 내보내기" + +#: src/slic3r/GUI/MainFrame.cpp:474 +msgid "Export current plate as STL including supports" +msgstr "서포트를 포함 하여 현재 플레이터를 STL로 내보내기" + +#: src/slic3r/GUI/MainFrame.cpp:477 +msgid "Export plate as &AMF" +msgstr "AMF로 내보내기" + +#: src/slic3r/GUI/MainFrame.cpp:477 +msgid "Export current plate as AMF" +msgstr "현재 플레이터를AMF로 내보내기" + +#: src/slic3r/GUI/MainFrame.cpp:481 +msgid "Export &Config" +msgstr "&구성 내보내기" + +#: src/slic3r/GUI/MainFrame.cpp:481 +msgid "Export current configuration to file" +msgstr "현재 구성을 파일로 내보내기" + +#: src/slic3r/GUI/MainFrame.cpp:483 +msgid "Export Config &Bundle" +msgstr "번들 & 내보내기 설정" + +#: src/slic3r/GUI/MainFrame.cpp:483 +msgid "Export all presets to file" +msgstr "모든 이전 설정을 파일로 내보내기" + +#: src/slic3r/GUI/MainFrame.cpp:485 +msgid "&Export" +msgstr "&내보내기" + +#: src/slic3r/GUI/MainFrame.cpp:491 +msgid "Quick Slice" +msgstr "빠른 슬라이스" + +#: src/slic3r/GUI/MainFrame.cpp:491 +msgid "Slice a file into a G-code" +msgstr "파일을 G 코드로 분할" + +#: src/slic3r/GUI/MainFrame.cpp:497 +msgid "Quick Slice and Save As" +msgstr "빠른 슬라이스 및 다른 이름으로 저장" + +#: src/slic3r/GUI/MainFrame.cpp:497 +msgid "Slice a file into a G-code, save as" +msgstr "파일을 G 코드로 분할하고 다음으로 저장" + +#: src/slic3r/GUI/MainFrame.cpp:503 +msgid "Repeat Last Quick Slice" +msgstr "마지막으로 빠른 슬라이스 반복" + +#: src/slic3r/GUI/MainFrame.cpp:503 +msgid "Repeat last quick slice" +msgstr "마지막으로 빠른 슬라이스 반복" + +#: src/slic3r/GUI/MainFrame.cpp:511 +msgid "(Re)Slice No&w" +msgstr "지금(다시)자르기" + +#: src/slic3r/GUI/MainFrame.cpp:511 +msgid "Start new slicing process" +msgstr "새로운 슬라이싱 작업 시작" + +#: src/slic3r/GUI/MainFrame.cpp:515 +msgid "&Repair STL file" +msgstr "STL 파일 복구" + +#: src/slic3r/GUI/MainFrame.cpp:515 +msgid "Automatically repair an STL file" +msgstr "STL 파일을 자동으로 복구합니다" + +#: src/slic3r/GUI/MainFrame.cpp:518 +msgid "&Quit" +msgstr "&종료" + +#: src/slic3r/GUI/MainFrame.cpp:518 +#, c-format +msgid "Quit %s" +msgstr "%s 종료" + +#: src/slic3r/GUI/MainFrame.cpp:543 +msgid "&Select all" +msgstr "&모두 선택 " + +#: src/slic3r/GUI/MainFrame.cpp:544 +msgid "Selects all objects" +msgstr "모든 개체를 선택 합니다" + +#: src/slic3r/GUI/MainFrame.cpp:546 +msgid "D&eselect all" +msgstr "선택 취소 D&eselect" + +#: src/slic3r/GUI/MainFrame.cpp:547 +msgid "Deselects all objects" +msgstr "모든 객체 선택 취소" + +#: src/slic3r/GUI/MainFrame.cpp:550 +msgid "&Delete selected" +msgstr "&선택 삭제 " + +#: src/slic3r/GUI/MainFrame.cpp:551 +msgid "Deletes the current selection" +msgstr "현재 선택 영역을 삭제 합니다" + +#: src/slic3r/GUI/MainFrame.cpp:553 +msgid "Delete &all" +msgstr "전부 지움 " + +#: src/slic3r/GUI/MainFrame.cpp:554 +msgid "Deletes all objects" +msgstr "모든 객체를 삭제 합니다" + +#: src/slic3r/GUI/MainFrame.cpp:558 +msgid "&Undo" +msgstr "&되돌리기" + +#: src/slic3r/GUI/MainFrame.cpp:561 +msgid "&Redo" +msgstr "&앞으로" + +#: src/slic3r/GUI/MainFrame.cpp:566 +msgid "&Copy" +msgstr "&복사 " + +#: src/slic3r/GUI/MainFrame.cpp:567 +msgid "Copy selection to clipboard" +msgstr "선택영역을 클립보드로 복사합니다" + +#: src/slic3r/GUI/MainFrame.cpp:569 +msgid "&Paste" +msgstr "&붙이기 " + +#: src/slic3r/GUI/MainFrame.cpp:570 +msgid "Paste clipboard" +msgstr "클립보드 붙여넣기" + +#: src/slic3r/GUI/MainFrame.cpp:579 +msgid "&Plater Tab" +msgstr "&선택 및 플래이터 탭" + +#: src/slic3r/GUI/MainFrame.cpp:579 +msgid "Show the plater" +msgstr "플레이터를 보기" + +#: src/slic3r/GUI/MainFrame.cpp:586 +msgid "P&rint Settings Tab" +msgstr "프린트 설정 탭" + +#: src/slic3r/GUI/MainFrame.cpp:586 +msgid "Show the print settings" +msgstr "인쇄 설정 표시" + +#: src/slic3r/GUI/MainFrame.cpp:588 src/slic3r/GUI/MainFrame.cpp:711 +msgid "&Filament Settings Tab" +msgstr "&필라멘트 설정 탭" + +#: src/slic3r/GUI/MainFrame.cpp:588 +msgid "Show the filament settings" +msgstr "필라멘트 설정보기" + +#: src/slic3r/GUI/MainFrame.cpp:591 +msgid "Print&er Settings Tab" +msgstr "설정 인쇄 탭" + +#: src/slic3r/GUI/MainFrame.cpp:591 +msgid "Show the printer settings" +msgstr "간단한 설정보기" + +#: src/slic3r/GUI/MainFrame.cpp:595 +msgid "3&D" +msgstr "3&D" + +#: src/slic3r/GUI/MainFrame.cpp:595 +msgid "Show the 3D editing view" +msgstr "3D 편집용 보기 표시" + +#: src/slic3r/GUI/MainFrame.cpp:598 +msgid "Pre&view" +msgstr "미리 보기" + +#: src/slic3r/GUI/MainFrame.cpp:598 +msgid "Show the 3D slices preview" +msgstr "3D 슬라이스 미리 보기 표시" + +#: src/slic3r/GUI/MainFrame.cpp:617 +msgid "Print &Host Upload Queue" +msgstr "호스트 업로드 대기열 인쇄" + +#: src/slic3r/GUI/MainFrame.cpp:617 +msgid "Display the Print Host Upload Queue window" +msgstr "호스트 업로드 대기열 인쇄 창 표시" + +#: src/slic3r/GUI/MainFrame.cpp:626 +msgid "Iso" +msgstr "기본 " + +#: src/slic3r/GUI/MainFrame.cpp:626 +msgid "Iso View" +msgstr "표준 보기" + +#. TRN To be shown in the main menu View->Top +#. TRN To be shown in Print Settings "Top solid layers" +#: src/slic3r/GUI/MainFrame.cpp:630 src/libslic3r/PrintConfig.cpp:2094 +msgid "Top" +msgstr "윗부분 " + +#: src/slic3r/GUI/MainFrame.cpp:630 +msgid "Top View" +msgstr "위에서 보기" + +#. TRN To be shown in the main menu View->Bottom +#. TRN To be shown in Print Settings "Bottom solid layers" +#: src/slic3r/GUI/MainFrame.cpp:633 src/libslic3r/PrintConfig.cpp:159 +msgid "Bottom" +msgstr "바닥 " + +#: src/slic3r/GUI/MainFrame.cpp:633 +msgid "Bottom View" +msgstr "바닥 보기" + +#: src/slic3r/GUI/MainFrame.cpp:635 +msgid "Front" +msgstr "앞 " + +#: src/slic3r/GUI/MainFrame.cpp:635 +msgid "Front View" +msgstr "앞면 보기 " + +#: src/slic3r/GUI/MainFrame.cpp:637 src/libslic3r/PrintConfig.cpp:1611 +msgid "Rear" +msgstr "뒷면 " + +#: src/slic3r/GUI/MainFrame.cpp:637 +msgid "Rear View" +msgstr "뒷면 보기" + +#: src/slic3r/GUI/MainFrame.cpp:639 +msgid "Left" +msgstr "왼쪽 " + +#: src/slic3r/GUI/MainFrame.cpp:639 +msgid "Left View" +msgstr "왼쪽 보기" + +#: src/slic3r/GUI/MainFrame.cpp:641 +msgid "Right" +msgstr "오른쪽 " + +#: src/slic3r/GUI/MainFrame.cpp:641 +msgid "Right View" +msgstr "오른쪽 보기" + +#: src/slic3r/GUI/MainFrame.cpp:648 +msgid "Prusa 3D &Drivers" +msgstr "푸르사 3D 드라이버" + +#: src/slic3r/GUI/MainFrame.cpp:648 +msgid "Open the Prusa3D drivers download page in your browser" +msgstr "브라우저에서 Prusa3D 드라이버 다운로드 페이지를 엽니다" + +#: src/slic3r/GUI/MainFrame.cpp:650 +msgid "Software &Releases" +msgstr "소프트웨어 &자료" + +#: src/slic3r/GUI/MainFrame.cpp:650 +msgid "Open the software releases page in your browser" +msgstr "브라우저에서 소프트웨어 정보 페이지 열기" + +#: src/slic3r/GUI/MainFrame.cpp:656 +#, c-format +msgid "%s &Website" +msgstr "%s &웹사이트" + +#: src/slic3r/GUI/MainFrame.cpp:657 +#, c-format +msgid "Open the %s website in your browser" +msgstr "%s 웹사이트를 브라우저에서 열기" + +#: src/slic3r/GUI/MainFrame.cpp:663 +msgid "System &Info" +msgstr "시스템 정보" + +#: src/slic3r/GUI/MainFrame.cpp:663 +msgid "Show system information" +msgstr "시스템 정보 표시" + +#: src/slic3r/GUI/MainFrame.cpp:665 +msgid "Show &Configuration Folder" +msgstr "폴더 표시 및 구성" + +#: src/slic3r/GUI/MainFrame.cpp:665 +msgid "Show user configuration folder (datadir)" +msgstr "사용자 구성 폴더 표시 (datadir)" + +#: src/slic3r/GUI/MainFrame.cpp:667 +msgid "Report an I&ssue" +msgstr "문제를 보고" + +#: src/slic3r/GUI/MainFrame.cpp:667 +#, c-format +msgid "Report an issue on %s" +msgstr "%s에 문제 보고" + +#: src/slic3r/GUI/MainFrame.cpp:669 +#, c-format +msgid "&About %s" +msgstr "%s 에 대하여" + +#: src/slic3r/GUI/MainFrame.cpp:669 +msgid "Show about dialog" +msgstr "다이얼로그 표시" + +#: src/slic3r/GUI/MainFrame.cpp:672 +msgid "Show the list of the keyboard shortcuts" +msgstr "키보드 단축키 목록 표시" + +#: src/slic3r/GUI/MainFrame.cpp:680 +msgid "&File" +msgstr "&파일" + +#: src/slic3r/GUI/MainFrame.cpp:681 +msgid "&Edit" +msgstr "&수정" + +#: src/slic3r/GUI/MainFrame.cpp:682 +msgid "&Window" +msgstr "&윈도우" + +#: src/slic3r/GUI/MainFrame.cpp:683 +msgid "&View" +msgstr "&시점" + +#: src/slic3r/GUI/MainFrame.cpp:686 +msgid "&Help" +msgstr "&도움말" + +#: src/slic3r/GUI/MainFrame.cpp:708 +msgid "E&xport" +msgstr "보내기" + +#: src/slic3r/GUI/MainFrame.cpp:709 +msgid "S&end to print" +msgstr "끝내고 프린트" + +#: src/slic3r/GUI/MainFrame.cpp:711 +msgid "Mate&rial Settings Tab" +msgstr "재료(메터리리알) 설정 탭" + +#: src/slic3r/GUI/MainFrame.cpp:732 +msgid "Choose a file to slice (STL/OBJ/AMF/3MF/PRUSA):" +msgstr "슬라이스 할 파일을 선택하십시오 (STL / OBJ / AMF / 3MF / PRUSA):" + +#: src/slic3r/GUI/MainFrame.cpp:746 +msgid "No previously sliced file." +msgstr "이전에 분리 된 파일이 없습니다." + +#: src/slic3r/GUI/MainFrame.cpp:752 +msgid "Previously sliced file (" +msgstr "이전에 분리 된 파일 (" + +#: src/slic3r/GUI/MainFrame.cpp:752 +msgid ") not found." +msgstr ")을 찾을 수 없습니다." + +#: src/slic3r/GUI/MainFrame.cpp:753 +msgid "File Not Found" +msgstr "파일을 찾을수 없다" + +#: src/slic3r/GUI/MainFrame.cpp:788 +#, c-format +msgid "Save %s file as:" +msgstr "%s 파일을 다음과 같이 저장 합니다" + +#: src/slic3r/GUI/MainFrame.cpp:788 +msgid "SVG" +msgstr "Svg" + +#: src/slic3r/GUI/MainFrame.cpp:788 +msgid "G-code" +msgstr "G 코드" + +#: src/slic3r/GUI/MainFrame.cpp:803 +msgid "Save zip file as:" +msgstr "압축(zip)파일 다른이름 저장:" + +#: src/slic3r/GUI/MainFrame.cpp:815 src/slic3r/GUI/Plater.cpp:2933 +#: src/slic3r/GUI/Plater.cpp:4418 src/slic3r/GUI/Tab.cpp:1170 +#: src/slic3r/GUI/Tab.cpp:3700 +msgid "Slicing" +msgstr "슬라이싱" + +#. TRN "Processing input_file_basename" +#: src/slic3r/GUI/MainFrame.cpp:817 +#, c-format +msgid "Processing %s" +msgstr "처리 %s" + +#: src/slic3r/GUI/MainFrame.cpp:840 +msgid " was successfully sliced." +msgstr " 성공적으로 슬라이스." + +#: src/slic3r/GUI/MainFrame.cpp:842 +msgid "Slicing Done!" +msgstr "슬라이스 완료!" + +#: src/slic3r/GUI/MainFrame.cpp:857 +msgid "Select the STL file to repair:" +msgstr "복구 할 STL 파일을 선택하십시오:" + +#: src/slic3r/GUI/MainFrame.cpp:870 +msgid "Save OBJ file (less prone to coordinate errors than STL) as:" +msgstr "OBJ 파일을 저장하십시오 (STL보다 오류를 덜 조정할 가능성이 적음):" + +#: src/slic3r/GUI/MainFrame.cpp:885 +msgid "Your file was repaired." +msgstr "파일이 복구되었습니다." + +#: src/slic3r/GUI/MainFrame.cpp:885 src/libslic3r/PrintConfig.cpp:3221 +msgid "Repair" +msgstr "수정" + +#: src/slic3r/GUI/MainFrame.cpp:899 +msgid "Save configuration as:" +msgstr "구성을 저장 :" + +#: src/slic3r/GUI/MainFrame.cpp:919 src/slic3r/GUI/MainFrame.cpp:983 +msgid "Select configuration to load:" +msgstr "로드 할 구성 선택 :" + +#: src/slic3r/GUI/MainFrame.cpp:956 +msgid "Save presets bundle as:" +msgstr "이전 설정 번들을 다음과 같이 저장 :" + +#: src/slic3r/GUI/MainFrame.cpp:1007 +#, c-format +msgid "%d presets successfully imported." +msgstr "% d 사전 설정을 가져 왔습니다." + +#: src/slic3r/GUI/MsgDialog.cpp:73 +#, c-format +msgid "%s error" +msgstr "%s 오류" + +#: src/slic3r/GUI/MsgDialog.cpp:74 +#, c-format +msgid "%s has encountered an error" +msgstr "%s에 오류가 발생 했습니다" + +#: src/slic3r/GUI/Plater.cpp:146 +msgid "Volume" +msgstr "크기" + +#: src/slic3r/GUI/Plater.cpp:147 +msgid "Facets" +msgstr "측면" + +#: src/slic3r/GUI/Plater.cpp:148 +msgid "Materials" +msgstr "재료" + +#: src/slic3r/GUI/Plater.cpp:151 +msgid "Manifold" +msgstr "많은" + +#: src/slic3r/GUI/Plater.cpp:201 +msgid "Sliced Info" +msgstr "슬라이스된 정보" + +#: src/slic3r/GUI/Plater.cpp:220 src/slic3r/GUI/Plater.cpp:1135 +msgid "Used Filament (m)" +msgstr "사용자 필라멘트 (m)" + +#: src/slic3r/GUI/Plater.cpp:221 +msgid "Used Filament (mm³)" +msgstr "사용자 필라멘트 (mm³)" + +#: src/slic3r/GUI/Plater.cpp:222 +msgid "Used Filament (g)" +msgstr "사용자 필라멘트 (g)" + +#: src/slic3r/GUI/Plater.cpp:223 +msgid "Used Material (unit)" +msgstr "사용 재료 (단위)" + +#: src/slic3r/GUI/Plater.cpp:224 src/slic3r/GUI/Plater.cpp:1150 +#: src/libslic3r/PrintConfig.cpp:742 +msgid "Cost" +msgstr "비용" + +#: src/slic3r/GUI/Plater.cpp:225 src/slic3r/GUI/Plater.cpp:1122 +#: src/slic3r/GUI/Plater.cpp:1164 +msgid "Estimated printing time" +msgstr "예상 인쇄 시간" + +#: src/slic3r/GUI/Plater.cpp:226 +msgid "Number of tool changes" +msgstr "공구(tool) 변경 수" + +#: src/slic3r/GUI/Plater.cpp:317 +msgid "Click to edit preset" +msgstr "사전 설정을 편집 하려면 클릭 하십시오" + +#: src/slic3r/GUI/Plater.cpp:469 +msgid "Select what kind of support do you need" +msgstr "서포트의 종류를 선택하세요" + +#: src/slic3r/GUI/Plater.cpp:471 src/libslic3r/PrintConfig.cpp:1865 +#: src/libslic3r/PrintConfig.cpp:2529 +msgid "Support on build plate only" +msgstr "출력물만 서포트를 지지" + +#: src/slic3r/GUI/Plater.cpp:472 src/slic3r/GUI/Plater.cpp:587 +msgid "For support enforcers only" +msgstr "서포트 지원영역 전용" + +#: src/slic3r/GUI/Plater.cpp:473 +msgid "Everywhere" +msgstr "모든곳" + +#: src/slic3r/GUI/Plater.cpp:505 src/slic3r/GUI/Tab.cpp:1067 +msgid "Brim" +msgstr "브림" + +#: src/slic3r/GUI/Plater.cpp:507 +msgid "" +"This flag enables the brim that will be printed around each object on the " +"first layer." +msgstr "" +"이 플래그는 첫 번째 레이어의 각 개체 주위에 인쇄 될 브림을 활성화합니다." + +#: src/slic3r/GUI/Plater.cpp:515 +msgid "Purging volumes" +msgstr "볼륨 삭제" + +#: src/slic3r/GUI/Plater.cpp:766 +msgid "Print settings" +msgstr "프린트 설정" + +#: src/slic3r/GUI/Plater.cpp:767 src/slic3r/GUI/Tab.cpp:1604 +#: src/slic3r/GUI/Tab.cpp:1605 +msgid "Filament" +msgstr "필라멘트" + +#: src/slic3r/GUI/Plater.cpp:768 +msgid "SLA print settings" +msgstr "SLA 인쇄 설정" + +#: src/slic3r/GUI/Plater.cpp:769 src/slic3r/GUI/Preset.cpp:1310 +msgid "SLA material" +msgstr "SLA 재료" + +#: src/slic3r/GUI/Plater.cpp:770 +msgid "Printer" +msgstr "프린터" + +#: src/slic3r/GUI/Plater.cpp:820 src/slic3r/GUI/Plater.cpp:4688 +msgid "Send to printer" +msgstr "프린터로 보내기" + +#: src/slic3r/GUI/Plater.cpp:823 src/slic3r/GUI/Plater.cpp:2933 +#: src/slic3r/GUI/Plater.cpp:4421 +msgid "Slice now" +msgstr "지금 자르기" + +#: src/slic3r/GUI/Plater.cpp:963 +msgid "Hold Shift to Slice & Export G-code" +msgstr "Shift 키를 누른 채 G 코드 내보내기" + +#: src/slic3r/GUI/Plater.cpp:1068 +#, c-format +msgid "%d (%d shells)" +msgstr "% d (% d 쉘)" + +#: src/slic3r/GUI/Plater.cpp:1073 +#, c-format +msgid "Auto-repaired (%d errors)" +msgstr "오류자동수정 (%d errors)" + +#: src/slic3r/GUI/Plater.cpp:1076 +#, c-format +msgid "" +"%d degenerate facets, %d edges fixed, %d facets removed, %d facets added, %d " +"facets reversed, %d backwards edges" +msgstr "" +"%d 면 고정, %d 모서리 고정, %d 면 제거, %d 면 추가, %d 면 반전, %d 후방 모서" +"리" + +#: src/slic3r/GUI/Plater.cpp:1086 +msgid "Yes" +msgstr "예" + +#: src/slic3r/GUI/Plater.cpp:1109 +msgid "Used Material (ml)" +msgstr "사용 재료 (ml)" + +#: src/slic3r/GUI/Plater.cpp:1112 +msgid "object(s)" +msgstr "개체(들)" + +#: src/slic3r/GUI/Plater.cpp:1112 +msgid "supports and pad" +msgstr "지지대 및 패드" + +#: src/slic3r/GUI/Plater.cpp:1137 src/slic3r/GUI/Plater.cpp:1152 +msgid "objects" +msgstr "개체" + +#: src/slic3r/GUI/Plater.cpp:1137 src/slic3r/GUI/Plater.cpp:1152 +msgid "wipe tower" +msgstr "와이프 타워(Wipe tower)" + +#: src/slic3r/GUI/Plater.cpp:1167 +msgid "normal mode" +msgstr "일반 모드" + +#: src/slic3r/GUI/Plater.cpp:1171 src/slic3r/GUI/Plater.cpp:1180 +msgid "Color " +msgstr "색" + +#: src/slic3r/GUI/Plater.cpp:1176 +msgid "stealth mode" +msgstr "스텔스 모드" + +#: src/slic3r/GUI/Plater.cpp:1271 +msgid "Load File" +msgstr "파일 로드" + +#: src/slic3r/GUI/Plater.cpp:1275 +msgid "Load Files" +msgstr "파일 로드" + +#: src/slic3r/GUI/Plater.cpp:1503 +msgid "ERROR: not enough resources to execute a new job." +msgstr "오류: 새 작업을 실행하기에 충분한 리소스가 아닙니다." + +#: src/slic3r/GUI/Plater.cpp:2056 +msgid "New Project" +msgstr "새로운 프로젝트" + +#: src/slic3r/GUI/Plater.cpp:2173 +msgid "Loading" +msgstr "로딩" + +#: src/slic3r/GUI/Plater.cpp:2183 +#, c-format +msgid "Processing input file %s\n" +msgstr "입력 파일 처리 %s\n" + +#: src/slic3r/GUI/Plater.cpp:2211 +msgid "" +"You can't to load SLA project if there is at least one multi-part object on " +"the bed" +msgstr "" +"침대에 다중 부품 개체가 하나 이상 있는 경우 SLA 프로젝트를 로드할 수 없습니" +"다." + +#: src/slic3r/GUI/Plater.cpp:2212 src/slic3r/GUI/Tab.cpp:3064 +msgid "Please check your object list before preset changing." +msgstr "사전 설정을 변경 하기 전에 개체 목록을 확인 하십시오." + +#: src/slic3r/GUI/Plater.cpp:2255 +msgid "" +"This file contains several objects positioned at multiple heights. Instead " +"of considering them as multiple objects, should I consider\n" +"this file as a single object having multiple parts?\n" +msgstr "" +"이 파일에는 여러 높이에 위치한 여러 객체가 들어 있습니다. 여러 객체로 간주하" +"는 대신,\n" +"이 파일은 여러 부분을 갖는 단일 객체로 보입니까?\n" + +#: src/slic3r/GUI/Plater.cpp:2258 src/slic3r/GUI/Plater.cpp:2310 +msgid "Multi-part object detected" +msgstr "다중 부품 객체가 감지" + +#: src/slic3r/GUI/Plater.cpp:2265 +msgid "" +"This file cannot be loaded in a simple mode. Do you want to switch to an " +"advanced mode?\n" +msgstr "" +"이 파일은 단순 모드에서 로드할 수 없습니다. 고급 모드로 전환 하시겠습니까?\n" + +#: src/slic3r/GUI/Plater.cpp:2266 +msgid "Detected advanced data" +msgstr "감지된 고급 데이터" + +#: src/slic3r/GUI/Plater.cpp:2287 +#, c-format +msgid "" +"You can't to add the object(s) from %s because of one or some of them " +"is(are) multi-part" +msgstr "멀티파트 하나 또는 그 중 일부 때문에 %s에서 개체를 추가 할 수 없습니다" + +#: src/slic3r/GUI/Plater.cpp:2307 +msgid "" +"Multiple objects were loaded for a multi-material printer.\n" +"Instead of considering them as multiple objects, should I consider\n" +"these files to represent a single object having multiple parts?\n" +msgstr "" +"다중 재료 프린터에 대해 여러 객체가로드되었습니다.\n" +"여러 객체로 간주하는 대신,\n" +"이 파일들은 여러 부분을 갖는 단일 객체를 나타낼 수 있습니까?\n" + +#: src/slic3r/GUI/Plater.cpp:2323 +msgid "Loaded" +msgstr "로드(loaded)" + +#: src/slic3r/GUI/Plater.cpp:2418 +msgid "" +"Your object appears to be too large, so it was automatically scaled down to " +"fit your print bed." +msgstr "개체가 너무 커서 인쇄물에 맞게 자동으로 축소되었습니다." + +#: src/slic3r/GUI/Plater.cpp:2419 +msgid "Object too large?" +msgstr "개체가 너무 큽니까?" + +#: src/slic3r/GUI/Plater.cpp:2476 +msgid "Export STL file:" +msgstr "STL 파일 내보내기:" + +#: src/slic3r/GUI/Plater.cpp:2483 +msgid "Export AMF file:" +msgstr "AMF 파일 내보내기:" + +#: src/slic3r/GUI/Plater.cpp:2489 +msgid "Save file as:" +msgstr "다른 이름으로 파일 저장:" + +#: src/slic3r/GUI/Plater.cpp:2592 +msgid "Delete Object" +msgstr "오브젝트 지우기" + +#: src/slic3r/GUI/Plater.cpp:2603 +msgid "Reset Project" +msgstr "프로젝트 재설정" + +#: src/slic3r/GUI/Plater.cpp:2630 src/slic3r/GUI/Plater.cpp:3517 +msgid "Mirror" +msgstr "반전(Mirror)" + +#: src/slic3r/GUI/Plater.cpp:2643 +msgid "Optimize Rotation" +msgstr "회전 최적화" + +#: src/slic3r/GUI/Plater.cpp:2689 +msgid "Arranging" +msgstr "정렬" + +#: src/slic3r/GUI/Plater.cpp:2712 +msgid "Could not arrange model objects! Some geometries may be invalid." +msgstr "" +"모델 개체를 정렬할 수 없습니다. 일부 형상은 유효 하지 않을 수 있습니다." + +#: src/slic3r/GUI/Plater.cpp:2718 +msgid "Arranging canceled." +msgstr "취소 된 정렬" + +#: src/slic3r/GUI/Plater.cpp:2719 +msgid "Arranging done." +msgstr "정렬 완료." + +#: src/slic3r/GUI/Plater.cpp:2735 +msgid "Searching for optimal orientation" +msgstr "최적의 방향 검색" + +#: src/slic3r/GUI/Plater.cpp:2768 +msgid "Orientation search canceled." +msgstr "오리엔테이션 검색이 취소 됨" + +#: src/slic3r/GUI/Plater.cpp:2769 +msgid "Orientation found." +msgstr "방향을 찾았습니다." + +#: src/slic3r/GUI/Plater.cpp:2785 +msgid "" +"The selected object can't be split because it contains more than one volume/" +"material." +msgstr "" +"선택한 객체는 둘 이상의 볼륨 / 재료가 포함되어 있기 때문에 분할 할 수 없습니" +"다." + +#: src/slic3r/GUI/Plater.cpp:2796 +msgid "Split to Objects" +msgstr "객체로 분할" + +#: src/slic3r/GUI/Plater.cpp:2918 +msgid "Invalid data" +msgstr "잘못 된 데이터" + +#: src/slic3r/GUI/Plater.cpp:2927 +msgid "Ready to slice" +msgstr "슬라이스 준비" + +#: src/slic3r/GUI/Plater.cpp:2965 src/slic3r/GUI/PrintHostDialogs.cpp:232 +msgid "Cancelling" +msgstr "취소 중" + +#: src/slic3r/GUI/Plater.cpp:2982 +msgid "Another export job is currently running." +msgstr "다른 내보내기 작업이 현재 실행 중입니다." + +#: src/slic3r/GUI/Plater.cpp:3036 src/slic3r/GUI/Plater.cpp:3493 +msgid "Reload from Disk" +msgstr "디스크에서 다시 불러오기" + +#: src/slic3r/GUI/Plater.cpp:3072 +msgid "Fix Throught NetFabb" +msgstr "NetFabb으로 수정" + +#: src/slic3r/GUI/Plater.cpp:3254 +msgid "Export failed" +msgstr "내보내기 실패" + +#: src/slic3r/GUI/Plater.cpp:3259 src/slic3r/GUI/PrintHostDialogs.cpp:233 +msgid "Cancelled" +msgstr "취소됨" + +#: src/slic3r/GUI/Plater.cpp:3347 src/slic3r/GUI/Plater.cpp:3359 +#: src/slic3r/GUI/Plater.cpp:3473 +msgid "Increase copies" +msgstr "복사본 늘리기" + +#: src/slic3r/GUI/Plater.cpp:3467 src/slic3r/GUI/Plater.cpp:3486 +msgid "Remove the selected object" +msgstr "선택한 객체 제거" + +#: src/slic3r/GUI/Plater.cpp:3473 +msgid "Place one more copy of the selected object" +msgstr "선택한 객체를 하나 더 복사합니다" + +#: src/slic3r/GUI/Plater.cpp:3475 +msgid "Decrease copies" +msgstr "복사본 감소" + +#: src/slic3r/GUI/Plater.cpp:3475 +msgid "Remove one copy of the selected object" +msgstr "선택한 객체 복사본 하나 삭제" + +#: src/slic3r/GUI/Plater.cpp:3477 +msgid "Set number of copies" +msgstr "복사될 수량 설정" + +#: src/slic3r/GUI/Plater.cpp:3477 +msgid "Change the number of copies of the selected object" +msgstr "선택한 개체의 복사본 수 변경" + +#: src/slic3r/GUI/Plater.cpp:3493 +msgid "Reload the selected file from Disk" +msgstr "디스크에서 다시 불러오기" + +#: src/slic3r/GUI/Plater.cpp:3496 +msgid "Export the selected object as STL file" +msgstr "선택한 객체를 STL 파일로 내보내기" + +#: src/slic3r/GUI/Plater.cpp:3510 +msgid "Along X axis" +msgstr "X 축을 따라" + +#: src/slic3r/GUI/Plater.cpp:3510 +msgid "Mirror the selected object along the X axis" +msgstr "선택한 객체를 X 축을 따라 반전합니다" + +#: src/slic3r/GUI/Plater.cpp:3512 +msgid "Along Y axis" +msgstr "Y 축을 따라" + +#: src/slic3r/GUI/Plater.cpp:3512 +msgid "Mirror the selected object along the Y axis" +msgstr "선택한 객체를 Y 축을 따라 반전합니다" + +#: src/slic3r/GUI/Plater.cpp:3514 +msgid "Along Z axis" +msgstr "Z 축 따라" + +#: src/slic3r/GUI/Plater.cpp:3514 +msgid "Mirror the selected object along the Z axis" +msgstr "선택한 객체를 Z 축을 따라 반전합니다" + +#: src/slic3r/GUI/Plater.cpp:3517 +msgid "Mirror the selected object" +msgstr "반전할 객제를 선택" + +#: src/slic3r/GUI/Plater.cpp:3529 +msgid "To objects" +msgstr "개체에" + +#: src/slic3r/GUI/Plater.cpp:3529 src/slic3r/GUI/Plater.cpp:3549 +msgid "Split the selected object into individual objects" +msgstr "선택한 개체를 개별 개체로 분할 합니다." + +#: src/slic3r/GUI/Plater.cpp:3531 +msgid "To parts" +msgstr "부품에" + +#: src/slic3r/GUI/Plater.cpp:3531 src/slic3r/GUI/Plater.cpp:3563 +msgid "Split the selected object into individual sub-parts" +msgstr "선택한 오브젝트를 개별 하위 파트로 분할" + +#: src/slic3r/GUI/Plater.cpp:3534 src/slic3r/GUI/Plater.cpp:3549 +#: src/slic3r/GUI/Plater.cpp:3563 src/libslic3r/PrintConfig.cpp:3245 +msgid "Split" +msgstr "쪼개기" + +#: src/slic3r/GUI/Plater.cpp:3534 +msgid "Split the selected object" +msgstr "선택한 개체 분할" + +#: src/slic3r/GUI/Plater.cpp:3555 +msgid "Optimize orientation" +msgstr "방향 최적화" + +#: src/slic3r/GUI/Plater.cpp:3555 +msgid "Optimize the rotation of the object for better print results." +msgstr "더 나은 인쇄 결과를 위해 개체의 회전을 최적화합니다." + +#: src/slic3r/GUI/Plater.cpp:3595 +msgid "3D editor view" +msgstr "3D 편집화면 보기" + +#: src/slic3r/GUI/Plater.cpp:3603 src/slic3r/GUI/Tab.cpp:2534 +msgid "Preview" +msgstr "프리뷰" + +#: src/slic3r/GUI/Plater.cpp:3831 +msgid "" +"%1% printer was active at the time the target Undo / Redo snapshot was " +"taken. Switching to %1% printer requires reloading of %1% presets." +msgstr "" +"%1% 프린터가 대상 재생 취소/다시 작업 스냅샷을 생성할 때 활성화되었습니다. " +"%1% 프린터로 전환하려면 %1% 사전 설정을 다시 로드해야 합니다." + +#: src/slic3r/GUI/Plater.cpp:3992 +msgid "Load Project" +msgstr "프로젝트 로드" + +#: src/slic3r/GUI/Plater.cpp:4016 +msgid "Import Object" +msgstr "개체 가져오기" + +#: src/slic3r/GUI/Plater.cpp:4020 +msgid "Import Objects" +msgstr "객체 가져오기" + +#: src/slic3r/GUI/Plater.cpp:4075 +msgid "All objects will be removed, continue ?" +msgstr "모든 개체가 제거 됩니다, 계속합니까?" + +#: src/slic3r/GUI/Plater.cpp:4083 +msgid "Delete Selected Objects" +msgstr "선택한 객체 삭제" + +#: src/slic3r/GUI/Plater.cpp:4091 +msgid "Increase Instances" +msgstr "복제본 늘리기" + +#: src/slic3r/GUI/Plater.cpp:4127 +msgid "Decrease Instances" +msgstr "복제본 감소" + +#: src/slic3r/GUI/Plater.cpp:4163 +#, c-format +msgid "Set numbers of copies to %d" +msgstr "복사본 수를 %d로 설정" + +#: src/slic3r/GUI/Plater.cpp:4193 +msgid "Cut by Plane" +msgstr "평면으로 절단" + +#: src/slic3r/GUI/Plater.cpp:4225 +msgid "Save G-code file as:" +msgstr "G-code 파일 다른 이름 저장:" + +#: src/slic3r/GUI/Plater.cpp:4225 +msgid "Save SL1 file as:" +msgstr "SL1 파일 다른이름 저장:" + +#: src/slic3r/GUI/Plater.cpp:4337 +#, c-format +msgid "STL file exported to %s" +msgstr "내보낸 STL 파일 %s" + +#: src/slic3r/GUI/Plater.cpp:4353 +#, c-format +msgid "AMF file exported to %s" +msgstr "내보낸 AMF 파일 %s" + +#: src/slic3r/GUI/Plater.cpp:4356 +#, c-format +msgid "Error exporting AMF file %s" +msgstr "AMF 파일 내보내기 오류 %s" + +#: src/slic3r/GUI/Plater.cpp:4382 +#, c-format +msgid "3MF file exported to %s" +msgstr "3MF 파일을 내보냈습니다 %s" + +#: src/slic3r/GUI/Plater.cpp:4387 +#, c-format +msgid "Error exporting 3MF file %s" +msgstr "3MF 파일 내보내기 오류 %s" + +#: src/slic3r/GUI/Plater.cpp:4687 +msgid "Export" +msgstr "내보내기" + +#: src/slic3r/GUI/Plater.cpp:4688 +msgid "Send G-code" +msgstr "G 코드 보내기" + +#: src/slic3r/GUI/Plater.cpp:4772 +msgid "Paste From Clipboard" +msgstr "클립보드에서 붙여넣기" + +#: src/slic3r/GUI/Preferences.cpp:22 src/slic3r/GUI/Tab.cpp:1955 +#: src/slic3r/GUI/Tab.cpp:2193 +msgid "General" +msgstr "일반" + +#: src/slic3r/GUI/Preferences.cpp:44 +msgid "Remember output directory" +msgstr "출력 디렉토리 기억하기" + +#: src/slic3r/GUI/Preferences.cpp:46 +msgid "" +"If this is enabled, Slic3r will prompt the last output directory instead of " +"the one containing the input files." +msgstr "" +"이 옵션을 사용하면 Slic3r은 입력 파일이 들어있는 디렉터리 대신 마지막 출력 디" +"렉터리를 묻습니다." + +#: src/slic3r/GUI/Preferences.cpp:52 +msgid "Auto-center parts" +msgstr "부품을 자동으로 중심에" + +#: src/slic3r/GUI/Preferences.cpp:54 +msgid "" +"If this is enabled, Slic3r will auto-center objects around the print bed " +"center." +msgstr "이 옵션을 사용하면 Slic3r가 개체를 인쇄판 중앙에 자동으로 배치합니다." + +#: src/slic3r/GUI/Preferences.cpp:60 +msgid "Background processing" +msgstr "백그라운드 프로세싱" + +#: src/slic3r/GUI/Preferences.cpp:62 +msgid "" +"If this is enabled, Slic3r will pre-process objects as soon as they're " +"loaded in order to save time when exporting G-code." +msgstr "" +"이 사용 하는 경우 Slic3r는 전처리 개체 최대한 빨리 그들이 시간을 절약 하기 위" +"해 로드 G-코드를 내보낼 때." + +#: src/slic3r/GUI/Preferences.cpp:71 +msgid "" +"If enabled, PrusaSlicer will check for the new versions of itself online. " +"When a new version becomes available a notification is displayed at the next " +"application startup (never during program usage). This is only a " +"notification mechanisms, no automatic installation is done." +msgstr "" +"프루사 슬라이서는 온라인의 새로운 버전을 확인합니다. 새 버전을 사용할 수 있게" +"되면 다음 응용 프로그램 시작시 (프로그램 사용 중이 아님) 알림이 표시 됩니다. " +"이는 알림 메커니즘일뿐이며 자동 설치는 수행되지 않습니다." + +#: src/slic3r/GUI/Preferences.cpp:79 +msgid "" +"If enabled, Slic3r downloads updates of built-in system presets in the " +"background. These updates are downloaded into a separate temporary location. " +"When a new preset version becomes available it is offered at application " +"startup." +msgstr "" +"활성화 된 경우 Slic3r은 백그라운드에서 내장 시스템 사전 설정의 업데이트를 다" +"운로드합니다. 이러한 업데이트는 별도의 임시 위치에 다운로드됩니다. 새로운 사" +"전 설정 버전을 사용할 수있게되면 응용 프로그램 시작시 제공됩니다." + +#: src/slic3r/GUI/Preferences.cpp:84 +msgid "Suppress \" - default - \" presets" +msgstr "\"- 기본 -\"사전 설정 숨기기" + +#: src/slic3r/GUI/Preferences.cpp:86 +msgid "" +"Suppress \" - default - \" presets in the Print / Filament / Printer " +"selections once there are any other valid presets available." +msgstr "" +"사용 가능한 다른 유효한 사전 설정이 있으면 인쇄 / 필라멘트 / 프린터 선택에서 " +"\"- 기본 -\"사전 설정을 억제하십시오." + +#: src/slic3r/GUI/Preferences.cpp:92 +msgid "Show incompatible print and filament presets" +msgstr "호환 되지 않는 인쇄 및 필라멘트 설정" + +#: src/slic3r/GUI/Preferences.cpp:94 +msgid "" +"When checked, the print and filament presets are shown in the preset editor " +"even if they are marked as incompatible with the active printer" +msgstr "" +"이 옵션을 선택하면 활성 프린터와 호환되지 않는 것으로 표시된 경우에도 인쇄 " +"및 필라멘트 사전 설정이 사전 설정 편집기에 표시됩니다" + +#: src/slic3r/GUI/Preferences.cpp:101 +msgid "Use Retina resolution for the 3D scene" +msgstr "3D 장면에 레티나 해상도 사용" + +#: src/slic3r/GUI/Preferences.cpp:103 +msgid "" +"If enabled, the 3D scene will be rendered in Retina resolution. If you are " +"experiencing 3D performance problems, disabling this option may help." +msgstr "" +"활성화 된 경우 3D 장면은 레티나 해상도로 렌더링 됩니다. 3D 성능 문제가 발생하" +"는 경우, 옵션을 사용하지 않도록 설정 하면 도움이 될 수 있습니다." + +#: src/slic3r/GUI/Preferences.cpp:110 +msgid "Use perspective camera" +msgstr "원근 카메라 사용" + +#: src/slic3r/GUI/Preferences.cpp:112 +msgid "" +"If enabled, use perspective camera. If not enabled, use orthographic camera." +msgstr "" +"이 옵션을 사용하면 원근 카메라를 사용합니다. 활성화되지 않은 경우 직교 카메라" +"를 사용합니다." + +#: src/slic3r/GUI/Preferences.cpp:117 +msgid "Use custom size for toolbar icons" +msgstr "도구 모음 아이콘에 사용자 지정 크기 사용" + +#: src/slic3r/GUI/Preferences.cpp:119 +msgid "If enabled, you can change size of toolbar icons manually." +msgstr "활성화된 경우 도구 모음 아이콘의 크기를 수동으로 변경할 수 있습니다." + +#: src/slic3r/GUI/Preferences.cpp:144 +#, c-format +msgid "You need to restart %s to make the changes effective." +msgstr "변경 내용을 적용 하려면 %s를 다시 시작 해야 합니다." + +#: src/slic3r/GUI/Preferences.cpp:192 +msgid "Icon size in a respect to the default size" +msgstr "기본 크기에 대한 아이콘 크기" + +#: src/slic3r/GUI/Preferences.cpp:207 +msgid "Select toolbar icon size in respect to the default one." +msgstr "기본 도구 모음에 대해 도구 모음 아이콘 크기를 선택합니다." + +#: src/slic3r/GUI/Preset.cpp:212 +msgid "modified" +msgstr "수정된곳" + +#: src/slic3r/GUI/Preset.cpp:963 src/slic3r/GUI/Preset.cpp:1003 +#: src/slic3r/GUI/Preset.cpp:1068 src/slic3r/GUI/Preset.cpp:1100 +#: src/slic3r/GUI/PresetBundle.cpp:1480 src/slic3r/GUI/PresetBundle.cpp:1545 +msgid "System presets" +msgstr "시스템 기본설정" + +#: src/slic3r/GUI/Preset.cpp:1007 src/slic3r/GUI/Preset.cpp:1104 +#: src/slic3r/GUI/PresetBundle.cpp:1550 +msgid "User presets" +msgstr "사용자 사전설정" + +#: src/slic3r/GUI/Preset.cpp:1036 src/slic3r/GUI/Tab.cpp:241 +msgid "Add a new printer" +msgstr "새 프린터 추가" + +#: src/slic3r/GUI/Preset.cpp:1308 +msgid "filament" +msgstr "필라멘트" + +#: src/slic3r/GUI/Preset.cpp:1309 +msgid "SLA print" +msgstr "SLA 인쇄" + +#: src/slic3r/GUI/PresetHints.cpp:28 +msgid "" +"If estimated layer time is below ~%1%s, fan will run at %2%%% and print " +"speed will be reduced so that no less than %3%s are spent on that layer " +"(however, speed will never be reduced below %4%mm/s)." +msgstr "" +"예상 레이어 시간이 ~%1%초 미만이면 팬이 %2%%%에서 실행되고 인쇄 속도가 감소되" +"어 해당 레이어에 %3%초 이상 소비됩니다 (단, 속도는 %4%mm/s 이하로 감소하지 않" +"습니다) ." + +#: src/slic3r/GUI/PresetHints.cpp:35 +msgid "" +"\n" +"If estimated layer time is greater, but still below ~%1%s, fan will run at a " +"proportionally decreasing speed between %2%%% and %3%%%." +msgstr "" +"\n" +"예상 레이어 시간이 더 길지만 ~%1%초 미만인 경우 팬은 %2%%%와 %3%%%사이 비례, " +"감소하는 속도로 실행됩니다." + +#: src/slic3r/GUI/PresetHints.cpp:39 +msgid "" +"\n" +"During the other layers, fan" +msgstr "" +"\n" +"다른 레이어의, 팬설정은 " + +#: src/slic3r/GUI/PresetHints.cpp:41 +msgid "Fan" +msgstr "팬(Fan)" + +#: src/slic3r/GUI/PresetHints.cpp:47 +msgid "will always run at %1%%%" +msgstr "항상 다음처럼 실행 %1%%%" + +#: src/slic3r/GUI/PresetHints.cpp:50 +msgid "except for the first %1% layers." +msgstr "첫 번째 %d 레이어를 제외하고" + +#: src/slic3r/GUI/PresetHints.cpp:52 +msgid "except for the first layer." +msgstr "첫 번째 레이어를 제외하고" + +#: src/slic3r/GUI/PresetHints.cpp:54 +msgid "will be turned off." +msgstr "off 됩니다." + +#: src/slic3r/GUI/PresetHints.cpp:155 +msgid "external perimeters" +msgstr "외부 둘레" + +#: src/slic3r/GUI/PresetHints.cpp:164 +msgid "perimeters" +msgstr "둘레" + +#: src/slic3r/GUI/PresetHints.cpp:173 +msgid "infill" +msgstr "채움(infill)" + +#: src/slic3r/GUI/PresetHints.cpp:183 +msgid "solid infill" +msgstr "외부(solid)부분 채움" + +#: src/slic3r/GUI/PresetHints.cpp:191 +msgid "top solid infill" +msgstr "가장 윗부분 채움" + +#: src/slic3r/GUI/PresetHints.cpp:202 +msgid "support" +msgstr "서포트" + +#: src/slic3r/GUI/PresetHints.cpp:212 +msgid "support interface" +msgstr "서포트 인터페이스" + +#: src/slic3r/GUI/PresetHints.cpp:218 +msgid "First layer volumetric" +msgstr "첫번째 레이어 용적은" + +#: src/slic3r/GUI/PresetHints.cpp:218 +msgid "Bridging volumetric" +msgstr "브리징(Bridging) 용적" + +#: src/slic3r/GUI/PresetHints.cpp:218 +msgid "Volumetric" +msgstr "용적" + +#: src/slic3r/GUI/PresetHints.cpp:219 +msgid "flow rate is maximized" +msgstr "의 유속(flow)이 최대화된다. " + +#: src/slic3r/GUI/PresetHints.cpp:222 +msgid "by the print profile maximum" +msgstr "인쇄 프로파일 최대 값" + +#: src/slic3r/GUI/PresetHints.cpp:223 +msgid "when printing" +msgstr "인쇄 할 때" + +#: src/slic3r/GUI/PresetHints.cpp:224 +msgid "with a volumetric rate" +msgstr "의 용적 비율로 " + +#: src/slic3r/GUI/PresetHints.cpp:228 +#, c-format +msgid "%3.2f mm³/s at filament speed %3.2f mm/s." +msgstr "%3.2f mm³/s 필라멘트 속도는 %3.2f mm/s이다." + +#: src/slic3r/GUI/PresetHints.cpp:246 +msgid "" +"Recommended object thin wall thickness: Not available due to invalid layer " +"height." +msgstr "" +"권장 객체(object)의 벽(wall) 두께: 잘못된 레이어 높이 때문에 사용할 수 없음." + +#: src/slic3r/GUI/PresetHints.cpp:262 +#, c-format +msgid "Recommended object thin wall thickness for layer height %.2f and" +msgstr "객체 레이어 높이 %.2f 에 권장하는 두깨는 " + +#: src/slic3r/GUI/PresetHints.cpp:268 +#, c-format +msgid "%d lines: %.2f mm" +msgstr "%d 라인:%.2f mm" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:33 +msgid "Send G-Code to printer host" +msgstr "프린터 호스트로 G 코드 보내기" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:33 +msgid "Upload to Printer Host with the following filename:" +msgstr "다음 파일 이름으로 프린터 호스트에 업로드:" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:35 +msgid "Start printing after upload" +msgstr "업로드 후 인쇄 시작" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:42 +msgid "Use forward slashes ( / ) as a directory separator if needed." +msgstr "필요한 경우 디렉토리 분리 기호로 슬래시 (/)를 사용하십시오." + +#: src/slic3r/GUI/PrintHostDialogs.cpp:149 +msgid "ID" +msgstr "아이디" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:150 +msgid "Progress" +msgstr "진행률" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:151 +msgid "Status" +msgstr "상태" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:152 +msgid "Host" +msgstr "호스트" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:153 +msgid "Filename" +msgstr "파일이름" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:154 +msgid "Error Message" +msgstr "에러 메시지" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:157 +msgid "Cancel selected" +msgstr "선택 취소" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:159 +msgid "Show error message" +msgstr "오류 메시지 표시" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:198 +#: src/slic3r/GUI/PrintHostDialogs.cpp:229 +msgid "Enqueued" +msgstr "입력됨" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:230 +msgid "Uploading" +msgstr "업로드" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:234 +msgid "Completed" +msgstr "완료됨" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:272 +msgid "Error uploading to print host:" +msgstr "인쇄 호스트에 업로드 하는 중 오류 발생:" + +#: src/slic3r/GUI/RammingChart.cpp:23 +msgid "NO RAMMING AT ALL" +msgstr "전혀 충돌 없음" + +#: src/slic3r/GUI/RammingChart.cpp:76 +msgid "Time" +msgstr "시간" + +#: src/slic3r/GUI/RammingChart.cpp:76 src/slic3r/GUI/WipeTowerDialog.cpp:82 +#: src/libslic3r/PrintConfig.cpp:627 src/libslic3r/PrintConfig.cpp:671 +#: src/libslic3r/PrintConfig.cpp:686 src/libslic3r/PrintConfig.cpp:2349 +#: src/libslic3r/PrintConfig.cpp:2358 src/libslic3r/PrintConfig.cpp:2418 +#: src/libslic3r/PrintConfig.cpp:2425 +msgid "s" +msgstr "s" + +#: src/slic3r/GUI/RammingChart.cpp:81 +msgid "Volumetric speed" +msgstr "용적(Volumetric) 스피트" + +#: src/slic3r/GUI/RammingChart.cpp:81 src/libslic3r/PrintConfig.cpp:584 +#: src/libslic3r/PrintConfig.cpp:1234 +msgid "mm³/s" +msgstr "밀리미터 ³/s" + +#: src/slic3r/GUI/SysInfoDialog.cpp:78 +msgid "System Information" +msgstr "시스템 정보" + +#: src/slic3r/GUI/SysInfoDialog.cpp:154 +msgid "Copy to Clipboard" +msgstr "클립보드에 복사" + +#: src/slic3r/GUI/Tab.cpp:52 src/libslic3r/PrintConfig.cpp:239 +msgid "Compatible printers" +msgstr "호환 가능한 프린터들" + +#: src/slic3r/GUI/Tab.cpp:53 +msgid "Select the printers this profile is compatible with." +msgstr "이 프로파일과 호환 가능한 프린터를 선택하세요." + +#: src/slic3r/GUI/Tab.cpp:58 src/libslic3r/PrintConfig.cpp:254 +msgid "Compatible print profiles" +msgstr "호환되는 인쇄 프로 파일" + +#: src/slic3r/GUI/Tab.cpp:59 +msgid "Select the print profiles this profile is compatible with." +msgstr "이 프로필이 호환되는 인쇄 프로필을 선택 합니다." + +#. TRN "Save current Settings" +#: src/slic3r/GUI/Tab.cpp:133 +#, c-format +msgid "Save current %s" +msgstr "현재 %s 저장" + +#: src/slic3r/GUI/Tab.cpp:134 +msgid "Delete this preset" +msgstr "이전 설정 삭제" + +#: src/slic3r/GUI/Tab.cpp:139 +msgid "" +"Hover the cursor over buttons to find more information \n" +"or click this button." +msgstr "" +"버튼 위로 커서를 가져 가서 자세한 정보를 찾습니다.\n" +"또는이 버튼을 클릭하십시오." + +#: src/slic3r/GUI/Tab.cpp:921 +msgid "This is a default preset." +msgstr "기본 설정입니다." + +#: src/slic3r/GUI/Tab.cpp:923 +msgid "This is a system preset." +msgstr "시스템 설정입니다." + +#: src/slic3r/GUI/Tab.cpp:925 +msgid "Current preset is inherited from the default preset." +msgstr "현재 사전 설정은 기본 사전 설정에서 상속됩니다." + +#: src/slic3r/GUI/Tab.cpp:928 +#, c-format +msgid "" +"Current preset is inherited from:\n" +"\t%s" +msgstr "전의 %s 설정에서 가져 옵니다 " + +#: src/slic3r/GUI/Tab.cpp:932 +msgid "It can't be deleted or modified." +msgstr "삭제하거나 수정할 수 없습니다." + +#: src/slic3r/GUI/Tab.cpp:933 +msgid "" +"Any modifications should be saved as a new preset inherited from this one." +msgstr "모든 수정 사항은 이 항목에서 받은 기본 설정으로 저장해야합니다." + +#: src/slic3r/GUI/Tab.cpp:934 +msgid "To do that please specify a new name for the preset." +msgstr "그렇게하려면 기본 설정의 새 이름을 지정하십시오." + +#: src/slic3r/GUI/Tab.cpp:938 +msgid "Additional information:" +msgstr "추가 정보:" + +#: src/slic3r/GUI/Tab.cpp:944 +msgid "printer model" +msgstr "프린터 모델" + +#: src/slic3r/GUI/Tab.cpp:952 +msgid "default print profile" +msgstr "기본 인쇄 프로파일" + +#: src/slic3r/GUI/Tab.cpp:955 +msgid "default filament profile" +msgstr "기본 필라멘트 프로파일" + +#: src/slic3r/GUI/Tab.cpp:969 +msgid "default SLA material profile" +msgstr "기본 SLA 재질 프로 파일" + +#: src/slic3r/GUI/Tab.cpp:973 +msgid "default SLA print profile" +msgstr "기본 SLA 인쇄 프로필" + +#: src/slic3r/GUI/Tab.cpp:1008 src/slic3r/GUI/Tab.cpp:3649 +msgid "Layers and perimeters" +msgstr "레이어 및 경계선" + +#: src/slic3r/GUI/Tab.cpp:1009 src/slic3r/GUI/Tab.cpp:1257 +#: src/libslic3r/PrintConfig.cpp:66 +msgid "Layer height" +msgstr "레이어 높이" + +#: src/slic3r/GUI/Tab.cpp:1013 +msgid "Vertical shells" +msgstr "쉘 높이" + +#: src/slic3r/GUI/Tab.cpp:1024 +msgid "Horizontal shells" +msgstr "쉘 너비" + +#: src/slic3r/GUI/Tab.cpp:1025 src/libslic3r/PrintConfig.cpp:1759 +msgid "Solid layers" +msgstr "솔리드 레이어" + +#: src/slic3r/GUI/Tab.cpp:1030 +msgid "Quality (slower slicing)" +msgstr "품질(슬라이싱이 느려짐)" + +#: src/slic3r/GUI/Tab.cpp:1048 +msgid "Reducing printing time" +msgstr "출력 시간 단축" + +#: src/slic3r/GUI/Tab.cpp:1060 +msgid "Skirt and brim" +msgstr "스커트와 브림" + +#: src/slic3r/GUI/Tab.cpp:1077 +msgid "Raft" +msgstr "라프트" + +#: src/slic3r/GUI/Tab.cpp:1081 +msgid "Options for support material and raft" +msgstr "서포트와 라프트 재료를 선택" + +#: src/slic3r/GUI/Tab.cpp:1096 +msgid "Speed for print moves" +msgstr "출력중 이동 속도" + +#: src/slic3r/GUI/Tab.cpp:1108 +msgid "Speed for non-print moves" +msgstr "미출력시 이동속도" + +#: src/slic3r/GUI/Tab.cpp:1111 +msgid "Modifiers" +msgstr "수정" + +#: src/slic3r/GUI/Tab.cpp:1114 +msgid "Acceleration control (advanced)" +msgstr "가속 제어(고급)" + +#: src/slic3r/GUI/Tab.cpp:1121 +msgid "Autospeed (advanced)" +msgstr "오토스피트(고급)" + +#: src/slic3r/GUI/Tab.cpp:1129 +msgid "Multiple Extruders" +msgstr "다중 익스트루더" + +#: src/slic3r/GUI/Tab.cpp:1137 +msgid "Ooze prevention" +msgstr "오즈 방지(Ooze prevention)" + +#: src/slic3r/GUI/Tab.cpp:1154 +msgid "Extrusion width" +msgstr "악출 폭(Extrusion width)" + +#: src/slic3r/GUI/Tab.cpp:1164 +msgid "Overlap" +msgstr "겹침(Overlap)" + +#: src/slic3r/GUI/Tab.cpp:1167 +msgid "Flow" +msgstr "유량(Flow)" + +#: src/slic3r/GUI/Tab.cpp:1176 +msgid "Other" +msgstr "그 외" + +#: src/slic3r/GUI/Tab.cpp:1179 src/slic3r/GUI/Tab.cpp:3703 +msgid "Output options" +msgstr "출력 옵션" + +#: src/slic3r/GUI/Tab.cpp:1180 +msgid "Sequential printing" +msgstr "연속 인쇄" + +#: src/slic3r/GUI/Tab.cpp:1182 +msgid "Extruder clearance (mm)" +msgstr "익스트루더 간격(mm)" + +#: src/slic3r/GUI/Tab.cpp:1191 src/slic3r/GUI/Tab.cpp:3704 +msgid "Output file" +msgstr "출력 파일" + +#: src/slic3r/GUI/Tab.cpp:1198 src/libslic3r/PrintConfig.cpp:1432 +msgid "Post-processing scripts" +msgstr "사후 처리 스크립트" + +#: src/slic3r/GUI/Tab.cpp:1204 src/slic3r/GUI/Tab.cpp:1205 +#: src/slic3r/GUI/Tab.cpp:1716 src/slic3r/GUI/Tab.cpp:1717 +#: src/slic3r/GUI/Tab.cpp:2165 src/slic3r/GUI/Tab.cpp:2166 +#: src/slic3r/GUI/Tab.cpp:2273 src/slic3r/GUI/Tab.cpp:2274 +#: src/slic3r/GUI/Tab.cpp:3586 src/slic3r/GUI/Tab.cpp:3587 +msgid "Notes" +msgstr "메모" + +#: src/slic3r/GUI/Tab.cpp:1211 src/slic3r/GUI/Tab.cpp:1724 +#: src/slic3r/GUI/Tab.cpp:2172 src/slic3r/GUI/Tab.cpp:2280 +#: src/slic3r/GUI/Tab.cpp:3594 src/slic3r/GUI/Tab.cpp:3709 +msgid "Dependencies" +msgstr "속한 그룹" + +#: src/slic3r/GUI/Tab.cpp:1212 src/slic3r/GUI/Tab.cpp:1725 +#: src/slic3r/GUI/Tab.cpp:2173 src/slic3r/GUI/Tab.cpp:2281 +#: src/slic3r/GUI/Tab.cpp:3595 src/slic3r/GUI/Tab.cpp:3710 +msgid "Profile dependencies" +msgstr "프로파일 속한곳" + +#: src/slic3r/GUI/Tab.cpp:1256 +msgid "" +"Zero layer height is not valid.\n" +"\n" +"The layer height will be reset to 0.01." +msgstr "" +"바닥 레이어 높이가 잘못되었습니다.\n" +"\n" +"레이어 높이가 0.01로 재설정됩니다." + +#: src/slic3r/GUI/Tab.cpp:1268 +msgid "" +"Zero first layer height is not valid.\n" +"\n" +"The first layer height will be reset to 0.01." +msgstr "" +"첫 번째 레이어 높이가 0이면 유효하지 않습니다.\n" +"\n" +"첫 번째 레이어 높이는 0.01로 재설정됩니다." + +#: src/slic3r/GUI/Tab.cpp:1269 src/libslic3r/PrintConfig.cpp:866 +msgid "First layer height" +msgstr "첫 레이어 높이" + +#: src/slic3r/GUI/Tab.cpp:1283 +#, c-format +msgid "" +"The Spiral Vase mode requires:\n" +"- one perimeter\n" +"- no top solid layers\n" +"- 0% fill density\n" +"- no support material\n" +"- no ensure_vertical_shell_thickness\n" +"\n" +"Shall I adjust those settings in order to enable Spiral Vase?" +msgstr "" +"스파이럴 바이스 모드에는 다음이 필요합니다.\n" +"- one 둘레\n" +"- 탑 솔리드 레이어 없음\n" +"- 0% fill density\n" +"- 서포트 재료 없음\n" +"- 수직 벽 두깨를 보장하지 않음\n" +"\n" +"스파이럴 바이스를 사용하려면 이러한 설정을 조정해야합니까?" + +#: src/slic3r/GUI/Tab.cpp:1290 +msgid "Spiral Vase" +msgstr "스파이럴 바이스" + +#: src/slic3r/GUI/Tab.cpp:1311 +msgid "" +"The Wipe Tower currently supports the non-soluble supports only\n" +"if they are printed with the current extruder without triggering a tool " +"change.\n" +"(both support_material_extruder and support_material_interface_extruder need " +"to be set to 0).\n" +"\n" +"Shall I adjust those settings in order to enable the Wipe Tower?" +msgstr "" +"와이퍼 타워는 현재 비 가용성 서포트 만 지원합니다.\n" +"공구 교환을 트리거하지 않고 현재 압출기로 인쇄 한 경우.\n" +"(support_material_extruder 및 support_material_interface_extruder를 모두 0으" +"로 설정해야 함).\n" +"\n" +"와이퍼 타워를 사용하려면 이러한 설정을 조정해야합니까?" + +#: src/slic3r/GUI/Tab.cpp:1315 src/slic3r/GUI/Tab.cpp:1332 +msgid "Wipe Tower" +msgstr "와이프 타워(Wipe Tower)" + +#: src/slic3r/GUI/Tab.cpp:1329 +msgid "" +"For the Wipe Tower to work with the soluble supports, the support layers\n" +"need to be synchronized with the object layers.\n" +"\n" +"Shall I synchronize support layers in order to enable the Wipe Tower?" +msgstr "" +"와이퍼 타워가 가용성 서포트와 함께 작용하기 위해, 서포트 레이어\n" +"객체 레이어와 동기화되어야합니다.\n" +"\n" +"와이퍼 타워를 사용하려면 서포트 레이어를 동기화해야합니까?" + +#: src/slic3r/GUI/Tab.cpp:1347 +msgid "" +"Supports work better, if the following feature is enabled:\n" +"- Detect bridging perimeters\n" +"\n" +"Shall I adjust those settings for supports?" +msgstr "" +"다음 기능을 사용하는 경우 더 나은 작업을 지원합니다.\n" +"- 브리지 경계 검출\n" +"\n" +"서포트에 대한 설정을 조정해야합니까?" + +#: src/slic3r/GUI/Tab.cpp:1350 +msgid "Support Generator" +msgstr "서포트 생성" + +#: src/slic3r/GUI/Tab.cpp:1392 +msgid "" +"The %1% infill pattern is not supposed to work at 100%% density.\n" +"\n" +"Shall I switch to rectilinear fill pattern?" +msgstr "" +"%1% 채우기 패턴은 100%의 밀도로 작동 하지 않습니다.\n" +"\n" +"직선 채우기 패턴으로 전환 해야 합니까?" + +#: src/slic3r/GUI/Tab.cpp:1502 src/slic3r/GUI/Tab.cpp:1557 +msgid "Filament Overrides" +msgstr "필라멘트 재정의" + +#: src/slic3r/GUI/Tab.cpp:1503 src/slic3r/GUI/Tab.cpp:1562 +#: src/slic3r/GUI/Tab.cpp:2514 +msgid "Retraction" +msgstr "리트렉션" + +#: src/slic3r/GUI/Tab.cpp:1612 src/libslic3r/PrintConfig.cpp:2030 +msgid "Temperature" +msgstr "온도" + +#: src/slic3r/GUI/Tab.cpp:1618 +msgid "Bed" +msgstr "배드(Bed)" + +#: src/slic3r/GUI/Tab.cpp:1623 +msgid "Cooling" +msgstr "냉각(Cooling)" + +#: src/slic3r/GUI/Tab.cpp:1624 src/libslic3r/PrintConfig.cpp:1335 +#: src/libslic3r/PrintConfig.cpp:2150 +msgid "Enable" +msgstr "사용" + +#: src/slic3r/GUI/Tab.cpp:1635 +msgid "Fan settings" +msgstr "팬 설정" + +#: src/slic3r/GUI/Tab.cpp:1636 +msgid "Fan speed" +msgstr "팬 속도" + +#: src/slic3r/GUI/Tab.cpp:1644 +msgid "Cooling thresholds" +msgstr "냉각 임계 값" + +#: src/slic3r/GUI/Tab.cpp:1650 +msgid "Filament properties" +msgstr "필라멘트 특성" + +#: src/slic3r/GUI/Tab.cpp:1654 +msgid "Print speed override" +msgstr "인쇄 속도 중단" + +#: src/slic3r/GUI/Tab.cpp:1664 +msgid "Wipe tower parameters" +msgstr "타워 매개변수 지우기" + +#: src/slic3r/GUI/Tab.cpp:1667 +msgid "Toolchange parameters with single extruder MM printers" +msgstr "싱글 익스트루더 멀티 터리알 프린터를 사용한 공구 교환 매개 변수" + +#: src/slic3r/GUI/Tab.cpp:1681 +msgid "Ramming settings" +msgstr "래밍 설정" + +#: src/slic3r/GUI/Tab.cpp:1703 src/slic3r/GUI/Tab.cpp:2128 +msgid "Custom G-code" +msgstr "수동 G코드" + +#: src/slic3r/GUI/Tab.cpp:1704 src/slic3r/GUI/Tab.cpp:2129 +#: src/libslic3r/PrintConfig.cpp:1785 src/libslic3r/PrintConfig.cpp:1800 +msgid "Start G-code" +msgstr "스타트 G코드" + +#: src/slic3r/GUI/Tab.cpp:1710 src/slic3r/GUI/Tab.cpp:2135 +#: src/libslic3r/PrintConfig.cpp:369 src/libslic3r/PrintConfig.cpp:379 +msgid "End G-code" +msgstr "엔드 G코드" + +#: src/slic3r/GUI/Tab.cpp:1843 src/slic3r/GUI/Tab.cpp:2068 +msgid "Test" +msgstr "시험(test)" + +#: src/slic3r/GUI/Tab.cpp:1853 +msgid "Could not get a valid Printer Host reference" +msgstr "유효한 프린터 호스트 참조를 가져올 수 없습니다" + +#: src/slic3r/GUI/Tab.cpp:1859 src/slic3r/GUI/Tab.cpp:2081 +msgid "Success!" +msgstr "성공!" + +#: src/slic3r/GUI/Tab.cpp:1874 +msgid "" +"HTTPS CA file is optional. It is only needed if you use HTTPS with a self-" +"signed certificate." +msgstr "" +"HTTPS CA 파일은 선택 사항입니다. 자체 서명 된 인증서로 HTTPS를 사용하는 경우" +"에만 필요합니다." + +#: src/slic3r/GUI/Tab.cpp:1887 +msgid "Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*" +msgstr "인증서 파일 (* .crt, * .pem) | * .crt; * .pem | 모든 파일 | *. *" + +#: src/slic3r/GUI/Tab.cpp:1888 +msgid "Open CA certificate file" +msgstr "CA 인증서 파일 열기" + +#: src/slic3r/GUI/Tab.cpp:1916 +#, c-format +msgid "" +"HTTPS CA File:\n" +" \tOn this system, %s uses HTTPS certificates from the system Certificate " +"Store or Keychain.\n" +" \tTo use a custom CA file, please import your CA file into Certificate " +"Store / Keychain." +msgstr "" +"HTTPS CA 파일:\n" +"\t이 시스템에서 %s는 시스템 인증서 저장소나 키체인의 HTTPS 인증서를 사용 합니" +"다.\n" +"\t사용자 지정 CA 파일을 사용 하려면 CA 파일을 인증서 저장소/키체인에 가져오십" +"시오." + +#: src/slic3r/GUI/Tab.cpp:1956 src/slic3r/GUI/Tab.cpp:2194 +msgid "Size and coordinates" +msgstr "크기와 좌표" + +#: src/slic3r/GUI/Tab.cpp:1961 src/slic3r/GUI/Tab.cpp:2199 +#: src/slic3r/GUI/Tab.cpp:3256 +msgid "Set" +msgstr "설정" + +#: src/slic3r/GUI/Tab.cpp:1993 +msgid "Capabilities" +msgstr "기능" + +#: src/slic3r/GUI/Tab.cpp:1998 +msgid "Number of extruders of the printer." +msgstr "프린터 익스트루더 숫자." + +#: src/slic3r/GUI/Tab.cpp:2023 +msgid "" +"Single Extruder Multi Material is selected, \n" +"and all extruders must have the same diameter.\n" +"Do you want to change the diameter for all extruders to first extruder " +"nozzle diameter value?" +msgstr "" +"단일 압출기 멀티 재질이 선택되고, \n" +"모든 압출기는 동일한 직경을 가져야 합니다.\n" +"모든 압출기의 지름을 첫 번째 압출기 노즐 값으로 변경하시겠습니까?" + +#: src/slic3r/GUI/Tab.cpp:2026 src/slic3r/GUI/Tab.cpp:2484 +#: src/libslic3r/PrintConfig.cpp:1310 +msgid "Nozzle diameter" +msgstr "노즐 직경" + +#: src/slic3r/GUI/Tab.cpp:2053 +msgid "USB/Serial connection" +msgstr "USB/시리얼 연결" + +#: src/slic3r/GUI/Tab.cpp:2054 src/libslic3r/PrintConfig.cpp:1640 +msgid "Serial port" +msgstr "시리얼 포트" + +#: src/slic3r/GUI/Tab.cpp:2059 +msgid "Rescan serial ports" +msgstr "시리얼포트 재검색" + +#: src/slic3r/GUI/Tab.cpp:2081 +msgid "Connection to printer works correctly." +msgstr "프린터 연결이 올바르게 작동합니다." + +#: src/slic3r/GUI/Tab.cpp:2084 +msgid "Connection failed." +msgstr "연결 실패." + +#: src/slic3r/GUI/Tab.cpp:2097 src/slic3r/GUI/Tab.cpp:2268 +msgid "Print Host upload" +msgstr "호스트 업로드 인쇄" + +#: src/slic3r/GUI/Tab.cpp:2141 src/libslic3r/PrintConfig.cpp:138 +msgid "Before layer change G-code" +msgstr "레이어 변경 전 G 코드" + +#: src/slic3r/GUI/Tab.cpp:2147 src/libslic3r/PrintConfig.cpp:1056 +msgid "After layer change G-code" +msgstr "레이어 변경 후 G 코드" + +#: src/slic3r/GUI/Tab.cpp:2153 src/libslic3r/PrintConfig.cpp:2056 +msgid "Tool change G-code" +msgstr "툴 채인지 G 코드" + +#: src/slic3r/GUI/Tab.cpp:2159 +msgid "Between objects G-code (for sequential printing)" +msgstr "객체 간 G 코드 (순차 인쇄용)" + +#: src/slic3r/GUI/Tab.cpp:2231 +msgid "Display" +msgstr "표시" + +#: src/slic3r/GUI/Tab.cpp:2246 +msgid "Tilt" +msgstr "기울이기" + +#: src/slic3r/GUI/Tab.cpp:2247 +msgid "Tilt time" +msgstr "기울이기 시간" + +#: src/slic3r/GUI/Tab.cpp:2253 src/slic3r/GUI/Tab.cpp:3568 +msgid "Corrections" +msgstr "수정" + +#: src/slic3r/GUI/Tab.cpp:2333 src/slic3r/GUI/Tab.cpp:2418 +#: src/libslic3r/PrintConfig.cpp:1106 src/libslic3r/PrintConfig.cpp:1124 +#: src/libslic3r/PrintConfig.cpp:1142 src/libslic3r/PrintConfig.cpp:1159 +#: src/libslic3r/PrintConfig.cpp:1170 src/libslic3r/PrintConfig.cpp:1181 +#: src/libslic3r/PrintConfig.cpp:1192 +msgid "Machine limits" +msgstr "머신 한계설정" + +#: src/slic3r/GUI/Tab.cpp:2347 +msgid "Values in this column are for Normal mode" +msgstr "이 열의 값은 일반 모드입니다" + +#: src/slic3r/GUI/Tab.cpp:2348 +msgid "Normal" +msgstr "보통" + +#: src/slic3r/GUI/Tab.cpp:2353 +msgid "Values in this column are for Stealth mode" +msgstr "이 열의 값은 무음 모드 용입니다" + +#: src/slic3r/GUI/Tab.cpp:2354 +msgid "Stealth" +msgstr "스텔스" + +#: src/slic3r/GUI/Tab.cpp:2362 +msgid "Maximum feedrates" +msgstr "최대 이송속도" + +#: src/slic3r/GUI/Tab.cpp:2367 +msgid "Maximum accelerations" +msgstr "최고 가속도" + +#: src/slic3r/GUI/Tab.cpp:2374 +msgid "Jerk limits" +msgstr "저크(Jerk)값 한계" + +#: src/slic3r/GUI/Tab.cpp:2379 +msgid "Minimum feedrates" +msgstr "최대 이송속도" + +#: src/slic3r/GUI/Tab.cpp:2443 src/slic3r/GUI/Tab.cpp:2451 +msgid "Single extruder MM setup" +msgstr "싱글 익스트루더 MM 설정" + +#: src/slic3r/GUI/Tab.cpp:2452 +msgid "Single extruder multimaterial parameters" +msgstr "싱글 익스트루더 멀티메터리알 파라미터" + +#: src/slic3r/GUI/Tab.cpp:2465 src/libslic3r/GCode/PreviewData.cpp:477 +#, c-format +msgid "Extruder %d" +msgstr "익스트루더 %d" + +#: src/slic3r/GUI/Tab.cpp:2483 +msgid "Do you want to change the diameter for all extruders?" +msgstr "모든 압출기의 지름을 변경하시겠습니까?" + +#: src/slic3r/GUI/Tab.cpp:2506 +msgid "Layer height limits" +msgstr "레이어 높이 한계치" + +#: src/slic3r/GUI/Tab.cpp:2511 +msgid "Position (for multi-extruder printers)" +msgstr "위치 (멀티 익스트루더 프린터 포함)" + +#: src/slic3r/GUI/Tab.cpp:2517 +msgid "Only lift Z" +msgstr "Z축 올림" + +#: src/slic3r/GUI/Tab.cpp:2530 +msgid "" +"Retraction when tool is disabled (advanced settings for multi-extruder " +"setups)" +msgstr "도구 비활성화시 리트렉션 (멀티 익스트루더 고급 설정)" + +#: src/slic3r/GUI/Tab.cpp:2693 +msgid "" +"The Wipe option is not available when using the Firmware Retraction mode.\n" +"\n" +"Shall I disable it in order to enable Firmware Retraction?" +msgstr "" +"펌웨어 리트렉션 모드를 사용할 때는 Wipe 옵션을 사용할 수 없습니다.\n" +"\n" +"펌웨어 리트렉션 하려면 비활성화해야합니까?" + +#: src/slic3r/GUI/Tab.cpp:2695 +msgid "Firmware Retraction" +msgstr "펌웨어 레트렉션" + +#: src/slic3r/GUI/Tab.cpp:3024 +#, c-format +msgid "Default preset (%s)" +msgstr "시스템 기본값 (%s)" + +#: src/slic3r/GUI/Tab.cpp:3025 +#, c-format +msgid "Preset (%s)" +msgstr "프리셋 ( %s)" + +#: src/slic3r/GUI/Tab.cpp:3042 +msgid "has the following unsaved changes:" +msgstr "저장되지 않은 수정사항:" + +#: src/slic3r/GUI/Tab.cpp:3045 +msgid "is not compatible with printer" +msgstr "프린터와 호완 되지 않습니다" + +#: src/slic3r/GUI/Tab.cpp:3046 +msgid "is not compatible with print profile" +msgstr "인쇄 프로필과 호환 되지 않음" + +#: src/slic3r/GUI/Tab.cpp:3048 +msgid "and it has the following unsaved changes:" +msgstr "저장되지 않은 변경점은 다음과 같습니다:" + +#: src/slic3r/GUI/Tab.cpp:3052 +msgid "Unsaved Changes" +msgstr "미 저장된 변경점" + +#: src/slic3r/GUI/Tab.cpp:3143 +msgid "%1% - Copy" +msgstr "%1%-복사" + +#: src/slic3r/GUI/Tab.cpp:3166 +msgid "The supplied name is empty. It can't be saved." +msgstr "파일 이름이 비어 있습니다. 저장할 수 없습니다." + +#: src/slic3r/GUI/Tab.cpp:3171 +msgid "Cannot overwrite a system profile." +msgstr "시스템 프로파일을 겹쳐 쓸 수 없습니다." + +#: src/slic3r/GUI/Tab.cpp:3175 +msgid "Cannot overwrite an external profile." +msgstr "외부 프로필을 덮어 쓸 수 없습니다." + +#: src/slic3r/GUI/Tab.cpp:3201 +msgid "remove" +msgstr "제거(remove)" + +#: src/slic3r/GUI/Tab.cpp:3201 +msgid "delete" +msgstr "지우기" + +#. TRN remove/delete +#: src/slic3r/GUI/Tab.cpp:3203 +msgid "Are you sure you want to %1% the selected preset?" +msgstr "선택한 사전 설정의 %1%를 선택 하시겠습니까?" + +#. TRN Remove/Delete +#: src/slic3r/GUI/Tab.cpp:3206 +msgid "%1% Preset" +msgstr "%1% 기본설정" + +#: src/slic3r/GUI/Tab.cpp:3332 +msgid "LOCKED LOCK" +msgstr "잠긴 잠금" + +#. TRN Description for "LOCKED LOCK" +#: src/slic3r/GUI/Tab.cpp:3334 +msgid "" +"indicates that the settings are the same as the system (or default) values " +"for the current option group" +msgstr "" +"설정이 현재 옵션 그룹의 시스템(또는 기본값) 값과 동일하다는 것을 나타냅니다." + +#: src/slic3r/GUI/Tab.cpp:3336 +msgid "UNLOCKED LOCK" +msgstr "잠금 해제 잠금" + +#. TRN Description for "UNLOCKED LOCK" +#: src/slic3r/GUI/Tab.cpp:3338 +msgid "" +"indicates that some settings were changed and are not equal to the system " +"(or default) values for the current option group.\n" +"Click the UNLOCKED LOCK icon to reset all settings for current option group " +"to the system (or default) values." +msgstr "" +"은 일부 설정이 변경되었으며 현재 옵션 그룹의 시스템(또는 기본값) 값과 같지 않" +"음을 나타냅니다.\n" +"잠금 해제 잠금 아이콘을 클릭하여 현재 옵션 그룹에 대한 모든 설정을 시스템(또" +"는 기본값) 값으로 재설정합니다." + +#: src/slic3r/GUI/Tab.cpp:3343 +msgid "WHITE BULLET" +msgstr "흰색 글머리 기호" + +#. TRN Description for "WHITE BULLET" +#: src/slic3r/GUI/Tab.cpp:3345 +msgid "" +"for the left button: \tindicates a non-system (or non-default) preset,\n" +"for the right button: \tindicates that the settings hasn't been modified." +msgstr "" +"왼쪽 단추의 경우: 비시스템(또는 기본이 아닌) 사전 설정을 나타냅니다.\n" +"오른쪽 버튼: 설정이 수정되지 않았음을 나타냅니다." + +#: src/slic3r/GUI/Tab.cpp:3348 +msgid "BACK ARROW" +msgstr "돌아가기 화살표" + +#. TRN Description for "BACK ARROW" +#: src/slic3r/GUI/Tab.cpp:3350 +msgid "" +"indicates that the settings were changed and are not equal to the last saved " +"preset for the current option group.\n" +"Click the BACK ARROW icon to reset all settings for the current option group " +"to the last saved preset." +msgstr "" +"잠금 풀림;일부 설정이 변경되었으며 현재 옵션 그룹의 시스템 값과 같지 않음을 " +"나타냅니다.\n" +"현재 옵션 그룹의 모든 설정을 시스템 값으로 재설정하려면 자물쇠 잠금 아이콘을 " +"클릭하십시오." + +#: src/slic3r/GUI/Tab.cpp:3360 +msgid "" +"LOCKED LOCK icon indicates that the settings are the same as the system (or " +"default) values for the current option group" +msgstr "" +"LOCKED LOCK 아이콘은 설정이 현재 옵션 그룹의 시스템(또는 기본값) 값과 동일하" +"다는 것을 나타냅니다." + +#: src/slic3r/GUI/Tab.cpp:3362 +msgid "" +"UNLOCKED LOCK icon indicates that some settings were changed and are not " +"equal to the system (or default) values for the current option group.\n" +"Click to reset all settings for current option group to the system (or " +"default) values." +msgstr "" +"UNLOCKED LOCK 아이콘은 일부 설정이 변경되었으며 현재 옵션 그룹의 시스템(또는 " +"기본값) 값과 같지 않음을 나타냅니다.\n" +"현재 옵션 그룹에 대한 모든 설정을 시스템(또는 기본값) 값으로 재설정하려면 클" +"릭합니다." + +#: src/slic3r/GUI/Tab.cpp:3365 +msgid "WHITE BULLET icon indicates a non system (or non default) preset." +msgstr "WHITE BULLET 아이콘은 시스템 사전 설정이 아닌 것을 나타냅니다." + +#: src/slic3r/GUI/Tab.cpp:3368 +msgid "" +"WHITE BULLET icon indicates that the settings are the same as in the last " +"saved preset for the current option group." +msgstr "" +"WHITE BULLET 기호 아이콘은 설정이 현재 옵션 그룹에 대해 마지막으로 저장 된 사" +"전 설정과 동일 하다는 것을 나타냅니다." + +#: src/slic3r/GUI/Tab.cpp:3370 +msgid "" +"BACK ARROW icon indicates that the settings were changed and are not equal " +"to the last saved preset for the current option group.\n" +"Click to reset all settings for the current option group to the last saved " +"preset." +msgstr "" +"BACK ARROW 이콘 설정을 변경 하 고 현재 옵션 그룹에 대 한 마지막 저장 된 프리" +"셋을 동일 하지 않습니다 나타냅니다.\n" +"마지막 현재 옵션 그룹에 대 한 모든 설정 다시 설정을 클릭 하 여 사전 설정을 저" +"장." + +#: src/slic3r/GUI/Tab.cpp:3376 +msgid "" +"LOCKED LOCK icon indicates that the value is the same as the system (or " +"default) value." +msgstr "" +"LOCKED LOCK 아이콘은 값이 시스템(또는 기본값) 값과 동일하다는 것을 나타냅니" +"다." + +#: src/slic3r/GUI/Tab.cpp:3377 +msgid "" +"UNLOCKED LOCK icon indicates that the value was changed and is not equal to " +"the system (or default) value.\n" +"Click to reset current value to the system (or default) value." +msgstr "" +"UNLOCKED LOCK 아이콘은 값이 변경되었으며 시스템(또는 기본값) 값과 같지 않음" +"을 나타냅니다.\n" +"현재 값을 시스템(또는 기본값) 값으로 재설정하려면 클릭합니다." + +#: src/slic3r/GUI/Tab.cpp:3383 +msgid "" +"WHITE BULLET icon indicates that the value is the same as in the last saved " +"preset." +msgstr "" +"WHITE BULLET 기호 아이콘은 마지막으로 저장 한 사전 설정과 동일한 값을 나타냅" +"니다." + +#: src/slic3r/GUI/Tab.cpp:3384 +msgid "" +"BACK ARROW icon indicates that the value was changed and is not equal to the " +"last saved preset.\n" +"Click to reset current value to the last saved preset." +msgstr "" +"BACK ARROW 아이콘은 값이 변경되었으며 마지막으로 저장된 사전 설정과 같지 않음" +"을 나타냅니다.\n" +"현재 값을 마지막으로 저장된 사전 설정으로 재설정하려면 클릭합니다." + +#. TRN Preset +#: src/slic3r/GUI/Tab.cpp:3497 +#, c-format +msgid "Save %s as:" +msgstr "Save %s as:" + +#: src/slic3r/GUI/Tab.cpp:3541 +msgid "the following suffix is not allowed:" +msgstr "다음 접미사는 허용되지 않습니다:" + +#: src/slic3r/GUI/Tab.cpp:3545 +msgid "The supplied name is not available." +msgstr "제공된 이름을 사용할 수 없습니다." + +#: src/slic3r/GUI/Tab.cpp:3558 +msgid "Material" +msgstr "재료" + +#: src/slic3r/GUI/Tab.cpp:3560 src/slic3r/GUI/Tab.cpp:3651 +#: src/slic3r/GUI/wxExtensions.cpp:454 +msgid "Layers" +msgstr "레이어" + +#: src/slic3r/GUI/Tab.cpp:3564 +msgid "Exposure" +msgstr "노출" + +#: src/slic3r/GUI/Tab.cpp:3659 +msgid "Support head" +msgstr "서포트 헤드" + +#: src/slic3r/GUI/Tab.cpp:3664 +msgid "Support pillar" +msgstr "서포트 기둥" + +#: src/slic3r/GUI/Tab.cpp:3675 +msgid "Connection of the support sticks and junctions" +msgstr "서포트 기둥 및 접합부 연결" + +#: src/slic3r/GUI/Tab.cpp:3680 +msgid "Automatic generation" +msgstr "자동 생성" + +#: src/slic3r/GUI/Tab.cpp:3747 +msgid "Head penetration should not be greater than the head width." +msgstr "헤드 관통은 헤드 폭 보다 크지 않아야 합니다." + +#: src/slic3r/GUI/Tab.cpp:3751 +msgid "Invalid Head penetration" +msgstr "잘못된 헤드 관통" + +#: src/slic3r/GUI/Tab.cpp:3767 +msgid "Pinhead diameter should be smaller than the pillar diameter." +msgstr "핀헤드 지름은 기둥 지름 보다 작아야 합니다." + +#: src/slic3r/GUI/Tab.cpp:3771 +msgid "Invalid pinhead diameter" +msgstr "잘못된 핀 헤드 지름" + +#: src/slic3r/GUI/Tab.hpp:324 src/slic3r/GUI/Tab.hpp:422 +msgid "Print Settings" +msgstr "출력 설정" + +#: src/slic3r/GUI/Tab.hpp:348 +msgid "Filament Settings" +msgstr "필라멘트 설정" + +#: src/slic3r/GUI/Tab.hpp:383 +msgid "Printer Settings" +msgstr "프린터 설정" + +#: src/slic3r/GUI/Tab.hpp:407 +msgid "Material Settings" +msgstr "재질 설정" + +#: src/slic3r/GUI/Tab.hpp:434 +msgid "Save preset" +msgstr "사전 설정 저장" + +#: src/slic3r/GUI/UpdateDialogs.cpp:38 +msgid "Update available" +msgstr "사용가능한 업데이트" + +#: src/slic3r/GUI/UpdateDialogs.cpp:38 +#, c-format +msgid "New version of %s is available" +msgstr "%s의 새 버전을 사용할 수 있습니다" + +#: src/slic3r/GUI/UpdateDialogs.cpp:45 +msgid "Current version:" +msgstr "현재 버전:" + +#: src/slic3r/GUI/UpdateDialogs.cpp:47 +msgid "New version:" +msgstr "새로운 버전:" + +#: src/slic3r/GUI/UpdateDialogs.cpp:55 +msgid "Changelog && Download" +msgstr "변경 로그 및 다운로드" + +#: src/slic3r/GUI/UpdateDialogs.cpp:62 src/slic3r/GUI/UpdateDialogs.cpp:125 +msgid "Open changelog page" +msgstr "변경 로그 페이지 열기" + +#: src/slic3r/GUI/UpdateDialogs.cpp:67 +msgid "Open download page" +msgstr "다운로드 페이지 열기" + +#: src/slic3r/GUI/UpdateDialogs.cpp:73 +msgid "Don't notify about new releases any more" +msgstr "새로운 수정사항에 대해 더 이상 알림 안 함" + +#: src/slic3r/GUI/UpdateDialogs.cpp:91 src/slic3r/GUI/UpdateDialogs.cpp:205 +msgid "Configuration update" +msgstr "구성 업데이트" + +#: src/slic3r/GUI/UpdateDialogs.cpp:91 +msgid "Configuration update is available" +msgstr "구성 업데이트를 사용할 수 있음" + +#: src/slic3r/GUI/UpdateDialogs.cpp:94 +msgid "" +"Would you like to install it?\n" +"\n" +"Note that a full configuration snapshot will be created first. It can then " +"be restored at any time should there be a problem with the new version.\n" +"\n" +"Updated configuration bundles:" +msgstr "" +"그것을 설치 하시겠습니까?\n" +"\n" +"전체 구성 스냅 샷이 먼저 만들어집니다. 그런 다음 새 버전에 문제가있을 경우 언" +"제든지 복원 할 수 있습니다.\n" +"\n" +"업데이트 된 구성 번들 :" + +#: src/slic3r/GUI/UpdateDialogs.cpp:115 +msgid "Comment:" +msgstr "\"댓글\"" + +#: src/slic3r/GUI/UpdateDialogs.cpp:149 +#, c-format +msgid "%s incompatibility" +msgstr "%s 비 호환성" + +#: src/slic3r/GUI/UpdateDialogs.cpp:150 +#, c-format +msgid "%s configuration is incompatible" +msgstr "%s 과 호환되지 않습니다" + +#: src/slic3r/GUI/UpdateDialogs.cpp:155 +#, c-format +msgid "" +"This version of %s is not compatible with currently installed configuration " +"bundles.\n" +"This probably happened as a result of running an older %s after using a " +"newer one.\n" +"\n" +"You may either exit %s and try again with a newer version, or you may re-run " +"the initial configuration. Doing so will create a backup snapshot of the " +"existing configuration before installing files compatible with this %s.\n" +msgstr "" +"%s의 이 버전은 현재 설치 된 구성 번들과 호환 되지 않습니다.\n" +"이것은 새로운 것을 사용한 후 이전 %s를 실행 한 결과로 발생 했을 것입니다.\n" +"\n" +" %s를 종료하고 최신 버전으로 다시 시도 하거나 초기 구성을 다시 실행할 수 있습" +"니다. 이렇게 하면 %s와 호환 되는 파일을 설치하기 전에 기존 구성의 백업 스냅샷" +"이 생성 됩니다.\n" + +#: src/slic3r/GUI/UpdateDialogs.cpp:164 +#, c-format +msgid "This %s version: %s" +msgstr "이 %s 버전: %s" + +#: src/slic3r/GUI/UpdateDialogs.cpp:169 +msgid "Incompatible bundles:" +msgstr "호환되지 않는 번들 :" + +#: src/slic3r/GUI/UpdateDialogs.cpp:185 +#, c-format +msgid "Exit %s" +msgstr "%s Exit" + +#: src/slic3r/GUI/UpdateDialogs.cpp:188 +msgid "Re-configure" +msgstr "재구성" + +#: src/slic3r/GUI/UpdateDialogs.cpp:209 +#, c-format +msgid "" +"%s now uses an updated configuration structure.\n" +"\n" +"So called 'System presets' have been introduced, which hold the built-in " +"default settings for various printers. These System presets cannot be " +"modified, instead, users now may create their own presets inheriting " +"settings from one of the System presets.\n" +"An inheriting preset may either inherit a particular value from its parent " +"or override it with a customized value.\n" +"\n" +"Please proceed with the %s that follows to set up the new presets and to " +"choose whether to enable automatic preset updates." +msgstr "" +"%s이 (가) 이제 업데이트 된 구성 구조를 사용 합니다.\n" +"\n" +"'시스템 프리셋 '이 도입 되었습니다, 다양한 프린터에 대한 기본 설정을 내장. 이" +"러한 시스템 프리셋은 수정할 수 없으며, 사용자는 이제 시스템 프리셋 중 하나에" +"서 설정을 상속하는 자신만의 프리셋을 생성할 수 있습니다.\n" +"상속하는 사전 설정은 해당 기본 설정에서 특정 값을 상속 하거나 사용자 지정 된 " +"값으로 재정의할 수 있습니다.\n" +"\n" +"다음의 %s를 계속 진행하여 새 프리셋을 설정하고 자동 프리셋 업데이트를 사용할" +"지 여부를 선택하십시오." + +#: src/slic3r/GUI/UpdateDialogs.cpp:225 +msgid "For more information please visit our wiki page:" +msgstr "자세한 정보는 위키 페이지를 참조하십시오 :" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:14 +msgid "Ramming customization" +msgstr "사용자 정의 다지기(Ramming)" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:40 +msgid "" +"Ramming denotes the rapid extrusion just before a tool change in a single-" +"extruder MM printer. Its purpose is to properly shape the end of the " +"unloaded filament so it does not prevent insertion of the new filament and " +"can itself be reinserted later. This phase is important and different " +"materials can require different extrusion speeds to get the good shape. For " +"this reason, the extrusion rates during ramming are adjustable.\n" +"\n" +"This is an expert-level setting, incorrect adjustment will likely lead to " +"jams, extruder wheel grinding into filament etc." +msgstr "" +"래밍은 단일 압출기 MM 프린터에서 공구 교환 직전의 신속한 압출을 나타냅니다. " +"그 목적은 언로드 된 필라멘트의 끝 부분을 적절히 형성하여 새로운 필라멘트의 삽" +"입을 방지하고 나중에 다시 삽입 할 수 있도록하기위한 것입니다. 이 단계는 중요" +"하며 다른 재료는 좋은 모양을 얻기 위해 다른 압출 속도를 요구할 수 있습니다. " +"이러한 이유로, 래밍 중 압출 속도는 조정 가능합니다.\n" +"\n" +"전문가 수준의 설정이므로 잘못된 조정으로 인해 용지 걸림, 압출기 휠이 필라멘" +"트 등에 연삭 될 수 있습니다." + +#: src/slic3r/GUI/WipeTowerDialog.cpp:82 +msgid "Total ramming time" +msgstr "총 래밍 시간" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:84 +msgid "Total rammed volume" +msgstr "총 레미드 양" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:88 +msgid "Ramming line width" +msgstr "래밍 선 너비" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:90 +msgid "Ramming line spacing" +msgstr "래밍 선 간격" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:141 +msgid "Wipe tower - Purging volume adjustment" +msgstr "와이프 타워 - 버려진 필라멘트 조절" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:225 +msgid "" +"Here you can adjust required purging volume (mm³) for any given pair of " +"tools." +msgstr "여기서 주어진 도구 쌍에 필요한 정화 용량 (mm³)을 조정할 수 있습니다." + +#: src/slic3r/GUI/WipeTowerDialog.cpp:226 +msgid "Extruder changed to" +msgstr "익스트루더 번경" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:234 +msgid "unloaded" +msgstr "언로드(unloaded)" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:235 +msgid "loaded" +msgstr "로드(loaded)" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:240 +msgid "Tool #" +msgstr "도구(Tool) #" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:247 +msgid "" +"Total purging volume is calculated by summing two values below, depending on " +"which tools are loaded/unloaded." +msgstr "" +"총 정화 량은 어느 공구가로드 / 언로드되는지에 따라 아래의 두 값을 합산하여 계" +"산됩니다." + +#: src/slic3r/GUI/WipeTowerDialog.cpp:248 +msgid "Volume to purge (mm³) when the filament is being" +msgstr "제거할 필라멘트 양 (mm³)" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:262 +msgid "From" +msgstr "From" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:327 +msgid "" +"Switching to simple settings will discard changes done in the advanced " +"mode!\n" +"\n" +"Do you want to proceed?" +msgstr "" +"단순 설정으로 전환하면 고급 모드에서 수행된 변경 내용이 삭제됨!\n" +"\n" +"계속하시겠습니까?" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:339 +msgid "Show simplified settings" +msgstr "간단한 설정보기" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:339 +msgid "Show advanced settings" +msgstr "고급 설정보기" + +#: src/slic3r/GUI/wxExtensions.cpp:443 +msgid "Instances" +msgstr "복제본" + +#: src/slic3r/GUI/wxExtensions.cpp:447 src/slic3r/GUI/wxExtensions.cpp:592 +#, c-format +msgid "Instance %d" +msgstr "복제본 %d" + +#: src/slic3r/GUI/wxExtensions.cpp:486 +msgid "Range" +msgstr "범위" + +#: src/slic3r/GUI/wxExtensions.cpp:2570 +msgid "One layer mode" +msgstr "하나의 레이어 모드" + +#: src/slic3r/GUI/wxExtensions.cpp:2571 +msgid "Add/Del color change" +msgstr "현재 레이어의 색상 변경 마커 추가" + +#: src/slic3r/GUI/wxExtensions.cpp:2572 +msgid "Discard all color changes" +msgstr "모든 색상 변경 무시" + +#: src/slic3r/GUI/wxExtensions.cpp:2832 +#, c-format +msgid "Switch to the %s mode" +msgstr "%s 모드로 전환" + +#: src/slic3r/GUI/wxExtensions.cpp:2833 +#, c-format +msgid "Current mode is %s" +msgstr "현재 모드는 %s입니다" + +#: src/slic3r/Utils/Duet.cpp:51 +msgid "Connection to Duet works correctly." +msgstr "듀엣보드에 대한 연결이 올바르게 작동 합니다." + +#: src/slic3r/Utils/Duet.cpp:56 +msgid "Could not connect to Duet" +msgstr "듀엣보드에 연결할 수 없습니다" + +#: src/slic3r/Utils/Duet.cpp:84 src/slic3r/Utils/Duet.cpp:154 +msgid "Unknown error occured" +msgstr "알 수 없는 오류가 발생 했습니다" + +#: src/slic3r/Utils/Duet.cpp:148 +msgid "Wrong password" +msgstr "잘못된 암호" + +#: src/slic3r/Utils/Duet.cpp:151 +msgid "Could not get resources to create a new connection" +msgstr "새 연결을 만들 리소스를 가져올수 없습니다" + +#: src/slic3r/Utils/OctoPrint.cpp:69 +#, c-format +msgid "Mismatched type of print host: %s" +msgstr "일치 하지않는 인쇄 호스트 유형: %s" + +#: src/slic3r/Utils/OctoPrint.cpp:84 +msgid "Connection to OctoPrint works correctly." +msgstr "OctoPrint에 연결하면 올바르게 작동합니다." + +#: src/slic3r/Utils/OctoPrint.cpp:90 +msgid "Could not connect to OctoPrint" +msgstr "OctoPrint에 연결할 수 없습니다" + +#: src/slic3r/Utils/OctoPrint.cpp:90 +msgid "Note: OctoPrint version at least 1.1.0 is required." +msgstr "참고 : OctoPrint 버전 1.1.0 이상이 필요합니다." + +#: src/slic3r/Utils/OctoPrint.cpp:195 +msgid "Connection to Prusa SL1 works correctly." +msgstr "Prusa SL1에 대한 연결이 제대로 작동 합니다." + +#: src/slic3r/Utils/OctoPrint.cpp:200 +msgid "Could not connect to Prusa SLA" +msgstr "Prusa SLA에 연결할 수 없습니다" + +#: src/slic3r/Utils/PresetUpdater.cpp:614 +#, c-format +msgid "requires min. %s and max. %s" +msgstr "최소. %s 와 최대. %s" + +#: src/slic3r/Utils/PresetUpdater.cpp:619 +#, c-format +msgid "requires min. %s" +msgstr "최소 %s가 필요 합니다" + +#: src/slic3r/Utils/PresetUpdater.cpp:621 +#, c-format +msgid "requires max. %s" +msgstr "최대 필요 합니다. %s" + +#: src/slic3r/Utils/FixModelByWin10.cpp:219 +#: src/slic3r/Utils/FixModelByWin10.cpp:359 +msgid "Exporting source model" +msgstr "소스 모델 내보내기" + +#: src/slic3r/Utils/FixModelByWin10.cpp:235 +msgid "Failed loading the input model." +msgstr "입력 모델을 로드하지 못했습니다." + +#: src/slic3r/Utils/FixModelByWin10.cpp:242 +msgid "Repairing model by the Netfabb service" +msgstr "Netfabb 서비스에의 한 모델 복구" + +#: src/slic3r/Utils/FixModelByWin10.cpp:248 +msgid "Mesh repair failed." +msgstr "메쉬 복구에 실패 했습니다." + +#: src/slic3r/Utils/FixModelByWin10.cpp:251 +#: src/slic3r/Utils/FixModelByWin10.cpp:378 +msgid "Loading repaired model" +msgstr "복구 된 모델 로드" + +#: src/slic3r/Utils/FixModelByWin10.cpp:263 +#: src/slic3r/Utils/FixModelByWin10.cpp:270 +#: src/slic3r/Utils/FixModelByWin10.cpp:302 +msgid "Saving mesh into the 3MF container failed." +msgstr "3MF 컨테이너에 메쉬를 저장하지 못했습니다." + +#: src/slic3r/Utils/FixModelByWin10.cpp:340 +msgid "Model fixing" +msgstr "모델 고정" + +#: src/slic3r/Utils/FixModelByWin10.cpp:341 +msgid "Exporting model..." +msgstr "소스 모델 내보내기..." + +#: src/slic3r/Utils/FixModelByWin10.cpp:368 +msgid "Export of a temporary 3mf file failed" +msgstr "임시 3mf 파일을 내보내지 못했습니다" + +#: src/slic3r/Utils/FixModelByWin10.cpp:383 +msgid "Import of the repaired 3mf file failed" +msgstr "복구된 3mf 파일을 가져오지 못했습니다" + +#: src/slic3r/Utils/FixModelByWin10.cpp:385 +msgid "Repaired 3MF file does not contain any object" +msgstr "복구된 3MF 파일에 개체가 포함 되어있지 않습니다" + +#: src/slic3r/Utils/FixModelByWin10.cpp:387 +msgid "Repaired 3MF file contains more than one object" +msgstr "복구된 3MF 파일에 둘 이상의 개체가 포함되어 있습니다" + +#: src/slic3r/Utils/FixModelByWin10.cpp:389 +msgid "Repaired 3MF file does not contain any volume" +msgstr "복구 된 3MF 파일에 개체가 포함 되어있지 않습니다" + +#: src/slic3r/Utils/FixModelByWin10.cpp:391 +msgid "Repaired 3MF file contains more than one volume" +msgstr "복구된 3MF 파일에 둘 이상의 개체가 포함되어 있습니다" + +#: src/slic3r/Utils/FixModelByWin10.cpp:400 +msgid "Model repair finished" +msgstr "모델 수리 완료" + +#: src/slic3r/Utils/FixModelByWin10.cpp:406 +msgid "Model repair canceled" +msgstr "모델 복구가 취소 되었습니다" + +#: src/slic3r/Utils/FixModelByWin10.cpp:423 +msgid "Model repaired successfully" +msgstr "모델이 성공적으로 복구 되었습니다" + +#: src/slic3r/Utils/FixModelByWin10.cpp:423 +#: src/slic3r/Utils/FixModelByWin10.cpp:426 +msgid "Model Repair by the Netfabb service" +msgstr "Netfabb 서비스에의 한 모델 복구" + +#: src/slic3r/Utils/FixModelByWin10.cpp:426 +msgid "Model repair failed: \n" +msgstr "모델 복구 실패:\n" + +#: src/libslic3r/Zipper.cpp:32 +msgid "undefined error" +msgstr "정의 되지 않은 오류" + +#: src/libslic3r/Zipper.cpp:34 +msgid "too many files" +msgstr "파일이 너무 많음" + +#: src/libslic3r/Zipper.cpp:36 +msgid "file too large" +msgstr "파일이 너무 큼" + +#: src/libslic3r/Zipper.cpp:38 +msgid "unsupported method" +msgstr "지원 되지 않는 방법" + +#: src/libslic3r/Zipper.cpp:40 +msgid "unsupported encryption" +msgstr "지원 되지 않는 암호화" + +#: src/libslic3r/Zipper.cpp:42 +msgid "unsupported feature" +msgstr "지원 되지 않는 기능" + +#: src/libslic3r/Zipper.cpp:44 +msgid "failed finding central directory" +msgstr "중앙 디렉터리를 찾지 못했습니다." + +#: src/libslic3r/Zipper.cpp:46 +msgid "not a ZIP archive" +msgstr "zIP 아카이브 아님" + +#: src/libslic3r/Zipper.cpp:48 +msgid "invalid header or archive is corrupted" +msgstr "잘못 된 헤더 또는 아카이브가 손상 되었습니다" + +#: src/libslic3r/Zipper.cpp:50 +msgid "unsupported multidisk archive" +msgstr "지원 되지 않는 멀티 디스크 아카이브" + +#: src/libslic3r/Zipper.cpp:52 +msgid "decompression failed or archive is corrupted" +msgstr "압축 풀기 실패 또는 아카이브가 손상 되었습니다" + +#: src/libslic3r/Zipper.cpp:54 +msgid "compression failed" +msgstr "압축 실패" + +#: src/libslic3r/Zipper.cpp:56 +msgid "unexpected decompressed size" +msgstr "예기치 않은 압축 해제 크기" + +#: src/libslic3r/Zipper.cpp:58 +msgid "CRC-32 check failed" +msgstr "CRC-32 확인 실패" + +#: src/libslic3r/Zipper.cpp:60 +msgid "unsupported central directory size" +msgstr "지원 되지 않는 중앙 디렉터리 크기" + +#: src/libslic3r/Zipper.cpp:62 +msgid "allocation failed" +msgstr "할당 실패" + +#: src/libslic3r/Zipper.cpp:64 +msgid "file open failed" +msgstr "파일 열기 실패" + +#: src/libslic3r/Zipper.cpp:66 +msgid "file create failed" +msgstr "파일 만들기 실패" + +#: src/libslic3r/Zipper.cpp:68 +msgid "file write failed" +msgstr "파일 쓰기 실패" + +#: src/libslic3r/Zipper.cpp:70 +msgid "file read failed" +msgstr "파일 읽기 실패" + +#: src/libslic3r/Zipper.cpp:72 +msgid "file close failed" +msgstr "파일 닫기 실패" + +#: src/libslic3r/Zipper.cpp:74 +msgid "file seek failed" +msgstr "파일 검색 실패" + +#: src/libslic3r/Zipper.cpp:76 +msgid "file stat failed" +msgstr "파일 통계 실패" + +#: src/libslic3r/Zipper.cpp:78 +msgid "invalid parameter" +msgstr "잘못 된 매개 변수" + +#: src/libslic3r/Zipper.cpp:80 +msgid "invalid filename" +msgstr "잘못 된 파일 이름" + +#: src/libslic3r/Zipper.cpp:82 +msgid "buffer too small" +msgstr "버퍼가 너무 작음" + +#: src/libslic3r/Zipper.cpp:84 +msgid "internal error" +msgstr "내부 오류" + +#: src/libslic3r/Zipper.cpp:86 +msgid "file not found" +msgstr "파일을 찾을수 없다" + +#: src/libslic3r/Zipper.cpp:88 +msgid "archive is too large" +msgstr "아카이브가 너무 큼" + +#: src/libslic3r/Zipper.cpp:90 +msgid "validation failed" +msgstr "유효성 검사 실패" + +#: src/libslic3r/Zipper.cpp:92 +msgid "write calledback failed" +msgstr "쓰기 다시 실패" + +#: src/libslic3r/Zipper.cpp:102 +msgid "Error with zip archive" +msgstr "zip 아카이브와 오류가 발생 했습니다" + +#: src/libslic3r/Print.cpp:1093 +msgid "All objects are outside of the print volume." +msgstr "모든 개체가 인쇄 볼륨 외부에 있습니다." + +#: src/libslic3r/Print.cpp:1120 +msgid "Some objects are too close; your extruder will collide with them." +msgstr "일부 개체가 너무 가깝습니다. 귀하의 압출기가 그들과 충돌합니다." + +#: src/libslic3r/Print.cpp:1135 +msgid "" +"Some objects are too tall and cannot be printed without extruder collisions." +msgstr "일부 개체는 너무 크고 익스트루더 충돌없이 인쇄 할 수 없습니다." + +#: src/libslic3r/Print.cpp:1145 +msgid "The Spiral Vase option can only be used when printing a single object." +msgstr "" +"나선형 꽃병(Spiral Vase) 옵션은 단일 개체를 인쇄 할 때만 사용할 수 있습니다." + +#: src/libslic3r/Print.cpp:1147 +msgid "" +"The Spiral Vase option can only be used when printing single material " +"objects." +msgstr "" +"나선형 꽃병 옵션(Spiral Vase)은 단일 재료 객체를 인쇄 할 때만 사용할 수 있습" +"니다." + +#: src/libslic3r/Print.cpp:1155 +msgid "" +"The wipe tower is only supported if all extruders have the same nozzle " +"diameter and use filaments of the same diameter." +msgstr "" +"모든 압출기 의 노즐 직경이 동일하고 동일한 직경의 필라멘트를 사용하는 경우에" +"만 와이프 타워가 지원됩니다." + +#: src/libslic3r/Print.cpp:1159 +msgid "" +"The Wipe Tower is currently only supported for the Marlin, RepRap/Sprinter " +"and Repetier G-code flavors." +msgstr "" +"와이프 타워는 현재 말린, RepRap/Sprinter 및 리피티어에 대해서만 G-코드지원 됩" +"니다." + +#: src/libslic3r/Print.cpp:1161 +msgid "" +"The Wipe Tower is currently only supported with the relative extruder " +"addressing (use_relative_e_distances=1)." +msgstr "" +"와이프 타워는 현재 상대적 압출기 어드레싱 (use_relative_e_distances = 1)에서" +"만 지원됩니다." + +#: src/libslic3r/Print.cpp:1165 +msgid "All extruders must have the same diameter for the Wipe Tower." +msgstr "모든 압출기는 와이프 타워의 지름이 같아야 합니다." + +#: src/libslic3r/Print.cpp:1186 +msgid "" +"The Wipe Tower is only supported for multiple objects if they have equal " +"layer heights" +msgstr "" +"와이프 타워 (Wipe Tower)는 같은 레이어 높이에 경우 여러 객체에 대해서만 지원" +"됩니다" + +#: src/libslic3r/Print.cpp:1188 +msgid "" +"The Wipe Tower is only supported for multiple objects if they are printed " +"over an equal number of raft layers" +msgstr "" +"와이프 타워는 같은 수의 라프트 레이어 위에 인쇄 된 경우 여러 객체에 대해서만 " +"지원됩니다" + +#: src/libslic3r/Print.cpp:1190 +msgid "" +"The Wipe Tower is only supported for multiple objects if they are printed " +"with the same support_material_contact_distance" +msgstr "" +"와이프 타워는 동일한 support_material_contact_distance로 인쇄 된 경우 여러 객" +"체에 대해서만 지원됩니다" + +#: src/libslic3r/Print.cpp:1192 +msgid "" +"The Wipe Tower is only supported for multiple objects if they are sliced " +"equally." +msgstr "" +"와이프 타워는 똑같이 슬라이스 된 경우 여러 오브젝트에 대해서만 지원됩니다." + +#: src/libslic3r/Print.cpp:1220 +msgid "" +"The Wipe tower is only supported if all objects have the same layer height " +"profile" +msgstr "" +"모든 오브젝트의 레이어 높이 프로필이 동일한 경우에만 와이프 타워가 지원됩니다" + +#: src/libslic3r/Print.cpp:1230 +msgid "The supplied settings will cause an empty print." +msgstr "제공된 설정으로 인해 빈 인쇄가 발생합니다." + +#: src/libslic3r/Print.cpp:1247 +msgid "" +"One or more object were assigned an extruder that the printer does not have." +msgstr "하나 이상의 개체에 프린터에없는 압출기가 지정되었습니다." + +#: src/libslic3r/Print.cpp:1256 +msgid "" +"Printing with multiple extruders of differing nozzle diameters. If support " +"is to be printed with the current extruder (support_material_extruder == 0 " +"or support_material_interface_extruder == 0), all nozzles have to be of the " +"same diameter." +msgstr "" +"노즐 지름이 다른 여러 압출기로 인쇄. 지원이 현재 압출기 " +"(support_material_extruder == 0 또는 support_material_interface_extruder == " +"0)로 인쇄되는 경우 모든 노즐은 동일한 지름이어야합니다." + +#: src/libslic3r/Print.cpp:1264 +msgid "" +"For the Wipe Tower to work with the soluble supports, the support layers " +"need to be synchronized with the object layers." +msgstr "" +"와이프 타워가 가용성 지지체와 함께 작동 하려면 서포트 레이어를 오브젝트 레이" +"어와 동기화 해야 합니다." + +#: src/libslic3r/Print.cpp:1268 +msgid "" +"The Wipe Tower currently supports the non-soluble supports only if they are " +"printed with the current extruder without triggering a tool change. (both " +"support_material_extruder and support_material_interface_extruder need to be " +"set to 0)." +msgstr "" +"와이프 타워는 현재 공구 교체를 트리거하지 않고 현재의 압출기로 인쇄 하는 경우" +"에만 비가용성 서포트를 지원 합니다. (support_material_extruder과 " +"support_material_interface_extruder 모두 0으로 설정 해야 합니다.)" + +#: src/libslic3r/Print.cpp:1290 +msgid "First layer height can't be greater than nozzle diameter" +msgstr "첫번째 레이어 높이는 노즐 직경보다 클 수 없습니다" + +#: src/libslic3r/Print.cpp:1294 +msgid "Layer height can't be greater than nozzle diameter" +msgstr "레이어 높이는 노즐 직경보다 클 수 없습니다" + +#: src/libslic3r/Print.cpp:1438 +msgid "Infilling layers" +msgstr "레이어 채우기" + +#: src/libslic3r/Print.cpp:1446 +msgid "Generating skirt" +msgstr "스커트 생성" + +#: src/libslic3r/Print.cpp:1454 +msgid "Generating brim" +msgstr "브림 생성" + +#: src/libslic3r/Print.cpp:1482 +msgid "Exporting G-code" +msgstr "G 코드 내보내기" + +#: src/libslic3r/Print.cpp:1486 +msgid "Generating G-code" +msgstr "G 코드 생성" + +#: src/libslic3r/SLAPrint.cpp:58 +msgid "Slicing model" +msgstr "슬라이싱 모델" + +#: src/libslic3r/SLAPrint.cpp:59 src/libslic3r/SLAPrint.cpp:871 +msgid "Generating support points" +msgstr "서포트 지점 생성" + +#: src/libslic3r/SLAPrint.cpp:60 +msgid "Generating support tree" +msgstr "서포트 트리 생성" + +#: src/libslic3r/SLAPrint.cpp:61 +msgid "Generating pad" +msgstr "패드 생성" + +#: src/libslic3r/SLAPrint.cpp:62 +msgid "Slicing supports" +msgstr "슬라이싱 서포트즈" + +#: src/libslic3r/SLAPrint.cpp:79 +msgid "Merging slices and calculating statistics" +msgstr "슬라이스 병합 및 통계 계산" + +#: src/libslic3r/SLAPrint.cpp:80 +msgid "Rasterizing layers" +msgstr "레이어 래스터화" + +#: src/libslic3r/SLAPrint.cpp:650 +msgid "" +"Cannot proceed without support points! Add support points or disable support " +"generation." +msgstr "" +"서포트 포인트 없이 진행할 수 없습니다! 서포트 지점을 추가 하거나 서포트 생성" +"을 사용 하지 않도록 설정 합니다." + +#: src/libslic3r/SLAPrint.cpp:664 +msgid "Elevation is too low for object." +msgstr "객체 고도가 너무 낮습니다." + +#: src/libslic3r/SLAPrint.cpp:670 +msgid "" +"The endings of the support pillars will be deployed on the gap between the " +"object and the pad. 'Support base safety distance' has to be greater than " +"the 'Pad object gap' parameter to avoid this." +msgstr "" +"서포트 기둥 끝은 오브젝트와 패드 사이의 간격에 배치됩니다. 이를 방지하기 위" +"해 '베이스 서포트 안전 거리'는 '패드 오브젝트 갭' 매개변수보다 커야 합니다." + +#: src/libslic3r/SLAPrint.cpp:759 +msgid "" +"Slicing had to be stopped due to an internal error: Inconsistent slice index." +msgstr "" +"내부 오류: 일치하지 않는 슬라이스 인덱스로 인해 슬라이싱을 중지해야 했습니다." + +#: src/libslic3r/SLAPrint.cpp:954 src/libslic3r/SLAPrint.cpp:964 +#: src/libslic3r/SLAPrint.cpp:1005 +msgid "Visualizing supports" +msgstr "시각화 지원" + +#: src/libslic3r/SLAPrint.cpp:1537 +msgid "Slicing done" +msgstr "슬라이싱 완료" + +#: src/libslic3r/PrintBase.cpp:71 +msgid "Failed processing of the output_filename_format template." +msgstr "아래 output_filename_format 템플리트의 처리에 실패했습니다." + +#: src/libslic3r/PrintConfig.cpp:43 src/libslic3r/PrintConfig.cpp:44 +msgid "Printer technology" +msgstr "프린터 기술" + +#: src/libslic3r/PrintConfig.cpp:51 +msgid "Bed shape" +msgstr "배드 모양" + +#: src/libslic3r/PrintConfig.cpp:56 +msgid "Bed custom texture" +msgstr "침대 사용자 정의 질감" + +#: src/libslic3r/PrintConfig.cpp:61 +msgid "Bed custom model" +msgstr "침대 사용자 정의 모델" + +#: src/libslic3r/PrintConfig.cpp:68 +msgid "" +"This setting controls the height (and thus the total number) of the slices/" +"layers. Thinner layers give better accuracy but take more time to print." +msgstr "" +"이 설정은 슬라이스/레이어의 높이(따라서 총 수)를 제어합니다. 얇은 층은 더 나" +"은 정확성을 제공하지만 인쇄하는 데는 더 많은 시간이 걸린다." + +#: src/libslic3r/PrintConfig.cpp:75 +msgid "Max print height" +msgstr "최대 프린트 높이" + +#: src/libslic3r/PrintConfig.cpp:76 +msgid "" +"Set this to the maximum height that can be reached by your extruder while " +"printing." +msgstr "인쇄 중에 익스트루더가 도달 할 수있는 최대 높이로 설정하십시오." + +#: src/libslic3r/PrintConfig.cpp:82 +msgid "Slice gap closing radius" +msgstr "슬라이스 간격 닫힘 반경" + +#: src/libslic3r/PrintConfig.cpp:84 +msgid "" +"Cracks smaller than 2x gap closing radius are being filled during the " +"triangle mesh slicing. The gap closing operation may reduce the final print " +"resolution, therefore it is advisable to keep the value reasonably low." +msgstr "" +"삼각형 메쉬 슬라이싱 중에, 2배 간격 폐쇄 반경 보다 작은 균열이 채워집니다. " +"틈 닫기 작업은 최종 인쇄 해상도를 줄일 수 있으므로 값을 합리적으로 낮게 유지 " +"하는 것이 좋습니다." + +#: src/libslic3r/PrintConfig.cpp:92 +msgid "Hostname, IP or URL" +msgstr "호스트 이름(Hostname), IP or URL" + +#: src/libslic3r/PrintConfig.cpp:93 +msgid "" +"Slic3r can upload G-code files to a printer host. This field should contain " +"the hostname, IP address or URL of the printer host instance." +msgstr "" +"Slic3r는 프린터 호스트에 G 코드 파일을 업로드할 수 있습니다. 이 필드는 호스" +"트 이름, IP 주소 또는 프린터 호스트 복제본의 URL을 포함 해야 합니다." + +#: src/libslic3r/PrintConfig.cpp:99 +msgid "API Key / Password" +msgstr "API 키/암호" + +#: src/libslic3r/PrintConfig.cpp:100 +msgid "" +"Slic3r can upload G-code files to a printer host. This field should contain " +"the API Key or the password required for authentication." +msgstr "" +"Slic3r는 프린터 호스트에 G 코드 파일을 업로드할 수 있습니다. 이 필드는 API " +"키 또는 인증에 필요한 암호를 포함 해야 합니다." + +#: src/libslic3r/PrintConfig.cpp:106 +msgid "HTTPS CA File" +msgstr "HTTPS CA 파일" + +#: src/libslic3r/PrintConfig.cpp:107 +msgid "" +"Custom CA certificate file can be specified for HTTPS OctoPrint connections, " +"in crt/pem format. If left blank, the default OS CA certificate repository " +"is used." +msgstr "" +"사용자 지정 CA 인증서 파일은 crt/pem 형식의 HTTPS 옥토 프린트 연결에 대해 지" +"정할 수 있습니다. 비워 두면 기본 OS CA 인증서 리포지토리가 사용 됩니다." + +#: src/libslic3r/PrintConfig.cpp:121 +msgid "Avoid crossing perimeters" +msgstr "출력된 외측을 피하세요" + +#: src/libslic3r/PrintConfig.cpp:122 +msgid "" +"Optimize travel moves in order to minimize the crossing of perimeters. This " +"is mostly useful with Bowden extruders which suffer from oozing. This " +"feature slows down both the print and the G-code generation." +msgstr "" +"둘레의 교차를 최소화하기 위해 여행 이동을 최적화하십시오. 이것은 보 잉 " +"(Bowling) 압출기가 흘러 나오기 쉬운 경우에 주로 유용합니다. 이 기능을 사용하" +"면 인쇄 및 G 코드 생성 속도가 느려집니다." + +#: src/libslic3r/PrintConfig.cpp:129 src/libslic3r/PrintConfig.cpp:2027 +msgid "Other layers" +msgstr "다른 레이어" + +#: src/libslic3r/PrintConfig.cpp:130 +msgid "" +"Bed temperature for layers after the first one. Set this to zero to disable " +"bed temperature control commands in the output." +msgstr "" +"첫 번째 레이어 이후의 레이어 온도. 이 값을 0으로 설정하면 출력에서 ​​베드 온도 " +"제어 명령을 비활성화합니다." + +#: src/libslic3r/PrintConfig.cpp:132 +msgid "Bed temperature" +msgstr "배드 온도" + +#: src/libslic3r/PrintConfig.cpp:139 +msgid "" +"This custom code is inserted at every layer change, right before the Z move. " +"Note that you can use placeholder variables for all Slic3r settings as well " +"as [layer_num] and [layer_z]." +msgstr "" +"이 사용자 정의 코드는 Z 이동 직전의 모든 레이어 변경에 삽입됩니다. [Slide3r] " +"설정과 [layer_num] 및 [layer_z]에 대한 자리 표시 자 변수를 사용할 수 있습니" +"다." + +#: src/libslic3r/PrintConfig.cpp:149 +msgid "Between objects G-code" +msgstr "객체 간 G 코드" + +#: src/libslic3r/PrintConfig.cpp:150 +msgid "" +"This code is inserted between objects when using sequential printing. By " +"default extruder and bed temperature are reset using non-wait command; " +"however if M104, M109, M140 or M190 are detected in this custom code, Slic3r " +"will not add temperature commands. Note that you can use placeholder " +"variables for all Slic3r settings, so you can put a \"M109 " +"S[first_layer_temperature]\" command wherever you want." +msgstr "" +"이 코드는 순차 인쇄를 사용할 때 객체간에 삽입됩니다. 기본적으로 익스트루더 " +"및 베드 온도는 대기 모드가 아닌 명령을 사용하여 재설정됩니다. 그러나 이 사용" +"자 코드에서 M104, M109, M140 또는 M190이 감지되면 Slic3r은 온도 명령을 추가하" +"지 않습니다. 모든 Slic3r 설정에 자리 표시 변수를 사용할 수 있으므로 원하는 위" +"치에 \"M109 S [first_layer_temperature]\"명령을 넣을 수 있습니다." + +#: src/libslic3r/PrintConfig.cpp:161 +msgid "Number of solid layers to generate on bottom surfaces." +msgstr "바닥면에 생성 할 솔리드 레이어의 수." + +#: src/libslic3r/PrintConfig.cpp:162 +msgid "Bottom solid layers" +msgstr "바닥 단일 레이어" + +#: src/libslic3r/PrintConfig.cpp:167 +msgid "Bridge" +msgstr "브리지" + +#: src/libslic3r/PrintConfig.cpp:168 +msgid "" +"This is the acceleration your printer will use for bridges. Set zero to " +"disable acceleration control for bridges." +msgstr "" +"이것은 프린터가 브릿지에 사용할 가속도입니다. 브리지의 가속 제어를 사용하지 " +"않으려면 0으로 설정하십시오." + +#: src/libslic3r/PrintConfig.cpp:170 src/libslic3r/PrintConfig.cpp:313 +#: src/libslic3r/PrintConfig.cpp:840 src/libslic3r/PrintConfig.cpp:961 +#: src/libslic3r/PrintConfig.cpp:1130 src/libslic3r/PrintConfig.cpp:1183 +#: src/libslic3r/PrintConfig.cpp:1194 src/libslic3r/PrintConfig.cpp:1383 +msgid "mm/s²" +msgstr "mm/s ²" + +#: src/libslic3r/PrintConfig.cpp:176 +msgid "Bridging angle" +msgstr "브릿지 각도" + +#: src/libslic3r/PrintConfig.cpp:178 +msgid "" +"Bridging angle override. If left to zero, the bridging angle will be " +"calculated automatically. Otherwise the provided angle will be used for all " +"bridges. Use 180° for zero angle." +msgstr "" +"브리징 각도 오버라이드(override)값이. 왼쪽으로 0 일 경우 브리징 각도가 자동으" +"로 계산됩니다. 그렇지 않으면 제공된 각도가 모든 브리지에 사용됩니다. 각도 제" +"로는 180 °를 사용하십시오." + +#: src/libslic3r/PrintConfig.cpp:181 src/libslic3r/PrintConfig.cpp:758 +#: src/libslic3r/PrintConfig.cpp:1619 src/libslic3r/PrintConfig.cpp:1629 +#: src/libslic3r/PrintConfig.cpp:1858 src/libslic3r/PrintConfig.cpp:2012 +#: src/libslic3r/PrintConfig.cpp:2197 src/libslic3r/PrintConfig.cpp:2582 +#: src/libslic3r/PrintConfig.cpp:2693 +msgid "°" +msgstr "°" + +#: src/libslic3r/PrintConfig.cpp:187 +msgid "Bridges fan speed" +msgstr "브릿지 팬 속도" + +#: src/libslic3r/PrintConfig.cpp:188 +msgid "This fan speed is enforced during all bridges and overhangs." +msgstr "이 팬 속도는 모든 브릿지 및 오버행 중에 적용됩니다." + +#: src/libslic3r/PrintConfig.cpp:189 src/libslic3r/PrintConfig.cpp:770 +#: src/libslic3r/PrintConfig.cpp:1203 src/libslic3r/PrintConfig.cpp:1266 +#: src/libslic3r/PrintConfig.cpp:1511 src/libslic3r/PrintConfig.cpp:2366 +#: src/libslic3r/PrintConfig.cpp:2623 +msgid "%" +msgstr "%" + +#: src/libslic3r/PrintConfig.cpp:196 +msgid "Bridge flow ratio" +msgstr "브릿지 유량(flow)값" + +#: src/libslic3r/PrintConfig.cpp:198 +msgid "" +"This factor affects the amount of plastic for bridging. You can decrease it " +"slightly to pull the extrudates and prevent sagging, although default " +"settings are usually good and you should experiment with cooling (use a fan) " +"before tweaking this." +msgstr "" +"이 요인은 브리징을위한 플라스틱의 양에 영향을 미칩니다. 압출 성형물을 잡아 당" +"겨 처짐을 방지하기 위해 약간 줄일 수 있지만 기본 설정은 일반적으로 좋지만이 " +"문제를 해결하기 전에 냉각 (팬 사용)을 시도해야합니다." + +#: src/libslic3r/PrintConfig.cpp:208 +msgid "Bridges" +msgstr "브릿지(Bridges)" + +#: src/libslic3r/PrintConfig.cpp:210 +msgid "Speed for printing bridges." +msgstr "브릿지 인쇄 속도." + +#: src/libslic3r/PrintConfig.cpp:211 src/libslic3r/PrintConfig.cpp:592 +#: src/libslic3r/PrintConfig.cpp:600 src/libslic3r/PrintConfig.cpp:609 +#: src/libslic3r/PrintConfig.cpp:617 src/libslic3r/PrintConfig.cpp:644 +#: src/libslic3r/PrintConfig.cpp:663 src/libslic3r/PrintConfig.cpp:899 +#: src/libslic3r/PrintConfig.cpp:1026 src/libslic3r/PrintConfig.cpp:1112 +#: src/libslic3r/PrintConfig.cpp:1148 src/libslic3r/PrintConfig.cpp:1161 +#: src/libslic3r/PrintConfig.cpp:1172 src/libslic3r/PrintConfig.cpp:1225 +#: src/libslic3r/PrintConfig.cpp:1284 src/libslic3r/PrintConfig.cpp:1412 +#: src/libslic3r/PrintConfig.cpp:1586 src/libslic3r/PrintConfig.cpp:1595 +#: src/libslic3r/PrintConfig.cpp:1991 src/libslic3r/PrintConfig.cpp:2104 +msgid "mm/s" +msgstr "mm/s" + +#: src/libslic3r/PrintConfig.cpp:218 +msgid "Brim width" +msgstr "브림 폭" + +#: src/libslic3r/PrintConfig.cpp:219 +msgid "" +"Horizontal width of the brim that will be printed around each object on the " +"first layer." +msgstr "첫 번째 레이어의 각 객체 주위에 인쇄 될 가장자리의 가로 폭입니다." + +#: src/libslic3r/PrintConfig.cpp:226 +msgid "Clip multi-part objects" +msgstr "여러 파트 오브젝트 클립" + +#: src/libslic3r/PrintConfig.cpp:227 +msgid "" +"When printing multi-material objects, this settings will make Slic3r to clip " +"the overlapping object parts one by the other (2nd part will be clipped by " +"the 1st, 3rd part will be clipped by the 1st and 2nd etc)." +msgstr "" +"멀티 메터리얼(multi-material) 개체를 인쇄 할 때이 설정을 사용하면 겹치는 개" +"체 파트를 서로 겹쳐서 잘라낼 수 있습니다 (두 번째 부분은 첫 번째 부분에서 클" +"리핑되며 세 번째 부분은 첫 번째 및 두 번째 부분에서 잘립니다)." + +#: src/libslic3r/PrintConfig.cpp:234 +msgid "Colorprint height" +msgstr "컬러 인쇄 높이" + +#: src/libslic3r/PrintConfig.cpp:235 +msgid "Heights at which a filament change is to occur." +msgstr "필라멘트 체인지가 발생 하는 높이." + +#: src/libslic3r/PrintConfig.cpp:245 +msgid "Compatible printers condition" +msgstr "호환 가능한 프린터 조건" + +#: src/libslic3r/PrintConfig.cpp:246 +msgid "" +"A boolean expression using the configuration values of an active printer " +"profile. If this expression evaluates to true, this profile is considered " +"compatible with the active printer profile." +msgstr "" +"활성 프린터 프로파일의 구성 값을 사용하는 부울 표현식. 이 표현식이 true로 평" +"가되면이 프로필은 활성 프린터 프로필과 호환되는 것으로 간주됩니다." + +#: src/libslic3r/PrintConfig.cpp:260 +msgid "Compatible print profiles condition" +msgstr "호환 되는 인쇄 프로 파일 조건" + +#: src/libslic3r/PrintConfig.cpp:261 +msgid "" +"A boolean expression using the configuration values of an active print " +"profile. If this expression evaluates to true, this profile is considered " +"compatible with the active print profile." +msgstr "" +"활성 인쇄 프로 파일의 구성 값을 사용하는 부울식입니다. 이 식이 true로 평가 되" +"면, 이 프로필이 활성 인쇄 프로필과 호환 되는 것으로 간주 됩니다." + +#: src/libslic3r/PrintConfig.cpp:278 +msgid "Complete individual objects" +msgstr "개별 개체 완성" + +#: src/libslic3r/PrintConfig.cpp:279 +msgid "" +"When printing multiple objects or copies, this feature will complete each " +"object before moving onto next one (and starting it from its bottom layer). " +"This feature is useful to avoid the risk of ruined prints. Slic3r should " +"warn and prevent you from extruder collisions, but beware." +msgstr "" +"여러 객체 또는 사본을 인쇄 할 때이 객체는 다음 객체로 이동하기 전에 각 객체" +"를 완성합니다 (맨 아래 레이어에서 시작). 이 기능은 인쇄물이 망가지는 위험을 " +"피할 때 유용합니다. Slic3r은 압출기 충돌을 경고하고 예방해야하지만 조심하십시" +"오." + +#: src/libslic3r/PrintConfig.cpp:287 +msgid "Enable auto cooling" +msgstr "자동 냉각 사용" + +#: src/libslic3r/PrintConfig.cpp:288 +msgid "" +"This flag enables the automatic cooling logic that adjusts print speed and " +"fan speed according to layer printing time." +msgstr "" +"이 플래그는 레이어 인쇄 시간에 따라 인쇄 속도와 팬 속도를 조정하는 자동 냉각 " +"논리를 활성화합니다." + +#: src/libslic3r/PrintConfig.cpp:293 +msgid "Cooling tube position" +msgstr "냉각 튜브 위치" + +#: src/libslic3r/PrintConfig.cpp:294 +msgid "Distance of the center-point of the cooling tube from the extruder tip." +msgstr "압출기 팁에서 냉각 튜브의 중심점까지의 거리 " + +#: src/libslic3r/PrintConfig.cpp:301 +msgid "Cooling tube length" +msgstr "냉각 튜브 길이" + +#: src/libslic3r/PrintConfig.cpp:302 +msgid "Length of the cooling tube to limit space for cooling moves inside it." +msgstr "내부의 냉각 이동을 위해 공간을 제한하는 냉각 튜브의 길이 " + +#: src/libslic3r/PrintConfig.cpp:310 +msgid "" +"This is the acceleration your printer will be reset to after the role-" +"specific acceleration values are used (perimeter/infill). Set zero to " +"prevent resetting acceleration at all." +msgstr "" +"역할 별 가속도 값이 사용 된 후에 프린터가 재설정되는 속도입니다 (둘레 / 충" +"전). 가속을 전혀 재설정하지 않으려면 0으로 설정하십시오." + +#: src/libslic3r/PrintConfig.cpp:319 +msgid "Default filament profile" +msgstr "기본 필라멘트 프로파일" + +#: src/libslic3r/PrintConfig.cpp:320 +msgid "" +"Default filament profile associated with the current printer profile. On " +"selection of the current printer profile, this filament profile will be " +"activated." +msgstr "" +"현재 프린터 프로파일과 연관된 기본 필라멘트 프로파일. 현재 프린터 프로파일을 " +"선택하면 이 필라멘트 프로파일이 활성화됩니다." + +#: src/libslic3r/PrintConfig.cpp:326 +msgid "Default print profile" +msgstr "기본 인쇄 프로파일" + +#: src/libslic3r/PrintConfig.cpp:327 src/libslic3r/PrintConfig.cpp:2447 +#: src/libslic3r/PrintConfig.cpp:2458 +msgid "" +"Default print profile associated with the current printer profile. On " +"selection of the current printer profile, this print profile will be " +"activated." +msgstr "" +"현재 프린터 프로파일과 연관된 기본 인쇄 프로파일. 현재 프린터 프로파일을 선택" +"하면이 인쇄 프로파일이 활성화됩니다." + +#: src/libslic3r/PrintConfig.cpp:333 +msgid "Disable fan for the first" +msgstr "첫 번째 팬 사용 중지" + +#: src/libslic3r/PrintConfig.cpp:334 +msgid "" +"You can set this to a positive value to disable fan at all during the first " +"layers, so that it does not make adhesion worse." +msgstr "" +"이 값을 양수 값으로 설정하면 첫 번째 레이어에서 팬을 사용하지 않도록 설정하" +"여 접착력을 악화시키지 않습니다." + +#: src/libslic3r/PrintConfig.cpp:336 src/libslic3r/PrintConfig.cpp:971 +#: src/libslic3r/PrintConfig.cpp:1484 src/libslic3r/PrintConfig.cpp:1669 +#: src/libslic3r/PrintConfig.cpp:1730 src/libslic3r/PrintConfig.cpp:1894 +#: src/libslic3r/PrintConfig.cpp:1939 +msgid "layers" +msgstr "레이어" + +#: src/libslic3r/PrintConfig.cpp:343 +msgid "Don't support bridges" +msgstr "서포트와 브릿지를 사용하지 않음" + +#: src/libslic3r/PrintConfig.cpp:345 +msgid "" +"Experimental option for preventing support material from being generated " +"under bridged areas." +msgstr "" +"브릿지 영역 아래에 서포팅 재료가 생성되는 것을 방지하기위한 실험적 옵션." + +#: src/libslic3r/PrintConfig.cpp:351 +msgid "Distance between copies" +msgstr "복사본 간 거리" + +#: src/libslic3r/PrintConfig.cpp:352 +msgid "Distance used for the auto-arrange feature of the plater." +msgstr "플래이터(plater)의 자동 정렬 기능에 사용되는 거리입니다." + +#: src/libslic3r/PrintConfig.cpp:359 +msgid "Elephant foot compensation" +msgstr "코끼리 발(Elephant foot) 보상값" + +#: src/libslic3r/PrintConfig.cpp:361 +msgid "" +"The first layer will be shrunk in the XY plane by the configured value to " +"compensate for the 1st layer squish aka an Elephant Foot effect." +msgstr "" +"첫 번째 레이어는 구성 요소 값에 따라 XY 평면에서 수축되어 일층 스 퀴시 코끼리" +"발(Elephant Foot) 효과를 보완합니다." + +#: src/libslic3r/PrintConfig.cpp:370 +msgid "" +"This end procedure is inserted at the end of the output file. Note that you " +"can use placeholder variables for all Slic3r settings." +msgstr "" +"이 종료 절차는 출력 파일의 끝에 삽입된다. 모든 Slic3r 설정에 자리 표시자 변수" +"를 사용할 수 있다는 점에 유의하십시오." + +#: src/libslic3r/PrintConfig.cpp:380 +msgid "" +"This end procedure is inserted at the end of the output file, before the " +"printer end gcode (and before any toolchange from this filament in case of " +"multimaterial printers). Note that you can use placeholder variables for all " +"Slic3r settings. If you have multiple extruders, the gcode is processed in " +"extruder order." +msgstr "" +"이 종료 절차는 출력 파일의 끝, 프린터 종료 gcode 이전 (및 복합 재료 프린터의 " +"경우이 필라멘트에서 도구를 변경하기 전에)에 삽입됩니다. 모든 Slic3r 설정에 자" +"리 표시 자 변수를 사용할 수 있습니다. 압출기가 여러 개인 경우 gcode는 압출기 " +"순서대로 처리됩니다." + +#: src/libslic3r/PrintConfig.cpp:391 +msgid "Ensure vertical shell thickness" +msgstr "수직 쉘(shell) 두께 확인" + +#: src/libslic3r/PrintConfig.cpp:393 +msgid "" +"Add solid infill near sloping surfaces to guarantee the vertical shell " +"thickness (top+bottom solid layers)." +msgstr "" +"경사 표면 근처에 솔리드 인필을 추가하여 수직 셸 두께(상단+하단 솔리드 레이어)" +"를 보장하십시오." + +#: src/libslic3r/PrintConfig.cpp:399 +msgid "Top fill pattern" +msgstr "상단 채우기 패턴" + +#: src/libslic3r/PrintConfig.cpp:401 +msgid "" +"Fill pattern for top infill. This only affects the top visible layer, and " +"not its adjacent solid shells." +msgstr "" +"상단 채우기의 채우기 패턴. 이는 인접 한 솔리드 쉘이 아니라 보이는 상위 레이어" +"에만 영향을 줍니다." + +#: src/libslic3r/PrintConfig.cpp:409 src/libslic3r/PrintConfig.cpp:821 +#: src/libslic3r/PrintConfig.cpp:1972 +msgid "Rectilinear" +msgstr "직선면(Rectilinear)" + +#: src/libslic3r/PrintConfig.cpp:410 src/libslic3r/PrintConfig.cpp:827 +msgid "Concentric" +msgstr "동심원(Concentric)" + +#: src/libslic3r/PrintConfig.cpp:411 src/libslic3r/PrintConfig.cpp:831 +msgid "Hilbert Curve" +msgstr "힐버트 곡선(Hilbert Curve)" + +#: src/libslic3r/PrintConfig.cpp:412 src/libslic3r/PrintConfig.cpp:832 +msgid "Archimedean Chords" +msgstr "아르키메데우스(Archimedean Chords)" + +#: src/libslic3r/PrintConfig.cpp:413 src/libslic3r/PrintConfig.cpp:833 +msgid "Octagram Spiral" +msgstr "옥타그램 나선(Octagram Spiral)" + +#: src/libslic3r/PrintConfig.cpp:419 +msgid "Bottom fill pattern" +msgstr "아래쪽 채우기 패턴" + +#: src/libslic3r/PrintConfig.cpp:421 +msgid "" +"Fill pattern for bottom infill. This only affects the bottom external " +"visible layer, and not its adjacent solid shells." +msgstr "" +"하단 채우기의 채우기 패턴. 이는 인접 한 솔리드 쉘이 아니라 아래쪽에 보이는 외" +"부 레이어에만 영향을 줍니다." + +#: src/libslic3r/PrintConfig.cpp:430 src/libslic3r/PrintConfig.cpp:440 +msgid "External perimeters" +msgstr "외측 둘레" + +#: src/libslic3r/PrintConfig.cpp:432 +msgid "" +"Set this to a non-zero value to set a manual extrusion width for external " +"perimeters. If left zero, default extrusion width will be used if set, " +"otherwise 1.125 x nozzle diameter will be used. If expressed as percentage " +"(for example 200%), it will be computed over layer height." +msgstr "" +"외부 경계에 대한 수동 압출 폭을 설정하려면 이 값을 0이 아닌 값으로 설정하십시" +"오. 0인 경우 기본 압출 너비가 사용되며, 그렇지 않으면 1.125 x 노즐 직경이 사" +"용된다. 백분율(예: 200%)로 표현되는 경우, 레이어 높이에 걸쳐 계산됩니다." + +#: src/libslic3r/PrintConfig.cpp:435 src/libslic3r/PrintConfig.cpp:543 +#: src/libslic3r/PrintConfig.cpp:860 src/libslic3r/PrintConfig.cpp:872 +#: src/libslic3r/PrintConfig.cpp:992 src/libslic3r/PrintConfig.cpp:1017 +#: src/libslic3r/PrintConfig.cpp:1403 src/libslic3r/PrintConfig.cpp:1741 +#: src/libslic3r/PrintConfig.cpp:1847 src/libslic3r/PrintConfig.cpp:1915 +#: src/libslic3r/PrintConfig.cpp:2074 +msgid "mm or %" +msgstr "mm/s 또는 %" + +#: src/libslic3r/PrintConfig.cpp:442 +msgid "" +"This separate setting will affect the speed of external perimeters (the " +"visible ones). If expressed as percentage (for example: 80%) it will be " +"calculated on the perimeters speed setting above. Set to zero for auto." +msgstr "" +"이 별도의 설정은 외부 경계선(시각적 경계선)의 속도에 영향을 미친다. 백분율" +"(예: 80%)로 표현되는 경우 위의 Perimeter 속도 설정에 따라 계산된다. 자동을 위" +"해 0으로 설정한다." + +#: src/libslic3r/PrintConfig.cpp:445 src/libslic3r/PrintConfig.cpp:881 +#: src/libslic3r/PrintConfig.cpp:1700 src/libslic3r/PrintConfig.cpp:1751 +#: src/libslic3r/PrintConfig.cpp:1958 src/libslic3r/PrintConfig.cpp:2086 +msgid "mm/s or %" +msgstr "mm/s 또는 %" + +#: src/libslic3r/PrintConfig.cpp:452 +msgid "External perimeters first" +msgstr "외부 경계선 먼저" + +#: src/libslic3r/PrintConfig.cpp:454 +msgid "" +"Print contour perimeters from the outermost one to the innermost one instead " +"of the default inverse order." +msgstr "" +"기본 역순 대신 가장 바깥쪽부터 가장 안쪽까지 윤곽선을 인쇄하십시오. 타겟 TTS" +"복사하기번역 저장번역 저장번역 수정." + +#: src/libslic3r/PrintConfig.cpp:460 +msgid "Extra perimeters if needed" +msgstr "필요한 경우 추가 둘레" + +#: src/libslic3r/PrintConfig.cpp:462 +#, c-format +msgid "" +"Add more perimeters when needed for avoiding gaps in sloping walls. Slic3r " +"keeps adding perimeters, until more than 70% of the loop immediately above " +"is supported." +msgstr "" +"경사 벽의 틈을 피하기 위해 필요한 경우 더 많은 둘래(perimeter)를 추가하십시" +"오. 위의 루프의 70% of 이상이 지지될 때까지 Slic3r는 계속해서 둘ㄹ를 추가한" +"다." + +#: src/libslic3r/PrintConfig.cpp:472 +msgid "" +"The extruder to use (unless more specific extruder settings are specified). " +"This value overrides perimeter and infill extruders, but not the support " +"extruders." +msgstr "" +"사용할 압출부(더 구체적인 압출부 설정이 지정되지 않은 경우) 이 값은 경계 및 " +"압출부를 초과하지만 지원 압출자를 주입하지는 않는다." + +#: src/libslic3r/PrintConfig.cpp:484 +msgid "" +"Set this to the vertical distance between your nozzle tip and (usually) the " +"X carriage rods. In other words, this is the height of the clearance " +"cylinder around your extruder, and it represents the maximum depth the " +"extruder can peek before colliding with other printed objects." +msgstr "" +"이것을 노즐 팁과 (일반적으로) X 캐리지 로드 사이의 수직 거리로 설정하십시오. " +"다시 말하면, 이것은 당신의 압출기 주위의 틈새 실린더의 높이이며, 그것은 다른 " +"인쇄된 물체와 충돌하기 전에 압출기가 엿볼 수 있는 최대 깊이를 나타낸다." + +#: src/libslic3r/PrintConfig.cpp:494 +msgid "Radius" +msgstr "반지름" + +#: src/libslic3r/PrintConfig.cpp:495 +msgid "" +"Set this to the clearance radius around your extruder. If the extruder is " +"not centered, choose the largest value for safety. This setting is used to " +"check for collisions and to display the graphical preview in the plater." +msgstr "" +"이것을 당신의 압출기 주변의 간극 반경으로 설정하시오. 압출부가 중앙에 있지 않" +"으면 안전을 위해 가장 큰 값을 선택하십시오. 이 설정은 충돌 여부를 확인하고 플" +"래터에 그래픽 미리 보기를 표시하기 위해 사용된다." + +#: src/libslic3r/PrintConfig.cpp:505 +msgid "Extruder Color" +msgstr "익스트루더 컬러" + +#: src/libslic3r/PrintConfig.cpp:506 src/libslic3r/PrintConfig.cpp:566 +msgid "This is only used in the Slic3r interface as a visual help." +msgstr "이것은 시각적 도움말로 Slic3r 인터페이스에서만 사용된다." + +#: src/libslic3r/PrintConfig.cpp:512 +msgid "Extruder offset" +msgstr "익스트루더 오프셋" + +#: src/libslic3r/PrintConfig.cpp:513 +msgid "" +"If your firmware doesn't handle the extruder displacement you need the G-" +"code to take it into account. This option lets you specify the displacement " +"of each extruder with respect to the first one. It expects positive " +"coordinates (they will be subtracted from the XY coordinate)." +msgstr "" +"펌웨어가 압출기 위치 변경을 처리하지 못하면 G 코드를 고려해야합니다. 이 옵션" +"을 사용하면 첫 번째 것에 대한 각 압출기의 변위를 지정할 수 있습니다. 양의 좌" +"표가 필요합니다 (XY 좌표에서 뺍니다)." + +#: src/libslic3r/PrintConfig.cpp:522 +msgid "Extrusion axis" +msgstr "압출 축" + +#: src/libslic3r/PrintConfig.cpp:523 +msgid "" +"Use this option to set the axis letter associated to your printer's extruder " +"(usually E but some printers use A)." +msgstr "" +"이 옵션을 사용하여 프린터의 압출기에 연결된 축 문자를 설정합니다 (보통 E이지" +"만 일부 프린터는 A를 사용합니다)." + +#: src/libslic3r/PrintConfig.cpp:528 +msgid "Extrusion multiplier" +msgstr "압출 승수" + +#: src/libslic3r/PrintConfig.cpp:529 +msgid "" +"This factor changes the amount of flow proportionally. You may need to tweak " +"this setting to get nice surface finish and correct single wall widths. " +"Usual values are between 0.9 and 1.1. If you think you need to change this " +"more, check filament diameter and your firmware E steps." +msgstr "" +"이 요소는 비례하여 유량의 양을 변경합니다. 멋진 서페이스 마무리와 단일 벽 너" +"비를 얻기 위해이 설정을 조정해야 할 수도 있습니다. 일반적인 값은 0.9와 1.1 사" +"이입니다. 이 값을 더 변경해야한다고 판단되면 필라멘트 직경과 펌웨어 E 단계를 " +"확인하십시오." + +#: src/libslic3r/PrintConfig.cpp:537 +msgid "Default extrusion width" +msgstr "기본 압출 폭" + +#: src/libslic3r/PrintConfig.cpp:539 +msgid "" +"Set this to a non-zero value to allow a manual extrusion width. If left to " +"zero, Slic3r derives extrusion widths from the nozzle diameter (see the " +"tooltips for perimeter extrusion width, infill extrusion width etc). If " +"expressed as percentage (for example: 230%), it will be computed over layer " +"height." +msgstr "" +"수동 압출 폭을 허용하려면이 값을 0이 아닌 값으로 설정하십시오. 0으로 남겨두" +"면 Slic3r은 노즐 직경에서 압출 폭을 도출합니다 (주변 압출 폭, 성형 압출 폭 등" +"의 툴팁 참조). 백분율로 표시되는 경우 (예 : 230 %) 레이어 높이를 기준으로 계" +"산됩니다." + +#: src/libslic3r/PrintConfig.cpp:548 +msgid "Keep fan always on" +msgstr "항상 팬 켜기" + +#: src/libslic3r/PrintConfig.cpp:549 +msgid "" +"If this is enabled, fan will never be disabled and will be kept running at " +"least at its minimum speed. Useful for PLA, harmful for ABS." +msgstr "" +"이 기능을 사용하면 팬이 비활성화되지 않으며 최소한 최소 속도로 계속 회전합니" +"다. PLA에 유용하며 ABS에 해롭다." + +#: src/libslic3r/PrintConfig.cpp:554 +msgid "Enable fan if layer print time is below" +msgstr "레이어 인쇄 시간이 미만인 경우 팬 활성화" + +#: src/libslic3r/PrintConfig.cpp:555 +msgid "" +"If layer print time is estimated below this number of seconds, fan will be " +"enabled and its speed will be calculated by interpolating the minimum and " +"maximum speeds." +msgstr "" +"레이어 인쇄 시간이이 초 미만으로 예상되는 경우 팬이 활성화되고 속도는 최소 " +"및 최대 속도를 보간하여 계산됩니다." + +#: src/libslic3r/PrintConfig.cpp:557 src/libslic3r/PrintConfig.cpp:1687 +msgid "approximate seconds" +msgstr "근사치 초" + +#: src/libslic3r/PrintConfig.cpp:565 +msgid "Color" +msgstr "색상" + +#: src/libslic3r/PrintConfig.cpp:571 +msgid "Filament notes" +msgstr "필라멘트 메모" + +#: src/libslic3r/PrintConfig.cpp:572 +msgid "You can put your notes regarding the filament here." +msgstr "여기에 필라멘트에 관한 메모를 넣을 수 있다." + +#: src/libslic3r/PrintConfig.cpp:580 src/libslic3r/PrintConfig.cpp:1231 +msgid "Max volumetric speed" +msgstr "최대 체적 속도" + +#: src/libslic3r/PrintConfig.cpp:581 +msgid "" +"Maximum volumetric speed allowed for this filament. Limits the maximum " +"volumetric speed of a print to the minimum of print and filament volumetric " +"speed. Set to zero for no limit." +msgstr "" +"이 필라멘트에 허용되는 최대 체적 속도. 인쇄물의 최대 체적 속도를 인쇄 및 필라" +"멘트 체적 속도 최소로 제한한다. 제한 없음에 대해 0으로 설정하십시오." + +#: src/libslic3r/PrintConfig.cpp:590 +msgid "Loading speed" +msgstr "로딩 속도" + +#: src/libslic3r/PrintConfig.cpp:591 +msgid "Speed used for loading the filament on the wipe tower." +msgstr "와이퍼 탑(wipe)에 필라멘트를 장착하는 데 사용되는 속도. " + +#: src/libslic3r/PrintConfig.cpp:598 +msgid "Loading speed at the start" +msgstr "시작시 로딩 속도" + +#: src/libslic3r/PrintConfig.cpp:599 +msgid "Speed used at the very beginning of loading phase." +msgstr "로딩 단계의 시작에 사용 되는 속도." + +#: src/libslic3r/PrintConfig.cpp:606 +msgid "Unloading speed" +msgstr "언로딩 스피드" + +#: src/libslic3r/PrintConfig.cpp:607 +msgid "" +"Speed used for unloading the filament on the wipe tower (does not affect " +"initial part of unloading just after ramming)." +msgstr "" +"와이퍼 타워에서 필라멘트를 언로드하는 데 사용되는 속도(램핑 후 바로 언로딩의 " +"초기 부분에는 영향을 주지 않음)." + +#: src/libslic3r/PrintConfig.cpp:615 +msgid "Unloading speed at the start" +msgstr "시작 시 언로드 속도" + +#: src/libslic3r/PrintConfig.cpp:616 +msgid "" +"Speed used for unloading the tip of the filament immediately after ramming." +msgstr "속도는 램 밍 직후 필 라 멘 트의 팁을 언로딩 하는 데 사용 됩니다." + +#: src/libslic3r/PrintConfig.cpp:623 +msgid "Delay after unloading" +msgstr "언로드 후 딜레이" + +#: src/libslic3r/PrintConfig.cpp:624 +msgid "" +"Time to wait after the filament is unloaded. May help to get reliable " +"toolchanges with flexible materials that may need more time to shrink to " +"original dimensions." +msgstr "" +"필라멘트를 내린 후 기다리는 시간. 원래 치수로 축소하는 데, 더 많은 시간이 필" +"요할 수 있는 유연한 재료로 신뢰할 수있는 공구 교환을 얻을 수 있습니다." + +#: src/libslic3r/PrintConfig.cpp:633 +msgid "Number of cooling moves" +msgstr "쿨링 이동 숫자" + +#: src/libslic3r/PrintConfig.cpp:634 +msgid "" +"Filament is cooled by being moved back and forth in the cooling tubes. " +"Specify desired number of these moves." +msgstr "" +"필라멘트는 쿨링 튜브에서 앞뒤로 이동 하여 냉각 됩니다. 이러한 이동의 원하는 " +"값을 지정 합니다." + +#: src/libslic3r/PrintConfig.cpp:642 +msgid "Speed of the first cooling move" +msgstr "첫 번째 냉각 이동 속도" + +#: src/libslic3r/PrintConfig.cpp:643 +msgid "Cooling moves are gradually accelerating beginning at this speed." +msgstr "냉각 속도가 서서히 빨라지고 있습니다." + +#: src/libslic3r/PrintConfig.cpp:650 +msgid "Minimal purge on wipe tower" +msgstr "와이프(wipe) 탑의 최소 퍼지" + +#: src/libslic3r/PrintConfig.cpp:651 +msgid "" +"After a tool change, the exact position of the newly loaded filament inside " +"the nozzle may not be known, and the filament pressure is likely not yet " +"stable. Before purging the print head into an infill or a sacrificial " +"object, Slic3r will always prime this amount of material into the wipe tower " +"to produce successive infill or sacrificial object extrusions reliably." +msgstr "" +"공구가 변경 된 후 노즐 내부에 새로 로드 된 필라멘트의 정확한 위치를 알 수 없" +"으며, 필라멘트 압력이 아직 안정적이지 않을 수 있습니다. 프린트 헤드를 인필 또" +"는 희생(sacrificial) 객체로 소거 하기 전에 Slic3r는 항상이 양의 재료를 와이" +"프 탑에 넣어 연속적인 채우기 또는 희생(sacrificial) 객체 돌출을 안정적으로 생" +"성 합니다." + +#: src/libslic3r/PrintConfig.cpp:655 +msgid "mm³" +msgstr "mm ³" + +#: src/libslic3r/PrintConfig.cpp:661 +msgid "Speed of the last cooling move" +msgstr "마지막 냉각 이동 속도" + +#: src/libslic3r/PrintConfig.cpp:662 +msgid "Cooling moves are gradually accelerating towards this speed." +msgstr "냉각은 이 속도쪽으로 점차 가속화되고 있습니다. " + +#: src/libslic3r/PrintConfig.cpp:669 +msgid "Filament load time" +msgstr "필라멘트 로드 시간" + +#: src/libslic3r/PrintConfig.cpp:670 +msgid "" +"Time for the printer firmware (or the Multi Material Unit 2.0) to load a new " +"filament during a tool change (when executing the T code). This time is " +"added to the total print time by the G-code time estimator." +msgstr "" +"프린터 펌웨어 (또는 MMU 2.0)가 공구를 변경하는 동안(T 코드를 실행할 때) 새필" +"라멘트를 로드하는 시간입니다. 이 시간은 G 코드 시간 추정기에 의해 총 인쇄 시" +"간에 추가 됩니다." + +#: src/libslic3r/PrintConfig.cpp:677 +msgid "Ramming parameters" +msgstr "래밍 파라미터" + +#: src/libslic3r/PrintConfig.cpp:678 +msgid "" +"This string is edited by RammingDialog and contains ramming specific " +"parameters." +msgstr "" +"이 문자열은 RammingDialog에 의해 편집되고 래밍 특정 매개 변수를 포함합니다." + +#: src/libslic3r/PrintConfig.cpp:684 +msgid "Filament unload time" +msgstr "필라멘트 언로드 시간" + +#: src/libslic3r/PrintConfig.cpp:685 +msgid "" +"Time for the printer firmware (or the Multi Material Unit 2.0) to unload a " +"filament during a tool change (when executing the T code). This time is " +"added to the total print time by the G-code time estimator." +msgstr "" +"프린터 펌웨어 (또는 MMU2.0)가 공구 교환 중에 필라멘트를 언로드하기 위한 시간" +"입니다 (T 코드를 실행할 때). 이 시간은 G 코드 시간추정기에 의해 총 인쇄 시간" +"에 추가 됩니다." + +#: src/libslic3r/PrintConfig.cpp:693 +msgid "" +"Enter your filament diameter here. Good precision is required, so use a " +"caliper and do multiple measurements along the filament, then compute the " +"average." +msgstr "" +"여기에 필라멘트 직경을 입력하십시오. 정밀도가 필요하므로 캘리퍼를 사용하여 필" +"라멘트를 따라 여러 번 측정 한 다음 평균을 계산하십시오." + +#: src/libslic3r/PrintConfig.cpp:700 +msgid "Density" +msgstr "밀도" + +#: src/libslic3r/PrintConfig.cpp:701 +msgid "" +"Enter your filament density here. This is only for statistical information. " +"A decent way is to weigh a known length of filament and compute the ratio of " +"the length to volume. Better is to calculate the volume directly through " +"displacement." +msgstr "" +"여기서 필라멘트 밀도를 입력하십시오. 이것은 통계 정보 용입니다. 괜찮은 방법" +"은 알려진 길이의 필라멘트의 무게를 측정하고 길이와 볼륨의 비율을 계산하는 것" +"입니다. 변위를 통해 직접적으로 부피를 계산하는 것이 더 좋습니다." + +#: src/libslic3r/PrintConfig.cpp:704 +msgid "g/cm³" +msgstr "g/cm³" + +#: src/libslic3r/PrintConfig.cpp:709 +msgid "Filament type" +msgstr "필라멘트 타입" + +#: src/libslic3r/PrintConfig.cpp:710 +msgid "The filament material type for use in custom G-codes." +msgstr "사용자 지정 G 코드에 사용할 필라멘트재료 유형입니다." + +#: src/libslic3r/PrintConfig.cpp:736 +msgid "Soluble material" +msgstr "수용성 재료" + +#: src/libslic3r/PrintConfig.cpp:737 +msgid "Soluble material is most likely used for a soluble support." +msgstr "수용성 재료눈 물에 녹는 서포트에 가장 많이 사용된다." + +#: src/libslic3r/PrintConfig.cpp:743 +msgid "" +"Enter your filament cost per kg here. This is only for statistical " +"information." +msgstr "필라멘트(kg당) 비용을 여기에 입력하십시오. 통계를 내기 위해서 입니다." + +#: src/libslic3r/PrintConfig.cpp:744 +msgid "money/kg" +msgstr "원(\\)/kg" + +#: src/libslic3r/PrintConfig.cpp:753 +msgid "Fill angle" +msgstr "채움 각도" + +#: src/libslic3r/PrintConfig.cpp:755 +msgid "" +"Default base angle for infill orientation. Cross-hatching will be applied to " +"this. Bridges will be infilled using the best direction Slic3r can detect, " +"so this setting does not affect them." +msgstr "" +"본 오리엔테이션 방향의 기본 각도입니다. 해칭이 적용될 것입니다. Slic3r이 감" +"지 할 수있는 최상의 방향을 사용하여 브릿징이 채워지므로이 설정은 영향을 미치" +"지 않습니다." + +#: src/libslic3r/PrintConfig.cpp:767 +msgid "Fill density" +msgstr "채우기(fill) 밀도" + +#: src/libslic3r/PrintConfig.cpp:769 +msgid "Density of internal infill, expressed in the range 0% - 100%." +msgstr "0 % - 100 % 범위로 표현 된 내부 채움(infill)의 밀도." + +#: src/libslic3r/PrintConfig.cpp:804 +msgid "Fill pattern" +msgstr "채우기(fill) 패턴" + +#: src/libslic3r/PrintConfig.cpp:806 +msgid "Fill pattern for general low-density infill." +msgstr "일반 낮은 밀도 채움의 패턴." + +#: src/libslic3r/PrintConfig.cpp:822 +msgid "Grid" +msgstr "그리드(Grid)" + +#: src/libslic3r/PrintConfig.cpp:823 +msgid "Triangles" +msgstr "삼각형(Triangles)" + +#: src/libslic3r/PrintConfig.cpp:824 +msgid "Stars" +msgstr "별(Stars)" + +#: src/libslic3r/PrintConfig.cpp:825 +msgid "Cubic" +msgstr "큐빅" + +#: src/libslic3r/PrintConfig.cpp:826 +msgid "Line" +msgstr "선(Line)" + +#: src/libslic3r/PrintConfig.cpp:828 src/libslic3r/PrintConfig.cpp:1974 +msgid "Honeycomb" +msgstr "벌집" + +#: src/libslic3r/PrintConfig.cpp:829 +msgid "3D Honeycomb" +msgstr "3D 벌집" + +#: src/libslic3r/PrintConfig.cpp:830 +msgid "Gyroid" +msgstr "자이로이드(Gyroid)" + +#: src/libslic3r/PrintConfig.cpp:837 src/libslic3r/PrintConfig.cpp:846 +#: src/libslic3r/PrintConfig.cpp:854 src/libslic3r/PrintConfig.cpp:887 +msgid "First layer" +msgstr "첫 레이어" + +#: src/libslic3r/PrintConfig.cpp:838 +msgid "" +"This is the acceleration your printer will use for first layer. Set zero to " +"disable acceleration control for first layer." +msgstr "" +"이것은 프린터가 첫 번째 레이어에 사용할 가속도입니다. 0을 설정하면 첫 번째 레" +"이어에 대한 가속 제어가 사용되지 않습니다." + +#: src/libslic3r/PrintConfig.cpp:847 +msgid "" +"Heated build plate temperature for the first layer. Set this to zero to " +"disable bed temperature control commands in the output." +msgstr "" +"첫 번째 레이어에 대한 빌드 플레이트 온도를 가열. 이 값을 0으로 설정하면 출력" +"에서 ​​베드 온도 제어 명령을 비활성화합니다." + +#: src/libslic3r/PrintConfig.cpp:856 +msgid "" +"Set this to a non-zero value to set a manual extrusion width for first " +"layer. You can use this to force fatter extrudates for better adhesion. If " +"expressed as percentage (for example 120%) it will be computed over first " +"layer height. If set to zero, it will use the default extrusion width." +msgstr "" +"첫 번째 레이어의 수동 압출 폭을 설정하려면이 값을 0이 아닌 값으로 설정합니" +"다. 이 방법을 사용하면보다 우수한 접착력을 위해 더 두꺼운 압출 성형물을 만들 " +"수 있습니다. 백분율 (예 : 120 %)로 표현하면 첫 번째 레이어 높이를 기준으로 계" +"산됩니다. 0으로 설정하면 기본 압출 폭이 사용됩니다." + +#: src/libslic3r/PrintConfig.cpp:868 +msgid "" +"When printing with very low layer heights, you might still want to print a " +"thicker bottom layer to improve adhesion and tolerance for non perfect build " +"plates. This can be expressed as an absolute value or as a percentage (for " +"example: 150%) over the default layer height." +msgstr "" +"매우 낮은 층의 높이로 인쇄할 때, 당신은 여전히 완벽하지 않은 빌드 플레이트의 " +"부착력과 허용오차를 개선하기 위해 더 두꺼운 바닥 층을 인쇄하기를 원할 수 있" +"다. 이것은 절대값 또는 기본 계층 높이에 대한 백분율(예: 150%)로 표시할 수 있" +"다." + +#: src/libslic3r/PrintConfig.cpp:877 +msgid "First layer speed" +msgstr "첫 레이어 속도" + +#: src/libslic3r/PrintConfig.cpp:878 +msgid "" +"If expressed as absolute value in mm/s, this speed will be applied to all " +"the print moves of the first layer, regardless of their type. If expressed " +"as a percentage (for example: 40%) it will scale the default speeds." +msgstr "" +"절대값(mm/s)으로 표현되는 경우, 이 속도는 유형에 관계없이 첫 번째 층의 모든 " +"인쇄 이동에 적용된다. 백분율(예: 40%)로 표현되는 경우 기본 속도를 스케일링한" +"다." + +#: src/libslic3r/PrintConfig.cpp:888 +msgid "" +"Extruder temperature for first layer. If you want to control temperature " +"manually during print, set this to zero to disable temperature control " +"commands in the output file." +msgstr "" +"첫 번째 층의 외부 온도. 인쇄 중에 온도를 수동으로 제어하려면 출력 파일에서 온" +"도 제어 명령을 사용하지 않으려면 이 값을 0으로 설정하십시오." + +#: src/libslic3r/PrintConfig.cpp:897 +msgid "" +"Speed for filling small gaps using short zigzag moves. Keep this reasonably " +"low to avoid too much shaking and resonance issues. Set zero to disable gaps " +"filling." +msgstr "" +"짧은 지그재그로 작은 틈을 메우기 위한 속도. 너무 많은 진동과 공진 문제를 피하" +"기 위해 이것을 합리적으로 낮게 유지한다. 간격 채우기를 사용하지 않으려면 0을 " +"설정하십시오." + +#: src/libslic3r/PrintConfig.cpp:905 +msgid "Verbose G-code" +msgstr "세부 G-코드" + +#: src/libslic3r/PrintConfig.cpp:906 +msgid "" +"Enable this to get a commented G-code file, with each line explained by a " +"descriptive text. If you print from SD card, the additional weight of the " +"file could make your firmware slow down." +msgstr "" +"설명 텍스트로 설명되는 각 행과 함께 코멘트된 G-code 파일을 가져오려면 이 옵션" +"을 선택하십시오. 만일 당신이 SD카드로 인쇄한다면, 파일의 추가 무게로 인해 펌" +"웨어의 속도가 느려질 수 있다." + +#: src/libslic3r/PrintConfig.cpp:913 +msgid "G-code flavor" +msgstr "G-code 형식" + +#: src/libslic3r/PrintConfig.cpp:914 +msgid "" +"Some G/M-code commands, including temperature control and others, are not " +"universal. Set this option to your printer's firmware to get a compatible " +"output. The \"No extrusion\" flavor prevents Slic3r from exporting any " +"extrusion value at all." +msgstr "" +"온도 조절 등을 포함한 일부 G/M-코드 명령은 보편적이지 않습니다. 호환되는 출력" +"을 얻으려면 보드에 적제된 프린터의 펌웨어로 설정하십시오. \"압출 없음\" 형식" +"은 Slic3r가 어떠한 압출 값도 출력하지 못하게 합니다." + +#: src/libslic3r/PrintConfig.cpp:937 +msgid "No extrusion" +msgstr "압출 없음" + +#: src/libslic3r/PrintConfig.cpp:942 +msgid "Label objects" +msgstr "레이블 개체" + +#: src/libslic3r/PrintConfig.cpp:943 +msgid "" +"Enable this to add comments into the G-Code labeling print moves with what " +"object they belong to, which is useful for the Octoprint CancelObject " +"plugin. This settings is NOT compatible with Single Extruder Multi Material " +"setup and Wipe into Object / Wipe into Infill." +msgstr "" +"이 기능을 사용 하 여 G 코드 레이블 인쇄에 주석이 속해 있는 객체와 함께 이동 " +"하 여 주석을 추가할 수 있으며,이는 옥 토 프린트 캔 커 작업 플러그인에 유용 합" +"니다. 이 설정은 단일 압출 기 다중 재료 설정과 호환 되지 않으며 객체를 닦아 " +"내 고 채우기로 닦습니다." + +#: src/libslic3r/PrintConfig.cpp:950 +msgid "High extruder current on filament swap" +msgstr "필라멘트스왑에 높은 압출 기 전류" + +#: src/libslic3r/PrintConfig.cpp:951 +msgid "" +"It may be beneficial to increase the extruder motor current during the " +"filament exchange sequence to allow for rapid ramming feed rates and to " +"overcome resistance when loading a filament with an ugly shaped tip." +msgstr "" +"필라멘트 교환 동안 압출기 모터 전류를 증가 시키는 것이 유리할 수 있으며, 이" +"는 빠른 래밍 공급 속도를 가능 하게하고, 불규칙한 모양의 필라멘트를 로딩할때 " +"저항을 극복하기 위한것이다." + +#: src/libslic3r/PrintConfig.cpp:959 +msgid "" +"This is the acceleration your printer will use for infill. Set zero to " +"disable acceleration control for infill." +msgstr "" +"이것은 당신 프린터의 채움 가속력이다. 주입에 대한 가속 제어를 비활성화하려면 " +"0을 설정하십시오." + +#: src/libslic3r/PrintConfig.cpp:967 +msgid "Combine infill every" +msgstr "다음 시간마다 결합" + +#: src/libslic3r/PrintConfig.cpp:969 +msgid "" +"This feature allows to combine infill and speed up your print by extruding " +"thicker infill layers while preserving thin perimeters, thus accuracy." +msgstr "" +"이 기능은 인필을 결합하고 얇은 주변기기를 보존하면서 두꺼운 인필 층을 압출하" +"여 인쇄 속도를 높일 수 있도록 하여 정확도를 높인다." + +#: src/libslic3r/PrintConfig.cpp:972 +msgid "Combine infill every n layers" +msgstr "모든 n개 층을 채우기 위해 결합" + +#: src/libslic3r/PrintConfig.cpp:978 +msgid "Infill extruder" +msgstr "채움(Infill) 익스트루더" + +#: src/libslic3r/PrintConfig.cpp:980 +msgid "The extruder to use when printing infill." +msgstr "채움으로 사용할 익스트루더." + +#: src/libslic3r/PrintConfig.cpp:988 +msgid "" +"Set this to a non-zero value to set a manual extrusion width for infill. If " +"left zero, default extrusion width will be used if set, otherwise 1.125 x " +"nozzle diameter will be used. You may want to use fatter extrudates to speed " +"up the infill and make your parts stronger. If expressed as percentage (for " +"example 90%) it will be computed over layer height." +msgstr "" +"채움에 수동 압출 폭을 설정하려면이 값을 0이 아닌 값으로 설정합니다. 0으로 설" +"정하면 설정된 경우 기본 압출 폭이 사용되고 그렇지 않으면 1.125 x 노즐 직경이 " +"사용됩니다. 채움 속도를 높이고 부품을 더 강하게 만들려면보다 큰 압출 성형물" +"을 사용하는 것이 좋습니다. 백분율 (예 : 90 %)로 표현하면 레이어 높이를 기준으" +"로 계산됩니다." + +#: src/libslic3r/PrintConfig.cpp:997 +msgid "Infill before perimeters" +msgstr "둘레보다 앞쪽에 채움" + +#: src/libslic3r/PrintConfig.cpp:998 +msgid "" +"This option will switch the print order of perimeters and infill, making the " +"latter first." +msgstr "이 옵션은 외부출력과 채움 인쇄 순서를 바꾸어, 후자를 먼저 만든다." + +#: src/libslic3r/PrintConfig.cpp:1003 +msgid "Only infill where needed" +msgstr "필요한 경우 채음" + +#: src/libslic3r/PrintConfig.cpp:1005 +msgid "" +"This option will limit infill to the areas actually needed for supporting " +"ceilings (it will act as internal support material). If enabled, slows down " +"the G-code generation due to the multiple checks involved." +msgstr "" +"이 옵션은 천장 지원에 실제로 필요한 영역에만 적용된다(내부 서포트 재료 역할" +"을 할 것이다). 활성화된 경우 관련된 여러 번의 점검으로 인해 G-code 생성 속도" +"를 늦춰라." + +#: src/libslic3r/PrintConfig.cpp:1012 +msgid "Infill/perimeters overlap" +msgstr "채움/둘레 겹침(perimeters overlap)" + +#: src/libslic3r/PrintConfig.cpp:1014 +msgid "" +"This setting applies an additional overlap between infill and perimeters for " +"better bonding. Theoretically this shouldn't be needed, but backlash might " +"cause gaps. If expressed as percentage (example: 15%) it is calculated over " +"perimeter extrusion width." +msgstr "" +"이 설정은 더 나은 본딩을 위해 충전 및 둘레 사이에 추가 겹침을 적용합니다. 이" +"론적으로 이것은 필요하지 않아야하지만 백래시가 갭을 유발할 수 있습니다. 백분" +"율 (예 : 15 %)로 표시되는 경우 경계 압출 폭을 기준으로 계산됩니다." + +#: src/libslic3r/PrintConfig.cpp:1025 +msgid "Speed for printing the internal fill. Set to zero for auto." +msgstr "내부 채우기 인쇄 속도. 자동으로 0으로 설정하십시오." + +#: src/libslic3r/PrintConfig.cpp:1033 +msgid "Inherits profile" +msgstr "프로필 상속" + +#: src/libslic3r/PrintConfig.cpp:1034 +msgid "Name of the profile, from which this profile inherits." +msgstr "이 프로파일이 상속되는 프로파일의 이름." + +#: src/libslic3r/PrintConfig.cpp:1047 +msgid "Interface shells" +msgstr "인터페이스 셸(shells)" + +#: src/libslic3r/PrintConfig.cpp:1048 +msgid "" +"Force the generation of solid shells between adjacent materials/volumes. " +"Useful for multi-extruder prints with translucent materials or manual " +"soluble support material." +msgstr "" +"인접 재료/볼륨 사이에 고체 쉘 생성을 강제하십시오. 반투명 재료 또는 수동 수용" +"성 서포트 재료를 사용한 다중 압ㅊ기 인쇄에 유용함." + +#: src/libslic3r/PrintConfig.cpp:1057 +msgid "" +"This custom code is inserted at every layer change, right after the Z move " +"and before the extruder moves to the first layer point. Note that you can " +"use placeholder variables for all Slic3r settings as well as [layer_num] and " +"[layer_z]." +msgstr "" +"이 사용자 정의 코드는 Z 이동 직후와 압출부가 첫 번째 레이어 포인트로 이동하" +"기 전에 모든 레이어 변경 시 삽입된다. 모든 Slic3r 설정뿐만 아니라 " +"[layer_num] 및 [layer_z]에 자리 표시자 변수를 사용할 수 있다는 점에 유의하십" +"시오." + +#: src/libslic3r/PrintConfig.cpp:1068 +msgid "Supports remaining times" +msgstr "남은 시간 지원" + +#: src/libslic3r/PrintConfig.cpp:1069 +msgid "" +"Emit M73 P[percent printed] R[remaining time in minutes] at 1 minute " +"intervals into the G-code to let the firmware show accurate remaining time. " +"As of now only the Prusa i3 MK3 firmware recognizes M73. Also the i3 MK3 " +"firmware supports M73 Qxx Sxx for the silent mode." +msgstr "" +"G 코드에 1 분 간격으로 M73 P [퍼센트 인쇄] R[remaining time in minutes]을 방" +"출하여 펌웨어가 정확한 잔여 시간을 표시 하도록 합니다. 현재만 Prusa i3 MK3 펌" +"웨어는 M73를 인식 하 고 있습니다. 또한 i3 MK3 펌웨어는 자동 모드에서 M73 Qxx " +"Sxx를 지원 합니다." + +#: src/libslic3r/PrintConfig.cpp:1077 +msgid "Supports stealth mode" +msgstr "자동 모드 지원" + +#: src/libslic3r/PrintConfig.cpp:1078 +msgid "The firmware supports stealth mode" +msgstr "펌웨어는 스텔스 모드를 지원 합니다" + +#: src/libslic3r/PrintConfig.cpp:1102 +msgid "Maximum feedrate X" +msgstr "최대 이송 속도 X" + +#: src/libslic3r/PrintConfig.cpp:1103 +msgid "Maximum feedrate Y" +msgstr "최대 이송 속도 Y" + +#: src/libslic3r/PrintConfig.cpp:1104 +msgid "Maximum feedrate Z" +msgstr "최대 이송 속도 Z" + +#: src/libslic3r/PrintConfig.cpp:1105 +msgid "Maximum feedrate E" +msgstr "최대 이송 속도 E" + +#: src/libslic3r/PrintConfig.cpp:1108 +msgid "Maximum feedrate of the X axis" +msgstr "X 축의 최대 이송 속도" + +#: src/libslic3r/PrintConfig.cpp:1109 +msgid "Maximum feedrate of the Y axis" +msgstr "Y 축의 최대 이송 속도" + +#: src/libslic3r/PrintConfig.cpp:1110 +msgid "Maximum feedrate of the Z axis" +msgstr "Z 축의 최대 이송 속도" + +#: src/libslic3r/PrintConfig.cpp:1111 +msgid "Maximum feedrate of the E axis" +msgstr "E 축의 최대 이송 속도" + +#: src/libslic3r/PrintConfig.cpp:1120 +msgid "Maximum acceleration X" +msgstr "최대 가속도 X" + +#: src/libslic3r/PrintConfig.cpp:1121 +msgid "Maximum acceleration Y" +msgstr "최대 가속도 Y" + +#: src/libslic3r/PrintConfig.cpp:1122 +msgid "Maximum acceleration Z" +msgstr "최대 가속 Z" + +#: src/libslic3r/PrintConfig.cpp:1123 +msgid "Maximum acceleration E" +msgstr "최대 가속 E" + +#: src/libslic3r/PrintConfig.cpp:1126 +msgid "Maximum acceleration of the X axis" +msgstr "X 축의 최대 가속도" + +#: src/libslic3r/PrintConfig.cpp:1127 +msgid "Maximum acceleration of the Y axis" +msgstr "Y 축의 최대 가속도" + +#: src/libslic3r/PrintConfig.cpp:1128 +msgid "Maximum acceleration of the Z axis" +msgstr "Z 축의 최대 가속도" + +#: src/libslic3r/PrintConfig.cpp:1129 +msgid "Maximum acceleration of the E axis" +msgstr "E 축의 최대 가속도" + +#: src/libslic3r/PrintConfig.cpp:1138 +msgid "Maximum jerk X" +msgstr "최대 저크(jerk) X" + +#: src/libslic3r/PrintConfig.cpp:1139 +msgid "Maximum jerk Y" +msgstr "최대 저크(jerk) Y" + +#: src/libslic3r/PrintConfig.cpp:1140 +msgid "Maximum jerk Z" +msgstr "최대 저크(jerk) Z" + +#: src/libslic3r/PrintConfig.cpp:1141 +msgid "Maximum jerk E" +msgstr "최대 저크(jerk) E" + +#: src/libslic3r/PrintConfig.cpp:1144 +msgid "Maximum jerk of the X axis" +msgstr "X축 최대 저크(jerk)" + +#: src/libslic3r/PrintConfig.cpp:1145 +msgid "Maximum jerk of the Y axis" +msgstr "Y축 최대 저크는(jerk)" + +#: src/libslic3r/PrintConfig.cpp:1146 +msgid "Maximum jerk of the Z axis" +msgstr "Z축 최대 저크(jerk)" + +#: src/libslic3r/PrintConfig.cpp:1147 +msgid "Maximum jerk of the E axis" +msgstr "E축 최대 저크(jerk)" + +#: src/libslic3r/PrintConfig.cpp:1158 +msgid "Minimum feedrate when extruding" +msgstr "압출시 최소 공급 속도" + +#: src/libslic3r/PrintConfig.cpp:1160 +msgid "Minimum feedrate when extruding (M205 S)" +msgstr "압출 시 최소 이송 속도 (M205 S)" + +#: src/libslic3r/PrintConfig.cpp:1169 +msgid "Minimum travel feedrate" +msgstr "최소 이송 속도" + +#: src/libslic3r/PrintConfig.cpp:1171 +msgid "Minimum travel feedrate (M205 T)" +msgstr "최소 이동 이송 속도 (M205 T)" + +#: src/libslic3r/PrintConfig.cpp:1180 +msgid "Maximum acceleration when extruding" +msgstr "압출시 최대 가속도" + +#: src/libslic3r/PrintConfig.cpp:1182 +msgid "Maximum acceleration when extruding (M204 S)" +msgstr "압출 시 최대 가속도 (M204 S)" + +#: src/libslic3r/PrintConfig.cpp:1191 +msgid "Maximum acceleration when retracting" +msgstr "리트렉션 최대 가속도" + +#: src/libslic3r/PrintConfig.cpp:1193 +msgid "Maximum acceleration when retracting (M204 T)" +msgstr "후퇴 시 최대 가속도 (M204 T)" + +#: src/libslic3r/PrintConfig.cpp:1201 src/libslic3r/PrintConfig.cpp:1210 +msgid "Max" +msgstr "최대" + +#: src/libslic3r/PrintConfig.cpp:1202 +msgid "This setting represents the maximum speed of your fan." +msgstr "이 설정은 팬의 최대 속도를 나타냅니다." + +#: src/libslic3r/PrintConfig.cpp:1211 +#, c-format +msgid "" +"This is the highest printable layer height for this extruder, used to cap " +"the variable layer height and support layer height. Maximum recommended " +"layer height is 75% of the extrusion width to achieve reasonable inter-layer " +"adhesion. If set to 0, layer height is limited to 75% of the nozzle diameter." +msgstr "" +"이것은이 익스트루더의 가장 높은 인쇄 가능 층 높이이며, 가변 층 높이 및 지지" +"층 높이를 캡하는 데 사용됩니다. 합당한 층간 접착력을 얻기 위해 최대 권장 높이" +"는 압출 폭의 75% of 입니다. 0으로 설정하면 층 높이가 노즐 지름의 75% of로 제" +"한됩니다." + +#: src/libslic3r/PrintConfig.cpp:1221 +msgid "Max print speed" +msgstr "최대 프린트 속도" + +#: src/libslic3r/PrintConfig.cpp:1222 +msgid "" +"When setting other speed settings to 0 Slic3r will autocalculate the optimal " +"speed in order to keep constant extruder pressure. This experimental setting " +"is used to set the highest print speed you want to allow." +msgstr "" +"다른 속도 설정을 0으로 설정할 경우, 지속적인 외부 압력을 유지하기 위해 최적" +"의 속도를 자동 계산한다. 이 실험 설정은 허용할 최대 인쇄 속도를 설정하는 데 " +"사용된다." + +#: src/libslic3r/PrintConfig.cpp:1232 +msgid "" +"This experimental setting is used to set the maximum volumetric speed your " +"extruder supports." +msgstr "" +"이 실험 설정은 압출기가 지원하는 최대 체적 속도를 설정하기 위해 사용된다." + +#: src/libslic3r/PrintConfig.cpp:1241 +msgid "Max volumetric slope positive" +msgstr "최대 체적 기울기 양" + +#: src/libslic3r/PrintConfig.cpp:1242 src/libslic3r/PrintConfig.cpp:1253 +msgid "" +"This experimental setting is used to limit the speed of change in extrusion " +"rate. A value of 1.8 mm³/s² ensures, that a change from the extrusion rate " +"of 1.8 mm³/s (0.45mm extrusion width, 0.2mm extrusion height, feedrate 20 mm/" +"s) to 5.4 mm³/s (feedrate 60 mm/s) will take at least 2 seconds." +msgstr "" +"이 실험 설정은 돌출율의 변화 속도를 제한하는데 사용된다. 1.8mm3/s2 값은 " +"1.8mm3/s(0.45mm 압출 폭, 0.2mm 압출 높이, 공급 속도 20mm/s)에서 5.4mm3/s(공" +"급 속도 60mm/s)로 변경하는 데 최소 2초 이상 걸린다." + +#: src/libslic3r/PrintConfig.cpp:1246 src/libslic3r/PrintConfig.cpp:1257 +msgid "mm³/s²" +msgstr "mm³/s²" + +#: src/libslic3r/PrintConfig.cpp:1252 +msgid "Max volumetric slope negative" +msgstr "최대 체적 기울기 음수" + +#: src/libslic3r/PrintConfig.cpp:1264 src/libslic3r/PrintConfig.cpp:1273 +msgid "Min" +msgstr "최소" + +#: src/libslic3r/PrintConfig.cpp:1265 +msgid "This setting represents the minimum PWM your fan needs to work." +msgstr "이 설정은 최소 PWM팬이 활동하는데 필요한를 나타냅니다." + +#: src/libslic3r/PrintConfig.cpp:1274 +msgid "" +"This is the lowest printable layer height for this extruder and limits the " +"resolution for variable layer height. Typical values are between 0.05 mm and " +"0.1 mm." +msgstr "" +"이것은 이 압출기에 대한 가장 낮은 인쇄 가능한 층 높이이고 가변 층 높이에 대" +"한 분해능을 제한한다. 대표적인 값은 0.05mm와 0.1mm이다." + +#: src/libslic3r/PrintConfig.cpp:1282 +msgid "Min print speed" +msgstr "최소 인쇄 속도" + +#: src/libslic3r/PrintConfig.cpp:1283 +msgid "Slic3r will not scale speed down below this speed." +msgstr "Slic3r는 이 속도 이하로 속도를 낮추지 않을 것이다." + +#: src/libslic3r/PrintConfig.cpp:1290 +msgid "Minimal filament extrusion length" +msgstr "최소 필라멘트 압출 길이" + +#: src/libslic3r/PrintConfig.cpp:1291 +msgid "" +"Generate no less than the number of skirt loops required to consume the " +"specified amount of filament on the bottom layer. For multi-extruder " +"machines, this minimum applies to each extruder." +msgstr "" +"하단 레이어에서 지정된 양의 필라멘트를 사용하는 데 필요한 스커트 루프의 수 이" +"상으로 생성한다. 멀티 익스트루더의 경우, 이 최소값은 각 추가기기에 적용된다." + +#: src/libslic3r/PrintConfig.cpp:1300 +msgid "Configuration notes" +msgstr "구성 노트" + +#: src/libslic3r/PrintConfig.cpp:1301 +msgid "" +"You can put here your personal notes. This text will be added to the G-code " +"header comments." +msgstr "" +"여기에 개인 노트를 넣을 수 있다. 이 텍스트는 G-code 헤더 코멘트에 추가될 것이" +"다." + +#: src/libslic3r/PrintConfig.cpp:1311 +msgid "" +"This is the diameter of your extruder nozzle (for example: 0.5, 0.35 etc.)" +msgstr "이 지름은 엑스트루더 노즐의 직경이다(예: 0.5, 0.35 등)." + +#: src/libslic3r/PrintConfig.cpp:1316 +msgid "Host Type" +msgstr "호스트 유형" + +#: src/libslic3r/PrintConfig.cpp:1317 +msgid "" +"Slic3r can upload G-code files to a printer host. This field must contain " +"the kind of the host." +msgstr "" +"Slic3r는 프린터 호스트에 G 코드 파일을 업로드할 수 있습니다. 이 필드에는 호스" +"트의 종류가 포함 되어야 합니다." + +#: src/libslic3r/PrintConfig.cpp:1328 +msgid "Only retract when crossing perimeters" +msgstr "둘레를 횡단 할 때만 수축" + +#: src/libslic3r/PrintConfig.cpp:1329 +msgid "" +"Disables retraction when the travel path does not exceed the upper layer's " +"perimeters (and thus any ooze will be probably invisible)." +msgstr "" +"이동 경로가 상위 레이어의 경계를 초과하지 않는 경우 리트랙션을 비활성화합니" +"다. 따라서 모든 오즈가 보이지 않습니다." + +#: src/libslic3r/PrintConfig.cpp:1336 +msgid "" +"This option will drop the temperature of the inactive extruders to prevent " +"oozing. It will enable a tall skirt automatically and move extruders outside " +"such skirt when changing temperatures." +msgstr "" +"이 옵션은 누출을 방지하기 위해 비활성 압출기의 온도를 떨어 뜨립니다. 온도를 " +"변경할 때 키가 큰 스커트를 자동으로 사용하고 스커트 외부로 압출기를 이동합니" +"다." + +#: src/libslic3r/PrintConfig.cpp:1343 +msgid "Output filename format" +msgstr "출력 파일이름 형식" + +#: src/libslic3r/PrintConfig.cpp:1344 +msgid "" +"You can use all configuration options as variables inside this template. For " +"example: [layer_height], [fill_density] etc. You can also use [timestamp], " +"[year], [month], [day], [hour], [minute], [second], [version], " +"[input_filename], [input_filename_base]." +msgstr "" +"모든 구성 옵션을이 템플릿 내의 변수로 사용할 수 있습니다. 예: " +"[layer_height], [fill_density] 등 또한 [타임 스탬프], [연도], [월], [일], [시" +"간], [input_filename], [input_filename_base]을 사용할 수 있습니다." + +#: src/libslic3r/PrintConfig.cpp:1353 +msgid "Detect bridging perimeters" +msgstr "브릿 징 경계선 감지" + +#: src/libslic3r/PrintConfig.cpp:1355 +msgid "" +"Experimental option to adjust flow for overhangs (bridge flow will be used), " +"to apply bridge speed to them and enable fan." +msgstr "" +"오버행에 대한 유량을 조정하는 실험 옵션 (브리지 흐름(flow)이 사용됨)에 브릿" +"지 속도를 적용하고 팬을 활성화합니다." + +#: src/libslic3r/PrintConfig.cpp:1361 +msgid "Filament parking position" +msgstr "필라멘트 멈춤 위치" + +#: src/libslic3r/PrintConfig.cpp:1362 +msgid "" +"Distance of the extruder tip from the position where the filament is parked " +"when unloaded. This should match the value in printer firmware." +msgstr "" +"언로딩시 필라멘트 위치에서 압출기 팁의 거리. 이 값은 프린터 펌웨어의 값과 일" +"치해야합니다." + +#: src/libslic3r/PrintConfig.cpp:1370 +msgid "Extra loading distance" +msgstr "추가 로딩 거리" + +#: src/libslic3r/PrintConfig.cpp:1371 +msgid "" +"When set to zero, the distance the filament is moved from parking position " +"during load is exactly the same as it was moved back during unload. When " +"positive, it is loaded further, if negative, the loading move is shorter " +"than unloading." +msgstr "" +"0으로 설정하면로드 중에 필라멘트가 위치에서 이동 한 거리는 언로드 중에 다시 " +"이동 한 거리와 동일합니다. 양수이면 음수가 더 많이 로드되고 로드가 음수 인 경" +"우 언로드보다 짧습니다." + +#: src/libslic3r/PrintConfig.cpp:1379 src/libslic3r/PrintConfig.cpp:1397 +#: src/libslic3r/PrintConfig.cpp:1409 src/libslic3r/PrintConfig.cpp:1419 +msgid "Perimeters" +msgstr "둘레" + +#: src/libslic3r/PrintConfig.cpp:1380 +msgid "" +"This is the acceleration your printer will use for perimeters. A high value " +"like 9000 usually gives good results if your hardware is up to the job. Set " +"zero to disable acceleration control for perimeters." +msgstr "" +"프린터가 둘레로 사용할 가속도입니다. 9000과 같은 높은 값은 하드웨어가 제대로 " +"작동하면 좋은 결과를 제공합니다. 주변을 가속 제어하지 않으려면 0으로 설정하십" +"시오." + +#: src/libslic3r/PrintConfig.cpp:1388 +msgid "Perimeter extruder" +msgstr "주변 익스트루더" + +#: src/libslic3r/PrintConfig.cpp:1390 +msgid "" +"The extruder to use when printing perimeters and brim. First extruder is 1." +msgstr "" +"둘레와 가장자리를 인쇄 할 때 사용할 압출기입니다. 첫 번째 압출기는 1입니다." + +#: src/libslic3r/PrintConfig.cpp:1399 +msgid "" +"Set this to a non-zero value to set a manual extrusion width for perimeters. " +"You may want to use thinner extrudates to get more accurate surfaces. If " +"left zero, default extrusion width will be used if set, otherwise 1.125 x " +"nozzle diameter will be used. If expressed as percentage (for example 200%) " +"it will be computed over layer height." +msgstr "" +"이 값을 0이 아닌 값으로 설정하면 수동 압출 폭을 둘레로 설정할 수 있습니다. 보" +"다 정확한 서페이스를 얻으려면 더 얇은 압출 성형품을 사용하는 것이 좋습니다. 0" +"으로 설정하면 설정된 경우 기본 돌출 폭이 사용되고 그렇지 않으면 1.125 x 노즐 " +"직경이 사용됩니다. 백분율 (예 : 200 %)로 표현하면 레이어 높이를 기준으로 계산" +"됩니다." + +#: src/libslic3r/PrintConfig.cpp:1411 +msgid "" +"Speed for perimeters (contours, aka vertical shells). Set to zero for auto." +msgstr "둘레의 속도 (등고선, 일명 세로 셸). 자동으로 0으로 설정하십시오." + +#: src/libslic3r/PrintConfig.cpp:1421 +msgid "" +"This option sets the number of perimeters to generate for each layer. Note " +"that Slic3r may increase this number automatically when it detects sloping " +"surfaces which benefit from a higher number of perimeters if the Extra " +"Perimeters option is enabled." +msgstr "" +"이 옵션은 각 레이어에 대해 생성 할 경계 수를 설정합니다. 추가 경계선 옵션을 " +"사용하면 더 큰 주변 수를 사용하는 경사면을 감지 할 때 Slic3r이이 수를 자동으" +"로 증가시킬 수 있습니다." + +#: src/libslic3r/PrintConfig.cpp:1425 +msgid "(minimum)" +msgstr "(최소)" + +#: src/libslic3r/PrintConfig.cpp:1433 +msgid "" +"If you want to process the output G-code through custom scripts, just list " +"their absolute paths here. Separate multiple scripts with a semicolon. " +"Scripts will be passed the absolute path to the G-code file as the first " +"argument, and they can access the Slic3r config settings by reading " +"environment variables." +msgstr "" +"사용자 정의 스크립트를 통해 출력 G 코드를 처리하려면 여기에 절대 경로를 나열" +"하십시오. 여러 개의 스크립트를 세미콜론으로 구분하십시오. 스크립트는 G 코드 " +"파일의 절대 경로를 첫 번째 인수로 전달되며 환경 변수를 읽음으로써 Slic3r 구" +"성 설정에 액세스 할 수 있습니다." + +#: src/libslic3r/PrintConfig.cpp:1445 +msgid "Printer type" +msgstr "프린터 타입" + +#: src/libslic3r/PrintConfig.cpp:1446 +msgid "Type of the printer." +msgstr "프린터 유형." + +#: src/libslic3r/PrintConfig.cpp:1451 +msgid "Printer notes" +msgstr "프린터 노트" + +#: src/libslic3r/PrintConfig.cpp:1452 +msgid "You can put your notes regarding the printer here." +msgstr "프린터 관련 메모를 여기에 넣을 수 있습니다." + +#: src/libslic3r/PrintConfig.cpp:1460 +msgid "Printer vendor" +msgstr "제조 회사" + +#: src/libslic3r/PrintConfig.cpp:1461 +msgid "Name of the printer vendor." +msgstr "프린터 공급 업체의 이름입니다." + +#: src/libslic3r/PrintConfig.cpp:1466 +msgid "Printer variant" +msgstr "프린터 변형" + +#: src/libslic3r/PrintConfig.cpp:1467 +msgid "" +"Name of the printer variant. For example, the printer variants may be " +"differentiated by a nozzle diameter." +msgstr "" +"프린터 변종 이름입니다. 예를 들어, 프린터 변형은 노즐 지름으로 구별 될 수 있" +"습니다." + +#: src/libslic3r/PrintConfig.cpp:1480 +msgid "Raft layers" +msgstr "라프트(Raft) 레이어" + +#: src/libslic3r/PrintConfig.cpp:1482 +msgid "" +"The object will be raised by this number of layers, and support material " +"will be generated under it." +msgstr "" +"물체는 이 개수의 층에 의해 상승되며, 그 아래에서 서포트 재료가 생성될 것이다." + +#: src/libslic3r/PrintConfig.cpp:1490 +msgid "Resolution" +msgstr "해결" + +#: src/libslic3r/PrintConfig.cpp:1491 +msgid "" +"Minimum detail resolution, used to simplify the input file for speeding up " +"the slicing job and reducing memory usage. High-resolution models often " +"carry more detail than printers can render. Set to zero to disable any " +"simplification and use full resolution from input." +msgstr "" +"잘라내기 작업의 속도를 높이고 메모리 사용량을 줄이기 위해 입력 파일을 단순화" +"하는 데 사용되는 최소 세부 해상도. 고해상도 모델은 종종 프린터가 렌더링할 수 " +"있는 것보다 더 많은 디테일을 가지고 있다. 단순화를 사용하지 않고 입력에서 전" +"체 해상도를 사용하려면 0으로 설정하십시오." + +#: src/libslic3r/PrintConfig.cpp:1501 +msgid "Minimum travel after retraction" +msgstr "리트랙션 후 최소 이동 거리" + +#: src/libslic3r/PrintConfig.cpp:1502 +msgid "" +"Retraction is not triggered when travel moves are shorter than this length." +msgstr "이동 거리가 이 길이보다 짧으면 리트렉션이 트리거되지 않습니다." + +#: src/libslic3r/PrintConfig.cpp:1508 +msgid "Retract amount before wipe" +msgstr "닦아 내기 전의 수축량" + +#: src/libslic3r/PrintConfig.cpp:1509 +msgid "" +"With bowden extruders, it may be wise to do some amount of quick retract " +"before doing the wipe movement." +msgstr "" +"보우 덴 압출기를 사용하면 와이퍼 동작을하기 전에 약간의 빠른 리트랙션 를하는 " +"것이 좋습니다." + +#: src/libslic3r/PrintConfig.cpp:1516 +msgid "Retract on layer change" +msgstr "레이어 변경 후퇴" + +#: src/libslic3r/PrintConfig.cpp:1517 +msgid "This flag enforces a retraction whenever a Z move is done." +msgstr "이 플래그는 Z 이동이 완료 될 때마다 취소를 강제 실행합니다." + +#: src/libslic3r/PrintConfig.cpp:1522 src/libslic3r/PrintConfig.cpp:1530 +msgid "Length" +msgstr "길이" + +#: src/libslic3r/PrintConfig.cpp:1523 +msgid "Retraction Length" +msgstr "리트랙션 길이" + +#: src/libslic3r/PrintConfig.cpp:1524 +msgid "" +"When retraction is triggered, filament is pulled back by the specified " +"amount (the length is measured on raw filament, before it enters the " +"extruder)." +msgstr "" +"후퇴가 트리거되면 필라멘트가 지정된 양만큼 뒤로 당겨집니다 (길이는 압출기에 " +"들어가기 전에 원시 필라멘트에서 측정됩니다)." + +#: src/libslic3r/PrintConfig.cpp:1526 src/libslic3r/PrintConfig.cpp:1535 +msgid "mm (zero to disable)" +msgstr "mm (0은 비활성화)" + +#: src/libslic3r/PrintConfig.cpp:1531 +msgid "Retraction Length (Toolchange)" +msgstr "리트랙션 길이 (툴 체인지)" + +#: src/libslic3r/PrintConfig.cpp:1532 +msgid "" +"When retraction is triggered before changing tool, filament is pulled back " +"by the specified amount (the length is measured on raw filament, before it " +"enters the extruder)." +msgstr "" +"공구를 교체하기 전에 후퇴가 트리거되면 필라멘트가 지정된 양만큼 뒤로 당겨집니" +"다 (길이는 압출기에 들어가기 전에 원시 필라멘트에서 측정됩니다)." + +#: src/libslic3r/PrintConfig.cpp:1540 +msgid "Lift Z" +msgstr "Z축 올림" + +#: src/libslic3r/PrintConfig.cpp:1541 +msgid "" +"If you set this to a positive value, Z is quickly raised every time a " +"retraction is triggered. When using multiple extruders, only the setting for " +"the first extruder will be considered." +msgstr "" +"이 값을 양수 값으로 설정하면 철회가 트리거 될 때마다 Z가 빠르게 올라갑니다. " +"여러 개의 압출기를 사용하는 경우 첫 번째 압출기의 설정 만 고려됩니다." + +#: src/libslic3r/PrintConfig.cpp:1548 +msgid "Above Z" +msgstr "Z 위" + +#: src/libslic3r/PrintConfig.cpp:1549 +msgid "Only lift Z above" +msgstr "오직 Z축 위로만" + +#: src/libslic3r/PrintConfig.cpp:1550 +msgid "" +"If you set this to a positive value, Z lift will only take place above the " +"specified absolute Z. You can tune this setting for skipping lift on the " +"first layers." +msgstr "" +"이것을 양의 값으로 설정하면, Z 리프트는 지정된 절대 Z 위로만 발생한다. 첫 번" +"째 층에서 리프트를 건너뛸 수 있도록 이 설정을 조정할 수 있다." + +#: src/libslic3r/PrintConfig.cpp:1557 +msgid "Below Z" +msgstr "Z 아래" + +#: src/libslic3r/PrintConfig.cpp:1558 +msgid "Only lift Z below" +msgstr "Z값 아래만" + +#: src/libslic3r/PrintConfig.cpp:1559 +msgid "" +"If you set this to a positive value, Z lift will only take place below the " +"specified absolute Z. You can tune this setting for limiting lift to the " +"first layers." +msgstr "" +"이것을 양수 값으로 설정하면 Z 리프트가 지정된 절대 Z 아래에서만 발생합니다. " +"첫 번째 레이어로 리프트를 제한하기 위해이 설정을 조정할 수 있습니다." + +#: src/libslic3r/PrintConfig.cpp:1567 src/libslic3r/PrintConfig.cpp:1575 +msgid "Extra length on restart" +msgstr "재시작시 여분의 길이" + +#: src/libslic3r/PrintConfig.cpp:1568 +msgid "" +"When the retraction is compensated after the travel move, the extruder will " +"push this additional amount of filament. This setting is rarely needed." +msgstr "" +"이동 후 리트렉셔이 보정되면 익스트루더가 추가 양의 필라멘트를 밀어냅니다. 이 " +"설정은 거의 필요하지 않습니다." + +#: src/libslic3r/PrintConfig.cpp:1576 +msgid "" +"When the retraction is compensated after changing tool, the extruder will " +"push this additional amount of filament." +msgstr "" +"도구를 교환 한 후 리트렉션를 보정하면 익스트루더가 추가 양의 필라멘트를 밀게" +"됩니다." + +#: src/libslic3r/PrintConfig.cpp:1583 src/libslic3r/PrintConfig.cpp:1584 +msgid "Retraction Speed" +msgstr "리트랙션 속도" + +#: src/libslic3r/PrintConfig.cpp:1585 +msgid "The speed for retractions (it only applies to the extruder motor)." +msgstr "리트랙션 속도 (익스트루더 모터에만 적용됨)." + +#: src/libslic3r/PrintConfig.cpp:1591 src/libslic3r/PrintConfig.cpp:1592 +msgid "Deretraction Speed" +msgstr "감속 속도" + +#: src/libslic3r/PrintConfig.cpp:1593 +msgid "" +"The speed for loading of a filament into extruder after retraction (it only " +"applies to the extruder motor). If left to zero, the retraction speed is " +"used." +msgstr "" +"리트랙션 후 압출기에 필라멘트를 로드하는 속도 (압출기 모터에만 적용됨). 0으" +"로 방치하면 리트랙션 속도가 사용됩니다." + +#: src/libslic3r/PrintConfig.cpp:1600 +msgid "Seam position" +msgstr "재봉선 위치" + +#: src/libslic3r/PrintConfig.cpp:1602 +msgid "Position of perimeters starting points." +msgstr "둘레의 시작점의 위치." + +#: src/libslic3r/PrintConfig.cpp:1608 +msgid "Random" +msgstr "무작위" + +#: src/libslic3r/PrintConfig.cpp:1609 +msgid "Nearest" +msgstr "가장 가까운" + +#: src/libslic3r/PrintConfig.cpp:1610 +msgid "Aligned" +msgstr "정렬" + +#: src/libslic3r/PrintConfig.cpp:1618 +msgid "Direction" +msgstr "방향" + +#: src/libslic3r/PrintConfig.cpp:1620 +msgid "Preferred direction of the seam" +msgstr "선호하는 심(seam)의 방향" + +#: src/libslic3r/PrintConfig.cpp:1621 +msgid "Seam preferred direction" +msgstr "심(Seam) 선호 방향" + +#: src/libslic3r/PrintConfig.cpp:1628 +msgid "Jitter" +msgstr "지터(Jitter)" + +#: src/libslic3r/PrintConfig.cpp:1630 +msgid "Seam preferred direction jitter" +msgstr "(Seam) 선호 방향 지터(Jitter)" + +#: src/libslic3r/PrintConfig.cpp:1631 +msgid "Preferred direction of the seam - jitter" +msgstr "재봉선 지터의 선호 방향" + +#: src/libslic3r/PrintConfig.cpp:1641 +msgid "USB/serial port for printer connection." +msgstr "프린터 연결을 위한 USB/시리얼 포트." + +#: src/libslic3r/PrintConfig.cpp:1648 +msgid "Serial port speed" +msgstr "시리얼 포트 속도" + +#: src/libslic3r/PrintConfig.cpp:1649 +msgid "Speed (baud) of USB/serial port for printer connection." +msgstr "프린터 연결을 위한 USB/시리얼 포트의 속도(보드)" + +#: src/libslic3r/PrintConfig.cpp:1658 +msgid "Distance from object" +msgstr "객체로부터의 거리" + +#: src/libslic3r/PrintConfig.cpp:1659 +msgid "" +"Distance between skirt and object(s). Set this to zero to attach the skirt " +"to the object(s) and get a brim for better adhesion." +msgstr "" +"스커트와 객체 사이의 거리. 스커트를 객체에 부착하고 접착력을 높이기 위해 이" +"를 0으로 설정한다." + +#: src/libslic3r/PrintConfig.cpp:1666 +msgid "Skirt height" +msgstr "스커트(Skirt) 높이" + +#: src/libslic3r/PrintConfig.cpp:1667 +msgid "" +"Height of skirt expressed in layers. Set this to a tall value to use skirt " +"as a shield against drafts." +msgstr "" +"스커트의 높이 레이어로 표현된다. 이를 높은 값으로 설정하여 스커트를 드래프트" +"에 대한 쉴ㄷ로 활용하십시오." + +#: src/libslic3r/PrintConfig.cpp:1674 +msgid "Loops (minimum)" +msgstr "루프 (최소)" + +#: src/libslic3r/PrintConfig.cpp:1675 +msgid "Skirt Loops" +msgstr "스커트 루프" + +#: src/libslic3r/PrintConfig.cpp:1676 +msgid "" +"Number of loops for the skirt. If the Minimum Extrusion Length option is " +"set, the number of loops might be greater than the one configured here. Set " +"this to zero to disable skirt completely." +msgstr "" +"스커트의 루프 수입니다. 최소 압출 길이 옵션을 설정한 경우 여기에 구성된 루프 " +"수보다 클 수 있다. 스커트를 완전히 비활성화하려면 이 값을 0으로 설정하십시오." + +#: src/libslic3r/PrintConfig.cpp:1684 +msgid "Slow down if layer print time is below" +msgstr "레이어 인쇄 시간이 다음과 같은 경우 속도를 낮추십시오" + +#: src/libslic3r/PrintConfig.cpp:1685 +msgid "" +"If layer print time is estimated below this number of seconds, print moves " +"speed will be scaled down to extend duration to this value." +msgstr "" +"층 인쇄 시간이 이 시간보다 낮게 추정될 경우, 인쇄 이동 속도는 이 값으로 지속" +"되도록 축소된다." + +#: src/libslic3r/PrintConfig.cpp:1695 +msgid "Small perimeters" +msgstr "작은 둘레" + +#: src/libslic3r/PrintConfig.cpp:1697 +msgid "" +"This separate setting will affect the speed of perimeters having radius <= " +"6.5mm (usually holes). If expressed as percentage (for example: 80%) it will " +"be calculated on the perimeters speed setting above. Set to zero for auto." +msgstr "" +"이 개별 설정은 반경이 6.5mm 미만인 속도 (일반적으로 구멍)에 영향을줍니다. 백" +"분율로 표시되는 경우 (예 : 80 %) 위의 속도 설정에서 계산됩니다. 자동으로 0으" +"로 설정하십시오." + +#: src/libslic3r/PrintConfig.cpp:1707 +msgid "Solid infill threshold area" +msgstr "솔리드 채우기 임계값 영역" + +#: src/libslic3r/PrintConfig.cpp:1709 +msgid "" +"Force solid infill for regions having a smaller area than the specified " +"threshold." +msgstr "" +"지정된 한계값보다 작은 영역을 가진 영역에 대해 솔리드 인필을 강제 적용." + +#: src/libslic3r/PrintConfig.cpp:1710 +msgid "mm²" +msgstr "mm²" + +#: src/libslic3r/PrintConfig.cpp:1716 +msgid "Solid infill extruder" +msgstr "솔리드 인필 익스트루더" + +#: src/libslic3r/PrintConfig.cpp:1718 +msgid "The extruder to use when printing solid infill." +msgstr "꽉찬 면을 인쇄할 때 사용하는 익스트루더." + +#: src/libslic3r/PrintConfig.cpp:1724 +msgid "Solid infill every" +msgstr "솔리드 인필 간격" + +#: src/libslic3r/PrintConfig.cpp:1726 +msgid "" +"This feature allows to force a solid layer every given number of layers. " +"Zero to disable. You can set this to any value (for example 9999); Slic3r " +"will automatically choose the maximum possible number of layers to combine " +"according to nozzle diameter and layer height." +msgstr "" +"이 특징은 주어진 개수의 층마다 단단한 층을 넣을수 있게 한다. 비활성화할 수 없" +"음. 당신은 이것을 어떤 값으로도 설정할 수 있다(예: 9999). Slic3r는 노즐 직경" +"과 층 높이에 따라 결합할 최대 가능한 층 수를 자동으로 선택한다." + +#: src/libslic3r/PrintConfig.cpp:1738 +msgid "" +"Set this to a non-zero value to set a manual extrusion width for infill for " +"solid surfaces. If left zero, default extrusion width will be used if set, " +"otherwise 1.125 x nozzle diameter will be used. If expressed as percentage " +"(for example 90%) it will be computed over layer height." +msgstr "" +"이 값을 0이 아닌 값으로 설정하여 솔리드 표면 인필에 대한 수동 압출 폭을 설정" +"하십시오. 0인 경우 기본 압출 너비가 사용되며, 그렇지 않으면 1.125 x 노즐 직경" +"이 사용된다. 백분율(예: 90%)로 표현되는 경우, 계층 높이에 걸쳐 계산된다." + +#: src/libslic3r/PrintConfig.cpp:1748 +msgid "" +"Speed for printing solid regions (top/bottom/internal horizontal shells). " +"This can be expressed as a percentage (for example: 80%) over the default " +"infill speed above. Set to zero for auto." +msgstr "" +"솔리드 영역(상단/하부/내부 수평 셸) 인쇄 속도 이는 위의 기본 주입 속도에 대" +"한 백분율(예: 80%)로 표시할 수 있다. 자동을 위해 0으로 설정한다." + +#: src/libslic3r/PrintConfig.cpp:1760 +msgid "Number of solid layers to generate on top and bottom surfaces." +msgstr "상단 및 하단 표면에 생성할 솔리드 레이어 수입니다." + +#: src/libslic3r/PrintConfig.cpp:1766 +msgid "Spiral vase" +msgstr "스파이럴 바이스" + +#: src/libslic3r/PrintConfig.cpp:1767 +msgid "" +"This feature will raise Z gradually while printing a single-walled object in " +"order to remove any visible seam. This option requires a single perimeter, " +"no infill, no top solid layers and no support material. You can still set " +"any number of bottom solid layers as well as skirt/brim loops. It won't work " +"when printing more than an object." +msgstr "" +"이 기능은 단일 벽 물체를 인쇄하는 동안 눈에 보이는 심을 제거하기 위해 Z를 점" +"진적으로 상승시킨다. 이 옵션은 단일 둘레, 주입, 상단 솔리드 레이어 및 지지 재" +"료가 필요하지 않다. 당신은 스커트/브림 루프뿐만 아니라 아래 솔리드 레이어의 " +"수에 상관없이 설정할 수 있다. 그것은 물체보다 더 많이 인쇄할 때는 작동하지 않" +"을 것이다." + +#: src/libslic3r/PrintConfig.cpp:1775 +msgid "Temperature variation" +msgstr "온도 변화" + +#: src/libslic3r/PrintConfig.cpp:1776 +msgid "" +"Temperature difference to be applied when an extruder is not active. Enables " +"a full-height \"sacrificial\" skirt on which the nozzles are periodically " +"wiped." +msgstr "" +"돌출부가 활성화되지 않은 경우 적용되는 온도 차이. 노즐을 주기적으로 닦는 전" +"체 높이 \"인공\" 스커트가 가능하다." + +#: src/libslic3r/PrintConfig.cpp:1786 +msgid "" +"This start procedure is inserted at the beginning, after bed has reached the " +"target temperature and extruder just started heating, and before extruder " +"has finished heating. If Slic3r detects M104 or M190 in your custom codes, " +"such commands will not be prepended automatically so you're free to " +"customize the order of heating commands and other custom actions. Note that " +"you can use placeholder variables for all Slic3r settings, so you can put a " +"\"M109 S[first_layer_temperature]\" command wherever you want." +msgstr "" +"이 시작 절차는 침대가 목표 온도에 도달하고 압출기가 막 가열을 시작한 직후 및 " +"압출기가 가열을 완료하기 전에 처음에 삽입됩니다. Slic3r이 사용자 지정 코드에" +"서 M104 또는 M190을 감지하면 이러한 명령은 자동으로 추가되지 않으므로 가열 명" +"령 및 기타 사용자 지정 동작의 순서를 자유롭게 사용자 지정할 수 있습니다. 모" +"든 Slic3r 설정에 자리 표시 자 변수를 사용할 수 있으므로 원하는 위치에 \"M109 " +"S [first_layer_temperature]\"명령을 넣을 수 있습니다." + +#: src/libslic3r/PrintConfig.cpp:1801 +msgid "" +"This start procedure is inserted at the beginning, after any printer start " +"gcode (and after any toolchange to this filament in case of multi-material " +"printers). This is used to override settings for a specific filament. If " +"Slic3r detects M104, M109, M140 or M190 in your custom codes, such commands " +"will not be prepended automatically so you're free to customize the order of " +"heating commands and other custom actions. Note that you can use placeholder " +"variables for all Slic3r settings, so you can put a \"M109 " +"S[first_layer_temperature]\" command wherever you want. If you have multiple " +"extruders, the gcode is processed in extruder order." +msgstr "" +"이 시작 절차는 프린터가 gcode를 시작한 후(그리고 다중 재질 프린터의 경우 이 " +"필라멘트에 대한 도구 변경 후) 처음에 삽입됩니다. 특정 필라멘트에 대한 설정을 " +"재정의하는 데 사용됩니다. Slic3r가 사용자 지정 코드에서 M104, M109, M140 또" +"는 M190을 감지하면 이러한 명령이 자동으로 준비되지 않으므로 가열 명령 및 기" +"타 사용자 지정 작업의 순서를 자유롭게 사용자 지정할 수 있습니다. 모든 Slic3r " +"설정에 자리 표시자 변수를 사용할 수 있으므로 원하는 위치에 \"M109 " +"S[first_layer_temperature]\" 명령을 넣을 수 있습니다. 압출기가 여러 개 있는 " +"경우 gcode는 압출기 순서로 처리됩니다." + +#: src/libslic3r/PrintConfig.cpp:1817 +msgid "Single Extruder Multi Material" +msgstr "싱글 익스트루더 멀티메터리얼" + +#: src/libslic3r/PrintConfig.cpp:1818 +msgid "The printer multiplexes filaments into a single hot end." +msgstr "프린터는 필라멘트를 하나의 핫 엔드에 멀티플렉싱합니다." + +#: src/libslic3r/PrintConfig.cpp:1823 +msgid "Prime all printing extruders" +msgstr "모든 인쇄 압출기 프라임" + +#: src/libslic3r/PrintConfig.cpp:1824 +msgid "" +"If enabled, all printing extruders will be primed at the front edge of the " +"print bed at the start of the print." +msgstr "" +"활성화 된 경우, 모든 인쇄 압출기는 인쇄 시작시 프린트 베드의 전면 가장자리에 " +"프라이밍 됩니다." + +#: src/libslic3r/PrintConfig.cpp:1829 +msgid "Generate support material" +msgstr "서포트 재료 생성" + +#: src/libslic3r/PrintConfig.cpp:1831 +msgid "Enable support material generation." +msgstr "서포트 재료를 사용합니다." + +#: src/libslic3r/PrintConfig.cpp:1835 +msgid "Auto generated supports" +msgstr "자동 생성 지원" + +#: src/libslic3r/PrintConfig.cpp:1837 +msgid "" +"If checked, supports will be generated automatically based on the overhang " +"threshold value. If unchecked, supports will be generated inside the " +"\"Support Enforcer\" volumes only." +msgstr "" +"이 옵션을 선택 하면 오버행 임계값에 따라 서포트가 자동으로 생성 됩니다. 이 확" +"인란을 선택 하지 않으면 \"서포트 지원 영역\" 볼륨 내 에서만 지원이 생성 됩니" +"다." + +#: src/libslic3r/PrintConfig.cpp:1843 +msgid "XY separation between an object and its support" +msgstr "물체와 그 서포트 사이 XY 분리" + +#: src/libslic3r/PrintConfig.cpp:1845 +msgid "" +"XY separation between an object and its support. If expressed as percentage " +"(for example 50%), it will be calculated over external perimeter width." +msgstr "" +"객체와 그 서포트 사이의 XY 분리. 백분율 (예 : 50 %)로 표시되는 경우 외부 둘" +"레 너비를 기준으로 계산됩니다." + +#: src/libslic3r/PrintConfig.cpp:1855 +msgid "Pattern angle" +msgstr "채움 각도" + +#: src/libslic3r/PrintConfig.cpp:1857 +msgid "" +"Use this setting to rotate the support material pattern on the horizontal " +"plane." +msgstr "이 설정을 사용하여지지 평면 패턴을 수평면으로 회전시킵니다." + +#: src/libslic3r/PrintConfig.cpp:1867 src/libslic3r/PrintConfig.cpp:2531 +msgid "" +"Only create support if it lies on a build plate. Don't create support on a " +"print." +msgstr "" +"그것이 빌드 플레이트에있는 경우에만 지원을 작성하십시오. 인쇄물에 대한 지원" +"을 작성하지 마십시오." + +#: src/libslic3r/PrintConfig.cpp:1873 +msgid "Contact Z distance" +msgstr "Z 거리 문의" + +#: src/libslic3r/PrintConfig.cpp:1875 +msgid "" +"The vertical distance between object and support material interface. Setting " +"this to 0 will also prevent Slic3r from using bridge flow and speed for the " +"first object layer." +msgstr "" +"물체와 서포트 사이의 수직 거리. 이 값을 0으로 설정하면 Slic3r이 첫 번째 객체 " +"레이어에 브리지 흐름과 속도를 사용하지 못하게됩니다." + +#: src/libslic3r/PrintConfig.cpp:1882 +msgid "0 (soluble)" +msgstr "0 (수용성)" + +#: src/libslic3r/PrintConfig.cpp:1883 +msgid "0.2 (detachable)" +msgstr "0.2 (분리 가능)" + +#: src/libslic3r/PrintConfig.cpp:1888 +msgid "Enforce support for the first" +msgstr "첫 번째 서포트 더 강화" + +#: src/libslic3r/PrintConfig.cpp:1890 +msgid "" +"Generate support material for the specified number of layers counting from " +"bottom, regardless of whether normal support material is enabled or not and " +"regardless of any angle threshold. This is useful for getting more adhesion " +"of objects having a very thin or poor footprint on the build plate." +msgstr "" +"일반적인 서포트 소재의 활성화 여부와, 각도 임계 값에 관계없이 하단에서부터 세" +"어 지정된 레이어 수에 대한지지 자료를 생성합니다. 이것은 빌드 플레이트에 매" +"우 얇거나 부족한 풋 프린트를 가진 물체를 더 많이 부착 할 때 유용합니다." + +#: src/libslic3r/PrintConfig.cpp:1895 +msgid "Enforce support for the first n layers" +msgstr "첫 번째 n 개의 레이어에 대한 서포트 강화" + +#: src/libslic3r/PrintConfig.cpp:1901 +msgid "Support material/raft/skirt extruder" +msgstr "서포트 재료 / 라프트 / 스커트 익스트루더" + +#: src/libslic3r/PrintConfig.cpp:1903 +msgid "" +"The extruder to use when printing support material, raft and skirt (1+, 0 to " +"use the current extruder to minimize tool changes)." +msgstr "" +"서포트 재료, 라프트 및 스커트를 인쇄 할 때 사용하는 압출기 (도구 변경을 최소" +"화하기 위해 현재 압출기를 사용하려면 1+, 0)." + +#: src/libslic3r/PrintConfig.cpp:1912 +msgid "" +"Set this to a non-zero value to set a manual extrusion width for support " +"material. If left zero, default extrusion width will be used if set, " +"otherwise nozzle diameter will be used. If expressed as percentage (for " +"example 90%) it will be computed over layer height." +msgstr "" +"서포트 재료의 수동 압출 폭을 설정하려면이 값을 0이 아닌 값으로 설정하십시오. " +"0으로 설정하면 설정된 경우 기본 압출 폭이 사용되고 그렇지 않으면 노즐 지름이 " +"사용됩니다. 백분율 (예 : 90 %)로 표현하면 레이어 높이를 기준으로 계산됩니다." + +#: src/libslic3r/PrintConfig.cpp:1920 +msgid "Interface loops" +msgstr "인터페이스 루프" + +#: src/libslic3r/PrintConfig.cpp:1922 +msgid "" +"Cover the top contact layer of the supports with loops. Disabled by default." +msgstr "지지대의 상단 접촉 층을 루프로 덮으십시오. 기본적으로 사용 안 함." + +#: src/libslic3r/PrintConfig.cpp:1927 +msgid "Support material/raft interface extruder" +msgstr "서포트 재료/라프트 인터페이스 익스트루더" + +#: src/libslic3r/PrintConfig.cpp:1929 +msgid "" +"The extruder to use when printing support material interface (1+, 0 to use " +"the current extruder to minimize tool changes). This affects raft too." +msgstr "" +"서포트 재료 인터페이스를 인쇄 할 때 사용할 익스트루더 (도구 변경을 최소화하" +"기 위해 현재 익스트루더를 사용하려면 1+, 0). 이것은 라프트에도 영향을 미칩니" +"다." + +#: src/libslic3r/PrintConfig.cpp:1936 +msgid "Interface layers" +msgstr "인터페이스 레이어" + +#: src/libslic3r/PrintConfig.cpp:1938 +msgid "" +"Number of interface layers to insert between the object(s) and support " +"material." +msgstr "객체와 서포트 재료 사이에 삽입할 인터페이스 레이어 수입니다." + +#: src/libslic3r/PrintConfig.cpp:1945 +msgid "Interface pattern spacing" +msgstr "인터페이스 패턴 간격" + +#: src/libslic3r/PrintConfig.cpp:1947 +msgid "Spacing between interface lines. Set zero to get a solid interface." +msgstr "" +"인터페이스 라인 간 간격. 솔리드 인터페이스를 가져오려면 0을 설정하십시오." + +#: src/libslic3r/PrintConfig.cpp:1956 +msgid "" +"Speed for printing support material interface layers. If expressed as " +"percentage (for example 50%) it will be calculated over support material " +"speed." +msgstr "" +"서포트 재료 인터페이스 레이어 인쇄 속도 백분율(예: 50%)로 표현될 경우 서포트 " +"재료 속도에 따라 계산된다." + +#: src/libslic3r/PrintConfig.cpp:1965 +msgid "Pattern" +msgstr "패턴" + +#: src/libslic3r/PrintConfig.cpp:1967 +msgid "Pattern used to generate support material." +msgstr "서포트 재료를 생성하는 데 사용되는 패턴." + +#: src/libslic3r/PrintConfig.cpp:1973 +msgid "Rectilinear grid" +msgstr "직선 그리드" + +#: src/libslic3r/PrintConfig.cpp:1979 +msgid "Pattern spacing" +msgstr "패턴 간격" + +#: src/libslic3r/PrintConfig.cpp:1981 +msgid "Spacing between support material lines." +msgstr "서포트 재료 라인 사이의 간격." + +#: src/libslic3r/PrintConfig.cpp:1990 +msgid "Speed for printing support material." +msgstr "서포트 재료를 인쇄하는 속도." + +#: src/libslic3r/PrintConfig.cpp:1997 +msgid "Synchronize with object layers" +msgstr "객체 레이어와 동기화" + +#: src/libslic3r/PrintConfig.cpp:1999 +msgid "" +"Synchronize support layers with the object print layers. This is useful with " +"multi-material printers, where the extruder switch is expensive." +msgstr "" +"서포트 레이어를 프린트 레이어와 동기화하십시오. 이것은 스위치가 비싼 멀티 메" +"터리얼 프린터에서 유용하다." + +#: src/libslic3r/PrintConfig.cpp:2005 +msgid "Overhang threshold" +msgstr "오버행 한계점" + +#: src/libslic3r/PrintConfig.cpp:2007 +msgid "" +"Support material will not be generated for overhangs whose slope angle (90° " +"= vertical) is above the given threshold. In other words, this value " +"represent the most horizontal slope (measured from the horizontal plane) " +"that you can print without support material. Set to zero for automatic " +"detection (recommended)." +msgstr "" +"서포트 재료는 경사각(90° = 수직)이 지정된 임계점보다 높은 압출에 대해서는 생" +"성되지 않는다. 즉, 이 값은 서포트 재료 없이 인쇄할 수 있는 가장 수평 경사(수" +"평면에서 측정됨)를 나타낸다. 자동 감지를 위해 0으로 설정하십시오(권장)." + +#: src/libslic3r/PrintConfig.cpp:2019 +msgid "With sheath around the support" +msgstr "서포트 주변이나 외부로" + +#: src/libslic3r/PrintConfig.cpp:2021 +msgid "" +"Add a sheath (a single perimeter line) around the base support. This makes " +"the support more reliable, but also more difficult to remove." +msgstr "" +"기본 서포트 주위에 외장 (단일 주변 선)을 추가하십시오. 이것은 페이스 업을보" +"다 신뢰성있게 만들뿐만 아니라 제거하기도 어렵습니다." + +#: src/libslic3r/PrintConfig.cpp:2028 +msgid "" +"Extruder temperature for layers after the first one. Set this to zero to " +"disable temperature control commands in the output." +msgstr "" +"첫 번째 것 이후에 레이어에 대한 더 낮은 온도. 이 값을 0으로 설정하면 출력에" +"서 ​​온도 제어 명령을 비활성화 할 수 있습니다." + +#: src/libslic3r/PrintConfig.cpp:2036 +msgid "Detect thin walls" +msgstr "얇은 벽(walls) 감지" + +#: src/libslic3r/PrintConfig.cpp:2038 +msgid "" +"Detect single-width walls (parts where two extrusions don't fit and we need " +"to collapse them into a single trace)." +msgstr "싱글 너비 벽 (두 부분이 맞지 않는 부분과 무너지는 부분)을 감지합니다." + +#: src/libslic3r/PrintConfig.cpp:2044 +msgid "Threads" +msgstr "스레드(Threads)" + +#: src/libslic3r/PrintConfig.cpp:2045 +msgid "" +"Threads are used to parallelize long-running tasks. Optimal threads number " +"is slightly above the number of available cores/processors." +msgstr "" +"스레드는 장기 실행 태스크를 병렬 처리하는 데 사용됩니다. 최적의 스레드 수는 " +"사용 가능한 코어 / 프로세서 수보다 약간 높습니다." + +#: src/libslic3r/PrintConfig.cpp:2057 +msgid "" +"This custom code is inserted at every extruder change. If you don't leave " +"this empty, you are expected to take care of the toolchange yourself - " +"PrusaSlicer will not output any other G-code to change the filament. You can " +"use placeholder variables for all Slic3r settings as well as " +"[previous_extruder] and [next_extruder], so e.g. the standard toolchange " +"command can be scripted as T[next_extruder]." +msgstr "" +"이 사용자 지정 코드는 모든 압출기 변경 시 삽입됩니다. 이 것을 비워 두지 않으" +"면 도구 변경을 직접 처리해야합니다 - PrusaSlicer는 필라멘트를 변경하기 위해 " +"다른 G 코드를 출력하지 않습니다. 모든 Slic3r 설정과 [이전_압출기] 및 " +"[next_extruder]에 대해 자리 표시자 변수를 사용할 수 있으므로 표준 도구 변경 " +"명령을 T[next_extruder]로 스크립팅할 수 있습니다." + +#: src/libslic3r/PrintConfig.cpp:2070 +msgid "" +"Set this to a non-zero value to set a manual extrusion width for infill for " +"top surfaces. You may want to use thinner extrudates to fill all narrow " +"regions and get a smoother finish. If left zero, default extrusion width " +"will be used if set, otherwise nozzle diameter will be used. If expressed as " +"percentage (for example 90%) it will be computed over layer height." +msgstr "" +"이 값을 0이 아닌 값으로 설정하여 상단 서피스에 대한 infill의 수동 압출 폭을 " +"설정합니다. 얇은 압출 성형물을 사용하여 모든 좁은 지역을 채우고 더 매끄러운 " +"마무리를 할 수 있습니다. 0으로 설정된 경우 기본 압출 폭이 사용되고 그렇지 않" +"으면 노즐 지름이 사용됩니다. 백분율 (예 : 90 %)로 표현하면 레이어 높이를 기준" +"으로 계산됩니다." + +#: src/libslic3r/PrintConfig.cpp:2081 +msgid "" +"Speed for printing top solid layers (it only applies to the uppermost " +"external layers and not to their internal solid layers). You may want to " +"slow down this to get a nicer surface finish. This can be expressed as a " +"percentage (for example: 80%) over the solid infill speed above. Set to zero " +"for auto." +msgstr "" +"상단 솔리드 레이어 인쇄 속도 (솔리드 레이어가 아닌 최상단 외부 레이어에만 적" +"용) 표면을 더 좋게 마무리하려면 속도를 늦추시기 바랍니다. 이것은 위의 고체 충" +"전 속도에 대한 백분율 (예 : 80 %)로 나타낼 수 있습니다. 자동으로 0으로 설정하" +"십시오." + +#: src/libslic3r/PrintConfig.cpp:2096 +msgid "Number of solid layers to generate on top surfaces." +msgstr "상단 표면에 생성 할 솔리드 레이어 수입니다." + +#: src/libslic3r/PrintConfig.cpp:2097 +msgid "Top solid layers" +msgstr "탑 솔리드 레이어" + +#: src/libslic3r/PrintConfig.cpp:2103 +msgid "Speed for travel moves (jumps between distant extrusion points)." +msgstr "이동 속도 (먼 돌출 점 사이의 점프)." + +#: src/libslic3r/PrintConfig.cpp:2111 +msgid "Use firmware retraction" +msgstr "펌웨어 철회" + +#: src/libslic3r/PrintConfig.cpp:2112 +msgid "" +"This experimental setting uses G10 and G11 commands to have the firmware " +"handle the retraction. This is only supported in recent Marlin." +msgstr "" +"이 실험 설정은 G10 및 G11 명령을 사용하여 펌웨어에서 취소를 처리하도록합니" +"다. 이것은 최근의 말린에서만 지원됩니다." + +#: src/libslic3r/PrintConfig.cpp:2118 +msgid "Use relative E distances" +msgstr "상대적인 E 거리 사용" + +#: src/libslic3r/PrintConfig.cpp:2119 +msgid "" +"If your firmware requires relative E values, check this, otherwise leave it " +"unchecked. Most firmwares use absolute values." +msgstr "" +"펌웨어에 상대 E 값이 필요한 경우이 값을 선택하고, 그렇지 않으면 선택하지 마십" +"시오. 대부분의 회사는 절대 값을 사용합니다." + +#: src/libslic3r/PrintConfig.cpp:2125 +msgid "Use volumetric E" +msgstr "용적 E 사용" + +#: src/libslic3r/PrintConfig.cpp:2126 +msgid "" +"This experimental setting uses outputs the E values in cubic millimeters " +"instead of linear millimeters. If your firmware doesn't already know " +"filament diameter(s), you can put commands like 'M200 D[filament_diameter_0] " +"T0' in your start G-code in order to turn volumetric mode on and use the " +"filament diameter associated to the filament selected in Slic3r. This is " +"only supported in recent Marlin." +msgstr "" +"이 실험 설정은 선형 밀리미터 대신에 입방 밀리미터 단위의 E 값을 출력으로 사용" +"합니다. 펌웨어가 필라멘트 직경을 모르는 경우 볼륨 모드를 켜고 선택한 필라멘트" +"와 연결된 필라멘트 직경을 사용하기 위해 시작 G 코드에 'M200 D " +"[filament_diameter_0] T0'과 같은 명령을 입력 할 수 있습니다 Slic3r. 이것은 최" +"근의 말린에서만 지원됩니다." + +#: src/libslic3r/PrintConfig.cpp:2136 +msgid "Enable variable layer height feature" +msgstr "가변 레이어 높이 기능 사용" + +#: src/libslic3r/PrintConfig.cpp:2137 +msgid "" +"Some printers or printer setups may have difficulties printing with a " +"variable layer height. Enabled by default." +msgstr "" +"일부 프린터 또는 프린터 설정은 가변 레이어 높이로 인쇄하는 데 어려움이있을 " +"수 있습니다. 기본적으로 사용됩니다." + +#: src/libslic3r/PrintConfig.cpp:2143 +msgid "Wipe while retracting" +msgstr "수축시 닦아내십시오" + +#: src/libslic3r/PrintConfig.cpp:2144 +msgid "" +"This flag will move the nozzle while retracting to minimize the possible " +"blob on leaky extruders." +msgstr "" +"이 플래그는 누출된 리트랙싱의 블럽 가능성을 최소화하기 위해 수축하는 동안 노" +"즐을 이동시킨다." + +#: src/libslic3r/PrintConfig.cpp:2151 +msgid "" +"Multi material printers may need to prime or purge extruders on tool " +"changes. Extrude the excess material into the wipe tower." +msgstr "" +"멀티 메터리알 프린터는 공구 교환 시 익스트루더를 프라이밍하거나 제거해야 할 " +"수 있다. 과도한 물질을 와이퍼 타워에 돌출시킨다." + +#: src/libslic3r/PrintConfig.cpp:2157 +msgid "Purging volumes - load/unload volumes" +msgstr "볼륨 삭제 - 볼륨 로드/언로드" + +#: src/libslic3r/PrintConfig.cpp:2158 +msgid "" +"This vector saves required volumes to change from/to each tool used on the " +"wipe tower. These values are used to simplify creation of the full purging " +"volumes below." +msgstr "" +"이 벡터는 지우기 타워에서 사용 되는 각 도구에서/로 변경 하는 데 필요한 볼륨" +"을 저장 합니다. 이러한 값은 아래의 전체 퍼징 볼륨의 생성을 단순화 하는 데 사" +"용 됩니다." + +#: src/libslic3r/PrintConfig.cpp:2164 +msgid "Purging volumes - matrix" +msgstr "볼륨 삭제 - 행렬" + +#: src/libslic3r/PrintConfig.cpp:2165 +msgid "" +"This matrix describes volumes (in cubic milimetres) required to purge the " +"new filament on the wipe tower for any given pair of tools." +msgstr "" +"이 매트릭스는 지정 된 도구 쌍에 대해 와이퍼 타워의 새필라멘트를 제거 하는 데 " +"필요한 체적 (입방 밀리 미터)을 설명 합니다." + +#: src/libslic3r/PrintConfig.cpp:2174 +msgid "Position X" +msgstr "X축 위치" + +#: src/libslic3r/PrintConfig.cpp:2175 +msgid "X coordinate of the left front corner of a wipe tower" +msgstr "와이프 타워의 좌측 전면 모서리의 X 좌표" + +#: src/libslic3r/PrintConfig.cpp:2181 +msgid "Position Y" +msgstr "Y축 위치" + +#: src/libslic3r/PrintConfig.cpp:2182 +msgid "Y coordinate of the left front corner of a wipe tower" +msgstr "와이퍼 작동 타워의 좌측 전방 모서리의 Y 좌표" + +#: src/libslic3r/PrintConfig.cpp:2189 +msgid "Width of a wipe tower" +msgstr "와이퍼 타워 폭" + +#: src/libslic3r/PrintConfig.cpp:2195 +msgid "Wipe tower rotation angle" +msgstr "와이퍼 타워 회전각도" + +#: src/libslic3r/PrintConfig.cpp:2196 +msgid "Wipe tower rotation angle with respect to x-axis." +msgstr "X 축에 대해 타워 회전 각도를 닦습니다." + +#: src/libslic3r/PrintConfig.cpp:2203 +msgid "Wipe into this object's infill" +msgstr "이 오브젝트의 채우기로 지우기" + +#: src/libslic3r/PrintConfig.cpp:2204 +msgid "" +"Purging after toolchange will done inside this object's infills. This lowers " +"the amount of waste but may result in longer print time due to additional " +"travel moves." +msgstr "" +"도구 변경 후 제거는 이 개체의 채우기 내부에서 수행 됩니다. 이렇게 하면 낭비 " +"되는 양이 줄어들지만 추가적인 이동으로 인해 인쇄 시간이 길어질 수 있습니다." + +#: src/libslic3r/PrintConfig.cpp:2211 +msgid "Wipe into this object" +msgstr "이 개체로 지우기" + +#: src/libslic3r/PrintConfig.cpp:2212 +msgid "" +"Object will be used to purge the nozzle after a toolchange to save material " +"that would otherwise end up in the wipe tower and decrease print time. " +"Colours of the objects will be mixed as a result." +msgstr "" +"객체는 도구 변경 후 노즐을 소거 하는 데 사용 되며, 그렇지 않으면 와이프 타워" +"에서 종료 되는 재료를 저장 하고 인쇄 시간을 줄입니다. 그 결과 개체의 색상이 " +"혼합 됩니다." + +#: src/libslic3r/PrintConfig.cpp:2218 +msgid "Maximal bridging distance" +msgstr "최대 브리징 거리" + +#: src/libslic3r/PrintConfig.cpp:2219 +msgid "Maximal distance between supports on sparse infill sections." +msgstr "드문드문한 인필 섹션에서 지지대 사이의 최대 거리." + +#: src/libslic3r/PrintConfig.cpp:2225 +msgid "XY Size Compensation" +msgstr "XY 크기 보정" + +#: src/libslic3r/PrintConfig.cpp:2227 +msgid "" +"The object will be grown/shrunk in the XY plane by the configured value " +"(negative = inwards, positive = outwards). This might be useful for fine-" +"tuning hole sizes." +msgstr "" +"XY 평면에서 설정된 값(음수 = 안, 양 = 바깥쪽)에 따라 객체가 증가/정격된다. 이" +"는 구멍 크기를 미세 조정하는데 유용할 수 있다." + +#: src/libslic3r/PrintConfig.cpp:2235 +msgid "Z offset" +msgstr "Z 오프셋" + +#: src/libslic3r/PrintConfig.cpp:2236 +msgid "" +"This value will be added (or subtracted) from all the Z coordinates in the " +"output G-code. It is used to compensate for bad Z endstop position: for " +"example, if your endstop zero actually leaves the nozzle 0.3mm far from the " +"print bed, set this to -0.3 (or fix your endstop)." +msgstr "" +"이 값은 출력 G-코드의 모든 Z 좌표에서 추가(또는 감산)된다. 예를 들어, 엔드 스" +"톱 0이 실제로 노즐을 프린트 베드에서 0.3mm 떨어진 곳에 둔 경우, 이를 -0.3(또" +"는 엔드 스톱을 고정)으로 설정하십시오." + +#: src/libslic3r/PrintConfig.cpp:2294 +msgid "Display width" +msgstr "디스플레이 너비" + +#: src/libslic3r/PrintConfig.cpp:2295 +msgid "Width of the display" +msgstr "디스플레이의 폭입니다" + +#: src/libslic3r/PrintConfig.cpp:2300 +msgid "Display height" +msgstr "표시 높이" + +#: src/libslic3r/PrintConfig.cpp:2301 +msgid "Height of the display" +msgstr "디스플레이의 높이" + +#: src/libslic3r/PrintConfig.cpp:2306 +msgid "Number of pixels in" +msgstr "의 픽셀 수" + +#: src/libslic3r/PrintConfig.cpp:2308 +msgid "Number of pixels in X" +msgstr "X의 픽셀 수" + +#: src/libslic3r/PrintConfig.cpp:2314 +msgid "Number of pixels in Y" +msgstr "Y의 픽셀 수" + +#: src/libslic3r/PrintConfig.cpp:2319 +msgid "Display horizontal mirroring" +msgstr "수평 미러링 표시" + +#: src/libslic3r/PrintConfig.cpp:2320 +msgid "Mirror horizontally" +msgstr "수평으로 미러" + +#: src/libslic3r/PrintConfig.cpp:2321 +msgid "Enable horizontal mirroring of output images" +msgstr "출력 이미지의 수평 미러링 사용" + +#: src/libslic3r/PrintConfig.cpp:2326 +msgid "Display vertical mirroring" +msgstr "수직 미러링 표시" + +#: src/libslic3r/PrintConfig.cpp:2327 +msgid "Mirror vertically" +msgstr "수직으로 미러" + +#: src/libslic3r/PrintConfig.cpp:2328 +msgid "Enable vertical mirroring of output images" +msgstr "출력 이미지의 수직 미러링 사용" + +#: src/libslic3r/PrintConfig.cpp:2333 +msgid "Display orientation" +msgstr "디스플레이 방향" + +#: src/libslic3r/PrintConfig.cpp:2334 +msgid "" +"Set the actual LCD display orientation inside the SLA printer. Portrait mode " +"will flip the meaning of display width and height parameters and the output " +"images will be rotated by 90 degrees." +msgstr "" +"SLA 프린터 내에서 실제 LCD 디스플레이 방향을 설정 합니다. 세로 모드는 디스플" +"레이 너비 및 높이 매개 변수의 의미를 반전 하 고 출력 이미지는 90도 회전 합니" +"다." + +#: src/libslic3r/PrintConfig.cpp:2340 +msgid "Landscape" +msgstr "가로" + +#: src/libslic3r/PrintConfig.cpp:2341 +msgid "Portrait" +msgstr "세로모드" + +#: src/libslic3r/PrintConfig.cpp:2346 +msgid "Fast" +msgstr "빠른" + +#: src/libslic3r/PrintConfig.cpp:2347 +msgid "Fast tilt" +msgstr "빠른 기울기" + +#: src/libslic3r/PrintConfig.cpp:2348 +msgid "Time of the fast tilt" +msgstr "기울이기 시간" + +#: src/libslic3r/PrintConfig.cpp:2355 +msgid "Slow" +msgstr "느리게" + +#: src/libslic3r/PrintConfig.cpp:2356 +msgid "Slow tilt" +msgstr "슬로우 틸트" + +#: src/libslic3r/PrintConfig.cpp:2357 +msgid "Time of the slow tilt" +msgstr "느린 기울기의 시간" + +#: src/libslic3r/PrintConfig.cpp:2364 +msgid "Area fill" +msgstr "영역 채우기" + +#: src/libslic3r/PrintConfig.cpp:2365 +msgid "" +"The percentage of the bed area. \n" +"If the print area exceeds the specified value, \n" +"then a slow tilt will be used, otherwise - a fast tilt" +msgstr "" +"침대 영역의 비율입니다. \n" +"인쇄 영역이 지정 된 값을 초과 하면 \n" +"그런 다음 느린 기울기가 사용 됩니다, 그렇지 않으면-빠른 기울기가 됩니다" + +#: src/libslic3r/PrintConfig.cpp:2372 src/libslic3r/PrintConfig.cpp:2373 +#: src/libslic3r/PrintConfig.cpp:2374 +msgid "Printer scaling correction" +msgstr "프린터 스케일링 보정" + +#: src/libslic3r/PrintConfig.cpp:2380 src/libslic3r/PrintConfig.cpp:2381 +msgid "Printer absolute correction" +msgstr "프린터 절대 보정" + +#: src/libslic3r/PrintConfig.cpp:2382 +msgid "" +"Will inflate or deflate the sliced 2D polygons according to the sign of the " +"correction." +msgstr "교정 기호에 따라 슬라이스된 2D 폴리곤을 팽창 하거나 수축 합니다." + +#: src/libslic3r/PrintConfig.cpp:2388 src/libslic3r/PrintConfig.cpp:2389 +msgid "Printer gamma correction" +msgstr "프린터 감마 보정" + +#: src/libslic3r/PrintConfig.cpp:2390 +msgid "" +"This will apply a gamma correction to the rasterized 2D polygons. A gamma " +"value of zero means thresholding with the threshold in the middle. This " +"behaviour eliminates antialiasing without losing holes in polygons." +msgstr "" +"이렇게 하면 래스터화된 2D 다각형에 감마 보정이 적용 됩니다. 감마 값이 0 이면 " +"중간에 임계값이 임계화 의미입니다. 이 동작은 폴리곤의 구멍을 잃지 않고 안티알" +"리아싱을 제거 합니다." + +#: src/libslic3r/PrintConfig.cpp:2401 src/libslic3r/PrintConfig.cpp:2402 +msgid "Initial layer height" +msgstr "초기 레이어 높이" + +#: src/libslic3r/PrintConfig.cpp:2408 +msgid "Faded layers" +msgstr "페이드 레이어" + +#: src/libslic3r/PrintConfig.cpp:2409 +msgid "" +"Number of the layers needed for the exposure time fade from initial exposure " +"time to the exposure time" +msgstr "노출 시간에 필요한 레이어 수는 초기 노출 시간에서 노출 시간으로 페이드" + +#: src/libslic3r/PrintConfig.cpp:2416 src/libslic3r/PrintConfig.cpp:2417 +msgid "Exposure time" +msgstr "노출 시간" + +#: src/libslic3r/PrintConfig.cpp:2423 src/libslic3r/PrintConfig.cpp:2424 +msgid "Initial exposure time" +msgstr "초기 노출 시간" + +#: src/libslic3r/PrintConfig.cpp:2430 src/libslic3r/PrintConfig.cpp:2431 +msgid "Correction for expansion" +msgstr "확장 보정" + +#: src/libslic3r/PrintConfig.cpp:2437 +msgid "SLA print material notes" +msgstr "SLA 인쇄 재료 참고 사항" + +#: src/libslic3r/PrintConfig.cpp:2438 +msgid "You can put your notes regarding the SLA print material here." +msgstr "여기에서 SLA 인쇄 자료에 대한 메모를 넣을 수 있습니다." + +#: src/libslic3r/PrintConfig.cpp:2446 src/libslic3r/PrintConfig.cpp:2457 +msgid "Default SLA material profile" +msgstr "기본 SLA 재질 프로 파일" + +#: src/libslic3r/PrintConfig.cpp:2468 +msgid "Generate supports" +msgstr "지원 생성" + +#: src/libslic3r/PrintConfig.cpp:2470 +msgid "Generate supports for the models" +msgstr "모델에 대한 지원 생성" + +#: src/libslic3r/PrintConfig.cpp:2475 +msgid "Support head front diameter" +msgstr "서포트 헤드 전면 지름" + +#: src/libslic3r/PrintConfig.cpp:2477 +msgid "Diameter of the pointing side of the head" +msgstr "헤드 포인팅 측면 지름" + +#: src/libslic3r/PrintConfig.cpp:2484 +msgid "Support head penetration" +msgstr "서포트 헤드 관통" + +#: src/libslic3r/PrintConfig.cpp:2486 +msgid "How much the pinhead has to penetrate the model surface" +msgstr "핀 헤드가 모델 표면에 침투 하는 정도" + +#: src/libslic3r/PrintConfig.cpp:2493 +msgid "Support head width" +msgstr "서포트 헤드 폭" + +#: src/libslic3r/PrintConfig.cpp:2495 +msgid "Width from the back sphere center to the front sphere center" +msgstr "뒤쪽 구 중심에서 앞쪽 구 중심 까지의 폭입니다" + +#: src/libslic3r/PrintConfig.cpp:2503 +msgid "Support pillar diameter" +msgstr "서포트 기둥 지름" + +#: src/libslic3r/PrintConfig.cpp:2505 +msgid "Diameter in mm of the support pillars" +msgstr "서포트 기둥의 지름 (mm)" + +#: src/libslic3r/PrintConfig.cpp:2513 +msgid "Support pillar connection mode" +msgstr "기둥 연결 모드 지원" + +#: src/libslic3r/PrintConfig.cpp:2514 +msgid "" +"Controls the bridge type between two neighboring pillars. Can be zig-zag, " +"cross (double zig-zag) or dynamic which will automatically switch between " +"the first two depending on the distance of the two pillars." +msgstr "" +"인접한 두 기둥 사이의 교량 유형을 제어 합니다. 두 기둥의 거리에 따라 자동으" +"로 처음 두 사이를 전환 하는 지그재그, 크로스 (지그재그 더블 지그재그) 또는 동" +"적 수 있습니다." + +#: src/libslic3r/PrintConfig.cpp:2522 +msgid "Zig-Zag" +msgstr "지그재그" + +#: src/libslic3r/PrintConfig.cpp:2523 +msgid "Cross" +msgstr "크로스" + +#: src/libslic3r/PrintConfig.cpp:2524 +msgid "Dynamic" +msgstr "동적" + +#: src/libslic3r/PrintConfig.cpp:2536 +msgid "Pillar widening factor" +msgstr "기둥 확장 계수" + +#: src/libslic3r/PrintConfig.cpp:2538 +msgid "" +"Merging bridges or pillars into another pillars can increase the radius. " +"Zero means no increase, one means full increase." +msgstr "" +"브릿지 또는 기둥을 다른 기둥에 병합 하면 반지름을 늘릴 수 있습니다. 0은 증가 " +"없음을 의미 하나는 전체 증가를 의미 합니다." + +#: src/libslic3r/PrintConfig.cpp:2547 +msgid "Support base diameter" +msgstr "서포트 베이스 지름" + +#: src/libslic3r/PrintConfig.cpp:2549 +msgid "Diameter in mm of the pillar base" +msgstr "기둥 베이스의 mm 직경" + +#: src/libslic3r/PrintConfig.cpp:2557 +msgid "Support base height" +msgstr "서포트 기준 높이" + +#: src/libslic3r/PrintConfig.cpp:2559 +msgid "The height of the pillar base cone" +msgstr "서포트 베이스 원추의 높이" + +#: src/libslic3r/PrintConfig.cpp:2566 +msgid "Support base safety distance" +msgstr "지지기본 안전 거리" + +#: src/libslic3r/PrintConfig.cpp:2569 +msgid "" +"The minimum distance of the pillar base from the model in mm. Makes sense in " +"zero elevation mode where a gap according to this parameter is inserted " +"between the model and the pad." +msgstr "" +"모델에서 기둥 베이스의 최소 거리(mm.mm.)는 이 매개변수에 따른 간격이 모델과 " +"패드 사이에 삽입되는 제로 고도 모드에서 의미가 있습니다." + +#: src/libslic3r/PrintConfig.cpp:2579 +msgid "Critical angle" +msgstr "임계 각도" + +#: src/libslic3r/PrintConfig.cpp:2581 +msgid "The default angle for connecting support sticks and junctions." +msgstr "서포트 스틱과 접합부를 연결 하는 기본 각도입니다." + +#: src/libslic3r/PrintConfig.cpp:2589 +msgid "Max bridge length" +msgstr "최대 브리지 길이" + +#: src/libslic3r/PrintConfig.cpp:2591 +msgid "The max length of a bridge" +msgstr "브릿지의 최대 길이" + +#: src/libslic3r/PrintConfig.cpp:2598 +msgid "Max pillar linking distance" +msgstr "최대 기둥 연결 거리" + +#: src/libslic3r/PrintConfig.cpp:2600 +msgid "" +"The max distance of two pillars to get linked with each other. A zero value " +"will prohibit pillar cascading." +msgstr "" +"서로 연결 되는 두기둥의 최대 거리. 0 값은 기둥을 계단식으로 금지 합니다." + +#: src/libslic3r/PrintConfig.cpp:2608 +msgid "Object elevation" +msgstr "객체 고도" + +#: src/libslic3r/PrintConfig.cpp:2610 +msgid "" +"How much the supports should lift up the supported object. If this value is " +"zero, the bottom of the model geometry will be considered as part of the pad." +msgstr "" +"지원 대상을 들어 올려야 하는 양입니다. 이 값이 0이면 모델 형상의 맨 아래가 패" +"드의 일부로 간주됩니다." + +#: src/libslic3r/PrintConfig.cpp:2622 +msgid "This is a relative measure of support points density." +msgstr "이는 서포트 점 밀도의 상대적인 척도입니다." + +#: src/libslic3r/PrintConfig.cpp:2628 +msgid "Minimal distance of the support points" +msgstr "서포트 지점의 최소 거리" + +#: src/libslic3r/PrintConfig.cpp:2630 +msgid "No support points will be placed closer than this threshold." +msgstr "서포트 지점은 이 임계값 보다 더 가깝게 배치 되지 않습니다." + +#: src/libslic3r/PrintConfig.cpp:2636 +msgid "Use pad" +msgstr "패드 사용" + +#: src/libslic3r/PrintConfig.cpp:2638 +msgid "Add a pad underneath the supported model" +msgstr "서포트 되는 모델 아래에 패드 추가" + +#: src/libslic3r/PrintConfig.cpp:2643 +msgid "Pad wall thickness" +msgstr "패드 벽 두께" + +#: src/libslic3r/PrintConfig.cpp:2645 +msgid "The thickness of the pad and its optional cavity walls." +msgstr "패드의 두께와 옵션 캐비티 벽." + +#: src/libslic3r/PrintConfig.cpp:2653 +msgid "Pad wall height" +msgstr "패드 벽 높이" + +#: src/libslic3r/PrintConfig.cpp:2654 +msgid "" +"Defines the pad cavity depth. Set to zero to disable the cavity. Be careful " +"when enabling this feature, as some resins may produce an extreme suction " +"effect inside the cavity, which makes peeling the print off the vat foil " +"difficult." +msgstr "" +"패드 캐비티 깊이를 정의 합니다. 캐비티를 비활성화 하려면 0으로 설정 합니다. " +"이 기능을 활성화 할 때 주의 해야할, 일부 수 캐비티 내부 극단적인 흡입 효과를 " +"생성 할 수도 있기 때문에, vat 호일 인쇄를 벗겨 어렵게 만든다." + +#: src/libslic3r/PrintConfig.cpp:2667 +msgid "Max merge distance" +msgstr "최대 병합 거리" + +#: src/libslic3r/PrintConfig.cpp:2669 +msgid "" +"Some objects can get along with a few smaller pads instead of a single big " +"one. This parameter defines how far the center of two smaller pads should " +"be. If theyare closer, they will get merged into one pad." +msgstr "" +"일부 개체는 큰 하나 대신 몇 가지 작은 패드와 함께 얻을 수 있습니다. 이 매개 " +"변수는 두 개의 작은 패드의 중심이 얼마나 되어야 하는지 정의 합니다. 그들은 하" +"나의 패드에 병합을 얻을 것이다." + +#: src/libslic3r/PrintConfig.cpp:2680 +msgid "Pad edge radius" +msgstr "패드 가장자리 반경" + +#: src/libslic3r/PrintConfig.cpp:2689 +msgid "Pad wall slope" +msgstr "패드 벽 경사" + +#: src/libslic3r/PrintConfig.cpp:2691 +msgid "" +"The slope of the pad wall relative to the bed plane. 90 degrees means " +"straight walls." +msgstr "" +"침대 평면을 기준으로 하는 패드 벽의 기울기입니다. 90도는 직선 벽을 의미 합니" +"다." + +#: src/libslic3r/PrintConfig.cpp:2700 +msgid "Pad object gap" +msgstr "패드 오브젝트 갭" + +#: src/libslic3r/PrintConfig.cpp:2702 +msgid "" +"The gap between the object bottom and the generated pad in zero elevation " +"mode." +msgstr "0 고도 모드에서 오브젝트 바닥과 생성된 패드 사이의 간격입니다." + +#: src/libslic3r/PrintConfig.cpp:2711 +msgid "Pad object connector stride" +msgstr "패드 오브젝트 커넥터 보폭" + +#: src/libslic3r/PrintConfig.cpp:2713 +msgid "" +"Distance between two connector sticks between the object pad and the " +"generated pad." +msgstr "오브젝트 패드와 생성된 패드 사이의 두 커넥터 스틱 사이의 거리입니다." + +#: src/libslic3r/PrintConfig.cpp:2721 +msgid "Pad object connector width" +msgstr "패드 오브젝트 커넥터 너비" + +#: src/libslic3r/PrintConfig.cpp:2723 +msgid "" +"The width of the connectors sticks which connect the object pad and the " +"generated pad." +msgstr "커넥터의 너비는 오브젝트 패드와 생성된 패드를 연결하는 스틱입니다." + +#: src/libslic3r/PrintConfig.cpp:2731 +msgid "Pad object connector penetration" +msgstr "패드 오브젝트 커넥터 침투" + +#: src/libslic3r/PrintConfig.cpp:2734 +msgid "How much should the tiny connectors penetrate into the model body." +msgstr "작은 커넥터가 모델 본체에 얼마나 침투해야 하는가?" + +#: src/libslic3r/PrintConfig.cpp:3094 +msgid "Export OBJ" +msgstr "OBJ 내보내기" + +#: src/libslic3r/PrintConfig.cpp:3095 +msgid "Export the model(s) as OBJ." +msgstr "모델을 OBJ로 내보냅니다." + +#: src/libslic3r/PrintConfig.cpp:3106 +msgid "Export SLA" +msgstr "STL로 내보내기" + +#: src/libslic3r/PrintConfig.cpp:3107 +msgid "Slice the model and export SLA printing layers as PNG." +msgstr "모델을 분할하고 SLA 인쇄 레이어를 PNG로 내보냅니다." + +#: src/libslic3r/PrintConfig.cpp:3112 +msgid "Export 3MF" +msgstr "3MF 내보내기" + +#: src/libslic3r/PrintConfig.cpp:3113 +msgid "Export the model(s) as 3MF." +msgstr "모델을 3MF로 내보냅니다." + +#: src/libslic3r/PrintConfig.cpp:3117 +msgid "Export AMF" +msgstr "AMF 내보내기" + +#: src/libslic3r/PrintConfig.cpp:3118 +msgid "Export the model(s) as AMF." +msgstr "모델을 AMF로 내보냅니다." + +#: src/libslic3r/PrintConfig.cpp:3122 +msgid "Export STL" +msgstr "STL 내보내기" + +#: src/libslic3r/PrintConfig.cpp:3123 +msgid "Export the model(s) as STL." +msgstr "모델을 STL로 내보냅니다." + +#: src/libslic3r/PrintConfig.cpp:3128 +msgid "Slice the model and export toolpaths as G-code." +msgstr "모델을 슬라이스하고 공구 경로를 G 코드로 내보냅니다." + +#: src/libslic3r/PrintConfig.cpp:3133 +msgid "Slice" +msgstr "슬라이스" + +#: src/libslic3r/PrintConfig.cpp:3134 +msgid "" +"Slice the model as FFF or SLA based on the printer_technology configuration " +"value." +msgstr "프린터_기술 구성 값을 기반으로 모델을 FFF 또는 SLA로 슬라이스합니다." + +#: src/libslic3r/PrintConfig.cpp:3139 +msgid "Help" +msgstr "도움말" + +#: src/libslic3r/PrintConfig.cpp:3140 +msgid "Show this help." +msgstr "이 도움말을 표시 합니다." + +#: src/libslic3r/PrintConfig.cpp:3145 +msgid "Help (FFF options)" +msgstr "도움말 (FFF 옵션)" + +#: src/libslic3r/PrintConfig.cpp:3146 +msgid "Show the full list of print/G-code configuration options." +msgstr "인쇄/G 코드 구성 옵션의 전체 목록을 표시 합니다." + +#: src/libslic3r/PrintConfig.cpp:3150 +msgid "Help (SLA options)" +msgstr "도움말 (SLA 옵션)" + +#: src/libslic3r/PrintConfig.cpp:3151 +msgid "Show the full list of SLA print configuration options." +msgstr "SLA 인쇄 구성 옵션의 전체 목록을 표시 합니다." + +#: src/libslic3r/PrintConfig.cpp:3155 +msgid "Output Model Info" +msgstr "출력 모델 정보" + +#: src/libslic3r/PrintConfig.cpp:3156 +msgid "Write information about the model to the console." +msgstr "모델에 대한 정보를 콘솔에 씁니다." + +#: src/libslic3r/PrintConfig.cpp:3160 +msgid "Save config file" +msgstr "구성 파일 저장" + +#: src/libslic3r/PrintConfig.cpp:3161 +msgid "Save configuration to the specified file." +msgstr "지정 된 파일에 구성을 저장 합니다." + +#: src/libslic3r/PrintConfig.cpp:3171 +msgid "Align XY" +msgstr "XY 정렬" + +#: src/libslic3r/PrintConfig.cpp:3172 +msgid "Align the model to the given point." +msgstr "모델을 지정된 점에 맞춥니다." + +#: src/libslic3r/PrintConfig.cpp:3177 +msgid "Cut model at the given Z." +msgstr "지정된 Z에서 모델을 잘라냅니다." + +#: src/libslic3r/PrintConfig.cpp:3198 +msgid "Center" +msgstr "중앙" + +#: src/libslic3r/PrintConfig.cpp:3199 +msgid "Center the print around the given center." +msgstr "지정된 중심을 중심으로 인쇄 합니다." + +#: src/libslic3r/PrintConfig.cpp:3203 +msgid "Don't arrange" +msgstr "준비하지 마십시오" + +#: src/libslic3r/PrintConfig.cpp:3204 +msgid "" +"Do not rearrange the given models before merging and keep their original XY " +"coordinates." +msgstr "" +"병합하기 전에 지정된 모델을 재정렬하고 원래 XY 좌표를 유지하지 마십시오." + +#: src/libslic3r/PrintConfig.cpp:3207 +msgid "Duplicate" +msgstr "복사" + +#: src/libslic3r/PrintConfig.cpp:3208 +msgid "Multiply copies by this factor." +msgstr "이 계수로 복사본을 곱합니다." + +#: src/libslic3r/PrintConfig.cpp:3212 +msgid "Duplicate by grid" +msgstr "모눈에 따라 복제" + +#: src/libslic3r/PrintConfig.cpp:3213 +msgid "Multiply copies by creating a grid." +msgstr "격자를 만들어 복사본을 곱합니다." + +#: src/libslic3r/PrintConfig.cpp:3216 +msgid "Merge" +msgstr "병합" + +#: src/libslic3r/PrintConfig.cpp:3217 +msgid "" +"Arrange the supplied models in a plate and merge them in a single model in " +"order to perform actions once." +msgstr "" +"한 번 작업을 수행하기 위해 제공 된 모델을 정렬하고 단일 모델로 병합 합니다." + +#: src/libslic3r/PrintConfig.cpp:3222 +msgid "" +"Try to repair any non-manifold meshes (this option is implicitly added " +"whenever we need to slice the model to perform the requested action)." +msgstr "" +"비 다양체 메쉬를 복구 하십시오 (요청 된 작업을 수행 하기 위해 모델을 슬라이" +"스 해야 할때마다 이 옵션이 암시적으로 추가 됨)." + +#: src/libslic3r/PrintConfig.cpp:3226 +msgid "Rotation angle around the Z axis in degrees." +msgstr "Z 축 주위의 회전 각도입니다." + +#: src/libslic3r/PrintConfig.cpp:3230 +msgid "Rotate around X" +msgstr "X 주위 회전" + +#: src/libslic3r/PrintConfig.cpp:3231 +msgid "Rotation angle around the X axis in degrees." +msgstr "X 축을 중심으로 회전 각도 (도)입니다." + +#: src/libslic3r/PrintConfig.cpp:3235 +msgid "Rotate around Y" +msgstr "Y 주위로 회전" + +#: src/libslic3r/PrintConfig.cpp:3236 +msgid "Rotation angle around the Y axis in degrees." +msgstr "Y 축을 중심으로 회전 각도 (도)입니다." + +#: src/libslic3r/PrintConfig.cpp:3241 +msgid "Scaling factor or percentage." +msgstr "배율 인수 또는 백분율입니다." + +#: src/libslic3r/PrintConfig.cpp:3246 +msgid "" +"Detect unconnected parts in the given model(s) and split them into separate " +"objects." +msgstr "" +"지정 된 모델에서 연결 되지 않은 부품을 감지 하여 별도의 객체로 분할 합니다." + +#: src/libslic3r/PrintConfig.cpp:3249 +msgid "Scale to Fit" +msgstr "크기에 맞게 조정" + +#: src/libslic3r/PrintConfig.cpp:3250 +msgid "Scale to fit the given volume." +msgstr "지정 된 볼륨에 맞게 크기를 조정 합니다." + +#: src/libslic3r/PrintConfig.cpp:3259 +msgid "Ignore non-existent config files" +msgstr "존재 하지 않는 구성 파일 무시" + +#: src/libslic3r/PrintConfig.cpp:3260 +msgid "Do not fail if a file supplied to --load does not exist." +msgstr "로드에 제공 된 파일이 없는 경우 실패 하지 않습니다." + +#: src/libslic3r/PrintConfig.cpp:3263 +msgid "Load config file" +msgstr "구성 파일 로드" + +#: src/libslic3r/PrintConfig.cpp:3264 +msgid "" +"Load configuration from the specified file. It can be used more than once to " +"load options from multiple files." +msgstr "" +"지정 된 파일에서 구성을 로드 합니다. 여러 파일에서 옵션을 로드 하는 데 두 번 " +"이상 사용할 수 있습니다." + +#: src/libslic3r/PrintConfig.cpp:3267 +msgid "Output File" +msgstr "출력파일" + +#: src/libslic3r/PrintConfig.cpp:3268 +msgid "" +"The file where the output will be written (if not specified, it will be " +"based on the input file)." +msgstr "" +"출력이 기록 되는 파일 (지정 하지 않은 경우 입력 파일을 기반으로 합니다)." + +#: src/libslic3r/PrintConfig.cpp:3278 +msgid "Data directory" +msgstr "데이터 디렉터리" + +#: src/libslic3r/PrintConfig.cpp:3279 +msgid "" +"Load and store settings at the given directory. This is useful for " +"maintaining different profiles or including configurations from a network " +"storage." +msgstr "" +"지정 된 디렉터리에 설정을 로드 하 고 저장 합니다. 이 기능은 다른 프로 파일을 " +"유지 관리 하거나 네트워크 스토리지의 구성을 포함 하는 데 유용 합니다." + +#: src/libslic3r/PrintConfig.cpp:3282 +msgid "Logging level" +msgstr "로깅 수준" + +#: src/libslic3r/PrintConfig.cpp:3283 +msgid "" +"Messages with severity lower or eqal to the loglevel will be printed out. 0:" +"trace, 1:debug, 2:info, 3:warning, 4:error, 5:fatal" +msgstr "" +"로그 수준에 대한 심각도가 낮거나 eqal인 메시지가 인쇄됩니다. 0:추적, 1:디버" +"그, 2:정보, 3:경고, 4:오류, 5:치명적" + +#: src/libslic3r/PrintConfig.cpp:3288 +msgid "Render with a software renderer" +msgstr "소프트웨어 렌더러를 사용 하 여 렌더링" + +#: src/libslic3r/PrintConfig.cpp:3289 +msgid "" +"Render with a software renderer. The bundled MESA software renderer is " +"loaded instead of the default OpenGL driver." +msgstr "" +"소프트웨어 렌더러를 사용 하여 렌더링 합니다. 번들 메사 소프트웨어 렌더러는 기" +"본 OpenGL 드라이버 대신 로드 됩니다." + +#: src/libslic3r/PrintObject.cpp:110 +msgid "Processing triangulated mesh" +msgstr "삼각 측정 메시 처리" + +#: src/libslic3r/PrintObject.cpp:141 +msgid "Generating perimeters" +msgstr "둘레 생성" + +#: src/libslic3r/PrintObject.cpp:251 +msgid "Preparing infill" +msgstr "채우기 준비" + +#: src/libslic3r/PrintObject.cpp:391 +msgid "Generating support material" +msgstr "지원 자료 생성" + +#: src/libslic3r/GCode/PreviewData.cpp:176 +msgid "Mixed" +msgstr "혼합" + +#: src/libslic3r/GCode/PreviewData.cpp:396 +msgid "Height (mm)" +msgstr "높이 (mm)" + +#: src/libslic3r/GCode/PreviewData.cpp:398 +msgid "Width (mm)" +msgstr "폭 (mm)" + +#: src/libslic3r/GCode/PreviewData.cpp:400 +msgid "Speed (mm/s)" +msgstr "속도 (mm/s)" + +#: src/libslic3r/GCode/PreviewData.cpp:402 +msgid "Volumetric flow rate (mm3/s)" +msgstr "용적 유량값 (mm3/s)" + +#: src/libslic3r/GCode/PreviewData.cpp:493 +msgid "Default print color" +msgstr "기본 인쇄 색상" + +#: src/libslic3r/GCode/PreviewData.cpp:500 +#, c-format +msgid "up to %.2f mm" +msgstr "최대%.2f mm" + +#: src/libslic3r/GCode/PreviewData.cpp:504 +#, c-format +msgid "above %.2f mm" +msgstr "above %.2f mm" + +#: src/libslic3r/GCode/PreviewData.cpp:509 +#, c-format +msgid "%.2f - %.2f mm" +msgstr "%.2f - %.2f mm" From 55ca41ae9ccdfaa6cd77af0cf9d1913f42be0c1d Mon Sep 17 00:00:00 2001 From: lee hakmin Date: Fri, 23 Aug 2019 23:47:27 +0900 Subject: [PATCH 005/336] Delete PrusaSlicer.mo --- resources/localization/ko_KR/PrusaSlicer.mo | Bin 194020 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 resources/localization/ko_KR/PrusaSlicer.mo diff --git a/resources/localization/ko_KR/PrusaSlicer.mo b/resources/localization/ko_KR/PrusaSlicer.mo deleted file mode 100644 index 8e1edfd474b1f2b20c0a95919330b2b7caeb1ed7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 194020 zcmc${cYIYv*T20_=tu|Y<Nmh-9on)x;qoMlujMcA#s(%A4 z4tK$9@Ej}v&s+I>m;?D|SQOs2`ofcqz64ac@>Z?_)n08Yw}5$(+r#XzH&p)~hO+ZR zl@CI-I||Bv3Y6V^o4*38AFo37dlS_7-nBdoRo`hC4llthFy|Db&jVGi1eBkv!eX#3 zRJ{Y?4j2V@!7@`Frvv;HJ_0LFGxp=4{QUw{zt_T?a1&HLJ777u$Lc?~{03G;|1&HI zi$6;rV0B1Woj$M{{1oPa*{2&8hAWW0Q0?rq`lE0J^2e|+>@dS|iok(TehxtCM?#Hr zD)hnSQ2oq0)6|y-YCQKtm9Gi|1Yk=jKdpbx*d2uG|8c1DKSTNVHtY+XS&mZ^^n>dE zc*~iVi!5J-YHu6V_z%I(@CH;rTh4Zz2CyH@3#UTazW~*rwJ;X$hq++QIi^32U_5dw zDE%u?(}$5=jE11U^w#6Q1+#kInFT{0TnlYLaoPa z%UL6^Bb41FsPgRf>=jL80f4m1Zj*p@I^pnlM1KS{HU19w504$3<)N(A;{`3;m z{2qo~;h*p$*m{l5hjCplJ|@&%ycupE?qZCDyMhHt~ZQ1e#kW#fnHkPvs;LHX@7%b%e9 zm*W-3VT*Cfz;f_)*aDt{$}jM$8Amu&e`-O+OH<4CP=4zH)vqy7{&*Iuy(Lg_`8v!2 zPe9G*M^Njq*cxMB36?}|41=&Y)O_xTec?H%byRb$<5Ys}pby5uaCjKzgg?Ua@FuJb zORqEQxh+&Z2{0Gj4dv$}a3cH?s{bR_oBAJzYJVwIzc)k8-wvp89fH;2d6*aGe9id1 zD0~t*0&1RLgT3Ki_#iC00pGwOuqpfoHi4Bln*C`AoQ}L5YX5m)lc|3ktcpAXYF@TO z#r;vJ@tm~$6c$AO3aa0~L;2O&Z1%fSFpq~hhS^bfdfkktC#-@T0~N>5!kusj*`TZ>@zkd!DKi|N7@V>3)c~=sud=NH(^P$H5KI{RrZ)5L-55Wbn!*;X2 zEU+O*8%(Q0sNB zl~+Ucf4${SsCtfAo`tf%1n-A8pgaFNj9pR7@=$g)t=tlpMD7S>9}VS~$DqbH4{BVS zt$YH??mMVBz6FcG@^2Y7g7SYCsPaL}8J24-4?x*{4hz9tOsf1=8fxC^L$%WaD!(%< z3N^c}OG_Jqps3st`lYQ2oGaee+EC@9U~`yi^EX2Ib04e&4?)GnO^Az}`}c7chG$@J z*nK}|ZnzApT;~I3o%ew9OFzp;VRqyZP~!_i&C58bbv^|WI?gPpe)TwL{O^O|>}!uh z>6gD}_PZ@m{yzgXPnV&_{TEbyMGqOdEG&-P2+Hq0p!)SN)O^K2`SmfV`Fa9s9KS&M z`6kQ`^B%?*um~IsFF=i>#S!Db&hSa(Nl^CL-#7KNwgxQXn@l=EIOMN&1K4A5WVNT>%pyFy1><0J4#<1`Q<~h^_ zZbY60v*G8)$2m(Nw>&|N!7?Wu=Q%hXGR02WQ|8=s8LmX$b(*p;`V8+9@M}04Ha~01 zZ-dVuho9rD4_||C!l@q;GqC+fhF`&kv_JV{<__+{SoNIw)XaC!^JcyugRUQ8De~vR zVsJC84G%;4>n5xV%U>||eP9{nc$gnP1GB^VQ1P+Y>bFD1(?O_txdaQqub|rf4Ql=8 z#Yt+v0;~>OLFLCo**^)@&T~-pEw%a`R(}Ml-A`a1_%qb{^;|Ui;xG$xU8s3%2)(cs z#P!ZlDEs=COuL<7TjWQf;&}zs_%=Yr@iwUb9J2h#>aW2O=x@W$Fz#~`udhSJTgfj> zoK=PDM?I+ennU%wJFEu>LB-h&sCJh_m46lHhTEa$X%Cd2KDPV;=0nbY+4%c@mZd)39};4vs?%(A}@ut;6AAS-GFo99jJMk`=xn4uZBs;N1zur`^xNd zgP{C65@v_fq4tyKq5883D*sK(<51(g0<};60<|6sTrtnD3Q+lNq5R(yYJMJt8h3)_ z<52#cYUMdrUJg~?S}4D~4YR<5R(}L)KF&kM;}1~d%yZSWR|YEXYgu-Iir;vsxEu>x z!WW>%b=LAb%dFRoz7(uPemy8Z_qX!nQ1iJIs@`o-{W)TJ!SYATtX~^{7lRsC6R7@n zhVsWC%i)$8mXo3UKOephx4>*L?iKxq|mP6nEd(+PtD0w85{XCc*z6Le#TVV}&-14?%)$696zEJ%g3A4g6 zP=0(0=7FoA{J0rv9^SL^XHfI{3(N@%{$SS!R6UhoSy&CqKONy%=!fdpW!M?sftr`j zKbr5HgQ40leZ!2a4b*%*3RQ0q4u|Pb?SBp%!M|V**zhMaUoBx}2m%#>bE7bVEwsO9kW_<0S;&?Qy zB70aH9)d;SA5iN$-!1d~r7Ki>rEZ(?L_*DLU#K`vhMJFbsQu~*sQH`*<%bub`oGf3 z+o1fo2j+txLHX&bM+}1W*l{3F60(a?R0>-;lr>JjDZ^06xaeTg{tp7 zR6XB7`K#z16E9_;<{<($g#BOzI1OsOzGk@{%I;n0_7AGvUo7?OkLK|{sBzYZD&Gal z|9xRO_$aIj$65WWFcx_$Yy?YtJnrvHeW1<*Z$kOyHk9A8hI!mLD+)^^*S2z3D1Z5( z?9!m-;~6*{&V%ZgCyUXSfbx4)ct30j)lMI%bvy_vz7n7t*HGhL21~*XQ2sv*6=&z6 z+W#7=-J6gt%gL41jQ=Jqft;N~s^-TF)qZ2B`RoeS?}woJ83)V2aj-003|GOoq1uVg z?s3;c3RM4IwA>6;{s@%czp(OkE9b~z@(V+aw+2)^)Q5`GW>Do?L;0l(tP;k1DpY@` zydd%<6!%6H@;s`%{z zB@ckL;ZVz&uom(=mfu0OS1PaZZ(GZOQ2h?V8t`eT`ZhrAliQ%idl;%8XQ1Zq2dmGS z&-A}AR2)=>s;@ol0{g-4a2b@pet@pOq3R9G?{U9BIeFsx%a80tJS70Tc1pz7ZRwNCa!#lweC^Zq4N++K$oZ_a`q zcYpOl^}iBSyj6$V$67;;dkj?l)1lVm602ViHJ`g+HF(D6-+>xO-a=--r~*~4J(RzC zL$yBys-GjF>YoCu!-Y`&IRMq~_btyt)pHSQT;D^@&n>8RTe7gpZvr*W4p95wP^fkF zB$U7ALbbacYCk&+)&3Qze*Xcr4;3zA_dBTiyTT@LI8^^vK*iTvQ2X!|tIvPG=~oq~ zc}L(&F64nw&$AN6Jx&DY*;Wu!C$R+U9Zo1oeemT{9w!m* zDeZBhV4bq;BXCYR<_mu1^*HCL=ZEqhrw=?vVbxQiqG`WrB@^F1sCga^6}QPy{Y!`1 z7neZwe44Ff||#wmCd|A0Nwbq@<^z9W?HU+T9^A_Q+OMy-A3WY z-$S6vCqemflGQJTdX8>{>hDLE7opb46{vXp9V-5cRWbH;pvLnsl;4Lyt(O$2@xKH$ z-z%Wj`v$0a-33+dh}9p5iigi&C7uu0q3S78-LMrLiW~ zfr^*(`sO(?3#wn|q5Aa`d>iI(;Bmh%9EFvTqZ^w3O@?&Q*$3OmzLA-y28~Tz^@Z|Z z3RL?q!wmQtRR14tV&ZZ&)I6-Wd=skQ`=R=G1lEOLLe*ESsqs@6sQ7yX%6?Kc}Gfr_Z6DBX^+Y zr%W4TR}C&iZUj~TNvppKwJv_Kya}~W-GQmFN~Fg*4i~`=FtM#Umu!KAxRa%w$N3I@ z{q`Pb7%cyQ$Nhda1tuc@4i!JK9n3lGB76wB-h&?ZchD)YH*)@t9{0UC3NArj2DR@* zb~1530%{-F4rjqDa2(9&>~Y_3ZbBb&oh}|{Dx3{B+i+XQB49Y`x67ss`&I zcY<0^qv1NZ8LB@+dwZPO_;ED+7CCQUkFyQlgm1u2{XEXsaQH(WXFTlJpSZ;SL#X)h zJnV7*UTY|vj{YjFiGJiDkMlEJ0gI!5;SqD*+BDes?|YaB{kS2_3!FaG%+F_!dfdM| ztLyVP-%$QrI1+vsW#+9%v^i(2hCcL{U_;n0#_TT{a5M5&_!x}yoB97329W#4dYt#+ zKG+$~8b*I<|5K=W&lT@+zuUhGZz9(jZq5xgMwmGK8V*GNR)WVl2a6_poX_F+@Gp2G z$>Yp{#{=g15tHn3|2}3RtP{rb1m2{*JSiUcyG@QX)*bQyxQcSaM|zx>kPD=n{qeO? zX5YCECz1af)Os14VV)mPL&?*j*2!#m3`UPO>#W}6h8^Kb^h00+m}QKKlO`}X@*`0D z#xSV*lA)geX;Ayr7}yBTgjwJLDEq@u``0PU%a*@Dt-tI~n0+u6s-DSE&%K3E^{=w> zI`}N|HmLJMyRl|}9so68L*PtU<4KQm0lo#bk1QBx*2_ky{rN*E{Y9w#`B$iYDf?6A z`C1W5U)M4cdXalUl?y_RXELk|Uxcdn9r!3bXyvNoP2AOidcMR$jcWnazPA#F!;Mh; z^EucOUWYoD)Oy;~+YM@;?gtgGNw6op2-T0e6U@Hc*0L{@e`2Bh`M8y5K+W3;hBa7}y8?2&cjao-yqmxBL*wPZ!}dm}9cXISJ>$60C#RDbx$cP4zfy(a)OZ zasNKB<+C2=d*svb6x_?^6NK|;nDv)?riq`$Q2kvATfhxa^ZYH;_`;s^xPPZu49YG5 zl|LHl`TCsIZ-DCO4yg0NB`AN~g0inQ%j5oz-43eUI#>`MfhXX3DEkd;w(|QW*bx2z z)sOHw=K0bbYX2Akm463ny)}H^Zwa2NidxVLh00uE+iRg68lJ@*7ZgZ_G2# zg0OH7~89{MHxhobU)N1Jj}Q zhq=(*@1W{kY4vL@H(LExC_n9l+2DRFAF(_QH4o>Z`h5+mzFScBhb=b!$OAPmMWDuA z6>1(EL)F_Bs=pnf=D#OYJwu@UfH>rf9{5=@0jITsQz7m zs_zG=c=jwYey;&lzBg394=P@QQ02kuls~pW`ExJSes&zHzu8xr^KTKT z=TruiKbJt&e+bHdA6xlrsD0p;m8-5c<8KOO9|`53-caQR+58bu?WI8Z=P9dSV7VO1 zPivt1xfRM!d!XX)W2p6T87fZxfSS*2FPnNRK$WipHBZf<{ND|#A3msgdJM`g1FHTB zQ2ky6)$jFC^S%u>gQub9C;uy^ABCaju?*CDZU8l3eQbU@+>iVeJOm$n)x5V9T;p+` zKpqU$?k7<5@)J}Xg{?LH%muZMNHY!$z-}`UgX`I}yr{Gokvs0{Y-)sD2mOU|0&OKNX<* z-572p0J}l8{}+PlE4|4)-@>8F_kilpLvTEdfjZw_foiwxX5*K7mTjTpqc>E4hC)3z zli(ou3M>z^zHYv^ghTl|4pxKXpyGE848n6z^WS-k>CYfI968F$N1@{BG*o+E!FKQ$ zsQxwGYRY$ml80D12o-NnL-}PI^unc3_3eg=pHooh&>K*GD74Mv{+*W>N`3*V-qo-= z+yOP7FQFIy3G?CSvfDk*eB@ehnD?LkQ0rsgn`XUSf~xO3sPea<)Y^eEv5$e3N0?O}iL+!W6 zp!{^n>VJiQAm`X=>hrv9>M0Giek)oz0%{*`2vvRnR6i1J{^M3257qv2P~{gu&F3np zc-sQ&z;B?&UwW5mZyVHp^)^(0&szNzSP%Jo*a?<@$Hd(T%jvKx`VCP1`OxaWf?njD z@0#;pHP{__Je0pqK-GHfLhnzLA94CkN#YCSH7ii@|P#(x>gpFdeS>tQobg`ws*0xG_HLd`=8RQ*pt?PJrR#`y+R zJ4d0$cN(hRZ=lNEhT3PcAMrR}!EmU3DDV3oHy+Eu4ajYv;{6AxdUG8${V5BVBR7Sb z$4_B2%z4bjZ35J~ngBJfnNa;)4AqZyP|vBit^PZx`fovvv%m+&FZH0tF$hM&D5!c? zT5g7VKX@1V;HOaiZFSsy-|G(*=X;@^-xuISSmK0|4FkS*M?e; z-J$yN64bn{ge%}~DF6CTnK&H-bspIQW&bWz{Rg4!&OnX(TPv47ZN^<6>bctyYCk** z`@kzu>!A4=kMk6K9Cn6(!j7=xS@ZW4v!MF(J5<~+I%n#+2sQ4Tuoi6iq3KsN)IK}h z%1=P;HxsP92!+oJ~jGkQ1RCZ4upfC`nwIvUzcGkSmeB!=RUAL{n-lNMt|*s8Q067neo2{%cH+x zS>&RbpGHvoM-tTYYbjKmz6uq8TcG-N2x=Zr!C~+-_!4~ZlF9!P%3s%^&L25GH|2{! z?Tgi*;=HwGPpG)`LB-E#D7*Pk`{8;h``u7>C$0Pqj6l8(Wmn@1v;VY))sTll`DYf? z{+{>3!&D-Hn;~KhwI^-D`x+X zylU7BY94)-2~hn@huR+|LiKwYRDWNA8sARX1%3lH?~SjSdLk{mLY3J3;v z0X6^ApvL(ERQ>Cr#=jfJ!Ox(^)A4JQ9}Oj^TY0wSYN&EMZ2pH(?fnGhC(k#A#o=7! z+ED9sKb#D|g&IfNx2E4uLdlb$%0CA+j+deO`36+K--l}Fl9jK+4#-)*Gx=Sh`t_*g zSj$CF=e-?J_3VL-;5n!`&-cBlrv}ve4np~B0&D?i!7A_=yaa!RGvSBV&F@=rKX{xi z%7v+y(2yh}&i#j)ET{uZC^$ z^SD3hAKd$wdEWhe$GjhB@b%*YcC9^O?(a8c!@}JC_E$I_{qtGEoJV1?tYL0^jDmWO z=gb!7zURz<#i%ztdzf<+eXAT{&bu&A&M^0PilZ=*`~|tfoZK+yePPZT@(bq)bNA6* zQ1N>eYQOjshQkth!`!%U1NEF60vo^=U`KcqDh`U~3vTMo*uBht^I zUgR-Q?Y?BW6{^2Sq3kb1`R7}xbM#H9_RHKK=KeikC8+2ANT_zkL+w}3LdC<2P|wwO zq3XE-k3pxX8UF`R``KkU1Li4a=6xabBJY6m*C$Z%@f}qAx1r`SOL0?Ad8l(hBdB(I zK#gm#mD8Zs-P2Zn6>2?hhw|$|sCfC%%HKk@^Cwh&SxXqX5R_cP%2g~QpxSE)HLu;E z;wH-K$6C&VitE>G{!u9VYc~Hc_#kr8lBRz{pq~3lmQPvz^HA$(CDe0qH;N$n~M-cQ903j)3mI0oBeLSO>lX zW%mQrxc{=uRx!-|zK{p%J49Q!38q2yze**uzB@qGyBY3>hhPMpS=sD6yP(>;0#*NQ zm>M8L$cRDyaFs05yNtZGIO1C|T>KHdH?&q4ujDus0k7RqqF|89Zy{f>n*a zIMjM82UR`-sy{8D=BpQc2&O=t6AnY!uc~I^c8ldcsChUI71uedhq=G!^@K6VGoa$_ zC#ZJrt6}64P;y<%)|TC%=64X(`WgwZz}ZmoGPk`-tc^jMxbJjBT&VlOZTB!Km zVddjc``c$w^Ar|g+9_|@0_wf8Ka?Nm!?tiA)IOb~wuy^AQ1dte%CE0O&CmBx&x1QK zJMrAPj)|{cbxk`NQ1SLW)V%D3IpAI>zaN3B=OWbp`lHqV1?8v0^^8BtL&+_n{L}?1 zE@GkfyU|efO@(S_iIrDF*}nx9H)k!cTHb^zm#4mIzdY2uML@OJ!Rq@$or`=>^*?3v zCtJ>gIv1?8@&%~zd<(T6{(vf1ph1}X{#p#G-G^XHI0EW<^D2~|w?dV_3|0O|sCdiS z(9BB%I*!Q`u9Vvt&r@@hi0jT<)g6hv)sQOkw^=G}6_d&(a zF(~^pP~*J@RqjWqefbXb!zOKw{bH#2TLo3$W~g~N1m(Yvq55~-vT!>SUyY&ms{v5^ z!!W3R&xC4!8PxfBD^xufpu3;K0m%2YH~or%YA*=Y|EFOmIMwnr)P7d>fiU-bm=EfC zxC&N>A6VXms;6=X6W@)X{1gl2=VYk*r$VitSy27i2sQrqpzAlN@m{lX-Uq{+hmp%e z?URo~*&l$p;VGzgFF>7dufsO5W=FFhCqlKm0Lp$D)OuV8b$;3j<-ZT0?0$n<_kY3q zFn1@zR#0|9D8DX%ny0f3<%fY#{(l-O|9PnKtb-cIajU-!)sNdy^Ix#L zS?_hA&TCzv>I=e1xDaYzI1jtS-=X5}!5)T>!B(<^8u!Oge!30SpK3i#yf%Z1-?32b z?}i%pS*UVn0LggKFqLhWB?EpI@@W4_+z zT-F7ud^*(gX(l`ecfsm#ULVdu9{L9xz+C;poM&LGhwwK%(4Y5k_}73iho8orcLs(z z+u_(p7$=9L&MzfzKb5kKghp9`L$7$nctz7u~2cC2=%;p%a&S`C%K> zJRXJW|0Sq(@ds3V)`~WE-JtSgpyq81RK4?|;%z6?e4T~u;QcYi{|`g8^ElM}%(n8& zQ1QD9s{fau;xo73upo5f8fyM(K`-nN8^KXf>v99s{JjY^?}x4aN2|XDHNHHtrvF~3 zcA7xVb89Gn^n#1Scs@bRSFU)oA2fjTkRO4o;ZN`&Trk|&MU60VG##q_g;4Ro2eyZo zp!T!y1oPfjAFBU7VR`rrRR3Rv9pDbw8F~`UxuGkR|JFj)vj@sAA3%-kGL*l6w{nXl zGao&n{4*SOg{e^O?1qZ_lThQo2sN)aY<}*5kxM}@`ub4w+!w0745)ghL-lhpEKM9< zgN>21KW5^y71VR+MVN*B8}KFMUxQ)pci!hy%)I^yH6K+{&At!;)xTu;9UKc4UkPbu z|C|KX--}T5_B(tR791Jo{_mNbgo>x=bo1TmS=g2K&%iq9D`c3s?gKSXDX=b_4ZFd8 za1kst+Pvp%fa+iN$IU$CwX6i?-{w&Lc>ro&2g4@tc_=>}wY&gxBVUK|`%S3xSDrD( zzty4kmmW~R&okKjv7jh4RB*sQQmuehwEP{|5EEm_5$;bsJP1 z_j$_H^C(nYje?`#vrzB5*~W*t-)kR-@>9X5O+RWwt%o*H`%{1D_6y2ybD;dT0KN#9 zL&Z~z2`0ZYRQtVPRyYJIzN6tpI9W3O$Tu;}{qL{qPvUzh`US8%`kc>jet`Wa8-4VY zF!%3-PrxzQb(m_t!|sK{B~J@;|2w5ka3OMqXT!|*U)TXTVtSbS-z%iSD#$fwm~wq# zQ{;ExNAM5$GCVcYo|B$4=gb38C~X%f7_?qQ4E7VqbVknEN~F7O4JhS!(oU zmW4T6vD*dJUg`?Y8OWR9L-5>6v;HGiV@G~Etc||b%jWqy_!Z-i(rd!p-$kcF&3nhS z=DR`SIy3*j!#_L{tA{Fer|BkzNA;g}8PJ6NHOVeWtLuoGTF-)@sR zcURubbAfgO@OAWCUgy08#%&36|32dvcpmxNt)|@JZDH>33G23pIakr=dc*JrtVcbc zycy>H@BZa`%j`c#p!WN)o%Dz2Sr6C)e!0uUMZ?{!1IjIgr?6YT$DA`p?lt8i_M3Ck z<8TxCGoaQ>n*(N@c7s}HKKM0^gI8dmgC@WEduE<{z@zAg!v|oKLuP*&3$$y$_@^$MkG|PaoQHf8s@$n#<~ec|=0h&=fjO5}h1$pZLG4HJR-Ope z-xr}5Zh~4TC!y>-$IZE*4Aef<49ed_;WID+>V4*C*Z^idVdAeTlpjYz?a$+&_K#Us zeiJHg55vl^>`Ai^wuhyWdqeHd0oV`bK4sc@6l$F&TTX-8e^*1jm+XU@pL0;{e{bdA zq57Zyv{^R|U~S}uuqHeLHICn*<|F4BGq3rfYX1OKKhMJL@D>bbeqaBPIE5d7WY(wmlQ8En z`TkE$oYXlV=G;O)4?l+=T?ljk-f-tuX_76r2S0{pK3%2upu$)`1^-k)MY>;8v)8Alo-)9TbF$kFrqvKxL@sc^#O1Iq8Mq0UMDq3Rt8+rkM@=Zk|->+}lr!Ytnz ze^!E8Ck>(2K~Jdi1EKmGXY~QA&wz^WXQ0;U3s76kp|VD=~n-W<=d7gEw5PKwk&wvtm|;7eWEE;|A#{PH5O{0n+!F+`B3X` z6>JT6S@|!hcq;aT8DASHzr;b64?^|#Da&~<40$coe)1Yr{rh1!JOvfMH(^#-{YR5u z8|FZ638jAkW`muf_VJ!DCyas`#|S9D1)=)$Bvd<7p!_x;%5DRk0JmAW`3*B)ZK3+z z2g)uEs-A#l2GqPh4K>c^q2gr))Vh5KmVoD>2mS`t{vS|rnByliZ>6B>ZDiR7s$6HN z_G4fTm;n_JtDyRS+VWedcC-F$=FtmPe+MW(4up#HsZe&WTJDEhmzSXWRpb{_Zw09F zHiObfTDb?*I3I#u=(qADsC{WJydQ3c>i2t4^L!p^U%3e7hb2r}TitLK;Qn_qHGl6) z!SxyPUYp;Z3dS+nr_qQ4Wg@rEq^ZKz9-AD z9J-ner)d$w+);hmRq+t59V%>&l1rsYZOuaK%*xiak@Bn?GZoigpYKSFu_ z?8vE&&FAR9MmLG1s}r)mo9#q?-qvvxc{Qm4|`h%`6b_1wm7q)9jx)Ml_+cr3I zICZ#BqFm_8Kz3;L>e z0bTrA*4=9Y`FW`GD>TbUxv}HVw48Q{m<$g74_kC5jlj!Rw=x=IVqyyYXLS1iAkFG_?yi&X0 zIQ!A=eWdr04^i(o-2Z6I+<&tm>#9O~Ih0S*^|;kPf?R;Ib;;igbyXuTD{Vc`Jx9E| zm(J82nVq_D6pY4ZiLLJ%{nWJyc?5Y;+0Y|C?>O#X26x45rFKU<<7L((%)S4ZyGL-!28{RZrHE-grX8QkAMr>hNh zgsws8YEl=k($0I_7b5MncJI?paqd4L_2E8r)#v6n><@+%nfNJo<7sbvrZx`JcIet~ z^)H~%nNe3gbYrj?ZQD&iUWr^4?xDVd=uGor{dVj!UpdjQLbsaqGN~^%c}a(<>l<6&Nw@&JJ+|O) za3!|74#3UW>-q@0beKqb0exf2JZJM-k$07(??$@vkgqeEt}oH?C!9`u>zCQw-==JN z@?POyXP;`=mmsx6*0q_s4v0+KPOEKE0^|_8NlS4en1{TV5sI|BVr4zhuYs zt!-l?x|!s^js986Wuq-!8%X*-p=&bvhsmF2MCV;w_B^_e(9I$LTU+lJ)bRp!98pr8 zw!ROrdlfrfx3S^RYVTgds845OT|>D4m^2fc$6!3v6>hnM`@P&(wrlKRThB{2e~pz_ z*tTv`hps;83y@wmqWg|~)aL2j+?%{P@O9hY;X)odG;(d&Kab##5;9qhZn-?9CPd#|;dO}QM%x)yM+tD+spZ|EPfx(t|v zoAFEZ-(&wM%wo$;gk6yzrA%#7 zPEsQFJ{XVwb&{?u$hr=~KPYpP)PweQeP`>+OPgCM`-#;nuMu*2^zYa{)FN*R_AgLx zU8|GbB<^RD_cZ#FB>fKmAav?Z1t|J>lbtlV3h5fbRSdC0JsXiL%yz0 z;6T#1-1jA|CodiOckUmho%l@U{p1ZLHMhF1v^g1@{pfW4imYoI@*V0JYvly^407m- zp!`#m)AbsBjl4tL54QD2;FBTT*Rl1=?iub|U{@0T^OQM@ZcL{9*ie0$bSihvw!6;u zC6fFRq|4YBrLF)r)kv$ze-d4HQXlSbks`2Li0rlTGQig5gDq`ei;(viwgs@wMVer3 z^bO;m*V~jCiEUR~_IYdj3vC?5IE}n+q{p~lOjJoAefSO_dV6 ztfbeuy-NC=bO5^)QoxpLV8<~DIhnSP!5-MH<^DnHscHMO7u~1aPa!>u%_8cpPd)vS z+i<@EZbsI%jQc{|ufgsJvWI+Kd(l-wr*BfLNKLS7j;@U@*B6;=_xgi>bJKnS6qn&? zYop9M)Hev*v*><=tKAZu0YZh5zano1cF$6_1U7skcf#R==o;EFS3&MT(sdn>^4~aG~14JFWdG9bN@X0+obnN?~>M0_InxG>jt*7{?V6EULy9ox|3g! z`@*D&w(bS!E7I2zq|2@q-?Ye&vi)y@?jq?!+t;tH&8OJxvNj{p<)rRL=pMGZfbC11 z<+Cu3Hp^1ac+ySozr^+(Ti-wN0E!q=Rcu#a+twQVgxrjF-iK?Uu1=Qs+Zd}yp04$< zIcYKN45W@y*v+#2`;z=@++TxlVDlSkJ^8QMx>P=NwWaSRDBm8%uh@0r-e>EXh3+%* zb>)Q((SJ#P=&FUTjJ0h<*@`x=76#WtMzA4ynXl#8Ek_Xs^Vu>(EUQ|>o{e( zuOlOSHAC)4`7rEsb;D*KX*>2$lB%E|fP5XhdB}_4KIurKx!1Ln^53cq_d)KzCT|_` zD%-C+t`%{L{YL7@d@V&dXB9cgn@HIoGTDrzOj#@656e+!-OLr(`!w6uW3+pfGMh*v zGSwrqV(4_8LSM|TPs#71uLvpX{vG6Rwl3vOCohpcrILAxln32#blK63fLzeV0taKH300=pk6qpJdW*|7C;|2y}ez-LLio+awb)ep?=>M|yKaPHa%|FlmtK=n;GG9+155lG? z%6`^X`9IUfapd9uuwO&nuhN#T>DcJXXXRY*Ch}Ldo^!}kDL)U6!1jC6Q10J%OEG@> z|2cAQ*x0rcP5sBv?ZWIZaGq4qppC7z zZ?bP{%ZH;MYWuMRZm~8e$?r_wdD~_g^p%i9*F)S#A{3^r3AX%tY`UQ@Z|nZcmYs~9 z-|AM{I(pc479!{1ejhf=p;f!hcql&=MHJ~x>>AKcHtu)A8nzx8-iKTj+hp6Gbh9$$ zA0t1*wtvy;XJfO7l!QEk{2wXXhq`-lA8YH`!+q$wk8!?@@Cr7s+5ET2pG3-GP zA)^raPmm^J|DiP;NL{~hUkCkm+Q@J9HEdnGuw6wR3t(w4R0?zfWvI{Ep@4?ta&t!)bOAmrz;(^Znx1p5H_he-F4 zKZCq9^fA;|l+*)#4Q$>)-xG$eXR!U&)*FFcck+v%izVqQN2+Gqkz9aO8@qL+sgxUv zU3Y6+3|$w}FSfoGlskkhu_7#s-GflqUzYR8e2H`lT}9ikezv`M^lzfOPWp!YIp`mz z+$d6M@_vQ6(HA1tj@mvCn2 z)s^%)ZT^I=JUoQm`_%am9OYW`48rDXlDm1p^R~^^*i1w{hjNwBbtG>(vPZUDpOIgh zr0XI!p{oMADzx`9WoBDj&DeTIT-Xi03Ti+MR?nVA*^rc{?zE7jvXe&RBQ3^KG z)s8LGA6~TWWMQt$*g6x@UB#|5`CHI!F)g_NR!7&1{3nola6grlj}${YInb@P^*v|H zv_xJ?UA3rx6Zd0Dv$4-+`_&k`*2tl&75AUeW-jtmNc*uLN%|B0Me12g%1!B-Cj`>HV=LFKY|4Anr46Pfd3~u~pEo%eNDc&3;{!>)goF%l zj6a$xQq+1%vY+~+{Hf`Ff0DOyy~>p5?i0tLyq&x$>G7%2aWV}0qwz|7lHV6p19vNJ?YQ1fp)1jHYqHxD zwCTPST8fVLr=-ND$wMjXbWDU(*{K{+FBUJjNKAAp*O#1_xaalSDSs2xG1~Ga`jhCj z>(!8L?G!4C@m3|J#Q75vQmRRe@elJS`Ga_o36J)tGI41AF~jg`Z2TyHj4PWgMwA#B z`FE8sCg$&opnoLcV|7u!=n?6@U`&dsQ4Pu=Da|yJ1dTu{eC8xv%QeC^`3@5xjQ-oteGv$Oo5EGxuzoXPOC%i+*(S7`> zsf2Ngx34eCRnumN_@wxhI48WLKOxx(@8pig3GYsidja@0p<0Wojf=WBoyY5|QDA_exVAdi#@o@j-8&zFpnmb;A4jM*8nn(#H)hFCpoK z%S}#r|M;YsK)O@4x4)XZ7QEd9;YM_$%&D44hZEBht2x!&kdFAG< zCO|VO@iEMS#-7OT5Ff>k!BS_X(~Ey?>i<&L34;IcI-jXAx*tqqkT{bqH8DzVsN1NH zcD8!;>v;EUZ0BylJ-bHMbYr4k-G**n!+Uv=ZTm$0TQ$^@skmFZZryu274vrWE1*aF zg8^@RtT!W&=8cmgDd3IMb4O1Lq9^jdL{DVTPTns53~y~O%PEB|JH}xXVA0;)3b>)V zfleg*ZGtvH#g*bZ7)bC|^~H?zvD{*+kxvxSptUZqMgp0$X1qM4cVe)P}S#Es51@hXFPbd zC1?k&=Jf@&K;7tz;)!M+QNh#*Z(l`sqHhH2K%r@?r}Chm4Ll*_@5QNZ?w=TaUN`BZ-fVx1)Aj zzT5p2Z+aZtT@nv`hOD}LBLnd-uT2swj!pGC#uh#bsTip>t>wEKE(zD=1kyj zHW>VQIdgFDcdUcm2)NFEu{emtY>UsN$nX@We~; zR!t2g*N6(FrUnwdDQ?B)q*cxIAT&==34v(5Y}(hcgJ+pP2|saskuoB}wU0N)C~xS| zqpXmQ4hMo9*@)<7ne-aIS5M@$WN(Un)P)?C9>*T5@XxfFYTI+qcv@@JsNLS4xU?7e zl9LnS-8C2!qkWl{%$m7-lj#8+%4_EBk(Qdw!#E)@%!!OuIQ#G+OU}fYc3wYwGaIUx z6PG)pP#;-M3?U)la|0*z>?Q8lnB8JYfzhKGMWQdmeS-0n8Icr7Pcqw+>b-k1avvmV zjEHe0#E(#9=$Mz`*GX0jB*NR)3^_S1I7|Vj;^s-h!crX>uc z!6YVx-cgN={cNZlE=Z;=wlsE~v=k2F+NM<~g;S`Pg=cmxt#rGUxt*f`_6g?Q!X3KZ zDb+y8fkYXT#No}IW4ox$G>i-+q$O&X!dQE83}+OC0CP3K>l+nMJi5ZenT3HN0dFVa za%Np2!z(}}^RKrba|-be54g`eyUh_Eyu>6C2eg-zA>U}C-4(`G5*J8I&>CUHoQ`>q zxV!c16@!VQVh*qDc0ty@JM)~As7foy)WQVcJK|;5yOBfHtguw}C{=G~F^PR=7;Dx& zmYK>jti;%Z(Q$-XjLuE%;&}W?<#!*WY+dFiolQ#<{NHn;^@vMg*#r|g#j}1Ad?|5w zp>=NeArtM6o3j}c&I4NK6aoY%vWIJ{NaDRq$0T~5>MyTmd|HA;O^^+fgSn-N7WO*r zCnoUR=KzmO9fIBSL83p%V40#sxAssdnJA?_hG0}KK0xGmE4dv{(l zIt6kl(;H*v1vx{jGJ#&YPEI0-nN^;*>@_@Y^lZC3@qZ8al=#u6J>G=dv-_xaZoB$p zdBC{0z2k?)h3@+$JCVF;Qe_|s52Z03q4zPKMP~bF>d@EH+YCe0lgesBmS$mEWzc;w zz>j*-^V49E7d^Lvf6Hl>+s%vNV4-(WSFqLUJmf|nha=7xKGs>HFDVUXxJP@Ma5sb$ zUVi^;Y{hVTOKoi$(Gw{;G(2i|8#7A#9)C~cwqiQ0P`dk?qk)*$+RR5Z9UypC1$a65 z+u6Wr8`-XlH?nu{9{s)XJlqJK7%ezGx8rzIc6X`JyBj-gXf?6Om}*75o(lfQ7<6bS zWCieyaM!sWA}nuhY^o@9Bnl+EN6BHF&ypi@w_}BmP+?;%FNTg7|BogAYkLv@n?bqn zLGJeivptvr@v!@!$MYXu4vovyX&(sx;fBoJYX1M5o0*1xPWk^`*K>N(#1b7mk@cZQ zTS{9N4#~?Wpk)8OJ2!~>upPLnzWziGt-e%t-)62N<*s$=y(~8;lkCQbIVakUU!lf^ zOcZLb()o|*V`dqr`?3UM;?2Ix8G5o<@;{+8lFGG6 z^`;jpo~93ua+o#^w+TOQL;WaJw@IBn8{I5-%H3j2U#J)6Xp|a^kCrac{fAm(QscM{ zq^B^vG+sk^I7Sl4ef1Tpo!;|OyzTudoMGJ!%xTxVU9I}{I8nGCTYY>yiE-NT91Qx* zC!Kcg;Q*C;M!5Tp%*e)AIlQe7vqrkr>kB5@hvd|B9gK8#&fue0qCCNL^Zfiz6Mg@2 zPi=~tzgxLW5nt(Zj6U>*UZu?Asl3;Hud}aGM#pjC?kWjc-+Sz-`D9-d-)>Xm{V5W( zYU$>P76%KXx9j@0I%PJ?=DbdQwoTM7@Ts?{T+ zgQ+#W)gzMqiPgrqQgc@r6G=SCO(|%rJMG*9pf~fOF}$lixP&r8C+?7}s7vCT4(ADu zInlgs)1p0Ihh{SLDZ|#En!(=Y-Yd|tW$C!Dfc5|zIxArl`Z}LEJM@I-Fv^E?e5nCw z6`Ak6`kKQ*n*GxplB@E>uic|<=h}SWsm&+C+C6*s>l0b68MXhTy!-Xi`#;&USDF^9 zQrW#~q$U*HFBGmv|Hq2tIk`d}xO*;kS87zo-wwgdX?#%2Kj^gMX_<2Og#pnX3G{)K zV0M3pK$&dbhid7BXPr+Zp?5!q(4PAxwOs=KbKLc6{^g@Dp=IvPt5KZaJz=)vJ1n1y z*yR}-uW2l|49xyh=}odf`Y1Q_ZPQd`mm2-}Z#h~N=F7u>*l**;*U=fC4|D8i+-CYh5gv(O_423T|1G0`{Aj%o{$2autnYpI|GWLaR>IDu zJ>hT7nc)6crTe91B)g~Hgp7s#G$SENKM`>*jdizILgt<-v>NTc#Sd)JBg`wv@U$ei zl-r9?4XmX0X`BW0>y$oM^LZ{hl}AnHDzWJiof>fC<$p4Ce>C&<=^FVz8M<-8KJsr3 zr|L7#K<%{d$5Qo0pI6O?N%KTAiz)QWUut@QFN5*J_*AQ1CfRJK5ndh#dcPhWKdjbh z->{nItnaNF6G+qhrBzpRcl8Y3)p*TF=et{+d6fR`*&F(O?rw{$XLFoV+cAEAig9;x zCPhm<)b-HjD5FrX7!IHD^mH?18yTs$L>?8xf*U<7)m;TXi9L;tU z6);Q34Iwu=*&_Ka;^RvjZ*A>NY;mhrQnd8+`9n{1pLwr0ukfLTT;AI!z=xn=e*R?* z;~{;ZqgU}syi&yT5&vEV(I)=Y6GijC=iH6qf6u-fxtX$uu`)Qes5!G;60jZVJ8xz7 zhqZqg<3~Pd*bltsD<~D{d%o?W@dR6{8zy|(RfZey=J@>g<;zEJ{ZypS(H!CUMNPW_ zpN#Y)c&v}FU^pSjv6^oRiG+h3zcC~2O9oS=FY|6`^NOe+_4$cEis?tVC!7pJu3kkUTpy!y_g z+K4>Pk%QU|c47#E!^5d-!J%B##(lleQYe_ zRRknP-0i)4`tydRT~xC6=5GbSB7+Mx9w(gH+1NX z`v*NCDwN!B+S(S)3aqJTA$z0V&g};j_iMJdPG$Z=M}HM0H|QL}A8eRKAN)V;y=|9P z)tT>mzc_C;pJF9vK#Coz0ExRhq_cB;Kto5A28_`RhohhhtWXc^x0pfAq?;&7u-lv-BOm3wq;9^$`ThUbHRoFEuHr%C*qs+ABU1O8Yp(ft&FlHP zCWKE=rE?{p9NtUc8bZAeZfnjgufkL^>9Z4t&}PD_Uztxq!(v405gSTzjql4rkh3(G z$C2*jP$hzn#s;&hvAa~~6jhV51~rTMF-OC~q48y@gr__{7|kHav=yD_gaZj0FHQ`x zMbqaH?S0^Y=w*l=8WjwJk}cvmA4Q`yRgCKm&Rf%Maa6385>d9Jio`@#dUM)$0Cs8bSe|5*+a6?%LumIno1)$Wzgr~*=N^QL;s_-&B(ySU*_Kn0;E{wA{jh<=O@V%ds)?VQxjmgNRnwsp@658xk%ji`;V%pB-rm%Tbo@ zcbVlts6{%GkS|}R)O`sN*x<=lPEH!6I_HN?sUN~nr(mTXJGgfUfSD5Ma|dBU?DQ#-tvLM}(MZ>q6-#rWiGb>%4&%CPKX_@p)wFMbWhLP`8c0MYiF0)1&K+C6T$=|;t$tV(0CZ| z0r=xmNyq_KJ_X$_rkV$=1IA?r(-Oj4pgnB(&D^$T*LSwn!@!3JmJTgq*&1s6d?-gU zRUfaIE9`2`-@W)^vzPx0aT%fkX3pXwSPTh_v-!uTN)T)HO1!eIhSL+`bub6T72SU4 z<=e8WRj%qP_OmU+E(;V0lWh}y07>N1fj)4Nv(Pasw97E$lmsQ=hsAb;ykaVmw+o2L zo~3eAjG-Aj?R^*ydKnjLV~W;6>$qu7K@;kY$x4YLx4i)Uf_UT%cO3TaIOsbE|H3pv zzVu$P6hXk6#646h)8HpdZKt7dBP$CZRQ--`Tb1yRMXYtl;8}Mp`Ya=Juj${$dl4I* zH%Za?sENa&^vsYQ*FV-@-gafmDH*acR(A@7?N`$E_>6AUZgnjJX}Ma#`dTTCWz9;7 z+2KX-^v1JJnk)GLbwBDFO*^9v^0R8Z<;&g}*ihtYu|9_n!DB3AIyA`v7x-{#FXR^k zp0{oU*`oODt=(Qm8hqBang@VX;})FH0uvz~!16$b>>ZcNK>=e~zhtErFbZ342vceS z*H9*EZ_)*;c`*14qd5RRjhwa$DbyHKkCu1RQ-tcm4jt;T zz8cC4syr3d76MPl9>%(KKPi>ciw<*tJE2wY`m3<&b*JwzR+W)}H}K%agJo%Xdig}N zZNYei!xbI_xfFE>8#-fX3p=gXLdxK24$L33J*IFHrCXifR{t>6k@NoRV2;0|%iF%g z#(dj%jG*^!%rY)VPYtrOM9CbLcDRYuu=VC29GC5mX+^CL|&r^RI{p@ zG?};q=?$(KiJd`_sHo&ITFMi}fOx|e7u5q1&@=qwK`V_!>E%2uZFczqci;XF({p{L zGx#8wXJ6~YV96D6nDrZ#b6tUFHanm2>k*jYD-%{}>S z-TMgI&U3v@827c?AY7GR;LTI^{%N1>Al*JDrBuX5TNt{GN6?<&aQX-mQAU930mQ^p zAzPfqxkY*P2ke*ksbtd$083~QV(p&Oi4l|d94iIg^5RKWp5n_z{a0)Z>Z*8XJ%Z;Y zkI)dpJ@}Qfw*6AN4}6m*hWeu^s<`cK5%wQZy0*5d$>R}1Q0jNy!re$9VcN)mK?ofT zX?Hk(%Vf|RCX{s58yH|v`yP-`iqs&UrQ>|VvcS89>9`%8)d3Q3+9Jf-+0J;R*3ilp z?MGXYW#?Gib*Zd`t?X@$P=f^Cp~@_=fJd80a zLC!&}t}G+%okyq|pKDYgQ1*f@74r!OeIz~R>yKtnRh_nF`{Ytps)lnt2e1~v(j9`~ z;2D@VKI#50ip$RHEP@S|F#t1PhG=v2I7Jy9Q>3O|TXsX}m2`XvADMfR7J_frA%1-J z=)vjz`v;F$$)565v*BQ!v&z2|uLYqDM}B~^r}-0=1$Qvj?1mNq{=?Z2G^Srzo`LeP zpK_M4^?2+P;_qsS^>j;2a>xnGmSFn@M36b~x13{)cXE)OK{=2{A!sT?f%^zJ+iqYT zL5%PNk4_+gLY)AI<8z1S06=dG9~3UR#Ak(U=eD#^Pbq|FUkTxH+;}x)%Cs&SzVJ1n zBPb09^;lPoIBezc#Nq+=KuVX6IW$csQN0_4-qtQX6pF;6)mVw-o%>_`))zMZYJ|GS z@vCF0D;yjbC)L8V&qDEcB z0;q+WzM`F?I~s0|a{zojIh-XZ-{Ud0oCJ>rk7M9U4-Z(d#o;{O6jE$K(G=JOQ~+BJ zolv*kZLf70D6v8M2VXY-8$QsFkO!dIEf5+cgI-ir^Mp-Oh*QTwu;SoRNAZ`x$n6Bm z;vp)`%h}ibTYt~6AlMlNE-|ENNm`s38IWANUCcH}jgG=}4|k~+GnmoPH`VwADWI!e znFW+*vLy?+p`RIHo{@u=aI9V{D>;?3VDz{=%H}m}OUltGt9tu4t%9)vL_7C5Doj;T zqe4Uq$%=_=VlfV(uJf`1A_&gR5|x&i6v8&r6R!+F%9J=jsLfR?3_1NaWZDWBjus}X zA_y6`fK*Y083h%Cjo>s+cn9_+(rY<&j3NH~Bh|BE5Y1BT%dt6hi58?fOIk3^s)a*< zpcQSX*|)mpS{~w+OMN|-H3%>2wcZ?Eo}GrjpaxNTi z&>tMY|0X^aTa-VSmlQ>o5BOUn8UJVLgdUXz;8Df*=vdDkk&izJYVhcZWde}~-`=-x z_ul5A2O8Lw+3o8Z{`X&=(9Qrb;pa|HjiFRl!zSty+FQK8*^CGh6w0?xeAhL6FJ48g z;<94fF~iI)PDS(kss=24I_R9kiViy|SUOo-Lz(Yjg*fu78{gcv-Ofaf3Eo3lG(BG| z&gSt_Lz+?gOe<$)S_iV8oj*7^bjWDandsEu+cG#+cEnFuPsAtLYLdn|ovU$HMzAXM z06iwC!7WMowZDb?Rq~iVfkP>r)Y?{7xCSfM$2Hb>76sM6ZOHK_q}u!~N@E-EY}aQb z>2)u72SO(8Pc^7%9n(AvKa8nzZk9tmeTYqG5;Mz4mMGiWZZyHrs-DPFKEof_ey}z< z2JTMl9h=GaFUb^yZIdJ=^GjGfX6KQ1AplFo|0|p+mG%Sx|59KsV3+(c#Nq=^VI)!C zu)YrIVXaz?)HfO{{pcRE0D`wAE(=TXEfZ#Mq2e?4J~bB8q)3^ff0~I$9(g2z4$rG7 z650qjbP?x4ZOKtBRg9ISmDuf6LZfZ?)5jZ)?1YxXj_NEb?2^1bw4Tz87kbo&^x+Xv zXy5SoG=rO)Cw79cnPbZ!sBhzOOYqlRgat{-I@@e$QuCE$yUmR9ZLG2{$yXGT!aCw@ z(;R(PXOThwO>u~#h|OM`mSaacFQTRGps zW0>4P0-Q>r|6L(g#Y8`^#RcCA(()Y#zF1Os62qdX6B`49Ot-#{t-8AJ2reHTnh26v zw9#~cI3XA6G)^mD3~o^O(0V5k!I$?YuaGvjU{c`bgAB`l){UEC zXQbEhhpZnyx)2me{u8?d2q9MOt7JmRd!RzXHi z={+EgnbwPQDV%aSQpUU^3G{~Gy>_m&wDNSm&P*{_0 z!^4{DENrOYo7=8$IzgkbbVeW+w7X@wj{RK@&3+nZ3W8~Yl!GnLt=t+|0OSWH;VP&g z_&d?1tm003Z~OgehsnV-L=tKJsz}*_TGz`Vg#?~G(h{eWch#wC=^$6gE^=Um>!Tf> zU=rbWKyC8QnxEAk2fb7kV}LXz$)y~`b|eN=O;aX%>C7O<71_0KlPa!F02lMNdIC~Y z$c5b1@i>$fh~?->I%JIFATR^IVGVt}sS}+~;Qk=kMhWcHXl^l}-DD`*jiIgo+WLis z&G=*auvY2~9-H3pC7VrJ4Q#4n$~c{dX|m&pEdbD_#Ee4UC%QvX2WOAVAiTzpM>GU9NHC0njFlCtR-*C0vzA==4)Hlrjot)}C?-W|xmF2^|=85IiFHm^p(5bkpP^ z`=SQfUGM&&ye={nABP6mn^xWc7z+YTQRIo6BlBAM5mZ`HcRI;?mF)?xo=P$+fWYs zVO-Bk@)hAeY2<8r7myXO@xJy{G|o!){Pgld5wM+#40so>=!6}C3$-e9xXnU64@|>y zr*qH#V}}l%Xq1=l(Z`zmrnbOuV|fQ}=yTz>qY}bPCQ8rEG<^Tki%B6p{+yA|UK})z zGs!=kKSNz>rg)Fd;gm4vOqgIMWy}!4&b&nF#7Sqzj@U0vV^~&%*%4TK=(LBi8dPFO%4fRHM{ zilm>JYMxH{;OH^n)SJ~EB|=t2*t&z&Y;?fyy{zr+M_BOa=NsYt9G-##7k6O1)FT@0 z2#Yzi;0>)w9^TX&7Davre?+)HxZHBuJjP+IBP6G;pB%d-@X3Q|Z(*M*2;}$dE2b~; zSHxbDN??(?P9)Iba0urC+BBkG+d4)nEP7388Uno~U7TJ%gi>;mPeM!k+V_ z`qM;+!j=jy7pUcS(RNFoXsiyF|4SI`XxI$g;H4xycI zhpveTD0O@tXK}z<#zY9o9O04~f^&c>2ag7NO@mW=TG3cr_%vXf-HFwTV+G!|CPv)a z0otv{9qVH{ZY%GcmaO2@;j#Tb;cP`!H1)iLgW+L*on=Xh+PTCajvTfffl&Y)<2`0E z$8V?5a#{<}G__cXDmzV)sTJsA;C4l|{;P!q<0tLNA+)VhUN53W1{%e~<-VGh3?h+g z_2J3Khx*<){Zh|!14qJ{8S@>E8<}5VgA)vthTC!%d+|9zIfzZ+T`e7Ewv!aF=2jZ_ zf7zLeKgqgPQ4x+LfixrS7)zuk+-Pu43O=3Vq9dO-w>7K+AaF=;miUMBFM`V=Y8xmBWerSy-)-1bE zRjUPxwe36?v+?lAw1k?@o7BSi(>BbD3JjWf;c>-eec|Y(QVaH&B{~p%4{)3x7yU<7 zbM73noX~hD<=qKf6sBW!m^};SA8|RLHpGRYbMUa7G=^k?C?*>KJOvX*+J~{iG@=k5If^4{2=k&YgjKMD z5NwowL=jg}JV82o#-Ipffjb0e;LIL0F(;w$D89GypLQs0y1Uilo|vDdbI9uWUCLa_ zAd;cCr3q;saB_f|Vqn~-^n*mNJ--MYIz$45znvvtw@K)5@V9e{h#7oG0n1`QGbJOs zdl#_|aPMj~p3&m8&nFxgkDd=^8Vkj6@YoX%eP_qRjsDy{yO=~$ZI+WFCVk7f2JWjI zQ`x^H7|tVhPkq%hcBg)(x=r0NQP-b4;%S(kBDf4lNHc@Hg}*~hO;dgVi%Ntp1IlAc zJrA#8ZF={iJtlW_Y3O~DTkbM8%USLJk4!U_Py3dR0h=saN%@BWzJk@m`63BZhFt@g&>4<0S zRA>=W@d&XUJSH{iGyGX(p%D!IPm|QqbZ`nud-L?d!Oak=&4--)Qx)%0#}jr6#%OUm zOojOXav=O308h4>;~m0dsMxF6n4Az)fVC)s*}^o-z<ly*iV(P zHAN}U_&H@#a?cIP7=?lVv86)}T_akGYm?Vdd&k9vcWS-Uv7Xf6(k1ifnx zAeCA2x)FHazD`kM+@_MZ+w&8L<48C?Ct8czN!Fsr?JM1# zppU2-fR$xxnv&8pPlx<@P?KUE>f*f{9>#fm<@iRDex;8!ctbnZ` zc9yq{jm8n(*!$cRmJe7^?u7_4C|D0Zy0n<@3zDJS(QNT2#1Zq}f-VbDS!1nNow&Ko zuYUVxI(45;gzld2(r#vF--Q8L5&4WthA;6ifjt}*r+B+vx|nFNOPTBS&wR7TNw4LZ zuOpNW%22fB7dWn2hue&Rk$lJl%BJe}k7!G9ctn@##IfDptm{|C3nIL`qtB?!AiGyK z=?ls3%k>ANMQrvzl?eljhz*KsRUXFvbcfeu2;U`H7rYycOe}^XcBC38F2bx33Vd)$ z9Jitqklz59rQWXqb>9(wt6nMP>A**{Hf=1bC2Y?s@HsAO>)669Xxa1%i=+J6W@fe6 z@?wC=tNz&5)x+J|6Pb`e)64OSTb;QX{R%4aWXD#u6e$l7|br#VIUyt!O|jTqvw z)$!+PomwY#Q5vY|+@=O02&P8VAQLX*&XzH|L=yjL?$!y)i$ZLP)De$A(d>C(*RGw9 zKiWL7uX*6H#|Dp26BMFr1 zHsU)pioS{wtko5UQjf0p&ZS;qiEN zx!}x)YO~qBLpH1G+S0AHeeifE36dVzq8H|nw54(qr8c*LM98Z?U2CbUEJ#R;%Brdp z36}S$s~?a)US!3IzTxtcnm!W}ZX#Gsl3S;?Vkcy%#r;elDq@F!g@nc;i!}D$N)I0I zHNK<()$vjspeUJ9Rk0J&mY97X^Ww)rtrpkOtMo7JXk^` zd^s~B|3?3X&iKfBIf@=5f{IxUR008nt^Yu@xL`vlP}tMxcx+)!wih8=Q%p}%DbOJE zF@M;hyWu7&t+~>SDd}lD{3DPGC&yT;toh!WrB8QCBTisGltJ`ayvc-D)Bimk*pTVl zZtwJ&qKw2B{28CG)uom$$C)0vWz%|EdZ-(gh~z)k(Bf->)l~1J&dj>RWblN!hGtjS z3p&e+l&$s_L=;by+7R4Gj8X~~*7)4cirEzStf>FXC(fsWWpMUerKA|R3jY{%P%}xC z7F-gv2WpsFaE4}Ii30aJ|4N~&R2;1>OI{%`n()tRt)-0K#Jt3^`1OdeO`%Mi$9@Lw zjbjprtu=)%h+NSN`Zt8rTd*#f4QyGbDM@DIF3xI zsE~y2{1Lu(;nAU-e&G*!m(P+;a)_k%x^3%O?XE)~A`bbopSz73P$w7-m~0cKJptNx zq1MR(8|+R06qs*IpB94-t25*XfIZuJ>S#*`PtYgerhl97ni(7B zQ&51x6XCJ-h!orTJERudbF)OeZF#HT!nqnQqb$X#!X7*Uzaz_GyV7k@WtChcqw($y z)_PVFpleZgV~yZHBh9^ma{O#B*U-!OSqUhM2}t$*tZVmX+t)Axaj70fSSvZAVr~(t z?764HqyDF=dOJi&FA;b;VLRLqNnnxx4H#&XVDFA=fO#3$0XvkdJ{41Pd0R+N2?1K<)cFp48U zQ0zE5Sp8h4lyl&_N)To8yr9!)qEuzD_O9Xt%feot6eb3GN2u`~S%Utt#2Bi|mgJv~ zj(&H<(}v54jsP-wV9=y!azIkQ;mhEQB#dA?uR+GFppiekWh9u;iOsKyLyA8OGGDUf zQ3YcQUT-XYUM*OEg#TT|_TIncvK>~m4n74nEZprq32A>2CT|+jayf&sew&f5UKgY# zfJTMiU(MsF_zrPMC_2r0LC*H5L_$z9{}0q+~_(6+l3gfo2a{nmKr6sb+95C0$&W z19D+%i)z-}+KYq;%B-^i++7Cl+pb+z*h4LMUeC)~dnaZ9VsM1J#JVJx1jufF-sW{aSBRgJ14=+`CLmMCwG%<;xHWHXGEVtUtk zYU9iOXHEBaM^nFkxUT!g^oFE+=+jgzh6A92Z--(zPd0_l%2zzdB_2+}zBCSVEb@V_i{ zjxy|ROsfA3ir2B*oH<=?Ukeafo_lfdcSs2`K23&S$HOMe~$&bQVNjh z1e@6oH#I}Ll}`3uPPQQA`^-C~6))P_HY>rdU3s#IeBCLh#$yDdfYIXIAs2!$i_e<- z14PRqC<%lmNWxKpuft!z%GXCiCKcc)sJj(^2H$Ut!+( z5wyum9BzQ=Qdk@WX2_K({HZ4(>3R+QhwV|K|xwnjk&ZU(sWU5l5cI|!*j#KrJyGi7}IyFV3qaFb7N6O zd~DV%{#2D;IeNjU)pg9;CR&+}B0m)4BD-FxAv}I3X(d0a?e|;jO(nLlG>p6_RBlo> z1P{AoXsG83Tko{u6CfbCP~@%*$K$XoOhDda5@Zx=u#pz6@bn*6muFcb^AB^b8AZj^ z;rN6NM?#QgH_fjOOrPCD{U8%-v|kZfb_5V2=7n)M2GwnS&Dy=T1uCe2IlZvyTFY_c zERB-Mt$9pgU0qU><=6+0M#NHBbTniTp-{}u4GP@q6gZH}22c7Ck=nKlFVJBes0-(} zn15s+_9djW2NtM42>gTs6Kj#=JSmG5zx5S(J%0+1c0CW{l5`rvBcQz+cVd*iN61zmkfi=FA zngBg5(~B%*2}Ai=-?etxNF=>$_e9c|_|trU&$EO4nKJA5#-5)p&%ql(BqY}O#fm>VmW^G6K!93%bza3KD8Z(0F%JGH)xicH}L!}{6_XhM_Jh2(MxJ$2`EBuDEdqm6zK^Xi!)W zmkQCDI@SLqfMm*4iQZXOd2$AqBo2b>M0Yi<7ty5NC{`rZBw z6N#55lC^WVNX|yQiQmev;h3~eo#?xVNBn9qOPuy}&3ouq zl{2z?;$|&4=&Lq6_F-+Xswx5}Z{CG=Y+UPAI+qMn+fmQj_WVwrm3lBc+=~M)D(asc zysB4B!OWJ;<K5kU-n9(3|tt$+X_6d zx*eUe%BXaIhXa1ML`!L(x444=xTF9^MyBQxygSo85$xP;-w0-iQ7`!odmzSj-3#$P zNM!i1G5(^PLh!G?ZEmM^{K#97)OhFa4HtVI(Y&Lp)bRaC=GhDK_a059TFyG0jlN*2(x~2y;_{KYfA)j zsmzgic)5jb*E?cy+{3lf&=)aLRUd9DOfMTikS>WTYW`<`kP$PQ%a{TZZP2Ww34!X8 zT>8RnSvAMwElHAx&}0N@JER6#oE$+YGvNcEVe;h#_*%?AmZ#*tZ6qq8u~szFVMaI2 zQA5oW#(Iq9SP#vs7co|_sJX|ME+B~Qwv7*03HriaoE2MkyffZk z_ub#TxN2RyUMcsyF3o*hBKW^?SvvV=rfRYTCR$+=3_w^DzT}cIyfRo?fiGc(wB?ta zmG?f$t@m}4)UdSut?vvf&!n5y9#?QLa1&!~Z4_ghclU#KSI9|lH!5^`+UkKNVE;>l zpReC>WxI-|FLr6<+14)1)0r!!B&A4*l98zkMC_(fiHPSSPWZ$kmxRB<$8kl|aDgPJ z@^%O(Y=gp|zv|;y@bjJ4|Af{4g64m3SZl3)T#XCZ#xUl{r#aUvhC^ z2Dx`!@xOJ6E7gNItTlHi_8KrOIJHi$Ua!`kgug%(VG{Gdjqnzxxu_JrAo%^yJ-=d? z+Ph4`g{i22%8KyYX2WO9-NQ)4p z%32(nFfYQn3x68b)NQ}MAj>kK2xZ}!)pF*Hf}4gnv&#aiDZPLNhO+l*fyzs$UuLbc zcdX1-VtbXN1~v_?Zf~w~sl%{qMi(A?b(^qtapM^yvzlHU#PM15;ch3lRM&qBbxa%^ z!u`*m*ywS7&rw=)@}gW`ni21YcOe7C?+JGV3`SxyIv8CT)?EqTgzb{Lms$|iwuhMqTOc-uJ#f|`y8^`cg7GglAQXXnK^Lgp82Vi$ zC~Y?)*YnfppZ7+_*hn_}RTRwFPba>rbiju;Vu1)vKqx;~9;MIns3Xz^1%osIg(5uO6JV|dG1U+nXUPLJ&^!?%4 z%%L$XIW%xLmN=}JC2($4ubCwSdScH+X<+?Z>}o z{^Zo0qx75v3#h5$Bs&@=ztH-oOC(#UVXykki?BIm*}HvN`cf;aSEubE4ru4uYNyo` z2r!dIDE)47j2wx`$mwVBhEPR!Qi`0Xa6&n4@X!Ks^B-&Z8~Kq^;0UN4 zMMtnp0ae5SfJPK+pRel~!Q{@6i18VJVeM0)3Q|}VqwHSXe5sAEuh2lN3I>!^2;xG! z&YP!;d2kt(Pnt4I>ifM4RvGx;#)$>;x4u(u<$TO&{k`*2^o7-E!!AqQ_3^22_%6@H zBTR-Lfm=|YN@&=-*#6Kf&Y3!S6Q z1K!bJS@FVBvV%Uz(r=cT3P?;_O_;Hrd90K~_RmgoS<&o2J0ymV=@awqRzvA>*7Vuy9~#kXVGP9MO?d#`SZ0u zjM&L;4-f3#sR>K%uTG8-r6LjyS+#>ogKs;Uoz=w3UL9*zWwcFA2?GgHO#pgiZev*E}OCIlYYuipE%0bDJPo+zJL z@YLZP+QJfoloQjI%#n2N(ij`45r6ZKI!P)A{H{@d*f{C` zvU}+zY0u4iu65BIqhfLTW8^b1hor94d>CcCqnmf(K?U}PZA7aro}D9+cYG=-JJ;@tW*S}TLPtTJS!il9 zK#NVs7L|;5sB1{}N*!qD%!oJzKU<7QP(jgN5>5)4hc2nZv4%=t$a1#%ayOXx%Zg0r zf+e$$mI4Gw_>-6-#WB$S%R9zgj&= z#wT?48{=Y@wC^EmC?+w2k`~tJR4w>s5v^p)0>lD^Z!xRTil(gyIo6oavKP?zC%enM z*F#_n-QlhvVaVz=UOX?G{d3q_l&W-}cB(RY7)#LRLA}IBAB5%$*MvxH^n4tRQn%?O zGy9c)%bdmuEoww=JH|M(oLUp3d@-5!U;a^yEvJ)^VM36+2^TzFg0nU80N)bL9Kgx3!C|jfT;0aF zDg_ZrP0^Pvk@}Y#m8Xx*Y}6t?x%a`%9XBVli)Gf(Yh`5!(i`77<9#&cs#45q>fyT$ zxscMq1(M*Jm*x(=G%X~Ev1tl=PgX@AMi2=;q&S5-$Bj-NXNhSE7JW4cRx#(!5==ss zsSDW!nJ5u=e^t^?sd3*qoSdvjD5IGt6r<>jy~U%=gjf?rV;kl~F>?q&j&kW-n&jSl9x)qzzwrhrg^ z;1Kc)fwnk0fS-zpQFSbF#G@KJ{q&fbM1J|fHux-6vb6}qr*MwQcU$ZrMyY=moD__s zB}x_kJwi#(4RPWJ#}+^jMVS}cy`(E9j^S2IdTC>-!hnaFuba@a|9)QnpKH7}rvata zCUBmWBbUI~V%C?-i~z;%^CYy3E-QCZUh89~9jYohDe~OL_pkmgy#LkkoxennLLzZ* ze_Vjuu=|l~K_af^-Zm9CWci+Gv>${x9|9=GN8DCd&(e;juw92ghnqP%JmtSA38A7j zH-?-IqwCxP&3C7V_4f<$8(D<6{OgI0`4ip#jbK{oMP}w+n46K8MzSuS;S2JSPijpN zNuqzU4BI`WQ;_coq@+;clvUF4gED|hZnryJR#3?>Sbx1ymZN-Akw`@SWB{F;W$9Jv z=rK7L9&>(qM1{nF4{}k^;aOCs`CP7css)ew22KUtmMRinP{4;ut6y4lPT80)v#S++ zvmJaUu^y{F_B&#x;97^{EXV*HVAW)HmddKUApF^sNN*r@Y>mn=)0aw(# zY!%=sl5>UA>%`Z${OMZr%}QChdphP>7zTHz=H=w z2&ZFqTt}i)2W9EvtPBRA2ZRAJy+Jz6!HL-&=CYRsS(`HOmW1As>x!jrCQvb!U=E?N zu|_uQO1^e!D@VO{#m$klrf5iOCHm`{_ZvT>G1$6v1kp}@n;3(qNO zAYvLEkNg2crkuRSatNZG7vk*a9sVi}aH;OxyWs_bFc&JoP_LcUFq|Zf_IkN{Eh~&r9#_0-!QwzqnBUS>UCxoWjNbyh5BY)*%{PebBQ8EILOFoL@G%$`dTo&Uc$7N)}`J6N{dHi9L>CvrFY>N6BHtxS|?V*sw8EzvIvdnS|~*| z^0loaV1;6zwX&5dzJ_*_4H0Qk#~nH*ElF9Z8ZDraereshhr zDKrAn=h+N?C}l*T1!7(Ec0@2jIj!*l3IM6ewHI2ua*&!~EUDm)TQPuf<-6&Q#@%Pv z(J8M1?S*DTXpDLa`oTV8buv44(d=(1dKtacHgN>oJ1=Xv&tPAx&*=VcdJiR(Pmr}F zZok|aW(|S#hsDOil!TZaw2urN0w-wJW~<4dD9x9L(_Fj~HwAn-FAxQ%lzeQ(^Dh(< zI(C=>WSWrdjLK`OH#Up9CNrI>45@yk;4cI7wr)6m6r1bDE6RJC6EK zwIbiix)A0|Bg`@}n(QDLpF~9CkZYg!=v5(Qz#2#Z&gQUj{=T#+xIvwZm+YR=TEE)k^$4oN%o*2>lH;5ui| z-Go#0Wan!H#!E0;_140fIHEQvzGT*vK3H1DrDn@Uney&Pp4Qkx&Awfq*v0m__)XvQ zdL@bd!qy9A5&G5DD^ged&ss0TY-hGQ-4QOsgblR072@SMw_2=S)5|EGHgVLC?3q5Y zd2av(I%PJFGVZN};uiClwX~?eblC5)p9)-LxPryQAkxk?j6{MeJWpnyD>a^*eXh8x z48OS*=5KX(YfNS=v;yU5s4aV-Zhei={Qr;u)jG?Yn@sxj#r0O_?raXLj)C-K(3d*d zFJPXM!q{9-PpKLIyt$aL#8P=}?B#<+sckl~Ss|9?N?frD*iNmyJPNEllJ`&nQ8hqP zEKTQx7u6$D@fyc^jRrbr`>1m(Fo-d*00P9_ridGKQp53fv@_z0KsYJL&a5X^INK1m zbWRG>51{5IVzh$HK-W1XKj79ak?lMe6}-V=KsBJf=tw)eE23r7m3ar+Lr|GPVdQ*0 zJ5zL$A*BgwWrasQUI?grPGw{15f)83FhuM<%b*CgtJ{pPPrstc0G!gUu(4*+uUUr@ zs~{H-5*zr^_xd4Qvh`lt>T1RAseVpvAsK>>AULu0tDDHhl0()ytfFeXYjfKvLN{6O zvgn~jBDbtWOtk2qXGB~rtFMjDeI@;$H7>(tRX){OJ7Ko~RJ+5e$!i7!TjzEQtUH{0 z*x*9)fYu(zy+rxgCpapCn+kxvFcGO%&>M&F*5;f^%p6L^I8Mc?KIL9iOPBrB7A&t^JiQ&t`3je zOwa|*Ejn%*9==>c`b~vUxv;=>O#%$KNZJ$R$R;?+Rh=Tj$`%Cs`jQM>Ym6~(Fm+}D zA^bLJvGetYGiSk%6-Mg}Lt)3d#;r8EXF{ETMlw#dh|apU7i2g+)f8dHJc-LdW^yrN ztN646Ye3PaMp?w2gQghyE1WZ9d_myKC=Q&-YWnivW{9P&BxwX{R#QSj((a8R*Ue zqvqX@K$S@H6?>WyT?Z_3LA@^5mCIHgO+SA{L=A5)do(t_1Wn7AcWu}dH*CJ>M7*P+ zsw`))B$X`8oiMXDPrGcSFx9k?e0d!R&V19(ZlH9O35;wuUkGH2J;6t+Y*Fk`B|M>S zUT(RK+nJQ=7rxGqld>}dj2LFbsA;gBhGHCSj6fWlb#2W80){Gq{ z88GrZ3NdXv$_zQ7?_>|_?&3{UdK|AVD5+W7b5v{90e8*Ke52oGL%(pNCZSmFtZwACEfYNgA%Fng>r*wP}R{4NYgE>y9H<&?;4cOo&~0j%D4LlEi6 zy5q?1z($XgcY+2wI(}go&hLR)xy@QBi!U;c8WE=`wmVm{fEVs?p}n+)06ulP`Lagc z?ESts<2mmF?q=03>De!r2?qnC3CqMF^=Ix@XF57Hb!Ql;)(4LW(WYeZ;K__t0yzi@ zp0OW;!6V}dR9g4Ot`-Ghb=e$i^}mo+k#pYhSyqd`-;Wi5us-V{O9fm6LG|tabSyjxhlhg(>KbQGQKPocIn^&_ zGJ#!XK#(scIuSf0!bGCMi_Yo{#NZ&RNRMrdKTaKtT zHjQg(bk&z+fYe3aX__8LoVAbv%GKxsf&<6)GsgwY2kFu)dQh_J%5e{`$Ijbwh$IB% zz~x9HmUns{`D5lpb66o7mBlQ^U1Gg9wYF|3S)r4_DCVoL>>}K=c^Ik|)=l(#;gs;) zmS>xNTfU;9dJAkvEV@++t2qLn+{NyNeNvT4{MPD=?#5!L?XNR4iwp!LUCTZgtDl*Zr~X zP?ET#C7@H(HTqQyF^L&H8cC0enw=$OZH1{8?qV4`$7l!Y(b*&I!szl-NpDPSR$(?$ zQD=5jF^a*d$9`77m$Is)D-`vmUPcgc*!FXlIYkTwzKPzWb;62#tU_CWnj%0&3^cQl zJ5l+@e3tK{K;a>4r_%UDHAR<}hyYPh0=*){{D8%HW>9=A+7Wq1(hjty%;Y}96=z&i zk~d}z3@^F4?)EybkOpWvF7XiZ{s%#ckSayXwTAu{AUDL>{E?yE+hb@ zP~7M~J{0v+7L<8{fxHe&h#bB9vb@Y*w$!nWZI6dx1ra}Y&IdV#)q{yf}|S;n`tB#d6>8qZ=Y}p$0XcS@G}x-K`sI@M5pkE zc{u}}z;RSoGFTYRq9vg)A)oVZzcLEet8Q6tKHP&qu6Atq!*=L}qnLd$=22Zefp@w3 zKoJUyt(BRdA}zA?z*(J+rATl_U=ERF`E|Qf(}(Yy@_5d;aNM;UXA`zg63Oofm>>cMgx?U;w3xibPZM<89u=^;aJ{DL?SzVda zgi73Qqs1oBk&XM!8Z~OuTRzZQ5-TsJi~P;(<@MD4)O}0-_L?O&3UpGMiuG$PIRb@( z=l0KYIV~I$9Q5Hr2vFx_5A>%Ir9C>`8^!DwtkCz`Yrpa?!w&dBYBN*EQI%D~2!uS$ znf68yxX)njJ$r)gHk?U2#Hzzqh1y5h-#*F)7}WBU>}ePddrg=;&?6w`QB71lNW6o{ zBMQyE@DC;GrEp8`#X7ZKa}tRZOZ6FsEZ#`eDQS4WyJFMrb)rL}ShMa|pQpzz%=IRD z*Iv6{ex9DwM*7)0&5u4$e|1wq#}72m!xSf9U~%K?TaY#?U+YYCPBqUS>!vTM2+bBf zkCP$hAS*HyfgNgiE^+>hd)66EZ!(o1IQS$=GMrJ3RVNHWHgpIRNU1jqoZENHgkD+IBiiR~q`5l5??PST!jR*Id>FV+CW*wDeldErej z;+t}u~rhGu67<86`(q(6<90)#+w;l~dCA65^GPi>*XJY);*@ zbOzzmUw0Jj1)S#=!_74%CJ3b#q!5d8N#D-Q8=20MI07=wbb9U2T#SfmcR8R8<=9cD z4(0l8+~4dGVUE~hrdg6!?_bDtcle?G3nZ$+X&pdjBDYRiim(w^V0!!VkgMGTv$|%1 zI11V0yb^pMGVRl;fWU$gfLE4uS~L@>IA)2_SP^34Pq=DJou(^XLJP8diCfpp%Eek% zRv*B8TJ6U6qp<9JWi*%CAE39h;abR;^Cm1~_I_43FfI(0bFr)o+)S;9B=@zd5jZzt zkEz->!s8C6kmlKw@wA-Hgjy}Z(r{wKT!VW`E9yYVvbcyW;0a|Faaz$>v(AiS7-f)m z41N2I^XhbxGDRi{`}S^*Qx&~&9yKh8_|jP0L3a2UNDm#x`C7Dix20moUm z9UP=iVtcdoeu80v0f4-_{j%8AQI1p13b`@;5yC)J(MG_8aYfF33JZ*kgmytN8Z z5)yB=*|?g~0yIt+7|*5)S~@KZTqrRG2MAu2N3#MALJEfh1-b(xjE$*=N5!a$I;EZ^ z^En5n$)=LP8dDknOc$vhTWEGawJSIyzA&~jnw55-eD4UmJDQwo;3b+)O9-NVA)uj) z_4jFJ@`%_E3kG1!;zU?1{_A+z4{Bz1*$-PXtqDfc3D46#^OjOD9V+^8t^ z84wj;LWVTiQ(A>>_$#od2f4dJ`w=ZF{gk#jbmO2eV)BgNYU=`#Nc)y!5G|88=3k)E zx~N;fD6?H`_-6wcIU6W(4#d+r1%0xV1(8G1(qOZ5g?!`U3ODY~^l|I}0LaQ0^KA*6 zQOgl6-PXJvK(VQKEa0i|{{s4r#MX*G^?rb+q zqZh)}f`cxlMRzPh8x11MXei+Ukxn>W+6*HMi<$JK~FLXkXzDgDJvr=XJ7-&vE)Qi-?e1+7w6&7Ov>`ngVnm5sTf zUqE4Y0!CoodPK1fXw&Wf=PfHXaO0eV^PDPSAXeD&wa~RpO|)QRbB_zh1zwhDhC!Mh zkRA;G4CBJ^WR`BQPZpDCAfr`-f7S644B3BH(og`T;#b*JeROV=pYbOVeo!|TWl4vcdeUi-uMAXs3o6HX>4^S|Tio=66($i~ zTzc;}-Ef#rLC7=|NDS)J1c7}=@B+q%$Ksw%#Wy6u@k}?Nj}iy2BLtbrP-Q91j9uXQK7gKr0Obe@OQ9n)*ta~rIGksP_3MRMmJL;kY`x4Ee9nHt_;XvLwRQ4m zB_G|K^581NG0I-4Aecj{eE216C&>im{t@R{$KPh75nkuA#vBJ6qNPzPT{;r79kk3aUrL*Lo)aHBtQkDijP958!hkR2*vTrun+3xOj*4a>YNbP z*7{0wUe(XkJxoR)CC>*@@6LnOzvDDk4YZ6anphC4#E4c6KNh2RXu_pk2rsfzt=@iUuz(FafiIcPa zzKox>=+&PGzKJ7UvoK`5IXa7FvPrU(N(%486&0n#P|TX`ovwmpy0l>4sT@pz?TB1Z zX8D`kMde6*os?9+a<6F~Se`jHhcigTwO28rD7>Bk;XnEquB=-Db$lTtIr=>j9R6Ev z;X7)O2HQjfU8Kx{2rCKJu$FNZd#crXZiklDawXZpN&u_wb%)h&#-v%zDyrrIkaO)Z zx6)+8H+}_#2PjrXqR`CZg)p9#C>ji!W%t(|>S3l$J2SzBqGKfst4r`5&ca>E!88*K z^Q(%8p*!kA@4IuEGL7NjyVLWyk+5Dqqzdn0_x!s<8M2mgb$k{~ELliR0UYROeAH2} z(QULR0|f8sn>?e(7SJn8zs5I@$eVJvqo(CGbC=qYo!%sN@ZH(v{YrO}ED(?4%v5Ye zGrp7rGcal05Aa>PLBy5biAH#%kfsllB-FmvE7E!0{I z-QDlhj;z|JiVO+~?J)%R)@e}PF#x+=hy96sqwpiX-6?Ja-roF|mOOhYCVNYw#J@tPYq&fjH;GXDHLll352&&CVlA&z8T1rCC25O9k}Q+)LoX!BYye zvV~159WApliOEETo7lG?GMGKE-sO_S3v10d32>CWv91M1lU-YwURLlg2eHi_UeqV* zN}MES{={7|7C$hNu>Zl@hM-e?>@-HUCy^SAqxgMa(9+wnY2^HC4PESvkl^Lmr7nZHRk&S*P0TdR+)@YPFyXS z(<=V3pdWwW! z`eHSYMGP}-O-Hs{_GWo*csR6DI0!Rsk#BS%p^+(W-jLJqqz4cjIta;%UMsO`vofc3 zY*vmlz^eeSZnhZ$_>oAv>v19y%YKFhM2&_m4c!9UT|71YHN+c;ut#!tmVyJso@GD) znFnewZowKcJiw5z5Os9)gq$ShIH%jOIYcO2>hXt9Er`PFfCU^up#&m#Viss;zY+qm zGl4E>N9Ag$gkSglbGABztf0{+tR%(gPBRyzt0Ky{0<&q2(y+N{9Ny2S=?tRhlbVZ=MOdD0bw)Ml3J`*2v;Xql(1bId2&aK8 z_!F&o-O~?0G&@sGfOzH*a1sbw3Z($L=w*hpyovm(VlyN6Kp)k@2R-ZhgK^L&@4%u4Ry7^}AtAy45%S z72mZne^xV$!EJcNNd$#+1RkNgpbERydzBxfq@0Gl6@Ra`RP*AHfcZ{P2!h2gLRe7b z30&o$s$&gNPp>XNfHuy-b>{A#IR{iP^Qr92j-r18G8+{4AllUWhf;@TFpgB#JU)$O=Wq_*GPC zLfbxg%8Ckrpx1T+d$OCXpk&O{*R%?< zCT;`dH0Gbi@`G8X22X#k<#>8_ICvVUDrpD2yMUQJlXMvZE=9mrVV{oDKOKTm1Oc{! zCzeXjKP81`m|%ASI=+hC#@())BU+=+FsHn1k3&GrbYp`^Ur1C&}Z#dUc*YA zD@5IYUnd>zVBv_qIDxiPe;1%X&+Es`^a=eTf;7qr0XjOXk_f@puRQ+x=~P(H(XF+B zt4p4fVv+0(2_Xa)hjNFNcj~S*!G%`9!Go66vN%p=_iN&tBwJ}G{0#&tq=Mz8g*?c2 zsvc$~cVVKux&r})a)8i5yd=~)WFutpl2?e~Nfu=*Odw*k3-C`9@B8*RS7|%xd0v)58?^rn z2>Bq#Z1Bw7p~+{a4-KAKVt3{i<1hF>e$eHEDEIwR%MQYcL0M^M#V}}6S=m_Y5@cPg zmxBCe5VrjFQ}-Rj|9&986tk5u{lRHgU}g~L-F{y_$F_kAH;wJg_5n+>yhJdBc&W@g zFqmE@xFHz(x<&)Bb5c#q0g1fTgZ;;FHWo_< zWzvOon^={Hh@+ipABDE)Jm7(mgauf9xS~O;En!errv9LP9U|ZS)Fe1Xi8-uZk<5mX zgW5H?vY3xe?HbPaSS62gDQ0k(n5W=ET+0&&4UK#r{mNgVd4YlA;sduXsbF4URa zIWzg)kT19A2|kRRI=#4VkE7KmcMT8C%}hRc?9gy>-_rJG-R>v$O+F+<3?ZF-7^1zM zWJ6oOKDp&BE!4DSsnft|G3t-uHhkqEuR*0+0Q7zF9nUjCT-Rvy*a$}+;{e@+qHAoj&_1ur?#wn2-ch9GAYNL?RcQScyu$&{@mg>#QZ_B zj(+pWeUD83bz4u4Mlc$aJGl5&;??%%ugSo=?t7DuVoPVKHRjz*a*D>s@V=>SMCcRt zF+YjyurS=-EFSSAiN(Kx-du0Kx#b&t{SX;gX>Kw%Vr=!>_hqh{QRlNqIP^KmsUu74 z2J2SNTv>VlMzeDH^yuB|qqnY)-o3b~xpnsH=+u?b3UufE*YX+~!* z-Mn^+51N%9oo{a5xH0E=%;vyjo6+|v=y5oD``qXhO}zcu%8#zm z*R3~hti1nebL$-@b|ZVb`O&MRcTY8=_ugO<&B_O-M`wP+{6-hA44B!qm5*;Uu@(a) zzwLvDF^t|l%Z!-crws)`i7EK?ty3)D$!05o&g+|%YbTjO8NqvRuKf5NdQ=~y3vZ0x z_+3tC-MY~SFON=LZbrX7#Y)j*Y3b6Zp8n-ix8AvU>%#TXg->r?&?4OY(zHx&N0p0GA83SYi?b*Oy$wf&QpJM>bEyP{@v*E%cE@fjjJo~eyTlx zgEd`0FdCX{3N~85EqHX(#O?!)p5num4==KqWt-TrQfKp!HoZ^l8yxfX&*=4w8wcxW znw1Z)H#a}N3|MVy^!QJ|W^-14b+uPWozdk>H-CFA>ge(J=b31IT)B2}borDYZ~gq# z%C!&MhTMrJbz?$lw1yi=nK5QB{o=PPKfR&~D<5CirZJn9pI%Y{^N*cbx%S(Y-=7*?`nBQfgOj75 zpX)%tyJubb?Q_k_*^?@N`|4oB&EIkGemjUi4O_GF>T9FZKOSsYVeekK+6*?tb~mF} ze#0{9`83OMfeNo&XC(Z~U$8dD{UCn<(LjQlKrA|2~Ec#vf{X0xw>rqF#a_z^oadzdsi@dpY z3h-tefHasPmwzz&$JZFl#D>4yIM}=Iv2wJSGV3tt_jCE==)LzD2CMz%IldR{t1k}h z<#YVKbXqg|*|h-&?dFZs6B_TCOB+Y;om+X|L!8(%yK&Tk{lUcOcbC9B8wVS`P1pV( z|2ch;IsLE$3R7(KNssxJtG6!v#+Cl?>p)llH86Y%oW<$5DCGFj<@nTRb=!uA2RKo! zd~|m7!JGPZ>mNXvZ{B+6yiP>G55<$ri~?4v8GZB{T5dW>Z`-a%a$VGOZuYCE>i`=V zz`toWto-B(o5k{80*rvf8>7EJl{;8J2YwA@fbmZ}4UWRkK4jp+yDPsxIr`a+(V2JK z^CEx-qr9s>Bv+diR=V}$*MS!Xc##ora*fz008jPS8UU|uehl)xc!S;dr}QW68wg1R z<(Hp!=bVkG;a^=dSwHm@vzs$Y0x=K^*T}7cMn7uU#5_B;Ld@{l*nh+BdEwX&8X44CDbNK`;3D(ybp~ z6_LvQ5zhD#7#{isE@E6zZ027Y0ci!TFP{O8j8+v#@7&;QHXsvF`KJvpzy(4+fig^= zeDITTFtC}g0D%5Mc+Z1<`!$Z6kn|Zwe&+JZKVIXIj@~2WO!tEB|qhA0FbF z(@@zYg|w~F{TO=n*7cRkzpJNyY9Q!-?`q4Md5K#6Dja6!&rD;195Oro)!ME{I|})Ckmy&jA&5WP?!^O1@IZ(s(@}WhASWZgW$Bv zwc@>^)v?uLnQ43Fm%rwm>DOOvS+DcTEOa12<@|r;+~sEF!dWpi@KB+IHP9OIia~7wxDkJ+gBS=-w$4H zMy~;7Z=SpP?-wT+Ghp&nCdeQ7qtZZSus3QIfC3<@w+bDAg>Y%ku_2_0k_S%Rj~1>~ z=jZ1pGF9R7#`vJ@TZ~gzp2aV*elX;tQ#Wp%eJ#s?uL}%i`(WiFtO-YcaUoE3e%c{R->?;{(ysF*VPk@3dp$h}p8rt7@oB z7vA491>`=tXn?%HflG1^CHfG?v-=r`@dBgqoB#lA_Jz~5KRt+%f*B==@GYFKZjfXoXu8Ya0=~GAJRonq z>Dj$^6*kJfymOKPbC_VZ-ZTn6^-E9(`+E({TOgqd9CsZ}v-0D!?24yZXPq*E{tq&*!gy zdKoMMHoU^Y26=#Tw5Tf|p1gJD+RBILVHr5RqqpEW3Jc+7I`i9`H`uoRm+n@KI2_rJ zVPe5=4CjNFg&Nph(X7iistjg~VwNAy&$P+MCHSqCk3U^`pR@nYjRKfmu<*#42gqi0 z4Lsms-b>-U6g~%(3v}z#t-yC^YKGoVlyWf2i)Zvx) zIbM11*DzB(uK%qYg2@h$tnrP8B3ylj&49;$?@i8i3u%cEUb#+J1|;LFfk^!O*I`Eh z0tx=`G;ds)ctF-6qQlTq5om&I4gS^wtq;!Wu&I-G&x%34c}+5mk6o9IZw9yi;q2(= zzt)&jo;mYdcUr`NamIgL1v>*rve{nm!f|ncZ@p?3Oyq4Gg?wpHPAKHGKd4Cxt_Y$mLHgt0v0_v<^Al^N)2E8CiOJE#TQ9@MZ*r8Gd|l)`eIw7(ZIu!q zW58UJBvdB0lcihvl^K1w?iFbBd!XoRFqKw~cx_>dUcPFI^7hsKiAvt=pZ*A_oFBb% zoij2Rz4Pg)UvNie#u7A>BX!b=VbyNhPBOtqdUG{SB4=K*9RxdQw&N6i;Wl3i4&F5p>{aW zCrD8QM&usm;%P~-s9 z;R+a<@~s~t=3co4FZjld%Et%wHZq58zVQn+q$&u;r*6O_4p58K-Gz9JF!1*uprWMU_5dY!`0V zR5=lKm3wWM$-S4_Yt}xe*ICw>R$X0#rzh_tQzSS+sXz^F;?J&&ofJT!1_Ol8{FaxJ zoF{OM*qFa{R!48W*?+RS!>F#5k1qaNVjM)6AdO+6 zIrDx~{vxVCHcZ};;KBFfI`djF1ob*x$}eyt1}ittiX#LC``3T)3jy}>%Kv(OLI(Mb zEaJeJBi=xDf8MD&@u2U;1Kqb@V<|}`c&G5@wU^oD+S>)@t^!v3%F0KQNJJ!oA4M(b zzD)H?5gTb*mteewm4F*baXLp{+A>GcMbFYdzH+T)j*KWT|Gj63fT9x$|8IssNF+w2 zR`N*Ir4ecsvXb0akU^cmqXrFq|B{`uc#Cx%I}Ujn&1k{Ydyr_JvSo0L{SW;GsPaO>Vmn-azIX(8?7wID^qA z*Tv?sR4ab~Hq53BQZZbfT)1+M%E86J26uiUBZG!3l8TdFw2ZL+AAK_Vm^Jw+U9M6K z2a})JAvFXmKl&F7TWfz%)lz7un1*MGrWuZN^uZ~!aNz#2e!c|at!gO=OTiFW6CnzN zm(2?1 zynD}+dmrHBgb>DIl?VzBfn-a0;HC2(pRyUG?&bDD*TTUb!$gf$?h-q9OuRN-^RM)} zn;Y31Ha9VV?SryQlv;fi$E%dLLr|+`@@_X5KB=O3XkgL8czi{+GD`7$YGWKuEN2%l z3{rlY zrA6$2@|v(_X`p+q)++1LsKl(OW3avk85y7xW6_hE0BRM{3Ln0S8WQ{E=(40@Gr+Dr zSo!J6(c8ZSOd#VTm^R_EtA1--e(|c97i^9QW2h}8gx2#pHF$!IZMzlrX=>}Q1id2B zt3T{~w_AP=a?<}ioz{K7^Ef-*J=2J?V4+{RdIQ#TAe*ajBuxDx5v2RceS~jrE|iWX zq8#s9_6X*RgKJ2)wWqTNQkdtb`X)N^w5$TNBvfT$>Em&_&?nK2ch#;DKK7tP$Pf%W z#t{BRh5PbVvFq4~Cb}==ud;HZUl}?O+E_vI<(F4!VPJb-eI0%Y`1bV{uz!9|zE3<9 zKqI($?{u>QMu)#+EJ&_>b#Q(riOmpV4;Q%DBDFx&;eLhXfA}NVZfV_b*9I-4V$qrW zNg2$oH!iX4EGQcV7K#yOq0CsHuzU6)NHiC)8!8{U7Wg<|Fd(Qnc?trmf8p35Mq%Kx=beBVpr*XNA$aAFuuv z4hjv%*^@d5VL%ef8C`$9NjedxG4B@4<)u$6S)1|^`uK))`pIpXA4m9-PT|)ev{ya_ zc-ajUq*Tp zC0U^%maooh<&}RiF1>VFP$X>0p|_EhvHatij!m>44ohJb69D+kB1N6o;-f$uI3n3izk0v5CtE;28Sv?%)IR~=7hm>hIWGTt z10-88T=nlO%MfBn2)r?`o|Q3{Civ_ETP?lrzLio*i01mq70K~;X^YhgKwZ1B9_w!Q zg9+buV48YW3$@yTj_h1_AJ0GZBssb~{UOYc6?UigIVN5Ziy`k< zI(E=Ir!}XdQ<*s6-#|F0Fh({vKfy+PJt?OEuVu0jud|k3tA0_uQK<+teYIZaYnfd@ zn$qRjCVn1GAKdMAAN+796;3nj3U>K9?!3Ln?vtyRJ*c`fjW*RVsq~YITplHML4;wp z@L8TX#8oycRZ{Rt%eGK|crVsPD4mwJ?D=5W9IqH&wF5cWP8LVokIuv3h;oFtSEF+g zUI9U*PI8e80WtG<>*&Ov1e-t>VX`Fg+ng{k^1>y_JXt8G{-YUvfVSNqD{zE(%m>=R86NuBEw$+tu zZ%OJ%(h%Mz+I9d+tbH9`+9o*o z)v3ro5#Aw?2I~XQ!Y$qSg>kX#)ZtoJp*w$TRW)qY$)u>Pa)P9uK+{Z00|^4YP8(p@&Xw_wtL>V;=91U2BWc8 zjL!>V;LtZY!Hd>^s$%Cnp5Yif&&DDop91EpVgiQLbUiwIlAVT6 zW>@TiJGzENI~s+1>NjIV(&M9$>nwGn#k&HcW&IQ~QJ6C}isjJpbtS-{)Y4W&EsN1O zMZrqNq$N#U`_O(&?142^jIb!3wB3B$Co*71`2MLu#S+3Or$7Rw=K*UUl7)d1A|v&M zEf|TS*iUnJ<~z4=jT-6rf**!sKg)s?slRe=t+o~}5r4$sSi8ck`wBR}d@h^;+aW>R z-nwB2u=5|XgB)DMO0b|!Pd`3WliaB)5g>4N+(W=H_{ui&+46q*uv-AjZo~={4J%P3Gwat& z6^37e0z4EPA!7gTMR?;RE^>%pr@^O`r%yJCb|-H^y9H-oGzm$TK>gK@nsuqMaVJ6& z1^wSpyFPVd`om7t`!waUl$Bdo3)YOug0WA6Qq6gUFM&T^j^WFnayr3dmnL@1&mJLUPC?O2M`ah$04>AW z8L#w#oyPNOd`q8JOQ*sqatoUrR z#}wh(hp-M>Oqi2;(7dUwx8{52^){61`Y2H|UokG3vpTdS1fCWAs6+iTx2@Uroo#K? zI%*6lKvSU(Iy0K0cz||R4KOASajnnuIEM;>S&MLKmVfu+i_P8_Uv$#}Q0=&cE~QH= z-v(04!b(_kZR%86>NR5NS}Cjr8%AHN~b?FZoT2HT_X8cHMl znC-6V7%yRnOes@PkM@^yQfyH|`$9+d`|#PZNT4lkk1YEkZBOx4y58)4Se9G7Vl@_% z$)Gq;5!AP7u3{Wvv~CzJ2dDFU^BP{n=er!#B4yT!*M0QCJ9|<9)P7t(gxp4sGHTJdhjdQPBc;PRsb8zu)EABarY)7Vv6iwHE7@be1x z#;PA}#}PcP=E9Qb5CMFGnO4UNi+3L9W%$VPRyg3MU42b!UH9(LQ|`G9BzTD|ga`Zv zh{7UR`8)czix4G9g;%^1K9PnFFQ=DD*4Q?gb?pr6MWQ0y#2I8T1U|ylP*_7S>U>(1 z#Cbo*rvxcU^b(h?BXr>xAym?gR}clc1=9B~8ohAL2{^p9B)376^#vJ!URm%@3FvO*OoJe(?1tQw98H)Gj8cxmnk!-lt&oFu^+z=&3FGvb{1 zm*AGY0=ig!kTKpxV6pkyOvFzw-~9OF!H)Lwqg0QW%e10Ky=O>O;yTH&rbZe;xSJM2 z6VcWPp?oiR=E&(Zaujjrc^lacbZA0?B7~*EDd?@&wGzd`dP&||2CZLQiz6X=9v|nI zXk?0?7ZDcckh8rBm#=1lpvHWX)TQ%D$l1tI> z{--R~?OLqDd(^C+i}zZ8t)=QNlfh6fY3~toda2pAaIi8m|6hCW+9cI==K1co!>365 z1l>ur%tf|l+Un>RJ>9a~6V|lCQqTBu911LzWTv@j0J$%(3ITEN}j@|NlH|?X@$r0NI+;=fq5hTSaE>y)Mss?ze^2T_7dGnSA)0 zmWPNt%q(KwY*m*K2Nc&jdksvLZp_o0fJxXG0Ur>nnWg4D`^@5r;X39$L6Xoz#u%=< zA0sR|k$Som*aFXPcDfNbH7%XOrZ3QgzMQV-uDJE|XD#o$idhr9P z;8$+wJLD=V7bfRYeWE&iC)e(hqs?L7;4l^bR1FH!Ms8m01q

sHZr7&RkD-Mu(^x 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%0D;; z!0k%}pV?%)D9$-rVMtrx!VHo>w3O*X;kCdA)Q3-kQ)}tBP%tc95D{F7nE)L`)64L) z;=>avI3ej#jsCz*iE|y26rzZqmG7hI2T|CFADDBItY#mw^6|uERn6qM<7hn8aMpnU zioNGj<~eFafCTUPe^+&gQB0+*0Ch<|YfX&Sne*Y6IO@h$kibxn z9ADntt0zGy11K)3(Xx&og+CqXC#mnofVh2T@^fyyHs40YGZ&p7nTDGam@KrBjJVGk zwUesns9J3BvMQf972!v)U$c#q2(`GgkmpTR zL@*t+#Z&;+Fr~%0AyAF z7XwqZFiA;i2O^Gqx3c#?WL0zNS?YNI~IH)d||c))e<;?tDonv`sEn0Fq~TVYq~YP=8DH#Fdf>@@edo@dt<@Bs4I{`TY zzQ1!?)+OHSUn0$5;>jg2HPiSPphNTAx%~-wjK2EBh=OLNP?RGx{~MaP1&7taBEXT% zpS5EsSm#V-fTMK8ogZ|EeN|rVm|>;*U;WaM`Sqp3+M2@0A`OsW{PT`Ai`$>toE`KJ zZ!Nn~(S?06V&+zubyOdjHu4{y7;Wu2UX48lv(ZvS3U!G(WC#LTQ2Vwf_-9+qnY)#@u8sT<3x6pq~bSY{qg(8fFgxSp{bR{wKz3rv+^>B3~_W zcjxwH2X}GQc-$4LVc>#MSJewW}%*Z179YBo}$;Bqrz7u4Ob?xi-0S zPjM#OS^dxHjj(E?ZeT)j@4c8sKF-1F3mk0wm&eeOZY#M`)PC#&{)ECxLqCYD`|SX{!f!SFrY#U`t>0GhDWACv6U07R3z3K>@Yt5|5Z6 z)PHlS`Q@U1%p1KQMcDl=qsf@)>fdiyz(Zww@=D$=bK{RK-nlq7(mly9b6#5A@A~E1 z#Gp2lFvi6lOrc`tCM6%qC~&U=$E+&|`+ds97Ds6>DnVs!{4Fy{5{+JBE>X|Xk~)ex z@ySvW-vBB*E4b<)^j)zn_>2zI;d?Op4q0k`$G*It@J2j1xwP7NUy6*clvWi`__f@$ z`YbhGK$7u^%_rR_ZZ^O@yM}~;iB2;xKaW+ua;fnDPIlrEDmm8 zW`G{_;7ee{SS!fdy!{=$gy5h;4H*X->Xg=RUC?^BnKM}dFT$ocG35k=;G{3bDUh|e zf&H9DnNxRq$OIKjPY6*Le|T4(9B4nxWL7&J7ORWLPBvAB=dR%=Q`eZA9-2KzO zXjv5Ui>smV^;KY{(Csy*UUKG7$^ejPpv7rKvYA-N_~4uuY0;`k*Gy91!22kfD`7wm zrX|iGoyK&5b40cZ_`d!Q!qc%P(E3f`CEXZimnYY%x*@?|D@SLNb*SXhNAe(tg3)hi z6UxEy^!7tDZ8VDPg@3bbn<6LS&)#wo_<~m()E^m(#5Jl;P~amyA;bAaKMNF}#>z;# z)fj}}Xke4NjZhFFI5|mzX+$BKML>TiY)ZXj{S2(*aD>8<{o|9YE7H(fcs^@qkH+lN zeBxT|xkw)#5VLTrMg0NKV(c(8>;GVBp)xeTWD3$K?%0w3h2?}PS_vKMa2H44*}ZSy zp8YTX)t=pS{q%W8f_U^5gab&WrEFgvYm%K|41whhxkbKim8&$R5qr<}8QB6RLQ=oBp0I|MK@f^ zs>gRKV$Ot7FFnatfMZ~ve4>p{PKOQi9#xHEkm#CU;nA|9!JN`201RAsThWCrzBsfg zHD+@2lIr)7g&39$t2)&PUX0+H(WIzy{m=pAwzX9$Q}n*eaT6H^Qj7yoRzfH?Fd5Qs zQ=6>Zy_^B2DD7yKwWelNZgG%rr`E1P6y#c3nW_5;E?o}7M;l3{Vsq*3jLzt#LI_CQ zInN8M9Tz42Rc|h3tH_Pb`Ug`PUsW$fl?X(t4fwgYf|_s9JTXk=K!PwfilNv z9d%Cb8Su8uCJ=jg%N0o|w{+mJ?wyfEAB|AJ81B%OX3NtNNz6Ap2q)d{Nak&5D$ z%Qk&TST$rdhM8^dN)^?104hxsu2y1kSh! zKt8*?O(@uEh#p~3C=e=h@$5&cc`QyGyfk*sWy|d0;ItvBq*?AGB|q~BVl@30_EB@L z583K)r^%X1qQvwTvVob)9gGYS0?c)n&5RxZn1^ii57_6t)1EFfGUg=)Ou6#pV!473 zkM3=Z1o1#J#!ElWvfqEp{1&+l3QDcxx^7A;do|z2)U-iVygOzksWhT3(<#Jyn%y`a z?d0m@7kt+~7Xl-X#N2>e!C>mMOv#*}a-|6MXcu%XDz+3P2UisLlG~g?Y;UmqMz)Df zzNenYZ~<*ByCjCBnUGN)QGh9lRFy)^T_0__+fIXejc3 z>ECWM0@@PeFIWy$&b`Tm`$;PHih_C}F#ru}aHG6*>nrcbL-*M+bQZ@)#Wxg`Rx_JS zs;E6JDID22cB_+OEdN}6HHwS7O?swuHn3$eV*@LDYtfwx-k`0p8HTu+p{Ph*=}Z{z z0Kr{~Nyd{6TeE-nBqrV>U*2`}B*B*}7pEOAo?2WPmynutojV=h5LZ|K!9Z?Z`uWaB z9jCqi`lW9DwYwn+#?KwxvwQ!`dl%sCcvK}Kl#ZwCcj_JX^%m~_ba8KxyLR&<3uBpo z*?P+zmsst47UUb zGKT;QAON(Y^!@t@5~U9OETIqwIamo8JhQ3cS~YI~Od4o9i>)9F1(H|9%7nq`gP%H} zC;#_5m|-XCXc5&Sw3CX>kwcgcpO+c-#%=uJ1YFGbNou;V+BE#{6^HNx%GHx`u zlA~`sDzrXx7rp_0tDl2R{&n1~y6<-6)r z1(76)FOdtWJIAb%U0H$-kVLC$V+S6^nC2X*h{F`!Q@ay;92B^Edwvr>rhc>Htl5-#|){fC{17hc^AtYoM~CrH!NEU4U0aTS+U+L(du4D8+j6h58{S ztH9Kg{p8gDkTSde_L}70;KqWEMM;r&?valMnQ)p#+`{M;ER~|niW(lsPgIX_j&NIh zTnWLx9~$#xx#^+5d1Yb$H^1#f*q#lDm&XvQ4IGeUhC z%pkLLmFxz2z+kF*mCu~#<4V7LaHIxq{lmu;Rjz%sy6|4;hRO`?bVY%cg6FGvga)){ zjgAuV;T2F@_QT*H)whDn4SXy<`cBiP3BIDr1NM^NNwA17LoS*jlX>}C6M=IBzh;|7b#a&b??!ZxXH}6`=(JXX4X%}t<9&z@IV## zGaQe;uT*snZ`>ttTfuEK4FFF8z7C3|OS;k)b#3_I_WFnS!LDiH2b{p@WR}i`=fppU}-#m|VZ8bp}j{xdkQ5^DOi+r5~-mOSx zXjrlmZ>QXjVx<~8d0&ROi}YcB3#)LKD8e-)llD9e!S)M$L`d7yQft7gxSzB-Sh_hq zUB~-g-FtY?S89W84t0LhNl%rKZsd>l>`J@H8t^kMvA@65Sa zKpCTu0_Nb=+X!7*#U{?aTS0yq0Y|IvM4C=>+`1@I9cmuZ0Ss5K zneXTZx02<}Y1*X-r@DBWoEguGzE!J$C{J(+8p7r31-S^2;-FbzxmJxbohugegj@Fb zT!Xw)_tfm%YxUK~dehketJ;G6)kH#c6++ZXNtK>lMct=N%VED(1GdA zl%5z@RT+x8q{p!D<0fyG@Q$SF#>FK;hLRU1W)@cF)>D%^))GS32qnSMR$S|8{S94j4^q=88UHE9ciBI3c`%yL# zh=d1lNB3F<67iNOcxHn5|%HHmUEm#Q$F{b|yOrK9_DX-MS^-It}3xC^em$>UjpH zZY|!lSiEb+Wi3Mp=mm>t9#-6~NZBHD75lO(9Y!KEQ-_R$7&=$7V8dS983_j9n!5OIPE)NPB~mICUIy zg569fNv`+N6;ER_3oAIhh=8sT8VbWy#r}o~+_aK_5dvuvmm`xc+`UOw z$ae!@{&a{)q_ld1R8RekDhu5}bpiE3VX=W5u0I`)?A`_^{5HgLbGgc2rwVeg_S`o! zo#9k-rX=5~66Qym38S58T+Jtyijv|QHwUI@tZz_v*PnW)>o@p+sna-Ie|A~A79Me< zDm8>DerQ@T_LWx?|3aC^s14w4 z_g#l`dV!LA>z|J2h$t8g;xLnwS7gX=%Rq5Z$VRhtJ|!C`Wxk0JZ8BQ=i_O$y6gyHf zl_S!tQ-IkuZF6jwI+vG)sI#9xfZnP{nte21#n-B2QjLD zQYc1(A?#H7(Qk{(LB^jV6gk$aFZ4U6S9s&$8wru9bY{zfCkz0d`BDkd6ff3duN`;xRzaWSR<@*I?Y0-2ly;|`O) z=RO%x7p1TQJMe~;)UyIXI7&KFhGVP?O?I;fJxO_%x`(3ulswcY%8g^iR!MxhXUK*q z$x1R^T6o8W<*^i3%~I}41s6R$59F4IYOXs%(#-8A{7Q#*_D zc>RnpM1pD4u3KfS0c-JAZY@e7A$~S@4C7OE_hklt^K=iB&F3~Jbzm^m6~H%)zZ6N@ z7!SPck$I+T7Z?Pre@;*<*g8jRKN^pt11dK-l$xj}~V zFfdV-kFUs@xbj;}6}!wbk5jTBnc*B-mLc?H>7e!Fg*`9-`0x)ObDNaC&%d~^|InVp z|44hPx5+*_kMXcF`hi&aMfQbL`{)h8tfz^vurL4X{WJb^;jaHUG^&5?+5gI`ho7hU z%7Qu<&VKX!kGMMGhu;6@Yb_)yHeGy*sCQ@J0kWmAorr=O=l=s z_@I+ewHb|4jN@;yxiJ@ctMPq0#y^5HR$e$5sCl=pB>e^w7;D+UUeiRz*e1hVU&PNJ zFM{!L7jGJ3;#83<6YhcPR45DX*nzQGC)X7gl zb}brRxtF=IW9gH51uQqd7{pef#q%Y4u3mJ0wDs{au~SH9#v_UHJaM{X+z!)0b%+Xl z>HHVJ+F5v3w|*Jt0Abztk9L!_HCyiaLquwXk}xz#v(>buT*Ux8B6S66VJDkTxDdCZ zcMjL!`%MpAJ<;j+yWKxJ@RNnn*6okKG}^bXHEeo4o+@ zNfeR0;t*&cbld8*%{wrVTPTbTfU&fzKJCm6G4(4qIyo{=k?hc)g!C)IrRiNFcl6Rq zoaYE@31EV*_`jvBovllcPoxysD927(z9x=ib8~7v>#x5>fN3;!gdH!+U16z1aQ`X^ z3Z6RSbA#UpOFMh4{5H^G+0Ri!!Q$)6cd^>bv7-{O z+O7oT99$J=2Z0$LkIO3dL)Vl^Z+)@%pqa|4FL_sud3dyauDaP~A8Iua{HG9l3h-<3 z$*~Oo)9sm#f$^u;&(caELWsUP%cHLSPa&>4rk-mFvV|RZ*$1|gmeJk+r9a#HrK-<# z@W=?YPSw4<;{{?tbBR-i4XL5# zy+njvy@%ZKO;BB_KUBoveCo#_Jq*RXku58&Z16*0jL}G`e0{|wy z)J!0B5z3V{@?fPp%i?_(_d_pa3Y+OFa(3b18Sg!?`^AM9;d;Rp4(;9Z!dDNX&YbfI5f(gZ`DKP-*DWP{qrh^&!Jsi)Jyd-oP}Z^Qu8>~ z^e*8drC(u1yhzx%|m=noG_M4Y;9gVs*W`=5Xq@4q$vzqjr9 zyO+Ty)fa{wS?T`iThCbH6jrPclauGWNXzd~QQ|5}8!Xl`tmdgSm<`xjhkLg?CDN_B zNP3xre<0Eu?KAw^#`~zC6q@mF1%+KP8)w7)6jHdWIZ9TkF0jTnIj~@ASU&|_6wEA$ z)Bnqx7lh1?#s?SnA?_-Mz*cbkjCy|vt#1mVY&|3qH2p;Wx}68*1Q-RX>0@^Y%Me&m zf+)GY(gmhjZBP_biaB2ERg}c>p#$`s-4;AYb}2r+zlM=-(~HA85_VHGtCe!(=hTOD_TbsxO1AP#zSL ouCs9T6-S%|kJALyHI8Cf>6u;1D@`G1d@S*IYu)eG{<8aj04f8H^Z)<= From 2db8c3bb5750a660ab562a07cb40512eee5328f9 Mon Sep 17 00:00:00 2001 From: lee hakmin Date: Fri, 23 Aug 2019 23:47:41 +0900 Subject: [PATCH 006/336] Delete PrusaSlicer.po --- resources/localization/ko_KR/PrusaSlicer.po | 7441 ------------------- 1 file changed, 7441 deletions(-) delete mode 100644 resources/localization/ko_KR/PrusaSlicer.po diff --git a/resources/localization/ko_KR/PrusaSlicer.po b/resources/localization/ko_KR/PrusaSlicer.po deleted file mode 100644 index 395df5e026..0000000000 --- a/resources/localization/ko_KR/PrusaSlicer.po +++ /dev/null @@ -1,7441 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: slic3rkorean\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-04-09 14:34+0200\n" -"PO-Revision-Date: 2019-05-23 23:51+0900\n" -"Last-Translator: lee hak-min \n" -"Language-Team: ulsanether\n" -"Language: ko_KR\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.2.3\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"X-Crowdin-Project: slic3rkorean\n" -"X-Crowdin-Language: ko\n" -"X-Crowdin-File: ko_KR.po\n" - -#: src/slic3r/GUI/AboutDialog.cpp:194 -#, c-format -msgid "About %s" -msgstr "%s에 대하여" - -#: src/slic3r/GUI/AboutDialog.cpp:64 src/slic3r/GUI/MainFrame.cpp:52 -msgid "Version" -msgstr "버전" - -#: src/slic3r/GUI/BedShapeDialog.cpp:43 -msgid "Shape" -msgstr "모양" - -#: src/slic3r/GUI/BedShapeDialog.cpp:51 -msgid "Rectangular" -msgstr "직사각형" - -#: src/slic3r/GUI/BedShapeDialog.cpp:55 src/slic3r/GUI/GUI_ObjectManipulation.cpp:118 -#: src/slic3r/GUI/Plater.cpp:136 src/slic3r/GUI/Tab.cpp:2185 -msgid "Size" -msgstr "사이즈" - -#: src/slic3r/GUI/BedShapeDialog.cpp:56 -msgid "Size in X and Y of the rectangular plate." -msgstr "사격형 플레이트 X 및 Y 크기." - -#: src/slic3r/GUI/BedShapeDialog.cpp:62 -msgid "Origin" -msgstr "원본" - -#: src/slic3r/GUI/BedShapeDialog.cpp:63 -msgid "Distance of the 0,0 G-code coordinate from the front left corner of the rectangle." -msgstr "사각형의 전면 왼쪽된 모서리에서 0, 0 G-코드 좌표 거리입니다." - -#: src/slic3r/GUI/BedShapeDialog.cpp:67 -msgid "Circular" -msgstr "원형" - -#: src/slic3r/GUI/BedShapeDialog.cpp:70 src/slic3r/GUI/ConfigWizard.cpp:111 src/slic3r/GUI/ConfigWizard.cpp:544 -#: src/slic3r/GUI/ConfigWizard.cpp:558 src/slic3r/GUI/GUI_ObjectManipulation.cpp:115 -#: src/slic3r/GUI/RammingChart.cpp:81 src/slic3r/GUI/WipeTowerDialog.cpp:84 src/libslic3r/PrintConfig.cpp:59 -#: src/libslic3r/PrintConfig.cpp:66 src/libslic3r/PrintConfig.cpp:75 src/libslic3r/PrintConfig.cpp:209 -#: src/libslic3r/PrintConfig.cpp:284 src/libslic3r/PrintConfig.cpp:292 src/libslic3r/PrintConfig.cpp:342 -#: src/libslic3r/PrintConfig.cpp:352 src/libslic3r/PrintConfig.cpp:472 src/libslic3r/PrintConfig.cpp:483 -#: src/libslic3r/PrintConfig.cpp:501 src/libslic3r/PrintConfig.cpp:679 src/libslic3r/PrintConfig.cpp:1165 -#: src/libslic3r/PrintConfig.cpp:1226 src/libslic3r/PrintConfig.cpp:1244 src/libslic3r/PrintConfig.cpp:1262 -#: src/libslic3r/PrintConfig.cpp:1314 src/libslic3r/PrintConfig.cpp:1324 src/libslic3r/PrintConfig.cpp:1445 -#: src/libslic3r/PrintConfig.cpp:1453 src/libslic3r/PrintConfig.cpp:1494 src/libslic3r/PrintConfig.cpp:1502 -#: src/libslic3r/PrintConfig.cpp:1512 src/libslic3r/PrintConfig.cpp:1520 src/libslic3r/PrintConfig.cpp:1528 -#: src/libslic3r/PrintConfig.cpp:1611 src/libslic3r/PrintConfig.cpp:1827 src/libslic3r/PrintConfig.cpp:1897 -#: src/libslic3r/PrintConfig.cpp:1931 src/libslic3r/PrintConfig.cpp:2123 src/libslic3r/PrintConfig.cpp:2130 -#: src/libslic3r/PrintConfig.cpp:2137 src/libslic3r/PrintConfig.cpp:2167 src/libslic3r/PrintConfig.cpp:2177 -#: src/libslic3r/PrintConfig.cpp:2187 src/libslic3r/PrintConfig.cpp:2293 src/libslic3r/PrintConfig.cpp:2368 -#: src/libslic3r/PrintConfig.cpp:2377 src/libslic3r/PrintConfig.cpp:2386 src/libslic3r/PrintConfig.cpp:2396 -#: src/libslic3r/PrintConfig.cpp:2440 src/libslic3r/PrintConfig.cpp:2450 src/libslic3r/PrintConfig.cpp:2469 -#: src/libslic3r/PrintConfig.cpp:2479 src/libslic3r/PrintConfig.cpp:2488 src/libslic3r/PrintConfig.cpp:2506 -#: src/libslic3r/PrintConfig.cpp:2521 src/libslic3r/PrintConfig.cpp:2532 src/libslic3r/PrintConfig.cpp:2545 -#: src/libslic3r/PrintConfig.cpp:2555 -msgid "mm" -msgstr "mm" - -#: src/slic3r/GUI/BedShapeDialog.cpp:71 src/libslic3r/PrintConfig.cpp:676 -msgid "Diameter" -msgstr "노즐 직경" - -#: src/slic3r/GUI/BedShapeDialog.cpp:72 -msgid "Diameter of the print bed. It is assumed that origin (0,0) is located in the center." -msgstr "인쇄 침대의 직경. 원점 (0,0) 은 중심에 있다고 가정합니다." - -#: src/slic3r/GUI/BedShapeDialog.cpp:76 src/slic3r/GUI/GUI_Preview.cpp:239 -#: src/libslic3r/GCode/PreviewData.cpp:175 -msgid "Custom" -msgstr "사용자 정의" - -#: src/slic3r/GUI/BedShapeDialog.cpp:80 -msgid "Load shape from STL..." -msgstr "STL파일 로드." - -#: src/slic3r/GUI/BedShapeDialog.cpp:126 -msgid "Settings" -msgstr "설정" - -#: src/slic3r/GUI/BedShapeDialog.cpp:299 -msgid "Choose a file to import bed shape from (STL/OBJ/AMF/3MF/PRUSA):" -msgstr "침대 모양 (STL/OBJ/AMF/3MF/PRUSA) 에서 가져오려는 파일을 선택 합니다:" - -#: src/slic3r/GUI/BedShapeDialog.cpp:316 src/slic3r/GUI/GUI_ObjectList.cpp:1252 -msgid "Error! " -msgstr "에러! " - -#: src/slic3r/GUI/BedShapeDialog.cpp:325 -msgid "The selected file contains no geometry." -msgstr "선택한 파일에는 형상이 없는 포함 되어 있습니다." - -#: src/slic3r/GUI/BedShapeDialog.cpp:329 -msgid "The selected file contains several disjoint areas. This is not supported." -msgstr "선택한 파일 여러 분리 된 영역을 포함 되어 있습니다. 이 지원 되지 않습니다." - -#: src/slic3r/GUI/BedShapeDialog.hpp:44 src/slic3r/GUI/ConfigWizard.cpp:507 -msgid "Bed Shape" -msgstr "배드 모양" - -#: src/slic3r/GUI/BonjourDialog.cpp:55 -msgid "Network lookup" -msgstr "네트워크 조회" - -#: src/slic3r/GUI/BonjourDialog.cpp:72 -msgid "Address" -msgstr "주소" - -#: src/slic3r/GUI/BonjourDialog.cpp:73 -msgid "Hostname" -msgstr "호스트이름" - -#: src/slic3r/GUI/BonjourDialog.cpp:74 -msgid "Service name" -msgstr "서비스 이름" - -#: src/slic3r/GUI/BonjourDialog.cpp:76 -msgid "OctoPrint version" -msgstr "옥토프린트 버전" - -#: src/slic3r/GUI/BonjourDialog.cpp:218 -msgid "Searching for devices" -msgstr "디바이스 검색" - -#: src/slic3r/GUI/BonjourDialog.cpp:225 -msgid "Finished" -msgstr "완료" - -#: src/slic3r/GUI/ButtonsDescription.cpp:15 -msgid "Buttons And Text Colors Description" -msgstr "버튼 및 텍스트 색상 설명" - -#: src/slic3r/GUI/ButtonsDescription.cpp:40 -msgid "Value is the same as the system value" -msgstr "값은 시스템 값과 같습니다" - -#: src/slic3r/GUI/ButtonsDescription.cpp:57 -msgid "Value was changed and is not equal to the system value or the last saved preset" -msgstr "값이 변경 되었고 시스템 값 또는 마지막으로 저장 된 사전 설정과 같지 않음" - -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:17 -msgid "Upgrade" -msgstr "업그레이드" - -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:19 -msgid "Downgrade" -msgstr "다운그레이드" - -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:21 -msgid "Before roll back" -msgstr "롤백 전에" - -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:23 -msgid "User" -msgstr "사용자" - -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:26 -msgid "Unknown" -msgstr "알 수 없음" - -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:38 -msgid "Active: " -msgstr "활성: " - -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:44 -msgid "slic3r version" -msgstr "slic3r에 대하여" - -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:45 src/slic3r/GUI/Preset.cpp:1250 -msgid "print" -msgstr "프린트" - -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:46 -msgid "filaments" -msgstr "필라멘트" - -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:47 src/slic3r/GUI/Preset.cpp:1254 -msgid "printer" -msgstr "프린터" - -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:51 src/slic3r/GUI/Tab.cpp:872 -msgid "vendor" -msgstr "제조 회사" - -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:51 -msgid "version" -msgstr "버전" - -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:52 -msgid "min slic3r version" -msgstr "최소 slic3r 버전" - -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:54 -msgid "max slic3r version" -msgstr "최대 slic3r 버전" - -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:57 -msgid "model" -msgstr "모델" - -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:57 -msgid "variants" -msgstr "변종" - -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:69 -msgid "Incompatible with this Slic3r" -msgstr "이 Slic3r와 호환 되지 않음" - -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:72 -msgid "Activate" -msgstr "활성화" - -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:98 -msgid "Configuration Snapshots" -msgstr "구성 스냅숏" - -#: src/slic3r/GUI/ConfigWizard.cpp:111 -msgid "nozzle" -msgstr "노즐" - -#: src/slic3r/GUI/ConfigWizard.cpp:115 -msgid "Alternate nozzles:" -msgstr "대체 노즐:" - -#: src/slic3r/GUI/ConfigWizard.cpp:181 -msgid "All standard" -msgstr "모두 표준설정" - -#: src/slic3r/GUI/ConfigWizard.cpp:182 src/slic3r/GUI/Tab.cpp:2909 -msgid "All" -msgstr "모두 선택" - -#: src/slic3r/GUI/ConfigWizard.cpp:183 src/slic3r/GUI/Plater.cpp:414 src/libslic3r/GCode/PreviewData.cpp:162 -msgid "None" -msgstr "없음" - -#: src/slic3r/GUI/ConfigWizard.cpp:298 -#, c-format -msgid "Welcome to the %s Configuration Wizard" -msgstr "%s에 오신것을 환영 합니다." - -#: src/slic3r/GUI/ConfigWizard.cpp:284 -msgid "Welcome" -msgstr "환영합니다" - -#: src/slic3r/GUI/ConfigWizard.cpp:288 src/slic3r/GUI/GUI_App.cpp:600 -#, c-format -msgid "Run %s" -msgstr "%s 실행" - -#: src/slic3r/GUI/ConfigWizard.cpp:290 -#, c-format -msgid "" -"Hello, welcome to Slic3r Prusa Edition! This %s helps you with the initial configuration; just a few settings " -"and you will be ready to print." -msgstr "" -"안녕하세요, Slic3r prusa 버전에 오신 것을 환영 합니다! 이 %s 초기 구성;에 도움이 됩니다. 단지 몇 가지 설정 하 " -"고 당신은 인쇄 준비가 될 것입니다." - -#: src/slic3r/GUI/ConfigWizard.cpp:294 -msgid "Remove user profiles - install from scratch (a snapshot will be taken beforehand)" -msgstr "사용자 프로필 제거-처음부터 설치 (스냅숏은 사전에 수행 됩니다)" - -#: src/slic3r/GUI/ConfigWizard.cpp:342 -#, c-format -msgid "%s Family" -msgstr "%s의 가족들" - -#: src/slic3r/GUI/ConfigWizard.cpp:379 -msgid "Custom Printer Setup" -msgstr "사용자 지정 프린터 설정" - -#: src/slic3r/GUI/ConfigWizard.cpp:379 -msgid "Custom Printer" -msgstr "사용자 정의 프린터" - -#: src/slic3r/GUI/ConfigWizard.cpp:381 -msgid "Define a custom printer profile" -msgstr "사용자 정의 프린터 프로필 정의" - -#: src/slic3r/GUI/ConfigWizard.cpp:383 -msgid "Custom profile name:" -msgstr "사용자 지정 프로필 이름:" - -#: src/slic3r/GUI/ConfigWizard.cpp:407 -msgid "Automatic updates" -msgstr "자동 업데이트" - -#: src/slic3r/GUI/ConfigWizard.cpp:407 -msgid "Updates" -msgstr "업데이트" - -#: src/slic3r/GUI/ConfigWizard.cpp:415 src/slic3r/GUI/Preferences.cpp:61 -msgid "Check for application updates" -msgstr "프로그램 업데이트 확인" - -#: src/slic3r/GUI/ConfigWizard.cpp:419 -#, c-format -msgid "" -"If enabled, %s checks for new application versions online. When a new version becomes available, a " -"notification is displayed at the next application startup (never during program usage). This is only a " -"notification mechanisms, no automatic installation is done." -msgstr "" -"활성화 된 경우 %s은 온라인의 새 버전을 확인합니다. 새 버전을 사용할 수있게되면 다음 응용 프로그램 시작시 알림" -"이 표시됩니다 (프로그램 사용 중에는 절대로 사용하지 마십시오).이것은 알림 메커니즘 일뿐 자동 설치가 수행되지 " -"않습니다." - -#: src/slic3r/GUI/ConfigWizard.cpp:425 src/slic3r/GUI/Preferences.cpp:69 -msgid "Update built-in Presets automatically" -msgstr "기존의 설정 자동 업데이트" - -#: src/slic3r/GUI/ConfigWizard.cpp:429 -#, c-format -msgid "" -"If enabled, %s downloads updates of built-in system presets in the background.These updates are downloaded " -"into a separate temporary location.When a new preset version becomes available it is offered at application " -"startup." -msgstr "" -"활성화 된 경우 %s은 백그라운드에서 내장 시스템 사전 설정의 업데이트를 다운로드합니다. 이러한 업데이트는 별도" -"의 임시 위치에 다운로드됩니다. 새로운 사전 설정 버전을 사용할 수있게되면 응용 프로그램 시작시 제공됩니다." - -#: src/slic3r/GUI/ConfigWizard.cpp:432 -msgid "Updates are never applied without user's consent and never overwrite user's customized settings." -msgstr "업데이트는 사용자의 동의없이 적용되지 않으며 사용자의 사용자 지정된 설정을 덮어 쓰지 않습니다." - -#: src/slic3r/GUI/ConfigWizard.cpp:437 -msgid "Additionally a backup snapshot of the whole configuration is created before an update is applied." -msgstr "또한 업데이트가 적용되기 전에 전체 구성의 백업 스냅 샷이 생성됩니다." - -#: src/slic3r/GUI/ConfigWizard.cpp:444 -msgid "Other Vendors" -msgstr "다른 공급 업체" - -#: src/slic3r/GUI/ConfigWizard.cpp:446 -#, c-format -msgid "Pick another vendor supported by %s:" -msgstr "%s가 지원하는 다른 공급 업체를 선택하십시오:" - -#: src/slic3r/GUI/ConfigWizard.cpp:492 -msgid "Firmware Type" -msgstr "펌웨어 타입" - -#: src/slic3r/GUI/ConfigWizard.cpp:492 src/slic3r/GUI/Tab.cpp:1957 -msgid "Firmware" -msgstr "펌웨어" - -#: src/slic3r/GUI/ConfigWizard.cpp:473 -msgid "Choose the type of firmware used by your printer." -msgstr "프린터에 패치할 펌웨어를 선택하세요." - -#: src/slic3r/GUI/ConfigWizard.cpp:507 -msgid "Bed Shape and Size" -msgstr "배드 모양과 크기" - -#: src/slic3r/GUI/ConfigWizard.cpp:510 -msgid "Set the shape of your printer's bed." -msgstr "프린터 배드모양을 설정하세요." - -#: src/slic3r/GUI/ConfigWizard.cpp:524 -msgid "Filament and Nozzle Diameters" -msgstr "필라멘트와 노즐 크기" - -#: src/slic3r/GUI/ConfigWizard.cpp:524 -msgid "Print Diameters" -msgstr "인쇄 직경" - -#: src/slic3r/GUI/ConfigWizard.cpp:540 -msgid "Enter the diameter of your printer's hot end nozzle." -msgstr "핫 엔드 노즐 직경을 입력하십시오." - -#: src/slic3r/GUI/ConfigWizard.cpp:543 -msgid "Nozzle Diameter:" -msgstr "노즐 직경:" - -#: src/slic3r/GUI/ConfigWizard.cpp:553 -msgid "Enter the diameter of your filament." -msgstr "필라멘트의 직경을 입력하십시오." - -#: src/slic3r/GUI/ConfigWizard.cpp:554 -msgid "" -"Good precision is required, so use a caliper and do multiple measurements along the filament, then compute " -"the average." -msgstr "정밀도가 필요하므로 캘리퍼를 사용하여 필라멘트를 따라 여러 번 측정 한 다음 평균을 계산하십시오." - -#: src/slic3r/GUI/ConfigWizard.cpp:557 -msgid "Filament Diameter:" -msgstr "필라멘트 직경:" - -#: src/slic3r/GUI/ConfigWizard.cpp:575 -msgid "Extruder and Bed Temperatures" -msgstr "익스트루더와 배드 온도" - -#: src/slic3r/GUI/ConfigWizard.cpp:575 -msgid "Temperatures" -msgstr "온도" - -#: src/slic3r/GUI/ConfigWizard.cpp:591 -msgid "Enter the temperature needed for extruding your filament." -msgstr "필라멘트 압출에 필요한 온도를 입력하십시오." - -#: src/slic3r/GUI/ConfigWizard.cpp:592 -msgid "A rule of thumb is 160 to 230 °C for PLA, and 215 to 250 °C for ABS." -msgstr "보통 PLA의 경우 160 ~ 230 ° C, ABS의 경우 215 ~ 250 ° C입니다." - -#: src/slic3r/GUI/ConfigWizard.cpp:595 -msgid "Extrusion Temperature:" -msgstr "출력 온도 :" - -#: src/slic3r/GUI/ConfigWizard.cpp:596 src/slic3r/GUI/ConfigWizard.cpp:610 -msgid "°C" -msgstr "°C" - -#: src/slic3r/GUI/ConfigWizard.cpp:605 -msgid "Enter the bed temperature needed for getting your filament to stick to your heated bed." -msgstr "필라멘트가 핫배드에 접착하는데 필요한 배드온도를 입력하십시오." - -#: src/slic3r/GUI/ConfigWizard.cpp:606 -msgid "A rule of thumb is 60 °C for PLA and 110 °C for ABS. Leave zero if you have no heated bed." -msgstr "보통은 PLA의 경우 60 ° C이고 ABS의 경우 110 ° C입니다. 핫배드가 없는 경우에는 0으로 두십시오." - -#: src/slic3r/GUI/ConfigWizard.cpp:609 -msgid "Bed Temperature:" -msgstr "배드 온도 :" - -#: src/slic3r/GUI/ConfigWizard.cpp:1001 -msgid "Select all standard printers" -msgstr "이 프로파일과 호환 가능한 프린터를 선택하세요" - -#: src/slic3r/GUI/ConfigWizard.cpp:1004 -msgid "< &Back" -msgstr "< &뒤로" - -#: src/slic3r/GUI/ConfigWizard.cpp:1005 -msgid "&Next >" -msgstr "&다음 >" - -#: src/slic3r/GUI/ConfigWizard.cpp:1006 -msgid "&Finish" -msgstr "&완료" - -#: src/slic3r/GUI/ConfigWizard.cpp:1007 src/slic3r/GUI/FirmwareDialog.cpp:142 -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:37 src/slic3r/GUI/ProgressStatusBar.cpp:28 -msgid "Cancel" -msgstr "취소" - -#: src/slic3r/GUI/ConfigWizard.cpp:1021 -msgid "Prusa FFF Technology Printers" -msgstr "Prusa FFF 방식 프린터" - -#: src/slic3r/GUI/ConfigWizard.cpp:1024 -msgid "Prusa MSLA Technology Printers" -msgstr "Prusa MSLA 방식 프린터" - -#: src/slic3r/GUI/ConfigWizard.cpp:1111 -msgid "Configuration Wizard" -msgstr "구성 마법사" - -#: src/slic3r/GUI/ConfigWizard.cpp:1112 -msgid "Configuration &Wizard" -msgstr "구성 마법사" - -#: src/slic3r/GUI/ConfigWizard.cpp:1114 -msgid "Configuration Assistant" -msgstr "구성 도우미" - -#: src/slic3r/GUI/ConfigWizard.cpp:1115 -msgid "Configuration &Assistant" -msgstr "구성 도우미" - -#: src/slic3r/GUI/Field.cpp:112 -msgid "default value" -msgstr "기본값" - -#: src/slic3r/GUI/Field.cpp:115 -msgid "parameter name" -msgstr "매개 변수 이름" - -#: src/slic3r/GUI/Field.cpp:143 -#, c-format -msgid "%s doesn't support percentage" -msgstr "%s 이(가) 백분율을 지원하지 않음" - -#: src/slic3r/GUI/Field.cpp:157 src/slic3r/GUI/Field.cpp:180 -msgid "Invalid numeric input." -msgstr "숫자 입력이 잘못 되었습니다." - -#: src/slic3r/GUI/Field.cpp:162 -msgid "Input value is out of range" -msgstr "Input value is out of range" - -#: src/slic3r/GUI/Field.cpp:188 -#, c-format -msgid "" -"Do you mean %d%% instead of %d %s?\n" -"Select YES if you want to change this value to %d%%, \n" -"or NO if you are sure that %d %s is a correct value." -msgstr "" -"%d%% 대신 %d %s 를 의미 합니까?\n" -"이 값을 %d%%,로 변경 하려면 예를 선택 하십시오. \n" -"또는 %d %s가 올바른 값 인지 확인 하십시오." - -#: src/slic3r/GUI/Field.cpp:191 -msgid "Parameter validation" -msgstr "매개 변수 이름" - -#: src/slic3r/GUI/FirmwareDialog.cpp:141 -msgid "Flash!" -msgstr "완료!" - -#: src/slic3r/GUI/FirmwareDialog.cpp:143 -msgid "Flashing in progress. Please do not disconnect the printer!" -msgstr "아직 플래싱 중입니다. 커넥트를 분리하지 마십시오!" - -#: src/slic3r/GUI/FirmwareDialog.cpp:187 -msgid "Flashing failed: " -msgstr "펌웨어 플래싱 실패: " - -#: src/slic3r/GUI/FirmwareDialog.cpp:268 -msgid "Flashing succeeded!" -msgstr "플래싱 성공!" - -#: src/slic3r/GUI/FirmwareDialog.cpp:269 -msgid "Flashing failed. Please see the avrdude log below." -msgstr "플래시 실패. 아래의 로그를 확인하세요." - -#: src/slic3r/GUI/FirmwareDialog.cpp:270 -msgid "Flashing cancelled." -msgstr "깜빡임 취소됨." - -#: src/slic3r/GUI/FirmwareDialog.cpp:308 -#, c-format -msgid "" -"This firmware hex file does not match the printer model.\n" -"The hex file is intended for: %s\n" -"Printer reported: %s\n" -"\n" -"Do you want to continue and flash this hex file anyway?\n" -"Please only continue if you are sure this is the right thing to do." -msgstr "" -"이 펌웨어 hex 파일이 프린터 모델과 일치 하지 않습니다.\n" -"Hex 파일은 다음을 위한 것입니다: %s\n" -"보고 된 프린터: %s\n" -"\n" -"그래도이 hex 파일을 계속 플래싱 하시겠습니까?\n" -"이것이 옳은 일 이라고 확신 하는 경우에만 계속 하십시오." - -#: src/slic3r/GUI/FirmwareDialog.cpp:395 src/slic3r/GUI/FirmwareDialog.cpp:431 -#, c-format -msgid "Multiple %s devices found. Please only connect one at a time for flashing." -msgstr "여러 %s 장치를 찾았습니다. 깜박이는 경우에는 한 번에 하나씩만 연결 하십시오." - -#: src/slic3r/GUI/FirmwareDialog.cpp:412 -#, c-format -msgid "" -"The %s device was not found.\n" -"If the device is connected, please press the Reset button next to the USB connector ..." -msgstr "" -"%s 장치를 찾을 하지 않았습니다.\n" -"장치가 연결 된 경우 USB 커넥터 옆에 있는 리셋 단추를 누르십시오." - -#: src/slic3r/GUI/FirmwareDialog.cpp:525 -#, c-format -msgid "The %s device could not have been found" -msgstr "%s 장치를 찾을 수 없습니다" - -#: src/slic3r/GUI/FirmwareDialog.cpp:603 -#, c-format -msgid "Error accessing port at %s: %s" -msgstr "%s 포트에 액세스 하는 중 오류가 발생 했습니다 :%s" - -#: src/slic3r/GUI/FirmwareDialog.cpp:605 -#, c-format -msgid "Error: %s" -msgstr "에러: %s" - -#: src/slic3r/GUI/FirmwareDialog.cpp:735 -msgid "Firmware flasher" -msgstr "펌웨어 플래셔" - -#: src/slic3r/GUI/FirmwareDialog.cpp:762 -msgid "Firmware image:" -msgstr "펌웨어 이미지:" - -#: src/slic3r/GUI/FirmwareDialog.cpp:766 -msgid "Serial port:" -msgstr "시리얼 포트:" - -#: src/slic3r/GUI/FirmwareDialog.cpp:768 -msgid "Autodetected" -msgstr "자동 감지" - -#: src/slic3r/GUI/FirmwareDialog.cpp:769 -msgid "Rescan" -msgstr "재검색" - -#: src/slic3r/GUI/FirmwareDialog.cpp:776 -msgid "Progress:" -msgstr "진행:" - -#: src/slic3r/GUI/FirmwareDialog.cpp:779 -msgid "Status:" -msgstr "지위:" - -#: src/slic3r/GUI/FirmwareDialog.cpp:780 -msgid "Ready" -msgstr "준비" - -#: src/slic3r/GUI/FirmwareDialog.cpp:800 -msgid "Advanced: Output log" -msgstr "고급: 출력 로그" - -#: src/slic3r/GUI/FirmwareDialog.cpp:811 src/slic3r/GUI/PrintHostDialogs.cpp:161 -msgid "Close" -msgstr "닫기" - -#: src/slic3r/GUI/FirmwareDialog.cpp:859 -msgid "" -"Are you sure you want to cancel firmware flashing?\n" -"This could leave your printer in an unusable state!" -msgstr "" -"펌웨어 플래싱을 취소하시겠습니까?\n" -"프린터가 사용할 수 없는 상태가 될 수 있습니다!" - -#: src/slic3r/GUI/FirmwareDialog.cpp:860 -msgid "Confirmation" -msgstr "확인" - -#: src/slic3r/GUI/FirmwareDialog.cpp:863 -msgid "Cancelling..." -msgstr "취소 중...." - -#: src/slic3r/GUI/GLCanvas3D.cpp:709 -msgid "Detected object outside print volume" -msgstr "출력물이 프린터 출력 사이즈를 넘었습니다" - -#: src/slic3r/GUI/GLCanvas3D.cpp:710 -msgid "Detected toolpath outside print volume" -msgstr "인쇄 영역 밖에 있는 공구 경로가 감지 되었습니다" - -#: src/slic3r/GUI/GLCanvas3D.cpp:711 -msgid "Some objects are not visible when editing supports" -msgstr "편집 지원 시 일부 객체가 표시 되지 않음" - -#: src/slic3r/GUI/GLCanvas3D.cpp:713 -msgid "" -"Detected object outside print volume\n" -"Resolve a clash to continue slicing/export process correctly" -msgstr "" -"인쇄 볼륨 외부에서 감지 된 오브젝트\n" -"조각화/내보내기 프로세스를 올바르게 계속 하려면 충돌 해결" - -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:35 src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:195 -msgid "Rotate lower part upwards" -msgstr "아래쪽 부분을 위쪽으로 회전" - -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:36 src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:198 -msgid "Perform cut" -msgstr "절단 실행" - -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:43 -msgid "Cut object:" -msgstr "객체 잘라내기:" - -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:88 -msgid "Cut [C]" -msgstr "자르기 [C]" - -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:188 src/libslic3r/PrintConfig.cpp:3006 -msgid "Cut" -msgstr "자르기" - -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:193 -msgid "Keep upper part" -msgstr "상위 부분 유지" - -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:194 -msgid "Keep lower part" -msgstr "낮은 부분 유지" - -#: src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp:32 -msgid "Place on face" -msgstr "면 배치 " - -#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:52 -msgid "Move" -msgstr "이동" - -#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:176 -msgid "Position (mm)" -msgstr "위치 (mm)" - -#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:176 -msgid "Displacement (mm)" -msgstr "변위 (mm)" - -#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:458 -msgid "Rotate [R]" -msgstr "회전 [R]" - -#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:491 -msgid "Rotation (deg)" -msgstr "회전 (°)" - -#: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:51 -msgid "Scale [S]" -msgstr "크기 [S]" - -#: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:276 -msgid "Scale (%)" -msgstr "스케일 (%)" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:597 -msgid "Left mouse click - add point" -msgstr "마우스 왼쪽 클릭-점 추가" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:598 -msgid "Right mouse click - remove point" -msgstr "마우스 오른쪽 버튼 클릭-점 제거" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:599 -msgid "Shift + Left (+ drag) - select point(s)" -msgstr "Shift + 왼쪽 (+ 끌기)-점 선택" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:840 -msgid "Head diameter" -msgstr "헤드 지름: " - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:856 -msgid "Lock supports under new islands" -msgstr "새 고립 영역에서 잠금 지원" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:860 src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1249 -msgid "Remove selected points" -msgstr "선택한 점 제거" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:864 src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:921 -msgid "Remove all points" -msgstr "모든 점 제거" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:869 src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1252 -msgid "Apply changes" -msgstr "변경 내용을 적용" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:874 src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1253 -msgid "Discard changes" -msgstr "변경사항을 취소" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:881 -msgid "Minimal points distance" -msgstr "최소 포인트 거리: " - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:882 src/libslic3r/PrintConfig.cpp:2534 -msgid "Support points density" -msgstr "지원 포인트 밀도" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:911 src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1255 -msgid "Auto-generate points" -msgstr "점 자동 생성" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:917 -msgid "Manual editing" -msgstr "수동 편집" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:934 -msgid "Clipping of view" -msgstr "클립핑 보기" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1007 -msgid "SLA Support Points" -msgstr "SLA 지원 포인트" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:767 -msgid "Do you want to save your manually edited support points ?\n" -msgstr "수동으로 편집한 지원 지점을 저장 하시겠습니까?\n" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:768 -msgid "Save changes?" -msgstr "변경 사항을 저장 하 시겠습니까?" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:897 -msgid "" -"Autogeneration will erase all manually edited points.\n" -"\n" -"Are you sure you want to do it?\n" -msgstr "" -"자동 생성은 수동으로 편집한 모든 점을 지웁니다.\n" -"\n" -"당신은 당신은 그렇게 하시겠습니까?\n" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:899 src/slic3r/GUI/GUI.cpp:288 -#: src/slic3r/GUI/WipeTowerDialog.cpp:44 src/slic3r/GUI/WipeTowerDialog.cpp:328 -msgid "Warning" -msgstr "위험" - -#: src/slic3r/GUI/GUI.cpp:147 src/slic3r/GUI/Tab.cpp:2720 -msgid "It's impossible to print multi-part object(s) with SLA technology." -msgstr "SLA 방식을 사용 하여 멀티파트를 인쇄할 수는 없습니다." - -#: src/slic3r/GUI/GUI.cpp:148 -msgid "Please check and fix your object list." -msgstr "개체 목록을 확인 하고 수정 하십시오." - -#: src/slic3r/GUI/GUI.cpp:149 src/slic3r/GUI/GUI_App.cpp:679 src/slic3r/GUI/Tab.cpp:2722 -msgid "Attention!" -msgstr "주목!" - -#: src/slic3r/GUI/GUI.cpp:282 -msgid "Notice" -msgstr "공지" - -#: src/slic3r/GUI/GUI_App.cpp:318 -msgid "Changing of an application language" -msgstr "응용 프로그램 언어 변경" - -#: src/slic3r/GUI/GUI_App.cpp:326 src/slic3r/GUI/GUI_App.cpp:335 -msgid "Recreating" -msgstr "재현" - -#: src/slic3r/GUI/GUI_App.cpp:339 -msgid "Loading of a current presets" -msgstr "현재 프리셋 불러오기" - -#: src/slic3r/GUI/GUI_App.cpp:347 -msgid "Loading of a mode view" -msgstr "모드 보기 로드" - -#: src/slic3r/GUI/GUI_App.cpp:429 -msgid "Choose one file (3MF):" -msgstr "파일 (3MF)를 선택:" - -#: src/slic3r/GUI/GUI_App.cpp:441 -msgid "Choose one or more files (STL/OBJ/AMF/3MF/PRUSA):" -msgstr "파일을 선택하세요 (STL/OBJ/AMF/3MF/PRUSA):" - -#: src/slic3r/GUI/GUI_App.cpp:454 -msgid "Array of language names and identifiers should have the same size." -msgstr "언어 이름과 식별자 배열은 같은 크기 여야합니다." - -#: src/slic3r/GUI/GUI_App.cpp:464 -msgid "Select the language" -msgstr "언어를 선택" - -#: src/slic3r/GUI/GUI_App.cpp:464 -msgid "Language" -msgstr "언어" - -#: src/slic3r/GUI/GUI_App.cpp:534 src/slic3r/GUI/GUI_ObjectList.cpp:1067 src/libslic3r/PrintConfig.cpp:298 -msgid "Default" -msgstr "기본값" - -# xs/src/slic3r/GUI/GUI.cpp:349 -#: src/slic3r/GUI/GUI_App.cpp:603 -msgid "&Configuration Snapshots" -msgstr "구성 스냅숏" - -#: src/slic3r/GUI/GUI_App.cpp:603 -msgid "Inspect / activate configuration snapshots" -msgstr "구성 스냅 샷 검사 / 활성화" - -#: src/slic3r/GUI/GUI_App.cpp:604 -msgid "Take Configuration &Snapshot" -msgstr "구성 스냅 샷 가져 오기" - -#: src/slic3r/GUI/GUI_App.cpp:604 -msgid "Capture a configuration snapshot" -msgstr "구성 스냅 샷 캡처" - -#: src/slic3r/GUI/GUI_App.cpp:607 -msgid "&Preferences" -msgstr "환경 설정" - -#: src/slic3r/GUI/GUI_App.cpp:613 -msgid "Application preferences" -msgstr "응용 프로그램 환경 설정" - -#: src/slic3r/GUI/GLCanvas3D.cpp:3434 -msgid "Add..." -msgstr "추가..." - -#: src/slic3r/GUI/GLCanvas3D.cpp:3455 src/slic3r/GUI/Plater.cpp:3375 -msgid "Delete all" -msgstr "전부 지우기" - -#: src/slic3r/GUI/GLCanvas3D.cpp:3491 -msgid "Paste" -msgstr "붙여넣기" - -#: src/slic3r/GUI/GLCanvas3D.cpp:3505 -msgid "Add instance" -msgstr "인스턴스 추가" - -#: src/slic3r/GUI/GLCanvas3D.cpp:3517 -msgid "Remove instance" -msgstr "인스턴스 제거" - -#: src/slic3r/GUI/GLCanvas3D.cpp:3532 -msgid "Split to objects" -msgstr "객체로 분할" - -#: src/slic3r/GUI/GLCanvas3D.cpp:3544 src/slic3r/GUI/GUI_ObjectList.cpp:1122 -msgid "Split to parts" -msgstr "파트로 분할" - -#: src/slic3r/GUI/GLCanvas3D.cpp:3559 -msgid "Layers editing" -msgstr "레이어층을 편집" - -#: src/slic3r/GUI/GUI_App.cpp:616 src/slic3r/GUI/wxExtensions.cpp:2446 -msgid "Simple" -msgstr "단순" - -#: src/slic3r/GUI/GUI_App.cpp:729 -msgid "Simple View Mode" -msgstr "단순 보기 모드" - -#: src/slic3r/GUI/GUI_App.cpp:730 src/slic3r/GUI/GUI_ObjectList.cpp:85 src/slic3r/GUI/GUI_ObjectList.cpp:541 -#: src/slic3r/GUI/Tab.cpp:1032 src/slic3r/GUI/Tab.cpp:1047 src/slic3r/GUI/Tab.cpp:1145 -#: src/slic3r/GUI/Tab.cpp:1148 src/slic3r/GUI/Tab.cpp:1551 src/slic3r/GUI/Tab.cpp:1977 -#: src/slic3r/GUI/Tab.cpp:3492 src/slic3r/GUI/wxExtensions.cpp:2556 src/libslic3r/PrintConfig.cpp:73 -#: src/libslic3r/PrintConfig.cpp:188 src/libslic3r/PrintConfig.cpp:351 src/libslic3r/PrintConfig.cpp:999 -#: src/libslic3r/PrintConfig.cpp:2210 -msgid "Advanced" -msgstr "고급" - -#: src/slic3r/GUI/GUI_App.cpp:730 -msgid "Advanced View Mode" -msgstr "고급 보기 모드" - -#: src/slic3r/GUI/GUI_App.cpp:731 src/slic3r/GUI/wxExtensions.cpp:2557 -msgid "Expert" -msgstr "전문가" - -#: src/slic3r/GUI/GUI_App.cpp:731 -msgid "Expert View Mode" -msgstr "전문가 보기 모드" - -#: src/slic3r/GUI/GUI_App.cpp:736 -msgid "Mode" -msgstr "모드" - -#: src/slic3r/GUI/GUI_App.cpp:736 -#, c-format -msgid "%s View Mode" -msgstr "%s 보기 모드" - -#: src/slic3r/GUI/GUI_App.cpp:738 -msgid "Change Application &Language" -msgstr "응용 프로그램 언어 번경" - -#: src/slic3r/GUI/GUI_App.cpp:740 -msgid "Flash printer &firmware" -msgstr "프린터 펌웨어 플래시" - -#: src/slic3r/GUI/GUI_App.cpp:740 -msgid "Upload a firmware image into an Arduino based printer" -msgstr "아두이노 기반의 프린터 이미지 업로드" - -#: src/slic3r/GUI/GUI_App.cpp:752 -msgid "Taking configuration snapshot" -msgstr "구성 스냅 샷 만들기" - -#: src/slic3r/GUI/GUI_App.cpp:752 -msgid "Snapshot name" -msgstr "스냅 샷 이름" - -#: src/slic3r/GUI/GUI_App.cpp:676 -msgid "Application will be restarted after language change." -msgstr "언어 변경 후 응용 프로그램이 다시 시작 됩니다." - -#: src/slic3r/GUI/GUI_App.cpp:677 -msgid "3D-Scene will be cleaned." -msgstr "3D-장면이 청소 됩니다." - -#: src/slic3r/GUI/GUI_App.cpp:798 -msgid "Language selection" -msgstr "국가에 맞는 언어를 선택" - -#: src/slic3r/GUI/GUI_App.cpp:795 -msgid "" -"Switching the language will trigger application restart.\n" -"You will lose content of the plater." -msgstr "언어를 전환 하면 응용 프로그램 재시작 합니다.플레이트 위 오브젝트는 모두 지워집니다." - -#: src/slic3r/GUI/GUI_App.cpp:678 -msgid "Please, check your changes before." -msgstr "이전에 변경 사항을 확인 하십시오." - -#: src/slic3r/GUI/GUI_App.cpp:706 -msgid "&Configuration" -msgstr "&구성" - -#: src/slic3r/GUI/GUI_App.cpp:726 -msgid "You have unsaved changes " -msgstr "저장되지 않은 변경 사항이 있습니다 " - -#: src/slic3r/GUI/GUI_App.cpp:726 -msgid ". Discard changes and continue anyway?" -msgstr ". 변경 사항을 취소하고 계속 하시겠습니까?" - -#: src/slic3r/GUI/GUI_App.cpp:727 -msgid "Unsaved Presets" -msgstr "저장되지 않은 기존설정" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:28 src/slic3r/GUI/GUI_ObjectList.cpp:65 src/libslic3r/PrintConfig.cpp:56 -#: src/libslic3r/PrintConfig.cpp:149 src/libslic3r/PrintConfig.cpp:380 src/libslic3r/PrintConfig.cpp:437 -#: src/libslic3r/PrintConfig.cpp:445 src/libslic3r/PrintConfig.cpp:841 src/libslic3r/PrintConfig.cpp:1025 -#: src/libslic3r/PrintConfig.cpp:1304 src/libslic3r/PrintConfig.cpp:1370 src/libslic3r/PrintConfig.cpp:1551 -#: src/libslic3r/PrintConfig.cpp:1986 src/libslic3r/PrintConfig.cpp:2042 -msgid "Layers and Perimeters" -msgstr "레이어 및 경계선" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:29 src/slic3r/GUI/GUI_ObjectList.cpp:66 src/slic3r/GUI/Plater.cpp:431 -#: src/slic3r/GUI/Tab.cpp:981 src/slic3r/GUI/Tab.cpp:982 src/slic3r/GUI/Tab.cpp:1311 -#: src/libslic3r/PrintConfig.cpp:166 src/libslic3r/PrintConfig.cpp:388 src/libslic3r/PrintConfig.cpp:728 -#: src/libslic3r/PrintConfig.cpp:742 src/libslic3r/PrintConfig.cpp:779 src/libslic3r/PrintConfig.cpp:932 -#: src/libslic3r/PrintConfig.cpp:942 src/libslic3r/PrintConfig.cpp:960 src/libslic3r/PrintConfig.cpp:978 -#: src/libslic3r/PrintConfig.cpp:997 src/libslic3r/PrintConfig.cpp:1658 src/libslic3r/PrintConfig.cpp:1675 -msgid "Infill" -msgstr "인필(채움)" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:30 src/slic3r/GUI/GUI_ObjectList.cpp:67 src/slic3r/GUI/GUI_Preview.cpp:236 -#: src/slic3r/GUI/Tab.cpp:1010 src/slic3r/GUI/Tab.cpp:1011 src/libslic3r/PrintConfig.cpp:333 -#: src/libslic3r/PrintConfig.cpp:1431 src/libslic3r/PrintConfig.cpp:1779 src/libslic3r/PrintConfig.cpp:1785 -#: src/libslic3r/PrintConfig.cpp:1793 src/libslic3r/PrintConfig.cpp:1805 src/libslic3r/PrintConfig.cpp:1815 -#: src/libslic3r/PrintConfig.cpp:1823 src/libslic3r/PrintConfig.cpp:1838 src/libslic3r/PrintConfig.cpp:1859 -#: src/libslic3r/PrintConfig.cpp:1870 src/libslic3r/PrintConfig.cpp:1886 src/libslic3r/PrintConfig.cpp:1895 -#: src/libslic3r/PrintConfig.cpp:1904 src/libslic3r/PrintConfig.cpp:1915 src/libslic3r/PrintConfig.cpp:1929 -#: src/libslic3r/PrintConfig.cpp:1937 src/libslic3r/PrintConfig.cpp:1938 src/libslic3r/PrintConfig.cpp:1947 -#: src/libslic3r/PrintConfig.cpp:1955 src/libslic3r/PrintConfig.cpp:1969 src/libslic3r/GCode/PreviewData.cpp:172 -msgid "Support material" -msgstr "서포트 재료(Support material)" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:33 src/slic3r/GUI/GUI_ObjectList.cpp:69 src/slic3r/GUI/Tab.cpp:1070 -#: src/slic3r/GUI/Tab.cpp:1794 src/libslic3r/PrintConfig.cpp:455 src/libslic3r/PrintConfig.cpp:953 -#: src/libslic3r/PrintConfig.cpp:1339 src/libslic3r/PrintConfig.cpp:1667 src/libslic3r/PrintConfig.cpp:1851 -#: src/libslic3r/PrintConfig.cpp:1877 src/libslic3r/PrintConfig.cpp:2149 src/libslic3r/PrintConfig.cpp:2157 -msgid "Extruders" -msgstr "익스트루더" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:39 -msgid "Pad and Support" -msgstr "패드 및 서포트" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:68 src/slic3r/GUI/GUI_Preview.cpp:215 src/slic3r/GUI/Tab.cpp:1035 -#: src/libslic3r/PrintConfig.cpp:198 src/libslic3r/PrintConfig.cpp:425 src/libslic3r/PrintConfig.cpp:870 -#: src/libslic3r/PrintConfig.cpp:998 src/libslic3r/PrintConfig.cpp:1360 src/libslic3r/PrintConfig.cpp:1597 -#: src/libslic3r/PrintConfig.cpp:1646 src/libslic3r/PrintConfig.cpp:1697 src/libslic3r/PrintConfig.cpp:2028 -msgid "Speed" -msgstr "속도" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:70 src/libslic3r/PrintConfig.cpp:415 src/libslic3r/PrintConfig.cpp:522 -#: src/libslic3r/PrintConfig.cpp:829 src/libslic3r/PrintConfig.cpp:961 src/libslic3r/PrintConfig.cpp:1348 -#: src/libslic3r/PrintConfig.cpp:1687 src/libslic3r/PrintConfig.cpp:1860 src/libslic3r/PrintConfig.cpp:2017 -msgid "Extrusion Width" -msgstr "압출 폭" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:75 src/slic3r/GUI/Plater.cpp:410 src/slic3r/GUI/Tab.cpp:3309 -#: src/slic3r/GUI/Tab.cpp:3310 src/libslic3r/PrintConfig.cpp:2359 src/libslic3r/PrintConfig.cpp:2366 -#: src/libslic3r/PrintConfig.cpp:2375 src/libslic3r/PrintConfig.cpp:2384 src/libslic3r/PrintConfig.cpp:2394 -#: src/libslic3r/PrintConfig.cpp:2420 src/libslic3r/PrintConfig.cpp:2427 src/libslic3r/PrintConfig.cpp:2438 -#: src/libslic3r/PrintConfig.cpp:2448 src/libslic3r/PrintConfig.cpp:2457 src/libslic3r/PrintConfig.cpp:2467 -#: src/libslic3r/PrintConfig.cpp:2476 src/libslic3r/PrintConfig.cpp:2486 src/libslic3r/PrintConfig.cpp:2496 -#: src/libslic3r/PrintConfig.cpp:2504 -msgid "Supports" -msgstr "서포트" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:76 src/slic3r/GUI/Tab.cpp:3337 src/slic3r/GUI/Tab.cpp:3338 -#: src/libslic3r/PrintConfig.cpp:2512 src/libslic3r/PrintConfig.cpp:2519 src/libslic3r/PrintConfig.cpp:2530 -#: src/libslic3r/PrintConfig.cpp:2540 src/libslic3r/PrintConfig.cpp:2553 src/libslic3r/PrintConfig.cpp:2562 -msgid "Pad" -msgstr "패드" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:173 src/slic3r/GUI/GUI_ObjectManipulation.cpp:45 -msgid "Name" -msgstr "이름" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:201 -msgid "Right button click the icon to change the object settings" -msgstr "아이콘을 클릭 하여 개체 설정을 변경 합니다" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:209 -#, c-format -msgid "Auto-repaired (%d errors):\n" -msgstr "오류자동수정 (%d errors)\n" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:212 -msgid "degenerate facets" -msgstr "더러운 면" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:213 -msgid "edges fixed" -msgstr "모서리 고정" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:214 -msgid "facets removed" -msgstr "면 제거" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:215 -msgid "facets added" -msgstr "면 추가됨" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:216 -msgid "facets reversed" -msgstr "면 반전" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:217 -msgid "backwards edges" -msgstr "뒤쪽 가장자리" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:231 -msgid "Right button click the icon to fix STL through Netfabb" -msgstr "아이콘을 클릭 하여 Netfabb에서 STL을 수정 합니다" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:278 src/slic3r/GUI/Tab.cpp:1430 src/libslic3r/PrintConfig.cpp:454 -msgid "Extruder" -msgstr "익스트루더(Extruder)" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:683 src/slic3r/GUI/GUI_ObjectList.cpp:963 -#: src/slic3r/GUI/GUI_ObjectList.cpp:969 src/slic3r/GUI/GUI_ObjectList.cpp:1199 -#, c-format -msgid "Quick Add Settings (%s)" -msgstr "빠른 추가 설정 (%s)" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:746 -msgid "Select showing settings" -msgstr "설정 표시를 선택 합니다" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:874 -msgid "Load" -msgstr "불러오기" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:879 src/slic3r/GUI/GUI_ObjectList.cpp:911 -#: src/slic3r/GUI/GUI_ObjectList.cpp:914 -msgid "Box" -msgstr "박스" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:879 -msgid "Cylinder" -msgstr "원통" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:879 -msgid "Sphere" -msgstr "영역" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:879 -msgid "Slab" -msgstr "슬랩" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:890 src/slic3r/GUI/GUI_ObjectList.cpp:906 -msgid "Add part" -msgstr "파트 추가" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:891 -msgid "Add modifier" -msgstr "편집영역(modifier) 추가" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:892 src/slic3r/GUI/GUI_ObjectList.cpp:910 -msgid "Add support enforcer" -msgstr "서포트 지원(enforcer)영역 추가" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:893 src/slic3r/GUI/GUI_ObjectList.cpp:913 -msgid "Add support blocker" -msgstr "서포트 금지영역(blocker) 추가" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:942 -msgid "Add settings" -msgstr "다음 설정" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1009 -msgid "Change type" -msgstr "타입 변경" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1016 src/slic3r/GUI/GUI_ObjectList.cpp:1153 -msgid "Set as a Separated Object" -msgstr "분리 된 객체로 설정" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1024 -msgid "Rename" -msgstr "이름 변경" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1034 -msgid "Fix through the Netfabb" -msgstr "네트워크를 통해 수정" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1041 src/slic3r/GUI/Plater.cpp:2861 -msgid "Export as STL" -msgstr "STL로 내보내기" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1048 -msgid "Change extruder" -msgstr "압출기(익스트루더) 변경" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1073 -msgid "Select new extruder for the object/part" -msgstr "객체/부품에 대한 새 압출(익스트루더) 기 선택" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1079 src/slic3r/GUI/Plater.cpp:2825 src/slic3r/GUI/Plater.cpp:2843 -#: src/slic3r/GUI/Tab.cpp:2860 -msgid "Delete" -msgstr "지우기 " - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1153 -msgid "Set as a Separated Objects" -msgstr "분리 된 객체로 설정" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1374 -msgid "Generic" -msgstr "일반" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1516 -msgid "You can't delete the last solid part from object." -msgstr "마지막 솔리드 파트는 객체에서 삭제할 수 없습니다." - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1533 -msgid "You can't delete the last intance from object." -msgstr "개체에서 마지막 인텐스(intance)를 삭제할 수 없습니다." - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1560 src/slic3r/GUI/Plater.cpp:2219 -msgid "The selected object couldn't be split because it contains only one part." -msgstr "선택한 오브젝트는 파트가 하나만 포함되어 있기 때문에 분할 할 수 없습니다." - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1676 -msgid "Group manipulation" -msgstr "그룹 조작" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1688 -msgid "Object manipulation" -msgstr "개체 조작" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1698 -msgid "Object Settings to modify" -msgstr "수정할 개체 설정" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1702 -msgid "Part Settings to modify" -msgstr "수정할 부품 설정" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1711 -msgid "Part manipulation" -msgstr "파트 조작" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1717 -msgid "Instance manipulation" -msgstr "인스턴스 제거" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2240 -msgid "Object or Instance" -msgstr "개체 또는 인스턴스" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2240 -msgid "Part" -msgstr "부품(Part)" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2242 -msgid "Unsupported selection" -msgstr "지원 되지 않는 선택" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2243 -#, c-format -msgid "You started your selection with %s Item." -msgstr "%s 항목으로 선택을 시작 했습니다." - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2244 -#, c-format -msgid "In this mode you can select only other %s Items%s" -msgstr "이 모드에서는 %s의 다른 %s 항목만 선택할 수 있습니다" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2247 -msgid "of a current Object" -msgstr "현재 개체의" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2252 src/slic3r/GUI/GUI_ObjectList.cpp:2325 src/slic3r/GUI/Plater.cpp:117 -msgid "Info" -msgstr "정보" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2366 -msgid "You can't change a type of the last solid part of the object." -msgstr "객체의 마지막 솔리드 부품 유형은 변경할 수 없습니다." - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2547 -msgid "Modifier" -msgstr "편집 영역" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2547 -msgid "Support Enforcer" -msgstr "서포트 지원 영역" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2547 -msgid "Support Blocker" -msgstr "서포트 금지 영역" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2549 -msgid "Type:" -msgstr "형식:" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2549 -msgid "Select type of part" -msgstr "부품 유형 선택" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2538 -msgid "Enter new name" -msgstr "새 이름 입력" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2538 -msgid "Renaming" -msgstr "이름 바꾸기" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2554 src/slic3r/GUI/GUI_ObjectList.cpp:2632 src/slic3r/GUI/Tab.cpp:3191 -#: src/slic3r/GUI/Tab.cpp:3195 -msgid "The supplied name is not valid;" -msgstr "제공된 이름이 유효하지 않습니다;" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2555 src/slic3r/GUI/GUI_ObjectList.cpp:2633 src/slic3r/GUI/Tab.cpp:3192 -msgid "the following characters are not allowed:" -msgstr "다음 문자는 허용되지 않습니다:" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2653 -msgid "Set extruder for selected items" -msgstr "선택한 항목에 대한 압출기(익스트루더) 설정" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2654 -msgid "Select extruder number for selected objects and/or parts" -msgstr "선택한 객체 및 부품에 대한 압출기(익스트루더) 번호 선택" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2667 -msgid "Select extruder number:" -msgstr "압출기(익스트루더) 번호 선택:" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2668 -msgid "This extruder will be set for selected items" -msgstr "선택한 항목에 대한 압출기(익스트루더) 설정" - -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:40 src/slic3r/GUI/GUI_ObjectManipulation.cpp:83 -msgid "World coordinates" -msgstr "전체크기와 좌표" - -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:41 src/slic3r/GUI/GUI_ObjectManipulation.cpp:84 -msgid "Local coordinates" -msgstr "로컬 좌표" - -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:25 -msgid "Object Manipulation" -msgstr "개체 조작" - -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:47 -msgid "Object name" -msgstr "개체 이름" - -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:115 src/slic3r/GUI/GUI_ObjectManipulation.cpp:160 -msgid "Position" -msgstr "위치" - -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:116 src/slic3r/GUI/GUI_ObjectManipulation.cpp:161 -msgid "Rotation" -msgstr "회전" - -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:117 src/slic3r/GUI/GUI_ObjectManipulation.cpp:201 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:221 src/libslic3r/PrintConfig.cpp:3070 -msgid "Scale" -msgstr "크기" - -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:162 -msgid "Scale factors" -msgstr "축척 계수" - -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:200 src/slic3r/GUI/GUI_ObjectManipulation.cpp:220 -#: src/libslic3r/PrintConfig.cpp:3055 -msgid "Rotate" -msgstr "회전" - -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:219 -msgid "Translate" -msgstr "번역" - -#: src/slic3r/GUI/GUI_ObjectSettings.cpp:58 -msgid "Additional Settings" -msgstr "추가적인 세팅" - -#: src/slic3r/GUI/GUI_Preview.cpp:209 -msgid "View" -msgstr "보기" - -#: src/slic3r/GUI/GUI_Preview.cpp:212 src/slic3r/GUI/GUI_Preview.cpp:525 src/libslic3r/GCode/PreviewData.cpp:394 -msgid "Feature type" -msgstr "특색 유형" - -#: src/slic3r/GUI/GUI_Preview.cpp:213 src/libslic3r/PrintConfig.cpp:467 -msgid "Height" -msgstr "높이" - -#: src/slic3r/GUI/GUI_Preview.cpp:214 src/libslic3r/PrintConfig.cpp:2135 -msgid "Width" -msgstr "폭" - -#: src/slic3r/GUI/GUI_Preview.cpp:216 -msgid "Volumetric flow rate" -msgstr "용적의 유량값" - -#: src/slic3r/GUI/GUI_Preview.cpp:217 src/slic3r/GUI/GUI_Preview.cpp:315 src/slic3r/GUI/GUI_Preview.cpp:469 -#: src/slic3r/GUI/GUI_Preview.cpp:525 src/slic3r/GUI/GUI_Preview.cpp:701 src/libslic3r/GCode/PreviewData.cpp:404 -msgid "Tool" -msgstr "도구" - -#: src/slic3r/GUI/GUI_Preview.cpp:218 src/slic3r/GUI/GUI_Preview.cpp:523 src/libslic3r/GCode/PreviewData.cpp:406 -msgid "Color Print" -msgstr "컬러 프린트" - -#: src/slic3r/GUI/GUI_Preview.cpp:221 -msgid "Show" -msgstr "보다" - -#: src/slic3r/GUI/GUI_Preview.cpp:224 src/slic3r/GUI/GUI_Preview.cpp:225 -msgid "Feature types" -msgstr "특색 유형" - -#: src/slic3r/GUI/GUI_Preview.cpp:227 src/libslic3r/GCode/PreviewData.cpp:163 -msgid "Perimeter" -msgstr "가장자리" - -#: src/slic3r/GUI/GUI_Preview.cpp:228 src/libslic3r/GCode/PreviewData.cpp:164 -msgid "External perimeter" -msgstr "외부 가장자리" - -#: src/slic3r/GUI/GUI_Preview.cpp:229 src/libslic3r/GCode/PreviewData.cpp:165 -msgid "Overhang perimeter" -msgstr "오버행(Overhang) 둘레" - -#: src/slic3r/GUI/GUI_Preview.cpp:230 src/libslic3r/GCode/PreviewData.cpp:166 -msgid "Internal infill" -msgstr "내부 채움" - -#: src/slic3r/GUI/GUI_Preview.cpp:231 src/libslic3r/PrintConfig.cpp:1686 src/libslic3r/PrintConfig.cpp:1696 -#: src/libslic3r/GCode/PreviewData.cpp:167 -msgid "Solid infill" -msgstr "솔리드 인필" - -#: src/slic3r/GUI/GUI_Preview.cpp:232 src/libslic3r/PrintConfig.cpp:2016 src/libslic3r/PrintConfig.cpp:2027 -#: src/libslic3r/GCode/PreviewData.cpp:168 -msgid "Top solid infill" -msgstr "가장 윗부분 채움" - -#: src/slic3r/GUI/GUI_Preview.cpp:233 src/libslic3r/GCode/PreviewData.cpp:169 -msgid "Bridge infill" -msgstr "프릿지 채움" - -#: src/slic3r/GUI/GUI_Preview.cpp:234 src/libslic3r/PrintConfig.cpp:869 src/libslic3r/GCode/PreviewData.cpp:170 -msgid "Gap fill" -msgstr "공백 채움" - -#: src/slic3r/GUI/GUI_Preview.cpp:235 src/slic3r/GUI/Tab.cpp:1001 src/libslic3r/GCode/PreviewData.cpp:171 -msgid "Skirt" -msgstr "스커트" - -#: src/slic3r/GUI/GUI_Preview.cpp:237 src/libslic3r/PrintConfig.cpp:1903 src/libslic3r/GCode/PreviewData.cpp:173 -msgid "Support material interface" -msgstr "서포트 재료 인터페이스" - -#: src/slic3r/GUI/GUI_Preview.cpp:238 src/slic3r/GUI/Tab.cpp:1081 src/libslic3r/GCode/PreviewData.cpp:174 -msgid "Wipe tower" -msgstr "와이프 타워(Wipe tower)" - -#: src/slic3r/GUI/GUI_Preview.cpp:243 src/libslic3r/PrintConfig.cpp:2049 -msgid "Travel" -msgstr "이송" - -#: src/slic3r/GUI/GUI_Preview.cpp:244 -msgid "Retractions" -msgstr "리트랙션" - -#: src/slic3r/GUI/GUI_Preview.cpp:245 -msgid "Unretractions" -msgstr "리트랙션 취소" - -#: src/slic3r/GUI/GUI_Preview.cpp:246 -msgid "Shells" -msgstr "쉘" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:13 -msgid "Slic3r Prusa Edition - Keyboard Shortcuts" -msgstr "Slic3r Prusa 에디션-키보드 단축키" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:100 -msgid "Open project STL/OBJ/AMF/3MF with config, delete bed" -msgstr "구성으로 프로젝트 STL/OBJ/AMF/3MF 열기, 배드 삭제" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:101 -msgid "Import STL/OBJ/AMF/3MF without config, keep bed" -msgstr "구성 없이 STL/OBJ/AMF/3MF 가져오기, 배드 유지" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:102 -msgid "Load Config from .ini/amf/3mf/gcode" -msgstr ".Ini/amf/3mf/gcode에서 구성 로드" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:103 src/slic3r/GUI/Plater.cpp:725 src/slic3r/GUI/Plater.cpp:3673 -#: src/libslic3r/PrintConfig.cpp:2957 -msgid "Export G-code" -msgstr "G-코드 내보내기" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:104 -msgid "Save project (3MF)" -msgstr "프로젝트 저장 (3MF)" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:105 -msgid "Load Config from .ini/amf/3mf/gcode and merge" -msgstr ".Ini/amf/3mf/gcode 및 병합에서 구성 로드" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:106 -msgid "(Re)slice" -msgstr "(Re)슬라이스" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:107 -msgid "Quick slice" -msgstr "빠른 슬라이스" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:108 src/slic3r/GUI/MainFrame.cpp:326 -msgid "Repeat last quick slice" -msgstr "마지막으로 빠른 슬라이스 반복" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:109 -msgid "Select Plater Tab" -msgstr "선택 및 플래이트 탭" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:110 -msgid "Quick slice and Save as" -msgstr "빠른 슬라이스 및 다른 이름으로 저장" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:111 -msgid "Select Print Settings Tab" -msgstr "인쇄 설정 탭을 선택 합니다" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:112 -msgid "Select Filament Settings Tab" -msgstr "필라멘트 설정 탭 선택" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:113 -msgid "Select Printer Settings Tab" -msgstr "프린터 설정 탭을 선택 합니다" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:114 -msgid "Switch to 3D" -msgstr "3D로 전환" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:115 -msgid "Switch to Preview" -msgstr "미리 보기로 전환" - -# xs/src/slic3r/GUI/Preferences.cpp:9 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:116 src/slic3r/GUI/Preferences.cpp:10 -msgid "Preferences" -msgstr "환경 설정" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:117 src/slic3r/GUI/PrintHostDialogs.cpp:134 -msgid "Print host upload queue" -msgstr "호스트 업로드 대기열 인쇄" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:122 -msgid "Camera view" -msgstr "카메라 뷰" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:124 -msgid "Add Instance of the selected object" -msgstr "선택한 개체의 인스턴스 추가" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:125 -msgid "Remove Instance of the selected object" -msgstr "선택한 개체의 인스턴스 제거" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:121 -msgid "Show keyboard shortcuts list" -msgstr "바로 가기 키 목록 표시" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:127 -msgid "Press to select multiple object or move multiple object with mouse" -msgstr "여러 개체를 선택 하거나 마우스로 여러 개체를 이동 하려면 누릅니다." - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:122 -msgid "Select multiple object/Move multiple object" -msgstr "여러 개체 선택/여러 개체 이동" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:124 -msgid "Main Shortcuts" -msgstr "주요 단축키" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:134 -msgid "Arrange" -msgstr "정렬" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:135 -msgid "Select All objects" -msgstr "모든 객체 선택" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:136 -msgid "Delete selected" -msgstr "선택 삭제" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:137 -msgid "Delete All" -msgstr "전부 지움" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:140 -msgid "Gizmo move" -msgstr "기즈모 이동" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:141 -msgid "Gizmo scale" -msgstr "기즈모 배율" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:142 -msgid "Gizmo rotate" -msgstr "기즈모 회전" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:143 -msgid "Gizmo cut" -msgstr "기즈모 자르기" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:138 -msgid "Gizmo Place face on bed" -msgstr "기즈모를 배드위에서" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:139 -msgid "Copy to clipboard" -msgstr "클립보드로 복사" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:140 -msgid "Paste from clipboard" -msgstr "클립보드에서 붙여넣기" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:145 -msgid "Gizmo SLA support points" -msgstr "기즈모 SLA 지원 포인트" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:146 -#, c-format -msgid "" -"Press to activate selection rectangle\n" -"or to snap by 5% in Gizmo scale\n" -"or to snap by 1mm in Gizmo move" -msgstr "" -"활성화된 사각형을 선택합니다.\n" -"5% in 객체 크기를 스냅에 맞춰 조절합니다.\n" -"1mm 씩 객체를 스냅에 맞추 이동합니다." - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:147 -msgid "" -"Press to activate deselection rectangle\n" -"or to scale or rotate selected objects\n" -"around their own center" -msgstr "" -"자신의 중심 주변\n" -"선택한 개체의 크기를 조정 하거나\n" -"회전 하려면 누릅니다" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:148 -msgid "Press to activate one direction scaling in Gizmo scale" -msgstr "기즈모 크기 조절을 활성화 합니다." - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:149 -msgid "Zoom to Bed" -msgstr "배드 확대" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:150 -msgid "Zoom to all objects in scene, if none selected" -msgstr "장면의 모든 오브젝트로 확대/축소 (선택 하지 않은 경우)" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:151 -msgid "Zoom to selected object" -msgstr "선택한 개체로 확대/축소" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:152 -msgid "Zoom in" -msgstr "확대" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:153 -msgid "Zoom out" -msgstr "줌 아웃" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:154 -msgid "Unselect gizmo / Clear selection" -msgstr "기즈모 선택을 취소 하거나 지우기" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:156 -msgid "Plater Shortcuts" -msgstr "플레이터 단축기" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:171 src/slic3r/GUI/KBShortcutsDialog.cpp:182 -msgid "Arrow Up" -msgstr "위쪽 화살표" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:171 src/slic3r/GUI/KBShortcutsDialog.cpp:173 -msgid "Upper Layer" -msgstr "상위 레이어" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:172 src/slic3r/GUI/KBShortcutsDialog.cpp:183 -msgid "Arrow Down" -msgstr "아래쪽 화살표" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:172 src/slic3r/GUI/KBShortcutsDialog.cpp:174 -msgid "Lower Layer" -msgstr "하위 레이어" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:176 -msgid "Preview Shortcuts" -msgstr "미리보기 단축기" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:182 -msgid "Move current slider thumb Up" -msgstr "현재 마우스 휠 슬라이더를 위로 이동" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:183 -msgid "Move current slider thumb Down" -msgstr "현재 마우스 휠 슬라이더를 아래로 이동" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:184 -msgid "Arrow Left" -msgstr "왼쪽 화살표" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:184 -msgid "Set upper thumb to current slider thumb" -msgstr "마우스 휠을 위로 움직여 설정" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:185 -msgid "Arrow Right" -msgstr "오른쪽 화살표" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:185 -msgid "Set lower thumb to current slider thumb" -msgstr "마우스 휠을 아래로 움직여 설정" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:186 -msgid "Add color change marker for current layer" -msgstr "현재 레이어의 색상 변경 마커 추가" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:187 -msgid "Delete color change marker for current layer" -msgstr "현재 레이어의 색상 변경 마커 삭제" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:189 -msgid "Layers Slider Shortcuts" -msgstr "레이어 슬라이더 단축키" - -#: src/slic3r/GUI/MainFrame.cpp:61 -msgid " - Remember to check for updates at http://github.com/prusa3d/PrusaSlicer/releases" -msgstr " -http://github.com/prusa3d/slic3r/releases에서 업데이트를 확인하는 것을 잊지 마십시오" - -#: src/slic3r/GUI/MainFrame.cpp:160 -msgid "Plater" -msgstr "플레이터" - -#: src/slic3r/GUI/MainFrame.cpp:374 -msgid "&New Project" -msgstr "&새로운 프로젝트" - -#: src/slic3r/GUI/MainFrame.cpp:374 -msgid "Start a new project" -msgstr "새로운 프로젝트 시작" - -#: src/slic3r/GUI/MainFrame.cpp:273 -msgid "&Open Project" -msgstr "&프로젝트 열기" - -#: src/slic3r/GUI/MainFrame.cpp:273 -msgid "Open a project file" -msgstr "프로젝트 파일 열기" - -#: src/slic3r/GUI/MainFrame.cpp:275 -msgid "&Save Project" -msgstr "프로젝트 저장" - -#: src/slic3r/GUI/MainFrame.cpp:275 -msgid "Save current project file" -msgstr "현재 프로젝트 파일 저장" - -#: src/slic3r/GUI/MainFrame.cpp:277 -msgid "Save Project &as" -msgstr "프로젝트 저장" - -#: src/slic3r/GUI/MainFrame.cpp:277 -msgid "Save current project file as" -msgstr "현재 프로젝트 파일을 다른 이름으로 저장" - -#: src/slic3r/GUI/MainFrame.cpp:283 -msgid "Import STL/OBJ/AM&F/3MF" -msgstr "가져오기 STL/OBJ/AM&F/3MF" - -#: src/slic3r/GUI/MainFrame.cpp:283 -msgid "Load a model" -msgstr "모델 로드" - -#: src/slic3r/GUI/MainFrame.cpp:286 -msgid "Import &Config" -msgstr "&구성 가져오기" - -#: src/slic3r/GUI/MainFrame.cpp:286 -msgid "Load exported configuration file" -msgstr "내 보낸 구성 파일로드" - -#: src/slic3r/GUI/MainFrame.cpp:288 -msgid "Import Config from &project" -msgstr "프로젝트에서 설정 가져오기" - -#: src/slic3r/GUI/MainFrame.cpp:288 -msgid "Load configuration from project file" -msgstr "프로젝트 파일에서 구성 로드" - -#: src/slic3r/GUI/MainFrame.cpp:291 -msgid "Import Config &Bundle" -msgstr "번들 &설정 가져오기" - -#: src/slic3r/GUI/MainFrame.cpp:291 -msgid "Load presets from a bundle" -msgstr "번들에서 미리 설정로드" - -#: src/slic3r/GUI/MainFrame.cpp:293 -msgid "&Import" -msgstr "가져오기" - -#: src/slic3r/GUI/MainFrame.cpp:296 -msgid "Export &G-code" -msgstr "G-코드 내보내기" - -#: src/slic3r/GUI/MainFrame.cpp:296 -msgid "Export current plate as G-code" -msgstr "현재 플레이트를 G 코드로 내보내기" - -#: src/slic3r/GUI/MainFrame.cpp:299 -msgid "Export plate as &STL" -msgstr "STL로 내보내기" - -#: src/slic3r/GUI/MainFrame.cpp:299 -msgid "Export current plate as STL" -msgstr "현재 플레이트를 STL로 내보내기" - -#: src/slic3r/GUI/MainFrame.cpp:301 -msgid "Export plate as &AMF" -msgstr "AMF로 내보내기" - -#: src/slic3r/GUI/MainFrame.cpp:301 -msgid "Export current plate as AMF" -msgstr "현재 플레이트를AMF로 내보내기" - -#: src/slic3r/GUI/MainFrame.cpp:304 -msgid "Export &Config" -msgstr "&구성 내보내기" - -#: src/slic3r/GUI/MainFrame.cpp:304 -msgid "Export current configuration to file" -msgstr "현재 구성을 파일로 내보내기" - -#: src/slic3r/GUI/MainFrame.cpp:306 -msgid "Export Config &Bundle" -msgstr "번들 & 내보내기 설정" - -#: src/slic3r/GUI/MainFrame.cpp:306 -msgid "Export all presets to file" -msgstr "모든 이전 설정을 파일로 내보내기" - -#: src/slic3r/GUI/MainFrame.cpp:308 -msgid "&Export" -msgstr "&내보내기" - -#: src/slic3r/GUI/MainFrame.cpp:314 -msgid "Quick Slice" -msgstr "빠른 슬라이스" - -#: src/slic3r/GUI/MainFrame.cpp:314 -msgid "Slice a file into a G-code" -msgstr "파일을 G 코드로 분할" - -#: src/slic3r/GUI/MainFrame.cpp:320 -msgid "Quick Slice and Save As" -msgstr "빠른 슬라이스 및 다른 이름으로 저장" - -#: src/slic3r/GUI/MainFrame.cpp:320 -msgid "Slice a file into a G-code, save as" -msgstr "파일을 G 코드로 분할하고 다음으로 저장" - -#: src/slic3r/GUI/MainFrame.cpp:326 -msgid "Repeat Last Quick Slice" -msgstr "마지막으로 빠른 슬라이스 반복" - -#: src/slic3r/GUI/MainFrame.cpp:453 -msgid "(Re)Slice No&w" -msgstr "지금(다시)자르기" - -#: src/slic3r/GUI/MainFrame.cpp:453 -msgid "Start new slicing process" -msgstr "새로운 슬라이싱 작업 시작" - -#: src/slic3r/GUI/MainFrame.cpp:337 -msgid "&Repair STL file" -msgstr "STL 파일 복구" - -#: src/slic3r/GUI/MainFrame.cpp:337 -msgid "Automatically repair an STL file" -msgstr "STL 파일을 자동으로 복구합니다" - -#: src/slic3r/GUI/MainFrame.cpp:340 -msgid "&Quit" -msgstr "종료(&Q)" - -#: src/slic3r/GUI/MainFrame.cpp:460 -#, c-format -msgid "Quit %s" -msgstr "%s 종료" - -#: src/slic3r/GUI/MainFrame.cpp:416 -msgid "Export plate as STL including supports" -msgstr "서포트를 포함하여 STL파일로 내보내기" - -#: src/slic3r/GUI/MainFrame.cpp:374 -msgid "&Select all" -msgstr "&모두 선택 " - -#: src/slic3r/GUI/MainFrame.cpp:374 -msgid "Selects all objects" -msgstr "모든 개체를 선택 합니다" - -#: src/slic3r/GUI/MainFrame.cpp:377 -msgid "&Delete selected" -msgstr "&선택 삭제 " - -#: src/slic3r/GUI/MainFrame.cpp:377 -msgid "Deletes the current selection" -msgstr "현재 선택 영역을 삭제 합니다" - -#: src/slic3r/GUI/MainFrame.cpp:379 -msgid "Delete &all" -msgstr "전부 지움 " - -#: src/slic3r/GUI/MainFrame.cpp:379 -msgid "Deletes all objects" -msgstr "모든 객체를 삭제 합니다" - -#: src/slic3r/GUI/MainFrame.cpp:392 -msgid "&Plater Tab" -msgstr "&선택 및 플래이터 탭" - -#: src/slic3r/GUI/MainFrame.cpp:392 -msgid "Show the plater" -msgstr "플레이트를 보기" - -#: src/slic3r/GUI/MainFrame.cpp:399 -msgid "P&rint Settings Tab" -msgstr "프린트 설정 탭" - -#: src/slic3r/GUI/MainFrame.cpp:399 -msgid "Show the print settings" -msgstr "인쇄 설정 표시" - -#: src/slic3r/GUI/MainFrame.cpp:401 -msgid "&Filament Settings Tab" -msgstr "&필라멘트 설정 탭" - -#: src/slic3r/GUI/MainFrame.cpp:401 -msgid "Show the filament settings" -msgstr "필라멘트 설정보기" - -#: src/slic3r/GUI/MainFrame.cpp:403 -msgid "Print&er Settings Tab" -msgstr "설정 인쇄 탭" - -#: src/slic3r/GUI/MainFrame.cpp:403 -msgid "Show the printer settings" -msgstr "간단한 설정보기" - -#: src/slic3r/GUI/MainFrame.cpp:407 -msgid "3&D" -msgstr "3&D" - -#: src/slic3r/GUI/MainFrame.cpp:407 -msgid "Show the 3D editing view" -msgstr "3D 편집용 보기 표시" - -#: src/slic3r/GUI/MainFrame.cpp:409 -msgid "Pre&view" -msgstr "미리 보기" - -#: src/slic3r/GUI/MainFrame.cpp:409 -msgid "Show the 3D slices preview" -msgstr "3D 슬라이스 미리 보기 표시" - -#: src/slic3r/GUI/MainFrame.cpp:430 -msgid "Print &Host Upload Queue" -msgstr "호스트 업로드 대기열 인쇄" - -#: src/slic3r/GUI/MainFrame.cpp:430 -msgid "Display the Print Host Upload Queue window" -msgstr "호스트 업로드 대기열 인쇄 창 표시" - -#: src/slic3r/GUI/MainFrame.cpp:439 -msgid "Iso" -msgstr "기본 " - -#: src/slic3r/GUI/MainFrame.cpp:439 -msgid "Iso View" -msgstr "Iso 보기" - -# lib/Slic3r/GUI/MainFrame.pm:327 -#: src/slic3r/GUI/MainFrame.cpp:441 -msgid "Top" -msgstr "윗부분 " - -#: src/libslic3r/PrintConfig.cpp:2041 -msgctxt "Layers" -msgid "Top" -msgstr "윗부분" - -#: src/slic3r/GUI/MainFrame.cpp:441 -msgid "Top View" -msgstr "위에서 보기" - -# lib/Slic3r/GUI/MainFrame.pm:328 -#: src/slic3r/GUI/MainFrame.cpp:442 -msgid "Bottom" -msgstr "바닥 " - -#: src/libslic3r/PrintConfig.cpp:148 -msgctxt "Layers" -msgid "Bottom" -msgstr "바닥 " - -#: src/slic3r/GUI/MainFrame.cpp:442 -msgid "Bottom View" -msgstr "바닥 보기" - -#: src/slic3r/GUI/MainFrame.cpp:443 -msgid "Front" -msgstr "앞 " - -#: src/slic3r/GUI/MainFrame.cpp:443 -msgid "Front View" -msgstr "앞면 보기 " - -#: src/slic3r/GUI/MainFrame.cpp:444 src/libslic3r/PrintConfig.cpp:1561 -msgid "Rear" -msgstr "뒷면 " - -#: src/slic3r/GUI/MainFrame.cpp:444 -msgid "Rear View" -msgstr "뒷면 보기" - -#: src/slic3r/GUI/MainFrame.cpp:445 -msgid "Left" -msgstr "왼쪽 " - -#: src/slic3r/GUI/MainFrame.cpp:445 -msgid "Left View" -msgstr "왼쪽 보기" - -#: src/slic3r/GUI/MainFrame.cpp:446 -msgid "Right" -msgstr "오른쪽 " - -#: src/slic3r/GUI/MainFrame.cpp:446 -msgid "Right View" -msgstr "오른쪽 보기" - -#: src/slic3r/GUI/MainFrame.cpp:460 -msgid "Prusa 3D &Drivers" -msgstr "푸르사 3D 드라이버" - -#: src/slic3r/GUI/MainFrame.cpp:460 -msgid "Open the Prusa3D drivers download page in your browser" -msgstr "브라우저에서 Prusa3D 드라이버 다운로드 페이지를 엽니다" - -#: src/slic3r/GUI/MainFrame.cpp:462 -msgid "Prusa Edition &Releases" -msgstr "Prusa 에디션 릴리스" - -#: src/slic3r/GUI/MainFrame.cpp:462 -msgid "Open the Prusa Edition releases page in your browser" -msgstr "브라우저에서 Prusa Edition 릴리즈 페이지를 엽니 다" - -#: src/slic3r/GUI/MainFrame.cpp:468 -msgid "Slic3r &Website" -msgstr "Slic3r 및 웹 사이트" - -#: src/slic3r/GUI/MainFrame.cpp:468 -msgid "Open the Slic3r website in your browser" -msgstr "브라우저에서 Slic3r 웹 사이트 열기" - -#: src/slic3r/GUI/MainFrame.cpp:470 -msgid "Slic3r &Manual" -msgstr "Slic3r &메뉴얼" - -#: src/slic3r/GUI/MainFrame.cpp:470 -msgid "Open the Slic3r manual in your browser" -msgstr "브라우저에서 Slic3r 설명서를 엽니다" - -#: src/slic3r/GUI/MainFrame.cpp:473 -msgid "System &Info" -msgstr "시스템 정보" - -#: src/slic3r/GUI/MainFrame.cpp:473 -msgid "Show system information" -msgstr "시스템 정보 표시" - -#: src/slic3r/GUI/MainFrame.cpp:475 -msgid "Show &Configuration Folder" -msgstr "폴더 표시 및 구성" - -#: src/slic3r/GUI/MainFrame.cpp:475 -msgid "Show user configuration folder (datadir)" -msgstr "사용자 구성 폴더 표시 (datadir)" - -#: src/slic3r/GUI/MainFrame.cpp:477 -msgid "Report an I&ssue" -msgstr "문제를 보고" - -#: src/slic3r/GUI/MainFrame.cpp:477 -msgid "Report an issue on the Slic3r Prusa Edition" -msgstr "Slic3r Prusa Edition에 관한 문제점 보고" - -#: src/slic3r/GUI/MainFrame.cpp:607 -#, c-format -msgid "&About %s" -msgstr "%s 에 대하여" - -#: src/slic3r/GUI/MainFrame.cpp:607 -msgid "Show about dialog" -msgstr "다이얼로그 표시" - -#: src/slic3r/GUI/MainFrame.cpp:482 -msgid "Keyboard Shortcuts" -msgstr "키보드 바로 가기" - -#: src/slic3r/GUI/MainFrame.cpp:482 -msgid "Show the list of the keyboard shortcuts" -msgstr "키보드 단축키 목록 표시" - -#: src/slic3r/GUI/MainFrame.cpp:490 -msgid "&File" -msgstr "&파일" - -#: src/slic3r/GUI/MainFrame.cpp:491 -msgid "&Edit" -msgstr "&수정" - -#: src/slic3r/GUI/MainFrame.cpp:492 -msgid "&Window" -msgstr "&윈도우" - -#: src/slic3r/GUI/MainFrame.cpp:493 -msgid "&View" -msgstr "&시점" - -#: src/slic3r/GUI/MainFrame.cpp:496 -msgid "&Help" -msgstr "&도움말" - -#: src/slic3r/GUI/MainFrame.cpp:504 -msgid "&Copy" -msgstr "&복사 " - -#: src/slic3r/GUI/MainFrame.cpp:507 -msgid "&Paste" -msgstr "&붙이기 " - -#: src/slic3r/GUI/MainFrame.cpp:524 -msgid "Choose a file to slice (STL/OBJ/AMF/3MF/PRUSA):" -msgstr "슬라이스 할 파일을 선택하십시오 (STL / OBJ / AMF / 3MF / PRUSA):" - -#: src/slic3r/GUI/MainFrame.cpp:538 -msgid "No previously sliced file." -msgstr "이전에 분리 된 파일이 없습니다." - -#: src/slic3r/GUI/MainFrame.cpp:539 src/slic3r/GUI/PrintHostDialogs.cpp:219 -msgid "Error" -msgstr "에러" - -#: src/slic3r/GUI/MainFrame.cpp:544 -msgid "Previously sliced file (" -msgstr "이전에 분리 된 파일 (" - -#: src/slic3r/GUI/MainFrame.cpp:544 -msgid ") not found." -msgstr ")을 찾을 수 없습니다." - -#: src/slic3r/GUI/MainFrame.cpp:545 -msgid "File Not Found" -msgstr "파일을 찾을수 없다" - -#: src/slic3r/GUI/MainFrame.cpp:580 src/slic3r/GUI/Tab.cpp:3152 -msgid "Save " -msgstr "저장 " - -#: src/slic3r/GUI/MainFrame.cpp:580 -msgid "SVG" -msgstr "Svg" - -#: src/slic3r/GUI/MainFrame.cpp:580 -msgid "G-code" -msgstr "G 코드" - -#: src/slic3r/GUI/MainFrame.cpp:580 -msgid " file as:" -msgstr " 다음 파일 :" - -#: src/slic3r/GUI/MainFrame.cpp:588 -msgid "Software &Releases" -msgstr "소프트웨어 &자료" - -#: src/slic3r/GUI/MainFrame.cpp:588 -msgid "Open the software releases page in your browser" -msgstr "브라우저에서 소프트웨어 정보 페이지 열기" - -#: src/slic3r/GUI/MainFrame.cpp:594 -#, c-format -msgid "%s &Website" -msgstr "%s &웹사이트" - -#: src/slic3r/GUI/MainFrame.cpp:595 -#, c-format -msgid "Open the %s website in your browser" -msgstr "%s 웹사이트를 브라우저에서 열기" - -#: src/slic3r/GUI/MainFrame.cpp:595 -msgid "Save zip file as:" -msgstr "압축(zip)파일 다른이름 저장:" - -#: src/slic3r/GUI/MainFrame.cpp:607 src/slic3r/GUI/Plater.cpp:2352 src/slic3r/GUI/Plater.cpp:3467 -#: src/slic3r/GUI/Tab.cpp:1110 src/slic3r/GUI/Tab.cpp:3348 -msgid "Slicing" -msgstr "슬라이싱" - -#: src/slic3r/GUI/MainFrame.cpp:607 -msgid "Processing " -msgstr "프로세싱 " - -#: src/slic3r/GUI/MainFrame.cpp:630 -msgid " was successfully sliced." -msgstr " 성공적으로 슬라이스." - -#: src/slic3r/GUI/MainFrame.cpp:632 -msgid "Slicing Done!" -msgstr "슬라이스 완료!" - -#: src/slic3r/GUI/MainFrame.cpp:647 -msgid "Select the STL file to repair:" -msgstr "복구 할 STL 파일을 선택하십시오:" - -#: src/slic3r/GUI/MainFrame.cpp:661 -msgid "Save OBJ file (less prone to coordinate errors than STL) as:" -msgstr "OBJ 파일을 저장하십시오 (STL보다 오류를 덜 조정할 가능성이 적음):" - -#: src/slic3r/GUI/MainFrame.cpp:676 -msgid "Your file was repaired." -msgstr "파일이 복구되었습니다." - -#: src/slic3r/GUI/MainFrame.cpp:676 src/libslic3r/PrintConfig.cpp:3051 -msgid "Repair" -msgstr "수정" - -#: src/slic3r/GUI/MainFrame.cpp:690 -msgid "Save configuration as:" -msgstr "구성을 저장 :" - -#: src/slic3r/GUI/MainFrame.cpp:710 src/slic3r/GUI/MainFrame.cpp:774 -msgid "Select configuration to load:" -msgstr "로드 할 구성 선택 :" - -#: src/slic3r/GUI/MainFrame.cpp:747 -msgid "Save presets bundle as:" -msgstr "이전 설정 번들을 다음과 같이 저장 :" - -#: src/slic3r/GUI/MainFrame.cpp:798 -#, c-format -msgid "%d presets successfully imported." -msgstr "% d 사전 설정을 가져 왔습니다." - -#: src/slic3r/GUI/MsgDialog.cpp:71 -msgid "Slic3r error" -msgstr "Slic3r 오류" - -#: src/slic3r/GUI/MsgDialog.cpp:71 -msgid "Slic3r has encountered an error" -msgstr "Slic3r에 오류가 발생했습니다" - -#: src/slic3r/GUI/Plater.cpp:137 -msgid "Volume" -msgstr "크기" - -#: src/slic3r/GUI/Plater.cpp:138 -msgid "Facets" -msgstr "측면" - -#: src/slic3r/GUI/Plater.cpp:139 -msgid "Materials" -msgstr "재료" - -#: src/slic3r/GUI/Plater.cpp:142 -msgid "Manifold" -msgstr "많은" - -#: src/slic3r/GUI/Plater.cpp:188 -msgid "Sliced Info" -msgstr "슬라이스된 정보" - -#: src/slic3r/GUI/Plater.cpp:207 src/slic3r/GUI/Plater.cpp:998 -msgid "Used Filament (m)" -msgstr "사용자 필라멘트 (m)" - -#: src/slic3r/GUI/Plater.cpp:208 -msgid "Used Filament (mm³)" -msgstr "사용자 필라멘트 (mm³)" - -#: src/slic3r/GUI/Plater.cpp:209 -msgid "Used Filament (g)" -msgstr "사용자 필라멘트 (g)" - -#: src/slic3r/GUI/Plater.cpp:210 -msgid "Used Material (unit)" -msgstr "사용 재료 (단위)" - -#: src/slic3r/GUI/Plater.cpp:211 src/slic3r/GUI/Plater.cpp:1013 src/libslic3r/PrintConfig.cpp:716 -msgid "Cost" -msgstr "비용" - -#: src/slic3r/GUI/Plater.cpp:212 src/slic3r/GUI/Plater.cpp:985 src/slic3r/GUI/Plater.cpp:1027 -msgid "Estimated printing time" -msgstr "예상 인쇄 시간" - -#: src/slic3r/GUI/Plater.cpp:213 -msgid "Number of tool changes" -msgstr "공구(tool) 변경 수" - -#: src/slic3r/GUI/Plater.cpp:290 -msgid "Click to edit preset" -msgstr "사전 설정을 편집 하려면 클릭 하십시오" - -#: src/slic3r/GUI/Plater.cpp:413 -msgid "Select what kind of support do you need" -msgstr "서포트의 종류를 선택하세요" - -#: src/slic3r/GUI/Plater.cpp:415 src/libslic3r/PrintConfig.cpp:1814 src/libslic3r/PrintConfig.cpp:2419 -msgid "Support on build plate only" -msgstr "출력물만 서포트를 지지" - -#: src/slic3r/GUI/Plater.cpp:434 src/slic3r/GUI/Plater.cpp:527 -msgid "For support enforcers only" -msgstr "서포트 지원영역 생성시 선택" - -#: src/slic3r/GUI/Plater.cpp:416 -msgid "Everywhere" -msgstr "모든곳" - -#: src/slic3r/GUI/Plater.cpp:438 src/slic3r/GUI/Tab.cpp:1007 -msgid "Brim" -msgstr "브림" - -#: src/slic3r/GUI/Plater.cpp:440 -msgid "This flag enables the brim that will be printed around each object on the first layer." -msgstr "이 플래그는 첫 번째 레이어의 각 개체 주위에 인쇄 될 브림을 활성화합니다." - -#: src/slic3r/GUI/Plater.cpp:448 -msgid "Purging volumes" -msgstr "볼륨 삭제" - -#: src/slic3r/GUI/Plater.cpp:673 -msgid "Print settings" -msgstr "프린트 설정" - -#: src/slic3r/GUI/Plater.cpp:674 src/slic3r/GUI/Tab.cpp:1421 src/slic3r/GUI/Tab.cpp:1422 -msgid "Filament" -msgstr "필라멘트" - -#: src/slic3r/GUI/Plater.cpp:675 src/slic3r/GUI/Preset.cpp:1252 -msgid "SLA print" -msgstr "SLA 인쇄" - -#: src/slic3r/GUI/Plater.cpp:676 src/slic3r/GUI/Preset.cpp:1253 -msgid "SLA material" -msgstr "SLA 재료" - -#: src/slic3r/GUI/Plater.cpp:677 -msgid "Printer" -msgstr "프린터" - -#: src/slic3r/GUI/Plater.cpp:707 src/slic3r/GUI/Plater.cpp:3674 -msgid "Send to printer" -msgstr "프린터로 보내기" - -#: src/slic3r/GUI/Plater.cpp:727 src/slic3r/GUI/Plater.cpp:2352 src/slic3r/GUI/Plater.cpp:3470 -msgid "Slice now" -msgstr "지금 자르기" - -#: src/slic3r/GUI/Plater.cpp:860 -msgid "Hold Shift to Slice & Export G-code" -msgstr "Shift 키를 누른 채 G 코드 내보내기" - -#: src/slic3r/GUI/Plater.cpp:931 -#, c-format -msgid "%d (%d shells)" -msgstr "% d (% d 쉘)" - -#: src/slic3r/GUI/Plater.cpp:936 -#, c-format -msgid "Auto-repaired (%d errors)" -msgstr "오류자동수정 (%d errors)" - -#: src/slic3r/GUI/Plater.cpp:939 -#, c-format -msgid "" -"%d degenerate facets, %d edges fixed, %d facets removed, %d facets added, %d facets reversed, %d backwards " -"edges" -msgstr "%d 면 고정, %d 모서리 고정, %d 면 제거, %d 면 추가, %d 면 반전, %d 후방 모서리" - -#: src/slic3r/GUI/Plater.cpp:949 -msgid "Yes" -msgstr "예" - -#: src/slic3r/GUI/Plater.cpp:972 -msgid "Used Material (ml)" -msgstr "사용 재료 (ml)" - -#: src/slic3r/GUI/Plater.cpp:975 -msgid "object(s)" -msgstr "스커트와 객체 사이의 거리. 스커트를 객체에 부착하고 접착력을 높이기 위해 이를 0으로 설정한다." - -#: src/slic3r/GUI/Plater.cpp:975 -msgid "supports and pad" -msgstr "지지대 및 패드" - -#: src/slic3r/GUI/Plater.cpp:1000 src/slic3r/GUI/Plater.cpp:1015 -msgid "objects" -msgstr "개체" - -#: src/slic3r/GUI/Plater.cpp:1000 src/slic3r/GUI/Plater.cpp:1015 -msgid "wipe tower" -msgstr "와이프 타워(Wipe tower)" - -#: src/slic3r/GUI/Plater.cpp:1030 -msgid "normal mode" -msgstr "일반 모드" - -#: src/slic3r/GUI/Plater.cpp:1034 -msgid "silent mode" -msgstr "무음 모드" - -#: src/slic3r/GUI/Plater.cpp:1544 -msgid "Loading" -msgstr "로딩" - -#: src/slic3r/GUI/Plater.cpp:1554 -#, c-format -msgid "Processing input file %s\n" -msgstr "입력 파일 처리 %s\n" - -#: src/slic3r/GUI/Plater.cpp:1612 -msgid "" -"This file contains several objects positioned at multiple heights. Instead of considering them as multiple " -"objects, should I consider\n" -"this file as a single object having multiple parts?\n" -msgstr "" -"이 파일에는 여러 높이에 위치한 여러 객체가 들어 있습니다. 여러 객체로 간주하는 대신,\n" -"이 파일은 여러 부분을 갖는 단일 객체로 보입니까?\n" - -#: src/slic3r/GUI/Plater.cpp:1615 src/slic3r/GUI/Plater.cpp:1707 -msgid "Multi-part object detected" -msgstr "다중 부품 객체가 감지" - -#: src/slic3r/GUI/Plater.cpp:1650 -msgid "This file cannot be loaded in simple mode. Do you want to switch to expert mode?\n" -msgstr "이 파일은 단순 모드에서 로드할 수 없습니다. 전문가 모드로 전환 하시겠습니까?\n" - -#: src/slic3r/GUI/Plater.cpp:1651 -msgid "Detected advanced data" -msgstr "감지된 고급 데이터" - -#: src/slic3r/GUI/Plater.cpp:1684 -#, c-format -msgid "You can't to add the object(s) from %s because of one or some of them is(are) multi-part" -msgstr "멀티파트 하나 또는 그 중 일부 때문에 %s에서 개체를 추가 할 수 없습니다" - -#: src/slic3r/GUI/Plater.cpp:1704 -msgid "" -"Multiple objects were loaded for a multi-material printer.\n" -"Instead of considering them as multiple objects, should I consider\n" -"these files to represent a single object having multiple parts?\n" -msgstr "" -"다중 재료 프린터에 대해 여러 객체가로드되었습니다.\n" -"여러 객체로 간주하는 대신,\n" -"이 파일들은 여러 부분을 갖는 단일 객체를 나타낼 수 있습니까?\n" - -#: src/slic3r/GUI/Plater.cpp:1720 -msgid "Loaded" -msgstr "로드(loaded)" - -#: src/slic3r/GUI/Plater.cpp:1812 -msgid "Your object appears to be too large, so it was automatically scaled down to fit your print bed." -msgstr "개체가 너무 커서 인쇄물에 맞게 자동으로 축소되었습니다." - -#: src/slic3r/GUI/Plater.cpp:1813 -msgid "Object too large?" -msgstr "개체가 너무 큽니까?" - -#: src/slic3r/GUI/Plater.cpp:1863 -msgid "Export STL file:" -msgstr "STL 파일 내보내기:" - -#: src/slic3r/GUI/Plater.cpp:1870 -msgid "Export AMF file:" -msgstr "AMF 파일 내보내기:" - -#: src/slic3r/GUI/Plater.cpp:1876 -msgid "Save file as:" -msgstr "다른 이름으로 파일 저장:" - -#: src/slic3r/GUI/Plater.cpp:2042 -msgid "Arranging canceled" -msgstr "취소 된 정렬" - -#: src/slic3r/GUI/Plater.cpp:2045 -msgid "Arranging" -msgstr "정렬" - -#: src/slic3r/GUI/Plater.cpp:2079 -msgid "Could not arrange model objects! Some geometries may be invalid." -msgstr "모델 개체를 정렬할 수 없습니다. 일부 형상은 유효 하지 않을 수 있습니다." - -#: src/slic3r/GUI/Plater.cpp:2083 -msgid "Arranging done." -msgstr "정렬 완료." - -#: src/slic3r/GUI/Plater.cpp:2124 -msgid "Orientation search canceled" -msgstr "오리엔테이션 검색이 취소 됨" - -#: src/slic3r/GUI/Plater.cpp:2129 -msgid "Searching for optimal orientation" -msgstr "최적의 방향 검색" - -#: src/slic3r/GUI/Plater.cpp:2190 -msgid "Orientation found." -msgstr "방향을 찾았습니다." - -#: src/slic3r/GUI/Plater.cpp:2211 -msgid "The selected object can't be split because it contains more than one volume/material." -msgstr "선택한 객체는 둘 이상의 볼륨 / 재료가 포함되어 있기 때문에 분할 할 수 없습니다." - -#: src/slic3r/GUI/Plater.cpp:2337 -msgid "Invalid data" -msgstr "잘못 된 데이터" - -#: src/slic3r/GUI/Plater.cpp:2346 -msgid "Ready to slice" -msgstr "슬라이스 준비" - -#: src/slic3r/GUI/Plater.cpp:2379 src/slic3r/GUI/PrintHostDialogs.cpp:220 -msgid "Cancelling" -msgstr "취소 중" - -#: src/slic3r/GUI/Plater.cpp:2396 -msgid "Another export job is currently running." -msgstr "다른 내보내기 작업이 현재 실행 중입니다." - -#: src/slic3r/GUI/Plater.cpp:2656 -msgid "Export failed" -msgstr "내보내기 실패" - -#: src/slic3r/GUI/Plater.cpp:2661 src/slic3r/GUI/PrintHostDialogs.cpp:221 -msgid "Cancelled" -msgstr "취소됨" - -#: src/slic3r/GUI/Plater.cpp:2747 src/slic3r/GUI/Plater.cpp:2759 src/slic3r/GUI/Plater.cpp:2831 -msgid "Increase copies" -msgstr "복사본 늘리기" - -#: src/slic3r/GUI/Plater.cpp:2825 src/slic3r/GUI/Plater.cpp:2843 -msgid "Remove the selected object" -msgstr "선택한 객체 제거" - -#: src/slic3r/GUI/Plater.cpp:2831 -msgid "Place one more copy of the selected object" -msgstr "선택한 객체를 하나 더 복사합니다" - -#: src/slic3r/GUI/Plater.cpp:2833 -msgid "Decrease copies" -msgstr "복사본 감소" - -#: src/slic3r/GUI/Plater.cpp:2833 -msgid "Remove one copy of the selected object" -msgstr "선택한 객체 복사본 하나 삭제" - -#: src/slic3r/GUI/Plater.cpp:2835 -msgid "Set number of copies" -msgstr "복사될 수량 설정" - -#: src/slic3r/GUI/Plater.cpp:2835 -msgid "Change the number of copies of the selected object" -msgstr "선택한 개체의 복사본 수 변경" - -#: src/slic3r/GUI/Plater.cpp:2858 -msgid "Reload from Disk" -msgstr "디스크에서 다시 불러오기" - -#: src/slic3r/GUI/Plater.cpp:2858 -msgid "Reload the selected file from Disk" -msgstr "디스크에서 다시 불러오기" - -#: src/slic3r/GUI/Plater.cpp:2861 -msgid "Export the selected object as STL file" -msgstr "선택한 객체를 STL 파일로 내보내기" - -#: src/slic3r/GUI/Plater.cpp:2873 -msgid "Along X axis" -msgstr "X 축을 따라" - -#: src/slic3r/GUI/Plater.cpp:2873 -msgid "Mirror the selected object along the X axis" -msgstr "선택한 객체를 X 축을 따라 반전합니다" - -#: src/slic3r/GUI/Plater.cpp:2875 -msgid "Along Y axis" -msgstr "Y 축을 따라" - -#: src/slic3r/GUI/Plater.cpp:2875 -msgid "Mirror the selected object along the Y axis" -msgstr "선택한 객체를 Y 축을 따라 반전합니다" - -#: src/slic3r/GUI/Plater.cpp:2877 -msgid "Along Z axis" -msgstr "Z 축 따라" - -#: src/slic3r/GUI/Plater.cpp:2877 -msgid "Mirror the selected object along the Z axis" -msgstr "선택한 객체를 Z 축을 따라 반전합니다" - -#: src/slic3r/GUI/Plater.cpp:2880 -msgid "Mirror" -msgstr "반전(Mirror)" - -#: src/slic3r/GUI/Plater.cpp:2880 -msgid "Mirror the selected object" -msgstr "반전할 객제를 선택" - -#: src/slic3r/GUI/Plater.cpp:2898 -msgid "To objects" -msgstr "개체에" - -#: src/slic3r/GUI/Plater.cpp:2898 src/slic3r/GUI/Plater.cpp:2920 -msgid "Split the selected object into individual objects" -msgstr "선택한 개체를 개별 개체로 분할 합니다." - -#: src/slic3r/GUI/Plater.cpp:2900 -msgid "To parts" -msgstr "부품에" - -#: src/slic3r/GUI/Plater.cpp:2900 src/slic3r/GUI/Plater.cpp:2940 -msgid "Split the selected object into individual sub-parts" -msgstr "선택한 오브젝트를 개별 하위 파트로 분할" - -#: src/slic3r/GUI/Plater.cpp:2903 src/slic3r/GUI/Plater.cpp:2920 src/slic3r/GUI/Plater.cpp:2940 -#: src/libslic3r/PrintConfig.cpp:3075 -msgid "Split" -msgstr "쪼개기" - -#: src/slic3r/GUI/Plater.cpp:2903 -msgid "Split the selected object" -msgstr "선택한 개체 분할" - -#: src/slic3r/GUI/Plater.cpp:2926 -msgid "Optimize orientation" -msgstr "방향 최적화" - -#: src/slic3r/GUI/Plater.cpp:2926 -msgid "Optimize the rotation of the object for better print results." -msgstr "더 나은 인쇄 결과를 위해 개체의 회전을 최적화합니다." - -#: src/slic3r/GUI/Plater.cpp:3127 -msgid "3D editor view" -msgstr "3D 편집화면 보기" - -#: src/slic3r/GUI/Plater.cpp:3342 -msgid "Save G-code file as:" -msgstr "G-code 파일 다른 이름 저장:" - -#: src/slic3r/GUI/Plater.cpp:3342 -msgid "Save SL1 file as:" -msgstr "SL1 파일 다른이름 저장:" - -#: src/slic3r/GUI/Plater.cpp:3397 -#, c-format -msgid "STL file exported to %s" -msgstr "내보낸 STL 파일 %s" - -#: src/slic3r/GUI/Plater.cpp:3413 -#, c-format -msgid "AMF file exported to %s" -msgstr "내보낸 AMF 파일 %s" - -#: src/slic3r/GUI/Plater.cpp:3416 -#, c-format -msgid "Error exporting AMF file %s" -msgstr "AMF 파일 내보내기 오류 %s" - -#: src/slic3r/GUI/Plater.cpp:3442 -#, c-format -msgid "3MF file exported to %s" -msgstr "3MF 파일을 내보냈습니다 %s" - -#: src/slic3r/GUI/Plater.cpp:3445 -#, c-format -msgid "Error exporting 3MF file %s" -msgstr "3MF 파일 내보내기 오류 %s" - -#: src/slic3r/GUI/Plater.cpp:3673 -msgid "Export" -msgstr "내보내기" - -#: src/slic3r/GUI/Plater.cpp:3674 -msgid "Send G-code" -msgstr "G 코드 보내기" - -#: src/slic3r/GUI/Preferences.cpp:17 src/slic3r/GUI/Tab.cpp:1762 src/slic3r/GUI/Tab.cpp:1963 -msgid "General" -msgstr "일반" - -#: src/slic3r/GUI/Preferences.cpp:34 -msgid "Remember output directory" -msgstr "출력 디렉토리 기억하기" - -#: src/slic3r/GUI/Preferences.cpp:36 -msgid "" -"If this is enabled, Slic3r will prompt the last output directory instead of the one containing the input " -"files." -msgstr "이 옵션을 사용하면 Slic3r은 입력 파일이 들어있는 디렉터리 대신 마지막 출력 디렉터리를 묻습니다." - -#: src/slic3r/GUI/Preferences.cpp:42 -msgid "Auto-center parts" -msgstr "부품을 자동으로 중심에" - -#: src/slic3r/GUI/Preferences.cpp:44 -msgid "If this is enabled, Slic3r will auto-center objects around the print bed center." -msgstr "이 옵션을 사용하면 Slic3r이 개체를 인쇄판 중앙에 자동으로 배치합니다." - -#: src/slic3r/GUI/Preferences.cpp:50 -msgid "Background processing" -msgstr "백그라운드 프로세싱" - -#: src/slic3r/GUI/Preferences.cpp:52 -msgid "" -"If this is enabled, Slic3r will pre-process objects as soon as they're loaded in order to save time when " -"exporting G-code." -msgstr "" -"이 사용 하는 경우 Slic3r는 전처리 개체 최대한 빨리 그들이 시간을 절약 하기 위해 로드 G-코드를 내보낼 때." - -#: src/slic3r/GUI/Preferences.cpp:74 -msgid "Suppress \" - default - \" presets" -msgstr "\"- 기본 -\"사전 설정 숨기기" - -#: src/slic3r/GUI/Preferences.cpp:76 -msgid "" -"Suppress \" - default - \" presets in the Print / Filament / Printer selections once there are any other " -"valid presets available." -msgstr "" -"사용 가능한 다른 유효한 사전 설정이 있으면 인쇄 / 필라멘트 / 프린터 선택에서 \"- 기본 -\"사전 설정을 억제하십" -"시오." - -#: src/slic3r/GUI/Preferences.cpp:82 -msgid "Show incompatible print and filament presets" -msgstr "호환 되지 않는 인쇄 및 필라멘트 설정" - -#: src/slic3r/GUI/Preferences.cpp:84 -msgid "" -"When checked, the print and filament presets are shown in the preset editor even if they are marked as " -"incompatible with the active printer" -msgstr "" -"이 옵션을 선택하면 활성 프린터와 호환되지 않는 것으로 표시된 경우에도 인쇄 및 필라멘트 사전 설정이 사전 설정 " -"편집기에 표시됩니다" - -#: src/slic3r/GUI/Preferences.cpp:91 -msgid "Use legacy OpenGL 1.1 rendering" -msgstr "레거시 OpenGL 1.1 렌더링 사용" - -#: src/slic3r/GUI/Preferences.cpp:93 -msgid "" -"If you have rendering issues caused by a buggy OpenGL 2.0 driver, you may try to check this checkbox. This " -"will disable the layer height editing and anti aliasing, so it is likely better to upgrade your graphics " -"driver." -msgstr "" -"버그가있는 OpenGL 2.0 드라이버로 인한 렌더링 문제가있는 경우이 확인란을 선택해보십시오. 이렇게하면 레이어 높" -"이 편집 및 앤티 앨리어싱이 비활성화되므로 그래픽 드라이버를 업그레이드하는 것이 좋습니다." - -#: src/slic3r/GUI/Preferences.cpp:101 -msgid "Use Retina resolution for the 3D scene" -msgstr "3D 장면에 레티나 해상도 사용" - -#: src/slic3r/GUI/Preferences.cpp:103 -msgid "" -"If enabled, the 3D scene will be rendered in Retina resolution. If you are experiencing 3D performance " -"problems, disabling this option may help." -msgstr "" -"활성화 된 경우 3D 장면은 레티나 해상도로 렌더링 됩니다. 3D 성능 문제가 발생하는 경우, 옵션을 사용하지 않도록 " -"설정 하면 도움이 될 수 있습니다." - -#: src/slic3r/GUI/Preferences.cpp:126 -msgid "You need to restart Slic3r to make the changes effective." -msgstr "변경 사항을 적용하려면 Slic3r을 다시 시작해야합니다." - -#: src/slic3r/GUI/Preset.cpp:207 -msgid "modified" -msgstr "수정된곳" - -#: src/slic3r/GUI/Preset.cpp:918 src/slic3r/GUI/Preset.cpp:958 src/slic3r/GUI/Preset.cpp:1011 -#: src/slic3r/GUI/Preset.cpp:1043 src/slic3r/GUI/PresetBundle.cpp:1484 src/slic3r/GUI/PresetBundle.cpp:1537 -msgid "System presets" -msgstr "시스템 기본설정" - -#: src/slic3r/GUI/Preset.cpp:962 src/slic3r/GUI/Preset.cpp:1047 src/slic3r/GUI/PresetBundle.cpp:1542 -msgid "User presets" -msgstr "사용자 사전설정" - -#: src/slic3r/GUI/Preset.cpp:991 src/slic3r/GUI/Tab.cpp:247 -msgid "Add a new printer" -msgstr "새 프린터 추가" - -#: src/slic3r/GUI/Preset.cpp:1251 -msgid "filament" -msgstr "필라멘트" - -#: src/slic3r/GUI/PresetHints.cpp:28 -msgid "" -"If estimated layer time is below ~%1%s, fan will run at %2%%% and print speed will be reduced so that no less " -"than %3%s are spent on that layer (however, speed will never be reduced below %4%mm/s)." -msgstr "" -"예상 레이어 시간이 ~%1%초 미만이면 팬이 %2%%%에서 실행되고 인쇄 속도가 감소되어 해당 레이어에 %3%초 이상 소비" -"됩니다 (단, 속도는 %4%mm/s 이하로 감소하지 않습니다) ." - -#: src/slic3r/GUI/PresetHints.cpp:35 -msgid "" -"\n" -"If estimated layer time is greater, but still below ~%1%s, fan will run at a proportionally decreasing speed " -"between %2%%% and %3%%%." -msgstr "" -"\n" -"예상 레이어 시간이 더 길지만 ~%1%초 미만인 경우 팬은 %2%%%와 %3%%%사이 비례, 감소하는 속도로 실행됩니다." - -#: src/slic3r/GUI/PresetHints.cpp:39 -msgid "" -"\n" -"During the other layers, fan" -msgstr "" -"\n" -"다른 레이어의, 팬설정은 " - -#: src/slic3r/GUI/PresetHints.cpp:41 -msgid "Fan" -msgstr "팬(Fan) " - -#: src/slic3r/GUI/PresetHints.cpp:47 -msgid "will always run at %1%%%" -msgstr "항상 다음처럼 실행 %1%%%" - -#: src/slic3r/GUI/PresetHints.cpp:50 -msgid "except for the first %1% layers." -msgstr "첫 번째 %d 레이어를 제외하고" - -#: src/slic3r/GUI/PresetHints.cpp:52 -msgid "except for the first layer." -msgstr "첫 번째 레이어를 제외하고" - -#: src/slic3r/GUI/PresetHints.cpp:54 -msgid "will be turned off." -msgstr "off 됩니다." - -#: src/slic3r/GUI/PresetHints.cpp:153 -msgid "external perimeters" -msgstr "외부 둘레" - -#: src/slic3r/GUI/PresetHints.cpp:162 -msgid "perimeters" -msgstr "둘레" - -#: src/slic3r/GUI/PresetHints.cpp:171 -msgid "infill" -msgstr "채움(infill)" - -#: src/slic3r/GUI/PresetHints.cpp:181 -msgid "solid infill" -msgstr "고체(solid)부분 채움" - -#: src/slic3r/GUI/PresetHints.cpp:189 -msgid "top solid infill" -msgstr "가장 윗부분 채움" - -#: src/slic3r/GUI/PresetHints.cpp:200 -msgid "support" -msgstr "서포트" - -#: src/slic3r/GUI/PresetHints.cpp:210 -msgid "support interface" -msgstr "서포트 인터페이스" - -#: src/slic3r/GUI/PresetHints.cpp:218 -msgid "First layer volumetric" -msgstr "첫번째 레이어 용적은" - -#: src/slic3r/GUI/PresetHints.cpp:218 -msgid "Bridging volumetric" -msgstr "브리징(Bridging) 용적" - -#: src/slic3r/GUI/PresetHints.cpp:218 -msgid "Volumetric" -msgstr "용적" - -#: src/slic3r/GUI/PresetHints.cpp:219 -msgid "flow rate is maximized" -msgstr "의 유속(flow)이 최대화된다. " - -#: src/slic3r/GUI/PresetHints.cpp:222 -msgid "by the print profile maximum" -msgstr "인쇄 프로파일 최대 값" - -#: src/slic3r/GUI/PresetHints.cpp:223 -msgid "when printing" -msgstr "인쇄 할때 " - -#: src/slic3r/GUI/PresetHints.cpp:224 -msgid "with a volumetric rate" -msgstr "의 용적 비율로 " - -#: src/slic3r/GUI/PresetHints.cpp:226 -#, c-format -msgid "%3.2f mm³/s" -msgstr "%3.2f mm³/s" - -#: src/slic3r/GUI/PresetHints.cpp:228 -#, c-format -msgid "%3.2f mm³/s at filament speed %3.2f mm/s." -msgstr "%3.2f mm³/s 필라멘트 속도는 %3.2f mm/s이다." - -#: src/slic3r/GUI/PresetHints.cpp:246 -msgid "Recommended object thin wall thickness: Not available due to invalid layer height." -msgstr "권장 객체(object)의 벽(wall) 두께: 잘못된 레이어 높이 때문에 사용할 수 없음." - -#: src/slic3r/GUI/PresetHints.cpp:262 -#, c-format -msgid "Recommended object thin wall thickness for layer height %.2f and" -msgstr "객체 레이어 높이 %.2f 에 권장하는 두깨는 " - -#: src/slic3r/GUI/PresetHints.cpp:271 -#, c-format -msgid "%d lines: %.2lf mm" -msgstr "%d 라인(lines): %.2lf mm 입니다." - -#: src/slic3r/GUI/PrintHostDialogs.cpp:32 -msgid "Send G-Code to printer host" -msgstr "프린터 호스트로 G 코드 보내기" - -#: src/slic3r/GUI/PrintHostDialogs.cpp:32 -msgid "Upload to Printer Host with the following filename:" -msgstr "다음 파일 이름으로 프린터 호스트에 업로드:" - -#: src/slic3r/GUI/PrintHostDialogs.cpp:34 -msgid "Start printing after upload" -msgstr "업로드 후 인쇄 시작" - -#: src/slic3r/GUI/PrintHostDialogs.cpp:41 -msgid "Use forward slashes ( / ) as a directory separator if needed." -msgstr "필요한 경우 디렉토리 분리 기호로 슬래시 (/)를 사용하십시오." - -#: src/slic3r/GUI/PrintHostDialogs.cpp:157 -msgid "Cancel selected" -msgstr "선택 취소" - -#: src/slic3r/GUI/PrintHostDialogs.cpp:159 -msgid "Show error message" -msgstr "오류 메시지 표시" - -#: src/slic3r/GUI/PrintHostDialogs.cpp:198 src/slic3r/GUI/PrintHostDialogs.cpp:217 -msgid "Enqueued" -msgstr "입력됨" - -#: src/slic3r/GUI/PrintHostDialogs.cpp:218 -msgid "Uploading" -msgstr "업로드" - -#: src/slic3r/GUI/PrintHostDialogs.cpp:222 -msgid "Completed" -msgstr "완료됨" - -#: src/slic3r/GUI/PrintHostDialogs.cpp:260 -msgid "Error uploading to print host:" -msgstr "인쇄 호스트에 업로드 하는 중 오류 발생:" - -#: src/slic3r/GUI/RammingChart.cpp:23 -msgid "NO RAMMING AT ALL" -msgstr "전혀 충돌 없음" - -#: src/slic3r/GUI/RammingChart.cpp:76 -msgid "Time" -msgstr "시간" - -#: src/slic3r/GUI/RammingChart.cpp:76 src/slic3r/GUI/RammingChart.cpp:81 src/slic3r/GUI/WipeTowerDialog.cpp:82 -#: src/libslic3r/PrintConfig.cpp:611 src/libslic3r/PrintConfig.cpp:655 src/libslic3r/PrintConfig.cpp:670 -#: src/libslic3r/PrintConfig.cpp:2241 src/libslic3r/PrintConfig.cpp:2250 src/libslic3r/PrintConfig.cpp:2308 -#: src/libslic3r/PrintConfig.cpp:2315 -msgid "s" -msgstr "s" - -#: src/slic3r/GUI/RammingChart.cpp:81 -msgid "Volumetric speed" -msgstr "용적(Volumetric) 스피트" - -#: src/slic3r/GUI/SysInfoDialog.cpp:44 -msgid "Slic3r Prusa Edition - System Information" -msgstr "Slic3r Prusa 에디션-시스템 정보" - -#: src/slic3r/GUI/Tab.cpp:50 src/libslic3r/PrintConfig.cpp:228 -msgid "Compatible printers" -msgstr "호환 가능한 프린터들" - -#: src/slic3r/GUI/Tab.cpp:51 -msgid "Select the printers this profile is compatible with." -msgstr "이 프로파일과 호환 가능한 프린터를 선택하세요." - -#: src/slic3r/GUI/Tab.cpp:56 src/libslic3r/PrintConfig.cpp:243 -msgid "Compatible print profiles" -msgstr "호환되는 인쇄 프로 파일" - -#: src/slic3r/GUI/Tab.cpp:57 -msgid "Select the print profiles this profile is compatible with." -msgstr "이 프로필이 호환되는 인쇄 프로필을 선택 합니다." - -#: src/slic3r/GUI/Tab.cpp:132 -msgid "Save current " -msgstr "지금 저장 " - -#: src/slic3r/GUI/Tab.cpp:133 -msgid "Delete this preset" -msgstr "이전 설정 삭제" - -#: src/slic3r/GUI/Tab.cpp:145 -msgid "" -"Hover the cursor over buttons to find more information \n" -"or click this button." -msgstr "" -"버튼 위로 커서를 가져 가서 자세한 정보를 찾습니다.\n" -"또는이 버튼을 클릭하십시오." - -#: src/slic3r/GUI/Tab.cpp:920 -msgid "It's a default preset." -msgstr "기본 설정입니다." - -#: src/slic3r/GUI/Tab.cpp:921 -msgid "It's a system preset." -msgstr "시스템 설정입니다." - -#: src/slic3r/GUI/Tab.cpp:922 -#, c-format -msgid "Current preset is inherited from %s" -msgstr "전의 %s 설정에서 가져 옵니다 " - -#: src/slic3r/GUI/Tab.cpp:923 -msgid "default preset" -msgstr "기본 프리셋" - -#: src/slic3r/GUI/Tab.cpp:927 -msgid "It can't be deleted or modified." -msgstr "삭제하거나 수정할 수 없습니다. " - -#: src/slic3r/GUI/Tab.cpp:928 -msgid "Any modifications should be saved as a new preset inherited from this one." -msgstr "모든 수정 사항은 이 항목에서 받은 기본 설정으로 저장해야합니다. " - -#: src/slic3r/GUI/Tab.cpp:929 -msgid "To do that please specify a new name for the preset." -msgstr "그렇게하려면 기본 설정의 새 이름을 지정하십시오." - -#: src/slic3r/GUI/Tab.cpp:933 -msgid "Additional information:" -msgstr "추가 정보:" - -#: src/slic3r/GUI/Tab.cpp:939 -msgid "printer model" -msgstr "프린터 모델" - -#: src/slic3r/GUI/Tab.cpp:947 -msgid "default print profile" -msgstr "기본 인쇄 프로파일" - -#: src/slic3r/GUI/Tab.cpp:950 -msgid "default filament profile" -msgstr "기본 필라멘트 프로파일" - -#: src/slic3r/GUI/Tab.cpp:964 -msgid "default SLA material profile" -msgstr "기본 SLA 재질 프로 파일" - -#: src/slic3r/GUI/Tab.cpp:968 -msgid "default SLA print profile" -msgstr "기본 SLA 인쇄 프로필" - -#: src/slic3r/GUI/Tab.cpp:948 src/slic3r/GUI/Tab.cpp:3303 -msgid "Layers and perimeters" -msgstr "레이어 및 경계선" - -#: src/slic3r/GUI/Tab.cpp:949 src/libslic3r/PrintConfig.cpp:55 -msgid "Layer height" -msgstr "레이어 높이" - -#: src/slic3r/GUI/Tab.cpp:953 -msgid "Vertical shells" -msgstr "쉘 높이" - -#: src/slic3r/GUI/Tab.cpp:964 -msgid "Horizontal shells" -msgstr "쉘 너비" - -#: src/slic3r/GUI/Tab.cpp:965 src/libslic3r/PrintConfig.cpp:1709 -msgid "Solid layers" -msgstr "솔리드 레이어" - -#: src/slic3r/GUI/Tab.cpp:970 -msgid "Quality (slower slicing)" -msgstr "품질(슬라이싱이 느려짐)" - -#: src/slic3r/GUI/Tab.cpp:988 -msgid "Reducing printing time" -msgstr "출력 시간 단축" - -#: src/slic3r/GUI/Tab.cpp:1000 -msgid "Skirt and brim" -msgstr "스커트와 브림" - -#: src/slic3r/GUI/Tab.cpp:1017 -msgid "Raft" -msgstr "라프트" - -#: src/slic3r/GUI/Tab.cpp:1021 -msgid "Options for support material and raft" -msgstr "서포트와 라프트 재료를 선택" - -#: src/slic3r/GUI/Tab.cpp:1036 -msgid "Speed for print moves" -msgstr "출력중 이동 속도" - -#: src/slic3r/GUI/Tab.cpp:1048 -msgid "Speed for non-print moves" -msgstr "미출력시 이동속도" - -#: src/slic3r/GUI/Tab.cpp:1051 -msgid "Modifiers" -msgstr "수정" - -#: src/slic3r/GUI/Tab.cpp:1054 -msgid "Acceleration control (advanced)" -msgstr "가속 제어(고급)" - -#: src/slic3r/GUI/Tab.cpp:1061 -msgid "Autospeed (advanced)" -msgstr "오토스피트(고급)" - -#: src/slic3r/GUI/Tab.cpp:1069 -msgid "Multiple Extruders" -msgstr "다중 익스트루더" - -#: src/slic3r/GUI/Tab.cpp:1077 -msgid "Ooze prevention" -msgstr "오즈 방지(Ooze prevention)" - -#: src/slic3r/GUI/Tab.cpp:1094 -msgid "Extrusion width" -msgstr "악출 폭(Extrusion width)" - -#: src/slic3r/GUI/Tab.cpp:1104 -msgid "Overlap" -msgstr "겹침(Overlap)" - -#: src/slic3r/GUI/Tab.cpp:1107 -msgid "Flow" -msgstr "유량(Flow)" - -#: src/slic3r/GUI/Tab.cpp:1116 -msgid "Other" -msgstr "그 외" - -#: src/slic3r/GUI/Tab.cpp:1119 src/slic3r/GUI/Tab.cpp:3351 -msgid "Output options" -msgstr "출력 옵션" - -#: src/slic3r/GUI/Tab.cpp:1120 -msgid "Sequential printing" -msgstr "연속 인쇄" - -#: src/slic3r/GUI/Tab.cpp:1122 -msgid "Extruder clearance (mm)" -msgstr "익스트루더 간격(mm)" - -#: src/slic3r/GUI/Tab.cpp:1131 src/slic3r/GUI/Tab.cpp:3352 -msgid "Output file" -msgstr "출력 파일" - -#: src/slic3r/GUI/Tab.cpp:1138 src/libslic3r/PrintConfig.cpp:1382 -msgid "Post-processing scripts" -msgstr "포스트 프로세싱 스크립트" - -#: src/slic3r/GUI/Tab.cpp:1144 src/slic3r/GUI/Tab.cpp:1145 src/slic3r/GUI/Tab.cpp:1527 -#: src/slic3r/GUI/Tab.cpp:1528 src/slic3r/GUI/Tab.cpp:1935 src/slic3r/GUI/Tab.cpp:1936 -#: src/slic3r/GUI/Tab.cpp:2027 src/slic3r/GUI/Tab.cpp:2028 src/slic3r/GUI/Tab.cpp:3240 -#: src/slic3r/GUI/Tab.cpp:3241 -msgid "Notes" -msgstr "메모" - -#: src/slic3r/GUI/Tab.cpp:1151 src/slic3r/GUI/Tab.cpp:1535 src/slic3r/GUI/Tab.cpp:1942 -#: src/slic3r/GUI/Tab.cpp:2034 src/slic3r/GUI/Tab.cpp:3248 src/slic3r/GUI/Tab.cpp:3357 -msgid "Dependencies" -msgstr "속한 그룹" - -#: src/slic3r/GUI/Tab.cpp:1152 src/slic3r/GUI/Tab.cpp:1536 src/slic3r/GUI/Tab.cpp:1943 -#: src/slic3r/GUI/Tab.cpp:2035 src/slic3r/GUI/Tab.cpp:3249 src/slic3r/GUI/Tab.cpp:3358 -msgid "Profile dependencies" -msgstr "프로파일 속한곳" - -#: src/slic3r/GUI/Tab.cpp:1198 -#, no-c-format -msgid "" -"The Spiral Vase mode requires:\n" -"- one perimeter\n" -"- no top solid layers\n" -"- 0% fill density\n" -"- no support material\n" -"- no ensure_vertical_shell_thickness\n" -"\n" -"Shall I adjust those settings in order to enable Spiral Vase?" -msgstr "" -"스파이럴 바이스 모드에는 다음이 필요합니다.\n" -"- one 둘레\n" -"- 탑 솔리드 레이어 없음\n" -"- 채우기(fill) 밀도 0 %\n" -"- 서포트 재료 없음\n" -"- 수직 벽 두깨를 보장하지 않음\n" -"\n" -"스파이럴 바이스를 사용하려면 이러한 설정을 조정해야합니까?" - -#: src/slic3r/GUI/Tab.cpp:1205 -msgid "Spiral Vase" -msgstr "스파이럴 바이스" - -#: src/slic3r/GUI/Tab.cpp:1228 -msgid "" -"The Wipe Tower currently supports the non-soluble supports only\n" -"if they are printed with the current extruder without triggering a tool change.\n" -"(both support_material_extruder and support_material_interface_extruder need to be set to 0).\n" -"\n" -"Shall I adjust those settings in order to enable the Wipe Tower?" -msgstr "" -"와이퍼 타워는 현재 비 가용성 서포트 만 지원합니다.\n" -"공구 교환을 트리거하지 않고 현재 압출기로 인쇄 한 경우.\n" -"(support_material_extruder 및 support_material_interface_extruder를 모두 0으로 설정해야 함).\n" -"\n" -"와이퍼 타워를 사용하려면 이러한 설정을 조정해야합니까?" - -#: src/slic3r/GUI/Tab.cpp:1232 src/slic3r/GUI/Tab.cpp:1249 -msgid "Wipe Tower" -msgstr "와이프 타워(Wipe Tower)" - -#: src/slic3r/GUI/Tab.cpp:1246 -msgid "" -"For the Wipe Tower to work with the soluble supports, the support layers\n" -"need to be synchronized with the object layers.\n" -"\n" -"Shall I synchronize support layers in order to enable the Wipe Tower?" -msgstr "" -"와이퍼 타워가 가용성 서포트와 함께 작용하기 위해, 서포트 레이어\n" -"객체 레이어와 동기화되어야합니다.\n" -"\n" -"와이퍼 타워를 사용하려면 서포트 레이어를 동기화해야합니까?" - -#: src/slic3r/GUI/Tab.cpp:1264 -msgid "" -"Supports work better, if the following feature is enabled:\n" -"- Detect bridging perimeters\n" -"\n" -"Shall I adjust those settings for supports?" -msgstr "" -"다음 기능을 사용하는 경우 더 나은 작업을 지원합니다.\n" -"- 브리지 경계 검출\n" -"\n" -"서포트에 대한 설정을 조정해야합니까?" - -#: src/slic3r/GUI/Tab.cpp:1267 -msgid "Support Generator" -msgstr "서포트 생성" - -#: src/slic3r/GUI/Tab.cpp:1309 -msgid "The " -msgstr "The " - -#: src/slic3r/GUI/Tab.cpp:1309 -#, no-c-format -msgid "" -" infill pattern is not supposed to work at 100% density.\n" -"\n" -"Shall I switch to rectilinear fill pattern?" -msgstr "" -" infill 패턴은 100 % 밀도에서 작동하지 않습니다.\n" -"\n" -"직선 채우기 패턴으로 전환해야합니까?" - -#: src/slic3r/GUI/Tab.cpp:1429 -msgid "Temperature " -msgstr "온도 " - -#: src/slic3r/GUI/Tab.cpp:1435 -msgid "Bed" -msgstr "배드(Bed)" - -#: src/slic3r/GUI/Tab.cpp:1440 -msgid "Cooling" -msgstr "냉각(Cooling)" - -#: src/slic3r/GUI/Tab.cpp:1441 src/libslic3r/PrintConfig.cpp:1285 src/libslic3r/PrintConfig.cpp:2097 -msgid "Enable" -msgstr "사용" - -#: src/slic3r/GUI/Tab.cpp:1452 -msgid "Fan settings" -msgstr "팬 설정" - -#: src/slic3r/GUI/Tab.cpp:1453 -msgid "Fan speed" -msgstr "팬 속도" - -#: src/slic3r/GUI/Tab.cpp:1461 -msgid "Cooling thresholds" -msgstr "냉각 임계 값" - -#: src/slic3r/GUI/Tab.cpp:1467 -msgid "Filament properties" -msgstr "필라멘트 특성" - -#: src/slic3r/GUI/Tab.cpp:1471 -msgid "Print speed override" -msgstr "인쇄 속도 중단" - -#: src/slic3r/GUI/Tab.cpp:1481 -msgid "Toolchange parameters with single extruder MM printers" -msgstr "싱글 익스트루더 MM 프린터를 사용한 공구 교환 매개 변수" - -#: src/slic3r/GUI/Tab.cpp:1496 -msgid "Ramming settings" -msgstr "래밍 설정" - -#: src/slic3r/GUI/Tab.cpp:1514 src/slic3r/GUI/Tab.cpp:1898 -msgid "Custom G-code" -msgstr "수동 G코드" - -#: src/slic3r/GUI/Tab.cpp:1515 src/slic3r/GUI/Tab.cpp:1899 src/libslic3r/PrintConfig.cpp:1735 -#: src/libslic3r/PrintConfig.cpp:1750 -msgid "Start G-code" -msgstr "스타트 G코드" - -#: src/slic3r/GUI/Tab.cpp:1521 src/slic3r/GUI/Tab.cpp:1905 src/libslic3r/PrintConfig.cpp:358 -#: src/libslic3r/PrintConfig.cpp:368 -msgid "End G-code" -msgstr "엔드 G코드" - -#: src/slic3r/GUI/FirmwareDialog.cpp:768 src/slic3r/GUI/Tab.cpp:1718 src/slic3r/GUI/Tab.cpp:1774 -msgid "Browse" -msgstr "검색" - -#: src/slic3r/GUI/Tab.cpp:1651 src/slic3r/GUI/Tab.cpp:1838 -msgid "Test" -msgstr "시험(test)" - -#: src/slic3r/GUI/Tab.cpp:1747 -msgid "Could not get a valid Printer Host reference" -msgstr "유효한 프린터 호스트 참조를 가져올 수 없습니다" - -#: src/slic3r/GUI/Tab.cpp:1753 src/slic3r/GUI/Tab.cpp:1938 -msgid "Success!" -msgstr "성공!" - -#: src/slic3r/GUI/Tab.cpp:1768 -msgid "HTTPS CA file is optional. It is only needed if you use HTTPS with a self-signed certificate." -msgstr "HTTPS CA 파일은 선택 사항입니다. 자체 서명 된 인증서로 HTTPS를 사용하는 경우에만 필요합니다." - -#: src/slic3r/GUI/Tab.cpp:1781 -msgid "Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*" -msgstr "인증서 파일 (* .crt, * .pem) | * .crt; * .pem | 모든 파일 | *. *" - -#: src/slic3r/GUI/Tab.cpp:1782 -msgid "Open CA certificate file" -msgstr "CA 인증서 파일 열기" - -#: src/slic3r/GUI/Tab.cpp:1810 -#, c-format -msgid "" -"HTTPS CA File:\n" -" \tOn this system, %s uses HTTPS certificates from the system Certificate Store or Keychain.\n" -" \tTo use a custom CA file, please import your CA file into Certificate Store / Keychain." -msgstr "" -"HTTPS CA 파일:\n" -"\t이 시스템에서 %s는 시스템 인증서 저장소나 키체인의 HTTPS 인증서를 사용 합니다.\n" -"\t사용자 지정 CA 파일을 사용 하려면 CA 파일을 인증서 저장소/키체인에 가져오십시오." - -#: src/slic3r/GUI/Tab.cpp:1850 src/slic3r/GUI/Tab.cpp:2051 -msgid "Size and coordinates" -msgstr "크기와 좌표" - -#: src/slic3r/GUI/Tab.cpp:1855 src/slic3r/GUI/Tab.cpp:2056 src/slic3r/GUI/Tab.cpp:3040 -msgid "Set" -msgstr " 세트 " - -#: src/slic3r/GUI/Tab.cpp:1877 -msgid "Capabilities" -msgstr "기능" - -#: src/slic3r/GUI/Tab.cpp:1882 -msgid "Number of extruders of the printer." -msgstr "프린터 익스트루더 숫자." - -#: src/slic3r/GUI/Tab.cpp:1910 -msgid "USB/Serial connection" -msgstr "USB/시리얼 연결" - -#: src/slic3r/GUI/Tab.cpp:1911 src/libslic3r/PrintConfig.cpp:1626 -msgid "Serial port" -msgstr "시리얼 포트" - -#: src/slic3r/GUI/Tab.cpp:1916 -msgid "Rescan serial ports" -msgstr "시리얼포트 재검색" - -#: src/slic3r/GUI/Tab.cpp:1938 -msgid "Connection to printer works correctly." -msgstr "프린터 연결이 올바르게 작동합니다." - -#: src/slic3r/GUI/Tab.cpp:1941 -msgid "Connection failed." -msgstr "연결 실패." - -#: src/slic3r/GUI/Tab.cpp:1954 src/slic3r/GUI/Tab.cpp:2111 -msgid "Print Host upload" -msgstr "호스트 업로드 인쇄" - -#: src/slic3r/GUI/Tab.cpp:1998 src/libslic3r/PrintConfig.cpp:129 -msgid "Before layer change G-code" -msgstr "레이어 변경 전 G 코드" - -#: src/slic3r/GUI/Tab.cpp:2004 src/libslic3r/PrintConfig.cpp:1042 -msgid "After layer change G-code" -msgstr "레이어 변경 후 G 코드" - -#: src/slic3r/GUI/Tab.cpp:2010 src/libslic3r/PrintConfig.cpp:2041 -msgid "Tool change G-code" -msgstr "툴 채인지 G 코드" - -#: src/slic3r/GUI/Tab.cpp:2016 -msgid "Between objects G-code (for sequential printing)" -msgstr "객체 간 G 코드 (순차 인쇄용)" - -#: src/slic3r/GUI/Tab.cpp:1990 -msgid "Display" -msgstr "표시" - -#: src/slic3r/GUI/Tab.cpp:2001 -msgid "Tilt" -msgstr "기울이기" - -#: src/slic3r/GUI/Tab.cpp:2002 -msgid "Tilt time" -msgstr "기울이기 시간" - -#: src/slic3r/GUI/Tab.cpp:2008 src/slic3r/GUI/Tab.cpp:3223 -msgid "Corrections" -msgstr "수정" - -#: src/slic3r/GUI/Tab.cpp:2074 src/slic3r/GUI/Tab.cpp:2136 src/libslic3r/PrintConfig.cpp:1076 -#: src/libslic3r/PrintConfig.cpp:1086 src/libslic3r/PrintConfig.cpp:1096 src/libslic3r/PrintConfig.cpp:1109 -#: src/libslic3r/PrintConfig.cpp:1120 src/libslic3r/PrintConfig.cpp:1131 src/libslic3r/PrintConfig.cpp:1142 -msgid "Machine limits" -msgstr "머신 한계설정" - -#: src/slic3r/GUI/Tab.cpp:2088 -msgid "Values in this column are for Full Power mode" -msgstr "이 열의 값은 최대 전력 모드입니다" - -#: src/slic3r/GUI/Tab.cpp:2089 -msgid "Full Power" -msgstr "최대 파워" - -#: src/slic3r/GUI/Tab.cpp:2094 -msgid "Values in this column are for Silent mode" -msgstr "이 열의 값은 무음 모드 용입니다" - -#: src/slic3r/GUI/Tab.cpp:2095 -msgid "Silent" -msgstr "무음" - -#: src/slic3r/GUI/Tab.cpp:2103 -msgid "Maximum feedrates" -msgstr "최대 이송속도" - -#: src/slic3r/GUI/Tab.cpp:2108 -msgid "Maximum accelerations" -msgstr "최고 가속도" - -#: src/slic3r/GUI/Tab.cpp:2115 -msgid "Jerk limits" -msgstr "저크(Jerk)값 한계" - -#: src/slic3r/GUI/Tab.cpp:2120 -msgid "Minimum feedrates" -msgstr "최대 이송속도" - -#: src/slic3r/GUI/Tab.cpp:2158 src/slic3r/GUI/Tab.cpp:2166 -msgid "Single extruder MM setup" -msgstr "싱글 익스트루더 MM 설정" - -#: src/slic3r/GUI/Tab.cpp:2167 -msgid "Single extruder multimaterial parameters" -msgstr "싱글 익스트루더 멀티메터리알 파라미터" - -#: src/slic3r/GUI/Tab.cpp:2181 src/libslic3r/GCode/PreviewData.cpp:475 -#, c-format -msgid "Extruder %d" -msgstr "익스트루더 %d" - -#: src/slic3r/GUI/Tab.cpp:2188 -msgid "Layer height limits" -msgstr "레이어 높이 한계치" - -#: src/slic3r/GUI/Tab.cpp:2193 -msgid "Position (for multi-extruder printers)" -msgstr "위치 (멀티 익스트루더 프린터 포함)" - -#: src/slic3r/GUI/Tab.cpp:2196 -msgid "Retraction" -msgstr "리트렉션" - -#: src/slic3r/GUI/Tab.cpp:2199 -msgid "Only lift Z" -msgstr "Z축만 올림" - -#: src/slic3r/GUI/Tab.cpp:2212 -msgid "Retraction when tool is disabled (advanced settings for multi-extruder setups)" -msgstr "도구 비활성화시 리트렉션 (멀티 익스트루더 고급 설정)" - -#: src/slic3r/GUI/Tab.cpp:2216 -msgid "Preview" -msgstr "프리뷰" - -#: src/slic3r/GUI/Tab.cpp:2352 -msgid "" -"The Wipe option is not available when using the Firmware Retraction mode.\n" -"\n" -"Shall I disable it in order to enable Firmware Retraction?" -msgstr "" -"펌웨어 리트렉션 모드를 사용할 때는 Wipe 옵션을 사용할 수 없습니다.\n" -"\n" -"펌웨어 리트렉션 하려면 비활성화해야합니까?" - -#: src/slic3r/GUI/Tab.cpp:2354 -msgid "Firmware Retraction" -msgstr "펌웨어 레트렉션" - -#: src/slic3r/GUI/Tab.cpp:2681 -#, c-format -msgid "Default preset (%s)" -msgstr "시스템 기본값 (%s)" - -#: src/slic3r/GUI/Tab.cpp:2682 -#, c-format -msgid "Preset (%s)" -msgstr "프리셋 ( %s)" - -#: src/slic3r/GUI/Tab.cpp:2699 -msgid "has the following unsaved changes:" -msgstr "저장되지 않은 수정사항:" - -#: src/slic3r/GUI/Tab.cpp:2702 -msgid "is not compatible with printer" -msgstr "프린터와 호완 되지 않습니다" - -#: src/slic3r/GUI/Tab.cpp:2703 -msgid "is not compatible with print profile" -msgstr "인쇄 프로필과 호환 되지 않음" - -#: src/slic3r/GUI/Tab.cpp:2705 -msgid "and it has the following unsaved changes:" -msgstr "저장되지 않은 변경점은 다음과 같습니다:" - -#: src/slic3r/GUI/Tab.cpp:2708 -msgid "Discard changes and continue anyway?" -msgstr "수정된 사항을 취소하고 계속하겠습니까?" - -#: src/slic3r/GUI/Tab.cpp:2709 -msgid "Unsaved Changes" -msgstr "미 저장된 변경점" - -#: src/slic3r/GUI/Tab.cpp:2721 -msgid "Please check your object list before preset changing." -msgstr "사전 설정을 변경 하기 전에 개체 목록을 확인 하십시오." - -#: src/slic3r/GUI/Tab.cpp:2801 -msgid "Copy" -msgstr "복사" - -#: src/slic3r/GUI/Tab.cpp:2823 -msgid "The supplied name is empty. It can't be saved." -msgstr "파일 이름이 비어 있습니다. 저장할 수 없습니다." - -#: src/slic3r/GUI/Tab.cpp:2828 -msgid "Cannot overwrite a system profile." -msgstr "시스템 프로파일을 겹쳐 쓸 수 없습니다." - -#: src/slic3r/GUI/Tab.cpp:2832 -msgid "Cannot overwrite an external profile." -msgstr "외부 프로필을 덮어 쓸 수 없습니다." - -#: src/slic3r/GUI/Tab.cpp:2858 -msgid "remove" -msgstr "제거(remove)" - -#: src/slic3r/GUI/Tab.cpp:2858 -msgid "delete" -msgstr "지우기" - -#: src/slic3r/GUI/Tab.cpp:2859 -msgid "Are you sure you want to " -msgstr "정말로 다음과 같이 하겠습니까? " - -#: src/slic3r/GUI/Tab.cpp:2859 -msgid " the selected preset?" -msgstr " 를(가) 선택된 설정을 실행 할까요?" - -#: src/slic3r/GUI/Tab.cpp:2860 -msgid "Remove" -msgstr "제거(remove)" - -#: src/slic3r/GUI/Tab.cpp:2861 -msgid " Preset" -msgstr " 기본 설정" - -#: src/slic3r/GUI/Tab.cpp:2989 -msgid "LOCKED LOCK;indicates that the settings are the same as the system values for the current option group" -msgstr "자물쇠 잠금 : 설정이 현재 옵션 그룹의 시스템 값과 동일 함을 나타냅니다" - -#: src/slic3r/GUI/Tab.cpp:2992 -msgid "" -"UNLOCKED LOCK;indicates that some settings were changed and are not equal to the system values for the " -"current option group.\n" -"Click the UNLOCKED LOCK icon to reset all settings for current option group to the system values." -msgstr "" -"잠금 풀림 : 일부 설정이 변경되었으며 현재 옵션 그룹의 시스템 값과 같지 않음을 나타냅니다.\n" -"현재 옵션 그룹의 모든 설정을 시스템 값으로 재설정하려면 자물쇠 잠금 아이콘을 클릭하십시오." - -#: src/slic3r/GUI/Tab.cpp:2998 -msgid "" -"WHITE BULLET;for the left button: \tindicates a non-system preset,\n" -"for the right button: \tindicates that the settings hasn't been modified." -msgstr "" -"흰색 총알; 왼쪽 버튼 : 시스템이 아닌 사전 설정을 나타내며,\n" -"오른쪽 버튼의 경우 : 설정이 수정되지 않았 음을 나타냅니다." - -#: src/slic3r/GUI/Tab.cpp:3002 -msgid "" -"BACK ARROW;indicates that the settings were changed and are not equal to the last saved preset for the " -"current option group.\n" -"Click the BACK ARROW icon to reset all settings for the current option group to the last saved preset." -msgstr "" -"잠금 풀림;일부 설정이 변경되었으며 현재 옵션 그룹의 시스템 값과 같지 않음을 나타냅니다.\n" -"현재 옵션 그룹의 모든 설정을 시스템 값으로 재설정하려면 자물쇠 잠금 아이콘을 클릭하십시오." - -#: src/slic3r/GUI/Tab.cpp:3028 -msgid "" -"LOCKED LOCK icon indicates that the settings are the same as the system values for the current option group" -msgstr "자물쇠 잠금 아이코 설정이 현재 옵션 그룹의 시스템 값과 동일 함을 나타냅니다" - -#: src/slic3r/GUI/Tab.cpp:3030 -msgid "" -"UNLOCKED LOCK icon indicates that some settings were changed and are not equal to the system values for the " -"current option group.\n" -"Click to reset all settings for current option group to the system values." -msgstr "" -"잠금 풀림 아이코 일부 설정이 변경되었으며 현재 옵션 그룹의 시스템 값과 같지 않음을 나타냅니다.\n" -"현재 옵션 그룹의 모든 설정을 시스템 값으로 재설정하려면 자물쇠 잠금 아이콘을 클릭하십시오." - -#: src/slic3r/GUI/Tab.cpp:3033 -msgid "WHITE BULLET icon indicates a non system preset." -msgstr "흰색 글머리 아이콘은 시스템 사전 설정이 아닌 것을 나타냅니다." - -#: src/slic3r/GUI/Tab.cpp:3036 -msgid "" -"WHITE BULLET icon indicates that the settings are the same as in the last saved preset for the current option " -"group." -msgstr "" -"흰색 글머리 기호 아이콘은 설정이 현재 옵션 그룹에 대해 마지막으로 저장 된 사전 설정과 동일 하다는 것을 나타냅" -"니다." - -#: src/slic3r/GUI/Tab.cpp:3038 -msgid "" -"BACK ARROW icon indicates that the settings were changed and are not equal to the last saved preset for the " -"current option group.\n" -"Click to reset all settings for the current option group to the last saved preset." -msgstr "" -"백화살표 아이콘 설정을 변경 하 고 현재 옵션 그룹에 대 한 마지막 저장 된 프리셋을 동일 하지 않습니다 나타냅니" -"다.\n" -"마지막 현재 옵션 그룹에 대 한 모든 설정 다시 설정을 클릭 하 여 사전 설정을 저장." - -#: src/slic3r/GUI/Tab.cpp:3044 -msgid "LOCKED LOCK icon indicates that the value is the same as the system value." -msgstr "잠긴 자물쇠 아이콘 값 같은 시스템 값 임을 나타냅니다." - -#: src/slic3r/GUI/Tab.cpp:3045 -msgid "" -"UNLOCKED LOCK icon indicates that the value was changed and is not equal to the system value.\n" -"Click to reset current value to the system value." -msgstr "" -"잠금 해제 자물쇠 아이콘 값 변경 된 시스템 값은 나타냅니다.\n" -"시스템 값을 현재 값으로 설정 하려면 클릭 합니다." - -#: src/slic3r/GUI/Tab.cpp:3051 -msgid "WHITE BULLET icon indicates that the value is the same as in the last saved preset." -msgstr "흰색 글머리 기호 아이콘은 마지막으로 저장 한 사전 설정과 동일한 값을 나타냅니다." - -#: src/slic3r/GUI/Tab.cpp:3052 -msgid "" -"BACK ARROW icon indicates that the value was changed and is not equal to the last saved preset.\n" -"Click to reset current value to the last saved preset." -msgstr "" -"잠금 해제 자물쇠 아이콘 값 변경 된 시스템 값은 나타냅니다.\n" -"시스템 값을 현재 값으로 설정 하려면 클릭 합니다." - -#: src/slic3r/GUI/Tab.cpp:3152 -msgid " as:" -msgstr " as:" - -#: src/slic3r/GUI/Tab.cpp:3196 -msgid "the following postfix are not allowed:" -msgstr "다음 접미사는 허용되지 않습니다:" - -#: src/slic3r/GUI/Tab.cpp:3200 -msgid "The supplied name is not available." -msgstr "The supplied name is not available." - -#: src/slic3r/GUI/Tab.cpp:3213 -msgid "Material" -msgstr "재료" - -#: src/slic3r/GUI/Tab.cpp:3215 src/slic3r/GUI/Tab.cpp:3305 -msgid "Layers" -msgstr "레이어" - -#: src/slic3r/GUI/Tab.cpp:3219 -msgid "Exposure" -msgstr "노출" - -#: src/slic3r/GUI/Tab.cpp:3313 -msgid "Support head" -msgstr "서포트 헤드" - -#: src/slic3r/GUI/Tab.cpp:3318 -msgid "Support pillar" -msgstr "서포트 기둥" - -#: src/slic3r/GUI/Tab.cpp:3328 -msgid "Connection of the support sticks and junctions" -msgstr "서포트 기둥 및 접합부 연결" - -#: src/slic3r/GUI/Tab.cpp:3333 -msgid "Automatic generation" -msgstr "자동 생성" - -#: src/slic3r/GUI/Tab.cpp:3395 -msgid "Head penetration should not be greater than the head width." -msgstr "헤드 관통은 헤드 폭 보다 크지 않아야 합니다." - -#: src/slic3r/GUI/Tab.cpp:3396 -msgid "Invalid Head penetration" -msgstr "잘못된 헤드 관통" - -#: src/slic3r/GUI/Tab.cpp:3408 -msgid "Pinhead diameter should be smaller than the pillar diameter." -msgstr "핀헤드 지름은 기둥 지름 보다 작아야 합니다." - -#: src/slic3r/GUI/Tab.cpp:3409 -msgid "Invalid pinhead diameter" -msgstr "잘못된 핀 헤드 지름" - -#: src/slic3r/GUI/Tab.hpp:307 src/slic3r/GUI/Tab.hpp:395 -msgid "Print Settings" -msgstr "출력 설정" - -#: src/slic3r/GUI/Tab.hpp:325 -msgid "Filament Settings" -msgstr "필라멘트 설정" - -#: src/slic3r/GUI/Tab.hpp:358 -msgid "Printer Settings" -msgstr "프린터 설정" - -#: src/slic3r/GUI/Tab.hpp:381 -msgid "Material Settings" -msgstr "재질 설정" - -#: src/slic3r/GUI/Tab.hpp:407 -msgid "Save preset" -msgstr "사전 설정 저장" - -#: src/slic3r/GUI/UpdateDialogs.cpp:29 -msgid "Update available" -msgstr "사용가능한 업데이트" - -#: src/slic3r/GUI/UpdateDialogs.cpp:29 -msgid "New version of Slic3r PE is available" -msgstr "새로운 버전의 Slic3r PE 사용 가능" - -#: src/slic3r/GUI/UpdateDialogs.cpp:36 -msgid "To download, follow the link below." -msgstr "다운로드하려면 아래 링크를 클릭하십시오." - -#: src/slic3r/GUI/UpdateDialogs.cpp:44 -msgid "Current version:" -msgstr "현재 버전:" - -#: src/slic3r/GUI/UpdateDialogs.cpp:46 -msgid "New version:" -msgstr "새로운 버전:" - -#: src/slic3r/GUI/UpdateDialogs.cpp:54 -msgid "Don't notify about new releases any more" -msgstr "새로운 수정사항에 대해 더 이상 알림 안 함" - -#: src/slic3r/GUI/UpdateDialogs.cpp:72 src/slic3r/GUI/UpdateDialogs.cpp:164 -msgid "Configuration update" -msgstr "구성 업데이트" - -#: src/slic3r/GUI/UpdateDialogs.cpp:72 -msgid "Configuration update is available" -msgstr "구성 업데이트를 사용할 수 있음" - -#: src/slic3r/GUI/UpdateDialogs.cpp:75 -msgid "" -"Would you like to install it?\n" -"\n" -"Note that a full configuration snapshot will be created first. It can then be restored at any time should " -"there be a problem with the new version.\n" -"\n" -"Updated configuration bundles:" -msgstr "" -"그것을 설치 하시겠습니까?\n" -"\n" -"전체 구성 스냅 샷이 먼저 만들어집니다. 그런 다음 새 버전에 문제가있을 경우 언제든지 복원 할 수 있습니다.\n" -"\n" -"업데이트 된 구성 번들 :" - -#: src/slic3r/GUI/UpdateDialogs.cpp:111 -msgid "Slic3r incompatibility" -msgstr "Slic3r와 호환 되지 않음" - -#: src/slic3r/GUI/UpdateDialogs.cpp:111 -msgid "Slic3r configuration is incompatible" -msgstr "Slic3r 구성이 호환되지 않습니다" - -#: src/slic3r/GUI/UpdateDialogs.cpp:114 -msgid "" -"This version of Slic3r PE is not compatible with currently installed configuration bundles.\n" -"This probably happened as a result of running an older Slic3r PE after using a newer one.\n" -"\n" -"You may either exit Slic3r and try again with a newer version, or you may re-run the initial configuration. " -"Doing so will create a backup snapshot of the existing configuration before installing files compatible with " -"this Slic3r.\n" -msgstr "" -"이 버전의 Slic3r PE는 현재 설치된 구성 번들과 호환되지 않습니다.\n" -"이것은 아마도 새로운 Slic3r PE를 사용한 후에 실행 된 결과 일 것입니다.\n" -"\n" -"Slic3r을 종료하고 새 버전으로 다시 시도하거나 초기 구성을 다시 실행할 수 있습니다. 이렇게하면이 Slic3r과 호환" -"되는 파일을 설치하기 전에 기존 구성의 백업 스냅 샷을 생성 할 수 있습니다.\n" - -#: src/slic3r/GUI/UpdateDialogs.cpp:123 -#, c-format -msgid "This Slic3r PE version: %s" -msgstr "이 Slic3r PE 버전 : % s" - -#: src/slic3r/GUI/UpdateDialogs.cpp:128 -msgid "Incompatible bundles:" -msgstr "호환되지 않는 번들 :" - -#: src/slic3r/GUI/UpdateDialogs.cpp:144 -msgid "Exit Slic3r" -msgstr "Exit Slic3r" - -#: src/slic3r/GUI/UpdateDialogs.cpp:147 -msgid "Re-configure" -msgstr "재구성" - -#: src/slic3r/GUI/UpdateDialogs.cpp:168 -#, c-format -msgid "" -"Slic3r PE now uses an updated configuration structure.\n" -"\n" -"So called 'System presets' have been introduced, which hold the built-in default settings for various " -"printers. These System presets cannot be modified, instead, users now may create their own presets inheriting " -"settings from one of the System presets.\n" -"An inheriting preset may either inherit a particular value from its parent or override it with a customized " -"value.\n" -"\n" -"Please proceed with the %s that follows to set up the new presets and to choose whether to enable automatic " -"preset updates." -msgstr "" -"Slic3r PE는 이제 업데이트 된 구성 구조를 사용합니다.\n" -"\n" -"'시스템 사전 설정'이 도입되어 다양한 프린터에 기본 제공되는 기본 설정이 유지됩니다. 이러한 시스템 사전 설정은 " -"수정할 수 없으며 대신 사용자는 시스템 사전 설정 중 하나에서 설정을 상속하는 자체 사전 설정을 만들 수 있습니" -"다.\n" -"상속 된 사전 설정은 부모로부터 특정 값을 상속 받거나 사용자 정의 값으로 대체 할 수 있습니다.\n" -"\n" -"새 사전 설정을 설정하고 자동 사전 설정 업데이트를 사용할지 여부를 선택하려면 다음의 % s을 계속 진행하십시오." - -#: src/slic3r/GUI/UpdateDialogs.cpp:184 -msgid "For more information please visit our wiki page:" -msgstr "자세한 정보는 위키 페이지를 참조하십시오 :" - -#: src/slic3r/GUI/WipeTowerDialog.cpp:14 -msgid "Ramming customization" -msgstr "사용자 정의 다지기(Ramming)" - -#: src/slic3r/GUI/WipeTowerDialog.cpp:40 -msgid "" -"Ramming denotes the rapid extrusion just before a tool change in a single-extruder MM printer. Its purpose is " -"to properly shape the end of the unloaded filament so it does not prevent insertion of the new filament and " -"can itself be reinserted later. This phase is important and different materials can require different " -"extrusion speeds to get the good shape. For this reason, the extrusion rates during ramming are adjustable.\n" -"\n" -"This is an expert-level setting, incorrect adjustment will likely lead to jams, extruder wheel grinding into " -"filament etc." -msgstr "" -"래밍은 단일 압출기 MM 프린터에서 공구 교환 직전의 신속한 압출을 나타냅니다. 그 목적은 언로드 된 필라멘트의 끝 " -"부분을 적절히 형성하여 새로운 필라멘트의 삽입을 방지하고 나중에 다시 삽입 할 수 있도록하기위한 것입니다. 이 단" -"계는 중요하며 다른 재료는 좋은 모양을 얻기 위해 다른 압출 속도를 요구할 수 있습니다. 이러한 이유로, 래밍 중 압" -"출 속도는 조정 가능합니다.\n" -"\n" -"전문가 수준의 설정이므로 잘못된 조정으로 인해 용지 걸림, 압출기 휠이 필라멘트 등에 연삭 될 수 있습니다." - -#: src/slic3r/GUI/WipeTowerDialog.cpp:82 -msgid "Total ramming time" -msgstr "총 래밍 시간" - -#: src/slic3r/GUI/WipeTowerDialog.cpp:84 -msgid "Total rammed volume" -msgstr "총 레미드 양" - -#: src/slic3r/GUI/WipeTowerDialog.cpp:88 -msgid "Ramming line width" -msgstr "래밍 선 너비" - -#: src/slic3r/GUI/WipeTowerDialog.cpp:90 -msgid "Ramming line spacing" -msgstr "래밍 선 간격" - -#: src/slic3r/GUI/WipeTowerDialog.cpp:141 -msgid "Wipe tower - Purging volume adjustment" -msgstr "와이프 타워 - 버려진 필라멘트 조절" - -#: src/slic3r/GUI/WipeTowerDialog.cpp:225 -msgid "Here you can adjust required purging volume (mm³) for any given pair of tools." -msgstr "여기서 주어진 도구 쌍에 필요한 정화 용량 (mm³)을 조정할 수 있습니다." - -#: src/slic3r/GUI/WipeTowerDialog.cpp:226 -msgid "Extruder changed to" -msgstr "익스트루더 번경" - -#: src/slic3r/GUI/WipeTowerDialog.cpp:234 -msgid "unloaded" -msgstr "언로드(unloaded)" - -#: src/slic3r/GUI/WipeTowerDialog.cpp:235 -msgid "loaded" -msgstr "로드(loaded)" - -#: src/slic3r/GUI/WipeTowerDialog.cpp:240 -msgid "Tool #" -msgstr "툴(Tool) #" - -#: src/slic3r/GUI/WipeTowerDialog.cpp:247 -msgid "" -"Total purging volume is calculated by summing two values below, depending on which tools are loaded/unloaded." -msgstr "총 정화 량은 어느 공구가로드 / 언로드되는지에 따라 아래의 두 값을 합산하여 계산됩니다." - -#: src/slic3r/GUI/WipeTowerDialog.cpp:248 -msgid "Volume to purge (mm³) when the filament is being" -msgstr "제거할 필라멘트 양 (mm³)" - -#: src/slic3r/GUI/WipeTowerDialog.cpp:262 -msgid "From" -msgstr "From" - -#: src/slic3r/GUI/WipeTowerDialog.cpp:327 -msgid "" -"Switching to simple settings will discard changes done in the advanced mode!\n" -"\n" -"Do you want to proceed?" -msgstr "" -"단순 설정으로 전환하면 고급 모드에서 수행된 변경 내용이 삭제됨!\n" -"\n" -"계속하시겠습니까?" - -#: src/slic3r/GUI/WipeTowerDialog.cpp:339 -msgid "Show simplified settings" -msgstr "간단한 설정보기" - -#: src/slic3r/GUI/WipeTowerDialog.cpp:339 -msgid "Show advanced settings" -msgstr "고급 설정보기" - -#: src/slic3r/GUI/wxExtensions.cpp:2398 -#, c-format -msgid "Switch to the %s mode" -msgstr "%s 모드로 전환" - -#: src/slic3r/GUI/wxExtensions.cpp:2399 -#, c-format -msgid "Current mode is %s" -msgstr "현재 모드는 %s입니다" - -#: src/slic3r/Utils/Duet.cpp:51 -msgid "Connection to Duet works correctly." -msgstr "듀엣보드에 대한 연결이 올바르게 작동 합니다." - -#: src/slic3r/Utils/Duet.cpp:56 -msgid "Could not connect to Duet" -msgstr "듀엣보드에 연결할 수 없습니다" - -#: src/slic3r/Utils/Duet.cpp:84 src/slic3r/Utils/Duet.cpp:154 -msgid "Unknown error occured" -msgstr "알 수 없는 오류가 발생 했습니다" - -#: src/slic3r/Utils/Duet.cpp:148 -msgid "Wrong password" -msgstr "잘못된 암호" - -#: src/slic3r/Utils/Duet.cpp:151 -msgid "Could not get resources to create a new connection" -msgstr "새 연결을 만들 리소스를 가져올수 없습니다" - -#: src/slic3r/Utils/OctoPrint.cpp:69 -#, c-format -msgid "Mismatched type of print host: %s" -msgstr "일치 하지않는 인쇄 호스트 유형: %s" - -#: src/slic3r/Utils/OctoPrint.cpp:84 -msgid "Connection to OctoPrint works correctly." -msgstr "OctoPrint에 연결하면 올바르게 작동합니다." - -#: src/slic3r/Utils/OctoPrint.cpp:90 -msgid "Could not connect to OctoPrint" -msgstr "OctoPrint에 연결할 수 없습니다" - -#: src/slic3r/Utils/OctoPrint.cpp:90 -msgid "Note: OctoPrint version at least 1.1.0 is required." -msgstr "참고 : OctoPrint 버전 1.1.0 이상이 필요합니다." - -#: src/slic3r/Utils/OctoPrint.cpp:195 -msgid "Connection to Prusa SLA works correctly." -msgstr "Prusa SLA에 대한 연결이 올바르게 작동 합니다." - -#: src/slic3r/Utils/OctoPrint.cpp:200 -msgid "Could not connect to Prusa SLA" -msgstr "Prusa SLA에 연결할 수 없습니다" - -#: src/slic3r/Utils/PresetUpdater.cpp:583 -#, c-format -msgid "requires min. %s and max. %s" -msgstr "최소. %s 와 최대. %s" - -#: src/slic3r/Utils/PresetUpdater.cpp:588 -#, c-format -msgid "requires min. %s" -msgstr "최소 %s가 필요 합니다" - -#: src/slic3r/Utils/PresetUpdater.cpp:590 -#, c-format -msgid "requires max. %s" -msgstr "최대 필요 합니다. %s" - -#: src/slic3r/Utils/FixModelByWin10.cpp:219 src/slic3r/Utils/FixModelByWin10.cpp:359 -msgid "Exporting source model" -msgstr "소스 모델 내보내기" - -#: src/slic3r/Utils/FixModelByWin10.cpp:235 -msgid "Failed loading the input model." -msgstr "입력 모델을 로드하지 못했습니다." - -#: src/slic3r/Utils/FixModelByWin10.cpp:242 -msgid "Repairing model by the Netfabb service" -msgstr "Netfabb 서비스에의 한 모델 복구" - -#: src/slic3r/Utils/FixModelByWin10.cpp:248 -msgid "Mesh repair failed." -msgstr "메ㅅ 복구에 실패 했습니다." - -#: src/slic3r/Utils/FixModelByWin10.cpp:251 src/slic3r/Utils/FixModelByWin10.cpp:378 -msgid "Loading repaired model" -msgstr "복구 된 모델 로드" - -#: src/slic3r/Utils/FixModelByWin10.cpp:263 src/slic3r/Utils/FixModelByWin10.cpp:270 -#: src/slic3r/Utils/FixModelByWin10.cpp:302 -msgid "Saving mesh into the 3MF container failed." -msgstr "3MF 컨테이너에 메쉬를 저장하지 못했습니다." - -#: src/slic3r/Utils/FixModelByWin10.cpp:340 -msgid "Model fixing" -msgstr "모델 고정" - -#: src/slic3r/Utils/FixModelByWin10.cpp:341 -msgid "Exporting model..." -msgstr "소스 모델 내보내기..." - -#: src/slic3r/Utils/FixModelByWin10.cpp:368 -msgid "Export of a temporary 3mf file failed" -msgstr "임시 3mf 파일을 내보내지 못했습니다" - -#: src/slic3r/Utils/FixModelByWin10.cpp:383 -msgid "Import of the repaired 3mf file failed" -msgstr "복구된 3mf 파일을 가져오지 못했습니다" - -#: src/slic3r/Utils/FixModelByWin10.cpp:385 -msgid "Repaired 3MF file does not contain any object" -msgstr "복구된 3MF 파일에 개체가 포함 되어있지 않습니다" - -#: src/slic3r/Utils/FixModelByWin10.cpp:387 -msgid "Repaired 3MF file contains more than one object" -msgstr "복구된 3MF 파일에 둘 이상의 개체가 포함되어 있습니다" - -#: src/slic3r/Utils/FixModelByWin10.cpp:389 -msgid "Repaired 3MF file does not contain any volume" -msgstr "복구 된 3MF 파일에 개체가 포함 되어있지 않습니다" - -#: src/slic3r/Utils/FixModelByWin10.cpp:391 -msgid "Repaired 3MF file contains more than one volume" -msgstr "복구된 3MF 파일에 둘 이상의 개체가 포함되어 있습니다" - -#: src/slic3r/Utils/FixModelByWin10.cpp:400 -msgid "Model repair finished" -msgstr "모델 수리 완료" - -#: src/slic3r/Utils/FixModelByWin10.cpp:406 -msgid "Model repair canceled" -msgstr "모델 복구가 취소 되었습니다" - -#: src/slic3r/Utils/FixModelByWin10.cpp:423 -msgid "Model repaired successfully" -msgstr "모델이 성공적으로 복구 되었습니다" - -#: src/slic3r/Utils/FixModelByWin10.cpp:423 src/slic3r/Utils/FixModelByWin10.cpp:426 -msgid "Model Repair by the Netfabb service" -msgstr "Netfabb 서비스에의 한 모델 복구" - -#: src/slic3r/Utils/FixModelByWin10.cpp:426 -msgid "Model repair failed: \n" -msgstr "모델 복구 실패:\n" - -#: src/libslic3r/Zipper.cpp:35 -msgid "undefined error" -msgstr "정의 되지 않은 오류" - -#: src/libslic3r/Zipper.cpp:37 -msgid "too many files" -msgstr "파일이 너무 많음" - -#: src/libslic3r/Zipper.cpp:39 -msgid "file too large" -msgstr "파일이 너무 큼" - -#: src/libslic3r/Zipper.cpp:41 -msgid "unsupported method" -msgstr "지원 되지 않는 방법" - -#: src/libslic3r/Zipper.cpp:43 -msgid "unsupported encryption" -msgstr "지원 되지 않는 암호화" - -#: src/libslic3r/Zipper.cpp:45 -msgid "unsupported feature" -msgstr "지원 되지 않는 기능" - -#: src/libslic3r/Zipper.cpp:47 -msgid "failed finding central directory" -msgstr "중앙 디렉터리를 찾지 못했습니다." - -#: src/libslic3r/Zipper.cpp:49 -msgid "not a ZIP archive" -msgstr "zIP 아카이브 아님" - -#: src/libslic3r/Zipper.cpp:51 -msgid "invalid header or archive is corrupted" -msgstr "잘못 된 헤더 또는 아카이브가 손상 되었습니다" - -#: src/libslic3r/Zipper.cpp:53 -msgid "unsupported multidisk archive" -msgstr "지원 되지 않는 멀티 디스크 아카이브" - -#: src/libslic3r/Zipper.cpp:55 -msgid "decompression failed or archive is corrupted" -msgstr "압축 풀기 실패 또는 아카이브가 손상 되었습니다" - -#: src/libslic3r/Zipper.cpp:57 -msgid "compression failed" -msgstr "압축 실패" - -#: src/libslic3r/Zipper.cpp:59 -msgid "unexpected decompressed size" -msgstr "예기치 않은 압축 해제 크기" - -#: src/libslic3r/Zipper.cpp:61 -msgid "CRC-32 check failed" -msgstr "CRC-32 확인 실패" - -#: src/libslic3r/Zipper.cpp:63 -msgid "unsupported central directory size" -msgstr "지원 되지 않는 중앙 디렉터리 크기" - -#: src/libslic3r/Zipper.cpp:65 -msgid "allocation failed" -msgstr "할당 실패" - -#: src/libslic3r/Zipper.cpp:67 -msgid "file open failed" -msgstr "파일 열기 실패" - -#: src/libslic3r/Zipper.cpp:69 -msgid "file create failed" -msgstr "파일 만들기 실패" - -#: src/libslic3r/Zipper.cpp:71 -msgid "file write failed" -msgstr "파일 쓰기 실패" - -#: src/libslic3r/Zipper.cpp:73 -msgid "file read failed" -msgstr "파일 읽기 실패" - -#: src/libslic3r/Zipper.cpp:75 -msgid "file close failed" -msgstr "파일 닫기 실패" - -#: src/libslic3r/Zipper.cpp:77 -msgid "file seek failed" -msgstr "파일 검색 실패" - -#: src/libslic3r/Zipper.cpp:79 -msgid "file stat failed" -msgstr "파일 통계 실패" - -#: src/libslic3r/Zipper.cpp:81 -msgid "invalid parameter" -msgstr "잘못 된 매개 변수" - -#: src/libslic3r/Zipper.cpp:83 -msgid "invalid filename" -msgstr "잘못 된 파일 이름" - -#: src/libslic3r/Zipper.cpp:85 -msgid "buffer too small" -msgstr "버퍼가 너무 작음" - -#: src/libslic3r/Zipper.cpp:87 -msgid "internal error" -msgstr "내부 오류" - -#: src/libslic3r/Zipper.cpp:89 -msgid "file not found" -msgstr "파일을 찾을수 없다" - -#: src/libslic3r/Zipper.cpp:91 -msgid "archive is too large" -msgstr "아카이브가 너무 큼" - -#: src/libslic3r/Zipper.cpp:93 -msgid "validation failed" -msgstr "유효성 검사 실패" - -#: src/libslic3r/Zipper.cpp:95 -msgid "write calledback failed" -msgstr "쓰기 다시 실패" - -#: src/libslic3r/Zipper.cpp:105 -msgid "Error with zip archive" -msgstr "zip 아카이브와 오류가 발생 했습니다" - -#: src/libslic3r/SLA/SLASupportTree.cpp:2153 -msgid "Starting" -msgstr "부터" - -#: src/libslic3r/SLA/SLASupportTree.cpp:2154 -msgid "Filtering" -msgstr "필터링" - -#: src/libslic3r/SLA/SLASupportTree.cpp:2155 -msgid "Generate pinheads" -msgstr "핀 헤드 생성" - -#: src/libslic3r/SLA/SLASupportTree.cpp:2156 -msgid "Classification" -msgstr "주소" - -#: src/libslic3r/SLA/SLASupportTree.cpp:2157 -msgid "Routing to ground" -msgstr "면으로의 라우팅" - -#: src/libslic3r/SLA/SLASupportTree.cpp:2158 -msgid "Routing supports to model surface" -msgstr "모델 표면에 대한 라우팅 지원" - -#: src/libslic3r/SLA/SLASupportTree.cpp:2159 -msgid "Cascading pillars" -msgstr "계단식 기둥" - -#: src/libslic3r/SLA/SLASupportTree.cpp:2160 -msgid "Processing small holes" -msgstr "작은 구멍 가공" - -#: src/libslic3r/SLA/SLASupportTree.cpp:2161 -msgid "Done" -msgstr "완료" - -#: src/libslic3r/SLA/SLASupportTree.cpp:2162 -msgid "Abort" -msgstr "중단" - -#: src/libslic3r/Print.cpp:1136 -msgid "All objects are outside of the print volume." -msgstr "모든 개체가 인쇄 볼륨 외부에 있습니다." - -#: src/libslic3r/Print.cpp:1165 -msgid "Some objects are too close; your extruder will collide with them." -msgstr "일부 개체가 너무 가깝습니다. 귀하의 압출기가 그들과 충돌합니다." - -#: src/libslic3r/Print.cpp:1180 -msgid "Some objects are too tall and cannot be printed without extruder collisions." -msgstr "일부 개체는 너무 크고 익스트루더 충돌없이 인쇄 할 수 없습니다." - -#: src/libslic3r/Print.cpp:1190 -msgid "The Spiral Vase option can only be used when printing a single object." -msgstr "나선형 꽃병(Spiral Vase) 옵션은 단일 개체를 인쇄 할 때만 사용할 수 있습니다." - -#: src/libslic3r/Print.cpp:1192 -msgid "The Spiral Vase option can only be used when printing single material objects." -msgstr "나선형 꽃병 옵션(Spiral Vase)은 단일 재료 객체를 인쇄 할 때만 사용할 수 있습니다." - -#: src/libslic3r/Print.cpp:1198 -msgid "All extruders must have the same diameter for single extruder multimaterial printer." -msgstr "모든 익스트루더는 멀티메터리얼 프린터의 싱글 익스트루더에 대해 동일한 직경을 가져야합니다." - -#: src/libslic3r/Print.cpp:1203 -msgid "The Wipe Tower is currently only supported for the Marlin, RepRap/Sprinter and Repetier G-code flavors." -msgstr "와이프 타워는 현재 말린, RepRap/Sprinter 및 리피티어에 대해서만 G-코드지원 됩니다." - -#: src/libslic3r/Print.cpp:1205 -msgid "" -"The Wipe Tower is currently only supported with the relative extruder addressing (use_relative_e_distances=1)." -msgstr "와이프 타워는 현재 상대적 압출기 어드레싱 (use_relative_e_distances = 1)에서만 지원됩니다." - -#: src/libslic3r/Print.cpp:1226 -msgid "The Wipe Tower is only supported for multiple objects if they have equal layer heigths" -msgstr "와이프 타워 (Wipe Tower)는 같은 레이어 높이에 경우 여러 객체에 대해서만 지원됩니다" - -#: src/libslic3r/Print.cpp:1228 -msgid "" -"The Wipe Tower is only supported for multiple objects if they are printed over an equal number of raft layers" -msgstr "와이프 타워는 같은 수의 라프트 레이어 위에 인쇄 된 경우 여러 객체에 대해서만 지원됩니다" - -#: src/libslic3r/Print.cpp:1230 -msgid "" -"The Wipe Tower is only supported for multiple objects if they are printed with the same " -"support_material_contact_distance" -msgstr "와이프 타워는 동일한 support_material_contact_distance로 인쇄 된 경우 여러 객체에 대해서만 지원됩니다" - -#: src/libslic3r/Print.cpp:1232 -msgid "The Wipe Tower is only supported for multiple objects if they are sliced equally." -msgstr "와이프 타워는 똑같이 슬라이스 된 경우 여러 오브젝트에 대해서만 지원됩니다." - -#: src/libslic3r/Print.cpp:1261 -msgid "The Wipe tower is only supported if all objects have the same layer height profile" -msgstr "모든 오브젝트의 레이어 높이 프로필이 동일한 경우에만 와이프 타워가 지원됩니다" - -#: src/libslic3r/Print.cpp:1271 -msgid "The supplied settings will cause an empty print." -msgstr "제공된 설정으로 인해 빈 인쇄가 발생합니다." - -#: src/libslic3r/Print.cpp:1288 -msgid "One or more object were assigned an extruder that the printer does not have." -msgstr "하나 이상의 개체에 프린터에없는 압출기가 지정되었습니다." - -#: src/libslic3r/Print.cpp:1297 -msgid "" -"Printing with multiple extruders of differing nozzle diameters. If support is to be printed with the current " -"extruder (support_material_extruder == 0 or support_material_interface_extruder == 0), all nozzles have to be " -"of the same diameter." -msgstr "" -"노즐 지름이 다른 여러 압출기로 인쇄. 지원이 현재 압출기 (support_material_extruder == 0 또는 " -"support_material_interface_extruder == 0)로 인쇄되는 경우 모든 노즐은 동일한 지름이어야합니다." - -#: src/libslic3r/Print.cpp:1305 -msgid "" -"For the Wipe Tower to work with the soluble supports, the support layers need to be synchronized with the " -"object layers." -msgstr "와이프 타워가 가용성 지지체와 함께 작동 하려면 서포트 레이어를 오브젝트 레이어와 동기화 해야 합니다." - -#: src/libslic3r/Print.cpp:1309 -msgid "" -"The Wipe Tower currently supports the non-soluble supports only if they are printed with the current extruder " -"without triggering a tool change. (both support_material_extruder and support_material_interface_extruder " -"need to be set to 0)." -msgstr "" -"와이프 타워는 현재 공구 교체를 트리거하지 않고 현재의 압출기로 인쇄 하는 경우에만 비가용성 서포트를 지원 합니" -"다. (support_material_extruder과 support_material_interface_extruder 모두 0으로 설정 해야 합니다.)" - -#: src/libslic3r/Print.cpp:1316 -msgid "first_layer_height" -msgstr "first_layer_height" - -#: src/libslic3r/Print.cpp:1331 -msgid "First layer height can't be greater than nozzle diameter" -msgstr "첫번째 레이어 높이는 노즐 직경보다 클 수 없습니다" - -#: src/libslic3r/Print.cpp:1335 -msgid "Layer height can't be greater than nozzle diameter" -msgstr "레이어 높이는 노즐 직경보다 클 수 없습니다" - -#: src/libslic3r/SLAPrint.cpp:55 -msgid "Slicing model" -msgstr "슬라이싱 모델" - -#: src/libslic3r/SLAPrint.cpp:56 src/libslic3r/SLAPrint.cpp:801 -msgid "Generating support points" -msgstr "서포트 지점 생성" - -#: src/libslic3r/SLAPrint.cpp:57 -msgid "Generating support tree" -msgstr "서포트 트리 생성" - -#: src/libslic3r/SLAPrint.cpp:58 -msgid "Generating pad" -msgstr "패드 생성" - -#: src/libslic3r/SLAPrint.cpp:59 -msgid "Slicing supports" -msgstr "슬라이싱 서포트즈" - -#: src/libslic3r/SLAPrint.cpp:71 -msgid "Merging slices and calculating statistics" -msgstr "분할 영역 병합 및 통계 계산" - -#: src/libslic3r/SLAPrint.cpp:72 -msgid "Rasterizing layers" -msgstr "레이어 래스터화" - -#: src/libslic3r/SLAPrint.cpp:605 -msgid "Cannot proceed without support points! Add support points or disable support generation." -msgstr "" -"서포트 포인트 없이 진행할 수 없습니다! 서포트 지점을 추가 하거나 서포트 생성을 사용 하지 않도록 설정 합니다." - -#: src/libslic3r/SLAPrint.cpp:617 -msgid "Elevation is too low for object." -msgstr "객체 고도가 너무 낮습니다." - -#: src/libslic3r/SLAPrint.cpp:699 -msgid "Slicing had to be stopped due to an internal error." -msgstr "내부 오류로 인해 슬라이스를 중지 해야 했습니다." - -#: src/libslic3r/SLAPrint.cpp:849 src/libslic3r/SLAPrint.cpp:859 src/libslic3r/SLAPrint.cpp:907 -msgid "Visualizing supports" -msgstr "시각화 지원" - -#: src/libslic3r/SLAPrint.cpp:1449 -msgid "Slicing done" -msgstr "슬라이싱 완료" - -#: src/libslic3r/PrintBase.cpp:65 -msgid "Failed processing of the output_filename_format template." -msgstr "아래 output_filename_format 템플리트의 처리에 실패했습니다." - -#: src/libslic3r/PrintConfig.cpp:42 src/libslic3r/PrintConfig.cpp:43 -msgid "Printer technology" -msgstr "프린터 기술" - -#: src/libslic3r/PrintConfig.cpp:50 -msgid "Bed shape" -msgstr "배드 모양" - -#: src/libslic3r/PrintConfig.cpp:57 -msgid "" -"This setting controls the height (and thus the total number) of the slices/layers. Thinner layers give better " -"accuracy but take more time to print." -msgstr "" -"이 설정은 슬라이스/레이어의 높이(따라서 총 수)를 제어한다. 얇은 층은 더 나은 정확성을 제공하지만 인쇄하는 데" -"는 더 많은 시간이 걸린다." - -#: src/libslic3r/PrintConfig.cpp:64 -msgid "Max print height" -msgstr "최대 프린트 높이" - -#: src/libslic3r/PrintConfig.cpp:65 -msgid "Set this to the maximum height that can be reached by your extruder while printing." -msgstr "인쇄 중에 익스트루더가 도달 할 수있는 최대 높이로 설정하십시오." - -#: src/libslic3r/PrintConfig.cpp:71 -msgid "Slice gap closing radius" -msgstr "슬라이스 간격 닫힘 반경" - -#: src/libslic3r/PrintConfig.cpp:73 -msgid "" -"Cracks smaller than 2x gap closing radius are being filled during the triangle mesh slicing. The gap closing " -"operation may reduce the final print resolution, therefore it is advisable to keep the value reasonably low." -msgstr "" -"삼각형 메쉬 슬라이싱 중에, 2배 간격 폐쇄 반경 보다 작은 균열이 채워집니다. 틈 닫기 작업은 최종 인쇄 해상도를 " -"줄일 수 있으므로 값을 합리적으로 낮게 유지 하는 것이 좋습니다." - -#: src/libslic3r/PrintConfig.cpp:81 -msgid "Hostname, IP or URL" -msgstr "호스트 이름(Hostname), IP or URL" - -#: src/libslic3r/PrintConfig.cpp:82 -msgid "" -"Slic3r can upload G-code files to a printer host. This field should contain the hostname, IP address or URL " -"of the printer host instance." -msgstr "" -"Slic3r는 프린터 호스트에 G 코드 파일을 업로드할 수 있습니다. 이 필드는 호스트 이름, IP 주소 또는 프린터 호스" -"트 인스턴스의 URL을 포함 해야 합니다." - -#: src/libslic3r/PrintConfig.cpp:88 -msgid "API Key / Password" -msgstr "API 키/암호" - -#: src/libslic3r/PrintConfig.cpp:89 -msgid "" -"Slic3r can upload G-code files to a printer host. This field should contain the API Key or the password " -"required for authentication." -msgstr "" -"Slic3r는 프린터 호스트에 G 코드 파일을 업로드할 수 있습니다. 이 필드는 API 키 또는 인증에 필요한 암호를 포함 " -"해야 합니다." - -#: src/libslic3r/PrintConfig.cpp:111 -msgid "Avoid crossing perimeters" -msgstr "출력된 외측을 피하세요" - -#: src/libslic3r/PrintConfig.cpp:112 -msgid "" -"Optimize travel moves in order to minimize the crossing of perimeters. This is mostly useful with Bowden " -"extruders which suffer from oozing. This feature slows down both the print and the G-code generation." -msgstr "" -"둘레의 교차를 최소화하기 위해 여행 이동을 최적화하십시오. 이것은 보 잉 (Bowling) 압출기가 흘러 나오기 쉬운 경" -"우에 주로 유용합니다. 이 기능을 사용하면 인쇄 및 G 코드 생성 속도가 느려집니다." - -#: src/libslic3r/PrintConfig.cpp:119 src/libslic3r/PrintConfig.cpp:1976 -msgid "Other layers" -msgstr "다른 레이어" - -#: src/libslic3r/PrintConfig.cpp:120 -msgid "" -"Bed temperature for layers after the first one. Set this to zero to disable bed temperature control commands " -"in the output." -msgstr "" -"첫 번째 레이어 이후의 레이어 온도. 이 값을 0으로 설정하면 출력에서 ​​베드 온도 제어 명령을 비활성화합니다." - -#: src/libslic3r/PrintConfig.cpp:122 -msgid "Bed temperature" -msgstr "배드 온도" - -#: src/libslic3r/PrintConfig.cpp:129 -msgid "" -"This custom code is inserted at every layer change, right before the Z move. Note that you can use " -"placeholder variables for all Slic3r settings as well as [layer_num] and [layer_z]." -msgstr "" -"이 사용자 정의 코드는 Z 이동 직전의 모든 레이어 변경에 삽입됩니다. [Slide3r] 설정과 [layer_num] 및 [layer_z]" -"에 대한 자리 표시 자 변수를 사용할 수 있습니다." - -#: src/libslic3r/PrintConfig.cpp:139 -msgid "Between objects G-code" -msgstr "객체 간 G 코드" - -#: src/libslic3r/PrintConfig.cpp:140 -msgid "" -"This code is inserted between objects when using sequential printing. By default extruder and bed temperature " -"are reset using non-wait command; however if M104, M109, M140 or M190 are detected in this custom code, " -"Slic3r will not add temperature commands. Note that you can use placeholder variables for all Slic3r " -"settings, so you can put a \"M109 S[first_layer_temperature]\" command wherever you want." -msgstr "" -"이 코드는 순차 인쇄를 사용할 때 객체간에 삽입됩니다. 기본적으로 익스트루더 및 베드 온도는 대기 모드가 아닌 명" -"령을 사용하여 재설정됩니다. 그러나 이 사용자 코드에서 M104, M109, M140 또는 M190이 감지되면 Slic3r은 온도 명령" -"을 추가하지 않습니다. 모든 Slic3r 설정에 자리 표시 변수를 사용할 수 있으므로 원하는 위치에 \"M109 S " -"[first_layer_temperature]\"명령을 넣을 수 있습니다." - -#: src/libslic3r/PrintConfig.cpp:150 -msgid "Number of solid layers to generate on bottom surfaces." -msgstr "바닥면에 생성 할 솔리드 레이어의 수." - -#: src/libslic3r/PrintConfig.cpp:151 -msgid "Bottom solid layers" -msgstr "바닥 단일 레이어" - -#: src/libslic3r/PrintConfig.cpp:156 -msgid "Bridge" -msgstr "브리지" - -#: src/libslic3r/PrintConfig.cpp:157 -msgid "" -"This is the acceleration your printer will use for bridges. Set zero to disable acceleration control for " -"bridges." -msgstr "" -"이것은 프린터가 브릿지에 사용할 가속도입니다. 브리지의 가속 제어를 사용하지 않으려면 0으로 설정하십시오." - -#: src/libslic3r/PrintConfig.cpp:159 src/libslic3r/PrintConfig.cpp:302 src/libslic3r/PrintConfig.cpp:814 -#: src/libslic3r/PrintConfig.cpp:935 src/libslic3r/PrintConfig.cpp:1088 src/libslic3r/PrintConfig.cpp:1133 -#: src/libslic3r/PrintConfig.cpp:1144 src/libslic3r/PrintConfig.cpp:1333 -msgid "mm/s²" -msgstr "mm/s ²" - -#: src/libslic3r/PrintConfig.cpp:165 -msgid "Bridging angle" -msgstr "브릿지 각도" - -#: src/libslic3r/PrintConfig.cpp:167 -msgid "" -"Bridging angle override. If left to zero, the bridging angle will be calculated automatically. Otherwise the " -"provided angle will be used for all bridges. Use 180° for zero angle." -msgstr "" -"브리징 각도 오버라이드(override)값이. 왼쪽으로 0 일 경우 브리징 각도가 자동으로 계산됩니다. 그렇지 않으면 제공" -"된 각도가 모든 브리지에 사용됩니다. 각도 제로는 180 °를 사용하십시오." - -#: src/libslic3r/PrintConfig.cpp:170 src/libslic3r/PrintConfig.cpp:732 src/libslic3r/PrintConfig.cpp:1569 -#: src/libslic3r/PrintConfig.cpp:1579 src/libslic3r/PrintConfig.cpp:1807 src/libslic3r/PrintConfig.cpp:1961 -#: src/libslic3r/PrintConfig.cpp:2459 -msgid "°" -msgstr "°" - -#: src/libslic3r/PrintConfig.cpp:176 -msgid "Bridges fan speed" -msgstr "브릿지 팬 속도" - -#: src/libslic3r/PrintConfig.cpp:177 -msgid "This fan speed is enforced during all bridges and overhangs." -msgstr "이 팬 속도는 모든 브릿지 및 오버행 중에 적용됩니다." - -#: src/libslic3r/PrintConfig.cpp:178 src/libslic3r/PrintConfig.cpp:744 src/libslic3r/PrintConfig.cpp:1153 -#: src/libslic3r/PrintConfig.cpp:1216 src/libslic3r/PrintConfig.cpp:1461 src/libslic3r/PrintConfig.cpp:2258 -#: src/libslic3r/PrintConfig.cpp:2498 -msgid "%" -msgstr "%" - -#: src/libslic3r/PrintConfig.cpp:185 -msgid "Bridge flow ratio" -msgstr "브릿지 유량(flow)값" - -#: src/libslic3r/PrintConfig.cpp:187 -msgid "" -"This factor affects the amount of plastic for bridging. You can decrease it slightly to pull the extrudates " -"and prevent sagging, although default settings are usually good and you should experiment with cooling (use a " -"fan) before tweaking this." -msgstr "" -"이 요인은 브리징을위한 플라스틱의 양에 영향을 미칩니다. 압출 성형물을 잡아 당겨 처짐을 방지하기 위해 약간 줄" -"일 수 있지만 기본 설정은 일반적으로 좋지만이 문제를 해결하기 전에 냉각 (팬 사용)을 시도해야합니다." - -#: src/libslic3r/PrintConfig.cpp:197 -msgid "Bridges" -msgstr "브릿지(Bridges)" - -#: src/libslic3r/PrintConfig.cpp:199 -msgid "Speed for printing bridges." -msgstr "브릿지 인쇄 속도." - -#: src/libslic3r/PrintConfig.cpp:200 src/libslic3r/PrintConfig.cpp:576 src/libslic3r/PrintConfig.cpp:584 -#: src/libslic3r/PrintConfig.cpp:593 src/libslic3r/PrintConfig.cpp:601 src/libslic3r/PrintConfig.cpp:628 -#: src/libslic3r/PrintConfig.cpp:647 src/libslic3r/PrintConfig.cpp:873 src/libslic3r/PrintConfig.cpp:1000 -#: src/libslic3r/PrintConfig.cpp:1078 src/libslic3r/PrintConfig.cpp:1098 src/libslic3r/PrintConfig.cpp:1111 -#: src/libslic3r/PrintConfig.cpp:1122 src/libslic3r/PrintConfig.cpp:1175 src/libslic3r/PrintConfig.cpp:1234 -#: src/libslic3r/PrintConfig.cpp:1362 src/libslic3r/PrintConfig.cpp:1536 src/libslic3r/PrintConfig.cpp:1545 -#: src/libslic3r/PrintConfig.cpp:1940 src/libslic3r/PrintConfig.cpp:2051 -msgid "mm/s" -msgstr "mm/s" - -#: src/libslic3r/PrintConfig.cpp:207 -msgid "Brim width" -msgstr "브림 폭" - -#: src/libslic3r/PrintConfig.cpp:208 -msgid "Horizontal width of the brim that will be printed around each object on the first layer." -msgstr "첫 번째 레이어의 각 객체 주위에 인쇄 될 가장자리의 가로 폭입니다." - -#: src/libslic3r/PrintConfig.cpp:215 -msgid "Clip multi-part objects" -msgstr "여러 파트 오브젝트 클립" - -#: src/libslic3r/PrintConfig.cpp:216 -msgid "" -"When printing multi-material objects, this settings will make slic3r to clip the overlapping object parts one " -"by the other (2nd part will be clipped by the 1st, 3rd part will be clipped by the 1st and 2nd etc)." -msgstr "" -"멀티 메터리얼(multi-material) 개체를 인쇄 할 때이 설정을 사용하면 겹치는 개체 파트를 서로 겹쳐서 잘라낼 수 있" -"습니다 (두 번째 부분은 첫 번째 부분에서 클리핑되며 세 번째 부분은 첫 번째 및 두 번째 부분에서 잘립니다)." - -#: src/libslic3r/PrintConfig.cpp:223 -msgid "Colorprint height" -msgstr "컬러 인쇄 높이" - -#: src/libslic3r/PrintConfig.cpp:224 -msgid "Heights at which a filament change is to occur. " -msgstr "필라멘트 체인지가 발생 하는 높이. " - -#: src/libslic3r/PrintConfig.cpp:234 -msgid "Compatible printers condition" -msgstr "호환 가능한 프린터 조건" - -#: src/libslic3r/PrintConfig.cpp:235 -msgid "" -"A boolean expression using the configuration values of an active printer profile. If this expression " -"evaluates to true, this profile is considered compatible with the active printer profile." -msgstr "" -"활성 프린터 프로파일의 구성 값을 사용하는 부울 표현식. 이 표현식이 true로 평가되면이 프로필은 활성 프린터 프로" -"필과 호환되는 것으로 간주됩니다." - -#: src/libslic3r/PrintConfig.cpp:249 -msgid "Compatible print profiles condition" -msgstr "호환 되는 인쇄 프로 파일 조건" - -#: src/libslic3r/PrintConfig.cpp:250 -msgid "" -"A boolean expression using the configuration values of an active print profile. If this expression evaluates " -"to true, this profile is considered compatible with the active print profile." -msgstr "" -"활성 인쇄 프로 파일의 구성 값을 사용하는 부울식입니다. 이 식이 true로 평가 되면, 이 프로필이 활성 인쇄 프로필" -"과 호환 되는 것으로 간주 됩니다." - -#: src/libslic3r/PrintConfig.cpp:267 -msgid "Complete individual objects" -msgstr "개별 개체 완성" - -#: src/libslic3r/PrintConfig.cpp:268 -msgid "" -"When printing multiple objects or copies, this feature will complete each object before moving onto next one " -"(and starting it from its bottom layer). This feature is useful to avoid the risk of ruined prints. Slic3r " -"should warn and prevent you from extruder collisions, but beware." -msgstr "" -"여러 객체 또는 사본을 인쇄 할 때이 객체는 다음 객체로 이동하기 전에 각 객체를 완성합니다 (맨 아래 레이어에서 " -"시작). 이 기능은 인쇄물이 망가지는 위험을 피할 때 유용합니다. Slic3r은 압출기 충돌을 경고하고 예방해야하지만 " -"조심하십시오." - -#: src/libslic3r/PrintConfig.cpp:276 -msgid "Enable auto cooling" -msgstr "자동 냉각 사용" - -#: src/libslic3r/PrintConfig.cpp:277 -msgid "" -"This flag enables the automatic cooling logic that adjusts print speed and fan speed according to layer " -"printing time." -msgstr "이 플래그는 레이어 인쇄 시간에 따라 인쇄 속도와 팬 속도를 조정하는 자동 냉각 논리를 활성화합니다." - -#: src/libslic3r/PrintConfig.cpp:282 -msgid "Cooling tube position" -msgstr "냉각 튜브 위치" - -#: src/libslic3r/PrintConfig.cpp:283 -msgid "Distance of the center-point of the cooling tube from the extruder tip " -msgstr "압출기 팁에서 냉각 튜브의 중심점까지의 거리 " - -#: src/libslic3r/PrintConfig.cpp:290 -msgid "Cooling tube length" -msgstr "냉각 튜브 길이" - -#: src/libslic3r/PrintConfig.cpp:291 -msgid "Length of the cooling tube to limit space for cooling moves inside it " -msgstr "내부의 냉각 이동을 위해 공간을 제한하는 냉각 튜브의 길이 " - -#: src/libslic3r/PrintConfig.cpp:299 -msgid "" -"This is the acceleration your printer will be reset to after the role-specific acceleration values are used " -"(perimeter/infill). Set zero to prevent resetting acceleration at all." -msgstr "" -"역할 별 가속도 값이 사용 된 후에 프린터가 재설정되는 속도입니다 (둘레 / 충전). 가속을 전혀 재설정하지 않으려" -"면 0으로 설정하십시오." - -#: src/libslic3r/PrintConfig.cpp:308 -msgid "Default filament profile" -msgstr "기본 필라멘트 프로파일" - -#: src/libslic3r/PrintConfig.cpp:309 -msgid "" -"Default filament profile associated with the current printer profile. On selection of the current printer " -"profile, this filament profile will be activated." -msgstr "" -"현재 프린터 프로파일과 연관된 기본 필라멘트 프로파일. 현재 프린터 프로파일을 선택하면 이 필라멘트 프로파일이 " -"활성화됩니다." - -#: src/libslic3r/PrintConfig.cpp:315 -msgid "Default print profile" -msgstr "기본 인쇄 프로파일" - -#: src/libslic3r/PrintConfig.cpp:316 src/libslic3r/PrintConfig.cpp:2337 src/libslic3r/PrintConfig.cpp:2348 -msgid "" -"Default print profile associated with the current printer profile. On selection of the current printer " -"profile, this print profile will be activated." -msgstr "" -"현재 프린터 프로파일과 연관된 기본 인쇄 프로파일. 현재 프린터 프로파일을 선택하면이 인쇄 프로파일이 활성화됩니" -"다." - -#: src/libslic3r/PrintConfig.cpp:322 -msgid "Disable fan for the first" -msgstr "첫 번째 팬 사용 중지" - -#: src/libslic3r/PrintConfig.cpp:323 -msgid "" -"You can set this to a positive value to disable fan at all during the first layers, so that it does not make " -"adhesion worse." -msgstr "" -"이 값을 양수 값으로 설정하면 첫 번째 레이어에서 팬을 사용하지 않도록 설정하여 접착력을 악화시키지 않습니다." - -#: src/libslic3r/PrintConfig.cpp:325 src/libslic3r/PrintConfig.cpp:945 src/libslic3r/PrintConfig.cpp:1434 -#: src/libslic3r/PrintConfig.cpp:1619 src/libslic3r/PrintConfig.cpp:1680 src/libslic3r/PrintConfig.cpp:1843 -#: src/libslic3r/PrintConfig.cpp:1888 -msgid "layers" -msgstr "레이어" - -#: src/libslic3r/PrintConfig.cpp:332 -msgid "Don't support bridges" -msgstr "서포트와 브릿지를 사용하지 않음" - -#: src/libslic3r/PrintConfig.cpp:334 -msgid "Experimental option for preventing support material from being generated under bridged areas." -msgstr "브릿지 영역 아래에 서포팅 재료가 생성되는 것을 방지하기위한 실험적 옵션." - -#: src/libslic3r/PrintConfig.cpp:340 -msgid "Distance between copies" -msgstr "복사본 간 거리" - -#: src/libslic3r/PrintConfig.cpp:341 -msgid "Distance used for the auto-arrange feature of the plater." -msgstr "플래터(plater)의 자동 정렬 기능에 사용되는 거리입니다." - -#: src/libslic3r/PrintConfig.cpp:348 -msgid "Elephant foot compensation" -msgstr "코끼리 발(Elephant foot) 보상값" - -#: src/libslic3r/PrintConfig.cpp:350 -msgid "" -"The first layer will be shrunk in the XY plane by the configured value to compensate for the 1st layer squish " -"aka an Elephant Foot effect." -msgstr "" -"첫 번째 레이어는 구성 요소 값에 따라 XY 평면에서 수축되어 일층 스 퀴시 코끼리발(Elephant Foot) 효과를 보완합니" -"다." - -#: src/libslic3r/PrintConfig.cpp:359 -msgid "" -"This end procedure is inserted at the end of the output file. Note that you can use placeholder variables for " -"all Slic3r settings." -msgstr "" -"이 종료 절차는 출력 파일의 끝에 삽입된다. 모든 Slic3r 설정에 자리 표시자 변수를 사용할 수 있다는 점에 유의하십" -"시오." - -#: src/libslic3r/PrintConfig.cpp:369 -msgid "" -"This end procedure is inserted at the end of the output file, before the printer end gcode. Note that you can " -"use placeholder variables for all Slic3r settings. If you have multiple extruders, the gcode is processed in " -"extruder order." -msgstr "" -"이 종료 절차는 출력 파일의 끝에 프린터 끝 코드 앞에 삽입된다. 모든 Slic3r 설정에 자리 표시자 변수를 사용할 수 " -"있다는 점에 유의하십시오. 여러 개의 압출부가 있는 경우, 그 코드는 압출 순서대로 처리된다." - -#: src/libslic3r/PrintConfig.cpp:379 -msgid "Ensure vertical shell thickness" -msgstr "수직 쉘(shell) 두께 확인" - -#: src/libslic3r/PrintConfig.cpp:381 -msgid "" -"Add solid infill near sloping surfaces to guarantee the vertical shell thickness (top+bottom solid layers)." -msgstr "경사 표면 근처에 솔리드 인필을 추가하여 수직 셸 두께(상단+하단 솔리드 레이어)를 보장하십시오." - -#: src/libslic3r/PrintConfig.cpp:387 -msgid "Top fill pattern" -msgstr "상단 채우기 패턴" - -#: src/libslic3r/PrintConfig.cpp:389 -msgid "Fill pattern for top infill. This only affects the top visible layer, and not its adjacent solid shells." -msgstr "상단 채우기의 채우기 패턴. 이는 인접 한 솔리드 쉘이 아니라 보이는 상위 레이어에만 영향을 줍니다." - -#: src/libslic3r/PrintConfig.cpp:397 src/libslic3r/PrintConfig.cpp:795 src/libslic3r/PrintConfig.cpp:1921 -msgid "Rectilinear" -msgstr "직선면(Rectilinear)" - -#: src/libslic3r/PrintConfig.cpp:398 src/libslic3r/PrintConfig.cpp:801 -msgid "Concentric" -msgstr "동심원(Concentric)" - -#: src/libslic3r/PrintConfig.cpp:399 src/libslic3r/PrintConfig.cpp:805 -msgid "Hilbert Curve" -msgstr "힐버트 곡선(Hilbert Curve)" - -#: src/libslic3r/PrintConfig.cpp:400 src/libslic3r/PrintConfig.cpp:806 -msgid "Archimedean Chords" -msgstr "아르키메데우스(Archimedean Chords)" - -#: src/libslic3r/PrintConfig.cpp:401 src/libslic3r/PrintConfig.cpp:807 -msgid "Octagram Spiral" -msgstr "옥타그램 나선(Octagram Spiral)" - -#: src/libslic3r/PrintConfig.cpp:408 -msgid "Bottom fill pattern" -msgstr "아래쪽 채우기 패턴" - -#: src/libslic3r/PrintConfig.cpp:409 -msgid "" -"Fill pattern for bottom infill. This only affects the bottom external visible layer, and not its adjacent " -"solid shells." -msgstr "" -"하단 채우기의 채우기 패턴. 이는 인접 한 솔리드 쉘이 아니라 아래쪽에 보이는 외부 레이어에만 영향을 줍니다." - -#: src/libslic3r/PrintConfig.cpp:414 src/libslic3r/PrintConfig.cpp:424 -msgid "External perimeters" -msgstr "외측 둘레" - -#: src/libslic3r/PrintConfig.cpp:416 -msgid "" -"Set this to a non-zero value to set a manual extrusion width for external perimeters. If left zero, default " -"extrusion width will be used if set, otherwise 1.125 x nozzle diameter will be used. If expressed as " -"percentage (for example 200%), it will be computed over layer height." -msgstr "" -"외부 경계에 대한 수동 압출 폭을 설정하려면 이 값을 0이 아닌 값으로 설정하십시오. 0인 경우 기본 압출 너비가 사" -"용되며, 그렇지 않으면 1.125 x 노즐 직경이 사용된다. 백분율(예: 200%)로 표현되는 경우, 레이어 높이에 걸쳐 계산" -"된다." - -#: src/libslic3r/PrintConfig.cpp:419 src/libslic3r/PrintConfig.cpp:834 src/libslic3r/PrintConfig.cpp:966 -#: src/libslic3r/PrintConfig.cpp:1353 src/libslic3r/PrintConfig.cpp:1691 src/libslic3r/PrintConfig.cpp:1864 -#: src/libslic3r/PrintConfig.cpp:2022 -msgid "mm or % (leave 0 for default)" -msgstr "mm 또는 %(기본값의 경우 0으로 유지)" - -#: src/libslic3r/PrintConfig.cpp:426 -msgid "" -"This separate setting will affect the speed of external perimeters (the visible ones). If expressed as " -"percentage (for example: 80%) it will be calculated on the perimeters speed setting above. Set to zero for " -"auto." -msgstr "" -"이 별도의 설정은 외부 경계선(시각적 경계선)의 속도에 영향을 미친다. 백분율(예: 80%)로 표현되는 경우 위의 " -"Perimeter 속도 설정에 따라 계산된다. 자동을 위해 0으로 설정한다." - -#: src/libslic3r/PrintConfig.cpp:429 src/libslic3r/PrintConfig.cpp:855 src/libslic3r/PrintConfig.cpp:1650 -#: src/libslic3r/PrintConfig.cpp:1701 src/libslic3r/PrintConfig.cpp:1907 src/libslic3r/PrintConfig.cpp:2034 -msgid "mm/s or %" -msgstr "mm/s 또는 %" - -#: src/libslic3r/PrintConfig.cpp:436 -msgid "External perimeters first" -msgstr "외부 경계선 먼저" - -#: src/libslic3r/PrintConfig.cpp:438 -msgid "" -"Print contour perimeters from the outermost one to the innermost one instead of the default inverse order." -msgstr "" -"기본 역순 대신 가장 바깥쪽부터 가장 안쪽까지 윤곽선을 인쇄하십시오. 타겟 TTS복사하기번역 저장번역 저장번역 수" -"정." - -#: src/libslic3r/PrintConfig.cpp:444 -msgid "Extra perimeters if needed" -msgstr "필요한 경우 추가 둘레" - -#: src/libslic3r/PrintConfig.cpp:446 -#, no-c-format -msgid "" -"Add more perimeters when needed for avoiding gaps in sloping walls. Slic3r keeps adding perimeters, until " -"more than 70% of the loop immediately above is supported." -msgstr "" -"경사 벽의 틈을 피하기 위해 필요한 경우 더 많은 perimeter를 추가하십시오. 위의 루프의 70% 이상이 지지될 때까지 " -"Slic3r는 계속해서 perimeter를 추가한다." - -#: src/libslic3r/PrintConfig.cpp:456 -msgid "" -"The extruder to use (unless more specific extruder settings are specified). This value overrides perimeter " -"and infill extruders, but not the support extruders." -msgstr "" -"사용할 압출부(더 구체적인 압출부 설정이 지정되지 않은 경우) 이 값은 경계 및 압출부를 초과하지만 지원 압출자를 " -"주입하지는 않는다." - -#: src/libslic3r/PrintConfig.cpp:468 -msgid "" -"Set this to the vertical distance between your nozzle tip and (usually) the X carriage rods. In other words, " -"this is the height of the clearance cylinder around your extruder, and it represents the maximum depth the " -"extruder can peek before colliding with other printed objects." -msgstr "" -"이것을 노즐 팁과 (일반적으로) X 캐리지 로드 사이의 수직 거리로 설정하십시오. 다시 말하면, 이것은 당신의 압출" -"기 주위의 틈새 실린더의 높이이며, 그것은 다른 인쇄된 물체와 충돌하기 전에 압출기가 엿볼 수 있는 최대 깊이를 나" -"타낸다." - -#: src/libslic3r/PrintConfig.cpp:478 -msgid "Radius" -msgstr "반지름" - -#: src/libslic3r/PrintConfig.cpp:479 -msgid "" -"Set this to the clearance radius around your extruder. If the extruder is not centered, choose the largest " -"value for safety. This setting is used to check for collisions and to display the graphical preview in the " -"plater." -msgstr "" -"이것을 당신의 압출기 주변의 간극 반경으로 설정하시오. 압출부가 중앙에 있지 않으면 안전을 위해 가장 큰 값을 선" -"택하십시오. 이 설정은 충돌 여부를 확인하고 플래터에 그래픽 미리 보기를 표시하기 위해 사용된다." - -#: src/libslic3r/PrintConfig.cpp:489 -msgid "Extruder Color" -msgstr "익스트루더 컬러" - -#: src/libslic3r/PrintConfig.cpp:490 src/libslic3r/PrintConfig.cpp:550 -msgid "This is only used in the Slic3r interface as a visual help." -msgstr "이것은 시각적 도움말로 Slic3r 인터페이스에서만 사용된다." - -#: src/libslic3r/PrintConfig.cpp:496 -msgid "Extruder offset" -msgstr "익스트루더 오프셋" - -#: src/libslic3r/PrintConfig.cpp:497 -msgid "" -"If your firmware doesn't handle the extruder displacement you need the G-code to take it into account. This " -"option lets you specify the displacement of each extruder with respect to the first one. It expects positive " -"coordinates (they will be subtracted from the XY coordinate)." -msgstr "" -"펌웨어가 압출기 위치 변경을 처리하지 못하면 G 코드를 고려해야합니다. 이 옵션을 사용하면 첫 번째 것에 대한 각 " -"압출기의 변위를 지정할 수 있습니다. 양의 좌표가 필요합니다 (XY 좌표에서 뺍니다)." - -#: src/libslic3r/PrintConfig.cpp:506 -msgid "Extrusion axis" -msgstr "압출 축" - -#: src/libslic3r/PrintConfig.cpp:507 -msgid "" -"Use this option to set the axis letter associated to your printer's extruder (usually E but some printers use " -"A)." -msgstr "" -"이 옵션을 사용하여 프린터의 압출기에 연결된 축 문자를 설정합니다 (보통 E이지만 일부 프린터는 A를 사용합니다)." - -#: src/libslic3r/PrintConfig.cpp:512 -msgid "Extrusion multiplier" -msgstr "압출 승수" - -#: src/libslic3r/PrintConfig.cpp:513 -msgid "" -"This factor changes the amount of flow proportionally. You may need to tweak this setting to get nice surface " -"finish and correct single wall widths. Usual values are between 0.9 and 1.1. If you think you need to change " -"this more, check filament diameter and your firmware E steps." -msgstr "" -"이 요소는 비례하여 유량의 양을 변경합니다. 멋진 서페이스 마무리와 단일 벽 너비를 얻기 위해이 설정을 조정해야 " -"할 수도 있습니다. 일반적인 값은 0.9와 1.1 사이입니다. 이 값을 더 변경해야한다고 판단되면 필라멘트 직경과 펌웨" -"어 E 단계를 확인하십시오." - -#: src/libslic3r/PrintConfig.cpp:521 -msgid "Default extrusion width" -msgstr "기본 압출 폭" - -#: src/libslic3r/PrintConfig.cpp:523 -msgid "" -"Set this to a non-zero value to allow a manual extrusion width. If left to zero, Slic3r derives extrusion " -"widths from the nozzle diameter (see the tooltips for perimeter extrusion width, infill extrusion width etc). " -"If expressed as percentage (for example: 230%), it will be computed over layer height." -msgstr "" -"수동 압출 폭을 허용하려면이 값을 0이 아닌 값으로 설정하십시오. 0으로 남겨두면 Slic3r은 노즐 직경에서 압출 폭" -"을 도출합니다 (주변 압출 폭, 성형 압출 폭 등의 툴팁 참조). 백분율로 표시되는 경우 (예 : 230 %) 레이어 높이를 " -"기준으로 계산됩니다." - -#: src/libslic3r/PrintConfig.cpp:527 -msgid "mm or % (leave 0 for auto)" -msgstr "mm 또는 % (자동으로 0을 유지)" - -#: src/libslic3r/PrintConfig.cpp:532 -msgid "Keep fan always on" -msgstr "항상 팬 켜기" - -#: src/libslic3r/PrintConfig.cpp:533 -msgid "" -"If this is enabled, fan will never be disabled and will be kept running at least at its minimum speed. Useful " -"for PLA, harmful for ABS." -msgstr "" -"이 기능을 사용하면 팬이 비활성화되지 않으며 최소한 최소 속도로 계속 회전합니다. PLA에 유용하며 ABS에 해롭다." - -#: src/libslic3r/PrintConfig.cpp:538 -msgid "Enable fan if layer print time is below" -msgstr "레이어 인쇄 시간이 미만인 경우 팬 활성화" - -#: src/libslic3r/PrintConfig.cpp:539 -msgid "" -"If layer print time is estimated below this number of seconds, fan will be enabled and its speed will be " -"calculated by interpolating the minimum and maximum speeds." -msgstr "" -"레이어 인쇄 시간이이 초 미만으로 예상되는 경우 팬이 활성화되고 속도는 최소 및 최대 속도를 보간하여 계산됩니다." - -#: src/libslic3r/PrintConfig.cpp:541 src/libslic3r/PrintConfig.cpp:1637 -msgid "approximate seconds" -msgstr "근사치 초" - -#: src/libslic3r/PrintConfig.cpp:549 -msgid "Color" -msgstr "색상" - -#: src/libslic3r/PrintConfig.cpp:555 -msgid "Filament notes" -msgstr "필라멘트 메모" - -#: src/libslic3r/PrintConfig.cpp:556 -msgid "You can put your notes regarding the filament here." -msgstr "여기에 필라멘트에 관한 메모를 넣을 수 있다." - -#: src/libslic3r/PrintConfig.cpp:564 src/libslic3r/PrintConfig.cpp:1181 -msgid "Max volumetric speed" -msgstr "최대 체적 속도" - -#: src/libslic3r/PrintConfig.cpp:565 -msgid "" -"Maximum volumetric speed allowed for this filament. Limits the maximum volumetric speed of a print to the " -"minimum of print and filament volumetric speed. Set to zero for no limit." -msgstr "" -"이 필라멘트에 허용되는 최대 체적 속도. 인쇄물의 최대 체적 속도를 인쇄 및 필라멘트 체적 속도 최소로 제한한다. " -"제한 없음에 대해 0으로 설정하십시오." - -#: src/libslic3r/PrintConfig.cpp:568 src/libslic3r/PrintConfig.cpp:1184 -msgid "mm³/s" -msgstr "밀리미터 ³/s" - -#: src/libslic3r/PrintConfig.cpp:574 -msgid "Loading speed" -msgstr "로딩 속도" - -#: src/libslic3r/PrintConfig.cpp:575 -msgid "Speed used for loading the filament on the wipe tower. " -msgstr "와이퍼 탑(wipe)에 필라멘트를 장착하는 데 사용되는 속도. " - -#: src/libslic3r/PrintConfig.cpp:582 -msgid "Loading speed at the start" -msgstr "시작시 로딩 속도" - -#: src/libslic3r/PrintConfig.cpp:583 -msgid "Speed used at the very beginning of loading phase. " -msgstr "로딩 단계의 시작에 사용 되는 속도. " - -#: src/libslic3r/PrintConfig.cpp:590 -msgid "Unloading speed" -msgstr "언로딩 스피드" - -#: src/libslic3r/PrintConfig.cpp:591 -msgid "" -"Speed used for unloading the filament on the wipe tower (does not affect initial part of unloading just " -"after ramming). " -msgstr "" -"와이퍼 타워에서 필라멘트를 언로드하는 데 사용되는 속도(램핑 후 바로 언로딩의 초기 부분에는 영향을 주지 않음). " - -#: src/libslic3r/PrintConfig.cpp:599 -msgid "Unloading speed at the start" -msgstr "시작 시 언로드 속도" - -#: src/libslic3r/PrintConfig.cpp:600 -msgid "Speed used for unloading the tip of the filament immediately after ramming. " -msgstr "속도는 레밍 직후 필라멘트의 팁을 언로딩 하는 데 사용 됩니다. " - -#: src/libslic3r/PrintConfig.cpp:607 -msgid "Delay after unloading" -msgstr "언로드 후 딜레이" - -#: src/libslic3r/PrintConfig.cpp:608 -msgid "" -"Time to wait after the filament is unloaded. May help to get reliable toolchanges with flexible materials " -"that may need more time to shrink to original dimensions. " -msgstr "" -"필라멘트를 내린 후 기다리는 시간. 원래 치수로 축소하는 데 더 많은 시간이 필요할 수있는 유연한 재료로 신뢰할 수" -"있는 공구 교환을 얻을 수 있습니다. " - -#: src/libslic3r/PrintConfig.cpp:617 -msgid "Number of cooling moves" -msgstr "쿨링 이동 숫자" - -#: src/libslic3r/PrintConfig.cpp:618 -msgid "" -"Filament is cooled by being moved back and forth in the cooling tubes. Specify desired number of these moves " -msgstr "필라멘트는 냉각 튜브에서 앞뒤로 움직여 냉각됩니다. 원하는 이동 숫자 지정 " - -#: src/libslic3r/PrintConfig.cpp:626 -msgid "Speed of the first cooling move" -msgstr "첫 번째 냉각 이동 속도" - -#: src/libslic3r/PrintConfig.cpp:627 -msgid "Cooling moves are gradually accelerating beginning at this speed. " -msgstr "냉각 속도가 서서히 빨라지고 있습니다. " - -#: src/libslic3r/PrintConfig.cpp:634 -msgid "Minimal purge on wipe tower" -msgstr "와이프(wipe) 탑의 최소 퍼지" - -#: src/libslic3r/PrintConfig.cpp:635 -msgid "" -"After a tool change, the exact position of the newly loaded filament inside the nozzle may not be known, and " -"the filament pressure is likely not yet stable. Before purging the print head into an infill or a sacrificial " -"object, Slic3r will always prime this amount of material into the wipe tower to produce successive infill or " -"sacrificial object extrusions reliably." -msgstr "" -"공구가 변경 된 후 노즐 내부에 새로 로드 된 필라멘트의 정확한 위치를 알 수 없으며, 필라멘트 압력이 아직 안정적" -"이지 않을 수 있습니다. 프린트 헤드를 인필 또는 희생(sacrificial) 객체로 소거 하기 전에 Slic3r는 항상이 양의 재" -"료를 와이프 탑에 넣어 연속적인 채우기 또는 희생(sacrificial) 객체 돌출을 안정적으로 생성 합니다." - -#: src/libslic3r/PrintConfig.cpp:639 -msgid "mm³" -msgstr "mm ³" - -#: src/libslic3r/PrintConfig.cpp:645 -msgid "Speed of the last cooling move" -msgstr "마지막 냉각 이동 속도" - -#: src/libslic3r/PrintConfig.cpp:646 -msgid "Cooling moves are gradually accelerating towards this speed. " -msgstr "냉각은 이 속도쪽으로 점차 가속화되고 있습니다. " - -#: src/libslic3r/PrintConfig.cpp:653 -msgid "Filament load time" -msgstr "필라멘트 로드 시간" - -#: src/libslic3r/PrintConfig.cpp:654 -msgid "" -"Time for the printer firmware (or the Multi Material Unit 2.0) to load a new filament during a tool change " -"(when executing the T code). This time is added to the total print time by the G-code time estimator." -msgstr "" -"프린터 펌웨어 (또는 MMU 2.0)가 공구를 변경하는 동안(T 코드를 실행할 때) 새필라멘트를 로드하는 시간입니다. 이 " -"시간은 G 코드 시간 추정기에 의해 총 인쇄 시간에 추가 됩니다." - -#: src/libslic3r/PrintConfig.cpp:661 -msgid "Ramming parameters" -msgstr "래밍 파라미터" - -#: src/libslic3r/PrintConfig.cpp:662 -msgid "This string is edited by RammingDialog and contains ramming specific parameters " -msgstr "이 문자열은 RammingDialog에 의해 편집되고 램밍 특정 매개 변수를 포함합니다 " - -#: src/libslic3r/PrintConfig.cpp:668 -msgid "Filament unload time" -msgstr "필라멘트 언로드 시간" - -#: src/libslic3r/PrintConfig.cpp:669 -msgid "" -"Time for the printer firmware (or the Multi Material Unit 2.0) to unload a filament during a tool change " -"(when executing the T code). This time is added to the total print time by the G-code time estimator." -msgstr "" -"프린터 펌웨어 (또는 MMU2.0)가 공구 교환 중에 필라멘트를 언로드하기 위한 시간입니다 (T 코드를 실행할 때). 이 시" -"간은 G 코드 시간추정기에 의해 총 인쇄 시간에 추가 됩니다." - -#: src/libslic3r/PrintConfig.cpp:677 -msgid "" -"Enter your filament diameter here. Good precision is required, so use a caliper and do multiple measurements " -"along the filament, then compute the average." -msgstr "" -"여기에 필라멘트 직경을 입력하십시오. 정밀도가 필요하므로 캘리퍼를 사용하여 필라멘트를 따라 여러 번 측정 한 다" -"음 평균을 계산하십시오." - -#: src/libslic3r/PrintConfig.cpp:684 -msgid "Density" -msgstr "밀도" - -#: src/libslic3r/PrintConfig.cpp:685 -msgid "" -"Enter your filament density here. This is only for statistical information. A decent way is to weigh a known " -"length of filament and compute the ratio of the length to volume. Better is to calculate the volume directly " -"through displacement." -msgstr "" -"여기서 필라멘트 밀도를 입력하십시오. 이것은 통계 정보 용입니다. 괜찮은 방법은 알려진 길이의 필라멘트의 무게를 " -"측정하고 길이와 볼륨의 비율을 계산하는 것입니다. 변위를 통해 직접적으로 부피를 계산하는 것이 더 좋습니다." - -#: src/libslic3r/PrintConfig.cpp:688 -msgid "g/cm³" -msgstr "g/cm³" - -#: src/libslic3r/PrintConfig.cpp:693 -msgid "Filament type" -msgstr "필라멘트 타입" - -#: src/libslic3r/PrintConfig.cpp:694 -msgid "The filament material type for use in custom G-codes." -msgstr "사용자 지정 G 코드에 사용할 필라멘트재료 유형입니다." - -#: src/libslic3r/PrintConfig.cpp:710 -msgid "Soluble material" -msgstr "수용성 재료" - -#: src/libslic3r/PrintConfig.cpp:711 -msgid "Soluble material is most likely used for a soluble support." -msgstr "수용성 재료눈 물에 녹는 서포트에 가장 많이 사용된다." - -#: src/libslic3r/PrintConfig.cpp:717 -msgid "Enter your filament cost per kg here. This is only for statistical information." -msgstr "필라멘트(kg당) 비용을 여기에 입력하십시오. 통계를 내기 위해서 입니다." - -#: src/libslic3r/PrintConfig.cpp:718 -msgid "money/kg" -msgstr "원(\\)/kg" - -#: src/libslic3r/PrintConfig.cpp:727 -msgid "Fill angle" -msgstr "채움 각도" - -#: src/libslic3r/PrintConfig.cpp:729 -msgid "" -"Default base angle for infill orientation. Cross-hatching will be applied to this. Bridges will be infilled " -"using the best direction Slic3r can detect, so this setting does not affect them." -msgstr "" -"본 오리엔테이션 방향의 기본 각도입니다. 해칭이 적용될 것입니다. Slic3r이 감지 할 수있는 최상의 방향을 사용하" -"여 브릿징이 채워지므로이 설정은 영향을 미치지 않습니다." - -#: src/libslic3r/PrintConfig.cpp:741 -msgid "Fill density" -msgstr "채우기(fill) 밀도" - -#: src/libslic3r/PrintConfig.cpp:743 -msgid "Density of internal infill, expressed in the range 0% - 100%." -msgstr "0 % - 100 % 범위로 표현 된 내부 채움(infill)의 밀도." - -#: src/libslic3r/PrintConfig.cpp:778 -msgid "Fill pattern" -msgstr "채우기(fill) 패턴" - -#: src/libslic3r/PrintConfig.cpp:780 -msgid "Fill pattern for general low-density infill." -msgstr "일반 낮은 밀도 채움의 패턴." - -#: src/libslic3r/PrintConfig.cpp:796 -msgid "Grid" -msgstr "그리드(Grid)" - -#: src/libslic3r/PrintConfig.cpp:797 -msgid "Triangles" -msgstr "삼각형(Triangles)" - -#: src/libslic3r/PrintConfig.cpp:798 -msgid "Stars" -msgstr "별(Stars)" - -#: src/libslic3r/PrintConfig.cpp:799 -msgid "Cubic" -msgstr "큐빅" - -#: src/libslic3r/PrintConfig.cpp:800 -msgid "Line" -msgstr "선(Line)" - -#: src/libslic3r/PrintConfig.cpp:802 src/libslic3r/PrintConfig.cpp:1923 -msgid "Honeycomb" -msgstr "벌집" - -#: src/libslic3r/PrintConfig.cpp:803 -msgid "3D Honeycomb" -msgstr "3D 벌집" - -#: src/libslic3r/PrintConfig.cpp:804 -msgid "Gyroid" -msgstr "자이로이드(Gyroid)" - -#: src/libslic3r/PrintConfig.cpp:811 src/libslic3r/PrintConfig.cpp:820 src/libslic3r/PrintConfig.cpp:828 -#: src/libslic3r/PrintConfig.cpp:861 -msgid "First layer" -msgstr "첫 레이어" - -#: src/libslic3r/PrintConfig.cpp:812 -msgid "" -"This is the acceleration your printer will use for first layer. Set zero to disable acceleration control for " -"first layer." -msgstr "" -"이것은 프린터가 첫 번째 레이어에 사용할 가속도입니다. 0을 설정하면 첫 번째 레이어에 대한 가속 제어가 사용되지 " -"않습니다." - -#: src/libslic3r/PrintConfig.cpp:821 -msgid "" -"Heated build plate temperature for the first layer. Set this to zero to disable bed temperature control " -"commands in the output." -msgstr "" -"첫 번째 레이어에 대한 빌드 플레이트 온도를 가열. 이 값을 0으로 설정하면 출력에서 ​​베드 온도 제어 명령을 비활성" -"화합니다." - -#: src/libslic3r/PrintConfig.cpp:830 -msgid "" -"Set this to a non-zero value to set a manual extrusion width for first layer. You can use this to force " -"fatter extrudates for better adhesion. If expressed as percentage (for example 120%) it will be computed over " -"first layer height. If set to zero, it will use the default extrusion width." -msgstr "" -"첫 번째 레이어의 수동 압출 폭을 설정하려면이 값을 0이 아닌 값으로 설정합니다. 이 방법을 사용하면보다 우수한 접" -"착력을 위해 더 두꺼운 압출 성형물을 만들 수 있습니다. 백분율 (예 : 120 %)로 표현하면 첫 번째 레이어 높이를 기" -"준으로 계산됩니다. 0으로 설정하면 기본 압출 폭이 사용됩니다." - -#: src/libslic3r/PrintConfig.cpp:840 -msgid "First layer height" -msgstr "첫 레이어 높이" - -#: src/libslic3r/PrintConfig.cpp:842 -msgid "" -"When printing with very low layer heights, you might still want to print a thicker bottom layer to improve " -"adhesion and tolerance for non perfect build plates. This can be expressed as an absolute value or as a " -"percentage (for example: 150%) over the default layer height." -msgstr "" -"매우 낮은 층의 높이로 인쇄할 때, 당신은 여전히 완벽하지 않은 빌드 플레이트의 부착력과 허용오차를 개선하기 위" -"해 더 두꺼운 바닥 층을 인쇄하기를 원할 수 있다. 이것은 절대값 또는 기본 계층 높이에 대한 백분율(예: 150%)로 표" -"시할 수 있다." - -#: src/libslic3r/PrintConfig.cpp:846 src/libslic3r/PrintConfig.cpp:991 src/libslic3r/PrintConfig.cpp:1796 -msgid "mm or %" -msgstr "mm/s 또는 %" - -#: src/libslic3r/PrintConfig.cpp:851 -msgid "First layer speed" -msgstr "첫 레이어 속도" - -#: src/libslic3r/PrintConfig.cpp:852 -msgid "" -"If expressed as absolute value in mm/s, this speed will be applied to all the print moves of the first layer, " -"regardless of their type. If expressed as a percentage (for example: 40%) it will scale the default speeds." -msgstr "" -"절대값(mm/s)으로 표현되는 경우, 이 속도는 유형에 관계없이 첫 번째 층의 모든 인쇄 이동에 적용된다. 백분율(예: " -"40%)로 표현되는 경우 기본 속도를 스케일링한다." - -#: src/libslic3r/PrintConfig.cpp:862 -msgid "" -"Extruder temperature for first layer. If you want to control temperature manually during print, set this to " -"zero to disable temperature control commands in the output file." -msgstr "" -"첫 번째 층의 외부 온도. 인쇄 중에 온도를 수동으로 제어하려면 출력 파일에서 온도 제어 명령을 사용하지 않으려면 " -"이 값을 0으로 설정하십시오." - -#: src/libslic3r/PrintConfig.cpp:871 -msgid "" -"Speed for filling small gaps using short zigzag moves. Keep this reasonably low to avoid too much shaking and " -"resonance issues. Set zero to disable gaps filling." -msgstr "" -"짧은 지그재그로 작은 틈을 메우기 위한 속도. 너무 많은 진동과 공진 문제를 피하기 위해 이것을 합리적으로 낮게 유" -"지한다. 간격 채우기를 사용하지 않으려면 0을 설정하십시오." - -#: src/libslic3r/PrintConfig.cpp:879 -msgid "Verbose G-code" -msgstr "세부 G-코드" - -#: src/libslic3r/PrintConfig.cpp:880 -msgid "" -"Enable this to get a commented G-code file, with each line explained by a descriptive text. If you print from " -"SD card, the additional weight of the file could make your firmware slow down." -msgstr "" -"설명 텍스트로 설명되는 각 행과 함께 코멘트된 G-code 파일을 가져오려면 이 옵션을 선택하십시오. 만일 당신이 SD카" -"드로 인쇄한다면, 파일의 추가 무게로 인해 펌웨어의 속도가 느려질 수 있다." - -#: src/libslic3r/PrintConfig.cpp:887 -msgid "G-code flavor" -msgstr "G-code 형식" - -#: src/libslic3r/PrintConfig.cpp:888 -msgid "" -"Some G/M-code commands, including temperature control and others, are not universal. Set this option to your " -"printer's firmware to get a compatible output. The \"No extrusion\" flavor prevents Slic3r from exporting any " -"extrusion value at all." -msgstr "" -"온도 조절 등을 포함한 일부 G/M-코드 명령은 보편적이지 않습니다. 호환되는 출력을 얻으려면 보드에 적제된 프린터" -"의 펌웨어로 설정하십시오. \"압출 없음\" 형식은 Slic3r가 어떠한 압출 값도 출력하지 못하게 합니다." - -#: src/libslic3r/PrintConfig.cpp:911 -msgid "No extrusion" -msgstr "압출 없음" - -#: src/libslic3r/PrintConfig.cpp:918 -msgid "Label objects" -msgstr "레이블 개체" - -#: src/libslic3r/PrintConfig.cpp:924 -msgid "High extruder current on filament swap" -msgstr "필라멘트스왑에 높은 압출 기 전류" - -#: src/libslic3r/PrintConfig.cpp:925 -msgid "" -"It may be beneficial to increase the extruder motor current during the filament exchange sequence to allow " -"for rapid ramming feed rates and to overcome resistance when loading a filament with an ugly shaped tip." -msgstr "" -"필라멘트 교환 동안 압출기 모터 전류를 증가 시키는 것이 유리할 수 있으며, 이는 빠른 래밍 공급 속도를 가능 하게" -"하고, 불규칙한 모양의 필라멘트를 로딩할때 저항을 극복하기 위한것이다." - -#: src/libslic3r/PrintConfig.cpp:933 -msgid "" -"This is the acceleration your printer will use for infill. Set zero to disable acceleration control for " -"infill." -msgstr "이것은 당신 프린터의 채움 가속력이다. 주입에 대한 가속 제어를 비활성화하려면 0을 설정하십시오." - -#: src/libslic3r/PrintConfig.cpp:941 -msgid "Combine infill every" -msgstr "다음 시간마다 결합" - -#: src/libslic3r/PrintConfig.cpp:943 -msgid "" -"This feature allows to combine infill and speed up your print by extruding thicker infill layers while " -"preserving thin perimeters, thus accuracy." -msgstr "" -"이 기능은 인필을 결합하고 얇은 주변기기를 보존하면서 두꺼운 인필 층을 압출하여 인쇄 속도를 높일 수 있도록 하" -"여 정확도를 높인다." - -#: src/libslic3r/PrintConfig.cpp:946 -msgid "Combine infill every n layers" -msgstr "모든 n개 층을 채우기 위해 결합" - -#: src/libslic3r/PrintConfig.cpp:952 -msgid "Infill extruder" -msgstr "채움(Infill) 익스트루더" - -#: src/libslic3r/PrintConfig.cpp:954 -msgid "The extruder to use when printing infill." -msgstr "채움으로 사용할 익스트루더." - -#: src/libslic3r/PrintConfig.cpp:962 -msgid "" -"Set this to a non-zero value to set a manual extrusion width for infill. If left zero, default extrusion " -"width will be used if set, otherwise 1.125 x nozzle diameter will be used. You may want to use fatter " -"extrudates to speed up the infill and make your parts stronger. If expressed as percentage (for example 90%) " -"it will be computed over layer height." -msgstr "" -"채움에 수동 압출 폭을 설정하려면이 값을 0이 아닌 값으로 설정합니다. 0으로 설정하면 설정된 경우 기본 압출 폭이 " -"사용되고 그렇지 않으면 1.125 x 노즐 직경이 사용됩니다. 채움 속도를 높이고 부품을 더 강하게 만들려면보다 큰 압" -"출 성형물을 사용하는 것이 좋습니다. 백분율 (예 : 90 %)로 표현하면 레이어 높이를 기준으로 계산됩니다." - -#: src/libslic3r/PrintConfig.cpp:971 -msgid "Infill before perimeters" -msgstr "둘레보다 앞쪽에 채움" - -#: src/libslic3r/PrintConfig.cpp:972 -msgid "This option will switch the print order of perimeters and infill, making the latter first." -msgstr "이 옵션은 외부출력과 채움 인쇄 순서를 바꾸어, 후자를 먼저 만든다." - -#: src/libslic3r/PrintConfig.cpp:977 -msgid "Only infill where needed" -msgstr "필요한 경우 채음" - -#: src/libslic3r/PrintConfig.cpp:979 -msgid "" -"This option will limit infill to the areas actually needed for supporting ceilings (it will act as internal " -"support material). If enabled, slows down the G-code generation due to the multiple checks involved." -msgstr "" -"이 옵션은 천장 지원에 실제로 필요한 영역에만 적용된다(내부 서포트 재료 역할을 할 것이다). 활성화된 경우 관련" -"된 여러 번의 점검으로 인해 G-code 생성 속도를 늦춰라." - -#: src/libslic3r/PrintConfig.cpp:986 -msgid "Infill/perimeters overlap" -msgstr "채움/둘레 겹침(perimeters overlap)" - -#: src/libslic3r/PrintConfig.cpp:988 -msgid "" -"This setting applies an additional overlap between infill and perimeters for better bonding. Theoretically " -"this shouldn't be needed, but backlash might cause gaps. If expressed as percentage (example: 15%) it is " -"calculated over perimeter extrusion width." -msgstr "" -"이 설정은 더 나은 본딩을 위해 충전 및 둘레 사이에 추가 겹침을 적용합니다. 이론적으로 이것은 필요하지 않아야하" -"지만 백래시가 갭을 유발할 수 있습니다. 백분율 (예 : 15 %)로 표시되는 경우 경계 압출 폭을 기준으로 계산됩니다." - -#: src/libslic3r/PrintConfig.cpp:999 -msgid "Speed for printing the internal fill. Set to zero for auto." -msgstr "내부 채우기 인쇄 속도. 자동으로 0으로 설정하십시오." - -#: src/libslic3r/PrintConfig.cpp:1007 -msgid "Inherits profile" -msgstr "프로필 상속" - -#: src/libslic3r/PrintConfig.cpp:1008 -msgid "Name of the profile, from which this profile inherits." -msgstr "이 프로파일이 상속되는 프로파일의 이름." - -#: src/libslic3r/PrintConfig.cpp:1021 -msgid "Interface shells" -msgstr "인터페이스 셸(shells)" - -#: src/libslic3r/PrintConfig.cpp:1022 -msgid "" -"Force the generation of solid shells between adjacent materials/volumes. Useful for multi-extruder prints " -"with translucent materials or manual soluble support material." -msgstr "" -"인접 재료/볼륨 사이에 고체 쉘 생성을 강제하십시오. 반투명 재료 또는 수동 수용성 서포트 재료를 사용한 다중 압ㅊ" -"기 인쇄에 유용함." - -#: src/libslic3r/PrintConfig.cpp:1031 -msgid "" -"This custom code is inserted at every layer change, right after the Z move and before the extruder moves to " -"the first layer point. Note that you can use placeholder variables for all Slic3r settings as well as " -"[layer_num] and [layer_z]." -msgstr "" -"이 사용자 정의 코드는 Z 이동 직후와 압출부가 첫 번째 레이어 포인트로 이동하기 전에 모든 레이어 변경 시 삽입된" -"다. 모든 Slic3r 설정뿐만 아니라 [layer_num] 및 [layer_z]에 자리 표시자 변수를 사용할 수 있다는 점에 유의하십시" -"오." - -#: src/libslic3r/PrintConfig.cpp:1042 -msgid "Supports remaining times" -msgstr "남은 시간 지원" - -#: src/libslic3r/PrintConfig.cpp:1043 -msgid "" -"Emit M73 P[percent printed] R[remaining time in minutes] at 1 minute intervals into the G-code to let the " -"firmware show accurate remaining time. As of now only the Prusa i3 MK3 firmware recognizes M73. Also the i3 " -"MK3 firmware supports M73 Qxx Sxx for the silent mode." -msgstr "" -"G 코드에 1 분 간격으로 M73 P [퍼센트 인쇄] R을 방출하여 펌웨어가 정확한 잔여 시간을 표시 하도록 합니다. 현재" -"만 Prusa i3 MK3 펌웨어는 M73를 인식 하 고 있습니다. 또한 i3 MK3 펌웨어는 자동 모드에서 M73 Qxx Sxx를 지원 합니" -"다." - -#: src/libslic3r/PrintConfig.cpp:1063 -msgid "Supports stealth mode" -msgstr "자동 모드 지원" - -#: src/libslic3r/PrintConfig.cpp:1052 -msgid "Set silent mode for the G-code flavor" -msgstr "G-코드 특징에 대한 무음 모드 설정" - -#: src/libslic3r/PrintConfig.cpp:1075 -msgid "Maximum feedrate %1%" -msgstr "최대 공급 속도 %1%" - -#: src/libslic3r/PrintConfig.cpp:1078 -msgid "Maximum feedrate X" -msgstr "최대 이송 속도 X" - -#: src/libslic3r/PrintConfig.cpp:1079 -msgid "Maximum feedrate Y" -msgstr "최대 이송 속도 Y" - -#: src/libslic3r/PrintConfig.cpp:1080 -msgid "Maximum feedrate Z" -msgstr "최대 이송 속도 Z" - -#: src/libslic3r/PrintConfig.cpp:1081 -msgid "Maximum feedrate E" -msgstr "최대 이송 속도 E" - -#: src/libslic3r/PrintConfig.cpp:1077 -msgid "Maximum feedrate of the %1% axis" -msgstr "최대 공급 속도 of the %1% axis " - -#: src/libslic3r/PrintConfig.cpp:1096 -msgid "Maximum acceleration X" -msgstr "최대 가속도 X" - -#: src/libslic3r/PrintConfig.cpp:1097 -msgid "Maximum acceleration Y" -msgstr "최대 가속도 Y" - -#: src/libslic3r/PrintConfig.cpp:1098 -msgid "Maximum acceleration Z" -msgstr "최대 가속 Z" - -#: src/libslic3r/PrintConfig.cpp:1099 -msgid "Maximum acceleration E" -msgstr "최대 가속 E" - -#: src/libslic3r/PrintConfig.cpp:1087 -msgid "Maximum acceleration of the %1% axis" -msgstr "최대 가속도는 %1% 축" - -#: src/libslic3r/PrintConfig.cpp:1095 -msgid "Maximum jerk %1%" -msgstr "최대 저크(jerk) %1%" - -#: src/libslic3r/PrintConfig.cpp:1114 -msgid "Maximum jerk X" -msgstr "최대 저크(jerk) X" - -#: src/libslic3r/PrintConfig.cpp:1115 -msgid "Maximum jerk Y" -msgstr "최대 저크(jerk) Y" - -#: src/libslic3r/PrintConfig.cpp:1116 -msgid "Maximum jerk Z" -msgstr "최대 저크(jerk) Z" - -#: src/libslic3r/PrintConfig.cpp:1117 -msgid "Maximum jerk E" -msgstr "최대 저크(jerk) E" - -#: src/libslic3r/PrintConfig.cpp:1097 -msgid "Maximum jerk of the %1% axis" -msgstr "최대 저크는(jerk) %1% axis" - -#: src/libslic3r/PrintConfig.cpp:1108 src/libslic3r/PrintConfig.cpp:1110 -msgid "Minimum feedrate when extruding" -msgstr "압출시 최소 공급 속도" - -#: src/libslic3r/PrintConfig.cpp:1119 src/libslic3r/PrintConfig.cpp:1121 -msgid "Minimum travel feedrate" -msgstr "최소 이송 속도" - -#: src/libslic3r/PrintConfig.cpp:1130 src/libslic3r/PrintConfig.cpp:1132 -msgid "Maximum acceleration when extruding" -msgstr "압출시 최대 가속도" - -#: src/libslic3r/PrintConfig.cpp:1141 src/libslic3r/PrintConfig.cpp:1143 -msgid "Maximum acceleration when retracting" -msgstr "리트렉션 최대 가속도" - -#: src/libslic3r/PrintConfig.cpp:1151 src/libslic3r/PrintConfig.cpp:1160 -msgid "Max" -msgstr "최대" - -#: src/libslic3r/PrintConfig.cpp:1152 -msgid "This setting represents the maximum speed of your fan." -msgstr "이 설정은 팬의 최대 속도를 나타냅니다." - -#: src/libslic3r/PrintConfig.cpp:1161 -#, no-c-format -msgid "" -"This is the highest printable layer height for this extruder, used to cap the variable layer height and " -"support layer height. Maximum recommended layer height is 75% of the extrusion width to achieve reasonable " -"inter-layer adhesion. If set to 0, layer height is limited to 75% of the nozzle diameter." -msgstr "" -"이것은이 익스트루더의 가장 높은 인쇄 가능 층 높이이며, 가변 층 높이 및 지지층 높이를 캡하는 데 사용됩니다. 합" -"당한 층간 접착력을 얻기 위해 최대 권장 높이는 압출 폭의 75 %입니다. 0으로 설정하면 층 높이가 노즐 지름의 75 %" -"로 제한됩니다." - -#: src/libslic3r/PrintConfig.cpp:1171 -msgid "Max print speed" -msgstr "최대 프린트 속도" - -#: src/libslic3r/PrintConfig.cpp:1172 -msgid "" -"When setting other speed settings to 0 Slic3r will autocalculate the optimal speed in order to keep constant " -"extruder pressure. This experimental setting is used to set the highest print speed you want to allow." -msgstr "" -"다른 속도 설정을 0으로 설정할 경우, 지속적인 외부 압력을 유지하기 위해 최적의 속도를 자동 계산한다. 이 실험 설" -"정은 허용할 최대 인쇄 속도를 설정하는 데 사용된다." - -#: src/libslic3r/PrintConfig.cpp:1182 -msgid "This experimental setting is used to set the maximum volumetric speed your extruder supports." -msgstr "이 실험 설정은 압출기가 지원하는 최대 체적 속도를 설정하기 위해 사용된다." - -#: src/libslic3r/PrintConfig.cpp:1191 -msgid "Max volumetric slope positive" -msgstr "최대 체적 기울기 양" - -#: src/libslic3r/PrintConfig.cpp:1192 src/libslic3r/PrintConfig.cpp:1203 -msgid "" -"This experimental setting is used to limit the speed of change in extrusion rate. A value of 1.8 mm³/s² " -"ensures, that a change from the extrusion rate of 1.8 mm³/s (0.45mm extrusion width, 0.2mm extrusion height, " -"feedrate 20 mm/s) to 5.4 mm³/s (feedrate 60 mm/s) will take at least 2 seconds." -msgstr "" -"이 실험 설정은 돌출율의 변화 속도를 제한하는데 사용된다. 1.8mm3/s2 값은 1.8mm3/s(0.45mm 압출 폭, 0.2mm 압출 높" -"이, 공급 속도 20mm/s)에서 5.4mm3/s(공급 속도 60mm/s)로 변경하는 데 최소 2초 이상 걸린다." - -#: src/libslic3r/PrintConfig.cpp:1196 src/libslic3r/PrintConfig.cpp:1207 -msgid "mm³/s²" -msgstr "mm³/s²" - -#: src/libslic3r/PrintConfig.cpp:1202 -msgid "Max volumetric slope negative" -msgstr "최대 체적 기울기 음수" - -#: src/libslic3r/PrintConfig.cpp:1214 src/libslic3r/PrintConfig.cpp:1223 -msgid "Min" -msgstr "최소" - -#: src/libslic3r/PrintConfig.cpp:1215 -msgid "This setting represents the minimum PWM your fan needs to work." -msgstr "이 설정은 최소 PWM팬이 활동하는데 필요한를 나타냅니다." - -#: src/libslic3r/PrintConfig.cpp:1224 -msgid "" -"This is the lowest printable layer height for this extruder and limits the resolution for variable layer " -"height. Typical values are between 0.05 mm and 0.1 mm." -msgstr "" -"이것은 이 압출기에 대한 가장 낮은 인쇄 가능한 층 높이이고 가변 층 높이에 대한 분해능을 제한한다. 대표적인 값" -"은 0.05mm와 0.1mm이다." - -#: src/libslic3r/PrintConfig.cpp:1232 -msgid "Min print speed" -msgstr "최소 인쇄 속도" - -#: src/libslic3r/PrintConfig.cpp:1233 -msgid "Slic3r will not scale speed down below this speed." -msgstr "Slic3r는 이 속도 이하로 속도를 낮추지 않을 것이다." - -#: src/libslic3r/PrintConfig.cpp:1240 -msgid "Minimal filament extrusion length" -msgstr "최소 필라멘트 압출 길이" - -#: src/libslic3r/PrintConfig.cpp:1241 -msgid "" -"Generate no less than the number of skirt loops required to consume the specified amount of filament on the " -"bottom layer. For multi-extruder machines, this minimum applies to each extruder." -msgstr "" -"하단 레이어에서 지정된 양의 필라멘트를 사용하는 데 필요한 스커트 루프의 수 이상으로 생성한다. 멀티 익스트루더" -"의 경우, 이 최소값은 각 추가기기에 적용된다." - -#: src/libslic3r/PrintConfig.cpp:1250 -msgid "Configuration notes" -msgstr "구성 노트" - -#: src/libslic3r/PrintConfig.cpp:1251 -msgid "You can put here your personal notes. This text will be added to the G-code header comments." -msgstr "여기에 개인 노트를 넣을 수 있다. 이 텍스트는 G-code 헤더 코멘트에 추가될 것이다." - -#: src/libslic3r/PrintConfig.cpp:1260 -msgid "Nozzle diameter" -msgstr "노즐 직경" - -#: src/libslic3r/PrintConfig.cpp:1261 -msgid "This is the diameter of your extruder nozzle (for example: 0.5, 0.35 etc.)" -msgstr "이 지름은 엑스트루더 노즐의 직경이다(예: 0.5, 0.35 등)." - -#: src/libslic3r/PrintConfig.cpp:1266 -msgid "Host Type" -msgstr "호스트 유형" - -#: src/libslic3r/PrintConfig.cpp:1267 -msgid "Slic3r can upload G-code files to a printer host. This field must contain the kind of the host." -msgstr "" -"Slic3r는 프린터 호스트에 G 코드 파일을 업로드할 수 있습니다. 이 필드에는 호스트의 종류가 포함 되어야 합니다." - -#: src/libslic3r/PrintConfig.cpp:1278 -msgid "Only retract when crossing perimeters" -msgstr "둘레를 횡단 할 때만 수축" - -#: src/libslic3r/PrintConfig.cpp:1279 -msgid "" -"Disables retraction when the travel path does not exceed the upper layer's perimeters (and thus any ooze will " -"be probably invisible)." -msgstr "" -"이동 경로가 상위 레이어의 경계를 초과하지 않는 경우 리트랙션을 비활성화합니다. 따라서 모든 오즈가 보이지 않습" -"니다." - -#: src/libslic3r/PrintConfig.cpp:1286 -msgid "" -"This option will drop the temperature of the inactive extruders to prevent oozing. It will enable a tall " -"skirt automatically and move extruders outside such skirt when changing temperatures." -msgstr "" -"이 옵션은 누출을 방지하기 위해 비활성 압출기의 온도를 떨어 뜨립니다. 온도를 변경할 때 키가 큰 스커트를 자동으" -"로 사용하고 스커트 외부로 압출기를 이동합니다." - -#: src/libslic3r/PrintConfig.cpp:1293 -msgid "Output filename format" -msgstr "출력 파일이름 형식" - -#: src/libslic3r/PrintConfig.cpp:1294 -msgid "" -"You can use all configuration options as variables inside this template. For example: [layer_height], " -"[fill_density] etc. You can also use [timestamp], [year], [month], [day], [hour], [minute], [second], " -"[version], [input_filename], [input_filename_base]." -msgstr "" -"모든 구성 옵션을이 템플릿 내의 변수로 사용할 수 있습니다. 예: [layer_height], [fill_density] 등 또한 [타임 스" -"탬프], [연도], [월], [일], [시간], [input_filename], [input_filename_base]을 사용할 수 있습니다." - -#: src/libslic3r/PrintConfig.cpp:1303 -msgid "Detect bridging perimeters" -msgstr "브릿 징 경계선 감지" - -#: src/libslic3r/PrintConfig.cpp:1305 -msgid "" -"Experimental option to adjust flow for overhangs (bridge flow will be used), to apply bridge speed to them " -"and enable fan." -msgstr "" -"오버행에 대한 유량을 조정하는 실험 옵션 (브리지 흐름(flow)이 사용됨)에 브릿지 속도를 적용하고 팬을 활성화합니" -"다." - -#: src/libslic3r/PrintConfig.cpp:1311 -msgid "Filament parking position" -msgstr "필라멘트 멈춤 위치" - -#: src/libslic3r/PrintConfig.cpp:1312 -msgid "" -"Distance of the extruder tip from the position where the filament is parked when unloaded. This should match " -"the value in printer firmware. " -msgstr "언 로딩시 필라멘트 위치에서 압출기 팁의 거리. 이 값은 프린터 펌웨어의 값과 일치해야합니다. " - -#: src/libslic3r/PrintConfig.cpp:1320 -msgid "Extra loading distance" -msgstr "추가 로딩 거리" - -#: src/libslic3r/PrintConfig.cpp:1321 -msgid "" -"When set to zero, the distance the filament is moved from parking position during load is exactly the same as " -"it was moved back during unload. When positive, it is loaded further, if negative, the loading move is " -"shorter than unloading. " -msgstr "" -"0으로 설정하면로드 중에 필라멘트가 위치에서 이동 한 거리는 언로드 중에 다시 이동 한 거리와 동일합니다. 양수이" -"면 음수가 더 많이 로드되고 로드가 음수 인 경우 언로드보다 짧습니다. " - -#: src/libslic3r/PrintConfig.cpp:1329 src/libslic3r/PrintConfig.cpp:1347 src/libslic3r/PrintConfig.cpp:1359 -#: src/libslic3r/PrintConfig.cpp:1369 -msgid "Perimeters" -msgstr "둘레" - -#: src/libslic3r/PrintConfig.cpp:1330 -msgid "" -"This is the acceleration your printer will use for perimeters. A high value like 9000 usually gives good " -"results if your hardware is up to the job. Set zero to disable acceleration control for perimeters." -msgstr "" -"프린터가 둘레로 사용할 가속도입니다. 9000과 같은 높은 값은 하드웨어가 제대로 작동하면 좋은 결과를 제공합니다. " -"주변을 가속 제어하지 않으려면 0으로 설정하십시오." - -#: src/libslic3r/PrintConfig.cpp:1338 -msgid "Perimeter extruder" -msgstr "주변 익스트루더" - -#: src/libslic3r/PrintConfig.cpp:1340 -msgid "The extruder to use when printing perimeters and brim. First extruder is 1." -msgstr "둘레와 가장자리를 인쇄 할 때 사용할 압출기입니다. 첫 번째 압출기는 1입니다." - -#: src/libslic3r/PrintConfig.cpp:1349 -msgid "" -"Set this to a non-zero value to set a manual extrusion width for perimeters. You may want to use thinner " -"extrudates to get more accurate surfaces. If left zero, default extrusion width will be used if set, " -"otherwise 1.125 x nozzle diameter will be used. If expressed as percentage (for example 200%) it will be " -"computed over layer height." -msgstr "" -"이 값을 0이 아닌 값으로 설정하면 수동 압출 폭을 둘레로 설정할 수 있습니다. 보다 정확한 서페이스를 얻으려면 더 " -"얇은 압출 성형품을 사용하는 것이 좋습니다. 0으로 설정하면 설정된 경우 기본 돌출 폭이 사용되고 그렇지 않으면 " -"1.125 x 노즐 직경이 사용됩니다. 백분율 (예 : 200 %)로 표현하면 레이어 높이를 기준으로 계산됩니다." - -#: src/libslic3r/PrintConfig.cpp:1361 -msgid "Speed for perimeters (contours, aka vertical shells). Set to zero for auto." -msgstr "둘레의 속도 (등고선, 일명 세로 셸). 자동으로 0으로 설정하십시오." - -#: src/libslic3r/PrintConfig.cpp:1371 -msgid "" -"This option sets the number of perimeters to generate for each layer. Note that Slic3r may increase this " -"number automatically when it detects sloping surfaces which benefit from a higher number of perimeters if the " -"Extra Perimeters option is enabled." -msgstr "" -"이 옵션은 각 레이어에 대해 생성 할 경계 수를 설정합니다. 추가 경계선 옵션을 사용하면 더 큰 주변 수를 사용하는 " -"경사면을 감지 할 때 Slic3r이이 수를 자동으로 증가시킬 수 있습니다." - -#: src/libslic3r/PrintConfig.cpp:1375 -msgid "(minimum)" -msgstr "(최소)" - -#: src/libslic3r/PrintConfig.cpp:1383 -msgid "" -"If you want to process the output G-code through custom scripts, just list their absolute paths here. " -"Separate multiple scripts with a semicolon. Scripts will be passed the absolute path to the G-code file as " -"the first argument, and they can access the Slic3r config settings by reading environment variables." -msgstr "" -"사용자 정의 스크립트를 통해 출력 G 코드를 처리하려면 여기에 절대 경로를 나열하십시오. 여러 개의 스크립트를 세" -"미콜론으로 구분하십시오. 스크립트는 G 코드 파일의 절대 경로를 첫 번째 인수로 전달되며 환경 변수를 읽음으로써 " -"Slic3r 구성 설정에 액세스 할 수 있습니다." - -#: src/libslic3r/PrintConfig.cpp:1395 -msgid "Printer type" -msgstr "프린터 타입" - -#: src/libslic3r/PrintConfig.cpp:1396 -msgid "Type of the printer." -msgstr "프린터 유형." - -#: src/libslic3r/PrintConfig.cpp:1401 -msgid "Printer notes" -msgstr "프린터 노트" - -#: src/libslic3r/PrintConfig.cpp:1402 -msgid "You can put your notes regarding the printer here." -msgstr "프린터 관련 메모를 여기에 넣을 수 있습니다." - -#: src/libslic3r/PrintConfig.cpp:1410 -msgid "Printer vendor" -msgstr "제조 회사" - -#: src/libslic3r/PrintConfig.cpp:1411 -msgid "Name of the printer vendor." -msgstr "프린터 공급 업체의 이름입니다." - -#: src/libslic3r/PrintConfig.cpp:1416 -msgid "Printer variant" -msgstr "프린터 변형" - -#: src/libslic3r/PrintConfig.cpp:1417 -msgid "" -"Name of the printer variant. For example, the printer variants may be differentiated by a nozzle diameter." -msgstr "프린터 변종 이름입니다. 예를 들어, 프린터 변형은 노즐 지름으로 구별 될 수 있습니다." - -#: src/libslic3r/PrintConfig.cpp:1430 -msgid "Raft layers" -msgstr "라프트(Raft) 레이어" - -#: src/libslic3r/PrintConfig.cpp:1432 -msgid "The object will be raised by this number of layers, and support material will be generated under it." -msgstr "물체는 이 개수의 층에 의해 상승되며, 그 아래에서 서포트 재료가 생성될 것이다." - -#: src/libslic3r/PrintConfig.cpp:1440 -msgid "Resolution" -msgstr "해결" - -#: src/libslic3r/PrintConfig.cpp:1441 -msgid "" -"Minimum detail resolution, used to simplify the input file for speeding up the slicing job and reducing " -"memory usage. High-resolution models often carry more detail than printers can render. Set to zero to disable " -"any simplification and use full resolution from input." -msgstr "" -"잘라내기 작업의 속도를 높이고 메모리 사용량을 줄이기 위해 입력 파일을 단순화하는 데 사용되는 최소 세부 해상" -"도. 고해상도 모델은 종종 프린터가 렌더링할 수 있는 것보다 더 많은 디테일을 가지고 있다. 단순화를 사용하지 않" -"고 입력에서 전체 해상도를 사용하려면 0으로 설정하십시오." - -#: src/libslic3r/PrintConfig.cpp:1451 -msgid "Minimum travel after retraction" -msgstr "리트랙션 후 최소 이동 거리" - -#: src/libslic3r/PrintConfig.cpp:1452 -msgid "Retraction is not triggered when travel moves are shorter than this length." -msgstr "이동 거리가 이 길이보다 짧으면 리트렉션이 트리거되지 않습니다." - -#: src/libslic3r/PrintConfig.cpp:1458 -msgid "Retract amount before wipe" -msgstr "닦아 내기 전의 수축량" - -#: src/libslic3r/PrintConfig.cpp:1459 -msgid "With bowden extruders, it may be wise to do some amount of quick retract before doing the wipe movement." -msgstr "보우 덴 압출기를 사용하면 와이퍼 동작을하기 전에 약간의 빠른 리트랙션 를하는 것이 좋습니다." - -#: src/libslic3r/PrintConfig.cpp:1466 -msgid "Retract on layer change" -msgstr "레이어 변경 후퇴" - -#: src/libslic3r/PrintConfig.cpp:1467 -msgid "This flag enforces a retraction whenever a Z move is done." -msgstr "이 플래그는 Z 이동이 완료 될 때마다 취소를 강제 실행합니다." - -#: src/libslic3r/PrintConfig.cpp:1472 src/libslic3r/PrintConfig.cpp:1480 -msgid "Length" -msgstr "길이" - -#: src/libslic3r/PrintConfig.cpp:1473 -msgid "Retraction Length" -msgstr "리트랙션 길이" - -#: src/libslic3r/PrintConfig.cpp:1474 -msgid "" -"When retraction is triggered, filament is pulled back by the specified amount (the length is measured on raw " -"filament, before it enters the extruder)." -msgstr "" -"후퇴가 트리거되면 필라멘트가 지정된 양만큼 뒤로 당겨집니다 (길이는 압출기에 들어가기 전에 원시 필라멘트에서 측" -"정됩니다)." - -#: src/libslic3r/PrintConfig.cpp:1476 src/libslic3r/PrintConfig.cpp:1485 -msgid "mm (zero to disable)" -msgstr "mm (0은 비활성화)" - -#: src/libslic3r/PrintConfig.cpp:1481 -msgid "Retraction Length (Toolchange)" -msgstr "리트랙션 길이 (툴 체인지)" - -#: src/libslic3r/PrintConfig.cpp:1482 -msgid "" -"When retraction is triggered before changing tool, filament is pulled back by the specified amount (the " -"length is measured on raw filament, before it enters the extruder)." -msgstr "" -"공구를 교체하기 전에 후퇴가 트리거되면 필라멘트가 지정된 양만큼 뒤로 당겨집니다 (길이는 압출기에 들어가기 전" -"에 원시 필라멘트에서 측정됩니다)." - -#: src/libslic3r/PrintConfig.cpp:1490 -msgid "Lift Z" -msgstr "Z축 올림" - -#: src/libslic3r/PrintConfig.cpp:1491 -msgid "" -"If you set this to a positive value, Z is quickly raised every time a retraction is triggered. When using " -"multiple extruders, only the setting for the first extruder will be considered." -msgstr "" -"이 값을 양수 값으로 설정하면 철회가 트리거 될 때마다 Z가 빠르게 올라갑니다. 여러 개의 압출기를 사용하는 경우 " -"첫 번째 압출기의 설정 만 고려됩니다." - -#: src/libslic3r/PrintConfig.cpp:1498 -msgid "Above Z" -msgstr "Z 위" - -#: src/libslic3r/PrintConfig.cpp:1499 -msgid "Only lift Z above" -msgstr "오직 Z축 위로만" - -#: src/libslic3r/PrintConfig.cpp:1500 -msgid "" -"If you set this to a positive value, Z lift will only take place above the specified absolute Z. You can tune " -"this setting for skipping lift on the first layers." -msgstr "" -"이것을 양의 값으로 설정하면, Z 리프트는 지정된 절대 Z 위로만 발생한다. 첫 번째 층에서 리프트를 건너뛸 수 있도" -"록 이 설정을 조정할 수 있다." - -#: src/libslic3r/PrintConfig.cpp:1507 -msgid "Below Z" -msgstr "Z 아래" - -#: src/libslic3r/PrintConfig.cpp:1508 -msgid "Only lift Z below" -msgstr "Z값 아래만" - -#: src/libslic3r/PrintConfig.cpp:1509 -msgid "" -"If you set this to a positive value, Z lift will only take place below the specified absolute Z. You can tune " -"this setting for limiting lift to the first layers." -msgstr "" -"이것을 양수 값으로 설정하면 Z 리프트가 지정된 절대 Z 아래에서만 발생합니다. 첫 번째 레이어로 리프트를 제한하" -"기 위해이 설정을 조정할 수 있습니다." - -#: src/libslic3r/PrintConfig.cpp:1517 src/libslic3r/PrintConfig.cpp:1525 -msgid "Extra length on restart" -msgstr "재시작시 여분의 길이" - -#: src/libslic3r/PrintConfig.cpp:1518 -msgid "" -"When the retraction is compensated after the travel move, the extruder will push this additional amount of " -"filament. This setting is rarely needed." -msgstr "" -"이동 후 리트렉셔이 보정되면 익스트루더가 추가 양의 필라멘트를 밀어냅니다. 이 설정은 거의 필요하지 않습니다." - -#: src/libslic3r/PrintConfig.cpp:1526 -msgid "" -"When the retraction is compensated after changing tool, the extruder will push this additional amount of " -"filament." -msgstr "도구를 교환 한 후 리트렉션를 보정하면 익스트루더가 추가 양의 필라멘트를 밀게됩니다." - -#: src/libslic3r/PrintConfig.cpp:1533 src/libslic3r/PrintConfig.cpp:1534 -msgid "Retraction Speed" -msgstr "리트랙션 속도" - -#: src/libslic3r/PrintConfig.cpp:1535 -msgid "The speed for retractions (it only applies to the extruder motor)." -msgstr "리트랙션 속도 (익스트루더 모터에만 적용됨)." - -#: src/libslic3r/PrintConfig.cpp:1541 src/libslic3r/PrintConfig.cpp:1542 -msgid "Deretraction Speed" -msgstr "감속 속도" - -#: src/libslic3r/PrintConfig.cpp:1543 -msgid "" -"The speed for loading of a filament into extruder after retraction (it only applies to the extruder motor). " -"If left to zero, the retraction speed is used." -msgstr "" -"리트랙션 후 압출기에 필라멘트를 로드하는 속도 (압출기 모터에만 적용됨). 0으로 방치하면 리트랙션 속도가 사용됩" -"니다." - -#: src/libslic3r/PrintConfig.cpp:1550 -msgid "Seam position" -msgstr "재봉선 위치" - -#: src/libslic3r/PrintConfig.cpp:1552 -msgid "Position of perimeters starting points." -msgstr "둘레의 시작점의 위치." - -#: src/libslic3r/PrintConfig.cpp:1558 -msgid "Random" -msgstr "무작위" - -#: src/libslic3r/PrintConfig.cpp:1559 -msgid "Nearest" -msgstr "가장 가까운" - -#: src/libslic3r/PrintConfig.cpp:1560 -msgid "Aligned" -msgstr "정렬" - -#: src/libslic3r/PrintConfig.cpp:1568 -msgid "Direction" -msgstr "방향" - -#: src/libslic3r/PrintConfig.cpp:1570 -msgid "Preferred direction of the seam" -msgstr "선호하는 심(seam)의 방향" - -#: src/libslic3r/PrintConfig.cpp:1571 -msgid "Seam preferred direction" -msgstr "심(Seam) 선호 방향" - -#: src/libslic3r/PrintConfig.cpp:1578 -msgid "Jitter" -msgstr "지터(Jitter)" - -#: src/libslic3r/PrintConfig.cpp:1580 -msgid "Seam preferred direction jitter" -msgstr "(Seam) 선호 방향 지터(Jitter)" - -#: src/libslic3r/PrintConfig.cpp:1581 -msgid "Preferred direction of the seam - jitter" -msgstr "재봉선 지터의 선호 방향" - -#: src/libslic3r/PrintConfig.cpp:1591 -msgid "USB/serial port for printer connection." -msgstr "프린터 연결을 위한 USB/시리얼 포트." - -#: src/libslic3r/PrintConfig.cpp:1598 -msgid "Serial port speed" -msgstr "시리얼 포트 속도" - -#: src/libslic3r/PrintConfig.cpp:1599 -msgid "Speed (baud) of USB/serial port for printer connection." -msgstr "프린터 연결을 위한 USB/시리얼 포트의 속도(보드)" - -#: src/libslic3r/PrintConfig.cpp:1608 -msgid "Distance from object" -msgstr "객체로부터의 거리" - -#: src/libslic3r/PrintConfig.cpp:1609 -msgid "" -"Distance between skirt and object(s). Set this to zero to attach the skirt to the object(s) and get a brim " -"for better adhesion." -msgstr "스커트와 객체 사이의 거리. 스커트를 객체에 부착하고 접착력을 높이기 위해 이를 0으로 설정한다." - -#: src/libslic3r/PrintConfig.cpp:1616 -msgid "Skirt height" -msgstr "스커트(Skirt) 높이" - -#: src/libslic3r/PrintConfig.cpp:1617 -msgid "Height of skirt expressed in layers. Set this to a tall value to use skirt as a shield against drafts." -msgstr "" -"스커트의 높이 레이어로 표현된다. 이를 높은 값으로 설정하여 스커트를 드래프트에 대한 쉴ㄷ로 활용하십시오." - -#: src/libslic3r/PrintConfig.cpp:1624 -msgid "Loops (minimum)" -msgstr "루프 (최소)" - -#: src/libslic3r/PrintConfig.cpp:1625 -msgid "Skirt Loops" -msgstr "스커트 루프" - -#: src/libslic3r/PrintConfig.cpp:1626 -msgid "" -"Number of loops for the skirt. If the Minimum Extrusion Length option is set, the number of loops might be " -"greater than the one configured here. Set this to zero to disable skirt completely." -msgstr "" -"스커트의 루프 수입니다. 최소 압출 길이 옵션을 설정한 경우 여기에 구성된 루프 수보다 클 수 있다. 스커트를 완전" -"히 비활성화하려면 이 값을 0으로 설정하십시오." - -#: src/libslic3r/PrintConfig.cpp:1634 -msgid "Slow down if layer print time is below" -msgstr "레이어 인쇄 시간이 다음과 같은 경우 속도를 낮추십시오" - -#: src/libslic3r/PrintConfig.cpp:1635 -msgid "" -"If layer print time is estimated below this number of seconds, print moves speed will be scaled down to " -"extend duration to this value." -msgstr "층 인쇄 시간이 이 시간보다 낮게 추정될 경우, 인쇄 이동 속도는 이 값으로 지속되도록 축소된다." - -#: src/libslic3r/PrintConfig.cpp:1645 -msgid "Small perimeters" -msgstr "작은 둘레" - -#: src/libslic3r/PrintConfig.cpp:1647 -msgid "" -"This separate setting will affect the speed of perimeters having radius <= 6.5mm (usually holes). If " -"expressed as percentage (for example: 80%) it will be calculated on the perimeters speed setting above. Set " -"to zero for auto." -msgstr "" -"이 개별 설정은 반경이 6.5mm 미만인 속도 (일반적으로 구멍)에 영향을줍니다. 백분율로 표시되는 경우 (예 : 80 %) " -"위의 속도 설정에서 계산됩니다. 자동으로 0으로 설정하십시오." - -#: src/libslic3r/PrintConfig.cpp:1657 -msgid "Solid infill threshold area" -msgstr "솔리드 채우기 임계값 영역" - -#: src/libslic3r/PrintConfig.cpp:1659 -msgid "Force solid infill for regions having a smaller area than the specified threshold." -msgstr "지정된 한계값보다 작은 영역을 가진 영역에 대해 솔리드 인필을 강제 적용." - -#: src/libslic3r/PrintConfig.cpp:1660 -msgid "mm²" -msgstr "mm²" - -#: src/libslic3r/PrintConfig.cpp:1666 -msgid "Solid infill extruder" -msgstr "솔리드 인필 익스트루더" - -#: src/libslic3r/PrintConfig.cpp:1668 -msgid "The extruder to use when printing solid infill." -msgstr "꽉찬 면을 인쇄할 때 사용하는 익스트루더." - -#: src/libslic3r/PrintConfig.cpp:1674 -msgid "Solid infill every" -msgstr "솔리드 인필 간격" - -#: src/libslic3r/PrintConfig.cpp:1676 -msgid "" -"This feature allows to force a solid layer every given number of layers. Zero to disable. You can set this to " -"any value (for example 9999); Slic3r will automatically choose the maximum possible number of layers to " -"combine according to nozzle diameter and layer height." -msgstr "" -"이 특징은 주어진 개수의 층마다 단단한 층을 강요할 수 있게 한다. 비활성화할 수 없음. 당신은 이것을 어떤 값으로" -"도 설정할 수 있다(예: 9999). Slic3r는 노즐 직경과 층 높이에 따라 결합할 최대 가능한 층 수를 자동으로 선택한다." - -#: src/libslic3r/PrintConfig.cpp:1688 -msgid "" -"Set this to a non-zero value to set a manual extrusion width for infill for solid surfaces. If left zero, " -"default extrusion width will be used if set, otherwise 1.125 x nozzle diameter will be used. If expressed as " -"percentage (for example 90%) it will be computed over layer height." -msgstr "" -"이 값을 0이 아닌 값으로 설정하여 솔리드 표면 인필에 대한 수동 압출 폭을 설정하십시오. 0인 경우 기본 압출 너비" -"가 사용되며, 그렇지 않으면 1.125 x 노즐 직경이 사용된다. 백분율(예: 90%)로 표현되는 경우, 계층 높이에 걸쳐 계" -"산된다." - -#: src/libslic3r/PrintConfig.cpp:1698 -msgid "" -"Speed for printing solid regions (top/bottom/internal horizontal shells). This can be expressed as a " -"percentage (for example: 80%) over the default infill speed above. Set to zero for auto." -msgstr "" -"솔리드 영역(상단/하부/내부 수평 셸) 인쇄 속도 이는 위의 기본 주입 속도에 대한 백분율(예: 80%)로 표시할 수 있" -"다. 자동을 위해 0으로 설정한다." - -#: src/libslic3r/PrintConfig.cpp:1710 -msgid "Number of solid layers to generate on top and bottom surfaces." -msgstr "상단 및 하단 표면에 생성할 솔리드 레이어 수입니다." - -#: src/libslic3r/PrintConfig.cpp:1716 -msgid "Spiral vase" -msgstr "스파이럴 바이스" - -#: src/libslic3r/PrintConfig.cpp:1717 -msgid "" -"This feature will raise Z gradually while printing a single-walled object in order to remove any visible " -"seam. This option requires a single perimeter, no infill, no top solid layers and no support material. You " -"can still set any number of bottom solid layers as well as skirt/brim loops. It won't work when printing more " -"than an object." -msgstr "" -"이 기능은 단일 벽 물체를 인쇄하는 동안 눈에 보이는 심을 제거하기 위해 Z를 점진적으로 상승시킨다. 이 옵션은 단" -"일 둘레, 주입, 상단 솔리드 레이어 및 지지 재료가 필요하지 않다. 당신은 스커트/브림 루프뿐만 아니라 아래 솔리" -"드 레이어의 수에 상관없이 설정할 수 있다. 그것은 물체보다 더 많이 인쇄할 때는 작동하지 않을 것이다." - -#: src/libslic3r/PrintConfig.cpp:1725 -msgid "Temperature variation" -msgstr "온도 변화" - -#: src/libslic3r/PrintConfig.cpp:1726 -msgid "" -"Temperature difference to be applied when an extruder is not active. Enables a full-height \"sacrificial\" " -"skirt on which the nozzles are periodically wiped." -msgstr "" -"돌출부가 활성화되지 않은 경우 적용되는 온도 차이. 노즐을 주기적으로 닦는 전체 높이 \"인공\" 스커트가 가능하다." - -#: src/libslic3r/PrintConfig.cpp:1736 -msgid "" -"This start procedure is inserted at the beginning, after bed has reached the target temperature and extruder " -"just started heating, and before extruder has finished heating. If Slic3r detects M104 or M190 in your custom " -"codes, such commands will not be prepended automatically so you're free to customize the order of heating " -"commands and other custom actions. Note that you can use placeholder variables for all Slic3r settings, so " -"you can put a \"M109 S[first_layer_temperature]\" command wherever you want." -msgstr "" -"이 시작 절차는 침대가 목표 온도에 도달하고 압출기가 막 가열을 시작한 직후 및 압출기가 가열을 완료하기 전에 처" -"음에 삽입됩니다. Slic3r이 사용자 지정 코드에서 M104 또는 M190을 감지하면 이러한 명령은 자동으로 추가되지 않으" -"므로 가열 명령 및 기타 사용자 지정 동작의 순서를 자유롭게 사용자 지정할 수 있습니다. 모든 Slic3r 설정에 자리 " -"표시 자 변수를 사용할 수 있으므로 원하는 위치에 \"M109 S [first_layer_temperature]\"명령을 넣을 수 있습니다." - -#: src/libslic3r/PrintConfig.cpp:1751 -msgid "" -"This start procedure is inserted at the beginning, after any printer start gcode. This is used to override " -"settings for a specific filament. If Slic3r detects M104, M109, M140 or M190 in your custom codes, such " -"commands will not be prepended automatically so you're free to customize the order of heating commands and " -"other custom actions. Note that you can use placeholder variables for all Slic3r settings, so you can put a " -"\"M109 S[first_layer_temperature]\" command wherever you want. If you have multiple extruders, the gcode is " -"processed in extruder order." -msgstr "" -"이 시작 절차는 프린터가 gcode를 시작한 후 처음에 삽입됩니다. 특정 필라멘트의 설정을 무시하는 데 사용됩니다. " -"Slic3r이 사용자 지정 코드에서 M104, M109, M140 또는 M190을 감지하면 이러한 명령은 자동으로 추가되지 않으므로 " -"가열 명령 및 기타 사용자 지정 동작의 순서를 자유롭게 사용자 지정할 수 있습니다. 모든 Slic3r 설정에 자리 표시 " -"자 변수를 사용할 수 있으므로 원하는 위치에 \"M109 S [first_layer_temperature]\"명령을 넣을 수 있습니다. 여러 " -"개의 압출기가있는 경우 gcode가 압출기 순서로 처리됩니다." - -#: src/libslic3r/PrintConfig.cpp:1766 -msgid "Single Extruder Multi Material" -msgstr "싱글 익스트루더 멀티메터리얼" - -#: src/libslic3r/PrintConfig.cpp:1767 -msgid "The printer multiplexes filaments into a single hot end." -msgstr "프린터는 필라멘트를 하나의 핫 엔드에 멀티플렉싱합니다." - -#: src/libslic3r/PrintConfig.cpp:1772 -msgid "Prime all printing extruders" -msgstr "모든 인쇄 압출기 프라임" - -#: src/libslic3r/PrintConfig.cpp:1773 -msgid "" -"If enabled, all printing extruders will be primed at the front edge of the print bed at the start of the " -"print." -msgstr "활성화 된 경우, 모든 인쇄 압출기는 인쇄 시작시 프린트 베드의 전면 가장자리에 프라이밍 됩니다." - -#: src/libslic3r/PrintConfig.cpp:1778 -msgid "Generate support material" -msgstr "서포트 재료 생성" - -#: src/libslic3r/PrintConfig.cpp:1780 -msgid "Enable support material generation." -msgstr "서포트 재료를 사용합니다." - -#: src/libslic3r/PrintConfig.cpp:1784 -msgid "Auto generated supports" -msgstr "자동 생성 지원" - -#: src/libslic3r/PrintConfig.cpp:1786 -msgid "" -"If checked, supports will be generated automatically based on the overhang threshold value. If unchecked, " -"supports will be generated inside the \"Support Enforcer\" volumes only." -msgstr "" -"이 옵션을 선택 하면 오버행 임계값에 따라 서포트가 자동으로 생성 됩니다. 이 확인란을 선택 하지 않으면 \"서포트 " -"지원 영역\" 볼륨 내 에서만 지원이 생성 됩니다." - -#: src/libslic3r/PrintConfig.cpp:1792 -msgid "XY separation between an object and its support" -msgstr "물체와 그 서포트 사이 XY 분리" - -#: src/libslic3r/PrintConfig.cpp:1794 -msgid "" -"XY separation between an object and its support. If expressed as percentage (for example 50%), it will be " -"calculated over external perimeter width." -msgstr "" -"객체와 그 서포트 사이의 XY 분리. 백분율 (예 : 50 %)로 표시되는 경우 외부 둘레 너비를 기준으로 계산됩니다." - -#: src/libslic3r/PrintConfig.cpp:1804 -msgid "Pattern angle" -msgstr "채움 각도" - -#: src/libslic3r/PrintConfig.cpp:1806 -msgid "Use this setting to rotate the support material pattern on the horizontal plane." -msgstr "이 설정을 사용하여지지 평면 패턴을 수평면으로 회전시킵니다." - -#: src/libslic3r/PrintConfig.cpp:1816 src/libslic3r/PrintConfig.cpp:2421 -msgid "Only create support if it lies on a build plate. Don't create support on a print." -msgstr "그것이 빌드 플레이트에있는 경우에만 지원을 작성하십시오. 인쇄물에 대한 지원을 작성하지 마십시오." - -#: src/libslic3r/PrintConfig.cpp:1822 -msgid "Contact Z distance" -msgstr "Z 거리 문의" - -#: src/libslic3r/PrintConfig.cpp:1824 -msgid "" -"The vertical distance between object and support material interface. Setting this to 0 will also prevent " -"Slic3r from using bridge flow and speed for the first object layer." -msgstr "" -"물체와 서포트 사이의 수직 거리. 이 값을 0으로 설정하면 Slic3r이 첫 번째 객체 레이어에 브리지 흐름과 속도를 사" -"용하지 못하게됩니다." - -#: src/libslic3r/PrintConfig.cpp:1831 -msgid "soluble" -msgstr "수용성" - -#: src/libslic3r/PrintConfig.cpp:1832 -msgid "detachable" -msgstr "분리 가능" - -#: src/libslic3r/PrintConfig.cpp:1837 -msgid "Enforce support for the first" -msgstr "첫 번째 서포트 더 강화" - -#: src/libslic3r/PrintConfig.cpp:1839 -msgid "" -"Generate support material for the specified number of layers counting from bottom, regardless of whether " -"normal support material is enabled or not and regardless of any angle threshold. This is useful for getting " -"more adhesion of objects having a very thin or poor footprint on the build plate." -msgstr "" -"일반지지 소재의 활성화 여부와 관계없이 각도 임계 값에 관계없이 하단에서부터 세어 지정된 레이어 수에 대한지지 " -"자료를 생성합니다. 이것은 빌드 플레이트에 매우 얇거나 부족한 풋 프린트를 가진 물체를 더 많이 부착 할 때 유용합" -"니다." - -#: src/libslic3r/PrintConfig.cpp:1844 -msgid "Enforce support for the first n layers" -msgstr "첫 번째 n 개의 레이어에 대한 서포트 강화" - -#: src/libslic3r/PrintConfig.cpp:1850 -msgid "Support material/raft/skirt extruder" -msgstr "서포트 재료 / 라프트 / 스커트 익스트루더" - -#: src/libslic3r/PrintConfig.cpp:1852 -msgid "" -"The extruder to use when printing support material, raft and skirt (1+, 0 to use the current extruder to " -"minimize tool changes)." -msgstr "" -"서포트 재료, 라프트 및 스커트를 인쇄 할 때 사용하는 압출기 (도구 변경을 최소화하기 위해 현재 압출기를 사용하려" -"면 1+, 0)." - -#: src/libslic3r/PrintConfig.cpp:1861 -msgid "" -"Set this to a non-zero value to set a manual extrusion width for support material. If left zero, default " -"extrusion width will be used if set, otherwise nozzle diameter will be used. If expressed as percentage (for " -"example 90%) it will be computed over layer height." -msgstr "" -"서포트 재료의 수동 압출 폭을 설정하려면이 값을 0이 아닌 값으로 설정하십시오. 0으로 설정하면 설정된 경우 기본 " -"압출 폭이 사용되고 그렇지 않으면 노즐 지름이 사용됩니다. 백분율 (예 : 90 %)로 표현하면 레이어 높이를 기준으로 " -"계산됩니다." - -#: src/libslic3r/PrintConfig.cpp:1869 -msgid "Interface loops" -msgstr "인터페이스 루프" - -#: src/libslic3r/PrintConfig.cpp:1871 -msgid "Cover the top contact layer of the supports with loops. Disabled by default." -msgstr "지지대의 상단 접촉 층을 루프로 덮으십시오. 기본적으로 사용 안 함." - -#: src/libslic3r/PrintConfig.cpp:1876 -msgid "Support material/raft interface extruder" -msgstr "서포트 재료/라프트 인터페이스 익스트루더" - -#: src/libslic3r/PrintConfig.cpp:1878 -msgid "" -"The extruder to use when printing support material interface (1+, 0 to use the current extruder to minimize " -"tool changes). This affects raft too." -msgstr "" -"서포트 재료 인터페이스를 인쇄 할 때 사용할 익스트루더 (도구 변경을 최소화하기 위해 현재 익스트루더를 사용하려" -"면 1+, 0). 이것은 라프트에도 영향을 미칩니다." - -#: src/libslic3r/PrintConfig.cpp:1885 -msgid "Interface layers" -msgstr "인터페이스 레이어" - -#: src/libslic3r/PrintConfig.cpp:1887 -msgid "Number of interface layers to insert between the object(s) and support material." -msgstr "객체와 서포트 재료 사이에 삽입할 인터페이스 레이어 수입니다." - -#: src/libslic3r/PrintConfig.cpp:1894 -msgid "Interface pattern spacing" -msgstr "인터페이스 패턴 간격" - -#: src/libslic3r/PrintConfig.cpp:1896 -msgid "Spacing between interface lines. Set zero to get a solid interface." -msgstr "인터페이스 라인 간 간격. 솔리드 인터페이스를 가져오려면 0을 설정하십시오." - -#: src/libslic3r/PrintConfig.cpp:1905 -msgid "" -"Speed for printing support material interface layers. If expressed as percentage (for example 50%) it will be " -"calculated over support material speed." -msgstr "서포트 재료 인터페이스 레이어 인쇄 속도 백분율(예: 50%)로 표현될 경우 서포트 재료 속도에 따라 계산된다." - -#: src/libslic3r/PrintConfig.cpp:1914 -msgid "Pattern" -msgstr "패턴" - -#: src/libslic3r/PrintConfig.cpp:1916 -msgid "Pattern used to generate support material." -msgstr "서포트 재료를 생성하는 데 사용되는 패턴." - -#: src/libslic3r/PrintConfig.cpp:1922 -msgid "Rectilinear grid" -msgstr "직선 그리드" - -#: src/libslic3r/PrintConfig.cpp:1928 -msgid "Pattern spacing" -msgstr "패턴 간격" - -#: src/libslic3r/PrintConfig.cpp:1930 -msgid "Spacing between support material lines." -msgstr "서포트 재료 라인 사이의 간격." - -#: src/libslic3r/PrintConfig.cpp:1939 -msgid "Speed for printing support material." -msgstr "서포트 재료를 인쇄하는 속도." - -#: src/libslic3r/PrintConfig.cpp:1946 -msgid "Synchronize with object layers" -msgstr "객체 레이어와 동기화" - -#: src/libslic3r/PrintConfig.cpp:1948 -msgid "" -"Synchronize support layers with the object print layers. This is useful with multi-material printers, where " -"the extruder switch is expensive." -msgstr "" -"서포트 레이어를 프린트 레이어와 동기화하십시오. 이것은 스위치가 비싼 멀티 메터리얼 프린터에서 유용하다." - -#: src/libslic3r/PrintConfig.cpp:1954 -msgid "Overhang threshold" -msgstr "오버행 한계점" - -#: src/libslic3r/PrintConfig.cpp:1956 -msgid "" -"Support material will not be generated for overhangs whose slope angle (90° = vertical) is above the given " -"threshold. In other words, this value represent the most horizontal slope (measured from the horizontal " -"plane) that you can print without support material. Set to zero for automatic detection (recommended)." -msgstr "" -"서포트 재료는 경사각(90° = 수직)이 지정된 임계점보다 높은 압출에 대해서는 생성되지 않는다. 즉, 이 값은 서포트 " -"재료 없이 인쇄할 수 있는 가장 수평 경사(수평면에서 측정됨)를 나타낸다. 자동 감지를 위해 0으로 설정하십시오(권" -"장)." - -#: src/libslic3r/PrintConfig.cpp:1968 -msgid "With sheath around the support" -msgstr "서포트 주변이나 외부로" - -#: src/libslic3r/PrintConfig.cpp:1970 -msgid "" -"Add a sheath (a single perimeter line) around the base support. This makes the support more reliable, but " -"also more difficult to remove." -msgstr "" -"기본 서포트 주위에 외장 (단일 주변 선)을 추가하십시오. 이것은 페이스 업을보다 신뢰성있게 만들뿐만 아니라 제거" -"하기도 어렵습니다." - -#: src/libslic3r/PrintConfig.cpp:1977 -msgid "" -"Extruder temperature for layers after the first one. Set this to zero to disable temperature control commands " -"in the output." -msgstr "" -"첫 번째 것 이후에 레이어에 대한 더 낮은 온도. 이 값을 0으로 설정하면 출력에서 ​​온도 제어 명령을 비활성화 할 수 " -"있습니다." - -#: src/libslic3r/PrintConfig.cpp:1979 -msgid "Temperature" -msgstr "온도" - -#: src/libslic3r/PrintConfig.cpp:1985 -msgid "Detect thin walls" -msgstr "얇은 벽(walls) 감지" - -#: src/libslic3r/PrintConfig.cpp:1987 -msgid "" -"Detect single-width walls (parts where two extrusions don't fit and we need to collapse them into a single " -"trace)." -msgstr "싱글 너비 벽 (두 부분이 맞지 않는 부분과 무너지는 부분)을 감지합니다." - -#: src/libslic3r/PrintConfig.cpp:1993 -msgid "Threads" -msgstr "스레드(Threads)" - -#: src/libslic3r/PrintConfig.cpp:1994 -msgid "" -"Threads are used to parallelize long-running tasks. Optimal threads number is slightly above the number of " -"available cores/processors." -msgstr "" -"스레드는 장기 실행 태스크를 병렬 처리하는 데 사용됩니다. 최적의 스레드 수는 사용 가능한 코어 / 프로세서 수보" -"다 약간 높습니다." - -#: src/libslic3r/PrintConfig.cpp:2006 -msgid "" -"This custom code is inserted right before every extruder change. Note that you can use placeholder variables " -"for all Slic3r settings as well as [previous_extruder] and [next_extruder]." -msgstr "" -"이 사용자 정의 코드는 모든 압출기 변경 직전에 삽입됩니다. [previous_extruder] 및 [next_extruder]뿐 아니라 모" -"든 Slic3r 설정에 대해 자리 표시 자 변수를 사용할 수 있습니다." - -#: src/libslic3r/PrintConfig.cpp:2018 -msgid "" -"Set this to a non-zero value to set a manual extrusion width for infill for top surfaces. You may want to use " -"thinner extrudates to fill all narrow regions and get a smoother finish. If left zero, default extrusion " -"width will be used if set, otherwise nozzle diameter will be used. If expressed as percentage (for example " -"90%) it will be computed over layer height." -msgstr "" -"이 값을 0이 아닌 값으로 설정하여 상단 서피스에 대한 infill의 수동 압출 폭을 설정합니다. 얇은 압출 성형물을 사" -"용하여 모든 좁은 지역을 채우고 더 매끄러운 마무리를 할 수 있습니다. 0으로 설정된 경우 기본 압출 폭이 사용되고 " -"그렇지 않으면 노즐 지름이 사용됩니다. 백분율 (예 : 90 %)로 표현하면 레이어 높이를 기준으로 계산됩니다." - -#: src/libslic3r/PrintConfig.cpp:2029 -msgid "" -"Speed for printing top solid layers (it only applies to the uppermost external layers and not to their " -"internal solid layers). You may want to slow down this to get a nicer surface finish. This can be expressed " -"as a percentage (for example: 80%) over the solid infill speed above. Set to zero for auto." -msgstr "" -"상단 솔리드 레이어 인쇄 속도 (솔리드 레이어가 아닌 최상단 외부 레이어에만 적용) 표면을 더 좋게 마무리하려면 속" -"도를 늦추시기 바랍니다. 이것은 위의 고체 충전 속도에 대한 백분율 (예 : 80 %)로 나타낼 수 있습니다. 자동으로 0" -"으로 설정하십시오." - -#: src/libslic3r/PrintConfig.cpp:2043 -msgid "Number of solid layers to generate on top surfaces." -msgstr "상단 표면에 생성 할 솔리드 레이어 수입니다." - -#: src/libslic3r/PrintConfig.cpp:2044 -msgid "Top solid layers" -msgstr "탑 솔리드 레이어" - -#: src/libslic3r/PrintConfig.cpp:2050 -msgid "Speed for travel moves (jumps between distant extrusion points)." -msgstr "이동 속도 (먼 돌출 점 사이의 점프)." - -#: src/libslic3r/PrintConfig.cpp:2058 -msgid "Use firmware retraction" -msgstr "펌웨어 철회" - -#: src/libslic3r/PrintConfig.cpp:2059 -msgid "" -"This experimental setting uses G10 and G11 commands to have the firmware handle the retraction. This is only " -"supported in recent Marlin." -msgstr "" -"이 실험 설정은 G10 및 G11 명령을 사용하여 펌웨어에서 취소를 처리하도록합니다. 이것은 최근의 말린에서만 지원됩" -"니다." - -#: src/libslic3r/PrintConfig.cpp:2065 -msgid "Use relative E distances" -msgstr "상대적인 E 거리 사용" - -#: src/libslic3r/PrintConfig.cpp:2066 -msgid "" -"If your firmware requires relative E values, check this, otherwise leave it unchecked. Most firmwares use " -"absolute values." -msgstr "" -"펌웨어에 상대 E 값이 필요한 경우이 값을 선택하고, 그렇지 않으면 선택하지 마십시오. 대부분의 회사는 절대 값을 " -"사용합니다." - -#: src/libslic3r/PrintConfig.cpp:2072 -msgid "Use volumetric E" -msgstr "용적 E 사용" - -#: src/libslic3r/PrintConfig.cpp:2073 -msgid "" -"This experimental setting uses outputs the E values in cubic millimeters instead of linear millimeters. If " -"your firmware doesn't already know filament diameter(s), you can put commands like 'M200 " -"D[filament_diameter_0] T0' in your start G-code in order to turn volumetric mode on and use the filament " -"diameter associated to the filament selected in Slic3r. This is only supported in recent Marlin." -msgstr "" -"이 실험 설정은 선형 밀리미터 대신에 입방 밀리미터 단위의 E 값을 출력으로 사용합니다. 펌웨어가 필라멘트 직경을 " -"모르는 경우 볼륨 모드를 켜고 선택한 필라멘트와 연결된 필라멘트 직경을 사용하기 위해 시작 G 코드에 'M200 D " -"[filament_diameter_0] T0'과 같은 명령을 입력 할 수 있습니다 Slic3r. 이것은 최근의 말린에서만 지원됩니다." - -#: src/libslic3r/PrintConfig.cpp:2083 -msgid "Enable variable layer height feature" -msgstr "가변 레이어 높이 기능 사용" - -#: src/libslic3r/PrintConfig.cpp:2084 -msgid "" -"Some printers or printer setups may have difficulties printing with a variable layer height. Enabled by " -"default." -msgstr "" -"일부 프린터 또는 프린터 설정은 가변 레이어 높이로 인쇄하는 데 어려움이있을 수 있습니다. 기본적으로 사용됩니다." - -#: src/libslic3r/PrintConfig.cpp:2090 -msgid "Wipe while retracting" -msgstr "수축시 닦아내십시오" - -#: src/libslic3r/PrintConfig.cpp:2091 -msgid "This flag will move the nozzle while retracting to minimize the possible blob on leaky extruders." -msgstr "이 플래그는 누출된 리트랙싱의 블럽 가능성을 최소화하기 위해 수축하는 동안 노즐을 이동시킨다." - -#: src/libslic3r/PrintConfig.cpp:2098 -msgid "" -"Multi material printers may need to prime or purge extruders on tool changes. Extrude the excess material " -"into the wipe tower." -msgstr "" -"멀티 메터리알 프린터는 공구 교환 시 익스트루더를 프라이밍하거나 제거해야 할 수 있다. 과도한 물질을 와이퍼 타워" -"에 돌출시킨다." - -#: src/libslic3r/PrintConfig.cpp:2104 -msgid "Purging volumes - load/unload volumes" -msgstr "볼륨 삭제 - 볼륨 로드/언로드" - -#: src/libslic3r/PrintConfig.cpp:2105 -msgid "" -"This vector saves required volumes to change from/to each tool used on the wipe tower. These values are used " -"to simplify creation of the full purging volumes below. " -msgstr "" -"이 벡터는 와이퍼 작동 타워에 사용되는 각 공구와 교환하는 데 필요한 볼륨을 저장한다. 이러한 값은 아래 전체 삭" -"제 볼륨 생성을 단순화하기 위해 사용된다. " - -#: src/libslic3r/PrintConfig.cpp:2111 -msgid "Purging volumes - matrix" -msgstr "볼륨 삭제 - 행렬" - -#: src/libslic3r/PrintConfig.cpp:2112 -msgid "" -"This matrix describes volumes (in cubic milimetres) required to purge the new filament on the wipe tower for " -"any given pair of tools. " -msgstr "이 매트릭스는 주어진 공구 쌍에 대해 새 필라멘트를 지우는 데 필요한 볼륨(입방 밀리미터)을 설명한다. " - -#: src/libslic3r/PrintConfig.cpp:2121 -msgid "Position X" -msgstr "X축 위치" - -#: src/libslic3r/PrintConfig.cpp:2122 -msgid "X coordinate of the left front corner of a wipe tower" -msgstr "와이프 타워의 좌측 전면 모서리의 X 좌표" - -#: src/libslic3r/PrintConfig.cpp:2128 -msgid "Position Y" -msgstr "Y축 위치" - -#: src/libslic3r/PrintConfig.cpp:2129 -msgid "Y coordinate of the left front corner of a wipe tower" -msgstr "와이퍼 작동 타워의 좌측 전방 모서리의 Y 좌표" - -#: src/libslic3r/PrintConfig.cpp:2136 -msgid "Width of a wipe tower" -msgstr "와이퍼 타워 폭" - -#: src/libslic3r/PrintConfig.cpp:2142 -msgid "Wipe tower rotation angle" -msgstr "와이퍼 타워 회전각도" - -#: src/libslic3r/PrintConfig.cpp:2143 -msgid "Wipe tower rotation angle with respect to x-axis " -msgstr "X 축에 대한 와이퍼 타워 각도 " - -#: src/libslic3r/PrintConfig.cpp:2144 src/libslic3r/PrintConfig.cpp:2565 -msgid "degrees" -msgstr "각도" - -#: src/libslic3r/PrintConfig.cpp:2150 -msgid "Wipe into this object's infill" -msgstr "이 오브젝트의 채우기로 지우기" - -#: src/libslic3r/PrintConfig.cpp:2151 -msgid "" -"Purging after toolchange will done inside this object's infills. This lowers the amount of waste but may " -"result in longer print time due to additional travel moves." -msgstr "" -"도구 변경 후 제거는 이 개체의 채우기 내부에서 수행 됩니다. 이렇게 하면 낭비 되는 양이 줄어들지만 추가적인 이동" -"으로 인해 인쇄 시간이 길어질 수 있습니다." - -#: src/libslic3r/PrintConfig.cpp:2158 -msgid "Wipe into this object" -msgstr "이 개체로 지우기" - -#: src/libslic3r/PrintConfig.cpp:2159 -msgid "" -"Object will be used to purge the nozzle after a toolchange to save material that would otherwise end up in " -"the wipe tower and decrease print time. Colours of the objects will be mixed as a result." -msgstr "" -"객체는 도구 변경 후 노즐을 소거 하는 데 사용 되며, 그렇지 않으면 와이프 타워에서 종료 되는 재료를 저장 하고 인" -"쇄 시간을 줄입니다. 그 결과 개체의 색상이 혼합 됩니다." - -#: src/libslic3r/PrintConfig.cpp:2165 -msgid "Maximal bridging distance" -msgstr "최대 브리징 거리" - -#: src/libslic3r/PrintConfig.cpp:2166 -msgid "Maximal distance between supports on sparse infill sections. " -msgstr "드문드문하 인필 섹션에서 지지대 사이의 최대 거리. " - -#: src/libslic3r/PrintConfig.cpp:2172 -msgid "XY Size Compensation" -msgstr "XY 크기 보정" - -#: src/libslic3r/PrintConfig.cpp:2174 -msgid "" -"The object will be grown/shrunk in the XY plane by the configured value (negative = inwards, positive = " -"outwards). This might be useful for fine-tuning hole sizes." -msgstr "" -"XY 평면에서 설정된 값(음수 = 안, 양 = 바깥쪽)에 따라 객체가 증가/정격된다. 이는 구멍 크기를 미세 조정하는데 유" -"용할 수 있다." - -#: src/libslic3r/PrintConfig.cpp:2182 -msgid "Z offset" -msgstr "Z 오프셋" - -#: src/libslic3r/PrintConfig.cpp:2183 -msgid "" -"This value will be added (or subtracted) from all the Z coordinates in the output G-code. It is used to " -"compensate for bad Z endstop position: for example, if your endstop zero actually leaves the nozzle 0.3mm far " -"from the print bed, set this to -0.3 (or fix your endstop)." -msgstr "" -"이 값은 출력 G-코드의 모든 Z 좌표에서 추가(또는 감산)된다. 예를 들어, 엔드 스톱 0이 실제로 노즐을 프린트 베드" -"에서 0.3mm 떨어진 곳에 둔 경우, 이를 -0.3(또는 엔드 스톱을 고정)으로 설정하십시오." - -#: src/libslic3r/PrintConfig.cpp:2200 -msgid "Display width" -msgstr "디스플레이 너비" - -#: src/libslic3r/PrintConfig.cpp:2201 -msgid "Width of the display" -msgstr "디스플레이의 폭입니다" - -#: src/libslic3r/PrintConfig.cpp:2206 -msgid "Display height" -msgstr "표시 높이" - -#: src/libslic3r/PrintConfig.cpp:2207 -msgid "Height of the display" -msgstr "디스플레이의 높이" - -#: src/libslic3r/PrintConfig.cpp:2212 -msgid "Number of pixels in" -msgstr "의 픽셀 수" - -#: src/libslic3r/PrintConfig.cpp:2214 -msgid "Number of pixels in X" -msgstr "X의 픽셀 수" - -#: src/libslic3r/PrintConfig.cpp:2220 -msgid "Number of pixels in Y" -msgstr "Y의 픽셀 수" - -#: src/libslic3r/PrintConfig.cpp:2225 -msgid "Display orientation" -msgstr "디스플레이 방향" - -#: src/libslic3r/PrintConfig.cpp:2226 -msgid "" -"Set the actual LCD display orientation inside the SLA printer. Portrait mode will flip the meaning of display " -"width and height parameters and the output images will be rotated by 90 degrees." -msgstr "" -"SLA 프린터 내에서 실제 LCD 디스플레이 방향을 설정 합니다. 세로 모드는 디스플레이 너비 및 높이 매개 변수의 의미" -"를 반전 하 고 출력 이미지는 90도 회전 합니다." - -#: src/libslic3r/PrintConfig.cpp:2232 -msgid "Landscape" -msgstr "가로" - -#: src/libslic3r/PrintConfig.cpp:2233 -msgid "Portrait" -msgstr "세로모드" - -#: src/libslic3r/PrintConfig.cpp:2238 -msgid "Fast" -msgstr "빠른" - -#: src/libslic3r/PrintConfig.cpp:2239 -msgid "Fast tilt" -msgstr "빠른 기울기" - -#: src/libslic3r/PrintConfig.cpp:2240 -msgid "Time of the fast tilt" -msgstr "기울이기 시간" - -#: src/libslic3r/PrintConfig.cpp:2247 -msgid "Slow" -msgstr "느리게" - -#: src/libslic3r/PrintConfig.cpp:2248 -msgid "Slow tilt" -msgstr "슬로우 틸트" - -#: src/libslic3r/PrintConfig.cpp:2249 -msgid "Time of the slow tilt" -msgstr "느린 기울기의 시간" - -#: src/libslic3r/PrintConfig.cpp:2256 -msgid "Area fill" -msgstr "영역 채우기" - -#: src/libslic3r/PrintConfig.cpp:2257 -msgid "" -"The percentage of the bed area. \n" -"If the print area exceeds the specified value, \n" -"then a slow tilt will be used, otherwise - a fast tilt" -msgstr "" -"침대 영역의 비율입니다. \n" -"인쇄 영역이 지정 된 값을 초과 하면 \n" -"그런 다음 느린 기울기가 사용 됩니다, 그렇지 않으면-빠른 기울기가 됩니다" - -#: src/libslic3r/PrintConfig.cpp:2264 src/libslic3r/PrintConfig.cpp:2265 src/libslic3r/PrintConfig.cpp:2266 -msgid "Printer scaling correction" -msgstr "프린터 스케일링 보정" - -#: src/libslic3r/PrintConfig.cpp:2272 src/libslic3r/PrintConfig.cpp:2273 -msgid "Printer absolute correction" -msgstr "프린터 절대 보정" - -#: src/libslic3r/PrintConfig.cpp:2274 -msgid "Will inflate or deflate the sliced 2D polygons according to the sign of the correction." -msgstr "교정 기호에 따라 슬라이스된 2D 폴리곤을 팽창 하거나 수축 합니다." - -#: src/libslic3r/PrintConfig.cpp:2280 src/libslic3r/PrintConfig.cpp:2281 -msgid "Printer gamma correction" -msgstr "프린터 감마 보정" - -#: src/libslic3r/PrintConfig.cpp:2282 -msgid "This will apply a gamm correction to the rasterized 2D polygons." -msgstr "그러면 래스터화된 2d 다각형 폴리고 보정이 적용 됩니다." - -#: src/libslic3r/PrintConfig.cpp:2291 src/libslic3r/PrintConfig.cpp:2292 -msgid "Initial layer height" -msgstr "초기 레이어 높이" - -#: src/libslic3r/PrintConfig.cpp:2298 -msgid "Faded layers" -msgstr "페이드 레이어" - -#: src/libslic3r/PrintConfig.cpp:2299 -msgid "Number of the layers needed for the exposure time fade from initial exposure time to the exposure time" -msgstr "노출 시간에 필요한 레이어 수는 초기 노출 시간에서 노출 시간으로 페이드" - -#: src/libslic3r/PrintConfig.cpp:2306 src/libslic3r/PrintConfig.cpp:2307 -msgid "Exposure time" -msgstr "노출 시간" - -#: src/libslic3r/PrintConfig.cpp:2313 src/libslic3r/PrintConfig.cpp:2314 -msgid "Initial exposure time" -msgstr "초기 노출 시간" - -#: src/libslic3r/PrintConfig.cpp:2320 src/libslic3r/PrintConfig.cpp:2321 -msgid "Correction for expansion" -msgstr "확장 보정" - -#: src/libslic3r/PrintConfig.cpp:2327 -msgid "SLA print material notes" -msgstr "SLA 인쇄 재료 참고 사항" - -#: src/libslic3r/PrintConfig.cpp:2328 -msgid "You can put your notes regarding the SLA print material here." -msgstr "여기에서 SLA 인쇄 자료에 대한 메모를 넣을 수 있습니다." - -#: src/libslic3r/PrintConfig.cpp:2336 src/libslic3r/PrintConfig.cpp:2347 -msgid "Default SLA material profile" -msgstr "기본 SLA 재질 프로 파일" - -#: src/libslic3r/PrintConfig.cpp:2358 -msgid "Generate supports" -msgstr "지원 생성" - -#: src/libslic3r/PrintConfig.cpp:2360 -msgid "Generate supports for the models" -msgstr "모델에 대한 지원 생성" - -#: src/libslic3r/PrintConfig.cpp:2365 -msgid "Support head front diameter" -msgstr "서포트 헤드 전면 지름" - -#: src/libslic3r/PrintConfig.cpp:2367 -msgid "Diameter of the pointing side of the head" -msgstr "헤드 포인팅 측면 지름" - -#: src/libslic3r/PrintConfig.cpp:2374 -msgid "Support head penetration" -msgstr "서포트 헤드 관통" - -#: src/libslic3r/PrintConfig.cpp:2376 -msgid "How much the pinhead has to penetrate the model surface" -msgstr "핀 헤드가 모델 표면에 침투 하는 정도" - -#: src/libslic3r/PrintConfig.cpp:2383 -msgid "Support head width" -msgstr "서포트 헤드 폭" - -#: src/libslic3r/PrintConfig.cpp:2385 -msgid "Width from the back sphere center to the front sphere center" -msgstr "뒤쪽 구 중심에서 앞쪽 구 중심 까지의 폭입니다" - -#: src/libslic3r/PrintConfig.cpp:2393 -msgid "Support pillar diameter" -msgstr "서포트 기둥 지름" - -#: src/libslic3r/PrintConfig.cpp:2395 -msgid "Diameter in mm of the support pillars" -msgstr "서포트 기둥의 지름 (mm)" - -#: src/libslic3r/PrintConfig.cpp:2403 -msgid "Support pillar connection mode" -msgstr "기둥 연결 모드 지원" - -#: src/libslic3r/PrintConfig.cpp:2404 -msgid "" -"Controls the bridge type between two neigboring pillars. Can be zig-zag, cross (double zig-zag) or dynamic " -"which will automatically switch between the first two depending on the distance of the two pillars." -msgstr "" -"두 개의 neigboring 기둥 사이의 브릿지 유형을 제어 합니다. 두 기둥의 거리에 따라 자동으로 처음 두 사이를 전환 " -"하는 지그재그, 크로스 (지그재그 더블 지그재그) 또는 동적 수 있습니다." - -#: src/libslic3r/PrintConfig.cpp:2412 -msgid "Zig-Zag" -msgstr "지그재그" - -#: src/libslic3r/PrintConfig.cpp:2413 -msgid "Cross" -msgstr "크로스" - -#: src/libslic3r/PrintConfig.cpp:2414 -msgid "Dynamic" -msgstr "동적" - -#: src/libslic3r/PrintConfig.cpp:2426 -msgid "Pillar widening factor" -msgstr "기둥 확장 계수" - -#: src/libslic3r/PrintConfig.cpp:2428 -msgid "" -"Merging bridges or pillars into another pillars can increase the radius. Zero means no increase, one means " -"full increase." -msgstr "" -"브릿지 또는 기둥을 다른 기둥에 병합 하면 반지름을 늘릴 수 있습니다. 0은 증가 없음을 의미 하나는 전체 증가를 의" -"미 합니다." - -#: src/libslic3r/PrintConfig.cpp:2437 -msgid "Support base diameter" -msgstr "서포트 베이스 지름" - -#: src/libslic3r/PrintConfig.cpp:2439 -msgid "Diameter in mm of the pillar base" -msgstr "기둥 베이스의 mm 직경" - -#: src/libslic3r/PrintConfig.cpp:2447 -msgid "Support base height" -msgstr "서포트 기준 높이" - -#: src/libslic3r/PrintConfig.cpp:2449 -msgid "The height of the pillar base cone" -msgstr "서포트 베이스 원추의 높이" - -#: src/libslic3r/PrintConfig.cpp:2456 -msgid "Critical angle" -msgstr "임계 각도" - -#: src/libslic3r/PrintConfig.cpp:2458 -msgid "The default angle for connecting support sticks and junctions." -msgstr "서포트 스틱과 접합부를 연결 하는 기본 각도입니다." - -#: src/libslic3r/PrintConfig.cpp:2466 -msgid "Max bridge length" -msgstr "최대 브리지 길이" - -#: src/libslic3r/PrintConfig.cpp:2468 -msgid "The max length of a bridge" -msgstr "브릿지의 최대 길이" - -#: src/libslic3r/PrintConfig.cpp:2475 -msgid "Max pillar linking distance" -msgstr "최대 기둥 연결 거리" - -#: src/libslic3r/PrintConfig.cpp:2477 -msgid "" -"The max distance of two pillars to get linked with each other. A zero value will prohibit pillar cascading." -msgstr "서로 연결 되는 두기둥의 최대 거리. 0 값은 기둥을 계단식으로 금지 합니다." - -#: src/libslic3r/PrintConfig.cpp:2485 -msgid "Object elevation" -msgstr "객체 고도" - -#: src/libslic3r/PrintConfig.cpp:2487 -msgid "How much the supports should lift up the supported object." -msgstr "서포트 되는 개체를 서포트 해야 하는 정도입니다." - -#: src/libslic3r/PrintConfig.cpp:2497 -msgid "This is a relative measure of support points density." -msgstr "이는 서포트 점 밀도의 상대적인 척도입니다." - -#: src/libslic3r/PrintConfig.cpp:2503 -msgid "Minimal distance of the support points" -msgstr "서포트 지점의 최소 거리" - -#: src/libslic3r/PrintConfig.cpp:2505 -msgid "No support points will be placed closer than this threshold." -msgstr "서포트 지점은 이 임계값 보다 더 가깝게 배치 되지 않습니다." - -#: src/libslic3r/PrintConfig.cpp:2511 -msgid "Use pad" -msgstr "패드 사용" - -#: src/libslic3r/PrintConfig.cpp:2513 -msgid "Add a pad underneath the supported model" -msgstr "서포트 되는 모델 아래에 패드 추가" - -#: src/libslic3r/PrintConfig.cpp:2518 -msgid "Pad wall thickness" -msgstr "패드 벽 두께" - -#: src/libslic3r/PrintConfig.cpp:2520 -msgid "The thickness of the pad and its optional cavity walls." -msgstr "패드의 두께와 옵션 캐비티 벽." - -#: src/libslic3r/PrintConfig.cpp:2528 -msgid "Pad wall height" -msgstr "패드 벽 높이" - -#: src/libslic3r/PrintConfig.cpp:2529 -msgid "Defines the cavity depth. Set to zero to disable the cavity." -msgstr "캐비티 깊이를 정의 합니다. 캐비티를 비활성화 하려면 0으로 설정 합니다." - -#: src/libslic3r/PrintConfig.cpp:2539 -msgid "Max merge distance" -msgstr "최대 병합 거리" - -#: src/libslic3r/PrintConfig.cpp:2541 -msgid "" -"Some objects can get along with a few smaller pads instead of a single big one. This parameter defines how " -"far the center of two smaller pads should be. If theyare closer, they will get merged into one pad." -msgstr "" -"일부 개체는 큰 하나 대신 몇 가지 작은 패드와 함께 얻을 수 있습니다. 이 매개 변수는 두 개의 작은 패드의 중심이 " -"얼마나 되어야 하는지 정의 합니다. 그들은 하나의 패드에 병합을 얻을 것이다." - -#: src/libslic3r/PrintConfig.cpp:2552 -msgid "Pad edge radius" -msgstr "패드 가장자리 반경" - -#: src/libslic3r/PrintConfig.cpp:2561 -msgid "Pad wall slope" -msgstr "패드 벽 경사" - -#: src/libslic3r/PrintConfig.cpp:2563 -msgid "The slope of the pad wall relative to the bed plane. 90 degrees means straight walls." -msgstr "침대 평면을 기준으로 하는 패드 벽의 기울기입니다. 90도는 직선 벽을 의미 합니다." - -#: src/libslic3r/PrintConfig.cpp:2924 -msgid "Export SVG" -msgstr "내보내기 SVG" - -#: src/libslic3r/PrintConfig.cpp:2925 -msgid "Export the model(s) as OBJ." -msgstr "모델을 OBJ로 내보냅니다." - -#: src/libslic3r/PrintConfig.cpp:2936 -msgid "Export SLA" -msgstr "STL로 내보내기" - -#: src/libslic3r/PrintConfig.cpp:2937 -msgid "Slice the model and export SLA printing layers as PNG." -msgstr "모델을 분할하고 SLA 인쇄 레이어를 PNG로 내보냅니다." - -#: src/libslic3r/PrintConfig.cpp:2942 -msgid "Export 3MF" -msgstr "3MF 내보내기" - -#: src/libslic3r/PrintConfig.cpp:2943 -msgid "Export the model(s) as 3MF." -msgstr "모델을 3MF로 내보냅니다." - -#: src/libslic3r/PrintConfig.cpp:2947 -msgid "Export AMF" -msgstr "AMF 내보내기" - -#: src/libslic3r/PrintConfig.cpp:2948 -msgid "Export the model(s) as AMF." -msgstr "모델을 AMF로 내보냅니다." - -#: src/libslic3r/PrintConfig.cpp:2952 -msgid "Export STL" -msgstr "STL 내보내기" - -#: src/libslic3r/PrintConfig.cpp:2953 -msgid "Export the model(s) as STL." -msgstr "모델을 STL로 내보냅니다." - -#: src/libslic3r/PrintConfig.cpp:2958 -msgid "Slice the model and export toolpaths as G-code." -msgstr "모델을 슬라이스하고 공구 경로를 G 코드로 내보냅니다." - -#: src/libslic3r/PrintConfig.cpp:2963 -msgid "Slice" -msgstr "슬라이스" - -#: src/libslic3r/PrintConfig.cpp:2964 -msgid "Slice the model as FFF or SLA based on the printer_technology configuration value." -msgstr "Printer_technology 구성 값을 기반으로 모델을 FFF 또는 SLA로 조각화 합니다." - -#: src/libslic3r/PrintConfig.cpp:2969 -msgid "Help" -msgstr "도움말" - -#: src/libslic3r/PrintConfig.cpp:2970 -msgid "Show this help." -msgstr "이 도움말을 표시 합니다." - -#: src/libslic3r/PrintConfig.cpp:2975 -msgid "Help (FFF options)" -msgstr "도움말 (FFF 옵션)" - -#: src/libslic3r/PrintConfig.cpp:2976 -msgid "Show the full list of print/G-code configuration options." -msgstr "인쇄/G 코드 구성 옵션의 전체 목록을 표시 합니다." - -#: src/libslic3r/PrintConfig.cpp:2980 -msgid "Help (SLA options)" -msgstr "도움말 (SLA 옵션)" - -#: src/libslic3r/PrintConfig.cpp:2981 -msgid "Show the full list of SLA print configuration options." -msgstr "SLA 인쇄 구성 옵션의 전체 목록을 표시 합니다." - -#: src/libslic3r/PrintConfig.cpp:2985 -msgid "Output Model Info" -msgstr "출력 모델 정보" - -#: src/libslic3r/PrintConfig.cpp:2986 -msgid "Write information about the model to the console." -msgstr "모델에 대한 정보를 콘솔에 씁니다." - -#: src/libslic3r/PrintConfig.cpp:2990 -msgid "Save config file" -msgstr "구성 파일 저장" - -#: src/libslic3r/PrintConfig.cpp:2991 -msgid "Save configuration to the specified file." -msgstr "지정 된 파일에 구성을 저장 합니다." - -#: src/libslic3r/PrintConfig.cpp:3001 -msgid "Align XY" -msgstr "XY 정렬" - -#: src/libslic3r/PrintConfig.cpp:3002 -msgid "Align the model to the given point." -msgstr "모델을 지정된 점에 맞춥니다." - -#: src/libslic3r/PrintConfig.cpp:3007 -msgid "Cut model at the given Z." -msgstr "지정된 Z에서 모델을 잘라냅니다." - -#: src/libslic3r/PrintConfig.cpp:3028 -msgid "Center" -msgstr "중앙" - -#: src/libslic3r/PrintConfig.cpp:3029 -msgid "Center the print around the given center." -msgstr "지정된 중심을 중심으로 인쇄 합니다." - -#: src/libslic3r/PrintConfig.cpp:3033 -msgid "Don't arrange" -msgstr "준비하지 마십시오" - -#: src/libslic3r/PrintConfig.cpp:3034 -msgid "Do not rearrange the given models before merging and keep their original XY coordinates." -msgstr "병합하기 전에 지정된 모델을 재정렬하고 원래 XY 좌표를 유지하지 마십시오." - -#: src/libslic3r/PrintConfig.cpp:3037 -msgid "Duplicate" -msgstr "복사" - -#: src/libslic3r/PrintConfig.cpp:3038 -msgid "Multiply copies by this factor." -msgstr "이 계수로 복사본을 곱합니다." - -#: src/libslic3r/PrintConfig.cpp:3042 -msgid "Duplicate by grid" -msgstr "모눈에 따라 복제" - -#: src/libslic3r/PrintConfig.cpp:3043 -msgid "Multiply copies by creating a grid." -msgstr "격자를 만들어 복사본을 곱합니다." - -#: src/libslic3r/PrintConfig.cpp:3046 -msgid "Merge" -msgstr "병합" - -#: src/libslic3r/PrintConfig.cpp:3047 -msgid "" -"Arrange the supplied models in a plate and merge them in a single model in order to perform actions once." -msgstr "한 번 작업을 수행하기 위해 제공 된 모델을 정렬하고 단일 모델로 병합 합니다." - -#: src/libslic3r/PrintConfig.cpp:3052 -msgid "" -"Try to repair any non-manifold meshes (this option is implicitly added whenever we need to slice the model to " -"perform the requested action)." -msgstr "" -"비 다양체 메쉬를 복구 하십시오 (요청 된 작업을 수행 하기 위해 모델을 슬라이스 해야 할때마다 이 옵션이 암시적으" -"로 추가 됨)." - -#: src/libslic3r/PrintConfig.cpp:3056 -msgid "Rotation angle around the Z axis in degrees." -msgstr "Z 축 주위의 회전 각도입니다." - -#: src/libslic3r/PrintConfig.cpp:3060 -msgid "Rotate around X" -msgstr "X 주위 회전" - -#: src/libslic3r/PrintConfig.cpp:3061 -msgid "Rotation angle around the X axis in degrees." -msgstr "X 축을 중심으로 회전 각도 (도)입니다." - -#: src/libslic3r/PrintConfig.cpp:3065 -msgid "Rotate around Y" -msgstr "Y 주위로 회전" - -#: src/libslic3r/PrintConfig.cpp:3066 -msgid "Rotation angle around the Y axis in degrees." -msgstr "Y 축을 중심으로 회전 각도 (도)입니다." - -#: src/libslic3r/PrintConfig.cpp:3071 -msgid "Scaling factor or percentage." -msgstr "배율 인수 또는 백분율입니다." - -#: src/libslic3r/PrintConfig.cpp:3076 -msgid "Detect unconnected parts in the given model(s) and split them into separate objects." -msgstr "지정 된 모델에서 연결 되지 않은 부품을 감지 하 여 별도의 객체로 분할 합니다." - -#: src/libslic3r/PrintConfig.cpp:3079 -msgid "Scale to Fit" -msgstr "크기에 맞게 조정" - -#: src/libslic3r/PrintConfig.cpp:3080 -msgid "Scale to fit the given volume." -msgstr "지정 된 볼륨에 맞게 크기를 조정 합니다." - -#: src/libslic3r/PrintConfig.cpp:3089 -msgid "Ignore non-existent config files" -msgstr "존재 하지 않는 구성 파일 무시" - -#: src/libslic3r/PrintConfig.cpp:3090 -msgid "Do not fail if a file supplied to --load does not exist." -msgstr "로드에 제공 된 파일이 없는 경우 실패 하지 않습니다." - -#: src/libslic3r/PrintConfig.cpp:3093 -msgid "Load config file" -msgstr "구성 파일 로드" - -#: src/libslic3r/PrintConfig.cpp:3094 -msgid "" -"Load configuration from the specified file. It can be used more than once to load options from multiple files." -msgstr "지정 된 파일에서 구성을 로드 합니다. 여러 파일에서 옵션을 로드 하는 데 두 번 이상 사용할 수 있습니다." - -#: src/libslic3r/PrintConfig.cpp:3097 -msgid "Output File" -msgstr "출력파일" - -#: src/libslic3r/PrintConfig.cpp:3098 -msgid "The file where the output will be written (if not specified, it will be based on the input file)." -msgstr "출력이 기록 되는 파일 (지정 하지 않은 경우 입력 파일을 기반으로 합니다)." - -#: src/libslic3r/PrintConfig.cpp:3108 -msgid "Data directory" -msgstr "데이터 디렉터리" - -#: src/libslic3r/PrintConfig.cpp:3109 -msgid "" -"Load and store settings at the given directory. This is useful for maintaining different profiles or " -"including configurations from a network storage." -msgstr "" -"지정 된 디렉터리에 설정을 로드 하 고 저장 합니다. 이 기능은 다른 프로 파일을 유지 관리 하거나 네트워크 스토리" -"지의 구성을 포함 하는 데 유용 합니다." - -#: src/libslic3r/PrintConfig.cpp:3112 -msgid "Logging level" -msgstr "로깅 수준" - -#: src/libslic3r/PrintConfig.cpp:3113 -msgid "" -"Messages with severity lower or eqal to the loglevel will be printed out. 0:trace, 1:debug, 2:info, 3:" -"warning, 4:error, 5:fatal" -msgstr "심각도가 낮은 또는 eqal로 loglevel으로 메시지가 인쇄 됩니다. 추적, 1: 디버그, 2: 경고, 오류 5: 치명적" - -#: src/libslic3r/GCode/PreviewData.cpp:176 -msgid "Mixed" -msgstr "뒤석음" - -#: src/libslic3r/GCode/PreviewData.cpp:396 -msgid "Height (mm)" -msgstr "높이 (mm)" - -#: src/libslic3r/GCode/PreviewData.cpp:398 -msgid "Width (mm)" -msgstr "폭 (mm)" - -#: src/libslic3r/GCode/PreviewData.cpp:400 -msgid "Speed (mm/s)" -msgstr "속도 (mm/s)" - -#: src/libslic3r/GCode/PreviewData.cpp:402 -msgid "Volumetric flow rate (mm3/s)" -msgstr "용적 유량값 (mm3/s)" - -#: src/libslic3r/GCode/PreviewData.cpp:491 -msgid "Default print color" -msgstr "기본 인쇄 색상" - -#: src/libslic3r/GCode/PreviewData.cpp:495 -#, c-format -msgid "up to %.2f mm" -msgstr "최대%.2f mm" - -#: src/libslic3r/GCode/PreviewData.cpp:499 -#, c-format -msgid "above %.2f mm" -msgstr "above %.2f mm" - -#: src/libslic3r/GCode/PreviewData.cpp:504 -#, c-format -msgid "%.2f - %.2f mm" -msgstr "%.2f - %.2f mm" From 2093007eb60db461742b6f99bd3b86044d1f40a9 Mon Sep 17 00:00:00 2001 From: lee hakmin Date: Fri, 23 Aug 2019 23:50:26 +0900 Subject: [PATCH 007/336] Delete PrusaSlicer_kr(new).mo --- .../localization/ko_KR/PrusaSlicer_kr(new).mo | Bin 214548 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 resources/localization/ko_KR/PrusaSlicer_kr(new).mo diff --git a/resources/localization/ko_KR/PrusaSlicer_kr(new).mo b/resources/localization/ko_KR/PrusaSlicer_kr(new).mo deleted file mode 100644 index 6c539b6979848fd1e2ecfc052784271c396d4d38..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 214548 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 Date: Fri, 23 Aug 2019 23:50:41 +0900 Subject: [PATCH 008/336] Delete PrusaSlicer_kr(new).po --- .../localization/ko_KR/PrusaSlicer_kr(new).po | 8978 ----------------- 1 file changed, 8978 deletions(-) delete mode 100644 resources/localization/ko_KR/PrusaSlicer_kr(new).po diff --git a/resources/localization/ko_KR/PrusaSlicer_kr(new).po b/resources/localization/ko_KR/PrusaSlicer_kr(new).po deleted file mode 100644 index 75dc6cada5..0000000000 --- a/resources/localization/ko_KR/PrusaSlicer_kr(new).po +++ /dev/null @@ -1,8978 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-08-06 09:54+0200\n" -"PO-Revision-Date: 2019-08-23 23:38+0900\n" -"Language-Team: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.2.3\n" -"Last-Translator: \n" -"Plural-Forms: nplurals=1; plural=0;\n" -"Language: ko\n" - -#: src/slic3r/GUI/AboutDialog.cpp:39 src/slic3r/GUI/AboutDialog.cpp:289 -msgid "Portions copyright" -msgstr "다르 저작권" - -#: src/slic3r/GUI/AboutDialog.cpp:125 src/slic3r/GUI/AboutDialog.cpp:254 -msgid "Copyright" -msgstr "저작권" - -#. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:127 -msgid "" -"License agreements of all following programs (libraries) are part of " -"application license agreement" -msgstr "" -"다음의 모든 프로그램 (라이브러리)의 라이센스 계약은 응용 프로그램 라이센스 계" -"약의 일부입니다." - -#: src/slic3r/GUI/AboutDialog.cpp:197 -#, c-format -msgid "About %s" -msgstr "%s에 대하여" - -#: src/slic3r/GUI/AboutDialog.cpp:229 src/slic3r/GUI/MainFrame.cpp:60 -msgid "Version" -msgstr "버전" - -#. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:256 -msgid "is licensed under the" -msgstr "라이선스는" - -#: src/slic3r/GUI/AboutDialog.cpp:257 -msgid "GNU Affero General Public License, version 3" -msgstr "GNU Affero 일반 공중 사용 허가서, 버전 3" - -#: src/slic3r/GUI/AboutDialog.cpp:258 -msgid "" -"PrusaSlicer is based on Slic3r by Alessandro Ranellucci and the RepRap " -"community." -msgstr "" -"프루사슬라이서는 알레산드로 라넬루치와 RepRap 커뮤니티 Slic3r를 기반으로합니" -"다." - -#: src/slic3r/GUI/AboutDialog.cpp:259 -msgid "" -"Contributions by Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, " -"Petr Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik and " -"numerous others." -msgstr "" -"Contributions by Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, " -"Petr Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik and " -"numerous others. 한국어 번역 울산에테르." - -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:92 -msgid "" -"Copying of the temporary G-code to the output G-code failed. Maybe the SD " -"card is write locked?" -msgstr "" -"임시 G-코드를 출력할 SD카드에 복사하는 데 실패했습니다. SD카드의 락을 확인 하" -"시오." - -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:93 -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:406 -msgid "Running post-processing scripts" -msgstr "포스트 프로세싱 스크립트" - -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:95 -msgid "G-code file exported to %1%" -msgstr "%1%로 내보낸 G 코드 파일" - -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:99 -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:117 -msgid "Slicing complete" -msgstr "슬라이스 완료" - -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:113 -msgid "Masked SLA file exported to %1%" -msgstr "마스크 된 SLA 파일을 %1%로 내보냅니" - -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:408 -msgid "Copying of the temporary G-code to the output G-code failed" -msgstr "임시 G 코드를 출력 G 코드에 복사 하지 못했습니다" - -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:417 -msgid "Scheduling upload to `%1%`. See Window -> Print Host Upload Queue" -msgstr "" -"`%1%`. 로 업로드를 예약 합니다. 창-> 인쇄 호스트 업로드 대기열을 참조 하십시" -"오" - -#: src/slic3r/GUI/BedShapeDialog.cpp:65 -msgid "Shape" -msgstr "모양" - -#: src/slic3r/GUI/BedShapeDialog.cpp:72 -msgid "Rectangular" -msgstr "직사각형" - -#: src/slic3r/GUI/BedShapeDialog.cpp:76 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:391 src/slic3r/GUI/Plater.cpp:145 -#: src/slic3r/GUI/Tab.cpp:2469 -msgid "Size" -msgstr "사이즈" - -#: src/slic3r/GUI/BedShapeDialog.cpp:77 -msgid "Size in X and Y of the rectangular plate." -msgstr "사격형 플레이트 X 및 Y 크기." - -#: src/slic3r/GUI/BedShapeDialog.cpp:83 -msgid "Origin" -msgstr "원본" - -#: src/slic3r/GUI/BedShapeDialog.cpp:84 -msgid "" -"Distance of the 0,0 G-code coordinate from the front left corner of the " -"rectangle." -msgstr "사각형의 전면 왼쪽된 모서리에서 0, 0 G-코드 좌표 거리입니다." - -#: src/slic3r/GUI/BedShapeDialog.cpp:88 -msgid "Circular" -msgstr "원형" - -#: src/slic3r/GUI/BedShapeDialog.cpp:91 src/slic3r/GUI/ConfigWizard.cpp:118 -#: src/slic3r/GUI/ConfigWizard.cpp:571 src/slic3r/GUI/ConfigWizard.cpp:585 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:388 -#: src/slic3r/GUI/WipeTowerDialog.cpp:84 src/slic3r/GUI/wxExtensions.cpp:486 -#: src/libslic3r/PrintConfig.cpp:70 src/libslic3r/PrintConfig.cpp:77 -#: src/libslic3r/PrintConfig.cpp:86 src/libslic3r/PrintConfig.cpp:220 -#: src/libslic3r/PrintConfig.cpp:295 src/libslic3r/PrintConfig.cpp:303 -#: src/libslic3r/PrintConfig.cpp:353 src/libslic3r/PrintConfig.cpp:363 -#: src/libslic3r/PrintConfig.cpp:488 src/libslic3r/PrintConfig.cpp:499 -#: src/libslic3r/PrintConfig.cpp:517 src/libslic3r/PrintConfig.cpp:695 -#: src/libslic3r/PrintConfig.cpp:1215 src/libslic3r/PrintConfig.cpp:1276 -#: src/libslic3r/PrintConfig.cpp:1294 src/libslic3r/PrintConfig.cpp:1312 -#: src/libslic3r/PrintConfig.cpp:1364 src/libslic3r/PrintConfig.cpp:1374 -#: src/libslic3r/PrintConfig.cpp:1495 src/libslic3r/PrintConfig.cpp:1503 -#: src/libslic3r/PrintConfig.cpp:1544 src/libslic3r/PrintConfig.cpp:1552 -#: src/libslic3r/PrintConfig.cpp:1562 src/libslic3r/PrintConfig.cpp:1570 -#: src/libslic3r/PrintConfig.cpp:1578 src/libslic3r/PrintConfig.cpp:1661 -#: src/libslic3r/PrintConfig.cpp:1878 src/libslic3r/PrintConfig.cpp:1948 -#: src/libslic3r/PrintConfig.cpp:1982 src/libslic3r/PrintConfig.cpp:2176 -#: src/libslic3r/PrintConfig.cpp:2183 src/libslic3r/PrintConfig.cpp:2190 -#: src/libslic3r/PrintConfig.cpp:2220 src/libslic3r/PrintConfig.cpp:2230 -#: src/libslic3r/PrintConfig.cpp:2240 src/libslic3r/PrintConfig.cpp:2403 -#: src/libslic3r/PrintConfig.cpp:2478 src/libslic3r/PrintConfig.cpp:2487 -#: src/libslic3r/PrintConfig.cpp:2496 src/libslic3r/PrintConfig.cpp:2506 -#: src/libslic3r/PrintConfig.cpp:2550 src/libslic3r/PrintConfig.cpp:2560 -#: src/libslic3r/PrintConfig.cpp:2572 src/libslic3r/PrintConfig.cpp:2592 -#: src/libslic3r/PrintConfig.cpp:2602 src/libslic3r/PrintConfig.cpp:2613 -#: src/libslic3r/PrintConfig.cpp:2631 src/libslic3r/PrintConfig.cpp:2646 -#: src/libslic3r/PrintConfig.cpp:2660 src/libslic3r/PrintConfig.cpp:2673 -#: src/libslic3r/PrintConfig.cpp:2683 src/libslic3r/PrintConfig.cpp:2704 -#: src/libslic3r/PrintConfig.cpp:2715 src/libslic3r/PrintConfig.cpp:2725 -#: src/libslic3r/PrintConfig.cpp:2735 -msgid "mm" -msgstr "mm" - -#: src/slic3r/GUI/BedShapeDialog.cpp:92 src/libslic3r/PrintConfig.cpp:692 -msgid "Diameter" -msgstr "노즐 직경" - -#: src/slic3r/GUI/BedShapeDialog.cpp:93 -msgid "" -"Diameter of the print bed. It is assumed that origin (0,0) is located in the " -"center." -msgstr "인쇄 침대의 직경. 원점 (0,0) 은 중심에 있다고 가정합니다." - -#: src/slic3r/GUI/BedShapeDialog.cpp:97 src/slic3r/GUI/GUI_Preview.cpp:246 -#: src/libslic3r/GCode/PreviewData.cpp:175 -msgid "Custom" -msgstr "사용자 정의" - -#: src/slic3r/GUI/BedShapeDialog.cpp:101 -msgid "Load shape from STL..." -msgstr "STL파일 로드." - -#: src/slic3r/GUI/BedShapeDialog.cpp:154 -msgid "Settings" -msgstr "설정" - -#: src/slic3r/GUI/BedShapeDialog.cpp:171 -msgid "Texture" -msgstr "질감" - -#: src/slic3r/GUI/BedShapeDialog.cpp:181 src/slic3r/GUI/BedShapeDialog.cpp:249 -msgid "Load..." -msgstr "불러오기..." - -#: src/slic3r/GUI/BedShapeDialog.cpp:189 src/slic3r/GUI/BedShapeDialog.cpp:257 -#: src/slic3r/GUI/Tab.cpp:3204 -msgid "Remove" -msgstr "제거" - -#: src/slic3r/GUI/BedShapeDialog.cpp:239 -msgid "Model" -msgstr "모델" - -#: src/slic3r/GUI/BedShapeDialog.cpp:464 -msgid "Choose an STL file to import bed shape from:" -msgstr "다음 에서 침대 모양을 가져올 STL 파일을 선택합니다." - -#: src/slic3r/GUI/BedShapeDialog.cpp:471 src/slic3r/GUI/BedShapeDialog.cpp:520 -#: src/slic3r/GUI/BedShapeDialog.cpp:543 -msgid "Invalid file format." -msgstr "잘못된 파일 형식." - -#: src/slic3r/GUI/BedShapeDialog.cpp:482 -msgid "Error! Invalid model" -msgstr "오류! 잘못된 모델" - -#: src/slic3r/GUI/BedShapeDialog.cpp:490 -msgid "The selected file contains no geometry." -msgstr "선택한 파일에는 형상이 없는 포함 되어 있습니다." - -#: src/slic3r/GUI/BedShapeDialog.cpp:494 -msgid "" -"The selected file contains several disjoint areas. This is not supported." -msgstr "" -"선택한 파일 여러 분리 된 영역을 포함 되어 있습니다. 이것ㅇ 지원 되지 않습니" -"다." - -#: src/slic3r/GUI/BedShapeDialog.cpp:509 -msgid "Choose a file to import bed texture from (PNG/SVG):" -msgstr "(PNG /SVG)에서 침대 텍스처를 가져올 파일을 선택합니다." - -#: src/slic3r/GUI/BedShapeDialog.cpp:532 -msgid "Choose an STL file to import bed model from:" -msgstr "다음에서 침대 모델을 가져올 STL 파일을 선택합니다." - -#: src/slic3r/GUI/BedShapeDialog.hpp:59 src/slic3r/GUI/ConfigWizard.cpp:530 -msgid "Bed Shape" -msgstr "배드 모양" - -#: src/slic3r/GUI/BonjourDialog.cpp:55 -msgid "Network lookup" -msgstr "네트워크 조회" - -#: src/slic3r/GUI/BonjourDialog.cpp:72 -msgid "Address" -msgstr "주소" - -#: src/slic3r/GUI/BonjourDialog.cpp:73 -msgid "Hostname" -msgstr "호스트이름" - -#: src/slic3r/GUI/BonjourDialog.cpp:74 -msgid "Service name" -msgstr "서비스 이름" - -#: src/slic3r/GUI/BonjourDialog.cpp:76 -msgid "OctoPrint version" -msgstr "옥토프린트 버전" - -#: src/slic3r/GUI/BonjourDialog.cpp:218 -msgid "Searching for devices" -msgstr "디바이스 검색" - -#: src/slic3r/GUI/BonjourDialog.cpp:225 -msgid "Finished" -msgstr "완료" - -#: src/slic3r/GUI/ButtonsDescription.cpp:16 -msgid "Buttons And Text Colors Description" -msgstr "버튼 및 텍스트 색상 설명" - -#: src/slic3r/GUI/ButtonsDescription.cpp:36 -msgid "Value is the same as the system value" -msgstr "이 값은 시스템 값과 같습니다" - -#: src/slic3r/GUI/ButtonsDescription.cpp:53 -msgid "" -"Value was changed and is not equal to the system value or the last saved " -"preset" -msgstr "" -"값이 변경 되었고 시스템 값 또는 마지막으로 저장 된 사전 설정과 같지 않음" - -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:18 -msgid "Upgrade" -msgstr "업그레이드" - -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:20 -msgid "Downgrade" -msgstr "다운그레이드" - -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:22 -msgid "Before roll back" -msgstr "롤백 전에" - -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:24 -msgid "User" -msgstr "사용자" - -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:27 -msgid "Unknown" -msgstr "알 수 없음" - -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:39 -msgid "Active" -msgstr "활동중" - -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:45 -msgid "slic3r version" -msgstr "slic3r에 대하여" - -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:46 src/slic3r/GUI/Preset.cpp:1307 -msgid "print" -msgstr "프린트" - -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:47 -msgid "filaments" -msgstr "필라멘트" - -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:48 src/slic3r/GUI/Preset.cpp:1311 -msgid "printer" -msgstr "프린터" - -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:52 src/slic3r/GUI/Tab.cpp:939 -msgid "vendor" -msgstr "제조 회사" - -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:52 -msgid "version" -msgstr "버전" - -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:53 -msgid "min slic3r version" -msgstr "최소 slic3r 버전" - -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:55 -msgid "max slic3r version" -msgstr "최대 slic3r 버전" - -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:58 -msgid "model" -msgstr "모델" - -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:58 -msgid "variants" -msgstr "변종" - -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:70 -#, c-format -msgid "Incompatible with this %s" -msgstr "%s 과 호환되지 않습니다" - -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:73 -msgid "Activate" -msgstr "활성화" - -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:99 -msgid "Configuration Snapshots" -msgstr "구성 스냅숏" - -#: src/slic3r/GUI/ConfigWizard.cpp:118 -msgid "nozzle" -msgstr "노즐" - -#: src/slic3r/GUI/ConfigWizard.cpp:122 -msgid "Alternate nozzles:" -msgstr "대체 노즐:" - -#: src/slic3r/GUI/ConfigWizard.cpp:188 -msgid "All standard" -msgstr "모두 표준설정" - -#: src/slic3r/GUI/ConfigWizard.cpp:189 src/slic3r/GUI/Tab.cpp:3254 -msgid "All" -msgstr "모두 선택" - -#: src/slic3r/GUI/ConfigWizard.cpp:190 src/slic3r/GUI/Plater.cpp:470 -#: src/libslic3r/GCode/PreviewData.cpp:162 -msgid "None" -msgstr "없음" - -#: src/slic3r/GUI/ConfigWizard.cpp:296 -#, c-format -msgid "Welcome to the %s Configuration Assistant" -msgstr "%s 구성 도우미에 오신 것을 환영 합니다" - -#: src/slic3r/GUI/ConfigWizard.cpp:298 -#, c-format -msgid "Welcome to the %s Configuration Wizard" -msgstr "%s에 오신것을 환영 합니다." - -#: src/slic3r/GUI/ConfigWizard.cpp:300 -msgid "Welcome" -msgstr "환영합니다" - -#: src/slic3r/GUI/ConfigWizard.cpp:304 src/slic3r/GUI/GUI_App.cpp:747 -#, c-format -msgid "Run %s" -msgstr "%s 실행" - -#: src/slic3r/GUI/ConfigWizard.cpp:306 -#, c-format -msgid "" -"Hello, welcome to %s! This %s helps you with the initial configuration; just " -"a few settings and you will be ready to print." -msgstr "" -"안녕하세요 ,%s에 오신 것을 환영 합니다! 이 %s는 초기 구성에 도움이 됩니다. 그" -"냥 몇 가지 설정 하 고 당신은 인쇄 할 준비가 될 것입니다." - -#: src/slic3r/GUI/ConfigWizard.cpp:311 -msgid "" -"Remove user profiles - install from scratch (a snapshot will be taken " -"beforehand)" -msgstr "사용자 프로필 제거-처음부터 설치 (스냅숏은 사전에 수행 됩니다)" - -#: src/slic3r/GUI/ConfigWizard.cpp:342 -#, c-format -msgid "%s Family" -msgstr "%s의 가족들" - -#: src/slic3r/GUI/ConfigWizard.cpp:379 -msgid "Custom Printer Setup" -msgstr "사용자 지정 프린터 설정" - -#: src/slic3r/GUI/ConfigWizard.cpp:379 -msgid "Custom Printer" -msgstr "사용자 정의 프린터" - -#: src/slic3r/GUI/ConfigWizard.cpp:381 -msgid "Define a custom printer profile" -msgstr "사용자 정의 프린터 프로필 정의" - -#: src/slic3r/GUI/ConfigWizard.cpp:383 -msgid "Custom profile name:" -msgstr "사용자 지정 프로필 이름:" - -#: src/slic3r/GUI/ConfigWizard.cpp:407 -msgid "Automatic updates" -msgstr "자동 업데이트" - -#: src/slic3r/GUI/ConfigWizard.cpp:407 -msgid "Updates" -msgstr "업데이트" - -#: src/slic3r/GUI/ConfigWizard.cpp:415 src/slic3r/GUI/Preferences.cpp:69 -msgid "Check for application updates" -msgstr "프로그램 업데이트 확인" - -#: src/slic3r/GUI/ConfigWizard.cpp:419 -#, c-format -msgid "" -"If enabled, %s checks for new application versions online. When a new " -"version becomes available, a notification is displayed at the next " -"application startup (never during program usage). This is only a " -"notification mechanisms, no automatic installation is done." -msgstr "" -"활성화 된 경우 %s은 온라인의 새 버전을 확인합니다. 새 버전을 사용할 수있게되" -"면 다음 응용 프로그램 시작시 알림이 표시됩니다 (프로그램 사용 중에는 절대로 " -"사용하지 마십시오).이것은 알림 메커니즘 일뿐 자동 설치가 수행되지 않습니다." - -#: src/slic3r/GUI/ConfigWizard.cpp:425 src/slic3r/GUI/Preferences.cpp:77 -msgid "Update built-in Presets automatically" -msgstr "기존의 설정 자동 업데이트" - -#: src/slic3r/GUI/ConfigWizard.cpp:429 -#, c-format -msgid "" -"If enabled, %s downloads updates of built-in system presets in the " -"background.These updates are downloaded into a separate temporary location." -"When a new preset version becomes available it is offered at application " -"startup." -msgstr "" -"활성화 된 경우 %s은 백그라운드에서 내장 시스템 사전 설정의 업데이트를 다운로" -"드합니다. 이러한 업데이트는 별도의 임시 위치에 다운로드됩니다. 새로운 사전 설" -"정 버전을 사용할 수있게되면 응용 프로그램 시작시 제공됩니다." - -#: src/slic3r/GUI/ConfigWizard.cpp:432 -msgid "" -"Updates are never applied without user's consent and never overwrite user's " -"customized settings." -msgstr "" -"업데이트는 사용자의 동의없이 적용되지 않으며 사용자의 사용자 지정된 설정을 덮" -"어 쓰지 않습니다." - -#: src/slic3r/GUI/ConfigWizard.cpp:437 -msgid "" -"Additionally a backup snapshot of the whole configuration is created before " -"an update is applied." -msgstr "또한 업데이트가 적용되기 전에 전체 구성의 백업 스냅 샷이 생성됩니다." - -#: src/slic3r/GUI/ConfigWizard.cpp:444 -msgid "Other Vendors" -msgstr "다른 공급 업체" - -#: src/slic3r/GUI/ConfigWizard.cpp:446 -#, c-format -msgid "Pick another vendor supported by %s:" -msgstr "%s가 지원하는 다른 공급 업체를 선택하십시오:" - -#: src/slic3r/GUI/ConfigWizard.cpp:492 -msgid "Firmware Type" -msgstr "펌웨어 타입" - -#: src/slic3r/GUI/ConfigWizard.cpp:492 src/slic3r/GUI/Tab.cpp:2100 -msgid "Firmware" -msgstr "펌웨어" - -#: src/slic3r/GUI/ConfigWizard.cpp:496 -msgid "Choose the type of firmware used by your printer." -msgstr "프린터에 패치할 펌웨어를 선택하세요." - -#: src/slic3r/GUI/ConfigWizard.cpp:530 -msgid "Bed Shape and Size" -msgstr "배드 모양과 크기" - -#: src/slic3r/GUI/ConfigWizard.cpp:533 -msgid "Set the shape of your printer's bed." -msgstr "프린터 배드모양을 설정하세요." - -#: src/slic3r/GUI/ConfigWizard.cpp:553 -msgid "Filament and Nozzle Diameters" -msgstr "필라멘트와 노즐 크기" - -#: src/slic3r/GUI/ConfigWizard.cpp:553 -msgid "Print Diameters" -msgstr "인쇄 직경" - -#: src/slic3r/GUI/ConfigWizard.cpp:567 -msgid "Enter the diameter of your printer's hot end nozzle." -msgstr "핫 엔드 노즐 직경을 입력하십시오." - -#: src/slic3r/GUI/ConfigWizard.cpp:570 -msgid "Nozzle Diameter:" -msgstr "노즐 직경:" - -#: src/slic3r/GUI/ConfigWizard.cpp:580 -msgid "Enter the diameter of your filament." -msgstr "필라멘트의 직경을 입력하십시오." - -#: src/slic3r/GUI/ConfigWizard.cpp:581 -msgid "" -"Good precision is required, so use a caliper and do multiple measurements " -"along the filament, then compute the average." -msgstr "" -"정밀도가 필요하므로 캘리퍼를 사용하여 필라멘트를 따라 여러 번 측정 한 다음 평" -"균을 계산하십시오." - -#: src/slic3r/GUI/ConfigWizard.cpp:584 -msgid "Filament Diameter:" -msgstr "필라멘트 직경:" - -#: src/slic3r/GUI/ConfigWizard.cpp:618 -msgid "Extruder and Bed Temperatures" -msgstr "익스트루더와 배드 온도" - -#: src/slic3r/GUI/ConfigWizard.cpp:618 -msgid "Temperatures" -msgstr "온도" - -#: src/slic3r/GUI/ConfigWizard.cpp:634 -msgid "Enter the temperature needed for extruding your filament." -msgstr "필라멘트 압출에 필요한 온도를 입력하십시오." - -#: src/slic3r/GUI/ConfigWizard.cpp:635 -msgid "A rule of thumb is 160 to 230 °C for PLA, and 215 to 250 °C for ABS." -msgstr "보통 PLA의 경우 160 ~ 230 ° C, ABS의 경우 215 ~ 250 ° C입니다." - -#: src/slic3r/GUI/ConfigWizard.cpp:638 -msgid "Extrusion Temperature:" -msgstr "출력 온도 :" - -#: src/slic3r/GUI/ConfigWizard.cpp:639 src/slic3r/GUI/ConfigWizard.cpp:653 -msgid "°C" -msgstr "°C" - -#: src/slic3r/GUI/ConfigWizard.cpp:648 -msgid "" -"Enter the bed temperature needed for getting your filament to stick to your " -"heated bed." -msgstr "필라멘트가 핫배드에 접착하는데 필요한 배드온도를 입력하십시오." - -#: src/slic3r/GUI/ConfigWizard.cpp:649 -msgid "" -"A rule of thumb is 60 °C for PLA and 110 °C for ABS. Leave zero if you have " -"no heated bed." -msgstr "" -"보통은 PLA의 경우 60 ° C이고 ABS의 경우 110 ° C입니다. 핫배드가 없는 경우에" -"는 0으로 두십시오." - -#: src/slic3r/GUI/ConfigWizard.cpp:652 -msgid "Bed Temperature:" -msgstr "배드 온도 :" - -#: src/slic3r/GUI/ConfigWizard.cpp:1115 -msgid "Select all standard printers" -msgstr "이 프로파일과 호환 가능한 프린터를 선택하세요" - -#: src/slic3r/GUI/ConfigWizard.cpp:1118 -msgid "< &Back" -msgstr "< &뒤로" - -#: src/slic3r/GUI/ConfigWizard.cpp:1119 -msgid "&Next >" -msgstr "&다음 >" - -#: src/slic3r/GUI/ConfigWizard.cpp:1120 -msgid "&Finish" -msgstr "&완료" - -#: src/slic3r/GUI/ConfigWizard.cpp:1121 src/slic3r/GUI/FirmwareDialog.cpp:151 -#: src/slic3r/GUI/ProgressStatusBar.cpp:27 -msgid "Cancel" -msgstr "취소" - -#: src/slic3r/GUI/ConfigWizard.cpp:1135 -msgid "Prusa FFF Technology Printers" -msgstr "Prusa FFF 방식 프린터" - -#: src/slic3r/GUI/ConfigWizard.cpp:1138 -msgid "Prusa MSLA Technology Printers" -msgstr "Prusa MSLA 방식 프린터" - -#: src/slic3r/GUI/ConfigWizard.cpp:1207 -msgid "Configuration Assistant" -msgstr "구성 도우미" - -#: src/slic3r/GUI/ConfigWizard.cpp:1208 -msgid "Configuration &Assistant" -msgstr "구성 & 도우미" - -#: src/slic3r/GUI/ConfigWizard.cpp:1210 -msgid "Configuration Wizard" -msgstr "구성 마법사" - -#: src/slic3r/GUI/ConfigWizard.cpp:1211 -msgid "Configuration &Wizard" -msgstr "구성 & 마법사" - -#: src/slic3r/GUI/Field.cpp:125 -msgid "default value" -msgstr "기본값" - -#: src/slic3r/GUI/Field.cpp:128 -msgid "parameter name" -msgstr "매개 변수 명칭" - -#: src/slic3r/GUI/Field.cpp:139 -msgid "N/A" -msgstr "N/A" - -#: src/slic3r/GUI/Field.cpp:158 -#, c-format -msgid "%s doesn't support percentage" -msgstr "%s 이(가) 백분율을 지원하지 않음" - -#: src/slic3r/GUI/Field.cpp:174 src/slic3r/GUI/Field.cpp:197 -msgid "Invalid numeric input." -msgstr "숫자 입력이 잘못 되었습니다." - -#: src/slic3r/GUI/Field.cpp:179 -msgid "Input value is out of range" -msgstr "Input value is out of range" - -#: src/slic3r/GUI/Field.cpp:206 -#, c-format -msgid "" -"Do you mean %s%% instead of %s %s?\n" -"Select YES if you want to change this value to %s%%, \n" -"or NO if you are sure that %s %s is a correct value." -msgstr "" -"%s %s 대신 %s%%을 하려고 합니까?\n" -"이 값을 %s%%, 로 변경하려면 YES를 선택하십시오. \n" -"또는 %s %s 이(가) 올바른 값인지 확인하는 경우 NO를 선택하세요. " - -#: src/slic3r/GUI/Field.cpp:209 -msgid "Parameter validation" -msgstr "매개 변수 유효성 검사" - -#: src/slic3r/GUI/FirmwareDialog.cpp:150 -msgid "Flash!" -msgstr "완료!" - -#: src/slic3r/GUI/FirmwareDialog.cpp:152 -msgid "Flashing in progress. Please do not disconnect the printer!" -msgstr "진행 중입니다. 프린터를 분리하지 마십시오!" - -#: src/slic3r/GUI/FirmwareDialog.cpp:199 -msgid "Flashing failed" -msgstr "펌웨어 적용 실패" - -#: src/slic3r/GUI/FirmwareDialog.cpp:282 -msgid "Flashing succeeded!" -msgstr "적용 성공!" - -#: src/slic3r/GUI/FirmwareDialog.cpp:283 -msgid "Flashing failed. Please see the avrdude log below." -msgstr "적용 실패. 아래의 로그를 확인하세요." - -#: src/slic3r/GUI/FirmwareDialog.cpp:284 -msgid "Flashing cancelled." -msgstr "적용 취소됨." - -#: src/slic3r/GUI/FirmwareDialog.cpp:332 -#, c-format -msgid "" -"This firmware hex file does not match the printer model.\n" -"The hex file is intended for: %s\n" -"Printer reported: %s\n" -"\n" -"Do you want to continue and flash this hex file anyway?\n" -"Please only continue if you are sure this is the right thing to do." -msgstr "" -"이 펌웨어 hex 파일이 프린터 모델과 일치 하지 않습니다.\n" -"Hex 파일은 다음을 위한 것입니다: %s\n" -"보고 된 프린터: %s\n" -"\n" -"그래도이 hex 파일을 계속 적용 하시겠습니까?\n" -"확신 하는 경우에만 계속 하십시오." - -#: src/slic3r/GUI/FirmwareDialog.cpp:419 src/slic3r/GUI/FirmwareDialog.cpp:454 -#, c-format -msgid "" -"Multiple %s devices found. Please only connect one at a time for flashing." -msgstr "" -"여러 %s 장치를 찾았습니다. 깜박이는 경우에는 한 번에 하나씩만 연결 하십시오." - -#: src/slic3r/GUI/FirmwareDialog.cpp:436 -#, c-format -msgid "" -"The %s device was not found.\n" -"If the device is connected, please press the Reset button next to the USB " -"connector ..." -msgstr "" -"%s 장치를 찾을 하지 않았습니다.\n" -"장치가 연결 된 경우 USB 커넥터 옆에 있는 리셋 단추를 누르십시오." - -#: src/slic3r/GUI/FirmwareDialog.cpp:548 -#, c-format -msgid "The %s device could not have been found" -msgstr "%s 장치를 찾을 수 없습니다" - -#: src/slic3r/GUI/FirmwareDialog.cpp:645 -#, c-format -msgid "Error accessing port at %s: %s" -msgstr "%s 포트에 액세스 하는 중 오류가 발생 했습니다 :%s" - -#: src/slic3r/GUI/FirmwareDialog.cpp:647 -#, c-format -msgid "Error: %s" -msgstr "에러: %s" - -#: src/slic3r/GUI/FirmwareDialog.cpp:777 -msgid "Firmware flasher" -msgstr "펌웨어 업로드" - -#: src/slic3r/GUI/FirmwareDialog.cpp:802 -msgid "Firmware image:" -msgstr "펌웨어 이미지:" - -#: src/slic3r/GUI/FirmwareDialog.cpp:805 src/slic3r/GUI/Tab.cpp:1824 -#: src/slic3r/GUI/Tab.cpp:1880 -msgid "Browse" -msgstr "검색" - -#: src/slic3r/GUI/FirmwareDialog.cpp:807 -msgid "Serial port:" -msgstr "시리얼 포트:" - -#: src/slic3r/GUI/FirmwareDialog.cpp:809 -msgid "Autodetected" -msgstr "자동 감지" - -#: src/slic3r/GUI/FirmwareDialog.cpp:810 -msgid "Rescan" -msgstr "재검색" - -#: src/slic3r/GUI/FirmwareDialog.cpp:817 -msgid "Progress:" -msgstr "진행:" - -#: src/slic3r/GUI/FirmwareDialog.cpp:820 -msgid "Status:" -msgstr "상태:" - -#: src/slic3r/GUI/FirmwareDialog.cpp:821 -msgid "Ready" -msgstr "준비" - -#: src/slic3r/GUI/FirmwareDialog.cpp:841 -msgid "Advanced: Output log" -msgstr "고급: 출력 로그" - -#: src/slic3r/GUI/FirmwareDialog.cpp:852 -#: src/slic3r/GUI/PrintHostDialogs.cpp:161 -msgid "Close" -msgstr "닫기" - -#: src/slic3r/GUI/FirmwareDialog.cpp:903 -msgid "" -"Are you sure you want to cancel firmware flashing?\n" -"This could leave your printer in an unusable state!" -msgstr "" -"새펌웨어 적용을 취소하시겠습니까?\n" -"프린터가 사용할 수 없는 상태가 될 수 있습니다!" - -#: src/slic3r/GUI/FirmwareDialog.cpp:904 -msgid "Confirmation" -msgstr "확인" - -#: src/slic3r/GUI/FirmwareDialog.cpp:907 -msgid "Cancelling..." -msgstr "취소 중...." - -#: src/slic3r/GUI/GLCanvas3D.cpp:526 -msgid "Layers heights" -msgstr "레이어 높이" - -#: src/slic3r/GUI/GLCanvas3D.cpp:623 -msgid "An object outside the print area was detected" -msgstr "인쇄 영역 밖에 있는 개체가 감지 되었습니다" - -#: src/slic3r/GUI/GLCanvas3D.cpp:624 -msgid "A toolpath outside the print area was detected" -msgstr "인쇄 영역 밖에 있는 공구 경로가 감지 되었습니다" - -#: src/slic3r/GUI/GLCanvas3D.cpp:625 -msgid "SLA supports outside the print area were detected" -msgstr "인쇄 영역 외부의 SLA 지원 감지 됨" - -#: src/slic3r/GUI/GLCanvas3D.cpp:626 -msgid "Some objects are not visible when editing supports" -msgstr "편집 지원 시 일부 객체가 표시 되지 않음" - -#: src/slic3r/GUI/GLCanvas3D.cpp:628 -msgid "" -"An object outside the print area was detected\n" -"Resolve the current problem to continue slicing" -msgstr "" -"인쇄 영역 밖에 있는 개체가 감지 되었습니다.\n" -"현재 문제를 해결 하여 슬라이싱을 계속 합니다" - -#: src/slic3r/GUI/GLCanvas3D.cpp:1711 -msgid "Mirror Object" -msgstr "오브젝트 미러" - -#: src/slic3r/GUI/GLCanvas3D.cpp:2872 -msgid "Move Object" -msgstr "오브젝트 이동" - -#: src/slic3r/GUI/GLCanvas3D.cpp:3389 src/slic3r/GUI/GLCanvas3D.cpp:3609 -#: src/slic3r/GUI/MainFrame.cpp:559 -msgid "Undo" -msgstr "실행 취소" - -#: src/slic3r/GUI/GLCanvas3D.cpp:3389 src/slic3r/GUI/GLCanvas3D.cpp:3639 -#: src/slic3r/GUI/MainFrame.cpp:562 -msgid "Redo" -msgstr "다시 실행" - -#: src/slic3r/GUI/GLCanvas3D.cpp:3395 -#, c-format -msgid "%s Stack" -msgstr "%s 스택" - -#: src/slic3r/GUI/GLCanvas3D.cpp:3413 -#, c-format -msgid "%s %d Action" -msgstr "%s %d 액션" - -#: src/slic3r/GUI/GLCanvas3D.cpp:3460 -msgid "Add..." -msgstr "추가..." - -#: src/slic3r/GUI/GLCanvas3D.cpp:3468 src/slic3r/GUI/GUI_ObjectList.cpp:1434 -#: src/slic3r/GUI/Plater.cpp:3467 src/slic3r/GUI/Plater.cpp:3486 -#: src/slic3r/GUI/Tab.cpp:3204 -msgid "Delete" -msgstr "지우기 " - -#: src/slic3r/GUI/GLCanvas3D.cpp:3477 src/slic3r/GUI/Plater.cpp:4075 -msgid "Delete all" -msgstr "전부 지우기" - -#: src/slic3r/GUI/GLCanvas3D.cpp:3486 src/slic3r/GUI/KBShortcutsDialog.cpp:134 -#: src/slic3r/GUI/Plater.cpp:2636 -msgid "Arrange" -msgstr "정렬" - -#: src/slic3r/GUI/GLCanvas3D.cpp:3486 -msgid "Arrange selection" -msgstr "선택 정렬" - -#: src/slic3r/GUI/GLCanvas3D.cpp:3498 -msgid "Copy" -msgstr "복사" - -#: src/slic3r/GUI/GLCanvas3D.cpp:3507 -msgid "Paste" -msgstr "붙여넣기" - -#: src/slic3r/GUI/GLCanvas3D.cpp:3519 -msgid "Add instance" -msgstr "복제본 추가" - -#: src/slic3r/GUI/GLCanvas3D.cpp:3530 -msgid "Remove instance" -msgstr "복제본 제거" - -#: src/slic3r/GUI/GLCanvas3D.cpp:3543 -msgid "Split to objects" -msgstr "객체로 분할" - -#: src/slic3r/GUI/GLCanvas3D.cpp:3553 src/slic3r/GUI/GUI_ObjectList.cpp:1280 -msgid "Split to parts" -msgstr "파트로 분할" - -#: src/slic3r/GUI/GLCanvas3D.cpp:3566 -msgid "Layers editing" -msgstr "레이어층을 편집" - -#: src/slic3r/GUI/GLCanvas3D.cpp:5623 -msgid "Selection-Add from rectangle" -msgstr "사각형에서 선택-추가" - -#: src/slic3r/GUI/GLCanvas3D.cpp:5642 -msgid "Selection-Remove from rectangle" -msgstr "선택- 사각형에서 제거" - -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:40 -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:144 src/libslic3r/PrintConfig.cpp:3176 -msgid "Cut" -msgstr "자르기" - -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:149 -msgid "Keep upper part" -msgstr "상위 부분 유지" - -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:150 -msgid "Keep lower part" -msgstr "낮은 부분 유지" - -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:151 -msgid "Rotate lower part upwards" -msgstr "아래쪽 부분을 위쪽으로 회전" - -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:154 -msgid "Perform cut" -msgstr "절단 실행" - -#: src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp:45 -msgid "Place on face" -msgstr "면 배치 " - -#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:48 -msgid "Move" -msgstr "이동" - -#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:177 -msgid "Position (mm)" -msgstr "위치 (mm)" - -#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:177 -msgid "Displacement (mm)" -msgstr "변위 (mm)" - -#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:449 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:466 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:485 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:503 -#: src/libslic3r/PrintConfig.cpp:3225 -msgid "Rotate" -msgstr "회전" - -#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:482 -msgid "Rotation (deg)" -msgstr "회전 (°)" - -#: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:47 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:390 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:486 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:504 -#: src/libslic3r/PrintConfig.cpp:3240 -msgid "Scale" -msgstr "크기" - -#: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:292 -msgid "Scale (%)" -msgstr "스케일 (%)" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:44 -msgid "Head diameter" -msgstr "헤드 지름" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:45 -msgid "Lock supports under new islands" -msgstr "새 고립 영역에서 잠금 지원" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:46 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1427 -msgid "Remove selected points" -msgstr "선택한 점 제거" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:47 -msgid "Remove all points" -msgstr "모든 점 제거" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:48 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1430 -msgid "Apply changes" -msgstr "변경 내용을 적용" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:49 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1431 -msgid "Discard changes" -msgstr "변경사항을 취소" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:50 -msgid "Minimal points distance" -msgstr "최소 포인트 거리" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:51 -#: src/libslic3r/PrintConfig.cpp:2620 -msgid "Support points density" -msgstr "지원 포인트 밀도" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:52 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1433 -msgid "Auto-generate points" -msgstr "점 자동 생성" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:53 -msgid "Manual editing" -msgstr "수동 편집" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:54 -msgid "Clipping of view" -msgstr "클랩핑된것 보기" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:55 -msgid "Reset direction" -msgstr "방향 재설정" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:531 -msgid "Add support point" -msgstr "서포트 지점 추가" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:720 -msgid "Delete support point" -msgstr "서포트 지점 삭제" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:925 -msgid "Change point head diameter" -msgstr "변경 점 헤드 지름" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:991 -msgid "Support parameter change" -msgstr "서포트 매개 변수 변경" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1099 -msgid "SLA Support Points" -msgstr "SLA 지원 포인트" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1138 -msgid "Do you want to save your manually edited support points?" -msgstr "수동으로 편집한 서포트 지점을 저장 하 시겠습니까?" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1139 -msgid "Save changes?" -msgstr "변경 사항을 저장 하 시겠습니까?" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1183 -msgid "Move support point" -msgstr "서포트 점 이동" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1282 -msgid "Support points edit" -msgstr "서포트 포인트 편집" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1333 -msgid "" -"Autogeneration will erase all manually edited points.\n" -"\n" -"Are you sure you want to do it?\n" -msgstr "" -"자동 생성은 수동으로 편집한 모든 점을 지웁니다.\n" -"\n" -"그렇게 하시겠습니까?\n" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1335 src/slic3r/GUI/GUI.cpp:289 -#: src/slic3r/GUI/WipeTowerDialog.cpp:44 src/slic3r/GUI/WipeTowerDialog.cpp:328 -msgid "Warning" -msgstr "위험" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1338 -msgid "Autogenerate support points" -msgstr "서포트 자동 생성" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1390 -msgid "SLA gizmo keyboard shortcuts" -msgstr "SLA 장치바로 가기" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1401 -msgid "Note: some shortcuts work in (non)editing mode only." -msgstr "참고: 일부 단축키는 (비)편집 모드 에서만 작동 합니다." - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1419 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1422 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1423 -msgid "Left click" -msgstr "왼쪽 클릭" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1419 -msgid "Add point" -msgstr "점 추가" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1420 -msgid "Right click" -msgstr "오른쪽 클릭" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1420 -msgid "Remove point" -msgstr "복제본 제거" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1421 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1424 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1425 -msgid "Drag" -msgstr "드래그" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1421 -msgid "Move point" -msgstr "점 이동" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1422 -msgid "Add point to selection" -msgstr "선택 영역에 점 추가" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1423 -msgid "Remove point from selection" -msgstr "선택 영역에서 점 제거" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1424 -msgid "Select by rectangle" -msgstr "직사각형으로 선택" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1425 -msgid "Deselect by rectangle" -msgstr "사각형으로 선택 해제" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1426 -msgid "Select all points" -msgstr "모든 점 선택" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1428 -msgid "Mouse wheel" -msgstr "마우스 휠" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1428 -msgid "Move clipping plane" -msgstr "클립핑 평면 이동" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1429 -msgid "Reset clipping plane" -msgstr "클립핑 평면 재설정" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1432 -msgid "Switch to editing mode" -msgstr "편집 모드로 전환" - -#: src/slic3r/GUI/GUI.cpp:141 src/slic3r/GUI/Tab.cpp:3063 -msgid "It's impossible to print multi-part object(s) with SLA technology." -msgstr "SLA 방식을 사용 하여 멀티파트를 인쇄할 수는 없습니다." - -#: src/slic3r/GUI/GUI.cpp:142 -msgid "Please check and fix your object list." -msgstr "개체 목록을 확인 하고 수정 하십시오." - -#: src/slic3r/GUI/GUI.cpp:143 src/slic3r/GUI/Plater.cpp:2213 -#: src/slic3r/GUI/Tab.cpp:3065 -msgid "Attention!" -msgstr "주목!" - -#: src/slic3r/GUI/GUI.cpp:283 -msgid "Notice" -msgstr "공지" - -#: src/slic3r/GUI/GUI_App.cpp:435 -msgid "Changing of an application language" -msgstr "응용 프로그램 언어 변경" - -#: src/slic3r/GUI/GUI_App.cpp:443 src/slic3r/GUI/GUI_App.cpp:452 -msgid "Recreating" -msgstr "재현" - -#: src/slic3r/GUI/GUI_App.cpp:456 -msgid "Loading of current presets" -msgstr "현재 프리셋 불러오기" - -#: src/slic3r/GUI/GUI_App.cpp:464 -msgid "Loading of a mode view" -msgstr "모드 보기 로드" - -#: src/slic3r/GUI/GUI_App.cpp:544 -msgid "Choose one file (3MF/AMF):" -msgstr "하나의 파일(3MF/AMF)을 선택합니다." - -#: src/slic3r/GUI/GUI_App.cpp:556 -msgid "Choose one or more files (STL/OBJ/AMF/3MF/PRUSA):" -msgstr "파일을 선택하세요 (STL/OBJ/AMF/3MF/PRUSA):" - -#: src/slic3r/GUI/GUI_App.cpp:598 -msgid "Select the language" -msgstr "언어를 선택" - -#: src/slic3r/GUI/GUI_App.cpp:599 -msgid "Language" -msgstr "언어" - -#: src/slic3r/GUI/GUI_App.cpp:750 -msgid "&Configuration Snapshots" -msgstr "구성 스냅숏" - -#: src/slic3r/GUI/GUI_App.cpp:750 -msgid "Inspect / activate configuration snapshots" -msgstr "구성 스냅 샷 검사 / 활성화" - -#: src/slic3r/GUI/GUI_App.cpp:751 -msgid "Take Configuration &Snapshot" -msgstr "구성 스냅 샷 가져 오기" - -#: src/slic3r/GUI/GUI_App.cpp:751 -msgid "Capture a configuration snapshot" -msgstr "구성 스냅 샷 캡처" - -#: src/slic3r/GUI/GUI_App.cpp:754 -msgid "&Preferences" -msgstr "환경 설정" - -#: src/slic3r/GUI/GUI_App.cpp:760 -msgid "Application preferences" -msgstr "응용 프로그램 환경 설정" - -#: src/slic3r/GUI/GUI_App.cpp:763 src/slic3r/GUI/wxExtensions.cpp:2882 -msgid "Simple" -msgstr "단순" - -#: src/slic3r/GUI/GUI_App.cpp:763 -msgid "Simple View Mode" -msgstr "단순 보기 모드" - -#: src/slic3r/GUI/GUI_App.cpp:764 src/slic3r/GUI/GUI_ObjectList.cpp:93 -#: src/slic3r/GUI/GUI_ObjectList.cpp:567 src/slic3r/GUI/Tab.cpp:1037 -#: src/slic3r/GUI/Tab.cpp:1052 src/slic3r/GUI/Tab.cpp:1150 -#: src/slic3r/GUI/Tab.cpp:1153 src/slic3r/GUI/Tab.cpp:1649 -#: src/slic3r/GUI/Tab.cpp:2120 src/slic3r/GUI/Tab.cpp:3699 -#: src/slic3r/GUI/wxExtensions.cpp:2883 src/libslic3r/PrintConfig.cpp:83 -#: src/libslic3r/PrintConfig.cpp:197 src/libslic3r/PrintConfig.cpp:360 -#: src/libslic3r/PrintConfig.cpp:1013 src/libslic3r/PrintConfig.cpp:2226 -msgid "Advanced" -msgstr "고급" - -#: src/slic3r/GUI/GUI_App.cpp:764 -msgid "Advanced View Mode" -msgstr "고급 보기 모드" - -#: src/slic3r/GUI/GUI_App.cpp:765 src/slic3r/GUI/wxExtensions.cpp:2884 -msgid "Expert" -msgstr "전문가" - -#: src/slic3r/GUI/GUI_App.cpp:765 -msgid "Expert View Mode" -msgstr "전문가 보기 모드" - -#: src/slic3r/GUI/GUI_App.cpp:770 -msgid "Mode" -msgstr "모드" - -#: src/slic3r/GUI/GUI_App.cpp:770 -#, c-format -msgid "%s View Mode" -msgstr "%s 보기 모드" - -#: src/slic3r/GUI/GUI_App.cpp:772 -msgid "Change Application &Language" -msgstr "응용 프로그램 언어 번경" - -#: src/slic3r/GUI/GUI_App.cpp:774 -msgid "Flash printer &firmware" -msgstr "프린터 펌웨어 플래시" - -#: src/slic3r/GUI/GUI_App.cpp:774 -msgid "Upload a firmware image into an Arduino based printer" -msgstr "아두이노 기반의 프린터 이미지 업로드" - -#: src/slic3r/GUI/GUI_App.cpp:786 -msgid "Taking configuration snapshot" -msgstr "구성 스냅 샷 만들기" - -#: src/slic3r/GUI/GUI_App.cpp:786 -msgid "Snapshot name" -msgstr "스냅 샷 이름" - -#: src/slic3r/GUI/GUI_App.cpp:829 -msgid "" -"Switching the language will trigger application restart.\n" -"You will lose content of the plater." -msgstr "" -"언어를 전환 하면 응용 프로그램 재시작 합니다.플레이트 위 오브젝트는 모두 지워" -"집니다." - -#: src/slic3r/GUI/GUI_App.cpp:831 -msgid "Do you want to proceed?" -msgstr "계속 하시겠습니까?" - -#: src/slic3r/GUI/GUI_App.cpp:832 -msgid "Language selection" -msgstr "국가에 맞는 언어를 선택" - -#: src/slic3r/GUI/GUI_App.cpp:855 -msgid "&Configuration" -msgstr "&구성" - -#: src/slic3r/GUI/GUI_App.cpp:877 -msgid "The presets on the following tabs were modified" -msgstr "다음 탭의 사전 설정이 수정 되었습니다" - -#: src/slic3r/GUI/GUI_App.cpp:877 src/slic3r/GUI/Tab.cpp:3051 -msgid "Discard changes and continue anyway?" -msgstr "수정된 사항을 취소하고 계속하겠습니까?" - -#: src/slic3r/GUI/GUI_App.cpp:880 -msgid "Unsaved Presets" -msgstr "저장되지 않은 기존설정" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:30 src/slic3r/GUI/GUI_ObjectList.cpp:84 -#: src/slic3r/GUI/GUI_ObjectList.cpp:558 src/libslic3r/PrintConfig.cpp:67 -#: src/libslic3r/PrintConfig.cpp:160 src/libslic3r/PrintConfig.cpp:392 -#: src/libslic3r/PrintConfig.cpp:453 src/libslic3r/PrintConfig.cpp:461 -#: src/libslic3r/PrintConfig.cpp:867 src/libslic3r/PrintConfig.cpp:1051 -#: src/libslic3r/PrintConfig.cpp:1354 src/libslic3r/PrintConfig.cpp:1420 -#: src/libslic3r/PrintConfig.cpp:1601 src/libslic3r/PrintConfig.cpp:2037 -#: src/libslic3r/PrintConfig.cpp:2095 -msgid "Layers and Perimeters" -msgstr "레이어 및 경계선" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:31 src/slic3r/GUI/GUI_ObjectList.cpp:85 -#: src/slic3r/GUI/GUI_ObjectList.cpp:559 src/slic3r/GUI/Plater.cpp:498 -#: src/slic3r/GUI/Tab.cpp:1041 src/slic3r/GUI/Tab.cpp:1042 -#: src/slic3r/GUI/Tab.cpp:1394 src/libslic3r/PrintConfig.cpp:177 -#: src/libslic3r/PrintConfig.cpp:400 src/libslic3r/PrintConfig.cpp:420 -#: src/libslic3r/PrintConfig.cpp:754 src/libslic3r/PrintConfig.cpp:768 -#: src/libslic3r/PrintConfig.cpp:805 src/libslic3r/PrintConfig.cpp:958 -#: src/libslic3r/PrintConfig.cpp:968 src/libslic3r/PrintConfig.cpp:986 -#: src/libslic3r/PrintConfig.cpp:1004 src/libslic3r/PrintConfig.cpp:1023 -#: src/libslic3r/PrintConfig.cpp:1708 src/libslic3r/PrintConfig.cpp:1725 -msgid "Infill" -msgstr "인필(채움)" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:32 src/slic3r/GUI/GUI_ObjectList.cpp:86 -#: src/slic3r/GUI/GUI_ObjectList.cpp:560 src/slic3r/GUI/GUI_Preview.cpp:243 -#: src/slic3r/GUI/Tab.cpp:1070 src/slic3r/GUI/Tab.cpp:1071 -#: src/libslic3r/PrintConfig.cpp:344 src/libslic3r/PrintConfig.cpp:1481 -#: src/libslic3r/PrintConfig.cpp:1830 src/libslic3r/PrintConfig.cpp:1836 -#: src/libslic3r/PrintConfig.cpp:1844 src/libslic3r/PrintConfig.cpp:1856 -#: src/libslic3r/PrintConfig.cpp:1866 src/libslic3r/PrintConfig.cpp:1874 -#: src/libslic3r/PrintConfig.cpp:1889 src/libslic3r/PrintConfig.cpp:1910 -#: src/libslic3r/PrintConfig.cpp:1921 src/libslic3r/PrintConfig.cpp:1937 -#: src/libslic3r/PrintConfig.cpp:1946 src/libslic3r/PrintConfig.cpp:1955 -#: src/libslic3r/PrintConfig.cpp:1966 src/libslic3r/PrintConfig.cpp:1980 -#: src/libslic3r/PrintConfig.cpp:1988 src/libslic3r/PrintConfig.cpp:1989 -#: src/libslic3r/PrintConfig.cpp:1998 src/libslic3r/PrintConfig.cpp:2006 -#: src/libslic3r/PrintConfig.cpp:2020 src/libslic3r/GCode/PreviewData.cpp:172 -msgid "Support material" -msgstr "서포트 재료(Support material)" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:35 src/slic3r/GUI/GUI_ObjectList.cpp:90 -#: src/slic3r/GUI/GUI_ObjectList.cpp:564 src/libslic3r/PrintConfig.cpp:2202 -#: src/libslic3r/PrintConfig.cpp:2210 -msgid "Wipe options" -msgstr "지우기 옵션" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:41 -msgid "Pad and Support" -msgstr "패드 및 서포트" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:47 -msgid "Add part" -msgstr "파트 추가" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:48 -msgid "Add modifier" -msgstr "편집영역(modifier) 추가" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:49 -msgid "Add support enforcer" -msgstr "서포트 지원(enforcer)영역 추가" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:50 -msgid "Add support blocker" -msgstr "서포트 금지영역(blocker) 추가" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:87 src/slic3r/GUI/GUI_ObjectList.cpp:561 -#: src/slic3r/GUI/GUI_Preview.cpp:222 src/slic3r/GUI/Tab.cpp:1095 -#: src/libslic3r/PrintConfig.cpp:209 src/libslic3r/PrintConfig.cpp:441 -#: src/libslic3r/PrintConfig.cpp:896 src/libslic3r/PrintConfig.cpp:1024 -#: src/libslic3r/PrintConfig.cpp:1410 src/libslic3r/PrintConfig.cpp:1647 -#: src/libslic3r/PrintConfig.cpp:1696 src/libslic3r/PrintConfig.cpp:1747 -#: src/libslic3r/PrintConfig.cpp:2080 -msgid "Speed" -msgstr "속도" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:88 src/slic3r/GUI/GUI_ObjectList.cpp:562 -#: src/slic3r/GUI/Tab.cpp:1130 src/slic3r/GUI/Tab.cpp:1997 -#: src/libslic3r/PrintConfig.cpp:471 src/libslic3r/PrintConfig.cpp:979 -#: src/libslic3r/PrintConfig.cpp:1389 src/libslic3r/PrintConfig.cpp:1717 -#: src/libslic3r/PrintConfig.cpp:1902 src/libslic3r/PrintConfig.cpp:1928 -msgid "Extruders" -msgstr "익스트루더" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:89 src/slic3r/GUI/GUI_ObjectList.cpp:563 -#: src/libslic3r/PrintConfig.cpp:431 src/libslic3r/PrintConfig.cpp:538 -#: src/libslic3r/PrintConfig.cpp:855 src/libslic3r/PrintConfig.cpp:987 -#: src/libslic3r/PrintConfig.cpp:1398 src/libslic3r/PrintConfig.cpp:1737 -#: src/libslic3r/PrintConfig.cpp:1911 src/libslic3r/PrintConfig.cpp:2069 -msgid "Extrusion Width" -msgstr "압출 폭" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:95 src/slic3r/GUI/GUI_ObjectList.cpp:569 -#: src/slic3r/GUI/Plater.cpp:466 src/slic3r/GUI/Tab.cpp:3655 -#: src/slic3r/GUI/Tab.cpp:3656 src/libslic3r/PrintConfig.cpp:2469 -#: src/libslic3r/PrintConfig.cpp:2476 src/libslic3r/PrintConfig.cpp:2485 -#: src/libslic3r/PrintConfig.cpp:2494 src/libslic3r/PrintConfig.cpp:2504 -#: src/libslic3r/PrintConfig.cpp:2530 src/libslic3r/PrintConfig.cpp:2537 -#: src/libslic3r/PrintConfig.cpp:2548 src/libslic3r/PrintConfig.cpp:2558 -#: src/libslic3r/PrintConfig.cpp:2567 src/libslic3r/PrintConfig.cpp:2580 -#: src/libslic3r/PrintConfig.cpp:2590 src/libslic3r/PrintConfig.cpp:2599 -#: src/libslic3r/PrintConfig.cpp:2609 src/libslic3r/PrintConfig.cpp:2621 -#: src/libslic3r/PrintConfig.cpp:2629 -msgid "Supports" -msgstr "서포트" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:96 src/slic3r/GUI/GUI_ObjectList.cpp:570 -#: src/slic3r/GUI/Tab.cpp:3684 src/slic3r/GUI/Tab.cpp:3685 -#: src/libslic3r/PrintConfig.cpp:2637 src/libslic3r/PrintConfig.cpp:2644 -#: src/libslic3r/PrintConfig.cpp:2658 src/libslic3r/PrintConfig.cpp:2668 -#: src/libslic3r/PrintConfig.cpp:2681 src/libslic3r/PrintConfig.cpp:2690 -#: src/libslic3r/PrintConfig.cpp:2701 src/libslic3r/PrintConfig.cpp:2712 -#: src/libslic3r/PrintConfig.cpp:2722 src/libslic3r/PrintConfig.cpp:2732 -msgid "Pad" -msgstr "패드" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:217 -msgid "Name" -msgstr "이름" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:271 -#, c-format -msgid "Auto-repaired (%d errors):\n" -msgstr "오류자동수정 (%d errors)\n" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:278 -msgid "degenerate facets" -msgstr "더러운 면" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:279 -msgid "edges fixed" -msgstr "모서리 고정" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:280 -msgid "facets removed" -msgstr "면 제거" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:281 -msgid "facets added" -msgstr "면 추가됨" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:282 -msgid "facets reversed" -msgstr "면 반전" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:283 -msgid "backwards edges" -msgstr "뒤쪽 가장자리" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:291 -msgid "Right button click the icon to fix STL through Netfabb" -msgstr "아이콘을 클릭 하여 Netfabb에서 STL을 수정 합니다" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:325 -msgid "Right button click the icon to change the object settings" -msgstr "아이콘을 클릭 하여 개체 설정을 변경 합니다" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:375 src/slic3r/GUI/GUI_ObjectList.cpp:396 -#: src/slic3r/GUI/GUI_ObjectList.cpp:408 src/slic3r/GUI/GUI_ObjectList.cpp:3508 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3518 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3550 src/slic3r/GUI/wxExtensions.cpp:576 -#: src/slic3r/GUI/wxExtensions.cpp:633 src/slic3r/GUI/wxExtensions.cpp:658 -#: src/slic3r/GUI/wxExtensions.cpp:794 -msgid "default" -msgstr "기본값" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:380 src/slic3r/GUI/Tab.cpp:1613 -#: src/libslic3r/PrintConfig.cpp:470 -msgid "Extruder" -msgstr "익스트루더(Extruder)" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:493 -msgid "Rename Object" -msgstr "개체 이름 바꾸기" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:493 -msgid "Rename Sub-object" -msgstr "하위 오브젝트 이름 바꾸기" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:934 src/slic3r/GUI/GUI_ObjectList.cpp:3346 -msgid "Instances to Separated Objects" -msgstr "분리된 객체에 대한 복제본" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:952 -msgid "Remove Volume(s)" -msgstr "볼륨 제거" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1007 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1316 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1322 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1556 -#, c-format -msgid "Quick Add Settings (%s)" -msgstr "빠른 추가 설정 (%s)" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1077 -msgid "Select showing settings" -msgstr "설정 표시를 선택 합니다" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1126 -msgid "Add Settings for Layers" -msgstr "도면층에 대한 설정 추가" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1127 -msgid "Add Settings for Sub-object" -msgstr "하위 개체에 대한 설정 추가" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1128 -msgid "Add Settings for Object" -msgstr "개체에 대한 설정 추가" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1189 -msgid "Add Settings Bundle for Layers" -msgstr "레이어에 대한 설정 번들 추가" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1190 -msgid "Add Settings Bundle for Sub-object" -msgstr "하위 오브젝트에 대한 설정 번들 추가" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1191 -msgid "Add Settings Bundle for Object" -msgstr "개체에 대한 설정 번들 추가" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1230 -msgid "Load" -msgstr "불러오기" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1235 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1260 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1263 -msgid "Box" -msgstr "박스" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1235 -msgid "Cylinder" -msgstr "원통" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1235 -msgid "Sphere" -msgstr "영역" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1235 -msgid "Slab" -msgstr "슬랩" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1287 -msgid "Edit Layers" -msgstr "레이어 편집" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1295 -msgid "Add settings" -msgstr "다음 설정" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1362 -msgid "Change type" -msgstr "타입 변경" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1369 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1510 -msgid "Set as a Separated Object" -msgstr "분리 된 객체로 설정" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1375 -msgid "Rename" -msgstr "이름 변경" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1386 -msgid "Fix through the Netfabb" -msgstr "네트워크를 통해 수정" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1396 src/slic3r/GUI/Plater.cpp:3496 -msgid "Export as STL" -msgstr "STL로 내보내기" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1403 -msgid "Change extruder" -msgstr "압출기(익스트루더) 변경" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1422 src/libslic3r/PrintConfig.cpp:309 -msgid "Default" -msgstr "기본값" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1428 -msgid "Select new extruder for the object/part" -msgstr "객체/부품에 대한 새 압출(익스트루더) 기 선택" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1440 -msgid "Scale to print volume" -msgstr "인쇄 볼륨에 따라 배율 조정" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1440 -msgid "Scale the selected object to fit the print volume" -msgstr "인쇄 볼륨에 맞게 선택한 오브젝트의 배율 조정" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1510 -msgid "Set as a Separated Objects" -msgstr "분리 된 객체로 설정" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1585 -msgid "Load Part" -msgstr "하중 부품" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1617 -msgid "Error!" -msgstr "에러!" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1662 -msgid "Add Generic Subobject" -msgstr "일반 하위 개체 추가" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1669 -msgid "Generic" -msgstr "일반" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1770 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1872 -msgid "Last instance of an object cannot be deleted." -msgstr "개체의 마지막 복제본를 삭제할 수 없습니다." - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1782 -msgid "Delete Settings" -msgstr "설정 삭제" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1806 -msgid "Delete All Instances from Object" -msgstr "개체에서 모든 복제본 삭제" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1822 -msgid "Delete Layers Range" -msgstr "레이어 범위 삭제" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1853 -msgid "From Object List You can't delete the last solid part from object." -msgstr "개체 목록에서 개체에서 마지막 솔리드 부품을 삭제할 수 없습니다." - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1857 -msgid "Delete Subobject" -msgstr "하위 개체 삭제" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1876 -msgid "Delete Instance" -msgstr "복제본 삭제" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1900 src/slic3r/GUI/Plater.cpp:2793 -msgid "" -"The selected object couldn't be split because it contains only one part." -msgstr "" -"선택한 오브젝트는 파트 하나만 포함되어 있기 때문에 분할 할 수 없습니다." - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1904 -msgid "Split to Parts" -msgstr "파트로 분할" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1950 -msgid "Add Layers" -msgstr "레이어 추가" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2075 -msgid "Group manipulation" -msgstr "그룹 조작" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2087 -msgid "Object manipulation" -msgstr "개체 조작" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2100 -msgid "Object Settings to modify" -msgstr "수정할 개체 설정" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2104 -msgid "Part Settings to modify" -msgstr "수정할 부품 설정" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2109 -msgid "Layer range Settings to modify" -msgstr "레이어 범위 설정 수정" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2115 -msgid "Part manipulation" -msgstr "파트 조작" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2121 -msgid "Instance manipulation" -msgstr "복제본 제거" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2128 -msgid "Layers Editing" -msgstr "레이어층을 편집" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2128 -msgid "Layer Editing" -msgstr "레이어 편집" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2303 -msgid "Delete Selected Item" -msgstr "선택한 항목 삭제" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2415 -msgid "Delete Selected" -msgstr "선택된 것을 삭제" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2484 -#: src/slic3r/GUI/GUI_ObjectList.cpp:2513 -#: src/slic3r/GUI/GUI_ObjectList.cpp:2531 -msgid "Add New Layers Range" -msgstr "새 레이어 범위 추가" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2590 -msgid "Edit Layers Range" -msgstr "레이어 범위 편집" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2867 -msgid "Selection-Remove from list" -msgstr "목록에서 선택-제거" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2875 -msgid "Selection-Add from list" -msgstr "목록에서 선택-추가" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2993 -msgid "Object or Instance" -msgstr "개체 또는 복제본" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2994 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3127 -msgid "Part" -msgstr "부품(Part)" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2994 -msgid "Layer" -msgstr "레이어" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2996 -msgid "Unsupported selection" -msgstr "지원 되지 않는 선택" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2997 -#, c-format -msgid "You started your selection with %s Item." -msgstr "%s 항목으로 선택을 시작 했습니다." - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2998 -#, c-format -msgid "In this mode you can select only other %s Items%s" -msgstr "이 모드에서는 %s의 다른 %s 항목만 선택할 수 있습니다" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:3001 -msgid "of a current Object" -msgstr "현재 개체의" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:3006 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3081 src/slic3r/GUI/Plater.cpp:126 -msgid "Info" -msgstr "정보" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:3122 -msgid "You can't change a type of the last solid part of the object." -msgstr "객체의 마지막 솔리드 부품 유형은 변경할 수 없습니다." - -#: src/slic3r/GUI/GUI_ObjectList.cpp:3127 -msgid "Modifier" -msgstr "편집 영역" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:3127 -msgid "Support Enforcer" -msgstr "서포트 지원 영역" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:3127 -msgid "Support Blocker" -msgstr "서포트 금지 영역" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:3129 -msgid "Type:" -msgstr "형식:" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:3129 -msgid "Select type of part" -msgstr "부품 유형 선택" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:3134 -msgid "Change Part Type" -msgstr "부품 유형 변경" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:3368 -msgid "Enter new name" -msgstr "새 이름 입력" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:3368 -msgid "Renaming" -msgstr "이름 바꾸기" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:3384 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3480 src/slic3r/GUI/Tab.cpp:3536 -#: src/slic3r/GUI/Tab.cpp:3540 -msgid "The supplied name is not valid;" -msgstr "제공된 이름이 유효하지 않습니다;" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:3385 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3481 src/slic3r/GUI/Tab.cpp:3537 -msgid "the following characters are not allowed:" -msgstr "다음 문자는 허용되지 않습니다:" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:3498 -msgid "Set extruder for selected items" -msgstr "선택한 항목에 대한 압출기(익스트루더) 설정" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:3499 -msgid "Select extruder number for selected objects and/or parts" -msgstr "선택한 객체 및 부품에 대한 압출기(익스트루더) 번호 선택" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:3512 -msgid "Select extruder number:" -msgstr "압출기(익스트루더) 번호 선택:" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:3513 -msgid "This extruder will be set for selected items" -msgstr "선택한 항목에 대한 압출기(익스트루더) 설정" - -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:62 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:105 -msgid "World coordinates" -msgstr "전체크기와 좌표" - -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:63 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:106 -msgid "Local coordinates" -msgstr "로컬 좌표" - -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:82 -msgid "Select coordinate space, in which the transformation will be performed." -msgstr "변환이 수행될 좌표 공간을 선택 합니다." - -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:125 -msgid "Object Manipulation" -msgstr "개체 조작" - -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:176 -msgid "Object name" -msgstr "개체 이름" - -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:212 -#, c-format -msgid "Toggle %c axis mirroring" -msgstr "전환 %c 축 미러링" - -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:245 -msgid "Set Mirror" -msgstr "미러 설정" - -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:285 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:290 -msgid "Reset scale" -msgstr "스케일 재설정" - -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:303 -msgid "Reset rotation" -msgstr "회전 재설정" - -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:328 -msgid "Reset Rotation" -msgstr "회전 재설정" - -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:340 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:355 -msgid "Drop to bed" -msgstr "잠자리에 들기" - -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:388 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:443 -msgid "Position" -msgstr "위치" - -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:389 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:444 -msgid "Rotation" -msgstr "회전" - -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:445 -msgid "Scale factors" -msgstr "축척 계수" - -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:502 -msgid "Translate" -msgstr "번역" - -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:554 -msgid "" -"You cann't use non-uniform scaling mode for multiple objects/parts selection" -msgstr "" -"여러 객체/부품 선택에 는 균일하지 않은 배율 조정 모드를 사용할 수 없습니다." - -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:715 -msgid "Set Position" -msgstr "위치 설정" - -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:746 -msgid "Set Orientation" -msgstr "방향 설정" - -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:811 -msgid "Set Scale" -msgstr "축척 설정" - -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:895 -msgid "" -"The currently manipulated object is tilted (rotation angles are not " -"multiples of 90°).\n" -"Non-uniform scaling of tilted objects is only possible in the World " -"coordinate system,\n" -"once the rotation is embedded into the object coordinates." -msgstr "" -"현재 조작 된 오브젝트가 기울어져 있습니다 (회전 각도가 90 °의 배수가 아님).\n" -"기울어진 오브젝트의 비균일 배율 조정은 표준 좌표계에서만 가능 합니다.\n" -"회전이 오브젝트 좌표로 삽입되면." - -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:898 -msgid "" -"This operation is irreversible.\n" -"Do you want to proceed?" -msgstr "" -"이 작업은 되돌릴수 없습니다.\n" -"계속 하 시겠습니까?" - -#: src/slic3r/GUI/GUI_ObjectSettings.cpp:58 -msgid "Additional Settings" -msgstr "추가적인 세팅" - -#: src/slic3r/GUI/GUI_ObjectSettings.cpp:94 -msgid "Remove parameter" -msgstr "매개 변수 제거" - -#: src/slic3r/GUI/GUI_ObjectSettings.cpp:100 -#, c-format -msgid "Delete Option %s" -msgstr "삭제 %s 옵션" - -#: src/slic3r/GUI/GUI_ObjectSettings.cpp:144 -#, c-format -msgid "Change Option %s" -msgstr "옵션 %s 변경" - -#: src/slic3r/GUI/GUI_Preview.cpp:216 -msgid "View" -msgstr "보기" - -#: src/slic3r/GUI/GUI_Preview.cpp:219 src/slic3r/GUI/GUI_Preview.cpp:554 -#: src/libslic3r/GCode/PreviewData.cpp:394 -msgid "Feature type" -msgstr "특색 유형" - -#: src/slic3r/GUI/GUI_Preview.cpp:220 src/libslic3r/PrintConfig.cpp:483 -msgid "Height" -msgstr "높이" - -#: src/slic3r/GUI/GUI_Preview.cpp:221 src/libslic3r/PrintConfig.cpp:2188 -msgid "Width" -msgstr "폭" - -#: src/slic3r/GUI/GUI_Preview.cpp:223 -msgid "Volumetric flow rate" -msgstr "용적의 유량값" - -#: src/slic3r/GUI/GUI_Preview.cpp:224 src/slic3r/GUI/GUI_Preview.cpp:328 -#: src/slic3r/GUI/GUI_Preview.cpp:506 src/slic3r/GUI/GUI_Preview.cpp:553 -#: src/slic3r/GUI/GUI_Preview.cpp:749 src/libslic3r/GCode/PreviewData.cpp:404 -msgid "Tool" -msgstr "도구" - -#: src/slic3r/GUI/GUI_Preview.cpp:225 src/slic3r/GUI/GUI_Preview.cpp:551 -#: src/libslic3r/GCode/PreviewData.cpp:406 -msgid "Color Print" -msgstr "컬러 프린트" - -#: src/slic3r/GUI/GUI_Preview.cpp:228 -msgid "Show" -msgstr "보다" - -#: src/slic3r/GUI/GUI_Preview.cpp:231 src/slic3r/GUI/GUI_Preview.cpp:232 -msgid "Feature types" -msgstr "특색 유형" - -#: src/slic3r/GUI/GUI_Preview.cpp:234 src/libslic3r/GCode/PreviewData.cpp:163 -msgid "Perimeter" -msgstr "가장자리" - -#: src/slic3r/GUI/GUI_Preview.cpp:235 src/libslic3r/GCode/PreviewData.cpp:164 -msgid "External perimeter" -msgstr "외부 가장자리" - -#: src/slic3r/GUI/GUI_Preview.cpp:236 src/libslic3r/GCode/PreviewData.cpp:165 -msgid "Overhang perimeter" -msgstr "오버행(Overhang) 둘레" - -#: src/slic3r/GUI/GUI_Preview.cpp:237 src/libslic3r/GCode/PreviewData.cpp:166 -msgid "Internal infill" -msgstr "내부 채움" - -#: src/slic3r/GUI/GUI_Preview.cpp:238 src/libslic3r/PrintConfig.cpp:1736 -#: src/libslic3r/PrintConfig.cpp:1746 src/libslic3r/GCode/PreviewData.cpp:167 -msgid "Solid infill" -msgstr "솔리드 인필" - -#: src/slic3r/GUI/GUI_Preview.cpp:239 src/libslic3r/PrintConfig.cpp:2068 -#: src/libslic3r/PrintConfig.cpp:2079 src/libslic3r/GCode/PreviewData.cpp:168 -msgid "Top solid infill" -msgstr "가장 윗부분 채움" - -#: src/slic3r/GUI/GUI_Preview.cpp:240 src/libslic3r/GCode/PreviewData.cpp:169 -msgid "Bridge infill" -msgstr "브릿지 채움" - -#: src/slic3r/GUI/GUI_Preview.cpp:241 src/libslic3r/PrintConfig.cpp:895 -#: src/libslic3r/GCode/PreviewData.cpp:170 -msgid "Gap fill" -msgstr "공백 채움" - -#: src/slic3r/GUI/GUI_Preview.cpp:242 src/slic3r/GUI/Tab.cpp:1061 -#: src/libslic3r/GCode/PreviewData.cpp:171 -msgid "Skirt" -msgstr "스커트" - -#: src/slic3r/GUI/GUI_Preview.cpp:244 src/libslic3r/PrintConfig.cpp:1954 -#: src/libslic3r/GCode/PreviewData.cpp:173 -msgid "Support material interface" -msgstr "서포트 재료 인터페이스" - -#: src/slic3r/GUI/GUI_Preview.cpp:245 src/slic3r/GUI/Tab.cpp:1141 -#: src/libslic3r/GCode/PreviewData.cpp:174 -msgid "Wipe tower" -msgstr "와이프 타워(Wipe tower)" - -#: src/slic3r/GUI/GUI_Preview.cpp:250 src/libslic3r/PrintConfig.cpp:2102 -msgid "Travel" -msgstr "이송" - -#: src/slic3r/GUI/GUI_Preview.cpp:251 -msgid "Retractions" -msgstr "리트랙션" - -#: src/slic3r/GUI/GUI_Preview.cpp:252 -msgid "Unretractions" -msgstr "리트랙션 취소" - -#: src/slic3r/GUI/GUI_Preview.cpp:253 -msgid "Shells" -msgstr "쉘" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:13 src/slic3r/GUI/MainFrame.cpp:672 -msgid "Keyboard Shortcuts" -msgstr "키보드 바로 가기" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:104 -msgid "Open project STL/OBJ/AMF/3MF with config, delete bed" -msgstr "구성으로 프로젝트 STL/OBJ/AMF/3MF 열기, 배드 삭제" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:105 -msgid "Import STL/OBJ/AMF/3MF without config, keep bed" -msgstr "구성 없이 STL/OBJ/AMF/3MF 가져오기, 배드 유지" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:106 -msgid "Load Config from .ini/amf/3mf/gcode" -msgstr ".Ini/amf/3mf/gcode에서 구성 로드" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:107 src/slic3r/GUI/Plater.cpp:822 -#: src/slic3r/GUI/Plater.cpp:4687 src/libslic3r/PrintConfig.cpp:3127 -msgid "Export G-code" -msgstr "G-코드 내보내기" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:108 -msgid "Save project (3MF)" -msgstr "프로젝트 저장 (3MF)" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:109 -msgid "Load Config from .ini/amf/3mf/gcode and merge" -msgstr ".Ini/amf/3mf/gcode 및 병합에서 구성 로드" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:110 -msgid "(Re)slice" -msgstr "(Re)슬라이스" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:113 -msgid "Select Plater Tab" -msgstr "선택 및 플래이트 탭" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:115 -msgid "Select Print Settings Tab" -msgstr "인쇄 설정 탭을 선택 합니다" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:116 -msgid "Select Filament Settings Tab" -msgstr "필라멘트 설정 탭 선택" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:117 -msgid "Select Printer Settings Tab" -msgstr "프린터 설정 탭을 선택 합니다" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:118 -msgid "Switch to 3D" -msgstr "3D로 전환" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:119 -msgid "Switch to Preview" -msgstr "미리 보기로 전환" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:120 src/slic3r/GUI/Preferences.cpp:10 -msgid "Preferences" -msgstr "기본 설정" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:121 -#: src/slic3r/GUI/PrintHostDialogs.cpp:136 -msgid "Print host upload queue" -msgstr "호스트 업로드 대기열 인쇄" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:122 -msgid "Camera view" -msgstr "카메라 뷰" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:123 -msgid "Add Instance of the selected object" -msgstr "선택한 개체의 복제본 추가" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:124 -msgid "Remove Instance of the selected object" -msgstr "선택한 개체의 복제본 제거" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:125 -msgid "Show keyboard shortcuts list" -msgstr "바로 가기 키 목록 표시" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:126 -msgid "Press to select multiple object or move multiple object with mouse" -msgstr "여러 개체를 선택 하거나 마우스로 여러 개체를 이동 하려면 누릅니다" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:128 -msgid "Main Shortcuts" -msgstr "주요 단축키" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:135 -msgid "Select All objects" -msgstr "모든 객체 선택" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:136 -msgid "Delete selected" -msgstr "선택 삭제" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:137 -msgid "Delete All" -msgstr "전부 지움" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:138 -msgid "Copy to clipboard" -msgstr "클립보드로 복사" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:139 -msgid "Paste from clipboard" -msgstr "클립보드에서 붙여넣기" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:140 -msgid "Gizmo move" -msgstr "객체 이동" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:141 -msgid "Gizmo scale" -msgstr "객체 배율" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:142 -msgid "Gizmo rotate" -msgstr "객체 회전" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:143 -msgid "Gizmo cut" -msgstr "기즈모 자르기" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:144 -msgid "Gizmo Place face on bed" -msgstr "기즈모를 배드위에서" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:145 -msgid "Gizmo SLA support points" -msgstr "객체 SLA 지원 포인트" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:146 -#, c-format -msgid "" -"Press to activate selection rectangle\n" -"or to snap by 5% in Gizmo scale\n" -"or to snap by 1mm in Gizmo move" -msgstr "" -"활성화된 사각형을 선택합니다.\n" -"5% in 객체 크기를 스냅에 맞춰 조절합니다.\n" -"1mm 씩 객체를 스냅에 맞추 이동합니다." - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:147 -msgid "" -"Press to scale selection to fit print volume\n" -"in Gizmo scale" -msgstr "" -"인쇄 볼륨에 맞게 선택 크기를 조정하려면 누릅니다.\n" -"기즈모 스케일" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:148 -msgid "" -"Press to activate deselection rectangle\n" -"or to scale or rotate selected objects\n" -"around their own center" -msgstr "" -"자신의 중심 주변\n" -"선택한 개체의 크기를 조정 하거나\n" -"회전 하려면 누릅니다" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:149 -msgid "Press to activate one direction scaling in Gizmo scale" -msgstr "기즈모 크기 조절을 활성화 합니다." - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:150 -msgid "Change camera type" -msgstr "카메라 유형 변경" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:151 -msgid "Zoom to Bed" -msgstr "배드 확대" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:152 -msgid "Zoom to all objects in scene, if none selected" -msgstr "장면의 모든 오브젝트로 확대/축소 (선택 하지 않은 경우)" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:153 -msgid "Zoom to selected object" -msgstr "선택한 개체로 확대/축소" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:154 -msgid "Zoom in" -msgstr "확대" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:155 -msgid "Zoom out" -msgstr "줌 아웃" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:156 -msgid "Unselect gizmo / Clear selection" -msgstr "기즈모 선택을 취소 하거나 지우기" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:158 -msgid "Toggle picking pass texture rendering on/off" -msgstr "선택 패스 텍스처 렌더링 켜기/끄기 전환" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:161 -msgid "Plater Shortcuts" -msgstr "플레이터 단축기" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:176 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:187 -msgid "Arrow Up" -msgstr "위쪽 화살표" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:176 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:178 -msgid "Upper Layer" -msgstr "상위 레이어" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:177 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:188 -msgid "Arrow Down" -msgstr "아래쪽 화살표" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:177 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:179 -msgid "Lower Layer" -msgstr "하위 레이어" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:181 -msgid "Preview Shortcuts" -msgstr "미리보기 단축기" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:187 -msgid "Move current slider thumb Up" -msgstr "현재 마우스 휠 슬라이더를 위로 이동" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:188 -msgid "Move current slider thumb Down" -msgstr "현재 마우스 휠 슬라이더를 아래로 이동" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:189 -msgid "Arrow Left" -msgstr "왼쪽 화살표" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:189 -msgid "Set upper thumb to current slider thumb" -msgstr "마우스 휠을 위로 움직여 설정" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:190 -msgid "Arrow Right" -msgstr "오른쪽 화살표" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:190 -msgid "Set lower thumb to current slider thumb" -msgstr "마우스 휠을 아래로 움직여 설정" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:191 -msgid "Add color change marker for current layer" -msgstr "현재 레이어의 색상 변경 마커 추가" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:192 -msgid "Delete color change marker for current layer" -msgstr "현재 레이어의 색상 변경 마커 삭제" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:194 -msgid "Layers Slider Shortcuts" -msgstr "레이어 슬라이더 단축키" - -#: src/slic3r/GUI/MainFrame.cpp:62 -msgid "" -" - Remember to check for updates at http://github.com/prusa3d/PrusaSlicer/" -"releases" -msgstr "" -" -http://github.com/prusa3d/slic3r/releases에서 업데이트를 확인하는 것을 잊" -"지 마십시오" - -#: src/slic3r/GUI/MainFrame.cpp:157 -msgid "based on Slic3r" -msgstr "Slic3r 기반" - -#: src/slic3r/GUI/MainFrame.cpp:187 -msgid "Plater" -msgstr "플레이터" - -#: src/slic3r/GUI/MainFrame.cpp:393 -msgid "&New Project" -msgstr "&새로운 프로젝트" - -#: src/slic3r/GUI/MainFrame.cpp:393 -msgid "Start a new project" -msgstr "새로운 프로젝트 시작" - -#: src/slic3r/GUI/MainFrame.cpp:396 -msgid "&Open Project" -msgstr "&프로젝트 열기" - -#: src/slic3r/GUI/MainFrame.cpp:396 -msgid "Open a project file" -msgstr "프로젝트 파일 열기" - -#: src/slic3r/GUI/MainFrame.cpp:401 -msgid "Recent projects" -msgstr "최근 프로젝트" - -#: src/slic3r/GUI/MainFrame.cpp:410 -msgid "The selected project is no more available" -msgstr "선택한 프로젝트를 더 이상 사용할 수 없습니다." - -#: src/slic3r/GUI/MainFrame.cpp:410 src/slic3r/GUI/MainFrame.cpp:747 -#: src/slic3r/GUI/PrintHostDialogs.cpp:231 -msgid "Error" -msgstr "에러" - -#: src/slic3r/GUI/MainFrame.cpp:434 -msgid "&Save Project" -msgstr "프로젝트 저장" - -#: src/slic3r/GUI/MainFrame.cpp:434 -msgid "Save current project file" -msgstr "현재 프로젝트 파일 저장" - -#: src/slic3r/GUI/MainFrame.cpp:438 src/slic3r/GUI/MainFrame.cpp:440 -msgid "Save Project &as" -msgstr "프로젝트 저장" - -#: src/slic3r/GUI/MainFrame.cpp:438 src/slic3r/GUI/MainFrame.cpp:440 -msgid "Save current project file as" -msgstr "현재 프로젝트 파일을 다른 이름으로 저장" - -#: src/slic3r/GUI/MainFrame.cpp:448 -msgid "Import STL/OBJ/AM&F/3MF" -msgstr "가져오기 STL/OBJ/AM&F/3MF" - -#: src/slic3r/GUI/MainFrame.cpp:448 -msgid "Load a model" -msgstr "모델 로드" - -#: src/slic3r/GUI/MainFrame.cpp:452 -msgid "Import &Config" -msgstr "&구성 가져오기" - -#: src/slic3r/GUI/MainFrame.cpp:452 -msgid "Load exported configuration file" -msgstr "내 보낸 구성 파일로드" - -#: src/slic3r/GUI/MainFrame.cpp:454 -msgid "Import Config from &project" -msgstr "프로젝트에서 설정 가져오기" - -#: src/slic3r/GUI/MainFrame.cpp:454 -msgid "Load configuration from project file" -msgstr "프로젝트 파일에서 구성 로드" - -#: src/slic3r/GUI/MainFrame.cpp:457 -msgid "Import Config &Bundle" -msgstr "번들 &설정 가져오기" - -#: src/slic3r/GUI/MainFrame.cpp:457 -msgid "Load presets from a bundle" -msgstr "번들에서 미리 설정로드" - -#: src/slic3r/GUI/MainFrame.cpp:459 -msgid "&Import" -msgstr "&가져오기" - -#: src/slic3r/GUI/MainFrame.cpp:462 src/slic3r/GUI/MainFrame.cpp:708 -msgid "Export &G-code" -msgstr "G-코드 내보내기" - -#: src/slic3r/GUI/MainFrame.cpp:462 -msgid "Export current plate as G-code" -msgstr "현재 플레이터를 G 코드로 내보내기" - -#: src/slic3r/GUI/MainFrame.cpp:466 src/slic3r/GUI/MainFrame.cpp:709 -msgid "S&end G-code" -msgstr "S&엔드 G- 코드" - -#: src/slic3r/GUI/MainFrame.cpp:466 -msgid "Send to print current plate as G-code" -msgstr "현재 플레이트를 G 코드로 인쇄하기 위해 보내기" - -#: src/slic3r/GUI/MainFrame.cpp:471 -msgid "Export plate as &STL" -msgstr "STL로 내보내기" - -#: src/slic3r/GUI/MainFrame.cpp:471 -msgid "Export current plate as STL" -msgstr "현재 플레이터를 STL로 내보내기" - -#: src/slic3r/GUI/MainFrame.cpp:474 -msgid "Export plate as STL including supports" -msgstr "서포트를 포함하여 STL파일로 내보내기" - -#: src/slic3r/GUI/MainFrame.cpp:474 -msgid "Export current plate as STL including supports" -msgstr "서포트를 포함 하여 현재 플레이터를 STL로 내보내기" - -#: src/slic3r/GUI/MainFrame.cpp:477 -msgid "Export plate as &AMF" -msgstr "AMF로 내보내기" - -#: src/slic3r/GUI/MainFrame.cpp:477 -msgid "Export current plate as AMF" -msgstr "현재 플레이터를AMF로 내보내기" - -#: src/slic3r/GUI/MainFrame.cpp:481 -msgid "Export &Config" -msgstr "&구성 내보내기" - -#: src/slic3r/GUI/MainFrame.cpp:481 -msgid "Export current configuration to file" -msgstr "현재 구성을 파일로 내보내기" - -#: src/slic3r/GUI/MainFrame.cpp:483 -msgid "Export Config &Bundle" -msgstr "번들 & 내보내기 설정" - -#: src/slic3r/GUI/MainFrame.cpp:483 -msgid "Export all presets to file" -msgstr "모든 이전 설정을 파일로 내보내기" - -#: src/slic3r/GUI/MainFrame.cpp:485 -msgid "&Export" -msgstr "&내보내기" - -#: src/slic3r/GUI/MainFrame.cpp:491 -msgid "Quick Slice" -msgstr "빠른 슬라이스" - -#: src/slic3r/GUI/MainFrame.cpp:491 -msgid "Slice a file into a G-code" -msgstr "파일을 G 코드로 분할" - -#: src/slic3r/GUI/MainFrame.cpp:497 -msgid "Quick Slice and Save As" -msgstr "빠른 슬라이스 및 다른 이름으로 저장" - -#: src/slic3r/GUI/MainFrame.cpp:497 -msgid "Slice a file into a G-code, save as" -msgstr "파일을 G 코드로 분할하고 다음으로 저장" - -#: src/slic3r/GUI/MainFrame.cpp:503 -msgid "Repeat Last Quick Slice" -msgstr "마지막으로 빠른 슬라이스 반복" - -#: src/slic3r/GUI/MainFrame.cpp:503 -msgid "Repeat last quick slice" -msgstr "마지막으로 빠른 슬라이스 반복" - -#: src/slic3r/GUI/MainFrame.cpp:511 -msgid "(Re)Slice No&w" -msgstr "지금(다시)자르기" - -#: src/slic3r/GUI/MainFrame.cpp:511 -msgid "Start new slicing process" -msgstr "새로운 슬라이싱 작업 시작" - -#: src/slic3r/GUI/MainFrame.cpp:515 -msgid "&Repair STL file" -msgstr "STL 파일 복구" - -#: src/slic3r/GUI/MainFrame.cpp:515 -msgid "Automatically repair an STL file" -msgstr "STL 파일을 자동으로 복구합니다" - -#: src/slic3r/GUI/MainFrame.cpp:518 -msgid "&Quit" -msgstr "&종료" - -#: src/slic3r/GUI/MainFrame.cpp:518 -#, c-format -msgid "Quit %s" -msgstr "%s 종료" - -#: src/slic3r/GUI/MainFrame.cpp:543 -msgid "&Select all" -msgstr "&모두 선택 " - -#: src/slic3r/GUI/MainFrame.cpp:544 -msgid "Selects all objects" -msgstr "모든 개체를 선택 합니다" - -#: src/slic3r/GUI/MainFrame.cpp:546 -msgid "D&eselect all" -msgstr "선택 취소 D&eselect" - -#: src/slic3r/GUI/MainFrame.cpp:547 -msgid "Deselects all objects" -msgstr "모든 객체 선택 취소" - -#: src/slic3r/GUI/MainFrame.cpp:550 -msgid "&Delete selected" -msgstr "&선택 삭제 " - -#: src/slic3r/GUI/MainFrame.cpp:551 -msgid "Deletes the current selection" -msgstr "현재 선택 영역을 삭제 합니다" - -#: src/slic3r/GUI/MainFrame.cpp:553 -msgid "Delete &all" -msgstr "전부 지움 " - -#: src/slic3r/GUI/MainFrame.cpp:554 -msgid "Deletes all objects" -msgstr "모든 객체를 삭제 합니다" - -#: src/slic3r/GUI/MainFrame.cpp:558 -msgid "&Undo" -msgstr "&되돌리기" - -#: src/slic3r/GUI/MainFrame.cpp:561 -msgid "&Redo" -msgstr "&앞으로" - -#: src/slic3r/GUI/MainFrame.cpp:566 -msgid "&Copy" -msgstr "&복사 " - -#: src/slic3r/GUI/MainFrame.cpp:567 -msgid "Copy selection to clipboard" -msgstr "선택영역을 클립보드로 복사합니다" - -#: src/slic3r/GUI/MainFrame.cpp:569 -msgid "&Paste" -msgstr "&붙이기 " - -#: src/slic3r/GUI/MainFrame.cpp:570 -msgid "Paste clipboard" -msgstr "클립보드 붙여넣기" - -#: src/slic3r/GUI/MainFrame.cpp:579 -msgid "&Plater Tab" -msgstr "&선택 및 플래이터 탭" - -#: src/slic3r/GUI/MainFrame.cpp:579 -msgid "Show the plater" -msgstr "플레이터를 보기" - -#: src/slic3r/GUI/MainFrame.cpp:586 -msgid "P&rint Settings Tab" -msgstr "프린트 설정 탭" - -#: src/slic3r/GUI/MainFrame.cpp:586 -msgid "Show the print settings" -msgstr "인쇄 설정 표시" - -#: src/slic3r/GUI/MainFrame.cpp:588 src/slic3r/GUI/MainFrame.cpp:711 -msgid "&Filament Settings Tab" -msgstr "&필라멘트 설정 탭" - -#: src/slic3r/GUI/MainFrame.cpp:588 -msgid "Show the filament settings" -msgstr "필라멘트 설정보기" - -#: src/slic3r/GUI/MainFrame.cpp:591 -msgid "Print&er Settings Tab" -msgstr "설정 인쇄 탭" - -#: src/slic3r/GUI/MainFrame.cpp:591 -msgid "Show the printer settings" -msgstr "간단한 설정보기" - -#: src/slic3r/GUI/MainFrame.cpp:595 -msgid "3&D" -msgstr "3&D" - -#: src/slic3r/GUI/MainFrame.cpp:595 -msgid "Show the 3D editing view" -msgstr "3D 편집용 보기 표시" - -#: src/slic3r/GUI/MainFrame.cpp:598 -msgid "Pre&view" -msgstr "미리 보기" - -#: src/slic3r/GUI/MainFrame.cpp:598 -msgid "Show the 3D slices preview" -msgstr "3D 슬라이스 미리 보기 표시" - -#: src/slic3r/GUI/MainFrame.cpp:617 -msgid "Print &Host Upload Queue" -msgstr "호스트 업로드 대기열 인쇄" - -#: src/slic3r/GUI/MainFrame.cpp:617 -msgid "Display the Print Host Upload Queue window" -msgstr "호스트 업로드 대기열 인쇄 창 표시" - -#: src/slic3r/GUI/MainFrame.cpp:626 -msgid "Iso" -msgstr "기본 " - -#: src/slic3r/GUI/MainFrame.cpp:626 -msgid "Iso View" -msgstr "표준 보기" - -#. TRN To be shown in the main menu View->Top -#. TRN To be shown in Print Settings "Top solid layers" -#: src/slic3r/GUI/MainFrame.cpp:630 src/libslic3r/PrintConfig.cpp:2094 -msgid "Top" -msgstr "윗부분 " - -#: src/slic3r/GUI/MainFrame.cpp:630 -msgid "Top View" -msgstr "위에서 보기" - -#. TRN To be shown in the main menu View->Bottom -#. TRN To be shown in Print Settings "Bottom solid layers" -#: src/slic3r/GUI/MainFrame.cpp:633 src/libslic3r/PrintConfig.cpp:159 -msgid "Bottom" -msgstr "바닥 " - -#: src/slic3r/GUI/MainFrame.cpp:633 -msgid "Bottom View" -msgstr "바닥 보기" - -#: src/slic3r/GUI/MainFrame.cpp:635 -msgid "Front" -msgstr "앞 " - -#: src/slic3r/GUI/MainFrame.cpp:635 -msgid "Front View" -msgstr "앞면 보기 " - -#: src/slic3r/GUI/MainFrame.cpp:637 src/libslic3r/PrintConfig.cpp:1611 -msgid "Rear" -msgstr "뒷면 " - -#: src/slic3r/GUI/MainFrame.cpp:637 -msgid "Rear View" -msgstr "뒷면 보기" - -#: src/slic3r/GUI/MainFrame.cpp:639 -msgid "Left" -msgstr "왼쪽 " - -#: src/slic3r/GUI/MainFrame.cpp:639 -msgid "Left View" -msgstr "왼쪽 보기" - -#: src/slic3r/GUI/MainFrame.cpp:641 -msgid "Right" -msgstr "오른쪽 " - -#: src/slic3r/GUI/MainFrame.cpp:641 -msgid "Right View" -msgstr "오른쪽 보기" - -#: src/slic3r/GUI/MainFrame.cpp:648 -msgid "Prusa 3D &Drivers" -msgstr "푸르사 3D 드라이버" - -#: src/slic3r/GUI/MainFrame.cpp:648 -msgid "Open the Prusa3D drivers download page in your browser" -msgstr "브라우저에서 Prusa3D 드라이버 다운로드 페이지를 엽니다" - -#: src/slic3r/GUI/MainFrame.cpp:650 -msgid "Software &Releases" -msgstr "소프트웨어 &자료" - -#: src/slic3r/GUI/MainFrame.cpp:650 -msgid "Open the software releases page in your browser" -msgstr "브라우저에서 소프트웨어 정보 페이지 열기" - -#: src/slic3r/GUI/MainFrame.cpp:656 -#, c-format -msgid "%s &Website" -msgstr "%s &웹사이트" - -#: src/slic3r/GUI/MainFrame.cpp:657 -#, c-format -msgid "Open the %s website in your browser" -msgstr "%s 웹사이트를 브라우저에서 열기" - -#: src/slic3r/GUI/MainFrame.cpp:663 -msgid "System &Info" -msgstr "시스템 정보" - -#: src/slic3r/GUI/MainFrame.cpp:663 -msgid "Show system information" -msgstr "시스템 정보 표시" - -#: src/slic3r/GUI/MainFrame.cpp:665 -msgid "Show &Configuration Folder" -msgstr "폴더 표시 및 구성" - -#: src/slic3r/GUI/MainFrame.cpp:665 -msgid "Show user configuration folder (datadir)" -msgstr "사용자 구성 폴더 표시 (datadir)" - -#: src/slic3r/GUI/MainFrame.cpp:667 -msgid "Report an I&ssue" -msgstr "문제를 보고" - -#: src/slic3r/GUI/MainFrame.cpp:667 -#, c-format -msgid "Report an issue on %s" -msgstr "%s에 문제 보고" - -#: src/slic3r/GUI/MainFrame.cpp:669 -#, c-format -msgid "&About %s" -msgstr "%s 에 대하여" - -#: src/slic3r/GUI/MainFrame.cpp:669 -msgid "Show about dialog" -msgstr "다이얼로그 표시" - -#: src/slic3r/GUI/MainFrame.cpp:672 -msgid "Show the list of the keyboard shortcuts" -msgstr "키보드 단축키 목록 표시" - -#: src/slic3r/GUI/MainFrame.cpp:680 -msgid "&File" -msgstr "&파일" - -#: src/slic3r/GUI/MainFrame.cpp:681 -msgid "&Edit" -msgstr "&수정" - -#: src/slic3r/GUI/MainFrame.cpp:682 -msgid "&Window" -msgstr "&윈도우" - -#: src/slic3r/GUI/MainFrame.cpp:683 -msgid "&View" -msgstr "&시점" - -#: src/slic3r/GUI/MainFrame.cpp:686 -msgid "&Help" -msgstr "&도움말" - -#: src/slic3r/GUI/MainFrame.cpp:708 -msgid "E&xport" -msgstr "보내기" - -#: src/slic3r/GUI/MainFrame.cpp:709 -msgid "S&end to print" -msgstr "끝내고 프린트" - -#: src/slic3r/GUI/MainFrame.cpp:711 -msgid "Mate&rial Settings Tab" -msgstr "재료(메터리리알) 설정 탭" - -#: src/slic3r/GUI/MainFrame.cpp:732 -msgid "Choose a file to slice (STL/OBJ/AMF/3MF/PRUSA):" -msgstr "슬라이스 할 파일을 선택하십시오 (STL / OBJ / AMF / 3MF / PRUSA):" - -#: src/slic3r/GUI/MainFrame.cpp:746 -msgid "No previously sliced file." -msgstr "이전에 분리 된 파일이 없습니다." - -#: src/slic3r/GUI/MainFrame.cpp:752 -msgid "Previously sliced file (" -msgstr "이전에 분리 된 파일 (" - -#: src/slic3r/GUI/MainFrame.cpp:752 -msgid ") not found." -msgstr ")을 찾을 수 없습니다." - -#: src/slic3r/GUI/MainFrame.cpp:753 -msgid "File Not Found" -msgstr "파일을 찾을수 없다" - -#: src/slic3r/GUI/MainFrame.cpp:788 -#, c-format -msgid "Save %s file as:" -msgstr "%s 파일을 다음과 같이 저장 합니다" - -#: src/slic3r/GUI/MainFrame.cpp:788 -msgid "SVG" -msgstr "Svg" - -#: src/slic3r/GUI/MainFrame.cpp:788 -msgid "G-code" -msgstr "G 코드" - -#: src/slic3r/GUI/MainFrame.cpp:803 -msgid "Save zip file as:" -msgstr "압축(zip)파일 다른이름 저장:" - -#: src/slic3r/GUI/MainFrame.cpp:815 src/slic3r/GUI/Plater.cpp:2933 -#: src/slic3r/GUI/Plater.cpp:4418 src/slic3r/GUI/Tab.cpp:1170 -#: src/slic3r/GUI/Tab.cpp:3700 -msgid "Slicing" -msgstr "슬라이싱" - -#. TRN "Processing input_file_basename" -#: src/slic3r/GUI/MainFrame.cpp:817 -#, c-format -msgid "Processing %s" -msgstr "처리 %s" - -#: src/slic3r/GUI/MainFrame.cpp:840 -msgid " was successfully sliced." -msgstr " 성공적으로 슬라이스." - -#: src/slic3r/GUI/MainFrame.cpp:842 -msgid "Slicing Done!" -msgstr "슬라이스 완료!" - -#: src/slic3r/GUI/MainFrame.cpp:857 -msgid "Select the STL file to repair:" -msgstr "복구 할 STL 파일을 선택하십시오:" - -#: src/slic3r/GUI/MainFrame.cpp:870 -msgid "Save OBJ file (less prone to coordinate errors than STL) as:" -msgstr "OBJ 파일을 저장하십시오 (STL보다 오류를 덜 조정할 가능성이 적음):" - -#: src/slic3r/GUI/MainFrame.cpp:885 -msgid "Your file was repaired." -msgstr "파일이 복구되었습니다." - -#: src/slic3r/GUI/MainFrame.cpp:885 src/libslic3r/PrintConfig.cpp:3221 -msgid "Repair" -msgstr "수정" - -#: src/slic3r/GUI/MainFrame.cpp:899 -msgid "Save configuration as:" -msgstr "구성을 저장 :" - -#: src/slic3r/GUI/MainFrame.cpp:919 src/slic3r/GUI/MainFrame.cpp:983 -msgid "Select configuration to load:" -msgstr "로드 할 구성 선택 :" - -#: src/slic3r/GUI/MainFrame.cpp:956 -msgid "Save presets bundle as:" -msgstr "이전 설정 번들을 다음과 같이 저장 :" - -#: src/slic3r/GUI/MainFrame.cpp:1007 -#, c-format -msgid "%d presets successfully imported." -msgstr "% d 사전 설정을 가져 왔습니다." - -#: src/slic3r/GUI/MsgDialog.cpp:73 -#, c-format -msgid "%s error" -msgstr "%s 오류" - -#: src/slic3r/GUI/MsgDialog.cpp:74 -#, c-format -msgid "%s has encountered an error" -msgstr "%s에 오류가 발생 했습니다" - -#: src/slic3r/GUI/Plater.cpp:146 -msgid "Volume" -msgstr "크기" - -#: src/slic3r/GUI/Plater.cpp:147 -msgid "Facets" -msgstr "측면" - -#: src/slic3r/GUI/Plater.cpp:148 -msgid "Materials" -msgstr "재료" - -#: src/slic3r/GUI/Plater.cpp:151 -msgid "Manifold" -msgstr "많은" - -#: src/slic3r/GUI/Plater.cpp:201 -msgid "Sliced Info" -msgstr "슬라이스된 정보" - -#: src/slic3r/GUI/Plater.cpp:220 src/slic3r/GUI/Plater.cpp:1135 -msgid "Used Filament (m)" -msgstr "사용자 필라멘트 (m)" - -#: src/slic3r/GUI/Plater.cpp:221 -msgid "Used Filament (mm³)" -msgstr "사용자 필라멘트 (mm³)" - -#: src/slic3r/GUI/Plater.cpp:222 -msgid "Used Filament (g)" -msgstr "사용자 필라멘트 (g)" - -#: src/slic3r/GUI/Plater.cpp:223 -msgid "Used Material (unit)" -msgstr "사용 재료 (단위)" - -#: src/slic3r/GUI/Plater.cpp:224 src/slic3r/GUI/Plater.cpp:1150 -#: src/libslic3r/PrintConfig.cpp:742 -msgid "Cost" -msgstr "비용" - -#: src/slic3r/GUI/Plater.cpp:225 src/slic3r/GUI/Plater.cpp:1122 -#: src/slic3r/GUI/Plater.cpp:1164 -msgid "Estimated printing time" -msgstr "예상 인쇄 시간" - -#: src/slic3r/GUI/Plater.cpp:226 -msgid "Number of tool changes" -msgstr "공구(tool) 변경 수" - -#: src/slic3r/GUI/Plater.cpp:317 -msgid "Click to edit preset" -msgstr "사전 설정을 편집 하려면 클릭 하십시오" - -#: src/slic3r/GUI/Plater.cpp:469 -msgid "Select what kind of support do you need" -msgstr "서포트의 종류를 선택하세요" - -#: src/slic3r/GUI/Plater.cpp:471 src/libslic3r/PrintConfig.cpp:1865 -#: src/libslic3r/PrintConfig.cpp:2529 -msgid "Support on build plate only" -msgstr "출력물만 서포트를 지지" - -#: src/slic3r/GUI/Plater.cpp:472 src/slic3r/GUI/Plater.cpp:587 -msgid "For support enforcers only" -msgstr "서포트 지원영역 전용" - -#: src/slic3r/GUI/Plater.cpp:473 -msgid "Everywhere" -msgstr "모든곳" - -#: src/slic3r/GUI/Plater.cpp:505 src/slic3r/GUI/Tab.cpp:1067 -msgid "Brim" -msgstr "브림" - -#: src/slic3r/GUI/Plater.cpp:507 -msgid "" -"This flag enables the brim that will be printed around each object on the " -"first layer." -msgstr "" -"이 플래그는 첫 번째 레이어의 각 개체 주위에 인쇄 될 브림을 활성화합니다." - -#: src/slic3r/GUI/Plater.cpp:515 -msgid "Purging volumes" -msgstr "볼륨 삭제" - -#: src/slic3r/GUI/Plater.cpp:766 -msgid "Print settings" -msgstr "프린트 설정" - -#: src/slic3r/GUI/Plater.cpp:767 src/slic3r/GUI/Tab.cpp:1604 -#: src/slic3r/GUI/Tab.cpp:1605 -msgid "Filament" -msgstr "필라멘트" - -#: src/slic3r/GUI/Plater.cpp:768 -msgid "SLA print settings" -msgstr "SLA 인쇄 설정" - -#: src/slic3r/GUI/Plater.cpp:769 src/slic3r/GUI/Preset.cpp:1310 -msgid "SLA material" -msgstr "SLA 재료" - -#: src/slic3r/GUI/Plater.cpp:770 -msgid "Printer" -msgstr "프린터" - -#: src/slic3r/GUI/Plater.cpp:820 src/slic3r/GUI/Plater.cpp:4688 -msgid "Send to printer" -msgstr "프린터로 보내기" - -#: src/slic3r/GUI/Plater.cpp:823 src/slic3r/GUI/Plater.cpp:2933 -#: src/slic3r/GUI/Plater.cpp:4421 -msgid "Slice now" -msgstr "지금 자르기" - -#: src/slic3r/GUI/Plater.cpp:963 -msgid "Hold Shift to Slice & Export G-code" -msgstr "Shift 키를 누른 채 G 코드 내보내기" - -#: src/slic3r/GUI/Plater.cpp:1068 -#, c-format -msgid "%d (%d shells)" -msgstr "% d (% d 쉘)" - -#: src/slic3r/GUI/Plater.cpp:1073 -#, c-format -msgid "Auto-repaired (%d errors)" -msgstr "오류자동수정 (%d errors)" - -#: src/slic3r/GUI/Plater.cpp:1076 -#, c-format -msgid "" -"%d degenerate facets, %d edges fixed, %d facets removed, %d facets added, %d " -"facets reversed, %d backwards edges" -msgstr "" -"%d 면 고정, %d 모서리 고정, %d 면 제거, %d 면 추가, %d 면 반전, %d 후방 모서" -"리" - -#: src/slic3r/GUI/Plater.cpp:1086 -msgid "Yes" -msgstr "예" - -#: src/slic3r/GUI/Plater.cpp:1109 -msgid "Used Material (ml)" -msgstr "사용 재료 (ml)" - -#: src/slic3r/GUI/Plater.cpp:1112 -msgid "object(s)" -msgstr "개체(들)" - -#: src/slic3r/GUI/Plater.cpp:1112 -msgid "supports and pad" -msgstr "지지대 및 패드" - -#: src/slic3r/GUI/Plater.cpp:1137 src/slic3r/GUI/Plater.cpp:1152 -msgid "objects" -msgstr "개체" - -#: src/slic3r/GUI/Plater.cpp:1137 src/slic3r/GUI/Plater.cpp:1152 -msgid "wipe tower" -msgstr "와이프 타워(Wipe tower)" - -#: src/slic3r/GUI/Plater.cpp:1167 -msgid "normal mode" -msgstr "일반 모드" - -#: src/slic3r/GUI/Plater.cpp:1171 src/slic3r/GUI/Plater.cpp:1180 -msgid "Color " -msgstr "색" - -#: src/slic3r/GUI/Plater.cpp:1176 -msgid "stealth mode" -msgstr "스텔스 모드" - -#: src/slic3r/GUI/Plater.cpp:1271 -msgid "Load File" -msgstr "파일 로드" - -#: src/slic3r/GUI/Plater.cpp:1275 -msgid "Load Files" -msgstr "파일 로드" - -#: src/slic3r/GUI/Plater.cpp:1503 -msgid "ERROR: not enough resources to execute a new job." -msgstr "오류: 새 작업을 실행하기에 충분한 리소스가 아닙니다." - -#: src/slic3r/GUI/Plater.cpp:2056 -msgid "New Project" -msgstr "새로운 프로젝트" - -#: src/slic3r/GUI/Plater.cpp:2173 -msgid "Loading" -msgstr "로딩" - -#: src/slic3r/GUI/Plater.cpp:2183 -#, c-format -msgid "Processing input file %s\n" -msgstr "입력 파일 처리 %s\n" - -#: src/slic3r/GUI/Plater.cpp:2211 -msgid "" -"You can't to load SLA project if there is at least one multi-part object on " -"the bed" -msgstr "" -"침대에 다중 부품 개체가 하나 이상 있는 경우 SLA 프로젝트를 로드할 수 없습니" -"다." - -#: src/slic3r/GUI/Plater.cpp:2212 src/slic3r/GUI/Tab.cpp:3064 -msgid "Please check your object list before preset changing." -msgstr "사전 설정을 변경 하기 전에 개체 목록을 확인 하십시오." - -#: src/slic3r/GUI/Plater.cpp:2255 -msgid "" -"This file contains several objects positioned at multiple heights. Instead " -"of considering them as multiple objects, should I consider\n" -"this file as a single object having multiple parts?\n" -msgstr "" -"이 파일에는 여러 높이에 위치한 여러 객체가 들어 있습니다. 여러 객체로 간주하" -"는 대신,\n" -"이 파일은 여러 부분을 갖는 단일 객체로 보입니까?\n" - -#: src/slic3r/GUI/Plater.cpp:2258 src/slic3r/GUI/Plater.cpp:2310 -msgid "Multi-part object detected" -msgstr "다중 부품 객체가 감지" - -#: src/slic3r/GUI/Plater.cpp:2265 -msgid "" -"This file cannot be loaded in a simple mode. Do you want to switch to an " -"advanced mode?\n" -msgstr "" -"이 파일은 단순 모드에서 로드할 수 없습니다. 고급 모드로 전환 하시겠습니까?\n" - -#: src/slic3r/GUI/Plater.cpp:2266 -msgid "Detected advanced data" -msgstr "감지된 고급 데이터" - -#: src/slic3r/GUI/Plater.cpp:2287 -#, c-format -msgid "" -"You can't to add the object(s) from %s because of one or some of them " -"is(are) multi-part" -msgstr "멀티파트 하나 또는 그 중 일부 때문에 %s에서 개체를 추가 할 수 없습니다" - -#: src/slic3r/GUI/Plater.cpp:2307 -msgid "" -"Multiple objects were loaded for a multi-material printer.\n" -"Instead of considering them as multiple objects, should I consider\n" -"these files to represent a single object having multiple parts?\n" -msgstr "" -"다중 재료 프린터에 대해 여러 객체가로드되었습니다.\n" -"여러 객체로 간주하는 대신,\n" -"이 파일들은 여러 부분을 갖는 단일 객체를 나타낼 수 있습니까?\n" - -#: src/slic3r/GUI/Plater.cpp:2323 -msgid "Loaded" -msgstr "로드(loaded)" - -#: src/slic3r/GUI/Plater.cpp:2418 -msgid "" -"Your object appears to be too large, so it was automatically scaled down to " -"fit your print bed." -msgstr "개체가 너무 커서 인쇄물에 맞게 자동으로 축소되었습니다." - -#: src/slic3r/GUI/Plater.cpp:2419 -msgid "Object too large?" -msgstr "개체가 너무 큽니까?" - -#: src/slic3r/GUI/Plater.cpp:2476 -msgid "Export STL file:" -msgstr "STL 파일 내보내기:" - -#: src/slic3r/GUI/Plater.cpp:2483 -msgid "Export AMF file:" -msgstr "AMF 파일 내보내기:" - -#: src/slic3r/GUI/Plater.cpp:2489 -msgid "Save file as:" -msgstr "다른 이름으로 파일 저장:" - -#: src/slic3r/GUI/Plater.cpp:2592 -msgid "Delete Object" -msgstr "오브젝트 지우기" - -#: src/slic3r/GUI/Plater.cpp:2603 -msgid "Reset Project" -msgstr "프로젝트 재설정" - -#: src/slic3r/GUI/Plater.cpp:2630 src/slic3r/GUI/Plater.cpp:3517 -msgid "Mirror" -msgstr "반전(Mirror)" - -#: src/slic3r/GUI/Plater.cpp:2643 -msgid "Optimize Rotation" -msgstr "회전 최적화" - -#: src/slic3r/GUI/Plater.cpp:2689 -msgid "Arranging" -msgstr "정렬" - -#: src/slic3r/GUI/Plater.cpp:2712 -msgid "Could not arrange model objects! Some geometries may be invalid." -msgstr "" -"모델 개체를 정렬할 수 없습니다. 일부 형상은 유효 하지 않을 수 있습니다." - -#: src/slic3r/GUI/Plater.cpp:2718 -msgid "Arranging canceled." -msgstr "취소 된 정렬" - -#: src/slic3r/GUI/Plater.cpp:2719 -msgid "Arranging done." -msgstr "정렬 완료." - -#: src/slic3r/GUI/Plater.cpp:2735 -msgid "Searching for optimal orientation" -msgstr "최적의 방향 검색" - -#: src/slic3r/GUI/Plater.cpp:2768 -msgid "Orientation search canceled." -msgstr "오리엔테이션 검색이 취소 됨" - -#: src/slic3r/GUI/Plater.cpp:2769 -msgid "Orientation found." -msgstr "방향을 찾았습니다." - -#: src/slic3r/GUI/Plater.cpp:2785 -msgid "" -"The selected object can't be split because it contains more than one volume/" -"material." -msgstr "" -"선택한 객체는 둘 이상의 볼륨 / 재료가 포함되어 있기 때문에 분할 할 수 없습니" -"다." - -#: src/slic3r/GUI/Plater.cpp:2796 -msgid "Split to Objects" -msgstr "객체로 분할" - -#: src/slic3r/GUI/Plater.cpp:2918 -msgid "Invalid data" -msgstr "잘못 된 데이터" - -#: src/slic3r/GUI/Plater.cpp:2927 -msgid "Ready to slice" -msgstr "슬라이스 준비" - -#: src/slic3r/GUI/Plater.cpp:2965 src/slic3r/GUI/PrintHostDialogs.cpp:232 -msgid "Cancelling" -msgstr "취소 중" - -#: src/slic3r/GUI/Plater.cpp:2982 -msgid "Another export job is currently running." -msgstr "다른 내보내기 작업이 현재 실행 중입니다." - -#: src/slic3r/GUI/Plater.cpp:3036 src/slic3r/GUI/Plater.cpp:3493 -msgid "Reload from Disk" -msgstr "디스크에서 다시 불러오기" - -#: src/slic3r/GUI/Plater.cpp:3072 -msgid "Fix Throught NetFabb" -msgstr "NetFabb으로 수정" - -#: src/slic3r/GUI/Plater.cpp:3254 -msgid "Export failed" -msgstr "내보내기 실패" - -#: src/slic3r/GUI/Plater.cpp:3259 src/slic3r/GUI/PrintHostDialogs.cpp:233 -msgid "Cancelled" -msgstr "취소됨" - -#: src/slic3r/GUI/Plater.cpp:3347 src/slic3r/GUI/Plater.cpp:3359 -#: src/slic3r/GUI/Plater.cpp:3473 -msgid "Increase copies" -msgstr "복사본 늘리기" - -#: src/slic3r/GUI/Plater.cpp:3467 src/slic3r/GUI/Plater.cpp:3486 -msgid "Remove the selected object" -msgstr "선택한 객체 제거" - -#: src/slic3r/GUI/Plater.cpp:3473 -msgid "Place one more copy of the selected object" -msgstr "선택한 객체를 하나 더 복사합니다" - -#: src/slic3r/GUI/Plater.cpp:3475 -msgid "Decrease copies" -msgstr "복사본 감소" - -#: src/slic3r/GUI/Plater.cpp:3475 -msgid "Remove one copy of the selected object" -msgstr "선택한 객체 복사본 하나 삭제" - -#: src/slic3r/GUI/Plater.cpp:3477 -msgid "Set number of copies" -msgstr "복사될 수량 설정" - -#: src/slic3r/GUI/Plater.cpp:3477 -msgid "Change the number of copies of the selected object" -msgstr "선택한 개체의 복사본 수 변경" - -#: src/slic3r/GUI/Plater.cpp:3493 -msgid "Reload the selected file from Disk" -msgstr "디스크에서 다시 불러오기" - -#: src/slic3r/GUI/Plater.cpp:3496 -msgid "Export the selected object as STL file" -msgstr "선택한 객체를 STL 파일로 내보내기" - -#: src/slic3r/GUI/Plater.cpp:3510 -msgid "Along X axis" -msgstr "X 축을 따라" - -#: src/slic3r/GUI/Plater.cpp:3510 -msgid "Mirror the selected object along the X axis" -msgstr "선택한 객체를 X 축을 따라 반전합니다" - -#: src/slic3r/GUI/Plater.cpp:3512 -msgid "Along Y axis" -msgstr "Y 축을 따라" - -#: src/slic3r/GUI/Plater.cpp:3512 -msgid "Mirror the selected object along the Y axis" -msgstr "선택한 객체를 Y 축을 따라 반전합니다" - -#: src/slic3r/GUI/Plater.cpp:3514 -msgid "Along Z axis" -msgstr "Z 축 따라" - -#: src/slic3r/GUI/Plater.cpp:3514 -msgid "Mirror the selected object along the Z axis" -msgstr "선택한 객체를 Z 축을 따라 반전합니다" - -#: src/slic3r/GUI/Plater.cpp:3517 -msgid "Mirror the selected object" -msgstr "반전할 객제를 선택" - -#: src/slic3r/GUI/Plater.cpp:3529 -msgid "To objects" -msgstr "개체에" - -#: src/slic3r/GUI/Plater.cpp:3529 src/slic3r/GUI/Plater.cpp:3549 -msgid "Split the selected object into individual objects" -msgstr "선택한 개체를 개별 개체로 분할 합니다." - -#: src/slic3r/GUI/Plater.cpp:3531 -msgid "To parts" -msgstr "부품에" - -#: src/slic3r/GUI/Plater.cpp:3531 src/slic3r/GUI/Plater.cpp:3563 -msgid "Split the selected object into individual sub-parts" -msgstr "선택한 오브젝트를 개별 하위 파트로 분할" - -#: src/slic3r/GUI/Plater.cpp:3534 src/slic3r/GUI/Plater.cpp:3549 -#: src/slic3r/GUI/Plater.cpp:3563 src/libslic3r/PrintConfig.cpp:3245 -msgid "Split" -msgstr "쪼개기" - -#: src/slic3r/GUI/Plater.cpp:3534 -msgid "Split the selected object" -msgstr "선택한 개체 분할" - -#: src/slic3r/GUI/Plater.cpp:3555 -msgid "Optimize orientation" -msgstr "방향 최적화" - -#: src/slic3r/GUI/Plater.cpp:3555 -msgid "Optimize the rotation of the object for better print results." -msgstr "더 나은 인쇄 결과를 위해 개체의 회전을 최적화합니다." - -#: src/slic3r/GUI/Plater.cpp:3595 -msgid "3D editor view" -msgstr "3D 편집화면 보기" - -#: src/slic3r/GUI/Plater.cpp:3603 src/slic3r/GUI/Tab.cpp:2534 -msgid "Preview" -msgstr "프리뷰" - -#: src/slic3r/GUI/Plater.cpp:3831 -msgid "" -"%1% printer was active at the time the target Undo / Redo snapshot was " -"taken. Switching to %1% printer requires reloading of %1% presets." -msgstr "" -"%1% 프린터가 대상 재생 취소/다시 작업 스냅샷을 생성할 때 활성화되었습니다. " -"%1% 프린터로 전환하려면 %1% 사전 설정을 다시 로드해야 합니다." - -#: src/slic3r/GUI/Plater.cpp:3992 -msgid "Load Project" -msgstr "프로젝트 로드" - -#: src/slic3r/GUI/Plater.cpp:4016 -msgid "Import Object" -msgstr "개체 가져오기" - -#: src/slic3r/GUI/Plater.cpp:4020 -msgid "Import Objects" -msgstr "객체 가져오기" - -#: src/slic3r/GUI/Plater.cpp:4075 -msgid "All objects will be removed, continue ?" -msgstr "모든 개체가 제거 됩니다, 계속합니까?" - -#: src/slic3r/GUI/Plater.cpp:4083 -msgid "Delete Selected Objects" -msgstr "선택한 객체 삭제" - -#: src/slic3r/GUI/Plater.cpp:4091 -msgid "Increase Instances" -msgstr "복제본 늘리기" - -#: src/slic3r/GUI/Plater.cpp:4127 -msgid "Decrease Instances" -msgstr "복제본 감소" - -#: src/slic3r/GUI/Plater.cpp:4163 -#, c-format -msgid "Set numbers of copies to %d" -msgstr "복사본 수를 %d로 설정" - -#: src/slic3r/GUI/Plater.cpp:4193 -msgid "Cut by Plane" -msgstr "평면으로 절단" - -#: src/slic3r/GUI/Plater.cpp:4225 -msgid "Save G-code file as:" -msgstr "G-code 파일 다른 이름 저장:" - -#: src/slic3r/GUI/Plater.cpp:4225 -msgid "Save SL1 file as:" -msgstr "SL1 파일 다른이름 저장:" - -#: src/slic3r/GUI/Plater.cpp:4337 -#, c-format -msgid "STL file exported to %s" -msgstr "내보낸 STL 파일 %s" - -#: src/slic3r/GUI/Plater.cpp:4353 -#, c-format -msgid "AMF file exported to %s" -msgstr "내보낸 AMF 파일 %s" - -#: src/slic3r/GUI/Plater.cpp:4356 -#, c-format -msgid "Error exporting AMF file %s" -msgstr "AMF 파일 내보내기 오류 %s" - -#: src/slic3r/GUI/Plater.cpp:4382 -#, c-format -msgid "3MF file exported to %s" -msgstr "3MF 파일을 내보냈습니다 %s" - -#: src/slic3r/GUI/Plater.cpp:4387 -#, c-format -msgid "Error exporting 3MF file %s" -msgstr "3MF 파일 내보내기 오류 %s" - -#: src/slic3r/GUI/Plater.cpp:4687 -msgid "Export" -msgstr "내보내기" - -#: src/slic3r/GUI/Plater.cpp:4688 -msgid "Send G-code" -msgstr "G 코드 보내기" - -#: src/slic3r/GUI/Plater.cpp:4772 -msgid "Paste From Clipboard" -msgstr "클립보드에서 붙여넣기" - -#: src/slic3r/GUI/Preferences.cpp:22 src/slic3r/GUI/Tab.cpp:1955 -#: src/slic3r/GUI/Tab.cpp:2193 -msgid "General" -msgstr "일반" - -#: src/slic3r/GUI/Preferences.cpp:44 -msgid "Remember output directory" -msgstr "출력 디렉토리 기억하기" - -#: src/slic3r/GUI/Preferences.cpp:46 -msgid "" -"If this is enabled, Slic3r will prompt the last output directory instead of " -"the one containing the input files." -msgstr "" -"이 옵션을 사용하면 Slic3r은 입력 파일이 들어있는 디렉터리 대신 마지막 출력 디" -"렉터리를 묻습니다." - -#: src/slic3r/GUI/Preferences.cpp:52 -msgid "Auto-center parts" -msgstr "부품을 자동으로 중심에" - -#: src/slic3r/GUI/Preferences.cpp:54 -msgid "" -"If this is enabled, Slic3r will auto-center objects around the print bed " -"center." -msgstr "이 옵션을 사용하면 Slic3r가 개체를 인쇄판 중앙에 자동으로 배치합니다." - -#: src/slic3r/GUI/Preferences.cpp:60 -msgid "Background processing" -msgstr "백그라운드 프로세싱" - -#: src/slic3r/GUI/Preferences.cpp:62 -msgid "" -"If this is enabled, Slic3r will pre-process objects as soon as they're " -"loaded in order to save time when exporting G-code." -msgstr "" -"이 사용 하는 경우 Slic3r는 전처리 개체 최대한 빨리 그들이 시간을 절약 하기 위" -"해 로드 G-코드를 내보낼 때." - -#: src/slic3r/GUI/Preferences.cpp:71 -msgid "" -"If enabled, PrusaSlicer will check for the new versions of itself online. " -"When a new version becomes available a notification is displayed at the next " -"application startup (never during program usage). This is only a " -"notification mechanisms, no automatic installation is done." -msgstr "" -"프루사 슬라이서는 온라인의 새로운 버전을 확인합니다. 새 버전을 사용할 수 있게" -"되면 다음 응용 프로그램 시작시 (프로그램 사용 중이 아님) 알림이 표시 됩니다. " -"이는 알림 메커니즘일뿐이며 자동 설치는 수행되지 않습니다." - -#: src/slic3r/GUI/Preferences.cpp:79 -msgid "" -"If enabled, Slic3r downloads updates of built-in system presets in the " -"background. These updates are downloaded into a separate temporary location. " -"When a new preset version becomes available it is offered at application " -"startup." -msgstr "" -"활성화 된 경우 Slic3r은 백그라운드에서 내장 시스템 사전 설정의 업데이트를 다" -"운로드합니다. 이러한 업데이트는 별도의 임시 위치에 다운로드됩니다. 새로운 사" -"전 설정 버전을 사용할 수있게되면 응용 프로그램 시작시 제공됩니다." - -#: src/slic3r/GUI/Preferences.cpp:84 -msgid "Suppress \" - default - \" presets" -msgstr "\"- 기본 -\"사전 설정 숨기기" - -#: src/slic3r/GUI/Preferences.cpp:86 -msgid "" -"Suppress \" - default - \" presets in the Print / Filament / Printer " -"selections once there are any other valid presets available." -msgstr "" -"사용 가능한 다른 유효한 사전 설정이 있으면 인쇄 / 필라멘트 / 프린터 선택에서 " -"\"- 기본 -\"사전 설정을 억제하십시오." - -#: src/slic3r/GUI/Preferences.cpp:92 -msgid "Show incompatible print and filament presets" -msgstr "호환 되지 않는 인쇄 및 필라멘트 설정" - -#: src/slic3r/GUI/Preferences.cpp:94 -msgid "" -"When checked, the print and filament presets are shown in the preset editor " -"even if they are marked as incompatible with the active printer" -msgstr "" -"이 옵션을 선택하면 활성 프린터와 호환되지 않는 것으로 표시된 경우에도 인쇄 " -"및 필라멘트 사전 설정이 사전 설정 편집기에 표시됩니다" - -#: src/slic3r/GUI/Preferences.cpp:101 -msgid "Use Retina resolution for the 3D scene" -msgstr "3D 장면에 레티나 해상도 사용" - -#: src/slic3r/GUI/Preferences.cpp:103 -msgid "" -"If enabled, the 3D scene will be rendered in Retina resolution. If you are " -"experiencing 3D performance problems, disabling this option may help." -msgstr "" -"활성화 된 경우 3D 장면은 레티나 해상도로 렌더링 됩니다. 3D 성능 문제가 발생하" -"는 경우, 옵션을 사용하지 않도록 설정 하면 도움이 될 수 있습니다." - -#: src/slic3r/GUI/Preferences.cpp:110 -msgid "Use perspective camera" -msgstr "원근 카메라 사용" - -#: src/slic3r/GUI/Preferences.cpp:112 -msgid "" -"If enabled, use perspective camera. If not enabled, use orthographic camera." -msgstr "" -"이 옵션을 사용하면 원근 카메라를 사용합니다. 활성화되지 않은 경우 직교 카메라" -"를 사용합니다." - -#: src/slic3r/GUI/Preferences.cpp:117 -msgid "Use custom size for toolbar icons" -msgstr "도구 모음 아이콘에 사용자 지정 크기 사용" - -#: src/slic3r/GUI/Preferences.cpp:119 -msgid "If enabled, you can change size of toolbar icons manually." -msgstr "활성화된 경우 도구 모음 아이콘의 크기를 수동으로 변경할 수 있습니다." - -#: src/slic3r/GUI/Preferences.cpp:144 -#, c-format -msgid "You need to restart %s to make the changes effective." -msgstr "변경 내용을 적용 하려면 %s를 다시 시작 해야 합니다." - -#: src/slic3r/GUI/Preferences.cpp:192 -msgid "Icon size in a respect to the default size" -msgstr "기본 크기에 대한 아이콘 크기" - -#: src/slic3r/GUI/Preferences.cpp:207 -msgid "Select toolbar icon size in respect to the default one." -msgstr "기본 도구 모음에 대해 도구 모음 아이콘 크기를 선택합니다." - -#: src/slic3r/GUI/Preset.cpp:212 -msgid "modified" -msgstr "수정된곳" - -#: src/slic3r/GUI/Preset.cpp:963 src/slic3r/GUI/Preset.cpp:1003 -#: src/slic3r/GUI/Preset.cpp:1068 src/slic3r/GUI/Preset.cpp:1100 -#: src/slic3r/GUI/PresetBundle.cpp:1480 src/slic3r/GUI/PresetBundle.cpp:1545 -msgid "System presets" -msgstr "시스템 기본설정" - -#: src/slic3r/GUI/Preset.cpp:1007 src/slic3r/GUI/Preset.cpp:1104 -#: src/slic3r/GUI/PresetBundle.cpp:1550 -msgid "User presets" -msgstr "사용자 사전설정" - -#: src/slic3r/GUI/Preset.cpp:1036 src/slic3r/GUI/Tab.cpp:241 -msgid "Add a new printer" -msgstr "새 프린터 추가" - -#: src/slic3r/GUI/Preset.cpp:1308 -msgid "filament" -msgstr "필라멘트" - -#: src/slic3r/GUI/Preset.cpp:1309 -msgid "SLA print" -msgstr "SLA 인쇄" - -#: src/slic3r/GUI/PresetHints.cpp:28 -msgid "" -"If estimated layer time is below ~%1%s, fan will run at %2%%% and print " -"speed will be reduced so that no less than %3%s are spent on that layer " -"(however, speed will never be reduced below %4%mm/s)." -msgstr "" -"예상 레이어 시간이 ~%1%초 미만이면 팬이 %2%%%에서 실행되고 인쇄 속도가 감소되" -"어 해당 레이어에 %3%초 이상 소비됩니다 (단, 속도는 %4%mm/s 이하로 감소하지 않" -"습니다) ." - -#: src/slic3r/GUI/PresetHints.cpp:35 -msgid "" -"\n" -"If estimated layer time is greater, but still below ~%1%s, fan will run at a " -"proportionally decreasing speed between %2%%% and %3%%%." -msgstr "" -"\n" -"예상 레이어 시간이 더 길지만 ~%1%초 미만인 경우 팬은 %2%%%와 %3%%%사이 비례, " -"감소하는 속도로 실행됩니다." - -#: src/slic3r/GUI/PresetHints.cpp:39 -msgid "" -"\n" -"During the other layers, fan" -msgstr "" -"\n" -"다른 레이어의, 팬설정은 " - -#: src/slic3r/GUI/PresetHints.cpp:41 -msgid "Fan" -msgstr "팬(Fan)" - -#: src/slic3r/GUI/PresetHints.cpp:47 -msgid "will always run at %1%%%" -msgstr "항상 다음처럼 실행 %1%%%" - -#: src/slic3r/GUI/PresetHints.cpp:50 -msgid "except for the first %1% layers." -msgstr "첫 번째 %d 레이어를 제외하고" - -#: src/slic3r/GUI/PresetHints.cpp:52 -msgid "except for the first layer." -msgstr "첫 번째 레이어를 제외하고" - -#: src/slic3r/GUI/PresetHints.cpp:54 -msgid "will be turned off." -msgstr "off 됩니다." - -#: src/slic3r/GUI/PresetHints.cpp:155 -msgid "external perimeters" -msgstr "외부 둘레" - -#: src/slic3r/GUI/PresetHints.cpp:164 -msgid "perimeters" -msgstr "둘레" - -#: src/slic3r/GUI/PresetHints.cpp:173 -msgid "infill" -msgstr "채움(infill)" - -#: src/slic3r/GUI/PresetHints.cpp:183 -msgid "solid infill" -msgstr "외부(solid)부분 채움" - -#: src/slic3r/GUI/PresetHints.cpp:191 -msgid "top solid infill" -msgstr "가장 윗부분 채움" - -#: src/slic3r/GUI/PresetHints.cpp:202 -msgid "support" -msgstr "서포트" - -#: src/slic3r/GUI/PresetHints.cpp:212 -msgid "support interface" -msgstr "서포트 인터페이스" - -#: src/slic3r/GUI/PresetHints.cpp:218 -msgid "First layer volumetric" -msgstr "첫번째 레이어 용적은" - -#: src/slic3r/GUI/PresetHints.cpp:218 -msgid "Bridging volumetric" -msgstr "브리징(Bridging) 용적" - -#: src/slic3r/GUI/PresetHints.cpp:218 -msgid "Volumetric" -msgstr "용적" - -#: src/slic3r/GUI/PresetHints.cpp:219 -msgid "flow rate is maximized" -msgstr "의 유속(flow)이 최대화된다. " - -#: src/slic3r/GUI/PresetHints.cpp:222 -msgid "by the print profile maximum" -msgstr "인쇄 프로파일 최대 값" - -#: src/slic3r/GUI/PresetHints.cpp:223 -msgid "when printing" -msgstr "인쇄 할 때" - -#: src/slic3r/GUI/PresetHints.cpp:224 -msgid "with a volumetric rate" -msgstr "의 용적 비율로 " - -#: src/slic3r/GUI/PresetHints.cpp:228 -#, c-format -msgid "%3.2f mm³/s at filament speed %3.2f mm/s." -msgstr "%3.2f mm³/s 필라멘트 속도는 %3.2f mm/s이다." - -#: src/slic3r/GUI/PresetHints.cpp:246 -msgid "" -"Recommended object thin wall thickness: Not available due to invalid layer " -"height." -msgstr "" -"권장 객체(object)의 벽(wall) 두께: 잘못된 레이어 높이 때문에 사용할 수 없음." - -#: src/slic3r/GUI/PresetHints.cpp:262 -#, c-format -msgid "Recommended object thin wall thickness for layer height %.2f and" -msgstr "객체 레이어 높이 %.2f 에 권장하는 두깨는 " - -#: src/slic3r/GUI/PresetHints.cpp:268 -#, c-format -msgid "%d lines: %.2f mm" -msgstr "%d 라인:%.2f mm" - -#: src/slic3r/GUI/PrintHostDialogs.cpp:33 -msgid "Send G-Code to printer host" -msgstr "프린터 호스트로 G 코드 보내기" - -#: src/slic3r/GUI/PrintHostDialogs.cpp:33 -msgid "Upload to Printer Host with the following filename:" -msgstr "다음 파일 이름으로 프린터 호스트에 업로드:" - -#: src/slic3r/GUI/PrintHostDialogs.cpp:35 -msgid "Start printing after upload" -msgstr "업로드 후 인쇄 시작" - -#: src/slic3r/GUI/PrintHostDialogs.cpp:42 -msgid "Use forward slashes ( / ) as a directory separator if needed." -msgstr "필요한 경우 디렉토리 분리 기호로 슬래시 (/)를 사용하십시오." - -#: src/slic3r/GUI/PrintHostDialogs.cpp:149 -msgid "ID" -msgstr "아이디" - -#: src/slic3r/GUI/PrintHostDialogs.cpp:150 -msgid "Progress" -msgstr "진행률" - -#: src/slic3r/GUI/PrintHostDialogs.cpp:151 -msgid "Status" -msgstr "상태" - -#: src/slic3r/GUI/PrintHostDialogs.cpp:152 -msgid "Host" -msgstr "호스트" - -#: src/slic3r/GUI/PrintHostDialogs.cpp:153 -msgid "Filename" -msgstr "파일이름" - -#: src/slic3r/GUI/PrintHostDialogs.cpp:154 -msgid "Error Message" -msgstr "에러 메시지" - -#: src/slic3r/GUI/PrintHostDialogs.cpp:157 -msgid "Cancel selected" -msgstr "선택 취소" - -#: src/slic3r/GUI/PrintHostDialogs.cpp:159 -msgid "Show error message" -msgstr "오류 메시지 표시" - -#: src/slic3r/GUI/PrintHostDialogs.cpp:198 -#: src/slic3r/GUI/PrintHostDialogs.cpp:229 -msgid "Enqueued" -msgstr "입력됨" - -#: src/slic3r/GUI/PrintHostDialogs.cpp:230 -msgid "Uploading" -msgstr "업로드" - -#: src/slic3r/GUI/PrintHostDialogs.cpp:234 -msgid "Completed" -msgstr "완료됨" - -#: src/slic3r/GUI/PrintHostDialogs.cpp:272 -msgid "Error uploading to print host:" -msgstr "인쇄 호스트에 업로드 하는 중 오류 발생:" - -#: src/slic3r/GUI/RammingChart.cpp:23 -msgid "NO RAMMING AT ALL" -msgstr "전혀 충돌 없음" - -#: src/slic3r/GUI/RammingChart.cpp:76 -msgid "Time" -msgstr "시간" - -#: src/slic3r/GUI/RammingChart.cpp:76 src/slic3r/GUI/WipeTowerDialog.cpp:82 -#: src/libslic3r/PrintConfig.cpp:627 src/libslic3r/PrintConfig.cpp:671 -#: src/libslic3r/PrintConfig.cpp:686 src/libslic3r/PrintConfig.cpp:2349 -#: src/libslic3r/PrintConfig.cpp:2358 src/libslic3r/PrintConfig.cpp:2418 -#: src/libslic3r/PrintConfig.cpp:2425 -msgid "s" -msgstr "s" - -#: src/slic3r/GUI/RammingChart.cpp:81 -msgid "Volumetric speed" -msgstr "용적(Volumetric) 스피트" - -#: src/slic3r/GUI/RammingChart.cpp:81 src/libslic3r/PrintConfig.cpp:584 -#: src/libslic3r/PrintConfig.cpp:1234 -msgid "mm³/s" -msgstr "밀리미터 ³/s" - -#: src/slic3r/GUI/SysInfoDialog.cpp:78 -msgid "System Information" -msgstr "시스템 정보" - -#: src/slic3r/GUI/SysInfoDialog.cpp:154 -msgid "Copy to Clipboard" -msgstr "클립보드에 복사" - -#: src/slic3r/GUI/Tab.cpp:52 src/libslic3r/PrintConfig.cpp:239 -msgid "Compatible printers" -msgstr "호환 가능한 프린터들" - -#: src/slic3r/GUI/Tab.cpp:53 -msgid "Select the printers this profile is compatible with." -msgstr "이 프로파일과 호환 가능한 프린터를 선택하세요." - -#: src/slic3r/GUI/Tab.cpp:58 src/libslic3r/PrintConfig.cpp:254 -msgid "Compatible print profiles" -msgstr "호환되는 인쇄 프로 파일" - -#: src/slic3r/GUI/Tab.cpp:59 -msgid "Select the print profiles this profile is compatible with." -msgstr "이 프로필이 호환되는 인쇄 프로필을 선택 합니다." - -#. TRN "Save current Settings" -#: src/slic3r/GUI/Tab.cpp:133 -#, c-format -msgid "Save current %s" -msgstr "현재 %s 저장" - -#: src/slic3r/GUI/Tab.cpp:134 -msgid "Delete this preset" -msgstr "이전 설정 삭제" - -#: src/slic3r/GUI/Tab.cpp:139 -msgid "" -"Hover the cursor over buttons to find more information \n" -"or click this button." -msgstr "" -"버튼 위로 커서를 가져 가서 자세한 정보를 찾습니다.\n" -"또는이 버튼을 클릭하십시오." - -#: src/slic3r/GUI/Tab.cpp:921 -msgid "This is a default preset." -msgstr "기본 설정입니다." - -#: src/slic3r/GUI/Tab.cpp:923 -msgid "This is a system preset." -msgstr "시스템 설정입니다." - -#: src/slic3r/GUI/Tab.cpp:925 -msgid "Current preset is inherited from the default preset." -msgstr "현재 사전 설정은 기본 사전 설정에서 상속됩니다." - -#: src/slic3r/GUI/Tab.cpp:928 -#, c-format -msgid "" -"Current preset is inherited from:\n" -"\t%s" -msgstr "전의 %s 설정에서 가져 옵니다 " - -#: src/slic3r/GUI/Tab.cpp:932 -msgid "It can't be deleted or modified." -msgstr "삭제하거나 수정할 수 없습니다." - -#: src/slic3r/GUI/Tab.cpp:933 -msgid "" -"Any modifications should be saved as a new preset inherited from this one." -msgstr "모든 수정 사항은 이 항목에서 받은 기본 설정으로 저장해야합니다." - -#: src/slic3r/GUI/Tab.cpp:934 -msgid "To do that please specify a new name for the preset." -msgstr "그렇게하려면 기본 설정의 새 이름을 지정하십시오." - -#: src/slic3r/GUI/Tab.cpp:938 -msgid "Additional information:" -msgstr "추가 정보:" - -#: src/slic3r/GUI/Tab.cpp:944 -msgid "printer model" -msgstr "프린터 모델" - -#: src/slic3r/GUI/Tab.cpp:952 -msgid "default print profile" -msgstr "기본 인쇄 프로파일" - -#: src/slic3r/GUI/Tab.cpp:955 -msgid "default filament profile" -msgstr "기본 필라멘트 프로파일" - -#: src/slic3r/GUI/Tab.cpp:969 -msgid "default SLA material profile" -msgstr "기본 SLA 재질 프로 파일" - -#: src/slic3r/GUI/Tab.cpp:973 -msgid "default SLA print profile" -msgstr "기본 SLA 인쇄 프로필" - -#: src/slic3r/GUI/Tab.cpp:1008 src/slic3r/GUI/Tab.cpp:3649 -msgid "Layers and perimeters" -msgstr "레이어 및 경계선" - -#: src/slic3r/GUI/Tab.cpp:1009 src/slic3r/GUI/Tab.cpp:1257 -#: src/libslic3r/PrintConfig.cpp:66 -msgid "Layer height" -msgstr "레이어 높이" - -#: src/slic3r/GUI/Tab.cpp:1013 -msgid "Vertical shells" -msgstr "쉘 높이" - -#: src/slic3r/GUI/Tab.cpp:1024 -msgid "Horizontal shells" -msgstr "쉘 너비" - -#: src/slic3r/GUI/Tab.cpp:1025 src/libslic3r/PrintConfig.cpp:1759 -msgid "Solid layers" -msgstr "솔리드 레이어" - -#: src/slic3r/GUI/Tab.cpp:1030 -msgid "Quality (slower slicing)" -msgstr "품질(슬라이싱이 느려짐)" - -#: src/slic3r/GUI/Tab.cpp:1048 -msgid "Reducing printing time" -msgstr "출력 시간 단축" - -#: src/slic3r/GUI/Tab.cpp:1060 -msgid "Skirt and brim" -msgstr "스커트와 브림" - -#: src/slic3r/GUI/Tab.cpp:1077 -msgid "Raft" -msgstr "라프트" - -#: src/slic3r/GUI/Tab.cpp:1081 -msgid "Options for support material and raft" -msgstr "서포트와 라프트 재료를 선택" - -#: src/slic3r/GUI/Tab.cpp:1096 -msgid "Speed for print moves" -msgstr "출력중 이동 속도" - -#: src/slic3r/GUI/Tab.cpp:1108 -msgid "Speed for non-print moves" -msgstr "미출력시 이동속도" - -#: src/slic3r/GUI/Tab.cpp:1111 -msgid "Modifiers" -msgstr "수정" - -#: src/slic3r/GUI/Tab.cpp:1114 -msgid "Acceleration control (advanced)" -msgstr "가속 제어(고급)" - -#: src/slic3r/GUI/Tab.cpp:1121 -msgid "Autospeed (advanced)" -msgstr "오토스피트(고급)" - -#: src/slic3r/GUI/Tab.cpp:1129 -msgid "Multiple Extruders" -msgstr "다중 익스트루더" - -#: src/slic3r/GUI/Tab.cpp:1137 -msgid "Ooze prevention" -msgstr "오즈 방지(Ooze prevention)" - -#: src/slic3r/GUI/Tab.cpp:1154 -msgid "Extrusion width" -msgstr "악출 폭(Extrusion width)" - -#: src/slic3r/GUI/Tab.cpp:1164 -msgid "Overlap" -msgstr "겹침(Overlap)" - -#: src/slic3r/GUI/Tab.cpp:1167 -msgid "Flow" -msgstr "유량(Flow)" - -#: src/slic3r/GUI/Tab.cpp:1176 -msgid "Other" -msgstr "그 외" - -#: src/slic3r/GUI/Tab.cpp:1179 src/slic3r/GUI/Tab.cpp:3703 -msgid "Output options" -msgstr "출력 옵션" - -#: src/slic3r/GUI/Tab.cpp:1180 -msgid "Sequential printing" -msgstr "연속 인쇄" - -#: src/slic3r/GUI/Tab.cpp:1182 -msgid "Extruder clearance (mm)" -msgstr "익스트루더 간격(mm)" - -#: src/slic3r/GUI/Tab.cpp:1191 src/slic3r/GUI/Tab.cpp:3704 -msgid "Output file" -msgstr "출력 파일" - -#: src/slic3r/GUI/Tab.cpp:1198 src/libslic3r/PrintConfig.cpp:1432 -msgid "Post-processing scripts" -msgstr "사후 처리 스크립트" - -#: src/slic3r/GUI/Tab.cpp:1204 src/slic3r/GUI/Tab.cpp:1205 -#: src/slic3r/GUI/Tab.cpp:1716 src/slic3r/GUI/Tab.cpp:1717 -#: src/slic3r/GUI/Tab.cpp:2165 src/slic3r/GUI/Tab.cpp:2166 -#: src/slic3r/GUI/Tab.cpp:2273 src/slic3r/GUI/Tab.cpp:2274 -#: src/slic3r/GUI/Tab.cpp:3586 src/slic3r/GUI/Tab.cpp:3587 -msgid "Notes" -msgstr "메모" - -#: src/slic3r/GUI/Tab.cpp:1211 src/slic3r/GUI/Tab.cpp:1724 -#: src/slic3r/GUI/Tab.cpp:2172 src/slic3r/GUI/Tab.cpp:2280 -#: src/slic3r/GUI/Tab.cpp:3594 src/slic3r/GUI/Tab.cpp:3709 -msgid "Dependencies" -msgstr "속한 그룹" - -#: src/slic3r/GUI/Tab.cpp:1212 src/slic3r/GUI/Tab.cpp:1725 -#: src/slic3r/GUI/Tab.cpp:2173 src/slic3r/GUI/Tab.cpp:2281 -#: src/slic3r/GUI/Tab.cpp:3595 src/slic3r/GUI/Tab.cpp:3710 -msgid "Profile dependencies" -msgstr "프로파일 속한곳" - -#: src/slic3r/GUI/Tab.cpp:1256 -msgid "" -"Zero layer height is not valid.\n" -"\n" -"The layer height will be reset to 0.01." -msgstr "" -"바닥 레이어 높이가 잘못되었습니다.\n" -"\n" -"레이어 높이가 0.01로 재설정됩니다." - -#: src/slic3r/GUI/Tab.cpp:1268 -msgid "" -"Zero first layer height is not valid.\n" -"\n" -"The first layer height will be reset to 0.01." -msgstr "" -"첫 번째 레이어 높이가 0이면 유효하지 않습니다.\n" -"\n" -"첫 번째 레이어 높이는 0.01로 재설정됩니다." - -#: src/slic3r/GUI/Tab.cpp:1269 src/libslic3r/PrintConfig.cpp:866 -msgid "First layer height" -msgstr "첫 레이어 높이" - -#: src/slic3r/GUI/Tab.cpp:1283 -#, c-format -msgid "" -"The Spiral Vase mode requires:\n" -"- one perimeter\n" -"- no top solid layers\n" -"- 0% fill density\n" -"- no support material\n" -"- no ensure_vertical_shell_thickness\n" -"\n" -"Shall I adjust those settings in order to enable Spiral Vase?" -msgstr "" -"스파이럴 바이스 모드에는 다음이 필요합니다.\n" -"- one 둘레\n" -"- 탑 솔리드 레이어 없음\n" -"- 0% fill density\n" -"- 서포트 재료 없음\n" -"- 수직 벽 두깨를 보장하지 않음\n" -"\n" -"스파이럴 바이스를 사용하려면 이러한 설정을 조정해야합니까?" - -#: src/slic3r/GUI/Tab.cpp:1290 -msgid "Spiral Vase" -msgstr "스파이럴 바이스" - -#: src/slic3r/GUI/Tab.cpp:1311 -msgid "" -"The Wipe Tower currently supports the non-soluble supports only\n" -"if they are printed with the current extruder without triggering a tool " -"change.\n" -"(both support_material_extruder and support_material_interface_extruder need " -"to be set to 0).\n" -"\n" -"Shall I adjust those settings in order to enable the Wipe Tower?" -msgstr "" -"와이퍼 타워는 현재 비 가용성 서포트 만 지원합니다.\n" -"공구 교환을 트리거하지 않고 현재 압출기로 인쇄 한 경우.\n" -"(support_material_extruder 및 support_material_interface_extruder를 모두 0으" -"로 설정해야 함).\n" -"\n" -"와이퍼 타워를 사용하려면 이러한 설정을 조정해야합니까?" - -#: src/slic3r/GUI/Tab.cpp:1315 src/slic3r/GUI/Tab.cpp:1332 -msgid "Wipe Tower" -msgstr "와이프 타워(Wipe Tower)" - -#: src/slic3r/GUI/Tab.cpp:1329 -msgid "" -"For the Wipe Tower to work with the soluble supports, the support layers\n" -"need to be synchronized with the object layers.\n" -"\n" -"Shall I synchronize support layers in order to enable the Wipe Tower?" -msgstr "" -"와이퍼 타워가 가용성 서포트와 함께 작용하기 위해, 서포트 레이어\n" -"객체 레이어와 동기화되어야합니다.\n" -"\n" -"와이퍼 타워를 사용하려면 서포트 레이어를 동기화해야합니까?" - -#: src/slic3r/GUI/Tab.cpp:1347 -msgid "" -"Supports work better, if the following feature is enabled:\n" -"- Detect bridging perimeters\n" -"\n" -"Shall I adjust those settings for supports?" -msgstr "" -"다음 기능을 사용하는 경우 더 나은 작업을 지원합니다.\n" -"- 브리지 경계 검출\n" -"\n" -"서포트에 대한 설정을 조정해야합니까?" - -#: src/slic3r/GUI/Tab.cpp:1350 -msgid "Support Generator" -msgstr "서포트 생성" - -#: src/slic3r/GUI/Tab.cpp:1392 -msgid "" -"The %1% infill pattern is not supposed to work at 100%% density.\n" -"\n" -"Shall I switch to rectilinear fill pattern?" -msgstr "" -"%1% 채우기 패턴은 100%의 밀도로 작동 하지 않습니다.\n" -"\n" -"직선 채우기 패턴으로 전환 해야 합니까?" - -#: src/slic3r/GUI/Tab.cpp:1502 src/slic3r/GUI/Tab.cpp:1557 -msgid "Filament Overrides" -msgstr "필라멘트 재정의" - -#: src/slic3r/GUI/Tab.cpp:1503 src/slic3r/GUI/Tab.cpp:1562 -#: src/slic3r/GUI/Tab.cpp:2514 -msgid "Retraction" -msgstr "리트렉션" - -#: src/slic3r/GUI/Tab.cpp:1612 src/libslic3r/PrintConfig.cpp:2030 -msgid "Temperature" -msgstr "온도" - -#: src/slic3r/GUI/Tab.cpp:1618 -msgid "Bed" -msgstr "배드(Bed)" - -#: src/slic3r/GUI/Tab.cpp:1623 -msgid "Cooling" -msgstr "냉각(Cooling)" - -#: src/slic3r/GUI/Tab.cpp:1624 src/libslic3r/PrintConfig.cpp:1335 -#: src/libslic3r/PrintConfig.cpp:2150 -msgid "Enable" -msgstr "사용" - -#: src/slic3r/GUI/Tab.cpp:1635 -msgid "Fan settings" -msgstr "팬 설정" - -#: src/slic3r/GUI/Tab.cpp:1636 -msgid "Fan speed" -msgstr "팬 속도" - -#: src/slic3r/GUI/Tab.cpp:1644 -msgid "Cooling thresholds" -msgstr "냉각 임계 값" - -#: src/slic3r/GUI/Tab.cpp:1650 -msgid "Filament properties" -msgstr "필라멘트 특성" - -#: src/slic3r/GUI/Tab.cpp:1654 -msgid "Print speed override" -msgstr "인쇄 속도 중단" - -#: src/slic3r/GUI/Tab.cpp:1664 -msgid "Wipe tower parameters" -msgstr "타워 매개변수 지우기" - -#: src/slic3r/GUI/Tab.cpp:1667 -msgid "Toolchange parameters with single extruder MM printers" -msgstr "싱글 익스트루더 멀티 터리알 프린터를 사용한 공구 교환 매개 변수" - -#: src/slic3r/GUI/Tab.cpp:1681 -msgid "Ramming settings" -msgstr "래밍 설정" - -#: src/slic3r/GUI/Tab.cpp:1703 src/slic3r/GUI/Tab.cpp:2128 -msgid "Custom G-code" -msgstr "수동 G코드" - -#: src/slic3r/GUI/Tab.cpp:1704 src/slic3r/GUI/Tab.cpp:2129 -#: src/libslic3r/PrintConfig.cpp:1785 src/libslic3r/PrintConfig.cpp:1800 -msgid "Start G-code" -msgstr "스타트 G코드" - -#: src/slic3r/GUI/Tab.cpp:1710 src/slic3r/GUI/Tab.cpp:2135 -#: src/libslic3r/PrintConfig.cpp:369 src/libslic3r/PrintConfig.cpp:379 -msgid "End G-code" -msgstr "엔드 G코드" - -#: src/slic3r/GUI/Tab.cpp:1843 src/slic3r/GUI/Tab.cpp:2068 -msgid "Test" -msgstr "시험(test)" - -#: src/slic3r/GUI/Tab.cpp:1853 -msgid "Could not get a valid Printer Host reference" -msgstr "유효한 프린터 호스트 참조를 가져올 수 없습니다" - -#: src/slic3r/GUI/Tab.cpp:1859 src/slic3r/GUI/Tab.cpp:2081 -msgid "Success!" -msgstr "성공!" - -#: src/slic3r/GUI/Tab.cpp:1874 -msgid "" -"HTTPS CA file is optional. It is only needed if you use HTTPS with a self-" -"signed certificate." -msgstr "" -"HTTPS CA 파일은 선택 사항입니다. 자체 서명 된 인증서로 HTTPS를 사용하는 경우" -"에만 필요합니다." - -#: src/slic3r/GUI/Tab.cpp:1887 -msgid "Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*" -msgstr "인증서 파일 (* .crt, * .pem) | * .crt; * .pem | 모든 파일 | *. *" - -#: src/slic3r/GUI/Tab.cpp:1888 -msgid "Open CA certificate file" -msgstr "CA 인증서 파일 열기" - -#: src/slic3r/GUI/Tab.cpp:1916 -#, c-format -msgid "" -"HTTPS CA File:\n" -" \tOn this system, %s uses HTTPS certificates from the system Certificate " -"Store or Keychain.\n" -" \tTo use a custom CA file, please import your CA file into Certificate " -"Store / Keychain." -msgstr "" -"HTTPS CA 파일:\n" -"\t이 시스템에서 %s는 시스템 인증서 저장소나 키체인의 HTTPS 인증서를 사용 합니" -"다.\n" -"\t사용자 지정 CA 파일을 사용 하려면 CA 파일을 인증서 저장소/키체인에 가져오십" -"시오." - -#: src/slic3r/GUI/Tab.cpp:1956 src/slic3r/GUI/Tab.cpp:2194 -msgid "Size and coordinates" -msgstr "크기와 좌표" - -#: src/slic3r/GUI/Tab.cpp:1961 src/slic3r/GUI/Tab.cpp:2199 -#: src/slic3r/GUI/Tab.cpp:3256 -msgid "Set" -msgstr "설정" - -#: src/slic3r/GUI/Tab.cpp:1993 -msgid "Capabilities" -msgstr "기능" - -#: src/slic3r/GUI/Tab.cpp:1998 -msgid "Number of extruders of the printer." -msgstr "프린터 익스트루더 숫자." - -#: src/slic3r/GUI/Tab.cpp:2023 -msgid "" -"Single Extruder Multi Material is selected, \n" -"and all extruders must have the same diameter.\n" -"Do you want to change the diameter for all extruders to first extruder " -"nozzle diameter value?" -msgstr "" -"단일 압출기 멀티 재질이 선택되고, \n" -"모든 압출기는 동일한 직경을 가져야 합니다.\n" -"모든 압출기의 지름을 첫 번째 압출기 노즐 값으로 변경하시겠습니까?" - -#: src/slic3r/GUI/Tab.cpp:2026 src/slic3r/GUI/Tab.cpp:2484 -#: src/libslic3r/PrintConfig.cpp:1310 -msgid "Nozzle diameter" -msgstr "노즐 직경" - -#: src/slic3r/GUI/Tab.cpp:2053 -msgid "USB/Serial connection" -msgstr "USB/시리얼 연결" - -#: src/slic3r/GUI/Tab.cpp:2054 src/libslic3r/PrintConfig.cpp:1640 -msgid "Serial port" -msgstr "시리얼 포트" - -#: src/slic3r/GUI/Tab.cpp:2059 -msgid "Rescan serial ports" -msgstr "시리얼포트 재검색" - -#: src/slic3r/GUI/Tab.cpp:2081 -msgid "Connection to printer works correctly." -msgstr "프린터 연결이 올바르게 작동합니다." - -#: src/slic3r/GUI/Tab.cpp:2084 -msgid "Connection failed." -msgstr "연결 실패." - -#: src/slic3r/GUI/Tab.cpp:2097 src/slic3r/GUI/Tab.cpp:2268 -msgid "Print Host upload" -msgstr "호스트 업로드 인쇄" - -#: src/slic3r/GUI/Tab.cpp:2141 src/libslic3r/PrintConfig.cpp:138 -msgid "Before layer change G-code" -msgstr "레이어 변경 전 G 코드" - -#: src/slic3r/GUI/Tab.cpp:2147 src/libslic3r/PrintConfig.cpp:1056 -msgid "After layer change G-code" -msgstr "레이어 변경 후 G 코드" - -#: src/slic3r/GUI/Tab.cpp:2153 src/libslic3r/PrintConfig.cpp:2056 -msgid "Tool change G-code" -msgstr "툴 채인지 G 코드" - -#: src/slic3r/GUI/Tab.cpp:2159 -msgid "Between objects G-code (for sequential printing)" -msgstr "객체 간 G 코드 (순차 인쇄용)" - -#: src/slic3r/GUI/Tab.cpp:2231 -msgid "Display" -msgstr "표시" - -#: src/slic3r/GUI/Tab.cpp:2246 -msgid "Tilt" -msgstr "기울이기" - -#: src/slic3r/GUI/Tab.cpp:2247 -msgid "Tilt time" -msgstr "기울이기 시간" - -#: src/slic3r/GUI/Tab.cpp:2253 src/slic3r/GUI/Tab.cpp:3568 -msgid "Corrections" -msgstr "수정" - -#: src/slic3r/GUI/Tab.cpp:2333 src/slic3r/GUI/Tab.cpp:2418 -#: src/libslic3r/PrintConfig.cpp:1106 src/libslic3r/PrintConfig.cpp:1124 -#: src/libslic3r/PrintConfig.cpp:1142 src/libslic3r/PrintConfig.cpp:1159 -#: src/libslic3r/PrintConfig.cpp:1170 src/libslic3r/PrintConfig.cpp:1181 -#: src/libslic3r/PrintConfig.cpp:1192 -msgid "Machine limits" -msgstr "머신 한계설정" - -#: src/slic3r/GUI/Tab.cpp:2347 -msgid "Values in this column are for Normal mode" -msgstr "이 열의 값은 일반 모드입니다" - -#: src/slic3r/GUI/Tab.cpp:2348 -msgid "Normal" -msgstr "보통" - -#: src/slic3r/GUI/Tab.cpp:2353 -msgid "Values in this column are for Stealth mode" -msgstr "이 열의 값은 무음 모드 용입니다" - -#: src/slic3r/GUI/Tab.cpp:2354 -msgid "Stealth" -msgstr "스텔스" - -#: src/slic3r/GUI/Tab.cpp:2362 -msgid "Maximum feedrates" -msgstr "최대 이송속도" - -#: src/slic3r/GUI/Tab.cpp:2367 -msgid "Maximum accelerations" -msgstr "최고 가속도" - -#: src/slic3r/GUI/Tab.cpp:2374 -msgid "Jerk limits" -msgstr "저크(Jerk)값 한계" - -#: src/slic3r/GUI/Tab.cpp:2379 -msgid "Minimum feedrates" -msgstr "최대 이송속도" - -#: src/slic3r/GUI/Tab.cpp:2443 src/slic3r/GUI/Tab.cpp:2451 -msgid "Single extruder MM setup" -msgstr "싱글 익스트루더 MM 설정" - -#: src/slic3r/GUI/Tab.cpp:2452 -msgid "Single extruder multimaterial parameters" -msgstr "싱글 익스트루더 멀티메터리알 파라미터" - -#: src/slic3r/GUI/Tab.cpp:2465 src/libslic3r/GCode/PreviewData.cpp:477 -#, c-format -msgid "Extruder %d" -msgstr "익스트루더 %d" - -#: src/slic3r/GUI/Tab.cpp:2483 -msgid "Do you want to change the diameter for all extruders?" -msgstr "모든 압출기의 지름을 변경하시겠습니까?" - -#: src/slic3r/GUI/Tab.cpp:2506 -msgid "Layer height limits" -msgstr "레이어 높이 한계치" - -#: src/slic3r/GUI/Tab.cpp:2511 -msgid "Position (for multi-extruder printers)" -msgstr "위치 (멀티 익스트루더 프린터 포함)" - -#: src/slic3r/GUI/Tab.cpp:2517 -msgid "Only lift Z" -msgstr "Z축 올림" - -#: src/slic3r/GUI/Tab.cpp:2530 -msgid "" -"Retraction when tool is disabled (advanced settings for multi-extruder " -"setups)" -msgstr "도구 비활성화시 리트렉션 (멀티 익스트루더 고급 설정)" - -#: src/slic3r/GUI/Tab.cpp:2693 -msgid "" -"The Wipe option is not available when using the Firmware Retraction mode.\n" -"\n" -"Shall I disable it in order to enable Firmware Retraction?" -msgstr "" -"펌웨어 리트렉션 모드를 사용할 때는 Wipe 옵션을 사용할 수 없습니다.\n" -"\n" -"펌웨어 리트렉션 하려면 비활성화해야합니까?" - -#: src/slic3r/GUI/Tab.cpp:2695 -msgid "Firmware Retraction" -msgstr "펌웨어 레트렉션" - -#: src/slic3r/GUI/Tab.cpp:3024 -#, c-format -msgid "Default preset (%s)" -msgstr "시스템 기본값 (%s)" - -#: src/slic3r/GUI/Tab.cpp:3025 -#, c-format -msgid "Preset (%s)" -msgstr "프리셋 ( %s)" - -#: src/slic3r/GUI/Tab.cpp:3042 -msgid "has the following unsaved changes:" -msgstr "저장되지 않은 수정사항:" - -#: src/slic3r/GUI/Tab.cpp:3045 -msgid "is not compatible with printer" -msgstr "프린터와 호완 되지 않습니다" - -#: src/slic3r/GUI/Tab.cpp:3046 -msgid "is not compatible with print profile" -msgstr "인쇄 프로필과 호환 되지 않음" - -#: src/slic3r/GUI/Tab.cpp:3048 -msgid "and it has the following unsaved changes:" -msgstr "저장되지 않은 변경점은 다음과 같습니다:" - -#: src/slic3r/GUI/Tab.cpp:3052 -msgid "Unsaved Changes" -msgstr "미 저장된 변경점" - -#: src/slic3r/GUI/Tab.cpp:3143 -msgid "%1% - Copy" -msgstr "%1%-복사" - -#: src/slic3r/GUI/Tab.cpp:3166 -msgid "The supplied name is empty. It can't be saved." -msgstr "파일 이름이 비어 있습니다. 저장할 수 없습니다." - -#: src/slic3r/GUI/Tab.cpp:3171 -msgid "Cannot overwrite a system profile." -msgstr "시스템 프로파일을 겹쳐 쓸 수 없습니다." - -#: src/slic3r/GUI/Tab.cpp:3175 -msgid "Cannot overwrite an external profile." -msgstr "외부 프로필을 덮어 쓸 수 없습니다." - -#: src/slic3r/GUI/Tab.cpp:3201 -msgid "remove" -msgstr "제거(remove)" - -#: src/slic3r/GUI/Tab.cpp:3201 -msgid "delete" -msgstr "지우기" - -#. TRN remove/delete -#: src/slic3r/GUI/Tab.cpp:3203 -msgid "Are you sure you want to %1% the selected preset?" -msgstr "선택한 사전 설정의 %1%를 선택 하시겠습니까?" - -#. TRN Remove/Delete -#: src/slic3r/GUI/Tab.cpp:3206 -msgid "%1% Preset" -msgstr "%1% 기본설정" - -#: src/slic3r/GUI/Tab.cpp:3332 -msgid "LOCKED LOCK" -msgstr "잠긴 잠금" - -#. TRN Description for "LOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:3334 -msgid "" -"indicates that the settings are the same as the system (or default) values " -"for the current option group" -msgstr "" -"설정이 현재 옵션 그룹의 시스템(또는 기본값) 값과 동일하다는 것을 나타냅니다." - -#: src/slic3r/GUI/Tab.cpp:3336 -msgid "UNLOCKED LOCK" -msgstr "잠금 해제 잠금" - -#. TRN Description for "UNLOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:3338 -msgid "" -"indicates that some settings were changed and are not equal to the system " -"(or default) values for the current option group.\n" -"Click the UNLOCKED LOCK icon to reset all settings for current option group " -"to the system (or default) values." -msgstr "" -"은 일부 설정이 변경되었으며 현재 옵션 그룹의 시스템(또는 기본값) 값과 같지 않" -"음을 나타냅니다.\n" -"잠금 해제 잠금 아이콘을 클릭하여 현재 옵션 그룹에 대한 모든 설정을 시스템(또" -"는 기본값) 값으로 재설정합니다." - -#: src/slic3r/GUI/Tab.cpp:3343 -msgid "WHITE BULLET" -msgstr "흰색 글머리 기호" - -#. TRN Description for "WHITE BULLET" -#: src/slic3r/GUI/Tab.cpp:3345 -msgid "" -"for the left button: \tindicates a non-system (or non-default) preset,\n" -"for the right button: \tindicates that the settings hasn't been modified." -msgstr "" -"왼쪽 단추의 경우: 비시스템(또는 기본이 아닌) 사전 설정을 나타냅니다.\n" -"오른쪽 버튼: 설정이 수정되지 않았음을 나타냅니다." - -#: src/slic3r/GUI/Tab.cpp:3348 -msgid "BACK ARROW" -msgstr "돌아가기 화살표" - -#. TRN Description for "BACK ARROW" -#: src/slic3r/GUI/Tab.cpp:3350 -msgid "" -"indicates that the settings were changed and are not equal to the last saved " -"preset for the current option group.\n" -"Click the BACK ARROW icon to reset all settings for the current option group " -"to the last saved preset." -msgstr "" -"잠금 풀림;일부 설정이 변경되었으며 현재 옵션 그룹의 시스템 값과 같지 않음을 " -"나타냅니다.\n" -"현재 옵션 그룹의 모든 설정을 시스템 값으로 재설정하려면 자물쇠 잠금 아이콘을 " -"클릭하십시오." - -#: src/slic3r/GUI/Tab.cpp:3360 -msgid "" -"LOCKED LOCK icon indicates that the settings are the same as the system (or " -"default) values for the current option group" -msgstr "" -"LOCKED LOCK 아이콘은 설정이 현재 옵션 그룹의 시스템(또는 기본값) 값과 동일하" -"다는 것을 나타냅니다." - -#: src/slic3r/GUI/Tab.cpp:3362 -msgid "" -"UNLOCKED LOCK icon indicates that some settings were changed and are not " -"equal to the system (or default) values for the current option group.\n" -"Click to reset all settings for current option group to the system (or " -"default) values." -msgstr "" -"UNLOCKED LOCK 아이콘은 일부 설정이 변경되었으며 현재 옵션 그룹의 시스템(또는 " -"기본값) 값과 같지 않음을 나타냅니다.\n" -"현재 옵션 그룹에 대한 모든 설정을 시스템(또는 기본값) 값으로 재설정하려면 클" -"릭합니다." - -#: src/slic3r/GUI/Tab.cpp:3365 -msgid "WHITE BULLET icon indicates a non system (or non default) preset." -msgstr "WHITE BULLET 아이콘은 시스템 사전 설정이 아닌 것을 나타냅니다." - -#: src/slic3r/GUI/Tab.cpp:3368 -msgid "" -"WHITE BULLET icon indicates that the settings are the same as in the last " -"saved preset for the current option group." -msgstr "" -"WHITE BULLET 기호 아이콘은 설정이 현재 옵션 그룹에 대해 마지막으로 저장 된 사" -"전 설정과 동일 하다는 것을 나타냅니다." - -#: src/slic3r/GUI/Tab.cpp:3370 -msgid "" -"BACK ARROW icon indicates that the settings were changed and are not equal " -"to the last saved preset for the current option group.\n" -"Click to reset all settings for the current option group to the last saved " -"preset." -msgstr "" -"BACK ARROW 이콘 설정을 변경 하 고 현재 옵션 그룹에 대 한 마지막 저장 된 프리" -"셋을 동일 하지 않습니다 나타냅니다.\n" -"마지막 현재 옵션 그룹에 대 한 모든 설정 다시 설정을 클릭 하 여 사전 설정을 저" -"장." - -#: src/slic3r/GUI/Tab.cpp:3376 -msgid "" -"LOCKED LOCK icon indicates that the value is the same as the system (or " -"default) value." -msgstr "" -"LOCKED LOCK 아이콘은 값이 시스템(또는 기본값) 값과 동일하다는 것을 나타냅니" -"다." - -#: src/slic3r/GUI/Tab.cpp:3377 -msgid "" -"UNLOCKED LOCK icon indicates that the value was changed and is not equal to " -"the system (or default) value.\n" -"Click to reset current value to the system (or default) value." -msgstr "" -"UNLOCKED LOCK 아이콘은 값이 변경되었으며 시스템(또는 기본값) 값과 같지 않음" -"을 나타냅니다.\n" -"현재 값을 시스템(또는 기본값) 값으로 재설정하려면 클릭합니다." - -#: src/slic3r/GUI/Tab.cpp:3383 -msgid "" -"WHITE BULLET icon indicates that the value is the same as in the last saved " -"preset." -msgstr "" -"WHITE BULLET 기호 아이콘은 마지막으로 저장 한 사전 설정과 동일한 값을 나타냅" -"니다." - -#: src/slic3r/GUI/Tab.cpp:3384 -msgid "" -"BACK ARROW icon indicates that the value was changed and is not equal to the " -"last saved preset.\n" -"Click to reset current value to the last saved preset." -msgstr "" -"BACK ARROW 아이콘은 값이 변경되었으며 마지막으로 저장된 사전 설정과 같지 않음" -"을 나타냅니다.\n" -"현재 값을 마지막으로 저장된 사전 설정으로 재설정하려면 클릭합니다." - -#. TRN Preset -#: src/slic3r/GUI/Tab.cpp:3497 -#, c-format -msgid "Save %s as:" -msgstr "Save %s as:" - -#: src/slic3r/GUI/Tab.cpp:3541 -msgid "the following suffix is not allowed:" -msgstr "다음 접미사는 허용되지 않습니다:" - -#: src/slic3r/GUI/Tab.cpp:3545 -msgid "The supplied name is not available." -msgstr "제공된 이름을 사용할 수 없습니다." - -#: src/slic3r/GUI/Tab.cpp:3558 -msgid "Material" -msgstr "재료" - -#: src/slic3r/GUI/Tab.cpp:3560 src/slic3r/GUI/Tab.cpp:3651 -#: src/slic3r/GUI/wxExtensions.cpp:454 -msgid "Layers" -msgstr "레이어" - -#: src/slic3r/GUI/Tab.cpp:3564 -msgid "Exposure" -msgstr "노출" - -#: src/slic3r/GUI/Tab.cpp:3659 -msgid "Support head" -msgstr "서포트 헤드" - -#: src/slic3r/GUI/Tab.cpp:3664 -msgid "Support pillar" -msgstr "서포트 기둥" - -#: src/slic3r/GUI/Tab.cpp:3675 -msgid "Connection of the support sticks and junctions" -msgstr "서포트 기둥 및 접합부 연결" - -#: src/slic3r/GUI/Tab.cpp:3680 -msgid "Automatic generation" -msgstr "자동 생성" - -#: src/slic3r/GUI/Tab.cpp:3747 -msgid "Head penetration should not be greater than the head width." -msgstr "헤드 관통은 헤드 폭 보다 크지 않아야 합니다." - -#: src/slic3r/GUI/Tab.cpp:3751 -msgid "Invalid Head penetration" -msgstr "잘못된 헤드 관통" - -#: src/slic3r/GUI/Tab.cpp:3767 -msgid "Pinhead diameter should be smaller than the pillar diameter." -msgstr "핀헤드 지름은 기둥 지름 보다 작아야 합니다." - -#: src/slic3r/GUI/Tab.cpp:3771 -msgid "Invalid pinhead diameter" -msgstr "잘못된 핀 헤드 지름" - -#: src/slic3r/GUI/Tab.hpp:324 src/slic3r/GUI/Tab.hpp:422 -msgid "Print Settings" -msgstr "출력 설정" - -#: src/slic3r/GUI/Tab.hpp:348 -msgid "Filament Settings" -msgstr "필라멘트 설정" - -#: src/slic3r/GUI/Tab.hpp:383 -msgid "Printer Settings" -msgstr "프린터 설정" - -#: src/slic3r/GUI/Tab.hpp:407 -msgid "Material Settings" -msgstr "재질 설정" - -#: src/slic3r/GUI/Tab.hpp:434 -msgid "Save preset" -msgstr "사전 설정 저장" - -#: src/slic3r/GUI/UpdateDialogs.cpp:38 -msgid "Update available" -msgstr "사용가능한 업데이트" - -#: src/slic3r/GUI/UpdateDialogs.cpp:38 -#, c-format -msgid "New version of %s is available" -msgstr "%s의 새 버전을 사용할 수 있습니다" - -#: src/slic3r/GUI/UpdateDialogs.cpp:45 -msgid "Current version:" -msgstr "현재 버전:" - -#: src/slic3r/GUI/UpdateDialogs.cpp:47 -msgid "New version:" -msgstr "새로운 버전:" - -#: src/slic3r/GUI/UpdateDialogs.cpp:55 -msgid "Changelog && Download" -msgstr "변경 로그 및 다운로드" - -#: src/slic3r/GUI/UpdateDialogs.cpp:62 src/slic3r/GUI/UpdateDialogs.cpp:125 -msgid "Open changelog page" -msgstr "변경 로그 페이지 열기" - -#: src/slic3r/GUI/UpdateDialogs.cpp:67 -msgid "Open download page" -msgstr "다운로드 페이지 열기" - -#: src/slic3r/GUI/UpdateDialogs.cpp:73 -msgid "Don't notify about new releases any more" -msgstr "새로운 수정사항에 대해 더 이상 알림 안 함" - -#: src/slic3r/GUI/UpdateDialogs.cpp:91 src/slic3r/GUI/UpdateDialogs.cpp:205 -msgid "Configuration update" -msgstr "구성 업데이트" - -#: src/slic3r/GUI/UpdateDialogs.cpp:91 -msgid "Configuration update is available" -msgstr "구성 업데이트를 사용할 수 있음" - -#: src/slic3r/GUI/UpdateDialogs.cpp:94 -msgid "" -"Would you like to install it?\n" -"\n" -"Note that a full configuration snapshot will be created first. It can then " -"be restored at any time should there be a problem with the new version.\n" -"\n" -"Updated configuration bundles:" -msgstr "" -"그것을 설치 하시겠습니까?\n" -"\n" -"전체 구성 스냅 샷이 먼저 만들어집니다. 그런 다음 새 버전에 문제가있을 경우 언" -"제든지 복원 할 수 있습니다.\n" -"\n" -"업데이트 된 구성 번들 :" - -#: src/slic3r/GUI/UpdateDialogs.cpp:115 -msgid "Comment:" -msgstr "\"댓글\"" - -#: src/slic3r/GUI/UpdateDialogs.cpp:149 -#, c-format -msgid "%s incompatibility" -msgstr "%s 비 호환성" - -#: src/slic3r/GUI/UpdateDialogs.cpp:150 -#, c-format -msgid "%s configuration is incompatible" -msgstr "%s 과 호환되지 않습니다" - -#: src/slic3r/GUI/UpdateDialogs.cpp:155 -#, c-format -msgid "" -"This version of %s is not compatible with currently installed configuration " -"bundles.\n" -"This probably happened as a result of running an older %s after using a " -"newer one.\n" -"\n" -"You may either exit %s and try again with a newer version, or you may re-run " -"the initial configuration. Doing so will create a backup snapshot of the " -"existing configuration before installing files compatible with this %s.\n" -msgstr "" -"%s의 이 버전은 현재 설치 된 구성 번들과 호환 되지 않습니다.\n" -"이것은 새로운 것을 사용한 후 이전 %s를 실행 한 결과로 발생 했을 것입니다.\n" -"\n" -" %s를 종료하고 최신 버전으로 다시 시도 하거나 초기 구성을 다시 실행할 수 있습" -"니다. 이렇게 하면 %s와 호환 되는 파일을 설치하기 전에 기존 구성의 백업 스냅샷" -"이 생성 됩니다.\n" - -#: src/slic3r/GUI/UpdateDialogs.cpp:164 -#, c-format -msgid "This %s version: %s" -msgstr "이 %s 버전: %s" - -#: src/slic3r/GUI/UpdateDialogs.cpp:169 -msgid "Incompatible bundles:" -msgstr "호환되지 않는 번들 :" - -#: src/slic3r/GUI/UpdateDialogs.cpp:185 -#, c-format -msgid "Exit %s" -msgstr "%s Exit" - -#: src/slic3r/GUI/UpdateDialogs.cpp:188 -msgid "Re-configure" -msgstr "재구성" - -#: src/slic3r/GUI/UpdateDialogs.cpp:209 -#, c-format -msgid "" -"%s now uses an updated configuration structure.\n" -"\n" -"So called 'System presets' have been introduced, which hold the built-in " -"default settings for various printers. These System presets cannot be " -"modified, instead, users now may create their own presets inheriting " -"settings from one of the System presets.\n" -"An inheriting preset may either inherit a particular value from its parent " -"or override it with a customized value.\n" -"\n" -"Please proceed with the %s that follows to set up the new presets and to " -"choose whether to enable automatic preset updates." -msgstr "" -"%s이 (가) 이제 업데이트 된 구성 구조를 사용 합니다.\n" -"\n" -"'시스템 프리셋 '이 도입 되었습니다, 다양한 프린터에 대한 기본 설정을 내장. 이" -"러한 시스템 프리셋은 수정할 수 없으며, 사용자는 이제 시스템 프리셋 중 하나에" -"서 설정을 상속하는 자신만의 프리셋을 생성할 수 있습니다.\n" -"상속하는 사전 설정은 해당 기본 설정에서 특정 값을 상속 하거나 사용자 지정 된 " -"값으로 재정의할 수 있습니다.\n" -"\n" -"다음의 %s를 계속 진행하여 새 프리셋을 설정하고 자동 프리셋 업데이트를 사용할" -"지 여부를 선택하십시오." - -#: src/slic3r/GUI/UpdateDialogs.cpp:225 -msgid "For more information please visit our wiki page:" -msgstr "자세한 정보는 위키 페이지를 참조하십시오 :" - -#: src/slic3r/GUI/WipeTowerDialog.cpp:14 -msgid "Ramming customization" -msgstr "사용자 정의 다지기(Ramming)" - -#: src/slic3r/GUI/WipeTowerDialog.cpp:40 -msgid "" -"Ramming denotes the rapid extrusion just before a tool change in a single-" -"extruder MM printer. Its purpose is to properly shape the end of the " -"unloaded filament so it does not prevent insertion of the new filament and " -"can itself be reinserted later. This phase is important and different " -"materials can require different extrusion speeds to get the good shape. For " -"this reason, the extrusion rates during ramming are adjustable.\n" -"\n" -"This is an expert-level setting, incorrect adjustment will likely lead to " -"jams, extruder wheel grinding into filament etc." -msgstr "" -"래밍은 단일 압출기 MM 프린터에서 공구 교환 직전의 신속한 압출을 나타냅니다. " -"그 목적은 언로드 된 필라멘트의 끝 부분을 적절히 형성하여 새로운 필라멘트의 삽" -"입을 방지하고 나중에 다시 삽입 할 수 있도록하기위한 것입니다. 이 단계는 중요" -"하며 다른 재료는 좋은 모양을 얻기 위해 다른 압출 속도를 요구할 수 있습니다. " -"이러한 이유로, 래밍 중 압출 속도는 조정 가능합니다.\n" -"\n" -"전문가 수준의 설정이므로 잘못된 조정으로 인해 용지 걸림, 압출기 휠이 필라멘" -"트 등에 연삭 될 수 있습니다." - -#: src/slic3r/GUI/WipeTowerDialog.cpp:82 -msgid "Total ramming time" -msgstr "총 래밍 시간" - -#: src/slic3r/GUI/WipeTowerDialog.cpp:84 -msgid "Total rammed volume" -msgstr "총 레미드 양" - -#: src/slic3r/GUI/WipeTowerDialog.cpp:88 -msgid "Ramming line width" -msgstr "래밍 선 너비" - -#: src/slic3r/GUI/WipeTowerDialog.cpp:90 -msgid "Ramming line spacing" -msgstr "래밍 선 간격" - -#: src/slic3r/GUI/WipeTowerDialog.cpp:141 -msgid "Wipe tower - Purging volume adjustment" -msgstr "와이프 타워 - 버려진 필라멘트 조절" - -#: src/slic3r/GUI/WipeTowerDialog.cpp:225 -msgid "" -"Here you can adjust required purging volume (mm³) for any given pair of " -"tools." -msgstr "여기서 주어진 도구 쌍에 필요한 정화 용량 (mm³)을 조정할 수 있습니다." - -#: src/slic3r/GUI/WipeTowerDialog.cpp:226 -msgid "Extruder changed to" -msgstr "익스트루더 번경" - -#: src/slic3r/GUI/WipeTowerDialog.cpp:234 -msgid "unloaded" -msgstr "언로드(unloaded)" - -#: src/slic3r/GUI/WipeTowerDialog.cpp:235 -msgid "loaded" -msgstr "로드(loaded)" - -#: src/slic3r/GUI/WipeTowerDialog.cpp:240 -msgid "Tool #" -msgstr "도구(Tool) #" - -#: src/slic3r/GUI/WipeTowerDialog.cpp:247 -msgid "" -"Total purging volume is calculated by summing two values below, depending on " -"which tools are loaded/unloaded." -msgstr "" -"총 정화 량은 어느 공구가로드 / 언로드되는지에 따라 아래의 두 값을 합산하여 계" -"산됩니다." - -#: src/slic3r/GUI/WipeTowerDialog.cpp:248 -msgid "Volume to purge (mm³) when the filament is being" -msgstr "제거할 필라멘트 양 (mm³)" - -#: src/slic3r/GUI/WipeTowerDialog.cpp:262 -msgid "From" -msgstr "From" - -#: src/slic3r/GUI/WipeTowerDialog.cpp:327 -msgid "" -"Switching to simple settings will discard changes done in the advanced " -"mode!\n" -"\n" -"Do you want to proceed?" -msgstr "" -"단순 설정으로 전환하면 고급 모드에서 수행된 변경 내용이 삭제됨!\n" -"\n" -"계속하시겠습니까?" - -#: src/slic3r/GUI/WipeTowerDialog.cpp:339 -msgid "Show simplified settings" -msgstr "간단한 설정보기" - -#: src/slic3r/GUI/WipeTowerDialog.cpp:339 -msgid "Show advanced settings" -msgstr "고급 설정보기" - -#: src/slic3r/GUI/wxExtensions.cpp:443 -msgid "Instances" -msgstr "복제본" - -#: src/slic3r/GUI/wxExtensions.cpp:447 src/slic3r/GUI/wxExtensions.cpp:592 -#, c-format -msgid "Instance %d" -msgstr "복제본 %d" - -#: src/slic3r/GUI/wxExtensions.cpp:486 -msgid "Range" -msgstr "범위" - -#: src/slic3r/GUI/wxExtensions.cpp:2570 -msgid "One layer mode" -msgstr "하나의 레이어 모드" - -#: src/slic3r/GUI/wxExtensions.cpp:2571 -msgid "Add/Del color change" -msgstr "현재 레이어의 색상 변경 마커 추가" - -#: src/slic3r/GUI/wxExtensions.cpp:2572 -msgid "Discard all color changes" -msgstr "모든 색상 변경 무시" - -#: src/slic3r/GUI/wxExtensions.cpp:2832 -#, c-format -msgid "Switch to the %s mode" -msgstr "%s 모드로 전환" - -#: src/slic3r/GUI/wxExtensions.cpp:2833 -#, c-format -msgid "Current mode is %s" -msgstr "현재 모드는 %s입니다" - -#: src/slic3r/Utils/Duet.cpp:51 -msgid "Connection to Duet works correctly." -msgstr "듀엣보드에 대한 연결이 올바르게 작동 합니다." - -#: src/slic3r/Utils/Duet.cpp:56 -msgid "Could not connect to Duet" -msgstr "듀엣보드에 연결할 수 없습니다" - -#: src/slic3r/Utils/Duet.cpp:84 src/slic3r/Utils/Duet.cpp:154 -msgid "Unknown error occured" -msgstr "알 수 없는 오류가 발생 했습니다" - -#: src/slic3r/Utils/Duet.cpp:148 -msgid "Wrong password" -msgstr "잘못된 암호" - -#: src/slic3r/Utils/Duet.cpp:151 -msgid "Could not get resources to create a new connection" -msgstr "새 연결을 만들 리소스를 가져올수 없습니다" - -#: src/slic3r/Utils/OctoPrint.cpp:69 -#, c-format -msgid "Mismatched type of print host: %s" -msgstr "일치 하지않는 인쇄 호스트 유형: %s" - -#: src/slic3r/Utils/OctoPrint.cpp:84 -msgid "Connection to OctoPrint works correctly." -msgstr "OctoPrint에 연결하면 올바르게 작동합니다." - -#: src/slic3r/Utils/OctoPrint.cpp:90 -msgid "Could not connect to OctoPrint" -msgstr "OctoPrint에 연결할 수 없습니다" - -#: src/slic3r/Utils/OctoPrint.cpp:90 -msgid "Note: OctoPrint version at least 1.1.0 is required." -msgstr "참고 : OctoPrint 버전 1.1.0 이상이 필요합니다." - -#: src/slic3r/Utils/OctoPrint.cpp:195 -msgid "Connection to Prusa SL1 works correctly." -msgstr "Prusa SL1에 대한 연결이 제대로 작동 합니다." - -#: src/slic3r/Utils/OctoPrint.cpp:200 -msgid "Could not connect to Prusa SLA" -msgstr "Prusa SLA에 연결할 수 없습니다" - -#: src/slic3r/Utils/PresetUpdater.cpp:614 -#, c-format -msgid "requires min. %s and max. %s" -msgstr "최소. %s 와 최대. %s" - -#: src/slic3r/Utils/PresetUpdater.cpp:619 -#, c-format -msgid "requires min. %s" -msgstr "최소 %s가 필요 합니다" - -#: src/slic3r/Utils/PresetUpdater.cpp:621 -#, c-format -msgid "requires max. %s" -msgstr "최대 필요 합니다. %s" - -#: src/slic3r/Utils/FixModelByWin10.cpp:219 -#: src/slic3r/Utils/FixModelByWin10.cpp:359 -msgid "Exporting source model" -msgstr "소스 모델 내보내기" - -#: src/slic3r/Utils/FixModelByWin10.cpp:235 -msgid "Failed loading the input model." -msgstr "입력 모델을 로드하지 못했습니다." - -#: src/slic3r/Utils/FixModelByWin10.cpp:242 -msgid "Repairing model by the Netfabb service" -msgstr "Netfabb 서비스에의 한 모델 복구" - -#: src/slic3r/Utils/FixModelByWin10.cpp:248 -msgid "Mesh repair failed." -msgstr "메쉬 복구에 실패 했습니다." - -#: src/slic3r/Utils/FixModelByWin10.cpp:251 -#: src/slic3r/Utils/FixModelByWin10.cpp:378 -msgid "Loading repaired model" -msgstr "복구 된 모델 로드" - -#: src/slic3r/Utils/FixModelByWin10.cpp:263 -#: src/slic3r/Utils/FixModelByWin10.cpp:270 -#: src/slic3r/Utils/FixModelByWin10.cpp:302 -msgid "Saving mesh into the 3MF container failed." -msgstr "3MF 컨테이너에 메쉬를 저장하지 못했습니다." - -#: src/slic3r/Utils/FixModelByWin10.cpp:340 -msgid "Model fixing" -msgstr "모델 고정" - -#: src/slic3r/Utils/FixModelByWin10.cpp:341 -msgid "Exporting model..." -msgstr "소스 모델 내보내기..." - -#: src/slic3r/Utils/FixModelByWin10.cpp:368 -msgid "Export of a temporary 3mf file failed" -msgstr "임시 3mf 파일을 내보내지 못했습니다" - -#: src/slic3r/Utils/FixModelByWin10.cpp:383 -msgid "Import of the repaired 3mf file failed" -msgstr "복구된 3mf 파일을 가져오지 못했습니다" - -#: src/slic3r/Utils/FixModelByWin10.cpp:385 -msgid "Repaired 3MF file does not contain any object" -msgstr "복구된 3MF 파일에 개체가 포함 되어있지 않습니다" - -#: src/slic3r/Utils/FixModelByWin10.cpp:387 -msgid "Repaired 3MF file contains more than one object" -msgstr "복구된 3MF 파일에 둘 이상의 개체가 포함되어 있습니다" - -#: src/slic3r/Utils/FixModelByWin10.cpp:389 -msgid "Repaired 3MF file does not contain any volume" -msgstr "복구 된 3MF 파일에 개체가 포함 되어있지 않습니다" - -#: src/slic3r/Utils/FixModelByWin10.cpp:391 -msgid "Repaired 3MF file contains more than one volume" -msgstr "복구된 3MF 파일에 둘 이상의 개체가 포함되어 있습니다" - -#: src/slic3r/Utils/FixModelByWin10.cpp:400 -msgid "Model repair finished" -msgstr "모델 수리 완료" - -#: src/slic3r/Utils/FixModelByWin10.cpp:406 -msgid "Model repair canceled" -msgstr "모델 복구가 취소 되었습니다" - -#: src/slic3r/Utils/FixModelByWin10.cpp:423 -msgid "Model repaired successfully" -msgstr "모델이 성공적으로 복구 되었습니다" - -#: src/slic3r/Utils/FixModelByWin10.cpp:423 -#: src/slic3r/Utils/FixModelByWin10.cpp:426 -msgid "Model Repair by the Netfabb service" -msgstr "Netfabb 서비스에의 한 모델 복구" - -#: src/slic3r/Utils/FixModelByWin10.cpp:426 -msgid "Model repair failed: \n" -msgstr "모델 복구 실패:\n" - -#: src/libslic3r/Zipper.cpp:32 -msgid "undefined error" -msgstr "정의 되지 않은 오류" - -#: src/libslic3r/Zipper.cpp:34 -msgid "too many files" -msgstr "파일이 너무 많음" - -#: src/libslic3r/Zipper.cpp:36 -msgid "file too large" -msgstr "파일이 너무 큼" - -#: src/libslic3r/Zipper.cpp:38 -msgid "unsupported method" -msgstr "지원 되지 않는 방법" - -#: src/libslic3r/Zipper.cpp:40 -msgid "unsupported encryption" -msgstr "지원 되지 않는 암호화" - -#: src/libslic3r/Zipper.cpp:42 -msgid "unsupported feature" -msgstr "지원 되지 않는 기능" - -#: src/libslic3r/Zipper.cpp:44 -msgid "failed finding central directory" -msgstr "중앙 디렉터리를 찾지 못했습니다." - -#: src/libslic3r/Zipper.cpp:46 -msgid "not a ZIP archive" -msgstr "zIP 아카이브 아님" - -#: src/libslic3r/Zipper.cpp:48 -msgid "invalid header or archive is corrupted" -msgstr "잘못 된 헤더 또는 아카이브가 손상 되었습니다" - -#: src/libslic3r/Zipper.cpp:50 -msgid "unsupported multidisk archive" -msgstr "지원 되지 않는 멀티 디스크 아카이브" - -#: src/libslic3r/Zipper.cpp:52 -msgid "decompression failed or archive is corrupted" -msgstr "압축 풀기 실패 또는 아카이브가 손상 되었습니다" - -#: src/libslic3r/Zipper.cpp:54 -msgid "compression failed" -msgstr "압축 실패" - -#: src/libslic3r/Zipper.cpp:56 -msgid "unexpected decompressed size" -msgstr "예기치 않은 압축 해제 크기" - -#: src/libslic3r/Zipper.cpp:58 -msgid "CRC-32 check failed" -msgstr "CRC-32 확인 실패" - -#: src/libslic3r/Zipper.cpp:60 -msgid "unsupported central directory size" -msgstr "지원 되지 않는 중앙 디렉터리 크기" - -#: src/libslic3r/Zipper.cpp:62 -msgid "allocation failed" -msgstr "할당 실패" - -#: src/libslic3r/Zipper.cpp:64 -msgid "file open failed" -msgstr "파일 열기 실패" - -#: src/libslic3r/Zipper.cpp:66 -msgid "file create failed" -msgstr "파일 만들기 실패" - -#: src/libslic3r/Zipper.cpp:68 -msgid "file write failed" -msgstr "파일 쓰기 실패" - -#: src/libslic3r/Zipper.cpp:70 -msgid "file read failed" -msgstr "파일 읽기 실패" - -#: src/libslic3r/Zipper.cpp:72 -msgid "file close failed" -msgstr "파일 닫기 실패" - -#: src/libslic3r/Zipper.cpp:74 -msgid "file seek failed" -msgstr "파일 검색 실패" - -#: src/libslic3r/Zipper.cpp:76 -msgid "file stat failed" -msgstr "파일 통계 실패" - -#: src/libslic3r/Zipper.cpp:78 -msgid "invalid parameter" -msgstr "잘못 된 매개 변수" - -#: src/libslic3r/Zipper.cpp:80 -msgid "invalid filename" -msgstr "잘못 된 파일 이름" - -#: src/libslic3r/Zipper.cpp:82 -msgid "buffer too small" -msgstr "버퍼가 너무 작음" - -#: src/libslic3r/Zipper.cpp:84 -msgid "internal error" -msgstr "내부 오류" - -#: src/libslic3r/Zipper.cpp:86 -msgid "file not found" -msgstr "파일을 찾을수 없다" - -#: src/libslic3r/Zipper.cpp:88 -msgid "archive is too large" -msgstr "아카이브가 너무 큼" - -#: src/libslic3r/Zipper.cpp:90 -msgid "validation failed" -msgstr "유효성 검사 실패" - -#: src/libslic3r/Zipper.cpp:92 -msgid "write calledback failed" -msgstr "쓰기 다시 실패" - -#: src/libslic3r/Zipper.cpp:102 -msgid "Error with zip archive" -msgstr "zip 아카이브와 오류가 발생 했습니다" - -#: src/libslic3r/Print.cpp:1093 -msgid "All objects are outside of the print volume." -msgstr "모든 개체가 인쇄 볼륨 외부에 있습니다." - -#: src/libslic3r/Print.cpp:1120 -msgid "Some objects are too close; your extruder will collide with them." -msgstr "일부 개체가 너무 가깝습니다. 귀하의 압출기가 그들과 충돌합니다." - -#: src/libslic3r/Print.cpp:1135 -msgid "" -"Some objects are too tall and cannot be printed without extruder collisions." -msgstr "일부 개체는 너무 크고 익스트루더 충돌없이 인쇄 할 수 없습니다." - -#: src/libslic3r/Print.cpp:1145 -msgid "The Spiral Vase option can only be used when printing a single object." -msgstr "" -"나선형 꽃병(Spiral Vase) 옵션은 단일 개체를 인쇄 할 때만 사용할 수 있습니다." - -#: src/libslic3r/Print.cpp:1147 -msgid "" -"The Spiral Vase option can only be used when printing single material " -"objects." -msgstr "" -"나선형 꽃병 옵션(Spiral Vase)은 단일 재료 객체를 인쇄 할 때만 사용할 수 있습" -"니다." - -#: src/libslic3r/Print.cpp:1155 -msgid "" -"The wipe tower is only supported if all extruders have the same nozzle " -"diameter and use filaments of the same diameter." -msgstr "" -"모든 압출기 의 노즐 직경이 동일하고 동일한 직경의 필라멘트를 사용하는 경우에" -"만 와이프 타워가 지원됩니다." - -#: src/libslic3r/Print.cpp:1159 -msgid "" -"The Wipe Tower is currently only supported for the Marlin, RepRap/Sprinter " -"and Repetier G-code flavors." -msgstr "" -"와이프 타워는 현재 말린, RepRap/Sprinter 및 리피티어에 대해서만 G-코드지원 됩" -"니다." - -#: src/libslic3r/Print.cpp:1161 -msgid "" -"The Wipe Tower is currently only supported with the relative extruder " -"addressing (use_relative_e_distances=1)." -msgstr "" -"와이프 타워는 현재 상대적 압출기 어드레싱 (use_relative_e_distances = 1)에서" -"만 지원됩니다." - -#: src/libslic3r/Print.cpp:1165 -msgid "All extruders must have the same diameter for the Wipe Tower." -msgstr "모든 압출기는 와이프 타워의 지름이 같아야 합니다." - -#: src/libslic3r/Print.cpp:1186 -msgid "" -"The Wipe Tower is only supported for multiple objects if they have equal " -"layer heights" -msgstr "" -"와이프 타워 (Wipe Tower)는 같은 레이어 높이에 경우 여러 객체에 대해서만 지원" -"됩니다" - -#: src/libslic3r/Print.cpp:1188 -msgid "" -"The Wipe Tower is only supported for multiple objects if they are printed " -"over an equal number of raft layers" -msgstr "" -"와이프 타워는 같은 수의 라프트 레이어 위에 인쇄 된 경우 여러 객체에 대해서만 " -"지원됩니다" - -#: src/libslic3r/Print.cpp:1190 -msgid "" -"The Wipe Tower is only supported for multiple objects if they are printed " -"with the same support_material_contact_distance" -msgstr "" -"와이프 타워는 동일한 support_material_contact_distance로 인쇄 된 경우 여러 객" -"체에 대해서만 지원됩니다" - -#: src/libslic3r/Print.cpp:1192 -msgid "" -"The Wipe Tower is only supported for multiple objects if they are sliced " -"equally." -msgstr "" -"와이프 타워는 똑같이 슬라이스 된 경우 여러 오브젝트에 대해서만 지원됩니다." - -#: src/libslic3r/Print.cpp:1220 -msgid "" -"The Wipe tower is only supported if all objects have the same layer height " -"profile" -msgstr "" -"모든 오브젝트의 레이어 높이 프로필이 동일한 경우에만 와이프 타워가 지원됩니다" - -#: src/libslic3r/Print.cpp:1230 -msgid "The supplied settings will cause an empty print." -msgstr "제공된 설정으로 인해 빈 인쇄가 발생합니다." - -#: src/libslic3r/Print.cpp:1247 -msgid "" -"One or more object were assigned an extruder that the printer does not have." -msgstr "하나 이상의 개체에 프린터에없는 압출기가 지정되었습니다." - -#: src/libslic3r/Print.cpp:1256 -msgid "" -"Printing with multiple extruders of differing nozzle diameters. If support " -"is to be printed with the current extruder (support_material_extruder == 0 " -"or support_material_interface_extruder == 0), all nozzles have to be of the " -"same diameter." -msgstr "" -"노즐 지름이 다른 여러 압출기로 인쇄. 지원이 현재 압출기 " -"(support_material_extruder == 0 또는 support_material_interface_extruder == " -"0)로 인쇄되는 경우 모든 노즐은 동일한 지름이어야합니다." - -#: src/libslic3r/Print.cpp:1264 -msgid "" -"For the Wipe Tower to work with the soluble supports, the support layers " -"need to be synchronized with the object layers." -msgstr "" -"와이프 타워가 가용성 지지체와 함께 작동 하려면 서포트 레이어를 오브젝트 레이" -"어와 동기화 해야 합니다." - -#: src/libslic3r/Print.cpp:1268 -msgid "" -"The Wipe Tower currently supports the non-soluble supports only if they are " -"printed with the current extruder without triggering a tool change. (both " -"support_material_extruder and support_material_interface_extruder need to be " -"set to 0)." -msgstr "" -"와이프 타워는 현재 공구 교체를 트리거하지 않고 현재의 압출기로 인쇄 하는 경우" -"에만 비가용성 서포트를 지원 합니다. (support_material_extruder과 " -"support_material_interface_extruder 모두 0으로 설정 해야 합니다.)" - -#: src/libslic3r/Print.cpp:1290 -msgid "First layer height can't be greater than nozzle diameter" -msgstr "첫번째 레이어 높이는 노즐 직경보다 클 수 없습니다" - -#: src/libslic3r/Print.cpp:1294 -msgid "Layer height can't be greater than nozzle diameter" -msgstr "레이어 높이는 노즐 직경보다 클 수 없습니다" - -#: src/libslic3r/Print.cpp:1438 -msgid "Infilling layers" -msgstr "레이어 채우기" - -#: src/libslic3r/Print.cpp:1446 -msgid "Generating skirt" -msgstr "스커트 생성" - -#: src/libslic3r/Print.cpp:1454 -msgid "Generating brim" -msgstr "브림 생성" - -#: src/libslic3r/Print.cpp:1482 -msgid "Exporting G-code" -msgstr "G 코드 내보내기" - -#: src/libslic3r/Print.cpp:1486 -msgid "Generating G-code" -msgstr "G 코드 생성" - -#: src/libslic3r/SLAPrint.cpp:58 -msgid "Slicing model" -msgstr "슬라이싱 모델" - -#: src/libslic3r/SLAPrint.cpp:59 src/libslic3r/SLAPrint.cpp:871 -msgid "Generating support points" -msgstr "서포트 지점 생성" - -#: src/libslic3r/SLAPrint.cpp:60 -msgid "Generating support tree" -msgstr "서포트 트리 생성" - -#: src/libslic3r/SLAPrint.cpp:61 -msgid "Generating pad" -msgstr "패드 생성" - -#: src/libslic3r/SLAPrint.cpp:62 -msgid "Slicing supports" -msgstr "슬라이싱 서포트즈" - -#: src/libslic3r/SLAPrint.cpp:79 -msgid "Merging slices and calculating statistics" -msgstr "슬라이스 병합 및 통계 계산" - -#: src/libslic3r/SLAPrint.cpp:80 -msgid "Rasterizing layers" -msgstr "레이어 래스터화" - -#: src/libslic3r/SLAPrint.cpp:650 -msgid "" -"Cannot proceed without support points! Add support points or disable support " -"generation." -msgstr "" -"서포트 포인트 없이 진행할 수 없습니다! 서포트 지점을 추가 하거나 서포트 생성" -"을 사용 하지 않도록 설정 합니다." - -#: src/libslic3r/SLAPrint.cpp:664 -msgid "Elevation is too low for object." -msgstr "객체 고도가 너무 낮습니다." - -#: src/libslic3r/SLAPrint.cpp:670 -msgid "" -"The endings of the support pillars will be deployed on the gap between the " -"object and the pad. 'Support base safety distance' has to be greater than " -"the 'Pad object gap' parameter to avoid this." -msgstr "" -"서포트 기둥 끝은 오브젝트와 패드 사이의 간격에 배치됩니다. 이를 방지하기 위" -"해 '베이스 서포트 안전 거리'는 '패드 오브젝트 갭' 매개변수보다 커야 합니다." - -#: src/libslic3r/SLAPrint.cpp:759 -msgid "" -"Slicing had to be stopped due to an internal error: Inconsistent slice index." -msgstr "" -"내부 오류: 일치하지 않는 슬라이스 인덱스로 인해 슬라이싱을 중지해야 했습니다." - -#: src/libslic3r/SLAPrint.cpp:954 src/libslic3r/SLAPrint.cpp:964 -#: src/libslic3r/SLAPrint.cpp:1005 -msgid "Visualizing supports" -msgstr "시각화 지원" - -#: src/libslic3r/SLAPrint.cpp:1537 -msgid "Slicing done" -msgstr "슬라이싱 완료" - -#: src/libslic3r/PrintBase.cpp:71 -msgid "Failed processing of the output_filename_format template." -msgstr "아래 output_filename_format 템플리트의 처리에 실패했습니다." - -#: src/libslic3r/PrintConfig.cpp:43 src/libslic3r/PrintConfig.cpp:44 -msgid "Printer technology" -msgstr "프린터 기술" - -#: src/libslic3r/PrintConfig.cpp:51 -msgid "Bed shape" -msgstr "배드 모양" - -#: src/libslic3r/PrintConfig.cpp:56 -msgid "Bed custom texture" -msgstr "침대 사용자 정의 질감" - -#: src/libslic3r/PrintConfig.cpp:61 -msgid "Bed custom model" -msgstr "침대 사용자 정의 모델" - -#: src/libslic3r/PrintConfig.cpp:68 -msgid "" -"This setting controls the height (and thus the total number) of the slices/" -"layers. Thinner layers give better accuracy but take more time to print." -msgstr "" -"이 설정은 슬라이스/레이어의 높이(따라서 총 수)를 제어합니다. 얇은 층은 더 나" -"은 정확성을 제공하지만 인쇄하는 데는 더 많은 시간이 걸린다." - -#: src/libslic3r/PrintConfig.cpp:75 -msgid "Max print height" -msgstr "최대 프린트 높이" - -#: src/libslic3r/PrintConfig.cpp:76 -msgid "" -"Set this to the maximum height that can be reached by your extruder while " -"printing." -msgstr "인쇄 중에 익스트루더가 도달 할 수있는 최대 높이로 설정하십시오." - -#: src/libslic3r/PrintConfig.cpp:82 -msgid "Slice gap closing radius" -msgstr "슬라이스 간격 닫힘 반경" - -#: src/libslic3r/PrintConfig.cpp:84 -msgid "" -"Cracks smaller than 2x gap closing radius are being filled during the " -"triangle mesh slicing. The gap closing operation may reduce the final print " -"resolution, therefore it is advisable to keep the value reasonably low." -msgstr "" -"삼각형 메쉬 슬라이싱 중에, 2배 간격 폐쇄 반경 보다 작은 균열이 채워집니다. " -"틈 닫기 작업은 최종 인쇄 해상도를 줄일 수 있으므로 값을 합리적으로 낮게 유지 " -"하는 것이 좋습니다." - -#: src/libslic3r/PrintConfig.cpp:92 -msgid "Hostname, IP or URL" -msgstr "호스트 이름(Hostname), IP or URL" - -#: src/libslic3r/PrintConfig.cpp:93 -msgid "" -"Slic3r can upload G-code files to a printer host. This field should contain " -"the hostname, IP address or URL of the printer host instance." -msgstr "" -"Slic3r는 프린터 호스트에 G 코드 파일을 업로드할 수 있습니다. 이 필드는 호스" -"트 이름, IP 주소 또는 프린터 호스트 복제본의 URL을 포함 해야 합니다." - -#: src/libslic3r/PrintConfig.cpp:99 -msgid "API Key / Password" -msgstr "API 키/암호" - -#: src/libslic3r/PrintConfig.cpp:100 -msgid "" -"Slic3r can upload G-code files to a printer host. This field should contain " -"the API Key or the password required for authentication." -msgstr "" -"Slic3r는 프린터 호스트에 G 코드 파일을 업로드할 수 있습니다. 이 필드는 API " -"키 또는 인증에 필요한 암호를 포함 해야 합니다." - -#: src/libslic3r/PrintConfig.cpp:106 -msgid "HTTPS CA File" -msgstr "HTTPS CA 파일" - -#: src/libslic3r/PrintConfig.cpp:107 -msgid "" -"Custom CA certificate file can be specified for HTTPS OctoPrint connections, " -"in crt/pem format. If left blank, the default OS CA certificate repository " -"is used." -msgstr "" -"사용자 지정 CA 인증서 파일은 crt/pem 형식의 HTTPS 옥토 프린트 연결에 대해 지" -"정할 수 있습니다. 비워 두면 기본 OS CA 인증서 리포지토리가 사용 됩니다." - -#: src/libslic3r/PrintConfig.cpp:121 -msgid "Avoid crossing perimeters" -msgstr "출력된 외측을 피하세요" - -#: src/libslic3r/PrintConfig.cpp:122 -msgid "" -"Optimize travel moves in order to minimize the crossing of perimeters. This " -"is mostly useful with Bowden extruders which suffer from oozing. This " -"feature slows down both the print and the G-code generation." -msgstr "" -"둘레의 교차를 최소화하기 위해 여행 이동을 최적화하십시오. 이것은 보 잉 " -"(Bowling) 압출기가 흘러 나오기 쉬운 경우에 주로 유용합니다. 이 기능을 사용하" -"면 인쇄 및 G 코드 생성 속도가 느려집니다." - -#: src/libslic3r/PrintConfig.cpp:129 src/libslic3r/PrintConfig.cpp:2027 -msgid "Other layers" -msgstr "다른 레이어" - -#: src/libslic3r/PrintConfig.cpp:130 -msgid "" -"Bed temperature for layers after the first one. Set this to zero to disable " -"bed temperature control commands in the output." -msgstr "" -"첫 번째 레이어 이후의 레이어 온도. 이 값을 0으로 설정하면 출력에서 ​​베드 온도 " -"제어 명령을 비활성화합니다." - -#: src/libslic3r/PrintConfig.cpp:132 -msgid "Bed temperature" -msgstr "배드 온도" - -#: src/libslic3r/PrintConfig.cpp:139 -msgid "" -"This custom code is inserted at every layer change, right before the Z move. " -"Note that you can use placeholder variables for all Slic3r settings as well " -"as [layer_num] and [layer_z]." -msgstr "" -"이 사용자 정의 코드는 Z 이동 직전의 모든 레이어 변경에 삽입됩니다. [Slide3r] " -"설정과 [layer_num] 및 [layer_z]에 대한 자리 표시 자 변수를 사용할 수 있습니" -"다." - -#: src/libslic3r/PrintConfig.cpp:149 -msgid "Between objects G-code" -msgstr "객체 간 G 코드" - -#: src/libslic3r/PrintConfig.cpp:150 -msgid "" -"This code is inserted between objects when using sequential printing. By " -"default extruder and bed temperature are reset using non-wait command; " -"however if M104, M109, M140 or M190 are detected in this custom code, Slic3r " -"will not add temperature commands. Note that you can use placeholder " -"variables for all Slic3r settings, so you can put a \"M109 " -"S[first_layer_temperature]\" command wherever you want." -msgstr "" -"이 코드는 순차 인쇄를 사용할 때 객체간에 삽입됩니다. 기본적으로 익스트루더 " -"및 베드 온도는 대기 모드가 아닌 명령을 사용하여 재설정됩니다. 그러나 이 사용" -"자 코드에서 M104, M109, M140 또는 M190이 감지되면 Slic3r은 온도 명령을 추가하" -"지 않습니다. 모든 Slic3r 설정에 자리 표시 변수를 사용할 수 있으므로 원하는 위" -"치에 \"M109 S [first_layer_temperature]\"명령을 넣을 수 있습니다." - -#: src/libslic3r/PrintConfig.cpp:161 -msgid "Number of solid layers to generate on bottom surfaces." -msgstr "바닥면에 생성 할 솔리드 레이어의 수." - -#: src/libslic3r/PrintConfig.cpp:162 -msgid "Bottom solid layers" -msgstr "바닥 단일 레이어" - -#: src/libslic3r/PrintConfig.cpp:167 -msgid "Bridge" -msgstr "브리지" - -#: src/libslic3r/PrintConfig.cpp:168 -msgid "" -"This is the acceleration your printer will use for bridges. Set zero to " -"disable acceleration control for bridges." -msgstr "" -"이것은 프린터가 브릿지에 사용할 가속도입니다. 브리지의 가속 제어를 사용하지 " -"않으려면 0으로 설정하십시오." - -#: src/libslic3r/PrintConfig.cpp:170 src/libslic3r/PrintConfig.cpp:313 -#: src/libslic3r/PrintConfig.cpp:840 src/libslic3r/PrintConfig.cpp:961 -#: src/libslic3r/PrintConfig.cpp:1130 src/libslic3r/PrintConfig.cpp:1183 -#: src/libslic3r/PrintConfig.cpp:1194 src/libslic3r/PrintConfig.cpp:1383 -msgid "mm/s²" -msgstr "mm/s ²" - -#: src/libslic3r/PrintConfig.cpp:176 -msgid "Bridging angle" -msgstr "브릿지 각도" - -#: src/libslic3r/PrintConfig.cpp:178 -msgid "" -"Bridging angle override. If left to zero, the bridging angle will be " -"calculated automatically. Otherwise the provided angle will be used for all " -"bridges. Use 180° for zero angle." -msgstr "" -"브리징 각도 오버라이드(override)값이. 왼쪽으로 0 일 경우 브리징 각도가 자동으" -"로 계산됩니다. 그렇지 않으면 제공된 각도가 모든 브리지에 사용됩니다. 각도 제" -"로는 180 °를 사용하십시오." - -#: src/libslic3r/PrintConfig.cpp:181 src/libslic3r/PrintConfig.cpp:758 -#: src/libslic3r/PrintConfig.cpp:1619 src/libslic3r/PrintConfig.cpp:1629 -#: src/libslic3r/PrintConfig.cpp:1858 src/libslic3r/PrintConfig.cpp:2012 -#: src/libslic3r/PrintConfig.cpp:2197 src/libslic3r/PrintConfig.cpp:2582 -#: src/libslic3r/PrintConfig.cpp:2693 -msgid "°" -msgstr "°" - -#: src/libslic3r/PrintConfig.cpp:187 -msgid "Bridges fan speed" -msgstr "브릿지 팬 속도" - -#: src/libslic3r/PrintConfig.cpp:188 -msgid "This fan speed is enforced during all bridges and overhangs." -msgstr "이 팬 속도는 모든 브릿지 및 오버행 중에 적용됩니다." - -#: src/libslic3r/PrintConfig.cpp:189 src/libslic3r/PrintConfig.cpp:770 -#: src/libslic3r/PrintConfig.cpp:1203 src/libslic3r/PrintConfig.cpp:1266 -#: src/libslic3r/PrintConfig.cpp:1511 src/libslic3r/PrintConfig.cpp:2366 -#: src/libslic3r/PrintConfig.cpp:2623 -msgid "%" -msgstr "%" - -#: src/libslic3r/PrintConfig.cpp:196 -msgid "Bridge flow ratio" -msgstr "브릿지 유량(flow)값" - -#: src/libslic3r/PrintConfig.cpp:198 -msgid "" -"This factor affects the amount of plastic for bridging. You can decrease it " -"slightly to pull the extrudates and prevent sagging, although default " -"settings are usually good and you should experiment with cooling (use a fan) " -"before tweaking this." -msgstr "" -"이 요인은 브리징을위한 플라스틱의 양에 영향을 미칩니다. 압출 성형물을 잡아 당" -"겨 처짐을 방지하기 위해 약간 줄일 수 있지만 기본 설정은 일반적으로 좋지만이 " -"문제를 해결하기 전에 냉각 (팬 사용)을 시도해야합니다." - -#: src/libslic3r/PrintConfig.cpp:208 -msgid "Bridges" -msgstr "브릿지(Bridges)" - -#: src/libslic3r/PrintConfig.cpp:210 -msgid "Speed for printing bridges." -msgstr "브릿지 인쇄 속도." - -#: src/libslic3r/PrintConfig.cpp:211 src/libslic3r/PrintConfig.cpp:592 -#: src/libslic3r/PrintConfig.cpp:600 src/libslic3r/PrintConfig.cpp:609 -#: src/libslic3r/PrintConfig.cpp:617 src/libslic3r/PrintConfig.cpp:644 -#: src/libslic3r/PrintConfig.cpp:663 src/libslic3r/PrintConfig.cpp:899 -#: src/libslic3r/PrintConfig.cpp:1026 src/libslic3r/PrintConfig.cpp:1112 -#: src/libslic3r/PrintConfig.cpp:1148 src/libslic3r/PrintConfig.cpp:1161 -#: src/libslic3r/PrintConfig.cpp:1172 src/libslic3r/PrintConfig.cpp:1225 -#: src/libslic3r/PrintConfig.cpp:1284 src/libslic3r/PrintConfig.cpp:1412 -#: src/libslic3r/PrintConfig.cpp:1586 src/libslic3r/PrintConfig.cpp:1595 -#: src/libslic3r/PrintConfig.cpp:1991 src/libslic3r/PrintConfig.cpp:2104 -msgid "mm/s" -msgstr "mm/s" - -#: src/libslic3r/PrintConfig.cpp:218 -msgid "Brim width" -msgstr "브림 폭" - -#: src/libslic3r/PrintConfig.cpp:219 -msgid "" -"Horizontal width of the brim that will be printed around each object on the " -"first layer." -msgstr "첫 번째 레이어의 각 객체 주위에 인쇄 될 가장자리의 가로 폭입니다." - -#: src/libslic3r/PrintConfig.cpp:226 -msgid "Clip multi-part objects" -msgstr "여러 파트 오브젝트 클립" - -#: src/libslic3r/PrintConfig.cpp:227 -msgid "" -"When printing multi-material objects, this settings will make Slic3r to clip " -"the overlapping object parts one by the other (2nd part will be clipped by " -"the 1st, 3rd part will be clipped by the 1st and 2nd etc)." -msgstr "" -"멀티 메터리얼(multi-material) 개체를 인쇄 할 때이 설정을 사용하면 겹치는 개" -"체 파트를 서로 겹쳐서 잘라낼 수 있습니다 (두 번째 부분은 첫 번째 부분에서 클" -"리핑되며 세 번째 부분은 첫 번째 및 두 번째 부분에서 잘립니다)." - -#: src/libslic3r/PrintConfig.cpp:234 -msgid "Colorprint height" -msgstr "컬러 인쇄 높이" - -#: src/libslic3r/PrintConfig.cpp:235 -msgid "Heights at which a filament change is to occur." -msgstr "필라멘트 체인지가 발생 하는 높이." - -#: src/libslic3r/PrintConfig.cpp:245 -msgid "Compatible printers condition" -msgstr "호환 가능한 프린터 조건" - -#: src/libslic3r/PrintConfig.cpp:246 -msgid "" -"A boolean expression using the configuration values of an active printer " -"profile. If this expression evaluates to true, this profile is considered " -"compatible with the active printer profile." -msgstr "" -"활성 프린터 프로파일의 구성 값을 사용하는 부울 표현식. 이 표현식이 true로 평" -"가되면이 프로필은 활성 프린터 프로필과 호환되는 것으로 간주됩니다." - -#: src/libslic3r/PrintConfig.cpp:260 -msgid "Compatible print profiles condition" -msgstr "호환 되는 인쇄 프로 파일 조건" - -#: src/libslic3r/PrintConfig.cpp:261 -msgid "" -"A boolean expression using the configuration values of an active print " -"profile. If this expression evaluates to true, this profile is considered " -"compatible with the active print profile." -msgstr "" -"활성 인쇄 프로 파일의 구성 값을 사용하는 부울식입니다. 이 식이 true로 평가 되" -"면, 이 프로필이 활성 인쇄 프로필과 호환 되는 것으로 간주 됩니다." - -#: src/libslic3r/PrintConfig.cpp:278 -msgid "Complete individual objects" -msgstr "개별 개체 완성" - -#: src/libslic3r/PrintConfig.cpp:279 -msgid "" -"When printing multiple objects or copies, this feature will complete each " -"object before moving onto next one (and starting it from its bottom layer). " -"This feature is useful to avoid the risk of ruined prints. Slic3r should " -"warn and prevent you from extruder collisions, but beware." -msgstr "" -"여러 객체 또는 사본을 인쇄 할 때이 객체는 다음 객체로 이동하기 전에 각 객체" -"를 완성합니다 (맨 아래 레이어에서 시작). 이 기능은 인쇄물이 망가지는 위험을 " -"피할 때 유용합니다. Slic3r은 압출기 충돌을 경고하고 예방해야하지만 조심하십시" -"오." - -#: src/libslic3r/PrintConfig.cpp:287 -msgid "Enable auto cooling" -msgstr "자동 냉각 사용" - -#: src/libslic3r/PrintConfig.cpp:288 -msgid "" -"This flag enables the automatic cooling logic that adjusts print speed and " -"fan speed according to layer printing time." -msgstr "" -"이 플래그는 레이어 인쇄 시간에 따라 인쇄 속도와 팬 속도를 조정하는 자동 냉각 " -"논리를 활성화합니다." - -#: src/libslic3r/PrintConfig.cpp:293 -msgid "Cooling tube position" -msgstr "냉각 튜브 위치" - -#: src/libslic3r/PrintConfig.cpp:294 -msgid "Distance of the center-point of the cooling tube from the extruder tip." -msgstr "압출기 팁에서 냉각 튜브의 중심점까지의 거리 " - -#: src/libslic3r/PrintConfig.cpp:301 -msgid "Cooling tube length" -msgstr "냉각 튜브 길이" - -#: src/libslic3r/PrintConfig.cpp:302 -msgid "Length of the cooling tube to limit space for cooling moves inside it." -msgstr "내부의 냉각 이동을 위해 공간을 제한하는 냉각 튜브의 길이 " - -#: src/libslic3r/PrintConfig.cpp:310 -msgid "" -"This is the acceleration your printer will be reset to after the role-" -"specific acceleration values are used (perimeter/infill). Set zero to " -"prevent resetting acceleration at all." -msgstr "" -"역할 별 가속도 값이 사용 된 후에 프린터가 재설정되는 속도입니다 (둘레 / 충" -"전). 가속을 전혀 재설정하지 않으려면 0으로 설정하십시오." - -#: src/libslic3r/PrintConfig.cpp:319 -msgid "Default filament profile" -msgstr "기본 필라멘트 프로파일" - -#: src/libslic3r/PrintConfig.cpp:320 -msgid "" -"Default filament profile associated with the current printer profile. On " -"selection of the current printer profile, this filament profile will be " -"activated." -msgstr "" -"현재 프린터 프로파일과 연관된 기본 필라멘트 프로파일. 현재 프린터 프로파일을 " -"선택하면 이 필라멘트 프로파일이 활성화됩니다." - -#: src/libslic3r/PrintConfig.cpp:326 -msgid "Default print profile" -msgstr "기본 인쇄 프로파일" - -#: src/libslic3r/PrintConfig.cpp:327 src/libslic3r/PrintConfig.cpp:2447 -#: src/libslic3r/PrintConfig.cpp:2458 -msgid "" -"Default print profile associated with the current printer profile. On " -"selection of the current printer profile, this print profile will be " -"activated." -msgstr "" -"현재 프린터 프로파일과 연관된 기본 인쇄 프로파일. 현재 프린터 프로파일을 선택" -"하면이 인쇄 프로파일이 활성화됩니다." - -#: src/libslic3r/PrintConfig.cpp:333 -msgid "Disable fan for the first" -msgstr "첫 번째 팬 사용 중지" - -#: src/libslic3r/PrintConfig.cpp:334 -msgid "" -"You can set this to a positive value to disable fan at all during the first " -"layers, so that it does not make adhesion worse." -msgstr "" -"이 값을 양수 값으로 설정하면 첫 번째 레이어에서 팬을 사용하지 않도록 설정하" -"여 접착력을 악화시키지 않습니다." - -#: src/libslic3r/PrintConfig.cpp:336 src/libslic3r/PrintConfig.cpp:971 -#: src/libslic3r/PrintConfig.cpp:1484 src/libslic3r/PrintConfig.cpp:1669 -#: src/libslic3r/PrintConfig.cpp:1730 src/libslic3r/PrintConfig.cpp:1894 -#: src/libslic3r/PrintConfig.cpp:1939 -msgid "layers" -msgstr "레이어" - -#: src/libslic3r/PrintConfig.cpp:343 -msgid "Don't support bridges" -msgstr "서포트와 브릿지를 사용하지 않음" - -#: src/libslic3r/PrintConfig.cpp:345 -msgid "" -"Experimental option for preventing support material from being generated " -"under bridged areas." -msgstr "" -"브릿지 영역 아래에 서포팅 재료가 생성되는 것을 방지하기위한 실험적 옵션." - -#: src/libslic3r/PrintConfig.cpp:351 -msgid "Distance between copies" -msgstr "복사본 간 거리" - -#: src/libslic3r/PrintConfig.cpp:352 -msgid "Distance used for the auto-arrange feature of the plater." -msgstr "플래이터(plater)의 자동 정렬 기능에 사용되는 거리입니다." - -#: src/libslic3r/PrintConfig.cpp:359 -msgid "Elephant foot compensation" -msgstr "코끼리 발(Elephant foot) 보상값" - -#: src/libslic3r/PrintConfig.cpp:361 -msgid "" -"The first layer will be shrunk in the XY plane by the configured value to " -"compensate for the 1st layer squish aka an Elephant Foot effect." -msgstr "" -"첫 번째 레이어는 구성 요소 값에 따라 XY 평면에서 수축되어 일층 스 퀴시 코끼리" -"발(Elephant Foot) 효과를 보완합니다." - -#: src/libslic3r/PrintConfig.cpp:370 -msgid "" -"This end procedure is inserted at the end of the output file. Note that you " -"can use placeholder variables for all Slic3r settings." -msgstr "" -"이 종료 절차는 출력 파일의 끝에 삽입된다. 모든 Slic3r 설정에 자리 표시자 변수" -"를 사용할 수 있다는 점에 유의하십시오." - -#: src/libslic3r/PrintConfig.cpp:380 -msgid "" -"This end procedure is inserted at the end of the output file, before the " -"printer end gcode (and before any toolchange from this filament in case of " -"multimaterial printers). Note that you can use placeholder variables for all " -"Slic3r settings. If you have multiple extruders, the gcode is processed in " -"extruder order." -msgstr "" -"이 종료 절차는 출력 파일의 끝, 프린터 종료 gcode 이전 (및 복합 재료 프린터의 " -"경우이 필라멘트에서 도구를 변경하기 전에)에 삽입됩니다. 모든 Slic3r 설정에 자" -"리 표시 자 변수를 사용할 수 있습니다. 압출기가 여러 개인 경우 gcode는 압출기 " -"순서대로 처리됩니다." - -#: src/libslic3r/PrintConfig.cpp:391 -msgid "Ensure vertical shell thickness" -msgstr "수직 쉘(shell) 두께 확인" - -#: src/libslic3r/PrintConfig.cpp:393 -msgid "" -"Add solid infill near sloping surfaces to guarantee the vertical shell " -"thickness (top+bottom solid layers)." -msgstr "" -"경사 표면 근처에 솔리드 인필을 추가하여 수직 셸 두께(상단+하단 솔리드 레이어)" -"를 보장하십시오." - -#: src/libslic3r/PrintConfig.cpp:399 -msgid "Top fill pattern" -msgstr "상단 채우기 패턴" - -#: src/libslic3r/PrintConfig.cpp:401 -msgid "" -"Fill pattern for top infill. This only affects the top visible layer, and " -"not its adjacent solid shells." -msgstr "" -"상단 채우기의 채우기 패턴. 이는 인접 한 솔리드 쉘이 아니라 보이는 상위 레이어" -"에만 영향을 줍니다." - -#: src/libslic3r/PrintConfig.cpp:409 src/libslic3r/PrintConfig.cpp:821 -#: src/libslic3r/PrintConfig.cpp:1972 -msgid "Rectilinear" -msgstr "직선면(Rectilinear)" - -#: src/libslic3r/PrintConfig.cpp:410 src/libslic3r/PrintConfig.cpp:827 -msgid "Concentric" -msgstr "동심원(Concentric)" - -#: src/libslic3r/PrintConfig.cpp:411 src/libslic3r/PrintConfig.cpp:831 -msgid "Hilbert Curve" -msgstr "힐버트 곡선(Hilbert Curve)" - -#: src/libslic3r/PrintConfig.cpp:412 src/libslic3r/PrintConfig.cpp:832 -msgid "Archimedean Chords" -msgstr "아르키메데우스(Archimedean Chords)" - -#: src/libslic3r/PrintConfig.cpp:413 src/libslic3r/PrintConfig.cpp:833 -msgid "Octagram Spiral" -msgstr "옥타그램 나선(Octagram Spiral)" - -#: src/libslic3r/PrintConfig.cpp:419 -msgid "Bottom fill pattern" -msgstr "아래쪽 채우기 패턴" - -#: src/libslic3r/PrintConfig.cpp:421 -msgid "" -"Fill pattern for bottom infill. This only affects the bottom external " -"visible layer, and not its adjacent solid shells." -msgstr "" -"하단 채우기의 채우기 패턴. 이는 인접 한 솔리드 쉘이 아니라 아래쪽에 보이는 외" -"부 레이어에만 영향을 줍니다." - -#: src/libslic3r/PrintConfig.cpp:430 src/libslic3r/PrintConfig.cpp:440 -msgid "External perimeters" -msgstr "외측 둘레" - -#: src/libslic3r/PrintConfig.cpp:432 -msgid "" -"Set this to a non-zero value to set a manual extrusion width for external " -"perimeters. If left zero, default extrusion width will be used if set, " -"otherwise 1.125 x nozzle diameter will be used. If expressed as percentage " -"(for example 200%), it will be computed over layer height." -msgstr "" -"외부 경계에 대한 수동 압출 폭을 설정하려면 이 값을 0이 아닌 값으로 설정하십시" -"오. 0인 경우 기본 압출 너비가 사용되며, 그렇지 않으면 1.125 x 노즐 직경이 사" -"용된다. 백분율(예: 200%)로 표현되는 경우, 레이어 높이에 걸쳐 계산됩니다." - -#: src/libslic3r/PrintConfig.cpp:435 src/libslic3r/PrintConfig.cpp:543 -#: src/libslic3r/PrintConfig.cpp:860 src/libslic3r/PrintConfig.cpp:872 -#: src/libslic3r/PrintConfig.cpp:992 src/libslic3r/PrintConfig.cpp:1017 -#: src/libslic3r/PrintConfig.cpp:1403 src/libslic3r/PrintConfig.cpp:1741 -#: src/libslic3r/PrintConfig.cpp:1847 src/libslic3r/PrintConfig.cpp:1915 -#: src/libslic3r/PrintConfig.cpp:2074 -msgid "mm or %" -msgstr "mm/s 또는 %" - -#: src/libslic3r/PrintConfig.cpp:442 -msgid "" -"This separate setting will affect the speed of external perimeters (the " -"visible ones). If expressed as percentage (for example: 80%) it will be " -"calculated on the perimeters speed setting above. Set to zero for auto." -msgstr "" -"이 별도의 설정은 외부 경계선(시각적 경계선)의 속도에 영향을 미친다. 백분율" -"(예: 80%)로 표현되는 경우 위의 Perimeter 속도 설정에 따라 계산된다. 자동을 위" -"해 0으로 설정한다." - -#: src/libslic3r/PrintConfig.cpp:445 src/libslic3r/PrintConfig.cpp:881 -#: src/libslic3r/PrintConfig.cpp:1700 src/libslic3r/PrintConfig.cpp:1751 -#: src/libslic3r/PrintConfig.cpp:1958 src/libslic3r/PrintConfig.cpp:2086 -msgid "mm/s or %" -msgstr "mm/s 또는 %" - -#: src/libslic3r/PrintConfig.cpp:452 -msgid "External perimeters first" -msgstr "외부 경계선 먼저" - -#: src/libslic3r/PrintConfig.cpp:454 -msgid "" -"Print contour perimeters from the outermost one to the innermost one instead " -"of the default inverse order." -msgstr "" -"기본 역순 대신 가장 바깥쪽부터 가장 안쪽까지 윤곽선을 인쇄하십시오. 타겟 TTS" -"복사하기번역 저장번역 저장번역 수정." - -#: src/libslic3r/PrintConfig.cpp:460 -msgid "Extra perimeters if needed" -msgstr "필요한 경우 추가 둘레" - -#: src/libslic3r/PrintConfig.cpp:462 -#, c-format -msgid "" -"Add more perimeters when needed for avoiding gaps in sloping walls. Slic3r " -"keeps adding perimeters, until more than 70% of the loop immediately above " -"is supported." -msgstr "" -"경사 벽의 틈을 피하기 위해 필요한 경우 더 많은 둘래(perimeter)를 추가하십시" -"오. 위의 루프의 70% of 이상이 지지될 때까지 Slic3r는 계속해서 둘ㄹ를 추가한" -"다." - -#: src/libslic3r/PrintConfig.cpp:472 -msgid "" -"The extruder to use (unless more specific extruder settings are specified). " -"This value overrides perimeter and infill extruders, but not the support " -"extruders." -msgstr "" -"사용할 압출부(더 구체적인 압출부 설정이 지정되지 않은 경우) 이 값은 경계 및 " -"압출부를 초과하지만 지원 압출자를 주입하지는 않는다." - -#: src/libslic3r/PrintConfig.cpp:484 -msgid "" -"Set this to the vertical distance between your nozzle tip and (usually) the " -"X carriage rods. In other words, this is the height of the clearance " -"cylinder around your extruder, and it represents the maximum depth the " -"extruder can peek before colliding with other printed objects." -msgstr "" -"이것을 노즐 팁과 (일반적으로) X 캐리지 로드 사이의 수직 거리로 설정하십시오. " -"다시 말하면, 이것은 당신의 압출기 주위의 틈새 실린더의 높이이며, 그것은 다른 " -"인쇄된 물체와 충돌하기 전에 압출기가 엿볼 수 있는 최대 깊이를 나타낸다." - -#: src/libslic3r/PrintConfig.cpp:494 -msgid "Radius" -msgstr "반지름" - -#: src/libslic3r/PrintConfig.cpp:495 -msgid "" -"Set this to the clearance radius around your extruder. If the extruder is " -"not centered, choose the largest value for safety. This setting is used to " -"check for collisions and to display the graphical preview in the plater." -msgstr "" -"이것을 당신의 압출기 주변의 간극 반경으로 설정하시오. 압출부가 중앙에 있지 않" -"으면 안전을 위해 가장 큰 값을 선택하십시오. 이 설정은 충돌 여부를 확인하고 플" -"래터에 그래픽 미리 보기를 표시하기 위해 사용된다." - -#: src/libslic3r/PrintConfig.cpp:505 -msgid "Extruder Color" -msgstr "익스트루더 컬러" - -#: src/libslic3r/PrintConfig.cpp:506 src/libslic3r/PrintConfig.cpp:566 -msgid "This is only used in the Slic3r interface as a visual help." -msgstr "이것은 시각적 도움말로 Slic3r 인터페이스에서만 사용된다." - -#: src/libslic3r/PrintConfig.cpp:512 -msgid "Extruder offset" -msgstr "익스트루더 오프셋" - -#: src/libslic3r/PrintConfig.cpp:513 -msgid "" -"If your firmware doesn't handle the extruder displacement you need the G-" -"code to take it into account. This option lets you specify the displacement " -"of each extruder with respect to the first one. It expects positive " -"coordinates (they will be subtracted from the XY coordinate)." -msgstr "" -"펌웨어가 압출기 위치 변경을 처리하지 못하면 G 코드를 고려해야합니다. 이 옵션" -"을 사용하면 첫 번째 것에 대한 각 압출기의 변위를 지정할 수 있습니다. 양의 좌" -"표가 필요합니다 (XY 좌표에서 뺍니다)." - -#: src/libslic3r/PrintConfig.cpp:522 -msgid "Extrusion axis" -msgstr "압출 축" - -#: src/libslic3r/PrintConfig.cpp:523 -msgid "" -"Use this option to set the axis letter associated to your printer's extruder " -"(usually E but some printers use A)." -msgstr "" -"이 옵션을 사용하여 프린터의 압출기에 연결된 축 문자를 설정합니다 (보통 E이지" -"만 일부 프린터는 A를 사용합니다)." - -#: src/libslic3r/PrintConfig.cpp:528 -msgid "Extrusion multiplier" -msgstr "압출 승수" - -#: src/libslic3r/PrintConfig.cpp:529 -msgid "" -"This factor changes the amount of flow proportionally. You may need to tweak " -"this setting to get nice surface finish and correct single wall widths. " -"Usual values are between 0.9 and 1.1. If you think you need to change this " -"more, check filament diameter and your firmware E steps." -msgstr "" -"이 요소는 비례하여 유량의 양을 변경합니다. 멋진 서페이스 마무리와 단일 벽 너" -"비를 얻기 위해이 설정을 조정해야 할 수도 있습니다. 일반적인 값은 0.9와 1.1 사" -"이입니다. 이 값을 더 변경해야한다고 판단되면 필라멘트 직경과 펌웨어 E 단계를 " -"확인하십시오." - -#: src/libslic3r/PrintConfig.cpp:537 -msgid "Default extrusion width" -msgstr "기본 압출 폭" - -#: src/libslic3r/PrintConfig.cpp:539 -msgid "" -"Set this to a non-zero value to allow a manual extrusion width. If left to " -"zero, Slic3r derives extrusion widths from the nozzle diameter (see the " -"tooltips for perimeter extrusion width, infill extrusion width etc). If " -"expressed as percentage (for example: 230%), it will be computed over layer " -"height." -msgstr "" -"수동 압출 폭을 허용하려면이 값을 0이 아닌 값으로 설정하십시오. 0으로 남겨두" -"면 Slic3r은 노즐 직경에서 압출 폭을 도출합니다 (주변 압출 폭, 성형 압출 폭 등" -"의 툴팁 참조). 백분율로 표시되는 경우 (예 : 230 %) 레이어 높이를 기준으로 계" -"산됩니다." - -#: src/libslic3r/PrintConfig.cpp:548 -msgid "Keep fan always on" -msgstr "항상 팬 켜기" - -#: src/libslic3r/PrintConfig.cpp:549 -msgid "" -"If this is enabled, fan will never be disabled and will be kept running at " -"least at its minimum speed. Useful for PLA, harmful for ABS." -msgstr "" -"이 기능을 사용하면 팬이 비활성화되지 않으며 최소한 최소 속도로 계속 회전합니" -"다. PLA에 유용하며 ABS에 해롭다." - -#: src/libslic3r/PrintConfig.cpp:554 -msgid "Enable fan if layer print time is below" -msgstr "레이어 인쇄 시간이 미만인 경우 팬 활성화" - -#: src/libslic3r/PrintConfig.cpp:555 -msgid "" -"If layer print time is estimated below this number of seconds, fan will be " -"enabled and its speed will be calculated by interpolating the minimum and " -"maximum speeds." -msgstr "" -"레이어 인쇄 시간이이 초 미만으로 예상되는 경우 팬이 활성화되고 속도는 최소 " -"및 최대 속도를 보간하여 계산됩니다." - -#: src/libslic3r/PrintConfig.cpp:557 src/libslic3r/PrintConfig.cpp:1687 -msgid "approximate seconds" -msgstr "근사치 초" - -#: src/libslic3r/PrintConfig.cpp:565 -msgid "Color" -msgstr "색상" - -#: src/libslic3r/PrintConfig.cpp:571 -msgid "Filament notes" -msgstr "필라멘트 메모" - -#: src/libslic3r/PrintConfig.cpp:572 -msgid "You can put your notes regarding the filament here." -msgstr "여기에 필라멘트에 관한 메모를 넣을 수 있다." - -#: src/libslic3r/PrintConfig.cpp:580 src/libslic3r/PrintConfig.cpp:1231 -msgid "Max volumetric speed" -msgstr "최대 체적 속도" - -#: src/libslic3r/PrintConfig.cpp:581 -msgid "" -"Maximum volumetric speed allowed for this filament. Limits the maximum " -"volumetric speed of a print to the minimum of print and filament volumetric " -"speed. Set to zero for no limit." -msgstr "" -"이 필라멘트에 허용되는 최대 체적 속도. 인쇄물의 최대 체적 속도를 인쇄 및 필라" -"멘트 체적 속도 최소로 제한한다. 제한 없음에 대해 0으로 설정하십시오." - -#: src/libslic3r/PrintConfig.cpp:590 -msgid "Loading speed" -msgstr "로딩 속도" - -#: src/libslic3r/PrintConfig.cpp:591 -msgid "Speed used for loading the filament on the wipe tower." -msgstr "와이퍼 탑(wipe)에 필라멘트를 장착하는 데 사용되는 속도. " - -#: src/libslic3r/PrintConfig.cpp:598 -msgid "Loading speed at the start" -msgstr "시작시 로딩 속도" - -#: src/libslic3r/PrintConfig.cpp:599 -msgid "Speed used at the very beginning of loading phase." -msgstr "로딩 단계의 시작에 사용 되는 속도." - -#: src/libslic3r/PrintConfig.cpp:606 -msgid "Unloading speed" -msgstr "언로딩 스피드" - -#: src/libslic3r/PrintConfig.cpp:607 -msgid "" -"Speed used for unloading the filament on the wipe tower (does not affect " -"initial part of unloading just after ramming)." -msgstr "" -"와이퍼 타워에서 필라멘트를 언로드하는 데 사용되는 속도(램핑 후 바로 언로딩의 " -"초기 부분에는 영향을 주지 않음)." - -#: src/libslic3r/PrintConfig.cpp:615 -msgid "Unloading speed at the start" -msgstr "시작 시 언로드 속도" - -#: src/libslic3r/PrintConfig.cpp:616 -msgid "" -"Speed used for unloading the tip of the filament immediately after ramming." -msgstr "속도는 램 밍 직후 필 라 멘 트의 팁을 언로딩 하는 데 사용 됩니다." - -#: src/libslic3r/PrintConfig.cpp:623 -msgid "Delay after unloading" -msgstr "언로드 후 딜레이" - -#: src/libslic3r/PrintConfig.cpp:624 -msgid "" -"Time to wait after the filament is unloaded. May help to get reliable " -"toolchanges with flexible materials that may need more time to shrink to " -"original dimensions." -msgstr "" -"필라멘트를 내린 후 기다리는 시간. 원래 치수로 축소하는 데, 더 많은 시간이 필" -"요할 수 있는 유연한 재료로 신뢰할 수있는 공구 교환을 얻을 수 있습니다." - -#: src/libslic3r/PrintConfig.cpp:633 -msgid "Number of cooling moves" -msgstr "쿨링 이동 숫자" - -#: src/libslic3r/PrintConfig.cpp:634 -msgid "" -"Filament is cooled by being moved back and forth in the cooling tubes. " -"Specify desired number of these moves." -msgstr "" -"필라멘트는 쿨링 튜브에서 앞뒤로 이동 하여 냉각 됩니다. 이러한 이동의 원하는 " -"값을 지정 합니다." - -#: src/libslic3r/PrintConfig.cpp:642 -msgid "Speed of the first cooling move" -msgstr "첫 번째 냉각 이동 속도" - -#: src/libslic3r/PrintConfig.cpp:643 -msgid "Cooling moves are gradually accelerating beginning at this speed." -msgstr "냉각 속도가 서서히 빨라지고 있습니다." - -#: src/libslic3r/PrintConfig.cpp:650 -msgid "Minimal purge on wipe tower" -msgstr "와이프(wipe) 탑의 최소 퍼지" - -#: src/libslic3r/PrintConfig.cpp:651 -msgid "" -"After a tool change, the exact position of the newly loaded filament inside " -"the nozzle may not be known, and the filament pressure is likely not yet " -"stable. Before purging the print head into an infill or a sacrificial " -"object, Slic3r will always prime this amount of material into the wipe tower " -"to produce successive infill or sacrificial object extrusions reliably." -msgstr "" -"공구가 변경 된 후 노즐 내부에 새로 로드 된 필라멘트의 정확한 위치를 알 수 없" -"으며, 필라멘트 압력이 아직 안정적이지 않을 수 있습니다. 프린트 헤드를 인필 또" -"는 희생(sacrificial) 객체로 소거 하기 전에 Slic3r는 항상이 양의 재료를 와이" -"프 탑에 넣어 연속적인 채우기 또는 희생(sacrificial) 객체 돌출을 안정적으로 생" -"성 합니다." - -#: src/libslic3r/PrintConfig.cpp:655 -msgid "mm³" -msgstr "mm ³" - -#: src/libslic3r/PrintConfig.cpp:661 -msgid "Speed of the last cooling move" -msgstr "마지막 냉각 이동 속도" - -#: src/libslic3r/PrintConfig.cpp:662 -msgid "Cooling moves are gradually accelerating towards this speed." -msgstr "냉각은 이 속도쪽으로 점차 가속화되고 있습니다. " - -#: src/libslic3r/PrintConfig.cpp:669 -msgid "Filament load time" -msgstr "필라멘트 로드 시간" - -#: src/libslic3r/PrintConfig.cpp:670 -msgid "" -"Time for the printer firmware (or the Multi Material Unit 2.0) to load a new " -"filament during a tool change (when executing the T code). This time is " -"added to the total print time by the G-code time estimator." -msgstr "" -"프린터 펌웨어 (또는 MMU 2.0)가 공구를 변경하는 동안(T 코드를 실행할 때) 새필" -"라멘트를 로드하는 시간입니다. 이 시간은 G 코드 시간 추정기에 의해 총 인쇄 시" -"간에 추가 됩니다." - -#: src/libslic3r/PrintConfig.cpp:677 -msgid "Ramming parameters" -msgstr "래밍 파라미터" - -#: src/libslic3r/PrintConfig.cpp:678 -msgid "" -"This string is edited by RammingDialog and contains ramming specific " -"parameters." -msgstr "" -"이 문자열은 RammingDialog에 의해 편집되고 래밍 특정 매개 변수를 포함합니다." - -#: src/libslic3r/PrintConfig.cpp:684 -msgid "Filament unload time" -msgstr "필라멘트 언로드 시간" - -#: src/libslic3r/PrintConfig.cpp:685 -msgid "" -"Time for the printer firmware (or the Multi Material Unit 2.0) to unload a " -"filament during a tool change (when executing the T code). This time is " -"added to the total print time by the G-code time estimator." -msgstr "" -"프린터 펌웨어 (또는 MMU2.0)가 공구 교환 중에 필라멘트를 언로드하기 위한 시간" -"입니다 (T 코드를 실행할 때). 이 시간은 G 코드 시간추정기에 의해 총 인쇄 시간" -"에 추가 됩니다." - -#: src/libslic3r/PrintConfig.cpp:693 -msgid "" -"Enter your filament diameter here. Good precision is required, so use a " -"caliper and do multiple measurements along the filament, then compute the " -"average." -msgstr "" -"여기에 필라멘트 직경을 입력하십시오. 정밀도가 필요하므로 캘리퍼를 사용하여 필" -"라멘트를 따라 여러 번 측정 한 다음 평균을 계산하십시오." - -#: src/libslic3r/PrintConfig.cpp:700 -msgid "Density" -msgstr "밀도" - -#: src/libslic3r/PrintConfig.cpp:701 -msgid "" -"Enter your filament density here. This is only for statistical information. " -"A decent way is to weigh a known length of filament and compute the ratio of " -"the length to volume. Better is to calculate the volume directly through " -"displacement." -msgstr "" -"여기서 필라멘트 밀도를 입력하십시오. 이것은 통계 정보 용입니다. 괜찮은 방법" -"은 알려진 길이의 필라멘트의 무게를 측정하고 길이와 볼륨의 비율을 계산하는 것" -"입니다. 변위를 통해 직접적으로 부피를 계산하는 것이 더 좋습니다." - -#: src/libslic3r/PrintConfig.cpp:704 -msgid "g/cm³" -msgstr "g/cm³" - -#: src/libslic3r/PrintConfig.cpp:709 -msgid "Filament type" -msgstr "필라멘트 타입" - -#: src/libslic3r/PrintConfig.cpp:710 -msgid "The filament material type for use in custom G-codes." -msgstr "사용자 지정 G 코드에 사용할 필라멘트재료 유형입니다." - -#: src/libslic3r/PrintConfig.cpp:736 -msgid "Soluble material" -msgstr "수용성 재료" - -#: src/libslic3r/PrintConfig.cpp:737 -msgid "Soluble material is most likely used for a soluble support." -msgstr "수용성 재료눈 물에 녹는 서포트에 가장 많이 사용된다." - -#: src/libslic3r/PrintConfig.cpp:743 -msgid "" -"Enter your filament cost per kg here. This is only for statistical " -"information." -msgstr "필라멘트(kg당) 비용을 여기에 입력하십시오. 통계를 내기 위해서 입니다." - -#: src/libslic3r/PrintConfig.cpp:744 -msgid "money/kg" -msgstr "원(\\)/kg" - -#: src/libslic3r/PrintConfig.cpp:753 -msgid "Fill angle" -msgstr "채움 각도" - -#: src/libslic3r/PrintConfig.cpp:755 -msgid "" -"Default base angle for infill orientation. Cross-hatching will be applied to " -"this. Bridges will be infilled using the best direction Slic3r can detect, " -"so this setting does not affect them." -msgstr "" -"본 오리엔테이션 방향의 기본 각도입니다. 해칭이 적용될 것입니다. Slic3r이 감" -"지 할 수있는 최상의 방향을 사용하여 브릿징이 채워지므로이 설정은 영향을 미치" -"지 않습니다." - -#: src/libslic3r/PrintConfig.cpp:767 -msgid "Fill density" -msgstr "채우기(fill) 밀도" - -#: src/libslic3r/PrintConfig.cpp:769 -msgid "Density of internal infill, expressed in the range 0% - 100%." -msgstr "0 % - 100 % 범위로 표현 된 내부 채움(infill)의 밀도." - -#: src/libslic3r/PrintConfig.cpp:804 -msgid "Fill pattern" -msgstr "채우기(fill) 패턴" - -#: src/libslic3r/PrintConfig.cpp:806 -msgid "Fill pattern for general low-density infill." -msgstr "일반 낮은 밀도 채움의 패턴." - -#: src/libslic3r/PrintConfig.cpp:822 -msgid "Grid" -msgstr "그리드(Grid)" - -#: src/libslic3r/PrintConfig.cpp:823 -msgid "Triangles" -msgstr "삼각형(Triangles)" - -#: src/libslic3r/PrintConfig.cpp:824 -msgid "Stars" -msgstr "별(Stars)" - -#: src/libslic3r/PrintConfig.cpp:825 -msgid "Cubic" -msgstr "큐빅" - -#: src/libslic3r/PrintConfig.cpp:826 -msgid "Line" -msgstr "선(Line)" - -#: src/libslic3r/PrintConfig.cpp:828 src/libslic3r/PrintConfig.cpp:1974 -msgid "Honeycomb" -msgstr "벌집" - -#: src/libslic3r/PrintConfig.cpp:829 -msgid "3D Honeycomb" -msgstr "3D 벌집" - -#: src/libslic3r/PrintConfig.cpp:830 -msgid "Gyroid" -msgstr "자이로이드(Gyroid)" - -#: src/libslic3r/PrintConfig.cpp:837 src/libslic3r/PrintConfig.cpp:846 -#: src/libslic3r/PrintConfig.cpp:854 src/libslic3r/PrintConfig.cpp:887 -msgid "First layer" -msgstr "첫 레이어" - -#: src/libslic3r/PrintConfig.cpp:838 -msgid "" -"This is the acceleration your printer will use for first layer. Set zero to " -"disable acceleration control for first layer." -msgstr "" -"이것은 프린터가 첫 번째 레이어에 사용할 가속도입니다. 0을 설정하면 첫 번째 레" -"이어에 대한 가속 제어가 사용되지 않습니다." - -#: src/libslic3r/PrintConfig.cpp:847 -msgid "" -"Heated build plate temperature for the first layer. Set this to zero to " -"disable bed temperature control commands in the output." -msgstr "" -"첫 번째 레이어에 대한 빌드 플레이트 온도를 가열. 이 값을 0으로 설정하면 출력" -"에서 ​​베드 온도 제어 명령을 비활성화합니다." - -#: src/libslic3r/PrintConfig.cpp:856 -msgid "" -"Set this to a non-zero value to set a manual extrusion width for first " -"layer. You can use this to force fatter extrudates for better adhesion. If " -"expressed as percentage (for example 120%) it will be computed over first " -"layer height. If set to zero, it will use the default extrusion width." -msgstr "" -"첫 번째 레이어의 수동 압출 폭을 설정하려면이 값을 0이 아닌 값으로 설정합니" -"다. 이 방법을 사용하면보다 우수한 접착력을 위해 더 두꺼운 압출 성형물을 만들 " -"수 있습니다. 백분율 (예 : 120 %)로 표현하면 첫 번째 레이어 높이를 기준으로 계" -"산됩니다. 0으로 설정하면 기본 압출 폭이 사용됩니다." - -#: src/libslic3r/PrintConfig.cpp:868 -msgid "" -"When printing with very low layer heights, you might still want to print a " -"thicker bottom layer to improve adhesion and tolerance for non perfect build " -"plates. This can be expressed as an absolute value or as a percentage (for " -"example: 150%) over the default layer height." -msgstr "" -"매우 낮은 층의 높이로 인쇄할 때, 당신은 여전히 완벽하지 않은 빌드 플레이트의 " -"부착력과 허용오차를 개선하기 위해 더 두꺼운 바닥 층을 인쇄하기를 원할 수 있" -"다. 이것은 절대값 또는 기본 계층 높이에 대한 백분율(예: 150%)로 표시할 수 있" -"다." - -#: src/libslic3r/PrintConfig.cpp:877 -msgid "First layer speed" -msgstr "첫 레이어 속도" - -#: src/libslic3r/PrintConfig.cpp:878 -msgid "" -"If expressed as absolute value in mm/s, this speed will be applied to all " -"the print moves of the first layer, regardless of their type. If expressed " -"as a percentage (for example: 40%) it will scale the default speeds." -msgstr "" -"절대값(mm/s)으로 표현되는 경우, 이 속도는 유형에 관계없이 첫 번째 층의 모든 " -"인쇄 이동에 적용된다. 백분율(예: 40%)로 표현되는 경우 기본 속도를 스케일링한" -"다." - -#: src/libslic3r/PrintConfig.cpp:888 -msgid "" -"Extruder temperature for first layer. If you want to control temperature " -"manually during print, set this to zero to disable temperature control " -"commands in the output file." -msgstr "" -"첫 번째 층의 외부 온도. 인쇄 중에 온도를 수동으로 제어하려면 출력 파일에서 온" -"도 제어 명령을 사용하지 않으려면 이 값을 0으로 설정하십시오." - -#: src/libslic3r/PrintConfig.cpp:897 -msgid "" -"Speed for filling small gaps using short zigzag moves. Keep this reasonably " -"low to avoid too much shaking and resonance issues. Set zero to disable gaps " -"filling." -msgstr "" -"짧은 지그재그로 작은 틈을 메우기 위한 속도. 너무 많은 진동과 공진 문제를 피하" -"기 위해 이것을 합리적으로 낮게 유지한다. 간격 채우기를 사용하지 않으려면 0을 " -"설정하십시오." - -#: src/libslic3r/PrintConfig.cpp:905 -msgid "Verbose G-code" -msgstr "세부 G-코드" - -#: src/libslic3r/PrintConfig.cpp:906 -msgid "" -"Enable this to get a commented G-code file, with each line explained by a " -"descriptive text. If you print from SD card, the additional weight of the " -"file could make your firmware slow down." -msgstr "" -"설명 텍스트로 설명되는 각 행과 함께 코멘트된 G-code 파일을 가져오려면 이 옵션" -"을 선택하십시오. 만일 당신이 SD카드로 인쇄한다면, 파일의 추가 무게로 인해 펌" -"웨어의 속도가 느려질 수 있다." - -#: src/libslic3r/PrintConfig.cpp:913 -msgid "G-code flavor" -msgstr "G-code 형식" - -#: src/libslic3r/PrintConfig.cpp:914 -msgid "" -"Some G/M-code commands, including temperature control and others, are not " -"universal. Set this option to your printer's firmware to get a compatible " -"output. The \"No extrusion\" flavor prevents Slic3r from exporting any " -"extrusion value at all." -msgstr "" -"온도 조절 등을 포함한 일부 G/M-코드 명령은 보편적이지 않습니다. 호환되는 출력" -"을 얻으려면 보드에 적제된 프린터의 펌웨어로 설정하십시오. \"압출 없음\" 형식" -"은 Slic3r가 어떠한 압출 값도 출력하지 못하게 합니다." - -#: src/libslic3r/PrintConfig.cpp:937 -msgid "No extrusion" -msgstr "압출 없음" - -#: src/libslic3r/PrintConfig.cpp:942 -msgid "Label objects" -msgstr "레이블 개체" - -#: src/libslic3r/PrintConfig.cpp:943 -msgid "" -"Enable this to add comments into the G-Code labeling print moves with what " -"object they belong to, which is useful for the Octoprint CancelObject " -"plugin. This settings is NOT compatible with Single Extruder Multi Material " -"setup and Wipe into Object / Wipe into Infill." -msgstr "" -"이 기능을 사용 하 여 G 코드 레이블 인쇄에 주석이 속해 있는 객체와 함께 이동 " -"하 여 주석을 추가할 수 있으며,이는 옥 토 프린트 캔 커 작업 플러그인에 유용 합" -"니다. 이 설정은 단일 압출 기 다중 재료 설정과 호환 되지 않으며 객체를 닦아 " -"내 고 채우기로 닦습니다." - -#: src/libslic3r/PrintConfig.cpp:950 -msgid "High extruder current on filament swap" -msgstr "필라멘트스왑에 높은 압출 기 전류" - -#: src/libslic3r/PrintConfig.cpp:951 -msgid "" -"It may be beneficial to increase the extruder motor current during the " -"filament exchange sequence to allow for rapid ramming feed rates and to " -"overcome resistance when loading a filament with an ugly shaped tip." -msgstr "" -"필라멘트 교환 동안 압출기 모터 전류를 증가 시키는 것이 유리할 수 있으며, 이" -"는 빠른 래밍 공급 속도를 가능 하게하고, 불규칙한 모양의 필라멘트를 로딩할때 " -"저항을 극복하기 위한것이다." - -#: src/libslic3r/PrintConfig.cpp:959 -msgid "" -"This is the acceleration your printer will use for infill. Set zero to " -"disable acceleration control for infill." -msgstr "" -"이것은 당신 프린터의 채움 가속력이다. 주입에 대한 가속 제어를 비활성화하려면 " -"0을 설정하십시오." - -#: src/libslic3r/PrintConfig.cpp:967 -msgid "Combine infill every" -msgstr "다음 시간마다 결합" - -#: src/libslic3r/PrintConfig.cpp:969 -msgid "" -"This feature allows to combine infill and speed up your print by extruding " -"thicker infill layers while preserving thin perimeters, thus accuracy." -msgstr "" -"이 기능은 인필을 결합하고 얇은 주변기기를 보존하면서 두꺼운 인필 층을 압출하" -"여 인쇄 속도를 높일 수 있도록 하여 정확도를 높인다." - -#: src/libslic3r/PrintConfig.cpp:972 -msgid "Combine infill every n layers" -msgstr "모든 n개 층을 채우기 위해 결합" - -#: src/libslic3r/PrintConfig.cpp:978 -msgid "Infill extruder" -msgstr "채움(Infill) 익스트루더" - -#: src/libslic3r/PrintConfig.cpp:980 -msgid "The extruder to use when printing infill." -msgstr "채움으로 사용할 익스트루더." - -#: src/libslic3r/PrintConfig.cpp:988 -msgid "" -"Set this to a non-zero value to set a manual extrusion width for infill. If " -"left zero, default extrusion width will be used if set, otherwise 1.125 x " -"nozzle diameter will be used. You may want to use fatter extrudates to speed " -"up the infill and make your parts stronger. If expressed as percentage (for " -"example 90%) it will be computed over layer height." -msgstr "" -"채움에 수동 압출 폭을 설정하려면이 값을 0이 아닌 값으로 설정합니다. 0으로 설" -"정하면 설정된 경우 기본 압출 폭이 사용되고 그렇지 않으면 1.125 x 노즐 직경이 " -"사용됩니다. 채움 속도를 높이고 부품을 더 강하게 만들려면보다 큰 압출 성형물" -"을 사용하는 것이 좋습니다. 백분율 (예 : 90 %)로 표현하면 레이어 높이를 기준으" -"로 계산됩니다." - -#: src/libslic3r/PrintConfig.cpp:997 -msgid "Infill before perimeters" -msgstr "둘레보다 앞쪽에 채움" - -#: src/libslic3r/PrintConfig.cpp:998 -msgid "" -"This option will switch the print order of perimeters and infill, making the " -"latter first." -msgstr "이 옵션은 외부출력과 채움 인쇄 순서를 바꾸어, 후자를 먼저 만든다." - -#: src/libslic3r/PrintConfig.cpp:1003 -msgid "Only infill where needed" -msgstr "필요한 경우 채음" - -#: src/libslic3r/PrintConfig.cpp:1005 -msgid "" -"This option will limit infill to the areas actually needed for supporting " -"ceilings (it will act as internal support material). If enabled, slows down " -"the G-code generation due to the multiple checks involved." -msgstr "" -"이 옵션은 천장 지원에 실제로 필요한 영역에만 적용된다(내부 서포트 재료 역할" -"을 할 것이다). 활성화된 경우 관련된 여러 번의 점검으로 인해 G-code 생성 속도" -"를 늦춰라." - -#: src/libslic3r/PrintConfig.cpp:1012 -msgid "Infill/perimeters overlap" -msgstr "채움/둘레 겹침(perimeters overlap)" - -#: src/libslic3r/PrintConfig.cpp:1014 -msgid "" -"This setting applies an additional overlap between infill and perimeters for " -"better bonding. Theoretically this shouldn't be needed, but backlash might " -"cause gaps. If expressed as percentage (example: 15%) it is calculated over " -"perimeter extrusion width." -msgstr "" -"이 설정은 더 나은 본딩을 위해 충전 및 둘레 사이에 추가 겹침을 적용합니다. 이" -"론적으로 이것은 필요하지 않아야하지만 백래시가 갭을 유발할 수 있습니다. 백분" -"율 (예 : 15 %)로 표시되는 경우 경계 압출 폭을 기준으로 계산됩니다." - -#: src/libslic3r/PrintConfig.cpp:1025 -msgid "Speed for printing the internal fill. Set to zero for auto." -msgstr "내부 채우기 인쇄 속도. 자동으로 0으로 설정하십시오." - -#: src/libslic3r/PrintConfig.cpp:1033 -msgid "Inherits profile" -msgstr "프로필 상속" - -#: src/libslic3r/PrintConfig.cpp:1034 -msgid "Name of the profile, from which this profile inherits." -msgstr "이 프로파일이 상속되는 프로파일의 이름." - -#: src/libslic3r/PrintConfig.cpp:1047 -msgid "Interface shells" -msgstr "인터페이스 셸(shells)" - -#: src/libslic3r/PrintConfig.cpp:1048 -msgid "" -"Force the generation of solid shells between adjacent materials/volumes. " -"Useful for multi-extruder prints with translucent materials or manual " -"soluble support material." -msgstr "" -"인접 재료/볼륨 사이에 고체 쉘 생성을 강제하십시오. 반투명 재료 또는 수동 수용" -"성 서포트 재료를 사용한 다중 압ㅊ기 인쇄에 유용함." - -#: src/libslic3r/PrintConfig.cpp:1057 -msgid "" -"This custom code is inserted at every layer change, right after the Z move " -"and before the extruder moves to the first layer point. Note that you can " -"use placeholder variables for all Slic3r settings as well as [layer_num] and " -"[layer_z]." -msgstr "" -"이 사용자 정의 코드는 Z 이동 직후와 압출부가 첫 번째 레이어 포인트로 이동하" -"기 전에 모든 레이어 변경 시 삽입된다. 모든 Slic3r 설정뿐만 아니라 " -"[layer_num] 및 [layer_z]에 자리 표시자 변수를 사용할 수 있다는 점에 유의하십" -"시오." - -#: src/libslic3r/PrintConfig.cpp:1068 -msgid "Supports remaining times" -msgstr "남은 시간 지원" - -#: src/libslic3r/PrintConfig.cpp:1069 -msgid "" -"Emit M73 P[percent printed] R[remaining time in minutes] at 1 minute " -"intervals into the G-code to let the firmware show accurate remaining time. " -"As of now only the Prusa i3 MK3 firmware recognizes M73. Also the i3 MK3 " -"firmware supports M73 Qxx Sxx for the silent mode." -msgstr "" -"G 코드에 1 분 간격으로 M73 P [퍼센트 인쇄] R[remaining time in minutes]을 방" -"출하여 펌웨어가 정확한 잔여 시간을 표시 하도록 합니다. 현재만 Prusa i3 MK3 펌" -"웨어는 M73를 인식 하 고 있습니다. 또한 i3 MK3 펌웨어는 자동 모드에서 M73 Qxx " -"Sxx를 지원 합니다." - -#: src/libslic3r/PrintConfig.cpp:1077 -msgid "Supports stealth mode" -msgstr "자동 모드 지원" - -#: src/libslic3r/PrintConfig.cpp:1078 -msgid "The firmware supports stealth mode" -msgstr "펌웨어는 스텔스 모드를 지원 합니다" - -#: src/libslic3r/PrintConfig.cpp:1102 -msgid "Maximum feedrate X" -msgstr "최대 이송 속도 X" - -#: src/libslic3r/PrintConfig.cpp:1103 -msgid "Maximum feedrate Y" -msgstr "최대 이송 속도 Y" - -#: src/libslic3r/PrintConfig.cpp:1104 -msgid "Maximum feedrate Z" -msgstr "최대 이송 속도 Z" - -#: src/libslic3r/PrintConfig.cpp:1105 -msgid "Maximum feedrate E" -msgstr "최대 이송 속도 E" - -#: src/libslic3r/PrintConfig.cpp:1108 -msgid "Maximum feedrate of the X axis" -msgstr "X 축의 최대 이송 속도" - -#: src/libslic3r/PrintConfig.cpp:1109 -msgid "Maximum feedrate of the Y axis" -msgstr "Y 축의 최대 이송 속도" - -#: src/libslic3r/PrintConfig.cpp:1110 -msgid "Maximum feedrate of the Z axis" -msgstr "Z 축의 최대 이송 속도" - -#: src/libslic3r/PrintConfig.cpp:1111 -msgid "Maximum feedrate of the E axis" -msgstr "E 축의 최대 이송 속도" - -#: src/libslic3r/PrintConfig.cpp:1120 -msgid "Maximum acceleration X" -msgstr "최대 가속도 X" - -#: src/libslic3r/PrintConfig.cpp:1121 -msgid "Maximum acceleration Y" -msgstr "최대 가속도 Y" - -#: src/libslic3r/PrintConfig.cpp:1122 -msgid "Maximum acceleration Z" -msgstr "최대 가속 Z" - -#: src/libslic3r/PrintConfig.cpp:1123 -msgid "Maximum acceleration E" -msgstr "최대 가속 E" - -#: src/libslic3r/PrintConfig.cpp:1126 -msgid "Maximum acceleration of the X axis" -msgstr "X 축의 최대 가속도" - -#: src/libslic3r/PrintConfig.cpp:1127 -msgid "Maximum acceleration of the Y axis" -msgstr "Y 축의 최대 가속도" - -#: src/libslic3r/PrintConfig.cpp:1128 -msgid "Maximum acceleration of the Z axis" -msgstr "Z 축의 최대 가속도" - -#: src/libslic3r/PrintConfig.cpp:1129 -msgid "Maximum acceleration of the E axis" -msgstr "E 축의 최대 가속도" - -#: src/libslic3r/PrintConfig.cpp:1138 -msgid "Maximum jerk X" -msgstr "최대 저크(jerk) X" - -#: src/libslic3r/PrintConfig.cpp:1139 -msgid "Maximum jerk Y" -msgstr "최대 저크(jerk) Y" - -#: src/libslic3r/PrintConfig.cpp:1140 -msgid "Maximum jerk Z" -msgstr "최대 저크(jerk) Z" - -#: src/libslic3r/PrintConfig.cpp:1141 -msgid "Maximum jerk E" -msgstr "최대 저크(jerk) E" - -#: src/libslic3r/PrintConfig.cpp:1144 -msgid "Maximum jerk of the X axis" -msgstr "X축 최대 저크(jerk)" - -#: src/libslic3r/PrintConfig.cpp:1145 -msgid "Maximum jerk of the Y axis" -msgstr "Y축 최대 저크는(jerk)" - -#: src/libslic3r/PrintConfig.cpp:1146 -msgid "Maximum jerk of the Z axis" -msgstr "Z축 최대 저크(jerk)" - -#: src/libslic3r/PrintConfig.cpp:1147 -msgid "Maximum jerk of the E axis" -msgstr "E축 최대 저크(jerk)" - -#: src/libslic3r/PrintConfig.cpp:1158 -msgid "Minimum feedrate when extruding" -msgstr "압출시 최소 공급 속도" - -#: src/libslic3r/PrintConfig.cpp:1160 -msgid "Minimum feedrate when extruding (M205 S)" -msgstr "압출 시 최소 이송 속도 (M205 S)" - -#: src/libslic3r/PrintConfig.cpp:1169 -msgid "Minimum travel feedrate" -msgstr "최소 이송 속도" - -#: src/libslic3r/PrintConfig.cpp:1171 -msgid "Minimum travel feedrate (M205 T)" -msgstr "최소 이동 이송 속도 (M205 T)" - -#: src/libslic3r/PrintConfig.cpp:1180 -msgid "Maximum acceleration when extruding" -msgstr "압출시 최대 가속도" - -#: src/libslic3r/PrintConfig.cpp:1182 -msgid "Maximum acceleration when extruding (M204 S)" -msgstr "압출 시 최대 가속도 (M204 S)" - -#: src/libslic3r/PrintConfig.cpp:1191 -msgid "Maximum acceleration when retracting" -msgstr "리트렉션 최대 가속도" - -#: src/libslic3r/PrintConfig.cpp:1193 -msgid "Maximum acceleration when retracting (M204 T)" -msgstr "후퇴 시 최대 가속도 (M204 T)" - -#: src/libslic3r/PrintConfig.cpp:1201 src/libslic3r/PrintConfig.cpp:1210 -msgid "Max" -msgstr "최대" - -#: src/libslic3r/PrintConfig.cpp:1202 -msgid "This setting represents the maximum speed of your fan." -msgstr "이 설정은 팬의 최대 속도를 나타냅니다." - -#: src/libslic3r/PrintConfig.cpp:1211 -#, c-format -msgid "" -"This is the highest printable layer height for this extruder, used to cap " -"the variable layer height and support layer height. Maximum recommended " -"layer height is 75% of the extrusion width to achieve reasonable inter-layer " -"adhesion. If set to 0, layer height is limited to 75% of the nozzle diameter." -msgstr "" -"이것은이 익스트루더의 가장 높은 인쇄 가능 층 높이이며, 가변 층 높이 및 지지" -"층 높이를 캡하는 데 사용됩니다. 합당한 층간 접착력을 얻기 위해 최대 권장 높이" -"는 압출 폭의 75% of 입니다. 0으로 설정하면 층 높이가 노즐 지름의 75% of로 제" -"한됩니다." - -#: src/libslic3r/PrintConfig.cpp:1221 -msgid "Max print speed" -msgstr "최대 프린트 속도" - -#: src/libslic3r/PrintConfig.cpp:1222 -msgid "" -"When setting other speed settings to 0 Slic3r will autocalculate the optimal " -"speed in order to keep constant extruder pressure. This experimental setting " -"is used to set the highest print speed you want to allow." -msgstr "" -"다른 속도 설정을 0으로 설정할 경우, 지속적인 외부 압력을 유지하기 위해 최적" -"의 속도를 자동 계산한다. 이 실험 설정은 허용할 최대 인쇄 속도를 설정하는 데 " -"사용된다." - -#: src/libslic3r/PrintConfig.cpp:1232 -msgid "" -"This experimental setting is used to set the maximum volumetric speed your " -"extruder supports." -msgstr "" -"이 실험 설정은 압출기가 지원하는 최대 체적 속도를 설정하기 위해 사용된다." - -#: src/libslic3r/PrintConfig.cpp:1241 -msgid "Max volumetric slope positive" -msgstr "최대 체적 기울기 양" - -#: src/libslic3r/PrintConfig.cpp:1242 src/libslic3r/PrintConfig.cpp:1253 -msgid "" -"This experimental setting is used to limit the speed of change in extrusion " -"rate. A value of 1.8 mm³/s² ensures, that a change from the extrusion rate " -"of 1.8 mm³/s (0.45mm extrusion width, 0.2mm extrusion height, feedrate 20 mm/" -"s) to 5.4 mm³/s (feedrate 60 mm/s) will take at least 2 seconds." -msgstr "" -"이 실험 설정은 돌출율의 변화 속도를 제한하는데 사용된다. 1.8mm3/s2 값은 " -"1.8mm3/s(0.45mm 압출 폭, 0.2mm 압출 높이, 공급 속도 20mm/s)에서 5.4mm3/s(공" -"급 속도 60mm/s)로 변경하는 데 최소 2초 이상 걸린다." - -#: src/libslic3r/PrintConfig.cpp:1246 src/libslic3r/PrintConfig.cpp:1257 -msgid "mm³/s²" -msgstr "mm³/s²" - -#: src/libslic3r/PrintConfig.cpp:1252 -msgid "Max volumetric slope negative" -msgstr "최대 체적 기울기 음수" - -#: src/libslic3r/PrintConfig.cpp:1264 src/libslic3r/PrintConfig.cpp:1273 -msgid "Min" -msgstr "최소" - -#: src/libslic3r/PrintConfig.cpp:1265 -msgid "This setting represents the minimum PWM your fan needs to work." -msgstr "이 설정은 최소 PWM팬이 활동하는데 필요한를 나타냅니다." - -#: src/libslic3r/PrintConfig.cpp:1274 -msgid "" -"This is the lowest printable layer height for this extruder and limits the " -"resolution for variable layer height. Typical values are between 0.05 mm and " -"0.1 mm." -msgstr "" -"이것은 이 압출기에 대한 가장 낮은 인쇄 가능한 층 높이이고 가변 층 높이에 대" -"한 분해능을 제한한다. 대표적인 값은 0.05mm와 0.1mm이다." - -#: src/libslic3r/PrintConfig.cpp:1282 -msgid "Min print speed" -msgstr "최소 인쇄 속도" - -#: src/libslic3r/PrintConfig.cpp:1283 -msgid "Slic3r will not scale speed down below this speed." -msgstr "Slic3r는 이 속도 이하로 속도를 낮추지 않을 것이다." - -#: src/libslic3r/PrintConfig.cpp:1290 -msgid "Minimal filament extrusion length" -msgstr "최소 필라멘트 압출 길이" - -#: src/libslic3r/PrintConfig.cpp:1291 -msgid "" -"Generate no less than the number of skirt loops required to consume the " -"specified amount of filament on the bottom layer. For multi-extruder " -"machines, this minimum applies to each extruder." -msgstr "" -"하단 레이어에서 지정된 양의 필라멘트를 사용하는 데 필요한 스커트 루프의 수 이" -"상으로 생성한다. 멀티 익스트루더의 경우, 이 최소값은 각 추가기기에 적용된다." - -#: src/libslic3r/PrintConfig.cpp:1300 -msgid "Configuration notes" -msgstr "구성 노트" - -#: src/libslic3r/PrintConfig.cpp:1301 -msgid "" -"You can put here your personal notes. This text will be added to the G-code " -"header comments." -msgstr "" -"여기에 개인 노트를 넣을 수 있다. 이 텍스트는 G-code 헤더 코멘트에 추가될 것이" -"다." - -#: src/libslic3r/PrintConfig.cpp:1311 -msgid "" -"This is the diameter of your extruder nozzle (for example: 0.5, 0.35 etc.)" -msgstr "이 지름은 엑스트루더 노즐의 직경이다(예: 0.5, 0.35 등)." - -#: src/libslic3r/PrintConfig.cpp:1316 -msgid "Host Type" -msgstr "호스트 유형" - -#: src/libslic3r/PrintConfig.cpp:1317 -msgid "" -"Slic3r can upload G-code files to a printer host. This field must contain " -"the kind of the host." -msgstr "" -"Slic3r는 프린터 호스트에 G 코드 파일을 업로드할 수 있습니다. 이 필드에는 호스" -"트의 종류가 포함 되어야 합니다." - -#: src/libslic3r/PrintConfig.cpp:1328 -msgid "Only retract when crossing perimeters" -msgstr "둘레를 횡단 할 때만 수축" - -#: src/libslic3r/PrintConfig.cpp:1329 -msgid "" -"Disables retraction when the travel path does not exceed the upper layer's " -"perimeters (and thus any ooze will be probably invisible)." -msgstr "" -"이동 경로가 상위 레이어의 경계를 초과하지 않는 경우 리트랙션을 비활성화합니" -"다. 따라서 모든 오즈가 보이지 않습니다." - -#: src/libslic3r/PrintConfig.cpp:1336 -msgid "" -"This option will drop the temperature of the inactive extruders to prevent " -"oozing. It will enable a tall skirt automatically and move extruders outside " -"such skirt when changing temperatures." -msgstr "" -"이 옵션은 누출을 방지하기 위해 비활성 압출기의 온도를 떨어 뜨립니다. 온도를 " -"변경할 때 키가 큰 스커트를 자동으로 사용하고 스커트 외부로 압출기를 이동합니" -"다." - -#: src/libslic3r/PrintConfig.cpp:1343 -msgid "Output filename format" -msgstr "출력 파일이름 형식" - -#: src/libslic3r/PrintConfig.cpp:1344 -msgid "" -"You can use all configuration options as variables inside this template. For " -"example: [layer_height], [fill_density] etc. You can also use [timestamp], " -"[year], [month], [day], [hour], [minute], [second], [version], " -"[input_filename], [input_filename_base]." -msgstr "" -"모든 구성 옵션을이 템플릿 내의 변수로 사용할 수 있습니다. 예: " -"[layer_height], [fill_density] 등 또한 [타임 스탬프], [연도], [월], [일], [시" -"간], [input_filename], [input_filename_base]을 사용할 수 있습니다." - -#: src/libslic3r/PrintConfig.cpp:1353 -msgid "Detect bridging perimeters" -msgstr "브릿 징 경계선 감지" - -#: src/libslic3r/PrintConfig.cpp:1355 -msgid "" -"Experimental option to adjust flow for overhangs (bridge flow will be used), " -"to apply bridge speed to them and enable fan." -msgstr "" -"오버행에 대한 유량을 조정하는 실험 옵션 (브리지 흐름(flow)이 사용됨)에 브릿" -"지 속도를 적용하고 팬을 활성화합니다." - -#: src/libslic3r/PrintConfig.cpp:1361 -msgid "Filament parking position" -msgstr "필라멘트 멈춤 위치" - -#: src/libslic3r/PrintConfig.cpp:1362 -msgid "" -"Distance of the extruder tip from the position where the filament is parked " -"when unloaded. This should match the value in printer firmware." -msgstr "" -"언로딩시 필라멘트 위치에서 압출기 팁의 거리. 이 값은 프린터 펌웨어의 값과 일" -"치해야합니다." - -#: src/libslic3r/PrintConfig.cpp:1370 -msgid "Extra loading distance" -msgstr "추가 로딩 거리" - -#: src/libslic3r/PrintConfig.cpp:1371 -msgid "" -"When set to zero, the distance the filament is moved from parking position " -"during load is exactly the same as it was moved back during unload. When " -"positive, it is loaded further, if negative, the loading move is shorter " -"than unloading." -msgstr "" -"0으로 설정하면로드 중에 필라멘트가 위치에서 이동 한 거리는 언로드 중에 다시 " -"이동 한 거리와 동일합니다. 양수이면 음수가 더 많이 로드되고 로드가 음수 인 경" -"우 언로드보다 짧습니다." - -#: src/libslic3r/PrintConfig.cpp:1379 src/libslic3r/PrintConfig.cpp:1397 -#: src/libslic3r/PrintConfig.cpp:1409 src/libslic3r/PrintConfig.cpp:1419 -msgid "Perimeters" -msgstr "둘레" - -#: src/libslic3r/PrintConfig.cpp:1380 -msgid "" -"This is the acceleration your printer will use for perimeters. A high value " -"like 9000 usually gives good results if your hardware is up to the job. Set " -"zero to disable acceleration control for perimeters." -msgstr "" -"프린터가 둘레로 사용할 가속도입니다. 9000과 같은 높은 값은 하드웨어가 제대로 " -"작동하면 좋은 결과를 제공합니다. 주변을 가속 제어하지 않으려면 0으로 설정하십" -"시오." - -#: src/libslic3r/PrintConfig.cpp:1388 -msgid "Perimeter extruder" -msgstr "주변 익스트루더" - -#: src/libslic3r/PrintConfig.cpp:1390 -msgid "" -"The extruder to use when printing perimeters and brim. First extruder is 1." -msgstr "" -"둘레와 가장자리를 인쇄 할 때 사용할 압출기입니다. 첫 번째 압출기는 1입니다." - -#: src/libslic3r/PrintConfig.cpp:1399 -msgid "" -"Set this to a non-zero value to set a manual extrusion width for perimeters. " -"You may want to use thinner extrudates to get more accurate surfaces. If " -"left zero, default extrusion width will be used if set, otherwise 1.125 x " -"nozzle diameter will be used. If expressed as percentage (for example 200%) " -"it will be computed over layer height." -msgstr "" -"이 값을 0이 아닌 값으로 설정하면 수동 압출 폭을 둘레로 설정할 수 있습니다. 보" -"다 정확한 서페이스를 얻으려면 더 얇은 압출 성형품을 사용하는 것이 좋습니다. 0" -"으로 설정하면 설정된 경우 기본 돌출 폭이 사용되고 그렇지 않으면 1.125 x 노즐 " -"직경이 사용됩니다. 백분율 (예 : 200 %)로 표현하면 레이어 높이를 기준으로 계산" -"됩니다." - -#: src/libslic3r/PrintConfig.cpp:1411 -msgid "" -"Speed for perimeters (contours, aka vertical shells). Set to zero for auto." -msgstr "둘레의 속도 (등고선, 일명 세로 셸). 자동으로 0으로 설정하십시오." - -#: src/libslic3r/PrintConfig.cpp:1421 -msgid "" -"This option sets the number of perimeters to generate for each layer. Note " -"that Slic3r may increase this number automatically when it detects sloping " -"surfaces which benefit from a higher number of perimeters if the Extra " -"Perimeters option is enabled." -msgstr "" -"이 옵션은 각 레이어에 대해 생성 할 경계 수를 설정합니다. 추가 경계선 옵션을 " -"사용하면 더 큰 주변 수를 사용하는 경사면을 감지 할 때 Slic3r이이 수를 자동으" -"로 증가시킬 수 있습니다." - -#: src/libslic3r/PrintConfig.cpp:1425 -msgid "(minimum)" -msgstr "(최소)" - -#: src/libslic3r/PrintConfig.cpp:1433 -msgid "" -"If you want to process the output G-code through custom scripts, just list " -"their absolute paths here. Separate multiple scripts with a semicolon. " -"Scripts will be passed the absolute path to the G-code file as the first " -"argument, and they can access the Slic3r config settings by reading " -"environment variables." -msgstr "" -"사용자 정의 스크립트를 통해 출력 G 코드를 처리하려면 여기에 절대 경로를 나열" -"하십시오. 여러 개의 스크립트를 세미콜론으로 구분하십시오. 스크립트는 G 코드 " -"파일의 절대 경로를 첫 번째 인수로 전달되며 환경 변수를 읽음으로써 Slic3r 구" -"성 설정에 액세스 할 수 있습니다." - -#: src/libslic3r/PrintConfig.cpp:1445 -msgid "Printer type" -msgstr "프린터 타입" - -#: src/libslic3r/PrintConfig.cpp:1446 -msgid "Type of the printer." -msgstr "프린터 유형." - -#: src/libslic3r/PrintConfig.cpp:1451 -msgid "Printer notes" -msgstr "프린터 노트" - -#: src/libslic3r/PrintConfig.cpp:1452 -msgid "You can put your notes regarding the printer here." -msgstr "프린터 관련 메모를 여기에 넣을 수 있습니다." - -#: src/libslic3r/PrintConfig.cpp:1460 -msgid "Printer vendor" -msgstr "제조 회사" - -#: src/libslic3r/PrintConfig.cpp:1461 -msgid "Name of the printer vendor." -msgstr "프린터 공급 업체의 이름입니다." - -#: src/libslic3r/PrintConfig.cpp:1466 -msgid "Printer variant" -msgstr "프린터 변형" - -#: src/libslic3r/PrintConfig.cpp:1467 -msgid "" -"Name of the printer variant. For example, the printer variants may be " -"differentiated by a nozzle diameter." -msgstr "" -"프린터 변종 이름입니다. 예를 들어, 프린터 변형은 노즐 지름으로 구별 될 수 있" -"습니다." - -#: src/libslic3r/PrintConfig.cpp:1480 -msgid "Raft layers" -msgstr "라프트(Raft) 레이어" - -#: src/libslic3r/PrintConfig.cpp:1482 -msgid "" -"The object will be raised by this number of layers, and support material " -"will be generated under it." -msgstr "" -"물체는 이 개수의 층에 의해 상승되며, 그 아래에서 서포트 재료가 생성될 것이다." - -#: src/libslic3r/PrintConfig.cpp:1490 -msgid "Resolution" -msgstr "해결" - -#: src/libslic3r/PrintConfig.cpp:1491 -msgid "" -"Minimum detail resolution, used to simplify the input file for speeding up " -"the slicing job and reducing memory usage. High-resolution models often " -"carry more detail than printers can render. Set to zero to disable any " -"simplification and use full resolution from input." -msgstr "" -"잘라내기 작업의 속도를 높이고 메모리 사용량을 줄이기 위해 입력 파일을 단순화" -"하는 데 사용되는 최소 세부 해상도. 고해상도 모델은 종종 프린터가 렌더링할 수 " -"있는 것보다 더 많은 디테일을 가지고 있다. 단순화를 사용하지 않고 입력에서 전" -"체 해상도를 사용하려면 0으로 설정하십시오." - -#: src/libslic3r/PrintConfig.cpp:1501 -msgid "Minimum travel after retraction" -msgstr "리트랙션 후 최소 이동 거리" - -#: src/libslic3r/PrintConfig.cpp:1502 -msgid "" -"Retraction is not triggered when travel moves are shorter than this length." -msgstr "이동 거리가 이 길이보다 짧으면 리트렉션이 트리거되지 않습니다." - -#: src/libslic3r/PrintConfig.cpp:1508 -msgid "Retract amount before wipe" -msgstr "닦아 내기 전의 수축량" - -#: src/libslic3r/PrintConfig.cpp:1509 -msgid "" -"With bowden extruders, it may be wise to do some amount of quick retract " -"before doing the wipe movement." -msgstr "" -"보우 덴 압출기를 사용하면 와이퍼 동작을하기 전에 약간의 빠른 리트랙션 를하는 " -"것이 좋습니다." - -#: src/libslic3r/PrintConfig.cpp:1516 -msgid "Retract on layer change" -msgstr "레이어 변경 후퇴" - -#: src/libslic3r/PrintConfig.cpp:1517 -msgid "This flag enforces a retraction whenever a Z move is done." -msgstr "이 플래그는 Z 이동이 완료 될 때마다 취소를 강제 실행합니다." - -#: src/libslic3r/PrintConfig.cpp:1522 src/libslic3r/PrintConfig.cpp:1530 -msgid "Length" -msgstr "길이" - -#: src/libslic3r/PrintConfig.cpp:1523 -msgid "Retraction Length" -msgstr "리트랙션 길이" - -#: src/libslic3r/PrintConfig.cpp:1524 -msgid "" -"When retraction is triggered, filament is pulled back by the specified " -"amount (the length is measured on raw filament, before it enters the " -"extruder)." -msgstr "" -"후퇴가 트리거되면 필라멘트가 지정된 양만큼 뒤로 당겨집니다 (길이는 압출기에 " -"들어가기 전에 원시 필라멘트에서 측정됩니다)." - -#: src/libslic3r/PrintConfig.cpp:1526 src/libslic3r/PrintConfig.cpp:1535 -msgid "mm (zero to disable)" -msgstr "mm (0은 비활성화)" - -#: src/libslic3r/PrintConfig.cpp:1531 -msgid "Retraction Length (Toolchange)" -msgstr "리트랙션 길이 (툴 체인지)" - -#: src/libslic3r/PrintConfig.cpp:1532 -msgid "" -"When retraction is triggered before changing tool, filament is pulled back " -"by the specified amount (the length is measured on raw filament, before it " -"enters the extruder)." -msgstr "" -"공구를 교체하기 전에 후퇴가 트리거되면 필라멘트가 지정된 양만큼 뒤로 당겨집니" -"다 (길이는 압출기에 들어가기 전에 원시 필라멘트에서 측정됩니다)." - -#: src/libslic3r/PrintConfig.cpp:1540 -msgid "Lift Z" -msgstr "Z축 올림" - -#: src/libslic3r/PrintConfig.cpp:1541 -msgid "" -"If you set this to a positive value, Z is quickly raised every time a " -"retraction is triggered. When using multiple extruders, only the setting for " -"the first extruder will be considered." -msgstr "" -"이 값을 양수 값으로 설정하면 철회가 트리거 될 때마다 Z가 빠르게 올라갑니다. " -"여러 개의 압출기를 사용하는 경우 첫 번째 압출기의 설정 만 고려됩니다." - -#: src/libslic3r/PrintConfig.cpp:1548 -msgid "Above Z" -msgstr "Z 위" - -#: src/libslic3r/PrintConfig.cpp:1549 -msgid "Only lift Z above" -msgstr "오직 Z축 위로만" - -#: src/libslic3r/PrintConfig.cpp:1550 -msgid "" -"If you set this to a positive value, Z lift will only take place above the " -"specified absolute Z. You can tune this setting for skipping lift on the " -"first layers." -msgstr "" -"이것을 양의 값으로 설정하면, Z 리프트는 지정된 절대 Z 위로만 발생한다. 첫 번" -"째 층에서 리프트를 건너뛸 수 있도록 이 설정을 조정할 수 있다." - -#: src/libslic3r/PrintConfig.cpp:1557 -msgid "Below Z" -msgstr "Z 아래" - -#: src/libslic3r/PrintConfig.cpp:1558 -msgid "Only lift Z below" -msgstr "Z값 아래만" - -#: src/libslic3r/PrintConfig.cpp:1559 -msgid "" -"If you set this to a positive value, Z lift will only take place below the " -"specified absolute Z. You can tune this setting for limiting lift to the " -"first layers." -msgstr "" -"이것을 양수 값으로 설정하면 Z 리프트가 지정된 절대 Z 아래에서만 발생합니다. " -"첫 번째 레이어로 리프트를 제한하기 위해이 설정을 조정할 수 있습니다." - -#: src/libslic3r/PrintConfig.cpp:1567 src/libslic3r/PrintConfig.cpp:1575 -msgid "Extra length on restart" -msgstr "재시작시 여분의 길이" - -#: src/libslic3r/PrintConfig.cpp:1568 -msgid "" -"When the retraction is compensated after the travel move, the extruder will " -"push this additional amount of filament. This setting is rarely needed." -msgstr "" -"이동 후 리트렉셔이 보정되면 익스트루더가 추가 양의 필라멘트를 밀어냅니다. 이 " -"설정은 거의 필요하지 않습니다." - -#: src/libslic3r/PrintConfig.cpp:1576 -msgid "" -"When the retraction is compensated after changing tool, the extruder will " -"push this additional amount of filament." -msgstr "" -"도구를 교환 한 후 리트렉션를 보정하면 익스트루더가 추가 양의 필라멘트를 밀게" -"됩니다." - -#: src/libslic3r/PrintConfig.cpp:1583 src/libslic3r/PrintConfig.cpp:1584 -msgid "Retraction Speed" -msgstr "리트랙션 속도" - -#: src/libslic3r/PrintConfig.cpp:1585 -msgid "The speed for retractions (it only applies to the extruder motor)." -msgstr "리트랙션 속도 (익스트루더 모터에만 적용됨)." - -#: src/libslic3r/PrintConfig.cpp:1591 src/libslic3r/PrintConfig.cpp:1592 -msgid "Deretraction Speed" -msgstr "감속 속도" - -#: src/libslic3r/PrintConfig.cpp:1593 -msgid "" -"The speed for loading of a filament into extruder after retraction (it only " -"applies to the extruder motor). If left to zero, the retraction speed is " -"used." -msgstr "" -"리트랙션 후 압출기에 필라멘트를 로드하는 속도 (압출기 모터에만 적용됨). 0으" -"로 방치하면 리트랙션 속도가 사용됩니다." - -#: src/libslic3r/PrintConfig.cpp:1600 -msgid "Seam position" -msgstr "재봉선 위치" - -#: src/libslic3r/PrintConfig.cpp:1602 -msgid "Position of perimeters starting points." -msgstr "둘레의 시작점의 위치." - -#: src/libslic3r/PrintConfig.cpp:1608 -msgid "Random" -msgstr "무작위" - -#: src/libslic3r/PrintConfig.cpp:1609 -msgid "Nearest" -msgstr "가장 가까운" - -#: src/libslic3r/PrintConfig.cpp:1610 -msgid "Aligned" -msgstr "정렬" - -#: src/libslic3r/PrintConfig.cpp:1618 -msgid "Direction" -msgstr "방향" - -#: src/libslic3r/PrintConfig.cpp:1620 -msgid "Preferred direction of the seam" -msgstr "선호하는 심(seam)의 방향" - -#: src/libslic3r/PrintConfig.cpp:1621 -msgid "Seam preferred direction" -msgstr "심(Seam) 선호 방향" - -#: src/libslic3r/PrintConfig.cpp:1628 -msgid "Jitter" -msgstr "지터(Jitter)" - -#: src/libslic3r/PrintConfig.cpp:1630 -msgid "Seam preferred direction jitter" -msgstr "(Seam) 선호 방향 지터(Jitter)" - -#: src/libslic3r/PrintConfig.cpp:1631 -msgid "Preferred direction of the seam - jitter" -msgstr "재봉선 지터의 선호 방향" - -#: src/libslic3r/PrintConfig.cpp:1641 -msgid "USB/serial port for printer connection." -msgstr "프린터 연결을 위한 USB/시리얼 포트." - -#: src/libslic3r/PrintConfig.cpp:1648 -msgid "Serial port speed" -msgstr "시리얼 포트 속도" - -#: src/libslic3r/PrintConfig.cpp:1649 -msgid "Speed (baud) of USB/serial port for printer connection." -msgstr "프린터 연결을 위한 USB/시리얼 포트의 속도(보드)" - -#: src/libslic3r/PrintConfig.cpp:1658 -msgid "Distance from object" -msgstr "객체로부터의 거리" - -#: src/libslic3r/PrintConfig.cpp:1659 -msgid "" -"Distance between skirt and object(s). Set this to zero to attach the skirt " -"to the object(s) and get a brim for better adhesion." -msgstr "" -"스커트와 객체 사이의 거리. 스커트를 객체에 부착하고 접착력을 높이기 위해 이" -"를 0으로 설정한다." - -#: src/libslic3r/PrintConfig.cpp:1666 -msgid "Skirt height" -msgstr "스커트(Skirt) 높이" - -#: src/libslic3r/PrintConfig.cpp:1667 -msgid "" -"Height of skirt expressed in layers. Set this to a tall value to use skirt " -"as a shield against drafts." -msgstr "" -"스커트의 높이 레이어로 표현된다. 이를 높은 값으로 설정하여 스커트를 드래프트" -"에 대한 쉴ㄷ로 활용하십시오." - -#: src/libslic3r/PrintConfig.cpp:1674 -msgid "Loops (minimum)" -msgstr "루프 (최소)" - -#: src/libslic3r/PrintConfig.cpp:1675 -msgid "Skirt Loops" -msgstr "스커트 루프" - -#: src/libslic3r/PrintConfig.cpp:1676 -msgid "" -"Number of loops for the skirt. If the Minimum Extrusion Length option is " -"set, the number of loops might be greater than the one configured here. Set " -"this to zero to disable skirt completely." -msgstr "" -"스커트의 루프 수입니다. 최소 압출 길이 옵션을 설정한 경우 여기에 구성된 루프 " -"수보다 클 수 있다. 스커트를 완전히 비활성화하려면 이 값을 0으로 설정하십시오." - -#: src/libslic3r/PrintConfig.cpp:1684 -msgid "Slow down if layer print time is below" -msgstr "레이어 인쇄 시간이 다음과 같은 경우 속도를 낮추십시오" - -#: src/libslic3r/PrintConfig.cpp:1685 -msgid "" -"If layer print time is estimated below this number of seconds, print moves " -"speed will be scaled down to extend duration to this value." -msgstr "" -"층 인쇄 시간이 이 시간보다 낮게 추정될 경우, 인쇄 이동 속도는 이 값으로 지속" -"되도록 축소된다." - -#: src/libslic3r/PrintConfig.cpp:1695 -msgid "Small perimeters" -msgstr "작은 둘레" - -#: src/libslic3r/PrintConfig.cpp:1697 -msgid "" -"This separate setting will affect the speed of perimeters having radius <= " -"6.5mm (usually holes). If expressed as percentage (for example: 80%) it will " -"be calculated on the perimeters speed setting above. Set to zero for auto." -msgstr "" -"이 개별 설정은 반경이 6.5mm 미만인 속도 (일반적으로 구멍)에 영향을줍니다. 백" -"분율로 표시되는 경우 (예 : 80 %) 위의 속도 설정에서 계산됩니다. 자동으로 0으" -"로 설정하십시오." - -#: src/libslic3r/PrintConfig.cpp:1707 -msgid "Solid infill threshold area" -msgstr "솔리드 채우기 임계값 영역" - -#: src/libslic3r/PrintConfig.cpp:1709 -msgid "" -"Force solid infill for regions having a smaller area than the specified " -"threshold." -msgstr "" -"지정된 한계값보다 작은 영역을 가진 영역에 대해 솔리드 인필을 강제 적용." - -#: src/libslic3r/PrintConfig.cpp:1710 -msgid "mm²" -msgstr "mm²" - -#: src/libslic3r/PrintConfig.cpp:1716 -msgid "Solid infill extruder" -msgstr "솔리드 인필 익스트루더" - -#: src/libslic3r/PrintConfig.cpp:1718 -msgid "The extruder to use when printing solid infill." -msgstr "꽉찬 면을 인쇄할 때 사용하는 익스트루더." - -#: src/libslic3r/PrintConfig.cpp:1724 -msgid "Solid infill every" -msgstr "솔리드 인필 간격" - -#: src/libslic3r/PrintConfig.cpp:1726 -msgid "" -"This feature allows to force a solid layer every given number of layers. " -"Zero to disable. You can set this to any value (for example 9999); Slic3r " -"will automatically choose the maximum possible number of layers to combine " -"according to nozzle diameter and layer height." -msgstr "" -"이 특징은 주어진 개수의 층마다 단단한 층을 넣을수 있게 한다. 비활성화할 수 없" -"음. 당신은 이것을 어떤 값으로도 설정할 수 있다(예: 9999). Slic3r는 노즐 직경" -"과 층 높이에 따라 결합할 최대 가능한 층 수를 자동으로 선택한다." - -#: src/libslic3r/PrintConfig.cpp:1738 -msgid "" -"Set this to a non-zero value to set a manual extrusion width for infill for " -"solid surfaces. If left zero, default extrusion width will be used if set, " -"otherwise 1.125 x nozzle diameter will be used. If expressed as percentage " -"(for example 90%) it will be computed over layer height." -msgstr "" -"이 값을 0이 아닌 값으로 설정하여 솔리드 표면 인필에 대한 수동 압출 폭을 설정" -"하십시오. 0인 경우 기본 압출 너비가 사용되며, 그렇지 않으면 1.125 x 노즐 직경" -"이 사용된다. 백분율(예: 90%)로 표현되는 경우, 계층 높이에 걸쳐 계산된다." - -#: src/libslic3r/PrintConfig.cpp:1748 -msgid "" -"Speed for printing solid regions (top/bottom/internal horizontal shells). " -"This can be expressed as a percentage (for example: 80%) over the default " -"infill speed above. Set to zero for auto." -msgstr "" -"솔리드 영역(상단/하부/내부 수평 셸) 인쇄 속도 이는 위의 기본 주입 속도에 대" -"한 백분율(예: 80%)로 표시할 수 있다. 자동을 위해 0으로 설정한다." - -#: src/libslic3r/PrintConfig.cpp:1760 -msgid "Number of solid layers to generate on top and bottom surfaces." -msgstr "상단 및 하단 표면에 생성할 솔리드 레이어 수입니다." - -#: src/libslic3r/PrintConfig.cpp:1766 -msgid "Spiral vase" -msgstr "스파이럴 바이스" - -#: src/libslic3r/PrintConfig.cpp:1767 -msgid "" -"This feature will raise Z gradually while printing a single-walled object in " -"order to remove any visible seam. This option requires a single perimeter, " -"no infill, no top solid layers and no support material. You can still set " -"any number of bottom solid layers as well as skirt/brim loops. It won't work " -"when printing more than an object." -msgstr "" -"이 기능은 단일 벽 물체를 인쇄하는 동안 눈에 보이는 심을 제거하기 위해 Z를 점" -"진적으로 상승시킨다. 이 옵션은 단일 둘레, 주입, 상단 솔리드 레이어 및 지지 재" -"료가 필요하지 않다. 당신은 스커트/브림 루프뿐만 아니라 아래 솔리드 레이어의 " -"수에 상관없이 설정할 수 있다. 그것은 물체보다 더 많이 인쇄할 때는 작동하지 않" -"을 것이다." - -#: src/libslic3r/PrintConfig.cpp:1775 -msgid "Temperature variation" -msgstr "온도 변화" - -#: src/libslic3r/PrintConfig.cpp:1776 -msgid "" -"Temperature difference to be applied when an extruder is not active. Enables " -"a full-height \"sacrificial\" skirt on which the nozzles are periodically " -"wiped." -msgstr "" -"돌출부가 활성화되지 않은 경우 적용되는 온도 차이. 노즐을 주기적으로 닦는 전" -"체 높이 \"인공\" 스커트가 가능하다." - -#: src/libslic3r/PrintConfig.cpp:1786 -msgid "" -"This start procedure is inserted at the beginning, after bed has reached the " -"target temperature and extruder just started heating, and before extruder " -"has finished heating. If Slic3r detects M104 or M190 in your custom codes, " -"such commands will not be prepended automatically so you're free to " -"customize the order of heating commands and other custom actions. Note that " -"you can use placeholder variables for all Slic3r settings, so you can put a " -"\"M109 S[first_layer_temperature]\" command wherever you want." -msgstr "" -"이 시작 절차는 침대가 목표 온도에 도달하고 압출기가 막 가열을 시작한 직후 및 " -"압출기가 가열을 완료하기 전에 처음에 삽입됩니다. Slic3r이 사용자 지정 코드에" -"서 M104 또는 M190을 감지하면 이러한 명령은 자동으로 추가되지 않으므로 가열 명" -"령 및 기타 사용자 지정 동작의 순서를 자유롭게 사용자 지정할 수 있습니다. 모" -"든 Slic3r 설정에 자리 표시 자 변수를 사용할 수 있으므로 원하는 위치에 \"M109 " -"S [first_layer_temperature]\"명령을 넣을 수 있습니다." - -#: src/libslic3r/PrintConfig.cpp:1801 -msgid "" -"This start procedure is inserted at the beginning, after any printer start " -"gcode (and after any toolchange to this filament in case of multi-material " -"printers). This is used to override settings for a specific filament. If " -"Slic3r detects M104, M109, M140 or M190 in your custom codes, such commands " -"will not be prepended automatically so you're free to customize the order of " -"heating commands and other custom actions. Note that you can use placeholder " -"variables for all Slic3r settings, so you can put a \"M109 " -"S[first_layer_temperature]\" command wherever you want. If you have multiple " -"extruders, the gcode is processed in extruder order." -msgstr "" -"이 시작 절차는 프린터가 gcode를 시작한 후(그리고 다중 재질 프린터의 경우 이 " -"필라멘트에 대한 도구 변경 후) 처음에 삽입됩니다. 특정 필라멘트에 대한 설정을 " -"재정의하는 데 사용됩니다. Slic3r가 사용자 지정 코드에서 M104, M109, M140 또" -"는 M190을 감지하면 이러한 명령이 자동으로 준비되지 않으므로 가열 명령 및 기" -"타 사용자 지정 작업의 순서를 자유롭게 사용자 지정할 수 있습니다. 모든 Slic3r " -"설정에 자리 표시자 변수를 사용할 수 있으므로 원하는 위치에 \"M109 " -"S[first_layer_temperature]\" 명령을 넣을 수 있습니다. 압출기가 여러 개 있는 " -"경우 gcode는 압출기 순서로 처리됩니다." - -#: src/libslic3r/PrintConfig.cpp:1817 -msgid "Single Extruder Multi Material" -msgstr "싱글 익스트루더 멀티메터리얼" - -#: src/libslic3r/PrintConfig.cpp:1818 -msgid "The printer multiplexes filaments into a single hot end." -msgstr "프린터는 필라멘트를 하나의 핫 엔드에 멀티플렉싱합니다." - -#: src/libslic3r/PrintConfig.cpp:1823 -msgid "Prime all printing extruders" -msgstr "모든 인쇄 압출기 프라임" - -#: src/libslic3r/PrintConfig.cpp:1824 -msgid "" -"If enabled, all printing extruders will be primed at the front edge of the " -"print bed at the start of the print." -msgstr "" -"활성화 된 경우, 모든 인쇄 압출기는 인쇄 시작시 프린트 베드의 전면 가장자리에 " -"프라이밍 됩니다." - -#: src/libslic3r/PrintConfig.cpp:1829 -msgid "Generate support material" -msgstr "서포트 재료 생성" - -#: src/libslic3r/PrintConfig.cpp:1831 -msgid "Enable support material generation." -msgstr "서포트 재료를 사용합니다." - -#: src/libslic3r/PrintConfig.cpp:1835 -msgid "Auto generated supports" -msgstr "자동 생성 지원" - -#: src/libslic3r/PrintConfig.cpp:1837 -msgid "" -"If checked, supports will be generated automatically based on the overhang " -"threshold value. If unchecked, supports will be generated inside the " -"\"Support Enforcer\" volumes only." -msgstr "" -"이 옵션을 선택 하면 오버행 임계값에 따라 서포트가 자동으로 생성 됩니다. 이 확" -"인란을 선택 하지 않으면 \"서포트 지원 영역\" 볼륨 내 에서만 지원이 생성 됩니" -"다." - -#: src/libslic3r/PrintConfig.cpp:1843 -msgid "XY separation between an object and its support" -msgstr "물체와 그 서포트 사이 XY 분리" - -#: src/libslic3r/PrintConfig.cpp:1845 -msgid "" -"XY separation between an object and its support. If expressed as percentage " -"(for example 50%), it will be calculated over external perimeter width." -msgstr "" -"객체와 그 서포트 사이의 XY 분리. 백분율 (예 : 50 %)로 표시되는 경우 외부 둘" -"레 너비를 기준으로 계산됩니다." - -#: src/libslic3r/PrintConfig.cpp:1855 -msgid "Pattern angle" -msgstr "채움 각도" - -#: src/libslic3r/PrintConfig.cpp:1857 -msgid "" -"Use this setting to rotate the support material pattern on the horizontal " -"plane." -msgstr "이 설정을 사용하여지지 평면 패턴을 수평면으로 회전시킵니다." - -#: src/libslic3r/PrintConfig.cpp:1867 src/libslic3r/PrintConfig.cpp:2531 -msgid "" -"Only create support if it lies on a build plate. Don't create support on a " -"print." -msgstr "" -"그것이 빌드 플레이트에있는 경우에만 지원을 작성하십시오. 인쇄물에 대한 지원" -"을 작성하지 마십시오." - -#: src/libslic3r/PrintConfig.cpp:1873 -msgid "Contact Z distance" -msgstr "Z 거리 문의" - -#: src/libslic3r/PrintConfig.cpp:1875 -msgid "" -"The vertical distance between object and support material interface. Setting " -"this to 0 will also prevent Slic3r from using bridge flow and speed for the " -"first object layer." -msgstr "" -"물체와 서포트 사이의 수직 거리. 이 값을 0으로 설정하면 Slic3r이 첫 번째 객체 " -"레이어에 브리지 흐름과 속도를 사용하지 못하게됩니다." - -#: src/libslic3r/PrintConfig.cpp:1882 -msgid "0 (soluble)" -msgstr "0 (수용성)" - -#: src/libslic3r/PrintConfig.cpp:1883 -msgid "0.2 (detachable)" -msgstr "0.2 (분리 가능)" - -#: src/libslic3r/PrintConfig.cpp:1888 -msgid "Enforce support for the first" -msgstr "첫 번째 서포트 더 강화" - -#: src/libslic3r/PrintConfig.cpp:1890 -msgid "" -"Generate support material for the specified number of layers counting from " -"bottom, regardless of whether normal support material is enabled or not and " -"regardless of any angle threshold. This is useful for getting more adhesion " -"of objects having a very thin or poor footprint on the build plate." -msgstr "" -"일반적인 서포트 소재의 활성화 여부와, 각도 임계 값에 관계없이 하단에서부터 세" -"어 지정된 레이어 수에 대한지지 자료를 생성합니다. 이것은 빌드 플레이트에 매" -"우 얇거나 부족한 풋 프린트를 가진 물체를 더 많이 부착 할 때 유용합니다." - -#: src/libslic3r/PrintConfig.cpp:1895 -msgid "Enforce support for the first n layers" -msgstr "첫 번째 n 개의 레이어에 대한 서포트 강화" - -#: src/libslic3r/PrintConfig.cpp:1901 -msgid "Support material/raft/skirt extruder" -msgstr "서포트 재료 / 라프트 / 스커트 익스트루더" - -#: src/libslic3r/PrintConfig.cpp:1903 -msgid "" -"The extruder to use when printing support material, raft and skirt (1+, 0 to " -"use the current extruder to minimize tool changes)." -msgstr "" -"서포트 재료, 라프트 및 스커트를 인쇄 할 때 사용하는 압출기 (도구 변경을 최소" -"화하기 위해 현재 압출기를 사용하려면 1+, 0)." - -#: src/libslic3r/PrintConfig.cpp:1912 -msgid "" -"Set this to a non-zero value to set a manual extrusion width for support " -"material. If left zero, default extrusion width will be used if set, " -"otherwise nozzle diameter will be used. If expressed as percentage (for " -"example 90%) it will be computed over layer height." -msgstr "" -"서포트 재료의 수동 압출 폭을 설정하려면이 값을 0이 아닌 값으로 설정하십시오. " -"0으로 설정하면 설정된 경우 기본 압출 폭이 사용되고 그렇지 않으면 노즐 지름이 " -"사용됩니다. 백분율 (예 : 90 %)로 표현하면 레이어 높이를 기준으로 계산됩니다." - -#: src/libslic3r/PrintConfig.cpp:1920 -msgid "Interface loops" -msgstr "인터페이스 루프" - -#: src/libslic3r/PrintConfig.cpp:1922 -msgid "" -"Cover the top contact layer of the supports with loops. Disabled by default." -msgstr "지지대의 상단 접촉 층을 루프로 덮으십시오. 기본적으로 사용 안 함." - -#: src/libslic3r/PrintConfig.cpp:1927 -msgid "Support material/raft interface extruder" -msgstr "서포트 재료/라프트 인터페이스 익스트루더" - -#: src/libslic3r/PrintConfig.cpp:1929 -msgid "" -"The extruder to use when printing support material interface (1+, 0 to use " -"the current extruder to minimize tool changes). This affects raft too." -msgstr "" -"서포트 재료 인터페이스를 인쇄 할 때 사용할 익스트루더 (도구 변경을 최소화하" -"기 위해 현재 익스트루더를 사용하려면 1+, 0). 이것은 라프트에도 영향을 미칩니" -"다." - -#: src/libslic3r/PrintConfig.cpp:1936 -msgid "Interface layers" -msgstr "인터페이스 레이어" - -#: src/libslic3r/PrintConfig.cpp:1938 -msgid "" -"Number of interface layers to insert between the object(s) and support " -"material." -msgstr "객체와 서포트 재료 사이에 삽입할 인터페이스 레이어 수입니다." - -#: src/libslic3r/PrintConfig.cpp:1945 -msgid "Interface pattern spacing" -msgstr "인터페이스 패턴 간격" - -#: src/libslic3r/PrintConfig.cpp:1947 -msgid "Spacing between interface lines. Set zero to get a solid interface." -msgstr "" -"인터페이스 라인 간 간격. 솔리드 인터페이스를 가져오려면 0을 설정하십시오." - -#: src/libslic3r/PrintConfig.cpp:1956 -msgid "" -"Speed for printing support material interface layers. If expressed as " -"percentage (for example 50%) it will be calculated over support material " -"speed." -msgstr "" -"서포트 재료 인터페이스 레이어 인쇄 속도 백분율(예: 50%)로 표현될 경우 서포트 " -"재료 속도에 따라 계산된다." - -#: src/libslic3r/PrintConfig.cpp:1965 -msgid "Pattern" -msgstr "패턴" - -#: src/libslic3r/PrintConfig.cpp:1967 -msgid "Pattern used to generate support material." -msgstr "서포트 재료를 생성하는 데 사용되는 패턴." - -#: src/libslic3r/PrintConfig.cpp:1973 -msgid "Rectilinear grid" -msgstr "직선 그리드" - -#: src/libslic3r/PrintConfig.cpp:1979 -msgid "Pattern spacing" -msgstr "패턴 간격" - -#: src/libslic3r/PrintConfig.cpp:1981 -msgid "Spacing between support material lines." -msgstr "서포트 재료 라인 사이의 간격." - -#: src/libslic3r/PrintConfig.cpp:1990 -msgid "Speed for printing support material." -msgstr "서포트 재료를 인쇄하는 속도." - -#: src/libslic3r/PrintConfig.cpp:1997 -msgid "Synchronize with object layers" -msgstr "객체 레이어와 동기화" - -#: src/libslic3r/PrintConfig.cpp:1999 -msgid "" -"Synchronize support layers with the object print layers. This is useful with " -"multi-material printers, where the extruder switch is expensive." -msgstr "" -"서포트 레이어를 프린트 레이어와 동기화하십시오. 이것은 스위치가 비싼 멀티 메" -"터리얼 프린터에서 유용하다." - -#: src/libslic3r/PrintConfig.cpp:2005 -msgid "Overhang threshold" -msgstr "오버행 한계점" - -#: src/libslic3r/PrintConfig.cpp:2007 -msgid "" -"Support material will not be generated for overhangs whose slope angle (90° " -"= vertical) is above the given threshold. In other words, this value " -"represent the most horizontal slope (measured from the horizontal plane) " -"that you can print without support material. Set to zero for automatic " -"detection (recommended)." -msgstr "" -"서포트 재료는 경사각(90° = 수직)이 지정된 임계점보다 높은 압출에 대해서는 생" -"성되지 않는다. 즉, 이 값은 서포트 재료 없이 인쇄할 수 있는 가장 수평 경사(수" -"평면에서 측정됨)를 나타낸다. 자동 감지를 위해 0으로 설정하십시오(권장)." - -#: src/libslic3r/PrintConfig.cpp:2019 -msgid "With sheath around the support" -msgstr "서포트 주변이나 외부로" - -#: src/libslic3r/PrintConfig.cpp:2021 -msgid "" -"Add a sheath (a single perimeter line) around the base support. This makes " -"the support more reliable, but also more difficult to remove." -msgstr "" -"기본 서포트 주위에 외장 (단일 주변 선)을 추가하십시오. 이것은 페이스 업을보" -"다 신뢰성있게 만들뿐만 아니라 제거하기도 어렵습니다." - -#: src/libslic3r/PrintConfig.cpp:2028 -msgid "" -"Extruder temperature for layers after the first one. Set this to zero to " -"disable temperature control commands in the output." -msgstr "" -"첫 번째 것 이후에 레이어에 대한 더 낮은 온도. 이 값을 0으로 설정하면 출력에" -"서 ​​온도 제어 명령을 비활성화 할 수 있습니다." - -#: src/libslic3r/PrintConfig.cpp:2036 -msgid "Detect thin walls" -msgstr "얇은 벽(walls) 감지" - -#: src/libslic3r/PrintConfig.cpp:2038 -msgid "" -"Detect single-width walls (parts where two extrusions don't fit and we need " -"to collapse them into a single trace)." -msgstr "싱글 너비 벽 (두 부분이 맞지 않는 부분과 무너지는 부분)을 감지합니다." - -#: src/libslic3r/PrintConfig.cpp:2044 -msgid "Threads" -msgstr "스레드(Threads)" - -#: src/libslic3r/PrintConfig.cpp:2045 -msgid "" -"Threads are used to parallelize long-running tasks. Optimal threads number " -"is slightly above the number of available cores/processors." -msgstr "" -"스레드는 장기 실행 태스크를 병렬 처리하는 데 사용됩니다. 최적의 스레드 수는 " -"사용 가능한 코어 / 프로세서 수보다 약간 높습니다." - -#: src/libslic3r/PrintConfig.cpp:2057 -msgid "" -"This custom code is inserted at every extruder change. If you don't leave " -"this empty, you are expected to take care of the toolchange yourself - " -"PrusaSlicer will not output any other G-code to change the filament. You can " -"use placeholder variables for all Slic3r settings as well as " -"[previous_extruder] and [next_extruder], so e.g. the standard toolchange " -"command can be scripted as T[next_extruder]." -msgstr "" -"이 사용자 지정 코드는 모든 압출기 변경 시 삽입됩니다. 이 것을 비워 두지 않으" -"면 도구 변경을 직접 처리해야합니다 - PrusaSlicer는 필라멘트를 변경하기 위해 " -"다른 G 코드를 출력하지 않습니다. 모든 Slic3r 설정과 [이전_압출기] 및 " -"[next_extruder]에 대해 자리 표시자 변수를 사용할 수 있으므로 표준 도구 변경 " -"명령을 T[next_extruder]로 스크립팅할 수 있습니다." - -#: src/libslic3r/PrintConfig.cpp:2070 -msgid "" -"Set this to a non-zero value to set a manual extrusion width for infill for " -"top surfaces. You may want to use thinner extrudates to fill all narrow " -"regions and get a smoother finish. If left zero, default extrusion width " -"will be used if set, otherwise nozzle diameter will be used. If expressed as " -"percentage (for example 90%) it will be computed over layer height." -msgstr "" -"이 값을 0이 아닌 값으로 설정하여 상단 서피스에 대한 infill의 수동 압출 폭을 " -"설정합니다. 얇은 압출 성형물을 사용하여 모든 좁은 지역을 채우고 더 매끄러운 " -"마무리를 할 수 있습니다. 0으로 설정된 경우 기본 압출 폭이 사용되고 그렇지 않" -"으면 노즐 지름이 사용됩니다. 백분율 (예 : 90 %)로 표현하면 레이어 높이를 기준" -"으로 계산됩니다." - -#: src/libslic3r/PrintConfig.cpp:2081 -msgid "" -"Speed for printing top solid layers (it only applies to the uppermost " -"external layers and not to their internal solid layers). You may want to " -"slow down this to get a nicer surface finish. This can be expressed as a " -"percentage (for example: 80%) over the solid infill speed above. Set to zero " -"for auto." -msgstr "" -"상단 솔리드 레이어 인쇄 속도 (솔리드 레이어가 아닌 최상단 외부 레이어에만 적" -"용) 표면을 더 좋게 마무리하려면 속도를 늦추시기 바랍니다. 이것은 위의 고체 충" -"전 속도에 대한 백분율 (예 : 80 %)로 나타낼 수 있습니다. 자동으로 0으로 설정하" -"십시오." - -#: src/libslic3r/PrintConfig.cpp:2096 -msgid "Number of solid layers to generate on top surfaces." -msgstr "상단 표면에 생성 할 솔리드 레이어 수입니다." - -#: src/libslic3r/PrintConfig.cpp:2097 -msgid "Top solid layers" -msgstr "탑 솔리드 레이어" - -#: src/libslic3r/PrintConfig.cpp:2103 -msgid "Speed for travel moves (jumps between distant extrusion points)." -msgstr "이동 속도 (먼 돌출 점 사이의 점프)." - -#: src/libslic3r/PrintConfig.cpp:2111 -msgid "Use firmware retraction" -msgstr "펌웨어 철회" - -#: src/libslic3r/PrintConfig.cpp:2112 -msgid "" -"This experimental setting uses G10 and G11 commands to have the firmware " -"handle the retraction. This is only supported in recent Marlin." -msgstr "" -"이 실험 설정은 G10 및 G11 명령을 사용하여 펌웨어에서 취소를 처리하도록합니" -"다. 이것은 최근의 말린에서만 지원됩니다." - -#: src/libslic3r/PrintConfig.cpp:2118 -msgid "Use relative E distances" -msgstr "상대적인 E 거리 사용" - -#: src/libslic3r/PrintConfig.cpp:2119 -msgid "" -"If your firmware requires relative E values, check this, otherwise leave it " -"unchecked. Most firmwares use absolute values." -msgstr "" -"펌웨어에 상대 E 값이 필요한 경우이 값을 선택하고, 그렇지 않으면 선택하지 마십" -"시오. 대부분의 회사는 절대 값을 사용합니다." - -#: src/libslic3r/PrintConfig.cpp:2125 -msgid "Use volumetric E" -msgstr "용적 E 사용" - -#: src/libslic3r/PrintConfig.cpp:2126 -msgid "" -"This experimental setting uses outputs the E values in cubic millimeters " -"instead of linear millimeters. If your firmware doesn't already know " -"filament diameter(s), you can put commands like 'M200 D[filament_diameter_0] " -"T0' in your start G-code in order to turn volumetric mode on and use the " -"filament diameter associated to the filament selected in Slic3r. This is " -"only supported in recent Marlin." -msgstr "" -"이 실험 설정은 선형 밀리미터 대신에 입방 밀리미터 단위의 E 값을 출력으로 사용" -"합니다. 펌웨어가 필라멘트 직경을 모르는 경우 볼륨 모드를 켜고 선택한 필라멘트" -"와 연결된 필라멘트 직경을 사용하기 위해 시작 G 코드에 'M200 D " -"[filament_diameter_0] T0'과 같은 명령을 입력 할 수 있습니다 Slic3r. 이것은 최" -"근의 말린에서만 지원됩니다." - -#: src/libslic3r/PrintConfig.cpp:2136 -msgid "Enable variable layer height feature" -msgstr "가변 레이어 높이 기능 사용" - -#: src/libslic3r/PrintConfig.cpp:2137 -msgid "" -"Some printers or printer setups may have difficulties printing with a " -"variable layer height. Enabled by default." -msgstr "" -"일부 프린터 또는 프린터 설정은 가변 레이어 높이로 인쇄하는 데 어려움이있을 " -"수 있습니다. 기본적으로 사용됩니다." - -#: src/libslic3r/PrintConfig.cpp:2143 -msgid "Wipe while retracting" -msgstr "수축시 닦아내십시오" - -#: src/libslic3r/PrintConfig.cpp:2144 -msgid "" -"This flag will move the nozzle while retracting to minimize the possible " -"blob on leaky extruders." -msgstr "" -"이 플래그는 누출된 리트랙싱의 블럽 가능성을 최소화하기 위해 수축하는 동안 노" -"즐을 이동시킨다." - -#: src/libslic3r/PrintConfig.cpp:2151 -msgid "" -"Multi material printers may need to prime or purge extruders on tool " -"changes. Extrude the excess material into the wipe tower." -msgstr "" -"멀티 메터리알 프린터는 공구 교환 시 익스트루더를 프라이밍하거나 제거해야 할 " -"수 있다. 과도한 물질을 와이퍼 타워에 돌출시킨다." - -#: src/libslic3r/PrintConfig.cpp:2157 -msgid "Purging volumes - load/unload volumes" -msgstr "볼륨 삭제 - 볼륨 로드/언로드" - -#: src/libslic3r/PrintConfig.cpp:2158 -msgid "" -"This vector saves required volumes to change from/to each tool used on the " -"wipe tower. These values are used to simplify creation of the full purging " -"volumes below." -msgstr "" -"이 벡터는 지우기 타워에서 사용 되는 각 도구에서/로 변경 하는 데 필요한 볼륨" -"을 저장 합니다. 이러한 값은 아래의 전체 퍼징 볼륨의 생성을 단순화 하는 데 사" -"용 됩니다." - -#: src/libslic3r/PrintConfig.cpp:2164 -msgid "Purging volumes - matrix" -msgstr "볼륨 삭제 - 행렬" - -#: src/libslic3r/PrintConfig.cpp:2165 -msgid "" -"This matrix describes volumes (in cubic milimetres) required to purge the " -"new filament on the wipe tower for any given pair of tools." -msgstr "" -"이 매트릭스는 지정 된 도구 쌍에 대해 와이퍼 타워의 새필라멘트를 제거 하는 데 " -"필요한 체적 (입방 밀리 미터)을 설명 합니다." - -#: src/libslic3r/PrintConfig.cpp:2174 -msgid "Position X" -msgstr "X축 위치" - -#: src/libslic3r/PrintConfig.cpp:2175 -msgid "X coordinate of the left front corner of a wipe tower" -msgstr "와이프 타워의 좌측 전면 모서리의 X 좌표" - -#: src/libslic3r/PrintConfig.cpp:2181 -msgid "Position Y" -msgstr "Y축 위치" - -#: src/libslic3r/PrintConfig.cpp:2182 -msgid "Y coordinate of the left front corner of a wipe tower" -msgstr "와이퍼 작동 타워의 좌측 전방 모서리의 Y 좌표" - -#: src/libslic3r/PrintConfig.cpp:2189 -msgid "Width of a wipe tower" -msgstr "와이퍼 타워 폭" - -#: src/libslic3r/PrintConfig.cpp:2195 -msgid "Wipe tower rotation angle" -msgstr "와이퍼 타워 회전각도" - -#: src/libslic3r/PrintConfig.cpp:2196 -msgid "Wipe tower rotation angle with respect to x-axis." -msgstr "X 축에 대해 타워 회전 각도를 닦습니다." - -#: src/libslic3r/PrintConfig.cpp:2203 -msgid "Wipe into this object's infill" -msgstr "이 오브젝트의 채우기로 지우기" - -#: src/libslic3r/PrintConfig.cpp:2204 -msgid "" -"Purging after toolchange will done inside this object's infills. This lowers " -"the amount of waste but may result in longer print time due to additional " -"travel moves." -msgstr "" -"도구 변경 후 제거는 이 개체의 채우기 내부에서 수행 됩니다. 이렇게 하면 낭비 " -"되는 양이 줄어들지만 추가적인 이동으로 인해 인쇄 시간이 길어질 수 있습니다." - -#: src/libslic3r/PrintConfig.cpp:2211 -msgid "Wipe into this object" -msgstr "이 개체로 지우기" - -#: src/libslic3r/PrintConfig.cpp:2212 -msgid "" -"Object will be used to purge the nozzle after a toolchange to save material " -"that would otherwise end up in the wipe tower and decrease print time. " -"Colours of the objects will be mixed as a result." -msgstr "" -"객체는 도구 변경 후 노즐을 소거 하는 데 사용 되며, 그렇지 않으면 와이프 타워" -"에서 종료 되는 재료를 저장 하고 인쇄 시간을 줄입니다. 그 결과 개체의 색상이 " -"혼합 됩니다." - -#: src/libslic3r/PrintConfig.cpp:2218 -msgid "Maximal bridging distance" -msgstr "최대 브리징 거리" - -#: src/libslic3r/PrintConfig.cpp:2219 -msgid "Maximal distance between supports on sparse infill sections." -msgstr "드문드문한 인필 섹션에서 지지대 사이의 최대 거리." - -#: src/libslic3r/PrintConfig.cpp:2225 -msgid "XY Size Compensation" -msgstr "XY 크기 보정" - -#: src/libslic3r/PrintConfig.cpp:2227 -msgid "" -"The object will be grown/shrunk in the XY plane by the configured value " -"(negative = inwards, positive = outwards). This might be useful for fine-" -"tuning hole sizes." -msgstr "" -"XY 평면에서 설정된 값(음수 = 안, 양 = 바깥쪽)에 따라 객체가 증가/정격된다. 이" -"는 구멍 크기를 미세 조정하는데 유용할 수 있다." - -#: src/libslic3r/PrintConfig.cpp:2235 -msgid "Z offset" -msgstr "Z 오프셋" - -#: src/libslic3r/PrintConfig.cpp:2236 -msgid "" -"This value will be added (or subtracted) from all the Z coordinates in the " -"output G-code. It is used to compensate for bad Z endstop position: for " -"example, if your endstop zero actually leaves the nozzle 0.3mm far from the " -"print bed, set this to -0.3 (or fix your endstop)." -msgstr "" -"이 값은 출력 G-코드의 모든 Z 좌표에서 추가(또는 감산)된다. 예를 들어, 엔드 스" -"톱 0이 실제로 노즐을 프린트 베드에서 0.3mm 떨어진 곳에 둔 경우, 이를 -0.3(또" -"는 엔드 스톱을 고정)으로 설정하십시오." - -#: src/libslic3r/PrintConfig.cpp:2294 -msgid "Display width" -msgstr "디스플레이 너비" - -#: src/libslic3r/PrintConfig.cpp:2295 -msgid "Width of the display" -msgstr "디스플레이의 폭입니다" - -#: src/libslic3r/PrintConfig.cpp:2300 -msgid "Display height" -msgstr "표시 높이" - -#: src/libslic3r/PrintConfig.cpp:2301 -msgid "Height of the display" -msgstr "디스플레이의 높이" - -#: src/libslic3r/PrintConfig.cpp:2306 -msgid "Number of pixels in" -msgstr "의 픽셀 수" - -#: src/libslic3r/PrintConfig.cpp:2308 -msgid "Number of pixels in X" -msgstr "X의 픽셀 수" - -#: src/libslic3r/PrintConfig.cpp:2314 -msgid "Number of pixels in Y" -msgstr "Y의 픽셀 수" - -#: src/libslic3r/PrintConfig.cpp:2319 -msgid "Display horizontal mirroring" -msgstr "수평 미러링 표시" - -#: src/libslic3r/PrintConfig.cpp:2320 -msgid "Mirror horizontally" -msgstr "수평으로 미러" - -#: src/libslic3r/PrintConfig.cpp:2321 -msgid "Enable horizontal mirroring of output images" -msgstr "출력 이미지의 수평 미러링 사용" - -#: src/libslic3r/PrintConfig.cpp:2326 -msgid "Display vertical mirroring" -msgstr "수직 미러링 표시" - -#: src/libslic3r/PrintConfig.cpp:2327 -msgid "Mirror vertically" -msgstr "수직으로 미러" - -#: src/libslic3r/PrintConfig.cpp:2328 -msgid "Enable vertical mirroring of output images" -msgstr "출력 이미지의 수직 미러링 사용" - -#: src/libslic3r/PrintConfig.cpp:2333 -msgid "Display orientation" -msgstr "디스플레이 방향" - -#: src/libslic3r/PrintConfig.cpp:2334 -msgid "" -"Set the actual LCD display orientation inside the SLA printer. Portrait mode " -"will flip the meaning of display width and height parameters and the output " -"images will be rotated by 90 degrees." -msgstr "" -"SLA 프린터 내에서 실제 LCD 디스플레이 방향을 설정 합니다. 세로 모드는 디스플" -"레이 너비 및 높이 매개 변수의 의미를 반전 하 고 출력 이미지는 90도 회전 합니" -"다." - -#: src/libslic3r/PrintConfig.cpp:2340 -msgid "Landscape" -msgstr "가로" - -#: src/libslic3r/PrintConfig.cpp:2341 -msgid "Portrait" -msgstr "세로모드" - -#: src/libslic3r/PrintConfig.cpp:2346 -msgid "Fast" -msgstr "빠른" - -#: src/libslic3r/PrintConfig.cpp:2347 -msgid "Fast tilt" -msgstr "빠른 기울기" - -#: src/libslic3r/PrintConfig.cpp:2348 -msgid "Time of the fast tilt" -msgstr "기울이기 시간" - -#: src/libslic3r/PrintConfig.cpp:2355 -msgid "Slow" -msgstr "느리게" - -#: src/libslic3r/PrintConfig.cpp:2356 -msgid "Slow tilt" -msgstr "슬로우 틸트" - -#: src/libslic3r/PrintConfig.cpp:2357 -msgid "Time of the slow tilt" -msgstr "느린 기울기의 시간" - -#: src/libslic3r/PrintConfig.cpp:2364 -msgid "Area fill" -msgstr "영역 채우기" - -#: src/libslic3r/PrintConfig.cpp:2365 -msgid "" -"The percentage of the bed area. \n" -"If the print area exceeds the specified value, \n" -"then a slow tilt will be used, otherwise - a fast tilt" -msgstr "" -"침대 영역의 비율입니다. \n" -"인쇄 영역이 지정 된 값을 초과 하면 \n" -"그런 다음 느린 기울기가 사용 됩니다, 그렇지 않으면-빠른 기울기가 됩니다" - -#: src/libslic3r/PrintConfig.cpp:2372 src/libslic3r/PrintConfig.cpp:2373 -#: src/libslic3r/PrintConfig.cpp:2374 -msgid "Printer scaling correction" -msgstr "프린터 스케일링 보정" - -#: src/libslic3r/PrintConfig.cpp:2380 src/libslic3r/PrintConfig.cpp:2381 -msgid "Printer absolute correction" -msgstr "프린터 절대 보정" - -#: src/libslic3r/PrintConfig.cpp:2382 -msgid "" -"Will inflate or deflate the sliced 2D polygons according to the sign of the " -"correction." -msgstr "교정 기호에 따라 슬라이스된 2D 폴리곤을 팽창 하거나 수축 합니다." - -#: src/libslic3r/PrintConfig.cpp:2388 src/libslic3r/PrintConfig.cpp:2389 -msgid "Printer gamma correction" -msgstr "프린터 감마 보정" - -#: src/libslic3r/PrintConfig.cpp:2390 -msgid "" -"This will apply a gamma correction to the rasterized 2D polygons. A gamma " -"value of zero means thresholding with the threshold in the middle. This " -"behaviour eliminates antialiasing without losing holes in polygons." -msgstr "" -"이렇게 하면 래스터화된 2D 다각형에 감마 보정이 적용 됩니다. 감마 값이 0 이면 " -"중간에 임계값이 임계화 의미입니다. 이 동작은 폴리곤의 구멍을 잃지 않고 안티알" -"리아싱을 제거 합니다." - -#: src/libslic3r/PrintConfig.cpp:2401 src/libslic3r/PrintConfig.cpp:2402 -msgid "Initial layer height" -msgstr "초기 레이어 높이" - -#: src/libslic3r/PrintConfig.cpp:2408 -msgid "Faded layers" -msgstr "페이드 레이어" - -#: src/libslic3r/PrintConfig.cpp:2409 -msgid "" -"Number of the layers needed for the exposure time fade from initial exposure " -"time to the exposure time" -msgstr "노출 시간에 필요한 레이어 수는 초기 노출 시간에서 노출 시간으로 페이드" - -#: src/libslic3r/PrintConfig.cpp:2416 src/libslic3r/PrintConfig.cpp:2417 -msgid "Exposure time" -msgstr "노출 시간" - -#: src/libslic3r/PrintConfig.cpp:2423 src/libslic3r/PrintConfig.cpp:2424 -msgid "Initial exposure time" -msgstr "초기 노출 시간" - -#: src/libslic3r/PrintConfig.cpp:2430 src/libslic3r/PrintConfig.cpp:2431 -msgid "Correction for expansion" -msgstr "확장 보정" - -#: src/libslic3r/PrintConfig.cpp:2437 -msgid "SLA print material notes" -msgstr "SLA 인쇄 재료 참고 사항" - -#: src/libslic3r/PrintConfig.cpp:2438 -msgid "You can put your notes regarding the SLA print material here." -msgstr "여기에서 SLA 인쇄 자료에 대한 메모를 넣을 수 있습니다." - -#: src/libslic3r/PrintConfig.cpp:2446 src/libslic3r/PrintConfig.cpp:2457 -msgid "Default SLA material profile" -msgstr "기본 SLA 재질 프로 파일" - -#: src/libslic3r/PrintConfig.cpp:2468 -msgid "Generate supports" -msgstr "지원 생성" - -#: src/libslic3r/PrintConfig.cpp:2470 -msgid "Generate supports for the models" -msgstr "모델에 대한 지원 생성" - -#: src/libslic3r/PrintConfig.cpp:2475 -msgid "Support head front diameter" -msgstr "서포트 헤드 전면 지름" - -#: src/libslic3r/PrintConfig.cpp:2477 -msgid "Diameter of the pointing side of the head" -msgstr "헤드 포인팅 측면 지름" - -#: src/libslic3r/PrintConfig.cpp:2484 -msgid "Support head penetration" -msgstr "서포트 헤드 관통" - -#: src/libslic3r/PrintConfig.cpp:2486 -msgid "How much the pinhead has to penetrate the model surface" -msgstr "핀 헤드가 모델 표면에 침투 하는 정도" - -#: src/libslic3r/PrintConfig.cpp:2493 -msgid "Support head width" -msgstr "서포트 헤드 폭" - -#: src/libslic3r/PrintConfig.cpp:2495 -msgid "Width from the back sphere center to the front sphere center" -msgstr "뒤쪽 구 중심에서 앞쪽 구 중심 까지의 폭입니다" - -#: src/libslic3r/PrintConfig.cpp:2503 -msgid "Support pillar diameter" -msgstr "서포트 기둥 지름" - -#: src/libslic3r/PrintConfig.cpp:2505 -msgid "Diameter in mm of the support pillars" -msgstr "서포트 기둥의 지름 (mm)" - -#: src/libslic3r/PrintConfig.cpp:2513 -msgid "Support pillar connection mode" -msgstr "기둥 연결 모드 지원" - -#: src/libslic3r/PrintConfig.cpp:2514 -msgid "" -"Controls the bridge type between two neighboring pillars. Can be zig-zag, " -"cross (double zig-zag) or dynamic which will automatically switch between " -"the first two depending on the distance of the two pillars." -msgstr "" -"인접한 두 기둥 사이의 교량 유형을 제어 합니다. 두 기둥의 거리에 따라 자동으" -"로 처음 두 사이를 전환 하는 지그재그, 크로스 (지그재그 더블 지그재그) 또는 동" -"적 수 있습니다." - -#: src/libslic3r/PrintConfig.cpp:2522 -msgid "Zig-Zag" -msgstr "지그재그" - -#: src/libslic3r/PrintConfig.cpp:2523 -msgid "Cross" -msgstr "크로스" - -#: src/libslic3r/PrintConfig.cpp:2524 -msgid "Dynamic" -msgstr "동적" - -#: src/libslic3r/PrintConfig.cpp:2536 -msgid "Pillar widening factor" -msgstr "기둥 확장 계수" - -#: src/libslic3r/PrintConfig.cpp:2538 -msgid "" -"Merging bridges or pillars into another pillars can increase the radius. " -"Zero means no increase, one means full increase." -msgstr "" -"브릿지 또는 기둥을 다른 기둥에 병합 하면 반지름을 늘릴 수 있습니다. 0은 증가 " -"없음을 의미 하나는 전체 증가를 의미 합니다." - -#: src/libslic3r/PrintConfig.cpp:2547 -msgid "Support base diameter" -msgstr "서포트 베이스 지름" - -#: src/libslic3r/PrintConfig.cpp:2549 -msgid "Diameter in mm of the pillar base" -msgstr "기둥 베이스의 mm 직경" - -#: src/libslic3r/PrintConfig.cpp:2557 -msgid "Support base height" -msgstr "서포트 기준 높이" - -#: src/libslic3r/PrintConfig.cpp:2559 -msgid "The height of the pillar base cone" -msgstr "서포트 베이스 원추의 높이" - -#: src/libslic3r/PrintConfig.cpp:2566 -msgid "Support base safety distance" -msgstr "지지기본 안전 거리" - -#: src/libslic3r/PrintConfig.cpp:2569 -msgid "" -"The minimum distance of the pillar base from the model in mm. Makes sense in " -"zero elevation mode where a gap according to this parameter is inserted " -"between the model and the pad." -msgstr "" -"모델에서 기둥 베이스의 최소 거리(mm.mm.)는 이 매개변수에 따른 간격이 모델과 " -"패드 사이에 삽입되는 제로 고도 모드에서 의미가 있습니다." - -#: src/libslic3r/PrintConfig.cpp:2579 -msgid "Critical angle" -msgstr "임계 각도" - -#: src/libslic3r/PrintConfig.cpp:2581 -msgid "The default angle for connecting support sticks and junctions." -msgstr "서포트 스틱과 접합부를 연결 하는 기본 각도입니다." - -#: src/libslic3r/PrintConfig.cpp:2589 -msgid "Max bridge length" -msgstr "최대 브리지 길이" - -#: src/libslic3r/PrintConfig.cpp:2591 -msgid "The max length of a bridge" -msgstr "브릿지의 최대 길이" - -#: src/libslic3r/PrintConfig.cpp:2598 -msgid "Max pillar linking distance" -msgstr "최대 기둥 연결 거리" - -#: src/libslic3r/PrintConfig.cpp:2600 -msgid "" -"The max distance of two pillars to get linked with each other. A zero value " -"will prohibit pillar cascading." -msgstr "" -"서로 연결 되는 두기둥의 최대 거리. 0 값은 기둥을 계단식으로 금지 합니다." - -#: src/libslic3r/PrintConfig.cpp:2608 -msgid "Object elevation" -msgstr "객체 고도" - -#: src/libslic3r/PrintConfig.cpp:2610 -msgid "" -"How much the supports should lift up the supported object. If this value is " -"zero, the bottom of the model geometry will be considered as part of the pad." -msgstr "" -"지원 대상을 들어 올려야 하는 양입니다. 이 값이 0이면 모델 형상의 맨 아래가 패" -"드의 일부로 간주됩니다." - -#: src/libslic3r/PrintConfig.cpp:2622 -msgid "This is a relative measure of support points density." -msgstr "이는 서포트 점 밀도의 상대적인 척도입니다." - -#: src/libslic3r/PrintConfig.cpp:2628 -msgid "Minimal distance of the support points" -msgstr "서포트 지점의 최소 거리" - -#: src/libslic3r/PrintConfig.cpp:2630 -msgid "No support points will be placed closer than this threshold." -msgstr "서포트 지점은 이 임계값 보다 더 가깝게 배치 되지 않습니다." - -#: src/libslic3r/PrintConfig.cpp:2636 -msgid "Use pad" -msgstr "패드 사용" - -#: src/libslic3r/PrintConfig.cpp:2638 -msgid "Add a pad underneath the supported model" -msgstr "서포트 되는 모델 아래에 패드 추가" - -#: src/libslic3r/PrintConfig.cpp:2643 -msgid "Pad wall thickness" -msgstr "패드 벽 두께" - -#: src/libslic3r/PrintConfig.cpp:2645 -msgid "The thickness of the pad and its optional cavity walls." -msgstr "패드의 두께와 옵션 캐비티 벽." - -#: src/libslic3r/PrintConfig.cpp:2653 -msgid "Pad wall height" -msgstr "패드 벽 높이" - -#: src/libslic3r/PrintConfig.cpp:2654 -msgid "" -"Defines the pad cavity depth. Set to zero to disable the cavity. Be careful " -"when enabling this feature, as some resins may produce an extreme suction " -"effect inside the cavity, which makes peeling the print off the vat foil " -"difficult." -msgstr "" -"패드 캐비티 깊이를 정의 합니다. 캐비티를 비활성화 하려면 0으로 설정 합니다. " -"이 기능을 활성화 할 때 주의 해야할, 일부 수 캐비티 내부 극단적인 흡입 효과를 " -"생성 할 수도 있기 때문에, vat 호일 인쇄를 벗겨 어렵게 만든다." - -#: src/libslic3r/PrintConfig.cpp:2667 -msgid "Max merge distance" -msgstr "최대 병합 거리" - -#: src/libslic3r/PrintConfig.cpp:2669 -msgid "" -"Some objects can get along with a few smaller pads instead of a single big " -"one. This parameter defines how far the center of two smaller pads should " -"be. If theyare closer, they will get merged into one pad." -msgstr "" -"일부 개체는 큰 하나 대신 몇 가지 작은 패드와 함께 얻을 수 있습니다. 이 매개 " -"변수는 두 개의 작은 패드의 중심이 얼마나 되어야 하는지 정의 합니다. 그들은 하" -"나의 패드에 병합을 얻을 것이다." - -#: src/libslic3r/PrintConfig.cpp:2680 -msgid "Pad edge radius" -msgstr "패드 가장자리 반경" - -#: src/libslic3r/PrintConfig.cpp:2689 -msgid "Pad wall slope" -msgstr "패드 벽 경사" - -#: src/libslic3r/PrintConfig.cpp:2691 -msgid "" -"The slope of the pad wall relative to the bed plane. 90 degrees means " -"straight walls." -msgstr "" -"침대 평면을 기준으로 하는 패드 벽의 기울기입니다. 90도는 직선 벽을 의미 합니" -"다." - -#: src/libslic3r/PrintConfig.cpp:2700 -msgid "Pad object gap" -msgstr "패드 오브젝트 갭" - -#: src/libslic3r/PrintConfig.cpp:2702 -msgid "" -"The gap between the object bottom and the generated pad in zero elevation " -"mode." -msgstr "0 고도 모드에서 오브젝트 바닥과 생성된 패드 사이의 간격입니다." - -#: src/libslic3r/PrintConfig.cpp:2711 -msgid "Pad object connector stride" -msgstr "패드 오브젝트 커넥터 보폭" - -#: src/libslic3r/PrintConfig.cpp:2713 -msgid "" -"Distance between two connector sticks between the object pad and the " -"generated pad." -msgstr "오브젝트 패드와 생성된 패드 사이의 두 커넥터 스틱 사이의 거리입니다." - -#: src/libslic3r/PrintConfig.cpp:2721 -msgid "Pad object connector width" -msgstr "패드 오브젝트 커넥터 너비" - -#: src/libslic3r/PrintConfig.cpp:2723 -msgid "" -"The width of the connectors sticks which connect the object pad and the " -"generated pad." -msgstr "커넥터의 너비는 오브젝트 패드와 생성된 패드를 연결하는 스틱입니다." - -#: src/libslic3r/PrintConfig.cpp:2731 -msgid "Pad object connector penetration" -msgstr "패드 오브젝트 커넥터 침투" - -#: src/libslic3r/PrintConfig.cpp:2734 -msgid "How much should the tiny connectors penetrate into the model body." -msgstr "작은 커넥터가 모델 본체에 얼마나 침투해야 하는가?" - -#: src/libslic3r/PrintConfig.cpp:3094 -msgid "Export OBJ" -msgstr "OBJ 내보내기" - -#: src/libslic3r/PrintConfig.cpp:3095 -msgid "Export the model(s) as OBJ." -msgstr "모델을 OBJ로 내보냅니다." - -#: src/libslic3r/PrintConfig.cpp:3106 -msgid "Export SLA" -msgstr "STL로 내보내기" - -#: src/libslic3r/PrintConfig.cpp:3107 -msgid "Slice the model and export SLA printing layers as PNG." -msgstr "모델을 분할하고 SLA 인쇄 레이어를 PNG로 내보냅니다." - -#: src/libslic3r/PrintConfig.cpp:3112 -msgid "Export 3MF" -msgstr "3MF 내보내기" - -#: src/libslic3r/PrintConfig.cpp:3113 -msgid "Export the model(s) as 3MF." -msgstr "모델을 3MF로 내보냅니다." - -#: src/libslic3r/PrintConfig.cpp:3117 -msgid "Export AMF" -msgstr "AMF 내보내기" - -#: src/libslic3r/PrintConfig.cpp:3118 -msgid "Export the model(s) as AMF." -msgstr "모델을 AMF로 내보냅니다." - -#: src/libslic3r/PrintConfig.cpp:3122 -msgid "Export STL" -msgstr "STL 내보내기" - -#: src/libslic3r/PrintConfig.cpp:3123 -msgid "Export the model(s) as STL." -msgstr "모델을 STL로 내보냅니다." - -#: src/libslic3r/PrintConfig.cpp:3128 -msgid "Slice the model and export toolpaths as G-code." -msgstr "모델을 슬라이스하고 공구 경로를 G 코드로 내보냅니다." - -#: src/libslic3r/PrintConfig.cpp:3133 -msgid "Slice" -msgstr "슬라이스" - -#: src/libslic3r/PrintConfig.cpp:3134 -msgid "" -"Slice the model as FFF or SLA based on the printer_technology configuration " -"value." -msgstr "프린터_기술 구성 값을 기반으로 모델을 FFF 또는 SLA로 슬라이스합니다." - -#: src/libslic3r/PrintConfig.cpp:3139 -msgid "Help" -msgstr "도움말" - -#: src/libslic3r/PrintConfig.cpp:3140 -msgid "Show this help." -msgstr "이 도움말을 표시 합니다." - -#: src/libslic3r/PrintConfig.cpp:3145 -msgid "Help (FFF options)" -msgstr "도움말 (FFF 옵션)" - -#: src/libslic3r/PrintConfig.cpp:3146 -msgid "Show the full list of print/G-code configuration options." -msgstr "인쇄/G 코드 구성 옵션의 전체 목록을 표시 합니다." - -#: src/libslic3r/PrintConfig.cpp:3150 -msgid "Help (SLA options)" -msgstr "도움말 (SLA 옵션)" - -#: src/libslic3r/PrintConfig.cpp:3151 -msgid "Show the full list of SLA print configuration options." -msgstr "SLA 인쇄 구성 옵션의 전체 목록을 표시 합니다." - -#: src/libslic3r/PrintConfig.cpp:3155 -msgid "Output Model Info" -msgstr "출력 모델 정보" - -#: src/libslic3r/PrintConfig.cpp:3156 -msgid "Write information about the model to the console." -msgstr "모델에 대한 정보를 콘솔에 씁니다." - -#: src/libslic3r/PrintConfig.cpp:3160 -msgid "Save config file" -msgstr "구성 파일 저장" - -#: src/libslic3r/PrintConfig.cpp:3161 -msgid "Save configuration to the specified file." -msgstr "지정 된 파일에 구성을 저장 합니다." - -#: src/libslic3r/PrintConfig.cpp:3171 -msgid "Align XY" -msgstr "XY 정렬" - -#: src/libslic3r/PrintConfig.cpp:3172 -msgid "Align the model to the given point." -msgstr "모델을 지정된 점에 맞춥니다." - -#: src/libslic3r/PrintConfig.cpp:3177 -msgid "Cut model at the given Z." -msgstr "지정된 Z에서 모델을 잘라냅니다." - -#: src/libslic3r/PrintConfig.cpp:3198 -msgid "Center" -msgstr "중앙" - -#: src/libslic3r/PrintConfig.cpp:3199 -msgid "Center the print around the given center." -msgstr "지정된 중심을 중심으로 인쇄 합니다." - -#: src/libslic3r/PrintConfig.cpp:3203 -msgid "Don't arrange" -msgstr "준비하지 마십시오" - -#: src/libslic3r/PrintConfig.cpp:3204 -msgid "" -"Do not rearrange the given models before merging and keep their original XY " -"coordinates." -msgstr "" -"병합하기 전에 지정된 모델을 재정렬하고 원래 XY 좌표를 유지하지 마십시오." - -#: src/libslic3r/PrintConfig.cpp:3207 -msgid "Duplicate" -msgstr "복사" - -#: src/libslic3r/PrintConfig.cpp:3208 -msgid "Multiply copies by this factor." -msgstr "이 계수로 복사본을 곱합니다." - -#: src/libslic3r/PrintConfig.cpp:3212 -msgid "Duplicate by grid" -msgstr "모눈에 따라 복제" - -#: src/libslic3r/PrintConfig.cpp:3213 -msgid "Multiply copies by creating a grid." -msgstr "격자를 만들어 복사본을 곱합니다." - -#: src/libslic3r/PrintConfig.cpp:3216 -msgid "Merge" -msgstr "병합" - -#: src/libslic3r/PrintConfig.cpp:3217 -msgid "" -"Arrange the supplied models in a plate and merge them in a single model in " -"order to perform actions once." -msgstr "" -"한 번 작업을 수행하기 위해 제공 된 모델을 정렬하고 단일 모델로 병합 합니다." - -#: src/libslic3r/PrintConfig.cpp:3222 -msgid "" -"Try to repair any non-manifold meshes (this option is implicitly added " -"whenever we need to slice the model to perform the requested action)." -msgstr "" -"비 다양체 메쉬를 복구 하십시오 (요청 된 작업을 수행 하기 위해 모델을 슬라이" -"스 해야 할때마다 이 옵션이 암시적으로 추가 됨)." - -#: src/libslic3r/PrintConfig.cpp:3226 -msgid "Rotation angle around the Z axis in degrees." -msgstr "Z 축 주위의 회전 각도입니다." - -#: src/libslic3r/PrintConfig.cpp:3230 -msgid "Rotate around X" -msgstr "X 주위 회전" - -#: src/libslic3r/PrintConfig.cpp:3231 -msgid "Rotation angle around the X axis in degrees." -msgstr "X 축을 중심으로 회전 각도 (도)입니다." - -#: src/libslic3r/PrintConfig.cpp:3235 -msgid "Rotate around Y" -msgstr "Y 주위로 회전" - -#: src/libslic3r/PrintConfig.cpp:3236 -msgid "Rotation angle around the Y axis in degrees." -msgstr "Y 축을 중심으로 회전 각도 (도)입니다." - -#: src/libslic3r/PrintConfig.cpp:3241 -msgid "Scaling factor or percentage." -msgstr "배율 인수 또는 백분율입니다." - -#: src/libslic3r/PrintConfig.cpp:3246 -msgid "" -"Detect unconnected parts in the given model(s) and split them into separate " -"objects." -msgstr "" -"지정 된 모델에서 연결 되지 않은 부품을 감지 하여 별도의 객체로 분할 합니다." - -#: src/libslic3r/PrintConfig.cpp:3249 -msgid "Scale to Fit" -msgstr "크기에 맞게 조정" - -#: src/libslic3r/PrintConfig.cpp:3250 -msgid "Scale to fit the given volume." -msgstr "지정 된 볼륨에 맞게 크기를 조정 합니다." - -#: src/libslic3r/PrintConfig.cpp:3259 -msgid "Ignore non-existent config files" -msgstr "존재 하지 않는 구성 파일 무시" - -#: src/libslic3r/PrintConfig.cpp:3260 -msgid "Do not fail if a file supplied to --load does not exist." -msgstr "로드에 제공 된 파일이 없는 경우 실패 하지 않습니다." - -#: src/libslic3r/PrintConfig.cpp:3263 -msgid "Load config file" -msgstr "구성 파일 로드" - -#: src/libslic3r/PrintConfig.cpp:3264 -msgid "" -"Load configuration from the specified file. It can be used more than once to " -"load options from multiple files." -msgstr "" -"지정 된 파일에서 구성을 로드 합니다. 여러 파일에서 옵션을 로드 하는 데 두 번 " -"이상 사용할 수 있습니다." - -#: src/libslic3r/PrintConfig.cpp:3267 -msgid "Output File" -msgstr "출력파일" - -#: src/libslic3r/PrintConfig.cpp:3268 -msgid "" -"The file where the output will be written (if not specified, it will be " -"based on the input file)." -msgstr "" -"출력이 기록 되는 파일 (지정 하지 않은 경우 입력 파일을 기반으로 합니다)." - -#: src/libslic3r/PrintConfig.cpp:3278 -msgid "Data directory" -msgstr "데이터 디렉터리" - -#: src/libslic3r/PrintConfig.cpp:3279 -msgid "" -"Load and store settings at the given directory. This is useful for " -"maintaining different profiles or including configurations from a network " -"storage." -msgstr "" -"지정 된 디렉터리에 설정을 로드 하 고 저장 합니다. 이 기능은 다른 프로 파일을 " -"유지 관리 하거나 네트워크 스토리지의 구성을 포함 하는 데 유용 합니다." - -#: src/libslic3r/PrintConfig.cpp:3282 -msgid "Logging level" -msgstr "로깅 수준" - -#: src/libslic3r/PrintConfig.cpp:3283 -msgid "" -"Messages with severity lower or eqal to the loglevel will be printed out. 0:" -"trace, 1:debug, 2:info, 3:warning, 4:error, 5:fatal" -msgstr "" -"로그 수준에 대한 심각도가 낮거나 eqal인 메시지가 인쇄됩니다. 0:추적, 1:디버" -"그, 2:정보, 3:경고, 4:오류, 5:치명적" - -#: src/libslic3r/PrintConfig.cpp:3288 -msgid "Render with a software renderer" -msgstr "소프트웨어 렌더러를 사용 하 여 렌더링" - -#: src/libslic3r/PrintConfig.cpp:3289 -msgid "" -"Render with a software renderer. The bundled MESA software renderer is " -"loaded instead of the default OpenGL driver." -msgstr "" -"소프트웨어 렌더러를 사용 하여 렌더링 합니다. 번들 메사 소프트웨어 렌더러는 기" -"본 OpenGL 드라이버 대신 로드 됩니다." - -#: src/libslic3r/PrintObject.cpp:110 -msgid "Processing triangulated mesh" -msgstr "삼각 측정 메시 처리" - -#: src/libslic3r/PrintObject.cpp:141 -msgid "Generating perimeters" -msgstr "둘레 생성" - -#: src/libslic3r/PrintObject.cpp:251 -msgid "Preparing infill" -msgstr "채우기 준비" - -#: src/libslic3r/PrintObject.cpp:391 -msgid "Generating support material" -msgstr "지원 자료 생성" - -#: src/libslic3r/GCode/PreviewData.cpp:176 -msgid "Mixed" -msgstr "혼합" - -#: src/libslic3r/GCode/PreviewData.cpp:396 -msgid "Height (mm)" -msgstr "높이 (mm)" - -#: src/libslic3r/GCode/PreviewData.cpp:398 -msgid "Width (mm)" -msgstr "폭 (mm)" - -#: src/libslic3r/GCode/PreviewData.cpp:400 -msgid "Speed (mm/s)" -msgstr "속도 (mm/s)" - -#: src/libslic3r/GCode/PreviewData.cpp:402 -msgid "Volumetric flow rate (mm3/s)" -msgstr "용적 유량값 (mm3/s)" - -#: src/libslic3r/GCode/PreviewData.cpp:493 -msgid "Default print color" -msgstr "기본 인쇄 색상" - -#: src/libslic3r/GCode/PreviewData.cpp:500 -#, c-format -msgid "up to %.2f mm" -msgstr "최대%.2f mm" - -#: src/libslic3r/GCode/PreviewData.cpp:504 -#, c-format -msgid "above %.2f mm" -msgstr "above %.2f mm" - -#: src/libslic3r/GCode/PreviewData.cpp:509 -#, c-format -msgid "%.2f - %.2f mm" -msgstr "%.2f - %.2f mm" From c4117c5cb615b22b89a84e9f2bd51c33e69ebd45 Mon Sep 17 00:00:00 2001 From: lee hakmin Date: Fri, 23 Aug 2019 23:50:53 +0900 Subject: [PATCH 009/336] Delete PrusaSlicer_kr.po --- .../localization/ko_KR/PrusaSlicer_kr.po | 7814 ----------------- 1 file changed, 7814 deletions(-) delete mode 100644 resources/localization/ko_KR/PrusaSlicer_kr.po diff --git a/resources/localization/ko_KR/PrusaSlicer_kr.po b/resources/localization/ko_KR/PrusaSlicer_kr.po deleted file mode 100644 index d1d53aef7d..0000000000 --- a/resources/localization/ko_KR/PrusaSlicer_kr.po +++ /dev/null @@ -1,7814 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: slic3rkorean\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-04-09 14:34+0200\n" -"PO-Revision-Date: 2019-05-16 10:02+0900\n" -"Last-Translator: lee hak-min \n" -"Language-Team: Korean\n" -"Language: ko_KR\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.2.1\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"X-Crowdin-Project: slic3rkorean\n" -"X-Crowdin-Language: ko\n" -"X-Crowdin-File: ko_KR.po\n" - -#: src/slic3r/GUI/AboutDialog.cpp:35 -msgid "About Slic3r" -msgstr "Slic3r에 대하여" - -#: src/slic3r/GUI/AboutDialog.cpp:64 src/slic3r/GUI/MainFrame.cpp:52 -msgid "Version" -msgstr "버전" - -#: src/slic3r/GUI/BedShapeDialog.cpp:43 -msgid "Shape" -msgstr "모양" - -#: src/slic3r/GUI/BedShapeDialog.cpp:51 -msgid "Rectangular" -msgstr "직사각형" - -#: src/slic3r/GUI/BedShapeDialog.cpp:55 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:118 src/slic3r/GUI/Plater.cpp:136 -#: src/slic3r/GUI/Tab.cpp:2185 -msgid "Size" -msgstr "사이즈" - -#: src/slic3r/GUI/BedShapeDialog.cpp:56 -msgid "Size in X and Y of the rectangular plate." -msgstr "사격형 플레이트 X 및 Y 크기." - -#: src/slic3r/GUI/BedShapeDialog.cpp:62 -msgid "Origin" -msgstr "원본" - -#: src/slic3r/GUI/BedShapeDialog.cpp:63 -msgid "" -"Distance of the 0,0 G-code coordinate from the front left corner of the " -"rectangle." -msgstr "사각형의 전면 왼쪽된 모서리에서 0, 0 G-코드 좌표 거리입니다." - -#: src/slic3r/GUI/BedShapeDialog.cpp:67 -msgid "Circular" -msgstr "원형" - -#: src/slic3r/GUI/BedShapeDialog.cpp:70 src/slic3r/GUI/ConfigWizard.cpp:111 -#: src/slic3r/GUI/ConfigWizard.cpp:544 src/slic3r/GUI/ConfigWizard.cpp:558 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:115 -#: src/slic3r/GUI/RammingChart.cpp:81 src/slic3r/GUI/WipeTowerDialog.cpp:84 -#: src/libslic3r/PrintConfig.cpp:59 src/libslic3r/PrintConfig.cpp:66 -#: src/libslic3r/PrintConfig.cpp:75 src/libslic3r/PrintConfig.cpp:209 -#: src/libslic3r/PrintConfig.cpp:284 src/libslic3r/PrintConfig.cpp:292 -#: src/libslic3r/PrintConfig.cpp:342 src/libslic3r/PrintConfig.cpp:352 -#: src/libslic3r/PrintConfig.cpp:472 src/libslic3r/PrintConfig.cpp:483 -#: src/libslic3r/PrintConfig.cpp:501 src/libslic3r/PrintConfig.cpp:679 -#: src/libslic3r/PrintConfig.cpp:1165 src/libslic3r/PrintConfig.cpp:1226 -#: src/libslic3r/PrintConfig.cpp:1244 src/libslic3r/PrintConfig.cpp:1262 -#: src/libslic3r/PrintConfig.cpp:1314 src/libslic3r/PrintConfig.cpp:1324 -#: src/libslic3r/PrintConfig.cpp:1445 src/libslic3r/PrintConfig.cpp:1453 -#: src/libslic3r/PrintConfig.cpp:1494 src/libslic3r/PrintConfig.cpp:1502 -#: src/libslic3r/PrintConfig.cpp:1512 src/libslic3r/PrintConfig.cpp:1520 -#: src/libslic3r/PrintConfig.cpp:1528 src/libslic3r/PrintConfig.cpp:1611 -#: src/libslic3r/PrintConfig.cpp:1827 src/libslic3r/PrintConfig.cpp:1897 -#: src/libslic3r/PrintConfig.cpp:1931 src/libslic3r/PrintConfig.cpp:2123 -#: src/libslic3r/PrintConfig.cpp:2130 src/libslic3r/PrintConfig.cpp:2137 -#: src/libslic3r/PrintConfig.cpp:2167 src/libslic3r/PrintConfig.cpp:2177 -#: src/libslic3r/PrintConfig.cpp:2187 src/libslic3r/PrintConfig.cpp:2293 -#: src/libslic3r/PrintConfig.cpp:2368 src/libslic3r/PrintConfig.cpp:2377 -#: src/libslic3r/PrintConfig.cpp:2386 src/libslic3r/PrintConfig.cpp:2396 -#: src/libslic3r/PrintConfig.cpp:2440 src/libslic3r/PrintConfig.cpp:2450 -#: src/libslic3r/PrintConfig.cpp:2469 src/libslic3r/PrintConfig.cpp:2479 -#: src/libslic3r/PrintConfig.cpp:2488 src/libslic3r/PrintConfig.cpp:2506 -#: src/libslic3r/PrintConfig.cpp:2521 src/libslic3r/PrintConfig.cpp:2532 -#: src/libslic3r/PrintConfig.cpp:2545 src/libslic3r/PrintConfig.cpp:2555 -msgid "mm" -msgstr "mm" - -#: src/slic3r/GUI/BedShapeDialog.cpp:71 src/libslic3r/PrintConfig.cpp:676 -msgid "Diameter" -msgstr "노즐 직경" - -#: src/slic3r/GUI/BedShapeDialog.cpp:72 -msgid "" -"Diameter of the print bed. It is assumed that origin (0,0) is located in the " -"center." -msgstr "인쇄 침대의 직경. 원점 (0,0) 은 중심에 있다고 가정합니다." - -#: src/slic3r/GUI/BedShapeDialog.cpp:76 src/slic3r/GUI/GUI_Preview.cpp:239 -#: src/libslic3r/GCode/PreviewData.cpp:175 -msgid "Custom" -msgstr "사용자 정의" - -#: src/slic3r/GUI/BedShapeDialog.cpp:80 -msgid "Load shape from STL..." -msgstr "STL파일 로드." - -#: src/slic3r/GUI/BedShapeDialog.cpp:126 -msgid "Settings" -msgstr "설정" - -#: src/slic3r/GUI/BedShapeDialog.cpp:299 -msgid "Choose a file to import bed shape from (STL/OBJ/AMF/3MF/PRUSA):" -msgstr "침대 모양 (STL/OBJ/AMF/3MF/PRUSA) 에서 가져오려는 파일을 선택 합니다:" - -#: src/slic3r/GUI/BedShapeDialog.cpp:316 src/slic3r/GUI/GUI_ObjectList.cpp:1252 -msgid "Error! " -msgstr "에러! " - -#: src/slic3r/GUI/BedShapeDialog.cpp:325 -msgid "The selected file contains no geometry." -msgstr "선택한 파일에는 형상이 없는 포함 되어 있습니다." - -#: src/slic3r/GUI/BedShapeDialog.cpp:329 -msgid "" -"The selected file contains several disjoint areas. This is not supported." -msgstr "" -"선택한 파일 여러 분리 된 영역을 포함 되어 있습니다. 이 지원 되지 않습니다." - -#: src/slic3r/GUI/BedShapeDialog.hpp:44 src/slic3r/GUI/ConfigWizard.cpp:507 -msgid "Bed Shape" -msgstr "배드 모양" - -#: src/slic3r/GUI/BonjourDialog.cpp:55 -msgid "Network lookup" -msgstr "네트워크 조회" - -#: src/slic3r/GUI/BonjourDialog.cpp:72 -msgid "Address" -msgstr "주소" - -#: src/slic3r/GUI/BonjourDialog.cpp:73 -msgid "Hostname" -msgstr "호스트이름" - -#: src/slic3r/GUI/BonjourDialog.cpp:74 -msgid "Service name" -msgstr "서비스 이름" - -#: src/slic3r/GUI/BonjourDialog.cpp:76 -msgid "OctoPrint version" -msgstr "옥토프린트 버전" - -#: src/slic3r/GUI/BonjourDialog.cpp:218 -msgid "Searching for devices" -msgstr "디바이스 검색" - -#: src/slic3r/GUI/BonjourDialog.cpp:225 -msgid "Finished" -msgstr "완료" - -#: src/slic3r/GUI/ButtonsDescription.cpp:15 -msgid "Buttons And Text Colors Description" -msgstr "버튼 및 텍스트 색상 설명" - -#: src/slic3r/GUI/ButtonsDescription.cpp:40 -msgid "Value is the same as the system value" -msgstr "값은 시스템 값과 같습니다" - -#: src/slic3r/GUI/ButtonsDescription.cpp:57 -msgid "" -"Value was changed and is not equal to the system value or the last saved " -"preset" -msgstr "" -"값이 변경 되었고 시스템 값 또는 마지막으로 저장 된 사전 설정과 같지 않음" - -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:17 -msgid "Upgrade" -msgstr "업그레이드" - -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:19 -msgid "Downgrade" -msgstr "다운그레이드" - -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:21 -msgid "Before roll back" -msgstr "롤백 전에" - -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:23 -msgid "User" -msgstr "사용자" - -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:26 -msgid "Unknown" -msgstr "알 수 없음" - -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:38 -msgid "Active: " -msgstr "활성: " - -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:44 -msgid "slic3r version" -msgstr "slic3r에 대하여" - -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:45 src/slic3r/GUI/Preset.cpp:1250 -msgid "print" -msgstr "프린트" - -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:46 -msgid "filaments" -msgstr "필라멘트" - -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:47 src/slic3r/GUI/Preset.cpp:1254 -msgid "printer" -msgstr "프린터" - -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:51 src/slic3r/GUI/Tab.cpp:872 -msgid "vendor" -msgstr "벤더" - -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:51 -msgid "version" -msgstr "버전" - -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:52 -msgid "min slic3r version" -msgstr "최소 slic3r 버전" - -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:54 -msgid "max slic3r version" -msgstr "최대 slic3r 버전" - -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:57 -msgid "model" -msgstr "모델" - -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:57 -msgid "variants" -msgstr "변종" - -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:69 -msgid "Incompatible with this Slic3r" -msgstr "이 Slic3r와 호환 되지 않음" - -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:72 -msgid "Activate" -msgstr "활성화" - -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:98 -msgid "Configuration Snapshots" -msgstr "구성 스냅숏" - -#: src/slic3r/GUI/ConfigWizard.cpp:111 -msgid "nozzle" -msgstr "노즐" - -#: src/slic3r/GUI/ConfigWizard.cpp:115 -msgid "Alternate nozzles:" -msgstr "대체 노즐:" - -#: src/slic3r/GUI/ConfigWizard.cpp:181 -msgid "All standard" -msgstr "모든 표준" - -#: src/slic3r/GUI/ConfigWizard.cpp:182 src/slic3r/GUI/Tab.cpp:2909 -msgid "All" -msgstr "모두 선택" - -#: src/slic3r/GUI/ConfigWizard.cpp:183 src/slic3r/GUI/Plater.cpp:414 -#: src/libslic3r/GCode/PreviewData.cpp:162 -msgid "None" -msgstr "없음" - -#: src/slic3r/GUI/ConfigWizard.cpp:284 -#, c-format -msgid "Welcome to the Slic3r %s" -msgstr "Slic3r %s에 오신것을 환영 합니다" - -#: src/slic3r/GUI/ConfigWizard.cpp:284 -msgid "Welcome" -msgstr "환영합니다" - -#: src/slic3r/GUI/ConfigWizard.cpp:288 src/slic3r/GUI/GUI_App.cpp:600 -#, c-format -msgid "Run %s" -msgstr "%s 실행" - -#: src/slic3r/GUI/ConfigWizard.cpp:290 -#, c-format -msgid "" -"Hello, welcome to Slic3r Prusa Edition! This %s helps you with the initial " -"configuration; just a few settings and you will be ready to print." -msgstr "" -"안녕하세요, Slic3r prusa 버전에 오신 것을 환영 합니다! 이 %s 초기 구성;에 도" -"움이 됩니다. 단지 몇 가지 설정 하 고 당신은 인쇄 준비가 될 것입니다." - -#: src/slic3r/GUI/ConfigWizard.cpp:294 -msgid "" -"Remove user profiles - install from scratch (a snapshot will be taken " -"beforehand)" -msgstr "사용자 프로필 제거-처음부터 설치 (스냅숏은 사전에 수행 됩니다)" - -#: src/slic3r/GUI/ConfigWizard.cpp:325 -#, c-format -msgid "%s Family" -msgstr "%s 가족" - -#: src/slic3r/GUI/ConfigWizard.cpp:362 -msgid "Custom Printer Setup" -msgstr "사용자 지정 프린터 설정" - -#: src/slic3r/GUI/ConfigWizard.cpp:362 -msgid "Custom Printer" -msgstr "사용자 정의 프린터" - -#: src/slic3r/GUI/ConfigWizard.cpp:364 -msgid "Define a custom printer profile" -msgstr "사용자 정의 프린터 프로필 정의" - -#: src/slic3r/GUI/ConfigWizard.cpp:366 -msgid "Custom profile name:" -msgstr "사용자 지정 프로필 이름:" - -#: src/slic3r/GUI/ConfigWizard.cpp:390 -msgid "Automatic updates" -msgstr "자동 업데이트" - -#: src/slic3r/GUI/ConfigWizard.cpp:390 -msgid "Updates" -msgstr "업데이트" - -#: src/slic3r/GUI/ConfigWizard.cpp:398 src/slic3r/GUI/Preferences.cpp:59 -msgid "Check for application updates" -msgstr "프로그램 업데이트 확인" - -#: src/slic3r/GUI/ConfigWizard.cpp:401 src/slic3r/GUI/Preferences.cpp:61 -msgid "" -"If enabled, Slic3r checks for new versions of Slic3r PE online. When a new " -"version becomes available a notification is displayed at the next " -"application startup (never during program usage). This is only a " -"notification mechanisms, no automatic installation is done." -msgstr "" -"활성화 된 경우 Slic3r은 Slic3r PE 온라인의 새 버전을 확인합니다. 새 버전을 사" -"용할 수있게되면 다음 응용 프로그램 시작시 알림이 표시됩니다 (프로그램 사용 중" -"에는 절대로 사용하지 마십시오). 이것은 알림 메커니즘 일뿐 자동 설치가 수행되" -"지 않습니다." - -#: src/slic3r/GUI/ConfigWizard.cpp:405 src/slic3r/GUI/Preferences.cpp:67 -msgid "Update built-in Presets automatically" -msgstr "기존의 설정 자동 업데이트" - -#: src/slic3r/GUI/ConfigWizard.cpp:408 src/slic3r/GUI/Preferences.cpp:69 -msgid "" -"If enabled, Slic3r downloads updates of built-in system presets in the " -"background. These updates are downloaded into a separate temporary location. " -"When a new preset version becomes available it is offered at application " -"startup." -msgstr "" -"활성화 된 경우 Slic3r은 백그라운드에서 내장 시스템 사전 설정의 업데이트를 다" -"운로드합니다. 이러한 업데이트는 별도의 임시 위치에 다운로드됩니다. 새로운 사" -"전 설정 버전을 사용할 수있게되면 응용 프로그램 시작시 제공됩니다." - -#: src/slic3r/GUI/ConfigWizard.cpp:409 -msgid "" -"Updates are never applied without user's consent and never overwrite user's " -"customized settings." -msgstr "" -"업데이트는 사용자의 동의없이 적용되지 않으며 사용자의 사용자 지정된 설정을 덮" -"어 쓰지 않습니다." - -#: src/slic3r/GUI/ConfigWizard.cpp:414 -msgid "" -"Additionally a backup snapshot of the whole configuration is created before " -"an update is applied." -msgstr "또한 업데이트가 적용되기 전에 전체 구성의 백업 스냅 샷이 생성됩니다." - -#: src/slic3r/GUI/ConfigWizard.cpp:421 -msgid "Other Vendors" -msgstr "다른 공급 업체" - -#: src/slic3r/GUI/ConfigWizard.cpp:423 -msgid "Pick another vendor supported by Slic3r PE:" -msgstr "Slic3r PE가 지원하는 다른 공급 업체를 선택하십시오:" - -#: src/slic3r/GUI/ConfigWizard.cpp:469 -msgid "Firmware Type" -msgstr "펌웨어 타입" - -#: src/slic3r/GUI/ConfigWizard.cpp:469 src/slic3r/GUI/Tab.cpp:1870 -msgid "Firmware" -msgstr "펌웨어" - -#: src/slic3r/GUI/ConfigWizard.cpp:473 -msgid "Choose the type of firmware used by your printer." -msgstr "프린터에 패치할 펌웨어를 선택하세요." - -#: src/slic3r/GUI/ConfigWizard.cpp:507 -msgid "Bed Shape and Size" -msgstr "배드 모양과 크기" - -#: src/slic3r/GUI/ConfigWizard.cpp:510 -msgid "Set the shape of your printer's bed." -msgstr "프린터 배드모양을 설정하세요." - -#: src/slic3r/GUI/ConfigWizard.cpp:524 -msgid "Filament and Nozzle Diameters" -msgstr "필라멘트와 노즐 크기" - -#: src/slic3r/GUI/ConfigWizard.cpp:524 -msgid "Print Diameters" -msgstr "인쇄 직경" - -#: src/slic3r/GUI/ConfigWizard.cpp:540 -msgid "Enter the diameter of your printer's hot end nozzle." -msgstr "핫 엔드 노즐 직경을 입력하십시오." - -#: src/slic3r/GUI/ConfigWizard.cpp:543 -msgid "Nozzle Diameter:" -msgstr "노즐 직경:" - -#: src/slic3r/GUI/ConfigWizard.cpp:553 -msgid "Enter the diameter of your filament." -msgstr "필라멘트의 직경을 입력하십시오." - -#: src/slic3r/GUI/ConfigWizard.cpp:554 -msgid "" -"Good precision is required, so use a caliper and do multiple measurements " -"along the filament, then compute the average." -msgstr "" -"정밀도가 필요하므로 캘리퍼를 사용하여 필라멘트를 따라 여러 번 측정 한 다음 평" -"균을 계산하십시오." - -#: src/slic3r/GUI/ConfigWizard.cpp:557 -msgid "Filament Diameter:" -msgstr "필라멘트 직경:" - -#: src/slic3r/GUI/ConfigWizard.cpp:575 -msgid "Extruder and Bed Temperatures" -msgstr "익스트루더와 배드 온도" - -#: src/slic3r/GUI/ConfigWizard.cpp:575 -msgid "Temperatures" -msgstr "온도" - -#: src/slic3r/GUI/ConfigWizard.cpp:591 -msgid "Enter the temperature needed for extruding your filament." -msgstr "필라멘트 압출에 필요한 온도를 입력하십시오." - -#: src/slic3r/GUI/ConfigWizard.cpp:592 -msgid "A rule of thumb is 160 to 230 °C for PLA, and 215 to 250 °C for ABS." -msgstr "보통 PLA의 경우 160 ~ 230 ° C, ABS의 경우 215 ~ 250 ° C입니다." - -#: src/slic3r/GUI/ConfigWizard.cpp:595 -msgid "Extrusion Temperature:" -msgstr "출력 온도 :" - -#: src/slic3r/GUI/ConfigWizard.cpp:596 src/slic3r/GUI/ConfigWizard.cpp:610 -msgid "°C" -msgstr "°C" - -#: src/slic3r/GUI/ConfigWizard.cpp:605 -msgid "" -"Enter the bed temperature needed for getting your filament to stick to your " -"heated bed." -msgstr "필라멘트가 핫배드에 접착하는데 필요한 배드온도를 입력하십시오." - -#: src/slic3r/GUI/ConfigWizard.cpp:606 -msgid "" -"A rule of thumb is 60 °C for PLA and 110 °C for ABS. Leave zero if you have " -"no heated bed." -msgstr "" -"보통은 PLA의 경우 60 ° C이고 ABS의 경우 110 ° C입니다. 핫배드가 없는 경우에" -"는 0으로 두십시오." - -#: src/slic3r/GUI/ConfigWizard.cpp:609 -msgid "Bed Temperature:" -msgstr "배드 온도 :" - -#: src/slic3r/GUI/ConfigWizard.cpp:1001 -msgid "Select all standard printers" -msgstr "이 프로파일과 호환 가능한 프린터를 선택하세요" - -#: src/slic3r/GUI/ConfigWizard.cpp:1004 -msgid "< &Back" -msgstr "< &뒤로" - -#: src/slic3r/GUI/ConfigWizard.cpp:1005 -msgid "&Next >" -msgstr "&다음 >" - -#: src/slic3r/GUI/ConfigWizard.cpp:1006 -msgid "&Finish" -msgstr "&완료" - -#: src/slic3r/GUI/ConfigWizard.cpp:1007 src/slic3r/GUI/FirmwareDialog.cpp:142 -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:37 -#: src/slic3r/GUI/ProgressStatusBar.cpp:28 -msgid "Cancel" -msgstr "취소" - -#: src/slic3r/GUI/ConfigWizard.cpp:1021 -msgid "Prusa FFF Technology Printers" -msgstr "Prusa FFF 방식 프린터" - -#: src/slic3r/GUI/ConfigWizard.cpp:1024 -msgid "Prusa MSLA Technology Printers" -msgstr "Prusa MSLA 방식 프린터" - -#: src/slic3r/GUI/ConfigWizard.cpp:1111 -msgid "Configuration Wizard" -msgstr "구성 마법사" - -#: src/slic3r/GUI/ConfigWizard.cpp:1112 -msgid "Configuration &Wizard" -msgstr "구성 마법사" - -#: src/slic3r/GUI/ConfigWizard.cpp:1114 -msgid "Configuration Assistant" -msgstr "구성 도우미" - -#: src/slic3r/GUI/ConfigWizard.cpp:1115 -msgid "Configuration &Assistant" -msgstr "구성 도우미" - -#: src/slic3r/GUI/Field.cpp:112 -msgid "default value" -msgstr "기본값" - -#: src/slic3r/GUI/Field.cpp:115 -msgid "parameter name" -msgstr "매개 변수 이름" - -#: src/slic3r/GUI/Field.cpp:143 -#, c-format -msgid "%s doesn't support percentage" -msgstr "%s 이(가) 백분율을 지원하지 않음" - -#: src/slic3r/GUI/Field.cpp:157 src/slic3r/GUI/Field.cpp:180 -msgid "Invalid numeric input." -msgstr "숫자 입력이 잘못 되었습니다." - -#: src/slic3r/GUI/Field.cpp:162 -msgid "Input value is out of range" -msgstr "Input value is out of range" - -#: src/slic3r/GUI/Field.cpp:188 -#, c-format -msgid "" -"Do you mean %d%% instead of %d %s?\n" -"Select YES if you want to change this value to %d%%, \n" -"or NO if you are sure that %d %s is a correct value." -msgstr "" -"%d%% 대신 %d %s 를 의미 합니까?\n" -"이 값을 %d%%,로 변경 하려면 예를 선택 하십시오. \n" -"또는 %d %s가 올바른 값 인지 확인 하십시오." - -#: src/slic3r/GUI/Field.cpp:191 -msgid "Parameter validation" -msgstr "매개 변수 이름" - -#: src/slic3r/GUI/FirmwareDialog.cpp:141 -msgid "Flash!" -msgstr "완료!" - -#: src/slic3r/GUI/FirmwareDialog.cpp:143 -msgid "Flashing in progress. Please do not disconnect the printer!" -msgstr "아직 플래싱 중입니다. 커넥트를 분리하지 마십시오!" - -#: src/slic3r/GUI/FirmwareDialog.cpp:187 -msgid "Flashing failed: " -msgstr "펌웨어 플래싱 실패: " - -#: src/slic3r/GUI/FirmwareDialog.cpp:268 -msgid "Flashing succeeded!" -msgstr "플래싱 성공!" - -#: src/slic3r/GUI/FirmwareDialog.cpp:269 -msgid "Flashing failed. Please see the avrdude log below." -msgstr "플래시 실패. 아래의 로그를 확인하세요." - -#: src/slic3r/GUI/FirmwareDialog.cpp:270 -msgid "Flashing cancelled." -msgstr "깜빡임 취소됨." - -#: src/slic3r/GUI/FirmwareDialog.cpp:308 -#, c-format -msgid "" -"This firmware hex file does not match the printer model.\n" -"The hex file is intended for: %s\n" -"Printer reported: %s\n" -"\n" -"Do you want to continue and flash this hex file anyway?\n" -"Please only continue if you are sure this is the right thing to do." -msgstr "" -"이 펌웨어 hex 파일이 프린터 모델과 일치 하지 않습니다.\n" -"Hex 파일은 다음을 위한 것입니다: %s\n" -"보고 된 프린터: %s\n" -"\n" -"그래도이 hex 파일을 계속 플래싱 하시겠습니까?\n" -"이것이 옳은 일 이라고 확신 하는 경우에만 계속 하십시오." - -#: src/slic3r/GUI/FirmwareDialog.cpp:395 src/slic3r/GUI/FirmwareDialog.cpp:431 -#, c-format -msgid "" -"Multiple %s devices found. Please only connect one at a time for flashing." -msgstr "" -"여러 %s 장치를 찾았습니다. 깜박이는 경우에는 한 번에 하나씩만 연결 하십시오." - -#: src/slic3r/GUI/FirmwareDialog.cpp:412 -#, c-format -msgid "" -"The %s device was not found.\n" -"If the device is connected, please press the Reset button next to the USB " -"connector ..." -msgstr "" -"%s 장치를 찾을 하지 않았습니다.\n" -"장치가 연결 된 경우 USB 커넥터 옆에 있는 리셋 단추를 누르십시오." - -#: src/slic3r/GUI/FirmwareDialog.cpp:525 -#, c-format -msgid "The %s device could not have been found" -msgstr "%s 장치를 찾을 수 없습니다" - -#: src/slic3r/GUI/FirmwareDialog.cpp:603 -#, c-format -msgid "Error accessing port at %s: %s" -msgstr "%s 포트에 액세스 하는 중 오류가 발생 했습니다 :%s" - -#: src/slic3r/GUI/FirmwareDialog.cpp:605 -#, c-format -msgid "Error: %s" -msgstr "에러: %s" - -#: src/slic3r/GUI/FirmwareDialog.cpp:735 -msgid "Firmware flasher" -msgstr "펌웨어 플래셔" - -#: src/slic3r/GUI/FirmwareDialog.cpp:762 -msgid "Firmware image:" -msgstr "펌웨어 이미지:" - -#: src/slic3r/GUI/FirmwareDialog.cpp:766 -msgid "Serial port:" -msgstr "시리얼 포트:" - -#: src/slic3r/GUI/FirmwareDialog.cpp:768 -msgid "Autodetected" -msgstr "자동 감지" - -#: src/slic3r/GUI/FirmwareDialog.cpp:769 -msgid "Rescan" -msgstr "재검색" - -#: src/slic3r/GUI/FirmwareDialog.cpp:776 -msgid "Progress:" -msgstr "진행:" - -#: src/slic3r/GUI/FirmwareDialog.cpp:779 -msgid "Status:" -msgstr "지위:" - -#: src/slic3r/GUI/FirmwareDialog.cpp:780 -msgid "Ready" -msgstr "준비" - -#: src/slic3r/GUI/FirmwareDialog.cpp:800 -msgid "Advanced: Output log" -msgstr "고급: 출력 로그" - -#: src/slic3r/GUI/FirmwareDialog.cpp:811 -#: src/slic3r/GUI/PrintHostDialogs.cpp:161 -msgid "Close" -msgstr "닫기" - -#: src/slic3r/GUI/FirmwareDialog.cpp:859 -msgid "" -"Are you sure you want to cancel firmware flashing?\n" -"This could leave your printer in an unusable state!" -msgstr "" -"펌웨어 플래싱을 취소하시겠습니까?\n" -"프린터가 사용할 수 없는 상태가 될 수 있습니다!" - -#: src/slic3r/GUI/FirmwareDialog.cpp:860 -msgid "Confirmation" -msgstr "확인" - -#: src/slic3r/GUI/FirmwareDialog.cpp:863 -msgid "Cancelling..." -msgstr "취소 중...." - -#: src/slic3r/GUI/GLCanvas3D.cpp:709 -msgid "Detected object outside print volume" -msgstr "출력물이 프린터 출력 사이즈를 넘었습니다" - -#: src/slic3r/GUI/GLCanvas3D.cpp:710 -msgid "Detected toolpath outside print volume" -msgstr "인쇄 영역 밖에 있는 공구 경로가 감지 되었습니다" - -#: src/slic3r/GUI/GLCanvas3D.cpp:711 -msgid "Some objects are not visible when editing supports" -msgstr "편집 지원 시 일부 객체가 표시 되지 않음" - -#: src/slic3r/GUI/GLCanvas3D.cpp:713 -msgid "" -"Detected object outside print volume\n" -"Resolve a clash to continue slicing/export process correctly" -msgstr "" -"인쇄 볼륨 외부에서 감지 된 오브젝트\n" -"조각화/내보내기 프로세스를 올바르게 계속 하려면 충돌 해결" - -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:35 -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:195 -msgid "Rotate lower part upwards" -msgstr "" - -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:36 -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:198 -msgid "Perform cut" -msgstr "" - -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:43 -msgid "Cut object:" -msgstr "객체 잘라내기:" - -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:88 -msgid "Cut [C]" -msgstr "" - -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:188 src/libslic3r/PrintConfig.cpp:3006 -msgid "Cut" -msgstr "" - -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:193 -msgid "Keep upper part" -msgstr "" - -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:194 -msgid "Keep lower part" -msgstr "" - -#: src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp:32 -msgid "Place on face [F]" -msgstr "면 배치 [F]" - -#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:51 -msgid "Move [M]" -msgstr "이동 [M]" - -#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:176 -msgid "Position (mm)" -msgstr "위치 (mm)" - -#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:176 -msgid "Displacement (mm)" -msgstr "변위 (mm)" - -#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:458 -msgid "Rotate [R]" -msgstr "회전 [R]" - -#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:491 -msgid "Rotation (deg)" -msgstr "회전 (°)" - -#: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:51 -msgid "Scale [S]" -msgstr "스케일 [S]" - -#: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:276 -msgid "Scale (%)" -msgstr "스케일 (%)" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:597 -msgid "Left mouse click - add point" -msgstr "마우스 왼쪽 클릭-점 추가" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:598 -msgid "Right mouse click - remove point" -msgstr "마우스 오른쪽 버튼 클릭-점 제거" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:599 -msgid "Shift + Left (+ drag) - select point(s)" -msgstr "Shift + 왼쪽 (+ 끌기)-점 선택" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:606 -msgid "Head diameter: " -msgstr "헤드 지름: " - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:618 -msgid "Lock supports under new islands" -msgstr "새 고립 영역에서 잠금 지원" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:622 -msgid "Remove selected points" -msgstr "선택한 점 제거" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:626 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:679 -msgid "Remove all points" -msgstr "" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:631 -msgid "Apply changes" -msgstr "" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:636 -msgid "Discard changes" -msgstr "" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:644 -msgid "Minimal points distance: " -msgstr "" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:655 -msgid "Support points density: " -msgstr "" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:669 -msgid "Auto-generate points [A]" -msgstr "" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:675 -msgid "Manual editing [M]" -msgstr "" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:738 -msgid "SLA Support Points [L]" -msgstr "" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:767 -msgid "Do you want to save your manually edited support points ?\n" -msgstr "수동으로 편집한 지원 지점을 저장 하시겠습니까?\n" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:768 -msgid "Save changes?" -msgstr "변경 사항을 저장 하 시겠습니까?" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:897 -msgid "" -"Autogeneration will erase all manually edited points.\n" -"\n" -"Are you sure you want to do it?\n" -msgstr "" -"자동 생성은 수동으로 편집한 모든 점을 지웁니다.\n" -"\n" -"당신은 당신은 그렇게 하시겠습니까?\n" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:899 src/slic3r/GUI/GUI.cpp:288 -#: src/slic3r/GUI/WipeTowerDialog.cpp:44 src/slic3r/GUI/WipeTowerDialog.cpp:328 -msgid "Warning" -msgstr "위험" - -#: src/slic3r/GUI/GUI.cpp:147 src/slic3r/GUI/Tab.cpp:2720 -msgid "It's impossible to print multi-part object(s) with SLA technology." -msgstr "SLA 방식을 사용 하여 멀티파트를 인쇄할 수는 없습니다." - -#: src/slic3r/GUI/GUI.cpp:148 -msgid "Please check and fix your object list." -msgstr "개체 목록을 확인 하고 수정 하십시오." - -#: src/slic3r/GUI/GUI.cpp:149 src/slic3r/GUI/GUI_App.cpp:679 -#: src/slic3r/GUI/Tab.cpp:2722 -msgid "Attention!" -msgstr "주목!" - -#: src/slic3r/GUI/GUI.cpp:282 -msgid "Notice" -msgstr "공지" - -#: src/slic3r/GUI/GUI_App.cpp:318 -msgid "Changing of an application language" -msgstr "응용 프로그램 언어 변경" - -#: src/slic3r/GUI/GUI_App.cpp:326 src/slic3r/GUI/GUI_App.cpp:335 -msgid "Recreating" -msgstr "재현" - -#: src/slic3r/GUI/GUI_App.cpp:339 -msgid "Loading of a current presets" -msgstr "현재 프리셋 불러오기" - -#: src/slic3r/GUI/GUI_App.cpp:347 -msgid "Loading of a mode view" -msgstr "모드 보기 로드" - -#: src/slic3r/GUI/GUI_App.cpp:429 -msgid "Choose one file (3MF):" -msgstr "파일 (3MF)를 선택:" - -#: src/slic3r/GUI/GUI_App.cpp:441 -msgid "Choose one or more files (STL/OBJ/AMF/3MF/PRUSA):" -msgstr "파일을 선택하세요 (STL/OBJ/AMF/3MF/PRUSA):" - -#: src/slic3r/GUI/GUI_App.cpp:454 -msgid "Array of language names and identifiers should have the same size." -msgstr "언어 이름과 식별자 배열은 같은 크기 여야합니다." - -#: src/slic3r/GUI/GUI_App.cpp:464 -msgid "Select the language" -msgstr "언어를 선택" - -#: src/slic3r/GUI/GUI_App.cpp:464 -msgid "Language" -msgstr "언어" - -#: src/slic3r/GUI/GUI_App.cpp:534 src/slic3r/GUI/GUI_ObjectList.cpp:1067 -#: src/libslic3r/PrintConfig.cpp:298 -msgid "Default" -msgstr "기본값" - -# xs/src/slic3r/GUI/GUI.cpp:349 -#: src/slic3r/GUI/GUI_App.cpp:603 -msgid "&Configuration Snapshots" -msgstr "구성 스냅숏" - -#: src/slic3r/GUI/GUI_App.cpp:603 -msgid "Inspect / activate configuration snapshots" -msgstr "구성 스냅 샷 검사 / 활성화" - -#: src/slic3r/GUI/GUI_App.cpp:604 -msgid "Take Configuration &Snapshot" -msgstr "구성 스냅 샷 가져 오기" - -#: src/slic3r/GUI/GUI_App.cpp:604 -msgid "Capture a configuration snapshot" -msgstr "구성 스냅 샷 캡처" - -#: src/slic3r/GUI/GUI_App.cpp:607 -msgid "&Preferences" -msgstr "환경 설정" - -#: src/slic3r/GUI/GUI_App.cpp:613 -msgid "Application preferences" -msgstr "응용 프로그램 환경 설정" - -#: src/slic3r/GUI/GUI_App.cpp:616 src/slic3r/GUI/wxExtensions.cpp:2446 -msgid "Simple" -msgstr "단순" - -#: src/slic3r/GUI/GUI_App.cpp:616 -msgid "Simple View Mode" -msgstr "단순 보기 모드" - -#: src/slic3r/GUI/GUI_App.cpp:617 src/slic3r/GUI/GUI_ObjectList.cpp:73 -#: src/slic3r/GUI/Tab.cpp:977 src/slic3r/GUI/Tab.cpp:992 -#: src/slic3r/GUI/Tab.cpp:1090 src/slic3r/GUI/Tab.cpp:1093 -#: src/slic3r/GUI/Tab.cpp:1466 src/slic3r/GUI/Tab.cpp:1890 -#: src/slic3r/GUI/Tab.cpp:3347 src/slic3r/GUI/wxExtensions.cpp:2447 -#: src/libslic3r/PrintConfig.cpp:72 src/libslic3r/PrintConfig.cpp:186 -#: src/libslic3r/PrintConfig.cpp:349 src/libslic3r/PrintConfig.cpp:987 -#: src/libslic3r/PrintConfig.cpp:2173 -msgid "Advanced" -msgstr "고급" - -#: src/slic3r/GUI/GUI_App.cpp:617 -msgid "Advanced View Mode" -msgstr "고급 보기 모드" - -#: src/slic3r/GUI/GUI_App.cpp:618 src/slic3r/GUI/wxExtensions.cpp:2448 -msgid "Expert" -msgstr "전문가" - -#: src/slic3r/GUI/GUI_App.cpp:618 -msgid "Expert View Mode" -msgstr "전문가 보기 모드" - -#: src/slic3r/GUI/GUI_App.cpp:623 -msgid "Mode" -msgstr "모드" - -#: src/slic3r/GUI/GUI_App.cpp:623 -msgid "Slic3r View Mode" -msgstr "Slic3r 보기 모드" - -#: src/slic3r/GUI/GUI_App.cpp:625 -msgid "Change Application &Language" -msgstr "응용 프로그램 언어 번경" - -#: src/slic3r/GUI/GUI_App.cpp:627 -msgid "Flash printer &firmware" -msgstr "프린터 펌웨어 플래시" - -#: src/slic3r/GUI/GUI_App.cpp:627 -msgid "Upload a firmware image into an Arduino based printer" -msgstr "아두이노 기반의 프린터 이미지 업로드" - -#: src/slic3r/GUI/GUI_App.cpp:639 -msgid "Taking configuration snapshot" -msgstr "구성 스냅 샷 만들기" - -#: src/slic3r/GUI/GUI_App.cpp:639 -msgid "Snapshot name" -msgstr "스냅 샷 이름" - -#: src/slic3r/GUI/GUI_App.cpp:676 -msgid "Application will be restarted after language change." -msgstr "언어 변경 후 응용 프로그램이 다시 시작 됩니다." - -#: src/slic3r/GUI/GUI_App.cpp:677 -msgid "3D-Scene will be cleaned." -msgstr "3D-장면이 청소 됩니다." - -#: src/slic3r/GUI/GUI_App.cpp:678 -msgid "Please, check your changes before." -msgstr "이전에 변경 사항을 확인 하십시오." - -#: src/slic3r/GUI/GUI_App.cpp:706 -msgid "&Configuration" -msgstr "&구성" - -#: src/slic3r/GUI/GUI_App.cpp:726 -msgid "You have unsaved changes " -msgstr "저장되지 않은 변경 사항이 있습니다 " - -#: src/slic3r/GUI/GUI_App.cpp:726 -msgid ". Discard changes and continue anyway?" -msgstr ". 변경 사항을 취소하고 계속 하시겠습니까?" - -#: src/slic3r/GUI/GUI_App.cpp:727 -msgid "Unsaved Presets" -msgstr "저장되지 않은 기존설정" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:28 src/slic3r/GUI/GUI_ObjectList.cpp:65 -#: src/libslic3r/PrintConfig.cpp:56 src/libslic3r/PrintConfig.cpp:149 -#: src/libslic3r/PrintConfig.cpp:380 src/libslic3r/PrintConfig.cpp:437 -#: src/libslic3r/PrintConfig.cpp:445 src/libslic3r/PrintConfig.cpp:841 -#: src/libslic3r/PrintConfig.cpp:1025 src/libslic3r/PrintConfig.cpp:1304 -#: src/libslic3r/PrintConfig.cpp:1370 src/libslic3r/PrintConfig.cpp:1551 -#: src/libslic3r/PrintConfig.cpp:1986 src/libslic3r/PrintConfig.cpp:2042 -msgid "Layers and Perimeters" -msgstr "레이어 및 경계선" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:29 src/slic3r/GUI/GUI_ObjectList.cpp:66 -#: src/slic3r/GUI/Plater.cpp:431 src/slic3r/GUI/Tab.cpp:981 -#: src/slic3r/GUI/Tab.cpp:982 src/slic3r/GUI/Tab.cpp:1311 -#: src/libslic3r/PrintConfig.cpp:166 src/libslic3r/PrintConfig.cpp:388 -#: src/libslic3r/PrintConfig.cpp:728 src/libslic3r/PrintConfig.cpp:742 -#: src/libslic3r/PrintConfig.cpp:779 src/libslic3r/PrintConfig.cpp:932 -#: src/libslic3r/PrintConfig.cpp:942 src/libslic3r/PrintConfig.cpp:960 -#: src/libslic3r/PrintConfig.cpp:978 src/libslic3r/PrintConfig.cpp:997 -#: src/libslic3r/PrintConfig.cpp:1658 src/libslic3r/PrintConfig.cpp:1675 -msgid "Infill" -msgstr "인필(채움)" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:30 src/slic3r/GUI/GUI_ObjectList.cpp:67 -#: src/slic3r/GUI/GUI_Preview.cpp:236 src/slic3r/GUI/Tab.cpp:1010 -#: src/slic3r/GUI/Tab.cpp:1011 src/libslic3r/PrintConfig.cpp:333 -#: src/libslic3r/PrintConfig.cpp:1431 src/libslic3r/PrintConfig.cpp:1779 -#: src/libslic3r/PrintConfig.cpp:1785 src/libslic3r/PrintConfig.cpp:1793 -#: src/libslic3r/PrintConfig.cpp:1805 src/libslic3r/PrintConfig.cpp:1815 -#: src/libslic3r/PrintConfig.cpp:1823 src/libslic3r/PrintConfig.cpp:1838 -#: src/libslic3r/PrintConfig.cpp:1859 src/libslic3r/PrintConfig.cpp:1870 -#: src/libslic3r/PrintConfig.cpp:1886 src/libslic3r/PrintConfig.cpp:1895 -#: src/libslic3r/PrintConfig.cpp:1904 src/libslic3r/PrintConfig.cpp:1915 -#: src/libslic3r/PrintConfig.cpp:1929 src/libslic3r/PrintConfig.cpp:1937 -#: src/libslic3r/PrintConfig.cpp:1938 src/libslic3r/PrintConfig.cpp:1947 -#: src/libslic3r/PrintConfig.cpp:1955 src/libslic3r/PrintConfig.cpp:1969 -#: src/libslic3r/GCode/PreviewData.cpp:172 -msgid "Support material" -msgstr "서포트 재료(Support material)" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:33 src/slic3r/GUI/GUI_ObjectList.cpp:69 -#: src/slic3r/GUI/Tab.cpp:1070 src/slic3r/GUI/Tab.cpp:1794 -#: src/libslic3r/PrintConfig.cpp:455 src/libslic3r/PrintConfig.cpp:953 -#: src/libslic3r/PrintConfig.cpp:1339 src/libslic3r/PrintConfig.cpp:1667 -#: src/libslic3r/PrintConfig.cpp:1851 src/libslic3r/PrintConfig.cpp:1877 -#: src/libslic3r/PrintConfig.cpp:2149 src/libslic3r/PrintConfig.cpp:2157 -msgid "Extruders" -msgstr "익스트루더" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:39 -msgid "Pad and Support" -msgstr "패드 및 서포트" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:68 src/slic3r/GUI/GUI_Preview.cpp:215 -#: src/slic3r/GUI/Tab.cpp:1035 src/libslic3r/PrintConfig.cpp:198 -#: src/libslic3r/PrintConfig.cpp:425 src/libslic3r/PrintConfig.cpp:870 -#: src/libslic3r/PrintConfig.cpp:998 src/libslic3r/PrintConfig.cpp:1360 -#: src/libslic3r/PrintConfig.cpp:1597 src/libslic3r/PrintConfig.cpp:1646 -#: src/libslic3r/PrintConfig.cpp:1697 src/libslic3r/PrintConfig.cpp:2028 -msgid "Speed" -msgstr "속도" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:70 src/libslic3r/PrintConfig.cpp:415 -#: src/libslic3r/PrintConfig.cpp:522 src/libslic3r/PrintConfig.cpp:829 -#: src/libslic3r/PrintConfig.cpp:961 src/libslic3r/PrintConfig.cpp:1348 -#: src/libslic3r/PrintConfig.cpp:1687 src/libslic3r/PrintConfig.cpp:1860 -#: src/libslic3r/PrintConfig.cpp:2017 -msgid "Extrusion Width" -msgstr "압출 폭" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:75 src/slic3r/GUI/Plater.cpp:410 -#: src/slic3r/GUI/Tab.cpp:3309 src/slic3r/GUI/Tab.cpp:3310 -#: src/libslic3r/PrintConfig.cpp:2359 src/libslic3r/PrintConfig.cpp:2366 -#: src/libslic3r/PrintConfig.cpp:2375 src/libslic3r/PrintConfig.cpp:2384 -#: src/libslic3r/PrintConfig.cpp:2394 src/libslic3r/PrintConfig.cpp:2420 -#: src/libslic3r/PrintConfig.cpp:2427 src/libslic3r/PrintConfig.cpp:2438 -#: src/libslic3r/PrintConfig.cpp:2448 src/libslic3r/PrintConfig.cpp:2457 -#: src/libslic3r/PrintConfig.cpp:2467 src/libslic3r/PrintConfig.cpp:2476 -#: src/libslic3r/PrintConfig.cpp:2486 src/libslic3r/PrintConfig.cpp:2496 -#: src/libslic3r/PrintConfig.cpp:2504 -msgid "Supports" -msgstr "서포트" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:76 src/slic3r/GUI/Tab.cpp:3337 -#: src/slic3r/GUI/Tab.cpp:3338 src/libslic3r/PrintConfig.cpp:2512 -#: src/libslic3r/PrintConfig.cpp:2519 src/libslic3r/PrintConfig.cpp:2530 -#: src/libslic3r/PrintConfig.cpp:2540 src/libslic3r/PrintConfig.cpp:2553 -#: src/libslic3r/PrintConfig.cpp:2562 -msgid "Pad" -msgstr "패드" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:173 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:45 -msgid "Name" -msgstr "이름" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:201 -msgid "Right button click the icon to change the object settings" -msgstr "아이콘을 클릭 하여 개체 설정을 변경 합니다" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:209 -#, c-format -msgid "Auto-repaired (%d errors):\n" -msgstr "오류자동수정 (%d errors)\n" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:212 -msgid "degenerate facets" -msgstr "더러운 면" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:213 -msgid "edges fixed" -msgstr "모서리 고정" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:214 -msgid "facets removed" -msgstr "면 제거" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:215 -msgid "facets added" -msgstr "면 추가됨" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:216 -msgid "facets reversed" -msgstr "면 반전" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:217 -msgid "backwards edges" -msgstr "뒤쪽 가장자리" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:231 -msgid "Right button click the icon to fix STL through Netfabb" -msgstr "아이콘을 클릭 하여 Netfabb에서 STL을 수정 합니다" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:278 src/slic3r/GUI/Tab.cpp:1430 -#: src/libslic3r/PrintConfig.cpp:454 -msgid "Extruder" -msgstr "익스트루더(Extruder)" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:683 src/slic3r/GUI/GUI_ObjectList.cpp:963 -#: src/slic3r/GUI/GUI_ObjectList.cpp:969 src/slic3r/GUI/GUI_ObjectList.cpp:1199 -#, c-format -msgid "Quick Add Settings (%s)" -msgstr "빠른 추가 설정 (%s)" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:746 -msgid "Select showing settings" -msgstr "설정 표시를 선택 합니다" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:874 -msgid "Load" -msgstr "불러오기" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:879 src/slic3r/GUI/GUI_ObjectList.cpp:911 -#: src/slic3r/GUI/GUI_ObjectList.cpp:914 -msgid "Box" -msgstr "박스" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:879 -msgid "Cylinder" -msgstr "원통" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:879 -msgid "Sphere" -msgstr "영역" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:879 -msgid "Slab" -msgstr "슬랩" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:890 src/slic3r/GUI/GUI_ObjectList.cpp:906 -msgid "Add part" -msgstr "파트 추가" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:891 -msgid "Add modifier" -msgstr "편집영역(modifier) 추가" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:892 src/slic3r/GUI/GUI_ObjectList.cpp:910 -msgid "Add support enforcer" -msgstr "서포트 지원(enforcer)영역 추가" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:893 src/slic3r/GUI/GUI_ObjectList.cpp:913 -msgid "Add support blocker" -msgstr "서포트 금지영역(blocker) 추가" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:934 -msgid "Split to parts" -msgstr "파트로 분할" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:942 -msgid "Add settings" -msgstr "다음 설정" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1009 -msgid "Change type" -msgstr "타입 변경" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1016 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1153 -msgid "Set as a Separated Object" -msgstr "분리 된 객체로 설정" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1024 -msgid "Rename" -msgstr "이름 변경" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1034 -msgid "Fix through the Netfabb" -msgstr "네트워크를 통해 수정" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1041 src/slic3r/GUI/Plater.cpp:2861 -msgid "Export as STL" -msgstr "STL로 내보내기" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1048 -msgid "Change extruder" -msgstr "압출기(익스트루더) 변경" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1073 -msgid "Select new extruder for the object/part" -msgstr "객체/부품에 대한 새 압출(익스트루더) 기 선택" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1079 src/slic3r/GUI/Plater.cpp:2825 -#: src/slic3r/GUI/Plater.cpp:2843 src/slic3r/GUI/Tab.cpp:2860 -msgid "Delete" -msgstr "지우기(delete)" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1153 -msgid "Set as a Separated Objects" -msgstr "분리 된 객체로 설정" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1374 -msgid "Generic" -msgstr "일반" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1516 -msgid "You can't delete the last solid part from object." -msgstr "마지막 솔리드 파트는 객체에서 삭제할 수 없습니다." - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1533 -msgid "You can't delete the last intance from object." -msgstr "개체에서 마지막 인텐스(intance)를 삭제할 수 없습니다." - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1560 src/slic3r/GUI/Plater.cpp:2219 -msgid "" -"The selected object couldn't be split because it contains only one part." -msgstr "" -"선택한 오브젝트는 파트가 하나만 포함되어 있기 때문에 분할 할 수 없습니다." - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1676 -msgid "Group manipulation" -msgstr "그룹 조작" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1688 -msgid "Object manipulation" -msgstr "개체 조작" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1698 -msgid "Object Settings to modify" -msgstr "수정할 개체 설정" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1702 -msgid "Part Settings to modify" -msgstr "수정할 부품 설정" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1711 -msgid "Part manipulation" -msgstr "파트 조작" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1717 -msgid "Instance manipulation" -msgstr "인스턴스 제거" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2240 -msgid "Object or Instance" -msgstr "개체 또는 인스턴스" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2240 -msgid "Part" -msgstr "부품" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2242 -msgid "Unsupported selection" -msgstr "지원 되지 않는 선택" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2243 -#, c-format -msgid "You started your selection with %s Item." -msgstr "%s 항목으로 선택을 시작 했습니다." - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2244 -#, c-format -msgid "In this mode you can select only other %s Items%s" -msgstr "이 모드에서는 %s의 다른 %s 항목만 선택할 수 있습니다" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2247 -msgid "of a current Object" -msgstr "현재 개체의" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2252 -#: src/slic3r/GUI/GUI_ObjectList.cpp:2325 src/slic3r/GUI/Plater.cpp:117 -msgid "Info" -msgstr "정보" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2366 -msgid "You can't change a type of the last solid part of the object." -msgstr "객체의 마지막 솔리드 부품 유형은 변경할 수 없습니다." - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2373 -msgid "Select type of part" -msgstr "부품 유형 선택" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2538 -msgid "Enter new name" -msgstr "새 이름 입력" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2538 -msgid "Renaming" -msgstr "이름 바꾸기" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2554 -#: src/slic3r/GUI/GUI_ObjectList.cpp:2632 src/slic3r/GUI/Tab.cpp:3191 -#: src/slic3r/GUI/Tab.cpp:3195 -msgid "The supplied name is not valid;" -msgstr "제공된 이름이 유효하지 않습니다;" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2555 -#: src/slic3r/GUI/GUI_ObjectList.cpp:2633 src/slic3r/GUI/Tab.cpp:3192 -msgid "the following characters are not allowed:" -msgstr "다음 문자는 허용되지 않습니다:" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2653 -msgid "Set extruder for selected items" -msgstr "선택한 항목에 대한 압출기(익스트루더) 설정" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2654 -msgid "Select extruder number for selected objects and/or parts" -msgstr "선택한 객체 및 부품에 대한 압출기(익스트루더) 번호 선택" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2667 -msgid "Select extruder number:" -msgstr "압출기(익스트루더) 번호 선택:" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2668 -msgid "This extruder will be set for selected items" -msgstr "선택한 항목에 대한 압출기(익스트루더) 설정" - -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:25 -msgid "Object Manipulation" -msgstr "개체 조작" - -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:47 -msgid "Object name" -msgstr "개체 이름" - -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:115 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:160 -msgid "Position" -msgstr "위치" - -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:116 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:161 -msgid "Rotation" -msgstr "회전" - -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:117 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:201 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:221 -#: src/libslic3r/PrintConfig.cpp:3070 -msgid "Scale" -msgstr "크기" - -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:162 -msgid "Scale factors" -msgstr "축척 계수" - -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:200 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:220 -#: src/libslic3r/PrintConfig.cpp:3055 -msgid "Rotate" -msgstr "회전" - -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:219 -msgid "Translate" -msgstr "번역" - -#: src/slic3r/GUI/GUI_ObjectSettings.cpp:58 -msgid "Additional Settings" -msgstr "추가적인 세팅" - -#: src/slic3r/GUI/GUI_Preview.cpp:209 -msgid "View" -msgstr "View" - -#: src/slic3r/GUI/GUI_Preview.cpp:212 src/slic3r/GUI/GUI_Preview.cpp:525 -#: src/libslic3r/GCode/PreviewData.cpp:394 -msgid "Feature type" -msgstr "특색 유형" - -#: src/slic3r/GUI/GUI_Preview.cpp:213 src/libslic3r/PrintConfig.cpp:467 -msgid "Height" -msgstr "높이" - -#: src/slic3r/GUI/GUI_Preview.cpp:214 src/libslic3r/PrintConfig.cpp:2135 -msgid "Width" -msgstr "폭" - -#: src/slic3r/GUI/GUI_Preview.cpp:216 -msgid "Volumetric flow rate" -msgstr "용적의 유량값" - -#: src/slic3r/GUI/GUI_Preview.cpp:217 src/slic3r/GUI/GUI_Preview.cpp:315 -#: src/slic3r/GUI/GUI_Preview.cpp:469 src/slic3r/GUI/GUI_Preview.cpp:525 -#: src/slic3r/GUI/GUI_Preview.cpp:701 src/libslic3r/GCode/PreviewData.cpp:404 -msgid "Tool" -msgstr "도구" - -#: src/slic3r/GUI/GUI_Preview.cpp:218 src/slic3r/GUI/GUI_Preview.cpp:523 -#: src/libslic3r/GCode/PreviewData.cpp:406 -msgid "Color Print" -msgstr "컬러 프린트" - -#: src/slic3r/GUI/GUI_Preview.cpp:221 -msgid "Show" -msgstr "보다" - -#: src/slic3r/GUI/GUI_Preview.cpp:224 src/slic3r/GUI/GUI_Preview.cpp:225 -msgid "Feature types" -msgstr "특색 유형" - -#: src/slic3r/GUI/GUI_Preview.cpp:227 src/libslic3r/GCode/PreviewData.cpp:163 -msgid "Perimeter" -msgstr "가장자리" - -#: src/slic3r/GUI/GUI_Preview.cpp:228 src/libslic3r/GCode/PreviewData.cpp:164 -msgid "External perimeter" -msgstr "외부 가장자리" - -#: src/slic3r/GUI/GUI_Preview.cpp:229 src/libslic3r/GCode/PreviewData.cpp:165 -msgid "Overhang perimeter" -msgstr "오버행(Overhang) 둘레" - -#: src/slic3r/GUI/GUI_Preview.cpp:230 src/libslic3r/GCode/PreviewData.cpp:166 -msgid "Internal infill" -msgstr "내부 채움" - -#: src/slic3r/GUI/GUI_Preview.cpp:231 src/libslic3r/PrintConfig.cpp:1686 -#: src/libslic3r/PrintConfig.cpp:1696 src/libslic3r/GCode/PreviewData.cpp:167 -msgid "Solid infill" -msgstr "솔리드 인필" - -#: src/slic3r/GUI/GUI_Preview.cpp:232 src/libslic3r/PrintConfig.cpp:2016 -#: src/libslic3r/PrintConfig.cpp:2027 src/libslic3r/GCode/PreviewData.cpp:168 -msgid "Top solid infill" -msgstr "가장 윗부분 채움" - -#: src/slic3r/GUI/GUI_Preview.cpp:233 src/libslic3r/GCode/PreviewData.cpp:169 -msgid "Bridge infill" -msgstr "프릿지 채움" - -#: src/slic3r/GUI/GUI_Preview.cpp:234 src/libslic3r/PrintConfig.cpp:869 -#: src/libslic3r/GCode/PreviewData.cpp:170 -msgid "Gap fill" -msgstr "공백 채움" - -#: src/slic3r/GUI/GUI_Preview.cpp:235 src/slic3r/GUI/Tab.cpp:1001 -#: src/libslic3r/GCode/PreviewData.cpp:171 -msgid "Skirt" -msgstr "스커트" - -#: src/slic3r/GUI/GUI_Preview.cpp:237 src/libslic3r/PrintConfig.cpp:1903 -#: src/libslic3r/GCode/PreviewData.cpp:173 -msgid "Support material interface" -msgstr "서포트 재료 인터페이스" - -#: src/slic3r/GUI/GUI_Preview.cpp:238 src/slic3r/GUI/Tab.cpp:1081 -#: src/libslic3r/GCode/PreviewData.cpp:174 -msgid "Wipe tower" -msgstr "와이프 타워(Wipe tower)" - -#: src/slic3r/GUI/GUI_Preview.cpp:243 src/libslic3r/PrintConfig.cpp:2049 -msgid "Travel" -msgstr "이송" - -#: src/slic3r/GUI/GUI_Preview.cpp:244 -msgid "Retractions" -msgstr "리트랙션" - -#: src/slic3r/GUI/GUI_Preview.cpp:245 -msgid "Unretractions" -msgstr "리트랙션 취소" - -#: src/slic3r/GUI/GUI_Preview.cpp:246 -msgid "Shells" -msgstr "쉘" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:13 -msgid "Slic3r Prusa Edition - Keyboard Shortcuts" -msgstr "Slic3r Prusa 에디션-키보드 단축키" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:100 -msgid "Open project STL/OBJ/AMF/3MF with config, delete bed" -msgstr "구성으로 프로젝트 STL/OBJ/AMF/3MF 열기, 배드 삭제" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:101 -msgid "Import STL/OBJ/AMF/3MF without config, keep bed" -msgstr "구성 없이 STL/OBJ/AMF/3MF 가져오기, 배드 유지" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:102 -msgid "Load Config from .ini/amf/3mf/gcode" -msgstr ".Ini/amf/3mf/gcode에서 구성 로드" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:103 src/slic3r/GUI/Plater.cpp:725 -#: src/slic3r/GUI/Plater.cpp:3673 src/libslic3r/PrintConfig.cpp:2957 -msgid "Export G-code" -msgstr "G-코드 내보내기" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:104 -msgid "Save project (3MF)" -msgstr "프로젝트 저장 (3MF)" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:105 -msgid "Load Config from .ini/amf/3mf/gcode and merge" -msgstr ".Ini/amf/3mf/gcode 및 병합에서 구성 로드" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:106 -msgid "(Re)slice" -msgstr "(Re) 슬라이스" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:107 -msgid "Quick slice" -msgstr "빠른 슬라이스" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:108 src/slic3r/GUI/MainFrame.cpp:326 -msgid "Repeat last quick slice" -msgstr "마지막으로 빠른 슬라이스 반복" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:109 -msgid "Select Plater Tab" -msgstr "선택 및 플래이트 탭" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:110 -msgid "Quick slice and Save as" -msgstr "빠른 슬라이스 및 다른 이름으로 저장" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:111 -msgid "Select Print Settings Tab" -msgstr "인쇄 설정 탭을 선택 합니다" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:112 -msgid "Select Filament Settings Tab" -msgstr "필라멘트 설정 탭 선택" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:113 -msgid "Select Printer Settings Tab" -msgstr "프린터 설정 탭을 선택 합니다" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:114 -msgid "Switch to 3D" -msgstr "3D로 전환" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:115 -msgid "Switch to Preview" -msgstr "미리 보기로 전환" - -# xs/src/slic3r/GUI/Preferences.cpp:9 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:116 src/slic3r/GUI/Preferences.cpp:10 -msgid "Preferences" -msgstr "환경 설정" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:117 -#: src/slic3r/GUI/PrintHostDialogs.cpp:134 -msgid "Print host upload queue" -msgstr "호스트 업로드 대기열 인쇄" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:118 -msgid "Camera view " -msgstr "카메라 뷰 " - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:119 -msgid "Add Instance to selected object " -msgstr "선택한 개체에 인스턴스 추가 " - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:120 -msgid "Remove Instance from selected object" -msgstr "선택한 개체의 인스턴스 제거" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:121 -msgid "Show keyboard shortcuts list" -msgstr "바로 가기 키 목록 표시" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:122 -msgid "Select multiple object/Move multiple object" -msgstr "여러 개체 선택/여러 개체 이동" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:124 -msgid "Main Shortcuts" -msgstr "주요 단축키" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:130 -msgid "Arrange" -msgstr "정렬" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:131 -msgid "Select All objects" -msgstr "모든 객체 선택" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:132 -msgid "Delete selected" -msgstr "선택 삭제" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:133 -msgid "Delete All" -msgstr "전부 지움" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:134 -msgid "Gizmo move" -msgstr "기즈모 이동" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:135 -msgid "Gizmo scale" -msgstr "기즈모 배율" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:136 -msgid "Gizmo rotate" -msgstr "기즈모 회전" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:137 -msgid "Gizmo cut" -msgstr "기즈모 컷" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:138 -msgid "Gizmo Place face on bed" -msgstr "Gizmo Place face on bed" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:139 -msgid "Gizmo SLA support points" -msgstr "기즈모 SLA 지원 포인트" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:140 -#, no-c-format -msgid "" -"Press to snap by 5% in Gizmo scale\n" -"or by 1mm in Gizmo move" -msgstr "" -"기즈모 배율에서 5% in로 스냅 하려면 누릅니다.\n" -"또는 기 즈 모에서 1mm로 이동" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:141 -msgid "" -"Press to scale or rotate selected objects\n" -"around their own center" -msgstr "" -"자신의 중심 주변\n" -"선택한 개체의 크기를 조정 하거나 회전 하려면 누릅니다" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:142 -msgid "Zoom to Bed" -msgstr "배드 확대" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:143 -msgid "Zoom to all objects in scene, if none selected" -msgstr "장면의 모든 오브젝트로 확대/축소 (선택 하지 않은 경우)" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:144 -msgid "Zoom to selected object" -msgstr "선택한 개체로 확대/축소" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:145 -msgid "Zoom in" -msgstr "확대" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:146 -msgid "Zoom out" -msgstr "줌 아웃" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:147 -msgid "Unselect gizmo, keep object selection" -msgstr "기즈모 선택을 취소 하고 객체 선택 유지" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:149 -msgid "Plater Shortcuts" -msgstr "Plater 바로 가기" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:164 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:175 -msgid "Arrow Up" -msgstr "위쪽 화살표" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:164 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:166 -msgid "Upper Layer" -msgstr "상위 레이어" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:165 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:176 -msgid "Arrow Down" -msgstr "아래쪽 화살표" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:165 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:167 -msgid "Lower Layer" -msgstr "하위 레이어" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:169 -msgid "Preview Shortcuts" -msgstr "미리 보기 바로 가기" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:175 -msgid "Move current slider thump Up" -msgstr "현재 슬라이더를 쿵 위로 이동" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:176 -msgid "Move current slider thump Down" -msgstr "현재 슬라이더를 아래로 쿵 이동" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:177 -msgid "Arrow Left" -msgstr "왼쪽 화살표" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:177 -msgid "Set upper thumb to current slider thumb" -msgstr "위쪽 엄지를 현재 슬라이더 엄지 손가락으로 설정" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:178 -msgid "Arrow Right" -msgstr "오른쪽 화살표" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:178 -msgid "Set lower thumb to current slider thumb" -msgstr "낮은 엄지를 현재 슬라이더 엄지 손가락으로 설정" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:179 -msgid "Add color change marker for current layer" -msgstr "현재 레이어의 색상 변경 마커 추가" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:180 -msgid "Delete color change marker for current layer" -msgstr "현재 레이어의 색상 변경 마커 삭제" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:182 -msgid "Layers Slider Shortcuts" -msgstr "레이어 슬라이더 단축키" - -#: src/slic3r/GUI/MainFrame.cpp:54 -msgid "" -" - Remember to check for updates at http://github.com/prusa3d/slic3r/releases" -msgstr "" -" -http://github.com/prusa3d/slic3r/releases에서 업데이트를 확인하는 것을 잊" -"지 마십시오" - -#: src/slic3r/GUI/MainFrame.cpp:160 -msgid "Plater" -msgstr "플레이트" - -#: src/slic3r/GUI/MainFrame.cpp:273 -msgid "&Open Project" -msgstr "&프로젝트 열기" - -#: src/slic3r/GUI/MainFrame.cpp:273 -msgid "Open a project file" -msgstr "프로젝트 파일 열기" - -#: src/slic3r/GUI/MainFrame.cpp:275 -msgid "&Save Project" -msgstr "프로젝트 저장" - -#: src/slic3r/GUI/MainFrame.cpp:275 -msgid "Save current project file" -msgstr "현재 프로젝트 파일 저장" - -#: src/slic3r/GUI/MainFrame.cpp:277 -msgid "Save Project &as" -msgstr "프로젝트 저장" - -#: src/slic3r/GUI/MainFrame.cpp:277 -msgid "Save current project file as" -msgstr "현재 프로젝트 파일을 다른 이름으로 저장" - -#: src/slic3r/GUI/MainFrame.cpp:283 -msgid "Import STL/OBJ/AM&F/3MF" -msgstr "가져오기 STL/OBJ/AM&F/3MF" - -#: src/slic3r/GUI/MainFrame.cpp:283 -msgid "Load a model" -msgstr "모델 로드" - -#: src/slic3r/GUI/MainFrame.cpp:286 -msgid "Import &Config" -msgstr "& 구성 가져오기" - -#: src/slic3r/GUI/MainFrame.cpp:286 -msgid "Load exported configuration file" -msgstr "내 보낸 구성 파일로드" - -#: src/slic3r/GUI/MainFrame.cpp:288 -msgid "Import Config from &project" -msgstr "프로젝트에서 설정 가져오기" - -#: src/slic3r/GUI/MainFrame.cpp:288 -msgid "Load configuration from project file" -msgstr "프로젝트 파일에서 구성 로드" - -#: src/slic3r/GUI/MainFrame.cpp:291 -msgid "Import Config &Bundle" -msgstr "가져오기 설정 > 번들" - -#: src/slic3r/GUI/MainFrame.cpp:291 -msgid "Load presets from a bundle" -msgstr "번들에서 미리 설정로드" - -#: src/slic3r/GUI/MainFrame.cpp:293 -msgid "&Import" -msgstr "가져오기" - -#: src/slic3r/GUI/MainFrame.cpp:296 -msgid "Export &G-code" -msgstr "G-코드 내보내기" - -#: src/slic3r/GUI/MainFrame.cpp:296 -msgid "Export current plate as G-code" -msgstr "현재 플레이트를 G 코드로 내보내기" - -#: src/slic3r/GUI/MainFrame.cpp:299 -msgid "Export plate as &STL" -msgstr "STL로 내보내기" - -#: src/slic3r/GUI/MainFrame.cpp:299 -msgid "Export current plate as STL" -msgstr "현재 플레이트를 STL로 내보내기" - -#: src/slic3r/GUI/MainFrame.cpp:301 -msgid "Export plate as &AMF" -msgstr "AMF로 내보내기" - -#: src/slic3r/GUI/MainFrame.cpp:301 -msgid "Export current plate as AMF" -msgstr "현재 플레이트를AMF로 내보내기" - -#: src/slic3r/GUI/MainFrame.cpp:304 -msgid "Export &Config" -msgstr "& 구성 내보내기" - -#: src/slic3r/GUI/MainFrame.cpp:304 -msgid "Export current configuration to file" -msgstr "현재 구성을 파일로 내보내기" - -#: src/slic3r/GUI/MainFrame.cpp:306 -msgid "Export Config &Bundle" -msgstr "내보내기 설정 > 번들" - -#: src/slic3r/GUI/MainFrame.cpp:306 -msgid "Export all presets to file" -msgstr "모든 이전 설정을 파일로 내보내기" - -#: src/slic3r/GUI/MainFrame.cpp:308 -msgid "&Export" -msgstr "& 내보내기" - -#: src/slic3r/GUI/MainFrame.cpp:314 -msgid "Quick Slice" -msgstr "빠른 슬라이스" - -#: src/slic3r/GUI/MainFrame.cpp:314 -msgid "Slice a file into a G-code" -msgstr "파일을 G 코드로 분할" - -#: src/slic3r/GUI/MainFrame.cpp:320 -msgid "Quick Slice and Save As" -msgstr "빠른 슬라이스 및 다른 이름으로 저장" - -#: src/slic3r/GUI/MainFrame.cpp:320 -msgid "Slice a file into a G-code, save as" -msgstr "파일을 G 코드로 분할하고 다음으로 저장" - -#: src/slic3r/GUI/MainFrame.cpp:326 -msgid "Repeat Last Quick Slice" -msgstr "마지막으로 빠른 슬라이스 반복" - -#: src/slic3r/GUI/MainFrame.cpp:334 -msgid "(Re)Slice &Now" -msgstr "지금(다시)자르기" - -#: src/slic3r/GUI/MainFrame.cpp:334 -msgid "Start new slicing process" -msgstr "새로운 슬라이싱 작업 시작" - -#: src/slic3r/GUI/MainFrame.cpp:337 -msgid "&Repair STL file" -msgstr "STL 파일 복구" - -#: src/slic3r/GUI/MainFrame.cpp:337 -msgid "Automatically repair an STL file" -msgstr "STL 파일을 자동으로 복구합니다" - -#: src/slic3r/GUI/MainFrame.cpp:340 -msgid "&Quit" -msgstr "종료(&Q)" - -#: src/slic3r/GUI/MainFrame.cpp:340 -msgid "Quit Slic3r" -msgstr "Slic3r 종료" - -#: src/slic3r/GUI/MainFrame.cpp:374 -msgid "&Select all" -msgstr "모두 선택" - -#: src/slic3r/GUI/MainFrame.cpp:374 -msgid "Selects all objects" -msgstr "모든 개체를 선택 합니다" - -#: src/slic3r/GUI/MainFrame.cpp:377 -msgid "&Delete selected" -msgstr "선택 삭제" - -#: src/slic3r/GUI/MainFrame.cpp:377 -msgid "Deletes the current selection" -msgstr "현재 선택 영역을 삭제 합니다" - -#: src/slic3r/GUI/MainFrame.cpp:379 -msgid "Delete &all" -msgstr "전부 지움" - -#: src/slic3r/GUI/MainFrame.cpp:379 -msgid "Deletes all objects" -msgstr "모든 객체를 삭제 합니다" - -#: src/slic3r/GUI/MainFrame.cpp:392 -msgid "&Plater Tab" -msgstr "선택 및 플래이트 탭" - -#: src/slic3r/GUI/MainFrame.cpp:392 -msgid "Show the plater" -msgstr "플레이트를 보기" - -#: src/slic3r/GUI/MainFrame.cpp:399 -msgid "P&rint Settings Tab" -msgstr "P&rint 설정 탭" - -#: src/slic3r/GUI/MainFrame.cpp:399 -msgid "Show the print settings" -msgstr "인쇄 설정 표시" - -#: src/slic3r/GUI/MainFrame.cpp:401 -msgid "&Filament Settings Tab" -msgstr "& 필라멘트 설정 탭" - -#: src/slic3r/GUI/MainFrame.cpp:401 -msgid "Show the filament settings" -msgstr "필라멘트 설정보기" - -#: src/slic3r/GUI/MainFrame.cpp:403 -msgid "Print&er Settings Tab" -msgstr "설정 인쇄 탭" - -#: src/slic3r/GUI/MainFrame.cpp:403 -msgid "Show the printer settings" -msgstr "간단한 설정보기" - -#: src/slic3r/GUI/MainFrame.cpp:407 -msgid "3&D" -msgstr "3&D" - -#: src/slic3r/GUI/MainFrame.cpp:407 -msgid "Show the 3D editing view" -msgstr "3D 편집용 보기 표시" - -#: src/slic3r/GUI/MainFrame.cpp:409 -msgid "Pre&view" -msgstr "미리 보기" - -#: src/slic3r/GUI/MainFrame.cpp:409 -msgid "Show the 3D slices preview" -msgstr "3D 슬라이스 미리 보기 표시" - -#: src/slic3r/GUI/MainFrame.cpp:430 -msgid "Print &Host Upload Queue" -msgstr "호스트 업로드 대기열 인쇄" - -#: src/slic3r/GUI/MainFrame.cpp:430 -msgid "Display the Print Host Upload Queue window" -msgstr "호스트 업로드 대기열 인쇄 창 표시" - -#: src/slic3r/GUI/MainFrame.cpp:439 -msgid "Iso" -msgstr "Iso" - -#: src/slic3r/GUI/MainFrame.cpp:439 -msgid "Iso View" -msgstr "Iso 보기" - -# lib/Slic3r/GUI/MainFrame.pm:327 -#: src/slic3r/GUI/MainFrame.cpp:441 -msgid "Top" -msgstr "윗부분" - -#: src/libslic3r/PrintConfig.cpp:2041 -msgctxt "Layers" -msgid "Top" -msgstr "윗부분" - -#: src/slic3r/GUI/MainFrame.cpp:441 -msgid "Top View" -msgstr "위에서 보기" - -# lib/Slic3r/GUI/MainFrame.pm:328 -#: src/slic3r/GUI/MainFrame.cpp:442 -msgid "Bottom" -msgstr "바닥(Bottom)" - -#: src/libslic3r/PrintConfig.cpp:148 -msgctxt "Layers" -msgid "Bottom" -msgstr "바닥(Bottom)" - -#: src/slic3r/GUI/MainFrame.cpp:442 -msgid "Bottom View" -msgstr "바닥 보기" - -#: src/slic3r/GUI/MainFrame.cpp:443 -msgid "Front" -msgstr "앞" - -#: src/slic3r/GUI/MainFrame.cpp:443 -msgid "Front View" -msgstr "앞면 보기" - -#: src/slic3r/GUI/MainFrame.cpp:444 src/libslic3r/PrintConfig.cpp:1561 -msgid "Rear" -msgstr "뒷면" - -#: src/slic3r/GUI/MainFrame.cpp:444 -msgid "Rear View" -msgstr "뒷면 보기" - -#: src/slic3r/GUI/MainFrame.cpp:445 -msgid "Left" -msgstr "왼쪽" - -#: src/slic3r/GUI/MainFrame.cpp:445 -msgid "Left View" -msgstr "왼쪽 보기" - -#: src/slic3r/GUI/MainFrame.cpp:446 -msgid "Right" -msgstr "오른쪽" - -#: src/slic3r/GUI/MainFrame.cpp:446 -msgid "Right View" -msgstr "오른쪽 보기" - -#: src/slic3r/GUI/MainFrame.cpp:460 -msgid "Prusa 3D &Drivers" -msgstr "푸르사 3D 드라이버" - -#: src/slic3r/GUI/MainFrame.cpp:460 -msgid "Open the Prusa3D drivers download page in your browser" -msgstr "브라우저에서 Prusa3D 드라이버 다운로드 페이지를 엽니다" - -#: src/slic3r/GUI/MainFrame.cpp:462 -msgid "Prusa Edition &Releases" -msgstr "Prusa 에디션 릴리스" - -#: src/slic3r/GUI/MainFrame.cpp:462 -msgid "Open the Prusa Edition releases page in your browser" -msgstr "브라우저에서 Prusa Edition 릴리즈 페이지를 엽니 다" - -#: src/slic3r/GUI/MainFrame.cpp:468 -msgid "Slic3r &Website" -msgstr "Slic3r 및 웹 사이트" - -#: src/slic3r/GUI/MainFrame.cpp:468 -msgid "Open the Slic3r website in your browser" -msgstr "브라우저에서 Slic3r 웹 사이트 열기" - -#: src/slic3r/GUI/MainFrame.cpp:470 -msgid "Slic3r &Manual" -msgstr "Slic3r &메뉴얼" - -#: src/slic3r/GUI/MainFrame.cpp:470 -msgid "Open the Slic3r manual in your browser" -msgstr "브라우저에서 Slic3r 설명서를 엽니다" - -#: src/slic3r/GUI/MainFrame.cpp:473 -msgid "System &Info" -msgstr "시스템 정보" - -#: src/slic3r/GUI/MainFrame.cpp:473 -msgid "Show system information" -msgstr "시스템 정보 표시" - -#: src/slic3r/GUI/MainFrame.cpp:475 -msgid "Show &Configuration Folder" -msgstr "폴더 표시 및 구성" - -#: src/slic3r/GUI/MainFrame.cpp:475 -msgid "Show user configuration folder (datadir)" -msgstr "사용자 구성 폴더 표시 (datadir)" - -#: src/slic3r/GUI/MainFrame.cpp:477 -msgid "Report an I&ssue" -msgstr "문제보고" - -#: src/slic3r/GUI/MainFrame.cpp:477 -msgid "Report an issue on the Slic3r Prusa Edition" -msgstr "Slic3r Prusa Edition에 관한 문제점 보고" - -#: src/slic3r/GUI/MainFrame.cpp:479 -msgid "&About Slic3r" -msgstr "&Slic3r에 대하여" - -#: src/slic3r/GUI/MainFrame.cpp:479 -msgid "Show about dialog" -msgstr "대화상자 표시" - -#: src/slic3r/GUI/MainFrame.cpp:482 -msgid "Keyboard Shortcuts" -msgstr "키보드 바로 가기" - -#: src/slic3r/GUI/MainFrame.cpp:482 -msgid "Show the list of the keyboard shortcuts" -msgstr "키보드 단축키 목록 표시" - -#: src/slic3r/GUI/MainFrame.cpp:490 -msgid "&File" -msgstr "&파일" - -#: src/slic3r/GUI/MainFrame.cpp:491 -msgid "&Edit" -msgstr "수정(&Edit)" - -#: src/slic3r/GUI/MainFrame.cpp:492 -msgid "&Window" -msgstr "&윈도우" - -#: src/slic3r/GUI/MainFrame.cpp:493 -msgid "&View" -msgstr "&보다" - -#: src/slic3r/GUI/MainFrame.cpp:496 -msgid "&Help" -msgstr "&도움말" - -#: src/slic3r/GUI/MainFrame.cpp:524 -msgid "Choose a file to slice (STL/OBJ/AMF/3MF/PRUSA):" -msgstr "슬라이스 할 파일을 선택하십시오 (STL / OBJ / AMF / 3MF / PRUSA):" - -#: src/slic3r/GUI/MainFrame.cpp:538 -msgid "No previously sliced file." -msgstr "이전에 분리 된 파일이 없습니다." - -#: src/slic3r/GUI/MainFrame.cpp:539 src/slic3r/GUI/PrintHostDialogs.cpp:219 -msgid "Error" -msgstr "에러" - -#: src/slic3r/GUI/MainFrame.cpp:544 -msgid "Previously sliced file (" -msgstr "이전에 분리 된 파일 (" - -#: src/slic3r/GUI/MainFrame.cpp:544 -msgid ") not found." -msgstr ")을 찾을 수 없습니다." - -#: src/slic3r/GUI/MainFrame.cpp:545 -msgid "File Not Found" -msgstr "파일을 찾을수 없다" - -#: src/slic3r/GUI/MainFrame.cpp:580 src/slic3r/GUI/Tab.cpp:3152 -msgid "Save " -msgstr "저장 " - -#: src/slic3r/GUI/MainFrame.cpp:580 -msgid "SVG" -msgstr "Svg" - -#: src/slic3r/GUI/MainFrame.cpp:580 -msgid "G-code" -msgstr "G 코드" - -#: src/slic3r/GUI/MainFrame.cpp:580 -msgid " file as:" -msgstr " 다음 파일 :" - -#: src/slic3r/GUI/MainFrame.cpp:595 -msgid "Save zip file as:" -msgstr "압축(zip)파일 다른이름 저장:" - -#: src/slic3r/GUI/MainFrame.cpp:607 src/slic3r/GUI/Plater.cpp:2352 -#: src/slic3r/GUI/Plater.cpp:3467 src/slic3r/GUI/Tab.cpp:1110 -#: src/slic3r/GUI/Tab.cpp:3348 -msgid "Slicing" -msgstr "슬라이싱" - -#: src/slic3r/GUI/MainFrame.cpp:607 -msgid "Processing " -msgstr "프로세싱 " - -#: src/slic3r/GUI/MainFrame.cpp:630 -msgid " was successfully sliced." -msgstr " 성공적으로 슬라이스." - -#: src/slic3r/GUI/MainFrame.cpp:632 -msgid "Slicing Done!" -msgstr "슬라이스 완료!" - -#: src/slic3r/GUI/MainFrame.cpp:647 -msgid "Select the STL file to repair:" -msgstr "복구 할 STL 파일을 선택하십시오:" - -#: src/slic3r/GUI/MainFrame.cpp:661 -msgid "Save OBJ file (less prone to coordinate errors than STL) as:" -msgstr "OBJ 파일을 저장하십시오 (STL보다 오류를 덜 조정할 가능성이 적음):" - -#: src/slic3r/GUI/MainFrame.cpp:676 -msgid "Your file was repaired." -msgstr "파일이 복구되었습니다." - -#: src/slic3r/GUI/MainFrame.cpp:676 src/libslic3r/PrintConfig.cpp:3051 -msgid "Repair" -msgstr "수정" - -#: src/slic3r/GUI/MainFrame.cpp:690 -msgid "Save configuration as:" -msgstr "구성을 저장 :" - -#: src/slic3r/GUI/MainFrame.cpp:710 src/slic3r/GUI/MainFrame.cpp:774 -msgid "Select configuration to load:" -msgstr "로드 할 구성 선택 :" - -#: src/slic3r/GUI/MainFrame.cpp:747 -msgid "Save presets bundle as:" -msgstr "이전 설정 번들을 다음과 같이 저장 :" - -#: src/slic3r/GUI/MainFrame.cpp:798 -#, c-format -msgid "%d presets successfully imported." -msgstr "% d 사전 설정을 가져 왔습니다." - -#: src/slic3r/GUI/MsgDialog.cpp:71 -msgid "Slic3r error" -msgstr "Slic3r 오류" - -#: src/slic3r/GUI/MsgDialog.cpp:71 -msgid "Slic3r has encountered an error" -msgstr "Slic3r에 오류가 발생했습니다" - -#: src/slic3r/GUI/Plater.cpp:137 -msgid "Volume" -msgstr "크기" - -#: src/slic3r/GUI/Plater.cpp:138 -msgid "Facets" -msgstr "측면" - -#: src/slic3r/GUI/Plater.cpp:139 -msgid "Materials" -msgstr "재료" - -#: src/slic3r/GUI/Plater.cpp:142 -msgid "Manifold" -msgstr "많은" - -#: src/slic3r/GUI/Plater.cpp:188 -msgid "Sliced Info" -msgstr "슬라이스된 정보" - -#: src/slic3r/GUI/Plater.cpp:207 src/slic3r/GUI/Plater.cpp:998 -msgid "Used Filament (m)" -msgstr "사용자 필라멘트 (m)" - -#: src/slic3r/GUI/Plater.cpp:208 -msgid "Used Filament (mm³)" -msgstr "사용자 필라멘트 (mm³)" - -#: src/slic3r/GUI/Plater.cpp:209 -msgid "Used Filament (g)" -msgstr "사용자 필라멘트 (g)" - -#: src/slic3r/GUI/Plater.cpp:210 -msgid "Used Material (unit)" -msgstr "사용 재료 (단위)" - -#: src/slic3r/GUI/Plater.cpp:211 src/slic3r/GUI/Plater.cpp:1013 -#: src/libslic3r/PrintConfig.cpp:716 -msgid "Cost" -msgstr "비용" - -#: src/slic3r/GUI/Plater.cpp:212 src/slic3r/GUI/Plater.cpp:985 -#: src/slic3r/GUI/Plater.cpp:1027 -msgid "Estimated printing time" -msgstr "예상 인쇄 시간" - -#: src/slic3r/GUI/Plater.cpp:213 -msgid "Number of tool changes" -msgstr "공구(tool) 변경 수" - -#: src/slic3r/GUI/Plater.cpp:290 -msgid "Click to edit preset" -msgstr "사전 설정을 편집 하려면 클릭 하십시오" - -#: src/slic3r/GUI/Plater.cpp:413 -msgid "Select what kind of support do you need" -msgstr "서포트의 종류를 선택하세요" - -#: src/slic3r/GUI/Plater.cpp:415 src/libslic3r/PrintConfig.cpp:1814 -#: src/libslic3r/PrintConfig.cpp:2419 -msgid "Support on build plate only" -msgstr "출력물만 서포트를 지지" - -#: src/slic3r/GUI/Plater.cpp:416 -msgid "Everywhere" -msgstr "모든곳" - -#: src/slic3r/GUI/Plater.cpp:438 src/slic3r/GUI/Tab.cpp:1007 -msgid "Brim" -msgstr "브림" - -#: src/slic3r/GUI/Plater.cpp:440 -msgid "" -"This flag enables the brim that will be printed around each object on the " -"first layer." -msgstr "" -"이 플래그는 첫 번째 레이어의 각 개체 주위에 인쇄 될 브림을 활성화합니다." - -#: src/slic3r/GUI/Plater.cpp:448 -msgid "Purging volumes" -msgstr "볼륨 삭제" - -#: src/slic3r/GUI/Plater.cpp:673 -msgid "Print settings" -msgstr "프린트 설정" - -#: src/slic3r/GUI/Plater.cpp:674 src/slic3r/GUI/Tab.cpp:1421 -#: src/slic3r/GUI/Tab.cpp:1422 -msgid "Filament" -msgstr "필라멘트" - -#: src/slic3r/GUI/Plater.cpp:675 src/slic3r/GUI/Preset.cpp:1252 -msgid "SLA print" -msgstr "SLA 인쇄" - -#: src/slic3r/GUI/Plater.cpp:676 src/slic3r/GUI/Preset.cpp:1253 -msgid "SLA material" -msgstr "SLA 재료" - -#: src/slic3r/GUI/Plater.cpp:677 -msgid "Printer" -msgstr "프린터" - -#: src/slic3r/GUI/Plater.cpp:707 src/slic3r/GUI/Plater.cpp:3674 -msgid "Send to printer" -msgstr "프린터로 보내기" - -#: src/slic3r/GUI/Plater.cpp:727 src/slic3r/GUI/Plater.cpp:2352 -#: src/slic3r/GUI/Plater.cpp:3470 -msgid "Slice now" -msgstr "지금 자르기" - -#: src/slic3r/GUI/Plater.cpp:860 -msgid "Hold Shift to Slice & Export G-code" -msgstr "Shift 키를 누른 채 G 코드 내보내기" - -#: src/slic3r/GUI/Plater.cpp:931 -#, c-format -msgid "%d (%d shells)" -msgstr "% d (% d 쉘)" - -#: src/slic3r/GUI/Plater.cpp:936 -#, c-format -msgid "Auto-repaired (%d errors)" -msgstr "오류자동수정 (%d errors)" - -#: src/slic3r/GUI/Plater.cpp:939 -#, c-format -msgid "" -"%d degenerate facets, %d edges fixed, %d facets removed, %d facets added, %d " -"facets reversed, %d backwards edges" -msgstr "" -"%d 면 고정, %d 모서리 고정, %d 면 제거, %d 면 추가, %d 면 반전, %d 후방 모서" -"리" - -#: src/slic3r/GUI/Plater.cpp:949 -msgid "Yes" -msgstr "예" - -#: src/slic3r/GUI/Plater.cpp:972 -msgid "Used Material (ml)" -msgstr "사용 재료 (ml)" - -#: src/slic3r/GUI/Plater.cpp:975 -msgid "object(s)" -msgstr "" -"스커트와 객체 사이의 거리. 스커트를 객체에 부착하고 접착력을 높이기 위해 이" -"를 0으로 설정한다." - -#: src/slic3r/GUI/Plater.cpp:975 -msgid "supports and pad" -msgstr "지지대 및 패드" - -#: src/slic3r/GUI/Plater.cpp:1000 src/slic3r/GUI/Plater.cpp:1015 -msgid "objects" -msgstr "개체" - -#: src/slic3r/GUI/Plater.cpp:1000 src/slic3r/GUI/Plater.cpp:1015 -msgid "wipe tower" -msgstr "와이프 타워(Wipe tower)" - -#: src/slic3r/GUI/Plater.cpp:1030 -msgid "normal mode" -msgstr "일반 모드" - -#: src/slic3r/GUI/Plater.cpp:1034 -msgid "silent mode" -msgstr "무음 모드" - -#: src/slic3r/GUI/Plater.cpp:1544 -msgid "Loading" -msgstr "로딩" - -#: src/slic3r/GUI/Plater.cpp:1554 -#, c-format -msgid "Processing input file %s\n" -msgstr "입력 파일 처리 %s\n" - -#: src/slic3r/GUI/Plater.cpp:1612 -msgid "" -"This file contains several objects positioned at multiple heights. Instead " -"of considering them as multiple objects, should I consider\n" -"this file as a single object having multiple parts?\n" -msgstr "" -"이 파일에는 여러 높이에 위치한 여러 객체가 들어 있습니다. 여러 객체로 간주하" -"는 대신,\n" -"이 파일은 여러 부분을 갖는 단일 객체로 보입니까?\n" - -#: src/slic3r/GUI/Plater.cpp:1615 src/slic3r/GUI/Plater.cpp:1707 -msgid "Multi-part object detected" -msgstr "다중 부품 객체가 감지" - -#: src/slic3r/GUI/Plater.cpp:1650 -msgid "" -"This file cannot be loaded in simple mode. Do you want to switch to expert " -"mode?\n" -msgstr "" -"이 파일은 단순 모드에서 로드할 수 없습니다. 전문가 모드로 전환 하시겠습니" -"까?\n" - -#: src/slic3r/GUI/Plater.cpp:1651 -msgid "Detected advanced data" -msgstr "감지된 고급 데이터" - -#: src/slic3r/GUI/Plater.cpp:1684 -#, c-format -msgid "" -"You can't to add the object(s) from %s because of one or some of them " -"is(are) multi-part" -msgstr "멀티파트 하나 또는 그 중 일부 때문에 %s에서 개체를 추가 할 수 없습니다" - -#: src/slic3r/GUI/Plater.cpp:1704 -msgid "" -"Multiple objects were loaded for a multi-material printer.\n" -"Instead of considering them as multiple objects, should I consider\n" -"these files to represent a single object having multiple parts?\n" -msgstr "" -"다중 재료 프린터에 대해 여러 객체가로드되었습니다.\n" -"여러 객체로 간주하는 대신,\n" -"이 파일들은 여러 부분을 갖는 단일 객체를 나타낼 수 있습니까?\n" - -#: src/slic3r/GUI/Plater.cpp:1720 -msgid "Loaded" -msgstr "로드(loaded)" - -#: src/slic3r/GUI/Plater.cpp:1812 -msgid "" -"Your object appears to be too large, so it was automatically scaled down to " -"fit your print bed." -msgstr "개체가 너무 커서 인쇄물에 맞게 자동으로 축소되었습니다." - -#: src/slic3r/GUI/Plater.cpp:1813 -msgid "Object too large?" -msgstr "개체가 너무 큽니까?" - -#: src/slic3r/GUI/Plater.cpp:1863 -msgid "Export STL file:" -msgstr "STL 파일 내보내기:" - -#: src/slic3r/GUI/Plater.cpp:1870 -msgid "Export AMF file:" -msgstr "AMF 파일 내보내기:" - -#: src/slic3r/GUI/Plater.cpp:1876 -msgid "Save file as:" -msgstr "다른 이름으로 파일 저장:" - -#: src/slic3r/GUI/Plater.cpp:2042 -msgid "Arranging canceled" -msgstr "취소 된 정렬" - -#: src/slic3r/GUI/Plater.cpp:2045 -msgid "Arranging" -msgstr "정렬" - -#: src/slic3r/GUI/Plater.cpp:2079 -msgid "Could not arrange model objects! Some geometries may be invalid." -msgstr "" -"모델 개체를 정렬할 수 없습니다. 일부 형상은 유효 하지 않을 수 있습니다." - -#: src/slic3r/GUI/Plater.cpp:2083 -msgid "Arranging done." -msgstr "정렬 완료." - -#: src/slic3r/GUI/Plater.cpp:2124 -msgid "Orientation search canceled" -msgstr "오리엔테이션 검색이 취소 됨" - -#: src/slic3r/GUI/Plater.cpp:2129 -msgid "Searching for optimal orientation" -msgstr "최적의 방향 검색" - -#: src/slic3r/GUI/Plater.cpp:2190 -msgid "Orientation found." -msgstr "방향을 찾았습니다." - -#: src/slic3r/GUI/Plater.cpp:2211 -msgid "" -"The selected object can't be split because it contains more than one volume/" -"material." -msgstr "" -"선택한 객체는 둘 이상의 볼륨 / 재료가 포함되어 있기 때문에 분할 할 수 없습니" -"다." - -#: src/slic3r/GUI/Plater.cpp:2337 -msgid "Invalid data" -msgstr "잘못 된 데이터" - -#: src/slic3r/GUI/Plater.cpp:2346 -msgid "Ready to slice" -msgstr "슬라이스 준비" - -#: src/slic3r/GUI/Plater.cpp:2379 src/slic3r/GUI/PrintHostDialogs.cpp:220 -msgid "Cancelling" -msgstr "취소 중" - -#: src/slic3r/GUI/Plater.cpp:2396 -msgid "Another export job is currently running." -msgstr "다른 내보내기 작업이 현재 실행 중입니다." - -#: src/slic3r/GUI/Plater.cpp:2656 -msgid "Export failed" -msgstr "내보내기 실패" - -#: src/slic3r/GUI/Plater.cpp:2661 src/slic3r/GUI/PrintHostDialogs.cpp:221 -msgid "Cancelled" -msgstr "취소됨" - -#: src/slic3r/GUI/Plater.cpp:2747 src/slic3r/GUI/Plater.cpp:2759 -#: src/slic3r/GUI/Plater.cpp:2831 -msgid "Increase copies" -msgstr "복사본 늘리기" - -#: src/slic3r/GUI/Plater.cpp:2825 src/slic3r/GUI/Plater.cpp:2843 -msgid "Remove the selected object" -msgstr "선택한 객체 제거" - -#: src/slic3r/GUI/Plater.cpp:2831 -msgid "Place one more copy of the selected object" -msgstr "선택한 객체를 하나 더 복사합니다" - -#: src/slic3r/GUI/Plater.cpp:2833 -msgid "Decrease copies" -msgstr "복사본 감소" - -#: src/slic3r/GUI/Plater.cpp:2833 -msgid "Remove one copy of the selected object" -msgstr "선택한 객체 복사본 하나 삭제" - -#: src/slic3r/GUI/Plater.cpp:2835 -msgid "Set number of copies" -msgstr "복사될 수량 설정" - -#: src/slic3r/GUI/Plater.cpp:2835 -msgid "Change the number of copies of the selected object" -msgstr "선택한 개체의 복사본 수 변경" - -#: src/slic3r/GUI/Plater.cpp:2858 -msgid "Reload from Disk" -msgstr "디스크에서 다시 불러오기" - -#: src/slic3r/GUI/Plater.cpp:2858 -msgid "Reload the selected file from Disk" -msgstr "디스크에서 다시 불러오기" - -#: src/slic3r/GUI/Plater.cpp:2861 -msgid "Export the selected object as STL file" -msgstr "선택한 객체를 STL 파일로 내보내기" - -#: src/slic3r/GUI/Plater.cpp:2873 -msgid "Along X axis" -msgstr "X 축을 따라" - -#: src/slic3r/GUI/Plater.cpp:2873 -msgid "Mirror the selected object along the X axis" -msgstr "선택한 객체를 X 축을 따라 반전합니다" - -#: src/slic3r/GUI/Plater.cpp:2875 -msgid "Along Y axis" -msgstr "Y 축을 따라" - -#: src/slic3r/GUI/Plater.cpp:2875 -msgid "Mirror the selected object along the Y axis" -msgstr "선택한 객체를 Y 축을 따라 반전합니다" - -#: src/slic3r/GUI/Plater.cpp:2877 -msgid "Along Z axis" -msgstr "Z 축 따라" - -#: src/slic3r/GUI/Plater.cpp:2877 -msgid "Mirror the selected object along the Z axis" -msgstr "선택한 객체를 Z 축을 따라 반전합니다" - -#: src/slic3r/GUI/Plater.cpp:2880 -msgid "Mirror" -msgstr "반전(Mirror)" - -#: src/slic3r/GUI/Plater.cpp:2880 -msgid "Mirror the selected object" -msgstr "반전할 객제를 선택" - -#: src/slic3r/GUI/Plater.cpp:2898 -msgid "To objects" -msgstr "개체에" - -#: src/slic3r/GUI/Plater.cpp:2898 src/slic3r/GUI/Plater.cpp:2920 -msgid "Split the selected object into individual objects" -msgstr "선택한 개체를 개별 개체로 분할 합니다." - -#: src/slic3r/GUI/Plater.cpp:2900 -msgid "To parts" -msgstr "부품에" - -#: src/slic3r/GUI/Plater.cpp:2900 src/slic3r/GUI/Plater.cpp:2940 -msgid "Split the selected object into individual sub-parts" -msgstr "선택한 오브젝트를 개별 하위 파트로 분할" - -#: src/slic3r/GUI/Plater.cpp:2903 src/slic3r/GUI/Plater.cpp:2920 -#: src/slic3r/GUI/Plater.cpp:2940 src/libslic3r/PrintConfig.cpp:3075 -msgid "Split" -msgstr "쪼개기" - -#: src/slic3r/GUI/Plater.cpp:2903 -msgid "Split the selected object" -msgstr "선택한 개체 분할" - -#: src/slic3r/GUI/Plater.cpp:2926 -msgid "Optimize orientation" -msgstr "방향 최적화" - -#: src/slic3r/GUI/Plater.cpp:2926 -msgid "Optimize the rotation of the object for better print results." -msgstr "더 나은 인쇄 결과를 위해 개체의 회전을 최적화합니다." - -#: src/slic3r/GUI/Plater.cpp:3342 -msgid "Save G-code file as:" -msgstr "G-code 파일 다른 이름 저장:" - -#: src/slic3r/GUI/Plater.cpp:3342 -msgid "Save SL1 file as:" -msgstr "SL1 파일 다른이름 저장:" - -#: src/slic3r/GUI/Plater.cpp:3397 -#, c-format -msgid "STL file exported to %s" -msgstr "내보낸 STL 파일 %s" - -#: src/slic3r/GUI/Plater.cpp:3413 -#, c-format -msgid "AMF file exported to %s" -msgstr "내보낸 AMF 파일 %s" - -#: src/slic3r/GUI/Plater.cpp:3416 -#, c-format -msgid "Error exporting AMF file %s" -msgstr "AMF 파일 내보내기 오류 %s" - -#: src/slic3r/GUI/Plater.cpp:3442 -#, c-format -msgid "3MF file exported to %s" -msgstr "3MF 파일을 내보냈습니다 %s" - -#: src/slic3r/GUI/Plater.cpp:3445 -#, c-format -msgid "Error exporting 3MF file %s" -msgstr "3MF 파일 내보내기 오류 %s" - -#: src/slic3r/GUI/Plater.cpp:3673 -msgid "Export" -msgstr "내보내기" - -#: src/slic3r/GUI/Plater.cpp:3674 -msgid "Send G-code" -msgstr "G 코드 보내기" - -#: src/slic3r/GUI/Preferences.cpp:17 src/slic3r/GUI/Tab.cpp:1762 -#: src/slic3r/GUI/Tab.cpp:1963 -msgid "General" -msgstr "일반" - -#: src/slic3r/GUI/Preferences.cpp:34 -msgid "Remember output directory" -msgstr "출력 디렉토리 기억하기" - -#: src/slic3r/GUI/Preferences.cpp:36 -msgid "" -"If this is enabled, Slic3r will prompt the last output directory instead of " -"the one containing the input files." -msgstr "" -"이 옵션을 사용하면 Slic3r은 입력 파일이 들어있는 디렉터리 대신 마지막 출력 디" -"렉터리를 묻습니다." - -#: src/slic3r/GUI/Preferences.cpp:42 -msgid "Auto-center parts" -msgstr "부품을 자동으로 중심에" - -#: src/slic3r/GUI/Preferences.cpp:44 -msgid "" -"If this is enabled, Slic3r will auto-center objects around the print bed " -"center." -msgstr "이 옵션을 사용하면 Slic3r이 개체를 인쇄판 중앙에 자동으로 배치합니다." - -#: src/slic3r/GUI/Preferences.cpp:50 -msgid "Background processing" -msgstr "백그라운드 프로세싱" - -#: src/slic3r/GUI/Preferences.cpp:52 -msgid "" -"If this is enabled, Slic3r will pre-process objects as soon as they're " -"loaded in order to save time when exporting G-code." -msgstr "" -"이 사용 하는 경우 Slic3r는 전처리 개체 최대한 빨리 그들이 시간을 절약 하기 위" -"해 로드 G-코드를 내보낼 때." - -#: src/slic3r/GUI/Preferences.cpp:74 -msgid "Suppress \" - default - \" presets" -msgstr "\"- 기본 -\"사전 설정 숨기기" - -#: src/slic3r/GUI/Preferences.cpp:76 -msgid "" -"Suppress \" - default - \" presets in the Print / Filament / Printer " -"selections once there are any other valid presets available." -msgstr "" -"사용 가능한 다른 유효한 사전 설정이 있으면 인쇄 / 필라멘트 / 프린터 선택에서 " -"\"- 기본 -\"사전 설정을 억제하십시오." - -#: src/slic3r/GUI/Preferences.cpp:82 -msgid "Show incompatible print and filament presets" -msgstr "호환 되지 않는 인쇄 및 필라멘트 설정" - -#: src/slic3r/GUI/Preferences.cpp:84 -msgid "" -"When checked, the print and filament presets are shown in the preset editor " -"even if they are marked as incompatible with the active printer" -msgstr "" -"이 옵션을 선택하면 활성 프린터와 호환되지 않는 것으로 표시된 경우에도 인쇄 " -"및 필라멘트 사전 설정이 사전 설정 편집기에 표시됩니다" - -#: src/slic3r/GUI/Preferences.cpp:91 -msgid "Use legacy OpenGL 1.1 rendering" -msgstr "레거시 OpenGL 1.1 렌더링 사용" - -#: src/slic3r/GUI/Preferences.cpp:93 -msgid "" -"If you have rendering issues caused by a buggy OpenGL 2.0 driver, you may " -"try to check this checkbox. This will disable the layer height editing and " -"anti aliasing, so it is likely better to upgrade your graphics driver." -msgstr "" -"버그가있는 OpenGL 2.0 드라이버로 인한 렌더링 문제가있는 경우이 확인란을 선택" -"해보십시오. 이렇게하면 레이어 높이 편집 및 앤티 앨리어싱이 비활성화되므로 그" -"래픽 드라이버를 업그레이드하는 것이 좋습니다." - -#: src/slic3r/GUI/Preferences.cpp:101 -msgid "Use Retina resolution for the 3D scene" -msgstr "3D 장면에 레티나 해상도 사용" - -#: src/slic3r/GUI/Preferences.cpp:103 -msgid "" -"If enabled, the 3D scene will be rendered in Retina resolution. If you are " -"experiencing 3D performance problems, disabling this option may help." -msgstr "" -"활성화 된 경우 3D 장면은 레티나 해상도로 렌더링 됩니다. 3D 성능 문제가 발생하" -"는 경우, 옵션을 사용하지 않도록 설정 하면 도움이 될 수 있습니다." - -#: src/slic3r/GUI/Preferences.cpp:126 -msgid "You need to restart Slic3r to make the changes effective." -msgstr "변경 사항을 적용하려면 Slic3r을 다시 시작해야합니다." - -#: src/slic3r/GUI/Preset.cpp:207 -msgid "modified" -msgstr "수정된곳" - -#: src/slic3r/GUI/Preset.cpp:918 src/slic3r/GUI/Preset.cpp:958 -#: src/slic3r/GUI/Preset.cpp:1011 src/slic3r/GUI/Preset.cpp:1043 -#: src/slic3r/GUI/PresetBundle.cpp:1484 src/slic3r/GUI/PresetBundle.cpp:1537 -msgid "System presets" -msgstr "시스템 기본설정" - -#: src/slic3r/GUI/Preset.cpp:962 src/slic3r/GUI/Preset.cpp:1047 -#: src/slic3r/GUI/PresetBundle.cpp:1542 -msgid "User presets" -msgstr "사용자 사전설정" - -#: src/slic3r/GUI/Preset.cpp:991 src/slic3r/GUI/Tab.cpp:247 -msgid "Add a new printer" -msgstr "새 프린터 추가" - -#: src/slic3r/GUI/Preset.cpp:1251 -msgid "filament" -msgstr "필라멘트" - -#: src/slic3r/GUI/PresetHints.cpp:28 -#, c-format -msgid "" -"If estimated layer time is below ~%ds, fan will run at %d%% and print speed " -"will be reduced so that no less than %ds are spent on that layer (however, " -"speed will never be reduced below %dmm/s)." -msgstr "" -"예상 레이어 시간이 ~ % d 초 미만이면 팬이 % d %%에서 실행되고 인쇄 속도가 감" -"소되어 해당 레이어에 % ds 이상 소비됩니다 (단, 속도는 % dmm / s 이하로 감소하" -"지 않습니다) ." - -#: src/slic3r/GUI/PresetHints.cpp:32 -#, c-format -msgid "" -"\n" -"If estimated layer time is greater, but still below ~%ds, fan will run at a " -"proportionally decreasing speed between %d%% and %d%%." -msgstr "" -"\n" -"예상 레이어 시간이 더 길지만 ~ % ds 미만인 경우 팬은 % d %%와 % d %% 사이에 " -"비례하여 감소하는 속도로 실행됩니다." - -#: src/slic3r/GUI/PresetHints.cpp:36 -msgid "" -"\n" -"During the other layers, fan " -msgstr "" -"\n" -"다른 레이어 중 팬 " - -#: src/slic3r/GUI/PresetHints.cpp:38 -msgid "Fan " -msgstr "팬(Fan) " - -#: src/slic3r/GUI/PresetHints.cpp:43 -#, c-format -msgid "will always run at %d%% " -msgstr "항상 다음처럼 실행 %d%% " - -#: src/slic3r/GUI/PresetHints.cpp:46 -#, c-format -msgid "except for the first %d layers" -msgstr "첫 번째 %d 레이어를 제외하고" - -#: src/slic3r/GUI/PresetHints.cpp:50 -msgid "except for the first layer" -msgstr "첫 번째 레이어를 제외하고" - -#: src/slic3r/GUI/PresetHints.cpp:52 -msgid "will be turned off." -msgstr "off 됩니다." - -#: src/slic3r/GUI/PresetHints.cpp:153 -msgid "external perimeters" -msgstr "외부 둘레" - -#: src/slic3r/GUI/PresetHints.cpp:162 -msgid "perimeters" -msgstr "둘레" - -#: src/slic3r/GUI/PresetHints.cpp:171 -msgid "infill" -msgstr "채움(infill)" - -#: src/slic3r/GUI/PresetHints.cpp:181 -msgid "solid infill" -msgstr "고체(solid)부분 채움" - -#: src/slic3r/GUI/PresetHints.cpp:189 -msgid "top solid infill" -msgstr "가장 윗부분 채움" - -#: src/slic3r/GUI/PresetHints.cpp:200 -msgid "support" -msgstr "서포트" - -#: src/slic3r/GUI/PresetHints.cpp:210 -msgid "support interface" -msgstr "서포트 인터페이스" - -#: src/slic3r/GUI/PresetHints.cpp:216 -msgid "First layer volumetric" -msgstr "첫번째 레이어 용적" - -#: src/slic3r/GUI/PresetHints.cpp:216 -msgid "Bridging volumetric" -msgstr "브리징(Bridging) 용적" - -#: src/slic3r/GUI/PresetHints.cpp:216 -msgid "Volumetric" -msgstr "용적" - -#: src/slic3r/GUI/PresetHints.cpp:217 -msgid " flow rate is maximized " -msgstr "유속(flow)이 최대화된다 " - -#: src/slic3r/GUI/PresetHints.cpp:220 -msgid "by the print profile maximum" -msgstr "인쇄 프로파일 최대 값" - -#: src/slic3r/GUI/PresetHints.cpp:221 -msgid "when printing " -msgstr "인쇄 할때 " - -#: src/slic3r/GUI/PresetHints.cpp:222 -msgid " with a volumetric rate " -msgstr " 용적 비율로 " - -#: src/slic3r/GUI/PresetHints.cpp:226 -#, c-format -msgid "%3.2f mm³/s" -msgstr "%3.2f mm³/s" - -#: src/slic3r/GUI/PresetHints.cpp:228 -#, c-format -msgid " at filament speed %3.2f mm/s." -msgstr " 필라멘트 속도는 %3.2f mm/s." - -#: src/slic3r/GUI/PresetHints.cpp:247 -msgid "" -"Recommended object thin wall thickness: Not available due to invalid layer " -"height." -msgstr "" -"권장 객체(object) 벽(wall) 두께: 잘못된 레이어 높이 때문에 사용할 수 없음." - -#: src/slic3r/GUI/PresetHints.cpp:264 -#, c-format -msgid "Recommended object thin wall thickness for layer height %.2f and " -msgstr "개체 레이어 높이 %.2f 에 대 한 얇은 벽 두께 권장 하 고 " - -#: src/slic3r/GUI/PresetHints.cpp:271 -#, c-format -msgid "%d lines: %.2lf mm" -msgstr "%d 라인(lines): %.2lf mm" - -#: src/slic3r/GUI/PrintHostDialogs.cpp:32 -msgid "Send G-Code to printer host" -msgstr "프린터 호스트로 G 코드 보내기" - -#: src/slic3r/GUI/PrintHostDialogs.cpp:32 -msgid "Upload to Printer Host with the following filename:" -msgstr "다음 파일 이름으로 프린터 호스트에 업로드:" - -#: src/slic3r/GUI/PrintHostDialogs.cpp:34 -msgid "Start printing after upload" -msgstr "업로드 후 인쇄 시작" - -#: src/slic3r/GUI/PrintHostDialogs.cpp:41 -msgid "Use forward slashes ( / ) as a directory separator if needed." -msgstr "필요한 경우 디렉토리 분리 기호로 슬래시 (/)를 사용하십시오." - -#: src/slic3r/GUI/PrintHostDialogs.cpp:157 -msgid "Cancel selected" -msgstr "선택 취소" - -#: src/slic3r/GUI/PrintHostDialogs.cpp:159 -msgid "Show error message" -msgstr "오류 메시지 표시" - -#: src/slic3r/GUI/PrintHostDialogs.cpp:198 -#: src/slic3r/GUI/PrintHostDialogs.cpp:217 -msgid "Enqueued" -msgstr "입력됨" - -#: src/slic3r/GUI/PrintHostDialogs.cpp:218 -msgid "Uploading" -msgstr "업로드" - -#: src/slic3r/GUI/PrintHostDialogs.cpp:222 -msgid "Completed" -msgstr "완료됨" - -#: src/slic3r/GUI/PrintHostDialogs.cpp:260 -msgid "Error uploading to print host:" -msgstr "인쇄 호스트에 업로드 하는 중 오류 발생:" - -#: src/slic3r/GUI/RammingChart.cpp:23 -msgid "NO RAMMING AT ALL" -msgstr "전혀 충돌 없음" - -#: src/slic3r/GUI/RammingChart.cpp:76 -msgid "Time" -msgstr "시간" - -#: src/slic3r/GUI/RammingChart.cpp:76 src/slic3r/GUI/RammingChart.cpp:81 -#: src/slic3r/GUI/WipeTowerDialog.cpp:82 src/libslic3r/PrintConfig.cpp:611 -#: src/libslic3r/PrintConfig.cpp:655 src/libslic3r/PrintConfig.cpp:670 -#: src/libslic3r/PrintConfig.cpp:2241 src/libslic3r/PrintConfig.cpp:2250 -#: src/libslic3r/PrintConfig.cpp:2308 src/libslic3r/PrintConfig.cpp:2315 -msgid "s" -msgstr "s" - -#: src/slic3r/GUI/RammingChart.cpp:81 -msgid "Volumetric speed" -msgstr "용적(Volumetric) 스피트" - -#: src/slic3r/GUI/SysInfoDialog.cpp:44 -msgid "Slic3r Prusa Edition - System Information" -msgstr "Slic3r Prusa 에디션-시스템 정보" - -#: src/slic3r/GUI/Tab.cpp:50 src/libslic3r/PrintConfig.cpp:228 -msgid "Compatible printers" -msgstr "호환 가능한 프린터들" - -#: src/slic3r/GUI/Tab.cpp:51 -msgid "Select the printers this profile is compatible with." -msgstr "이 프로파일과 호환 가능한 프린터를 선택하세요." - -#: src/slic3r/GUI/Tab.cpp:56 src/libslic3r/PrintConfig.cpp:243 -msgid "Compatible print profiles" -msgstr "호환되는 인쇄 프로 파일" - -#: src/slic3r/GUI/Tab.cpp:57 -msgid "Select the print profiles this profile is compatible with." -msgstr "이 프로필이 호환되는 인쇄 프로필을 선택 합니다." - -#: src/slic3r/GUI/Tab.cpp:132 -msgid "Save current " -msgstr "지금 저장 " - -#: src/slic3r/GUI/Tab.cpp:133 -msgid "Delete this preset" -msgstr "이전 설정 삭제" - -#: src/slic3r/GUI/Tab.cpp:145 -msgid "" -"Hover the cursor over buttons to find more information \n" -"or click this button." -msgstr "" -"버튼 위로 커서를 가져 가서 자세한 정보를 찾습니다.\n" -"또는이 버튼을 클릭하십시오." - -#: src/slic3r/GUI/Tab.cpp:858 -msgid "It's a default preset." -msgstr "기본 설정입니다." - -#: src/slic3r/GUI/Tab.cpp:859 -msgid "It's a system preset." -msgstr "시스템 설정입니다." - -#: src/slic3r/GUI/Tab.cpp:860 -msgid "Current preset is inherited from " -msgstr "전의 설정에서 가져 옵니다 " - -#: src/slic3r/GUI/Tab.cpp:865 -msgid "It can't be deleted or modified. " -msgstr "삭제하거나 수정할 수 없습니다. " - -#: src/slic3r/GUI/Tab.cpp:866 -msgid "" -"Any modifications should be saved as a new preset inherited from this one. " -msgstr "모든 수정 사항은 이 항목에서 받은 기본 설정으로 저장해야합니다. " - -#: src/slic3r/GUI/Tab.cpp:867 -msgid "To do that please specify a new name for the preset." -msgstr "그렇게하려면 기본 설정의 새 이름을 지정하십시오." - -#: src/slic3r/GUI/Tab.cpp:871 -msgid "Additional information:" -msgstr "추가 정보:" - -#: src/slic3r/GUI/Tab.cpp:877 -msgid "printer model" -msgstr "프린터 모델" - -#: src/slic3r/GUI/Tab.cpp:885 -msgid "default print profile" -msgstr "기본 인쇄 프로파일" - -#: src/slic3r/GUI/Tab.cpp:888 -msgid "default filament profile" -msgstr "기본 필라멘트 프로파일" - -#: src/slic3r/GUI/Tab.cpp:902 -msgid "default SLA material profile" -msgstr "기본 SLA 재질 프로 파일" - -#: src/slic3r/GUI/Tab.cpp:906 -msgid "default SLA print profile" -msgstr "기본 SLA 인쇄 프로필" - -#: src/slic3r/GUI/Tab.cpp:948 src/slic3r/GUI/Tab.cpp:3303 -msgid "Layers and perimeters" -msgstr "레이어 및 경계선" - -#: src/slic3r/GUI/Tab.cpp:949 src/libslic3r/PrintConfig.cpp:55 -msgid "Layer height" -msgstr "레이어 높이" - -#: src/slic3r/GUI/Tab.cpp:953 -msgid "Vertical shells" -msgstr "쉘 높이" - -#: src/slic3r/GUI/Tab.cpp:964 -msgid "Horizontal shells" -msgstr "쉘 너비" - -#: src/slic3r/GUI/Tab.cpp:965 src/libslic3r/PrintConfig.cpp:1709 -msgid "Solid layers" -msgstr "솔리드 레이어" - -#: src/slic3r/GUI/Tab.cpp:970 -msgid "Quality (slower slicing)" -msgstr "품질(슬라이싱이 느려짐)" - -#: src/slic3r/GUI/Tab.cpp:988 -msgid "Reducing printing time" -msgstr "출력 시간 단축" - -#: src/slic3r/GUI/Tab.cpp:1000 -msgid "Skirt and brim" -msgstr "스커트와 브림" - -#: src/slic3r/GUI/Tab.cpp:1017 -msgid "Raft" -msgstr "라프트" - -#: src/slic3r/GUI/Tab.cpp:1021 -msgid "Options for support material and raft" -msgstr "서포트와 라프트 재료를 선택" - -#: src/slic3r/GUI/Tab.cpp:1036 -msgid "Speed for print moves" -msgstr "출력중 이동 속도" - -#: src/slic3r/GUI/Tab.cpp:1048 -msgid "Speed for non-print moves" -msgstr "미출력시 이동속도" - -#: src/slic3r/GUI/Tab.cpp:1051 -msgid "Modifiers" -msgstr "수정" - -#: src/slic3r/GUI/Tab.cpp:1054 -msgid "Acceleration control (advanced)" -msgstr "가속 제어(고급)" - -#: src/slic3r/GUI/Tab.cpp:1061 -msgid "Autospeed (advanced)" -msgstr "오토스피트(고급)" - -#: src/slic3r/GUI/Tab.cpp:1069 -msgid "Multiple Extruders" -msgstr "다중 익스트루더" - -#: src/slic3r/GUI/Tab.cpp:1077 -msgid "Ooze prevention" -msgstr "오즈 방지(Ooze prevention)" - -#: src/slic3r/GUI/Tab.cpp:1094 -msgid "Extrusion width" -msgstr "악출 폭(Extrusion width)" - -#: src/slic3r/GUI/Tab.cpp:1104 -msgid "Overlap" -msgstr "겹침(Overlap)" - -#: src/slic3r/GUI/Tab.cpp:1107 -msgid "Flow" -msgstr "유량(Flow)" - -#: src/slic3r/GUI/Tab.cpp:1116 -msgid "Other" -msgstr "그 외" - -#: src/slic3r/GUI/Tab.cpp:1119 src/slic3r/GUI/Tab.cpp:3351 -msgid "Output options" -msgstr "출력 옵션" - -#: src/slic3r/GUI/Tab.cpp:1120 -msgid "Sequential printing" -msgstr "연속 인쇄" - -#: src/slic3r/GUI/Tab.cpp:1122 -msgid "Extruder clearance (mm)" -msgstr "익스트루더 간격(mm)" - -#: src/slic3r/GUI/Tab.cpp:1131 src/slic3r/GUI/Tab.cpp:3352 -msgid "Output file" -msgstr "출력 파일" - -#: src/slic3r/GUI/Tab.cpp:1138 src/libslic3r/PrintConfig.cpp:1382 -msgid "Post-processing scripts" -msgstr "포스트 프로세싱 스크립트" - -#: src/slic3r/GUI/Tab.cpp:1144 src/slic3r/GUI/Tab.cpp:1145 -#: src/slic3r/GUI/Tab.cpp:1527 src/slic3r/GUI/Tab.cpp:1528 -#: src/slic3r/GUI/Tab.cpp:1935 src/slic3r/GUI/Tab.cpp:1936 -#: src/slic3r/GUI/Tab.cpp:2027 src/slic3r/GUI/Tab.cpp:2028 -#: src/slic3r/GUI/Tab.cpp:3240 src/slic3r/GUI/Tab.cpp:3241 -msgid "Notes" -msgstr "메모" - -#: src/slic3r/GUI/Tab.cpp:1151 src/slic3r/GUI/Tab.cpp:1535 -#: src/slic3r/GUI/Tab.cpp:1942 src/slic3r/GUI/Tab.cpp:2034 -#: src/slic3r/GUI/Tab.cpp:3248 src/slic3r/GUI/Tab.cpp:3357 -msgid "Dependencies" -msgstr "속한 그룹" - -#: src/slic3r/GUI/Tab.cpp:1152 src/slic3r/GUI/Tab.cpp:1536 -#: src/slic3r/GUI/Tab.cpp:1943 src/slic3r/GUI/Tab.cpp:2035 -#: src/slic3r/GUI/Tab.cpp:3249 src/slic3r/GUI/Tab.cpp:3358 -msgid "Profile dependencies" -msgstr "프로파일 종석성" - -#: src/slic3r/GUI/Tab.cpp:1198 -#, no-c-format -msgid "" -"The Spiral Vase mode requires:\n" -"- one perimeter\n" -"- no top solid layers\n" -"- 0% fill density\n" -"- no support material\n" -"- no ensure_vertical_shell_thickness\n" -"\n" -"Shall I adjust those settings in order to enable Spiral Vase?" -msgstr "" -"스파이럴 바이스 모드에는 다음이 필요합니다.\n" -"- one 둘레\n" -"- 탑 솔리드 레이어 없음\n" -"- 채우기(fill) 밀도 0 %\n" -"- 서포트 재료 없음\n" -"- 수직 벽 두깨를 보장하지 않음\n" -"\n" -"스파이럴 바이스를 사용하려면 이러한 설정을 조정해야합니까?" - -#: src/slic3r/GUI/Tab.cpp:1205 -msgid "Spiral Vase" -msgstr "스파이럴 바이스" - -#: src/slic3r/GUI/Tab.cpp:1228 -msgid "" -"The Wipe Tower currently supports the non-soluble supports only\n" -"if they are printed with the current extruder without triggering a tool " -"change.\n" -"(both support_material_extruder and support_material_interface_extruder need " -"to be set to 0).\n" -"\n" -"Shall I adjust those settings in order to enable the Wipe Tower?" -msgstr "" -"와이퍼 타워는 현재 비 가용성 서포트 만 지원합니다.\n" -"공구 교환을 트리거하지 않고 현재 압출기로 인쇄 한 경우.\n" -"(support_material_extruder 및 support_material_interface_extruder를 모두 0으" -"로 설정해야 함).\n" -"\n" -"와이퍼 타워를 사용하려면 이러한 설정을 조정해야합니까?" - -#: src/slic3r/GUI/Tab.cpp:1232 src/slic3r/GUI/Tab.cpp:1249 -msgid "Wipe Tower" -msgstr "와이프 타워(Wipe Tower)" - -#: src/slic3r/GUI/Tab.cpp:1246 -msgid "" -"For the Wipe Tower to work with the soluble supports, the support layers\n" -"need to be synchronized with the object layers.\n" -"\n" -"Shall I synchronize support layers in order to enable the Wipe Tower?" -msgstr "" -"와이퍼 타워가 가용성 서포트와 함께 작용하기 위해, 서포트 레이어\n" -"객체 레이어와 동기화되어야합니다.\n" -"\n" -"와이퍼 타워를 사용하려면 서포트 레이어를 동기화해야합니까?" - -#: src/slic3r/GUI/Tab.cpp:1264 -msgid "" -"Supports work better, if the following feature is enabled:\n" -"- Detect bridging perimeters\n" -"\n" -"Shall I adjust those settings for supports?" -msgstr "" -"다음 기능을 사용하는 경우 더 나은 작업을 지원합니다.\n" -"- 브리지 경계 검출\n" -"\n" -"서포트에 대한 설정을 조정해야합니까?" - -#: src/slic3r/GUI/Tab.cpp:1267 -msgid "Support Generator" -msgstr "서포트 생성" - -#: src/slic3r/GUI/Tab.cpp:1309 -msgid "The " -msgstr "The " - -#: src/slic3r/GUI/Tab.cpp:1309 -#, no-c-format -msgid "" -" infill pattern is not supposed to work at 100% density.\n" -"\n" -"Shall I switch to rectilinear fill pattern?" -msgstr "" -" infill 패턴은 100 % 밀도에서 작동하지 않습니다.\n" -"\n" -"직선 채우기 패턴으로 전환해야합니까?" - -#: src/slic3r/GUI/Tab.cpp:1429 -msgid "Temperature " -msgstr "온도 " - -#: src/slic3r/GUI/Tab.cpp:1435 -msgid "Bed" -msgstr "배드(Bed)" - -#: src/slic3r/GUI/Tab.cpp:1440 -msgid "Cooling" -msgstr "냉각(Cooling)" - -#: src/slic3r/GUI/Tab.cpp:1441 src/libslic3r/PrintConfig.cpp:1285 -#: src/libslic3r/PrintConfig.cpp:2097 -msgid "Enable" -msgstr "사용" - -#: src/slic3r/GUI/Tab.cpp:1452 -msgid "Fan settings" -msgstr "팬 설정" - -#: src/slic3r/GUI/Tab.cpp:1453 -msgid "Fan speed" -msgstr "팬 속도" - -#: src/slic3r/GUI/Tab.cpp:1461 -msgid "Cooling thresholds" -msgstr "냉각 임계 값" - -#: src/slic3r/GUI/Tab.cpp:1467 -msgid "Filament properties" -msgstr "필라멘트 특성" - -#: src/slic3r/GUI/Tab.cpp:1471 -msgid "Print speed override" -msgstr "인쇄 속도 중단" - -#: src/slic3r/GUI/Tab.cpp:1481 -msgid "Toolchange parameters with single extruder MM printers" -msgstr "싱글 익스트루더 MM 프린터를 사용한 공구 교환 매개 변수" - -#: src/slic3r/GUI/Tab.cpp:1496 -msgid "Ramming settings" -msgstr "래밍 설정" - -#: src/slic3r/GUI/Tab.cpp:1514 src/slic3r/GUI/Tab.cpp:1898 -msgid "Custom G-code" -msgstr "수동 G코드" - -#: src/slic3r/GUI/Tab.cpp:1515 src/slic3r/GUI/Tab.cpp:1899 -#: src/libslic3r/PrintConfig.cpp:1735 src/libslic3r/PrintConfig.cpp:1750 -msgid "Start G-code" -msgstr "스타트 G코드" - -#: src/slic3r/GUI/Tab.cpp:1521 src/slic3r/GUI/Tab.cpp:1905 -#: src/libslic3r/PrintConfig.cpp:358 src/libslic3r/PrintConfig.cpp:368 -msgid "End G-code" -msgstr "엔드 G코드" - -#: src/slic3r/GUI/Tab.cpp:1632 src/slic3r/GUI/Tab.cpp:1689 -msgid " Browse " -msgstr " 검색 " - -#: src/slic3r/GUI/Tab.cpp:1651 src/slic3r/GUI/Tab.cpp:1838 -msgid "Test" -msgstr "시험(test)" - -#: src/slic3r/GUI/Tab.cpp:1662 -msgid "Could not get a valid Printer Host reference" -msgstr "유효한 프린터 호스트 참조를 가져올 수 없습니다" - -#: src/slic3r/GUI/Tab.cpp:1668 src/slic3r/GUI/Tab.cpp:1851 -msgid "Success!" -msgstr "성공!" - -#: src/slic3r/GUI/Tab.cpp:1683 -msgid "" -"HTTPS CA file is optional. It is only needed if you use HTTPS with a self-" -"signed certificate." -msgstr "" -"HTTPS CA 파일은 선택 사항입니다. 자체 서명 된 인증서로 HTTPS를 사용하는 경우" -"에만 필요합니다." - -#: src/slic3r/GUI/Tab.cpp:1696 -msgid "Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*" -msgstr "인증서 파일 (* .crt, * .pem) | * .crt; * .pem | 모든 파일 | *. *" - -#: src/slic3r/GUI/Tab.cpp:1697 -msgid "Open CA certificate file" -msgstr "Open CA certificate file" - -#: src/slic3r/GUI/Tab.cpp:1725 -msgid "" -"HTTPS CA File:\n" -"\tOn this system, Slic3r uses HTTPS certificates from the system Certificate " -"Store or Keychain.\n" -"\tTo use a custom CA file, please import your CA file into Certificate " -"Store / Keychain." -msgstr "" -"HTTPS CA 파일:\n" -"\t이 시스템에서 Slic3r는 시스템 인증서 저장소나 키체인의 HTTPS 인증서를 사용 " -"합니다.\n" -"\t사용자 지정 CA 파일을 사용 하려면 CA 파일을 인증서 저장소/키체인에 가져오십" -"시오." - -#: src/slic3r/GUI/Tab.cpp:1763 src/slic3r/GUI/Tab.cpp:1964 -msgid "Size and coordinates" -msgstr "크기와 좌표" - -#: src/slic3r/GUI/Tab.cpp:1767 src/slic3r/GUI/Tab.cpp:1968 -#: src/slic3r/GUI/Tab.cpp:2911 -msgid " Set " -msgstr " 세트 " - -#: src/slic3r/GUI/Tab.cpp:1790 -msgid "Capabilities" -msgstr "기능" - -#: src/slic3r/GUI/Tab.cpp:1795 -msgid "Number of extruders of the printer." -msgstr "프린터 익스트루더 숫자." - -#: src/slic3r/GUI/Tab.cpp:1823 -msgid "USB/Serial connection" -msgstr "USB/시리얼 연결" - -#: src/slic3r/GUI/Tab.cpp:1824 src/libslic3r/PrintConfig.cpp:1590 -msgid "Serial port" -msgstr "시리얼 포트" - -#: src/slic3r/GUI/Tab.cpp:1829 -msgid "Rescan serial ports" -msgstr "시리얼포트 재검색" - -#: src/slic3r/GUI/Tab.cpp:1851 -msgid "Connection to printer works correctly." -msgstr "프린터 연결이 올바르게 작동합니다." - -#: src/slic3r/GUI/Tab.cpp:1854 -msgid "Connection failed." -msgstr "연결 실패." - -#: src/slic3r/GUI/Tab.cpp:1867 src/slic3r/GUI/Tab.cpp:2022 -msgid "Print Host upload" -msgstr "호스트 업로드 인쇄" - -#: src/slic3r/GUI/Tab.cpp:1911 src/libslic3r/PrintConfig.cpp:128 -msgid "Before layer change G-code" -msgstr "레이어 변경 전 G 코드" - -#: src/slic3r/GUI/Tab.cpp:1917 src/libslic3r/PrintConfig.cpp:1030 -msgid "After layer change G-code" -msgstr "레이어 변경 후 G 코드" - -#: src/slic3r/GUI/Tab.cpp:1923 src/libslic3r/PrintConfig.cpp:2005 -msgid "Tool change G-code" -msgstr "툴 채인지 G 코드" - -#: src/slic3r/GUI/Tab.cpp:1929 -msgid "Between objects G-code (for sequential printing)" -msgstr "객체 간 G 코드 (순차 인쇄용)" - -#: src/slic3r/GUI/Tab.cpp:1990 -msgid "Display" -msgstr "표시" - -#: src/slic3r/GUI/Tab.cpp:2001 -msgid "Tilt" -msgstr "기울이기" - -#: src/slic3r/GUI/Tab.cpp:2002 -msgid "Tilt time" -msgstr "기울이기 시간" - -#: src/slic3r/GUI/Tab.cpp:2008 src/slic3r/GUI/Tab.cpp:3223 -msgid "Corrections" -msgstr "수정" - -#: src/slic3r/GUI/Tab.cpp:2074 src/slic3r/GUI/Tab.cpp:2136 -#: src/libslic3r/PrintConfig.cpp:1076 src/libslic3r/PrintConfig.cpp:1086 -#: src/libslic3r/PrintConfig.cpp:1096 src/libslic3r/PrintConfig.cpp:1109 -#: src/libslic3r/PrintConfig.cpp:1120 src/libslic3r/PrintConfig.cpp:1131 -#: src/libslic3r/PrintConfig.cpp:1142 -msgid "Machine limits" -msgstr "머신 한계설정" - -#: src/slic3r/GUI/Tab.cpp:2088 -msgid "Values in this column are for Full Power mode" -msgstr "이 열의 값은 최대 전력 모드입니다" - -#: src/slic3r/GUI/Tab.cpp:2089 -msgid "Full Power" -msgstr "최대 파워" - -#: src/slic3r/GUI/Tab.cpp:2094 -msgid "Values in this column are for Silent mode" -msgstr "이 열의 값은 무음 모드 용입니다" - -#: src/slic3r/GUI/Tab.cpp:2095 -msgid "Silent" -msgstr "무음" - -#: src/slic3r/GUI/Tab.cpp:2103 -msgid "Maximum feedrates" -msgstr "최대 이송속도" - -#: src/slic3r/GUI/Tab.cpp:2108 -msgid "Maximum accelerations" -msgstr "최고 가속도" - -#: src/slic3r/GUI/Tab.cpp:2115 -msgid "Jerk limits" -msgstr "저크(Jerk)값 한계" - -#: src/slic3r/GUI/Tab.cpp:2120 -msgid "Minimum feedrates" -msgstr "최대 이송속도" - -#: src/slic3r/GUI/Tab.cpp:2158 src/slic3r/GUI/Tab.cpp:2166 -msgid "Single extruder MM setup" -msgstr "싱글 익스트루더 MM 설정" - -#: src/slic3r/GUI/Tab.cpp:2167 -msgid "Single extruder multimaterial parameters" -msgstr "싱글 익스트루더 멀티메터리알 파라미터" - -#: src/slic3r/GUI/Tab.cpp:2181 src/libslic3r/GCode/PreviewData.cpp:475 -#, c-format -msgid "Extruder %d" -msgstr "익스트루더 %d" - -#: src/slic3r/GUI/Tab.cpp:2188 -msgid "Layer height limits" -msgstr "레이어 높이 한계치" - -#: src/slic3r/GUI/Tab.cpp:2193 -msgid "Position (for multi-extruder printers)" -msgstr "위치 (멀티 익스트루더 프린터 포함)" - -#: src/slic3r/GUI/Tab.cpp:2196 -msgid "Retraction" -msgstr "리트렉션" - -#: src/slic3r/GUI/Tab.cpp:2199 -msgid "Only lift Z" -msgstr "Z축만 올림" - -#: src/slic3r/GUI/Tab.cpp:2212 -msgid "" -"Retraction when tool is disabled (advanced settings for multi-extruder " -"setups)" -msgstr "도구 비활성화시 리트렉션 (멀티 익스트루더 고급 설정)" - -#: src/slic3r/GUI/Tab.cpp:2216 -msgid "Preview" -msgstr "프리뷰" - -#: src/slic3r/GUI/Tab.cpp:2352 -msgid "" -"The Wipe option is not available when using the Firmware Retraction mode.\n" -"\n" -"Shall I disable it in order to enable Firmware Retraction?" -msgstr "" -"펌웨어 리트렉션 모드를 사용할 때는 Wipe 옵션을 사용할 수 없습니다.\n" -"\n" -"펌웨어 리트렉션 하려면 비활성화해야합니까?" - -#: src/slic3r/GUI/Tab.cpp:2354 -msgid "Firmware Retraction" -msgstr "펌웨어 레트렉션" - -#: src/slic3r/GUI/Tab.cpp:2681 -#, c-format -msgid "Default preset (%s)" -msgstr "시스템 기본값 (%s)" - -#: src/slic3r/GUI/Tab.cpp:2682 -#, c-format -msgid "Preset (%s)" -msgstr "프리셋 ( %s)" - -#: src/slic3r/GUI/Tab.cpp:2699 -msgid "has the following unsaved changes:" -msgstr "저장되지 않은 수정사항:" - -#: src/slic3r/GUI/Tab.cpp:2702 -msgid "is not compatible with printer" -msgstr "프린터와 호완 되지 않습니다" - -#: src/slic3r/GUI/Tab.cpp:2703 -msgid "is not compatible with print profile" -msgstr "인쇄 프로필과 호환 되지 않음" - -#: src/slic3r/GUI/Tab.cpp:2705 -msgid "and it has the following unsaved changes:" -msgstr "저장되지 않은 변경점은 다음과 같습니다:" - -#: src/slic3r/GUI/Tab.cpp:2708 -msgid "Discard changes and continue anyway?" -msgstr "수정된 사항을 취소하고 계속하겠습니까?" - -#: src/slic3r/GUI/Tab.cpp:2709 -msgid "Unsaved Changes" -msgstr "미 저장된 변경점" - -#: src/slic3r/GUI/Tab.cpp:2721 -msgid "Please check your object list before preset changing." -msgstr "사전 설정을 변경 하기 전에 개체 목록을 확인 하십시오." - -#: src/slic3r/GUI/Tab.cpp:2801 -msgid "Copy" -msgstr "복사" - -#: src/slic3r/GUI/Tab.cpp:2823 -msgid "The supplied name is empty. It can't be saved." -msgstr "파일 이름이 비어 있습니다. 저장할 수 없습니다." - -#: src/slic3r/GUI/Tab.cpp:2828 -msgid "Cannot overwrite a system profile." -msgstr "시스템 프로파일을 겹쳐 쓸 수 없습니다." - -#: src/slic3r/GUI/Tab.cpp:2832 -msgid "Cannot overwrite an external profile." -msgstr "외부 프로필을 덮어 쓸 수 없습니다." - -#: src/slic3r/GUI/Tab.cpp:2858 -msgid "remove" -msgstr "제거(remove)" - -#: src/slic3r/GUI/Tab.cpp:2858 -msgid "delete" -msgstr "지우기(delete)" - -#: src/slic3r/GUI/Tab.cpp:2859 -msgid "Are you sure you want to " -msgstr "정말로 다음과 같이 하겠습니까? " - -#: src/slic3r/GUI/Tab.cpp:2859 -msgid " the selected preset?" -msgstr " 를(가) 선택된 설정을 실행 할까요?" - -#: src/slic3r/GUI/Tab.cpp:2860 -msgid "Remove" -msgstr "제거(remove)" - -#: src/slic3r/GUI/Tab.cpp:2861 -msgid " Preset" -msgstr " 기본 설정" - -#: src/slic3r/GUI/Tab.cpp:2989 -msgid "" -"LOCKED LOCK;indicates that the settings are the same as the system values " -"for the current option group" -msgstr "자물쇠 잠금 : 설정이 현재 옵션 그룹의 시스템 값과 동일 함을 나타냅니다" - -#: src/slic3r/GUI/Tab.cpp:2992 -msgid "" -"UNLOCKED LOCK;indicates that some settings were changed and are not equal to " -"the system values for the current option group.\n" -"Click the UNLOCKED LOCK icon to reset all settings for current option group " -"to the system values." -msgstr "" -"잠금 풀림 : 일부 설정이 변경되었으며 현재 옵션 그룹의 시스템 값과 같지 않음" -"을 나타냅니다.\n" -"현재 옵션 그룹의 모든 설정을 시스템 값으로 재설정하려면 자물쇠 잠금 아이콘을 " -"클릭하십시오." - -#: src/slic3r/GUI/Tab.cpp:2998 -msgid "" -"WHITE BULLET;for the left button: \tindicates a non-system preset,\n" -"for the right button: \tindicates that the settings hasn't been modified." -msgstr "" -"흰색 총알; 왼쪽 버튼 : 시스템이 아닌 사전 설정을 나타내며,\n" -"오른쪽 버튼의 경우 : 설정이 수정되지 않았 음을 나타냅니다." - -#: src/slic3r/GUI/Tab.cpp:3002 -msgid "" -"BACK ARROW;indicates that the settings were changed and are not equal to the " -"last saved preset for the current option group.\n" -"Click the BACK ARROW icon to reset all settings for the current option group " -"to the last saved preset." -msgstr "" -"잠금 풀림;일부 설정이 변경되었으며 현재 옵션 그룹의 시스템 값과 같지 않음을 " -"나타냅니다.\n" -"현재 옵션 그룹의 모든 설정을 시스템 값으로 재설정하려면 자물쇠 잠금 아이콘을 " -"클릭하십시오." - -#: src/slic3r/GUI/Tab.cpp:3028 -msgid "" -"LOCKED LOCK icon indicates that the settings are the same as the system " -"values for the current option group" -msgstr "" -"자물쇠 잠금 아이코 설정이 현재 옵션 그룹의 시스템 값과 동일 함을 나타냅니다" - -#: src/slic3r/GUI/Tab.cpp:3030 -msgid "" -"UNLOCKED LOCK icon indicates that some settings were changed and are not " -"equal to the system values for the current option group.\n" -"Click to reset all settings for current option group to the system values." -msgstr "" -"잠금 풀림 아이코 일부 설정이 변경되었으며 현재 옵션 그룹의 시스템 값과 같지 " -"않음을 나타냅니다.\n" -"현재 옵션 그룹의 모든 설정을 시스템 값으로 재설정하려면 자물쇠 잠금 아이콘을 " -"클릭하십시오." - -#: src/slic3r/GUI/Tab.cpp:3033 -msgid "WHITE BULLET icon indicates a non system preset." -msgstr "흰색 글머리 아이콘은 시스템 사전 설정이 아닌 것을 나타냅니다." - -#: src/slic3r/GUI/Tab.cpp:3036 -msgid "" -"WHITE BULLET icon indicates that the settings are the same as in the last " -"saved preset for the current option group." -msgstr "" -"흰색 글머리 기호 아이콘은 설정이 현재 옵션 그룹에 대해 마지막으로 저장 된 사" -"전 설정과 동일 하다는 것을 나타냅니다." - -#: src/slic3r/GUI/Tab.cpp:3038 -msgid "" -"BACK ARROW icon indicates that the settings were changed and are not equal " -"to the last saved preset for the current option group.\n" -"Click to reset all settings for the current option group to the last saved " -"preset." -msgstr "" -"백화살표 아이콘 설정을 변경 하 고 현재 옵션 그룹에 대 한 마지막 저장 된 프리" -"셋을 동일 하지 않습니다 나타냅니다.\n" -"마지막 현재 옵션 그룹에 대 한 모든 설정 다시 설정을 클릭 하 여 사전 설정을 저" -"장." - -#: src/slic3r/GUI/Tab.cpp:3044 -msgid "" -"LOCKED LOCK icon indicates that the value is the same as the system value." -msgstr "잠긴 자물쇠 아이콘 값 같은 시스템 값 임을 나타냅니다." - -#: src/slic3r/GUI/Tab.cpp:3045 -msgid "" -"UNLOCKED LOCK icon indicates that the value was changed and is not equal to " -"the system value.\n" -"Click to reset current value to the system value." -msgstr "" -"잠금 해제 자물쇠 아이콘 값 변경 된 시스템 값은 나타냅니다.\n" -"시스템 값을 현재 값으로 설정 하려면 클릭 합니다." - -#: src/slic3r/GUI/Tab.cpp:3051 -msgid "" -"WHITE BULLET icon indicates that the value is the same as in the last saved " -"preset." -msgstr "" -"흰색 글머리 기호 아이콘은 마지막으로 저장 한 사전 설정과 동일한 값을 나타냅니" -"다." - -#: src/slic3r/GUI/Tab.cpp:3052 -msgid "" -"BACK ARROW icon indicates that the value was changed and is not equal to the " -"last saved preset.\n" -"Click to reset current value to the last saved preset." -msgstr "" -"잠금 해제 자물쇠 아이콘 값 변경 된 시스템 값은 나타냅니다.\n" -"시스템 값을 현재 값으로 설정 하려면 클릭 합니다." - -#: src/slic3r/GUI/Tab.cpp:3152 -msgid " as:" -msgstr " as:" - -#: src/slic3r/GUI/Tab.cpp:3196 -msgid "the following postfix are not allowed:" -msgstr "다음 접미사는 허용되지 않습니다:" - -#: src/slic3r/GUI/Tab.cpp:3200 -msgid "The supplied name is not available." -msgstr "The supplied name is not available." - -#: src/slic3r/GUI/Tab.cpp:3213 -msgid "Material" -msgstr "재료" - -#: src/slic3r/GUI/Tab.cpp:3215 src/slic3r/GUI/Tab.cpp:3305 -msgid "Layers" -msgstr "레이어" - -#: src/slic3r/GUI/Tab.cpp:3219 -msgid "Exposure" -msgstr "노출" - -#: src/slic3r/GUI/Tab.cpp:3313 -msgid "Support head" -msgstr "서포트 헤드" - -#: src/slic3r/GUI/Tab.cpp:3318 -msgid "Support pillar" -msgstr "서포트 기둥" - -#: src/slic3r/GUI/Tab.cpp:3328 -msgid "Connection of the support sticks and junctions" -msgstr "서포트 기둥 및 접합부 연결" - -#: src/slic3r/GUI/Tab.cpp:3333 -msgid "Automatic generation" -msgstr "자동 생성" - -#: src/slic3r/GUI/Tab.cpp:3395 -msgid "Head penetration should not be greater than the head width." -msgstr "헤드 관통은 헤드 폭 보다 크지 않아야 합니다." - -#: src/slic3r/GUI/Tab.cpp:3396 -msgid "Invalid Head penetration" -msgstr "잘못된 헤드 관통" - -#: src/slic3r/GUI/Tab.cpp:3408 -msgid "Pinhead diameter should be smaller than the pillar diameter." -msgstr "핀헤드 지름은 기둥 지름 보다 작아야 합니다." - -#: src/slic3r/GUI/Tab.cpp:3409 -msgid "Invalid pinhead diameter" -msgstr "잘못된 핀 헤드 지름" - -#: src/slic3r/GUI/Tab.hpp:307 src/slic3r/GUI/Tab.hpp:395 -msgid "Print Settings" -msgstr "출력 설정" - -#: src/slic3r/GUI/Tab.hpp:325 -msgid "Filament Settings" -msgstr "필라멘트 설정" - -#: src/slic3r/GUI/Tab.hpp:358 -msgid "Printer Settings" -msgstr "프린터 설정" - -#: src/slic3r/GUI/Tab.hpp:381 -msgid "Material Settings" -msgstr "재질 설정" - -#: src/slic3r/GUI/Tab.hpp:407 -msgid "Save preset" -msgstr "사전 설정 저장" - -#: src/slic3r/GUI/UpdateDialogs.cpp:29 -msgid "Update available" -msgstr "사용가능한 업데이트" - -#: src/slic3r/GUI/UpdateDialogs.cpp:29 -msgid "New version of Slic3r PE is available" -msgstr "새로운 버전의 Slic3r PE 사용 가능" - -#: src/slic3r/GUI/UpdateDialogs.cpp:36 -msgid "To download, follow the link below." -msgstr "다운로드하려면 아래 링크를 클릭하십시오." - -#: src/slic3r/GUI/UpdateDialogs.cpp:44 -msgid "Current version:" -msgstr "현재 버전:" - -#: src/slic3r/GUI/UpdateDialogs.cpp:46 -msgid "New version:" -msgstr "새로운 버전:" - -#: src/slic3r/GUI/UpdateDialogs.cpp:54 -msgid "Don't notify about new releases any more" -msgstr "새로운 수정사항에 대해 더 이상 알림 안 함" - -#: src/slic3r/GUI/UpdateDialogs.cpp:72 src/slic3r/GUI/UpdateDialogs.cpp:164 -msgid "Configuration update" -msgstr "구성 업데이트" - -#: src/slic3r/GUI/UpdateDialogs.cpp:72 -msgid "Configuration update is available" -msgstr "구성 업데이트를 사용할 수 있음" - -#: src/slic3r/GUI/UpdateDialogs.cpp:75 -msgid "" -"Would you like to install it?\n" -"\n" -"Note that a full configuration snapshot will be created first. It can then " -"be restored at any time should there be a problem with the new version.\n" -"\n" -"Updated configuration bundles:" -msgstr "" -"그것을 설치 하시겠습니까?\n" -"\n" -"전체 구성 스냅 샷이 먼저 만들어집니다. 그런 다음 새 버전에 문제가있을 경우 언" -"제든지 복원 할 수 있습니다.\n" -"\n" -"업데이트 된 구성 번들 :" - -#: src/slic3r/GUI/UpdateDialogs.cpp:111 -msgid "Slic3r incompatibility" -msgstr "Slic3r와 호환 되지 않음" - -#: src/slic3r/GUI/UpdateDialogs.cpp:111 -msgid "Slic3r configuration is incompatible" -msgstr "Slic3r 구성이 호환되지 않습니다" - -#: src/slic3r/GUI/UpdateDialogs.cpp:114 -msgid "" -"This version of Slic3r PE is not compatible with currently installed " -"configuration bundles.\n" -"This probably happened as a result of running an older Slic3r PE after using " -"a newer one.\n" -"\n" -"You may either exit Slic3r and try again with a newer version, or you may re-" -"run the initial configuration. Doing so will create a backup snapshot of the " -"existing configuration before installing files compatible with this Slic3r.\n" -msgstr "" -"이 버전의 Slic3r PE는 현재 설치된 구성 번들과 호환되지 않습니다.\n" -"이것은 아마도 새로운 Slic3r PE를 사용한 후에 실행 된 결과 일 것입니다.\n" -"\n" -"Slic3r을 종료하고 새 버전으로 다시 시도하거나 초기 구성을 다시 실행할 수 있습" -"니다. 이렇게하면이 Slic3r과 호환되는 파일을 설치하기 전에 기존 구성의 백업 스" -"냅 샷을 생성 할 수 있습니다.\n" - -#: src/slic3r/GUI/UpdateDialogs.cpp:123 -#, c-format -msgid "This Slic3r PE version: %s" -msgstr "이 Slic3r PE 버전 : % s" - -#: src/slic3r/GUI/UpdateDialogs.cpp:128 -msgid "Incompatible bundles:" -msgstr "호환되지 않는 번들 :" - -#: src/slic3r/GUI/UpdateDialogs.cpp:144 -msgid "Exit Slic3r" -msgstr "Exit Slic3r" - -#: src/slic3r/GUI/UpdateDialogs.cpp:147 -msgid "Re-configure" -msgstr "재구성" - -#: src/slic3r/GUI/UpdateDialogs.cpp:168 -#, c-format -msgid "" -"Slic3r PE now uses an updated configuration structure.\n" -"\n" -"So called 'System presets' have been introduced, which hold the built-in " -"default settings for various printers. These System presets cannot be " -"modified, instead, users now may create their own presets inheriting " -"settings from one of the System presets.\n" -"An inheriting preset may either inherit a particular value from its parent " -"or override it with a customized value.\n" -"\n" -"Please proceed with the %s that follows to set up the new presets and to " -"choose whether to enable automatic preset updates." -msgstr "" -"Slic3r PE는 이제 업데이트 된 구성 구조를 사용합니다.\n" -"\n" -"'시스템 사전 설정'이 도입되어 다양한 프린터에 기본 제공되는 기본 설정이 유지" -"됩니다. 이러한 시스템 사전 설정은 수정할 수 없으며 대신 사용자는 시스템 사전 " -"설정 중 하나에서 설정을 상속하는 자체 사전 설정을 만들 수 있습니다.\n" -"상속 된 사전 설정은 부모로부터 특정 값을 상속 받거나 사용자 정의 값으로 대체 " -"할 수 있습니다.\n" -"\n" -"새 사전 설정을 설정하고 자동 사전 설정 업데이트를 사용할지 여부를 선택하려면 " -"다음의 % s을 계속 진행하십시오." - -#: src/slic3r/GUI/UpdateDialogs.cpp:184 -msgid "For more information please visit our wiki page:" -msgstr "자세한 정보는 위키 페이지를 참조하십시오 :" - -#: src/slic3r/GUI/WipeTowerDialog.cpp:14 -msgid "Ramming customization" -msgstr "사용자 정의 다지기(Ramming)" - -#: src/slic3r/GUI/WipeTowerDialog.cpp:40 -msgid "" -"Ramming denotes the rapid extrusion just before a tool change in a single-" -"extruder MM printer. Its purpose is to properly shape the end of the " -"unloaded filament so it does not prevent insertion of the new filament and " -"can itself be reinserted later. This phase is important and different " -"materials can require different extrusion speeds to get the good shape. For " -"this reason, the extrusion rates during ramming are adjustable.\n" -"\n" -"This is an expert-level setting, incorrect adjustment will likely lead to " -"jams, extruder wheel grinding into filament etc." -msgstr "" -"래밍은 단일 압출기 MM 프린터에서 공구 교환 직전의 신속한 압출을 나타냅니다. " -"그 목적은 언로드 된 필라멘트의 끝 부분을 적절히 형성하여 새로운 필라멘트의 삽" -"입을 방지하고 나중에 다시 삽입 할 수 있도록하기위한 것입니다. 이 단계는 중요" -"하며 다른 재료는 좋은 모양을 얻기 위해 다른 압출 속도를 요구할 수 있습니다. " -"이러한 이유로, 래밍 중 압출 속도는 조정 가능합니다.\n" -"\n" -"전문가 수준의 설정이므로 잘못된 조정으로 인해 용지 걸림, 압출기 휠이 필라멘" -"트 등에 연삭 될 수 있습니다." - -#: src/slic3r/GUI/WipeTowerDialog.cpp:82 -msgid "Total ramming time" -msgstr "총 래밍 시간" - -#: src/slic3r/GUI/WipeTowerDialog.cpp:84 -msgid "Total rammed volume" -msgstr "총 레미드 양" - -#: src/slic3r/GUI/WipeTowerDialog.cpp:88 -msgid "Ramming line width" -msgstr "래밍 선 너비" - -#: src/slic3r/GUI/WipeTowerDialog.cpp:90 -msgid "Ramming line spacing" -msgstr "래밍 선 간격" - -#: src/slic3r/GUI/WipeTowerDialog.cpp:141 -msgid "Wipe tower - Purging volume adjustment" -msgstr "와이프 타워 - 버려진 필라멘트 조절" - -#: src/slic3r/GUI/WipeTowerDialog.cpp:225 -msgid "" -"Here you can adjust required purging volume (mm³) for any given pair of " -"tools." -msgstr "여기서 주어진 도구 쌍에 필요한 정화 용량 (mm³)을 조정할 수 있습니다." - -#: src/slic3r/GUI/WipeTowerDialog.cpp:226 -msgid "Extruder changed to" -msgstr "익스트루더 번경" - -#: src/slic3r/GUI/WipeTowerDialog.cpp:234 -msgid "unloaded" -msgstr "언로드(unloaded)" - -#: src/slic3r/GUI/WipeTowerDialog.cpp:235 -msgid "loaded" -msgstr "로드(loaded)" - -#: src/slic3r/GUI/WipeTowerDialog.cpp:240 -msgid "Tool #" -msgstr "툴(Tool) #" - -#: src/slic3r/GUI/WipeTowerDialog.cpp:247 -msgid "" -"Total purging volume is calculated by summing two values below, depending on " -"which tools are loaded/unloaded." -msgstr "" -"총 정화 량은 어느 공구가로드 / 언로드되는지에 따라 아래의 두 값을 합산하여 계" -"산됩니다." - -#: src/slic3r/GUI/WipeTowerDialog.cpp:248 -msgid "Volume to purge (mm³) when the filament is being" -msgstr "제거할 필라멘트 양 (mm³)" - -#: src/slic3r/GUI/WipeTowerDialog.cpp:262 -msgid "From" -msgstr "From" - -#: src/slic3r/GUI/WipeTowerDialog.cpp:327 -msgid "" -"Switching to simple settings will discard changes done in the advanced " -"mode!\n" -"\n" -"Do you want to proceed?" -msgstr "" -"단순 설정으로 전환하면 고급 모드에서 수행된 변경 내용이 삭제됨!\n" -"\n" -"계속하시겠습니까?" - -#: src/slic3r/GUI/WipeTowerDialog.cpp:339 -msgid "Show simplified settings" -msgstr "간단한 설정보기" - -#: src/slic3r/GUI/WipeTowerDialog.cpp:339 -msgid "Show advanced settings" -msgstr "고급 설정보기" - -#: src/slic3r/GUI/wxExtensions.cpp:2398 -#, c-format -msgid "Switch to the %s mode" -msgstr "%s 모드로 전환" - -#: src/slic3r/GUI/wxExtensions.cpp:2399 -#, c-format -msgid "Current mode is %s" -msgstr "현재 모드는 %s입니다" - -#: src/slic3r/Utils/Duet.cpp:51 -msgid "Connection to Duet works correctly." -msgstr "듀엣보드에 대한 연결이 올바르게 작동 합니다." - -#: src/slic3r/Utils/Duet.cpp:56 -msgid "Could not connect to Duet" -msgstr "듀엣보드에 연결할 수 없습니다" - -#: src/slic3r/Utils/Duet.cpp:84 src/slic3r/Utils/Duet.cpp:154 -msgid "Unknown error occured" -msgstr "알 수 없는 오류가 발생 했습니다" - -#: src/slic3r/Utils/Duet.cpp:148 -msgid "Wrong password" -msgstr "잘못된 암호" - -#: src/slic3r/Utils/Duet.cpp:151 -msgid "Could not get resources to create a new connection" -msgstr "새 연결을 만들 리소스를 가져올수 없습니다" - -#: src/slic3r/Utils/OctoPrint.cpp:69 -#, c-format -msgid "Mismatched type of print host: %s" -msgstr "일치 하지않는 인쇄 호스트 유형: %s" - -#: src/slic3r/Utils/OctoPrint.cpp:84 -msgid "Connection to OctoPrint works correctly." -msgstr "OctoPrint에 연결하면 올바르게 작동합니다." - -#: src/slic3r/Utils/OctoPrint.cpp:90 -msgid "Could not connect to OctoPrint" -msgstr "OctoPrint에 연결할 수 없습니다" - -#: src/slic3r/Utils/OctoPrint.cpp:90 -msgid "Note: OctoPrint version at least 1.1.0 is required." -msgstr "참고 : OctoPrint 버전 1.1.0 이상이 필요합니다." - -#: src/slic3r/Utils/OctoPrint.cpp:195 -msgid "Connection to Prusa SLA works correctly." -msgstr "Prusa SLA에 대한 연결이 올바르게 작동 합니다." - -#: src/slic3r/Utils/OctoPrint.cpp:200 -msgid "Could not connect to Prusa SLA" -msgstr "Prusa SLA에 연결할 수 없습니다" - -#: src/slic3r/Utils/PresetUpdater.cpp:583 -#, c-format -msgid "requires min. %s and max. %s" -msgstr "최소. %s 와 최대. %s" - -#: src/slic3r/Utils/PresetUpdater.cpp:588 -#, c-format -msgid "requires min. %s" -msgstr "최소 %s가 필요 합니다" - -#: src/slic3r/Utils/PresetUpdater.cpp:590 -#, c-format -msgid "requires max. %s" -msgstr "최대 필요 합니다. %s" - -#: src/slic3r/Utils/FixModelByWin10.cpp:219 -#: src/slic3r/Utils/FixModelByWin10.cpp:359 -msgid "Exporting source model" -msgstr "소스 모델 내보내기" - -#: src/slic3r/Utils/FixModelByWin10.cpp:235 -msgid "Failed loading the input model." -msgstr "입력 모델을 로드하지 못했습니다." - -#: src/slic3r/Utils/FixModelByWin10.cpp:242 -msgid "Repairing model by the Netfabb service" -msgstr "Netfabb 서비스에의 한 모델 복구" - -#: src/slic3r/Utils/FixModelByWin10.cpp:248 -msgid "Mesh repair failed." -msgstr "메ㅅ 복구에 실패 했습니다." - -#: src/slic3r/Utils/FixModelByWin10.cpp:251 -#: src/slic3r/Utils/FixModelByWin10.cpp:378 -msgid "Loading repaired model" -msgstr "복구 된 모델 로드" - -#: src/slic3r/Utils/FixModelByWin10.cpp:263 -#: src/slic3r/Utils/FixModelByWin10.cpp:270 -#: src/slic3r/Utils/FixModelByWin10.cpp:302 -msgid "Saving mesh into the 3MF container failed." -msgstr "3MF 컨테이너에 메쉬를 저장하지 못했습니다." - -#: src/slic3r/Utils/FixModelByWin10.cpp:340 -msgid "Model fixing" -msgstr "모델 고정" - -#: src/slic3r/Utils/FixModelByWin10.cpp:341 -msgid "Exporting model..." -msgstr "소스 모델 내보내기..." - -#: src/slic3r/Utils/FixModelByWin10.cpp:368 -msgid "Export of a temporary 3mf file failed" -msgstr "임시 3mf 파일을 내보내지 못했습니다" - -#: src/slic3r/Utils/FixModelByWin10.cpp:383 -msgid "Import of the repaired 3mf file failed" -msgstr "복구된 3mf 파일을 가져오지 못했습니다" - -#: src/slic3r/Utils/FixModelByWin10.cpp:385 -msgid "Repaired 3MF file does not contain any object" -msgstr "복구된 3MF 파일에 개체가 포함 되어있지 않습니다" - -#: src/slic3r/Utils/FixModelByWin10.cpp:387 -msgid "Repaired 3MF file contains more than one object" -msgstr "복구된 3MF 파일에 둘 이상의 개체가 포함되어 있습니다" - -#: src/slic3r/Utils/FixModelByWin10.cpp:389 -msgid "Repaired 3MF file does not contain any volume" -msgstr "복구 된 3MF 파일에 개체가 포함 되어있지 않습니다" - -#: src/slic3r/Utils/FixModelByWin10.cpp:391 -msgid "Repaired 3MF file contains more than one volume" -msgstr "복구된 3MF 파일에 둘 이상의 개체가 포함되어 있습니다" - -#: src/slic3r/Utils/FixModelByWin10.cpp:400 -msgid "Model repair finished" -msgstr "모델 수리 완료" - -#: src/slic3r/Utils/FixModelByWin10.cpp:406 -msgid "Model repair canceled" -msgstr "모델 복구가 취소 되었습니다" - -#: src/slic3r/Utils/FixModelByWin10.cpp:423 -msgid "Model repaired successfully" -msgstr "모델이 성공적으로 복구 되었습니다" - -#: src/slic3r/Utils/FixModelByWin10.cpp:423 -#: src/slic3r/Utils/FixModelByWin10.cpp:426 -msgid "Model Repair by the Netfabb service" -msgstr "Netfabb 서비스에의 한 모델 복구" - -#: src/slic3r/Utils/FixModelByWin10.cpp:426 -msgid "Model repair failed: \n" -msgstr "모델 복구 실패:\n" - -#: src/libslic3r/Zipper.cpp:35 -msgid "undefined error" -msgstr "정의 되지 않은 오류" - -#: src/libslic3r/Zipper.cpp:37 -msgid "too many files" -msgstr "파일이 너무 많음" - -#: src/libslic3r/Zipper.cpp:39 -msgid "file too large" -msgstr "파일이 너무 큼" - -#: src/libslic3r/Zipper.cpp:41 -msgid "unsupported method" -msgstr "지원 되지 않는 방법" - -#: src/libslic3r/Zipper.cpp:43 -msgid "unsupported encryption" -msgstr "지원 되지 않는 암호화" - -#: src/libslic3r/Zipper.cpp:45 -msgid "unsupported feature" -msgstr "지원 되지 않는 기능" - -#: src/libslic3r/Zipper.cpp:47 -msgid "failed finding central directory" -msgstr "중앙 디렉터리를 찾지 못했습니다." - -#: src/libslic3r/Zipper.cpp:49 -msgid "not a ZIP archive" -msgstr "zIP 아카이브 아님" - -#: src/libslic3r/Zipper.cpp:51 -msgid "invalid header or archive is corrupted" -msgstr "잘못 된 헤더 또는 아카이브가 손상 되었습니다" - -#: src/libslic3r/Zipper.cpp:53 -msgid "unsupported multidisk archive" -msgstr "지원 되지 않는 멀티 디스크 아카이브" - -#: src/libslic3r/Zipper.cpp:55 -msgid "decompression failed or archive is corrupted" -msgstr "압축 풀기 실패 또는 아카이브가 손상 되었습니다" - -#: src/libslic3r/Zipper.cpp:57 -msgid "compression failed" -msgstr "압축 실패" - -#: src/libslic3r/Zipper.cpp:59 -msgid "unexpected decompressed size" -msgstr "예기치 않은 압축 해제 크기" - -#: src/libslic3r/Zipper.cpp:61 -msgid "CRC-32 check failed" -msgstr "CRC-32 확인 실패" - -#: src/libslic3r/Zipper.cpp:63 -msgid "unsupported central directory size" -msgstr "지원 되지 않는 중앙 디렉터리 크기" - -#: src/libslic3r/Zipper.cpp:65 -msgid "allocation failed" -msgstr "할당 실패" - -#: src/libslic3r/Zipper.cpp:67 -msgid "file open failed" -msgstr "파일 열기 실패" - -#: src/libslic3r/Zipper.cpp:69 -msgid "file create failed" -msgstr "파일 만들기 실패" - -#: src/libslic3r/Zipper.cpp:71 -msgid "file write failed" -msgstr "파일 쓰기 실패" - -#: src/libslic3r/Zipper.cpp:73 -msgid "file read failed" -msgstr "파일 읽기 실패" - -#: src/libslic3r/Zipper.cpp:75 -msgid "file close failed" -msgstr "파일 닫기 실패" - -#: src/libslic3r/Zipper.cpp:77 -msgid "file seek failed" -msgstr "파일 검색 실패" - -#: src/libslic3r/Zipper.cpp:79 -msgid "file stat failed" -msgstr "파일 통계 실패" - -#: src/libslic3r/Zipper.cpp:81 -msgid "invalid parameter" -msgstr "잘못 된 매개 변수" - -#: src/libslic3r/Zipper.cpp:83 -msgid "invalid filename" -msgstr "잘못 된 파일 이름" - -#: src/libslic3r/Zipper.cpp:85 -msgid "buffer too small" -msgstr "버퍼가 너무 작음" - -#: src/libslic3r/Zipper.cpp:87 -msgid "internal error" -msgstr "내부 오류" - -#: src/libslic3r/Zipper.cpp:89 -msgid "file not found" -msgstr "파일을 찾을수 없다" - -#: src/libslic3r/Zipper.cpp:91 -msgid "archive is too large" -msgstr "아카이브가 너무 큼" - -#: src/libslic3r/Zipper.cpp:93 -msgid "validation failed" -msgstr "유효성 검사 실패" - -#: src/libslic3r/Zipper.cpp:95 -msgid "write calledback failed" -msgstr "쓰기 다시 실패" - -#: src/libslic3r/Zipper.cpp:105 -msgid "Error with zip archive" -msgstr "zip 아카이브와 오류가 발생 했습니다" - -#: src/libslic3r/SLA/SLASupportTree.cpp:2153 -msgid "Starting" -msgstr "부터" - -#: src/libslic3r/SLA/SLASupportTree.cpp:2154 -msgid "Filtering" -msgstr "필터링" - -#: src/libslic3r/SLA/SLASupportTree.cpp:2155 -msgid "Generate pinheads" -msgstr "핀 헤드 생성" - -#: src/libslic3r/SLA/SLASupportTree.cpp:2156 -msgid "Classification" -msgstr "주소" - -#: src/libslic3r/SLA/SLASupportTree.cpp:2157 -msgid "Routing to ground" -msgstr "면으로의 라우팅" - -#: src/libslic3r/SLA/SLASupportTree.cpp:2158 -msgid "Routing supports to model surface" -msgstr "모델 표면에 대한 라우팅 지원" - -#: src/libslic3r/SLA/SLASupportTree.cpp:2159 -msgid "Cascading pillars" -msgstr "계단식 기둥" - -#: src/libslic3r/SLA/SLASupportTree.cpp:2160 -msgid "Processing small holes" -msgstr "작은 구멍 가공" - -#: src/libslic3r/SLA/SLASupportTree.cpp:2161 -msgid "Done" -msgstr "완료" - -#: src/libslic3r/SLA/SLASupportTree.cpp:2162 -msgid "Abort" -msgstr "중단" - -#: src/libslic3r/Print.cpp:1136 -msgid "All objects are outside of the print volume." -msgstr "모든 개체가 인쇄 볼륨 외부에 있습니다." - -#: src/libslic3r/Print.cpp:1165 -msgid "Some objects are too close; your extruder will collide with them." -msgstr "일부 개체가 너무 가깝습니다. 귀하의 압출기가 그들과 충돌합니다." - -#: src/libslic3r/Print.cpp:1180 -msgid "" -"Some objects are too tall and cannot be printed without extruder collisions." -msgstr "일부 개체는 너무 크고 익스트루더 충돌없이 인쇄 할 수 없습니다." - -#: src/libslic3r/Print.cpp:1190 -msgid "The Spiral Vase option can only be used when printing a single object." -msgstr "" -"나선형 꽃병(Spiral Vase) 옵션은 단일 개체를 인쇄 할 때만 사용할 수 있습니다." - -#: src/libslic3r/Print.cpp:1192 -msgid "" -"The Spiral Vase option can only be used when printing single material " -"objects." -msgstr "" -"나선형 꽃병 옵션(Spiral Vase)은 단일 재료 객체를 인쇄 할 때만 사용할 수 있습" -"니다." - -#: src/libslic3r/Print.cpp:1198 -msgid "" -"All extruders must have the same diameter for single extruder multimaterial " -"printer." -msgstr "" -"모든 익스트루더는 멀티메터리얼 프린터의 싱글 익스트루더에 대해 동일한 직경을 " -"가져야합니다." - -#: src/libslic3r/Print.cpp:1203 -msgid "" -"The Wipe Tower is currently only supported for the Marlin, RepRap/Sprinter " -"and Repetier G-code flavors." -msgstr "" -"와이프 타워는 현재 말린, RepRap/Sprinter 및 리피티어에 대해서만 G-코드지원 됩" -"니다." - -#: src/libslic3r/Print.cpp:1205 -msgid "" -"The Wipe Tower is currently only supported with the relative extruder " -"addressing (use_relative_e_distances=1)." -msgstr "" -"와이프 타워는 현재 상대적 압출기 어드레싱 (use_relative_e_distances = 1)에서" -"만 지원됩니다." - -#: src/libslic3r/Print.cpp:1226 -msgid "" -"The Wipe Tower is only supported for multiple objects if they have equal " -"layer heigths" -msgstr "" -"와이프 타워 (Wipe Tower)는 같은 레이어 높이에 경우 여러 객체에 대해서만 지원" -"됩니다" - -#: src/libslic3r/Print.cpp:1228 -msgid "" -"The Wipe Tower is only supported for multiple objects if they are printed " -"over an equal number of raft layers" -msgstr "" -"와이프 타워는 같은 수의 라프트 레이어 위에 인쇄 된 경우 여러 객체에 대해서만 " -"지원됩니다" - -#: src/libslic3r/Print.cpp:1230 -msgid "" -"The Wipe Tower is only supported for multiple objects if they are printed " -"with the same support_material_contact_distance" -msgstr "" -"와이프 타워는 동일한 support_material_contact_distance로 인쇄 된 경우 여러 객" -"체에 대해서만 지원됩니다" - -#: src/libslic3r/Print.cpp:1232 -msgid "" -"The Wipe Tower is only supported for multiple objects if they are sliced " -"equally." -msgstr "" -"와이프 타워는 똑같이 슬라이스 된 경우 여러 오브젝트에 대해서만 지원됩니다." - -#: src/libslic3r/Print.cpp:1261 -msgid "" -"The Wipe tower is only supported if all objects have the same layer height " -"profile" -msgstr "" -"모든 오브젝트의 레이어 높이 프로필이 동일한 경우에만 와이프 타워가 지원됩니다" - -#: src/libslic3r/Print.cpp:1271 -msgid "The supplied settings will cause an empty print." -msgstr "제공된 설정으로 인해 빈 인쇄가 발생합니다." - -#: src/libslic3r/Print.cpp:1288 -msgid "" -"One or more object were assigned an extruder that the printer does not have." -msgstr "하나 이상의 개체에 프린터에없는 압출기가 지정되었습니다." - -#: src/libslic3r/Print.cpp:1297 -msgid "" -"Printing with multiple extruders of differing nozzle diameters. If support " -"is to be printed with the current extruder (support_material_extruder == 0 " -"or support_material_interface_extruder == 0), all nozzles have to be of the " -"same diameter." -msgstr "" -"노즐 지름이 다른 여러 압출기로 인쇄. 지원이 현재 압출기 " -"(support_material_extruder == 0 또는 support_material_interface_extruder == " -"0)로 인쇄되는 경우 모든 노즐은 동일한 지름이어야합니다." - -#: src/libslic3r/Print.cpp:1305 -msgid "" -"For the Wipe Tower to work with the soluble supports, the support layers " -"need to be synchronized with the object layers." -msgstr "" -"와이프 타워가 가용성 지지체와 함께 작동 하려면 서포트 레이어를 오브젝트 레이" -"어와 동기화 해야 합니다." - -#: src/libslic3r/Print.cpp:1309 -msgid "" -"The Wipe Tower currently supports the non-soluble supports only if they are " -"printed with the current extruder without triggering a tool change. (both " -"support_material_extruder and support_material_interface_extruder need to be " -"set to 0)." -msgstr "" -"와이프 타워는 현재 공구 교체를 트리거하지 않고 현재의 압출기로 인쇄 하는 경우" -"에만 비가용성 서포트를 지원 합니다. (support_material_extruder과 " -"support_material_interface_extruder 모두 0으로 설정 해야 합니다.)" - -#: src/libslic3r/Print.cpp:1316 -msgid "first_layer_height" -msgstr "first_layer_height" - -#: src/libslic3r/Print.cpp:1331 -msgid "First layer height can't be greater than nozzle diameter" -msgstr "첫번째 레이어 높이는 노즐 직경보다 클 수 없습니다" - -#: src/libslic3r/Print.cpp:1335 -msgid "Layer height can't be greater than nozzle diameter" -msgstr "레이어 높이는 노즐 직경보다 클 수 없습니다" - -#: src/libslic3r/SLAPrint.cpp:55 -msgid "Slicing model" -msgstr "슬라이싱 모델" - -#: src/libslic3r/SLAPrint.cpp:56 src/libslic3r/SLAPrint.cpp:801 -msgid "Generating support points" -msgstr "서포트 지점 생성" - -#: src/libslic3r/SLAPrint.cpp:57 -msgid "Generating support tree" -msgstr "서포트 트리 생성" - -#: src/libslic3r/SLAPrint.cpp:58 -msgid "Generating pad" -msgstr "패드 생성" - -#: src/libslic3r/SLAPrint.cpp:59 -msgid "Slicing supports" -msgstr "슬라이싱 서포트즈" - -#: src/libslic3r/SLAPrint.cpp:71 -msgid "Merging slices and calculating statistics" -msgstr "분할 영역 병합 및 통계 계산" - -#: src/libslic3r/SLAPrint.cpp:72 -msgid "Rasterizing layers" -msgstr "레이어 래스터화" - -#: src/libslic3r/SLAPrint.cpp:605 -msgid "" -"Cannot proceed without support points! Add support points or disable support " -"generation." -msgstr "" -"서포트 포인트 없이 진행할 수 없습니다! 서포트 지점을 추가 하거나 서포트 생성" -"을 사용 하지 않도록 설정 합니다." - -#: src/libslic3r/SLAPrint.cpp:617 -msgid "Elevation is too low for object." -msgstr "객체 고도가 너무 낮습니다." - -#: src/libslic3r/SLAPrint.cpp:699 -msgid "Slicing had to be stopped due to an internal error." -msgstr "내부 오류로 인해 슬라이스를 중지 해야 했습니다." - -#: src/libslic3r/SLAPrint.cpp:849 src/libslic3r/SLAPrint.cpp:859 -#: src/libslic3r/SLAPrint.cpp:907 -msgid "Visualizing supports" -msgstr "시각화 지원" - -#: src/libslic3r/SLAPrint.cpp:1449 -msgid "Slicing done" -msgstr "슬라이싱 완료" - -#: src/libslic3r/PrintBase.cpp:65 -msgid "Failed processing of the output_filename_format template." -msgstr "아래 output_filename_format 템플리트의 처리에 실패했습니다." - -#: src/libslic3r/PrintConfig.cpp:42 src/libslic3r/PrintConfig.cpp:43 -msgid "Printer technology" -msgstr "프린터 기술" - -#: src/libslic3r/PrintConfig.cpp:50 -msgid "Bed shape" -msgstr "배드 모양" - -#: src/libslic3r/PrintConfig.cpp:57 -msgid "" -"This setting controls the height (and thus the total number) of the slices/" -"layers. Thinner layers give better accuracy but take more time to print." -msgstr "" -"이 설정은 슬라이스/레이어의 높이(따라서 총 수)를 제어한다. 얇은 층은 더 나은 " -"정확성을 제공하지만 인쇄하는 데는 더 많은 시간이 걸린다." - -#: src/libslic3r/PrintConfig.cpp:64 -msgid "Max print height" -msgstr "최대 프린트 높이" - -#: src/libslic3r/PrintConfig.cpp:65 -msgid "" -"Set this to the maximum height that can be reached by your extruder while " -"printing." -msgstr "인쇄 중에 익스트루더가 도달 할 수있는 최대 높이로 설정하십시오." - -#: src/libslic3r/PrintConfig.cpp:71 -msgid "Slice gap closing radius" -msgstr "슬라이스 간격 닫힘 반경" - -#: src/libslic3r/PrintConfig.cpp:73 -msgid "" -"Cracks smaller than 2x gap closing radius are being filled during the " -"triangle mesh slicing. The gap closing operation may reduce the final print " -"resolution, therefore it is advisable to keep the value reasonably low." -msgstr "" -"삼각형 메쉬 슬라이싱 중에, 2배 간격 폐쇄 반경 보다 작은 균열이 채워집니다. " -"틈 닫기 작업은 최종 인쇄 해상도를 줄일 수 있으므로 값을 합리적으로 낮게 유지 " -"하는 것이 좋습니다." - -#: src/libslic3r/PrintConfig.cpp:81 -msgid "Hostname, IP or URL" -msgstr "호스트 이름(Hostname), IP or URL" - -#: src/libslic3r/PrintConfig.cpp:82 -msgid "" -"Slic3r can upload G-code files to a printer host. This field should contain " -"the hostname, IP address or URL of the printer host instance." -msgstr "" -"Slic3r는 프린터 호스트에 G 코드 파일을 업로드할 수 있습니다. 이 필드는 호스" -"트 이름, IP 주소 또는 프린터 호스트 인스턴스의 URL을 포함 해야 합니다." - -#: src/libslic3r/PrintConfig.cpp:88 -msgid "API Key / Password" -msgstr "API 키/암호" - -#: src/libslic3r/PrintConfig.cpp:89 -msgid "" -"Slic3r can upload G-code files to a printer host. This field should contain " -"the API Key or the password required for authentication." -msgstr "" -"Slic3r는 프린터 호스트에 G 코드 파일을 업로드할 수 있습니다. 이 필드는 API " -"키 또는 인증에 필요한 암호를 포함 해야 합니다." - -#: src/libslic3r/PrintConfig.cpp:111 -msgid "Avoid crossing perimeters" -msgstr "출력된 외측을 피하세요" - -#: src/libslic3r/PrintConfig.cpp:112 -msgid "" -"Optimize travel moves in order to minimize the crossing of perimeters. This " -"is mostly useful with Bowden extruders which suffer from oozing. This " -"feature slows down both the print and the G-code generation." -msgstr "" -"둘레의 교차를 최소화하기 위해 여행 이동을 최적화하십시오. 이것은 보 잉 " -"(Bowling) 압출기가 흘러 나오기 쉬운 경우에 주로 유용합니다. 이 기능을 사용하" -"면 인쇄 및 G 코드 생성 속도가 느려집니다." - -#: src/libslic3r/PrintConfig.cpp:119 src/libslic3r/PrintConfig.cpp:1976 -msgid "Other layers" -msgstr "다른 레이어" - -#: src/libslic3r/PrintConfig.cpp:120 -msgid "" -"Bed temperature for layers after the first one. Set this to zero to disable " -"bed temperature control commands in the output." -msgstr "" -"첫 번째 레이어 이후의 레이어 온도. 이 값을 0으로 설정하면 출력에서 ​​베드 온도 " -"제어 명령을 비활성화합니다." - -#: src/libslic3r/PrintConfig.cpp:122 -msgid "Bed temperature" -msgstr "배드 온도" - -#: src/libslic3r/PrintConfig.cpp:129 -msgid "" -"This custom code is inserted at every layer change, right before the Z move. " -"Note that you can use placeholder variables for all Slic3r settings as well " -"as [layer_num] and [layer_z]." -msgstr "" -"이 사용자 정의 코드는 Z 이동 직전의 모든 레이어 변경에 삽입됩니다. [Slide3r] " -"설정과 [layer_num] 및 [layer_z]에 대한 자리 표시 자 변수를 사용할 수 있습니" -"다." - -#: src/libslic3r/PrintConfig.cpp:139 -msgid "Between objects G-code" -msgstr "객체 간 G 코드" - -#: src/libslic3r/PrintConfig.cpp:140 -msgid "" -"This code is inserted between objects when using sequential printing. By " -"default extruder and bed temperature are reset using non-wait command; " -"however if M104, M109, M140 or M190 are detected in this custom code, Slic3r " -"will not add temperature commands. Note that you can use placeholder " -"variables for all Slic3r settings, so you can put a \"M109 " -"S[first_layer_temperature]\" command wherever you want." -msgstr "" -"이 코드는 순차 인쇄를 사용할 때 객체간에 삽입됩니다. 기본적으로 익스트루더 " -"및 베드 온도는 대기 모드가 아닌 명령을 사용하여 재설정됩니다. 그러나 이 사용" -"자 코드에서 M104, M109, M140 또는 M190이 감지되면 Slic3r은 온도 명령을 추가하" -"지 않습니다. 모든 Slic3r 설정에 자리 표시 변수를 사용할 수 있으므로 원하는 위" -"치에 \"M109 S [first_layer_temperature]\"명령을 넣을 수 있습니다." - -#: src/libslic3r/PrintConfig.cpp:150 -msgid "Number of solid layers to generate on bottom surfaces." -msgstr "바닥면에 생성 할 솔리드 레이어의 수." - -#: src/libslic3r/PrintConfig.cpp:151 -msgid "Bottom solid layers" -msgstr "바닥 단일 레이어" - -#: src/libslic3r/PrintConfig.cpp:156 -msgid "Bridge" -msgstr "브리지" - -#: src/libslic3r/PrintConfig.cpp:157 -msgid "" -"This is the acceleration your printer will use for bridges. Set zero to " -"disable acceleration control for bridges." -msgstr "" -"이것은 프린터가 브릿지에 사용할 가속도입니다. 브리지의 가속 제어를 사용하지 " -"않으려면 0으로 설정하십시오." - -#: src/libslic3r/PrintConfig.cpp:159 src/libslic3r/PrintConfig.cpp:302 -#: src/libslic3r/PrintConfig.cpp:814 src/libslic3r/PrintConfig.cpp:935 -#: src/libslic3r/PrintConfig.cpp:1088 src/libslic3r/PrintConfig.cpp:1133 -#: src/libslic3r/PrintConfig.cpp:1144 src/libslic3r/PrintConfig.cpp:1333 -msgid "mm/s²" -msgstr "mm/s ²" - -#: src/libslic3r/PrintConfig.cpp:165 -msgid "Bridging angle" -msgstr "브릿지 각도" - -#: src/libslic3r/PrintConfig.cpp:167 -msgid "" -"Bridging angle override. If left to zero, the bridging angle will be " -"calculated automatically. Otherwise the provided angle will be used for all " -"bridges. Use 180° for zero angle." -msgstr "" -"브리징 각도 오버라이드(override)값이. 왼쪽으로 0 일 경우 브리징 각도가 자동으" -"로 계산됩니다. 그렇지 않으면 제공된 각도가 모든 브리지에 사용됩니다. 각도 제" -"로는 180 °를 사용하십시오." - -#: src/libslic3r/PrintConfig.cpp:170 src/libslic3r/PrintConfig.cpp:732 -#: src/libslic3r/PrintConfig.cpp:1569 src/libslic3r/PrintConfig.cpp:1579 -#: src/libslic3r/PrintConfig.cpp:1807 src/libslic3r/PrintConfig.cpp:1961 -#: src/libslic3r/PrintConfig.cpp:2459 -msgid "°" -msgstr "°" - -#: src/libslic3r/PrintConfig.cpp:176 -msgid "Bridges fan speed" -msgstr "브릿지 팬 속도" - -#: src/libslic3r/PrintConfig.cpp:177 -msgid "This fan speed is enforced during all bridges and overhangs." -msgstr "이 팬 속도는 모든 브릿지 및 오버행 중에 적용됩니다." - -#: src/libslic3r/PrintConfig.cpp:178 src/libslic3r/PrintConfig.cpp:744 -#: src/libslic3r/PrintConfig.cpp:1153 src/libslic3r/PrintConfig.cpp:1216 -#: src/libslic3r/PrintConfig.cpp:1461 src/libslic3r/PrintConfig.cpp:2258 -#: src/libslic3r/PrintConfig.cpp:2498 -msgid "%" -msgstr "%" - -#: src/libslic3r/PrintConfig.cpp:185 -msgid "Bridge flow ratio" -msgstr "브릿지 유량(flow)값" - -#: src/libslic3r/PrintConfig.cpp:187 -msgid "" -"This factor affects the amount of plastic for bridging. You can decrease it " -"slightly to pull the extrudates and prevent sagging, although default " -"settings are usually good and you should experiment with cooling (use a fan) " -"before tweaking this." -msgstr "" -"이 요인은 브리징을위한 플라스틱의 양에 영향을 미칩니다. 압출 성형물을 잡아 당" -"겨 처짐을 방지하기 위해 약간 줄일 수 있지만 기본 설정은 일반적으로 좋지만이 " -"문제를 해결하기 전에 냉각 (팬 사용)을 시도해야합니다." - -#: src/libslic3r/PrintConfig.cpp:197 -msgid "Bridges" -msgstr "브릿지(Bridges)" - -#: src/libslic3r/PrintConfig.cpp:199 -msgid "Speed for printing bridges." -msgstr "브릿지 인쇄 속도." - -#: src/libslic3r/PrintConfig.cpp:200 src/libslic3r/PrintConfig.cpp:576 -#: src/libslic3r/PrintConfig.cpp:584 src/libslic3r/PrintConfig.cpp:593 -#: src/libslic3r/PrintConfig.cpp:601 src/libslic3r/PrintConfig.cpp:628 -#: src/libslic3r/PrintConfig.cpp:647 src/libslic3r/PrintConfig.cpp:873 -#: src/libslic3r/PrintConfig.cpp:1000 src/libslic3r/PrintConfig.cpp:1078 -#: src/libslic3r/PrintConfig.cpp:1098 src/libslic3r/PrintConfig.cpp:1111 -#: src/libslic3r/PrintConfig.cpp:1122 src/libslic3r/PrintConfig.cpp:1175 -#: src/libslic3r/PrintConfig.cpp:1234 src/libslic3r/PrintConfig.cpp:1362 -#: src/libslic3r/PrintConfig.cpp:1536 src/libslic3r/PrintConfig.cpp:1545 -#: src/libslic3r/PrintConfig.cpp:1940 src/libslic3r/PrintConfig.cpp:2051 -msgid "mm/s" -msgstr "mm/s" - -#: src/libslic3r/PrintConfig.cpp:207 -msgid "Brim width" -msgstr "브림 폭" - -#: src/libslic3r/PrintConfig.cpp:208 -msgid "" -"Horizontal width of the brim that will be printed around each object on the " -"first layer." -msgstr "첫 번째 레이어의 각 객체 주위에 인쇄 될 가장자리의 가로 폭입니다." - -#: src/libslic3r/PrintConfig.cpp:215 -msgid "Clip multi-part objects" -msgstr "여러 파트 오브젝트 클립" - -#: src/libslic3r/PrintConfig.cpp:216 -msgid "" -"When printing multi-material objects, this settings will make slic3r to clip " -"the overlapping object parts one by the other (2nd part will be clipped by " -"the 1st, 3rd part will be clipped by the 1st and 2nd etc)." -msgstr "" -"멀티 메터리얼(multi-material) 개체를 인쇄 할 때이 설정을 사용하면 겹치는 개" -"체 파트를 서로 겹쳐서 잘라낼 수 있습니다 (두 번째 부분은 첫 번째 부분에서 클" -"리핑되며 세 번째 부분은 첫 번째 및 두 번째 부분에서 잘립니다)." - -#: src/libslic3r/PrintConfig.cpp:223 -msgid "Colorprint height" -msgstr "컬러 인쇄 높이" - -#: src/libslic3r/PrintConfig.cpp:224 -msgid "Heights at which a filament change is to occur. " -msgstr "필라멘트 체인지가 발생 하는 높이. " - -#: src/libslic3r/PrintConfig.cpp:234 -msgid "Compatible printers condition" -msgstr "호환 가능한 프린터 조건" - -#: src/libslic3r/PrintConfig.cpp:235 -msgid "" -"A boolean expression using the configuration values of an active printer " -"profile. If this expression evaluates to true, this profile is considered " -"compatible with the active printer profile." -msgstr "" -"활성 프린터 프로파일의 구성 값을 사용하는 부울 표현식. 이 표현식이 true로 평" -"가되면이 프로필은 활성 프린터 프로필과 호환되는 것으로 간주됩니다." - -#: src/libslic3r/PrintConfig.cpp:249 -msgid "Compatible print profiles condition" -msgstr "호환 되는 인쇄 프로 파일 조건" - -#: src/libslic3r/PrintConfig.cpp:250 -msgid "" -"A boolean expression using the configuration values of an active print " -"profile. If this expression evaluates to true, this profile is considered " -"compatible with the active print profile." -msgstr "" -"활성 인쇄 프로 파일의 구성 값을 사용하는 부울식입니다. 이 식이 true로 평가 되" -"면, 이 프로필이 활성 인쇄 프로필과 호환 되는 것으로 간주 됩니다." - -#: src/libslic3r/PrintConfig.cpp:267 -msgid "Complete individual objects" -msgstr "개별 개체 완성" - -#: src/libslic3r/PrintConfig.cpp:268 -msgid "" -"When printing multiple objects or copies, this feature will complete each " -"object before moving onto next one (and starting it from its bottom layer). " -"This feature is useful to avoid the risk of ruined prints. Slic3r should " -"warn and prevent you from extruder collisions, but beware." -msgstr "" -"여러 객체 또는 사본을 인쇄 할 때이 객체는 다음 객체로 이동하기 전에 각 객체" -"를 완성합니다 (맨 아래 레이어에서 시작). 이 기능은 인쇄물이 망가지는 위험을 " -"피할 때 유용합니다. Slic3r은 압출기 충돌을 경고하고 예방해야하지만 조심하십시" -"오." - -#: src/libslic3r/PrintConfig.cpp:276 -msgid "Enable auto cooling" -msgstr "자동 냉각 사용" - -#: src/libslic3r/PrintConfig.cpp:277 -msgid "" -"This flag enables the automatic cooling logic that adjusts print speed and " -"fan speed according to layer printing time." -msgstr "" -"이 플래그는 레이어 인쇄 시간에 따라 인쇄 속도와 팬 속도를 조정하는 자동 냉각 " -"논리를 활성화합니다." - -#: src/libslic3r/PrintConfig.cpp:282 -msgid "Cooling tube position" -msgstr "냉각 튜브 위치" - -#: src/libslic3r/PrintConfig.cpp:283 -msgid "Distance of the center-point of the cooling tube from the extruder tip " -msgstr "압출기 팁에서 냉각 튜브의 중심점까지의 거리 " - -#: src/libslic3r/PrintConfig.cpp:290 -msgid "Cooling tube length" -msgstr "냉각 튜브 길이" - -#: src/libslic3r/PrintConfig.cpp:291 -msgid "Length of the cooling tube to limit space for cooling moves inside it " -msgstr "내부의 냉각 이동을 위해 공간을 제한하는 냉각 튜브의 길이 " - -#: src/libslic3r/PrintConfig.cpp:299 -msgid "" -"This is the acceleration your printer will be reset to after the role-" -"specific acceleration values are used (perimeter/infill). Set zero to " -"prevent resetting acceleration at all." -msgstr "" -"역할 별 가속도 값이 사용 된 후에 프린터가 재설정되는 속도입니다 (둘레 / 충" -"전). 가속을 전혀 재설정하지 않으려면 0으로 설정하십시오." - -#: src/libslic3r/PrintConfig.cpp:308 -msgid "Default filament profile" -msgstr "기본 필라멘트 프로파일" - -#: src/libslic3r/PrintConfig.cpp:309 -msgid "" -"Default filament profile associated with the current printer profile. On " -"selection of the current printer profile, this filament profile will be " -"activated." -msgstr "" -"현재 프린터 프로파일과 연관된 기본 필라멘트 프로파일. 현재 프린터 프로파일을 " -"선택하면 이 필라멘트 프로파일이 활성화됩니다." - -#: src/libslic3r/PrintConfig.cpp:315 -msgid "Default print profile" -msgstr "기본 인쇄 프로파일" - -#: src/libslic3r/PrintConfig.cpp:316 src/libslic3r/PrintConfig.cpp:2337 -#: src/libslic3r/PrintConfig.cpp:2348 -msgid "" -"Default print profile associated with the current printer profile. On " -"selection of the current printer profile, this print profile will be " -"activated." -msgstr "" -"현재 프린터 프로파일과 연관된 기본 인쇄 프로파일. 현재 프린터 프로파일을 선택" -"하면이 인쇄 프로파일이 활성화됩니다." - -#: src/libslic3r/PrintConfig.cpp:322 -msgid "Disable fan for the first" -msgstr "첫 번째 팬 사용 중지" - -#: src/libslic3r/PrintConfig.cpp:323 -msgid "" -"You can set this to a positive value to disable fan at all during the first " -"layers, so that it does not make adhesion worse." -msgstr "" -"이 값을 양수 값으로 설정하면 첫 번째 레이어에서 팬을 사용하지 않도록 설정하" -"여 접착력을 악화시키지 않습니다." - -#: src/libslic3r/PrintConfig.cpp:325 src/libslic3r/PrintConfig.cpp:945 -#: src/libslic3r/PrintConfig.cpp:1434 src/libslic3r/PrintConfig.cpp:1619 -#: src/libslic3r/PrintConfig.cpp:1680 src/libslic3r/PrintConfig.cpp:1843 -#: src/libslic3r/PrintConfig.cpp:1888 -msgid "layers" -msgstr "레이어" - -#: src/libslic3r/PrintConfig.cpp:332 -msgid "Don't support bridges" -msgstr "서포트와 브릿지를 사용하지 마세요" - -#: src/libslic3r/PrintConfig.cpp:334 -msgid "" -"Experimental option for preventing support material from being generated " -"under bridged areas." -msgstr "" -"브릿지 영역 아래에 서포팅 재료가 생성되는 것을 방지하기위한 실험적 옵션." - -#: src/libslic3r/PrintConfig.cpp:340 -msgid "Distance between copies" -msgstr "복사본 간 거리" - -#: src/libslic3r/PrintConfig.cpp:341 -msgid "Distance used for the auto-arrange feature of the plater." -msgstr "플래터(plater)의 자동 정렬 기능에 사용되는 거리입니다." - -#: src/libslic3r/PrintConfig.cpp:348 -msgid "Elephant foot compensation" -msgstr "코끼리 발(Elephant foot) 보상값" - -#: src/libslic3r/PrintConfig.cpp:350 -msgid "" -"The first layer will be shrunk in the XY plane by the configured value to " -"compensate for the 1st layer squish aka an Elephant Foot effect." -msgstr "" -"첫 번째 레이어는 구성 요소 값에 따라 XY 평면에서 수축되어 일층 스 퀴시 코끼리" -"발(Elephant Foot) 효과를 보완합니다." - -#: src/libslic3r/PrintConfig.cpp:359 -msgid "" -"This end procedure is inserted at the end of the output file. Note that you " -"can use placeholder variables for all Slic3r settings." -msgstr "" -"이 종료 절차는 출력 파일의 끝에 삽입된다. 모든 Slic3r 설정에 자리 표시자 변수" -"를 사용할 수 있다는 점에 유의하십시오." - -#: src/libslic3r/PrintConfig.cpp:369 -msgid "" -"This end procedure is inserted at the end of the output file, before the " -"printer end gcode. Note that you can use placeholder variables for all " -"Slic3r settings. If you have multiple extruders, the gcode is processed in " -"extruder order." -msgstr "" -"이 종료 절차는 출력 파일의 끝에 프린터 끝 코드 앞에 삽입된다. 모든 Slic3r 설" -"정에 자리 표시자 변수를 사용할 수 있다는 점에 유의하십시오. 여러 개의 압출부" -"가 있는 경우, 그 코드는 압출 순서대로 처리된다." - -#: src/libslic3r/PrintConfig.cpp:379 -msgid "Ensure vertical shell thickness" -msgstr "수직 쉘(shell) 두께 확인" - -#: src/libslic3r/PrintConfig.cpp:381 -msgid "" -"Add solid infill near sloping surfaces to guarantee the vertical shell " -"thickness (top+bottom solid layers)." -msgstr "" -"경사 표면 근처에 솔리드 인필을 추가하여 수직 셸 두께(상단+하단 솔리드 레이어)" -"를 보장하십시오." - -#: src/libslic3r/PrintConfig.cpp:387 -msgid "Top fill pattern" -msgstr "상단 채우기 패턴" - -#: src/libslic3r/PrintConfig.cpp:389 -msgid "" -"Fill pattern for top infill. This only affects the top visible layer, and " -"not its adjacent solid shells." -msgstr "" -"상단 채우기의 채우기 패턴. 이는 인접 한 솔리드 쉘이 아니라 보이는 상위 레이어" -"에만 영향을 줍니다." - -#: src/libslic3r/PrintConfig.cpp:397 src/libslic3r/PrintConfig.cpp:795 -#: src/libslic3r/PrintConfig.cpp:1921 -msgid "Rectilinear" -msgstr "직선면(Rectilinear)" - -#: src/libslic3r/PrintConfig.cpp:398 src/libslic3r/PrintConfig.cpp:801 -msgid "Concentric" -msgstr "동심원(Concentric)" - -#: src/libslic3r/PrintConfig.cpp:399 src/libslic3r/PrintConfig.cpp:805 -msgid "Hilbert Curve" -msgstr "힐버트 곡선(Hilbert Curve)" - -#: src/libslic3r/PrintConfig.cpp:400 src/libslic3r/PrintConfig.cpp:806 -msgid "Archimedean Chords" -msgstr "아르키메데우스(Archimedean Chords)" - -#: src/libslic3r/PrintConfig.cpp:401 src/libslic3r/PrintConfig.cpp:807 -msgid "Octagram Spiral" -msgstr "옥타그램 나선(Octagram Spiral)" - -#: src/libslic3r/PrintConfig.cpp:408 -msgid "Bottom fill pattern" -msgstr "아래쪽 채우기 패턴" - -#: src/libslic3r/PrintConfig.cpp:409 -msgid "" -"Fill pattern for bottom infill. This only affects the bottom external " -"visible layer, and not its adjacent solid shells." -msgstr "" -"하단 채우기의 채우기 패턴. 이는 인접 한 솔리드 쉘이 아니라 아래쪽에 보이는 외" -"부 레이어에만 영향을 줍니다." - -#: src/libslic3r/PrintConfig.cpp:414 src/libslic3r/PrintConfig.cpp:424 -msgid "External perimeters" -msgstr "외측 둘레" - -#: src/libslic3r/PrintConfig.cpp:416 -msgid "" -"Set this to a non-zero value to set a manual extrusion width for external " -"perimeters. If left zero, default extrusion width will be used if set, " -"otherwise 1.125 x nozzle diameter will be used. If expressed as percentage " -"(for example 200%), it will be computed over layer height." -msgstr "" -"외부 경계에 대한 수동 압출 폭을 설정하려면 이 값을 0이 아닌 값으로 설정하십시" -"오. 0인 경우 기본 압출 너비가 사용되며, 그렇지 않으면 1.125 x 노즐 직경이 사" -"용된다. 백분율(예: 200%)로 표현되는 경우, 레이어 높이에 걸쳐 계산된다." - -#: src/libslic3r/PrintConfig.cpp:419 src/libslic3r/PrintConfig.cpp:834 -#: src/libslic3r/PrintConfig.cpp:966 src/libslic3r/PrintConfig.cpp:1353 -#: src/libslic3r/PrintConfig.cpp:1691 src/libslic3r/PrintConfig.cpp:1864 -#: src/libslic3r/PrintConfig.cpp:2022 -msgid "mm or % (leave 0 for default)" -msgstr "mm 또는 %(기본값의 경우 0으로 유지)" - -#: src/libslic3r/PrintConfig.cpp:426 -msgid "" -"This separate setting will affect the speed of external perimeters (the " -"visible ones). If expressed as percentage (for example: 80%) it will be " -"calculated on the perimeters speed setting above. Set to zero for auto." -msgstr "" -"이 별도의 설정은 외부 경계선(시각적 경계선)의 속도에 영향을 미친다. 백분율" -"(예: 80%)로 표현되는 경우 위의 Perimeter 속도 설정에 따라 계산된다. 자동을 위" -"해 0으로 설정한다." - -#: src/libslic3r/PrintConfig.cpp:429 src/libslic3r/PrintConfig.cpp:855 -#: src/libslic3r/PrintConfig.cpp:1650 src/libslic3r/PrintConfig.cpp:1701 -#: src/libslic3r/PrintConfig.cpp:1907 src/libslic3r/PrintConfig.cpp:2034 -msgid "mm/s or %" -msgstr "mm/s 또는 %" - -#: src/libslic3r/PrintConfig.cpp:436 -msgid "External perimeters first" -msgstr "외부 경계선 먼저" - -#: src/libslic3r/PrintConfig.cpp:438 -msgid "" -"Print contour perimeters from the outermost one to the innermost one instead " -"of the default inverse order." -msgstr "" -"기본 역순 대신 가장 바깥쪽부터 가장 안쪽까지 윤곽선을 인쇄하십시오. 타겟 TTS" -"복사하기번역 저장번역 저장번역 수정." - -#: src/libslic3r/PrintConfig.cpp:444 -msgid "Extra perimeters if needed" -msgstr "필요한 경우 추가 둘레" - -#: src/libslic3r/PrintConfig.cpp:446 -#, no-c-format -msgid "" -"Add more perimeters when needed for avoiding gaps in sloping walls. Slic3r " -"keeps adding perimeters, until more than 70% of the loop immediately above " -"is supported." -msgstr "" -"경사 벽의 틈을 피하기 위해 필요한 경우 더 많은 perimeter를 추가하십시오. 위" -"의 루프의 70% 이상이 지지될 때까지 Slic3r는 계속해서 perimeter를 추가한다." - -#: src/libslic3r/PrintConfig.cpp:456 -msgid "" -"The extruder to use (unless more specific extruder settings are specified). " -"This value overrides perimeter and infill extruders, but not the support " -"extruders." -msgstr "" -"사용할 압출부(더 구체적인 압출부 설정이 지정되지 않은 경우) 이 값은 경계 및 " -"압출부를 초과하지만 지원 압출자를 주입하지는 않는다." - -#: src/libslic3r/PrintConfig.cpp:468 -msgid "" -"Set this to the vertical distance between your nozzle tip and (usually) the " -"X carriage rods. In other words, this is the height of the clearance " -"cylinder around your extruder, and it represents the maximum depth the " -"extruder can peek before colliding with other printed objects." -msgstr "" -"이것을 노즐 팁과 (일반적으로) X 캐리지 로드 사이의 수직 거리로 설정하십시오. " -"다시 말하면, 이것은 당신의 압출기 주위의 틈새 실린더의 높이이며, 그것은 다른 " -"인쇄된 물체와 충돌하기 전에 압출기가 엿볼 수 있는 최대 깊이를 나타낸다." - -#: src/libslic3r/PrintConfig.cpp:478 -msgid "Radius" -msgstr "반지름" - -#: src/libslic3r/PrintConfig.cpp:479 -msgid "" -"Set this to the clearance radius around your extruder. If the extruder is " -"not centered, choose the largest value for safety. This setting is used to " -"check for collisions and to display the graphical preview in the plater." -msgstr "" -"이것을 당신의 압출기 주변의 간극 반경으로 설정하시오. 압출부가 중앙에 있지 않" -"으면 안전을 위해 가장 큰 값을 선택하십시오. 이 설정은 충돌 여부를 확인하고 플" -"래터에 그래픽 미리 보기를 표시하기 위해 사용된다." - -#: src/libslic3r/PrintConfig.cpp:489 -msgid "Extruder Color" -msgstr "익스트루더 컬러" - -#: src/libslic3r/PrintConfig.cpp:490 src/libslic3r/PrintConfig.cpp:550 -msgid "This is only used in the Slic3r interface as a visual help." -msgstr "이것은 시각적 도움말로 Slic3r 인터페이스에서만 사용된다." - -#: src/libslic3r/PrintConfig.cpp:496 -msgid "Extruder offset" -msgstr "익스트루더 오프셋" - -#: src/libslic3r/PrintConfig.cpp:497 -msgid "" -"If your firmware doesn't handle the extruder displacement you need the G-" -"code to take it into account. This option lets you specify the displacement " -"of each extruder with respect to the first one. It expects positive " -"coordinates (they will be subtracted from the XY coordinate)." -msgstr "" -"펌웨어가 압출기 위치 변경을 처리하지 못하면 G 코드를 고려해야합니다. 이 옵션" -"을 사용하면 첫 번째 것에 대한 각 압출기의 변위를 지정할 수 있습니다. 양의 좌" -"표가 필요합니다 (XY 좌표에서 뺍니다)." - -#: src/libslic3r/PrintConfig.cpp:506 -msgid "Extrusion axis" -msgstr "압출 축" - -#: src/libslic3r/PrintConfig.cpp:507 -msgid "" -"Use this option to set the axis letter associated to your printer's extruder " -"(usually E but some printers use A)." -msgstr "" -"이 옵션을 사용하여 프린터의 압출기에 연결된 축 문자를 설정합니다 (보통 E이지" -"만 일부 프린터는 A를 사용합니다)." - -#: src/libslic3r/PrintConfig.cpp:512 -msgid "Extrusion multiplier" -msgstr "압출 승수" - -#: src/libslic3r/PrintConfig.cpp:513 -msgid "" -"This factor changes the amount of flow proportionally. You may need to tweak " -"this setting to get nice surface finish and correct single wall widths. " -"Usual values are between 0.9 and 1.1. If you think you need to change this " -"more, check filament diameter and your firmware E steps." -msgstr "" -"이 요소는 비례하여 유량의 양을 변경합니다. 멋진 서페이스 마무리와 단일 벽 너" -"비를 얻기 위해이 설정을 조정해야 할 수도 있습니다. 일반적인 값은 0.9와 1.1 사" -"이입니다. 이 값을 더 변경해야한다고 판단되면 필라멘트 직경과 펌웨어 E 단계를 " -"확인하십시오." - -#: src/libslic3r/PrintConfig.cpp:521 -msgid "Default extrusion width" -msgstr "기본 압출 폭" - -#: src/libslic3r/PrintConfig.cpp:523 -msgid "" -"Set this to a non-zero value to allow a manual extrusion width. If left to " -"zero, Slic3r derives extrusion widths from the nozzle diameter (see the " -"tooltips for perimeter extrusion width, infill extrusion width etc). If " -"expressed as percentage (for example: 230%), it will be computed over layer " -"height." -msgstr "" -"수동 압출 폭을 허용하려면이 값을 0이 아닌 값으로 설정하십시오. 0으로 남겨두" -"면 Slic3r은 노즐 직경에서 압출 폭을 도출합니다 (주변 압출 폭, 성형 압출 폭 등" -"의 툴팁 참조). 백분율로 표시되는 경우 (예 : 230 %) 레이어 높이를 기준으로 계" -"산됩니다." - -#: src/libslic3r/PrintConfig.cpp:527 -msgid "mm or % (leave 0 for auto)" -msgstr "mm 또는 % (자동으로 0을 유지)" - -#: src/libslic3r/PrintConfig.cpp:532 -msgid "Keep fan always on" -msgstr "항상 팬 켜기" - -#: src/libslic3r/PrintConfig.cpp:533 -msgid "" -"If this is enabled, fan will never be disabled and will be kept running at " -"least at its minimum speed. Useful for PLA, harmful for ABS." -msgstr "" -"이 기능을 사용하면 팬이 비활성화되지 않으며 최소한 최소 속도로 계속 회전합니" -"다. PLA에 유용하며 ABS에 해롭다." - -#: src/libslic3r/PrintConfig.cpp:538 -msgid "Enable fan if layer print time is below" -msgstr "레이어 인쇄 시간이 미만인 경우 팬 활성화" - -#: src/libslic3r/PrintConfig.cpp:539 -msgid "" -"If layer print time is estimated below this number of seconds, fan will be " -"enabled and its speed will be calculated by interpolating the minimum and " -"maximum speeds." -msgstr "" -"레이어 인쇄 시간이이 초 미만으로 예상되는 경우 팬이 활성화되고 속도는 최소 " -"및 최대 속도를 보간하여 계산됩니다." - -#: src/libslic3r/PrintConfig.cpp:541 src/libslic3r/PrintConfig.cpp:1637 -msgid "approximate seconds" -msgstr "근사치 초" - -#: src/libslic3r/PrintConfig.cpp:549 -msgid "Color" -msgstr "색상" - -#: src/libslic3r/PrintConfig.cpp:555 -msgid "Filament notes" -msgstr "필라멘트 메모" - -#: src/libslic3r/PrintConfig.cpp:556 -msgid "You can put your notes regarding the filament here." -msgstr "여기에 필라멘트에 관한 메모를 넣을 수 있다." - -#: src/libslic3r/PrintConfig.cpp:564 src/libslic3r/PrintConfig.cpp:1181 -msgid "Max volumetric speed" -msgstr "최대 체적 속도" - -#: src/libslic3r/PrintConfig.cpp:565 -msgid "" -"Maximum volumetric speed allowed for this filament. Limits the maximum " -"volumetric speed of a print to the minimum of print and filament volumetric " -"speed. Set to zero for no limit." -msgstr "" -"이 필라멘트에 허용되는 최대 체적 속도. 인쇄물의 최대 체적 속도를 인쇄 및 필라" -"멘트 체적 속도 최소로 제한한다. 제한 없음에 대해 0으로 설정하십시오." - -#: src/libslic3r/PrintConfig.cpp:568 src/libslic3r/PrintConfig.cpp:1184 -msgid "mm³/s" -msgstr "밀리미터 ³/s" - -#: src/libslic3r/PrintConfig.cpp:574 -msgid "Loading speed" -msgstr "로딩 속도" - -#: src/libslic3r/PrintConfig.cpp:575 -msgid "Speed used for loading the filament on the wipe tower. " -msgstr "와이퍼 탑(wipe)에 필라멘트를 장착하는 데 사용되는 속도. " - -#: src/libslic3r/PrintConfig.cpp:582 -msgid "Loading speed at the start" -msgstr "시작시 로딩 속도" - -#: src/libslic3r/PrintConfig.cpp:583 -msgid "Speed used at the very beginning of loading phase. " -msgstr "로딩 단계의 시작에 사용 되는 속도. " - -#: src/libslic3r/PrintConfig.cpp:590 -msgid "Unloading speed" -msgstr "언로딩 스피드" - -#: src/libslic3r/PrintConfig.cpp:591 -msgid "" -"Speed used for unloading the filament on the wipe tower (does not affect " -"initial part of unloading just after ramming). " -msgstr "" -"와이퍼 타워에서 필라멘트를 언로드하는 데 사용되는 속도(램핑 후 바로 언로딩의 " -"초기 부분에는 영향을 주지 않음). " - -#: src/libslic3r/PrintConfig.cpp:599 -msgid "Unloading speed at the start" -msgstr "시작 시 언로드 속도" - -#: src/libslic3r/PrintConfig.cpp:600 -msgid "" -"Speed used for unloading the tip of the filament immediately after ramming. " -msgstr "속도는 레밍 직후 필라멘트의 팁을 언로딩 하는 데 사용 됩니다. " - -#: src/libslic3r/PrintConfig.cpp:607 -msgid "Delay after unloading" -msgstr "언로드 후 딜레이" - -#: src/libslic3r/PrintConfig.cpp:608 -msgid "" -"Time to wait after the filament is unloaded. May help to get reliable " -"toolchanges with flexible materials that may need more time to shrink to " -"original dimensions. " -msgstr "" -"필라멘트를 내린 후 기다리는 시간. 원래 치수로 축소하는 데 더 많은 시간이 필요" -"할 수있는 유연한 재료로 신뢰할 수있는 공구 교환을 얻을 수 있습니다. " - -#: src/libslic3r/PrintConfig.cpp:617 -msgid "Number of cooling moves" -msgstr "쿨링 이동 숫자" - -#: src/libslic3r/PrintConfig.cpp:618 -msgid "" -"Filament is cooled by being moved back and forth in the cooling tubes. " -"Specify desired number of these moves " -msgstr "" -"필라멘트는 냉각 튜브에서 앞뒤로 움직여 냉각됩니다. 원하는 이동 숫자 지정 " - -#: src/libslic3r/PrintConfig.cpp:626 -msgid "Speed of the first cooling move" -msgstr "첫 번째 냉각 이동 속도" - -#: src/libslic3r/PrintConfig.cpp:627 -msgid "Cooling moves are gradually accelerating beginning at this speed. " -msgstr "냉각 속도가 서서히 빨라지고 있습니다. " - -#: src/libslic3r/PrintConfig.cpp:634 -msgid "Minimal purge on wipe tower" -msgstr "와이프(wipe) 탑의 최소 퍼지" - -#: src/libslic3r/PrintConfig.cpp:635 -msgid "" -"After a tool change, the exact position of the newly loaded filament inside " -"the nozzle may not be known, and the filament pressure is likely not yet " -"stable. Before purging the print head into an infill or a sacrificial " -"object, Slic3r will always prime this amount of material into the wipe tower " -"to produce successive infill or sacrificial object extrusions reliably." -msgstr "" -"공구가 변경 된 후 노즐 내부에 새로 로드 된 필라멘트의 정확한 위치를 알 수 없" -"으며, 필라멘트 압력이 아직 안정적이지 않을 수 있습니다. 프린트 헤드를 인필 또" -"는 희생(sacrificial) 객체로 소거 하기 전에 Slic3r는 항상이 양의 재료를 와이" -"프 탑에 넣어 연속적인 채우기 또는 희생(sacrificial) 객체 돌출을 안정적으로 생" -"성 합니다." - -#: src/libslic3r/PrintConfig.cpp:639 -msgid "mm³" -msgstr "mm ³" - -#: src/libslic3r/PrintConfig.cpp:645 -msgid "Speed of the last cooling move" -msgstr "마지막 냉각 이동 속도" - -#: src/libslic3r/PrintConfig.cpp:646 -msgid "Cooling moves are gradually accelerating towards this speed. " -msgstr "냉각은 이 속도쪽으로 점차 가속화되고 있습니다. " - -#: src/libslic3r/PrintConfig.cpp:653 -msgid "Filament load time" -msgstr "필라멘트 로드 시간" - -#: src/libslic3r/PrintConfig.cpp:654 -msgid "" -"Time for the printer firmware (or the Multi Material Unit 2.0) to load a new " -"filament during a tool change (when executing the T code). This time is " -"added to the total print time by the G-code time estimator." -msgstr "" -"프린터 펌웨어 (또는 MMU 2.0)가 공구를 변경하는 동안(T 코드를 실행할 때) 새필" -"라멘트를 로드하는 시간입니다. 이 시간은 G 코드 시간 추정기에 의해 총 인쇄 시" -"간에 추가 됩니다." - -#: src/libslic3r/PrintConfig.cpp:661 -msgid "Ramming parameters" -msgstr "래밍 파라미터" - -#: src/libslic3r/PrintConfig.cpp:662 -msgid "" -"This string is edited by RammingDialog and contains ramming specific " -"parameters " -msgstr "" -"이 문자열은 RammingDialog에 의해 편집되고 램밍 특정 매개 변수를 포함합니다 " - -#: src/libslic3r/PrintConfig.cpp:668 -msgid "Filament unload time" -msgstr "필라멘트 언로드 시간" - -#: src/libslic3r/PrintConfig.cpp:669 -msgid "" -"Time for the printer firmware (or the Multi Material Unit 2.0) to unload a " -"filament during a tool change (when executing the T code). This time is " -"added to the total print time by the G-code time estimator." -msgstr "" -"프린터 펌웨어 (또는 MMU2.0)가 공구 교환 중에 필라멘트를 언로드하기 위한 시간" -"입니다 (T 코드를 실행할 때). 이 시간은 G 코드 시간추정기에 의해 총 인쇄 시간" -"에 추가 됩니다." - -#: src/libslic3r/PrintConfig.cpp:677 -msgid "" -"Enter your filament diameter here. Good precision is required, so use a " -"caliper and do multiple measurements along the filament, then compute the " -"average." -msgstr "" -"여기에 필라멘트 직경을 입력하십시오. 정밀도가 필요하므로 캘리퍼를 사용하여 필" -"라멘트를 따라 여러 번 측정 한 다음 평균을 계산하십시오." - -#: src/libslic3r/PrintConfig.cpp:684 -msgid "Density" -msgstr "밀도" - -#: src/libslic3r/PrintConfig.cpp:685 -msgid "" -"Enter your filament density here. This is only for statistical information. " -"A decent way is to weigh a known length of filament and compute the ratio of " -"the length to volume. Better is to calculate the volume directly through " -"displacement." -msgstr "" -"여기서 필라멘트 밀도를 입력하십시오. 이것은 통계 정보 용입니다. 괜찮은 방법" -"은 알려진 길이의 필라멘트의 무게를 측정하고 길이와 볼륨의 비율을 계산하는 것" -"입니다. 변위를 통해 직접적으로 부피를 계산하는 것이 더 좋습니다." - -#: src/libslic3r/PrintConfig.cpp:688 -msgid "g/cm³" -msgstr "g/cm³" - -#: src/libslic3r/PrintConfig.cpp:693 -msgid "Filament type" -msgstr "필라멘트 타입" - -#: src/libslic3r/PrintConfig.cpp:694 -msgid "The filament material type for use in custom G-codes." -msgstr "사용자 지정 G 코드에 사용할 필라멘트재료 유형입니다." - -#: src/libslic3r/PrintConfig.cpp:710 -msgid "Soluble material" -msgstr "수용성 재료" - -#: src/libslic3r/PrintConfig.cpp:711 -msgid "Soluble material is most likely used for a soluble support." -msgstr "수용성 재료눈 물에 녹는 서포트에 가장 많이 사용된다." - -#: src/libslic3r/PrintConfig.cpp:717 -msgid "" -"Enter your filament cost per kg here. This is only for statistical " -"information." -msgstr "필라멘트(kg당) 비용을 여기에 입력하십시오. 통계를 내기 위해서 입니다." - -#: src/libslic3r/PrintConfig.cpp:718 -msgid "money/kg" -msgstr "원(\\)/kg" - -#: src/libslic3r/PrintConfig.cpp:727 -msgid "Fill angle" -msgstr "채움 각도" - -#: src/libslic3r/PrintConfig.cpp:729 -msgid "" -"Default base angle for infill orientation. Cross-hatching will be applied to " -"this. Bridges will be infilled using the best direction Slic3r can detect, " -"so this setting does not affect them." -msgstr "" -"본 오리엔테이션 방향의 기본 각도입니다. 해칭이 적용될 것입니다. Slic3r이 감" -"지 할 수있는 최상의 방향을 사용하여 브릿징이 채워지므로이 설정은 영향을 미치" -"지 않습니다." - -#: src/libslic3r/PrintConfig.cpp:741 -msgid "Fill density" -msgstr "채우기(fill) 밀도" - -#: src/libslic3r/PrintConfig.cpp:743 -msgid "Density of internal infill, expressed in the range 0% - 100%." -msgstr "0 % - 100 % 범위로 표현 된 내부 채움(infill)의 밀도." - -#: src/libslic3r/PrintConfig.cpp:778 -msgid "Fill pattern" -msgstr "채우기(fill) 패턴" - -#: src/libslic3r/PrintConfig.cpp:780 -msgid "Fill pattern for general low-density infill." -msgstr "일반 낮은 밀도 채움의 패턴." - -#: src/libslic3r/PrintConfig.cpp:796 -msgid "Grid" -msgstr "그리드(Grid)" - -#: src/libslic3r/PrintConfig.cpp:797 -msgid "Triangles" -msgstr "삼각형(Triangles)" - -#: src/libslic3r/PrintConfig.cpp:798 -msgid "Stars" -msgstr "별(Stars)" - -#: src/libslic3r/PrintConfig.cpp:799 -msgid "Cubic" -msgstr "큐빅" - -#: src/libslic3r/PrintConfig.cpp:800 -msgid "Line" -msgstr "선(Line)" - -#: src/libslic3r/PrintConfig.cpp:802 src/libslic3r/PrintConfig.cpp:1923 -msgid "Honeycomb" -msgstr "벌집" - -#: src/libslic3r/PrintConfig.cpp:803 -msgid "3D Honeycomb" -msgstr "3D 벌집" - -#: src/libslic3r/PrintConfig.cpp:804 -msgid "Gyroid" -msgstr "자이로이드(Gyroid)" - -#: src/libslic3r/PrintConfig.cpp:811 src/libslic3r/PrintConfig.cpp:820 -#: src/libslic3r/PrintConfig.cpp:828 src/libslic3r/PrintConfig.cpp:861 -msgid "First layer" -msgstr "첫 레이어" - -#: src/libslic3r/PrintConfig.cpp:812 -msgid "" -"This is the acceleration your printer will use for first layer. Set zero to " -"disable acceleration control for first layer." -msgstr "" -"이것은 프린터가 첫 번째 레이어에 사용할 가속도입니다. 0을 설정하면 첫 번째 레" -"이어에 대한 가속 제어가 사용되지 않습니다." - -#: src/libslic3r/PrintConfig.cpp:821 -msgid "" -"Heated build plate temperature for the first layer. Set this to zero to " -"disable bed temperature control commands in the output." -msgstr "" -"첫 번째 레이어에 대한 빌드 플레이트 온도를 가열. 이 값을 0으로 설정하면 출력" -"에서 ​​베드 온도 제어 명령을 비활성화합니다." - -#: src/libslic3r/PrintConfig.cpp:830 -msgid "" -"Set this to a non-zero value to set a manual extrusion width for first " -"layer. You can use this to force fatter extrudates for better adhesion. If " -"expressed as percentage (for example 120%) it will be computed over first " -"layer height. If set to zero, it will use the default extrusion width." -msgstr "" -"첫 번째 레이어의 수동 압출 폭을 설정하려면이 값을 0이 아닌 값으로 설정합니" -"다. 이 방법을 사용하면보다 우수한 접착력을 위해 더 두꺼운 압출 성형물을 만들 " -"수 있습니다. 백분율 (예 : 120 %)로 표현하면 첫 번째 레이어 높이를 기준으로 계" -"산됩니다. 0으로 설정하면 기본 압출 폭이 사용됩니다." - -#: src/libslic3r/PrintConfig.cpp:840 -msgid "First layer height" -msgstr "첫 레이어 높이" - -#: src/libslic3r/PrintConfig.cpp:842 -msgid "" -"When printing with very low layer heights, you might still want to print a " -"thicker bottom layer to improve adhesion and tolerance for non perfect build " -"plates. This can be expressed as an absolute value or as a percentage (for " -"example: 150%) over the default layer height." -msgstr "" -"매우 낮은 층의 높이로 인쇄할 때, 당신은 여전히 완벽하지 않은 빌드 플레이트의 " -"부착력과 허용오차를 개선하기 위해 더 두꺼운 바닥 층을 인쇄하기를 원할 수 있" -"다. 이것은 절대값 또는 기본 계층 높이에 대한 백분율(예: 150%)로 표시할 수 있" -"다." - -#: src/libslic3r/PrintConfig.cpp:846 src/libslic3r/PrintConfig.cpp:991 -#: src/libslic3r/PrintConfig.cpp:1796 -msgid "mm or %" -msgstr "mm/s 또는 %" - -#: src/libslic3r/PrintConfig.cpp:851 -msgid "First layer speed" -msgstr "첫 레이어 속도" - -#: src/libslic3r/PrintConfig.cpp:852 -msgid "" -"If expressed as absolute value in mm/s, this speed will be applied to all " -"the print moves of the first layer, regardless of their type. If expressed " -"as a percentage (for example: 40%) it will scale the default speeds." -msgstr "" -"절대값(mm/s)으로 표현되는 경우, 이 속도는 유형에 관계없이 첫 번째 층의 모든 " -"인쇄 이동에 적용된다. 백분율(예: 40%)로 표현되는 경우 기본 속도를 스케일링한" -"다." - -#: src/libslic3r/PrintConfig.cpp:862 -msgid "" -"Extruder temperature for first layer. If you want to control temperature " -"manually during print, set this to zero to disable temperature control " -"commands in the output file." -msgstr "" -"첫 번째 층의 외부 온도. 인쇄 중에 온도를 수동으로 제어하려면 출력 파일에서 온" -"도 제어 명령을 사용하지 않으려면 이 값을 0으로 설정하십시오." - -#: src/libslic3r/PrintConfig.cpp:871 -msgid "" -"Speed for filling small gaps using short zigzag moves. Keep this reasonably " -"low to avoid too much shaking and resonance issues. Set zero to disable gaps " -"filling." -msgstr "" -"짧은 지그재그로 작은 틈을 메우기 위한 속도. 너무 많은 진동과 공진 문제를 피하" -"기 위해 이것을 합리적으로 낮게 유지한다. 간격 채우기를 사용하지 않으려면 0을 " -"설정하십시오." - -#: src/libslic3r/PrintConfig.cpp:879 -msgid "Verbose G-code" -msgstr "세부 G-코드" - -#: src/libslic3r/PrintConfig.cpp:880 -msgid "" -"Enable this to get a commented G-code file, with each line explained by a " -"descriptive text. If you print from SD card, the additional weight of the " -"file could make your firmware slow down." -msgstr "" -"설명 텍스트로 설명되는 각 행과 함께 코멘트된 G-code 파일을 가져오려면 이 옵션" -"을 선택하십시오. 만일 당신이 SD카드로 인쇄한다면, 파일의 추가 무게로 인해 펌" -"웨어의 속도가 느려질 수 있다." - -#: src/libslic3r/PrintConfig.cpp:887 -msgid "G-code flavor" -msgstr "G-code 형식" - -#: src/libslic3r/PrintConfig.cpp:888 -msgid "" -"Some G/M-code commands, including temperature control and others, are not " -"universal. Set this option to your printer's firmware to get a compatible " -"output. The \"No extrusion\" flavor prevents Slic3r from exporting any " -"extrusion value at all." -msgstr "" -"온도 조절 등을 포함한 일부 G/M-코드 명령은 보편적이지 않다. 호환되는 출력을 " -"얻으려면 이 옵션을 프린터의 펌웨어로 설정하십시오. \"압출 없음\" 형식은 " -"Slic3r가 어떠한 압출 값도 출력하지 못하게 한다." - -#: src/libslic3r/PrintConfig.cpp:911 -msgid "No extrusion" -msgstr "압출 없음" - -#: src/libslic3r/PrintConfig.cpp:924 -msgid "High extruder current on filament swap" -msgstr "필라멘트스왑에 높은 압출 기 전류" - -#: src/libslic3r/PrintConfig.cpp:925 -msgid "" -"It may be beneficial to increase the extruder motor current during the " -"filament exchange sequence to allow for rapid ramming feed rates and to " -"overcome resistance when loading a filament with an ugly shaped tip." -msgstr "" -"필라멘트 교환 동안 압출기 모터 전류를 증가 시키는 것이 유리할 수 있으며, 이" -"는 빠른 래밍 공급 속도를 가능 하게하고, 불규칙한 모양의 필라멘트를 로딩할때 " -"저항을 극복하기 위한것이다." - -#: src/libslic3r/PrintConfig.cpp:933 -msgid "" -"This is the acceleration your printer will use for infill. Set zero to " -"disable acceleration control for infill." -msgstr "" -"이것은 당신 프린터의 채움 가속력이다. 주입에 대한 가속 제어를 비활성화하려면 " -"0을 설정하십시오." - -#: src/libslic3r/PrintConfig.cpp:941 -msgid "Combine infill every" -msgstr "다음 시간마다 결합" - -#: src/libslic3r/PrintConfig.cpp:943 -msgid "" -"This feature allows to combine infill and speed up your print by extruding " -"thicker infill layers while preserving thin perimeters, thus accuracy." -msgstr "" -"이 기능은 인필을 결합하고 얇은 주변기기를 보존하면서 두꺼운 인필 층을 압출하" -"여 인쇄 속도를 높일 수 있도록 하여 정확도를 높인다." - -#: src/libslic3r/PrintConfig.cpp:946 -msgid "Combine infill every n layers" -msgstr "모든 n개 층을 채우기 위해 결합" - -#: src/libslic3r/PrintConfig.cpp:952 -msgid "Infill extruder" -msgstr "채움(Infill) 익스트루더" - -#: src/libslic3r/PrintConfig.cpp:954 -msgid "The extruder to use when printing infill." -msgstr "채움으로 사용할 익스트루더." - -#: src/libslic3r/PrintConfig.cpp:962 -msgid "" -"Set this to a non-zero value to set a manual extrusion width for infill. If " -"left zero, default extrusion width will be used if set, otherwise 1.125 x " -"nozzle diameter will be used. You may want to use fatter extrudates to speed " -"up the infill and make your parts stronger. If expressed as percentage (for " -"example 90%) it will be computed over layer height." -msgstr "" -"채움에 수동 압출 폭을 설정하려면이 값을 0이 아닌 값으로 설정합니다. 0으로 설" -"정하면 설정된 경우 기본 압출 폭이 사용되고 그렇지 않으면 1.125 x 노즐 직경이 " -"사용됩니다. 채움 속도를 높이고 부품을 더 강하게 만들려면보다 큰 압출 성형물" -"을 사용하는 것이 좋습니다. 백분율 (예 : 90 %)로 표현하면 레이어 높이를 기준으" -"로 계산됩니다." - -#: src/libslic3r/PrintConfig.cpp:971 -msgid "Infill before perimeters" -msgstr "둘레보다 앞쪽에 채움" - -#: src/libslic3r/PrintConfig.cpp:972 -msgid "" -"This option will switch the print order of perimeters and infill, making the " -"latter first." -msgstr "이 옵션은 외부출력과 채움 인쇄 순서를 바꾸어, 후자를 먼저 만든다." - -#: src/libslic3r/PrintConfig.cpp:977 -msgid "Only infill where needed" -msgstr "필요한 경우 채음" - -#: src/libslic3r/PrintConfig.cpp:979 -msgid "" -"This option will limit infill to the areas actually needed for supporting " -"ceilings (it will act as internal support material). If enabled, slows down " -"the G-code generation due to the multiple checks involved." -msgstr "" -"이 옵션은 천장 지원에 실제로 필요한 영역에만 적용된다(내부 서포트 재료 역할" -"을 할 것이다). 활성화된 경우 관련된 여러 번의 점검으로 인해 G-code 생성 속도" -"를 늦춰라." - -#: src/libslic3r/PrintConfig.cpp:986 -msgid "Infill/perimeters overlap" -msgstr "채움/둘레 겹침(perimeters overlap)" - -#: src/libslic3r/PrintConfig.cpp:988 -msgid "" -"This setting applies an additional overlap between infill and perimeters for " -"better bonding. Theoretically this shouldn't be needed, but backlash might " -"cause gaps. If expressed as percentage (example: 15%) it is calculated over " -"perimeter extrusion width." -msgstr "" -"이 설정은 더 나은 본딩을 위해 충전 및 둘레 사이에 추가 겹침을 적용합니다. 이" -"론적으로 이것은 필요하지 않아야하지만 백래시가 갭을 유발할 수 있습니다. 백분" -"율 (예 : 15 %)로 표시되는 경우 경계 압출 폭을 기준으로 계산됩니다." - -#: src/libslic3r/PrintConfig.cpp:999 -msgid "Speed for printing the internal fill. Set to zero for auto." -msgstr "내부 채우기 인쇄 속도. 자동으로 0으로 설정하십시오." - -#: src/libslic3r/PrintConfig.cpp:1007 -msgid "Inherits profile" -msgstr "프로필 상속" - -#: src/libslic3r/PrintConfig.cpp:1008 -msgid "Name of the profile, from which this profile inherits." -msgstr "이 프로파일이 상속되는 프로파일의 이름." - -#: src/libslic3r/PrintConfig.cpp:1021 -msgid "Interface shells" -msgstr "인터페이스 셸(shells)" - -#: src/libslic3r/PrintConfig.cpp:1022 -msgid "" -"Force the generation of solid shells between adjacent materials/volumes. " -"Useful for multi-extruder prints with translucent materials or manual " -"soluble support material." -msgstr "" -"인접 재료/볼륨 사이에 고체 쉘 생성을 강제하십시오. 반투명 재료 또는 수동 수용" -"성 서포트 재료를 사용한 다중 압ㅊ기 인쇄에 유용함." - -#: src/libslic3r/PrintConfig.cpp:1031 -msgid "" -"This custom code is inserted at every layer change, right after the Z move " -"and before the extruder moves to the first layer point. Note that you can " -"use placeholder variables for all Slic3r settings as well as [layer_num] and " -"[layer_z]." -msgstr "" -"이 사용자 정의 코드는 Z 이동 직후와 압출부가 첫 번째 레이어 포인트로 이동하" -"기 전에 모든 레이어 변경 시 삽입된다. 모든 Slic3r 설정뿐만 아니라 " -"[layer_num] 및 [layer_z]에 자리 표시자 변수를 사용할 수 있다는 점에 유의하십" -"시오." - -#: src/libslic3r/PrintConfig.cpp:1042 -msgid "Supports remaining times" -msgstr "남은 시간 지원" - -#: src/libslic3r/PrintConfig.cpp:1043 -msgid "" -"Emit M73 P[percent printed] R[remaining time in minutes] at 1 minute " -"intervals into the G-code to let the firmware show accurate remaining time. " -"As of now only the Prusa i3 MK3 firmware recognizes M73. Also the i3 MK3 " -"firmware supports M73 Qxx Sxx for the silent mode." -msgstr "" -"G 코드에 1 분 간격으로 M73 P [퍼센트 인쇄] R을 방출하여 펌웨어가 정확한 잔여 " -"시간을 표시 하도록 합니다. 현재만 Prusa i3 MK3 펌웨어는 M73를 인식 하 고 있습" -"니다. 또한 i3 MK3 펌웨어는 자동 모드에서 M73 Qxx Sxx를 지원 합니다." - -#: src/libslic3r/PrintConfig.cpp:1051 -msgid "Supports silent mode" -msgstr "자동 모드 지원" - -#: src/libslic3r/PrintConfig.cpp:1052 -msgid "Set silent mode for the G-code flavor" -msgstr "G-코드 특징에 대한 무음 모드 설정" - -#: src/libslic3r/PrintConfig.cpp:1075 -msgid "Maximum feedrate %1%" -msgstr "최대 공급 속도 %1%" - -#: src/libslic3r/PrintConfig.cpp:1077 -msgid "Maximum feedrate of the %1% axis" -msgstr "최대 공급 속도 of the %1% axis " - -#: src/libslic3r/PrintConfig.cpp:1085 -msgid "Maximum acceleration %1%" -msgstr "최 대 가 속 %1%" - -#: src/libslic3r/PrintConfig.cpp:1087 -msgid "Maximum acceleration of the %1% axis" -msgstr "최대 가속도는 %1% 축" - -#: src/libslic3r/PrintConfig.cpp:1095 -msgid "Maximum jerk %1%" -msgstr "최대 저크(jerk) %1%" - -#: src/libslic3r/PrintConfig.cpp:1097 -msgid "Maximum jerk of the %1% axis" -msgstr "최대 저크는(jerk) %1% axis" - -#: src/libslic3r/PrintConfig.cpp:1108 src/libslic3r/PrintConfig.cpp:1110 -msgid "Minimum feedrate when extruding" -msgstr "압출시 최소 공급 속도" - -#: src/libslic3r/PrintConfig.cpp:1119 src/libslic3r/PrintConfig.cpp:1121 -msgid "Minimum travel feedrate" -msgstr "최소 이송 속도" - -#: src/libslic3r/PrintConfig.cpp:1130 src/libslic3r/PrintConfig.cpp:1132 -msgid "Maximum acceleration when extruding" -msgstr "압출시 최대 가속도" - -#: src/libslic3r/PrintConfig.cpp:1141 src/libslic3r/PrintConfig.cpp:1143 -msgid "Maximum acceleration when retracting" -msgstr "리트렉션 최대 가속도" - -#: src/libslic3r/PrintConfig.cpp:1151 src/libslic3r/PrintConfig.cpp:1160 -msgid "Max" -msgstr "최대" - -#: src/libslic3r/PrintConfig.cpp:1152 -msgid "This setting represents the maximum speed of your fan." -msgstr "이 설정은 팬의 최대 속도를 나타냅니다." - -#: src/libslic3r/PrintConfig.cpp:1161 -#, no-c-format -msgid "" -"This is the highest printable layer height for this extruder, used to cap " -"the variable layer height and support layer height. Maximum recommended " -"layer height is 75% of the extrusion width to achieve reasonable inter-layer " -"adhesion. If set to 0, layer height is limited to 75% of the nozzle diameter." -msgstr "" -"이것은이 익스트루더의 가장 높은 인쇄 가능 층 높이이며, 가변 층 높이 및 지지" -"층 높이를 캡하는 데 사용됩니다. 합당한 층간 접착력을 얻기 위해 최대 권장 높이" -"는 압출 폭의 75 %입니다. 0으로 설정하면 층 높이가 노즐 지름의 75 %로 제한됩니" -"다." - -#: src/libslic3r/PrintConfig.cpp:1171 -msgid "Max print speed" -msgstr "최대 프린트 속도" - -#: src/libslic3r/PrintConfig.cpp:1172 -msgid "" -"When setting other speed settings to 0 Slic3r will autocalculate the optimal " -"speed in order to keep constant extruder pressure. This experimental setting " -"is used to set the highest print speed you want to allow." -msgstr "" -"다른 속도 설정을 0으로 설정할 경우, 지속적인 외부 압력을 유지하기 위해 최적" -"의 속도를 자동 계산한다. 이 실험 설정은 허용할 최대 인쇄 속도를 설정하는 데 " -"사용된다." - -#: src/libslic3r/PrintConfig.cpp:1182 -msgid "" -"This experimental setting is used to set the maximum volumetric speed your " -"extruder supports." -msgstr "" -"이 실험 설정은 압출기가 지원하는 최대 체적 속도를 설정하기 위해 사용된다." - -#: src/libslic3r/PrintConfig.cpp:1191 -msgid "Max volumetric slope positive" -msgstr "최대 체적 기울기 양" - -#: src/libslic3r/PrintConfig.cpp:1192 src/libslic3r/PrintConfig.cpp:1203 -msgid "" -"This experimental setting is used to limit the speed of change in extrusion " -"rate. A value of 1.8 mm³/s² ensures, that a change from the extrusion rate " -"of 1.8 mm³/s (0.45mm extrusion width, 0.2mm extrusion height, feedrate 20 mm/" -"s) to 5.4 mm³/s (feedrate 60 mm/s) will take at least 2 seconds." -msgstr "" -"이 실험 설정은 돌출율의 변화 속도를 제한하는데 사용된다. 1.8mm3/s2 값은 " -"1.8mm3/s(0.45mm 압출 폭, 0.2mm 압출 높이, 공급 속도 20mm/s)에서 5.4mm3/s(공" -"급 속도 60mm/s)로 변경하는 데 최소 2초 이상 걸린다." - -#: src/libslic3r/PrintConfig.cpp:1196 src/libslic3r/PrintConfig.cpp:1207 -msgid "mm³/s²" -msgstr "mm³/s²" - -#: src/libslic3r/PrintConfig.cpp:1202 -msgid "Max volumetric slope negative" -msgstr "최대 체적 기울기 음수" - -#: src/libslic3r/PrintConfig.cpp:1214 src/libslic3r/PrintConfig.cpp:1223 -msgid "Min" -msgstr "최소" - -#: src/libslic3r/PrintConfig.cpp:1215 -msgid "This setting represents the minimum PWM your fan needs to work." -msgstr "이 설정은 최소 PWM팬이 활동하는데 필요한를 나타냅니다." - -#: src/libslic3r/PrintConfig.cpp:1224 -msgid "" -"This is the lowest printable layer height for this extruder and limits the " -"resolution for variable layer height. Typical values are between 0.05 mm and " -"0.1 mm." -msgstr "" -"이것은 이 압출기에 대한 가장 낮은 인쇄 가능한 층 높이이고 가변 층 높이에 대" -"한 분해능을 제한한다. 대표적인 값은 0.05mm와 0.1mm이다." - -#: src/libslic3r/PrintConfig.cpp:1232 -msgid "Min print speed" -msgstr "최소 인쇄 속도" - -#: src/libslic3r/PrintConfig.cpp:1233 -msgid "Slic3r will not scale speed down below this speed." -msgstr "Slic3r는 이 속도 이하로 속도를 낮추지 않을 것이다." - -#: src/libslic3r/PrintConfig.cpp:1240 -msgid "Minimal filament extrusion length" -msgstr "최소 필라멘트 압출 길이" - -#: src/libslic3r/PrintConfig.cpp:1241 -msgid "" -"Generate no less than the number of skirt loops required to consume the " -"specified amount of filament on the bottom layer. For multi-extruder " -"machines, this minimum applies to each extruder." -msgstr "" -"하단 레이어에서 지정된 양의 필라멘트를 사용하는 데 필요한 스커트 루프의 수 이" -"상으로 생성한다. 멀티 익스트루더의 경우, 이 최소값은 각 추가기기에 적용된다." - -#: src/libslic3r/PrintConfig.cpp:1250 -msgid "Configuration notes" -msgstr "구성 노트" - -#: src/libslic3r/PrintConfig.cpp:1251 -msgid "" -"You can put here your personal notes. This text will be added to the G-code " -"header comments." -msgstr "" -"여기에 개인 노트를 넣을 수 있다. 이 텍스트는 G-code 헤더 코멘트에 추가될 것이" -"다." - -#: src/libslic3r/PrintConfig.cpp:1260 -msgid "Nozzle diameter" -msgstr "노즐 직경" - -#: src/libslic3r/PrintConfig.cpp:1261 -msgid "" -"This is the diameter of your extruder nozzle (for example: 0.5, 0.35 etc.)" -msgstr "이 지름은 엑스트루더 노즐의 직경이다(예: 0.5, 0.35 등)." - -#: src/libslic3r/PrintConfig.cpp:1266 -msgid "Host Type" -msgstr "호스트 유형" - -#: src/libslic3r/PrintConfig.cpp:1267 -msgid "" -"Slic3r can upload G-code files to a printer host. This field must contain " -"the kind of the host." -msgstr "" -"Slic3r는 프린터 호스트에 G 코드 파일을 업로드할 수 있습니다. 이 필드에는 호스" -"트의 종류가 포함 되어야 합니다." - -#: src/libslic3r/PrintConfig.cpp:1278 -msgid "Only retract when crossing perimeters" -msgstr "둘레를 횡단 할 때만 수축" - -#: src/libslic3r/PrintConfig.cpp:1279 -msgid "" -"Disables retraction when the travel path does not exceed the upper layer's " -"perimeters (and thus any ooze will be probably invisible)." -msgstr "" -"이동 경로가 상위 레이어의 경계를 초과하지 않는 경우 리트랙션을 비활성화합니" -"다. 따라서 모든 오즈가 보이지 않습니다." - -#: src/libslic3r/PrintConfig.cpp:1286 -msgid "" -"This option will drop the temperature of the inactive extruders to prevent " -"oozing. It will enable a tall skirt automatically and move extruders outside " -"such skirt when changing temperatures." -msgstr "" -"이 옵션은 누출을 방지하기 위해 비활성 압출기의 온도를 떨어 뜨립니다. 온도를 " -"변경할 때 키가 큰 스커트를 자동으로 사용하고 스커트 외부로 압출기를 이동합니" -"다." - -#: src/libslic3r/PrintConfig.cpp:1293 -msgid "Output filename format" -msgstr "출력 파일이름 형식" - -#: src/libslic3r/PrintConfig.cpp:1294 -msgid "" -"You can use all configuration options as variables inside this template. For " -"example: [layer_height], [fill_density] etc. You can also use [timestamp], " -"[year], [month], [day], [hour], [minute], [second], [version], " -"[input_filename], [input_filename_base]." -msgstr "" -"모든 구성 옵션을이 템플릿 내의 변수로 사용할 수 있습니다. 예: " -"[layer_height], [fill_density] 등 또한 [타임 스탬프], [연도], [월], [일], [시" -"간], [input_filename], [input_filename_base]을 사용할 수 있습니다." - -#: src/libslic3r/PrintConfig.cpp:1303 -msgid "Detect bridging perimeters" -msgstr "브릿 징 경계선 감지" - -#: src/libslic3r/PrintConfig.cpp:1305 -msgid "" -"Experimental option to adjust flow for overhangs (bridge flow will be used), " -"to apply bridge speed to them and enable fan." -msgstr "" -"오버행에 대한 유량을 조정하는 실험 옵션 (브리지 흐름(flow)이 사용됨)에 브릿" -"지 속도를 적용하고 팬을 활성화합니다." - -#: src/libslic3r/PrintConfig.cpp:1311 -msgid "Filament parking position" -msgstr "필라멘트 멈춤 위치" - -#: src/libslic3r/PrintConfig.cpp:1312 -msgid "" -"Distance of the extruder tip from the position where the filament is parked " -"when unloaded. This should match the value in printer firmware. " -msgstr "" -"언 로딩시 필라멘트 위치에서 압출기 팁의 거리. 이 값은 프린터 펌웨어의 값과 일" -"치해야합니다. " - -#: src/libslic3r/PrintConfig.cpp:1320 -msgid "Extra loading distance" -msgstr "추가 로딩 거리" - -#: src/libslic3r/PrintConfig.cpp:1321 -msgid "" -"When set to zero, the distance the filament is moved from parking position " -"during load is exactly the same as it was moved back during unload. When " -"positive, it is loaded further, if negative, the loading move is shorter " -"than unloading. " -msgstr "" -"0으로 설정하면로드 중에 필라멘트가 위치에서 이동 한 거리는 언로드 중에 다시 " -"이동 한 거리와 동일합니다. 양수이면 음수가 더 많이 로드되고 로드가 음수 인 경" -"우 언로드보다 짧습니다. " - -#: src/libslic3r/PrintConfig.cpp:1329 src/libslic3r/PrintConfig.cpp:1347 -#: src/libslic3r/PrintConfig.cpp:1359 src/libslic3r/PrintConfig.cpp:1369 -msgid "Perimeters" -msgstr "둘레" - -#: src/libslic3r/PrintConfig.cpp:1330 -msgid "" -"This is the acceleration your printer will use for perimeters. A high value " -"like 9000 usually gives good results if your hardware is up to the job. Set " -"zero to disable acceleration control for perimeters." -msgstr "" -"프린터가 둘레로 사용할 가속도입니다. 9000과 같은 높은 값은 하드웨어가 제대로 " -"작동하면 좋은 결과를 제공합니다. 주변을 가속 제어하지 않으려면 0으로 설정하십" -"시오." - -#: src/libslic3r/PrintConfig.cpp:1338 -msgid "Perimeter extruder" -msgstr "주변 익스트루더" - -#: src/libslic3r/PrintConfig.cpp:1340 -msgid "" -"The extruder to use when printing perimeters and brim. First extruder is 1." -msgstr "" -"둘레와 가장자리를 인쇄 할 때 사용할 압출기입니다. 첫 번째 압출기는 1입니다." - -#: src/libslic3r/PrintConfig.cpp:1349 -msgid "" -"Set this to a non-zero value to set a manual extrusion width for perimeters. " -"You may want to use thinner extrudates to get more accurate surfaces. If " -"left zero, default extrusion width will be used if set, otherwise 1.125 x " -"nozzle diameter will be used. If expressed as percentage (for example 200%) " -"it will be computed over layer height." -msgstr "" -"이 값을 0이 아닌 값으로 설정하면 수동 압출 폭을 둘레로 설정할 수 있습니다. 보" -"다 정확한 서페이스를 얻으려면 더 얇은 압출 성형품을 사용하는 것이 좋습니다. 0" -"으로 설정하면 설정된 경우 기본 돌출 폭이 사용되고 그렇지 않으면 1.125 x 노즐 " -"직경이 사용됩니다. 백분율 (예 : 200 %)로 표현하면 레이어 높이를 기준으로 계산" -"됩니다." - -#: src/libslic3r/PrintConfig.cpp:1361 -msgid "" -"Speed for perimeters (contours, aka vertical shells). Set to zero for auto." -msgstr "둘레의 속도 (등고선, 일명 세로 셸). 자동으로 0으로 설정하십시오." - -#: src/libslic3r/PrintConfig.cpp:1371 -msgid "" -"This option sets the number of perimeters to generate for each layer. Note " -"that Slic3r may increase this number automatically when it detects sloping " -"surfaces which benefit from a higher number of perimeters if the Extra " -"Perimeters option is enabled." -msgstr "" -"이 옵션은 각 레이어에 대해 생성 할 경계 수를 설정합니다. 추가 경계선 옵션을 " -"사용하면 더 큰 주변 수를 사용하는 경사면을 감지 할 때 Slic3r이이 수를 자동으" -"로 증가시킬 수 있습니다." - -#: src/libslic3r/PrintConfig.cpp:1375 -msgid "(minimum)" -msgstr "(최소)" - -#: src/libslic3r/PrintConfig.cpp:1383 -msgid "" -"If you want to process the output G-code through custom scripts, just list " -"their absolute paths here. Separate multiple scripts with a semicolon. " -"Scripts will be passed the absolute path to the G-code file as the first " -"argument, and they can access the Slic3r config settings by reading " -"environment variables." -msgstr "" -"사용자 정의 스크립트를 통해 출력 G 코드를 처리하려면 여기에 절대 경로를 나열" -"하십시오. 여러 개의 스크립트를 세미콜론으로 구분하십시오. 스크립트는 G 코드 " -"파일의 절대 경로를 첫 번째 인수로 전달되며 환경 변수를 읽음으로써 Slic3r 구" -"성 설정에 액세스 할 수 있습니다." - -#: src/libslic3r/PrintConfig.cpp:1395 -msgid "Printer type" -msgstr "프린터 타입" - -#: src/libslic3r/PrintConfig.cpp:1396 -msgid "Type of the printer." -msgstr "프린터 유형." - -#: src/libslic3r/PrintConfig.cpp:1401 -msgid "Printer notes" -msgstr "프린터 노트" - -#: src/libslic3r/PrintConfig.cpp:1402 -msgid "You can put your notes regarding the printer here." -msgstr "프린터 관련 메모를 여기에 넣을 수 있습니다." - -#: src/libslic3r/PrintConfig.cpp:1410 -msgid "Printer vendor" -msgstr "제조 회사" - -#: src/libslic3r/PrintConfig.cpp:1411 -msgid "Name of the printer vendor." -msgstr "프린터 공급 업체의 이름입니다." - -#: src/libslic3r/PrintConfig.cpp:1416 -msgid "Printer variant" -msgstr "프린터 변형" - -#: src/libslic3r/PrintConfig.cpp:1417 -msgid "" -"Name of the printer variant. For example, the printer variants may be " -"differentiated by a nozzle diameter." -msgstr "" -"프린터 변종 이름입니다. 예를 들어, 프린터 변형은 노즐 지름으로 구별 될 수 있" -"습니다." - -#: src/libslic3r/PrintConfig.cpp:1430 -msgid "Raft layers" -msgstr "라프트(Raft) 레이어" - -#: src/libslic3r/PrintConfig.cpp:1432 -msgid "" -"The object will be raised by this number of layers, and support material " -"will be generated under it." -msgstr "" -"물체는 이 개수의 층에 의해 상승되며, 그 아래에서 서포트 재료가 생성될 것이다." - -#: src/libslic3r/PrintConfig.cpp:1440 -msgid "Resolution" -msgstr "해결" - -#: src/libslic3r/PrintConfig.cpp:1441 -msgid "" -"Minimum detail resolution, used to simplify the input file for speeding up " -"the slicing job and reducing memory usage. High-resolution models often " -"carry more detail than printers can render. Set to zero to disable any " -"simplification and use full resolution from input." -msgstr "" -"잘라내기 작업의 속도를 높이고 메모리 사용량을 줄이기 위해 입력 파일을 단순화" -"하는 데 사용되는 최소 세부 해상도. 고해상도 모델은 종종 프린터가 렌더링할 수 " -"있는 것보다 더 많은 디테일을 가지고 있다. 단순화를 사용하지 않고 입력에서 전" -"체 해상도를 사용하려면 0으로 설정하십시오." - -#: src/libslic3r/PrintConfig.cpp:1451 -msgid "Minimum travel after retraction" -msgstr "리트랙션 후 최소 이동 거리" - -#: src/libslic3r/PrintConfig.cpp:1452 -msgid "" -"Retraction is not triggered when travel moves are shorter than this length." -msgstr "이동 거리가 이 길이보다 짧으면 리트렉션이 트리거되지 않습니다." - -#: src/libslic3r/PrintConfig.cpp:1458 -msgid "Retract amount before wipe" -msgstr "닦아 내기 전의 수축량" - -#: src/libslic3r/PrintConfig.cpp:1459 -msgid "" -"With bowden extruders, it may be wise to do some amount of quick retract " -"before doing the wipe movement." -msgstr "" -"보우 덴 압출기를 사용하면 와이퍼 동작을하기 전에 약간의 빠른 리트랙션 를하는 " -"것이 좋습니다." - -#: src/libslic3r/PrintConfig.cpp:1466 -msgid "Retract on layer change" -msgstr "레이어 변경 후퇴" - -#: src/libslic3r/PrintConfig.cpp:1467 -msgid "This flag enforces a retraction whenever a Z move is done." -msgstr "이 플래그는 Z 이동이 완료 될 때마다 취소를 강제 실행합니다." - -#: src/libslic3r/PrintConfig.cpp:1472 src/libslic3r/PrintConfig.cpp:1480 -msgid "Length" -msgstr "길이" - -#: src/libslic3r/PrintConfig.cpp:1473 -msgid "Retraction Length" -msgstr "리트랙션 길이" - -#: src/libslic3r/PrintConfig.cpp:1474 -msgid "" -"When retraction is triggered, filament is pulled back by the specified " -"amount (the length is measured on raw filament, before it enters the " -"extruder)." -msgstr "" -"후퇴가 트리거되면 필라멘트가 지정된 양만큼 뒤로 당겨집니다 (길이는 압출기에 " -"들어가기 전에 원시 필라멘트에서 측정됩니다)." - -#: src/libslic3r/PrintConfig.cpp:1476 src/libslic3r/PrintConfig.cpp:1485 -msgid "mm (zero to disable)" -msgstr "mm (0은 비활성화)" - -#: src/libslic3r/PrintConfig.cpp:1481 -msgid "Retraction Length (Toolchange)" -msgstr "리트랙션 길이 (툴 체인지)" - -#: src/libslic3r/PrintConfig.cpp:1482 -msgid "" -"When retraction is triggered before changing tool, filament is pulled back " -"by the specified amount (the length is measured on raw filament, before it " -"enters the extruder)." -msgstr "" -"공구를 교체하기 전에 후퇴가 트리거되면 필라멘트가 지정된 양만큼 뒤로 당겨집니" -"다 (길이는 압출기에 들어가기 전에 원시 필라멘트에서 측정됩니다)." - -#: src/libslic3r/PrintConfig.cpp:1490 -msgid "Lift Z" -msgstr "Z축 올림" - -#: src/libslic3r/PrintConfig.cpp:1491 -msgid "" -"If you set this to a positive value, Z is quickly raised every time a " -"retraction is triggered. When using multiple extruders, only the setting for " -"the first extruder will be considered." -msgstr "" -"이 값을 양수 값으로 설정하면 철회가 트리거 될 때마다 Z가 빠르게 올라갑니다. " -"여러 개의 압출기를 사용하는 경우 첫 번째 압출기의 설정 만 고려됩니다." - -#: src/libslic3r/PrintConfig.cpp:1498 -msgid "Above Z" -msgstr "Z 위" - -#: src/libslic3r/PrintConfig.cpp:1499 -msgid "Only lift Z above" -msgstr "오직 Z축 위로만" - -#: src/libslic3r/PrintConfig.cpp:1500 -msgid "" -"If you set this to a positive value, Z lift will only take place above the " -"specified absolute Z. You can tune this setting for skipping lift on the " -"first layers." -msgstr "" -"이것을 양의 값으로 설정하면, Z 리프트는 지정된 절대 Z 위로만 발생한다. 첫 번" -"째 층에서 리프트를 건너뛸 수 있도록 이 설정을 조정할 수 있다." - -#: src/libslic3r/PrintConfig.cpp:1507 -msgid "Below Z" -msgstr "Z 아래" - -#: src/libslic3r/PrintConfig.cpp:1508 -msgid "Only lift Z below" -msgstr "Z값 아래만" - -#: src/libslic3r/PrintConfig.cpp:1509 -msgid "" -"If you set this to a positive value, Z lift will only take place below the " -"specified absolute Z. You can tune this setting for limiting lift to the " -"first layers." -msgstr "" -"이것을 양수 값으로 설정하면 Z 리프트가 지정된 절대 Z 아래에서만 발생합니다. " -"첫 번째 레이어로 리프트를 제한하기 위해이 설정을 조정할 수 있습니다." - -#: src/libslic3r/PrintConfig.cpp:1517 src/libslic3r/PrintConfig.cpp:1525 -msgid "Extra length on restart" -msgstr "재시작시 여분의 길이" - -#: src/libslic3r/PrintConfig.cpp:1518 -msgid "" -"When the retraction is compensated after the travel move, the extruder will " -"push this additional amount of filament. This setting is rarely needed." -msgstr "" -"이동 후 리트렉셔이 보정되면 익스트루더가 추가 양의 필라멘트를 밀어냅니다. 이 " -"설정은 거의 필요하지 않습니다." - -#: src/libslic3r/PrintConfig.cpp:1526 -msgid "" -"When the retraction is compensated after changing tool, the extruder will " -"push this additional amount of filament." -msgstr "" -"도구를 교환 한 후 리트렉션를 보정하면 익스트루더가 추가 양의 필라멘트를 밀게" -"됩니다." - -#: src/libslic3r/PrintConfig.cpp:1533 src/libslic3r/PrintConfig.cpp:1534 -msgid "Retraction Speed" -msgstr "리트랙션 속도" - -#: src/libslic3r/PrintConfig.cpp:1535 -msgid "The speed for retractions (it only applies to the extruder motor)." -msgstr "리트랙션 속도 (익스트루더 모터에만 적용됨)." - -#: src/libslic3r/PrintConfig.cpp:1541 src/libslic3r/PrintConfig.cpp:1542 -msgid "Deretraction Speed" -msgstr "감속 속도" - -#: src/libslic3r/PrintConfig.cpp:1543 -msgid "" -"The speed for loading of a filament into extruder after retraction (it only " -"applies to the extruder motor). If left to zero, the retraction speed is " -"used." -msgstr "" -"리트랙션 후 압출기에 필라멘트를 로드하는 속도 (압출기 모터에만 적용됨). 0으" -"로 방치하면 리트랙션 속도가 사용됩니다." - -#: src/libslic3r/PrintConfig.cpp:1550 -msgid "Seam position" -msgstr "재봉선 위치" - -#: src/libslic3r/PrintConfig.cpp:1552 -msgid "Position of perimeters starting points." -msgstr "둘레의 시작점의 위치." - -#: src/libslic3r/PrintConfig.cpp:1558 -msgid "Random" -msgstr "무작위" - -#: src/libslic3r/PrintConfig.cpp:1559 -msgid "Nearest" -msgstr "가장 가까운" - -#: src/libslic3r/PrintConfig.cpp:1560 -msgid "Aligned" -msgstr "정렬" - -#: src/libslic3r/PrintConfig.cpp:1568 -msgid "Direction" -msgstr "방향" - -#: src/libslic3r/PrintConfig.cpp:1570 -msgid "Preferred direction of the seam" -msgstr "선호하는 심(seam)의 방향" - -#: src/libslic3r/PrintConfig.cpp:1571 -msgid "Seam preferred direction" -msgstr "심(Seam) 선호 방향" - -#: src/libslic3r/PrintConfig.cpp:1578 -msgid "Jitter" -msgstr "지터(Jitter)" - -#: src/libslic3r/PrintConfig.cpp:1580 -msgid "Seam preferred direction jitter" -msgstr "(Seam) 선호 방향 지터(Jitter)" - -#: src/libslic3r/PrintConfig.cpp:1581 -msgid "Preferred direction of the seam - jitter" -msgstr "재봉선 지터의 선호 방향" - -#: src/libslic3r/PrintConfig.cpp:1591 -msgid "USB/serial port for printer connection." -msgstr "프린터 연결을 위한 USB/시리얼 포트." - -#: src/libslic3r/PrintConfig.cpp:1598 -msgid "Serial port speed" -msgstr "시리얼 포트 속도" - -#: src/libslic3r/PrintConfig.cpp:1599 -msgid "Speed (baud) of USB/serial port for printer connection." -msgstr "프린터 연결을 위한 USB/시리얼 포트의 속도(보드)" - -#: src/libslic3r/PrintConfig.cpp:1608 -msgid "Distance from object" -msgstr "객체로부터의 거리" - -#: src/libslic3r/PrintConfig.cpp:1609 -msgid "" -"Distance between skirt and object(s). Set this to zero to attach the skirt " -"to the object(s) and get a brim for better adhesion." -msgstr "" -"스커트와 객체 사이의 거리. 스커트를 객체에 부착하고 접착력을 높이기 위해 이" -"를 0으로 설정한다." - -#: src/libslic3r/PrintConfig.cpp:1616 -msgid "Skirt height" -msgstr "스커트(Skirt) 높이" - -#: src/libslic3r/PrintConfig.cpp:1617 -msgid "" -"Height of skirt expressed in layers. Set this to a tall value to use skirt " -"as a shield against drafts." -msgstr "" -"스커트의 높이 레이어로 표현된다. 이를 높은 값으로 설정하여 스커트를 드래프트" -"에 대한 쉴ㄷ로 활용하십시오." - -#: src/libslic3r/PrintConfig.cpp:1624 -msgid "Loops (minimum)" -msgstr "루프 (최소)" - -#: src/libslic3r/PrintConfig.cpp:1625 -msgid "Skirt Loops" -msgstr "스커트 루프" - -#: src/libslic3r/PrintConfig.cpp:1626 -msgid "" -"Number of loops for the skirt. If the Minimum Extrusion Length option is " -"set, the number of loops might be greater than the one configured here. Set " -"this to zero to disable skirt completely." -msgstr "" -"스커트의 루프 수입니다. 최소 압출 길이 옵션을 설정한 경우 여기에 구성된 루프 " -"수보다 클 수 있다. 스커트를 완전히 비활성화하려면 이 값을 0으로 설정하십시오." - -#: src/libslic3r/PrintConfig.cpp:1634 -msgid "Slow down if layer print time is below" -msgstr "레이어 인쇄 시간이 다음과 같은 경우 속도를 낮추십시오" - -#: src/libslic3r/PrintConfig.cpp:1635 -msgid "" -"If layer print time is estimated below this number of seconds, print moves " -"speed will be scaled down to extend duration to this value." -msgstr "" -"층 인쇄 시간이 이 시간보다 낮게 추정될 경우, 인쇄 이동 속도는 이 값으로 지속" -"되도록 축소된다." - -#: src/libslic3r/PrintConfig.cpp:1645 -msgid "Small perimeters" -msgstr "작은 둘레" - -#: src/libslic3r/PrintConfig.cpp:1647 -msgid "" -"This separate setting will affect the speed of perimeters having radius <= " -"6.5mm (usually holes). If expressed as percentage (for example: 80%) it will " -"be calculated on the perimeters speed setting above. Set to zero for auto." -msgstr "" -"이 개별 설정은 반경이 6.5mm 미만인 속도 (일반적으로 구멍)에 영향을줍니다. 백" -"분율로 표시되는 경우 (예 : 80 %) 위의 속도 설정에서 계산됩니다. 자동으로 0으" -"로 설정하십시오." - -#: src/libslic3r/PrintConfig.cpp:1657 -msgid "Solid infill threshold area" -msgstr "솔리드 채우기 임계값 영역" - -#: src/libslic3r/PrintConfig.cpp:1659 -msgid "" -"Force solid infill for regions having a smaller area than the specified " -"threshold." -msgstr "" -"지정된 한계값보다 작은 영역을 가진 영역에 대해 솔리드 인필을 강제 적용." - -#: src/libslic3r/PrintConfig.cpp:1660 -msgid "mm²" -msgstr "mm²" - -#: src/libslic3r/PrintConfig.cpp:1666 -msgid "Solid infill extruder" -msgstr "솔리드 인필 익스트루더" - -#: src/libslic3r/PrintConfig.cpp:1668 -msgid "The extruder to use when printing solid infill." -msgstr "꽉찬 면을 인쇄할 때 사용하는 익스트루더." - -#: src/libslic3r/PrintConfig.cpp:1674 -msgid "Solid infill every" -msgstr "솔리드 인필 간격" - -#: src/libslic3r/PrintConfig.cpp:1676 -msgid "" -"This feature allows to force a solid layer every given number of layers. " -"Zero to disable. You can set this to any value (for example 9999); Slic3r " -"will automatically choose the maximum possible number of layers to combine " -"according to nozzle diameter and layer height." -msgstr "" -"이 특징은 주어진 개수의 층마다 단단한 층을 강요할 수 있게 한다. 비활성화할 " -"수 없음. 당신은 이것을 어떤 값으로도 설정할 수 있다(예: 9999). Slic3r는 노즐 " -"직경과 층 높이에 따라 결합할 최대 가능한 층 수를 자동으로 선택한다." - -#: src/libslic3r/PrintConfig.cpp:1688 -msgid "" -"Set this to a non-zero value to set a manual extrusion width for infill for " -"solid surfaces. If left zero, default extrusion width will be used if set, " -"otherwise 1.125 x nozzle diameter will be used. If expressed as percentage " -"(for example 90%) it will be computed over layer height." -msgstr "" -"이 값을 0이 아닌 값으로 설정하여 솔리드 표면 인필에 대한 수동 압출 폭을 설정" -"하십시오. 0인 경우 기본 압출 너비가 사용되며, 그렇지 않으면 1.125 x 노즐 직경" -"이 사용된다. 백분율(예: 90%)로 표현되는 경우, 계층 높이에 걸쳐 계산된다." - -#: src/libslic3r/PrintConfig.cpp:1698 -msgid "" -"Speed for printing solid regions (top/bottom/internal horizontal shells). " -"This can be expressed as a percentage (for example: 80%) over the default " -"infill speed above. Set to zero for auto." -msgstr "" -"솔리드 영역(상단/하부/내부 수평 셸) 인쇄 속도 이는 위의 기본 주입 속도에 대" -"한 백분율(예: 80%)로 표시할 수 있다. 자동을 위해 0으로 설정한다." - -#: src/libslic3r/PrintConfig.cpp:1710 -msgid "Number of solid layers to generate on top and bottom surfaces." -msgstr "상단 및 하단 표면에 생성할 솔리드 레이어 수입니다." - -#: src/libslic3r/PrintConfig.cpp:1716 -msgid "Spiral vase" -msgstr "스파이럴 바이스" - -#: src/libslic3r/PrintConfig.cpp:1717 -msgid "" -"This feature will raise Z gradually while printing a single-walled object in " -"order to remove any visible seam. This option requires a single perimeter, " -"no infill, no top solid layers and no support material. You can still set " -"any number of bottom solid layers as well as skirt/brim loops. It won't work " -"when printing more than an object." -msgstr "" -"이 기능은 단일 벽 물체를 인쇄하는 동안 눈에 보이는 심을 제거하기 위해 Z를 점" -"진적으로 상승시킨다. 이 옵션은 단일 둘레, 주입, 상단 솔리드 레이어 및 지지 재" -"료가 필요하지 않다. 당신은 스커트/브림 루프뿐만 아니라 아래 솔리드 레이어의 " -"수에 상관없이 설정할 수 있다. 그것은 물체보다 더 많이 인쇄할 때는 작동하지 않" -"을 것이다." - -#: src/libslic3r/PrintConfig.cpp:1725 -msgid "Temperature variation" -msgstr "온도 변화" - -#: src/libslic3r/PrintConfig.cpp:1726 -msgid "" -"Temperature difference to be applied when an extruder is not active. Enables " -"a full-height \"sacrificial\" skirt on which the nozzles are periodically " -"wiped." -msgstr "" -"돌출부가 활성화되지 않은 경우 적용되는 온도 차이. 노즐을 주기적으로 닦는 전" -"체 높이 \"인공\" 스커트가 가능하다." - -#: src/libslic3r/PrintConfig.cpp:1736 -msgid "" -"This start procedure is inserted at the beginning, after bed has reached the " -"target temperature and extruder just started heating, and before extruder " -"has finished heating. If Slic3r detects M104 or M190 in your custom codes, " -"such commands will not be prepended automatically so you're free to " -"customize the order of heating commands and other custom actions. Note that " -"you can use placeholder variables for all Slic3r settings, so you can put a " -"\"M109 S[first_layer_temperature]\" command wherever you want." -msgstr "" -"이 시작 절차는 침대가 목표 온도에 도달하고 압출기가 막 가열을 시작한 직후 및 " -"압출기가 가열을 완료하기 전에 처음에 삽입됩니다. Slic3r이 사용자 지정 코드에" -"서 M104 또는 M190을 감지하면 이러한 명령은 자동으로 추가되지 않으므로 가열 명" -"령 및 기타 사용자 지정 동작의 순서를 자유롭게 사용자 지정할 수 있습니다. 모" -"든 Slic3r 설정에 자리 표시 자 변수를 사용할 수 있으므로 원하는 위치에 \"M109 " -"S [first_layer_temperature]\"명령을 넣을 수 있습니다." - -#: src/libslic3r/PrintConfig.cpp:1751 -msgid "" -"This start procedure is inserted at the beginning, after any printer start " -"gcode. This is used to override settings for a specific filament. If Slic3r " -"detects M104, M109, M140 or M190 in your custom codes, such commands will " -"not be prepended automatically so you're free to customize the order of " -"heating commands and other custom actions. Note that you can use placeholder " -"variables for all Slic3r settings, so you can put a \"M109 " -"S[first_layer_temperature]\" command wherever you want. If you have multiple " -"extruders, the gcode is processed in extruder order." -msgstr "" -"이 시작 절차는 프린터가 gcode를 시작한 후 처음에 삽입됩니다. 특정 필라멘트의 " -"설정을 무시하는 데 사용됩니다. Slic3r이 사용자 지정 코드에서 M104, M109, " -"M140 또는 M190을 감지하면 이러한 명령은 자동으로 추가되지 않으므로 가열 명령 " -"및 기타 사용자 지정 동작의 순서를 자유롭게 사용자 지정할 수 있습니다. 모든 " -"Slic3r 설정에 자리 표시 자 변수를 사용할 수 있으므로 원하는 위치에 \"M109 S " -"[first_layer_temperature]\"명령을 넣을 수 있습니다. 여러 개의 압출기가있는 경" -"우 gcode가 압출기 순서로 처리됩니다." - -#: src/libslic3r/PrintConfig.cpp:1766 -msgid "Single Extruder Multi Material" -msgstr "싱글 익스트루더 멀티메터리얼" - -#: src/libslic3r/PrintConfig.cpp:1767 -msgid "The printer multiplexes filaments into a single hot end." -msgstr "프린터는 필라멘트를 하나의 핫 엔드에 멀티플렉싱합니다." - -#: src/libslic3r/PrintConfig.cpp:1772 -msgid "Prime all printing extruders" -msgstr "모든 인쇄 압출기 프라임" - -#: src/libslic3r/PrintConfig.cpp:1773 -msgid "" -"If enabled, all printing extruders will be primed at the front edge of the " -"print bed at the start of the print." -msgstr "" -"활성화 된 경우, 모든 인쇄 압출기는 인쇄 시작시 프린트 베드의 전면 가장자리에 " -"프라이밍 됩니다." - -#: src/libslic3r/PrintConfig.cpp:1778 -msgid "Generate support material" -msgstr "서포트 재료 생성" - -#: src/libslic3r/PrintConfig.cpp:1780 -msgid "Enable support material generation." -msgstr "서포트 재료를 사용합니다." - -#: src/libslic3r/PrintConfig.cpp:1784 -msgid "Auto generated supports" -msgstr "자동 생성 지원" - -#: src/libslic3r/PrintConfig.cpp:1786 -msgid "" -"If checked, supports will be generated automatically based on the overhang " -"threshold value. If unchecked, supports will be generated inside the " -"\"Support Enforcer\" volumes only." -msgstr "" -"이 옵션을 선택 하면 오버행 임계값에 따라 서포트가 자동으로 생성 됩니다. 이 확" -"인란을 선택 하지 않으면 \"서포트 지원 영역\" 볼륨 내 에서만 지원이 생성 됩니" -"다." - -#: src/libslic3r/PrintConfig.cpp:1792 -msgid "XY separation between an object and its support" -msgstr "물체와 그 서포트 사이 XY 분리" - -#: src/libslic3r/PrintConfig.cpp:1794 -msgid "" -"XY separation between an object and its support. If expressed as percentage " -"(for example 50%), it will be calculated over external perimeter width." -msgstr "" -"객체와 그 서포트 사이의 XY 분리. 백분율 (예 : 50 %)로 표시되는 경우 외부 둘" -"레 너비를 기준으로 계산됩니다." - -#: src/libslic3r/PrintConfig.cpp:1804 -msgid "Pattern angle" -msgstr "채움 각도" - -#: src/libslic3r/PrintConfig.cpp:1806 -msgid "" -"Use this setting to rotate the support material pattern on the horizontal " -"plane." -msgstr "이 설정을 사용하여지지 평면 패턴을 수평면으로 회전시킵니다." - -#: src/libslic3r/PrintConfig.cpp:1816 src/libslic3r/PrintConfig.cpp:2421 -msgid "" -"Only create support if it lies on a build plate. Don't create support on a " -"print." -msgstr "" -"그것이 빌드 플레이트에있는 경우에만 지원을 작성하십시오. 인쇄물에 대한 지원" -"을 작성하지 마십시오." - -#: src/libslic3r/PrintConfig.cpp:1822 -msgid "Contact Z distance" -msgstr "Z 거리 문의" - -#: src/libslic3r/PrintConfig.cpp:1824 -msgid "" -"The vertical distance between object and support material interface. Setting " -"this to 0 will also prevent Slic3r from using bridge flow and speed for the " -"first object layer." -msgstr "" -"물체와 서포트 사이의 수직 거리. 이 값을 0으로 설정하면 Slic3r이 첫 번째 객체 " -"레이어에 브리지 흐름과 속도를 사용하지 못하게됩니다." - -#: src/libslic3r/PrintConfig.cpp:1831 -msgid "soluble" -msgstr "수용성" - -#: src/libslic3r/PrintConfig.cpp:1832 -msgid "detachable" -msgstr "분리 가능" - -#: src/libslic3r/PrintConfig.cpp:1837 -msgid "Enforce support for the first" -msgstr "첫 번째 서포트 더 강화" - -#: src/libslic3r/PrintConfig.cpp:1839 -msgid "" -"Generate support material for the specified number of layers counting from " -"bottom, regardless of whether normal support material is enabled or not and " -"regardless of any angle threshold. This is useful for getting more adhesion " -"of objects having a very thin or poor footprint on the build plate." -msgstr "" -"일반지지 소재의 활성화 여부와 관계없이 각도 임계 값에 관계없이 하단에서부터 " -"세어 지정된 레이어 수에 대한지지 자료를 생성합니다. 이것은 빌드 플레이트에 매" -"우 얇거나 부족한 풋 프린트를 가진 물체를 더 많이 부착 할 때 유용합니다." - -#: src/libslic3r/PrintConfig.cpp:1844 -msgid "Enforce support for the first n layers" -msgstr "첫 번째 n 개의 레이어에 대한 서포트 강화" - -#: src/libslic3r/PrintConfig.cpp:1850 -msgid "Support material/raft/skirt extruder" -msgstr "서포트 재료 / 라프트 / 스커트 익스트루더" - -#: src/libslic3r/PrintConfig.cpp:1852 -msgid "" -"The extruder to use when printing support material, raft and skirt (1+, 0 to " -"use the current extruder to minimize tool changes)." -msgstr "" -"서포트 재료, 라프트 및 스커트를 인쇄 할 때 사용하는 압출기 (도구 변경을 최소" -"화하기 위해 현재 압출기를 사용하려면 1+, 0)." - -#: src/libslic3r/PrintConfig.cpp:1861 -msgid "" -"Set this to a non-zero value to set a manual extrusion width for support " -"material. If left zero, default extrusion width will be used if set, " -"otherwise nozzle diameter will be used. If expressed as percentage (for " -"example 90%) it will be computed over layer height." -msgstr "" -"서포트 재료의 수동 압출 폭을 설정하려면이 값을 0이 아닌 값으로 설정하십시오. " -"0으로 설정하면 설정된 경우 기본 압출 폭이 사용되고 그렇지 않으면 노즐 지름이 " -"사용됩니다. 백분율 (예 : 90 %)로 표현하면 레이어 높이를 기준으로 계산됩니다." - -#: src/libslic3r/PrintConfig.cpp:1869 -msgid "Interface loops" -msgstr "인터페이스 루프" - -#: src/libslic3r/PrintConfig.cpp:1871 -msgid "" -"Cover the top contact layer of the supports with loops. Disabled by default." -msgstr "지지대의 상단 접촉 층을 루프로 덮으십시오. 기본적으로 사용 안 함." - -#: src/libslic3r/PrintConfig.cpp:1876 -msgid "Support material/raft interface extruder" -msgstr "서포트 재료/라프트 인터페이스 익스트루더" - -#: src/libslic3r/PrintConfig.cpp:1878 -msgid "" -"The extruder to use when printing support material interface (1+, 0 to use " -"the current extruder to minimize tool changes). This affects raft too." -msgstr "" -"서포트 재료 인터페이스를 인쇄 할 때 사용할 익스트루더 (도구 변경을 최소화하" -"기 위해 현재 익스트루더를 사용하려면 1+, 0). 이것은 라프트에도 영향을 미칩니" -"다." - -#: src/libslic3r/PrintConfig.cpp:1885 -msgid "Interface layers" -msgstr "인터페이스 레이어" - -#: src/libslic3r/PrintConfig.cpp:1887 -msgid "" -"Number of interface layers to insert between the object(s) and support " -"material." -msgstr "객체와 서포트 재료 사이에 삽입할 인터페이스 레이어 수입니다." - -#: src/libslic3r/PrintConfig.cpp:1894 -msgid "Interface pattern spacing" -msgstr "인터페이스 패턴 간격" - -#: src/libslic3r/PrintConfig.cpp:1896 -msgid "Spacing between interface lines. Set zero to get a solid interface." -msgstr "" -"인터페이스 라인 간 간격. 솔리드 인터페이스를 가져오려면 0을 설정하십시오." - -#: src/libslic3r/PrintConfig.cpp:1905 -msgid "" -"Speed for printing support material interface layers. If expressed as " -"percentage (for example 50%) it will be calculated over support material " -"speed." -msgstr "" -"서포트 재료 인터페이스 레이어 인쇄 속도 백분율(예: 50%)로 표현될 경우 서포트 " -"재료 속도에 따라 계산된다." - -#: src/libslic3r/PrintConfig.cpp:1914 -msgid "Pattern" -msgstr "패턴" - -#: src/libslic3r/PrintConfig.cpp:1916 -msgid "Pattern used to generate support material." -msgstr "서포트 재료를 생성하는 데 사용되는 패턴." - -#: src/libslic3r/PrintConfig.cpp:1922 -msgid "Rectilinear grid" -msgstr "직선 그리드" - -#: src/libslic3r/PrintConfig.cpp:1928 -msgid "Pattern spacing" -msgstr "패턴 간격" - -#: src/libslic3r/PrintConfig.cpp:1930 -msgid "Spacing between support material lines." -msgstr "서포트 재료 라인 사이의 간격." - -#: src/libslic3r/PrintConfig.cpp:1939 -msgid "Speed for printing support material." -msgstr "서포트 재료를 인쇄하는 속도." - -#: src/libslic3r/PrintConfig.cpp:1946 -msgid "Synchronize with object layers" -msgstr "객체 레이어와 동기화" - -#: src/libslic3r/PrintConfig.cpp:1948 -msgid "" -"Synchronize support layers with the object print layers. This is useful with " -"multi-material printers, where the extruder switch is expensive." -msgstr "" -"서포트 레이어를 프린트 레이어와 동기화하십시오. 이것은 스위치가 비싼 멀티 메" -"터리얼 프린터에서 유용하다." - -#: src/libslic3r/PrintConfig.cpp:1954 -msgid "Overhang threshold" -msgstr "오버행 한계점" - -#: src/libslic3r/PrintConfig.cpp:1956 -msgid "" -"Support material will not be generated for overhangs whose slope angle (90° " -"= vertical) is above the given threshold. In other words, this value " -"represent the most horizontal slope (measured from the horizontal plane) " -"that you can print without support material. Set to zero for automatic " -"detection (recommended)." -msgstr "" -"서포트 재료는 경사각(90° = 수직)이 지정된 임계점보다 높은 압출에 대해서는 생" -"성되지 않는다. 즉, 이 값은 서포트 재료 없이 인쇄할 수 있는 가장 수평 경사(수" -"평면에서 측정됨)를 나타낸다. 자동 감지를 위해 0으로 설정하십시오(권장)." - -#: src/libslic3r/PrintConfig.cpp:1968 -msgid "With sheath around the support" -msgstr "서포트 주변이나 외부로" - -#: src/libslic3r/PrintConfig.cpp:1970 -msgid "" -"Add a sheath (a single perimeter line) around the base support. This makes " -"the support more reliable, but also more difficult to remove." -msgstr "" -"기본 서포트 주위에 외장 (단일 주변 선)을 추가하십시오. 이것은 페이스 업을보" -"다 신뢰성있게 만들뿐만 아니라 제거하기도 어렵습니다." - -#: src/libslic3r/PrintConfig.cpp:1977 -msgid "" -"Extruder temperature for layers after the first one. Set this to zero to " -"disable temperature control commands in the output." -msgstr "" -"첫 번째 것 이후에 레이어에 대한 더 낮은 온도. 이 값을 0으로 설정하면 출력에" -"서 ​​온도 제어 명령을 비활성화 할 수 있습니다." - -#: src/libslic3r/PrintConfig.cpp:1979 -msgid "Temperature" -msgstr "온도" - -#: src/libslic3r/PrintConfig.cpp:1985 -msgid "Detect thin walls" -msgstr "얇은 벽(walls) 감지" - -#: src/libslic3r/PrintConfig.cpp:1987 -msgid "" -"Detect single-width walls (parts where two extrusions don't fit and we need " -"to collapse them into a single trace)." -msgstr "싱글 너비 벽 (두 부분이 맞지 않는 부분과 무너지는 부분)을 감지합니다." - -#: src/libslic3r/PrintConfig.cpp:1993 -msgid "Threads" -msgstr "스레드(Threads)" - -#: src/libslic3r/PrintConfig.cpp:1994 -msgid "" -"Threads are used to parallelize long-running tasks. Optimal threads number " -"is slightly above the number of available cores/processors." -msgstr "" -"스레드는 장기 실행 태스크를 병렬 처리하는 데 사용됩니다. 최적의 스레드 수는 " -"사용 가능한 코어 / 프로세서 수보다 약간 높습니다." - -#: src/libslic3r/PrintConfig.cpp:2006 -msgid "" -"This custom code is inserted right before every extruder change. Note that " -"you can use placeholder variables for all Slic3r settings as well as " -"[previous_extruder] and [next_extruder]." -msgstr "" -"이 사용자 정의 코드는 모든 압출기 변경 직전에 삽입됩니다. " -"[previous_extruder] 및 [next_extruder]뿐 아니라 모든 Slic3r 설정에 대해 자리 " -"표시 자 변수를 사용할 수 있습니다." - -#: src/libslic3r/PrintConfig.cpp:2018 -msgid "" -"Set this to a non-zero value to set a manual extrusion width for infill for " -"top surfaces. You may want to use thinner extrudates to fill all narrow " -"regions and get a smoother finish. If left zero, default extrusion width " -"will be used if set, otherwise nozzle diameter will be used. If expressed as " -"percentage (for example 90%) it will be computed over layer height." -msgstr "" -"이 값을 0이 아닌 값으로 설정하여 상단 서피스에 대한 infill의 수동 압출 폭을 " -"설정합니다. 얇은 압출 성형물을 사용하여 모든 좁은 지역을 채우고 더 매끄러운 " -"마무리를 할 수 있습니다. 0으로 설정된 경우 기본 압출 폭이 사용되고 그렇지 않" -"으면 노즐 지름이 사용됩니다. 백분율 (예 : 90 %)로 표현하면 레이어 높이를 기준" -"으로 계산됩니다." - -#: src/libslic3r/PrintConfig.cpp:2029 -msgid "" -"Speed for printing top solid layers (it only applies to the uppermost " -"external layers and not to their internal solid layers). You may want to " -"slow down this to get a nicer surface finish. This can be expressed as a " -"percentage (for example: 80%) over the solid infill speed above. Set to zero " -"for auto." -msgstr "" -"상단 솔리드 레이어 인쇄 속도 (솔리드 레이어가 아닌 최상단 외부 레이어에만 적" -"용) 표면을 더 좋게 마무리하려면 속도를 늦추시기 바랍니다. 이것은 위의 고체 충" -"전 속도에 대한 백분율 (예 : 80 %)로 나타낼 수 있습니다. 자동으로 0으로 설정하" -"십시오." - -#: src/libslic3r/PrintConfig.cpp:2043 -msgid "Number of solid layers to generate on top surfaces." -msgstr "상단 표면에 생성 할 솔리드 레이어 수입니다." - -#: src/libslic3r/PrintConfig.cpp:2044 -msgid "Top solid layers" -msgstr "탑 솔리드 레이어" - -#: src/libslic3r/PrintConfig.cpp:2050 -msgid "Speed for travel moves (jumps between distant extrusion points)." -msgstr "이동 속도 (먼 돌출 점 사이의 점프)." - -#: src/libslic3r/PrintConfig.cpp:2058 -msgid "Use firmware retraction" -msgstr "펌웨어 철회" - -#: src/libslic3r/PrintConfig.cpp:2059 -msgid "" -"This experimental setting uses G10 and G11 commands to have the firmware " -"handle the retraction. This is only supported in recent Marlin." -msgstr "" -"이 실험 설정은 G10 및 G11 명령을 사용하여 펌웨어에서 취소를 처리하도록합니" -"다. 이것은 최근의 말린에서만 지원됩니다." - -#: src/libslic3r/PrintConfig.cpp:2065 -msgid "Use relative E distances" -msgstr "상대적인 E 거리 사용" - -#: src/libslic3r/PrintConfig.cpp:2066 -msgid "" -"If your firmware requires relative E values, check this, otherwise leave it " -"unchecked. Most firmwares use absolute values." -msgstr "" -"펌웨어에 상대 E 값이 필요한 경우이 값을 선택하고, 그렇지 않으면 선택하지 마십" -"시오. 대부분의 회사는 절대 값을 사용합니다." - -#: src/libslic3r/PrintConfig.cpp:2072 -msgid "Use volumetric E" -msgstr "용적 E 사용" - -#: src/libslic3r/PrintConfig.cpp:2073 -msgid "" -"This experimental setting uses outputs the E values in cubic millimeters " -"instead of linear millimeters. If your firmware doesn't already know " -"filament diameter(s), you can put commands like 'M200 D[filament_diameter_0] " -"T0' in your start G-code in order to turn volumetric mode on and use the " -"filament diameter associated to the filament selected in Slic3r. This is " -"only supported in recent Marlin." -msgstr "" -"이 실험 설정은 선형 밀리미터 대신에 입방 밀리미터 단위의 E 값을 출력으로 사용" -"합니다. 펌웨어가 필라멘트 직경을 모르는 경우 볼륨 모드를 켜고 선택한 필라멘트" -"와 연결된 필라멘트 직경을 사용하기 위해 시작 G 코드에 'M200 D " -"[filament_diameter_0] T0'과 같은 명령을 입력 할 수 있습니다 Slic3r. 이것은 최" -"근의 말린에서만 지원됩니다." - -#: src/libslic3r/PrintConfig.cpp:2083 -msgid "Enable variable layer height feature" -msgstr "가변 레이어 높이 기능 사용" - -#: src/libslic3r/PrintConfig.cpp:2084 -msgid "" -"Some printers or printer setups may have difficulties printing with a " -"variable layer height. Enabled by default." -msgstr "" -"일부 프린터 또는 프린터 설정은 가변 레이어 높이로 인쇄하는 데 어려움이있을 " -"수 있습니다. 기본적으로 사용됩니다." - -#: src/libslic3r/PrintConfig.cpp:2090 -msgid "Wipe while retracting" -msgstr "수축시 닦아내십시오" - -#: src/libslic3r/PrintConfig.cpp:2091 -msgid "" -"This flag will move the nozzle while retracting to minimize the possible " -"blob on leaky extruders." -msgstr "" -"이 플래그는 누출된 리트랙싱의 블럽 가능성을 최소화하기 위해 수축하는 동안 노" -"즐을 이동시킨다." - -#: src/libslic3r/PrintConfig.cpp:2098 -msgid "" -"Multi material printers may need to prime or purge extruders on tool " -"changes. Extrude the excess material into the wipe tower." -msgstr "" -"멀티 메터리알 프린터는 공구 교환 시 익스트루더를 프라이밍하거나 제거해야 할 " -"수 있다. 과도한 물질을 와이퍼 타워에 돌출시킨다." - -#: src/libslic3r/PrintConfig.cpp:2104 -msgid "Purging volumes - load/unload volumes" -msgstr "볼륨 삭제 - 볼륨 로드/언로드" - -#: src/libslic3r/PrintConfig.cpp:2105 -msgid "" -"This vector saves required volumes to change from/to each tool used on the " -"wipe tower. These values are used to simplify creation of the full purging " -"volumes below. " -msgstr "" -"이 벡터는 와이퍼 작동 타워에 사용되는 각 공구와 교환하는 데 필요한 볼륨을 저" -"장한다. 이러한 값은 아래 전체 삭제 볼륨 생성을 단순화하기 위해 사용된다. " - -#: src/libslic3r/PrintConfig.cpp:2111 -msgid "Purging volumes - matrix" -msgstr "볼륨 삭제 - 행렬" - -#: src/libslic3r/PrintConfig.cpp:2112 -msgid "" -"This matrix describes volumes (in cubic milimetres) required to purge the " -"new filament on the wipe tower for any given pair of tools. " -msgstr "" -"이 매트릭스는 주어진 공구 쌍에 대해 새 필라멘트를 지우는 데 필요한 볼륨(입방 " -"밀리미터)을 설명한다. " - -#: src/libslic3r/PrintConfig.cpp:2121 -msgid "Position X" -msgstr "X축 위치" - -#: src/libslic3r/PrintConfig.cpp:2122 -msgid "X coordinate of the left front corner of a wipe tower" -msgstr "와이프 타워의 좌측 전면 모서리의 X 좌표" - -#: src/libslic3r/PrintConfig.cpp:2128 -msgid "Position Y" -msgstr "Y축 위치" - -#: src/libslic3r/PrintConfig.cpp:2129 -msgid "Y coordinate of the left front corner of a wipe tower" -msgstr "와이퍼 작동 타워의 좌측 전방 모서리의 Y 좌표" - -#: src/libslic3r/PrintConfig.cpp:2136 -msgid "Width of a wipe tower" -msgstr "와이퍼 타워 폭" - -#: src/libslic3r/PrintConfig.cpp:2142 -msgid "Wipe tower rotation angle" -msgstr "와이퍼 타워 회전각도" - -#: src/libslic3r/PrintConfig.cpp:2143 -msgid "Wipe tower rotation angle with respect to x-axis " -msgstr "X 축에 대한 와이퍼 타워 각도 " - -#: src/libslic3r/PrintConfig.cpp:2144 src/libslic3r/PrintConfig.cpp:2565 -msgid "degrees" -msgstr "각도" - -#: src/libslic3r/PrintConfig.cpp:2150 -msgid "Wipe into this object's infill" -msgstr "이 오브젝트의 채우기로 지우기" - -#: src/libslic3r/PrintConfig.cpp:2151 -msgid "" -"Purging after toolchange will done inside this object's infills. This lowers " -"the amount of waste but may result in longer print time due to additional " -"travel moves." -msgstr "" -"도구 변경 후 제거는 이 개체의 채우기 내부에서 수행 됩니다. 이렇게 하면 낭비 " -"되는 양이 줄어들지만 추가적인 이동으로 인해 인쇄 시간이 길어질 수 있습니다." - -#: src/libslic3r/PrintConfig.cpp:2158 -msgid "Wipe into this object" -msgstr "이 개체로 지우기" - -#: src/libslic3r/PrintConfig.cpp:2159 -msgid "" -"Object will be used to purge the nozzle after a toolchange to save material " -"that would otherwise end up in the wipe tower and decrease print time. " -"Colours of the objects will be mixed as a result." -msgstr "" -"객체는 도구 변경 후 노즐을 소거 하는 데 사용 되며, 그렇지 않으면 와이프 타워" -"에서 종료 되는 재료를 저장 하고 인쇄 시간을 줄입니다. 그 결과 개체의 색상이 " -"혼합 됩니다." - -#: src/libslic3r/PrintConfig.cpp:2165 -msgid "Maximal bridging distance" -msgstr "최대 브리징 거리" - -#: src/libslic3r/PrintConfig.cpp:2166 -msgid "Maximal distance between supports on sparse infill sections. " -msgstr "드문드문하 인필 섹션에서 지지대 사이의 최대 거리. " - -#: src/libslic3r/PrintConfig.cpp:2172 -msgid "XY Size Compensation" -msgstr "XY 크기 보정" - -#: src/libslic3r/PrintConfig.cpp:2174 -msgid "" -"The object will be grown/shrunk in the XY plane by the configured value " -"(negative = inwards, positive = outwards). This might be useful for fine-" -"tuning hole sizes." -msgstr "" -"XY 평면에서 설정된 값(음수 = 안, 양 = 바깥쪽)에 따라 객체가 증가/정격된다. 이" -"는 구멍 크기를 미세 조정하는데 유용할 수 있다." - -#: src/libslic3r/PrintConfig.cpp:2182 -msgid "Z offset" -msgstr "Z 오프셋" - -#: src/libslic3r/PrintConfig.cpp:2183 -msgid "" -"This value will be added (or subtracted) from all the Z coordinates in the " -"output G-code. It is used to compensate for bad Z endstop position: for " -"example, if your endstop zero actually leaves the nozzle 0.3mm far from the " -"print bed, set this to -0.3 (or fix your endstop)." -msgstr "" -"이 값은 출력 G-코드의 모든 Z 좌표에서 추가(또는 감산)된다. 예를 들어, 엔드 스" -"톱 0이 실제로 노즐을 프린트 베드에서 0.3mm 떨어진 곳에 둔 경우, 이를 -0.3(또" -"는 엔드 스톱을 고정)으로 설정하십시오." - -#: src/libslic3r/PrintConfig.cpp:2200 -msgid "Display width" -msgstr "디스플레이 너비" - -#: src/libslic3r/PrintConfig.cpp:2201 -msgid "Width of the display" -msgstr "디스플레이의 폭입니다" - -#: src/libslic3r/PrintConfig.cpp:2206 -msgid "Display height" -msgstr "표시 높이" - -#: src/libslic3r/PrintConfig.cpp:2207 -msgid "Height of the display" -msgstr "디스플레이의 높이" - -#: src/libslic3r/PrintConfig.cpp:2212 -msgid "Number of pixels in" -msgstr "의 픽셀 수" - -#: src/libslic3r/PrintConfig.cpp:2214 -msgid "Number of pixels in X" -msgstr "X의 픽셀 수" - -#: src/libslic3r/PrintConfig.cpp:2220 -msgid "Number of pixels in Y" -msgstr "Y의 픽셀 수" - -#: src/libslic3r/PrintConfig.cpp:2225 -msgid "Display orientation" -msgstr "디스플레이 방향" - -#: src/libslic3r/PrintConfig.cpp:2226 -msgid "" -"Set the actual LCD display orientation inside the SLA printer. Portrait mode " -"will flip the meaning of display width and height parameters and the output " -"images will be rotated by 90 degrees." -msgstr "" -"SLA 프린터 내에서 실제 LCD 디스플레이 방향을 설정 합니다. 세로 모드는 디스플" -"레이 너비 및 높이 매개 변수의 의미를 반전 하 고 출력 이미지는 90도 회전 합니" -"다." - -#: src/libslic3r/PrintConfig.cpp:2232 -msgid "Landscape" -msgstr "가로" - -#: src/libslic3r/PrintConfig.cpp:2233 -msgid "Portrait" -msgstr "세로모드" - -#: src/libslic3r/PrintConfig.cpp:2238 -msgid "Fast" -msgstr "빠른" - -#: src/libslic3r/PrintConfig.cpp:2239 -msgid "Fast tilt" -msgstr "빠른 기울기" - -#: src/libslic3r/PrintConfig.cpp:2240 -msgid "Time of the fast tilt" -msgstr "기울이기 시간" - -#: src/libslic3r/PrintConfig.cpp:2247 -msgid "Slow" -msgstr "느리게" - -#: src/libslic3r/PrintConfig.cpp:2248 -msgid "Slow tilt" -msgstr "슬로우 틸트" - -#: src/libslic3r/PrintConfig.cpp:2249 -msgid "Time of the slow tilt" -msgstr "느린 기울기의 시간" - -#: src/libslic3r/PrintConfig.cpp:2256 -msgid "Area fill" -msgstr "영역 채우기" - -#: src/libslic3r/PrintConfig.cpp:2257 -msgid "" -"The percentage of the bed area. \n" -"If the print area exceeds the specified value, \n" -"then a slow tilt will be used, otherwise - a fast tilt" -msgstr "" -"침대 영역의 비율입니다. \n" -"인쇄 영역이 지정 된 값을 초과 하면 \n" -"그런 다음 느린 기울기가 사용 됩니다, 그렇지 않으면-빠른 기울기가 됩니다" - -#: src/libslic3r/PrintConfig.cpp:2264 src/libslic3r/PrintConfig.cpp:2265 -#: src/libslic3r/PrintConfig.cpp:2266 -msgid "Printer scaling correction" -msgstr "프린터 스케일링 보정" - -#: src/libslic3r/PrintConfig.cpp:2272 src/libslic3r/PrintConfig.cpp:2273 -msgid "Printer absolute correction" -msgstr "프린터 절대 보정" - -#: src/libslic3r/PrintConfig.cpp:2274 -msgid "" -"Will inflate or deflate the sliced 2D polygons according to the sign of the " -"correction." -msgstr "교정 기호에 따라 슬라이스된 2D 폴리곤을 팽창 하거나 수축 합니다." - -#: src/libslic3r/PrintConfig.cpp:2280 src/libslic3r/PrintConfig.cpp:2281 -msgid "Printer gamma correction" -msgstr "프린터 감마 보정" - -#: src/libslic3r/PrintConfig.cpp:2282 -msgid "This will apply a gamm correction to the rasterized 2D polygons." -msgstr "그러면 래스터화된 2d 다각형 폴리고 보정이 적용 됩니다." - -#: src/libslic3r/PrintConfig.cpp:2291 src/libslic3r/PrintConfig.cpp:2292 -msgid "Initial layer height" -msgstr "초기 레이어 높이" - -#: src/libslic3r/PrintConfig.cpp:2298 -msgid "Faded layers" -msgstr "페이드 레이어" - -#: src/libslic3r/PrintConfig.cpp:2299 -msgid "" -"Number of the layers needed for the exposure time fade from initial exposure " -"time to the exposure time" -msgstr "노출 시간에 필요한 레이어 수는 초기 노출 시간에서 노출 시간으로 페이드" - -#: src/libslic3r/PrintConfig.cpp:2306 src/libslic3r/PrintConfig.cpp:2307 -msgid "Exposure time" -msgstr "노출 시간" - -#: src/libslic3r/PrintConfig.cpp:2313 src/libslic3r/PrintConfig.cpp:2314 -msgid "Initial exposure time" -msgstr "초기 노출 시간" - -#: src/libslic3r/PrintConfig.cpp:2320 src/libslic3r/PrintConfig.cpp:2321 -msgid "Correction for expansion" -msgstr "확장 보정" - -#: src/libslic3r/PrintConfig.cpp:2327 -msgid "SLA print material notes" -msgstr "SLA 인쇄 재료 참고 사항" - -#: src/libslic3r/PrintConfig.cpp:2328 -msgid "You can put your notes regarding the SLA print material here." -msgstr "여기에서 SLA 인쇄 자료에 대한 메모를 넣을 수 있습니다." - -#: src/libslic3r/PrintConfig.cpp:2336 src/libslic3r/PrintConfig.cpp:2347 -msgid "Default SLA material profile" -msgstr "기본 SLA 재질 프로 파일" - -#: src/libslic3r/PrintConfig.cpp:2358 -msgid "Generate supports" -msgstr "지원 생성" - -#: src/libslic3r/PrintConfig.cpp:2360 -msgid "Generate supports for the models" -msgstr "모델에 대한 지원 생성" - -#: src/libslic3r/PrintConfig.cpp:2365 -msgid "Support head front diameter" -msgstr "서포트 헤드 전면 지름" - -#: src/libslic3r/PrintConfig.cpp:2367 -msgid "Diameter of the pointing side of the head" -msgstr "헤드 포인팅 측면 지름" - -#: src/libslic3r/PrintConfig.cpp:2374 -msgid "Support head penetration" -msgstr "서포트 헤드 관통" - -#: src/libslic3r/PrintConfig.cpp:2376 -msgid "How much the pinhead has to penetrate the model surface" -msgstr "핀 헤드가 모델 표면에 침투 하는 정도" - -#: src/libslic3r/PrintConfig.cpp:2383 -msgid "Support head width" -msgstr "서포트 헤드 폭" - -#: src/libslic3r/PrintConfig.cpp:2385 -msgid "Width from the back sphere center to the front sphere center" -msgstr "뒤쪽 구 중심에서 앞쪽 구 중심 까지의 폭입니다" - -#: src/libslic3r/PrintConfig.cpp:2393 -msgid "Support pillar diameter" -msgstr "서포트 기둥 지름" - -#: src/libslic3r/PrintConfig.cpp:2395 -msgid "Diameter in mm of the support pillars" -msgstr "서포트 기둥의 지름 (mm)" - -#: src/libslic3r/PrintConfig.cpp:2403 -msgid "Support pillar connection mode" -msgstr "기둥 연결 모드 지원" - -#: src/libslic3r/PrintConfig.cpp:2404 -msgid "" -"Controls the bridge type between two neigboring pillars. Can be zig-zag, " -"cross (double zig-zag) or dynamic which will automatically switch between " -"the first two depending on the distance of the two pillars." -msgstr "" -"두 개의 neigboring 기둥 사이의 브릿지 유형을 제어 합니다. 두 기둥의 거리에 따" -"라 자동으로 처음 두 사이를 전환 하는 지그재그, 크로스 (지그재그 더블 지그재" -"그) 또는 동적 수 있습니다." - -#: src/libslic3r/PrintConfig.cpp:2412 -msgid "Zig-Zag" -msgstr "지그재그" - -#: src/libslic3r/PrintConfig.cpp:2413 -msgid "Cross" -msgstr "크로스" - -#: src/libslic3r/PrintConfig.cpp:2414 -msgid "Dynamic" -msgstr "동적" - -#: src/libslic3r/PrintConfig.cpp:2426 -msgid "Pillar widening factor" -msgstr "기둥 확장 계수" - -#: src/libslic3r/PrintConfig.cpp:2428 -msgid "" -"Merging bridges or pillars into another pillars can increase the radius. " -"Zero means no increase, one means full increase." -msgstr "" -"브릿지 또는 기둥을 다른 기둥에 병합 하면 반지름을 늘릴 수 있습니다. 0은 증가 " -"없음을 의미 하나는 전체 증가를 의미 합니다." - -#: src/libslic3r/PrintConfig.cpp:2437 -msgid "Support base diameter" -msgstr "서포트 베이스 지름" - -#: src/libslic3r/PrintConfig.cpp:2439 -msgid "Diameter in mm of the pillar base" -msgstr "기둥 베이스의 mm 직경" - -#: src/libslic3r/PrintConfig.cpp:2447 -msgid "Support base height" -msgstr "서포트 기준 높이" - -#: src/libslic3r/PrintConfig.cpp:2449 -msgid "The height of the pillar base cone" -msgstr "서포트 베이스 원추의 높이" - -#: src/libslic3r/PrintConfig.cpp:2456 -msgid "Critical angle" -msgstr "임계 각도" - -#: src/libslic3r/PrintConfig.cpp:2458 -msgid "The default angle for connecting support sticks and junctions." -msgstr "서포트 스틱과 접합부를 연결 하는 기본 각도입니다." - -#: src/libslic3r/PrintConfig.cpp:2466 -msgid "Max bridge length" -msgstr "최대 브리지 길이" - -#: src/libslic3r/PrintConfig.cpp:2468 -msgid "The max length of a bridge" -msgstr "브릿지의 최대 길이" - -#: src/libslic3r/PrintConfig.cpp:2475 -msgid "Max pillar linking distance" -msgstr "최대 기둥 연결 거리" - -#: src/libslic3r/PrintConfig.cpp:2477 -msgid "" -"The max distance of two pillars to get linked with each other. A zero value " -"will prohibit pillar cascading." -msgstr "" -"서로 연결 되는 두기둥의 최대 거리. 0 값은 기둥을 계단식으로 금지 합니다." - -#: src/libslic3r/PrintConfig.cpp:2485 -msgid "Object elevation" -msgstr "객체 고도" - -#: src/libslic3r/PrintConfig.cpp:2487 -msgid "How much the supports should lift up the supported object." -msgstr "서포트 되는 개체를 서포트 해야 하는 정도입니다." - -#: src/libslic3r/PrintConfig.cpp:2495 -msgid "Support points density" -msgstr "지원 포인트 밀도" - -#: src/libslic3r/PrintConfig.cpp:2497 -msgid "This is a relative measure of support points density." -msgstr "이는 서포트 점 밀도의 상대적인 척도입니다." - -#: src/libslic3r/PrintConfig.cpp:2503 -msgid "Minimal distance of the support points" -msgstr "서포트 지점의 최소 거리" - -#: src/libslic3r/PrintConfig.cpp:2505 -msgid "No support points will be placed closer than this threshold." -msgstr "서포트 지점은 이 임계값 보다 더 가깝게 배치 되지 않습니다." - -#: src/libslic3r/PrintConfig.cpp:2511 -msgid "Use pad" -msgstr "패드 사용" - -#: src/libslic3r/PrintConfig.cpp:2513 -msgid "Add a pad underneath the supported model" -msgstr "서포트 되는 모델 아래에 패드 추가" - -#: src/libslic3r/PrintConfig.cpp:2518 -msgid "Pad wall thickness" -msgstr "패드 벽 두께" - -#: src/libslic3r/PrintConfig.cpp:2520 -msgid "The thickness of the pad and its optional cavity walls." -msgstr "패드의 두께와 옵션 캐비티 벽." - -#: src/libslic3r/PrintConfig.cpp:2528 -msgid "Pad wall height" -msgstr "패드 벽 높이" - -#: src/libslic3r/PrintConfig.cpp:2529 -msgid "Defines the cavity depth. Set to zero to disable the cavity." -msgstr "캐비티 깊이를 정의 합니다. 캐비티를 비활성화 하려면 0으로 설정 합니다." - -#: src/libslic3r/PrintConfig.cpp:2539 -msgid "Max merge distance" -msgstr "최대 병합 거리" - -#: src/libslic3r/PrintConfig.cpp:2541 -msgid "" -"Some objects can get along with a few smaller pads instead of a single big " -"one. This parameter defines how far the center of two smaller pads should " -"be. If theyare closer, they will get merged into one pad." -msgstr "" -"일부 개체는 큰 하나 대신 몇 가지 작은 패드와 함께 얻을 수 있습니다. 이 매개 " -"변수는 두 개의 작은 패드의 중심이 얼마나 되어야 하는지 정의 합니다. 그들은 하" -"나의 패드에 병합을 얻을 것이다." - -#: src/libslic3r/PrintConfig.cpp:2552 -msgid "Pad edge radius" -msgstr "패드 가장자리 반경" - -#: src/libslic3r/PrintConfig.cpp:2561 -msgid "Pad wall slope" -msgstr "패드 벽 경사" - -#: src/libslic3r/PrintConfig.cpp:2563 -msgid "" -"The slope of the pad wall relative to the bed plane. 90 degrees means " -"straight walls." -msgstr "" -"침대 평면을 기준으로 하는 패드 벽의 기울기입니다. 90도는 직선 벽을 의미 합니" -"다." - -#: src/libslic3r/PrintConfig.cpp:2924 -msgid "Export SVG" -msgstr "내보내기 SVG" - -#: src/libslic3r/PrintConfig.cpp:2925 -msgid "Export the model(s) as OBJ." -msgstr "모델을 OBJ로 내보냅니다." - -#: src/libslic3r/PrintConfig.cpp:2936 -msgid "Export SLA" -msgstr "STL로 내보내기" - -#: src/libslic3r/PrintConfig.cpp:2937 -msgid "Slice the model and export SLA printing layers as PNG." -msgstr "모델을 분할하고 SLA 인쇄 레이어를 PNG로 내보냅니다." - -#: src/libslic3r/PrintConfig.cpp:2942 -msgid "Export 3MF" -msgstr "3MF 내보내기" - -#: src/libslic3r/PrintConfig.cpp:2943 -msgid "Export the model(s) as 3MF." -msgstr "모델을 3MF로 내보냅니다." - -#: src/libslic3r/PrintConfig.cpp:2947 -msgid "Export AMF" -msgstr "AMF 내보내기" - -#: src/libslic3r/PrintConfig.cpp:2948 -msgid "Export the model(s) as AMF." -msgstr "모델을 AMF로 내보냅니다." - -#: src/libslic3r/PrintConfig.cpp:2952 -msgid "Export STL" -msgstr "STL 내보내기" - -#: src/libslic3r/PrintConfig.cpp:2953 -msgid "Export the model(s) as STL." -msgstr "모델을 STL로 내보냅니다." - -#: src/libslic3r/PrintConfig.cpp:2958 -msgid "Slice the model and export toolpaths as G-code." -msgstr "모델을 슬라이스하고 공구 경로를 G 코드로 내보냅니다." - -#: src/libslic3r/PrintConfig.cpp:2963 -msgid "Slice" -msgstr "슬라이스" - -#: src/libslic3r/PrintConfig.cpp:2964 -msgid "" -"Slice the model as FFF or SLA based on the printer_technology configuration " -"value." -msgstr "" -"Printer_technology 구성 값을 기반으로 모델을 FFF 또는 SLA로 조각화 합니다." - -#: src/libslic3r/PrintConfig.cpp:2969 -msgid "Help" -msgstr "도움말" - -#: src/libslic3r/PrintConfig.cpp:2970 -msgid "Show this help." -msgstr "이 도움말을 표시 합니다." - -#: src/libslic3r/PrintConfig.cpp:2975 -msgid "Help (FFF options)" -msgstr "도움말 (FFF 옵션)" - -#: src/libslic3r/PrintConfig.cpp:2976 -msgid "Show the full list of print/G-code configuration options." -msgstr "인쇄/G 코드 구성 옵션의 전체 목록을 표시 합니다." - -#: src/libslic3r/PrintConfig.cpp:2980 -msgid "Help (SLA options)" -msgstr "도움말 (SLA 옵션)" - -#: src/libslic3r/PrintConfig.cpp:2981 -msgid "Show the full list of SLA print configuration options." -msgstr "SLA 인쇄 구성 옵션의 전체 목록을 표시 합니다." - -#: src/libslic3r/PrintConfig.cpp:2985 -msgid "Output Model Info" -msgstr "출력 모델 정보" - -#: src/libslic3r/PrintConfig.cpp:2986 -msgid "Write information about the model to the console." -msgstr "모델에 대한 정보를 콘솔에 씁니다." - -#: src/libslic3r/PrintConfig.cpp:2990 -msgid "Save config file" -msgstr "구성 파일 저장" - -#: src/libslic3r/PrintConfig.cpp:2991 -msgid "Save configuration to the specified file." -msgstr "지정 된 파일에 구성을 저장 합니다." - -#: src/libslic3r/PrintConfig.cpp:3001 -msgid "Align XY" -msgstr "XY 정렬" - -#: src/libslic3r/PrintConfig.cpp:3002 -msgid "Align the model to the given point." -msgstr "모델을 지정된 점에 맞춥니다." - -#: src/libslic3r/PrintConfig.cpp:3007 -msgid "Cut model at the given Z." -msgstr "지정된 Z에서 모델을 잘라냅니다." - -#: src/libslic3r/PrintConfig.cpp:3028 -msgid "Center" -msgstr "중앙" - -#: src/libslic3r/PrintConfig.cpp:3029 -msgid "Center the print around the given center." -msgstr "지정된 중심을 중심으로 인쇄 합니다." - -#: src/libslic3r/PrintConfig.cpp:3033 -msgid "Don't arrange" -msgstr "준비하지 마십시오" - -#: src/libslic3r/PrintConfig.cpp:3034 -msgid "" -"Do not rearrange the given models before merging and keep their original XY " -"coordinates." -msgstr "" -"병합하기 전에 지정된 모델을 재정렬하고 원래 XY 좌표를 유지하지 마십시오." - -#: src/libslic3r/PrintConfig.cpp:3037 -msgid "Duplicate" -msgstr "복사" - -#: src/libslic3r/PrintConfig.cpp:3038 -msgid "Multiply copies by this factor." -msgstr "이 계수로 복사본을 곱합니다." - -#: src/libslic3r/PrintConfig.cpp:3042 -msgid "Duplicate by grid" -msgstr "모눈에 따라 복제" - -#: src/libslic3r/PrintConfig.cpp:3043 -msgid "Multiply copies by creating a grid." -msgstr "격자를 만들어 복사본을 곱합니다." - -#: src/libslic3r/PrintConfig.cpp:3046 -msgid "Merge" -msgstr "병합" - -#: src/libslic3r/PrintConfig.cpp:3047 -msgid "" -"Arrange the supplied models in a plate and merge them in a single model in " -"order to perform actions once." -msgstr "" -"한 번 작업을 수행하기 위해 제공 된 모델을 정렬하고 단일 모델로 병합 합니다." - -#: src/libslic3r/PrintConfig.cpp:3052 -msgid "" -"Try to repair any non-manifold meshes (this option is implicitly added " -"whenever we need to slice the model to perform the requested action)." -msgstr "" -"비 다양체 메쉬를 복구 하십시오 (요청 된 작업을 수행 하기 위해 모델을 슬라이" -"스 해야 할때마다 이 옵션이 암시적으로 추가 됨)." - -#: src/libslic3r/PrintConfig.cpp:3056 -msgid "Rotation angle around the Z axis in degrees." -msgstr "Z 축 주위의 회전 각도입니다." - -#: src/libslic3r/PrintConfig.cpp:3060 -msgid "Rotate around X" -msgstr "X 주위 회전" - -#: src/libslic3r/PrintConfig.cpp:3061 -msgid "Rotation angle around the X axis in degrees." -msgstr "X 축을 중심으로 회전 각도 (도)입니다." - -#: src/libslic3r/PrintConfig.cpp:3065 -msgid "Rotate around Y" -msgstr "Y 주위로 회전" - -#: src/libslic3r/PrintConfig.cpp:3066 -msgid "Rotation angle around the Y axis in degrees." -msgstr "Y 축을 중심으로 회전 각도 (도)입니다." - -#: src/libslic3r/PrintConfig.cpp:3071 -msgid "Scaling factor or percentage." -msgstr "배율 인수 또는 백분율입니다." - -#: src/libslic3r/PrintConfig.cpp:3076 -msgid "" -"Detect unconnected parts in the given model(s) and split them into separate " -"objects." -msgstr "" -"지정 된 모델에서 연결 되지 않은 부품을 감지 하 여 별도의 객체로 분할 합니다." - -#: src/libslic3r/PrintConfig.cpp:3079 -msgid "Scale to Fit" -msgstr "크기에 맞게 조정" - -#: src/libslic3r/PrintConfig.cpp:3080 -msgid "Scale to fit the given volume." -msgstr "지정 된 볼륨에 맞게 크기를 조정 합니다." - -#: src/libslic3r/PrintConfig.cpp:3089 -msgid "Ignore non-existent config files" -msgstr "존재 하지 않는 구성 파일 무시" - -#: src/libslic3r/PrintConfig.cpp:3090 -msgid "Do not fail if a file supplied to --load does not exist." -msgstr "로드에 제공 된 파일이 없는 경우 실패 하지 않습니다." - -#: src/libslic3r/PrintConfig.cpp:3093 -msgid "Load config file" -msgstr "구성 파일 로드" - -#: src/libslic3r/PrintConfig.cpp:3094 -msgid "" -"Load configuration from the specified file. It can be used more than once to " -"load options from multiple files." -msgstr "" -"지정 된 파일에서 구성을 로드 합니다. 여러 파일에서 옵션을 로드 하는 데 두 번 " -"이상 사용할 수 있습니다." - -#: src/libslic3r/PrintConfig.cpp:3097 -msgid "Output File" -msgstr "출력파일" - -#: src/libslic3r/PrintConfig.cpp:3098 -msgid "" -"The file where the output will be written (if not specified, it will be " -"based on the input file)." -msgstr "" -"출력이 기록 되는 파일 (지정 하지 않은 경우 입력 파일을 기반으로 합니다)." - -#: src/libslic3r/PrintConfig.cpp:3108 -msgid "Data directory" -msgstr "데이터 디렉터리" - -#: src/libslic3r/PrintConfig.cpp:3109 -msgid "" -"Load and store settings at the given directory. This is useful for " -"maintaining different profiles or including configurations from a network " -"storage." -msgstr "" -"지정 된 디렉터리에 설정을 로드 하 고 저장 합니다. 이 기능은 다른 프로 파일을 " -"유지 관리 하거나 네트워크 스토리지의 구성을 포함 하는 데 유용 합니다." - -#: src/libslic3r/PrintConfig.cpp:3112 -msgid "Logging level" -msgstr "로깅 수준" - -#: src/libslic3r/PrintConfig.cpp:3113 -msgid "" -"Messages with severity lower or eqal to the loglevel will be printed out. 0:" -"trace, 1:debug, 2:info, 3:warning, 4:error, 5:fatal" -msgstr "" -"심각도가 낮은 또는 eqal로 loglevel으로 메시지가 인쇄 됩니다. 추적, 1: 디버" -"그, 2: 경고, 오류 5: 치명적" - -#: src/libslic3r/GCode/PreviewData.cpp:176 -msgid "Mixed" -msgstr "뒤석음" - -#: src/libslic3r/GCode/PreviewData.cpp:396 -msgid "Height (mm)" -msgstr "높이 (mm)" - -#: src/libslic3r/GCode/PreviewData.cpp:398 -msgid "Width (mm)" -msgstr "폭 (mm)" - -#: src/libslic3r/GCode/PreviewData.cpp:400 -msgid "Speed (mm/s)" -msgstr "속도 (mm/s)" - -#: src/libslic3r/GCode/PreviewData.cpp:402 -msgid "Volumetric flow rate (mm3/s)" -msgstr "용적 유량값 (mm3/s)" - -#: src/libslic3r/GCode/PreviewData.cpp:491 -msgid "Default print color" -msgstr "기본 인쇄 색상" - -#: src/libslic3r/GCode/PreviewData.cpp:495 -#, c-format -msgid "up to %.2f mm" -msgstr "최대%.2f mm" - -#: src/libslic3r/GCode/PreviewData.cpp:499 -#, c-format -msgid "above %.2f mm" -msgstr "above %.2f mm" - -#: src/libslic3r/GCode/PreviewData.cpp:504 -#, c-format -msgid "%.2f - %.2f mm" -msgstr "%.2f - %.2f mm" From 81b85f5827929a23698cfe930f070dcddb6ecd91 Mon Sep 17 00:00:00 2001 From: lee hakmin Date: Fri, 23 Aug 2019 23:53:05 +0900 Subject: [PATCH 010/336] Add files via upload --- resources/localization/ko_KR/PrusaSlicer.mo | Bin 0 -> 214548 bytes resources/localization/ko_KR/PrusaSlicer.po | 8976 +++++++++++++++++++ 2 files changed, 8976 insertions(+) create mode 100644 resources/localization/ko_KR/PrusaSlicer.mo create mode 100644 resources/localization/ko_KR/PrusaSlicer.po diff --git a/resources/localization/ko_KR/PrusaSlicer.mo b/resources/localization/ko_KR/PrusaSlicer.mo new file mode 100644 index 0000000000000000000000000000000000000000..6c539b6979848fd1e2ecfc052784271c396d4d38 GIT binary patch literal 214548 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\n" +"Language-Team: ulsanether\n" +"Language: ko_KR\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.2.3\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Crowdin-Project: slic3rkorean\n" +"X-Crowdin-Language: ko\n" +"X-Crowdin-File: ko_KR.po\n" + +#: src/slic3r/GUI/AboutDialog.cpp:39 src/slic3r/GUI/AboutDialog.cpp:289 +msgid "Portions copyright" +msgstr "다른 저작권" + +#: src/slic3r/GUI/AboutDialog.cpp:125 src/slic3r/GUI/AboutDialog.cpp:254 +msgid "Copyright" +msgstr "저작권" + +#. TRN "Slic3r _is licensed under the_ License" +#: src/slic3r/GUI/AboutDialog.cpp:127 +msgid "" +"License agreements of all following programs (libraries) are part of " +"application license agreement" +msgstr "" +"다음의 모든 프로그램 (라이브러리)의 라이센스 계약은 응용 프로그램 라이센스 계" +"약의 일부입니다." + +#: src/slic3r/GUI/AboutDialog.cpp:197 +#, c-format +msgid "About %s" +msgstr "%s에 대하여" + +#: src/slic3r/GUI/AboutDialog.cpp:229 src/slic3r/GUI/MainFrame.cpp:60 +msgid "Version" +msgstr "버전" + +#. TRN "Slic3r _is licensed under the_ License" +#: src/slic3r/GUI/AboutDialog.cpp:256 +msgid "is licensed under the" +msgstr "라이선스는" + +#: src/slic3r/GUI/AboutDialog.cpp:257 +msgid "GNU Affero General Public License, version 3" +msgstr "GNU Affero 일반 공중 사용 허가서, 버전 3" + +#: src/slic3r/GUI/AboutDialog.cpp:258 +msgid "" +"PrusaSlicer is based on Slic3r by Alessandro Ranellucci and the RepRap " +"community." +msgstr "" +"프루사슬라이서는 알레산드로 라넬루치와 RepRap 커뮤니티 Slic3r를 기반으로합니" +"다." + +#: src/slic3r/GUI/AboutDialog.cpp:259 +msgid "" +"Contributions by Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, " +"Petr Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik and " +"numerous others." +msgstr "" +"Contributions by Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, " +"Petr Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik and " +"numerous others. 한국어 번역 울산에테르." + +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:92 +msgid "" +"Copying of the temporary G-code to the output G-code failed. Maybe the SD " +"card is write locked?" +msgstr "" +"임시 G-코드를 출력할 SD카드에 복사하는 데 실패했습니다. SD카드의 락을 확인 하" +"시오." + +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:93 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:406 +msgid "Running post-processing scripts" +msgstr "포스트 프로세싱 스크립트" + +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:95 +msgid "G-code file exported to %1%" +msgstr "%1%로 내보낸 G 코드 파일" + +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:99 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:117 +msgid "Slicing complete" +msgstr "슬라이스 완료" + +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:113 +msgid "Masked SLA file exported to %1%" +msgstr "마스크 된 SLA 파일을 %1%로 내보냅니" + +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:408 +msgid "Copying of the temporary G-code to the output G-code failed" +msgstr "임시 G 코드를 출력 G 코드에 복사 하지 못했습니다" + +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:417 +msgid "Scheduling upload to `%1%`. See Window -> Print Host Upload Queue" +msgstr "" +"`%1%`. 로 업로드를 예약 합니다. 창-> 인쇄 호스트 업로드 대기열을 참조 하십시" +"오" + +#: src/slic3r/GUI/BedShapeDialog.cpp:65 +msgid "Shape" +msgstr "모양" + +#: src/slic3r/GUI/BedShapeDialog.cpp:72 +msgid "Rectangular" +msgstr "직사각형" + +#: src/slic3r/GUI/BedShapeDialog.cpp:76 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:391 src/slic3r/GUI/Plater.cpp:145 +#: src/slic3r/GUI/Tab.cpp:2469 +msgid "Size" +msgstr "사이즈" + +#: src/slic3r/GUI/BedShapeDialog.cpp:77 +msgid "Size in X and Y of the rectangular plate." +msgstr "사격형 플레이트 X 및 Y 크기." + +#: src/slic3r/GUI/BedShapeDialog.cpp:83 +msgid "Origin" +msgstr "원본" + +#: src/slic3r/GUI/BedShapeDialog.cpp:84 +msgid "" +"Distance of the 0,0 G-code coordinate from the front left corner of the " +"rectangle." +msgstr "사각형의 전면 왼쪽된 모서리에서 0, 0 G-코드 좌표 거리입니다." + +#: src/slic3r/GUI/BedShapeDialog.cpp:88 +msgid "Circular" +msgstr "원형" + +#: src/slic3r/GUI/BedShapeDialog.cpp:91 src/slic3r/GUI/ConfigWizard.cpp:118 +#: src/slic3r/GUI/ConfigWizard.cpp:571 src/slic3r/GUI/ConfigWizard.cpp:585 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:388 +#: src/slic3r/GUI/WipeTowerDialog.cpp:84 src/slic3r/GUI/wxExtensions.cpp:486 +#: src/libslic3r/PrintConfig.cpp:70 src/libslic3r/PrintConfig.cpp:77 +#: src/libslic3r/PrintConfig.cpp:86 src/libslic3r/PrintConfig.cpp:220 +#: src/libslic3r/PrintConfig.cpp:295 src/libslic3r/PrintConfig.cpp:303 +#: src/libslic3r/PrintConfig.cpp:353 src/libslic3r/PrintConfig.cpp:363 +#: src/libslic3r/PrintConfig.cpp:488 src/libslic3r/PrintConfig.cpp:499 +#: src/libslic3r/PrintConfig.cpp:517 src/libslic3r/PrintConfig.cpp:695 +#: src/libslic3r/PrintConfig.cpp:1215 src/libslic3r/PrintConfig.cpp:1276 +#: src/libslic3r/PrintConfig.cpp:1294 src/libslic3r/PrintConfig.cpp:1312 +#: src/libslic3r/PrintConfig.cpp:1364 src/libslic3r/PrintConfig.cpp:1374 +#: src/libslic3r/PrintConfig.cpp:1495 src/libslic3r/PrintConfig.cpp:1503 +#: src/libslic3r/PrintConfig.cpp:1544 src/libslic3r/PrintConfig.cpp:1552 +#: src/libslic3r/PrintConfig.cpp:1562 src/libslic3r/PrintConfig.cpp:1570 +#: src/libslic3r/PrintConfig.cpp:1578 src/libslic3r/PrintConfig.cpp:1661 +#: src/libslic3r/PrintConfig.cpp:1878 src/libslic3r/PrintConfig.cpp:1948 +#: src/libslic3r/PrintConfig.cpp:1982 src/libslic3r/PrintConfig.cpp:2176 +#: src/libslic3r/PrintConfig.cpp:2183 src/libslic3r/PrintConfig.cpp:2190 +#: src/libslic3r/PrintConfig.cpp:2220 src/libslic3r/PrintConfig.cpp:2230 +#: src/libslic3r/PrintConfig.cpp:2240 src/libslic3r/PrintConfig.cpp:2403 +#: src/libslic3r/PrintConfig.cpp:2478 src/libslic3r/PrintConfig.cpp:2487 +#: src/libslic3r/PrintConfig.cpp:2496 src/libslic3r/PrintConfig.cpp:2506 +#: src/libslic3r/PrintConfig.cpp:2550 src/libslic3r/PrintConfig.cpp:2560 +#: src/libslic3r/PrintConfig.cpp:2572 src/libslic3r/PrintConfig.cpp:2592 +#: src/libslic3r/PrintConfig.cpp:2602 src/libslic3r/PrintConfig.cpp:2613 +#: src/libslic3r/PrintConfig.cpp:2631 src/libslic3r/PrintConfig.cpp:2646 +#: src/libslic3r/PrintConfig.cpp:2660 src/libslic3r/PrintConfig.cpp:2673 +#: src/libslic3r/PrintConfig.cpp:2683 src/libslic3r/PrintConfig.cpp:2704 +#: src/libslic3r/PrintConfig.cpp:2715 src/libslic3r/PrintConfig.cpp:2725 +#: src/libslic3r/PrintConfig.cpp:2735 +msgid "mm" +msgstr "mm" + +#: src/slic3r/GUI/BedShapeDialog.cpp:92 src/libslic3r/PrintConfig.cpp:692 +msgid "Diameter" +msgstr "노즐 직경" + +#: src/slic3r/GUI/BedShapeDialog.cpp:93 +msgid "" +"Diameter of the print bed. It is assumed that origin (0,0) is located in the " +"center." +msgstr "인쇄 침대의 직경. 원점 (0,0) 은 중심에 있다고 가정합니다." + +#: src/slic3r/GUI/BedShapeDialog.cpp:97 src/slic3r/GUI/GUI_Preview.cpp:246 +#: src/libslic3r/GCode/PreviewData.cpp:175 +msgid "Custom" +msgstr "사용자 정의" + +#: src/slic3r/GUI/BedShapeDialog.cpp:101 +msgid "Load shape from STL..." +msgstr "STL파일 로드." + +#: src/slic3r/GUI/BedShapeDialog.cpp:154 +msgid "Settings" +msgstr "설정" + +#: src/slic3r/GUI/BedShapeDialog.cpp:171 +msgid "Texture" +msgstr "질감" + +#: src/slic3r/GUI/BedShapeDialog.cpp:181 src/slic3r/GUI/BedShapeDialog.cpp:249 +msgid "Load..." +msgstr "불러오기..." + +#: src/slic3r/GUI/BedShapeDialog.cpp:189 src/slic3r/GUI/BedShapeDialog.cpp:257 +#: src/slic3r/GUI/Tab.cpp:3204 +msgid "Remove" +msgstr "제거" + +#: src/slic3r/GUI/BedShapeDialog.cpp:239 +msgid "Model" +msgstr "모델" + +#: src/slic3r/GUI/BedShapeDialog.cpp:464 +msgid "Choose an STL file to import bed shape from:" +msgstr "다음 에서 침대 모양을 가져올 STL 파일을 선택합니다." + +#: src/slic3r/GUI/BedShapeDialog.cpp:471 src/slic3r/GUI/BedShapeDialog.cpp:520 +#: src/slic3r/GUI/BedShapeDialog.cpp:543 +msgid "Invalid file format." +msgstr "잘못된 파일 형식." + +#: src/slic3r/GUI/BedShapeDialog.cpp:482 +msgid "Error! Invalid model" +msgstr "오류! 잘못된 모델" + +#: src/slic3r/GUI/BedShapeDialog.cpp:490 +msgid "The selected file contains no geometry." +msgstr "선택한 파일에는 형상이 없는 포함 되어 있습니다." + +#: src/slic3r/GUI/BedShapeDialog.cpp:494 +msgid "" +"The selected file contains several disjoint areas. This is not supported." +msgstr "" +"선택한 파일 여러 분리 된 영역을 포함 되어 있습니다. 이것ㅇ 지원 되지 않습니" +"다." + +#: src/slic3r/GUI/BedShapeDialog.cpp:509 +msgid "Choose a file to import bed texture from (PNG/SVG):" +msgstr "(PNG /SVG)에서 침대 텍스처를 가져올 파일을 선택합니다." + +#: src/slic3r/GUI/BedShapeDialog.cpp:532 +msgid "Choose an STL file to import bed model from:" +msgstr "다음에서 침대 모델을 가져올 STL 파일을 선택합니다." + +#: src/slic3r/GUI/BedShapeDialog.hpp:59 src/slic3r/GUI/ConfigWizard.cpp:530 +msgid "Bed Shape" +msgstr "배드 모양" + +#: src/slic3r/GUI/BonjourDialog.cpp:55 +msgid "Network lookup" +msgstr "네트워크 조회" + +#: src/slic3r/GUI/BonjourDialog.cpp:72 +msgid "Address" +msgstr "주소" + +#: src/slic3r/GUI/BonjourDialog.cpp:73 +msgid "Hostname" +msgstr "호스트이름" + +#: src/slic3r/GUI/BonjourDialog.cpp:74 +msgid "Service name" +msgstr "서비스 이름" + +#: src/slic3r/GUI/BonjourDialog.cpp:76 +msgid "OctoPrint version" +msgstr "옥토프린트 버전" + +#: src/slic3r/GUI/BonjourDialog.cpp:218 +msgid "Searching for devices" +msgstr "디바이스 검색" + +#: src/slic3r/GUI/BonjourDialog.cpp:225 +msgid "Finished" +msgstr "완료" + +#: src/slic3r/GUI/ButtonsDescription.cpp:16 +msgid "Buttons And Text Colors Description" +msgstr "버튼 및 텍스트 색상 설명" + +#: src/slic3r/GUI/ButtonsDescription.cpp:36 +msgid "Value is the same as the system value" +msgstr "이 값은 시스템 값과 같습니다" + +#: src/slic3r/GUI/ButtonsDescription.cpp:53 +msgid "" +"Value was changed and is not equal to the system value or the last saved " +"preset" +msgstr "" +"값이 변경 되었고 시스템 값 또는 마지막으로 저장 된 사전 설정과 같지 않음" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:18 +msgid "Upgrade" +msgstr "업그레이드" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:20 +msgid "Downgrade" +msgstr "다운그레이드" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:22 +msgid "Before roll back" +msgstr "롤백 전에" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:24 +msgid "User" +msgstr "사용자" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:27 +msgid "Unknown" +msgstr "알 수 없음" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:39 +msgid "Active" +msgstr "활동중" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:45 +msgid "slic3r version" +msgstr "slic3r에 대하여" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:46 src/slic3r/GUI/Preset.cpp:1307 +msgid "print" +msgstr "프린트" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:47 +msgid "filaments" +msgstr "필라멘트" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:48 src/slic3r/GUI/Preset.cpp:1311 +msgid "printer" +msgstr "프린터" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:52 src/slic3r/GUI/Tab.cpp:939 +msgid "vendor" +msgstr "제조 회사" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:52 +msgid "version" +msgstr "버전" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:53 +msgid "min slic3r version" +msgstr "최소 slic3r 버전" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:55 +msgid "max slic3r version" +msgstr "최대 slic3r 버전" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:58 +msgid "model" +msgstr "모델" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:58 +msgid "variants" +msgstr "변종" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:70 +#, c-format +msgid "Incompatible with this %s" +msgstr "%s 과 호환되지 않습니다" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:73 +msgid "Activate" +msgstr "활성화" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:99 +msgid "Configuration Snapshots" +msgstr "구성 스냅숏" + +#: src/slic3r/GUI/ConfigWizard.cpp:118 +msgid "nozzle" +msgstr "노즐" + +#: src/slic3r/GUI/ConfigWizard.cpp:122 +msgid "Alternate nozzles:" +msgstr "대체 노즐:" + +#: src/slic3r/GUI/ConfigWizard.cpp:188 +msgid "All standard" +msgstr "모두 표준설정" + +#: src/slic3r/GUI/ConfigWizard.cpp:189 src/slic3r/GUI/Tab.cpp:3254 +msgid "All" +msgstr "모두 선택" + +#: src/slic3r/GUI/ConfigWizard.cpp:190 src/slic3r/GUI/Plater.cpp:470 +#: src/libslic3r/GCode/PreviewData.cpp:162 +msgid "None" +msgstr "없음" + +#: src/slic3r/GUI/ConfigWizard.cpp:296 +#, c-format +msgid "Welcome to the %s Configuration Assistant" +msgstr "%s 구성 도우미에 오신 것을 환영 합니다" + +#: src/slic3r/GUI/ConfigWizard.cpp:298 +#, c-format +msgid "Welcome to the %s Configuration Wizard" +msgstr "%s에 오신것을 환영 합니다." + +#: src/slic3r/GUI/ConfigWizard.cpp:300 +msgid "Welcome" +msgstr "환영합니다" + +#: src/slic3r/GUI/ConfigWizard.cpp:304 src/slic3r/GUI/GUI_App.cpp:747 +#, c-format +msgid "Run %s" +msgstr "%s 실행" + +#: src/slic3r/GUI/ConfigWizard.cpp:306 +#, c-format +msgid "" +"Hello, welcome to %s! This %s helps you with the initial configuration; just " +"a few settings and you will be ready to print." +msgstr "" +"안녕하세요 ,%s에 오신 것을 환영 합니다! 이 %s는 초기 구성에 도움이 됩니다. 그" +"냥 몇 가지 설정 하 고 당신은 인쇄 할 준비가 될 것입니다." + +#: src/slic3r/GUI/ConfigWizard.cpp:311 +msgid "" +"Remove user profiles - install from scratch (a snapshot will be taken " +"beforehand)" +msgstr "사용자 프로필 제거-처음부터 설치 (스냅숏은 사전에 수행 됩니다)" + +#: src/slic3r/GUI/ConfigWizard.cpp:342 +#, c-format +msgid "%s Family" +msgstr "%s의 가족들" + +#: src/slic3r/GUI/ConfigWizard.cpp:379 +msgid "Custom Printer Setup" +msgstr "사용자 지정 프린터 설정" + +#: src/slic3r/GUI/ConfigWizard.cpp:379 +msgid "Custom Printer" +msgstr "사용자 정의 프린터" + +#: src/slic3r/GUI/ConfigWizard.cpp:381 +msgid "Define a custom printer profile" +msgstr "사용자 정의 프린터 프로필 정의" + +#: src/slic3r/GUI/ConfigWizard.cpp:383 +msgid "Custom profile name:" +msgstr "사용자 지정 프로필 이름:" + +#: src/slic3r/GUI/ConfigWizard.cpp:407 +msgid "Automatic updates" +msgstr "자동 업데이트" + +#: src/slic3r/GUI/ConfigWizard.cpp:407 +msgid "Updates" +msgstr "업데이트" + +#: src/slic3r/GUI/ConfigWizard.cpp:415 src/slic3r/GUI/Preferences.cpp:69 +msgid "Check for application updates" +msgstr "프로그램 업데이트 확인" + +#: src/slic3r/GUI/ConfigWizard.cpp:419 +#, c-format +msgid "" +"If enabled, %s checks for new application versions online. When a new " +"version becomes available, a notification is displayed at the next " +"application startup (never during program usage). This is only a " +"notification mechanisms, no automatic installation is done." +msgstr "" +"활성화 된 경우 %s은 온라인의 새 버전을 확인합니다. 새 버전을 사용할 수있게되" +"면 다음 응용 프로그램 시작시 알림이 표시됩니다 (프로그램 사용 중에는 절대로 " +"사용하지 마십시오).이것은 알림 메커니즘 일뿐 자동 설치가 수행되지 않습니다." + +#: src/slic3r/GUI/ConfigWizard.cpp:425 src/slic3r/GUI/Preferences.cpp:77 +msgid "Update built-in Presets automatically" +msgstr "기존의 설정 자동 업데이트" + +#: src/slic3r/GUI/ConfigWizard.cpp:429 +#, c-format +msgid "" +"If enabled, %s downloads updates of built-in system presets in the " +"background.These updates are downloaded into a separate temporary location." +"When a new preset version becomes available it is offered at application " +"startup." +msgstr "" +"활성화 된 경우 %s은 백그라운드에서 내장 시스템 사전 설정의 업데이트를 다운로" +"드합니다. 이러한 업데이트는 별도의 임시 위치에 다운로드됩니다. 새로운 사전 설" +"정 버전을 사용할 수있게되면 응용 프로그램 시작시 제공됩니다." + +#: src/slic3r/GUI/ConfigWizard.cpp:432 +msgid "" +"Updates are never applied without user's consent and never overwrite user's " +"customized settings." +msgstr "" +"업데이트는 사용자의 동의없이 적용되지 않으며 사용자의 사용자 지정된 설정을 덮" +"어 쓰지 않습니다." + +#: src/slic3r/GUI/ConfigWizard.cpp:437 +msgid "" +"Additionally a backup snapshot of the whole configuration is created before " +"an update is applied." +msgstr "또한 업데이트가 적용되기 전에 전체 구성의 백업 스냅 샷이 생성됩니다." + +#: src/slic3r/GUI/ConfigWizard.cpp:444 +msgid "Other Vendors" +msgstr "다른 공급 업체" + +#: src/slic3r/GUI/ConfigWizard.cpp:446 +#, c-format +msgid "Pick another vendor supported by %s:" +msgstr "%s가 지원하는 다른 공급 업체를 선택하십시오:" + +#: src/slic3r/GUI/ConfigWizard.cpp:492 +msgid "Firmware Type" +msgstr "펌웨어 타입" + +#: src/slic3r/GUI/ConfigWizard.cpp:492 src/slic3r/GUI/Tab.cpp:2100 +msgid "Firmware" +msgstr "펌웨어" + +#: src/slic3r/GUI/ConfigWizard.cpp:496 +msgid "Choose the type of firmware used by your printer." +msgstr "프린터에 패치할 펌웨어를 선택하세요." + +#: src/slic3r/GUI/ConfigWizard.cpp:530 +msgid "Bed Shape and Size" +msgstr "배드 모양과 크기" + +#: src/slic3r/GUI/ConfigWizard.cpp:533 +msgid "Set the shape of your printer's bed." +msgstr "프린터 배드모양을 설정하세요." + +#: src/slic3r/GUI/ConfigWizard.cpp:553 +msgid "Filament and Nozzle Diameters" +msgstr "필라멘트와 노즐 크기" + +#: src/slic3r/GUI/ConfigWizard.cpp:553 +msgid "Print Diameters" +msgstr "인쇄 직경" + +#: src/slic3r/GUI/ConfigWizard.cpp:567 +msgid "Enter the diameter of your printer's hot end nozzle." +msgstr "핫 엔드 노즐 직경을 입력하십시오." + +#: src/slic3r/GUI/ConfigWizard.cpp:570 +msgid "Nozzle Diameter:" +msgstr "노즐 직경:" + +#: src/slic3r/GUI/ConfigWizard.cpp:580 +msgid "Enter the diameter of your filament." +msgstr "필라멘트의 직경을 입력하십시오." + +#: src/slic3r/GUI/ConfigWizard.cpp:581 +msgid "" +"Good precision is required, so use a caliper and do multiple measurements " +"along the filament, then compute the average." +msgstr "" +"정밀도가 필요하므로 캘리퍼를 사용하여 필라멘트를 따라 여러 번 측정 한 다음 평" +"균을 계산하십시오." + +#: src/slic3r/GUI/ConfigWizard.cpp:584 +msgid "Filament Diameter:" +msgstr "필라멘트 직경:" + +#: src/slic3r/GUI/ConfigWizard.cpp:618 +msgid "Extruder and Bed Temperatures" +msgstr "익스트루더와 배드 온도" + +#: src/slic3r/GUI/ConfigWizard.cpp:618 +msgid "Temperatures" +msgstr "온도" + +#: src/slic3r/GUI/ConfigWizard.cpp:634 +msgid "Enter the temperature needed for extruding your filament." +msgstr "필라멘트 압출에 필요한 온도를 입력하십시오." + +#: src/slic3r/GUI/ConfigWizard.cpp:635 +msgid "A rule of thumb is 160 to 230 °C for PLA, and 215 to 250 °C for ABS." +msgstr "보통 PLA의 경우 160 ~ 230 ° C, ABS의 경우 215 ~ 250 ° C입니다." + +#: src/slic3r/GUI/ConfigWizard.cpp:638 +msgid "Extrusion Temperature:" +msgstr "출력 온도 :" + +#: src/slic3r/GUI/ConfigWizard.cpp:639 src/slic3r/GUI/ConfigWizard.cpp:653 +msgid "°C" +msgstr "°C" + +#: src/slic3r/GUI/ConfigWizard.cpp:648 +msgid "" +"Enter the bed temperature needed for getting your filament to stick to your " +"heated bed." +msgstr "필라멘트가 핫배드에 접착하는데 필요한 배드온도를 입력하십시오." + +#: src/slic3r/GUI/ConfigWizard.cpp:649 +msgid "" +"A rule of thumb is 60 °C for PLA and 110 °C for ABS. Leave zero if you have " +"no heated bed." +msgstr "" +"보통은 PLA의 경우 60 ° C이고 ABS의 경우 110 ° C입니다. 핫배드가 없는 경우에" +"는 0으로 두십시오." + +#: src/slic3r/GUI/ConfigWizard.cpp:652 +msgid "Bed Temperature:" +msgstr "배드 온도 :" + +#: src/slic3r/GUI/ConfigWizard.cpp:1115 +msgid "Select all standard printers" +msgstr "이 프로파일과 호환 가능한 프린터를 선택하세요" + +#: src/slic3r/GUI/ConfigWizard.cpp:1118 +msgid "< &Back" +msgstr "< &뒤로" + +#: src/slic3r/GUI/ConfigWizard.cpp:1119 +msgid "&Next >" +msgstr "&다음 >" + +#: src/slic3r/GUI/ConfigWizard.cpp:1120 +msgid "&Finish" +msgstr "&완료" + +#: src/slic3r/GUI/ConfigWizard.cpp:1121 src/slic3r/GUI/FirmwareDialog.cpp:151 +#: src/slic3r/GUI/ProgressStatusBar.cpp:27 +msgid "Cancel" +msgstr "취소" + +#: src/slic3r/GUI/ConfigWizard.cpp:1135 +msgid "Prusa FFF Technology Printers" +msgstr "Prusa FFF 방식 프린터" + +#: src/slic3r/GUI/ConfigWizard.cpp:1138 +msgid "Prusa MSLA Technology Printers" +msgstr "Prusa MSLA 방식 프린터" + +#: src/slic3r/GUI/ConfigWizard.cpp:1207 +msgid "Configuration Assistant" +msgstr "구성 도우미" + +#: src/slic3r/GUI/ConfigWizard.cpp:1208 +msgid "Configuration &Assistant" +msgstr "구성 & 도우미" + +#: src/slic3r/GUI/ConfigWizard.cpp:1210 +msgid "Configuration Wizard" +msgstr "구성 마법사" + +#: src/slic3r/GUI/ConfigWizard.cpp:1211 +msgid "Configuration &Wizard" +msgstr "구성 & 마법사" + +#: src/slic3r/GUI/Field.cpp:125 +msgid "default value" +msgstr "기본값" + +#: src/slic3r/GUI/Field.cpp:128 +msgid "parameter name" +msgstr "매개 변수 명칭" + +#: src/slic3r/GUI/Field.cpp:139 +msgid "N/A" +msgstr "N/A" + +#: src/slic3r/GUI/Field.cpp:158 +#, c-format +msgid "%s doesn't support percentage" +msgstr "%s 이(가) 백분율을 지원하지 않음" + +#: src/slic3r/GUI/Field.cpp:174 src/slic3r/GUI/Field.cpp:197 +msgid "Invalid numeric input." +msgstr "숫자 입력이 잘못 되었습니다." + +#: src/slic3r/GUI/Field.cpp:179 +msgid "Input value is out of range" +msgstr "Input value is out of range" + +#: src/slic3r/GUI/Field.cpp:206 +#, c-format +msgid "" +"Do you mean %s%% instead of %s %s?\n" +"Select YES if you want to change this value to %s%%, \n" +"or NO if you are sure that %s %s is a correct value." +msgstr "" +"%s %s 대신 %s%%을 하려고 합니까?\n" +"이 값을 %s%%, 로 변경하려면 YES를 선택하십시오. \n" +"또는 %s %s 이(가) 올바른 값인지 확인하는 경우 NO를 선택하세요. " + +#: src/slic3r/GUI/Field.cpp:209 +msgid "Parameter validation" +msgstr "매개 변수 유효성 검사" + +#: src/slic3r/GUI/FirmwareDialog.cpp:150 +msgid "Flash!" +msgstr "완료!" + +#: src/slic3r/GUI/FirmwareDialog.cpp:152 +msgid "Flashing in progress. Please do not disconnect the printer!" +msgstr "진행 중입니다. 프린터를 분리하지 마십시오!" + +#: src/slic3r/GUI/FirmwareDialog.cpp:199 +msgid "Flashing failed" +msgstr "펌웨어 적용 실패" + +#: src/slic3r/GUI/FirmwareDialog.cpp:282 +msgid "Flashing succeeded!" +msgstr "적용 성공!" + +#: src/slic3r/GUI/FirmwareDialog.cpp:283 +msgid "Flashing failed. Please see the avrdude log below." +msgstr "적용 실패. 아래의 로그를 확인하세요." + +#: src/slic3r/GUI/FirmwareDialog.cpp:284 +msgid "Flashing cancelled." +msgstr "적용 취소됨." + +#: src/slic3r/GUI/FirmwareDialog.cpp:332 +#, c-format +msgid "" +"This firmware hex file does not match the printer model.\n" +"The hex file is intended for: %s\n" +"Printer reported: %s\n" +"\n" +"Do you want to continue and flash this hex file anyway?\n" +"Please only continue if you are sure this is the right thing to do." +msgstr "" +"이 펌웨어 hex 파일이 프린터 모델과 일치 하지 않습니다.\n" +"Hex 파일은 다음을 위한 것입니다: %s\n" +"보고 된 프린터: %s\n" +"\n" +"그래도이 hex 파일을 계속 적용 하시겠습니까?\n" +"확신 하는 경우에만 계속 하십시오." + +#: src/slic3r/GUI/FirmwareDialog.cpp:419 src/slic3r/GUI/FirmwareDialog.cpp:454 +#, c-format +msgid "" +"Multiple %s devices found. Please only connect one at a time for flashing." +msgstr "" +"여러 %s 장치를 찾았습니다. 깜박이는 경우에는 한 번에 하나씩만 연결 하십시오." + +#: src/slic3r/GUI/FirmwareDialog.cpp:436 +#, c-format +msgid "" +"The %s device was not found.\n" +"If the device is connected, please press the Reset button next to the USB " +"connector ..." +msgstr "" +"%s 장치를 찾을 하지 않았습니다.\n" +"장치가 연결 된 경우 USB 커넥터 옆에 있는 리셋 단추를 누르십시오." + +#: src/slic3r/GUI/FirmwareDialog.cpp:548 +#, c-format +msgid "The %s device could not have been found" +msgstr "%s 장치를 찾을 수 없습니다" + +#: src/slic3r/GUI/FirmwareDialog.cpp:645 +#, c-format +msgid "Error accessing port at %s: %s" +msgstr "%s 포트에 액세스 하는 중 오류가 발생 했습니다 :%s" + +#: src/slic3r/GUI/FirmwareDialog.cpp:647 +#, c-format +msgid "Error: %s" +msgstr "에러: %s" + +#: src/slic3r/GUI/FirmwareDialog.cpp:777 +msgid "Firmware flasher" +msgstr "펌웨어 업로드" + +#: src/slic3r/GUI/FirmwareDialog.cpp:802 +msgid "Firmware image:" +msgstr "펌웨어 이미지:" + +#: src/slic3r/GUI/FirmwareDialog.cpp:805 src/slic3r/GUI/Tab.cpp:1824 +#: src/slic3r/GUI/Tab.cpp:1880 +msgid "Browse" +msgstr "검색" + +#: src/slic3r/GUI/FirmwareDialog.cpp:807 +msgid "Serial port:" +msgstr "시리얼 포트:" + +#: src/slic3r/GUI/FirmwareDialog.cpp:809 +msgid "Autodetected" +msgstr "자동 감지" + +#: src/slic3r/GUI/FirmwareDialog.cpp:810 +msgid "Rescan" +msgstr "재검색" + +#: src/slic3r/GUI/FirmwareDialog.cpp:817 +msgid "Progress:" +msgstr "진행:" + +#: src/slic3r/GUI/FirmwareDialog.cpp:820 +msgid "Status:" +msgstr "상태:" + +#: src/slic3r/GUI/FirmwareDialog.cpp:821 +msgid "Ready" +msgstr "준비" + +#: src/slic3r/GUI/FirmwareDialog.cpp:841 +msgid "Advanced: Output log" +msgstr "고급: 출력 로그" + +#: src/slic3r/GUI/FirmwareDialog.cpp:852 +#: src/slic3r/GUI/PrintHostDialogs.cpp:161 +msgid "Close" +msgstr "닫기" + +#: src/slic3r/GUI/FirmwareDialog.cpp:903 +msgid "" +"Are you sure you want to cancel firmware flashing?\n" +"This could leave your printer in an unusable state!" +msgstr "" +"새펌웨어 적용을 취소하시겠습니까?\n" +"프린터가 사용할 수 없는 상태가 될 수 있습니다!" + +#: src/slic3r/GUI/FirmwareDialog.cpp:904 +msgid "Confirmation" +msgstr "확인" + +#: src/slic3r/GUI/FirmwareDialog.cpp:907 +msgid "Cancelling..." +msgstr "취소 중...." + +#: src/slic3r/GUI/GLCanvas3D.cpp:526 +msgid "Layers heights" +msgstr "레이어 높이" + +#: src/slic3r/GUI/GLCanvas3D.cpp:623 +msgid "An object outside the print area was detected" +msgstr "인쇄 영역 밖에 있는 개체가 감지 되었습니다" + +#: src/slic3r/GUI/GLCanvas3D.cpp:624 +msgid "A toolpath outside the print area was detected" +msgstr "인쇄 영역 밖에 있는 공구 경로가 감지 되었습니다" + +#: src/slic3r/GUI/GLCanvas3D.cpp:625 +msgid "SLA supports outside the print area were detected" +msgstr "인쇄 영역 외부의 SLA 지원 감지 됨" + +#: src/slic3r/GUI/GLCanvas3D.cpp:626 +msgid "Some objects are not visible when editing supports" +msgstr "편집 지원 시 일부 객체가 표시 되지 않음" + +#: src/slic3r/GUI/GLCanvas3D.cpp:628 +msgid "" +"An object outside the print area was detected\n" +"Resolve the current problem to continue slicing" +msgstr "" +"인쇄 영역 밖에 있는 개체가 감지 되었습니다.\n" +"현재 문제를 해결 하여 슬라이싱을 계속 합니다" + +#: src/slic3r/GUI/GLCanvas3D.cpp:1711 +msgid "Mirror Object" +msgstr "오브젝트 미러" + +#: src/slic3r/GUI/GLCanvas3D.cpp:2872 +msgid "Move Object" +msgstr "오브젝트 이동" + +#: src/slic3r/GUI/GLCanvas3D.cpp:3389 src/slic3r/GUI/GLCanvas3D.cpp:3609 +#: src/slic3r/GUI/MainFrame.cpp:559 +msgid "Undo" +msgstr "실행 취소" + +#: src/slic3r/GUI/GLCanvas3D.cpp:3389 src/slic3r/GUI/GLCanvas3D.cpp:3639 +#: src/slic3r/GUI/MainFrame.cpp:562 +msgid "Redo" +msgstr "다시 실행" + +#: src/slic3r/GUI/GLCanvas3D.cpp:3395 +#, c-format +msgid "%s Stack" +msgstr "%s 스택" + +#: src/slic3r/GUI/GLCanvas3D.cpp:3413 +#, c-format +msgid "%s %d Action" +msgstr "%s %d 액션" + +#: src/slic3r/GUI/GLCanvas3D.cpp:3460 +msgid "Add..." +msgstr "추가..." + +#: src/slic3r/GUI/GLCanvas3D.cpp:3468 src/slic3r/GUI/GUI_ObjectList.cpp:1434 +#: src/slic3r/GUI/Plater.cpp:3467 src/slic3r/GUI/Plater.cpp:3486 +#: src/slic3r/GUI/Tab.cpp:3204 +msgid "Delete" +msgstr "지우기 " + +#: src/slic3r/GUI/GLCanvas3D.cpp:3477 src/slic3r/GUI/Plater.cpp:4075 +msgid "Delete all" +msgstr "전부 지우기" + +#: src/slic3r/GUI/GLCanvas3D.cpp:3486 src/slic3r/GUI/KBShortcutsDialog.cpp:134 +#: src/slic3r/GUI/Plater.cpp:2636 +msgid "Arrange" +msgstr "정렬" + +#: src/slic3r/GUI/GLCanvas3D.cpp:3486 +msgid "Arrange selection" +msgstr "선택 정렬" + +#: src/slic3r/GUI/GLCanvas3D.cpp:3498 +msgid "Copy" +msgstr "복사" + +#: src/slic3r/GUI/GLCanvas3D.cpp:3507 +msgid "Paste" +msgstr "붙여넣기" + +#: src/slic3r/GUI/GLCanvas3D.cpp:3519 +msgid "Add instance" +msgstr "복제본 추가" + +#: src/slic3r/GUI/GLCanvas3D.cpp:3530 +msgid "Remove instance" +msgstr "복제본 제거" + +#: src/slic3r/GUI/GLCanvas3D.cpp:3543 +msgid "Split to objects" +msgstr "객체로 분할" + +#: src/slic3r/GUI/GLCanvas3D.cpp:3553 src/slic3r/GUI/GUI_ObjectList.cpp:1280 +msgid "Split to parts" +msgstr "파트로 분할" + +#: src/slic3r/GUI/GLCanvas3D.cpp:3566 +msgid "Layers editing" +msgstr "레이어층을 편집" + +#: src/slic3r/GUI/GLCanvas3D.cpp:5623 +msgid "Selection-Add from rectangle" +msgstr "사각형에서 선택-추가" + +#: src/slic3r/GUI/GLCanvas3D.cpp:5642 +msgid "Selection-Remove from rectangle" +msgstr "선택- 사각형에서 제거" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:40 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:144 src/libslic3r/PrintConfig.cpp:3176 +msgid "Cut" +msgstr "자르기" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:149 +msgid "Keep upper part" +msgstr "상위 부분 유지" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:150 +msgid "Keep lower part" +msgstr "낮은 부분 유지" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:151 +msgid "Rotate lower part upwards" +msgstr "아래쪽 부분을 위쪽으로 회전" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:154 +msgid "Perform cut" +msgstr "절단 실행" + +#: src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp:45 +msgid "Place on face" +msgstr "면 배치 " + +#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:48 +msgid "Move" +msgstr "이동" + +#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:177 +msgid "Position (mm)" +msgstr "위치 (mm)" + +#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:177 +msgid "Displacement (mm)" +msgstr "변위 (mm)" + +#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:449 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:466 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:485 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:503 +#: src/libslic3r/PrintConfig.cpp:3225 +msgid "Rotate" +msgstr "회전" + +#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:482 +msgid "Rotation (deg)" +msgstr "회전 (°)" + +#: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:47 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:390 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:486 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:504 +#: src/libslic3r/PrintConfig.cpp:3240 +msgid "Scale" +msgstr "크기" + +#: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:292 +msgid "Scale (%)" +msgstr "스케일 (%)" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:44 +msgid "Head diameter" +msgstr "헤드 지름" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:45 +msgid "Lock supports under new islands" +msgstr "새 고립 영역에서 잠금 지원" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:46 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1427 +msgid "Remove selected points" +msgstr "선택한 점 제거" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:47 +msgid "Remove all points" +msgstr "모든 점 제거" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:48 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1430 +msgid "Apply changes" +msgstr "변경 내용을 적용" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:49 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1431 +msgid "Discard changes" +msgstr "변경사항을 취소" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:50 +msgid "Minimal points distance" +msgstr "최소 포인트 거리" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:51 +#: src/libslic3r/PrintConfig.cpp:2620 +msgid "Support points density" +msgstr "지원 포인트 밀도" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:52 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1433 +msgid "Auto-generate points" +msgstr "점 자동 생성" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:53 +msgid "Manual editing" +msgstr "수동 편집" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:54 +msgid "Clipping of view" +msgstr "클랩핑된것 보기" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:55 +msgid "Reset direction" +msgstr "방향 재설정" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:531 +msgid "Add support point" +msgstr "서포트 지점 추가" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:720 +msgid "Delete support point" +msgstr "서포트 지점 삭제" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:925 +msgid "Change point head diameter" +msgstr "변경 점 헤드 지름" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:991 +msgid "Support parameter change" +msgstr "서포트 매개 변수 변경" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1099 +msgid "SLA Support Points" +msgstr "SLA 지원 포인트" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1138 +msgid "Do you want to save your manually edited support points?" +msgstr "수동으로 편집한 서포트 지점을 저장 하 시겠습니까?" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1139 +msgid "Save changes?" +msgstr "변경 사항을 저장 하 시겠습니까?" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1183 +msgid "Move support point" +msgstr "서포트 점 이동" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1282 +msgid "Support points edit" +msgstr "서포트 포인트 편집" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1333 +msgid "" +"Autogeneration will erase all manually edited points.\n" +"\n" +"Are you sure you want to do it?\n" +msgstr "" +"자동 생성은 수동으로 편집한 모든 점을 지웁니다.\n" +"\n" +"그렇게 하시겠습니까?\n" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1335 src/slic3r/GUI/GUI.cpp:289 +#: src/slic3r/GUI/WipeTowerDialog.cpp:44 src/slic3r/GUI/WipeTowerDialog.cpp:328 +msgid "Warning" +msgstr "위험" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1338 +msgid "Autogenerate support points" +msgstr "서포트 자동 생성" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1390 +msgid "SLA gizmo keyboard shortcuts" +msgstr "SLA 장치바로 가기" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1401 +msgid "Note: some shortcuts work in (non)editing mode only." +msgstr "참고: 일부 단축키는 (비)편집 모드 에서만 작동 합니다." + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1419 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1422 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1423 +msgid "Left click" +msgstr "왼쪽 클릭" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1419 +msgid "Add point" +msgstr "점 추가" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1420 +msgid "Right click" +msgstr "오른쪽 클릭" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1420 +msgid "Remove point" +msgstr "복제본 제거" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1421 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1424 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1425 +msgid "Drag" +msgstr "드래그" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1421 +msgid "Move point" +msgstr "점 이동" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1422 +msgid "Add point to selection" +msgstr "선택 영역에 점 추가" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1423 +msgid "Remove point from selection" +msgstr "선택 영역에서 점 제거" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1424 +msgid "Select by rectangle" +msgstr "직사각형으로 선택" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1425 +msgid "Deselect by rectangle" +msgstr "사각형으로 선택 해제" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1426 +msgid "Select all points" +msgstr "모든 점 선택" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1428 +msgid "Mouse wheel" +msgstr "마우스 휠" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1428 +msgid "Move clipping plane" +msgstr "클립핑 평면 이동" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1429 +msgid "Reset clipping plane" +msgstr "클립핑 평면 재설정" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1432 +msgid "Switch to editing mode" +msgstr "편집 모드로 전환" + +#: src/slic3r/GUI/GUI.cpp:141 src/slic3r/GUI/Tab.cpp:3063 +msgid "It's impossible to print multi-part object(s) with SLA technology." +msgstr "SLA 방식을 사용 하여 멀티파트를 인쇄할 수는 없습니다." + +#: src/slic3r/GUI/GUI.cpp:142 +msgid "Please check and fix your object list." +msgstr "개체 목록을 확인 하고 수정 하십시오." + +#: src/slic3r/GUI/GUI.cpp:143 src/slic3r/GUI/Plater.cpp:2213 +#: src/slic3r/GUI/Tab.cpp:3065 +msgid "Attention!" +msgstr "주목!" + +#: src/slic3r/GUI/GUI.cpp:283 +msgid "Notice" +msgstr "공지" + +#: src/slic3r/GUI/GUI_App.cpp:435 +msgid "Changing of an application language" +msgstr "응용 프로그램 언어 변경" + +#: src/slic3r/GUI/GUI_App.cpp:443 src/slic3r/GUI/GUI_App.cpp:452 +msgid "Recreating" +msgstr "재현" + +#: src/slic3r/GUI/GUI_App.cpp:456 +msgid "Loading of current presets" +msgstr "현재 프리셋 불러오기" + +#: src/slic3r/GUI/GUI_App.cpp:464 +msgid "Loading of a mode view" +msgstr "모드 보기 로드" + +#: src/slic3r/GUI/GUI_App.cpp:544 +msgid "Choose one file (3MF/AMF):" +msgstr "하나의 파일(3MF/AMF)을 선택합니다." + +#: src/slic3r/GUI/GUI_App.cpp:556 +msgid "Choose one or more files (STL/OBJ/AMF/3MF/PRUSA):" +msgstr "파일을 선택하세요 (STL/OBJ/AMF/3MF/PRUSA):" + +#: src/slic3r/GUI/GUI_App.cpp:598 +msgid "Select the language" +msgstr "언어를 선택" + +#: src/slic3r/GUI/GUI_App.cpp:599 +msgid "Language" +msgstr "언어" + +#: src/slic3r/GUI/GUI_App.cpp:750 +msgid "&Configuration Snapshots" +msgstr "구성 스냅숏" + +#: src/slic3r/GUI/GUI_App.cpp:750 +msgid "Inspect / activate configuration snapshots" +msgstr "구성 스냅 샷 검사 / 활성화" + +#: src/slic3r/GUI/GUI_App.cpp:751 +msgid "Take Configuration &Snapshot" +msgstr "구성 스냅 샷 가져 오기" + +#: src/slic3r/GUI/GUI_App.cpp:751 +msgid "Capture a configuration snapshot" +msgstr "구성 스냅 샷 캡처" + +#: src/slic3r/GUI/GUI_App.cpp:754 +msgid "&Preferences" +msgstr "환경 설정" + +#: src/slic3r/GUI/GUI_App.cpp:760 +msgid "Application preferences" +msgstr "응용 프로그램 환경 설정" + +#: src/slic3r/GUI/GUI_App.cpp:763 src/slic3r/GUI/wxExtensions.cpp:2882 +msgid "Simple" +msgstr "단순" + +#: src/slic3r/GUI/GUI_App.cpp:763 +msgid "Simple View Mode" +msgstr "단순 보기 모드" + +#: src/slic3r/GUI/GUI_App.cpp:764 src/slic3r/GUI/GUI_ObjectList.cpp:93 +#: src/slic3r/GUI/GUI_ObjectList.cpp:567 src/slic3r/GUI/Tab.cpp:1037 +#: src/slic3r/GUI/Tab.cpp:1052 src/slic3r/GUI/Tab.cpp:1150 +#: src/slic3r/GUI/Tab.cpp:1153 src/slic3r/GUI/Tab.cpp:1649 +#: src/slic3r/GUI/Tab.cpp:2120 src/slic3r/GUI/Tab.cpp:3699 +#: src/slic3r/GUI/wxExtensions.cpp:2883 src/libslic3r/PrintConfig.cpp:83 +#: src/libslic3r/PrintConfig.cpp:197 src/libslic3r/PrintConfig.cpp:360 +#: src/libslic3r/PrintConfig.cpp:1013 src/libslic3r/PrintConfig.cpp:2226 +msgid "Advanced" +msgstr "고급" + +#: src/slic3r/GUI/GUI_App.cpp:764 +msgid "Advanced View Mode" +msgstr "고급 보기 모드" + +#: src/slic3r/GUI/GUI_App.cpp:765 src/slic3r/GUI/wxExtensions.cpp:2884 +msgid "Expert" +msgstr "전문가" + +#: src/slic3r/GUI/GUI_App.cpp:765 +msgid "Expert View Mode" +msgstr "전문가 보기 모드" + +#: src/slic3r/GUI/GUI_App.cpp:770 +msgid "Mode" +msgstr "모드" + +#: src/slic3r/GUI/GUI_App.cpp:770 +#, c-format +msgid "%s View Mode" +msgstr "%s 보기 모드" + +#: src/slic3r/GUI/GUI_App.cpp:772 +msgid "Change Application &Language" +msgstr "응용 프로그램 언어 번경" + +#: src/slic3r/GUI/GUI_App.cpp:774 +msgid "Flash printer &firmware" +msgstr "프린터 펌웨어 플래시" + +#: src/slic3r/GUI/GUI_App.cpp:774 +msgid "Upload a firmware image into an Arduino based printer" +msgstr "아두이노 기반의 프린터 이미지 업로드" + +#: src/slic3r/GUI/GUI_App.cpp:786 +msgid "Taking configuration snapshot" +msgstr "구성 스냅 샷 만들기" + +#: src/slic3r/GUI/GUI_App.cpp:786 +msgid "Snapshot name" +msgstr "스냅 샷 이름" + +#: src/slic3r/GUI/GUI_App.cpp:829 +msgid "" +"Switching the language will trigger application restart.\n" +"You will lose content of the plater." +msgstr "" +"언어를 전환 하면 응용 프로그램 재시작 합니다.플레이트 위 오브젝트는 모두 지워" +"집니다." + +#: src/slic3r/GUI/GUI_App.cpp:831 +msgid "Do you want to proceed?" +msgstr "계속 하시겠습니까?" + +#: src/slic3r/GUI/GUI_App.cpp:832 +msgid "Language selection" +msgstr "국가에 맞는 언어를 선택" + +#: src/slic3r/GUI/GUI_App.cpp:855 +msgid "&Configuration" +msgstr "&구성" + +#: src/slic3r/GUI/GUI_App.cpp:877 +msgid "The presets on the following tabs were modified" +msgstr "다음 탭의 사전 설정이 수정 되었습니다" + +#: src/slic3r/GUI/GUI_App.cpp:877 src/slic3r/GUI/Tab.cpp:3051 +msgid "Discard changes and continue anyway?" +msgstr "수정된 사항을 취소하고 계속하겠습니까?" + +#: src/slic3r/GUI/GUI_App.cpp:880 +msgid "Unsaved Presets" +msgstr "저장되지 않은 기존설정" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:30 src/slic3r/GUI/GUI_ObjectList.cpp:84 +#: src/slic3r/GUI/GUI_ObjectList.cpp:558 src/libslic3r/PrintConfig.cpp:67 +#: src/libslic3r/PrintConfig.cpp:160 src/libslic3r/PrintConfig.cpp:392 +#: src/libslic3r/PrintConfig.cpp:453 src/libslic3r/PrintConfig.cpp:461 +#: src/libslic3r/PrintConfig.cpp:867 src/libslic3r/PrintConfig.cpp:1051 +#: src/libslic3r/PrintConfig.cpp:1354 src/libslic3r/PrintConfig.cpp:1420 +#: src/libslic3r/PrintConfig.cpp:1601 src/libslic3r/PrintConfig.cpp:2037 +#: src/libslic3r/PrintConfig.cpp:2095 +msgid "Layers and Perimeters" +msgstr "레이어 및 경계선" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:31 src/slic3r/GUI/GUI_ObjectList.cpp:85 +#: src/slic3r/GUI/GUI_ObjectList.cpp:559 src/slic3r/GUI/Plater.cpp:498 +#: src/slic3r/GUI/Tab.cpp:1041 src/slic3r/GUI/Tab.cpp:1042 +#: src/slic3r/GUI/Tab.cpp:1394 src/libslic3r/PrintConfig.cpp:177 +#: src/libslic3r/PrintConfig.cpp:400 src/libslic3r/PrintConfig.cpp:420 +#: src/libslic3r/PrintConfig.cpp:754 src/libslic3r/PrintConfig.cpp:768 +#: src/libslic3r/PrintConfig.cpp:805 src/libslic3r/PrintConfig.cpp:958 +#: src/libslic3r/PrintConfig.cpp:968 src/libslic3r/PrintConfig.cpp:986 +#: src/libslic3r/PrintConfig.cpp:1004 src/libslic3r/PrintConfig.cpp:1023 +#: src/libslic3r/PrintConfig.cpp:1708 src/libslic3r/PrintConfig.cpp:1725 +msgid "Infill" +msgstr "인필(채움)" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:32 src/slic3r/GUI/GUI_ObjectList.cpp:86 +#: src/slic3r/GUI/GUI_ObjectList.cpp:560 src/slic3r/GUI/GUI_Preview.cpp:243 +#: src/slic3r/GUI/Tab.cpp:1070 src/slic3r/GUI/Tab.cpp:1071 +#: src/libslic3r/PrintConfig.cpp:344 src/libslic3r/PrintConfig.cpp:1481 +#: src/libslic3r/PrintConfig.cpp:1830 src/libslic3r/PrintConfig.cpp:1836 +#: src/libslic3r/PrintConfig.cpp:1844 src/libslic3r/PrintConfig.cpp:1856 +#: src/libslic3r/PrintConfig.cpp:1866 src/libslic3r/PrintConfig.cpp:1874 +#: src/libslic3r/PrintConfig.cpp:1889 src/libslic3r/PrintConfig.cpp:1910 +#: src/libslic3r/PrintConfig.cpp:1921 src/libslic3r/PrintConfig.cpp:1937 +#: src/libslic3r/PrintConfig.cpp:1946 src/libslic3r/PrintConfig.cpp:1955 +#: src/libslic3r/PrintConfig.cpp:1966 src/libslic3r/PrintConfig.cpp:1980 +#: src/libslic3r/PrintConfig.cpp:1988 src/libslic3r/PrintConfig.cpp:1989 +#: src/libslic3r/PrintConfig.cpp:1998 src/libslic3r/PrintConfig.cpp:2006 +#: src/libslic3r/PrintConfig.cpp:2020 src/libslic3r/GCode/PreviewData.cpp:172 +msgid "Support material" +msgstr "서포트 재료(Support material)" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:35 src/slic3r/GUI/GUI_ObjectList.cpp:90 +#: src/slic3r/GUI/GUI_ObjectList.cpp:564 src/libslic3r/PrintConfig.cpp:2202 +#: src/libslic3r/PrintConfig.cpp:2210 +msgid "Wipe options" +msgstr "지우기 옵션" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:41 +msgid "Pad and Support" +msgstr "패드 및 서포트" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:47 +msgid "Add part" +msgstr "파트 추가" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:48 +msgid "Add modifier" +msgstr "편집영역(modifier) 추가" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:49 +msgid "Add support enforcer" +msgstr "서포트 지원(enforcer)영역 추가" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:50 +msgid "Add support blocker" +msgstr "서포트 금지영역(blocker) 추가" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:87 src/slic3r/GUI/GUI_ObjectList.cpp:561 +#: src/slic3r/GUI/GUI_Preview.cpp:222 src/slic3r/GUI/Tab.cpp:1095 +#: src/libslic3r/PrintConfig.cpp:209 src/libslic3r/PrintConfig.cpp:441 +#: src/libslic3r/PrintConfig.cpp:896 src/libslic3r/PrintConfig.cpp:1024 +#: src/libslic3r/PrintConfig.cpp:1410 src/libslic3r/PrintConfig.cpp:1647 +#: src/libslic3r/PrintConfig.cpp:1696 src/libslic3r/PrintConfig.cpp:1747 +#: src/libslic3r/PrintConfig.cpp:2080 +msgid "Speed" +msgstr "속도" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:88 src/slic3r/GUI/GUI_ObjectList.cpp:562 +#: src/slic3r/GUI/Tab.cpp:1130 src/slic3r/GUI/Tab.cpp:1997 +#: src/libslic3r/PrintConfig.cpp:471 src/libslic3r/PrintConfig.cpp:979 +#: src/libslic3r/PrintConfig.cpp:1389 src/libslic3r/PrintConfig.cpp:1717 +#: src/libslic3r/PrintConfig.cpp:1902 src/libslic3r/PrintConfig.cpp:1928 +msgid "Extruders" +msgstr "익스트루더" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:89 src/slic3r/GUI/GUI_ObjectList.cpp:563 +#: src/libslic3r/PrintConfig.cpp:431 src/libslic3r/PrintConfig.cpp:538 +#: src/libslic3r/PrintConfig.cpp:855 src/libslic3r/PrintConfig.cpp:987 +#: src/libslic3r/PrintConfig.cpp:1398 src/libslic3r/PrintConfig.cpp:1737 +#: src/libslic3r/PrintConfig.cpp:1911 src/libslic3r/PrintConfig.cpp:2069 +msgid "Extrusion Width" +msgstr "압출 폭" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:95 src/slic3r/GUI/GUI_ObjectList.cpp:569 +#: src/slic3r/GUI/Plater.cpp:466 src/slic3r/GUI/Tab.cpp:3655 +#: src/slic3r/GUI/Tab.cpp:3656 src/libslic3r/PrintConfig.cpp:2469 +#: src/libslic3r/PrintConfig.cpp:2476 src/libslic3r/PrintConfig.cpp:2485 +#: src/libslic3r/PrintConfig.cpp:2494 src/libslic3r/PrintConfig.cpp:2504 +#: src/libslic3r/PrintConfig.cpp:2530 src/libslic3r/PrintConfig.cpp:2537 +#: src/libslic3r/PrintConfig.cpp:2548 src/libslic3r/PrintConfig.cpp:2558 +#: src/libslic3r/PrintConfig.cpp:2567 src/libslic3r/PrintConfig.cpp:2580 +#: src/libslic3r/PrintConfig.cpp:2590 src/libslic3r/PrintConfig.cpp:2599 +#: src/libslic3r/PrintConfig.cpp:2609 src/libslic3r/PrintConfig.cpp:2621 +#: src/libslic3r/PrintConfig.cpp:2629 +msgid "Supports" +msgstr "서포트" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:96 src/slic3r/GUI/GUI_ObjectList.cpp:570 +#: src/slic3r/GUI/Tab.cpp:3684 src/slic3r/GUI/Tab.cpp:3685 +#: src/libslic3r/PrintConfig.cpp:2637 src/libslic3r/PrintConfig.cpp:2644 +#: src/libslic3r/PrintConfig.cpp:2658 src/libslic3r/PrintConfig.cpp:2668 +#: src/libslic3r/PrintConfig.cpp:2681 src/libslic3r/PrintConfig.cpp:2690 +#: src/libslic3r/PrintConfig.cpp:2701 src/libslic3r/PrintConfig.cpp:2712 +#: src/libslic3r/PrintConfig.cpp:2722 src/libslic3r/PrintConfig.cpp:2732 +msgid "Pad" +msgstr "패드" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:217 +msgid "Name" +msgstr "이름" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:271 +#, c-format +msgid "Auto-repaired (%d errors):\n" +msgstr "오류자동수정 (%d errors)\n" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:278 +msgid "degenerate facets" +msgstr "더러운 면" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:279 +msgid "edges fixed" +msgstr "모서리 고정" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:280 +msgid "facets removed" +msgstr "면 제거" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:281 +msgid "facets added" +msgstr "면 추가됨" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:282 +msgid "facets reversed" +msgstr "면 반전" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:283 +msgid "backwards edges" +msgstr "뒤쪽 가장자리" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:291 +msgid "Right button click the icon to fix STL through Netfabb" +msgstr "아이콘을 클릭 하여 Netfabb에서 STL을 수정 합니다" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:325 +msgid "Right button click the icon to change the object settings" +msgstr "아이콘을 클릭 하여 개체 설정을 변경 합니다" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:375 src/slic3r/GUI/GUI_ObjectList.cpp:396 +#: src/slic3r/GUI/GUI_ObjectList.cpp:408 src/slic3r/GUI/GUI_ObjectList.cpp:3508 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3518 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3550 src/slic3r/GUI/wxExtensions.cpp:576 +#: src/slic3r/GUI/wxExtensions.cpp:633 src/slic3r/GUI/wxExtensions.cpp:658 +#: src/slic3r/GUI/wxExtensions.cpp:794 +msgid "default" +msgstr "기본값" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:380 src/slic3r/GUI/Tab.cpp:1613 +#: src/libslic3r/PrintConfig.cpp:470 +msgid "Extruder" +msgstr "익스트루더(Extruder)" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:493 +msgid "Rename Object" +msgstr "개체 이름 바꾸기" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:493 +msgid "Rename Sub-object" +msgstr "하위 오브젝트 이름 바꾸기" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:934 src/slic3r/GUI/GUI_ObjectList.cpp:3346 +msgid "Instances to Separated Objects" +msgstr "분리된 객체에 대한 복제본" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:952 +msgid "Remove Volume(s)" +msgstr "볼륨 제거" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1007 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1316 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1322 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1556 +#, c-format +msgid "Quick Add Settings (%s)" +msgstr "빠른 추가 설정 (%s)" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1077 +msgid "Select showing settings" +msgstr "설정 표시를 선택 합니다" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1126 +msgid "Add Settings for Layers" +msgstr "도면층에 대한 설정 추가" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1127 +msgid "Add Settings for Sub-object" +msgstr "하위 개체에 대한 설정 추가" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1128 +msgid "Add Settings for Object" +msgstr "개체에 대한 설정 추가" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1189 +msgid "Add Settings Bundle for Layers" +msgstr "레이어에 대한 설정 번들 추가" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1190 +msgid "Add Settings Bundle for Sub-object" +msgstr "하위 오브젝트에 대한 설정 번들 추가" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1191 +msgid "Add Settings Bundle for Object" +msgstr "개체에 대한 설정 번들 추가" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1230 +msgid "Load" +msgstr "불러오기" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1235 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1260 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1263 +msgid "Box" +msgstr "박스" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1235 +msgid "Cylinder" +msgstr "원통" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1235 +msgid "Sphere" +msgstr "영역" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1235 +msgid "Slab" +msgstr "슬랩" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1287 +msgid "Edit Layers" +msgstr "레이어 편집" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1295 +msgid "Add settings" +msgstr "다음 설정" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1362 +msgid "Change type" +msgstr "타입 변경" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1369 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1510 +msgid "Set as a Separated Object" +msgstr "분리 된 객체로 설정" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1375 +msgid "Rename" +msgstr "이름 변경" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1386 +msgid "Fix through the Netfabb" +msgstr "네트워크를 통해 수정" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1396 src/slic3r/GUI/Plater.cpp:3496 +msgid "Export as STL" +msgstr "STL로 내보내기" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1403 +msgid "Change extruder" +msgstr "압출기(익스트루더) 변경" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1422 src/libslic3r/PrintConfig.cpp:309 +msgid "Default" +msgstr "기본값" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1428 +msgid "Select new extruder for the object/part" +msgstr "객체/부품에 대한 새 압출(익스트루더) 기 선택" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1440 +msgid "Scale to print volume" +msgstr "인쇄 볼륨에 따라 배율 조정" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1440 +msgid "Scale the selected object to fit the print volume" +msgstr "인쇄 볼륨에 맞게 선택한 오브젝트의 배율 조정" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1510 +msgid "Set as a Separated Objects" +msgstr "분리 된 객체로 설정" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1585 +msgid "Load Part" +msgstr "하중 부품" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1617 +msgid "Error!" +msgstr "에러!" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1662 +msgid "Add Generic Subobject" +msgstr "일반 하위 개체 추가" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1669 +msgid "Generic" +msgstr "일반" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1770 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1872 +msgid "Last instance of an object cannot be deleted." +msgstr "개체의 마지막 복제본를 삭제할 수 없습니다." + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1782 +msgid "Delete Settings" +msgstr "설정 삭제" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1806 +msgid "Delete All Instances from Object" +msgstr "개체에서 모든 복제본 삭제" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1822 +msgid "Delete Layers Range" +msgstr "레이어 범위 삭제" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1853 +msgid "From Object List You can't delete the last solid part from object." +msgstr "개체 목록에서 개체에서 마지막 솔리드 부품을 삭제할 수 없습니다." + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1857 +msgid "Delete Subobject" +msgstr "하위 개체 삭제" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1876 +msgid "Delete Instance" +msgstr "복제본 삭제" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1900 src/slic3r/GUI/Plater.cpp:2793 +msgid "" +"The selected object couldn't be split because it contains only one part." +msgstr "" +"선택한 오브젝트는 파트 하나만 포함되어 있기 때문에 분할 할 수 없습니다." + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1904 +msgid "Split to Parts" +msgstr "파트로 분할" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1950 +msgid "Add Layers" +msgstr "레이어 추가" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2075 +msgid "Group manipulation" +msgstr "그룹 조작" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2087 +msgid "Object manipulation" +msgstr "개체 조작" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2100 +msgid "Object Settings to modify" +msgstr "수정할 개체 설정" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2104 +msgid "Part Settings to modify" +msgstr "수정할 부품 설정" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2109 +msgid "Layer range Settings to modify" +msgstr "레이어 범위 설정 수정" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2115 +msgid "Part manipulation" +msgstr "파트 조작" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2121 +msgid "Instance manipulation" +msgstr "복제본 제거" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2128 +msgid "Layers Editing" +msgstr "레이어층을 편집" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2128 +msgid "Layer Editing" +msgstr "레이어 편집" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2303 +msgid "Delete Selected Item" +msgstr "선택한 항목 삭제" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2415 +msgid "Delete Selected" +msgstr "선택된 것을 삭제" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2484 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2513 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2531 +msgid "Add New Layers Range" +msgstr "새 레이어 범위 추가" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2590 +msgid "Edit Layers Range" +msgstr "레이어 범위 편집" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2867 +msgid "Selection-Remove from list" +msgstr "목록에서 선택-제거" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2875 +msgid "Selection-Add from list" +msgstr "목록에서 선택-추가" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2993 +msgid "Object or Instance" +msgstr "개체 또는 복제본" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2994 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3127 +msgid "Part" +msgstr "부품(Part)" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2994 +msgid "Layer" +msgstr "레이어" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2996 +msgid "Unsupported selection" +msgstr "지원 되지 않는 선택" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2997 +#, c-format +msgid "You started your selection with %s Item." +msgstr "%s 항목으로 선택을 시작 했습니다." + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2998 +#, c-format +msgid "In this mode you can select only other %s Items%s" +msgstr "이 모드에서는 %s의 다른 %s 항목만 선택할 수 있습니다" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3001 +msgid "of a current Object" +msgstr "현재 개체의" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3006 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3081 src/slic3r/GUI/Plater.cpp:126 +msgid "Info" +msgstr "정보" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3122 +msgid "You can't change a type of the last solid part of the object." +msgstr "객체의 마지막 솔리드 부품 유형은 변경할 수 없습니다." + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3127 +msgid "Modifier" +msgstr "편집 영역" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3127 +msgid "Support Enforcer" +msgstr "서포트 지원 영역" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3127 +msgid "Support Blocker" +msgstr "서포트 금지 영역" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3129 +msgid "Type:" +msgstr "형식:" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3129 +msgid "Select type of part" +msgstr "부품 유형 선택" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3134 +msgid "Change Part Type" +msgstr "부품 유형 변경" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3368 +msgid "Enter new name" +msgstr "새 이름 입력" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3368 +msgid "Renaming" +msgstr "이름 바꾸기" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3384 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3480 src/slic3r/GUI/Tab.cpp:3536 +#: src/slic3r/GUI/Tab.cpp:3540 +msgid "The supplied name is not valid;" +msgstr "제공된 이름이 유효하지 않습니다;" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3385 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3481 src/slic3r/GUI/Tab.cpp:3537 +msgid "the following characters are not allowed:" +msgstr "다음 문자는 허용되지 않습니다:" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3498 +msgid "Set extruder for selected items" +msgstr "선택한 항목에 대한 압출기(익스트루더) 설정" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3499 +msgid "Select extruder number for selected objects and/or parts" +msgstr "선택한 객체 및 부품에 대한 압출기(익스트루더) 번호 선택" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3512 +msgid "Select extruder number:" +msgstr "압출기(익스트루더) 번호 선택:" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3513 +msgid "This extruder will be set for selected items" +msgstr "선택한 항목에 대한 압출기(익스트루더) 설정" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:62 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:105 +msgid "World coordinates" +msgstr "전체크기와 좌표" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:63 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:106 +msgid "Local coordinates" +msgstr "로컬 좌표" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:82 +msgid "Select coordinate space, in which the transformation will be performed." +msgstr "변환이 수행될 좌표 공간을 선택 합니다." + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:125 +msgid "Object Manipulation" +msgstr "개체 조작" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:176 +msgid "Object name" +msgstr "개체 이름" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:212 +#, c-format +msgid "Toggle %c axis mirroring" +msgstr "전환 %c 축 미러링" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:245 +msgid "Set Mirror" +msgstr "미러 설정" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:285 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:290 +msgid "Reset scale" +msgstr "스케일 재설정" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:303 +msgid "Reset rotation" +msgstr "회전 재설정" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:328 +msgid "Reset Rotation" +msgstr "회전 재설정" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:340 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:355 +msgid "Drop to bed" +msgstr "잠자리에 들기" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:388 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:443 +msgid "Position" +msgstr "위치" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:389 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:444 +msgid "Rotation" +msgstr "회전" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:445 +msgid "Scale factors" +msgstr "축척 계수" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:502 +msgid "Translate" +msgstr "번역" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:554 +msgid "" +"You cann't use non-uniform scaling mode for multiple objects/parts selection" +msgstr "" +"여러 객체/부품 선택에 는 균일하지 않은 배율 조정 모드를 사용할 수 없습니다." + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:715 +msgid "Set Position" +msgstr "위치 설정" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:746 +msgid "Set Orientation" +msgstr "방향 설정" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:811 +msgid "Set Scale" +msgstr "축척 설정" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:895 +msgid "" +"The currently manipulated object is tilted (rotation angles are not " +"multiples of 90°).\n" +"Non-uniform scaling of tilted objects is only possible in the World " +"coordinate system,\n" +"once the rotation is embedded into the object coordinates." +msgstr "" +"현재 조작 된 오브젝트가 기울어져 있습니다 (회전 각도가 90 °의 배수가 아님).\n" +"기울어진 오브젝트의 비균일 배율 조정은 표준 좌표계에서만 가능 합니다.\n" +"회전이 오브젝트 좌표로 삽입되면." + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:898 +msgid "" +"This operation is irreversible.\n" +"Do you want to proceed?" +msgstr "" +"이 작업은 되돌릴수 없습니다.\n" +"계속 하 시겠습니까?" + +#: src/slic3r/GUI/GUI_ObjectSettings.cpp:58 +msgid "Additional Settings" +msgstr "추가적인 세팅" + +#: src/slic3r/GUI/GUI_ObjectSettings.cpp:94 +msgid "Remove parameter" +msgstr "매개 변수 제거" + +#: src/slic3r/GUI/GUI_ObjectSettings.cpp:100 +#, c-format +msgid "Delete Option %s" +msgstr "삭제 %s 옵션" + +#: src/slic3r/GUI/GUI_ObjectSettings.cpp:144 +#, c-format +msgid "Change Option %s" +msgstr "옵션 %s 변경" + +#: src/slic3r/GUI/GUI_Preview.cpp:216 +msgid "View" +msgstr "보기" + +#: src/slic3r/GUI/GUI_Preview.cpp:219 src/slic3r/GUI/GUI_Preview.cpp:554 +#: src/libslic3r/GCode/PreviewData.cpp:394 +msgid "Feature type" +msgstr "특색 유형" + +#: src/slic3r/GUI/GUI_Preview.cpp:220 src/libslic3r/PrintConfig.cpp:483 +msgid "Height" +msgstr "높이" + +#: src/slic3r/GUI/GUI_Preview.cpp:221 src/libslic3r/PrintConfig.cpp:2188 +msgid "Width" +msgstr "폭" + +#: src/slic3r/GUI/GUI_Preview.cpp:223 +msgid "Volumetric flow rate" +msgstr "용적의 유량값" + +#: src/slic3r/GUI/GUI_Preview.cpp:224 src/slic3r/GUI/GUI_Preview.cpp:328 +#: src/slic3r/GUI/GUI_Preview.cpp:506 src/slic3r/GUI/GUI_Preview.cpp:553 +#: src/slic3r/GUI/GUI_Preview.cpp:749 src/libslic3r/GCode/PreviewData.cpp:404 +msgid "Tool" +msgstr "도구" + +#: src/slic3r/GUI/GUI_Preview.cpp:225 src/slic3r/GUI/GUI_Preview.cpp:551 +#: src/libslic3r/GCode/PreviewData.cpp:406 +msgid "Color Print" +msgstr "컬러 프린트" + +#: src/slic3r/GUI/GUI_Preview.cpp:228 +msgid "Show" +msgstr "보다" + +#: src/slic3r/GUI/GUI_Preview.cpp:231 src/slic3r/GUI/GUI_Preview.cpp:232 +msgid "Feature types" +msgstr "특색 유형" + +#: src/slic3r/GUI/GUI_Preview.cpp:234 src/libslic3r/GCode/PreviewData.cpp:163 +msgid "Perimeter" +msgstr "가장자리" + +#: src/slic3r/GUI/GUI_Preview.cpp:235 src/libslic3r/GCode/PreviewData.cpp:164 +msgid "External perimeter" +msgstr "외부 가장자리" + +#: src/slic3r/GUI/GUI_Preview.cpp:236 src/libslic3r/GCode/PreviewData.cpp:165 +msgid "Overhang perimeter" +msgstr "오버행(Overhang) 둘레" + +#: src/slic3r/GUI/GUI_Preview.cpp:237 src/libslic3r/GCode/PreviewData.cpp:166 +msgid "Internal infill" +msgstr "내부 채움" + +#: src/slic3r/GUI/GUI_Preview.cpp:238 src/libslic3r/PrintConfig.cpp:1736 +#: src/libslic3r/PrintConfig.cpp:1746 src/libslic3r/GCode/PreviewData.cpp:167 +msgid "Solid infill" +msgstr "솔리드 인필" + +#: src/slic3r/GUI/GUI_Preview.cpp:239 src/libslic3r/PrintConfig.cpp:2068 +#: src/libslic3r/PrintConfig.cpp:2079 src/libslic3r/GCode/PreviewData.cpp:168 +msgid "Top solid infill" +msgstr "가장 윗부분 채움" + +#: src/slic3r/GUI/GUI_Preview.cpp:240 src/libslic3r/GCode/PreviewData.cpp:169 +msgid "Bridge infill" +msgstr "브릿지 채움" + +#: src/slic3r/GUI/GUI_Preview.cpp:241 src/libslic3r/PrintConfig.cpp:895 +#: src/libslic3r/GCode/PreviewData.cpp:170 +msgid "Gap fill" +msgstr "공백 채움" + +#: src/slic3r/GUI/GUI_Preview.cpp:242 src/slic3r/GUI/Tab.cpp:1061 +#: src/libslic3r/GCode/PreviewData.cpp:171 +msgid "Skirt" +msgstr "스커트" + +#: src/slic3r/GUI/GUI_Preview.cpp:244 src/libslic3r/PrintConfig.cpp:1954 +#: src/libslic3r/GCode/PreviewData.cpp:173 +msgid "Support material interface" +msgstr "서포트 재료 인터페이스" + +#: src/slic3r/GUI/GUI_Preview.cpp:245 src/slic3r/GUI/Tab.cpp:1141 +#: src/libslic3r/GCode/PreviewData.cpp:174 +msgid "Wipe tower" +msgstr "와이프 타워(Wipe tower)" + +#: src/slic3r/GUI/GUI_Preview.cpp:250 src/libslic3r/PrintConfig.cpp:2102 +msgid "Travel" +msgstr "이송" + +#: src/slic3r/GUI/GUI_Preview.cpp:251 +msgid "Retractions" +msgstr "리트랙션" + +#: src/slic3r/GUI/GUI_Preview.cpp:252 +msgid "Unretractions" +msgstr "리트랙션 취소" + +#: src/slic3r/GUI/GUI_Preview.cpp:253 +msgid "Shells" +msgstr "쉘" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:13 src/slic3r/GUI/MainFrame.cpp:672 +msgid "Keyboard Shortcuts" +msgstr "키보드 바로 가기" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:104 +msgid "Open project STL/OBJ/AMF/3MF with config, delete bed" +msgstr "구성으로 프로젝트 STL/OBJ/AMF/3MF 열기, 배드 삭제" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:105 +msgid "Import STL/OBJ/AMF/3MF without config, keep bed" +msgstr "구성 없이 STL/OBJ/AMF/3MF 가져오기, 배드 유지" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:106 +msgid "Load Config from .ini/amf/3mf/gcode" +msgstr ".Ini/amf/3mf/gcode에서 구성 로드" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:107 src/slic3r/GUI/Plater.cpp:822 +#: src/slic3r/GUI/Plater.cpp:4687 src/libslic3r/PrintConfig.cpp:3127 +msgid "Export G-code" +msgstr "G-코드 내보내기" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:108 +msgid "Save project (3MF)" +msgstr "프로젝트 저장 (3MF)" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:109 +msgid "Load Config from .ini/amf/3mf/gcode and merge" +msgstr ".Ini/amf/3mf/gcode 및 병합에서 구성 로드" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:110 +msgid "(Re)slice" +msgstr "(Re)슬라이스" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:113 +msgid "Select Plater Tab" +msgstr "선택 및 플래이트 탭" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:115 +msgid "Select Print Settings Tab" +msgstr "인쇄 설정 탭을 선택 합니다" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:116 +msgid "Select Filament Settings Tab" +msgstr "필라멘트 설정 탭 선택" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:117 +msgid "Select Printer Settings Tab" +msgstr "프린터 설정 탭을 선택 합니다" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:118 +msgid "Switch to 3D" +msgstr "3D로 전환" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:119 +msgid "Switch to Preview" +msgstr "미리 보기로 전환" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:120 src/slic3r/GUI/Preferences.cpp:10 +msgid "Preferences" +msgstr "기본 설정" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:121 +#: src/slic3r/GUI/PrintHostDialogs.cpp:136 +msgid "Print host upload queue" +msgstr "호스트 업로드 대기열 인쇄" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:122 +msgid "Camera view" +msgstr "카메라 뷰" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:123 +msgid "Add Instance of the selected object" +msgstr "선택한 개체의 복제본 추가" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:124 +msgid "Remove Instance of the selected object" +msgstr "선택한 개체의 복제본 제거" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:125 +msgid "Show keyboard shortcuts list" +msgstr "바로 가기 키 목록 표시" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:126 +msgid "Press to select multiple object or move multiple object with mouse" +msgstr "여러 개체를 선택 하거나 마우스로 여러 개체를 이동 하려면 누릅니다" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:128 +msgid "Main Shortcuts" +msgstr "주요 단축키" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:135 +msgid "Select All objects" +msgstr "모든 객체 선택" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:136 +msgid "Delete selected" +msgstr "선택 삭제" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:137 +msgid "Delete All" +msgstr "전부 지움" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:138 +msgid "Copy to clipboard" +msgstr "클립보드로 복사" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:139 +msgid "Paste from clipboard" +msgstr "클립보드에서 붙여넣기" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:140 +msgid "Gizmo move" +msgstr "객체 이동" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:141 +msgid "Gizmo scale" +msgstr "객체 배율" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:142 +msgid "Gizmo rotate" +msgstr "객체 회전" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:143 +msgid "Gizmo cut" +msgstr "기즈모 자르기" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:144 +msgid "Gizmo Place face on bed" +msgstr "기즈모를 배드위에서" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:145 +msgid "Gizmo SLA support points" +msgstr "객체 SLA 지원 포인트" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:146 +#, c-format +msgid "" +"Press to activate selection rectangle\n" +"or to snap by 5% in Gizmo scale\n" +"or to snap by 1mm in Gizmo move" +msgstr "" +"활성화된 사각형을 선택합니다.\n" +"5% in 객체 크기를 스냅에 맞춰 조절합니다.\n" +"1mm 씩 객체를 스냅에 맞추 이동합니다." + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:147 +msgid "" +"Press to scale selection to fit print volume\n" +"in Gizmo scale" +msgstr "" +"인쇄 볼륨에 맞게 선택 크기를 조정하려면 누릅니다.\n" +"기즈모 스케일" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:148 +msgid "" +"Press to activate deselection rectangle\n" +"or to scale or rotate selected objects\n" +"around their own center" +msgstr "" +"자신의 중심 주변\n" +"선택한 개체의 크기를 조정 하거나\n" +"회전 하려면 누릅니다" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:149 +msgid "Press to activate one direction scaling in Gizmo scale" +msgstr "기즈모 크기 조절을 활성화 합니다." + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:150 +msgid "Change camera type" +msgstr "카메라 유형 변경" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:151 +msgid "Zoom to Bed" +msgstr "배드 확대" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:152 +msgid "Zoom to all objects in scene, if none selected" +msgstr "장면의 모든 오브젝트로 확대/축소 (선택 하지 않은 경우)" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:153 +msgid "Zoom to selected object" +msgstr "선택한 개체로 확대/축소" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:154 +msgid "Zoom in" +msgstr "확대" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:155 +msgid "Zoom out" +msgstr "줌 아웃" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:156 +msgid "Unselect gizmo / Clear selection" +msgstr "기즈모 선택을 취소 하거나 지우기" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:158 +msgid "Toggle picking pass texture rendering on/off" +msgstr "선택 패스 텍스처 렌더링 켜기/끄기 전환" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:161 +msgid "Plater Shortcuts" +msgstr "플레이터 단축기" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:176 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:187 +msgid "Arrow Up" +msgstr "위쪽 화살표" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:176 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:178 +msgid "Upper Layer" +msgstr "상위 레이어" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:177 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:188 +msgid "Arrow Down" +msgstr "아래쪽 화살표" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:177 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:179 +msgid "Lower Layer" +msgstr "하위 레이어" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:181 +msgid "Preview Shortcuts" +msgstr "미리보기 단축기" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:187 +msgid "Move current slider thumb Up" +msgstr "현재 마우스 휠 슬라이더를 위로 이동" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:188 +msgid "Move current slider thumb Down" +msgstr "현재 마우스 휠 슬라이더를 아래로 이동" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:189 +msgid "Arrow Left" +msgstr "왼쪽 화살표" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:189 +msgid "Set upper thumb to current slider thumb" +msgstr "마우스 휠을 위로 움직여 설정" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:190 +msgid "Arrow Right" +msgstr "오른쪽 화살표" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:190 +msgid "Set lower thumb to current slider thumb" +msgstr "마우스 휠을 아래로 움직여 설정" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:191 +msgid "Add color change marker for current layer" +msgstr "현재 레이어의 색상 변경 마커 추가" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:192 +msgid "Delete color change marker for current layer" +msgstr "현재 레이어의 색상 변경 마커 삭제" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:194 +msgid "Layers Slider Shortcuts" +msgstr "레이어 슬라이더 단축키" + +#: src/slic3r/GUI/MainFrame.cpp:62 +msgid "" +" - Remember to check for updates at http://github.com/prusa3d/PrusaSlicer/" +"releases" +msgstr "" +" -http://github.com/prusa3d/slic3r/releases에서 업데이트를 확인하는 것을 잊" +"지 마십시오" + +#: src/slic3r/GUI/MainFrame.cpp:157 +msgid "based on Slic3r" +msgstr "Slic3r 기반" + +#: src/slic3r/GUI/MainFrame.cpp:187 +msgid "Plater" +msgstr "플레이터" + +#: src/slic3r/GUI/MainFrame.cpp:393 +msgid "&New Project" +msgstr "&새로운 프로젝트" + +#: src/slic3r/GUI/MainFrame.cpp:393 +msgid "Start a new project" +msgstr "새로운 프로젝트 시작" + +#: src/slic3r/GUI/MainFrame.cpp:396 +msgid "&Open Project" +msgstr "&프로젝트 열기" + +#: src/slic3r/GUI/MainFrame.cpp:396 +msgid "Open a project file" +msgstr "프로젝트 파일 열기" + +#: src/slic3r/GUI/MainFrame.cpp:401 +msgid "Recent projects" +msgstr "최근 프로젝트" + +#: src/slic3r/GUI/MainFrame.cpp:410 +msgid "The selected project is no more available" +msgstr "선택한 프로젝트를 더 이상 사용할 수 없습니다." + +#: src/slic3r/GUI/MainFrame.cpp:410 src/slic3r/GUI/MainFrame.cpp:747 +#: src/slic3r/GUI/PrintHostDialogs.cpp:231 +msgid "Error" +msgstr "에러" + +#: src/slic3r/GUI/MainFrame.cpp:434 +msgid "&Save Project" +msgstr "프로젝트 저장" + +#: src/slic3r/GUI/MainFrame.cpp:434 +msgid "Save current project file" +msgstr "현재 프로젝트 파일 저장" + +#: src/slic3r/GUI/MainFrame.cpp:438 src/slic3r/GUI/MainFrame.cpp:440 +msgid "Save Project &as" +msgstr "프로젝트 저장" + +#: src/slic3r/GUI/MainFrame.cpp:438 src/slic3r/GUI/MainFrame.cpp:440 +msgid "Save current project file as" +msgstr "현재 프로젝트 파일을 다른 이름으로 저장" + +#: src/slic3r/GUI/MainFrame.cpp:448 +msgid "Import STL/OBJ/AM&F/3MF" +msgstr "가져오기 STL/OBJ/AM&F/3MF" + +#: src/slic3r/GUI/MainFrame.cpp:448 +msgid "Load a model" +msgstr "모델 로드" + +#: src/slic3r/GUI/MainFrame.cpp:452 +msgid "Import &Config" +msgstr "&구성 가져오기" + +#: src/slic3r/GUI/MainFrame.cpp:452 +msgid "Load exported configuration file" +msgstr "내 보낸 구성 파일로드" + +#: src/slic3r/GUI/MainFrame.cpp:454 +msgid "Import Config from &project" +msgstr "프로젝트에서 설정 가져오기" + +#: src/slic3r/GUI/MainFrame.cpp:454 +msgid "Load configuration from project file" +msgstr "프로젝트 파일에서 구성 로드" + +#: src/slic3r/GUI/MainFrame.cpp:457 +msgid "Import Config &Bundle" +msgstr "번들 &설정 가져오기" + +#: src/slic3r/GUI/MainFrame.cpp:457 +msgid "Load presets from a bundle" +msgstr "번들에서 미리 설정로드" + +#: src/slic3r/GUI/MainFrame.cpp:459 +msgid "&Import" +msgstr "&가져오기" + +#: src/slic3r/GUI/MainFrame.cpp:462 src/slic3r/GUI/MainFrame.cpp:708 +msgid "Export &G-code" +msgstr "G-코드 내보내기" + +#: src/slic3r/GUI/MainFrame.cpp:462 +msgid "Export current plate as G-code" +msgstr "현재 플레이터를 G 코드로 내보내기" + +#: src/slic3r/GUI/MainFrame.cpp:466 src/slic3r/GUI/MainFrame.cpp:709 +msgid "S&end G-code" +msgstr "S&엔드 G- 코드" + +#: src/slic3r/GUI/MainFrame.cpp:466 +msgid "Send to print current plate as G-code" +msgstr "현재 플레이트를 G 코드로 인쇄하기 위해 보내기" + +#: src/slic3r/GUI/MainFrame.cpp:471 +msgid "Export plate as &STL" +msgstr "STL로 내보내기" + +#: src/slic3r/GUI/MainFrame.cpp:471 +msgid "Export current plate as STL" +msgstr "현재 플레이터를 STL로 내보내기" + +#: src/slic3r/GUI/MainFrame.cpp:474 +msgid "Export plate as STL including supports" +msgstr "서포트를 포함하여 STL파일로 내보내기" + +#: src/slic3r/GUI/MainFrame.cpp:474 +msgid "Export current plate as STL including supports" +msgstr "서포트를 포함 하여 현재 플레이터를 STL로 내보내기" + +#: src/slic3r/GUI/MainFrame.cpp:477 +msgid "Export plate as &AMF" +msgstr "AMF로 내보내기" + +#: src/slic3r/GUI/MainFrame.cpp:477 +msgid "Export current plate as AMF" +msgstr "현재 플레이터를AMF로 내보내기" + +#: src/slic3r/GUI/MainFrame.cpp:481 +msgid "Export &Config" +msgstr "&구성 내보내기" + +#: src/slic3r/GUI/MainFrame.cpp:481 +msgid "Export current configuration to file" +msgstr "현재 구성을 파일로 내보내기" + +#: src/slic3r/GUI/MainFrame.cpp:483 +msgid "Export Config &Bundle" +msgstr "번들 & 내보내기 설정" + +#: src/slic3r/GUI/MainFrame.cpp:483 +msgid "Export all presets to file" +msgstr "모든 이전 설정을 파일로 내보내기" + +#: src/slic3r/GUI/MainFrame.cpp:485 +msgid "&Export" +msgstr "&내보내기" + +#: src/slic3r/GUI/MainFrame.cpp:491 +msgid "Quick Slice" +msgstr "빠른 슬라이스" + +#: src/slic3r/GUI/MainFrame.cpp:491 +msgid "Slice a file into a G-code" +msgstr "파일을 G 코드로 분할" + +#: src/slic3r/GUI/MainFrame.cpp:497 +msgid "Quick Slice and Save As" +msgstr "빠른 슬라이스 및 다른 이름으로 저장" + +#: src/slic3r/GUI/MainFrame.cpp:497 +msgid "Slice a file into a G-code, save as" +msgstr "파일을 G 코드로 분할하고 다음으로 저장" + +#: src/slic3r/GUI/MainFrame.cpp:503 +msgid "Repeat Last Quick Slice" +msgstr "마지막으로 빠른 슬라이스 반복" + +#: src/slic3r/GUI/MainFrame.cpp:503 +msgid "Repeat last quick slice" +msgstr "마지막으로 빠른 슬라이스 반복" + +#: src/slic3r/GUI/MainFrame.cpp:511 +msgid "(Re)Slice No&w" +msgstr "지금(다시)자르기" + +#: src/slic3r/GUI/MainFrame.cpp:511 +msgid "Start new slicing process" +msgstr "새로운 슬라이싱 작업 시작" + +#: src/slic3r/GUI/MainFrame.cpp:515 +msgid "&Repair STL file" +msgstr "STL 파일 복구" + +#: src/slic3r/GUI/MainFrame.cpp:515 +msgid "Automatically repair an STL file" +msgstr "STL 파일을 자동으로 복구합니다" + +#: src/slic3r/GUI/MainFrame.cpp:518 +msgid "&Quit" +msgstr "&종료" + +#: src/slic3r/GUI/MainFrame.cpp:518 +#, c-format +msgid "Quit %s" +msgstr "%s 종료" + +#: src/slic3r/GUI/MainFrame.cpp:543 +msgid "&Select all" +msgstr "&모두 선택 " + +#: src/slic3r/GUI/MainFrame.cpp:544 +msgid "Selects all objects" +msgstr "모든 개체를 선택 합니다" + +#: src/slic3r/GUI/MainFrame.cpp:546 +msgid "D&eselect all" +msgstr "선택 취소 D&eselect" + +#: src/slic3r/GUI/MainFrame.cpp:547 +msgid "Deselects all objects" +msgstr "모든 객체 선택 취소" + +#: src/slic3r/GUI/MainFrame.cpp:550 +msgid "&Delete selected" +msgstr "&선택 삭제 " + +#: src/slic3r/GUI/MainFrame.cpp:551 +msgid "Deletes the current selection" +msgstr "현재 선택 영역을 삭제 합니다" + +#: src/slic3r/GUI/MainFrame.cpp:553 +msgid "Delete &all" +msgstr "전부 지움 " + +#: src/slic3r/GUI/MainFrame.cpp:554 +msgid "Deletes all objects" +msgstr "모든 객체를 삭제 합니다" + +#: src/slic3r/GUI/MainFrame.cpp:558 +msgid "&Undo" +msgstr "&되돌리기" + +#: src/slic3r/GUI/MainFrame.cpp:561 +msgid "&Redo" +msgstr "&앞으로" + +#: src/slic3r/GUI/MainFrame.cpp:566 +msgid "&Copy" +msgstr "&복사 " + +#: src/slic3r/GUI/MainFrame.cpp:567 +msgid "Copy selection to clipboard" +msgstr "선택영역을 클립보드로 복사합니다" + +#: src/slic3r/GUI/MainFrame.cpp:569 +msgid "&Paste" +msgstr "&붙이기 " + +#: src/slic3r/GUI/MainFrame.cpp:570 +msgid "Paste clipboard" +msgstr "클립보드 붙여넣기" + +#: src/slic3r/GUI/MainFrame.cpp:579 +msgid "&Plater Tab" +msgstr "&선택 및 플래이터 탭" + +#: src/slic3r/GUI/MainFrame.cpp:579 +msgid "Show the plater" +msgstr "플레이터를 보기" + +#: src/slic3r/GUI/MainFrame.cpp:586 +msgid "P&rint Settings Tab" +msgstr "프린트 설정 탭" + +#: src/slic3r/GUI/MainFrame.cpp:586 +msgid "Show the print settings" +msgstr "인쇄 설정 표시" + +#: src/slic3r/GUI/MainFrame.cpp:588 src/slic3r/GUI/MainFrame.cpp:711 +msgid "&Filament Settings Tab" +msgstr "&필라멘트 설정 탭" + +#: src/slic3r/GUI/MainFrame.cpp:588 +msgid "Show the filament settings" +msgstr "필라멘트 설정보기" + +#: src/slic3r/GUI/MainFrame.cpp:591 +msgid "Print&er Settings Tab" +msgstr "설정 인쇄 탭" + +#: src/slic3r/GUI/MainFrame.cpp:591 +msgid "Show the printer settings" +msgstr "간단한 설정보기" + +#: src/slic3r/GUI/MainFrame.cpp:595 +msgid "3&D" +msgstr "3&D" + +#: src/slic3r/GUI/MainFrame.cpp:595 +msgid "Show the 3D editing view" +msgstr "3D 편집용 보기 표시" + +#: src/slic3r/GUI/MainFrame.cpp:598 +msgid "Pre&view" +msgstr "미리 보기" + +#: src/slic3r/GUI/MainFrame.cpp:598 +msgid "Show the 3D slices preview" +msgstr "3D 슬라이스 미리 보기 표시" + +#: src/slic3r/GUI/MainFrame.cpp:617 +msgid "Print &Host Upload Queue" +msgstr "호스트 업로드 대기열 인쇄" + +#: src/slic3r/GUI/MainFrame.cpp:617 +msgid "Display the Print Host Upload Queue window" +msgstr "호스트 업로드 대기열 인쇄 창 표시" + +#: src/slic3r/GUI/MainFrame.cpp:626 +msgid "Iso" +msgstr "기본 " + +#: src/slic3r/GUI/MainFrame.cpp:626 +msgid "Iso View" +msgstr "표준 보기" + +#. TRN To be shown in the main menu View->Top +#. TRN To be shown in Print Settings "Top solid layers" +#: src/slic3r/GUI/MainFrame.cpp:630 src/libslic3r/PrintConfig.cpp:2094 +msgid "Top" +msgstr "윗부분 " + +#: src/slic3r/GUI/MainFrame.cpp:630 +msgid "Top View" +msgstr "위에서 보기" + +#. TRN To be shown in the main menu View->Bottom +#. TRN To be shown in Print Settings "Bottom solid layers" +#: src/slic3r/GUI/MainFrame.cpp:633 src/libslic3r/PrintConfig.cpp:159 +msgid "Bottom" +msgstr "바닥 " + +#: src/slic3r/GUI/MainFrame.cpp:633 +msgid "Bottom View" +msgstr "바닥 보기" + +#: src/slic3r/GUI/MainFrame.cpp:635 +msgid "Front" +msgstr "앞 " + +#: src/slic3r/GUI/MainFrame.cpp:635 +msgid "Front View" +msgstr "앞면 보기 " + +#: src/slic3r/GUI/MainFrame.cpp:637 src/libslic3r/PrintConfig.cpp:1611 +msgid "Rear" +msgstr "뒷면 " + +#: src/slic3r/GUI/MainFrame.cpp:637 +msgid "Rear View" +msgstr "뒷면 보기" + +#: src/slic3r/GUI/MainFrame.cpp:639 +msgid "Left" +msgstr "왼쪽 " + +#: src/slic3r/GUI/MainFrame.cpp:639 +msgid "Left View" +msgstr "왼쪽 보기" + +#: src/slic3r/GUI/MainFrame.cpp:641 +msgid "Right" +msgstr "오른쪽 " + +#: src/slic3r/GUI/MainFrame.cpp:641 +msgid "Right View" +msgstr "오른쪽 보기" + +#: src/slic3r/GUI/MainFrame.cpp:648 +msgid "Prusa 3D &Drivers" +msgstr "푸르사 3D 드라이버" + +#: src/slic3r/GUI/MainFrame.cpp:648 +msgid "Open the Prusa3D drivers download page in your browser" +msgstr "브라우저에서 Prusa3D 드라이버 다운로드 페이지를 엽니다" + +#: src/slic3r/GUI/MainFrame.cpp:650 +msgid "Software &Releases" +msgstr "소프트웨어 &자료" + +#: src/slic3r/GUI/MainFrame.cpp:650 +msgid "Open the software releases page in your browser" +msgstr "브라우저에서 소프트웨어 정보 페이지 열기" + +#: src/slic3r/GUI/MainFrame.cpp:656 +#, c-format +msgid "%s &Website" +msgstr "%s &웹사이트" + +#: src/slic3r/GUI/MainFrame.cpp:657 +#, c-format +msgid "Open the %s website in your browser" +msgstr "%s 웹사이트를 브라우저에서 열기" + +#: src/slic3r/GUI/MainFrame.cpp:663 +msgid "System &Info" +msgstr "시스템 정보" + +#: src/slic3r/GUI/MainFrame.cpp:663 +msgid "Show system information" +msgstr "시스템 정보 표시" + +#: src/slic3r/GUI/MainFrame.cpp:665 +msgid "Show &Configuration Folder" +msgstr "폴더 표시 및 구성" + +#: src/slic3r/GUI/MainFrame.cpp:665 +msgid "Show user configuration folder (datadir)" +msgstr "사용자 구성 폴더 표시 (datadir)" + +#: src/slic3r/GUI/MainFrame.cpp:667 +msgid "Report an I&ssue" +msgstr "문제를 보고" + +#: src/slic3r/GUI/MainFrame.cpp:667 +#, c-format +msgid "Report an issue on %s" +msgstr "%s에 문제 보고" + +#: src/slic3r/GUI/MainFrame.cpp:669 +#, c-format +msgid "&About %s" +msgstr "%s 에 대하여" + +#: src/slic3r/GUI/MainFrame.cpp:669 +msgid "Show about dialog" +msgstr "다이얼로그 표시" + +#: src/slic3r/GUI/MainFrame.cpp:672 +msgid "Show the list of the keyboard shortcuts" +msgstr "키보드 단축키 목록 표시" + +#: src/slic3r/GUI/MainFrame.cpp:680 +msgid "&File" +msgstr "&파일" + +#: src/slic3r/GUI/MainFrame.cpp:681 +msgid "&Edit" +msgstr "&수정" + +#: src/slic3r/GUI/MainFrame.cpp:682 +msgid "&Window" +msgstr "&윈도우" + +#: src/slic3r/GUI/MainFrame.cpp:683 +msgid "&View" +msgstr "&시점" + +#: src/slic3r/GUI/MainFrame.cpp:686 +msgid "&Help" +msgstr "&도움말" + +#: src/slic3r/GUI/MainFrame.cpp:708 +msgid "E&xport" +msgstr "보내기" + +#: src/slic3r/GUI/MainFrame.cpp:709 +msgid "S&end to print" +msgstr "끝내고 프린트" + +#: src/slic3r/GUI/MainFrame.cpp:711 +msgid "Mate&rial Settings Tab" +msgstr "재료(메터리리알) 설정 탭" + +#: src/slic3r/GUI/MainFrame.cpp:732 +msgid "Choose a file to slice (STL/OBJ/AMF/3MF/PRUSA):" +msgstr "슬라이스 할 파일을 선택하십시오 (STL / OBJ / AMF / 3MF / PRUSA):" + +#: src/slic3r/GUI/MainFrame.cpp:746 +msgid "No previously sliced file." +msgstr "이전에 분리 된 파일이 없습니다." + +#: src/slic3r/GUI/MainFrame.cpp:752 +msgid "Previously sliced file (" +msgstr "이전에 분리 된 파일 (" + +#: src/slic3r/GUI/MainFrame.cpp:752 +msgid ") not found." +msgstr ")을 찾을 수 없습니다." + +#: src/slic3r/GUI/MainFrame.cpp:753 +msgid "File Not Found" +msgstr "파일을 찾을수 없다" + +#: src/slic3r/GUI/MainFrame.cpp:788 +#, c-format +msgid "Save %s file as:" +msgstr "%s 파일을 다음과 같이 저장 합니다" + +#: src/slic3r/GUI/MainFrame.cpp:788 +msgid "SVG" +msgstr "Svg" + +#: src/slic3r/GUI/MainFrame.cpp:788 +msgid "G-code" +msgstr "G 코드" + +#: src/slic3r/GUI/MainFrame.cpp:803 +msgid "Save zip file as:" +msgstr "압축(zip)파일 다른이름 저장:" + +#: src/slic3r/GUI/MainFrame.cpp:815 src/slic3r/GUI/Plater.cpp:2933 +#: src/slic3r/GUI/Plater.cpp:4418 src/slic3r/GUI/Tab.cpp:1170 +#: src/slic3r/GUI/Tab.cpp:3700 +msgid "Slicing" +msgstr "슬라이싱" + +#. TRN "Processing input_file_basename" +#: src/slic3r/GUI/MainFrame.cpp:817 +#, c-format +msgid "Processing %s" +msgstr "처리 %s" + +#: src/slic3r/GUI/MainFrame.cpp:840 +msgid " was successfully sliced." +msgstr " 성공적으로 슬라이스." + +#: src/slic3r/GUI/MainFrame.cpp:842 +msgid "Slicing Done!" +msgstr "슬라이스 완료!" + +#: src/slic3r/GUI/MainFrame.cpp:857 +msgid "Select the STL file to repair:" +msgstr "복구 할 STL 파일을 선택하십시오:" + +#: src/slic3r/GUI/MainFrame.cpp:870 +msgid "Save OBJ file (less prone to coordinate errors than STL) as:" +msgstr "OBJ 파일을 저장하십시오 (STL보다 오류를 덜 조정할 가능성이 적음):" + +#: src/slic3r/GUI/MainFrame.cpp:885 +msgid "Your file was repaired." +msgstr "파일이 복구되었습니다." + +#: src/slic3r/GUI/MainFrame.cpp:885 src/libslic3r/PrintConfig.cpp:3221 +msgid "Repair" +msgstr "수정" + +#: src/slic3r/GUI/MainFrame.cpp:899 +msgid "Save configuration as:" +msgstr "구성을 저장 :" + +#: src/slic3r/GUI/MainFrame.cpp:919 src/slic3r/GUI/MainFrame.cpp:983 +msgid "Select configuration to load:" +msgstr "로드 할 구성 선택 :" + +#: src/slic3r/GUI/MainFrame.cpp:956 +msgid "Save presets bundle as:" +msgstr "이전 설정 번들을 다음과 같이 저장 :" + +#: src/slic3r/GUI/MainFrame.cpp:1007 +#, c-format +msgid "%d presets successfully imported." +msgstr "% d 사전 설정을 가져 왔습니다." + +#: src/slic3r/GUI/MsgDialog.cpp:73 +#, c-format +msgid "%s error" +msgstr "%s 오류" + +#: src/slic3r/GUI/MsgDialog.cpp:74 +#, c-format +msgid "%s has encountered an error" +msgstr "%s에 오류가 발생 했습니다" + +#: src/slic3r/GUI/Plater.cpp:146 +msgid "Volume" +msgstr "크기" + +#: src/slic3r/GUI/Plater.cpp:147 +msgid "Facets" +msgstr "측면" + +#: src/slic3r/GUI/Plater.cpp:148 +msgid "Materials" +msgstr "재료" + +#: src/slic3r/GUI/Plater.cpp:151 +msgid "Manifold" +msgstr "많은" + +#: src/slic3r/GUI/Plater.cpp:201 +msgid "Sliced Info" +msgstr "슬라이스된 정보" + +#: src/slic3r/GUI/Plater.cpp:220 src/slic3r/GUI/Plater.cpp:1135 +msgid "Used Filament (m)" +msgstr "사용자 필라멘트 (m)" + +#: src/slic3r/GUI/Plater.cpp:221 +msgid "Used Filament (mm³)" +msgstr "사용자 필라멘트 (mm³)" + +#: src/slic3r/GUI/Plater.cpp:222 +msgid "Used Filament (g)" +msgstr "사용자 필라멘트 (g)" + +#: src/slic3r/GUI/Plater.cpp:223 +msgid "Used Material (unit)" +msgstr "사용 재료 (단위)" + +#: src/slic3r/GUI/Plater.cpp:224 src/slic3r/GUI/Plater.cpp:1150 +#: src/libslic3r/PrintConfig.cpp:742 +msgid "Cost" +msgstr "비용" + +#: src/slic3r/GUI/Plater.cpp:225 src/slic3r/GUI/Plater.cpp:1122 +#: src/slic3r/GUI/Plater.cpp:1164 +msgid "Estimated printing time" +msgstr "예상 인쇄 시간" + +#: src/slic3r/GUI/Plater.cpp:226 +msgid "Number of tool changes" +msgstr "공구(tool) 변경 수" + +#: src/slic3r/GUI/Plater.cpp:317 +msgid "Click to edit preset" +msgstr "사전 설정을 편집 하려면 클릭 하십시오" + +#: src/slic3r/GUI/Plater.cpp:469 +msgid "Select what kind of support do you need" +msgstr "서포트의 종류를 선택하세요" + +#: src/slic3r/GUI/Plater.cpp:471 src/libslic3r/PrintConfig.cpp:1865 +#: src/libslic3r/PrintConfig.cpp:2529 +msgid "Support on build plate only" +msgstr "출력물만 서포트를 지지" + +#: src/slic3r/GUI/Plater.cpp:472 src/slic3r/GUI/Plater.cpp:587 +msgid "For support enforcers only" +msgstr "서포트 지원영역 전용" + +#: src/slic3r/GUI/Plater.cpp:473 +msgid "Everywhere" +msgstr "모든곳" + +#: src/slic3r/GUI/Plater.cpp:505 src/slic3r/GUI/Tab.cpp:1067 +msgid "Brim" +msgstr "브림" + +#: src/slic3r/GUI/Plater.cpp:507 +msgid "" +"This flag enables the brim that will be printed around each object on the " +"first layer." +msgstr "" +"이 플래그는 첫 번째 레이어의 각 개체 주위에 인쇄 될 브림을 활성화합니다." + +#: src/slic3r/GUI/Plater.cpp:515 +msgid "Purging volumes" +msgstr "볼륨 삭제" + +#: src/slic3r/GUI/Plater.cpp:766 +msgid "Print settings" +msgstr "프린트 설정" + +#: src/slic3r/GUI/Plater.cpp:767 src/slic3r/GUI/Tab.cpp:1604 +#: src/slic3r/GUI/Tab.cpp:1605 +msgid "Filament" +msgstr "필라멘트" + +#: src/slic3r/GUI/Plater.cpp:768 +msgid "SLA print settings" +msgstr "SLA 인쇄 설정" + +#: src/slic3r/GUI/Plater.cpp:769 src/slic3r/GUI/Preset.cpp:1310 +msgid "SLA material" +msgstr "SLA 재료" + +#: src/slic3r/GUI/Plater.cpp:770 +msgid "Printer" +msgstr "프린터" + +#: src/slic3r/GUI/Plater.cpp:820 src/slic3r/GUI/Plater.cpp:4688 +msgid "Send to printer" +msgstr "프린터로 보내기" + +#: src/slic3r/GUI/Plater.cpp:823 src/slic3r/GUI/Plater.cpp:2933 +#: src/slic3r/GUI/Plater.cpp:4421 +msgid "Slice now" +msgstr "지금 자르기" + +#: src/slic3r/GUI/Plater.cpp:963 +msgid "Hold Shift to Slice & Export G-code" +msgstr "Shift 키를 누른 채 G 코드 내보내기" + +#: src/slic3r/GUI/Plater.cpp:1068 +#, c-format +msgid "%d (%d shells)" +msgstr "% d (% d 쉘)" + +#: src/slic3r/GUI/Plater.cpp:1073 +#, c-format +msgid "Auto-repaired (%d errors)" +msgstr "오류자동수정 (%d errors)" + +#: src/slic3r/GUI/Plater.cpp:1076 +#, c-format +msgid "" +"%d degenerate facets, %d edges fixed, %d facets removed, %d facets added, %d " +"facets reversed, %d backwards edges" +msgstr "" +"%d 면 고정, %d 모서리 고정, %d 면 제거, %d 면 추가, %d 면 반전, %d 후방 모서" +"리" + +#: src/slic3r/GUI/Plater.cpp:1086 +msgid "Yes" +msgstr "예" + +#: src/slic3r/GUI/Plater.cpp:1109 +msgid "Used Material (ml)" +msgstr "사용 재료 (ml)" + +#: src/slic3r/GUI/Plater.cpp:1112 +msgid "object(s)" +msgstr "개체(들)" + +#: src/slic3r/GUI/Plater.cpp:1112 +msgid "supports and pad" +msgstr "지지대 및 패드" + +#: src/slic3r/GUI/Plater.cpp:1137 src/slic3r/GUI/Plater.cpp:1152 +msgid "objects" +msgstr "개체" + +#: src/slic3r/GUI/Plater.cpp:1137 src/slic3r/GUI/Plater.cpp:1152 +msgid "wipe tower" +msgstr "와이프 타워(Wipe tower)" + +#: src/slic3r/GUI/Plater.cpp:1167 +msgid "normal mode" +msgstr "일반 모드" + +#: src/slic3r/GUI/Plater.cpp:1171 src/slic3r/GUI/Plater.cpp:1180 +msgid "Color " +msgstr "색" + +#: src/slic3r/GUI/Plater.cpp:1176 +msgid "stealth mode" +msgstr "스텔스 모드" + +#: src/slic3r/GUI/Plater.cpp:1271 +msgid "Load File" +msgstr "파일 로드" + +#: src/slic3r/GUI/Plater.cpp:1275 +msgid "Load Files" +msgstr "파일 로드" + +#: src/slic3r/GUI/Plater.cpp:1503 +msgid "ERROR: not enough resources to execute a new job." +msgstr "오류: 새 작업을 실행하기에 충분한 리소스가 아닙니다." + +#: src/slic3r/GUI/Plater.cpp:2056 +msgid "New Project" +msgstr "새로운 프로젝트" + +#: src/slic3r/GUI/Plater.cpp:2173 +msgid "Loading" +msgstr "로딩" + +#: src/slic3r/GUI/Plater.cpp:2183 +#, c-format +msgid "Processing input file %s\n" +msgstr "입력 파일 처리 %s\n" + +#: src/slic3r/GUI/Plater.cpp:2211 +msgid "" +"You can't to load SLA project if there is at least one multi-part object on " +"the bed" +msgstr "" +"침대에 다중 부품 개체가 하나 이상 있는 경우 SLA 프로젝트를 로드할 수 없습니" +"다." + +#: src/slic3r/GUI/Plater.cpp:2212 src/slic3r/GUI/Tab.cpp:3064 +msgid "Please check your object list before preset changing." +msgstr "사전 설정을 변경 하기 전에 개체 목록을 확인 하십시오." + +#: src/slic3r/GUI/Plater.cpp:2255 +msgid "" +"This file contains several objects positioned at multiple heights. Instead " +"of considering them as multiple objects, should I consider\n" +"this file as a single object having multiple parts?\n" +msgstr "" +"이 파일에는 여러 높이에 위치한 여러 객체가 들어 있습니다. 여러 객체로 간주하" +"는 대신,\n" +"이 파일은 여러 부분을 갖는 단일 객체로 보입니까?\n" + +#: src/slic3r/GUI/Plater.cpp:2258 src/slic3r/GUI/Plater.cpp:2310 +msgid "Multi-part object detected" +msgstr "다중 부품 객체가 감지" + +#: src/slic3r/GUI/Plater.cpp:2265 +msgid "" +"This file cannot be loaded in a simple mode. Do you want to switch to an " +"advanced mode?\n" +msgstr "" +"이 파일은 단순 모드에서 로드할 수 없습니다. 고급 모드로 전환 하시겠습니까?\n" + +#: src/slic3r/GUI/Plater.cpp:2266 +msgid "Detected advanced data" +msgstr "감지된 고급 데이터" + +#: src/slic3r/GUI/Plater.cpp:2287 +#, c-format +msgid "" +"You can't to add the object(s) from %s because of one or some of them " +"is(are) multi-part" +msgstr "멀티파트 하나 또는 그 중 일부 때문에 %s에서 개체를 추가 할 수 없습니다" + +#: src/slic3r/GUI/Plater.cpp:2307 +msgid "" +"Multiple objects were loaded for a multi-material printer.\n" +"Instead of considering them as multiple objects, should I consider\n" +"these files to represent a single object having multiple parts?\n" +msgstr "" +"다중 재료 프린터에 대해 여러 객체가로드되었습니다.\n" +"여러 객체로 간주하는 대신,\n" +"이 파일들은 여러 부분을 갖는 단일 객체를 나타낼 수 있습니까?\n" + +#: src/slic3r/GUI/Plater.cpp:2323 +msgid "Loaded" +msgstr "로드(loaded)" + +#: src/slic3r/GUI/Plater.cpp:2418 +msgid "" +"Your object appears to be too large, so it was automatically scaled down to " +"fit your print bed." +msgstr "개체가 너무 커서 인쇄물에 맞게 자동으로 축소되었습니다." + +#: src/slic3r/GUI/Plater.cpp:2419 +msgid "Object too large?" +msgstr "개체가 너무 큽니까?" + +#: src/slic3r/GUI/Plater.cpp:2476 +msgid "Export STL file:" +msgstr "STL 파일 내보내기:" + +#: src/slic3r/GUI/Plater.cpp:2483 +msgid "Export AMF file:" +msgstr "AMF 파일 내보내기:" + +#: src/slic3r/GUI/Plater.cpp:2489 +msgid "Save file as:" +msgstr "다른 이름으로 파일 저장:" + +#: src/slic3r/GUI/Plater.cpp:2592 +msgid "Delete Object" +msgstr "오브젝트 지우기" + +#: src/slic3r/GUI/Plater.cpp:2603 +msgid "Reset Project" +msgstr "프로젝트 재설정" + +#: src/slic3r/GUI/Plater.cpp:2630 src/slic3r/GUI/Plater.cpp:3517 +msgid "Mirror" +msgstr "반전(Mirror)" + +#: src/slic3r/GUI/Plater.cpp:2643 +msgid "Optimize Rotation" +msgstr "회전 최적화" + +#: src/slic3r/GUI/Plater.cpp:2689 +msgid "Arranging" +msgstr "정렬" + +#: src/slic3r/GUI/Plater.cpp:2712 +msgid "Could not arrange model objects! Some geometries may be invalid." +msgstr "" +"모델 개체를 정렬할 수 없습니다. 일부 형상은 유효 하지 않을 수 있습니다." + +#: src/slic3r/GUI/Plater.cpp:2718 +msgid "Arranging canceled." +msgstr "취소 된 정렬" + +#: src/slic3r/GUI/Plater.cpp:2719 +msgid "Arranging done." +msgstr "정렬 완료." + +#: src/slic3r/GUI/Plater.cpp:2735 +msgid "Searching for optimal orientation" +msgstr "최적의 방향 검색" + +#: src/slic3r/GUI/Plater.cpp:2768 +msgid "Orientation search canceled." +msgstr "오리엔테이션 검색이 취소 됨" + +#: src/slic3r/GUI/Plater.cpp:2769 +msgid "Orientation found." +msgstr "방향을 찾았습니다." + +#: src/slic3r/GUI/Plater.cpp:2785 +msgid "" +"The selected object can't be split because it contains more than one volume/" +"material." +msgstr "" +"선택한 객체는 둘 이상의 볼륨 / 재료가 포함되어 있기 때문에 분할 할 수 없습니" +"다." + +#: src/slic3r/GUI/Plater.cpp:2796 +msgid "Split to Objects" +msgstr "객체로 분할" + +#: src/slic3r/GUI/Plater.cpp:2918 +msgid "Invalid data" +msgstr "잘못 된 데이터" + +#: src/slic3r/GUI/Plater.cpp:2927 +msgid "Ready to slice" +msgstr "슬라이스 준비" + +#: src/slic3r/GUI/Plater.cpp:2965 src/slic3r/GUI/PrintHostDialogs.cpp:232 +msgid "Cancelling" +msgstr "취소 중" + +#: src/slic3r/GUI/Plater.cpp:2982 +msgid "Another export job is currently running." +msgstr "다른 내보내기 작업이 현재 실행 중입니다." + +#: src/slic3r/GUI/Plater.cpp:3036 src/slic3r/GUI/Plater.cpp:3493 +msgid "Reload from Disk" +msgstr "디스크에서 다시 불러오기" + +#: src/slic3r/GUI/Plater.cpp:3072 +msgid "Fix Throught NetFabb" +msgstr "NetFabb으로 수정" + +#: src/slic3r/GUI/Plater.cpp:3254 +msgid "Export failed" +msgstr "내보내기 실패" + +#: src/slic3r/GUI/Plater.cpp:3259 src/slic3r/GUI/PrintHostDialogs.cpp:233 +msgid "Cancelled" +msgstr "취소됨" + +#: src/slic3r/GUI/Plater.cpp:3347 src/slic3r/GUI/Plater.cpp:3359 +#: src/slic3r/GUI/Plater.cpp:3473 +msgid "Increase copies" +msgstr "복사본 늘리기" + +#: src/slic3r/GUI/Plater.cpp:3467 src/slic3r/GUI/Plater.cpp:3486 +msgid "Remove the selected object" +msgstr "선택한 객체 제거" + +#: src/slic3r/GUI/Plater.cpp:3473 +msgid "Place one more copy of the selected object" +msgstr "선택한 객체를 하나 더 복사합니다" + +#: src/slic3r/GUI/Plater.cpp:3475 +msgid "Decrease copies" +msgstr "복사본 감소" + +#: src/slic3r/GUI/Plater.cpp:3475 +msgid "Remove one copy of the selected object" +msgstr "선택한 객체 복사본 하나 삭제" + +#: src/slic3r/GUI/Plater.cpp:3477 +msgid "Set number of copies" +msgstr "복사될 수량 설정" + +#: src/slic3r/GUI/Plater.cpp:3477 +msgid "Change the number of copies of the selected object" +msgstr "선택한 개체의 복사본 수 변경" + +#: src/slic3r/GUI/Plater.cpp:3493 +msgid "Reload the selected file from Disk" +msgstr "디스크에서 다시 불러오기" + +#: src/slic3r/GUI/Plater.cpp:3496 +msgid "Export the selected object as STL file" +msgstr "선택한 객체를 STL 파일로 내보내기" + +#: src/slic3r/GUI/Plater.cpp:3510 +msgid "Along X axis" +msgstr "X 축을 따라" + +#: src/slic3r/GUI/Plater.cpp:3510 +msgid "Mirror the selected object along the X axis" +msgstr "선택한 객체를 X 축을 따라 반전합니다" + +#: src/slic3r/GUI/Plater.cpp:3512 +msgid "Along Y axis" +msgstr "Y 축을 따라" + +#: src/slic3r/GUI/Plater.cpp:3512 +msgid "Mirror the selected object along the Y axis" +msgstr "선택한 객체를 Y 축을 따라 반전합니다" + +#: src/slic3r/GUI/Plater.cpp:3514 +msgid "Along Z axis" +msgstr "Z 축 따라" + +#: src/slic3r/GUI/Plater.cpp:3514 +msgid "Mirror the selected object along the Z axis" +msgstr "선택한 객체를 Z 축을 따라 반전합니다" + +#: src/slic3r/GUI/Plater.cpp:3517 +msgid "Mirror the selected object" +msgstr "반전할 객제를 선택" + +#: src/slic3r/GUI/Plater.cpp:3529 +msgid "To objects" +msgstr "개체에" + +#: src/slic3r/GUI/Plater.cpp:3529 src/slic3r/GUI/Plater.cpp:3549 +msgid "Split the selected object into individual objects" +msgstr "선택한 개체를 개별 개체로 분할 합니다." + +#: src/slic3r/GUI/Plater.cpp:3531 +msgid "To parts" +msgstr "부품에" + +#: src/slic3r/GUI/Plater.cpp:3531 src/slic3r/GUI/Plater.cpp:3563 +msgid "Split the selected object into individual sub-parts" +msgstr "선택한 오브젝트를 개별 하위 파트로 분할" + +#: src/slic3r/GUI/Plater.cpp:3534 src/slic3r/GUI/Plater.cpp:3549 +#: src/slic3r/GUI/Plater.cpp:3563 src/libslic3r/PrintConfig.cpp:3245 +msgid "Split" +msgstr "쪼개기" + +#: src/slic3r/GUI/Plater.cpp:3534 +msgid "Split the selected object" +msgstr "선택한 개체 분할" + +#: src/slic3r/GUI/Plater.cpp:3555 +msgid "Optimize orientation" +msgstr "방향 최적화" + +#: src/slic3r/GUI/Plater.cpp:3555 +msgid "Optimize the rotation of the object for better print results." +msgstr "더 나은 인쇄 결과를 위해 개체의 회전을 최적화합니다." + +#: src/slic3r/GUI/Plater.cpp:3595 +msgid "3D editor view" +msgstr "3D 편집화면 보기" + +#: src/slic3r/GUI/Plater.cpp:3603 src/slic3r/GUI/Tab.cpp:2534 +msgid "Preview" +msgstr "프리뷰" + +#: src/slic3r/GUI/Plater.cpp:3831 +msgid "" +"%1% printer was active at the time the target Undo / Redo snapshot was " +"taken. Switching to %1% printer requires reloading of %1% presets." +msgstr "" +"%1% 프린터가 대상 재생 취소/다시 작업 스냅샷을 생성할 때 활성화되었습니다. " +"%1% 프린터로 전환하려면 %1% 사전 설정을 다시 로드해야 합니다." + +#: src/slic3r/GUI/Plater.cpp:3992 +msgid "Load Project" +msgstr "프로젝트 로드" + +#: src/slic3r/GUI/Plater.cpp:4016 +msgid "Import Object" +msgstr "개체 가져오기" + +#: src/slic3r/GUI/Plater.cpp:4020 +msgid "Import Objects" +msgstr "객체 가져오기" + +#: src/slic3r/GUI/Plater.cpp:4075 +msgid "All objects will be removed, continue ?" +msgstr "모든 개체가 제거 됩니다, 계속합니까?" + +#: src/slic3r/GUI/Plater.cpp:4083 +msgid "Delete Selected Objects" +msgstr "선택한 객체 삭제" + +#: src/slic3r/GUI/Plater.cpp:4091 +msgid "Increase Instances" +msgstr "복제본 늘리기" + +#: src/slic3r/GUI/Plater.cpp:4127 +msgid "Decrease Instances" +msgstr "복제본 감소" + +#: src/slic3r/GUI/Plater.cpp:4163 +#, c-format +msgid "Set numbers of copies to %d" +msgstr "복사본 수를 %d로 설정" + +#: src/slic3r/GUI/Plater.cpp:4193 +msgid "Cut by Plane" +msgstr "평면으로 절단" + +#: src/slic3r/GUI/Plater.cpp:4225 +msgid "Save G-code file as:" +msgstr "G-code 파일 다른 이름 저장:" + +#: src/slic3r/GUI/Plater.cpp:4225 +msgid "Save SL1 file as:" +msgstr "SL1 파일 다른이름 저장:" + +#: src/slic3r/GUI/Plater.cpp:4337 +#, c-format +msgid "STL file exported to %s" +msgstr "내보낸 STL 파일 %s" + +#: src/slic3r/GUI/Plater.cpp:4353 +#, c-format +msgid "AMF file exported to %s" +msgstr "내보낸 AMF 파일 %s" + +#: src/slic3r/GUI/Plater.cpp:4356 +#, c-format +msgid "Error exporting AMF file %s" +msgstr "AMF 파일 내보내기 오류 %s" + +#: src/slic3r/GUI/Plater.cpp:4382 +#, c-format +msgid "3MF file exported to %s" +msgstr "3MF 파일을 내보냈습니다 %s" + +#: src/slic3r/GUI/Plater.cpp:4387 +#, c-format +msgid "Error exporting 3MF file %s" +msgstr "3MF 파일 내보내기 오류 %s" + +#: src/slic3r/GUI/Plater.cpp:4687 +msgid "Export" +msgstr "내보내기" + +#: src/slic3r/GUI/Plater.cpp:4688 +msgid "Send G-code" +msgstr "G 코드 보내기" + +#: src/slic3r/GUI/Plater.cpp:4772 +msgid "Paste From Clipboard" +msgstr "클립보드에서 붙여넣기" + +#: src/slic3r/GUI/Preferences.cpp:22 src/slic3r/GUI/Tab.cpp:1955 +#: src/slic3r/GUI/Tab.cpp:2193 +msgid "General" +msgstr "일반" + +#: src/slic3r/GUI/Preferences.cpp:44 +msgid "Remember output directory" +msgstr "출력 디렉토리 기억하기" + +#: src/slic3r/GUI/Preferences.cpp:46 +msgid "" +"If this is enabled, Slic3r will prompt the last output directory instead of " +"the one containing the input files." +msgstr "" +"이 옵션을 사용하면 Slic3r은 입력 파일이 들어있는 디렉터리 대신 마지막 출력 디" +"렉터리를 묻습니다." + +#: src/slic3r/GUI/Preferences.cpp:52 +msgid "Auto-center parts" +msgstr "부품을 자동으로 중심에" + +#: src/slic3r/GUI/Preferences.cpp:54 +msgid "" +"If this is enabled, Slic3r will auto-center objects around the print bed " +"center." +msgstr "이 옵션을 사용하면 Slic3r가 개체를 인쇄판 중앙에 자동으로 배치합니다." + +#: src/slic3r/GUI/Preferences.cpp:60 +msgid "Background processing" +msgstr "백그라운드 프로세싱" + +#: src/slic3r/GUI/Preferences.cpp:62 +msgid "" +"If this is enabled, Slic3r will pre-process objects as soon as they're " +"loaded in order to save time when exporting G-code." +msgstr "" +"이 사용 하는 경우 Slic3r는 전처리 개체 최대한 빨리 그들이 시간을 절약 하기 위" +"해 로드 G-코드를 내보낼 때." + +#: src/slic3r/GUI/Preferences.cpp:71 +msgid "" +"If enabled, PrusaSlicer will check for the new versions of itself online. " +"When a new version becomes available a notification is displayed at the next " +"application startup (never during program usage). This is only a " +"notification mechanisms, no automatic installation is done." +msgstr "" +"프루사 슬라이서는 온라인의 새로운 버전을 확인합니다. 새 버전을 사용할 수 있게" +"되면 다음 응용 프로그램 시작시 (프로그램 사용 중이 아님) 알림이 표시 됩니다. " +"이는 알림 메커니즘일뿐이며 자동 설치는 수행되지 않습니다." + +#: src/slic3r/GUI/Preferences.cpp:79 +msgid "" +"If enabled, Slic3r downloads updates of built-in system presets in the " +"background. These updates are downloaded into a separate temporary location. " +"When a new preset version becomes available it is offered at application " +"startup." +msgstr "" +"활성화 된 경우 Slic3r은 백그라운드에서 내장 시스템 사전 설정의 업데이트를 다" +"운로드합니다. 이러한 업데이트는 별도의 임시 위치에 다운로드됩니다. 새로운 사" +"전 설정 버전을 사용할 수있게되면 응용 프로그램 시작시 제공됩니다." + +#: src/slic3r/GUI/Preferences.cpp:84 +msgid "Suppress \" - default - \" presets" +msgstr "\"- 기본 -\"사전 설정 숨기기" + +#: src/slic3r/GUI/Preferences.cpp:86 +msgid "" +"Suppress \" - default - \" presets in the Print / Filament / Printer " +"selections once there are any other valid presets available." +msgstr "" +"사용 가능한 다른 유효한 사전 설정이 있으면 인쇄 / 필라멘트 / 프린터 선택에서 " +"\"- 기본 -\"사전 설정을 억제하십시오." + +#: src/slic3r/GUI/Preferences.cpp:92 +msgid "Show incompatible print and filament presets" +msgstr "호환 되지 않는 인쇄 및 필라멘트 설정" + +#: src/slic3r/GUI/Preferences.cpp:94 +msgid "" +"When checked, the print and filament presets are shown in the preset editor " +"even if they are marked as incompatible with the active printer" +msgstr "" +"이 옵션을 선택하면 활성 프린터와 호환되지 않는 것으로 표시된 경우에도 인쇄 " +"및 필라멘트 사전 설정이 사전 설정 편집기에 표시됩니다" + +#: src/slic3r/GUI/Preferences.cpp:101 +msgid "Use Retina resolution for the 3D scene" +msgstr "3D 장면에 레티나 해상도 사용" + +#: src/slic3r/GUI/Preferences.cpp:103 +msgid "" +"If enabled, the 3D scene will be rendered in Retina resolution. If you are " +"experiencing 3D performance problems, disabling this option may help." +msgstr "" +"활성화 된 경우 3D 장면은 레티나 해상도로 렌더링 됩니다. 3D 성능 문제가 발생하" +"는 경우, 옵션을 사용하지 않도록 설정 하면 도움이 될 수 있습니다." + +#: src/slic3r/GUI/Preferences.cpp:110 +msgid "Use perspective camera" +msgstr "원근 카메라 사용" + +#: src/slic3r/GUI/Preferences.cpp:112 +msgid "" +"If enabled, use perspective camera. If not enabled, use orthographic camera." +msgstr "" +"이 옵션을 사용하면 원근 카메라를 사용합니다. 활성화되지 않은 경우 직교 카메라" +"를 사용합니다." + +#: src/slic3r/GUI/Preferences.cpp:117 +msgid "Use custom size for toolbar icons" +msgstr "도구 모음 아이콘에 사용자 지정 크기 사용" + +#: src/slic3r/GUI/Preferences.cpp:119 +msgid "If enabled, you can change size of toolbar icons manually." +msgstr "활성화된 경우 도구 모음 아이콘의 크기를 수동으로 변경할 수 있습니다." + +#: src/slic3r/GUI/Preferences.cpp:144 +#, c-format +msgid "You need to restart %s to make the changes effective." +msgstr "변경 내용을 적용 하려면 %s를 다시 시작 해야 합니다." + +#: src/slic3r/GUI/Preferences.cpp:192 +msgid "Icon size in a respect to the default size" +msgstr "기본 크기에 대한 아이콘 크기" + +#: src/slic3r/GUI/Preferences.cpp:207 +msgid "Select toolbar icon size in respect to the default one." +msgstr "기본 도구 모음에 대해 도구 모음 아이콘 크기를 선택합니다." + +#: src/slic3r/GUI/Preset.cpp:212 +msgid "modified" +msgstr "수정된곳" + +#: src/slic3r/GUI/Preset.cpp:963 src/slic3r/GUI/Preset.cpp:1003 +#: src/slic3r/GUI/Preset.cpp:1068 src/slic3r/GUI/Preset.cpp:1100 +#: src/slic3r/GUI/PresetBundle.cpp:1480 src/slic3r/GUI/PresetBundle.cpp:1545 +msgid "System presets" +msgstr "시스템 기본설정" + +#: src/slic3r/GUI/Preset.cpp:1007 src/slic3r/GUI/Preset.cpp:1104 +#: src/slic3r/GUI/PresetBundle.cpp:1550 +msgid "User presets" +msgstr "사용자 사전설정" + +#: src/slic3r/GUI/Preset.cpp:1036 src/slic3r/GUI/Tab.cpp:241 +msgid "Add a new printer" +msgstr "새 프린터 추가" + +#: src/slic3r/GUI/Preset.cpp:1308 +msgid "filament" +msgstr "필라멘트" + +#: src/slic3r/GUI/Preset.cpp:1309 +msgid "SLA print" +msgstr "SLA 인쇄" + +#: src/slic3r/GUI/PresetHints.cpp:28 +msgid "" +"If estimated layer time is below ~%1%s, fan will run at %2%%% and print " +"speed will be reduced so that no less than %3%s are spent on that layer " +"(however, speed will never be reduced below %4%mm/s)." +msgstr "" +"예상 레이어 시간이 ~%1%초 미만이면 팬이 %2%%%에서 실행되고 인쇄 속도가 감소되" +"어 해당 레이어에 %3%초 이상 소비됩니다 (단, 속도는 %4%mm/s 이하로 감소하지 않" +"습니다) ." + +#: src/slic3r/GUI/PresetHints.cpp:35 +msgid "" +"\n" +"If estimated layer time is greater, but still below ~%1%s, fan will run at a " +"proportionally decreasing speed between %2%%% and %3%%%." +msgstr "" +"\n" +"예상 레이어 시간이 더 길지만 ~%1%초 미만인 경우 팬은 %2%%%와 %3%%%사이 비례, " +"감소하는 속도로 실행됩니다." + +#: src/slic3r/GUI/PresetHints.cpp:39 +msgid "" +"\n" +"During the other layers, fan" +msgstr "" +"\n" +"다른 레이어의, 팬설정은 " + +#: src/slic3r/GUI/PresetHints.cpp:41 +msgid "Fan" +msgstr "팬(Fan)" + +#: src/slic3r/GUI/PresetHints.cpp:47 +msgid "will always run at %1%%%" +msgstr "항상 다음처럼 실행 %1%%%" + +#: src/slic3r/GUI/PresetHints.cpp:50 +msgid "except for the first %1% layers." +msgstr "첫 번째 %d 레이어를 제외하고" + +#: src/slic3r/GUI/PresetHints.cpp:52 +msgid "except for the first layer." +msgstr "첫 번째 레이어를 제외하고" + +#: src/slic3r/GUI/PresetHints.cpp:54 +msgid "will be turned off." +msgstr "off 됩니다." + +#: src/slic3r/GUI/PresetHints.cpp:155 +msgid "external perimeters" +msgstr "외부 둘레" + +#: src/slic3r/GUI/PresetHints.cpp:164 +msgid "perimeters" +msgstr "둘레" + +#: src/slic3r/GUI/PresetHints.cpp:173 +msgid "infill" +msgstr "채움(infill)" + +#: src/slic3r/GUI/PresetHints.cpp:183 +msgid "solid infill" +msgstr "외부(solid)부분 채움" + +#: src/slic3r/GUI/PresetHints.cpp:191 +msgid "top solid infill" +msgstr "가장 윗부분 채움" + +#: src/slic3r/GUI/PresetHints.cpp:202 +msgid "support" +msgstr "서포트" + +#: src/slic3r/GUI/PresetHints.cpp:212 +msgid "support interface" +msgstr "서포트 인터페이스" + +#: src/slic3r/GUI/PresetHints.cpp:218 +msgid "First layer volumetric" +msgstr "첫번째 레이어 용적은" + +#: src/slic3r/GUI/PresetHints.cpp:218 +msgid "Bridging volumetric" +msgstr "브리징(Bridging) 용적" + +#: src/slic3r/GUI/PresetHints.cpp:218 +msgid "Volumetric" +msgstr "용적" + +#: src/slic3r/GUI/PresetHints.cpp:219 +msgid "flow rate is maximized" +msgstr "의 유속(flow)이 최대화된다. " + +#: src/slic3r/GUI/PresetHints.cpp:222 +msgid "by the print profile maximum" +msgstr "인쇄 프로파일 최대 값" + +#: src/slic3r/GUI/PresetHints.cpp:223 +msgid "when printing" +msgstr "인쇄 할 때" + +#: src/slic3r/GUI/PresetHints.cpp:224 +msgid "with a volumetric rate" +msgstr "의 용적 비율로 " + +#: src/slic3r/GUI/PresetHints.cpp:228 +#, c-format +msgid "%3.2f mm³/s at filament speed %3.2f mm/s." +msgstr "%3.2f mm³/s 필라멘트 속도는 %3.2f mm/s이다." + +#: src/slic3r/GUI/PresetHints.cpp:246 +msgid "" +"Recommended object thin wall thickness: Not available due to invalid layer " +"height." +msgstr "" +"권장 객체(object)의 벽(wall) 두께: 잘못된 레이어 높이 때문에 사용할 수 없음." + +#: src/slic3r/GUI/PresetHints.cpp:262 +#, c-format +msgid "Recommended object thin wall thickness for layer height %.2f and" +msgstr "객체 레이어 높이 %.2f 에 권장하는 두깨는 " + +#: src/slic3r/GUI/PresetHints.cpp:268 +#, c-format +msgid "%d lines: %.2f mm" +msgstr "%d 라인:%.2f mm" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:33 +msgid "Send G-Code to printer host" +msgstr "프린터 호스트로 G 코드 보내기" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:33 +msgid "Upload to Printer Host with the following filename:" +msgstr "다음 파일 이름으로 프린터 호스트에 업로드:" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:35 +msgid "Start printing after upload" +msgstr "업로드 후 인쇄 시작" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:42 +msgid "Use forward slashes ( / ) as a directory separator if needed." +msgstr "필요한 경우 디렉토리 분리 기호로 슬래시 (/)를 사용하십시오." + +#: src/slic3r/GUI/PrintHostDialogs.cpp:149 +msgid "ID" +msgstr "아이디" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:150 +msgid "Progress" +msgstr "진행률" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:151 +msgid "Status" +msgstr "상태" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:152 +msgid "Host" +msgstr "호스트" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:153 +msgid "Filename" +msgstr "파일이름" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:154 +msgid "Error Message" +msgstr "에러 메시지" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:157 +msgid "Cancel selected" +msgstr "선택 취소" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:159 +msgid "Show error message" +msgstr "오류 메시지 표시" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:198 +#: src/slic3r/GUI/PrintHostDialogs.cpp:229 +msgid "Enqueued" +msgstr "입력됨" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:230 +msgid "Uploading" +msgstr "업로드" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:234 +msgid "Completed" +msgstr "완료됨" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:272 +msgid "Error uploading to print host:" +msgstr "인쇄 호스트에 업로드 하는 중 오류 발생:" + +#: src/slic3r/GUI/RammingChart.cpp:23 +msgid "NO RAMMING AT ALL" +msgstr "전혀 충돌 없음" + +#: src/slic3r/GUI/RammingChart.cpp:76 +msgid "Time" +msgstr "시간" + +#: src/slic3r/GUI/RammingChart.cpp:76 src/slic3r/GUI/WipeTowerDialog.cpp:82 +#: src/libslic3r/PrintConfig.cpp:627 src/libslic3r/PrintConfig.cpp:671 +#: src/libslic3r/PrintConfig.cpp:686 src/libslic3r/PrintConfig.cpp:2349 +#: src/libslic3r/PrintConfig.cpp:2358 src/libslic3r/PrintConfig.cpp:2418 +#: src/libslic3r/PrintConfig.cpp:2425 +msgid "s" +msgstr "s" + +#: src/slic3r/GUI/RammingChart.cpp:81 +msgid "Volumetric speed" +msgstr "용적(Volumetric) 스피트" + +#: src/slic3r/GUI/RammingChart.cpp:81 src/libslic3r/PrintConfig.cpp:584 +#: src/libslic3r/PrintConfig.cpp:1234 +msgid "mm³/s" +msgstr "밀리미터 ³/s" + +#: src/slic3r/GUI/SysInfoDialog.cpp:78 +msgid "System Information" +msgstr "시스템 정보" + +#: src/slic3r/GUI/SysInfoDialog.cpp:154 +msgid "Copy to Clipboard" +msgstr "클립보드에 복사" + +#: src/slic3r/GUI/Tab.cpp:52 src/libslic3r/PrintConfig.cpp:239 +msgid "Compatible printers" +msgstr "호환 가능한 프린터들" + +#: src/slic3r/GUI/Tab.cpp:53 +msgid "Select the printers this profile is compatible with." +msgstr "이 프로파일과 호환 가능한 프린터를 선택하세요." + +#: src/slic3r/GUI/Tab.cpp:58 src/libslic3r/PrintConfig.cpp:254 +msgid "Compatible print profiles" +msgstr "호환되는 인쇄 프로 파일" + +#: src/slic3r/GUI/Tab.cpp:59 +msgid "Select the print profiles this profile is compatible with." +msgstr "이 프로필이 호환되는 인쇄 프로필을 선택 합니다." + +#. TRN "Save current Settings" +#: src/slic3r/GUI/Tab.cpp:133 +#, c-format +msgid "Save current %s" +msgstr "현재 %s 저장" + +#: src/slic3r/GUI/Tab.cpp:134 +msgid "Delete this preset" +msgstr "이전 설정 삭제" + +#: src/slic3r/GUI/Tab.cpp:139 +msgid "" +"Hover the cursor over buttons to find more information \n" +"or click this button." +msgstr "" +"버튼 위로 커서를 가져 가서 자세한 정보를 찾습니다.\n" +"또는이 버튼을 클릭하십시오." + +#: src/slic3r/GUI/Tab.cpp:921 +msgid "This is a default preset." +msgstr "기본 설정입니다." + +#: src/slic3r/GUI/Tab.cpp:923 +msgid "This is a system preset." +msgstr "시스템 설정입니다." + +#: src/slic3r/GUI/Tab.cpp:925 +msgid "Current preset is inherited from the default preset." +msgstr "현재 사전 설정은 기본 사전 설정에서 상속됩니다." + +#: src/slic3r/GUI/Tab.cpp:928 +#, c-format +msgid "" +"Current preset is inherited from:\n" +"\t%s" +msgstr "전의 %s 설정에서 가져 옵니다 " + +#: src/slic3r/GUI/Tab.cpp:932 +msgid "It can't be deleted or modified." +msgstr "삭제하거나 수정할 수 없습니다." + +#: src/slic3r/GUI/Tab.cpp:933 +msgid "" +"Any modifications should be saved as a new preset inherited from this one." +msgstr "모든 수정 사항은 이 항목에서 받은 기본 설정으로 저장해야합니다." + +#: src/slic3r/GUI/Tab.cpp:934 +msgid "To do that please specify a new name for the preset." +msgstr "그렇게하려면 기본 설정의 새 이름을 지정하십시오." + +#: src/slic3r/GUI/Tab.cpp:938 +msgid "Additional information:" +msgstr "추가 정보:" + +#: src/slic3r/GUI/Tab.cpp:944 +msgid "printer model" +msgstr "프린터 모델" + +#: src/slic3r/GUI/Tab.cpp:952 +msgid "default print profile" +msgstr "기본 인쇄 프로파일" + +#: src/slic3r/GUI/Tab.cpp:955 +msgid "default filament profile" +msgstr "기본 필라멘트 프로파일" + +#: src/slic3r/GUI/Tab.cpp:969 +msgid "default SLA material profile" +msgstr "기본 SLA 재질 프로 파일" + +#: src/slic3r/GUI/Tab.cpp:973 +msgid "default SLA print profile" +msgstr "기본 SLA 인쇄 프로필" + +#: src/slic3r/GUI/Tab.cpp:1008 src/slic3r/GUI/Tab.cpp:3649 +msgid "Layers and perimeters" +msgstr "레이어 및 경계선" + +#: src/slic3r/GUI/Tab.cpp:1009 src/slic3r/GUI/Tab.cpp:1257 +#: src/libslic3r/PrintConfig.cpp:66 +msgid "Layer height" +msgstr "레이어 높이" + +#: src/slic3r/GUI/Tab.cpp:1013 +msgid "Vertical shells" +msgstr "쉘 높이" + +#: src/slic3r/GUI/Tab.cpp:1024 +msgid "Horizontal shells" +msgstr "쉘 너비" + +#: src/slic3r/GUI/Tab.cpp:1025 src/libslic3r/PrintConfig.cpp:1759 +msgid "Solid layers" +msgstr "솔리드 레이어" + +#: src/slic3r/GUI/Tab.cpp:1030 +msgid "Quality (slower slicing)" +msgstr "품질(슬라이싱이 느려짐)" + +#: src/slic3r/GUI/Tab.cpp:1048 +msgid "Reducing printing time" +msgstr "출력 시간 단축" + +#: src/slic3r/GUI/Tab.cpp:1060 +msgid "Skirt and brim" +msgstr "스커트와 브림" + +#: src/slic3r/GUI/Tab.cpp:1077 +msgid "Raft" +msgstr "라프트" + +#: src/slic3r/GUI/Tab.cpp:1081 +msgid "Options for support material and raft" +msgstr "서포트와 라프트 재료를 선택" + +#: src/slic3r/GUI/Tab.cpp:1096 +msgid "Speed for print moves" +msgstr "출력중 이동 속도" + +#: src/slic3r/GUI/Tab.cpp:1108 +msgid "Speed for non-print moves" +msgstr "미출력시 이동속도" + +#: src/slic3r/GUI/Tab.cpp:1111 +msgid "Modifiers" +msgstr "수정" + +#: src/slic3r/GUI/Tab.cpp:1114 +msgid "Acceleration control (advanced)" +msgstr "가속 제어(고급)" + +#: src/slic3r/GUI/Tab.cpp:1121 +msgid "Autospeed (advanced)" +msgstr "오토스피트(고급)" + +#: src/slic3r/GUI/Tab.cpp:1129 +msgid "Multiple Extruders" +msgstr "다중 익스트루더" + +#: src/slic3r/GUI/Tab.cpp:1137 +msgid "Ooze prevention" +msgstr "오즈 방지(Ooze prevention)" + +#: src/slic3r/GUI/Tab.cpp:1154 +msgid "Extrusion width" +msgstr "악출 폭(Extrusion width)" + +#: src/slic3r/GUI/Tab.cpp:1164 +msgid "Overlap" +msgstr "겹침(Overlap)" + +#: src/slic3r/GUI/Tab.cpp:1167 +msgid "Flow" +msgstr "유량(Flow)" + +#: src/slic3r/GUI/Tab.cpp:1176 +msgid "Other" +msgstr "그 외" + +#: src/slic3r/GUI/Tab.cpp:1179 src/slic3r/GUI/Tab.cpp:3703 +msgid "Output options" +msgstr "출력 옵션" + +#: src/slic3r/GUI/Tab.cpp:1180 +msgid "Sequential printing" +msgstr "연속 인쇄" + +#: src/slic3r/GUI/Tab.cpp:1182 +msgid "Extruder clearance (mm)" +msgstr "익스트루더 간격(mm)" + +#: src/slic3r/GUI/Tab.cpp:1191 src/slic3r/GUI/Tab.cpp:3704 +msgid "Output file" +msgstr "출력 파일" + +#: src/slic3r/GUI/Tab.cpp:1198 src/libslic3r/PrintConfig.cpp:1432 +msgid "Post-processing scripts" +msgstr "사후 처리 스크립트" + +#: src/slic3r/GUI/Tab.cpp:1204 src/slic3r/GUI/Tab.cpp:1205 +#: src/slic3r/GUI/Tab.cpp:1716 src/slic3r/GUI/Tab.cpp:1717 +#: src/slic3r/GUI/Tab.cpp:2165 src/slic3r/GUI/Tab.cpp:2166 +#: src/slic3r/GUI/Tab.cpp:2273 src/slic3r/GUI/Tab.cpp:2274 +#: src/slic3r/GUI/Tab.cpp:3586 src/slic3r/GUI/Tab.cpp:3587 +msgid "Notes" +msgstr "메모" + +#: src/slic3r/GUI/Tab.cpp:1211 src/slic3r/GUI/Tab.cpp:1724 +#: src/slic3r/GUI/Tab.cpp:2172 src/slic3r/GUI/Tab.cpp:2280 +#: src/slic3r/GUI/Tab.cpp:3594 src/slic3r/GUI/Tab.cpp:3709 +msgid "Dependencies" +msgstr "속한 그룹" + +#: src/slic3r/GUI/Tab.cpp:1212 src/slic3r/GUI/Tab.cpp:1725 +#: src/slic3r/GUI/Tab.cpp:2173 src/slic3r/GUI/Tab.cpp:2281 +#: src/slic3r/GUI/Tab.cpp:3595 src/slic3r/GUI/Tab.cpp:3710 +msgid "Profile dependencies" +msgstr "프로파일 속한곳" + +#: src/slic3r/GUI/Tab.cpp:1256 +msgid "" +"Zero layer height is not valid.\n" +"\n" +"The layer height will be reset to 0.01." +msgstr "" +"바닥 레이어 높이가 잘못되었습니다.\n" +"\n" +"레이어 높이가 0.01로 재설정됩니다." + +#: src/slic3r/GUI/Tab.cpp:1268 +msgid "" +"Zero first layer height is not valid.\n" +"\n" +"The first layer height will be reset to 0.01." +msgstr "" +"첫 번째 레이어 높이가 0이면 유효하지 않습니다.\n" +"\n" +"첫 번째 레이어 높이는 0.01로 재설정됩니다." + +#: src/slic3r/GUI/Tab.cpp:1269 src/libslic3r/PrintConfig.cpp:866 +msgid "First layer height" +msgstr "첫 레이어 높이" + +#: src/slic3r/GUI/Tab.cpp:1283 +#, c-format +msgid "" +"The Spiral Vase mode requires:\n" +"- one perimeter\n" +"- no top solid layers\n" +"- 0% fill density\n" +"- no support material\n" +"- no ensure_vertical_shell_thickness\n" +"\n" +"Shall I adjust those settings in order to enable Spiral Vase?" +msgstr "" +"스파이럴 바이스 모드에는 다음이 필요합니다.\n" +"- one 둘레\n" +"- 탑 솔리드 레이어 없음\n" +"- 0% fill density\n" +"- 서포트 재료 없음\n" +"- 수직 벽 두깨를 보장하지 않음\n" +"\n" +"스파이럴 바이스를 사용하려면 이러한 설정을 조정해야합니까?" + +#: src/slic3r/GUI/Tab.cpp:1290 +msgid "Spiral Vase" +msgstr "스파이럴 바이스" + +#: src/slic3r/GUI/Tab.cpp:1311 +msgid "" +"The Wipe Tower currently supports the non-soluble supports only\n" +"if they are printed with the current extruder without triggering a tool " +"change.\n" +"(both support_material_extruder and support_material_interface_extruder need " +"to be set to 0).\n" +"\n" +"Shall I adjust those settings in order to enable the Wipe Tower?" +msgstr "" +"와이퍼 타워는 현재 비 가용성 서포트 만 지원합니다.\n" +"공구 교환을 트리거하지 않고 현재 압출기로 인쇄 한 경우.\n" +"(support_material_extruder 및 support_material_interface_extruder를 모두 0으" +"로 설정해야 함).\n" +"\n" +"와이퍼 타워를 사용하려면 이러한 설정을 조정해야합니까?" + +#: src/slic3r/GUI/Tab.cpp:1315 src/slic3r/GUI/Tab.cpp:1332 +msgid "Wipe Tower" +msgstr "와이프 타워(Wipe Tower)" + +#: src/slic3r/GUI/Tab.cpp:1329 +msgid "" +"For the Wipe Tower to work with the soluble supports, the support layers\n" +"need to be synchronized with the object layers.\n" +"\n" +"Shall I synchronize support layers in order to enable the Wipe Tower?" +msgstr "" +"와이퍼 타워가 가용성 서포트와 함께 작용하기 위해, 서포트 레이어\n" +"객체 레이어와 동기화되어야합니다.\n" +"\n" +"와이퍼 타워를 사용하려면 서포트 레이어를 동기화해야합니까?" + +#: src/slic3r/GUI/Tab.cpp:1347 +msgid "" +"Supports work better, if the following feature is enabled:\n" +"- Detect bridging perimeters\n" +"\n" +"Shall I adjust those settings for supports?" +msgstr "" +"다음 기능을 사용하는 경우 더 나은 작업을 지원합니다.\n" +"- 브리지 경계 검출\n" +"\n" +"서포트에 대한 설정을 조정해야합니까?" + +#: src/slic3r/GUI/Tab.cpp:1350 +msgid "Support Generator" +msgstr "서포트 생성" + +#: src/slic3r/GUI/Tab.cpp:1392 +msgid "" +"The %1% infill pattern is not supposed to work at 100%% density.\n" +"\n" +"Shall I switch to rectilinear fill pattern?" +msgstr "" +"%1% 채우기 패턴은 100%의 밀도로 작동 하지 않습니다.\n" +"\n" +"직선 채우기 패턴으로 전환 해야 합니까?" + +#: src/slic3r/GUI/Tab.cpp:1502 src/slic3r/GUI/Tab.cpp:1557 +msgid "Filament Overrides" +msgstr "필라멘트 재정의" + +#: src/slic3r/GUI/Tab.cpp:1503 src/slic3r/GUI/Tab.cpp:1562 +#: src/slic3r/GUI/Tab.cpp:2514 +msgid "Retraction" +msgstr "리트렉션" + +#: src/slic3r/GUI/Tab.cpp:1612 src/libslic3r/PrintConfig.cpp:2030 +msgid "Temperature" +msgstr "온도" + +#: src/slic3r/GUI/Tab.cpp:1618 +msgid "Bed" +msgstr "배드(Bed)" + +#: src/slic3r/GUI/Tab.cpp:1623 +msgid "Cooling" +msgstr "냉각(Cooling)" + +#: src/slic3r/GUI/Tab.cpp:1624 src/libslic3r/PrintConfig.cpp:1335 +#: src/libslic3r/PrintConfig.cpp:2150 +msgid "Enable" +msgstr "사용" + +#: src/slic3r/GUI/Tab.cpp:1635 +msgid "Fan settings" +msgstr "팬 설정" + +#: src/slic3r/GUI/Tab.cpp:1636 +msgid "Fan speed" +msgstr "팬 속도" + +#: src/slic3r/GUI/Tab.cpp:1644 +msgid "Cooling thresholds" +msgstr "냉각 임계 값" + +#: src/slic3r/GUI/Tab.cpp:1650 +msgid "Filament properties" +msgstr "필라멘트 특성" + +#: src/slic3r/GUI/Tab.cpp:1654 +msgid "Print speed override" +msgstr "인쇄 속도 중단" + +#: src/slic3r/GUI/Tab.cpp:1664 +msgid "Wipe tower parameters" +msgstr "타워 매개변수 지우기" + +#: src/slic3r/GUI/Tab.cpp:1667 +msgid "Toolchange parameters with single extruder MM printers" +msgstr "싱글 익스트루더 멀티 터리알 프린터를 사용한 공구 교환 매개 변수" + +#: src/slic3r/GUI/Tab.cpp:1681 +msgid "Ramming settings" +msgstr "래밍 설정" + +#: src/slic3r/GUI/Tab.cpp:1703 src/slic3r/GUI/Tab.cpp:2128 +msgid "Custom G-code" +msgstr "수동 G코드" + +#: src/slic3r/GUI/Tab.cpp:1704 src/slic3r/GUI/Tab.cpp:2129 +#: src/libslic3r/PrintConfig.cpp:1785 src/libslic3r/PrintConfig.cpp:1800 +msgid "Start G-code" +msgstr "스타트 G코드" + +#: src/slic3r/GUI/Tab.cpp:1710 src/slic3r/GUI/Tab.cpp:2135 +#: src/libslic3r/PrintConfig.cpp:369 src/libslic3r/PrintConfig.cpp:379 +msgid "End G-code" +msgstr "엔드 G코드" + +#: src/slic3r/GUI/Tab.cpp:1843 src/slic3r/GUI/Tab.cpp:2068 +msgid "Test" +msgstr "시험(test)" + +#: src/slic3r/GUI/Tab.cpp:1853 +msgid "Could not get a valid Printer Host reference" +msgstr "유효한 프린터 호스트 참조를 가져올 수 없습니다" + +#: src/slic3r/GUI/Tab.cpp:1859 src/slic3r/GUI/Tab.cpp:2081 +msgid "Success!" +msgstr "성공!" + +#: src/slic3r/GUI/Tab.cpp:1874 +msgid "" +"HTTPS CA file is optional. It is only needed if you use HTTPS with a self-" +"signed certificate." +msgstr "" +"HTTPS CA 파일은 선택 사항입니다. 자체 서명 된 인증서로 HTTPS를 사용하는 경우" +"에만 필요합니다." + +#: src/slic3r/GUI/Tab.cpp:1887 +msgid "Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*" +msgstr "인증서 파일 (* .crt, * .pem) | * .crt; * .pem | 모든 파일 | *. *" + +#: src/slic3r/GUI/Tab.cpp:1888 +msgid "Open CA certificate file" +msgstr "CA 인증서 파일 열기" + +#: src/slic3r/GUI/Tab.cpp:1916 +#, c-format +msgid "" +"HTTPS CA File:\n" +" \tOn this system, %s uses HTTPS certificates from the system Certificate " +"Store or Keychain.\n" +" \tTo use a custom CA file, please import your CA file into Certificate " +"Store / Keychain." +msgstr "" +"HTTPS CA 파일:\n" +"\t이 시스템에서 %s는 시스템 인증서 저장소나 키체인의 HTTPS 인증서를 사용 합니" +"다.\n" +"\t사용자 지정 CA 파일을 사용 하려면 CA 파일을 인증서 저장소/키체인에 가져오십" +"시오." + +#: src/slic3r/GUI/Tab.cpp:1956 src/slic3r/GUI/Tab.cpp:2194 +msgid "Size and coordinates" +msgstr "크기와 좌표" + +#: src/slic3r/GUI/Tab.cpp:1961 src/slic3r/GUI/Tab.cpp:2199 +#: src/slic3r/GUI/Tab.cpp:3256 +msgid "Set" +msgstr "설정" + +#: src/slic3r/GUI/Tab.cpp:1993 +msgid "Capabilities" +msgstr "기능" + +#: src/slic3r/GUI/Tab.cpp:1998 +msgid "Number of extruders of the printer." +msgstr "프린터 익스트루더 숫자." + +#: src/slic3r/GUI/Tab.cpp:2023 +msgid "" +"Single Extruder Multi Material is selected, \n" +"and all extruders must have the same diameter.\n" +"Do you want to change the diameter for all extruders to first extruder " +"nozzle diameter value?" +msgstr "" +"단일 압출기 멀티 재질이 선택되고, \n" +"모든 압출기는 동일한 직경을 가져야 합니다.\n" +"모든 압출기의 지름을 첫 번째 압출기 노즐 값으로 변경하시겠습니까?" + +#: src/slic3r/GUI/Tab.cpp:2026 src/slic3r/GUI/Tab.cpp:2484 +#: src/libslic3r/PrintConfig.cpp:1310 +msgid "Nozzle diameter" +msgstr "노즐 직경" + +#: src/slic3r/GUI/Tab.cpp:2053 +msgid "USB/Serial connection" +msgstr "USB/시리얼 연결" + +#: src/slic3r/GUI/Tab.cpp:2054 src/libslic3r/PrintConfig.cpp:1640 +msgid "Serial port" +msgstr "시리얼 포트" + +#: src/slic3r/GUI/Tab.cpp:2059 +msgid "Rescan serial ports" +msgstr "시리얼포트 재검색" + +#: src/slic3r/GUI/Tab.cpp:2081 +msgid "Connection to printer works correctly." +msgstr "프린터 연결이 올바르게 작동합니다." + +#: src/slic3r/GUI/Tab.cpp:2084 +msgid "Connection failed." +msgstr "연결 실패." + +#: src/slic3r/GUI/Tab.cpp:2097 src/slic3r/GUI/Tab.cpp:2268 +msgid "Print Host upload" +msgstr "호스트 업로드 인쇄" + +#: src/slic3r/GUI/Tab.cpp:2141 src/libslic3r/PrintConfig.cpp:138 +msgid "Before layer change G-code" +msgstr "레이어 변경 전 G 코드" + +#: src/slic3r/GUI/Tab.cpp:2147 src/libslic3r/PrintConfig.cpp:1056 +msgid "After layer change G-code" +msgstr "레이어 변경 후 G 코드" + +#: src/slic3r/GUI/Tab.cpp:2153 src/libslic3r/PrintConfig.cpp:2056 +msgid "Tool change G-code" +msgstr "툴 채인지 G 코드" + +#: src/slic3r/GUI/Tab.cpp:2159 +msgid "Between objects G-code (for sequential printing)" +msgstr "객체 간 G 코드 (순차 인쇄용)" + +#: src/slic3r/GUI/Tab.cpp:2231 +msgid "Display" +msgstr "표시" + +#: src/slic3r/GUI/Tab.cpp:2246 +msgid "Tilt" +msgstr "기울이기" + +#: src/slic3r/GUI/Tab.cpp:2247 +msgid "Tilt time" +msgstr "기울이기 시간" + +#: src/slic3r/GUI/Tab.cpp:2253 src/slic3r/GUI/Tab.cpp:3568 +msgid "Corrections" +msgstr "수정" + +#: src/slic3r/GUI/Tab.cpp:2333 src/slic3r/GUI/Tab.cpp:2418 +#: src/libslic3r/PrintConfig.cpp:1106 src/libslic3r/PrintConfig.cpp:1124 +#: src/libslic3r/PrintConfig.cpp:1142 src/libslic3r/PrintConfig.cpp:1159 +#: src/libslic3r/PrintConfig.cpp:1170 src/libslic3r/PrintConfig.cpp:1181 +#: src/libslic3r/PrintConfig.cpp:1192 +msgid "Machine limits" +msgstr "머신 한계설정" + +#: src/slic3r/GUI/Tab.cpp:2347 +msgid "Values in this column are for Normal mode" +msgstr "이 열의 값은 일반 모드입니다" + +#: src/slic3r/GUI/Tab.cpp:2348 +msgid "Normal" +msgstr "보통" + +#: src/slic3r/GUI/Tab.cpp:2353 +msgid "Values in this column are for Stealth mode" +msgstr "이 열의 값은 무음 모드 용입니다" + +#: src/slic3r/GUI/Tab.cpp:2354 +msgid "Stealth" +msgstr "스텔스" + +#: src/slic3r/GUI/Tab.cpp:2362 +msgid "Maximum feedrates" +msgstr "최대 이송속도" + +#: src/slic3r/GUI/Tab.cpp:2367 +msgid "Maximum accelerations" +msgstr "최고 가속도" + +#: src/slic3r/GUI/Tab.cpp:2374 +msgid "Jerk limits" +msgstr "저크(Jerk)값 한계" + +#: src/slic3r/GUI/Tab.cpp:2379 +msgid "Minimum feedrates" +msgstr "최대 이송속도" + +#: src/slic3r/GUI/Tab.cpp:2443 src/slic3r/GUI/Tab.cpp:2451 +msgid "Single extruder MM setup" +msgstr "싱글 익스트루더 MM 설정" + +#: src/slic3r/GUI/Tab.cpp:2452 +msgid "Single extruder multimaterial parameters" +msgstr "싱글 익스트루더 멀티메터리알 파라미터" + +#: src/slic3r/GUI/Tab.cpp:2465 src/libslic3r/GCode/PreviewData.cpp:477 +#, c-format +msgid "Extruder %d" +msgstr "익스트루더 %d" + +#: src/slic3r/GUI/Tab.cpp:2483 +msgid "Do you want to change the diameter for all extruders?" +msgstr "모든 압출기의 지름을 변경하시겠습니까?" + +#: src/slic3r/GUI/Tab.cpp:2506 +msgid "Layer height limits" +msgstr "레이어 높이 한계치" + +#: src/slic3r/GUI/Tab.cpp:2511 +msgid "Position (for multi-extruder printers)" +msgstr "위치 (멀티 익스트루더 프린터 포함)" + +#: src/slic3r/GUI/Tab.cpp:2517 +msgid "Only lift Z" +msgstr "Z축 올림" + +#: src/slic3r/GUI/Tab.cpp:2530 +msgid "" +"Retraction when tool is disabled (advanced settings for multi-extruder " +"setups)" +msgstr "도구 비활성화시 리트렉션 (멀티 익스트루더 고급 설정)" + +#: src/slic3r/GUI/Tab.cpp:2693 +msgid "" +"The Wipe option is not available when using the Firmware Retraction mode.\n" +"\n" +"Shall I disable it in order to enable Firmware Retraction?" +msgstr "" +"펌웨어 리트렉션 모드를 사용할 때는 Wipe 옵션을 사용할 수 없습니다.\n" +"\n" +"펌웨어 리트렉션 하려면 비활성화해야합니까?" + +#: src/slic3r/GUI/Tab.cpp:2695 +msgid "Firmware Retraction" +msgstr "펌웨어 레트렉션" + +#: src/slic3r/GUI/Tab.cpp:3024 +#, c-format +msgid "Default preset (%s)" +msgstr "시스템 기본값 (%s)" + +#: src/slic3r/GUI/Tab.cpp:3025 +#, c-format +msgid "Preset (%s)" +msgstr "프리셋 ( %s)" + +#: src/slic3r/GUI/Tab.cpp:3042 +msgid "has the following unsaved changes:" +msgstr "저장되지 않은 수정사항:" + +#: src/slic3r/GUI/Tab.cpp:3045 +msgid "is not compatible with printer" +msgstr "프린터와 호완 되지 않습니다" + +#: src/slic3r/GUI/Tab.cpp:3046 +msgid "is not compatible with print profile" +msgstr "인쇄 프로필과 호환 되지 않음" + +#: src/slic3r/GUI/Tab.cpp:3048 +msgid "and it has the following unsaved changes:" +msgstr "저장되지 않은 변경점은 다음과 같습니다:" + +#: src/slic3r/GUI/Tab.cpp:3052 +msgid "Unsaved Changes" +msgstr "미 저장된 변경점" + +#: src/slic3r/GUI/Tab.cpp:3143 +msgid "%1% - Copy" +msgstr "%1%-복사" + +#: src/slic3r/GUI/Tab.cpp:3166 +msgid "The supplied name is empty. It can't be saved." +msgstr "파일 이름이 비어 있습니다. 저장할 수 없습니다." + +#: src/slic3r/GUI/Tab.cpp:3171 +msgid "Cannot overwrite a system profile." +msgstr "시스템 프로파일을 겹쳐 쓸 수 없습니다." + +#: src/slic3r/GUI/Tab.cpp:3175 +msgid "Cannot overwrite an external profile." +msgstr "외부 프로필을 덮어 쓸 수 없습니다." + +#: src/slic3r/GUI/Tab.cpp:3201 +msgid "remove" +msgstr "제거(remove)" + +#: src/slic3r/GUI/Tab.cpp:3201 +msgid "delete" +msgstr "지우기" + +#. TRN remove/delete +#: src/slic3r/GUI/Tab.cpp:3203 +msgid "Are you sure you want to %1% the selected preset?" +msgstr "선택한 사전 설정의 %1%를 선택 하시겠습니까?" + +#. TRN Remove/Delete +#: src/slic3r/GUI/Tab.cpp:3206 +msgid "%1% Preset" +msgstr "%1% 기본설정" + +#: src/slic3r/GUI/Tab.cpp:3332 +msgid "LOCKED LOCK" +msgstr "잠긴 잠금" + +#. TRN Description for "LOCKED LOCK" +#: src/slic3r/GUI/Tab.cpp:3334 +msgid "" +"indicates that the settings are the same as the system (or default) values " +"for the current option group" +msgstr "" +"설정이 현재 옵션 그룹의 시스템(또는 기본값) 값과 동일하다는 것을 나타냅니다." + +#: src/slic3r/GUI/Tab.cpp:3336 +msgid "UNLOCKED LOCK" +msgstr "잠금 해제 잠금" + +#. TRN Description for "UNLOCKED LOCK" +#: src/slic3r/GUI/Tab.cpp:3338 +msgid "" +"indicates that some settings were changed and are not equal to the system " +"(or default) values for the current option group.\n" +"Click the UNLOCKED LOCK icon to reset all settings for current option group " +"to the system (or default) values." +msgstr "" +"은 일부 설정이 변경되었으며 현재 옵션 그룹의 시스템(또는 기본값) 값과 같지 않" +"음을 나타냅니다.\n" +"잠금 해제 잠금 아이콘을 클릭하여 현재 옵션 그룹에 대한 모든 설정을 시스템(또" +"는 기본값) 값으로 재설정합니다." + +#: src/slic3r/GUI/Tab.cpp:3343 +msgid "WHITE BULLET" +msgstr "흰색 글머리 기호" + +#. TRN Description for "WHITE BULLET" +#: src/slic3r/GUI/Tab.cpp:3345 +msgid "" +"for the left button: \tindicates a non-system (or non-default) preset,\n" +"for the right button: \tindicates that the settings hasn't been modified." +msgstr "" +"왼쪽 단추의 경우: 비시스템(또는 기본이 아닌) 사전 설정을 나타냅니다.\n" +"오른쪽 버튼: 설정이 수정되지 않았음을 나타냅니다." + +#: src/slic3r/GUI/Tab.cpp:3348 +msgid "BACK ARROW" +msgstr "돌아가기 화살표" + +#. TRN Description for "BACK ARROW" +#: src/slic3r/GUI/Tab.cpp:3350 +msgid "" +"indicates that the settings were changed and are not equal to the last saved " +"preset for the current option group.\n" +"Click the BACK ARROW icon to reset all settings for the current option group " +"to the last saved preset." +msgstr "" +"잠금 풀림;일부 설정이 변경되었으며 현재 옵션 그룹의 시스템 값과 같지 않음을 " +"나타냅니다.\n" +"현재 옵션 그룹의 모든 설정을 시스템 값으로 재설정하려면 자물쇠 잠금 아이콘을 " +"클릭하십시오." + +#: src/slic3r/GUI/Tab.cpp:3360 +msgid "" +"LOCKED LOCK icon indicates that the settings are the same as the system (or " +"default) values for the current option group" +msgstr "" +"LOCKED LOCK 아이콘은 설정이 현재 옵션 그룹의 시스템(또는 기본값) 값과 동일하" +"다는 것을 나타냅니다." + +#: src/slic3r/GUI/Tab.cpp:3362 +msgid "" +"UNLOCKED LOCK icon indicates that some settings were changed and are not " +"equal to the system (or default) values for the current option group.\n" +"Click to reset all settings for current option group to the system (or " +"default) values." +msgstr "" +"UNLOCKED LOCK 아이콘은 일부 설정이 변경되었으며 현재 옵션 그룹의 시스템(또는 " +"기본값) 값과 같지 않음을 나타냅니다.\n" +"현재 옵션 그룹에 대한 모든 설정을 시스템(또는 기본값) 값으로 재설정하려면 클" +"릭합니다." + +#: src/slic3r/GUI/Tab.cpp:3365 +msgid "WHITE BULLET icon indicates a non system (or non default) preset." +msgstr "WHITE BULLET 아이콘은 시스템 사전 설정이 아닌 것을 나타냅니다." + +#: src/slic3r/GUI/Tab.cpp:3368 +msgid "" +"WHITE BULLET icon indicates that the settings are the same as in the last " +"saved preset for the current option group." +msgstr "" +"WHITE BULLET 기호 아이콘은 설정이 현재 옵션 그룹에 대해 마지막으로 저장 된 사" +"전 설정과 동일 하다는 것을 나타냅니다." + +#: src/slic3r/GUI/Tab.cpp:3370 +msgid "" +"BACK ARROW icon indicates that the settings were changed and are not equal " +"to the last saved preset for the current option group.\n" +"Click to reset all settings for the current option group to the last saved " +"preset." +msgstr "" +"BACK ARROW 이콘 설정을 변경 하 고 현재 옵션 그룹에 대 한 마지막 저장 된 프리" +"셋을 동일 하지 않습니다 나타냅니다.\n" +"마지막 현재 옵션 그룹에 대 한 모든 설정 다시 설정을 클릭 하 여 사전 설정을 저" +"장." + +#: src/slic3r/GUI/Tab.cpp:3376 +msgid "" +"LOCKED LOCK icon indicates that the value is the same as the system (or " +"default) value." +msgstr "" +"LOCKED LOCK 아이콘은 값이 시스템(또는 기본값) 값과 동일하다는 것을 나타냅니" +"다." + +#: src/slic3r/GUI/Tab.cpp:3377 +msgid "" +"UNLOCKED LOCK icon indicates that the value was changed and is not equal to " +"the system (or default) value.\n" +"Click to reset current value to the system (or default) value." +msgstr "" +"UNLOCKED LOCK 아이콘은 값이 변경되었으며 시스템(또는 기본값) 값과 같지 않음" +"을 나타냅니다.\n" +"현재 값을 시스템(또는 기본값) 값으로 재설정하려면 클릭합니다." + +#: src/slic3r/GUI/Tab.cpp:3383 +msgid "" +"WHITE BULLET icon indicates that the value is the same as in the last saved " +"preset." +msgstr "" +"WHITE BULLET 기호 아이콘은 마지막으로 저장 한 사전 설정과 동일한 값을 나타냅" +"니다." + +#: src/slic3r/GUI/Tab.cpp:3384 +msgid "" +"BACK ARROW icon indicates that the value was changed and is not equal to the " +"last saved preset.\n" +"Click to reset current value to the last saved preset." +msgstr "" +"BACK ARROW 아이콘은 값이 변경되었으며 마지막으로 저장된 사전 설정과 같지 않음" +"을 나타냅니다.\n" +"현재 값을 마지막으로 저장된 사전 설정으로 재설정하려면 클릭합니다." + +#. TRN Preset +#: src/slic3r/GUI/Tab.cpp:3497 +#, c-format +msgid "Save %s as:" +msgstr "Save %s as:" + +#: src/slic3r/GUI/Tab.cpp:3541 +msgid "the following suffix is not allowed:" +msgstr "다음 접미사는 허용되지 않습니다:" + +#: src/slic3r/GUI/Tab.cpp:3545 +msgid "The supplied name is not available." +msgstr "제공된 이름을 사용할 수 없습니다." + +#: src/slic3r/GUI/Tab.cpp:3558 +msgid "Material" +msgstr "재료" + +#: src/slic3r/GUI/Tab.cpp:3560 src/slic3r/GUI/Tab.cpp:3651 +#: src/slic3r/GUI/wxExtensions.cpp:454 +msgid "Layers" +msgstr "레이어" + +#: src/slic3r/GUI/Tab.cpp:3564 +msgid "Exposure" +msgstr "노출" + +#: src/slic3r/GUI/Tab.cpp:3659 +msgid "Support head" +msgstr "서포트 헤드" + +#: src/slic3r/GUI/Tab.cpp:3664 +msgid "Support pillar" +msgstr "서포트 기둥" + +#: src/slic3r/GUI/Tab.cpp:3675 +msgid "Connection of the support sticks and junctions" +msgstr "서포트 기둥 및 접합부 연결" + +#: src/slic3r/GUI/Tab.cpp:3680 +msgid "Automatic generation" +msgstr "자동 생성" + +#: src/slic3r/GUI/Tab.cpp:3747 +msgid "Head penetration should not be greater than the head width." +msgstr "헤드 관통은 헤드 폭 보다 크지 않아야 합니다." + +#: src/slic3r/GUI/Tab.cpp:3751 +msgid "Invalid Head penetration" +msgstr "잘못된 헤드 관통" + +#: src/slic3r/GUI/Tab.cpp:3767 +msgid "Pinhead diameter should be smaller than the pillar diameter." +msgstr "핀헤드 지름은 기둥 지름 보다 작아야 합니다." + +#: src/slic3r/GUI/Tab.cpp:3771 +msgid "Invalid pinhead diameter" +msgstr "잘못된 핀 헤드 지름" + +#: src/slic3r/GUI/Tab.hpp:324 src/slic3r/GUI/Tab.hpp:422 +msgid "Print Settings" +msgstr "출력 설정" + +#: src/slic3r/GUI/Tab.hpp:348 +msgid "Filament Settings" +msgstr "필라멘트 설정" + +#: src/slic3r/GUI/Tab.hpp:383 +msgid "Printer Settings" +msgstr "프린터 설정" + +#: src/slic3r/GUI/Tab.hpp:407 +msgid "Material Settings" +msgstr "재질 설정" + +#: src/slic3r/GUI/Tab.hpp:434 +msgid "Save preset" +msgstr "사전 설정 저장" + +#: src/slic3r/GUI/UpdateDialogs.cpp:38 +msgid "Update available" +msgstr "사용가능한 업데이트" + +#: src/slic3r/GUI/UpdateDialogs.cpp:38 +#, c-format +msgid "New version of %s is available" +msgstr "%s의 새 버전을 사용할 수 있습니다" + +#: src/slic3r/GUI/UpdateDialogs.cpp:45 +msgid "Current version:" +msgstr "현재 버전:" + +#: src/slic3r/GUI/UpdateDialogs.cpp:47 +msgid "New version:" +msgstr "새로운 버전:" + +#: src/slic3r/GUI/UpdateDialogs.cpp:55 +msgid "Changelog && Download" +msgstr "변경 로그 및 다운로드" + +#: src/slic3r/GUI/UpdateDialogs.cpp:62 src/slic3r/GUI/UpdateDialogs.cpp:125 +msgid "Open changelog page" +msgstr "변경 로그 페이지 열기" + +#: src/slic3r/GUI/UpdateDialogs.cpp:67 +msgid "Open download page" +msgstr "다운로드 페이지 열기" + +#: src/slic3r/GUI/UpdateDialogs.cpp:73 +msgid "Don't notify about new releases any more" +msgstr "새로운 수정사항에 대해 더 이상 알림 안 함" + +#: src/slic3r/GUI/UpdateDialogs.cpp:91 src/slic3r/GUI/UpdateDialogs.cpp:205 +msgid "Configuration update" +msgstr "구성 업데이트" + +#: src/slic3r/GUI/UpdateDialogs.cpp:91 +msgid "Configuration update is available" +msgstr "구성 업데이트를 사용할 수 있음" + +#: src/slic3r/GUI/UpdateDialogs.cpp:94 +msgid "" +"Would you like to install it?\n" +"\n" +"Note that a full configuration snapshot will be created first. It can then " +"be restored at any time should there be a problem with the new version.\n" +"\n" +"Updated configuration bundles:" +msgstr "" +"그것을 설치 하시겠습니까?\n" +"\n" +"전체 구성 스냅 샷이 먼저 만들어집니다. 그런 다음 새 버전에 문제가있을 경우 언" +"제든지 복원 할 수 있습니다.\n" +"\n" +"업데이트 된 구성 번들 :" + +#: src/slic3r/GUI/UpdateDialogs.cpp:115 +msgid "Comment:" +msgstr "\"댓글\"" + +#: src/slic3r/GUI/UpdateDialogs.cpp:149 +#, c-format +msgid "%s incompatibility" +msgstr "%s 비 호환성" + +#: src/slic3r/GUI/UpdateDialogs.cpp:150 +#, c-format +msgid "%s configuration is incompatible" +msgstr "%s 과 호환되지 않습니다" + +#: src/slic3r/GUI/UpdateDialogs.cpp:155 +#, c-format +msgid "" +"This version of %s is not compatible with currently installed configuration " +"bundles.\n" +"This probably happened as a result of running an older %s after using a " +"newer one.\n" +"\n" +"You may either exit %s and try again with a newer version, or you may re-run " +"the initial configuration. Doing so will create a backup snapshot of the " +"existing configuration before installing files compatible with this %s.\n" +msgstr "" +"%s의 이 버전은 현재 설치 된 구성 번들과 호환 되지 않습니다.\n" +"이것은 새로운 것을 사용한 후 이전 %s를 실행 한 결과로 발생 했을 것입니다.\n" +"\n" +" %s를 종료하고 최신 버전으로 다시 시도 하거나 초기 구성을 다시 실행할 수 있습" +"니다. 이렇게 하면 %s와 호환 되는 파일을 설치하기 전에 기존 구성의 백업 스냅샷" +"이 생성 됩니다.\n" + +#: src/slic3r/GUI/UpdateDialogs.cpp:164 +#, c-format +msgid "This %s version: %s" +msgstr "이 %s 버전: %s" + +#: src/slic3r/GUI/UpdateDialogs.cpp:169 +msgid "Incompatible bundles:" +msgstr "호환되지 않는 번들 :" + +#: src/slic3r/GUI/UpdateDialogs.cpp:185 +#, c-format +msgid "Exit %s" +msgstr "%s Exit" + +#: src/slic3r/GUI/UpdateDialogs.cpp:188 +msgid "Re-configure" +msgstr "재구성" + +#: src/slic3r/GUI/UpdateDialogs.cpp:209 +#, c-format +msgid "" +"%s now uses an updated configuration structure.\n" +"\n" +"So called 'System presets' have been introduced, which hold the built-in " +"default settings for various printers. These System presets cannot be " +"modified, instead, users now may create their own presets inheriting " +"settings from one of the System presets.\n" +"An inheriting preset may either inherit a particular value from its parent " +"or override it with a customized value.\n" +"\n" +"Please proceed with the %s that follows to set up the new presets and to " +"choose whether to enable automatic preset updates." +msgstr "" +"%s이 (가) 이제 업데이트 된 구성 구조를 사용 합니다.\n" +"\n" +"'시스템 프리셋 '이 도입 되었습니다, 다양한 프린터에 대한 기본 설정을 내장. 이" +"러한 시스템 프리셋은 수정할 수 없으며, 사용자는 이제 시스템 프리셋 중 하나에" +"서 설정을 상속하는 자신만의 프리셋을 생성할 수 있습니다.\n" +"상속하는 사전 설정은 해당 기본 설정에서 특정 값을 상속 하거나 사용자 지정 된 " +"값으로 재정의할 수 있습니다.\n" +"\n" +"다음의 %s를 계속 진행하여 새 프리셋을 설정하고 자동 프리셋 업데이트를 사용할" +"지 여부를 선택하십시오." + +#: src/slic3r/GUI/UpdateDialogs.cpp:225 +msgid "For more information please visit our wiki page:" +msgstr "자세한 정보는 위키 페이지를 참조하십시오 :" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:14 +msgid "Ramming customization" +msgstr "사용자 정의 다지기(Ramming)" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:40 +msgid "" +"Ramming denotes the rapid extrusion just before a tool change in a single-" +"extruder MM printer. Its purpose is to properly shape the end of the " +"unloaded filament so it does not prevent insertion of the new filament and " +"can itself be reinserted later. This phase is important and different " +"materials can require different extrusion speeds to get the good shape. For " +"this reason, the extrusion rates during ramming are adjustable.\n" +"\n" +"This is an expert-level setting, incorrect adjustment will likely lead to " +"jams, extruder wheel grinding into filament etc." +msgstr "" +"래밍은 단일 압출기 MM 프린터에서 공구 교환 직전의 신속한 압출을 나타냅니다. " +"그 목적은 언로드 된 필라멘트의 끝 부분을 적절히 형성하여 새로운 필라멘트의 삽" +"입을 방지하고 나중에 다시 삽입 할 수 있도록하기위한 것입니다. 이 단계는 중요" +"하며 다른 재료는 좋은 모양을 얻기 위해 다른 압출 속도를 요구할 수 있습니다. " +"이러한 이유로, 래밍 중 압출 속도는 조정 가능합니다.\n" +"\n" +"전문가 수준의 설정이므로 잘못된 조정으로 인해 용지 걸림, 압출기 휠이 필라멘" +"트 등에 연삭 될 수 있습니다." + +#: src/slic3r/GUI/WipeTowerDialog.cpp:82 +msgid "Total ramming time" +msgstr "총 래밍 시간" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:84 +msgid "Total rammed volume" +msgstr "총 레미드 양" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:88 +msgid "Ramming line width" +msgstr "래밍 선 너비" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:90 +msgid "Ramming line spacing" +msgstr "래밍 선 간격" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:141 +msgid "Wipe tower - Purging volume adjustment" +msgstr "와이프 타워 - 버려진 필라멘트 조절" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:225 +msgid "" +"Here you can adjust required purging volume (mm³) for any given pair of " +"tools." +msgstr "여기서 주어진 도구 쌍에 필요한 정화 용량 (mm³)을 조정할 수 있습니다." + +#: src/slic3r/GUI/WipeTowerDialog.cpp:226 +msgid "Extruder changed to" +msgstr "익스트루더 번경" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:234 +msgid "unloaded" +msgstr "언로드(unloaded)" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:235 +msgid "loaded" +msgstr "로드(loaded)" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:240 +msgid "Tool #" +msgstr "도구(Tool) #" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:247 +msgid "" +"Total purging volume is calculated by summing two values below, depending on " +"which tools are loaded/unloaded." +msgstr "" +"총 정화 량은 어느 공구가로드 / 언로드되는지에 따라 아래의 두 값을 합산하여 계" +"산됩니다." + +#: src/slic3r/GUI/WipeTowerDialog.cpp:248 +msgid "Volume to purge (mm³) when the filament is being" +msgstr "제거할 필라멘트 양 (mm³)" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:262 +msgid "From" +msgstr "From" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:327 +msgid "" +"Switching to simple settings will discard changes done in the advanced " +"mode!\n" +"\n" +"Do you want to proceed?" +msgstr "" +"단순 설정으로 전환하면 고급 모드에서 수행된 변경 내용이 삭제됨!\n" +"\n" +"계속하시겠습니까?" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:339 +msgid "Show simplified settings" +msgstr "간단한 설정보기" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:339 +msgid "Show advanced settings" +msgstr "고급 설정보기" + +#: src/slic3r/GUI/wxExtensions.cpp:443 +msgid "Instances" +msgstr "복제본" + +#: src/slic3r/GUI/wxExtensions.cpp:447 src/slic3r/GUI/wxExtensions.cpp:592 +#, c-format +msgid "Instance %d" +msgstr "복제본 %d" + +#: src/slic3r/GUI/wxExtensions.cpp:486 +msgid "Range" +msgstr "범위" + +#: src/slic3r/GUI/wxExtensions.cpp:2570 +msgid "One layer mode" +msgstr "하나의 레이어 모드" + +#: src/slic3r/GUI/wxExtensions.cpp:2571 +msgid "Add/Del color change" +msgstr "현재 레이어의 색상 변경 마커 추가" + +#: src/slic3r/GUI/wxExtensions.cpp:2572 +msgid "Discard all color changes" +msgstr "모든 색상 변경 무시" + +#: src/slic3r/GUI/wxExtensions.cpp:2832 +#, c-format +msgid "Switch to the %s mode" +msgstr "%s 모드로 전환" + +#: src/slic3r/GUI/wxExtensions.cpp:2833 +#, c-format +msgid "Current mode is %s" +msgstr "현재 모드는 %s입니다" + +#: src/slic3r/Utils/Duet.cpp:51 +msgid "Connection to Duet works correctly." +msgstr "듀엣보드에 대한 연결이 올바르게 작동 합니다." + +#: src/slic3r/Utils/Duet.cpp:56 +msgid "Could not connect to Duet" +msgstr "듀엣보드에 연결할 수 없습니다" + +#: src/slic3r/Utils/Duet.cpp:84 src/slic3r/Utils/Duet.cpp:154 +msgid "Unknown error occured" +msgstr "알 수 없는 오류가 발생 했습니다" + +#: src/slic3r/Utils/Duet.cpp:148 +msgid "Wrong password" +msgstr "잘못된 암호" + +#: src/slic3r/Utils/Duet.cpp:151 +msgid "Could not get resources to create a new connection" +msgstr "새 연결을 만들 리소스를 가져올수 없습니다" + +#: src/slic3r/Utils/OctoPrint.cpp:69 +#, c-format +msgid "Mismatched type of print host: %s" +msgstr "일치 하지않는 인쇄 호스트 유형: %s" + +#: src/slic3r/Utils/OctoPrint.cpp:84 +msgid "Connection to OctoPrint works correctly." +msgstr "OctoPrint에 연결하면 올바르게 작동합니다." + +#: src/slic3r/Utils/OctoPrint.cpp:90 +msgid "Could not connect to OctoPrint" +msgstr "OctoPrint에 연결할 수 없습니다" + +#: src/slic3r/Utils/OctoPrint.cpp:90 +msgid "Note: OctoPrint version at least 1.1.0 is required." +msgstr "참고 : OctoPrint 버전 1.1.0 이상이 필요합니다." + +#: src/slic3r/Utils/OctoPrint.cpp:195 +msgid "Connection to Prusa SL1 works correctly." +msgstr "Prusa SL1에 대한 연결이 제대로 작동 합니다." + +#: src/slic3r/Utils/OctoPrint.cpp:200 +msgid "Could not connect to Prusa SLA" +msgstr "Prusa SLA에 연결할 수 없습니다" + +#: src/slic3r/Utils/PresetUpdater.cpp:614 +#, c-format +msgid "requires min. %s and max. %s" +msgstr "최소. %s 와 최대. %s" + +#: src/slic3r/Utils/PresetUpdater.cpp:619 +#, c-format +msgid "requires min. %s" +msgstr "최소 %s가 필요 합니다" + +#: src/slic3r/Utils/PresetUpdater.cpp:621 +#, c-format +msgid "requires max. %s" +msgstr "최대 필요 합니다. %s" + +#: src/slic3r/Utils/FixModelByWin10.cpp:219 +#: src/slic3r/Utils/FixModelByWin10.cpp:359 +msgid "Exporting source model" +msgstr "소스 모델 내보내기" + +#: src/slic3r/Utils/FixModelByWin10.cpp:235 +msgid "Failed loading the input model." +msgstr "입력 모델을 로드하지 못했습니다." + +#: src/slic3r/Utils/FixModelByWin10.cpp:242 +msgid "Repairing model by the Netfabb service" +msgstr "Netfabb 서비스에의 한 모델 복구" + +#: src/slic3r/Utils/FixModelByWin10.cpp:248 +msgid "Mesh repair failed." +msgstr "메쉬 복구에 실패 했습니다." + +#: src/slic3r/Utils/FixModelByWin10.cpp:251 +#: src/slic3r/Utils/FixModelByWin10.cpp:378 +msgid "Loading repaired model" +msgstr "복구 된 모델 로드" + +#: src/slic3r/Utils/FixModelByWin10.cpp:263 +#: src/slic3r/Utils/FixModelByWin10.cpp:270 +#: src/slic3r/Utils/FixModelByWin10.cpp:302 +msgid "Saving mesh into the 3MF container failed." +msgstr "3MF 컨테이너에 메쉬를 저장하지 못했습니다." + +#: src/slic3r/Utils/FixModelByWin10.cpp:340 +msgid "Model fixing" +msgstr "모델 고정" + +#: src/slic3r/Utils/FixModelByWin10.cpp:341 +msgid "Exporting model..." +msgstr "소스 모델 내보내기..." + +#: src/slic3r/Utils/FixModelByWin10.cpp:368 +msgid "Export of a temporary 3mf file failed" +msgstr "임시 3mf 파일을 내보내지 못했습니다" + +#: src/slic3r/Utils/FixModelByWin10.cpp:383 +msgid "Import of the repaired 3mf file failed" +msgstr "복구된 3mf 파일을 가져오지 못했습니다" + +#: src/slic3r/Utils/FixModelByWin10.cpp:385 +msgid "Repaired 3MF file does not contain any object" +msgstr "복구된 3MF 파일에 개체가 포함 되어있지 않습니다" + +#: src/slic3r/Utils/FixModelByWin10.cpp:387 +msgid "Repaired 3MF file contains more than one object" +msgstr "복구된 3MF 파일에 둘 이상의 개체가 포함되어 있습니다" + +#: src/slic3r/Utils/FixModelByWin10.cpp:389 +msgid "Repaired 3MF file does not contain any volume" +msgstr "복구 된 3MF 파일에 개체가 포함 되어있지 않습니다" + +#: src/slic3r/Utils/FixModelByWin10.cpp:391 +msgid "Repaired 3MF file contains more than one volume" +msgstr "복구된 3MF 파일에 둘 이상의 개체가 포함되어 있습니다" + +#: src/slic3r/Utils/FixModelByWin10.cpp:400 +msgid "Model repair finished" +msgstr "모델 수리 완료" + +#: src/slic3r/Utils/FixModelByWin10.cpp:406 +msgid "Model repair canceled" +msgstr "모델 복구가 취소 되었습니다" + +#: src/slic3r/Utils/FixModelByWin10.cpp:423 +msgid "Model repaired successfully" +msgstr "모델이 성공적으로 복구 되었습니다" + +#: src/slic3r/Utils/FixModelByWin10.cpp:423 +#: src/slic3r/Utils/FixModelByWin10.cpp:426 +msgid "Model Repair by the Netfabb service" +msgstr "Netfabb 서비스에의 한 모델 복구" + +#: src/slic3r/Utils/FixModelByWin10.cpp:426 +msgid "Model repair failed: \n" +msgstr "모델 복구 실패:\n" + +#: src/libslic3r/Zipper.cpp:32 +msgid "undefined error" +msgstr "정의 되지 않은 오류" + +#: src/libslic3r/Zipper.cpp:34 +msgid "too many files" +msgstr "파일이 너무 많음" + +#: src/libslic3r/Zipper.cpp:36 +msgid "file too large" +msgstr "파일이 너무 큼" + +#: src/libslic3r/Zipper.cpp:38 +msgid "unsupported method" +msgstr "지원 되지 않는 방법" + +#: src/libslic3r/Zipper.cpp:40 +msgid "unsupported encryption" +msgstr "지원 되지 않는 암호화" + +#: src/libslic3r/Zipper.cpp:42 +msgid "unsupported feature" +msgstr "지원 되지 않는 기능" + +#: src/libslic3r/Zipper.cpp:44 +msgid "failed finding central directory" +msgstr "중앙 디렉터리를 찾지 못했습니다." + +#: src/libslic3r/Zipper.cpp:46 +msgid "not a ZIP archive" +msgstr "zIP 아카이브 아님" + +#: src/libslic3r/Zipper.cpp:48 +msgid "invalid header or archive is corrupted" +msgstr "잘못 된 헤더 또는 아카이브가 손상 되었습니다" + +#: src/libslic3r/Zipper.cpp:50 +msgid "unsupported multidisk archive" +msgstr "지원 되지 않는 멀티 디스크 아카이브" + +#: src/libslic3r/Zipper.cpp:52 +msgid "decompression failed or archive is corrupted" +msgstr "압축 풀기 실패 또는 아카이브가 손상 되었습니다" + +#: src/libslic3r/Zipper.cpp:54 +msgid "compression failed" +msgstr "압축 실패" + +#: src/libslic3r/Zipper.cpp:56 +msgid "unexpected decompressed size" +msgstr "예기치 않은 압축 해제 크기" + +#: src/libslic3r/Zipper.cpp:58 +msgid "CRC-32 check failed" +msgstr "CRC-32 확인 실패" + +#: src/libslic3r/Zipper.cpp:60 +msgid "unsupported central directory size" +msgstr "지원 되지 않는 중앙 디렉터리 크기" + +#: src/libslic3r/Zipper.cpp:62 +msgid "allocation failed" +msgstr "할당 실패" + +#: src/libslic3r/Zipper.cpp:64 +msgid "file open failed" +msgstr "파일 열기 실패" + +#: src/libslic3r/Zipper.cpp:66 +msgid "file create failed" +msgstr "파일 만들기 실패" + +#: src/libslic3r/Zipper.cpp:68 +msgid "file write failed" +msgstr "파일 쓰기 실패" + +#: src/libslic3r/Zipper.cpp:70 +msgid "file read failed" +msgstr "파일 읽기 실패" + +#: src/libslic3r/Zipper.cpp:72 +msgid "file close failed" +msgstr "파일 닫기 실패" + +#: src/libslic3r/Zipper.cpp:74 +msgid "file seek failed" +msgstr "파일 검색 실패" + +#: src/libslic3r/Zipper.cpp:76 +msgid "file stat failed" +msgstr "파일 통계 실패" + +#: src/libslic3r/Zipper.cpp:78 +msgid "invalid parameter" +msgstr "잘못 된 매개 변수" + +#: src/libslic3r/Zipper.cpp:80 +msgid "invalid filename" +msgstr "잘못 된 파일 이름" + +#: src/libslic3r/Zipper.cpp:82 +msgid "buffer too small" +msgstr "버퍼가 너무 작음" + +#: src/libslic3r/Zipper.cpp:84 +msgid "internal error" +msgstr "내부 오류" + +#: src/libslic3r/Zipper.cpp:86 +msgid "file not found" +msgstr "파일을 찾을수 없다" + +#: src/libslic3r/Zipper.cpp:88 +msgid "archive is too large" +msgstr "아카이브가 너무 큼" + +#: src/libslic3r/Zipper.cpp:90 +msgid "validation failed" +msgstr "유효성 검사 실패" + +#: src/libslic3r/Zipper.cpp:92 +msgid "write calledback failed" +msgstr "쓰기 다시 실패" + +#: src/libslic3r/Zipper.cpp:102 +msgid "Error with zip archive" +msgstr "zip 아카이브와 오류가 발생 했습니다" + +#: src/libslic3r/Print.cpp:1093 +msgid "All objects are outside of the print volume." +msgstr "모든 개체가 인쇄 볼륨 외부에 있습니다." + +#: src/libslic3r/Print.cpp:1120 +msgid "Some objects are too close; your extruder will collide with them." +msgstr "일부 개체가 너무 가깝습니다. 귀하의 압출기가 그들과 충돌합니다." + +#: src/libslic3r/Print.cpp:1135 +msgid "" +"Some objects are too tall and cannot be printed without extruder collisions." +msgstr "일부 개체는 너무 크고 익스트루더 충돌없이 인쇄 할 수 없습니다." + +#: src/libslic3r/Print.cpp:1145 +msgid "The Spiral Vase option can only be used when printing a single object." +msgstr "" +"나선형 꽃병(Spiral Vase) 옵션은 단일 개체를 인쇄 할 때만 사용할 수 있습니다." + +#: src/libslic3r/Print.cpp:1147 +msgid "" +"The Spiral Vase option can only be used when printing single material " +"objects." +msgstr "" +"나선형 꽃병 옵션(Spiral Vase)은 단일 재료 객체를 인쇄 할 때만 사용할 수 있습" +"니다." + +#: src/libslic3r/Print.cpp:1155 +msgid "" +"The wipe tower is only supported if all extruders have the same nozzle " +"diameter and use filaments of the same diameter." +msgstr "" +"모든 압출기 의 노즐 직경이 동일하고 동일한 직경의 필라멘트를 사용하는 경우에" +"만 와이프 타워가 지원됩니다." + +#: src/libslic3r/Print.cpp:1159 +msgid "" +"The Wipe Tower is currently only supported for the Marlin, RepRap/Sprinter " +"and Repetier G-code flavors." +msgstr "" +"와이프 타워는 현재 말린, RepRap/Sprinter 및 리피티어에 대해서만 G-코드지원 됩" +"니다." + +#: src/libslic3r/Print.cpp:1161 +msgid "" +"The Wipe Tower is currently only supported with the relative extruder " +"addressing (use_relative_e_distances=1)." +msgstr "" +"와이프 타워는 현재 상대적 압출기 어드레싱 (use_relative_e_distances = 1)에서" +"만 지원됩니다." + +#: src/libslic3r/Print.cpp:1165 +msgid "All extruders must have the same diameter for the Wipe Tower." +msgstr "모든 압출기는 와이프 타워의 지름이 같아야 합니다." + +#: src/libslic3r/Print.cpp:1186 +msgid "" +"The Wipe Tower is only supported for multiple objects if they have equal " +"layer heights" +msgstr "" +"와이프 타워 (Wipe Tower)는 같은 레이어 높이에 경우 여러 객체에 대해서만 지원" +"됩니다" + +#: src/libslic3r/Print.cpp:1188 +msgid "" +"The Wipe Tower is only supported for multiple objects if they are printed " +"over an equal number of raft layers" +msgstr "" +"와이프 타워는 같은 수의 라프트 레이어 위에 인쇄 된 경우 여러 객체에 대해서만 " +"지원됩니다" + +#: src/libslic3r/Print.cpp:1190 +msgid "" +"The Wipe Tower is only supported for multiple objects if they are printed " +"with the same support_material_contact_distance" +msgstr "" +"와이프 타워는 동일한 support_material_contact_distance로 인쇄 된 경우 여러 객" +"체에 대해서만 지원됩니다" + +#: src/libslic3r/Print.cpp:1192 +msgid "" +"The Wipe Tower is only supported for multiple objects if they are sliced " +"equally." +msgstr "" +"와이프 타워는 똑같이 슬라이스 된 경우 여러 오브젝트에 대해서만 지원됩니다." + +#: src/libslic3r/Print.cpp:1220 +msgid "" +"The Wipe tower is only supported if all objects have the same layer height " +"profile" +msgstr "" +"모든 오브젝트의 레이어 높이 프로필이 동일한 경우에만 와이프 타워가 지원됩니다" + +#: src/libslic3r/Print.cpp:1230 +msgid "The supplied settings will cause an empty print." +msgstr "제공된 설정으로 인해 빈 인쇄가 발생합니다." + +#: src/libslic3r/Print.cpp:1247 +msgid "" +"One or more object were assigned an extruder that the printer does not have." +msgstr "하나 이상의 개체에 프린터에없는 압출기가 지정되었습니다." + +#: src/libslic3r/Print.cpp:1256 +msgid "" +"Printing with multiple extruders of differing nozzle diameters. If support " +"is to be printed with the current extruder (support_material_extruder == 0 " +"or support_material_interface_extruder == 0), all nozzles have to be of the " +"same diameter." +msgstr "" +"노즐 지름이 다른 여러 압출기로 인쇄. 지원이 현재 압출기 " +"(support_material_extruder == 0 또는 support_material_interface_extruder == " +"0)로 인쇄되는 경우 모든 노즐은 동일한 지름이어야합니다." + +#: src/libslic3r/Print.cpp:1264 +msgid "" +"For the Wipe Tower to work with the soluble supports, the support layers " +"need to be synchronized with the object layers." +msgstr "" +"와이프 타워가 가용성 지지체와 함께 작동 하려면 서포트 레이어를 오브젝트 레이" +"어와 동기화 해야 합니다." + +#: src/libslic3r/Print.cpp:1268 +msgid "" +"The Wipe Tower currently supports the non-soluble supports only if they are " +"printed with the current extruder without triggering a tool change. (both " +"support_material_extruder and support_material_interface_extruder need to be " +"set to 0)." +msgstr "" +"와이프 타워는 현재 공구 교체를 트리거하지 않고 현재의 압출기로 인쇄 하는 경우" +"에만 비가용성 서포트를 지원 합니다. (support_material_extruder과 " +"support_material_interface_extruder 모두 0으로 설정 해야 합니다.)" + +#: src/libslic3r/Print.cpp:1290 +msgid "First layer height can't be greater than nozzle diameter" +msgstr "첫번째 레이어 높이는 노즐 직경보다 클 수 없습니다" + +#: src/libslic3r/Print.cpp:1294 +msgid "Layer height can't be greater than nozzle diameter" +msgstr "레이어 높이는 노즐 직경보다 클 수 없습니다" + +#: src/libslic3r/Print.cpp:1438 +msgid "Infilling layers" +msgstr "레이어 채우기" + +#: src/libslic3r/Print.cpp:1446 +msgid "Generating skirt" +msgstr "스커트 생성" + +#: src/libslic3r/Print.cpp:1454 +msgid "Generating brim" +msgstr "브림 생성" + +#: src/libslic3r/Print.cpp:1482 +msgid "Exporting G-code" +msgstr "G 코드 내보내기" + +#: src/libslic3r/Print.cpp:1486 +msgid "Generating G-code" +msgstr "G 코드 생성" + +#: src/libslic3r/SLAPrint.cpp:58 +msgid "Slicing model" +msgstr "슬라이싱 모델" + +#: src/libslic3r/SLAPrint.cpp:59 src/libslic3r/SLAPrint.cpp:871 +msgid "Generating support points" +msgstr "서포트 지점 생성" + +#: src/libslic3r/SLAPrint.cpp:60 +msgid "Generating support tree" +msgstr "서포트 트리 생성" + +#: src/libslic3r/SLAPrint.cpp:61 +msgid "Generating pad" +msgstr "패드 생성" + +#: src/libslic3r/SLAPrint.cpp:62 +msgid "Slicing supports" +msgstr "슬라이싱 서포트즈" + +#: src/libslic3r/SLAPrint.cpp:79 +msgid "Merging slices and calculating statistics" +msgstr "슬라이스 병합 및 통계 계산" + +#: src/libslic3r/SLAPrint.cpp:80 +msgid "Rasterizing layers" +msgstr "레이어 래스터화" + +#: src/libslic3r/SLAPrint.cpp:650 +msgid "" +"Cannot proceed without support points! Add support points or disable support " +"generation." +msgstr "" +"서포트 포인트 없이 진행할 수 없습니다! 서포트 지점을 추가 하거나 서포트 생성" +"을 사용 하지 않도록 설정 합니다." + +#: src/libslic3r/SLAPrint.cpp:664 +msgid "Elevation is too low for object." +msgstr "객체 고도가 너무 낮습니다." + +#: src/libslic3r/SLAPrint.cpp:670 +msgid "" +"The endings of the support pillars will be deployed on the gap between the " +"object and the pad. 'Support base safety distance' has to be greater than " +"the 'Pad object gap' parameter to avoid this." +msgstr "" +"서포트 기둥 끝은 오브젝트와 패드 사이의 간격에 배치됩니다. 이를 방지하기 위" +"해 '베이스 서포트 안전 거리'는 '패드 오브젝트 갭' 매개변수보다 커야 합니다." + +#: src/libslic3r/SLAPrint.cpp:759 +msgid "" +"Slicing had to be stopped due to an internal error: Inconsistent slice index." +msgstr "" +"내부 오류: 일치하지 않는 슬라이스 인덱스로 인해 슬라이싱을 중지해야 했습니다." + +#: src/libslic3r/SLAPrint.cpp:954 src/libslic3r/SLAPrint.cpp:964 +#: src/libslic3r/SLAPrint.cpp:1005 +msgid "Visualizing supports" +msgstr "시각화 지원" + +#: src/libslic3r/SLAPrint.cpp:1537 +msgid "Slicing done" +msgstr "슬라이싱 완료" + +#: src/libslic3r/PrintBase.cpp:71 +msgid "Failed processing of the output_filename_format template." +msgstr "아래 output_filename_format 템플리트의 처리에 실패했습니다." + +#: src/libslic3r/PrintConfig.cpp:43 src/libslic3r/PrintConfig.cpp:44 +msgid "Printer technology" +msgstr "프린터 기술" + +#: src/libslic3r/PrintConfig.cpp:51 +msgid "Bed shape" +msgstr "배드 모양" + +#: src/libslic3r/PrintConfig.cpp:56 +msgid "Bed custom texture" +msgstr "침대 사용자 정의 질감" + +#: src/libslic3r/PrintConfig.cpp:61 +msgid "Bed custom model" +msgstr "침대 사용자 정의 모델" + +#: src/libslic3r/PrintConfig.cpp:68 +msgid "" +"This setting controls the height (and thus the total number) of the slices/" +"layers. Thinner layers give better accuracy but take more time to print." +msgstr "" +"이 설정은 슬라이스/레이어의 높이(따라서 총 수)를 제어합니다. 얇은 층은 더 나" +"은 정확성을 제공하지만 인쇄하는 데는 더 많은 시간이 걸린다." + +#: src/libslic3r/PrintConfig.cpp:75 +msgid "Max print height" +msgstr "최대 프린트 높이" + +#: src/libslic3r/PrintConfig.cpp:76 +msgid "" +"Set this to the maximum height that can be reached by your extruder while " +"printing." +msgstr "인쇄 중에 익스트루더가 도달 할 수있는 최대 높이로 설정하십시오." + +#: src/libslic3r/PrintConfig.cpp:82 +msgid "Slice gap closing radius" +msgstr "슬라이스 간격 닫힘 반경" + +#: src/libslic3r/PrintConfig.cpp:84 +msgid "" +"Cracks smaller than 2x gap closing radius are being filled during the " +"triangle mesh slicing. The gap closing operation may reduce the final print " +"resolution, therefore it is advisable to keep the value reasonably low." +msgstr "" +"삼각형 메쉬 슬라이싱 중에, 2배 간격 폐쇄 반경 보다 작은 균열이 채워집니다. " +"틈 닫기 작업은 최종 인쇄 해상도를 줄일 수 있으므로 값을 합리적으로 낮게 유지 " +"하는 것이 좋습니다." + +#: src/libslic3r/PrintConfig.cpp:92 +msgid "Hostname, IP or URL" +msgstr "호스트 이름(Hostname), IP or URL" + +#: src/libslic3r/PrintConfig.cpp:93 +msgid "" +"Slic3r can upload G-code files to a printer host. This field should contain " +"the hostname, IP address or URL of the printer host instance." +msgstr "" +"Slic3r는 프린터 호스트에 G 코드 파일을 업로드할 수 있습니다. 이 필드는 호스" +"트 이름, IP 주소 또는 프린터 호스트 복제본의 URL을 포함 해야 합니다." + +#: src/libslic3r/PrintConfig.cpp:99 +msgid "API Key / Password" +msgstr "API 키/암호" + +#: src/libslic3r/PrintConfig.cpp:100 +msgid "" +"Slic3r can upload G-code files to a printer host. This field should contain " +"the API Key or the password required for authentication." +msgstr "" +"Slic3r는 프린터 호스트에 G 코드 파일을 업로드할 수 있습니다. 이 필드는 API " +"키 또는 인증에 필요한 암호를 포함 해야 합니다." + +#: src/libslic3r/PrintConfig.cpp:106 +msgid "HTTPS CA File" +msgstr "HTTPS CA 파일" + +#: src/libslic3r/PrintConfig.cpp:107 +msgid "" +"Custom CA certificate file can be specified for HTTPS OctoPrint connections, " +"in crt/pem format. If left blank, the default OS CA certificate repository " +"is used." +msgstr "" +"사용자 지정 CA 인증서 파일은 crt/pem 형식의 HTTPS 옥토 프린트 연결에 대해 지" +"정할 수 있습니다. 비워 두면 기본 OS CA 인증서 리포지토리가 사용 됩니다." + +#: src/libslic3r/PrintConfig.cpp:121 +msgid "Avoid crossing perimeters" +msgstr "출력된 외측을 피하세요" + +#: src/libslic3r/PrintConfig.cpp:122 +msgid "" +"Optimize travel moves in order to minimize the crossing of perimeters. This " +"is mostly useful with Bowden extruders which suffer from oozing. This " +"feature slows down both the print and the G-code generation." +msgstr "" +"둘레의 교차를 최소화하기 위해 여행 이동을 최적화하십시오. 이것은 보 잉 " +"(Bowling) 압출기가 흘러 나오기 쉬운 경우에 주로 유용합니다. 이 기능을 사용하" +"면 인쇄 및 G 코드 생성 속도가 느려집니다." + +#: src/libslic3r/PrintConfig.cpp:129 src/libslic3r/PrintConfig.cpp:2027 +msgid "Other layers" +msgstr "다른 레이어" + +#: src/libslic3r/PrintConfig.cpp:130 +msgid "" +"Bed temperature for layers after the first one. Set this to zero to disable " +"bed temperature control commands in the output." +msgstr "" +"첫 번째 레이어 이후의 레이어 온도. 이 값을 0으로 설정하면 출력에서 ​​베드 온도 " +"제어 명령을 비활성화합니다." + +#: src/libslic3r/PrintConfig.cpp:132 +msgid "Bed temperature" +msgstr "배드 온도" + +#: src/libslic3r/PrintConfig.cpp:139 +msgid "" +"This custom code is inserted at every layer change, right before the Z move. " +"Note that you can use placeholder variables for all Slic3r settings as well " +"as [layer_num] and [layer_z]." +msgstr "" +"이 사용자 정의 코드는 Z 이동 직전의 모든 레이어 변경에 삽입됩니다. [Slide3r] " +"설정과 [layer_num] 및 [layer_z]에 대한 자리 표시 자 변수를 사용할 수 있습니" +"다." + +#: src/libslic3r/PrintConfig.cpp:149 +msgid "Between objects G-code" +msgstr "객체 간 G 코드" + +#: src/libslic3r/PrintConfig.cpp:150 +msgid "" +"This code is inserted between objects when using sequential printing. By " +"default extruder and bed temperature are reset using non-wait command; " +"however if M104, M109, M140 or M190 are detected in this custom code, Slic3r " +"will not add temperature commands. Note that you can use placeholder " +"variables for all Slic3r settings, so you can put a \"M109 " +"S[first_layer_temperature]\" command wherever you want." +msgstr "" +"이 코드는 순차 인쇄를 사용할 때 객체간에 삽입됩니다. 기본적으로 익스트루더 " +"및 베드 온도는 대기 모드가 아닌 명령을 사용하여 재설정됩니다. 그러나 이 사용" +"자 코드에서 M104, M109, M140 또는 M190이 감지되면 Slic3r은 온도 명령을 추가하" +"지 않습니다. 모든 Slic3r 설정에 자리 표시 변수를 사용할 수 있으므로 원하는 위" +"치에 \"M109 S [first_layer_temperature]\"명령을 넣을 수 있습니다." + +#: src/libslic3r/PrintConfig.cpp:161 +msgid "Number of solid layers to generate on bottom surfaces." +msgstr "바닥면에 생성 할 솔리드 레이어의 수." + +#: src/libslic3r/PrintConfig.cpp:162 +msgid "Bottom solid layers" +msgstr "바닥 단일 레이어" + +#: src/libslic3r/PrintConfig.cpp:167 +msgid "Bridge" +msgstr "브리지" + +#: src/libslic3r/PrintConfig.cpp:168 +msgid "" +"This is the acceleration your printer will use for bridges. Set zero to " +"disable acceleration control for bridges." +msgstr "" +"이것은 프린터가 브릿지에 사용할 가속도입니다. 브리지의 가속 제어를 사용하지 " +"않으려면 0으로 설정하십시오." + +#: src/libslic3r/PrintConfig.cpp:170 src/libslic3r/PrintConfig.cpp:313 +#: src/libslic3r/PrintConfig.cpp:840 src/libslic3r/PrintConfig.cpp:961 +#: src/libslic3r/PrintConfig.cpp:1130 src/libslic3r/PrintConfig.cpp:1183 +#: src/libslic3r/PrintConfig.cpp:1194 src/libslic3r/PrintConfig.cpp:1383 +msgid "mm/s²" +msgstr "mm/s ²" + +#: src/libslic3r/PrintConfig.cpp:176 +msgid "Bridging angle" +msgstr "브릿지 각도" + +#: src/libslic3r/PrintConfig.cpp:178 +msgid "" +"Bridging angle override. If left to zero, the bridging angle will be " +"calculated automatically. Otherwise the provided angle will be used for all " +"bridges. Use 180° for zero angle." +msgstr "" +"브리징 각도 오버라이드(override)값이. 왼쪽으로 0 일 경우 브리징 각도가 자동으" +"로 계산됩니다. 그렇지 않으면 제공된 각도가 모든 브리지에 사용됩니다. 각도 제" +"로는 180 °를 사용하십시오." + +#: src/libslic3r/PrintConfig.cpp:181 src/libslic3r/PrintConfig.cpp:758 +#: src/libslic3r/PrintConfig.cpp:1619 src/libslic3r/PrintConfig.cpp:1629 +#: src/libslic3r/PrintConfig.cpp:1858 src/libslic3r/PrintConfig.cpp:2012 +#: src/libslic3r/PrintConfig.cpp:2197 src/libslic3r/PrintConfig.cpp:2582 +#: src/libslic3r/PrintConfig.cpp:2693 +msgid "°" +msgstr "°" + +#: src/libslic3r/PrintConfig.cpp:187 +msgid "Bridges fan speed" +msgstr "브릿지 팬 속도" + +#: src/libslic3r/PrintConfig.cpp:188 +msgid "This fan speed is enforced during all bridges and overhangs." +msgstr "이 팬 속도는 모든 브릿지 및 오버행 중에 적용됩니다." + +#: src/libslic3r/PrintConfig.cpp:189 src/libslic3r/PrintConfig.cpp:770 +#: src/libslic3r/PrintConfig.cpp:1203 src/libslic3r/PrintConfig.cpp:1266 +#: src/libslic3r/PrintConfig.cpp:1511 src/libslic3r/PrintConfig.cpp:2366 +#: src/libslic3r/PrintConfig.cpp:2623 +msgid "%" +msgstr "%" + +#: src/libslic3r/PrintConfig.cpp:196 +msgid "Bridge flow ratio" +msgstr "브릿지 유량(flow)값" + +#: src/libslic3r/PrintConfig.cpp:198 +msgid "" +"This factor affects the amount of plastic for bridging. You can decrease it " +"slightly to pull the extrudates and prevent sagging, although default " +"settings are usually good and you should experiment with cooling (use a fan) " +"before tweaking this." +msgstr "" +"이 요인은 브리징을위한 플라스틱의 양에 영향을 미칩니다. 압출 성형물을 잡아 당" +"겨 처짐을 방지하기 위해 약간 줄일 수 있지만 기본 설정은 일반적으로 좋지만이 " +"문제를 해결하기 전에 냉각 (팬 사용)을 시도해야합니다." + +#: src/libslic3r/PrintConfig.cpp:208 +msgid "Bridges" +msgstr "브릿지(Bridges)" + +#: src/libslic3r/PrintConfig.cpp:210 +msgid "Speed for printing bridges." +msgstr "브릿지 인쇄 속도." + +#: src/libslic3r/PrintConfig.cpp:211 src/libslic3r/PrintConfig.cpp:592 +#: src/libslic3r/PrintConfig.cpp:600 src/libslic3r/PrintConfig.cpp:609 +#: src/libslic3r/PrintConfig.cpp:617 src/libslic3r/PrintConfig.cpp:644 +#: src/libslic3r/PrintConfig.cpp:663 src/libslic3r/PrintConfig.cpp:899 +#: src/libslic3r/PrintConfig.cpp:1026 src/libslic3r/PrintConfig.cpp:1112 +#: src/libslic3r/PrintConfig.cpp:1148 src/libslic3r/PrintConfig.cpp:1161 +#: src/libslic3r/PrintConfig.cpp:1172 src/libslic3r/PrintConfig.cpp:1225 +#: src/libslic3r/PrintConfig.cpp:1284 src/libslic3r/PrintConfig.cpp:1412 +#: src/libslic3r/PrintConfig.cpp:1586 src/libslic3r/PrintConfig.cpp:1595 +#: src/libslic3r/PrintConfig.cpp:1991 src/libslic3r/PrintConfig.cpp:2104 +msgid "mm/s" +msgstr "mm/s" + +#: src/libslic3r/PrintConfig.cpp:218 +msgid "Brim width" +msgstr "브림 폭" + +#: src/libslic3r/PrintConfig.cpp:219 +msgid "" +"Horizontal width of the brim that will be printed around each object on the " +"first layer." +msgstr "첫 번째 레이어의 각 객체 주위에 인쇄 될 가장자리의 가로 폭입니다." + +#: src/libslic3r/PrintConfig.cpp:226 +msgid "Clip multi-part objects" +msgstr "여러 파트 오브젝트 클립" + +#: src/libslic3r/PrintConfig.cpp:227 +msgid "" +"When printing multi-material objects, this settings will make Slic3r to clip " +"the overlapping object parts one by the other (2nd part will be clipped by " +"the 1st, 3rd part will be clipped by the 1st and 2nd etc)." +msgstr "" +"멀티 메터리얼(multi-material) 개체를 인쇄 할 때이 설정을 사용하면 겹치는 개" +"체 파트를 서로 겹쳐서 잘라낼 수 있습니다 (두 번째 부분은 첫 번째 부분에서 클" +"리핑되며 세 번째 부분은 첫 번째 및 두 번째 부분에서 잘립니다)." + +#: src/libslic3r/PrintConfig.cpp:234 +msgid "Colorprint height" +msgstr "컬러 인쇄 높이" + +#: src/libslic3r/PrintConfig.cpp:235 +msgid "Heights at which a filament change is to occur." +msgstr "필라멘트 체인지가 발생 하는 높이." + +#: src/libslic3r/PrintConfig.cpp:245 +msgid "Compatible printers condition" +msgstr "호환 가능한 프린터 조건" + +#: src/libslic3r/PrintConfig.cpp:246 +msgid "" +"A boolean expression using the configuration values of an active printer " +"profile. If this expression evaluates to true, this profile is considered " +"compatible with the active printer profile." +msgstr "" +"활성 프린터 프로파일의 구성 값을 사용하는 부울 표현식. 이 표현식이 true로 평" +"가되면이 프로필은 활성 프린터 프로필과 호환되는 것으로 간주됩니다." + +#: src/libslic3r/PrintConfig.cpp:260 +msgid "Compatible print profiles condition" +msgstr "호환 되는 인쇄 프로 파일 조건" + +#: src/libslic3r/PrintConfig.cpp:261 +msgid "" +"A boolean expression using the configuration values of an active print " +"profile. If this expression evaluates to true, this profile is considered " +"compatible with the active print profile." +msgstr "" +"활성 인쇄 프로 파일의 구성 값을 사용하는 부울식입니다. 이 식이 true로 평가 되" +"면, 이 프로필이 활성 인쇄 프로필과 호환 되는 것으로 간주 됩니다." + +#: src/libslic3r/PrintConfig.cpp:278 +msgid "Complete individual objects" +msgstr "개별 개체 완성" + +#: src/libslic3r/PrintConfig.cpp:279 +msgid "" +"When printing multiple objects or copies, this feature will complete each " +"object before moving onto next one (and starting it from its bottom layer). " +"This feature is useful to avoid the risk of ruined prints. Slic3r should " +"warn and prevent you from extruder collisions, but beware." +msgstr "" +"여러 객체 또는 사본을 인쇄 할 때이 객체는 다음 객체로 이동하기 전에 각 객체" +"를 완성합니다 (맨 아래 레이어에서 시작). 이 기능은 인쇄물이 망가지는 위험을 " +"피할 때 유용합니다. Slic3r은 압출기 충돌을 경고하고 예방해야하지만 조심하십시" +"오." + +#: src/libslic3r/PrintConfig.cpp:287 +msgid "Enable auto cooling" +msgstr "자동 냉각 사용" + +#: src/libslic3r/PrintConfig.cpp:288 +msgid "" +"This flag enables the automatic cooling logic that adjusts print speed and " +"fan speed according to layer printing time." +msgstr "" +"이 플래그는 레이어 인쇄 시간에 따라 인쇄 속도와 팬 속도를 조정하는 자동 냉각 " +"논리를 활성화합니다." + +#: src/libslic3r/PrintConfig.cpp:293 +msgid "Cooling tube position" +msgstr "냉각 튜브 위치" + +#: src/libslic3r/PrintConfig.cpp:294 +msgid "Distance of the center-point of the cooling tube from the extruder tip." +msgstr "압출기 팁에서 냉각 튜브의 중심점까지의 거리 " + +#: src/libslic3r/PrintConfig.cpp:301 +msgid "Cooling tube length" +msgstr "냉각 튜브 길이" + +#: src/libslic3r/PrintConfig.cpp:302 +msgid "Length of the cooling tube to limit space for cooling moves inside it." +msgstr "내부의 냉각 이동을 위해 공간을 제한하는 냉각 튜브의 길이 " + +#: src/libslic3r/PrintConfig.cpp:310 +msgid "" +"This is the acceleration your printer will be reset to after the role-" +"specific acceleration values are used (perimeter/infill). Set zero to " +"prevent resetting acceleration at all." +msgstr "" +"역할 별 가속도 값이 사용 된 후에 프린터가 재설정되는 속도입니다 (둘레 / 충" +"전). 가속을 전혀 재설정하지 않으려면 0으로 설정하십시오." + +#: src/libslic3r/PrintConfig.cpp:319 +msgid "Default filament profile" +msgstr "기본 필라멘트 프로파일" + +#: src/libslic3r/PrintConfig.cpp:320 +msgid "" +"Default filament profile associated with the current printer profile. On " +"selection of the current printer profile, this filament profile will be " +"activated." +msgstr "" +"현재 프린터 프로파일과 연관된 기본 필라멘트 프로파일. 현재 프린터 프로파일을 " +"선택하면 이 필라멘트 프로파일이 활성화됩니다." + +#: src/libslic3r/PrintConfig.cpp:326 +msgid "Default print profile" +msgstr "기본 인쇄 프로파일" + +#: src/libslic3r/PrintConfig.cpp:327 src/libslic3r/PrintConfig.cpp:2447 +#: src/libslic3r/PrintConfig.cpp:2458 +msgid "" +"Default print profile associated with the current printer profile. On " +"selection of the current printer profile, this print profile will be " +"activated." +msgstr "" +"현재 프린터 프로파일과 연관된 기본 인쇄 프로파일. 현재 프린터 프로파일을 선택" +"하면이 인쇄 프로파일이 활성화됩니다." + +#: src/libslic3r/PrintConfig.cpp:333 +msgid "Disable fan for the first" +msgstr "첫 번째 팬 사용 중지" + +#: src/libslic3r/PrintConfig.cpp:334 +msgid "" +"You can set this to a positive value to disable fan at all during the first " +"layers, so that it does not make adhesion worse." +msgstr "" +"이 값을 양수 값으로 설정하면 첫 번째 레이어에서 팬을 사용하지 않도록 설정하" +"여 접착력을 악화시키지 않습니다." + +#: src/libslic3r/PrintConfig.cpp:336 src/libslic3r/PrintConfig.cpp:971 +#: src/libslic3r/PrintConfig.cpp:1484 src/libslic3r/PrintConfig.cpp:1669 +#: src/libslic3r/PrintConfig.cpp:1730 src/libslic3r/PrintConfig.cpp:1894 +#: src/libslic3r/PrintConfig.cpp:1939 +msgid "layers" +msgstr "레이어" + +#: src/libslic3r/PrintConfig.cpp:343 +msgid "Don't support bridges" +msgstr "서포트와 브릿지를 사용하지 않음" + +#: src/libslic3r/PrintConfig.cpp:345 +msgid "" +"Experimental option for preventing support material from being generated " +"under bridged areas." +msgstr "" +"브릿지 영역 아래에 서포팅 재료가 생성되는 것을 방지하기위한 실험적 옵션." + +#: src/libslic3r/PrintConfig.cpp:351 +msgid "Distance between copies" +msgstr "복사본 간 거리" + +#: src/libslic3r/PrintConfig.cpp:352 +msgid "Distance used for the auto-arrange feature of the plater." +msgstr "플래이터(plater)의 자동 정렬 기능에 사용되는 거리입니다." + +#: src/libslic3r/PrintConfig.cpp:359 +msgid "Elephant foot compensation" +msgstr "코끼리 발(Elephant foot) 보상값" + +#: src/libslic3r/PrintConfig.cpp:361 +msgid "" +"The first layer will be shrunk in the XY plane by the configured value to " +"compensate for the 1st layer squish aka an Elephant Foot effect." +msgstr "" +"첫 번째 레이어는 구성 요소 값에 따라 XY 평면에서 수축되어 일층 스 퀴시 코끼리" +"발(Elephant Foot) 효과를 보완합니다." + +#: src/libslic3r/PrintConfig.cpp:370 +msgid "" +"This end procedure is inserted at the end of the output file. Note that you " +"can use placeholder variables for all Slic3r settings." +msgstr "" +"이 종료 절차는 출력 파일의 끝에 삽입된다. 모든 Slic3r 설정에 자리 표시자 변수" +"를 사용할 수 있다는 점에 유의하십시오." + +#: src/libslic3r/PrintConfig.cpp:380 +msgid "" +"This end procedure is inserted at the end of the output file, before the " +"printer end gcode (and before any toolchange from this filament in case of " +"multimaterial printers). Note that you can use placeholder variables for all " +"Slic3r settings. If you have multiple extruders, the gcode is processed in " +"extruder order." +msgstr "" +"이 종료 절차는 출력 파일의 끝, 프린터 종료 gcode 이전 (및 복합 재료 프린터의 " +"경우이 필라멘트에서 도구를 변경하기 전에)에 삽입됩니다. 모든 Slic3r 설정에 자" +"리 표시 자 변수를 사용할 수 있습니다. 압출기가 여러 개인 경우 gcode는 압출기 " +"순서대로 처리됩니다." + +#: src/libslic3r/PrintConfig.cpp:391 +msgid "Ensure vertical shell thickness" +msgstr "수직 쉘(shell) 두께 확인" + +#: src/libslic3r/PrintConfig.cpp:393 +msgid "" +"Add solid infill near sloping surfaces to guarantee the vertical shell " +"thickness (top+bottom solid layers)." +msgstr "" +"경사 표면 근처에 솔리드 인필을 추가하여 수직 셸 두께(상단+하단 솔리드 레이어)" +"를 보장하십시오." + +#: src/libslic3r/PrintConfig.cpp:399 +msgid "Top fill pattern" +msgstr "상단 채우기 패턴" + +#: src/libslic3r/PrintConfig.cpp:401 +msgid "" +"Fill pattern for top infill. This only affects the top visible layer, and " +"not its adjacent solid shells." +msgstr "" +"상단 채우기의 채우기 패턴. 이는 인접 한 솔리드 쉘이 아니라 보이는 상위 레이어" +"에만 영향을 줍니다." + +#: src/libslic3r/PrintConfig.cpp:409 src/libslic3r/PrintConfig.cpp:821 +#: src/libslic3r/PrintConfig.cpp:1972 +msgid "Rectilinear" +msgstr "직선면(Rectilinear)" + +#: src/libslic3r/PrintConfig.cpp:410 src/libslic3r/PrintConfig.cpp:827 +msgid "Concentric" +msgstr "동심원(Concentric)" + +#: src/libslic3r/PrintConfig.cpp:411 src/libslic3r/PrintConfig.cpp:831 +msgid "Hilbert Curve" +msgstr "힐버트 곡선(Hilbert Curve)" + +#: src/libslic3r/PrintConfig.cpp:412 src/libslic3r/PrintConfig.cpp:832 +msgid "Archimedean Chords" +msgstr "아르키메데우스(Archimedean Chords)" + +#: src/libslic3r/PrintConfig.cpp:413 src/libslic3r/PrintConfig.cpp:833 +msgid "Octagram Spiral" +msgstr "옥타그램 나선(Octagram Spiral)" + +#: src/libslic3r/PrintConfig.cpp:419 +msgid "Bottom fill pattern" +msgstr "아래쪽 채우기 패턴" + +#: src/libslic3r/PrintConfig.cpp:421 +msgid "" +"Fill pattern for bottom infill. This only affects the bottom external " +"visible layer, and not its adjacent solid shells." +msgstr "" +"하단 채우기의 채우기 패턴. 이는 인접 한 솔리드 쉘이 아니라 아래쪽에 보이는 외" +"부 레이어에만 영향을 줍니다." + +#: src/libslic3r/PrintConfig.cpp:430 src/libslic3r/PrintConfig.cpp:440 +msgid "External perimeters" +msgstr "외측 둘레" + +#: src/libslic3r/PrintConfig.cpp:432 +msgid "" +"Set this to a non-zero value to set a manual extrusion width for external " +"perimeters. If left zero, default extrusion width will be used if set, " +"otherwise 1.125 x nozzle diameter will be used. If expressed as percentage " +"(for example 200%), it will be computed over layer height." +msgstr "" +"외부 경계에 대한 수동 압출 폭을 설정하려면 이 값을 0이 아닌 값으로 설정하십시" +"오. 0인 경우 기본 압출 너비가 사용되며, 그렇지 않으면 1.125 x 노즐 직경이 사" +"용된다. 백분율(예: 200%)로 표현되는 경우, 레이어 높이에 걸쳐 계산됩니다." + +#: src/libslic3r/PrintConfig.cpp:435 src/libslic3r/PrintConfig.cpp:543 +#: src/libslic3r/PrintConfig.cpp:860 src/libslic3r/PrintConfig.cpp:872 +#: src/libslic3r/PrintConfig.cpp:992 src/libslic3r/PrintConfig.cpp:1017 +#: src/libslic3r/PrintConfig.cpp:1403 src/libslic3r/PrintConfig.cpp:1741 +#: src/libslic3r/PrintConfig.cpp:1847 src/libslic3r/PrintConfig.cpp:1915 +#: src/libslic3r/PrintConfig.cpp:2074 +msgid "mm or %" +msgstr "mm/s 또는 %" + +#: src/libslic3r/PrintConfig.cpp:442 +msgid "" +"This separate setting will affect the speed of external perimeters (the " +"visible ones). If expressed as percentage (for example: 80%) it will be " +"calculated on the perimeters speed setting above. Set to zero for auto." +msgstr "" +"이 별도의 설정은 외부 경계선(시각적 경계선)의 속도에 영향을 미친다. 백분율" +"(예: 80%)로 표현되는 경우 위의 Perimeter 속도 설정에 따라 계산된다. 자동을 위" +"해 0으로 설정한다." + +#: src/libslic3r/PrintConfig.cpp:445 src/libslic3r/PrintConfig.cpp:881 +#: src/libslic3r/PrintConfig.cpp:1700 src/libslic3r/PrintConfig.cpp:1751 +#: src/libslic3r/PrintConfig.cpp:1958 src/libslic3r/PrintConfig.cpp:2086 +msgid "mm/s or %" +msgstr "mm/s 또는 %" + +#: src/libslic3r/PrintConfig.cpp:452 +msgid "External perimeters first" +msgstr "외부 경계선 먼저" + +#: src/libslic3r/PrintConfig.cpp:454 +msgid "" +"Print contour perimeters from the outermost one to the innermost one instead " +"of the default inverse order." +msgstr "" +"기본 역순 대신 가장 바깥쪽부터 가장 안쪽까지 윤곽선을 인쇄하십시오. 타겟 TTS" +"복사하기번역 저장번역 저장번역 수정." + +#: src/libslic3r/PrintConfig.cpp:460 +msgid "Extra perimeters if needed" +msgstr "필요한 경우 추가 둘레" + +#: src/libslic3r/PrintConfig.cpp:462 +#, c-format +msgid "" +"Add more perimeters when needed for avoiding gaps in sloping walls. Slic3r " +"keeps adding perimeters, until more than 70% of the loop immediately above " +"is supported." +msgstr "" +"경사 벽의 틈을 피하기 위해 필요한 경우 더 많은 둘래(perimeter)를 추가하십시" +"오. 위의 루프의 70% of 이상이 지지될 때까지 Slic3r는 계속해서 둘ㄹ를 추가한" +"다." + +#: src/libslic3r/PrintConfig.cpp:472 +msgid "" +"The extruder to use (unless more specific extruder settings are specified). " +"This value overrides perimeter and infill extruders, but not the support " +"extruders." +msgstr "" +"사용할 압출부(더 구체적인 압출부 설정이 지정되지 않은 경우) 이 값은 경계 및 " +"압출부를 초과하지만 지원 압출자를 주입하지는 않는다." + +#: src/libslic3r/PrintConfig.cpp:484 +msgid "" +"Set this to the vertical distance between your nozzle tip and (usually) the " +"X carriage rods. In other words, this is the height of the clearance " +"cylinder around your extruder, and it represents the maximum depth the " +"extruder can peek before colliding with other printed objects." +msgstr "" +"이것을 노즐 팁과 (일반적으로) X 캐리지 로드 사이의 수직 거리로 설정하십시오. " +"다시 말하면, 이것은 당신의 압출기 주위의 틈새 실린더의 높이이며, 그것은 다른 " +"인쇄된 물체와 충돌하기 전에 압출기가 엿볼 수 있는 최대 깊이를 나타낸다." + +#: src/libslic3r/PrintConfig.cpp:494 +msgid "Radius" +msgstr "반지름" + +#: src/libslic3r/PrintConfig.cpp:495 +msgid "" +"Set this to the clearance radius around your extruder. If the extruder is " +"not centered, choose the largest value for safety. This setting is used to " +"check for collisions and to display the graphical preview in the plater." +msgstr "" +"이것을 당신의 압출기 주변의 간극 반경으로 설정하시오. 압출부가 중앙에 있지 않" +"으면 안전을 위해 가장 큰 값을 선택하십시오. 이 설정은 충돌 여부를 확인하고 플" +"래터에 그래픽 미리 보기를 표시하기 위해 사용된다." + +#: src/libslic3r/PrintConfig.cpp:505 +msgid "Extruder Color" +msgstr "익스트루더 컬러" + +#: src/libslic3r/PrintConfig.cpp:506 src/libslic3r/PrintConfig.cpp:566 +msgid "This is only used in the Slic3r interface as a visual help." +msgstr "이것은 시각적 도움말로 Slic3r 인터페이스에서만 사용된다." + +#: src/libslic3r/PrintConfig.cpp:512 +msgid "Extruder offset" +msgstr "익스트루더 오프셋" + +#: src/libslic3r/PrintConfig.cpp:513 +msgid "" +"If your firmware doesn't handle the extruder displacement you need the G-" +"code to take it into account. This option lets you specify the displacement " +"of each extruder with respect to the first one. It expects positive " +"coordinates (they will be subtracted from the XY coordinate)." +msgstr "" +"펌웨어가 압출기 위치 변경을 처리하지 못하면 G 코드를 고려해야합니다. 이 옵션" +"을 사용하면 첫 번째 것에 대한 각 압출기의 변위를 지정할 수 있습니다. 양의 좌" +"표가 필요합니다 (XY 좌표에서 뺍니다)." + +#: src/libslic3r/PrintConfig.cpp:522 +msgid "Extrusion axis" +msgstr "압출 축" + +#: src/libslic3r/PrintConfig.cpp:523 +msgid "" +"Use this option to set the axis letter associated to your printer's extruder " +"(usually E but some printers use A)." +msgstr "" +"이 옵션을 사용하여 프린터의 압출기에 연결된 축 문자를 설정합니다 (보통 E이지" +"만 일부 프린터는 A를 사용합니다)." + +#: src/libslic3r/PrintConfig.cpp:528 +msgid "Extrusion multiplier" +msgstr "압출 승수" + +#: src/libslic3r/PrintConfig.cpp:529 +msgid "" +"This factor changes the amount of flow proportionally. You may need to tweak " +"this setting to get nice surface finish and correct single wall widths. " +"Usual values are between 0.9 and 1.1. If you think you need to change this " +"more, check filament diameter and your firmware E steps." +msgstr "" +"이 요소는 비례하여 유량의 양을 변경합니다. 멋진 서페이스 마무리와 단일 벽 너" +"비를 얻기 위해이 설정을 조정해야 할 수도 있습니다. 일반적인 값은 0.9와 1.1 사" +"이입니다. 이 값을 더 변경해야한다고 판단되면 필라멘트 직경과 펌웨어 E 단계를 " +"확인하십시오." + +#: src/libslic3r/PrintConfig.cpp:537 +msgid "Default extrusion width" +msgstr "기본 압출 폭" + +#: src/libslic3r/PrintConfig.cpp:539 +msgid "" +"Set this to a non-zero value to allow a manual extrusion width. If left to " +"zero, Slic3r derives extrusion widths from the nozzle diameter (see the " +"tooltips for perimeter extrusion width, infill extrusion width etc). If " +"expressed as percentage (for example: 230%), it will be computed over layer " +"height." +msgstr "" +"수동 압출 폭을 허용하려면이 값을 0이 아닌 값으로 설정하십시오. 0으로 남겨두" +"면 Slic3r은 노즐 직경에서 압출 폭을 도출합니다 (주변 압출 폭, 성형 압출 폭 등" +"의 툴팁 참조). 백분율로 표시되는 경우 (예 : 230 %) 레이어 높이를 기준으로 계" +"산됩니다." + +#: src/libslic3r/PrintConfig.cpp:548 +msgid "Keep fan always on" +msgstr "항상 팬 켜기" + +#: src/libslic3r/PrintConfig.cpp:549 +msgid "" +"If this is enabled, fan will never be disabled and will be kept running at " +"least at its minimum speed. Useful for PLA, harmful for ABS." +msgstr "" +"이 기능을 사용하면 팬이 비활성화되지 않으며 최소한 최소 속도로 계속 회전합니" +"다. PLA에 유용하며 ABS에 해롭다." + +#: src/libslic3r/PrintConfig.cpp:554 +msgid "Enable fan if layer print time is below" +msgstr "레이어 인쇄 시간이 미만인 경우 팬 활성화" + +#: src/libslic3r/PrintConfig.cpp:555 +msgid "" +"If layer print time is estimated below this number of seconds, fan will be " +"enabled and its speed will be calculated by interpolating the minimum and " +"maximum speeds." +msgstr "" +"레이어 인쇄 시간이이 초 미만으로 예상되는 경우 팬이 활성화되고 속도는 최소 " +"및 최대 속도를 보간하여 계산됩니다." + +#: src/libslic3r/PrintConfig.cpp:557 src/libslic3r/PrintConfig.cpp:1687 +msgid "approximate seconds" +msgstr "근사치 초" + +#: src/libslic3r/PrintConfig.cpp:565 +msgid "Color" +msgstr "색상" + +#: src/libslic3r/PrintConfig.cpp:571 +msgid "Filament notes" +msgstr "필라멘트 메모" + +#: src/libslic3r/PrintConfig.cpp:572 +msgid "You can put your notes regarding the filament here." +msgstr "여기에 필라멘트에 관한 메모를 넣을 수 있다." + +#: src/libslic3r/PrintConfig.cpp:580 src/libslic3r/PrintConfig.cpp:1231 +msgid "Max volumetric speed" +msgstr "최대 체적 속도" + +#: src/libslic3r/PrintConfig.cpp:581 +msgid "" +"Maximum volumetric speed allowed for this filament. Limits the maximum " +"volumetric speed of a print to the minimum of print and filament volumetric " +"speed. Set to zero for no limit." +msgstr "" +"이 필라멘트에 허용되는 최대 체적 속도. 인쇄물의 최대 체적 속도를 인쇄 및 필라" +"멘트 체적 속도 최소로 제한한다. 제한 없음에 대해 0으로 설정하십시오." + +#: src/libslic3r/PrintConfig.cpp:590 +msgid "Loading speed" +msgstr "로딩 속도" + +#: src/libslic3r/PrintConfig.cpp:591 +msgid "Speed used for loading the filament on the wipe tower." +msgstr "와이퍼 탑(wipe)에 필라멘트를 장착하는 데 사용되는 속도. " + +#: src/libslic3r/PrintConfig.cpp:598 +msgid "Loading speed at the start" +msgstr "시작시 로딩 속도" + +#: src/libslic3r/PrintConfig.cpp:599 +msgid "Speed used at the very beginning of loading phase." +msgstr "로딩 단계의 시작에 사용 되는 속도." + +#: src/libslic3r/PrintConfig.cpp:606 +msgid "Unloading speed" +msgstr "언로딩 스피드" + +#: src/libslic3r/PrintConfig.cpp:607 +msgid "" +"Speed used for unloading the filament on the wipe tower (does not affect " +"initial part of unloading just after ramming)." +msgstr "" +"와이퍼 타워에서 필라멘트를 언로드하는 데 사용되는 속도(램핑 후 바로 언로딩의 " +"초기 부분에는 영향을 주지 않음)." + +#: src/libslic3r/PrintConfig.cpp:615 +msgid "Unloading speed at the start" +msgstr "시작 시 언로드 속도" + +#: src/libslic3r/PrintConfig.cpp:616 +msgid "" +"Speed used for unloading the tip of the filament immediately after ramming." +msgstr "속도는 램 밍 직후 필 라 멘 트의 팁을 언로딩 하는 데 사용 됩니다." + +#: src/libslic3r/PrintConfig.cpp:623 +msgid "Delay after unloading" +msgstr "언로드 후 딜레이" + +#: src/libslic3r/PrintConfig.cpp:624 +msgid "" +"Time to wait after the filament is unloaded. May help to get reliable " +"toolchanges with flexible materials that may need more time to shrink to " +"original dimensions." +msgstr "" +"필라멘트를 내린 후 기다리는 시간. 원래 치수로 축소하는 데, 더 많은 시간이 필" +"요할 수 있는 유연한 재료로 신뢰할 수있는 공구 교환을 얻을 수 있습니다." + +#: src/libslic3r/PrintConfig.cpp:633 +msgid "Number of cooling moves" +msgstr "쿨링 이동 숫자" + +#: src/libslic3r/PrintConfig.cpp:634 +msgid "" +"Filament is cooled by being moved back and forth in the cooling tubes. " +"Specify desired number of these moves." +msgstr "" +"필라멘트는 쿨링 튜브에서 앞뒤로 이동 하여 냉각 됩니다. 이러한 이동의 원하는 " +"값을 지정 합니다." + +#: src/libslic3r/PrintConfig.cpp:642 +msgid "Speed of the first cooling move" +msgstr "첫 번째 냉각 이동 속도" + +#: src/libslic3r/PrintConfig.cpp:643 +msgid "Cooling moves are gradually accelerating beginning at this speed." +msgstr "냉각 속도가 서서히 빨라지고 있습니다." + +#: src/libslic3r/PrintConfig.cpp:650 +msgid "Minimal purge on wipe tower" +msgstr "와이프(wipe) 탑의 최소 퍼지" + +#: src/libslic3r/PrintConfig.cpp:651 +msgid "" +"After a tool change, the exact position of the newly loaded filament inside " +"the nozzle may not be known, and the filament pressure is likely not yet " +"stable. Before purging the print head into an infill or a sacrificial " +"object, Slic3r will always prime this amount of material into the wipe tower " +"to produce successive infill or sacrificial object extrusions reliably." +msgstr "" +"공구가 변경 된 후 노즐 내부에 새로 로드 된 필라멘트의 정확한 위치를 알 수 없" +"으며, 필라멘트 압력이 아직 안정적이지 않을 수 있습니다. 프린트 헤드를 인필 또" +"는 희생(sacrificial) 객체로 소거 하기 전에 Slic3r는 항상이 양의 재료를 와이" +"프 탑에 넣어 연속적인 채우기 또는 희생(sacrificial) 객체 돌출을 안정적으로 생" +"성 합니다." + +#: src/libslic3r/PrintConfig.cpp:655 +msgid "mm³" +msgstr "mm ³" + +#: src/libslic3r/PrintConfig.cpp:661 +msgid "Speed of the last cooling move" +msgstr "마지막 냉각 이동 속도" + +#: src/libslic3r/PrintConfig.cpp:662 +msgid "Cooling moves are gradually accelerating towards this speed." +msgstr "냉각은 이 속도쪽으로 점차 가속화되고 있습니다. " + +#: src/libslic3r/PrintConfig.cpp:669 +msgid "Filament load time" +msgstr "필라멘트 로드 시간" + +#: src/libslic3r/PrintConfig.cpp:670 +msgid "" +"Time for the printer firmware (or the Multi Material Unit 2.0) to load a new " +"filament during a tool change (when executing the T code). This time is " +"added to the total print time by the G-code time estimator." +msgstr "" +"프린터 펌웨어 (또는 MMU 2.0)가 공구를 변경하는 동안(T 코드를 실행할 때) 새필" +"라멘트를 로드하는 시간입니다. 이 시간은 G 코드 시간 추정기에 의해 총 인쇄 시" +"간에 추가 됩니다." + +#: src/libslic3r/PrintConfig.cpp:677 +msgid "Ramming parameters" +msgstr "래밍 파라미터" + +#: src/libslic3r/PrintConfig.cpp:678 +msgid "" +"This string is edited by RammingDialog and contains ramming specific " +"parameters." +msgstr "" +"이 문자열은 RammingDialog에 의해 편집되고 래밍 특정 매개 변수를 포함합니다." + +#: src/libslic3r/PrintConfig.cpp:684 +msgid "Filament unload time" +msgstr "필라멘트 언로드 시간" + +#: src/libslic3r/PrintConfig.cpp:685 +msgid "" +"Time for the printer firmware (or the Multi Material Unit 2.0) to unload a " +"filament during a tool change (when executing the T code). This time is " +"added to the total print time by the G-code time estimator." +msgstr "" +"프린터 펌웨어 (또는 MMU2.0)가 공구 교환 중에 필라멘트를 언로드하기 위한 시간" +"입니다 (T 코드를 실행할 때). 이 시간은 G 코드 시간추정기에 의해 총 인쇄 시간" +"에 추가 됩니다." + +#: src/libslic3r/PrintConfig.cpp:693 +msgid "" +"Enter your filament diameter here. Good precision is required, so use a " +"caliper and do multiple measurements along the filament, then compute the " +"average." +msgstr "" +"여기에 필라멘트 직경을 입력하십시오. 정밀도가 필요하므로 캘리퍼를 사용하여 필" +"라멘트를 따라 여러 번 측정 한 다음 평균을 계산하십시오." + +#: src/libslic3r/PrintConfig.cpp:700 +msgid "Density" +msgstr "밀도" + +#: src/libslic3r/PrintConfig.cpp:701 +msgid "" +"Enter your filament density here. This is only for statistical information. " +"A decent way is to weigh a known length of filament and compute the ratio of " +"the length to volume. Better is to calculate the volume directly through " +"displacement." +msgstr "" +"여기서 필라멘트 밀도를 입력하십시오. 이것은 통계 정보 용입니다. 괜찮은 방법" +"은 알려진 길이의 필라멘트의 무게를 측정하고 길이와 볼륨의 비율을 계산하는 것" +"입니다. 변위를 통해 직접적으로 부피를 계산하는 것이 더 좋습니다." + +#: src/libslic3r/PrintConfig.cpp:704 +msgid "g/cm³" +msgstr "g/cm³" + +#: src/libslic3r/PrintConfig.cpp:709 +msgid "Filament type" +msgstr "필라멘트 타입" + +#: src/libslic3r/PrintConfig.cpp:710 +msgid "The filament material type for use in custom G-codes." +msgstr "사용자 지정 G 코드에 사용할 필라멘트재료 유형입니다." + +#: src/libslic3r/PrintConfig.cpp:736 +msgid "Soluble material" +msgstr "수용성 재료" + +#: src/libslic3r/PrintConfig.cpp:737 +msgid "Soluble material is most likely used for a soluble support." +msgstr "수용성 재료눈 물에 녹는 서포트에 가장 많이 사용된다." + +#: src/libslic3r/PrintConfig.cpp:743 +msgid "" +"Enter your filament cost per kg here. This is only for statistical " +"information." +msgstr "필라멘트(kg당) 비용을 여기에 입력하십시오. 통계를 내기 위해서 입니다." + +#: src/libslic3r/PrintConfig.cpp:744 +msgid "money/kg" +msgstr "원(\\)/kg" + +#: src/libslic3r/PrintConfig.cpp:753 +msgid "Fill angle" +msgstr "채움 각도" + +#: src/libslic3r/PrintConfig.cpp:755 +msgid "" +"Default base angle for infill orientation. Cross-hatching will be applied to " +"this. Bridges will be infilled using the best direction Slic3r can detect, " +"so this setting does not affect them." +msgstr "" +"본 오리엔테이션 방향의 기본 각도입니다. 해칭이 적용될 것입니다. Slic3r이 감" +"지 할 수있는 최상의 방향을 사용하여 브릿징이 채워지므로이 설정은 영향을 미치" +"지 않습니다." + +#: src/libslic3r/PrintConfig.cpp:767 +msgid "Fill density" +msgstr "채우기(fill) 밀도" + +#: src/libslic3r/PrintConfig.cpp:769 +msgid "Density of internal infill, expressed in the range 0% - 100%." +msgstr "0 % - 100 % 범위로 표현 된 내부 채움(infill)의 밀도." + +#: src/libslic3r/PrintConfig.cpp:804 +msgid "Fill pattern" +msgstr "채우기(fill) 패턴" + +#: src/libslic3r/PrintConfig.cpp:806 +msgid "Fill pattern for general low-density infill." +msgstr "일반 낮은 밀도 채움의 패턴." + +#: src/libslic3r/PrintConfig.cpp:822 +msgid "Grid" +msgstr "그리드(Grid)" + +#: src/libslic3r/PrintConfig.cpp:823 +msgid "Triangles" +msgstr "삼각형(Triangles)" + +#: src/libslic3r/PrintConfig.cpp:824 +msgid "Stars" +msgstr "별(Stars)" + +#: src/libslic3r/PrintConfig.cpp:825 +msgid "Cubic" +msgstr "큐빅" + +#: src/libslic3r/PrintConfig.cpp:826 +msgid "Line" +msgstr "선(Line)" + +#: src/libslic3r/PrintConfig.cpp:828 src/libslic3r/PrintConfig.cpp:1974 +msgid "Honeycomb" +msgstr "벌집" + +#: src/libslic3r/PrintConfig.cpp:829 +msgid "3D Honeycomb" +msgstr "3D 벌집" + +#: src/libslic3r/PrintConfig.cpp:830 +msgid "Gyroid" +msgstr "자이로이드(Gyroid)" + +#: src/libslic3r/PrintConfig.cpp:837 src/libslic3r/PrintConfig.cpp:846 +#: src/libslic3r/PrintConfig.cpp:854 src/libslic3r/PrintConfig.cpp:887 +msgid "First layer" +msgstr "첫 레이어" + +#: src/libslic3r/PrintConfig.cpp:838 +msgid "" +"This is the acceleration your printer will use for first layer. Set zero to " +"disable acceleration control for first layer." +msgstr "" +"이것은 프린터가 첫 번째 레이어에 사용할 가속도입니다. 0을 설정하면 첫 번째 레" +"이어에 대한 가속 제어가 사용되지 않습니다." + +#: src/libslic3r/PrintConfig.cpp:847 +msgid "" +"Heated build plate temperature for the first layer. Set this to zero to " +"disable bed temperature control commands in the output." +msgstr "" +"첫 번째 레이어에 대한 빌드 플레이트 온도를 가열. 이 값을 0으로 설정하면 출력" +"에서 ​​베드 온도 제어 명령을 비활성화합니다." + +#: src/libslic3r/PrintConfig.cpp:856 +msgid "" +"Set this to a non-zero value to set a manual extrusion width for first " +"layer. You can use this to force fatter extrudates for better adhesion. If " +"expressed as percentage (for example 120%) it will be computed over first " +"layer height. If set to zero, it will use the default extrusion width." +msgstr "" +"첫 번째 레이어의 수동 압출 폭을 설정하려면이 값을 0이 아닌 값으로 설정합니" +"다. 이 방법을 사용하면보다 우수한 접착력을 위해 더 두꺼운 압출 성형물을 만들 " +"수 있습니다. 백분율 (예 : 120 %)로 표현하면 첫 번째 레이어 높이를 기준으로 계" +"산됩니다. 0으로 설정하면 기본 압출 폭이 사용됩니다." + +#: src/libslic3r/PrintConfig.cpp:868 +msgid "" +"When printing with very low layer heights, you might still want to print a " +"thicker bottom layer to improve adhesion and tolerance for non perfect build " +"plates. This can be expressed as an absolute value or as a percentage (for " +"example: 150%) over the default layer height." +msgstr "" +"매우 낮은 층의 높이로 인쇄할 때, 당신은 여전히 완벽하지 않은 빌드 플레이트의 " +"부착력과 허용오차를 개선하기 위해 더 두꺼운 바닥 층을 인쇄하기를 원할 수 있" +"다. 이것은 절대값 또는 기본 계층 높이에 대한 백분율(예: 150%)로 표시할 수 있" +"다." + +#: src/libslic3r/PrintConfig.cpp:877 +msgid "First layer speed" +msgstr "첫 레이어 속도" + +#: src/libslic3r/PrintConfig.cpp:878 +msgid "" +"If expressed as absolute value in mm/s, this speed will be applied to all " +"the print moves of the first layer, regardless of their type. If expressed " +"as a percentage (for example: 40%) it will scale the default speeds." +msgstr "" +"절대값(mm/s)으로 표현되는 경우, 이 속도는 유형에 관계없이 첫 번째 층의 모든 " +"인쇄 이동에 적용된다. 백분율(예: 40%)로 표현되는 경우 기본 속도를 스케일링한" +"다." + +#: src/libslic3r/PrintConfig.cpp:888 +msgid "" +"Extruder temperature for first layer. If you want to control temperature " +"manually during print, set this to zero to disable temperature control " +"commands in the output file." +msgstr "" +"첫 번째 층의 외부 온도. 인쇄 중에 온도를 수동으로 제어하려면 출력 파일에서 온" +"도 제어 명령을 사용하지 않으려면 이 값을 0으로 설정하십시오." + +#: src/libslic3r/PrintConfig.cpp:897 +msgid "" +"Speed for filling small gaps using short zigzag moves. Keep this reasonably " +"low to avoid too much shaking and resonance issues. Set zero to disable gaps " +"filling." +msgstr "" +"짧은 지그재그로 작은 틈을 메우기 위한 속도. 너무 많은 진동과 공진 문제를 피하" +"기 위해 이것을 합리적으로 낮게 유지한다. 간격 채우기를 사용하지 않으려면 0을 " +"설정하십시오." + +#: src/libslic3r/PrintConfig.cpp:905 +msgid "Verbose G-code" +msgstr "세부 G-코드" + +#: src/libslic3r/PrintConfig.cpp:906 +msgid "" +"Enable this to get a commented G-code file, with each line explained by a " +"descriptive text. If you print from SD card, the additional weight of the " +"file could make your firmware slow down." +msgstr "" +"설명 텍스트로 설명되는 각 행과 함께 코멘트된 G-code 파일을 가져오려면 이 옵션" +"을 선택하십시오. 만일 당신이 SD카드로 인쇄한다면, 파일의 추가 무게로 인해 펌" +"웨어의 속도가 느려질 수 있다." + +#: src/libslic3r/PrintConfig.cpp:913 +msgid "G-code flavor" +msgstr "G-code 형식" + +#: src/libslic3r/PrintConfig.cpp:914 +msgid "" +"Some G/M-code commands, including temperature control and others, are not " +"universal. Set this option to your printer's firmware to get a compatible " +"output. The \"No extrusion\" flavor prevents Slic3r from exporting any " +"extrusion value at all." +msgstr "" +"온도 조절 등을 포함한 일부 G/M-코드 명령은 보편적이지 않습니다. 호환되는 출력" +"을 얻으려면 보드에 적제된 프린터의 펌웨어로 설정하십시오. \"압출 없음\" 형식" +"은 Slic3r가 어떠한 압출 값도 출력하지 못하게 합니다." + +#: src/libslic3r/PrintConfig.cpp:937 +msgid "No extrusion" +msgstr "압출 없음" + +#: src/libslic3r/PrintConfig.cpp:942 +msgid "Label objects" +msgstr "레이블 개체" + +#: src/libslic3r/PrintConfig.cpp:943 +msgid "" +"Enable this to add comments into the G-Code labeling print moves with what " +"object they belong to, which is useful for the Octoprint CancelObject " +"plugin. This settings is NOT compatible with Single Extruder Multi Material " +"setup and Wipe into Object / Wipe into Infill." +msgstr "" +"이 기능을 사용 하 여 G 코드 레이블 인쇄에 주석이 속해 있는 객체와 함께 이동 " +"하 여 주석을 추가할 수 있으며,이는 옥 토 프린트 캔 커 작업 플러그인에 유용 합" +"니다. 이 설정은 단일 압출 기 다중 재료 설정과 호환 되지 않으며 객체를 닦아 " +"내 고 채우기로 닦습니다." + +#: src/libslic3r/PrintConfig.cpp:950 +msgid "High extruder current on filament swap" +msgstr "필라멘트스왑에 높은 압출 기 전류" + +#: src/libslic3r/PrintConfig.cpp:951 +msgid "" +"It may be beneficial to increase the extruder motor current during the " +"filament exchange sequence to allow for rapid ramming feed rates and to " +"overcome resistance when loading a filament with an ugly shaped tip." +msgstr "" +"필라멘트 교환 동안 압출기 모터 전류를 증가 시키는 것이 유리할 수 있으며, 이" +"는 빠른 래밍 공급 속도를 가능 하게하고, 불규칙한 모양의 필라멘트를 로딩할때 " +"저항을 극복하기 위한것이다." + +#: src/libslic3r/PrintConfig.cpp:959 +msgid "" +"This is the acceleration your printer will use for infill. Set zero to " +"disable acceleration control for infill." +msgstr "" +"이것은 당신 프린터의 채움 가속력이다. 주입에 대한 가속 제어를 비활성화하려면 " +"0을 설정하십시오." + +#: src/libslic3r/PrintConfig.cpp:967 +msgid "Combine infill every" +msgstr "다음 시간마다 결합" + +#: src/libslic3r/PrintConfig.cpp:969 +msgid "" +"This feature allows to combine infill and speed up your print by extruding " +"thicker infill layers while preserving thin perimeters, thus accuracy." +msgstr "" +"이 기능은 인필을 결합하고 얇은 주변기기를 보존하면서 두꺼운 인필 층을 압출하" +"여 인쇄 속도를 높일 수 있도록 하여 정확도를 높인다." + +#: src/libslic3r/PrintConfig.cpp:972 +msgid "Combine infill every n layers" +msgstr "모든 n개 층을 채우기 위해 결합" + +#: src/libslic3r/PrintConfig.cpp:978 +msgid "Infill extruder" +msgstr "채움(Infill) 익스트루더" + +#: src/libslic3r/PrintConfig.cpp:980 +msgid "The extruder to use when printing infill." +msgstr "채움으로 사용할 익스트루더." + +#: src/libslic3r/PrintConfig.cpp:988 +msgid "" +"Set this to a non-zero value to set a manual extrusion width for infill. If " +"left zero, default extrusion width will be used if set, otherwise 1.125 x " +"nozzle diameter will be used. You may want to use fatter extrudates to speed " +"up the infill and make your parts stronger. If expressed as percentage (for " +"example 90%) it will be computed over layer height." +msgstr "" +"채움에 수동 압출 폭을 설정하려면이 값을 0이 아닌 값으로 설정합니다. 0으로 설" +"정하면 설정된 경우 기본 압출 폭이 사용되고 그렇지 않으면 1.125 x 노즐 직경이 " +"사용됩니다. 채움 속도를 높이고 부품을 더 강하게 만들려면보다 큰 압출 성형물" +"을 사용하는 것이 좋습니다. 백분율 (예 : 90 %)로 표현하면 레이어 높이를 기준으" +"로 계산됩니다." + +#: src/libslic3r/PrintConfig.cpp:997 +msgid "Infill before perimeters" +msgstr "둘레보다 앞쪽에 채움" + +#: src/libslic3r/PrintConfig.cpp:998 +msgid "" +"This option will switch the print order of perimeters and infill, making the " +"latter first." +msgstr "이 옵션은 외부출력과 채움 인쇄 순서를 바꾸어, 후자를 먼저 만든다." + +#: src/libslic3r/PrintConfig.cpp:1003 +msgid "Only infill where needed" +msgstr "필요한 경우 채음" + +#: src/libslic3r/PrintConfig.cpp:1005 +msgid "" +"This option will limit infill to the areas actually needed for supporting " +"ceilings (it will act as internal support material). If enabled, slows down " +"the G-code generation due to the multiple checks involved." +msgstr "" +"이 옵션은 천장 지원에 실제로 필요한 영역에만 적용된다(내부 서포트 재료 역할" +"을 할 것이다). 활성화된 경우 관련된 여러 번의 점검으로 인해 G-code 생성 속도" +"를 늦춰라." + +#: src/libslic3r/PrintConfig.cpp:1012 +msgid "Infill/perimeters overlap" +msgstr "채움/둘레 겹침(perimeters overlap)" + +#: src/libslic3r/PrintConfig.cpp:1014 +msgid "" +"This setting applies an additional overlap between infill and perimeters for " +"better bonding. Theoretically this shouldn't be needed, but backlash might " +"cause gaps. If expressed as percentage (example: 15%) it is calculated over " +"perimeter extrusion width." +msgstr "" +"이 설정은 더 나은 본딩을 위해 충전 및 둘레 사이에 추가 겹침을 적용합니다. 이" +"론적으로 이것은 필요하지 않아야하지만 백래시가 갭을 유발할 수 있습니다. 백분" +"율 (예 : 15 %)로 표시되는 경우 경계 압출 폭을 기준으로 계산됩니다." + +#: src/libslic3r/PrintConfig.cpp:1025 +msgid "Speed for printing the internal fill. Set to zero for auto." +msgstr "내부 채우기 인쇄 속도. 자동으로 0으로 설정하십시오." + +#: src/libslic3r/PrintConfig.cpp:1033 +msgid "Inherits profile" +msgstr "프로필 상속" + +#: src/libslic3r/PrintConfig.cpp:1034 +msgid "Name of the profile, from which this profile inherits." +msgstr "이 프로파일이 상속되는 프로파일의 이름." + +#: src/libslic3r/PrintConfig.cpp:1047 +msgid "Interface shells" +msgstr "인터페이스 셸(shells)" + +#: src/libslic3r/PrintConfig.cpp:1048 +msgid "" +"Force the generation of solid shells between adjacent materials/volumes. " +"Useful for multi-extruder prints with translucent materials or manual " +"soluble support material." +msgstr "" +"인접 재료/볼륨 사이에 고체 쉘 생성을 강제하십시오. 반투명 재료 또는 수동 수용" +"성 서포트 재료를 사용한 다중 압ㅊ기 인쇄에 유용함." + +#: src/libslic3r/PrintConfig.cpp:1057 +msgid "" +"This custom code is inserted at every layer change, right after the Z move " +"and before the extruder moves to the first layer point. Note that you can " +"use placeholder variables for all Slic3r settings as well as [layer_num] and " +"[layer_z]." +msgstr "" +"이 사용자 정의 코드는 Z 이동 직후와 압출부가 첫 번째 레이어 포인트로 이동하" +"기 전에 모든 레이어 변경 시 삽입된다. 모든 Slic3r 설정뿐만 아니라 " +"[layer_num] 및 [layer_z]에 자리 표시자 변수를 사용할 수 있다는 점에 유의하십" +"시오." + +#: src/libslic3r/PrintConfig.cpp:1068 +msgid "Supports remaining times" +msgstr "남은 시간 지원" + +#: src/libslic3r/PrintConfig.cpp:1069 +msgid "" +"Emit M73 P[percent printed] R[remaining time in minutes] at 1 minute " +"intervals into the G-code to let the firmware show accurate remaining time. " +"As of now only the Prusa i3 MK3 firmware recognizes M73. Also the i3 MK3 " +"firmware supports M73 Qxx Sxx for the silent mode." +msgstr "" +"G 코드에 1 분 간격으로 M73 P [퍼센트 인쇄] R[remaining time in minutes]을 방" +"출하여 펌웨어가 정확한 잔여 시간을 표시 하도록 합니다. 현재만 Prusa i3 MK3 펌" +"웨어는 M73를 인식 하 고 있습니다. 또한 i3 MK3 펌웨어는 자동 모드에서 M73 Qxx " +"Sxx를 지원 합니다." + +#: src/libslic3r/PrintConfig.cpp:1077 +msgid "Supports stealth mode" +msgstr "자동 모드 지원" + +#: src/libslic3r/PrintConfig.cpp:1078 +msgid "The firmware supports stealth mode" +msgstr "펌웨어는 스텔스 모드를 지원 합니다" + +#: src/libslic3r/PrintConfig.cpp:1102 +msgid "Maximum feedrate X" +msgstr "최대 이송 속도 X" + +#: src/libslic3r/PrintConfig.cpp:1103 +msgid "Maximum feedrate Y" +msgstr "최대 이송 속도 Y" + +#: src/libslic3r/PrintConfig.cpp:1104 +msgid "Maximum feedrate Z" +msgstr "최대 이송 속도 Z" + +#: src/libslic3r/PrintConfig.cpp:1105 +msgid "Maximum feedrate E" +msgstr "최대 이송 속도 E" + +#: src/libslic3r/PrintConfig.cpp:1108 +msgid "Maximum feedrate of the X axis" +msgstr "X 축의 최대 이송 속도" + +#: src/libslic3r/PrintConfig.cpp:1109 +msgid "Maximum feedrate of the Y axis" +msgstr "Y 축의 최대 이송 속도" + +#: src/libslic3r/PrintConfig.cpp:1110 +msgid "Maximum feedrate of the Z axis" +msgstr "Z 축의 최대 이송 속도" + +#: src/libslic3r/PrintConfig.cpp:1111 +msgid "Maximum feedrate of the E axis" +msgstr "E 축의 최대 이송 속도" + +#: src/libslic3r/PrintConfig.cpp:1120 +msgid "Maximum acceleration X" +msgstr "최대 가속도 X" + +#: src/libslic3r/PrintConfig.cpp:1121 +msgid "Maximum acceleration Y" +msgstr "최대 가속도 Y" + +#: src/libslic3r/PrintConfig.cpp:1122 +msgid "Maximum acceleration Z" +msgstr "최대 가속 Z" + +#: src/libslic3r/PrintConfig.cpp:1123 +msgid "Maximum acceleration E" +msgstr "최대 가속 E" + +#: src/libslic3r/PrintConfig.cpp:1126 +msgid "Maximum acceleration of the X axis" +msgstr "X 축의 최대 가속도" + +#: src/libslic3r/PrintConfig.cpp:1127 +msgid "Maximum acceleration of the Y axis" +msgstr "Y 축의 최대 가속도" + +#: src/libslic3r/PrintConfig.cpp:1128 +msgid "Maximum acceleration of the Z axis" +msgstr "Z 축의 최대 가속도" + +#: src/libslic3r/PrintConfig.cpp:1129 +msgid "Maximum acceleration of the E axis" +msgstr "E 축의 최대 가속도" + +#: src/libslic3r/PrintConfig.cpp:1138 +msgid "Maximum jerk X" +msgstr "최대 저크(jerk) X" + +#: src/libslic3r/PrintConfig.cpp:1139 +msgid "Maximum jerk Y" +msgstr "최대 저크(jerk) Y" + +#: src/libslic3r/PrintConfig.cpp:1140 +msgid "Maximum jerk Z" +msgstr "최대 저크(jerk) Z" + +#: src/libslic3r/PrintConfig.cpp:1141 +msgid "Maximum jerk E" +msgstr "최대 저크(jerk) E" + +#: src/libslic3r/PrintConfig.cpp:1144 +msgid "Maximum jerk of the X axis" +msgstr "X축 최대 저크(jerk)" + +#: src/libslic3r/PrintConfig.cpp:1145 +msgid "Maximum jerk of the Y axis" +msgstr "Y축 최대 저크는(jerk)" + +#: src/libslic3r/PrintConfig.cpp:1146 +msgid "Maximum jerk of the Z axis" +msgstr "Z축 최대 저크(jerk)" + +#: src/libslic3r/PrintConfig.cpp:1147 +msgid "Maximum jerk of the E axis" +msgstr "E축 최대 저크(jerk)" + +#: src/libslic3r/PrintConfig.cpp:1158 +msgid "Minimum feedrate when extruding" +msgstr "압출시 최소 공급 속도" + +#: src/libslic3r/PrintConfig.cpp:1160 +msgid "Minimum feedrate when extruding (M205 S)" +msgstr "압출 시 최소 이송 속도 (M205 S)" + +#: src/libslic3r/PrintConfig.cpp:1169 +msgid "Minimum travel feedrate" +msgstr "최소 이송 속도" + +#: src/libslic3r/PrintConfig.cpp:1171 +msgid "Minimum travel feedrate (M205 T)" +msgstr "최소 이동 이송 속도 (M205 T)" + +#: src/libslic3r/PrintConfig.cpp:1180 +msgid "Maximum acceleration when extruding" +msgstr "압출시 최대 가속도" + +#: src/libslic3r/PrintConfig.cpp:1182 +msgid "Maximum acceleration when extruding (M204 S)" +msgstr "압출 시 최대 가속도 (M204 S)" + +#: src/libslic3r/PrintConfig.cpp:1191 +msgid "Maximum acceleration when retracting" +msgstr "리트렉션 최대 가속도" + +#: src/libslic3r/PrintConfig.cpp:1193 +msgid "Maximum acceleration when retracting (M204 T)" +msgstr "후퇴 시 최대 가속도 (M204 T)" + +#: src/libslic3r/PrintConfig.cpp:1201 src/libslic3r/PrintConfig.cpp:1210 +msgid "Max" +msgstr "최대" + +#: src/libslic3r/PrintConfig.cpp:1202 +msgid "This setting represents the maximum speed of your fan." +msgstr "이 설정은 팬의 최대 속도를 나타냅니다." + +#: src/libslic3r/PrintConfig.cpp:1211 +#, c-format +msgid "" +"This is the highest printable layer height for this extruder, used to cap " +"the variable layer height and support layer height. Maximum recommended " +"layer height is 75% of the extrusion width to achieve reasonable inter-layer " +"adhesion. If set to 0, layer height is limited to 75% of the nozzle diameter." +msgstr "" +"이것은이 익스트루더의 가장 높은 인쇄 가능 층 높이이며, 가변 층 높이 및 지지" +"층 높이를 캡하는 데 사용됩니다. 합당한 층간 접착력을 얻기 위해 최대 권장 높이" +"는 압출 폭의 75% of 입니다. 0으로 설정하면 층 높이가 노즐 지름의 75% of로 제" +"한됩니다." + +#: src/libslic3r/PrintConfig.cpp:1221 +msgid "Max print speed" +msgstr "최대 프린트 속도" + +#: src/libslic3r/PrintConfig.cpp:1222 +msgid "" +"When setting other speed settings to 0 Slic3r will autocalculate the optimal " +"speed in order to keep constant extruder pressure. This experimental setting " +"is used to set the highest print speed you want to allow." +msgstr "" +"다른 속도 설정을 0으로 설정할 경우, 지속적인 외부 압력을 유지하기 위해 최적" +"의 속도를 자동 계산한다. 이 실험 설정은 허용할 최대 인쇄 속도를 설정하는 데 " +"사용된다." + +#: src/libslic3r/PrintConfig.cpp:1232 +msgid "" +"This experimental setting is used to set the maximum volumetric speed your " +"extruder supports." +msgstr "" +"이 실험 설정은 압출기가 지원하는 최대 체적 속도를 설정하기 위해 사용된다." + +#: src/libslic3r/PrintConfig.cpp:1241 +msgid "Max volumetric slope positive" +msgstr "최대 체적 기울기 양" + +#: src/libslic3r/PrintConfig.cpp:1242 src/libslic3r/PrintConfig.cpp:1253 +msgid "" +"This experimental setting is used to limit the speed of change in extrusion " +"rate. A value of 1.8 mm³/s² ensures, that a change from the extrusion rate " +"of 1.8 mm³/s (0.45mm extrusion width, 0.2mm extrusion height, feedrate 20 mm/" +"s) to 5.4 mm³/s (feedrate 60 mm/s) will take at least 2 seconds." +msgstr "" +"이 실험 설정은 돌출율의 변화 속도를 제한하는데 사용된다. 1.8mm3/s2 값은 " +"1.8mm3/s(0.45mm 압출 폭, 0.2mm 압출 높이, 공급 속도 20mm/s)에서 5.4mm3/s(공" +"급 속도 60mm/s)로 변경하는 데 최소 2초 이상 걸린다." + +#: src/libslic3r/PrintConfig.cpp:1246 src/libslic3r/PrintConfig.cpp:1257 +msgid "mm³/s²" +msgstr "mm³/s²" + +#: src/libslic3r/PrintConfig.cpp:1252 +msgid "Max volumetric slope negative" +msgstr "최대 체적 기울기 음수" + +#: src/libslic3r/PrintConfig.cpp:1264 src/libslic3r/PrintConfig.cpp:1273 +msgid "Min" +msgstr "최소" + +#: src/libslic3r/PrintConfig.cpp:1265 +msgid "This setting represents the minimum PWM your fan needs to work." +msgstr "이 설정은 최소 PWM팬이 활동하는데 필요한를 나타냅니다." + +#: src/libslic3r/PrintConfig.cpp:1274 +msgid "" +"This is the lowest printable layer height for this extruder and limits the " +"resolution for variable layer height. Typical values are between 0.05 mm and " +"0.1 mm." +msgstr "" +"이것은 이 압출기에 대한 가장 낮은 인쇄 가능한 층 높이이고 가변 층 높이에 대" +"한 분해능을 제한한다. 대표적인 값은 0.05mm와 0.1mm이다." + +#: src/libslic3r/PrintConfig.cpp:1282 +msgid "Min print speed" +msgstr "최소 인쇄 속도" + +#: src/libslic3r/PrintConfig.cpp:1283 +msgid "Slic3r will not scale speed down below this speed." +msgstr "Slic3r는 이 속도 이하로 속도를 낮추지 않을 것이다." + +#: src/libslic3r/PrintConfig.cpp:1290 +msgid "Minimal filament extrusion length" +msgstr "최소 필라멘트 압출 길이" + +#: src/libslic3r/PrintConfig.cpp:1291 +msgid "" +"Generate no less than the number of skirt loops required to consume the " +"specified amount of filament on the bottom layer. For multi-extruder " +"machines, this minimum applies to each extruder." +msgstr "" +"하단 레이어에서 지정된 양의 필라멘트를 사용하는 데 필요한 스커트 루프의 수 이" +"상으로 생성한다. 멀티 익스트루더의 경우, 이 최소값은 각 추가기기에 적용된다." + +#: src/libslic3r/PrintConfig.cpp:1300 +msgid "Configuration notes" +msgstr "구성 노트" + +#: src/libslic3r/PrintConfig.cpp:1301 +msgid "" +"You can put here your personal notes. This text will be added to the G-code " +"header comments." +msgstr "" +"여기에 개인 노트를 넣을 수 있다. 이 텍스트는 G-code 헤더 코멘트에 추가될 것이" +"다." + +#: src/libslic3r/PrintConfig.cpp:1311 +msgid "" +"This is the diameter of your extruder nozzle (for example: 0.5, 0.35 etc.)" +msgstr "이 지름은 엑스트루더 노즐의 직경이다(예: 0.5, 0.35 등)." + +#: src/libslic3r/PrintConfig.cpp:1316 +msgid "Host Type" +msgstr "호스트 유형" + +#: src/libslic3r/PrintConfig.cpp:1317 +msgid "" +"Slic3r can upload G-code files to a printer host. This field must contain " +"the kind of the host." +msgstr "" +"Slic3r는 프린터 호스트에 G 코드 파일을 업로드할 수 있습니다. 이 필드에는 호스" +"트의 종류가 포함 되어야 합니다." + +#: src/libslic3r/PrintConfig.cpp:1328 +msgid "Only retract when crossing perimeters" +msgstr "둘레를 횡단 할 때만 수축" + +#: src/libslic3r/PrintConfig.cpp:1329 +msgid "" +"Disables retraction when the travel path does not exceed the upper layer's " +"perimeters (and thus any ooze will be probably invisible)." +msgstr "" +"이동 경로가 상위 레이어의 경계를 초과하지 않는 경우 리트랙션을 비활성화합니" +"다. 따라서 모든 오즈가 보이지 않습니다." + +#: src/libslic3r/PrintConfig.cpp:1336 +msgid "" +"This option will drop the temperature of the inactive extruders to prevent " +"oozing. It will enable a tall skirt automatically and move extruders outside " +"such skirt when changing temperatures." +msgstr "" +"이 옵션은 누출을 방지하기 위해 비활성 압출기의 온도를 떨어 뜨립니다. 온도를 " +"변경할 때 키가 큰 스커트를 자동으로 사용하고 스커트 외부로 압출기를 이동합니" +"다." + +#: src/libslic3r/PrintConfig.cpp:1343 +msgid "Output filename format" +msgstr "출력 파일이름 형식" + +#: src/libslic3r/PrintConfig.cpp:1344 +msgid "" +"You can use all configuration options as variables inside this template. For " +"example: [layer_height], [fill_density] etc. You can also use [timestamp], " +"[year], [month], [day], [hour], [minute], [second], [version], " +"[input_filename], [input_filename_base]." +msgstr "" +"모든 구성 옵션을이 템플릿 내의 변수로 사용할 수 있습니다. 예: " +"[layer_height], [fill_density] 등 또한 [타임 스탬프], [연도], [월], [일], [시" +"간], [input_filename], [input_filename_base]을 사용할 수 있습니다." + +#: src/libslic3r/PrintConfig.cpp:1353 +msgid "Detect bridging perimeters" +msgstr "브릿 징 경계선 감지" + +#: src/libslic3r/PrintConfig.cpp:1355 +msgid "" +"Experimental option to adjust flow for overhangs (bridge flow will be used), " +"to apply bridge speed to them and enable fan." +msgstr "" +"오버행에 대한 유량을 조정하는 실험 옵션 (브리지 흐름(flow)이 사용됨)에 브릿" +"지 속도를 적용하고 팬을 활성화합니다." + +#: src/libslic3r/PrintConfig.cpp:1361 +msgid "Filament parking position" +msgstr "필라멘트 멈춤 위치" + +#: src/libslic3r/PrintConfig.cpp:1362 +msgid "" +"Distance of the extruder tip from the position where the filament is parked " +"when unloaded. This should match the value in printer firmware." +msgstr "" +"언로딩시 필라멘트 위치에서 압출기 팁의 거리. 이 값은 프린터 펌웨어의 값과 일" +"치해야합니다." + +#: src/libslic3r/PrintConfig.cpp:1370 +msgid "Extra loading distance" +msgstr "추가 로딩 거리" + +#: src/libslic3r/PrintConfig.cpp:1371 +msgid "" +"When set to zero, the distance the filament is moved from parking position " +"during load is exactly the same as it was moved back during unload. When " +"positive, it is loaded further, if negative, the loading move is shorter " +"than unloading." +msgstr "" +"0으로 설정하면로드 중에 필라멘트가 위치에서 이동 한 거리는 언로드 중에 다시 " +"이동 한 거리와 동일합니다. 양수이면 음수가 더 많이 로드되고 로드가 음수 인 경" +"우 언로드보다 짧습니다." + +#: src/libslic3r/PrintConfig.cpp:1379 src/libslic3r/PrintConfig.cpp:1397 +#: src/libslic3r/PrintConfig.cpp:1409 src/libslic3r/PrintConfig.cpp:1419 +msgid "Perimeters" +msgstr "둘레" + +#: src/libslic3r/PrintConfig.cpp:1380 +msgid "" +"This is the acceleration your printer will use for perimeters. A high value " +"like 9000 usually gives good results if your hardware is up to the job. Set " +"zero to disable acceleration control for perimeters." +msgstr "" +"프린터가 둘레로 사용할 가속도입니다. 9000과 같은 높은 값은 하드웨어가 제대로 " +"작동하면 좋은 결과를 제공합니다. 주변을 가속 제어하지 않으려면 0으로 설정하십" +"시오." + +#: src/libslic3r/PrintConfig.cpp:1388 +msgid "Perimeter extruder" +msgstr "주변 익스트루더" + +#: src/libslic3r/PrintConfig.cpp:1390 +msgid "" +"The extruder to use when printing perimeters and brim. First extruder is 1." +msgstr "" +"둘레와 가장자리를 인쇄 할 때 사용할 압출기입니다. 첫 번째 압출기는 1입니다." + +#: src/libslic3r/PrintConfig.cpp:1399 +msgid "" +"Set this to a non-zero value to set a manual extrusion width for perimeters. " +"You may want to use thinner extrudates to get more accurate surfaces. If " +"left zero, default extrusion width will be used if set, otherwise 1.125 x " +"nozzle diameter will be used. If expressed as percentage (for example 200%) " +"it will be computed over layer height." +msgstr "" +"이 값을 0이 아닌 값으로 설정하면 수동 압출 폭을 둘레로 설정할 수 있습니다. 보" +"다 정확한 서페이스를 얻으려면 더 얇은 압출 성형품을 사용하는 것이 좋습니다. 0" +"으로 설정하면 설정된 경우 기본 돌출 폭이 사용되고 그렇지 않으면 1.125 x 노즐 " +"직경이 사용됩니다. 백분율 (예 : 200 %)로 표현하면 레이어 높이를 기준으로 계산" +"됩니다." + +#: src/libslic3r/PrintConfig.cpp:1411 +msgid "" +"Speed for perimeters (contours, aka vertical shells). Set to zero for auto." +msgstr "둘레의 속도 (등고선, 일명 세로 셸). 자동으로 0으로 설정하십시오." + +#: src/libslic3r/PrintConfig.cpp:1421 +msgid "" +"This option sets the number of perimeters to generate for each layer. Note " +"that Slic3r may increase this number automatically when it detects sloping " +"surfaces which benefit from a higher number of perimeters if the Extra " +"Perimeters option is enabled." +msgstr "" +"이 옵션은 각 레이어에 대해 생성 할 경계 수를 설정합니다. 추가 경계선 옵션을 " +"사용하면 더 큰 주변 수를 사용하는 경사면을 감지 할 때 Slic3r이이 수를 자동으" +"로 증가시킬 수 있습니다." + +#: src/libslic3r/PrintConfig.cpp:1425 +msgid "(minimum)" +msgstr "(최소)" + +#: src/libslic3r/PrintConfig.cpp:1433 +msgid "" +"If you want to process the output G-code through custom scripts, just list " +"their absolute paths here. Separate multiple scripts with a semicolon. " +"Scripts will be passed the absolute path to the G-code file as the first " +"argument, and they can access the Slic3r config settings by reading " +"environment variables." +msgstr "" +"사용자 정의 스크립트를 통해 출력 G 코드를 처리하려면 여기에 절대 경로를 나열" +"하십시오. 여러 개의 스크립트를 세미콜론으로 구분하십시오. 스크립트는 G 코드 " +"파일의 절대 경로를 첫 번째 인수로 전달되며 환경 변수를 읽음으로써 Slic3r 구" +"성 설정에 액세스 할 수 있습니다." + +#: src/libslic3r/PrintConfig.cpp:1445 +msgid "Printer type" +msgstr "프린터 타입" + +#: src/libslic3r/PrintConfig.cpp:1446 +msgid "Type of the printer." +msgstr "프린터 유형." + +#: src/libslic3r/PrintConfig.cpp:1451 +msgid "Printer notes" +msgstr "프린터 노트" + +#: src/libslic3r/PrintConfig.cpp:1452 +msgid "You can put your notes regarding the printer here." +msgstr "프린터 관련 메모를 여기에 넣을 수 있습니다." + +#: src/libslic3r/PrintConfig.cpp:1460 +msgid "Printer vendor" +msgstr "제조 회사" + +#: src/libslic3r/PrintConfig.cpp:1461 +msgid "Name of the printer vendor." +msgstr "프린터 공급 업체의 이름입니다." + +#: src/libslic3r/PrintConfig.cpp:1466 +msgid "Printer variant" +msgstr "프린터 변형" + +#: src/libslic3r/PrintConfig.cpp:1467 +msgid "" +"Name of the printer variant. For example, the printer variants may be " +"differentiated by a nozzle diameter." +msgstr "" +"프린터 변종 이름입니다. 예를 들어, 프린터 변형은 노즐 지름으로 구별 될 수 있" +"습니다." + +#: src/libslic3r/PrintConfig.cpp:1480 +msgid "Raft layers" +msgstr "라프트(Raft) 레이어" + +#: src/libslic3r/PrintConfig.cpp:1482 +msgid "" +"The object will be raised by this number of layers, and support material " +"will be generated under it." +msgstr "" +"물체는 이 개수의 층에 의해 상승되며, 그 아래에서 서포트 재료가 생성될 것이다." + +#: src/libslic3r/PrintConfig.cpp:1490 +msgid "Resolution" +msgstr "해결" + +#: src/libslic3r/PrintConfig.cpp:1491 +msgid "" +"Minimum detail resolution, used to simplify the input file for speeding up " +"the slicing job and reducing memory usage. High-resolution models often " +"carry more detail than printers can render. Set to zero to disable any " +"simplification and use full resolution from input." +msgstr "" +"잘라내기 작업의 속도를 높이고 메모리 사용량을 줄이기 위해 입력 파일을 단순화" +"하는 데 사용되는 최소 세부 해상도. 고해상도 모델은 종종 프린터가 렌더링할 수 " +"있는 것보다 더 많은 디테일을 가지고 있다. 단순화를 사용하지 않고 입력에서 전" +"체 해상도를 사용하려면 0으로 설정하십시오." + +#: src/libslic3r/PrintConfig.cpp:1501 +msgid "Minimum travel after retraction" +msgstr "리트랙션 후 최소 이동 거리" + +#: src/libslic3r/PrintConfig.cpp:1502 +msgid "" +"Retraction is not triggered when travel moves are shorter than this length." +msgstr "이동 거리가 이 길이보다 짧으면 리트렉션이 트리거되지 않습니다." + +#: src/libslic3r/PrintConfig.cpp:1508 +msgid "Retract amount before wipe" +msgstr "닦아 내기 전의 수축량" + +#: src/libslic3r/PrintConfig.cpp:1509 +msgid "" +"With bowden extruders, it may be wise to do some amount of quick retract " +"before doing the wipe movement." +msgstr "" +"보우 덴 압출기를 사용하면 와이퍼 동작을하기 전에 약간의 빠른 리트랙션 를하는 " +"것이 좋습니다." + +#: src/libslic3r/PrintConfig.cpp:1516 +msgid "Retract on layer change" +msgstr "레이어 변경 후퇴" + +#: src/libslic3r/PrintConfig.cpp:1517 +msgid "This flag enforces a retraction whenever a Z move is done." +msgstr "이 플래그는 Z 이동이 완료 될 때마다 취소를 강제 실행합니다." + +#: src/libslic3r/PrintConfig.cpp:1522 src/libslic3r/PrintConfig.cpp:1530 +msgid "Length" +msgstr "길이" + +#: src/libslic3r/PrintConfig.cpp:1523 +msgid "Retraction Length" +msgstr "리트랙션 길이" + +#: src/libslic3r/PrintConfig.cpp:1524 +msgid "" +"When retraction is triggered, filament is pulled back by the specified " +"amount (the length is measured on raw filament, before it enters the " +"extruder)." +msgstr "" +"후퇴가 트리거되면 필라멘트가 지정된 양만큼 뒤로 당겨집니다 (길이는 압출기에 " +"들어가기 전에 원시 필라멘트에서 측정됩니다)." + +#: src/libslic3r/PrintConfig.cpp:1526 src/libslic3r/PrintConfig.cpp:1535 +msgid "mm (zero to disable)" +msgstr "mm (0은 비활성화)" + +#: src/libslic3r/PrintConfig.cpp:1531 +msgid "Retraction Length (Toolchange)" +msgstr "리트랙션 길이 (툴 체인지)" + +#: src/libslic3r/PrintConfig.cpp:1532 +msgid "" +"When retraction is triggered before changing tool, filament is pulled back " +"by the specified amount (the length is measured on raw filament, before it " +"enters the extruder)." +msgstr "" +"공구를 교체하기 전에 후퇴가 트리거되면 필라멘트가 지정된 양만큼 뒤로 당겨집니" +"다 (길이는 압출기에 들어가기 전에 원시 필라멘트에서 측정됩니다)." + +#: src/libslic3r/PrintConfig.cpp:1540 +msgid "Lift Z" +msgstr "Z축 올림" + +#: src/libslic3r/PrintConfig.cpp:1541 +msgid "" +"If you set this to a positive value, Z is quickly raised every time a " +"retraction is triggered. When using multiple extruders, only the setting for " +"the first extruder will be considered." +msgstr "" +"이 값을 양수 값으로 설정하면 철회가 트리거 될 때마다 Z가 빠르게 올라갑니다. " +"여러 개의 압출기를 사용하는 경우 첫 번째 압출기의 설정 만 고려됩니다." + +#: src/libslic3r/PrintConfig.cpp:1548 +msgid "Above Z" +msgstr "Z 위" + +#: src/libslic3r/PrintConfig.cpp:1549 +msgid "Only lift Z above" +msgstr "오직 Z축 위로만" + +#: src/libslic3r/PrintConfig.cpp:1550 +msgid "" +"If you set this to a positive value, Z lift will only take place above the " +"specified absolute Z. You can tune this setting for skipping lift on the " +"first layers." +msgstr "" +"이것을 양의 값으로 설정하면, Z 리프트는 지정된 절대 Z 위로만 발생한다. 첫 번" +"째 층에서 리프트를 건너뛸 수 있도록 이 설정을 조정할 수 있다." + +#: src/libslic3r/PrintConfig.cpp:1557 +msgid "Below Z" +msgstr "Z 아래" + +#: src/libslic3r/PrintConfig.cpp:1558 +msgid "Only lift Z below" +msgstr "Z값 아래만" + +#: src/libslic3r/PrintConfig.cpp:1559 +msgid "" +"If you set this to a positive value, Z lift will only take place below the " +"specified absolute Z. You can tune this setting for limiting lift to the " +"first layers." +msgstr "" +"이것을 양수 값으로 설정하면 Z 리프트가 지정된 절대 Z 아래에서만 발생합니다. " +"첫 번째 레이어로 리프트를 제한하기 위해이 설정을 조정할 수 있습니다." + +#: src/libslic3r/PrintConfig.cpp:1567 src/libslic3r/PrintConfig.cpp:1575 +msgid "Extra length on restart" +msgstr "재시작시 여분의 길이" + +#: src/libslic3r/PrintConfig.cpp:1568 +msgid "" +"When the retraction is compensated after the travel move, the extruder will " +"push this additional amount of filament. This setting is rarely needed." +msgstr "" +"이동 후 리트렉셔이 보정되면 익스트루더가 추가 양의 필라멘트를 밀어냅니다. 이 " +"설정은 거의 필요하지 않습니다." + +#: src/libslic3r/PrintConfig.cpp:1576 +msgid "" +"When the retraction is compensated after changing tool, the extruder will " +"push this additional amount of filament." +msgstr "" +"도구를 교환 한 후 리트렉션를 보정하면 익스트루더가 추가 양의 필라멘트를 밀게" +"됩니다." + +#: src/libslic3r/PrintConfig.cpp:1583 src/libslic3r/PrintConfig.cpp:1584 +msgid "Retraction Speed" +msgstr "리트랙션 속도" + +#: src/libslic3r/PrintConfig.cpp:1585 +msgid "The speed for retractions (it only applies to the extruder motor)." +msgstr "리트랙션 속도 (익스트루더 모터에만 적용됨)." + +#: src/libslic3r/PrintConfig.cpp:1591 src/libslic3r/PrintConfig.cpp:1592 +msgid "Deretraction Speed" +msgstr "감속 속도" + +#: src/libslic3r/PrintConfig.cpp:1593 +msgid "" +"The speed for loading of a filament into extruder after retraction (it only " +"applies to the extruder motor). If left to zero, the retraction speed is " +"used." +msgstr "" +"리트랙션 후 압출기에 필라멘트를 로드하는 속도 (압출기 모터에만 적용됨). 0으" +"로 방치하면 리트랙션 속도가 사용됩니다." + +#: src/libslic3r/PrintConfig.cpp:1600 +msgid "Seam position" +msgstr "재봉선 위치" + +#: src/libslic3r/PrintConfig.cpp:1602 +msgid "Position of perimeters starting points." +msgstr "둘레의 시작점의 위치." + +#: src/libslic3r/PrintConfig.cpp:1608 +msgid "Random" +msgstr "무작위" + +#: src/libslic3r/PrintConfig.cpp:1609 +msgid "Nearest" +msgstr "가장 가까운" + +#: src/libslic3r/PrintConfig.cpp:1610 +msgid "Aligned" +msgstr "정렬" + +#: src/libslic3r/PrintConfig.cpp:1618 +msgid "Direction" +msgstr "방향" + +#: src/libslic3r/PrintConfig.cpp:1620 +msgid "Preferred direction of the seam" +msgstr "선호하는 심(seam)의 방향" + +#: src/libslic3r/PrintConfig.cpp:1621 +msgid "Seam preferred direction" +msgstr "심(Seam) 선호 방향" + +#: src/libslic3r/PrintConfig.cpp:1628 +msgid "Jitter" +msgstr "지터(Jitter)" + +#: src/libslic3r/PrintConfig.cpp:1630 +msgid "Seam preferred direction jitter" +msgstr "(Seam) 선호 방향 지터(Jitter)" + +#: src/libslic3r/PrintConfig.cpp:1631 +msgid "Preferred direction of the seam - jitter" +msgstr "재봉선 지터의 선호 방향" + +#: src/libslic3r/PrintConfig.cpp:1641 +msgid "USB/serial port for printer connection." +msgstr "프린터 연결을 위한 USB/시리얼 포트." + +#: src/libslic3r/PrintConfig.cpp:1648 +msgid "Serial port speed" +msgstr "시리얼 포트 속도" + +#: src/libslic3r/PrintConfig.cpp:1649 +msgid "Speed (baud) of USB/serial port for printer connection." +msgstr "프린터 연결을 위한 USB/시리얼 포트의 속도(보드)" + +#: src/libslic3r/PrintConfig.cpp:1658 +msgid "Distance from object" +msgstr "객체로부터의 거리" + +#: src/libslic3r/PrintConfig.cpp:1659 +msgid "" +"Distance between skirt and object(s). Set this to zero to attach the skirt " +"to the object(s) and get a brim for better adhesion." +msgstr "" +"스커트와 객체 사이의 거리. 스커트를 객체에 부착하고 접착력을 높이기 위해 이" +"를 0으로 설정한다." + +#: src/libslic3r/PrintConfig.cpp:1666 +msgid "Skirt height" +msgstr "스커트(Skirt) 높이" + +#: src/libslic3r/PrintConfig.cpp:1667 +msgid "" +"Height of skirt expressed in layers. Set this to a tall value to use skirt " +"as a shield against drafts." +msgstr "" +"스커트의 높이 레이어로 표현된다. 이를 높은 값으로 설정하여 스커트를 드래프트" +"에 대한 쉴ㄷ로 활용하십시오." + +#: src/libslic3r/PrintConfig.cpp:1674 +msgid "Loops (minimum)" +msgstr "루프 (최소)" + +#: src/libslic3r/PrintConfig.cpp:1675 +msgid "Skirt Loops" +msgstr "스커트 루프" + +#: src/libslic3r/PrintConfig.cpp:1676 +msgid "" +"Number of loops for the skirt. If the Minimum Extrusion Length option is " +"set, the number of loops might be greater than the one configured here. Set " +"this to zero to disable skirt completely." +msgstr "" +"스커트의 루프 수입니다. 최소 압출 길이 옵션을 설정한 경우 여기에 구성된 루프 " +"수보다 클 수 있다. 스커트를 완전히 비활성화하려면 이 값을 0으로 설정하십시오." + +#: src/libslic3r/PrintConfig.cpp:1684 +msgid "Slow down if layer print time is below" +msgstr "레이어 인쇄 시간이 다음과 같은 경우 속도를 낮추십시오" + +#: src/libslic3r/PrintConfig.cpp:1685 +msgid "" +"If layer print time is estimated below this number of seconds, print moves " +"speed will be scaled down to extend duration to this value." +msgstr "" +"층 인쇄 시간이 이 시간보다 낮게 추정될 경우, 인쇄 이동 속도는 이 값으로 지속" +"되도록 축소된다." + +#: src/libslic3r/PrintConfig.cpp:1695 +msgid "Small perimeters" +msgstr "작은 둘레" + +#: src/libslic3r/PrintConfig.cpp:1697 +msgid "" +"This separate setting will affect the speed of perimeters having radius <= " +"6.5mm (usually holes). If expressed as percentage (for example: 80%) it will " +"be calculated on the perimeters speed setting above. Set to zero for auto." +msgstr "" +"이 개별 설정은 반경이 6.5mm 미만인 속도 (일반적으로 구멍)에 영향을줍니다. 백" +"분율로 표시되는 경우 (예 : 80 %) 위의 속도 설정에서 계산됩니다. 자동으로 0으" +"로 설정하십시오." + +#: src/libslic3r/PrintConfig.cpp:1707 +msgid "Solid infill threshold area" +msgstr "솔리드 채우기 임계값 영역" + +#: src/libslic3r/PrintConfig.cpp:1709 +msgid "" +"Force solid infill for regions having a smaller area than the specified " +"threshold." +msgstr "" +"지정된 한계값보다 작은 영역을 가진 영역에 대해 솔리드 인필을 강제 적용." + +#: src/libslic3r/PrintConfig.cpp:1710 +msgid "mm²" +msgstr "mm²" + +#: src/libslic3r/PrintConfig.cpp:1716 +msgid "Solid infill extruder" +msgstr "솔리드 인필 익스트루더" + +#: src/libslic3r/PrintConfig.cpp:1718 +msgid "The extruder to use when printing solid infill." +msgstr "꽉찬 면을 인쇄할 때 사용하는 익스트루더." + +#: src/libslic3r/PrintConfig.cpp:1724 +msgid "Solid infill every" +msgstr "솔리드 인필 간격" + +#: src/libslic3r/PrintConfig.cpp:1726 +msgid "" +"This feature allows to force a solid layer every given number of layers. " +"Zero to disable. You can set this to any value (for example 9999); Slic3r " +"will automatically choose the maximum possible number of layers to combine " +"according to nozzle diameter and layer height." +msgstr "" +"이 특징은 주어진 개수의 층마다 단단한 층을 넣을수 있게 한다. 비활성화할 수 없" +"음. 당신은 이것을 어떤 값으로도 설정할 수 있다(예: 9999). Slic3r는 노즐 직경" +"과 층 높이에 따라 결합할 최대 가능한 층 수를 자동으로 선택한다." + +#: src/libslic3r/PrintConfig.cpp:1738 +msgid "" +"Set this to a non-zero value to set a manual extrusion width for infill for " +"solid surfaces. If left zero, default extrusion width will be used if set, " +"otherwise 1.125 x nozzle diameter will be used. If expressed as percentage " +"(for example 90%) it will be computed over layer height." +msgstr "" +"이 값을 0이 아닌 값으로 설정하여 솔리드 표면 인필에 대한 수동 압출 폭을 설정" +"하십시오. 0인 경우 기본 압출 너비가 사용되며, 그렇지 않으면 1.125 x 노즐 직경" +"이 사용된다. 백분율(예: 90%)로 표현되는 경우, 계층 높이에 걸쳐 계산된다." + +#: src/libslic3r/PrintConfig.cpp:1748 +msgid "" +"Speed for printing solid regions (top/bottom/internal horizontal shells). " +"This can be expressed as a percentage (for example: 80%) over the default " +"infill speed above. Set to zero for auto." +msgstr "" +"솔리드 영역(상단/하부/내부 수평 셸) 인쇄 속도 이는 위의 기본 주입 속도에 대" +"한 백분율(예: 80%)로 표시할 수 있다. 자동을 위해 0으로 설정한다." + +#: src/libslic3r/PrintConfig.cpp:1760 +msgid "Number of solid layers to generate on top and bottom surfaces." +msgstr "상단 및 하단 표면에 생성할 솔리드 레이어 수입니다." + +#: src/libslic3r/PrintConfig.cpp:1766 +msgid "Spiral vase" +msgstr "스파이럴 바이스" + +#: src/libslic3r/PrintConfig.cpp:1767 +msgid "" +"This feature will raise Z gradually while printing a single-walled object in " +"order to remove any visible seam. This option requires a single perimeter, " +"no infill, no top solid layers and no support material. You can still set " +"any number of bottom solid layers as well as skirt/brim loops. It won't work " +"when printing more than an object." +msgstr "" +"이 기능은 단일 벽 물체를 인쇄하는 동안 눈에 보이는 심을 제거하기 위해 Z를 점" +"진적으로 상승시킨다. 이 옵션은 단일 둘레, 주입, 상단 솔리드 레이어 및 지지 재" +"료가 필요하지 않다. 당신은 스커트/브림 루프뿐만 아니라 아래 솔리드 레이어의 " +"수에 상관없이 설정할 수 있다. 그것은 물체보다 더 많이 인쇄할 때는 작동하지 않" +"을 것이다." + +#: src/libslic3r/PrintConfig.cpp:1775 +msgid "Temperature variation" +msgstr "온도 변화" + +#: src/libslic3r/PrintConfig.cpp:1776 +msgid "" +"Temperature difference to be applied when an extruder is not active. Enables " +"a full-height \"sacrificial\" skirt on which the nozzles are periodically " +"wiped." +msgstr "" +"돌출부가 활성화되지 않은 경우 적용되는 온도 차이. 노즐을 주기적으로 닦는 전" +"체 높이 \"인공\" 스커트가 가능하다." + +#: src/libslic3r/PrintConfig.cpp:1786 +msgid "" +"This start procedure is inserted at the beginning, after bed has reached the " +"target temperature and extruder just started heating, and before extruder " +"has finished heating. If Slic3r detects M104 or M190 in your custom codes, " +"such commands will not be prepended automatically so you're free to " +"customize the order of heating commands and other custom actions. Note that " +"you can use placeholder variables for all Slic3r settings, so you can put a " +"\"M109 S[first_layer_temperature]\" command wherever you want." +msgstr "" +"이 시작 절차는 침대가 목표 온도에 도달하고 압출기가 막 가열을 시작한 직후 및 " +"압출기가 가열을 완료하기 전에 처음에 삽입됩니다. Slic3r이 사용자 지정 코드에" +"서 M104 또는 M190을 감지하면 이러한 명령은 자동으로 추가되지 않으므로 가열 명" +"령 및 기타 사용자 지정 동작의 순서를 자유롭게 사용자 지정할 수 있습니다. 모" +"든 Slic3r 설정에 자리 표시 자 변수를 사용할 수 있으므로 원하는 위치에 \"M109 " +"S [first_layer_temperature]\"명령을 넣을 수 있습니다." + +#: src/libslic3r/PrintConfig.cpp:1801 +msgid "" +"This start procedure is inserted at the beginning, after any printer start " +"gcode (and after any toolchange to this filament in case of multi-material " +"printers). This is used to override settings for a specific filament. If " +"Slic3r detects M104, M109, M140 or M190 in your custom codes, such commands " +"will not be prepended automatically so you're free to customize the order of " +"heating commands and other custom actions. Note that you can use placeholder " +"variables for all Slic3r settings, so you can put a \"M109 " +"S[first_layer_temperature]\" command wherever you want. If you have multiple " +"extruders, the gcode is processed in extruder order." +msgstr "" +"이 시작 절차는 프린터가 gcode를 시작한 후(그리고 다중 재질 프린터의 경우 이 " +"필라멘트에 대한 도구 변경 후) 처음에 삽입됩니다. 특정 필라멘트에 대한 설정을 " +"재정의하는 데 사용됩니다. Slic3r가 사용자 지정 코드에서 M104, M109, M140 또" +"는 M190을 감지하면 이러한 명령이 자동으로 준비되지 않으므로 가열 명령 및 기" +"타 사용자 지정 작업의 순서를 자유롭게 사용자 지정할 수 있습니다. 모든 Slic3r " +"설정에 자리 표시자 변수를 사용할 수 있으므로 원하는 위치에 \"M109 " +"S[first_layer_temperature]\" 명령을 넣을 수 있습니다. 압출기가 여러 개 있는 " +"경우 gcode는 압출기 순서로 처리됩니다." + +#: src/libslic3r/PrintConfig.cpp:1817 +msgid "Single Extruder Multi Material" +msgstr "싱글 익스트루더 멀티메터리얼" + +#: src/libslic3r/PrintConfig.cpp:1818 +msgid "The printer multiplexes filaments into a single hot end." +msgstr "프린터는 필라멘트를 하나의 핫 엔드에 멀티플렉싱합니다." + +#: src/libslic3r/PrintConfig.cpp:1823 +msgid "Prime all printing extruders" +msgstr "모든 인쇄 압출기 프라임" + +#: src/libslic3r/PrintConfig.cpp:1824 +msgid "" +"If enabled, all printing extruders will be primed at the front edge of the " +"print bed at the start of the print." +msgstr "" +"활성화 된 경우, 모든 인쇄 압출기는 인쇄 시작시 프린트 베드의 전면 가장자리에 " +"프라이밍 됩니다." + +#: src/libslic3r/PrintConfig.cpp:1829 +msgid "Generate support material" +msgstr "서포트 재료 생성" + +#: src/libslic3r/PrintConfig.cpp:1831 +msgid "Enable support material generation." +msgstr "서포트 재료를 사용합니다." + +#: src/libslic3r/PrintConfig.cpp:1835 +msgid "Auto generated supports" +msgstr "자동 생성 지원" + +#: src/libslic3r/PrintConfig.cpp:1837 +msgid "" +"If checked, supports will be generated automatically based on the overhang " +"threshold value. If unchecked, supports will be generated inside the " +"\"Support Enforcer\" volumes only." +msgstr "" +"이 옵션을 선택 하면 오버행 임계값에 따라 서포트가 자동으로 생성 됩니다. 이 확" +"인란을 선택 하지 않으면 \"서포트 지원 영역\" 볼륨 내 에서만 지원이 생성 됩니" +"다." + +#: src/libslic3r/PrintConfig.cpp:1843 +msgid "XY separation between an object and its support" +msgstr "물체와 그 서포트 사이 XY 분리" + +#: src/libslic3r/PrintConfig.cpp:1845 +msgid "" +"XY separation between an object and its support. If expressed as percentage " +"(for example 50%), it will be calculated over external perimeter width." +msgstr "" +"객체와 그 서포트 사이의 XY 분리. 백분율 (예 : 50 %)로 표시되는 경우 외부 둘" +"레 너비를 기준으로 계산됩니다." + +#: src/libslic3r/PrintConfig.cpp:1855 +msgid "Pattern angle" +msgstr "채움 각도" + +#: src/libslic3r/PrintConfig.cpp:1857 +msgid "" +"Use this setting to rotate the support material pattern on the horizontal " +"plane." +msgstr "이 설정을 사용하여지지 평면 패턴을 수평면으로 회전시킵니다." + +#: src/libslic3r/PrintConfig.cpp:1867 src/libslic3r/PrintConfig.cpp:2531 +msgid "" +"Only create support if it lies on a build plate. Don't create support on a " +"print." +msgstr "" +"그것이 빌드 플레이트에있는 경우에만 지원을 작성하십시오. 인쇄물에 대한 지원" +"을 작성하지 마십시오." + +#: src/libslic3r/PrintConfig.cpp:1873 +msgid "Contact Z distance" +msgstr "Z 거리 문의" + +#: src/libslic3r/PrintConfig.cpp:1875 +msgid "" +"The vertical distance between object and support material interface. Setting " +"this to 0 will also prevent Slic3r from using bridge flow and speed for the " +"first object layer." +msgstr "" +"물체와 서포트 사이의 수직 거리. 이 값을 0으로 설정하면 Slic3r이 첫 번째 객체 " +"레이어에 브리지 흐름과 속도를 사용하지 못하게됩니다." + +#: src/libslic3r/PrintConfig.cpp:1882 +msgid "0 (soluble)" +msgstr "0 (수용성)" + +#: src/libslic3r/PrintConfig.cpp:1883 +msgid "0.2 (detachable)" +msgstr "0.2 (분리 가능)" + +#: src/libslic3r/PrintConfig.cpp:1888 +msgid "Enforce support for the first" +msgstr "첫 번째 서포트 더 강화" + +#: src/libslic3r/PrintConfig.cpp:1890 +msgid "" +"Generate support material for the specified number of layers counting from " +"bottom, regardless of whether normal support material is enabled or not and " +"regardless of any angle threshold. This is useful for getting more adhesion " +"of objects having a very thin or poor footprint on the build plate." +msgstr "" +"일반적인 서포트 소재의 활성화 여부와, 각도 임계 값에 관계없이 하단에서부터 세" +"어 지정된 레이어 수에 대한지지 자료를 생성합니다. 이것은 빌드 플레이트에 매" +"우 얇거나 부족한 풋 프린트를 가진 물체를 더 많이 부착 할 때 유용합니다." + +#: src/libslic3r/PrintConfig.cpp:1895 +msgid "Enforce support for the first n layers" +msgstr "첫 번째 n 개의 레이어에 대한 서포트 강화" + +#: src/libslic3r/PrintConfig.cpp:1901 +msgid "Support material/raft/skirt extruder" +msgstr "서포트 재료 / 라프트 / 스커트 익스트루더" + +#: src/libslic3r/PrintConfig.cpp:1903 +msgid "" +"The extruder to use when printing support material, raft and skirt (1+, 0 to " +"use the current extruder to minimize tool changes)." +msgstr "" +"서포트 재료, 라프트 및 스커트를 인쇄 할 때 사용하는 압출기 (도구 변경을 최소" +"화하기 위해 현재 압출기를 사용하려면 1+, 0)." + +#: src/libslic3r/PrintConfig.cpp:1912 +msgid "" +"Set this to a non-zero value to set a manual extrusion width for support " +"material. If left zero, default extrusion width will be used if set, " +"otherwise nozzle diameter will be used. If expressed as percentage (for " +"example 90%) it will be computed over layer height." +msgstr "" +"서포트 재료의 수동 압출 폭을 설정하려면이 값을 0이 아닌 값으로 설정하십시오. " +"0으로 설정하면 설정된 경우 기본 압출 폭이 사용되고 그렇지 않으면 노즐 지름이 " +"사용됩니다. 백분율 (예 : 90 %)로 표현하면 레이어 높이를 기준으로 계산됩니다." + +#: src/libslic3r/PrintConfig.cpp:1920 +msgid "Interface loops" +msgstr "인터페이스 루프" + +#: src/libslic3r/PrintConfig.cpp:1922 +msgid "" +"Cover the top contact layer of the supports with loops. Disabled by default." +msgstr "지지대의 상단 접촉 층을 루프로 덮으십시오. 기본적으로 사용 안 함." + +#: src/libslic3r/PrintConfig.cpp:1927 +msgid "Support material/raft interface extruder" +msgstr "서포트 재료/라프트 인터페이스 익스트루더" + +#: src/libslic3r/PrintConfig.cpp:1929 +msgid "" +"The extruder to use when printing support material interface (1+, 0 to use " +"the current extruder to minimize tool changes). This affects raft too." +msgstr "" +"서포트 재료 인터페이스를 인쇄 할 때 사용할 익스트루더 (도구 변경을 최소화하" +"기 위해 현재 익스트루더를 사용하려면 1+, 0). 이것은 라프트에도 영향을 미칩니" +"다." + +#: src/libslic3r/PrintConfig.cpp:1936 +msgid "Interface layers" +msgstr "인터페이스 레이어" + +#: src/libslic3r/PrintConfig.cpp:1938 +msgid "" +"Number of interface layers to insert between the object(s) and support " +"material." +msgstr "객체와 서포트 재료 사이에 삽입할 인터페이스 레이어 수입니다." + +#: src/libslic3r/PrintConfig.cpp:1945 +msgid "Interface pattern spacing" +msgstr "인터페이스 패턴 간격" + +#: src/libslic3r/PrintConfig.cpp:1947 +msgid "Spacing between interface lines. Set zero to get a solid interface." +msgstr "" +"인터페이스 라인 간 간격. 솔리드 인터페이스를 가져오려면 0을 설정하십시오." + +#: src/libslic3r/PrintConfig.cpp:1956 +msgid "" +"Speed for printing support material interface layers. If expressed as " +"percentage (for example 50%) it will be calculated over support material " +"speed." +msgstr "" +"서포트 재료 인터페이스 레이어 인쇄 속도 백분율(예: 50%)로 표현될 경우 서포트 " +"재료 속도에 따라 계산된다." + +#: src/libslic3r/PrintConfig.cpp:1965 +msgid "Pattern" +msgstr "패턴" + +#: src/libslic3r/PrintConfig.cpp:1967 +msgid "Pattern used to generate support material." +msgstr "서포트 재료를 생성하는 데 사용되는 패턴." + +#: src/libslic3r/PrintConfig.cpp:1973 +msgid "Rectilinear grid" +msgstr "직선 그리드" + +#: src/libslic3r/PrintConfig.cpp:1979 +msgid "Pattern spacing" +msgstr "패턴 간격" + +#: src/libslic3r/PrintConfig.cpp:1981 +msgid "Spacing between support material lines." +msgstr "서포트 재료 라인 사이의 간격." + +#: src/libslic3r/PrintConfig.cpp:1990 +msgid "Speed for printing support material." +msgstr "서포트 재료를 인쇄하는 속도." + +#: src/libslic3r/PrintConfig.cpp:1997 +msgid "Synchronize with object layers" +msgstr "객체 레이어와 동기화" + +#: src/libslic3r/PrintConfig.cpp:1999 +msgid "" +"Synchronize support layers with the object print layers. This is useful with " +"multi-material printers, where the extruder switch is expensive." +msgstr "" +"서포트 레이어를 프린트 레이어와 동기화하십시오. 이것은 스위치가 비싼 멀티 메" +"터리얼 프린터에서 유용하다." + +#: src/libslic3r/PrintConfig.cpp:2005 +msgid "Overhang threshold" +msgstr "오버행 한계점" + +#: src/libslic3r/PrintConfig.cpp:2007 +msgid "" +"Support material will not be generated for overhangs whose slope angle (90° " +"= vertical) is above the given threshold. In other words, this value " +"represent the most horizontal slope (measured from the horizontal plane) " +"that you can print without support material. Set to zero for automatic " +"detection (recommended)." +msgstr "" +"서포트 재료는 경사각(90° = 수직)이 지정된 임계점보다 높은 압출에 대해서는 생" +"성되지 않는다. 즉, 이 값은 서포트 재료 없이 인쇄할 수 있는 가장 수평 경사(수" +"평면에서 측정됨)를 나타낸다. 자동 감지를 위해 0으로 설정하십시오(권장)." + +#: src/libslic3r/PrintConfig.cpp:2019 +msgid "With sheath around the support" +msgstr "서포트 주변이나 외부로" + +#: src/libslic3r/PrintConfig.cpp:2021 +msgid "" +"Add a sheath (a single perimeter line) around the base support. This makes " +"the support more reliable, but also more difficult to remove." +msgstr "" +"기본 서포트 주위에 외장 (단일 주변 선)을 추가하십시오. 이것은 페이스 업을보" +"다 신뢰성있게 만들뿐만 아니라 제거하기도 어렵습니다." + +#: src/libslic3r/PrintConfig.cpp:2028 +msgid "" +"Extruder temperature for layers after the first one. Set this to zero to " +"disable temperature control commands in the output." +msgstr "" +"첫 번째 것 이후에 레이어에 대한 더 낮은 온도. 이 값을 0으로 설정하면 출력에" +"서 ​​온도 제어 명령을 비활성화 할 수 있습니다." + +#: src/libslic3r/PrintConfig.cpp:2036 +msgid "Detect thin walls" +msgstr "얇은 벽(walls) 감지" + +#: src/libslic3r/PrintConfig.cpp:2038 +msgid "" +"Detect single-width walls (parts where two extrusions don't fit and we need " +"to collapse them into a single trace)." +msgstr "싱글 너비 벽 (두 부분이 맞지 않는 부분과 무너지는 부분)을 감지합니다." + +#: src/libslic3r/PrintConfig.cpp:2044 +msgid "Threads" +msgstr "스레드(Threads)" + +#: src/libslic3r/PrintConfig.cpp:2045 +msgid "" +"Threads are used to parallelize long-running tasks. Optimal threads number " +"is slightly above the number of available cores/processors." +msgstr "" +"스레드는 장기 실행 태스크를 병렬 처리하는 데 사용됩니다. 최적의 스레드 수는 " +"사용 가능한 코어 / 프로세서 수보다 약간 높습니다." + +#: src/libslic3r/PrintConfig.cpp:2057 +msgid "" +"This custom code is inserted at every extruder change. If you don't leave " +"this empty, you are expected to take care of the toolchange yourself - " +"PrusaSlicer will not output any other G-code to change the filament. You can " +"use placeholder variables for all Slic3r settings as well as " +"[previous_extruder] and [next_extruder], so e.g. the standard toolchange " +"command can be scripted as T[next_extruder]." +msgstr "" +"이 사용자 지정 코드는 모든 압출기 변경 시 삽입됩니다. 이 것을 비워 두지 않으" +"면 도구 변경을 직접 처리해야합니다 - PrusaSlicer는 필라멘트를 변경하기 위해 " +"다른 G 코드를 출력하지 않습니다. 모든 Slic3r 설정과 [이전_압출기] 및 " +"[next_extruder]에 대해 자리 표시자 변수를 사용할 수 있으므로 표준 도구 변경 " +"명령을 T[next_extruder]로 스크립팅할 수 있습니다." + +#: src/libslic3r/PrintConfig.cpp:2070 +msgid "" +"Set this to a non-zero value to set a manual extrusion width for infill for " +"top surfaces. You may want to use thinner extrudates to fill all narrow " +"regions and get a smoother finish. If left zero, default extrusion width " +"will be used if set, otherwise nozzle diameter will be used. If expressed as " +"percentage (for example 90%) it will be computed over layer height." +msgstr "" +"이 값을 0이 아닌 값으로 설정하여 상단 서피스에 대한 infill의 수동 압출 폭을 " +"설정합니다. 얇은 압출 성형물을 사용하여 모든 좁은 지역을 채우고 더 매끄러운 " +"마무리를 할 수 있습니다. 0으로 설정된 경우 기본 압출 폭이 사용되고 그렇지 않" +"으면 노즐 지름이 사용됩니다. 백분율 (예 : 90 %)로 표현하면 레이어 높이를 기준" +"으로 계산됩니다." + +#: src/libslic3r/PrintConfig.cpp:2081 +msgid "" +"Speed for printing top solid layers (it only applies to the uppermost " +"external layers and not to their internal solid layers). You may want to " +"slow down this to get a nicer surface finish. This can be expressed as a " +"percentage (for example: 80%) over the solid infill speed above. Set to zero " +"for auto." +msgstr "" +"상단 솔리드 레이어 인쇄 속도 (솔리드 레이어가 아닌 최상단 외부 레이어에만 적" +"용) 표면을 더 좋게 마무리하려면 속도를 늦추시기 바랍니다. 이것은 위의 고체 충" +"전 속도에 대한 백분율 (예 : 80 %)로 나타낼 수 있습니다. 자동으로 0으로 설정하" +"십시오." + +#: src/libslic3r/PrintConfig.cpp:2096 +msgid "Number of solid layers to generate on top surfaces." +msgstr "상단 표면에 생성 할 솔리드 레이어 수입니다." + +#: src/libslic3r/PrintConfig.cpp:2097 +msgid "Top solid layers" +msgstr "탑 솔리드 레이어" + +#: src/libslic3r/PrintConfig.cpp:2103 +msgid "Speed for travel moves (jumps between distant extrusion points)." +msgstr "이동 속도 (먼 돌출 점 사이의 점프)." + +#: src/libslic3r/PrintConfig.cpp:2111 +msgid "Use firmware retraction" +msgstr "펌웨어 철회" + +#: src/libslic3r/PrintConfig.cpp:2112 +msgid "" +"This experimental setting uses G10 and G11 commands to have the firmware " +"handle the retraction. This is only supported in recent Marlin." +msgstr "" +"이 실험 설정은 G10 및 G11 명령을 사용하여 펌웨어에서 취소를 처리하도록합니" +"다. 이것은 최근의 말린에서만 지원됩니다." + +#: src/libslic3r/PrintConfig.cpp:2118 +msgid "Use relative E distances" +msgstr "상대적인 E 거리 사용" + +#: src/libslic3r/PrintConfig.cpp:2119 +msgid "" +"If your firmware requires relative E values, check this, otherwise leave it " +"unchecked. Most firmwares use absolute values." +msgstr "" +"펌웨어에 상대 E 값이 필요한 경우이 값을 선택하고, 그렇지 않으면 선택하지 마십" +"시오. 대부분의 회사는 절대 값을 사용합니다." + +#: src/libslic3r/PrintConfig.cpp:2125 +msgid "Use volumetric E" +msgstr "용적 E 사용" + +#: src/libslic3r/PrintConfig.cpp:2126 +msgid "" +"This experimental setting uses outputs the E values in cubic millimeters " +"instead of linear millimeters. If your firmware doesn't already know " +"filament diameter(s), you can put commands like 'M200 D[filament_diameter_0] " +"T0' in your start G-code in order to turn volumetric mode on and use the " +"filament diameter associated to the filament selected in Slic3r. This is " +"only supported in recent Marlin." +msgstr "" +"이 실험 설정은 선형 밀리미터 대신에 입방 밀리미터 단위의 E 값을 출력으로 사용" +"합니다. 펌웨어가 필라멘트 직경을 모르는 경우 볼륨 모드를 켜고 선택한 필라멘트" +"와 연결된 필라멘트 직경을 사용하기 위해 시작 G 코드에 'M200 D " +"[filament_diameter_0] T0'과 같은 명령을 입력 할 수 있습니다 Slic3r. 이것은 최" +"근의 말린에서만 지원됩니다." + +#: src/libslic3r/PrintConfig.cpp:2136 +msgid "Enable variable layer height feature" +msgstr "가변 레이어 높이 기능 사용" + +#: src/libslic3r/PrintConfig.cpp:2137 +msgid "" +"Some printers or printer setups may have difficulties printing with a " +"variable layer height. Enabled by default." +msgstr "" +"일부 프린터 또는 프린터 설정은 가변 레이어 높이로 인쇄하는 데 어려움이있을 " +"수 있습니다. 기본적으로 사용됩니다." + +#: src/libslic3r/PrintConfig.cpp:2143 +msgid "Wipe while retracting" +msgstr "수축시 닦아내십시오" + +#: src/libslic3r/PrintConfig.cpp:2144 +msgid "" +"This flag will move the nozzle while retracting to minimize the possible " +"blob on leaky extruders." +msgstr "" +"이 플래그는 누출된 리트랙싱의 블럽 가능성을 최소화하기 위해 수축하는 동안 노" +"즐을 이동시킨다." + +#: src/libslic3r/PrintConfig.cpp:2151 +msgid "" +"Multi material printers may need to prime or purge extruders on tool " +"changes. Extrude the excess material into the wipe tower." +msgstr "" +"멀티 메터리알 프린터는 공구 교환 시 익스트루더를 프라이밍하거나 제거해야 할 " +"수 있다. 과도한 물질을 와이퍼 타워에 돌출시킨다." + +#: src/libslic3r/PrintConfig.cpp:2157 +msgid "Purging volumes - load/unload volumes" +msgstr "볼륨 삭제 - 볼륨 로드/언로드" + +#: src/libslic3r/PrintConfig.cpp:2158 +msgid "" +"This vector saves required volumes to change from/to each tool used on the " +"wipe tower. These values are used to simplify creation of the full purging " +"volumes below." +msgstr "" +"이 벡터는 지우기 타워에서 사용 되는 각 도구에서/로 변경 하는 데 필요한 볼륨" +"을 저장 합니다. 이러한 값은 아래의 전체 퍼징 볼륨의 생성을 단순화 하는 데 사" +"용 됩니다." + +#: src/libslic3r/PrintConfig.cpp:2164 +msgid "Purging volumes - matrix" +msgstr "볼륨 삭제 - 행렬" + +#: src/libslic3r/PrintConfig.cpp:2165 +msgid "" +"This matrix describes volumes (in cubic milimetres) required to purge the " +"new filament on the wipe tower for any given pair of tools." +msgstr "" +"이 매트릭스는 지정 된 도구 쌍에 대해 와이퍼 타워의 새필라멘트를 제거 하는 데 " +"필요한 체적 (입방 밀리 미터)을 설명 합니다." + +#: src/libslic3r/PrintConfig.cpp:2174 +msgid "Position X" +msgstr "X축 위치" + +#: src/libslic3r/PrintConfig.cpp:2175 +msgid "X coordinate of the left front corner of a wipe tower" +msgstr "와이프 타워의 좌측 전면 모서리의 X 좌표" + +#: src/libslic3r/PrintConfig.cpp:2181 +msgid "Position Y" +msgstr "Y축 위치" + +#: src/libslic3r/PrintConfig.cpp:2182 +msgid "Y coordinate of the left front corner of a wipe tower" +msgstr "와이퍼 작동 타워의 좌측 전방 모서리의 Y 좌표" + +#: src/libslic3r/PrintConfig.cpp:2189 +msgid "Width of a wipe tower" +msgstr "와이퍼 타워 폭" + +#: src/libslic3r/PrintConfig.cpp:2195 +msgid "Wipe tower rotation angle" +msgstr "와이퍼 타워 회전각도" + +#: src/libslic3r/PrintConfig.cpp:2196 +msgid "Wipe tower rotation angle with respect to x-axis." +msgstr "X 축에 대해 타워 회전 각도를 닦습니다." + +#: src/libslic3r/PrintConfig.cpp:2203 +msgid "Wipe into this object's infill" +msgstr "이 오브젝트의 채우기로 지우기" + +#: src/libslic3r/PrintConfig.cpp:2204 +msgid "" +"Purging after toolchange will done inside this object's infills. This lowers " +"the amount of waste but may result in longer print time due to additional " +"travel moves." +msgstr "" +"도구 변경 후 제거는 이 개체의 채우기 내부에서 수행 됩니다. 이렇게 하면 낭비 " +"되는 양이 줄어들지만 추가적인 이동으로 인해 인쇄 시간이 길어질 수 있습니다." + +#: src/libslic3r/PrintConfig.cpp:2211 +msgid "Wipe into this object" +msgstr "이 개체로 지우기" + +#: src/libslic3r/PrintConfig.cpp:2212 +msgid "" +"Object will be used to purge the nozzle after a toolchange to save material " +"that would otherwise end up in the wipe tower and decrease print time. " +"Colours of the objects will be mixed as a result." +msgstr "" +"객체는 도구 변경 후 노즐을 소거 하는 데 사용 되며, 그렇지 않으면 와이프 타워" +"에서 종료 되는 재료를 저장 하고 인쇄 시간을 줄입니다. 그 결과 개체의 색상이 " +"혼합 됩니다." + +#: src/libslic3r/PrintConfig.cpp:2218 +msgid "Maximal bridging distance" +msgstr "최대 브리징 거리" + +#: src/libslic3r/PrintConfig.cpp:2219 +msgid "Maximal distance between supports on sparse infill sections." +msgstr "드문드문한 인필 섹션에서 지지대 사이의 최대 거리." + +#: src/libslic3r/PrintConfig.cpp:2225 +msgid "XY Size Compensation" +msgstr "XY 크기 보정" + +#: src/libslic3r/PrintConfig.cpp:2227 +msgid "" +"The object will be grown/shrunk in the XY plane by the configured value " +"(negative = inwards, positive = outwards). This might be useful for fine-" +"tuning hole sizes." +msgstr "" +"XY 평면에서 설정된 값(음수 = 안, 양 = 바깥쪽)에 따라 객체가 증가/정격된다. 이" +"는 구멍 크기를 미세 조정하는데 유용할 수 있다." + +#: src/libslic3r/PrintConfig.cpp:2235 +msgid "Z offset" +msgstr "Z 오프셋" + +#: src/libslic3r/PrintConfig.cpp:2236 +msgid "" +"This value will be added (or subtracted) from all the Z coordinates in the " +"output G-code. It is used to compensate for bad Z endstop position: for " +"example, if your endstop zero actually leaves the nozzle 0.3mm far from the " +"print bed, set this to -0.3 (or fix your endstop)." +msgstr "" +"이 값은 출력 G-코드의 모든 Z 좌표에서 추가(또는 감산)된다. 예를 들어, 엔드 스" +"톱 0이 실제로 노즐을 프린트 베드에서 0.3mm 떨어진 곳에 둔 경우, 이를 -0.3(또" +"는 엔드 스톱을 고정)으로 설정하십시오." + +#: src/libslic3r/PrintConfig.cpp:2294 +msgid "Display width" +msgstr "디스플레이 너비" + +#: src/libslic3r/PrintConfig.cpp:2295 +msgid "Width of the display" +msgstr "디스플레이의 폭입니다" + +#: src/libslic3r/PrintConfig.cpp:2300 +msgid "Display height" +msgstr "표시 높이" + +#: src/libslic3r/PrintConfig.cpp:2301 +msgid "Height of the display" +msgstr "디스플레이의 높이" + +#: src/libslic3r/PrintConfig.cpp:2306 +msgid "Number of pixels in" +msgstr "의 픽셀 수" + +#: src/libslic3r/PrintConfig.cpp:2308 +msgid "Number of pixels in X" +msgstr "X의 픽셀 수" + +#: src/libslic3r/PrintConfig.cpp:2314 +msgid "Number of pixels in Y" +msgstr "Y의 픽셀 수" + +#: src/libslic3r/PrintConfig.cpp:2319 +msgid "Display horizontal mirroring" +msgstr "수평 미러링 표시" + +#: src/libslic3r/PrintConfig.cpp:2320 +msgid "Mirror horizontally" +msgstr "수평으로 미러" + +#: src/libslic3r/PrintConfig.cpp:2321 +msgid "Enable horizontal mirroring of output images" +msgstr "출력 이미지의 수평 미러링 사용" + +#: src/libslic3r/PrintConfig.cpp:2326 +msgid "Display vertical mirroring" +msgstr "수직 미러링 표시" + +#: src/libslic3r/PrintConfig.cpp:2327 +msgid "Mirror vertically" +msgstr "수직으로 미러" + +#: src/libslic3r/PrintConfig.cpp:2328 +msgid "Enable vertical mirroring of output images" +msgstr "출력 이미지의 수직 미러링 사용" + +#: src/libslic3r/PrintConfig.cpp:2333 +msgid "Display orientation" +msgstr "디스플레이 방향" + +#: src/libslic3r/PrintConfig.cpp:2334 +msgid "" +"Set the actual LCD display orientation inside the SLA printer. Portrait mode " +"will flip the meaning of display width and height parameters and the output " +"images will be rotated by 90 degrees." +msgstr "" +"SLA 프린터 내에서 실제 LCD 디스플레이 방향을 설정 합니다. 세로 모드는 디스플" +"레이 너비 및 높이 매개 변수의 의미를 반전 하 고 출력 이미지는 90도 회전 합니" +"다." + +#: src/libslic3r/PrintConfig.cpp:2340 +msgid "Landscape" +msgstr "가로" + +#: src/libslic3r/PrintConfig.cpp:2341 +msgid "Portrait" +msgstr "세로모드" + +#: src/libslic3r/PrintConfig.cpp:2346 +msgid "Fast" +msgstr "빠른" + +#: src/libslic3r/PrintConfig.cpp:2347 +msgid "Fast tilt" +msgstr "빠른 기울기" + +#: src/libslic3r/PrintConfig.cpp:2348 +msgid "Time of the fast tilt" +msgstr "기울이기 시간" + +#: src/libslic3r/PrintConfig.cpp:2355 +msgid "Slow" +msgstr "느리게" + +#: src/libslic3r/PrintConfig.cpp:2356 +msgid "Slow tilt" +msgstr "슬로우 틸트" + +#: src/libslic3r/PrintConfig.cpp:2357 +msgid "Time of the slow tilt" +msgstr "느린 기울기의 시간" + +#: src/libslic3r/PrintConfig.cpp:2364 +msgid "Area fill" +msgstr "영역 채우기" + +#: src/libslic3r/PrintConfig.cpp:2365 +msgid "" +"The percentage of the bed area. \n" +"If the print area exceeds the specified value, \n" +"then a slow tilt will be used, otherwise - a fast tilt" +msgstr "" +"침대 영역의 비율입니다. \n" +"인쇄 영역이 지정 된 값을 초과 하면 \n" +"그런 다음 느린 기울기가 사용 됩니다, 그렇지 않으면-빠른 기울기가 됩니다" + +#: src/libslic3r/PrintConfig.cpp:2372 src/libslic3r/PrintConfig.cpp:2373 +#: src/libslic3r/PrintConfig.cpp:2374 +msgid "Printer scaling correction" +msgstr "프린터 스케일링 보정" + +#: src/libslic3r/PrintConfig.cpp:2380 src/libslic3r/PrintConfig.cpp:2381 +msgid "Printer absolute correction" +msgstr "프린터 절대 보정" + +#: src/libslic3r/PrintConfig.cpp:2382 +msgid "" +"Will inflate or deflate the sliced 2D polygons according to the sign of the " +"correction." +msgstr "교정 기호에 따라 슬라이스된 2D 폴리곤을 팽창 하거나 수축 합니다." + +#: src/libslic3r/PrintConfig.cpp:2388 src/libslic3r/PrintConfig.cpp:2389 +msgid "Printer gamma correction" +msgstr "프린터 감마 보정" + +#: src/libslic3r/PrintConfig.cpp:2390 +msgid "" +"This will apply a gamma correction to the rasterized 2D polygons. A gamma " +"value of zero means thresholding with the threshold in the middle. This " +"behaviour eliminates antialiasing without losing holes in polygons." +msgstr "" +"이렇게 하면 래스터화된 2D 다각형에 감마 보정이 적용 됩니다. 감마 값이 0 이면 " +"중간에 임계값이 임계화 의미입니다. 이 동작은 폴리곤의 구멍을 잃지 않고 안티알" +"리아싱을 제거 합니다." + +#: src/libslic3r/PrintConfig.cpp:2401 src/libslic3r/PrintConfig.cpp:2402 +msgid "Initial layer height" +msgstr "초기 레이어 높이" + +#: src/libslic3r/PrintConfig.cpp:2408 +msgid "Faded layers" +msgstr "페이드 레이어" + +#: src/libslic3r/PrintConfig.cpp:2409 +msgid "" +"Number of the layers needed for the exposure time fade from initial exposure " +"time to the exposure time" +msgstr "노출 시간에 필요한 레이어 수는 초기 노출 시간에서 노출 시간으로 페이드" + +#: src/libslic3r/PrintConfig.cpp:2416 src/libslic3r/PrintConfig.cpp:2417 +msgid "Exposure time" +msgstr "노출 시간" + +#: src/libslic3r/PrintConfig.cpp:2423 src/libslic3r/PrintConfig.cpp:2424 +msgid "Initial exposure time" +msgstr "초기 노출 시간" + +#: src/libslic3r/PrintConfig.cpp:2430 src/libslic3r/PrintConfig.cpp:2431 +msgid "Correction for expansion" +msgstr "확장 보정" + +#: src/libslic3r/PrintConfig.cpp:2437 +msgid "SLA print material notes" +msgstr "SLA 인쇄 재료 참고 사항" + +#: src/libslic3r/PrintConfig.cpp:2438 +msgid "You can put your notes regarding the SLA print material here." +msgstr "여기에서 SLA 인쇄 자료에 대한 메모를 넣을 수 있습니다." + +#: src/libslic3r/PrintConfig.cpp:2446 src/libslic3r/PrintConfig.cpp:2457 +msgid "Default SLA material profile" +msgstr "기본 SLA 재질 프로 파일" + +#: src/libslic3r/PrintConfig.cpp:2468 +msgid "Generate supports" +msgstr "지원 생성" + +#: src/libslic3r/PrintConfig.cpp:2470 +msgid "Generate supports for the models" +msgstr "모델에 대한 지원 생성" + +#: src/libslic3r/PrintConfig.cpp:2475 +msgid "Support head front diameter" +msgstr "서포트 헤드 전면 지름" + +#: src/libslic3r/PrintConfig.cpp:2477 +msgid "Diameter of the pointing side of the head" +msgstr "헤드 포인팅 측면 지름" + +#: src/libslic3r/PrintConfig.cpp:2484 +msgid "Support head penetration" +msgstr "서포트 헤드 관통" + +#: src/libslic3r/PrintConfig.cpp:2486 +msgid "How much the pinhead has to penetrate the model surface" +msgstr "핀 헤드가 모델 표면에 침투 하는 정도" + +#: src/libslic3r/PrintConfig.cpp:2493 +msgid "Support head width" +msgstr "서포트 헤드 폭" + +#: src/libslic3r/PrintConfig.cpp:2495 +msgid "Width from the back sphere center to the front sphere center" +msgstr "뒤쪽 구 중심에서 앞쪽 구 중심 까지의 폭입니다" + +#: src/libslic3r/PrintConfig.cpp:2503 +msgid "Support pillar diameter" +msgstr "서포트 기둥 지름" + +#: src/libslic3r/PrintConfig.cpp:2505 +msgid "Diameter in mm of the support pillars" +msgstr "서포트 기둥의 지름 (mm)" + +#: src/libslic3r/PrintConfig.cpp:2513 +msgid "Support pillar connection mode" +msgstr "기둥 연결 모드 지원" + +#: src/libslic3r/PrintConfig.cpp:2514 +msgid "" +"Controls the bridge type between two neighboring pillars. Can be zig-zag, " +"cross (double zig-zag) or dynamic which will automatically switch between " +"the first two depending on the distance of the two pillars." +msgstr "" +"인접한 두 기둥 사이의 교량 유형을 제어 합니다. 두 기둥의 거리에 따라 자동으" +"로 처음 두 사이를 전환 하는 지그재그, 크로스 (지그재그 더블 지그재그) 또는 동" +"적 수 있습니다." + +#: src/libslic3r/PrintConfig.cpp:2522 +msgid "Zig-Zag" +msgstr "지그재그" + +#: src/libslic3r/PrintConfig.cpp:2523 +msgid "Cross" +msgstr "크로스" + +#: src/libslic3r/PrintConfig.cpp:2524 +msgid "Dynamic" +msgstr "동적" + +#: src/libslic3r/PrintConfig.cpp:2536 +msgid "Pillar widening factor" +msgstr "기둥 확장 계수" + +#: src/libslic3r/PrintConfig.cpp:2538 +msgid "" +"Merging bridges or pillars into another pillars can increase the radius. " +"Zero means no increase, one means full increase." +msgstr "" +"브릿지 또는 기둥을 다른 기둥에 병합 하면 반지름을 늘릴 수 있습니다. 0은 증가 " +"없음을 의미 하나는 전체 증가를 의미 합니다." + +#: src/libslic3r/PrintConfig.cpp:2547 +msgid "Support base diameter" +msgstr "서포트 베이스 지름" + +#: src/libslic3r/PrintConfig.cpp:2549 +msgid "Diameter in mm of the pillar base" +msgstr "기둥 베이스의 mm 직경" + +#: src/libslic3r/PrintConfig.cpp:2557 +msgid "Support base height" +msgstr "서포트 기준 높이" + +#: src/libslic3r/PrintConfig.cpp:2559 +msgid "The height of the pillar base cone" +msgstr "서포트 베이스 원추의 높이" + +#: src/libslic3r/PrintConfig.cpp:2566 +msgid "Support base safety distance" +msgstr "지지기본 안전 거리" + +#: src/libslic3r/PrintConfig.cpp:2569 +msgid "" +"The minimum distance of the pillar base from the model in mm. Makes sense in " +"zero elevation mode where a gap according to this parameter is inserted " +"between the model and the pad." +msgstr "" +"모델에서 기둥 베이스의 최소 거리(mm.mm.)는 이 매개변수에 따른 간격이 모델과 " +"패드 사이에 삽입되는 제로 고도 모드에서 의미가 있습니다." + +#: src/libslic3r/PrintConfig.cpp:2579 +msgid "Critical angle" +msgstr "임계 각도" + +#: src/libslic3r/PrintConfig.cpp:2581 +msgid "The default angle for connecting support sticks and junctions." +msgstr "서포트 스틱과 접합부를 연결 하는 기본 각도입니다." + +#: src/libslic3r/PrintConfig.cpp:2589 +msgid "Max bridge length" +msgstr "최대 브리지 길이" + +#: src/libslic3r/PrintConfig.cpp:2591 +msgid "The max length of a bridge" +msgstr "브릿지의 최대 길이" + +#: src/libslic3r/PrintConfig.cpp:2598 +msgid "Max pillar linking distance" +msgstr "최대 기둥 연결 거리" + +#: src/libslic3r/PrintConfig.cpp:2600 +msgid "" +"The max distance of two pillars to get linked with each other. A zero value " +"will prohibit pillar cascading." +msgstr "" +"서로 연결 되는 두기둥의 최대 거리. 0 값은 기둥을 계단식으로 금지 합니다." + +#: src/libslic3r/PrintConfig.cpp:2608 +msgid "Object elevation" +msgstr "객체 고도" + +#: src/libslic3r/PrintConfig.cpp:2610 +msgid "" +"How much the supports should lift up the supported object. If this value is " +"zero, the bottom of the model geometry will be considered as part of the pad." +msgstr "" +"지원 대상을 들어 올려야 하는 양입니다. 이 값이 0이면 모델 형상의 맨 아래가 패" +"드의 일부로 간주됩니다." + +#: src/libslic3r/PrintConfig.cpp:2622 +msgid "This is a relative measure of support points density." +msgstr "이는 서포트 점 밀도의 상대적인 척도입니다." + +#: src/libslic3r/PrintConfig.cpp:2628 +msgid "Minimal distance of the support points" +msgstr "서포트 지점의 최소 거리" + +#: src/libslic3r/PrintConfig.cpp:2630 +msgid "No support points will be placed closer than this threshold." +msgstr "서포트 지점은 이 임계값 보다 더 가깝게 배치 되지 않습니다." + +#: src/libslic3r/PrintConfig.cpp:2636 +msgid "Use pad" +msgstr "패드 사용" + +#: src/libslic3r/PrintConfig.cpp:2638 +msgid "Add a pad underneath the supported model" +msgstr "서포트 되는 모델 아래에 패드 추가" + +#: src/libslic3r/PrintConfig.cpp:2643 +msgid "Pad wall thickness" +msgstr "패드 벽 두께" + +#: src/libslic3r/PrintConfig.cpp:2645 +msgid "The thickness of the pad and its optional cavity walls." +msgstr "패드의 두께와 옵션 캐비티 벽." + +#: src/libslic3r/PrintConfig.cpp:2653 +msgid "Pad wall height" +msgstr "패드 벽 높이" + +#: src/libslic3r/PrintConfig.cpp:2654 +msgid "" +"Defines the pad cavity depth. Set to zero to disable the cavity. Be careful " +"when enabling this feature, as some resins may produce an extreme suction " +"effect inside the cavity, which makes peeling the print off the vat foil " +"difficult." +msgstr "" +"패드 캐비티 깊이를 정의 합니다. 캐비티를 비활성화 하려면 0으로 설정 합니다. " +"이 기능을 활성화 할 때 주의 해야할, 일부 수 캐비티 내부 극단적인 흡입 효과를 " +"생성 할 수도 있기 때문에, vat 호일 인쇄를 벗겨 어렵게 만든다." + +#: src/libslic3r/PrintConfig.cpp:2667 +msgid "Max merge distance" +msgstr "최대 병합 거리" + +#: src/libslic3r/PrintConfig.cpp:2669 +msgid "" +"Some objects can get along with a few smaller pads instead of a single big " +"one. This parameter defines how far the center of two smaller pads should " +"be. If theyare closer, they will get merged into one pad." +msgstr "" +"일부 개체는 큰 하나 대신 몇 가지 작은 패드와 함께 얻을 수 있습니다. 이 매개 " +"변수는 두 개의 작은 패드의 중심이 얼마나 되어야 하는지 정의 합니다. 그들은 하" +"나의 패드에 병합을 얻을 것이다." + +#: src/libslic3r/PrintConfig.cpp:2680 +msgid "Pad edge radius" +msgstr "패드 가장자리 반경" + +#: src/libslic3r/PrintConfig.cpp:2689 +msgid "Pad wall slope" +msgstr "패드 벽 경사" + +#: src/libslic3r/PrintConfig.cpp:2691 +msgid "" +"The slope of the pad wall relative to the bed plane. 90 degrees means " +"straight walls." +msgstr "" +"침대 평면을 기준으로 하는 패드 벽의 기울기입니다. 90도는 직선 벽을 의미 합니" +"다." + +#: src/libslic3r/PrintConfig.cpp:2700 +msgid "Pad object gap" +msgstr "패드 오브젝트 갭" + +#: src/libslic3r/PrintConfig.cpp:2702 +msgid "" +"The gap between the object bottom and the generated pad in zero elevation " +"mode." +msgstr "0 고도 모드에서 오브젝트 바닥과 생성된 패드 사이의 간격입니다." + +#: src/libslic3r/PrintConfig.cpp:2711 +msgid "Pad object connector stride" +msgstr "패드 오브젝트 커넥터 보폭" + +#: src/libslic3r/PrintConfig.cpp:2713 +msgid "" +"Distance between two connector sticks between the object pad and the " +"generated pad." +msgstr "오브젝트 패드와 생성된 패드 사이의 두 커넥터 스틱 사이의 거리입니다." + +#: src/libslic3r/PrintConfig.cpp:2721 +msgid "Pad object connector width" +msgstr "패드 오브젝트 커넥터 너비" + +#: src/libslic3r/PrintConfig.cpp:2723 +msgid "" +"The width of the connectors sticks which connect the object pad and the " +"generated pad." +msgstr "커넥터의 너비는 오브젝트 패드와 생성된 패드를 연결하는 스틱입니다." + +#: src/libslic3r/PrintConfig.cpp:2731 +msgid "Pad object connector penetration" +msgstr "패드 오브젝트 커넥터 침투" + +#: src/libslic3r/PrintConfig.cpp:2734 +msgid "How much should the tiny connectors penetrate into the model body." +msgstr "작은 커넥터가 모델 본체에 얼마나 침투해야 하는가?" + +#: src/libslic3r/PrintConfig.cpp:3094 +msgid "Export OBJ" +msgstr "OBJ 내보내기" + +#: src/libslic3r/PrintConfig.cpp:3095 +msgid "Export the model(s) as OBJ." +msgstr "모델을 OBJ로 내보냅니다." + +#: src/libslic3r/PrintConfig.cpp:3106 +msgid "Export SLA" +msgstr "STL로 내보내기" + +#: src/libslic3r/PrintConfig.cpp:3107 +msgid "Slice the model and export SLA printing layers as PNG." +msgstr "모델을 분할하고 SLA 인쇄 레이어를 PNG로 내보냅니다." + +#: src/libslic3r/PrintConfig.cpp:3112 +msgid "Export 3MF" +msgstr "3MF 내보내기" + +#: src/libslic3r/PrintConfig.cpp:3113 +msgid "Export the model(s) as 3MF." +msgstr "모델을 3MF로 내보냅니다." + +#: src/libslic3r/PrintConfig.cpp:3117 +msgid "Export AMF" +msgstr "AMF 내보내기" + +#: src/libslic3r/PrintConfig.cpp:3118 +msgid "Export the model(s) as AMF." +msgstr "모델을 AMF로 내보냅니다." + +#: src/libslic3r/PrintConfig.cpp:3122 +msgid "Export STL" +msgstr "STL 내보내기" + +#: src/libslic3r/PrintConfig.cpp:3123 +msgid "Export the model(s) as STL." +msgstr "모델을 STL로 내보냅니다." + +#: src/libslic3r/PrintConfig.cpp:3128 +msgid "Slice the model and export toolpaths as G-code." +msgstr "모델을 슬라이스하고 공구 경로를 G 코드로 내보냅니다." + +#: src/libslic3r/PrintConfig.cpp:3133 +msgid "Slice" +msgstr "슬라이스" + +#: src/libslic3r/PrintConfig.cpp:3134 +msgid "" +"Slice the model as FFF or SLA based on the printer_technology configuration " +"value." +msgstr "프린터_기술 구성 값을 기반으로 모델을 FFF 또는 SLA로 슬라이스합니다." + +#: src/libslic3r/PrintConfig.cpp:3139 +msgid "Help" +msgstr "도움말" + +#: src/libslic3r/PrintConfig.cpp:3140 +msgid "Show this help." +msgstr "이 도움말을 표시 합니다." + +#: src/libslic3r/PrintConfig.cpp:3145 +msgid "Help (FFF options)" +msgstr "도움말 (FFF 옵션)" + +#: src/libslic3r/PrintConfig.cpp:3146 +msgid "Show the full list of print/G-code configuration options." +msgstr "인쇄/G 코드 구성 옵션의 전체 목록을 표시 합니다." + +#: src/libslic3r/PrintConfig.cpp:3150 +msgid "Help (SLA options)" +msgstr "도움말 (SLA 옵션)" + +#: src/libslic3r/PrintConfig.cpp:3151 +msgid "Show the full list of SLA print configuration options." +msgstr "SLA 인쇄 구성 옵션의 전체 목록을 표시 합니다." + +#: src/libslic3r/PrintConfig.cpp:3155 +msgid "Output Model Info" +msgstr "출력 모델 정보" + +#: src/libslic3r/PrintConfig.cpp:3156 +msgid "Write information about the model to the console." +msgstr "모델에 대한 정보를 콘솔에 씁니다." + +#: src/libslic3r/PrintConfig.cpp:3160 +msgid "Save config file" +msgstr "구성 파일 저장" + +#: src/libslic3r/PrintConfig.cpp:3161 +msgid "Save configuration to the specified file." +msgstr "지정 된 파일에 구성을 저장 합니다." + +#: src/libslic3r/PrintConfig.cpp:3171 +msgid "Align XY" +msgstr "XY 정렬" + +#: src/libslic3r/PrintConfig.cpp:3172 +msgid "Align the model to the given point." +msgstr "모델을 지정된 점에 맞춥니다." + +#: src/libslic3r/PrintConfig.cpp:3177 +msgid "Cut model at the given Z." +msgstr "지정된 Z에서 모델을 잘라냅니다." + +#: src/libslic3r/PrintConfig.cpp:3198 +msgid "Center" +msgstr "중앙" + +#: src/libslic3r/PrintConfig.cpp:3199 +msgid "Center the print around the given center." +msgstr "지정된 중심을 중심으로 인쇄 합니다." + +#: src/libslic3r/PrintConfig.cpp:3203 +msgid "Don't arrange" +msgstr "준비하지 마십시오" + +#: src/libslic3r/PrintConfig.cpp:3204 +msgid "" +"Do not rearrange the given models before merging and keep their original XY " +"coordinates." +msgstr "" +"병합하기 전에 지정된 모델을 재정렬하고 원래 XY 좌표를 유지하지 마십시오." + +#: src/libslic3r/PrintConfig.cpp:3207 +msgid "Duplicate" +msgstr "복사" + +#: src/libslic3r/PrintConfig.cpp:3208 +msgid "Multiply copies by this factor." +msgstr "이 계수로 복사본을 곱합니다." + +#: src/libslic3r/PrintConfig.cpp:3212 +msgid "Duplicate by grid" +msgstr "모눈에 따라 복제" + +#: src/libslic3r/PrintConfig.cpp:3213 +msgid "Multiply copies by creating a grid." +msgstr "격자를 만들어 복사본을 곱합니다." + +#: src/libslic3r/PrintConfig.cpp:3216 +msgid "Merge" +msgstr "병합" + +#: src/libslic3r/PrintConfig.cpp:3217 +msgid "" +"Arrange the supplied models in a plate and merge them in a single model in " +"order to perform actions once." +msgstr "" +"한 번 작업을 수행하기 위해 제공 된 모델을 정렬하고 단일 모델로 병합 합니다." + +#: src/libslic3r/PrintConfig.cpp:3222 +msgid "" +"Try to repair any non-manifold meshes (this option is implicitly added " +"whenever we need to slice the model to perform the requested action)." +msgstr "" +"비 다양체 메쉬를 복구 하십시오 (요청 된 작업을 수행 하기 위해 모델을 슬라이" +"스 해야 할때마다 이 옵션이 암시적으로 추가 됨)." + +#: src/libslic3r/PrintConfig.cpp:3226 +msgid "Rotation angle around the Z axis in degrees." +msgstr "Z 축 주위의 회전 각도입니다." + +#: src/libslic3r/PrintConfig.cpp:3230 +msgid "Rotate around X" +msgstr "X 주위 회전" + +#: src/libslic3r/PrintConfig.cpp:3231 +msgid "Rotation angle around the X axis in degrees." +msgstr "X 축을 중심으로 회전 각도 (도)입니다." + +#: src/libslic3r/PrintConfig.cpp:3235 +msgid "Rotate around Y" +msgstr "Y 주위로 회전" + +#: src/libslic3r/PrintConfig.cpp:3236 +msgid "Rotation angle around the Y axis in degrees." +msgstr "Y 축을 중심으로 회전 각도 (도)입니다." + +#: src/libslic3r/PrintConfig.cpp:3241 +msgid "Scaling factor or percentage." +msgstr "배율 인수 또는 백분율입니다." + +#: src/libslic3r/PrintConfig.cpp:3246 +msgid "" +"Detect unconnected parts in the given model(s) and split them into separate " +"objects." +msgstr "" +"지정 된 모델에서 연결 되지 않은 부품을 감지 하여 별도의 객체로 분할 합니다." + +#: src/libslic3r/PrintConfig.cpp:3249 +msgid "Scale to Fit" +msgstr "크기에 맞게 조정" + +#: src/libslic3r/PrintConfig.cpp:3250 +msgid "Scale to fit the given volume." +msgstr "지정 된 볼륨에 맞게 크기를 조정 합니다." + +#: src/libslic3r/PrintConfig.cpp:3259 +msgid "Ignore non-existent config files" +msgstr "존재 하지 않는 구성 파일 무시" + +#: src/libslic3r/PrintConfig.cpp:3260 +msgid "Do not fail if a file supplied to --load does not exist." +msgstr "로드에 제공 된 파일이 없는 경우 실패 하지 않습니다." + +#: src/libslic3r/PrintConfig.cpp:3263 +msgid "Load config file" +msgstr "구성 파일 로드" + +#: src/libslic3r/PrintConfig.cpp:3264 +msgid "" +"Load configuration from the specified file. It can be used more than once to " +"load options from multiple files." +msgstr "" +"지정 된 파일에서 구성을 로드 합니다. 여러 파일에서 옵션을 로드 하는 데 두 번 " +"이상 사용할 수 있습니다." + +#: src/libslic3r/PrintConfig.cpp:3267 +msgid "Output File" +msgstr "출력파일" + +#: src/libslic3r/PrintConfig.cpp:3268 +msgid "" +"The file where the output will be written (if not specified, it will be " +"based on the input file)." +msgstr "" +"출력이 기록 되는 파일 (지정 하지 않은 경우 입력 파일을 기반으로 합니다)." + +#: src/libslic3r/PrintConfig.cpp:3278 +msgid "Data directory" +msgstr "데이터 디렉터리" + +#: src/libslic3r/PrintConfig.cpp:3279 +msgid "" +"Load and store settings at the given directory. This is useful for " +"maintaining different profiles or including configurations from a network " +"storage." +msgstr "" +"지정 된 디렉터리에 설정을 로드 하 고 저장 합니다. 이 기능은 다른 프로 파일을 " +"유지 관리 하거나 네트워크 스토리지의 구성을 포함 하는 데 유용 합니다." + +#: src/libslic3r/PrintConfig.cpp:3282 +msgid "Logging level" +msgstr "로깅 수준" + +#: src/libslic3r/PrintConfig.cpp:3283 +msgid "" +"Messages with severity lower or eqal to the loglevel will be printed out. 0:" +"trace, 1:debug, 2:info, 3:warning, 4:error, 5:fatal" +msgstr "" +"로그 수준에 대한 심각도가 낮거나 eqal인 메시지가 인쇄됩니다. 0:추적, 1:디버" +"그, 2:정보, 3:경고, 4:오류, 5:치명적" + +#: src/libslic3r/PrintConfig.cpp:3288 +msgid "Render with a software renderer" +msgstr "소프트웨어 렌더러를 사용 하 여 렌더링" + +#: src/libslic3r/PrintConfig.cpp:3289 +msgid "" +"Render with a software renderer. The bundled MESA software renderer is " +"loaded instead of the default OpenGL driver." +msgstr "" +"소프트웨어 렌더러를 사용 하여 렌더링 합니다. 번들 메사 소프트웨어 렌더러는 기" +"본 OpenGL 드라이버 대신 로드 됩니다." + +#: src/libslic3r/PrintObject.cpp:110 +msgid "Processing triangulated mesh" +msgstr "삼각 측정 메시 처리" + +#: src/libslic3r/PrintObject.cpp:141 +msgid "Generating perimeters" +msgstr "둘레 생성" + +#: src/libslic3r/PrintObject.cpp:251 +msgid "Preparing infill" +msgstr "채우기 준비" + +#: src/libslic3r/PrintObject.cpp:391 +msgid "Generating support material" +msgstr "지원 자료 생성" + +#: src/libslic3r/GCode/PreviewData.cpp:176 +msgid "Mixed" +msgstr "혼합" + +#: src/libslic3r/GCode/PreviewData.cpp:396 +msgid "Height (mm)" +msgstr "높이 (mm)" + +#: src/libslic3r/GCode/PreviewData.cpp:398 +msgid "Width (mm)" +msgstr "폭 (mm)" + +#: src/libslic3r/GCode/PreviewData.cpp:400 +msgid "Speed (mm/s)" +msgstr "속도 (mm/s)" + +#: src/libslic3r/GCode/PreviewData.cpp:402 +msgid "Volumetric flow rate (mm3/s)" +msgstr "용적 유량값 (mm3/s)" + +#: src/libslic3r/GCode/PreviewData.cpp:493 +msgid "Default print color" +msgstr "기본 인쇄 색상" + +#: src/libslic3r/GCode/PreviewData.cpp:500 +#, c-format +msgid "up to %.2f mm" +msgstr "최대%.2f mm" + +#: src/libslic3r/GCode/PreviewData.cpp:504 +#, c-format +msgid "above %.2f mm" +msgstr "above %.2f mm" + +#: src/libslic3r/GCode/PreviewData.cpp:509 +#, c-format +msgid "%.2f - %.2f mm" +msgstr "%.2f - %.2f mm" From 7a5c692a27e9de9185decc0aef4e10dec5a6bc41 Mon Sep 17 00:00:00 2001 From: lee hakmin Date: Sun, 25 Aug 2019 09:43:28 +0900 Subject: [PATCH 011/336] Add files via upload --- resources/localization/ko_KR/PrusaSlicer.mo | Bin 214548 -> 214618 bytes resources/localization/ko_KR/PrusaSlicer.po | 29 ++++++++++---------- 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/resources/localization/ko_KR/PrusaSlicer.mo b/resources/localization/ko_KR/PrusaSlicer.mo index 6c539b6979848fd1e2ecfc052784271c396d4d38..5ba55934e21ae3b9a182b9f847f5d8830554ba0f 100644 GIT binary patch delta 14770 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 delta 14727 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 diff --git a/resources/localization/ko_KR/PrusaSlicer.po b/resources/localization/ko_KR/PrusaSlicer.po index dbad0a868f..348bf1a346 100644 --- a/resources/localization/ko_KR/PrusaSlicer.po +++ b/resources/localization/ko_KR/PrusaSlicer.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-08-06 09:54+0200\n" -"PO-Revision-Date: 2019-08-23 23:38+0900\n" +"PO-Revision-Date: 2019-08-25 09:43+0900\n" "Last-Translator: lee hak-min \n" "Language-Team: ulsanether\n" "Language: ko_KR\n" @@ -317,7 +317,7 @@ msgstr "활동중" #: src/slic3r/GUI/ConfigSnapshotDialog.cpp:45 msgid "slic3r version" -msgstr "slic3r에 대하여" +msgstr "slic3r 버전" #: src/slic3r/GUI/ConfigSnapshotDialog.cpp:46 src/slic3r/GUI/Preset.cpp:1307 msgid "print" @@ -1212,7 +1212,7 @@ msgstr "모드 보기 로드" #: src/slic3r/GUI/GUI_App.cpp:544 msgid "Choose one file (3MF/AMF):" -msgstr "하나의 파일(3MF/AMF)을 선택합니다." +msgstr "파일(3MF/AMF) 선택:" #: src/slic3r/GUI/GUI_App.cpp:556 msgid "Choose one or more files (STL/OBJ/AMF/3MF/PRUSA):" @@ -2569,7 +2569,7 @@ msgstr "모든 개체를 선택 합니다" #: src/slic3r/GUI/MainFrame.cpp:546 msgid "D&eselect all" -msgstr "선택 취소 D&eselect" +msgstr "선택 취소 D&select+" #: src/slic3r/GUI/MainFrame.cpp:547 msgid "Deselects all objects" @@ -8705,7 +8705,8 @@ msgstr "슬라이스" msgid "" "Slice the model as FFF or SLA based on the printer_technology configuration " "value." -msgstr "프린터_기술 구성 값을 기반으로 모델을 FFF 또는 SLA로 슬라이스합니다." +msgstr "" +" printer_technology 구성 값을 기반으로 모델을 FFF 또는 SLA로 슬라이스합니다." #: src/libslic3r/PrintConfig.cpp:3139 msgid "Help" @@ -8765,7 +8766,7 @@ msgstr "중앙" #: src/libslic3r/PrintConfig.cpp:3199 msgid "Center the print around the given center." -msgstr "지정된 중심을 중심으로 인쇄 합니다." +msgstr "지정된 점을 중심으로 인쇄 합니다." #: src/libslic3r/PrintConfig.cpp:3203 msgid "Don't arrange" @@ -8792,7 +8793,7 @@ msgstr "모눈에 따라 복제" #: src/libslic3r/PrintConfig.cpp:3213 msgid "Multiply copies by creating a grid." -msgstr "격자를 만들어 복사본을 곱합니다." +msgstr "그리드를 만들어 복사본을 곱합니다." #: src/libslic3r/PrintConfig.cpp:3216 msgid "Merge" @@ -8810,12 +8811,12 @@ msgid "" "Try to repair any non-manifold meshes (this option is implicitly added " "whenever we need to slice the model to perform the requested action)." msgstr "" -"비 다양체 메쉬를 복구 하십시오 (요청 된 작업을 수행 하기 위해 모델을 슬라이" -"스 해야 할때마다 이 옵션이 암시적으로 추가 됨)." +"메쉬를 복구 하십시오 (요청 된 작업을 수행 하기 위해 모델을 슬라이스 해야 할때" +"마다 이 옵션이 암시적으로 추가 됨)." #: src/libslic3r/PrintConfig.cpp:3226 msgid "Rotation angle around the Z axis in degrees." -msgstr "Z 축 주위의 회전 각도입니다." +msgstr "Z 축 주위 회전 각도입니다." #: src/libslic3r/PrintConfig.cpp:3230 msgid "Rotate around X" @@ -8823,7 +8824,7 @@ msgstr "X 주위 회전" #: src/libslic3r/PrintConfig.cpp:3231 msgid "Rotation angle around the X axis in degrees." -msgstr "X 축을 중심으로 회전 각도 (도)입니다." +msgstr "X 축을 중심 회전 각도 입니다." #: src/libslic3r/PrintConfig.cpp:3235 msgid "Rotate around Y" @@ -8831,7 +8832,7 @@ msgstr "Y 주위로 회전" #: src/libslic3r/PrintConfig.cpp:3236 msgid "Rotation angle around the Y axis in degrees." -msgstr "Y 축을 중심으로 회전 각도 (도)입니다." +msgstr "Y 축을 중심 회전 각도 입니다." #: src/libslic3r/PrintConfig.cpp:3241 msgid "Scaling factor or percentage." @@ -8874,7 +8875,7 @@ msgstr "" #: src/libslic3r/PrintConfig.cpp:3267 msgid "Output File" -msgstr "출력파일" +msgstr "출력 파일" #: src/libslic3r/PrintConfig.cpp:3268 msgid "" @@ -8934,7 +8935,7 @@ msgstr "채우기 준비" #: src/libslic3r/PrintObject.cpp:391 msgid "Generating support material" -msgstr "지원 자료 생성" +msgstr "지원할 서포트 생성" #: src/libslic3r/GCode/PreviewData.cpp:176 msgid "Mixed" From c80cd04c2089b106a71c35b941485a4e18be4c2d Mon Sep 17 00:00:00 2001 From: lee hakmin Date: Fri, 25 Oct 2019 00:03:18 +0900 Subject: [PATCH 012/336] Add files via upload --- resources/localization/ko_KR/PrusaSlicer.mo | Bin 214618 -> 215950 bytes resources/localization/ko_KR/PrusaSlicer.po | 2851 ++++++------------- 2 files changed, 807 insertions(+), 2044 deletions(-) diff --git a/resources/localization/ko_KR/PrusaSlicer.mo b/resources/localization/ko_KR/PrusaSlicer.mo index 5ba55934e21ae3b9a182b9f847f5d8830554ba0f..6d14034618b5057384e1e8dc2a51708295744647 100644 GIT binary patch delta 45709 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�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

sLeS5bKoS@0}okGTmL|n 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 Cijdy` diff --git a/resources/localization/ko_KR/PrusaSlicer.po b/resources/localization/ko_KR/PrusaSlicer.po index 348bf1a346..37713d8dfe 100644 --- a/resources/localization/ko_KR/PrusaSlicer.po +++ b/resources/localization/ko_KR/PrusaSlicer.po @@ -3,14 +3,14 @@ msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-08-06 09:54+0200\n" -"PO-Revision-Date: 2019-08-25 09:43+0900\n" +"PO-Revision-Date: 2019-10-24 23:57+0900\n" "Last-Translator: lee hak-min \n" "Language-Team: ulsanether\n" "Language: ko_KR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.2.3\n" +"X-Generator: Poedit 2.2.4\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Crowdin-Project: slic3rkorean\n" "X-Crowdin-Language: ko\n" @@ -26,12 +26,8 @@ msgstr "저작권" #. TRN "Slic3r _is licensed under the_ License" #: src/slic3r/GUI/AboutDialog.cpp:127 -msgid "" -"License agreements of all following programs (libraries) are part of " -"application license agreement" -msgstr "" -"다음의 모든 프로그램 (라이브러리)의 라이센스 계약은 응용 프로그램 라이센스 계" -"약의 일부입니다." +msgid "License agreements of all following programs (libraries) are part of application license agreement" +msgstr "다음의 모든 프로그램 (라이브러리)의 라이센스 계약은 응용 프로그램 라이센스 계약의 일부입니다" #: src/slic3r/GUI/AboutDialog.cpp:197 #, c-format @@ -52,30 +48,16 @@ msgid "GNU Affero General Public License, version 3" msgstr "GNU Affero 일반 공중 사용 허가서, 버전 3" #: src/slic3r/GUI/AboutDialog.cpp:258 -msgid "" -"PrusaSlicer is based on Slic3r by Alessandro Ranellucci and the RepRap " -"community." -msgstr "" -"프루사슬라이서는 알레산드로 라넬루치와 RepRap 커뮤니티 Slic3r를 기반으로합니" -"다." +msgid "PrusaSlicer is based on Slic3r by Alessandro Ranellucci and the RepRap community." +msgstr "프루사슬라이서는 알레산드로 라넬루치와 RepRap 커뮤니티 Slic3r를 기반으로합니다." #: src/slic3r/GUI/AboutDialog.cpp:259 -msgid "" -"Contributions by Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, " -"Petr Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik and " -"numerous others." -msgstr "" -"Contributions by Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, " -"Petr Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik and " -"numerous others. 한국어 번역 울산에테르." +msgid "Contributions by Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, Petr Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik and numerous others." +msgstr "Contributions by Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, Petr Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik and numerous others. 한국어 번역 울산에테르." #: src/slic3r/GUI/BackgroundSlicingProcess.cpp:92 -msgid "" -"Copying of the temporary G-code to the output G-code failed. Maybe the SD " -"card is write locked?" -msgstr "" -"임시 G-코드를 출력할 SD카드에 복사하는 데 실패했습니다. SD카드의 락을 확인 하" -"시오." +msgid "Copying of the temporary G-code to the output G-code failed. Maybe the SD card is write locked?" +msgstr "임시 G-코드를 출력할 SD카드에 복사하는 데 실패했습니다. SD카드의 락을 확인 하시오." #: src/slic3r/GUI/BackgroundSlicingProcess.cpp:93 #: src/slic3r/GUI/BackgroundSlicingProcess.cpp:406 @@ -101,9 +83,7 @@ msgstr "임시 G 코드를 출력 G 코드에 복사 하지 못했습니다" #: src/slic3r/GUI/BackgroundSlicingProcess.cpp:417 msgid "Scheduling upload to `%1%`. See Window -> Print Host Upload Queue" -msgstr "" -"`%1%`. 로 업로드를 예약 합니다. 창-> 인쇄 호스트 업로드 대기열을 참조 하십시" -"오" +msgstr "`%1%`. 로 업로드를 예약 합니다. 창-> 인쇄 호스트 업로드 대기열을 참조 하십시오" #: src/slic3r/GUI/BedShapeDialog.cpp:65 msgid "Shape" @@ -121,17 +101,15 @@ msgstr "사이즈" #: src/slic3r/GUI/BedShapeDialog.cpp:77 msgid "Size in X and Y of the rectangular plate." -msgstr "사격형 플레이트 X 및 Y 크기." +msgstr "사각 플레이트 X 및 Y 크기." #: src/slic3r/GUI/BedShapeDialog.cpp:83 msgid "Origin" -msgstr "원본" +msgstr "원점" #: src/slic3r/GUI/BedShapeDialog.cpp:84 -msgid "" -"Distance of the 0,0 G-code coordinate from the front left corner of the " -"rectangle." -msgstr "사각형의 전면 왼쪽된 모서리에서 0, 0 G-코드 좌표 거리입니다." +msgid "Distance of the 0,0 G-code coordinate from the front left corner of the rectangle." +msgstr "사각 전면 왼쪽 모서리에서 원저(0, 0) G-코드 좌표 거리입니다." #: src/slic3r/GUI/BedShapeDialog.cpp:88 msgid "Circular" @@ -177,9 +155,7 @@ msgid "Diameter" msgstr "노즐 직경" #: src/slic3r/GUI/BedShapeDialog.cpp:93 -msgid "" -"Diameter of the print bed. It is assumed that origin (0,0) is located in the " -"center." +msgid "Diameter of the print bed. It is assumed that origin (0,0) is located in the center." msgstr "인쇄 침대의 직경. 원점 (0,0) 은 중심에 있다고 가정합니다." #: src/slic3r/GUI/BedShapeDialog.cpp:97 src/slic3r/GUI/GUI_Preview.cpp:246 @@ -227,14 +203,11 @@ msgstr "오류! 잘못된 모델" #: src/slic3r/GUI/BedShapeDialog.cpp:490 msgid "The selected file contains no geometry." -msgstr "선택한 파일에는 형상이 없는 포함 되어 있습니다." +msgstr "선택한 파일에 없는 형상이 있습니다." #: src/slic3r/GUI/BedShapeDialog.cpp:494 -msgid "" -"The selected file contains several disjoint areas. This is not supported." -msgstr "" -"선택한 파일 여러 분리 된 영역을 포함 되어 있습니다. 이것ㅇ 지원 되지 않습니" -"다." +msgid "The selected file contains several disjoint areas. This is not supported." +msgstr "선택한 파일은 여러개의 분리 된 영역을 포함 되어 있어 지원 되지 않습니다." #: src/slic3r/GUI/BedShapeDialog.cpp:509 msgid "Choose a file to import bed texture from (PNG/SVG):" @@ -285,11 +258,8 @@ msgid "Value is the same as the system value" msgstr "이 값은 시스템 값과 같습니다" #: src/slic3r/GUI/ButtonsDescription.cpp:53 -msgid "" -"Value was changed and is not equal to the system value or the last saved " -"preset" -msgstr "" -"값이 변경 되었고 시스템 값 또는 마지막으로 저장 된 사전 설정과 같지 않음" +msgid "Value was changed and is not equal to the system value or the last saved preset" +msgstr "값이 변경 되었고, 시스템 값 또는 마지막으로 저장된 설정값과 다릅니다." #: src/slic3r/GUI/ConfigSnapshotDialog.cpp:18 msgid "Upgrade" @@ -321,7 +291,7 @@ msgstr "slic3r 버전" #: src/slic3r/GUI/ConfigSnapshotDialog.cpp:46 src/slic3r/GUI/Preset.cpp:1307 msgid "print" -msgstr "프린트" +msgstr "출력" #: src/slic3r/GUI/ConfigSnapshotDialog.cpp:47 msgid "filaments" @@ -341,11 +311,11 @@ msgstr "버전" #: src/slic3r/GUI/ConfigSnapshotDialog.cpp:53 msgid "min slic3r version" -msgstr "최소 slic3r 버전" +msgstr "이전 slic3r 버전" #: src/slic3r/GUI/ConfigSnapshotDialog.cpp:55 msgid "max slic3r version" -msgstr "최대 slic3r 버전" +msgstr "최신 slic3r 버전" #: src/slic3r/GUI/ConfigSnapshotDialog.cpp:58 msgid "model" @@ -410,18 +380,12 @@ msgstr "%s 실행" #: src/slic3r/GUI/ConfigWizard.cpp:306 #, c-format -msgid "" -"Hello, welcome to %s! This %s helps you with the initial configuration; just " -"a few settings and you will be ready to print." -msgstr "" -"안녕하세요 ,%s에 오신 것을 환영 합니다! 이 %s는 초기 구성에 도움이 됩니다. 그" -"냥 몇 가지 설정 하 고 당신은 인쇄 할 준비가 될 것입니다." +msgid "Hello, welcome to %s! This %s helps you with the initial configuration; just a few settings and you will be ready to print." +msgstr "안녕하세요 ,%s에 오신 것을 환영 합니다! 이 %s는 초기 구성에 도움이 됩니다. 몇 가지 설정만으로 인쇄 준비가 될 것입니다." #: src/slic3r/GUI/ConfigWizard.cpp:311 -msgid "" -"Remove user profiles - install from scratch (a snapshot will be taken " -"beforehand)" -msgstr "사용자 프로필 제거-처음부터 설치 (스냅숏은 사전에 수행 됩니다)" +msgid "Remove user profiles - install from scratch (a snapshot will be taken beforehand)" +msgstr "사용자 프로필 제거 - 처음부터 설치 (스냅숏 값은 먼저 저장 됩니다.)" #: src/slic3r/GUI/ConfigWizard.cpp:342 #, c-format @@ -438,11 +402,11 @@ msgstr "사용자 정의 프린터" #: src/slic3r/GUI/ConfigWizard.cpp:381 msgid "Define a custom printer profile" -msgstr "사용자 정의 프린터 프로필 정의" +msgstr "사용자 정의 프린터 프로필" #: src/slic3r/GUI/ConfigWizard.cpp:383 msgid "Custom profile name:" -msgstr "사용자 지정 프로필 이름:" +msgstr "사용자 정의 프로필 명칭:" #: src/slic3r/GUI/ConfigWizard.cpp:407 msgid "Automatic updates" @@ -458,15 +422,8 @@ msgstr "프로그램 업데이트 확인" #: src/slic3r/GUI/ConfigWizard.cpp:419 #, c-format -msgid "" -"If enabled, %s checks for new application versions online. When a new " -"version becomes available, a notification is displayed at the next " -"application startup (never during program usage). This is only a " -"notification mechanisms, no automatic installation is done." -msgstr "" -"활성화 된 경우 %s은 온라인의 새 버전을 확인합니다. 새 버전을 사용할 수있게되" -"면 다음 응용 프로그램 시작시 알림이 표시됩니다 (프로그램 사용 중에는 절대로 " -"사용하지 마십시오).이것은 알림 메커니즘 일뿐 자동 설치가 수행되지 않습니다." +msgid "If enabled, %s checks for new application versions online. When a new version becomes available, a notification is displayed at the next application startup (never during program usage). This is only a notification mechanisms, no automatic installation is done." +msgstr "활성화 된 경우 %s은 온라인의 새 버전을 확인합니다. 새 버전을 사용할 수 있게 되면, 다음 응용 프로그램 시작시 알림이 표시됩니다 (프로그램 사용 중에는 절대로 사용하지 마십시오).이것은 단순한 알림 일뿐 자동으로 설치가 되지 않습니다." #: src/slic3r/GUI/ConfigWizard.cpp:425 src/slic3r/GUI/Preferences.cpp:77 msgid "Update built-in Presets automatically" @@ -474,29 +431,16 @@ msgstr "기존의 설정 자동 업데이트" #: src/slic3r/GUI/ConfigWizard.cpp:429 #, c-format -msgid "" -"If enabled, %s downloads updates of built-in system presets in the " -"background.These updates are downloaded into a separate temporary location." -"When a new preset version becomes available it is offered at application " -"startup." -msgstr "" -"활성화 된 경우 %s은 백그라운드에서 내장 시스템 사전 설정의 업데이트를 다운로" -"드합니다. 이러한 업데이트는 별도의 임시 위치에 다운로드됩니다. 새로운 사전 설" -"정 버전을 사용할 수있게되면 응용 프로그램 시작시 제공됩니다." +msgid "If enabled, %s downloads updates of built-in system presets in the background.These updates are downloaded into a separate temporary location.When a new preset version becomes available it is offered at application startup." +msgstr "활성화 된 경우 %s은 백그라운드에서, 시스템 사전 설정을 다운로드합니다. 이러한 업데이트는 별도의 임시 위치에 다운로드됩니다. 새로운 사전 설정 버전을 사용할 수 있게되면 응용 프로그램 시작시 제공됩니다." #: src/slic3r/GUI/ConfigWizard.cpp:432 -msgid "" -"Updates are never applied without user's consent and never overwrite user's " -"customized settings." -msgstr "" -"업데이트는 사용자의 동의없이 적용되지 않으며 사용자의 사용자 지정된 설정을 덮" -"어 쓰지 않습니다." +msgid "Updates are never applied without user's consent and never overwrite user's customized settings." +msgstr "업데이트는 사용자의 동의를 받아야 하고, 지정된 이전 설정을 덮어 쓰지 않습니다." #: src/slic3r/GUI/ConfigWizard.cpp:437 -msgid "" -"Additionally a backup snapshot of the whole configuration is created before " -"an update is applied." -msgstr "또한 업데이트가 적용되기 전에 전체 구성의 백업 스냅 샷이 생성됩니다." +msgid "Additionally a backup snapshot of the whole configuration is created before an update is applied." +msgstr "또한 업데이트가 적용되기 전에 전체 구성의 백업 구성(스냅샷)이 생성됩니다." #: src/slic3r/GUI/ConfigWizard.cpp:444 msgid "Other Vendors" @@ -509,7 +453,7 @@ msgstr "%s가 지원하는 다른 공급 업체를 선택하십시오:" #: src/slic3r/GUI/ConfigWizard.cpp:492 msgid "Firmware Type" -msgstr "펌웨어 타입" +msgstr "펌웨어 종류" #: src/slic3r/GUI/ConfigWizard.cpp:492 src/slic3r/GUI/Tab.cpp:2100 msgid "Firmware" @@ -517,7 +461,7 @@ msgstr "펌웨어" #: src/slic3r/GUI/ConfigWizard.cpp:496 msgid "Choose the type of firmware used by your printer." -msgstr "프린터에 패치할 펌웨어를 선택하세요." +msgstr "프린터에 업로드 할 펌웨어를 선택하세요." #: src/slic3r/GUI/ConfigWizard.cpp:530 msgid "Bed Shape and Size" @@ -548,12 +492,8 @@ msgid "Enter the diameter of your filament." msgstr "필라멘트의 직경을 입력하십시오." #: src/slic3r/GUI/ConfigWizard.cpp:581 -msgid "" -"Good precision is required, so use a caliper and do multiple measurements " -"along the filament, then compute the average." -msgstr "" -"정밀도가 필요하므로 캘리퍼를 사용하여 필라멘트를 따라 여러 번 측정 한 다음 평" -"균을 계산하십시오." +msgid "Good precision is required, so use a caliper and do multiple measurements along the filament, then compute the average." +msgstr "정밀도가 필요하므로 캘리퍼를 사용하여 필라멘트를 따라 여러 번 측정 한 다음 평균을 계산하십시오." #: src/slic3r/GUI/ConfigWizard.cpp:584 msgid "Filament Diameter:" @@ -584,18 +524,12 @@ msgid "°C" msgstr "°C" #: src/slic3r/GUI/ConfigWizard.cpp:648 -msgid "" -"Enter the bed temperature needed for getting your filament to stick to your " -"heated bed." -msgstr "필라멘트가 핫배드에 접착하는데 필요한 배드온도를 입력하십시오." +msgid "Enter the bed temperature needed for getting your filament to stick to your heated bed." +msgstr "필라멘트가 핫배드에 접착하는데 필요한 온도를 입력하십시오." #: src/slic3r/GUI/ConfigWizard.cpp:649 -msgid "" -"A rule of thumb is 60 °C for PLA and 110 °C for ABS. Leave zero if you have " -"no heated bed." -msgstr "" -"보통은 PLA의 경우 60 ° C이고 ABS의 경우 110 ° C입니다. 핫배드가 없는 경우에" -"는 0으로 두십시오." +msgid "A rule of thumb is 60 °C for PLA and 110 °C for ABS. Leave zero if you have no heated bed." +msgstr "보통은 PLA의 경우 60 ° C이고 ABS의 경우 110 ° C입니다. 핫배드가 없는 경우에는 0으로 두십시오." #: src/slic3r/GUI/ConfigWizard.cpp:652 msgid "Bed Temperature:" @@ -669,7 +603,7 @@ msgstr "숫자 입력이 잘못 되었습니다." #: src/slic3r/GUI/Field.cpp:179 msgid "Input value is out of range" -msgstr "Input value is out of range" +msgstr "입력 값이 범위를 벗어났습니다." #: src/slic3r/GUI/Field.cpp:206 #, c-format @@ -729,20 +663,17 @@ msgstr "" #: src/slic3r/GUI/FirmwareDialog.cpp:419 src/slic3r/GUI/FirmwareDialog.cpp:454 #, c-format -msgid "" -"Multiple %s devices found. Please only connect one at a time for flashing." -msgstr "" -"여러 %s 장치를 찾았습니다. 깜박이는 경우에는 한 번에 하나씩만 연결 하십시오." +msgid "Multiple %s devices found. Please only connect one at a time for flashing." +msgstr "여러 %s 장치를 찾았습니다. 깜박이면 한 번에 하나씩만 연결하십시오." #: src/slic3r/GUI/FirmwareDialog.cpp:436 #, c-format msgid "" "The %s device was not found.\n" -"If the device is connected, please press the Reset button next to the USB " -"connector ..." +"If the device is connected, please press the Reset button next to the USB connector ..." msgstr "" -"%s 장치를 찾을 하지 않았습니다.\n" -"장치가 연결 된 경우 USB 커넥터 옆에 있는 리셋 단추를 누르십시오." +"%s 장치를 찾을 수 없습니다.\n" +"장치가 연결되어 있는 경우 USB 커넥터 옆에 있는 리셋 버튼을 누르십시오..." #: src/slic3r/GUI/FirmwareDialog.cpp:548 #, c-format @@ -827,7 +758,7 @@ msgstr "레이어 높이" #: src/slic3r/GUI/GLCanvas3D.cpp:623 msgid "An object outside the print area was detected" -msgstr "인쇄 영역 밖에 있는 개체가 감지 되었습니다" +msgstr "인쇄 영역 밖에 있는 객체(object)가 감지 되었습니다" #: src/slic3r/GUI/GLCanvas3D.cpp:624 msgid "A toolpath outside the print area was detected" @@ -835,37 +766,37 @@ msgstr "인쇄 영역 밖에 있는 공구 경로가 감지 되었습니다" #: src/slic3r/GUI/GLCanvas3D.cpp:625 msgid "SLA supports outside the print area were detected" -msgstr "인쇄 영역 외부의 SLA 지원 감지 됨" +msgstr "인쇄 영역 밖에 서포트가 감지되었습니다." #: src/slic3r/GUI/GLCanvas3D.cpp:626 msgid "Some objects are not visible when editing supports" -msgstr "편집 지원 시 일부 객체가 표시 되지 않음" +msgstr "서포트 편집시 일부 객체(object)가 표시 되지 않습니다." #: src/slic3r/GUI/GLCanvas3D.cpp:628 msgid "" "An object outside the print area was detected\n" "Resolve the current problem to continue slicing" msgstr "" -"인쇄 영역 밖에 있는 개체가 감지 되었습니다.\n" -"현재 문제를 해결 하여 슬라이싱을 계속 합니다" +"인쇄 영역 밖에 있는 객체(object)가 감지 되었습니다.\n" +"현재 문제를 해결하고 슬라이싱을 계속 합니다" #: src/slic3r/GUI/GLCanvas3D.cpp:1711 msgid "Mirror Object" -msgstr "오브젝트 미러" +msgstr "객체(object) 반전" #: src/slic3r/GUI/GLCanvas3D.cpp:2872 msgid "Move Object" -msgstr "오브젝트 이동" +msgstr "객체(object) 이동" #: src/slic3r/GUI/GLCanvas3D.cpp:3389 src/slic3r/GUI/GLCanvas3D.cpp:3609 #: src/slic3r/GUI/MainFrame.cpp:559 msgid "Undo" -msgstr "실행 취소" +msgstr "되돌리기" #: src/slic3r/GUI/GLCanvas3D.cpp:3389 src/slic3r/GUI/GLCanvas3D.cpp:3639 #: src/slic3r/GUI/MainFrame.cpp:562 msgid "Redo" -msgstr "다시 실행" +msgstr "다시실행" #: src/slic3r/GUI/GLCanvas3D.cpp:3395 #, c-format @@ -896,6 +827,35 @@ msgstr "전부 지우기" msgid "Arrange" msgstr "정렬" +#: src/slic3r/GUI/GLCanvas3D.cpp:3677 src/slic3r/GUI/GUI_ObjectList.cpp:2203 +msgid "Height ranges" +msgstr "높이 범위" + +#: src/slic3r/GUI/GUI_ObjectLayers.cpp:27 +msgid "Start at height" +msgstr "높이에서 시작" + +#: src/slic3r/GUI/GUI_ObjectLayers.cpp:27 +msgid "Stop at height" +msgstr "높이에서 정지" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2203 +msgid "Settings for height range" +msgstr "높이 범위에 대한 설정" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1435 +msgid "Printable" +msgstr "인쇄가능" + +#: src/slic3r/GUI/Plater.cpp:3530 +msgid "Set number of instances" +msgstr "복제할 수량 설정" + +#: src/slic3r/GUI/Plater.cpp:4260 +#, c-format +msgid "Set numbers of copies to %d" +msgstr "복사본 수를 %d로 설정" + #: src/slic3r/GUI/GLCanvas3D.cpp:3486 msgid "Arrange selection" msgstr "선택 정렬" @@ -918,19 +878,19 @@ msgstr "복제본 제거" #: src/slic3r/GUI/GLCanvas3D.cpp:3543 msgid "Split to objects" -msgstr "객체로 분할" +msgstr "객체(object)별 분할" #: src/slic3r/GUI/GLCanvas3D.cpp:3553 src/slic3r/GUI/GUI_ObjectList.cpp:1280 msgid "Split to parts" -msgstr "파트로 분할" +msgstr "부품(Part)별 분할" #: src/slic3r/GUI/GLCanvas3D.cpp:3566 msgid "Layers editing" -msgstr "레이어층을 편집" +msgstr "레이어층 편집" #: src/slic3r/GUI/GLCanvas3D.cpp:5623 msgid "Selection-Add from rectangle" -msgstr "사각형에서 선택-추가" +msgstr "선택-사각형에서 추가" #: src/slic3r/GUI/GLCanvas3D.cpp:5642 msgid "Selection-Remove from rectangle" @@ -995,7 +955,7 @@ msgstr "크기" #: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:292 msgid "Scale (%)" -msgstr "스케일 (%)" +msgstr "크기 (%)" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:44 msgid "Head diameter" @@ -1003,16 +963,16 @@ msgstr "헤드 지름" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:45 msgid "Lock supports under new islands" -msgstr "새 고립 영역에서 잠금 지원" +msgstr "새영역에서 서포트 잠금 지원" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:46 #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1427 msgid "Remove selected points" -msgstr "선택한 점 제거" +msgstr "선택한 지점 제거" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:47 msgid "Remove all points" -msgstr "모든 점 제거" +msgstr "모든 지점 제거" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:48 #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1430 @@ -1026,25 +986,29 @@ msgstr "변경사항을 취소" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:50 msgid "Minimal points distance" -msgstr "최소 포인트 거리" +msgstr "최소한의 지점 거리" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:51 #: src/libslic3r/PrintConfig.cpp:2620 msgid "Support points density" -msgstr "지원 포인트 밀도" +msgstr "서포트 지점 밀도" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:52 #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1433 msgid "Auto-generate points" -msgstr "점 자동 생성" +msgstr "지점 자동 생성" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:53 msgid "Manual editing" msgstr "수동 편집" +#: src/slic3r/GUI/GUI_ObjectList.cpp:1347 +msgid "Height range Modifier" +msgstr "높이 범위에 대한 설정" + #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:54 msgid "Clipping of view" -msgstr "클랩핑된것 보기" +msgstr "갈무리된것 보기" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:55 msgid "Reset direction" @@ -1060,7 +1024,7 @@ msgstr "서포트 지점 삭제" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:925 msgid "Change point head diameter" -msgstr "변경 점 헤드 지름" +msgstr "변경된 해드의 끝 점 지름" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:991 msgid "Support parameter change" @@ -1068,23 +1032,23 @@ msgstr "서포트 매개 변수 변경" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1099 msgid "SLA Support Points" -msgstr "SLA 지원 포인트" +msgstr "SLA 서포트 지점" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1138 msgid "Do you want to save your manually edited support points?" -msgstr "수동으로 편집한 서포트 지점을 저장 하 시겠습니까?" +msgstr "수동으로 편집한 서포트 지점을 저장 하시 겠습니까?" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1139 msgid "Save changes?" -msgstr "변경 사항을 저장 하 시겠습니까?" +msgstr "변경 사항을 저장 하시겠습니까?" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1183 msgid "Move support point" -msgstr "서포트 점 이동" +msgstr "서포트 지점 이동" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1282 msgid "Support points edit" -msgstr "서포트 포인트 편집" +msgstr "서포트 지점 편집" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1333 msgid "" @@ -1092,7 +1056,7 @@ msgid "" "\n" "Are you sure you want to do it?\n" msgstr "" -"자동 생성은 수동으로 편집한 모든 점을 지웁니다.\n" +"서포트 자동 생성은 수동으로 편집한 모든 지점을 지웁니다.\n" "\n" "그렇게 하시겠습니까?\n" @@ -1107,7 +1071,7 @@ msgstr "서포트 자동 생성" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1390 msgid "SLA gizmo keyboard shortcuts" -msgstr "SLA 장치바로 가기" +msgstr "SLA 장치 바로 가기" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1401 msgid "Note: some shortcuts work in (non)editing mode only." @@ -1121,7 +1085,7 @@ msgstr "왼쪽 클릭" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1419 msgid "Add point" -msgstr "점 추가" +msgstr "지점 추가" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1420 msgid "Right click" @@ -1139,15 +1103,15 @@ msgstr "드래그" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1421 msgid "Move point" -msgstr "점 이동" +msgstr "지점 이동" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1422 msgid "Add point to selection" -msgstr "선택 영역에 점 추가" +msgstr "선택 영역에 지점 추가" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1423 msgid "Remove point from selection" -msgstr "선택 영역에서 점 제거" +msgstr "선택 영역에서 지점 제거" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1424 msgid "Select by rectangle" @@ -1159,7 +1123,7 @@ msgstr "사각형으로 선택 해제" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1426 msgid "Select all points" -msgstr "모든 점 선택" +msgstr "모든 지점들 선택" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1428 msgid "Mouse wheel" @@ -1167,11 +1131,11 @@ msgstr "마우스 휠" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1428 msgid "Move clipping plane" -msgstr "클립핑 평면 이동" +msgstr "갈무리된 평면 이동" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1429 msgid "Reset clipping plane" -msgstr "클립핑 평면 재설정" +msgstr "갈무리된 평면 재설정" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1432 msgid "Switch to editing mode" @@ -1179,11 +1143,11 @@ msgstr "편집 모드로 전환" #: src/slic3r/GUI/GUI.cpp:141 src/slic3r/GUI/Tab.cpp:3063 msgid "It's impossible to print multi-part object(s) with SLA technology." -msgstr "SLA 방식을 사용 하여 멀티파트를 인쇄할 수는 없습니다." +msgstr "SLA 방식을 사용 하여 다중 객체(object)를 인쇄할 수는 없습니다." #: src/slic3r/GUI/GUI.cpp:142 msgid "Please check and fix your object list." -msgstr "개체 목록을 확인 하고 수정 하십시오." +msgstr "객체(object) 목록을 확인 하고 수정 하십시오." #: src/slic3r/GUI/GUI.cpp:143 src/slic3r/GUI/Plater.cpp:2213 #: src/slic3r/GUI/Tab.cpp:3065 @@ -1204,11 +1168,11 @@ msgstr "재현" #: src/slic3r/GUI/GUI_App.cpp:456 msgid "Loading of current presets" -msgstr "현재 프리셋 불러오기" +msgstr "현재 기본 설정을 불러오기" #: src/slic3r/GUI/GUI_App.cpp:464 msgid "Loading of a mode view" -msgstr "모드 보기 로드" +msgstr "보기 모드를 불러오기" #: src/slic3r/GUI/GUI_App.cpp:544 msgid "Choose one file (3MF/AMF):" @@ -1256,7 +1220,7 @@ msgstr "단순" #: src/slic3r/GUI/GUI_App.cpp:763 msgid "Simple View Mode" -msgstr "단순 보기 모드" +msgstr "기본 보기 모드" #: src/slic3r/GUI/GUI_App.cpp:764 src/slic3r/GUI/GUI_ObjectList.cpp:93 #: src/slic3r/GUI/GUI_ObjectList.cpp:567 src/slic3r/GUI/Tab.cpp:1037 @@ -1314,9 +1278,7 @@ msgstr "스냅 샷 이름" msgid "" "Switching the language will trigger application restart.\n" "You will lose content of the plater." -msgstr "" -"언어를 전환 하면 응용 프로그램 재시작 합니다.플레이트 위 오브젝트는 모두 지워" -"집니다." +msgstr "언어를 전환 하면 응용 프로그램 재시작 합니다. 플레이트 위 객체(object)는 모두 지워집니다." #: src/slic3r/GUI/GUI_App.cpp:831 msgid "Do you want to proceed?" @@ -1351,7 +1313,7 @@ msgstr "저장되지 않은 기존설정" #: src/libslic3r/PrintConfig.cpp:1601 src/libslic3r/PrintConfig.cpp:2037 #: src/libslic3r/PrintConfig.cpp:2095 msgid "Layers and Perimeters" -msgstr "레이어 및 경계선" +msgstr "레이어 및 둘레" #: src/slic3r/GUI/GUI_ObjectList.cpp:31 src/slic3r/GUI/GUI_ObjectList.cpp:85 #: src/slic3r/GUI/GUI_ObjectList.cpp:559 src/slic3r/GUI/Plater.cpp:498 @@ -1395,7 +1357,7 @@ msgstr "패드 및 서포트" #: src/slic3r/GUI/GUI_ObjectList.cpp:47 msgid "Add part" -msgstr "파트 추가" +msgstr "부품(Part) 추가" #: src/slic3r/GUI/GUI_ObjectList.cpp:48 msgid "Add modifier" @@ -1498,7 +1460,7 @@ msgstr "아이콘을 클릭 하여 Netfabb에서 STL을 수정 합니다" #: src/slic3r/GUI/GUI_ObjectList.cpp:325 msgid "Right button click the icon to change the object settings" -msgstr "아이콘을 클릭 하여 개체 설정을 변경 합니다" +msgstr "아이콘을 클릭 하여 객체(object) 설정을 변경 합니다" #: src/slic3r/GUI/GUI_ObjectList.cpp:375 src/slic3r/GUI/GUI_ObjectList.cpp:396 #: src/slic3r/GUI/GUI_ObjectList.cpp:408 src/slic3r/GUI/GUI_ObjectList.cpp:3508 @@ -1516,15 +1478,15 @@ msgstr "익스트루더(Extruder)" #: src/slic3r/GUI/GUI_ObjectList.cpp:493 msgid "Rename Object" -msgstr "개체 이름 바꾸기" +msgstr "객체(object) 이름 바꾸기" #: src/slic3r/GUI/GUI_ObjectList.cpp:493 msgid "Rename Sub-object" -msgstr "하위 오브젝트 이름 바꾸기" +msgstr "하위 객체(object) 이름 바꾸기" #: src/slic3r/GUI/GUI_ObjectList.cpp:934 src/slic3r/GUI/GUI_ObjectList.cpp:3346 msgid "Instances to Separated Objects" -msgstr "분리된 객체에 대한 복제본" +msgstr "분리된 객체(object)에 대한 복제본" #: src/slic3r/GUI/GUI_ObjectList.cpp:952 msgid "Remove Volume(s)" @@ -1540,31 +1502,31 @@ msgstr "빠른 추가 설정 (%s)" #: src/slic3r/GUI/GUI_ObjectList.cpp:1077 msgid "Select showing settings" -msgstr "설정 표시를 선택 합니다" +msgstr "표시된 설정을 선택 합니다" #: src/slic3r/GUI/GUI_ObjectList.cpp:1126 msgid "Add Settings for Layers" -msgstr "도면층에 대한 설정 추가" +msgstr "레이어 설정 추가" #: src/slic3r/GUI/GUI_ObjectList.cpp:1127 msgid "Add Settings for Sub-object" -msgstr "하위 개체에 대한 설정 추가" +msgstr "하위 객체(object)에 대한 설정 추가" #: src/slic3r/GUI/GUI_ObjectList.cpp:1128 msgid "Add Settings for Object" -msgstr "개체에 대한 설정 추가" +msgstr "객체(object)에 대한 설정 추가" #: src/slic3r/GUI/GUI_ObjectList.cpp:1189 msgid "Add Settings Bundle for Layers" -msgstr "레이어에 대한 설정 번들 추가" +msgstr "레이어에 대한 번들 설정을 추가" #: src/slic3r/GUI/GUI_ObjectList.cpp:1190 msgid "Add Settings Bundle for Sub-object" -msgstr "하위 오브젝트에 대한 설정 번들 추가" +msgstr "하위 객체(object)에 대한 번들 설정을 추가" #: src/slic3r/GUI/GUI_ObjectList.cpp:1191 msgid "Add Settings Bundle for Object" -msgstr "개체에 대한 설정 번들 추가" +msgstr "객체(object)에 대한 번들 설정을 추가" #: src/slic3r/GUI/GUI_ObjectList.cpp:1230 msgid "Load" @@ -1603,7 +1565,7 @@ msgstr "타입 변경" #: src/slic3r/GUI/GUI_ObjectList.cpp:1369 #: src/slic3r/GUI/GUI_ObjectList.cpp:1510 msgid "Set as a Separated Object" -msgstr "분리 된 객체로 설정" +msgstr "분리 된 객체(object)로 설정" #: src/slic3r/GUI/GUI_ObjectList.cpp:1375 msgid "Rename" @@ -1611,7 +1573,7 @@ msgstr "이름 변경" #: src/slic3r/GUI/GUI_ObjectList.cpp:1386 msgid "Fix through the Netfabb" -msgstr "네트워크를 통해 수정" +msgstr "Netfabb를 통해 수정" #: src/slic3r/GUI/GUI_ObjectList.cpp:1396 src/slic3r/GUI/Plater.cpp:3496 msgid "Export as STL" @@ -1627,7 +1589,7 @@ msgstr "기본값" #: src/slic3r/GUI/GUI_ObjectList.cpp:1428 msgid "Select new extruder for the object/part" -msgstr "객체/부품에 대한 새 압출(익스트루더) 기 선택" +msgstr "객체(object)/부품(Part)에 대한 새 압출(익스트루더) 기 선택" #: src/slic3r/GUI/GUI_ObjectList.cpp:1440 msgid "Scale to print volume" @@ -1635,15 +1597,15 @@ msgstr "인쇄 볼륨에 따라 배율 조정" #: src/slic3r/GUI/GUI_ObjectList.cpp:1440 msgid "Scale the selected object to fit the print volume" -msgstr "인쇄 볼륨에 맞게 선택한 오브젝트의 배율 조정" +msgstr "인쇄 볼륨에 맞게 선택한 객체(object)의 배율 조정" #: src/slic3r/GUI/GUI_ObjectList.cpp:1510 msgid "Set as a Separated Objects" -msgstr "분리 된 객체로 설정" +msgstr "분리된 객체(object)로 설정" #: src/slic3r/GUI/GUI_ObjectList.cpp:1585 msgid "Load Part" -msgstr "하중 부품" +msgstr "부품(Part)을 불러 오기" #: src/slic3r/GUI/GUI_ObjectList.cpp:1617 msgid "Error!" @@ -1651,7 +1613,7 @@ msgstr "에러!" #: src/slic3r/GUI/GUI_ObjectList.cpp:1662 msgid "Add Generic Subobject" -msgstr "일반 하위 개체 추가" +msgstr "기본이 되는 하위 객체(object) 추가" #: src/slic3r/GUI/GUI_ObjectList.cpp:1669 msgid "Generic" @@ -1660,7 +1622,7 @@ msgstr "일반" #: src/slic3r/GUI/GUI_ObjectList.cpp:1770 #: src/slic3r/GUI/GUI_ObjectList.cpp:1872 msgid "Last instance of an object cannot be deleted." -msgstr "개체의 마지막 복제본를 삭제할 수 없습니다." +msgstr "객체(object)의 마지막 복제본를 삭제할 수 없습니다." #: src/slic3r/GUI/GUI_ObjectList.cpp:1782 msgid "Delete Settings" @@ -1668,7 +1630,7 @@ msgstr "설정 삭제" #: src/slic3r/GUI/GUI_ObjectList.cpp:1806 msgid "Delete All Instances from Object" -msgstr "개체에서 모든 복제본 삭제" +msgstr "객체(object)에서 모든 복제본 삭제" #: src/slic3r/GUI/GUI_ObjectList.cpp:1822 msgid "Delete Layers Range" @@ -1676,25 +1638,23 @@ msgstr "레이어 범위 삭제" #: src/slic3r/GUI/GUI_ObjectList.cpp:1853 msgid "From Object List You can't delete the last solid part from object." -msgstr "개체 목록에서 개체에서 마지막 솔리드 부품을 삭제할 수 없습니다." +msgstr "객체(object) 리스트에서 마지막 부품(Part)을 삭제할 수 없습니다." #: src/slic3r/GUI/GUI_ObjectList.cpp:1857 msgid "Delete Subobject" -msgstr "하위 개체 삭제" +msgstr "하위 객체(object) 삭제" #: src/slic3r/GUI/GUI_ObjectList.cpp:1876 msgid "Delete Instance" msgstr "복제본 삭제" #: src/slic3r/GUI/GUI_ObjectList.cpp:1900 src/slic3r/GUI/Plater.cpp:2793 -msgid "" -"The selected object couldn't be split because it contains only one part." -msgstr "" -"선택한 오브젝트는 파트 하나만 포함되어 있기 때문에 분할 할 수 없습니다." +msgid "The selected object couldn't be split because it contains only one part." +msgstr "선택한 객체(object)는 부품(Part) 하나만 포함되어 있기 때문에 분할 할 수 없습니다." #: src/slic3r/GUI/GUI_ObjectList.cpp:1904 msgid "Split to Parts" -msgstr "파트로 분할" +msgstr "부품(Part)으로 분할" #: src/slic3r/GUI/GUI_ObjectList.cpp:1950 msgid "Add Layers" @@ -1706,15 +1666,15 @@ msgstr "그룹 조작" #: src/slic3r/GUI/GUI_ObjectList.cpp:2087 msgid "Object manipulation" -msgstr "개체 조작" +msgstr "객체(object) 조작" #: src/slic3r/GUI/GUI_ObjectList.cpp:2100 msgid "Object Settings to modify" -msgstr "수정할 개체 설정" +msgstr "수정할 객체(object) 설정" #: src/slic3r/GUI/GUI_ObjectList.cpp:2104 msgid "Part Settings to modify" -msgstr "수정할 부품 설정" +msgstr "수정할 부품(Part) 설정" #: src/slic3r/GUI/GUI_ObjectList.cpp:2109 msgid "Layer range Settings to modify" @@ -1722,7 +1682,7 @@ msgstr "레이어 범위 설정 수정" #: src/slic3r/GUI/GUI_ObjectList.cpp:2115 msgid "Part manipulation" -msgstr "파트 조작" +msgstr "부품(Part) 조작" #: src/slic3r/GUI/GUI_ObjectList.cpp:2121 msgid "Instance manipulation" @@ -1730,7 +1690,7 @@ msgstr "복제본 제거" #: src/slic3r/GUI/GUI_ObjectList.cpp:2128 msgid "Layers Editing" -msgstr "레이어층을 편집" +msgstr "레이어들 편집" #: src/slic3r/GUI/GUI_ObjectList.cpp:2128 msgid "Layer Editing" @@ -1738,11 +1698,11 @@ msgstr "레이어 편집" #: src/slic3r/GUI/GUI_ObjectList.cpp:2303 msgid "Delete Selected Item" -msgstr "선택한 항목 삭제" +msgstr "선택한 항목(item) 삭제" #: src/slic3r/GUI/GUI_ObjectList.cpp:2415 msgid "Delete Selected" -msgstr "선택된 것을 삭제" +msgstr "선택된 것 삭제" #: src/slic3r/GUI/GUI_ObjectList.cpp:2484 #: src/slic3r/GUI/GUI_ObjectList.cpp:2513 @@ -1764,7 +1724,7 @@ msgstr "목록에서 선택-추가" #: src/slic3r/GUI/GUI_ObjectList.cpp:2993 msgid "Object or Instance" -msgstr "개체 또는 복제본" +msgstr "객체(object) 또는 복제본" #: src/slic3r/GUI/GUI_ObjectList.cpp:2994 #: src/slic3r/GUI/GUI_ObjectList.cpp:3127 @@ -1782,7 +1742,7 @@ msgstr "지원 되지 않는 선택" #: src/slic3r/GUI/GUI_ObjectList.cpp:2997 #, c-format msgid "You started your selection with %s Item." -msgstr "%s 항목으로 선택을 시작 했습니다." +msgstr "%s 선택된 항목으로 시작합니다." #: src/slic3r/GUI/GUI_ObjectList.cpp:2998 #, c-format @@ -1791,7 +1751,7 @@ msgstr "이 모드에서는 %s의 다른 %s 항목만 선택할 수 있습니다 #: src/slic3r/GUI/GUI_ObjectList.cpp:3001 msgid "of a current Object" -msgstr "현재 개체의" +msgstr "현재 객체(object)의" #: src/slic3r/GUI/GUI_ObjectList.cpp:3006 #: src/slic3r/GUI/GUI_ObjectList.cpp:3081 src/slic3r/GUI/Plater.cpp:126 @@ -1800,7 +1760,7 @@ msgstr "정보" #: src/slic3r/GUI/GUI_ObjectList.cpp:3122 msgid "You can't change a type of the last solid part of the object." -msgstr "객체의 마지막 솔리드 부품 유형은 변경할 수 없습니다." +msgstr "객체(object)의 마지막 부품(Part) 유형은 변경할 수 없습니다." #: src/slic3r/GUI/GUI_ObjectList.cpp:3127 msgid "Modifier" @@ -1820,11 +1780,11 @@ msgstr "형식:" #: src/slic3r/GUI/GUI_ObjectList.cpp:3129 msgid "Select type of part" -msgstr "부품 유형 선택" +msgstr "부품(Part) 유형 선택" #: src/slic3r/GUI/GUI_ObjectList.cpp:3134 msgid "Change Part Type" -msgstr "부품 유형 변경" +msgstr "부품(Part) 유형 변경" #: src/slic3r/GUI/GUI_ObjectList.cpp:3368 msgid "Enter new name" @@ -1851,7 +1811,7 @@ msgstr "선택한 항목에 대한 압출기(익스트루더) 설정" #: src/slic3r/GUI/GUI_ObjectList.cpp:3499 msgid "Select extruder number for selected objects and/or parts" -msgstr "선택한 객체 및 부품에 대한 압출기(익스트루더) 번호 선택" +msgstr "선택한 객체(object) 및 부품(Part)에 대한 압출기(익스트루더) 번호 선택" #: src/slic3r/GUI/GUI_ObjectList.cpp:3512 msgid "Select extruder number:" @@ -1877,11 +1837,11 @@ msgstr "변환이 수행될 좌표 공간을 선택 합니다." #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:125 msgid "Object Manipulation" -msgstr "개체 조작" +msgstr "객체(object) 조작" #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:176 msgid "Object name" -msgstr "개체 이름" +msgstr "객체(object) 이름" #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:212 #, c-format @@ -1895,7 +1855,7 @@ msgstr "미러 설정" #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:285 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:290 msgid "Reset scale" -msgstr "스케일 재설정" +msgstr "크기 재설정" #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:303 msgid "Reset rotation" @@ -1908,7 +1868,7 @@ msgstr "회전 재설정" #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:340 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:355 msgid "Drop to bed" -msgstr "잠자리에 들기" +msgstr "배드를 아래로 내리기" #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:388 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:443 @@ -1929,10 +1889,8 @@ msgid "Translate" msgstr "번역" #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:554 -msgid "" -"You cann't use non-uniform scaling mode for multiple objects/parts selection" -msgstr "" -"여러 객체/부품 선택에 는 균일하지 않은 배율 조정 모드를 사용할 수 없습니다." +msgid "You cann't use non-uniform scaling mode for multiple objects/parts selection" +msgstr "여러 객체(object)/부품(Part) 선택에 는 균일하지 않은 배율 조정 모드를 사용할 수 없습니다." #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:715 msgid "Set Position" @@ -1948,15 +1906,12 @@ msgstr "축척 설정" #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:895 msgid "" -"The currently manipulated object is tilted (rotation angles are not " -"multiples of 90°).\n" -"Non-uniform scaling of tilted objects is only possible in the World " -"coordinate system,\n" +"The currently manipulated object is tilted (rotation angles are not multiples of 90°).\n" +"Non-uniform scaling of tilted objects is only possible in the World coordinate system,\n" "once the rotation is embedded into the object coordinates." msgstr "" -"현재 조작 된 오브젝트가 기울어져 있습니다 (회전 각도가 90 °의 배수가 아님).\n" -"기울어진 오브젝트의 비균일 배율 조정은 표준 좌표계에서만 가능 합니다.\n" -"회전이 오브젝트 좌표로 삽입되면." +"현재 조작 된 객체(object)가 기울어져 있습니다 (회전 각도가 90°의 배수가 아님).\n" +"기울어진 객체(object)의 배율 조정은 기본 좌표에서만 가능 합니다." #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:898 msgid "" @@ -1964,7 +1919,7 @@ msgid "" "Do you want to proceed?" msgstr "" "이 작업은 되돌릴수 없습니다.\n" -"계속 하 시겠습니까?" +"계속 하시겠습니까?" #: src/slic3r/GUI/GUI_ObjectSettings.cpp:58 msgid "Additional Settings" @@ -2067,7 +2022,7 @@ msgstr "스커트" #: src/slic3r/GUI/GUI_Preview.cpp:244 src/libslic3r/PrintConfig.cpp:1954 #: src/libslic3r/GCode/PreviewData.cpp:173 msgid "Support material interface" -msgstr "서포트 재료 인터페이스" +msgstr "서포트 접점" #: src/slic3r/GUI/GUI_Preview.cpp:245 src/slic3r/GUI/Tab.cpp:1141 #: src/libslic3r/GCode/PreviewData.cpp:174 @@ -2088,23 +2043,23 @@ msgstr "리트랙션 취소" #: src/slic3r/GUI/GUI_Preview.cpp:253 msgid "Shells" -msgstr "쉘" +msgstr "쉘(Shells)" #: src/slic3r/GUI/KBShortcutsDialog.cpp:13 src/slic3r/GUI/MainFrame.cpp:672 msgid "Keyboard Shortcuts" -msgstr "키보드 바로 가기" +msgstr "키보드 단축기" #: src/slic3r/GUI/KBShortcutsDialog.cpp:104 msgid "Open project STL/OBJ/AMF/3MF with config, delete bed" -msgstr "구성으로 프로젝트 STL/OBJ/AMF/3MF 열기, 배드 삭제" +msgstr "프로젝트 구성 열기(STL/OBJ/AMF/3MF), 배드 삭제" #: src/slic3r/GUI/KBShortcutsDialog.cpp:105 msgid "Import STL/OBJ/AMF/3MF without config, keep bed" -msgstr "구성 없이 STL/OBJ/AMF/3MF 가져오기, 배드 유지" +msgstr "구성 없이 가져오기(STL/OBJ/AMF/3MF), 배드 유지" #: src/slic3r/GUI/KBShortcutsDialog.cpp:106 msgid "Load Config from .ini/amf/3mf/gcode" -msgstr ".Ini/amf/3mf/gcode에서 구성 로드" +msgstr ".Ini/amf/3mf/gcode에서 구성 가져오기" #: src/slic3r/GUI/KBShortcutsDialog.cpp:107 src/slic3r/GUI/Plater.cpp:822 #: src/slic3r/GUI/Plater.cpp:4687 src/libslic3r/PrintConfig.cpp:3127 @@ -2117,7 +2072,7 @@ msgstr "프로젝트 저장 (3MF)" #: src/slic3r/GUI/KBShortcutsDialog.cpp:109 msgid "Load Config from .ini/amf/3mf/gcode and merge" -msgstr ".Ini/amf/3mf/gcode 및 병합에서 구성 로드" +msgstr ".Ini/amf/3mf/gcode 및 병합에서 구성 가져오기" #: src/slic3r/GUI/KBShortcutsDialog.cpp:110 msgid "(Re)slice" @@ -2125,19 +2080,19 @@ msgstr "(Re)슬라이스" #: src/slic3r/GUI/KBShortcutsDialog.cpp:113 msgid "Select Plater Tab" -msgstr "선택 및 플래이트 탭" +msgstr "선택 및 플래이터 탭" #: src/slic3r/GUI/KBShortcutsDialog.cpp:115 msgid "Select Print Settings Tab" -msgstr "인쇄 설정 탭을 선택 합니다" +msgstr "인쇄 설정을 선택 합니다" #: src/slic3r/GUI/KBShortcutsDialog.cpp:116 msgid "Select Filament Settings Tab" -msgstr "필라멘트 설정 탭 선택" +msgstr "필라멘트 설정을 선택" #: src/slic3r/GUI/KBShortcutsDialog.cpp:117 msgid "Select Printer Settings Tab" -msgstr "프린터 설정 탭을 선택 합니다" +msgstr "프린터 설정을 선택 합니다" #: src/slic3r/GUI/KBShortcutsDialog.cpp:118 msgid "Switch to 3D" @@ -2154,7 +2109,7 @@ msgstr "기본 설정" #: src/slic3r/GUI/KBShortcutsDialog.cpp:121 #: src/slic3r/GUI/PrintHostDialogs.cpp:136 msgid "Print host upload queue" -msgstr "호스트 업로드 대기열 인쇄" +msgstr "프린터 호스트 업로드 대기" #: src/slic3r/GUI/KBShortcutsDialog.cpp:122 msgid "Camera view" @@ -2162,19 +2117,19 @@ msgstr "카메라 뷰" #: src/slic3r/GUI/KBShortcutsDialog.cpp:123 msgid "Add Instance of the selected object" -msgstr "선택한 개체의 복제본 추가" +msgstr "선택한 객체(object)의 복제본 추가" #: src/slic3r/GUI/KBShortcutsDialog.cpp:124 msgid "Remove Instance of the selected object" -msgstr "선택한 개체의 복제본 제거" +msgstr "선택한 객체(object)의 복제본 제거" #: src/slic3r/GUI/KBShortcutsDialog.cpp:125 msgid "Show keyboard shortcuts list" -msgstr "바로 가기 키 목록 표시" +msgstr "단축 키 목록 표시" #: src/slic3r/GUI/KBShortcutsDialog.cpp:126 msgid "Press to select multiple object or move multiple object with mouse" -msgstr "여러 개체를 선택 하거나 마우스로 여러 개체를 이동 하려면 누릅니다" +msgstr "여러 객체(object)를 선택 하거나 마우스로 여러 객체(object)를 이동 하려면 누릅니다" #: src/slic3r/GUI/KBShortcutsDialog.cpp:128 msgid "Main Shortcuts" @@ -2182,7 +2137,7 @@ msgstr "주요 단축키" #: src/slic3r/GUI/KBShortcutsDialog.cpp:135 msgid "Select All objects" -msgstr "모든 객체 선택" +msgstr "모든 객체(object) 선택" #: src/slic3r/GUI/KBShortcutsDialog.cpp:136 msgid "Delete selected" @@ -2202,27 +2157,27 @@ msgstr "클립보드에서 붙여넣기" #: src/slic3r/GUI/KBShortcutsDialog.cpp:140 msgid "Gizmo move" -msgstr "객체 이동" +msgstr "개체(Gizmo) 이동" #: src/slic3r/GUI/KBShortcutsDialog.cpp:141 msgid "Gizmo scale" -msgstr "객체 배율" +msgstr "개체(Gizmo) 배율" #: src/slic3r/GUI/KBShortcutsDialog.cpp:142 msgid "Gizmo rotate" -msgstr "객체 회전" +msgstr "개체(Gizmo) 회전" #: src/slic3r/GUI/KBShortcutsDialog.cpp:143 msgid "Gizmo cut" -msgstr "기즈모 자르기" +msgstr "개체(Gizmo) 자르기" #: src/slic3r/GUI/KBShortcutsDialog.cpp:144 msgid "Gizmo Place face on bed" -msgstr "기즈모를 배드위에서" +msgstr "개체(Gizmo)를 배드위로" #: src/slic3r/GUI/KBShortcutsDialog.cpp:145 msgid "Gizmo SLA support points" -msgstr "객체 SLA 지원 포인트" +msgstr "SLA 개체(Gizmo) 서포트 지점들" #: src/slic3r/GUI/KBShortcutsDialog.cpp:146 #, c-format @@ -2232,16 +2187,14 @@ msgid "" "or to snap by 1mm in Gizmo move" msgstr "" "활성화된 사각형을 선택합니다.\n" -"5% in 객체 크기를 스냅에 맞춰 조절합니다.\n" -"1mm 씩 객체를 스냅에 맞추 이동합니다." +"5% in 객체(object) 크기를 스냅에 맞춰 조절합니다.\n" +"1mm 씩 객체(object)를 스냅에 맞추 이동합니다." #: src/slic3r/GUI/KBShortcutsDialog.cpp:147 msgid "" "Press to scale selection to fit print volume\n" "in Gizmo scale" -msgstr "" -"인쇄 볼륨에 맞게 선택 크기를 조정하려면 누릅니다.\n" -"기즈모 스케일" +msgstr "개체(Gizmo)크기를 인쇄 볼륨에 맞게 조정하려면 누릅니다." #: src/slic3r/GUI/KBShortcutsDialog.cpp:148 msgid "" @@ -2249,8 +2202,7 @@ msgid "" "or to scale or rotate selected objects\n" "around their own center" msgstr "" -"자신의 중심 주변\n" -"선택한 개체의 크기를 조정 하거나\n" +"중심 주변으로. 선택한 개체의 크기를 조정 하거나 \n" "회전 하려면 누릅니다" #: src/slic3r/GUI/KBShortcutsDialog.cpp:149 @@ -2267,11 +2219,11 @@ msgstr "배드 확대" #: src/slic3r/GUI/KBShortcutsDialog.cpp:152 msgid "Zoom to all objects in scene, if none selected" -msgstr "장면의 모든 오브젝트로 확대/축소 (선택 하지 않은 경우)" +msgstr "모든 객체(object)를 확대/축소 (선택 하지 않은 경우)" #: src/slic3r/GUI/KBShortcutsDialog.cpp:153 msgid "Zoom to selected object" -msgstr "선택한 개체로 확대/축소" +msgstr "선택한 객체(object)를 확대/축소" #: src/slic3r/GUI/KBShortcutsDialog.cpp:154 msgid "Zoom in" @@ -2279,15 +2231,15 @@ msgstr "확대" #: src/slic3r/GUI/KBShortcutsDialog.cpp:155 msgid "Zoom out" -msgstr "줌 아웃" +msgstr "축소" #: src/slic3r/GUI/KBShortcutsDialog.cpp:156 msgid "Unselect gizmo / Clear selection" -msgstr "기즈모 선택을 취소 하거나 지우기" +msgstr "개체(Gizmo) 선택을 취소 하거나 지우기" #: src/slic3r/GUI/KBShortcutsDialog.cpp:158 msgid "Toggle picking pass texture rendering on/off" -msgstr "선택 패스 텍스처 렌더링 켜기/끄기 전환" +msgstr "선택된 텍스처 렌더링을 켜거나 끄기" #: src/slic3r/GUI/KBShortcutsDialog.cpp:161 msgid "Plater Shortcuts" @@ -2319,11 +2271,11 @@ msgstr "미리보기 단축기" #: src/slic3r/GUI/KBShortcutsDialog.cpp:187 msgid "Move current slider thumb Up" -msgstr "현재 마우스 휠 슬라이더를 위로 이동" +msgstr "현재 마우스 휠을 위로 이동" #: src/slic3r/GUI/KBShortcutsDialog.cpp:188 msgid "Move current slider thumb Down" -msgstr "현재 마우스 휠 슬라이더를 아래로 이동" +msgstr "현재 마우스 휠을 아래로 이동" #: src/slic3r/GUI/KBShortcutsDialog.cpp:189 msgid "Arrow Left" @@ -2343,23 +2295,19 @@ msgstr "마우스 휠을 아래로 움직여 설정" #: src/slic3r/GUI/KBShortcutsDialog.cpp:191 msgid "Add color change marker for current layer" -msgstr "현재 레이어의 색상 변경 마커 추가" +msgstr "현재 레이어의 색상을 변경할 마커 추가" #: src/slic3r/GUI/KBShortcutsDialog.cpp:192 msgid "Delete color change marker for current layer" -msgstr "현재 레이어의 색상 변경 마커 삭제" +msgstr "현재 레이어의 색상을 변경할 마커 삭제" #: src/slic3r/GUI/KBShortcutsDialog.cpp:194 msgid "Layers Slider Shortcuts" msgstr "레이어 슬라이더 단축키" #: src/slic3r/GUI/MainFrame.cpp:62 -msgid "" -" - Remember to check for updates at http://github.com/prusa3d/PrusaSlicer/" -"releases" -msgstr "" -" -http://github.com/prusa3d/slic3r/releases에서 업데이트를 확인하는 것을 잊" -"지 마십시오" +msgid " - Remember to check for updates at http://github.com/prusa3d/PrusaSlicer/releases" +msgstr " -http://github.com/prusa3d/slic3r/releases에서 업데이트 확인하는 것을 잊지 마십시오" #: src/slic3r/GUI/MainFrame.cpp:157 msgid "based on Slic3r" @@ -2444,7 +2392,7 @@ msgstr "번들 &설정 가져오기" #: src/slic3r/GUI/MainFrame.cpp:457 msgid "Load presets from a bundle" -msgstr "번들에서 미리 설정로드" +msgstr "미리 설정 번들값 가져오기" #: src/slic3r/GUI/MainFrame.cpp:459 msgid "&Import" @@ -2460,7 +2408,7 @@ msgstr "현재 플레이터를 G 코드로 내보내기" #: src/slic3r/GUI/MainFrame.cpp:466 src/slic3r/GUI/MainFrame.cpp:709 msgid "S&end G-code" -msgstr "S&엔드 G- 코드" +msgstr "S&end G- 코드" #: src/slic3r/GUI/MainFrame.cpp:466 msgid "Send to print current plate as G-code" @@ -2488,7 +2436,7 @@ msgstr "AMF로 내보내기" #: src/slic3r/GUI/MainFrame.cpp:477 msgid "Export current plate as AMF" -msgstr "현재 플레이터를AMF로 내보내기" +msgstr "현재 플레이터를 AMF로 내보내기" #: src/slic3r/GUI/MainFrame.cpp:481 msgid "Export &Config" @@ -2524,7 +2472,7 @@ msgstr "빠른 슬라이스 및 다른 이름으로 저장" #: src/slic3r/GUI/MainFrame.cpp:497 msgid "Slice a file into a G-code, save as" -msgstr "파일을 G 코드로 분할하고 다음으로 저장" +msgstr "파일을 G 코드로 분할하고 다른 이름으로 저장" #: src/slic3r/GUI/MainFrame.cpp:503 msgid "Repeat Last Quick Slice" @@ -2565,15 +2513,15 @@ msgstr "&모두 선택 " #: src/slic3r/GUI/MainFrame.cpp:544 msgid "Selects all objects" -msgstr "모든 개체를 선택 합니다" +msgstr "모든 객체(object)를 선택 합니다" #: src/slic3r/GUI/MainFrame.cpp:546 msgid "D&eselect all" -msgstr "선택 취소 D&select+" +msgstr "모든 선택 취소 D&select" #: src/slic3r/GUI/MainFrame.cpp:547 msgid "Deselects all objects" -msgstr "모든 객체 선택 취소" +msgstr "모든 객체(object) 선택 취소" #: src/slic3r/GUI/MainFrame.cpp:550 msgid "&Delete selected" @@ -2589,7 +2537,7 @@ msgstr "전부 지움 " #: src/slic3r/GUI/MainFrame.cpp:554 msgid "Deletes all objects" -msgstr "모든 객체를 삭제 합니다" +msgstr "모든 객체(object)를 삭제 합니다" #: src/slic3r/GUI/MainFrame.cpp:558 msgid "&Undo" @@ -2771,7 +2719,7 @@ msgstr "폴더 표시 및 구성" #: src/slic3r/GUI/MainFrame.cpp:665 msgid "Show user configuration folder (datadir)" -msgstr "사용자 구성 폴더 표시 (datadir)" +msgstr "사용자 구성 폴더를 표시 (datadir)" #: src/slic3r/GUI/MainFrame.cpp:667 msgid "Report an I&ssue" @@ -2906,11 +2854,11 @@ msgstr "구성을 저장 :" #: src/slic3r/GUI/MainFrame.cpp:919 src/slic3r/GUI/MainFrame.cpp:983 msgid "Select configuration to load:" -msgstr "로드 할 구성 선택 :" +msgstr "불러올 구성 선택 :" #: src/slic3r/GUI/MainFrame.cpp:956 msgid "Save presets bundle as:" -msgstr "이전 설정 번들을 다음과 같이 저장 :" +msgstr "이전 번들 설정을 다음과 같이 저장 :" #: src/slic3r/GUI/MainFrame.cpp:1007 #, c-format @@ -3003,11 +2951,8 @@ msgid "Brim" msgstr "브림" #: src/slic3r/GUI/Plater.cpp:507 -msgid "" -"This flag enables the brim that will be printed around each object on the " -"first layer." -msgstr "" -"이 플래그는 첫 번째 레이어의 각 개체 주위에 인쇄 될 브림을 활성화합니다." +msgid "This flag enables the brim that will be printed around each object on the first layer." +msgstr "첫 번째 레이어의 각 객체(object) 주위에 인쇄 될 브림을 활성화합니다." #: src/slic3r/GUI/Plater.cpp:515 msgid "Purging volumes" @@ -3041,7 +2986,7 @@ msgstr "프린터로 보내기" #: src/slic3r/GUI/Plater.cpp:823 src/slic3r/GUI/Plater.cpp:2933 #: src/slic3r/GUI/Plater.cpp:4421 msgid "Slice now" -msgstr "지금 자르기" +msgstr "바로 슬라이스" #: src/slic3r/GUI/Plater.cpp:963 msgid "Hold Shift to Slice & Export G-code" @@ -3059,12 +3004,8 @@ msgstr "오류자동수정 (%d errors)" #: src/slic3r/GUI/Plater.cpp:1076 #, c-format -msgid "" -"%d degenerate facets, %d edges fixed, %d facets removed, %d facets added, %d " -"facets reversed, %d backwards edges" -msgstr "" -"%d 면 고정, %d 모서리 고정, %d 면 제거, %d 면 추가, %d 면 반전, %d 후방 모서" -"리" +msgid "%d degenerate facets, %d edges fixed, %d facets removed, %d facets added, %d facets reversed, %d backwards edges" +msgstr "%d 면 고정, %d 모서리 고정, %d 면 제거, %d 면 추가, %d 면 반전, %d 후방 모서리" #: src/slic3r/GUI/Plater.cpp:1086 msgid "Yes" @@ -3076,7 +3017,7 @@ msgstr "사용 재료 (ml)" #: src/slic3r/GUI/Plater.cpp:1112 msgid "object(s)" -msgstr "개체(들)" +msgstr "객체(object)" #: src/slic3r/GUI/Plater.cpp:1112 msgid "supports and pad" @@ -3084,7 +3025,7 @@ msgstr "지지대 및 패드" #: src/slic3r/GUI/Plater.cpp:1137 src/slic3r/GUI/Plater.cpp:1152 msgid "objects" -msgstr "개체" +msgstr "객체들(objects)" #: src/slic3r/GUI/Plater.cpp:1137 src/slic3r/GUI/Plater.cpp:1152 msgid "wipe tower" @@ -3096,7 +3037,7 @@ msgstr "일반 모드" #: src/slic3r/GUI/Plater.cpp:1171 src/slic3r/GUI/Plater.cpp:1180 msgid "Color " -msgstr "색" +msgstr "색(Color) " #: src/slic3r/GUI/Plater.cpp:1176 msgid "stealth mode" @@ -3112,7 +3053,7 @@ msgstr "파일 로드" #: src/slic3r/GUI/Plater.cpp:1503 msgid "ERROR: not enough resources to execute a new job." -msgstr "오류: 새 작업을 실행하기에 충분한 리소스가 아닙니다." +msgstr "오류: 새 작업을 실행하기에 충분한 리소스가 없습니다." #: src/slic3r/GUI/Plater.cpp:2056 msgid "New Project" @@ -3128,37 +3069,28 @@ msgid "Processing input file %s\n" msgstr "입력 파일 처리 %s\n" #: src/slic3r/GUI/Plater.cpp:2211 -msgid "" -"You can't to load SLA project if there is at least one multi-part object on " -"the bed" -msgstr "" -"침대에 다중 부품 개체가 하나 이상 있는 경우 SLA 프로젝트를 로드할 수 없습니" -"다." +msgid "You can't to load SLA project if there is at least one multi-part object on the bed" +msgstr "침대에 다중 부품(Part) 객체(object)가 하나 이상 있는 경우 SLA 프로젝트를 로드할 수 없습니다." #: src/slic3r/GUI/Plater.cpp:2212 src/slic3r/GUI/Tab.cpp:3064 msgid "Please check your object list before preset changing." -msgstr "사전 설정을 변경 하기 전에 개체 목록을 확인 하십시오." +msgstr "사전 설정을 변경 하기 전에 객체(object) 목록을 확인 하십시오." #: src/slic3r/GUI/Plater.cpp:2255 msgid "" -"This file contains several objects positioned at multiple heights. Instead " -"of considering them as multiple objects, should I consider\n" +"This file contains several objects positioned at multiple heights. Instead of considering them as multiple objects, should I consider\n" "this file as a single object having multiple parts?\n" msgstr "" -"이 파일에는 여러 높이에 위치한 여러 객체가 들어 있습니다. 여러 객체로 간주하" -"는 대신,\n" -"이 파일은 여러 부분을 갖는 단일 객체로 보입니까?\n" +"이 파일에는 여러 높이마다 객체(object)가 있습니다. 여러 객체(object)로 간주하는 대신,\n" +"이 파일은 여러 부품을 갖는 단일 객체(object)로 보입니까?\n" #: src/slic3r/GUI/Plater.cpp:2258 src/slic3r/GUI/Plater.cpp:2310 msgid "Multi-part object detected" -msgstr "다중 부품 객체가 감지" +msgstr "다중 부품(Part) 객체(object)가 감지" #: src/slic3r/GUI/Plater.cpp:2265 -msgid "" -"This file cannot be loaded in a simple mode. Do you want to switch to an " -"advanced mode?\n" -msgstr "" -"이 파일은 단순 모드에서 로드할 수 없습니다. 고급 모드로 전환 하시겠습니까?\n" +msgid "This file cannot be loaded in a simple mode. Do you want to switch to an advanced mode?\n" +msgstr "이 파일은 기본 모드에서 로드할 수 없습니다. 고급 모드로 전환 하시겠습니까?\n" #: src/slic3r/GUI/Plater.cpp:2266 msgid "Detected advanced data" @@ -3166,10 +3098,8 @@ msgstr "감지된 고급 데이터" #: src/slic3r/GUI/Plater.cpp:2287 #, c-format -msgid "" -"You can't to add the object(s) from %s because of one or some of them " -"is(are) multi-part" -msgstr "멀티파트 하나 또는 그 중 일부 때문에 %s에서 개체를 추가 할 수 없습니다" +msgid "You can't to add the object(s) from %s because of one or some of them is(are) multi-part" +msgstr "다중 부품(Part) 하나 또는 그 중 일부 때문에 %s에서 객체(object)를 추가 할 수 없습니다" #: src/slic3r/GUI/Plater.cpp:2307 msgid "" @@ -3177,23 +3107,21 @@ msgid "" "Instead of considering them as multiple objects, should I consider\n" "these files to represent a single object having multiple parts?\n" msgstr "" -"다중 재료 프린터에 대해 여러 객체가로드되었습니다.\n" -"여러 객체로 간주하는 대신,\n" -"이 파일들은 여러 부분을 갖는 단일 객체를 나타낼 수 있습니까?\n" +"다중 재료 프린터에 대해 여러 객체(object)가로드되었습니다.\n" +"여러 객체(object)로 간주하는 대신,\n" +"이 파일들은 여러 부분을 갖는 단일 객체(object)를 나타낼 수 있습니까?\n" #: src/slic3r/GUI/Plater.cpp:2323 msgid "Loaded" msgstr "로드(loaded)" #: src/slic3r/GUI/Plater.cpp:2418 -msgid "" -"Your object appears to be too large, so it was automatically scaled down to " -"fit your print bed." -msgstr "개체가 너무 커서 인쇄물에 맞게 자동으로 축소되었습니다." +msgid "Your object appears to be too large, so it was automatically scaled down to fit your print bed." +msgstr "객체(object)가 너무 커서 인쇄물에 맞게 자동으로 축소되었습니다." #: src/slic3r/GUI/Plater.cpp:2419 msgid "Object too large?" -msgstr "개체가 너무 큽니까?" +msgstr "객체(object)가 너무 큽니까?" #: src/slic3r/GUI/Plater.cpp:2476 msgid "Export STL file:" @@ -3209,7 +3137,7 @@ msgstr "다른 이름으로 파일 저장:" #: src/slic3r/GUI/Plater.cpp:2592 msgid "Delete Object" -msgstr "오브젝트 지우기" +msgstr "객체(object) 지우기" #: src/slic3r/GUI/Plater.cpp:2603 msgid "Reset Project" @@ -3229,8 +3157,7 @@ msgstr "정렬" #: src/slic3r/GUI/Plater.cpp:2712 msgid "Could not arrange model objects! Some geometries may be invalid." -msgstr "" -"모델 개체를 정렬할 수 없습니다. 일부 형상은 유효 하지 않을 수 있습니다." +msgstr "모델 객체(object)를 정렬할 수 없습니다. 일부 형상은 유효 하지 않을 수 있습니다." #: src/slic3r/GUI/Plater.cpp:2718 msgid "Arranging canceled." @@ -3253,16 +3180,12 @@ msgid "Orientation found." msgstr "방향을 찾았습니다." #: src/slic3r/GUI/Plater.cpp:2785 -msgid "" -"The selected object can't be split because it contains more than one volume/" -"material." -msgstr "" -"선택한 객체는 둘 이상의 볼륨 / 재료가 포함되어 있기 때문에 분할 할 수 없습니" -"다." +msgid "The selected object can't be split because it contains more than one volume/material." +msgstr "선택한 객체(object)는 둘 이상의 부품/재료가 포함되어 있기 때문에 분할 할 수 없습니다." #: src/slic3r/GUI/Plater.cpp:2796 msgid "Split to Objects" -msgstr "객체로 분할" +msgstr "객체(object)로 분할" #: src/slic3r/GUI/Plater.cpp:2918 msgid "Invalid data" @@ -3303,11 +3226,11 @@ msgstr "복사본 늘리기" #: src/slic3r/GUI/Plater.cpp:3467 src/slic3r/GUI/Plater.cpp:3486 msgid "Remove the selected object" -msgstr "선택한 객체 제거" +msgstr "선택한 객체(object) 제거" #: src/slic3r/GUI/Plater.cpp:3473 msgid "Place one more copy of the selected object" -msgstr "선택한 객체를 하나 더 복사합니다" +msgstr "선택한 객체(object)를 하나 더 복사합니다" #: src/slic3r/GUI/Plater.cpp:3475 msgid "Decrease copies" @@ -3315,7 +3238,7 @@ msgstr "복사본 감소" #: src/slic3r/GUI/Plater.cpp:3475 msgid "Remove one copy of the selected object" -msgstr "선택한 객체 복사본 하나 삭제" +msgstr "선택한 객체(object) 복사본 하나 삭제" #: src/slic3r/GUI/Plater.cpp:3477 msgid "Set number of copies" @@ -3323,7 +3246,7 @@ msgstr "복사될 수량 설정" #: src/slic3r/GUI/Plater.cpp:3477 msgid "Change the number of copies of the selected object" -msgstr "선택한 개체의 복사본 수 변경" +msgstr "선택한 객체(object)의 복사본 수 변경" #: src/slic3r/GUI/Plater.cpp:3493 msgid "Reload the selected file from Disk" @@ -3331,7 +3254,7 @@ msgstr "디스크에서 다시 불러오기" #: src/slic3r/GUI/Plater.cpp:3496 msgid "Export the selected object as STL file" -msgstr "선택한 객체를 STL 파일로 내보내기" +msgstr "선택한 객체(object)를 STL 파일로 내보내기" #: src/slic3r/GUI/Plater.cpp:3510 msgid "Along X axis" @@ -3339,7 +3262,7 @@ msgstr "X 축을 따라" #: src/slic3r/GUI/Plater.cpp:3510 msgid "Mirror the selected object along the X axis" -msgstr "선택한 객체를 X 축을 따라 반전합니다" +msgstr "선택한 객체(object)를 X 축을 따라 반전합니다" #: src/slic3r/GUI/Plater.cpp:3512 msgid "Along Y axis" @@ -3347,7 +3270,7 @@ msgstr "Y 축을 따라" #: src/slic3r/GUI/Plater.cpp:3512 msgid "Mirror the selected object along the Y axis" -msgstr "선택한 객체를 Y 축을 따라 반전합니다" +msgstr "선택한 객체(object)를 Y 축을 따라 반전합니다" #: src/slic3r/GUI/Plater.cpp:3514 msgid "Along Z axis" @@ -3355,7 +3278,7 @@ msgstr "Z 축 따라" #: src/slic3r/GUI/Plater.cpp:3514 msgid "Mirror the selected object along the Z axis" -msgstr "선택한 객체를 Z 축을 따라 반전합니다" +msgstr "선택한 객체(object)를 Z 축을 따라 반전합니다" #: src/slic3r/GUI/Plater.cpp:3517 msgid "Mirror the selected object" @@ -3363,19 +3286,19 @@ msgstr "반전할 객제를 선택" #: src/slic3r/GUI/Plater.cpp:3529 msgid "To objects" -msgstr "개체에" +msgstr "객체(object)에" #: src/slic3r/GUI/Plater.cpp:3529 src/slic3r/GUI/Plater.cpp:3549 msgid "Split the selected object into individual objects" -msgstr "선택한 개체를 개별 개체로 분할 합니다." +msgstr "선택한 객체(object)를 개별 객체(object)로 분할 합니다." #: src/slic3r/GUI/Plater.cpp:3531 msgid "To parts" -msgstr "부품에" +msgstr "부품(Part)에" #: src/slic3r/GUI/Plater.cpp:3531 src/slic3r/GUI/Plater.cpp:3563 msgid "Split the selected object into individual sub-parts" -msgstr "선택한 오브젝트를 개별 하위 파트로 분할" +msgstr "선택한 객체(object)를 개별 하위 부품(Part)으로 분할" #: src/slic3r/GUI/Plater.cpp:3534 src/slic3r/GUI/Plater.cpp:3549 #: src/slic3r/GUI/Plater.cpp:3563 src/libslic3r/PrintConfig.cpp:3245 @@ -3384,7 +3307,7 @@ msgstr "쪼개기" #: src/slic3r/GUI/Plater.cpp:3534 msgid "Split the selected object" -msgstr "선택한 개체 분할" +msgstr "선택한 객체(object) 분할" #: src/slic3r/GUI/Plater.cpp:3555 msgid "Optimize orientation" @@ -3392,7 +3315,7 @@ msgstr "방향 최적화" #: src/slic3r/GUI/Plater.cpp:3555 msgid "Optimize the rotation of the object for better print results." -msgstr "더 나은 인쇄 결과를 위해 개체의 회전을 최적화합니다." +msgstr "더 나은 인쇄 결과를 위해 객체(object)의 회전을 최적화합니다." #: src/slic3r/GUI/Plater.cpp:3595 msgid "3D editor view" @@ -3400,35 +3323,31 @@ msgstr "3D 편집화면 보기" #: src/slic3r/GUI/Plater.cpp:3603 src/slic3r/GUI/Tab.cpp:2534 msgid "Preview" -msgstr "프리뷰" +msgstr "미리보기" #: src/slic3r/GUI/Plater.cpp:3831 -msgid "" -"%1% printer was active at the time the target Undo / Redo snapshot was " -"taken. Switching to %1% printer requires reloading of %1% presets." -msgstr "" -"%1% 프린터가 대상 재생 취소/다시 작업 스냅샷을 생성할 때 활성화되었습니다. " -"%1% 프린터로 전환하려면 %1% 사전 설정을 다시 로드해야 합니다." +msgid "%1% printer was active at the time the target Undo / Redo snapshot was taken. Switching to %1% printer requires reloading of %1% presets." +msgstr "%1% 프린터가 대상을 '되돌리기/취소하기' 작업 구성을 생성할 때 활성화되었습니다. %1% 프린터로 전환하려면 %1% 사전 설정을 다시 불러와야 합니다." #: src/slic3r/GUI/Plater.cpp:3992 msgid "Load Project" -msgstr "프로젝트 로드" +msgstr "프로젝트 불러오기" #: src/slic3r/GUI/Plater.cpp:4016 msgid "Import Object" -msgstr "개체 가져오기" +msgstr "객체(object) 가져오기" #: src/slic3r/GUI/Plater.cpp:4020 msgid "Import Objects" -msgstr "객체 가져오기" +msgstr "객체(object) 가져오기" #: src/slic3r/GUI/Plater.cpp:4075 msgid "All objects will be removed, continue ?" -msgstr "모든 개체가 제거 됩니다, 계속합니까?" +msgstr "모든 객체(object)가 제거 됩니다, 계속합니까?" #: src/slic3r/GUI/Plater.cpp:4083 msgid "Delete Selected Objects" -msgstr "선택한 객체 삭제" +msgstr "선택한 객체(object) 삭제" #: src/slic3r/GUI/Plater.cpp:4091 msgid "Increase Instances" @@ -3438,11 +3357,6 @@ msgstr "복제본 늘리기" msgid "Decrease Instances" msgstr "복제본 감소" -#: src/slic3r/GUI/Plater.cpp:4163 -#, c-format -msgid "Set numbers of copies to %d" -msgstr "복사본 수를 %d로 설정" - #: src/slic3r/GUI/Plater.cpp:4193 msgid "Cut by Plane" msgstr "평면으로 절단" @@ -3486,7 +3400,7 @@ msgstr "내보내기" #: src/slic3r/GUI/Plater.cpp:4688 msgid "Send G-code" -msgstr "G 코드 보내기" +msgstr "G-code 보내기" #: src/slic3r/GUI/Plater.cpp:4772 msgid "Paste From Clipboard" @@ -3502,103 +3416,64 @@ msgid "Remember output directory" msgstr "출력 디렉토리 기억하기" #: src/slic3r/GUI/Preferences.cpp:46 -msgid "" -"If this is enabled, Slic3r will prompt the last output directory instead of " -"the one containing the input files." -msgstr "" -"이 옵션을 사용하면 Slic3r은 입력 파일이 들어있는 디렉터리 대신 마지막 출력 디" -"렉터리를 묻습니다." +msgid "If this is enabled, Slic3r will prompt the last output directory instead of the one containing the input files." +msgstr "이 옵션을 사용하면 Slic3r은 입력 파일이 들어있는 디렉터리 대신 마지막 출력 디렉터리를 묻습니다." #: src/slic3r/GUI/Preferences.cpp:52 msgid "Auto-center parts" -msgstr "부품을 자동으로 중심에" +msgstr "부품(Part)을 자동으로 중심에" #: src/slic3r/GUI/Preferences.cpp:54 -msgid "" -"If this is enabled, Slic3r will auto-center objects around the print bed " -"center." -msgstr "이 옵션을 사용하면 Slic3r가 개체를 인쇄판 중앙에 자동으로 배치합니다." +msgid "If this is enabled, Slic3r will auto-center objects around the print bed center." +msgstr "이 옵션을 사용하면 Slic3r가 객체(object)를 인쇄판 중앙에 자동으로 배치합니다." #: src/slic3r/GUI/Preferences.cpp:60 msgid "Background processing" msgstr "백그라운드 프로세싱" #: src/slic3r/GUI/Preferences.cpp:62 -msgid "" -"If this is enabled, Slic3r will pre-process objects as soon as they're " -"loaded in order to save time when exporting G-code." -msgstr "" -"이 사용 하는 경우 Slic3r는 전처리 개체 최대한 빨리 그들이 시간을 절약 하기 위" -"해 로드 G-코드를 내보낼 때." +msgid "If this is enabled, Slic3r will pre-process objects as soon as they're loaded in order to save time when exporting G-code." +msgstr "이 사용 하는 경우 Slic3r는 최대한 빨리 시간을 절약 하기 위해 로드된 G-코드를 내보낸다." #: src/slic3r/GUI/Preferences.cpp:71 -msgid "" -"If enabled, PrusaSlicer will check for the new versions of itself online. " -"When a new version becomes available a notification is displayed at the next " -"application startup (never during program usage). This is only a " -"notification mechanisms, no automatic installation is done." -msgstr "" -"프루사 슬라이서는 온라인의 새로운 버전을 확인합니다. 새 버전을 사용할 수 있게" -"되면 다음 응용 프로그램 시작시 (프로그램 사용 중이 아님) 알림이 표시 됩니다. " -"이는 알림 메커니즘일뿐이며 자동 설치는 수행되지 않습니다." +msgid "If enabled, PrusaSlicer will check for the new versions of itself online. When a new version becomes available a notification is displayed at the next application startup (never during program usage). This is only a notification mechanisms, no automatic installation is done." +msgstr "프루사 슬라이서는 온라인의 새로운 버전을 확인합니다. 새 버전을 사용할 수 있게되면 다음 응용 프로그램 시작시 (프로그램 사용 중이 아님) 알림이 표시 됩니다. 이는 알림 메커니즘일뿐이며 자동 설치는 수행되지 않습니다." #: src/slic3r/GUI/Preferences.cpp:79 -msgid "" -"If enabled, Slic3r downloads updates of built-in system presets in the " -"background. These updates are downloaded into a separate temporary location. " -"When a new preset version becomes available it is offered at application " -"startup." -msgstr "" -"활성화 된 경우 Slic3r은 백그라운드에서 내장 시스템 사전 설정의 업데이트를 다" -"운로드합니다. 이러한 업데이트는 별도의 임시 위치에 다운로드됩니다. 새로운 사" -"전 설정 버전을 사용할 수있게되면 응용 프로그램 시작시 제공됩니다." +msgid "If enabled, Slic3r downloads updates of built-in system presets in the background. These updates are downloaded into a separate temporary location. When a new preset version becomes available it is offered at application startup." +msgstr "활성화 된 경우 Slic3r은 백그라운드에서 내장된 시스템 설정의 업데이트를 다운로드합니다. 이러한 업데이트는 별도의 임시 위치에 다운로드됩니다. 새로운 '사전 설정' 버전을 사용할 수 있게되면 응용 프로그램 시작시 제공됩니다." #: src/slic3r/GUI/Preferences.cpp:84 msgid "Suppress \" - default - \" presets" msgstr "\"- 기본 -\"사전 설정 숨기기" #: src/slic3r/GUI/Preferences.cpp:86 -msgid "" -"Suppress \" - default - \" presets in the Print / Filament / Printer " -"selections once there are any other valid presets available." -msgstr "" -"사용 가능한 다른 유효한 사전 설정이 있으면 인쇄 / 필라멘트 / 프린터 선택에서 " -"\"- 기본 -\"사전 설정을 억제하십시오." +msgid "Suppress \" - default - \" presets in the Print / Filament / Printer selections once there are any other valid presets available." +msgstr "사용 가능한 다른 유효한 '사전 설정'이 있으면 인쇄 / 필라멘트 / 프린터 선택에서 \"- 기본 -\"'사전 설정'을 억제하십시오." #: src/slic3r/GUI/Preferences.cpp:92 msgid "Show incompatible print and filament presets" msgstr "호환 되지 않는 인쇄 및 필라멘트 설정" #: src/slic3r/GUI/Preferences.cpp:94 -msgid "" -"When checked, the print and filament presets are shown in the preset editor " -"even if they are marked as incompatible with the active printer" -msgstr "" -"이 옵션을 선택하면 활성 프린터와 호환되지 않는 것으로 표시된 경우에도 인쇄 " -"및 필라멘트 사전 설정이 사전 설정 편집기에 표시됩니다" +msgid "When checked, the print and filament presets are shown in the preset editor even if they are marked as incompatible with the active printer" +msgstr "이 옵션을 선택하면 프린터와 호환되지 않는 것으로 표시된 경우에도 인쇄 및 필라멘트 '사전 설정'이 '사전 설정' 편집기에 표시됩니다" #: src/slic3r/GUI/Preferences.cpp:101 msgid "Use Retina resolution for the 3D scene" msgstr "3D 장면에 레티나 해상도 사용" #: src/slic3r/GUI/Preferences.cpp:103 -msgid "" -"If enabled, the 3D scene will be rendered in Retina resolution. If you are " -"experiencing 3D performance problems, disabling this option may help." -msgstr "" -"활성화 된 경우 3D 장면은 레티나 해상도로 렌더링 됩니다. 3D 성능 문제가 발생하" -"는 경우, 옵션을 사용하지 않도록 설정 하면 도움이 될 수 있습니다." +msgid "If enabled, the 3D scene will be rendered in Retina resolution. If you are experiencing 3D performance problems, disabling this option may help." +msgstr "활성화 된 경우 3D 장면은 레티나 해상도로 렌더링 됩니다. 3D 성능 문제가 발생하는 경우, 옵션을 사용하지 않도록 설정 하면 도움이 될 수 있습니다." #: src/slic3r/GUI/Preferences.cpp:110 msgid "Use perspective camera" -msgstr "원근 카메라 사용" +msgstr "원근 보기 사용" #: src/slic3r/GUI/Preferences.cpp:112 -msgid "" -"If enabled, use perspective camera. If not enabled, use orthographic camera." -msgstr "" -"이 옵션을 사용하면 원근 카메라를 사용합니다. 활성화되지 않은 경우 직교 카메라" -"를 사용합니다." +msgid "If enabled, use perspective camera. If not enabled, use orthographic camera." +msgstr "이 옵션을 사용하면 원근 보기모드를 사용합니다. 활성화되지 않은 경우 일반 보기를 사용합니다." #: src/slic3r/GUI/Preferences.cpp:117 msgid "Use custom size for toolbar icons" @@ -3649,24 +3524,16 @@ msgid "SLA print" msgstr "SLA 인쇄" #: src/slic3r/GUI/PresetHints.cpp:28 -msgid "" -"If estimated layer time is below ~%1%s, fan will run at %2%%% and print " -"speed will be reduced so that no less than %3%s are spent on that layer " -"(however, speed will never be reduced below %4%mm/s)." -msgstr "" -"예상 레이어 시간이 ~%1%초 미만이면 팬이 %2%%%에서 실행되고 인쇄 속도가 감소되" -"어 해당 레이어에 %3%초 이상 소비됩니다 (단, 속도는 %4%mm/s 이하로 감소하지 않" -"습니다) ." +msgid "If estimated layer time is below ~%1%s, fan will run at %2%%% and print speed will be reduced so that no less than %3%s are spent on that layer (however, speed will never be reduced below %4%mm/s)." +msgstr "예상 레이어 시간이 ~%1%초 미만이면 팬이 %2%%%에서 실행되고 인쇄 속도가 감소되어 해당 레이어에 %3%초 이상 소비됩니다 (단, 속도는 %4%mm/s 이하로 감소하지 않습니다) ." #: src/slic3r/GUI/PresetHints.cpp:35 msgid "" "\n" -"If estimated layer time is greater, but still below ~%1%s, fan will run at a " -"proportionally decreasing speed between %2%%% and %3%%%." +"If estimated layer time is greater, but still below ~%1%s, fan will run at a proportionally decreasing speed between %2%%% and %3%%%." msgstr "" "\n" -"예상 레이어 시간이 더 길지만 ~%1%초 미만인 경우 팬은 %2%%%와 %3%%%사이 비례, " -"감소하는 속도로 실행됩니다." +"예상 레이어 시간이 더 길지만 ~%1%초 미만인 경우 팬은 %2%%%와 %3%%%사이 비례, 감소하는 속도로 실행됩니다." #: src/slic3r/GUI/PresetHints.cpp:39 msgid "" @@ -3722,7 +3589,7 @@ msgstr "서포트" #: src/slic3r/GUI/PresetHints.cpp:212 msgid "support interface" -msgstr "서포트 인터페이스" +msgstr "서포트 접점" #: src/slic3r/GUI/PresetHints.cpp:218 msgid "First layer volumetric" @@ -3758,16 +3625,13 @@ msgid "%3.2f mm³/s at filament speed %3.2f mm/s." msgstr "%3.2f mm³/s 필라멘트 속도는 %3.2f mm/s이다." #: src/slic3r/GUI/PresetHints.cpp:246 -msgid "" -"Recommended object thin wall thickness: Not available due to invalid layer " -"height." -msgstr "" -"권장 객체(object)의 벽(wall) 두께: 잘못된 레이어 높이 때문에 사용할 수 없음." +msgid "Recommended object thin wall thickness: Not available due to invalid layer height." +msgstr "권장 객체(object)의 벽(wall) 두께: 잘못된 레이어 높이 때문에 사용할 수 없음." #: src/slic3r/GUI/PresetHints.cpp:262 #, c-format msgid "Recommended object thin wall thickness for layer height %.2f and" -msgstr "객체 레이어 높이 %.2f 에 권장하는 두깨는 " +msgstr "객체(object) 레이어 높이 %.2f 에 권장하는 두깨는 " #: src/slic3r/GUI/PresetHints.cpp:268 #, c-format @@ -3930,8 +3794,7 @@ msgid "It can't be deleted or modified." msgstr "삭제하거나 수정할 수 없습니다." #: src/slic3r/GUI/Tab.cpp:933 -msgid "" -"Any modifications should be saved as a new preset inherited from this one." +msgid "Any modifications should be saved as a new preset inherited from this one." msgstr "모든 수정 사항은 이 항목에서 받은 기본 설정으로 저장해야합니다." #: src/slic3r/GUI/Tab.cpp:934 @@ -3964,7 +3827,7 @@ msgstr "기본 SLA 인쇄 프로필" #: src/slic3r/GUI/Tab.cpp:1008 src/slic3r/GUI/Tab.cpp:3649 msgid "Layers and perimeters" -msgstr "레이어 및 경계선" +msgstr "레이어 및 둘레" #: src/slic3r/GUI/Tab.cpp:1009 src/slic3r/GUI/Tab.cpp:1257 #: src/libslic3r/PrintConfig.cpp:66 @@ -4065,7 +3928,7 @@ msgstr "출력 파일" #: src/slic3r/GUI/Tab.cpp:1198 src/libslic3r/PrintConfig.cpp:1432 msgid "Post-processing scripts" -msgstr "사후 처리 스크립트" +msgstr "포스트 프로세싱 스크립트" #: src/slic3r/GUI/Tab.cpp:1204 src/slic3r/GUI/Tab.cpp:1205 #: src/slic3r/GUI/Tab.cpp:1716 src/slic3r/GUI/Tab.cpp:1717 @@ -4139,17 +4002,14 @@ msgstr "스파이럴 바이스" #: src/slic3r/GUI/Tab.cpp:1311 msgid "" "The Wipe Tower currently supports the non-soluble supports only\n" -"if they are printed with the current extruder without triggering a tool " -"change.\n" -"(both support_material_extruder and support_material_interface_extruder need " -"to be set to 0).\n" +"if they are printed with the current extruder without triggering a tool change.\n" +"(both support_material_extruder and support_material_interface_extruder need to be set to 0).\n" "\n" "Shall I adjust those settings in order to enable the Wipe Tower?" msgstr "" "와이퍼 타워는 현재 비 가용성 서포트 만 지원합니다.\n" "공구 교환을 트리거하지 않고 현재 압출기로 인쇄 한 경우.\n" -"(support_material_extruder 및 support_material_interface_extruder를 모두 0으" -"로 설정해야 함).\n" +"(support_material_extruder 및 support_material_interface_extruder를 모두 0으로 설정해야 함).\n" "\n" "와이퍼 타워를 사용하려면 이러한 설정을 조정해야합니까?" @@ -4165,7 +4025,7 @@ msgid "" "Shall I synchronize support layers in order to enable the Wipe Tower?" msgstr "" "와이퍼 타워가 가용성 서포트와 함께 작용하기 위해, 서포트 레이어\n" -"객체 레이어와 동기화되어야합니다.\n" +"객체(object) 레이어와 동기화되어야합니다.\n" "\n" "와이퍼 타워를 사용하려면 서포트 레이어를 동기화해야합니까?" @@ -4177,7 +4037,7 @@ msgid "" "Shall I adjust those settings for supports?" msgstr "" "다음 기능을 사용하는 경우 더 나은 작업을 지원합니다.\n" -"- 브리지 경계 검출\n" +"- 브리지의 둘레(perimeters)를 탐지\n" "\n" "서포트에 대한 설정을 조정해야합니까?" @@ -4247,7 +4107,7 @@ msgstr "타워 매개변수 지우기" #: src/slic3r/GUI/Tab.cpp:1667 msgid "Toolchange parameters with single extruder MM printers" -msgstr "싱글 익스트루더 멀티 터리알 프린터를 사용한 공구 교환 매개 변수" +msgstr "MMU 프린터의 툴체인지 매개 변수" #: src/slic3r/GUI/Tab.cpp:1681 msgid "Ramming settings" @@ -4280,12 +4140,8 @@ msgid "Success!" msgstr "성공!" #: src/slic3r/GUI/Tab.cpp:1874 -msgid "" -"HTTPS CA file is optional. It is only needed if you use HTTPS with a self-" -"signed certificate." -msgstr "" -"HTTPS CA 파일은 선택 사항입니다. 자체 서명 된 인증서로 HTTPS를 사용하는 경우" -"에만 필요합니다." +msgid "HTTPS CA file is optional. It is only needed if you use HTTPS with a self-signed certificate." +msgstr "HTTPS CA 파일은 선택 사항입니다. 자체 서명 된 인증서로 HTTPS를 사용하는 경우에만 필요합니다." #: src/slic3r/GUI/Tab.cpp:1887 msgid "Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*" @@ -4299,16 +4155,12 @@ msgstr "CA 인증서 파일 열기" #, c-format msgid "" "HTTPS CA File:\n" -" \tOn this system, %s uses HTTPS certificates from the system Certificate " -"Store or Keychain.\n" -" \tTo use a custom CA file, please import your CA file into Certificate " -"Store / Keychain." +" \tOn this system, %s uses HTTPS certificates from the system Certificate Store or Keychain.\n" +" \tTo use a custom CA file, please import your CA file into Certificate Store / Keychain." msgstr "" "HTTPS CA 파일:\n" -"\t이 시스템에서 %s는 시스템 인증서 저장소나 키체인의 HTTPS 인증서를 사용 합니" -"다.\n" -"\t사용자 지정 CA 파일을 사용 하려면 CA 파일을 인증서 저장소/키체인에 가져오십" -"시오." +"\t이 시스템에서 %s는 시스템 인증서 저장소나 키체인의 HTTPS 인증서를 사용 합니다.\n" +"\t사용자 지정 CA 파일을 사용 하려면 CA 파일을 인증서 저장소/키체인에 가져오십시오." #: src/slic3r/GUI/Tab.cpp:1956 src/slic3r/GUI/Tab.cpp:2194 msgid "Size and coordinates" @@ -4325,16 +4177,15 @@ msgstr "기능" #: src/slic3r/GUI/Tab.cpp:1998 msgid "Number of extruders of the printer." -msgstr "프린터 익스트루더 숫자." +msgstr "프린터 익스트루더 갯수." #: src/slic3r/GUI/Tab.cpp:2023 msgid "" "Single Extruder Multi Material is selected, \n" "and all extruders must have the same diameter.\n" -"Do you want to change the diameter for all extruders to first extruder " -"nozzle diameter value?" +"Do you want to change the diameter for all extruders to first extruder nozzle diameter value?" msgstr "" -"단일 압출기 멀티 재질이 선택되고, \n" +"단일 압출기 다중 재질이 선택되고, \n" "모든 압출기는 동일한 직경을 가져야 합니다.\n" "모든 압출기의 지름을 첫 번째 압출기 노즐 값으로 변경하시겠습니까?" @@ -4381,7 +4232,7 @@ msgstr "툴 채인지 G 코드" #: src/slic3r/GUI/Tab.cpp:2159 msgid "Between objects G-code (for sequential printing)" -msgstr "객체 간 G 코드 (순차 인쇄용)" +msgstr "객체(object) 간 G 코드 (순차 인쇄용)" #: src/slic3r/GUI/Tab.cpp:2231 msgid "Display" @@ -4445,7 +4296,7 @@ msgstr "싱글 익스트루더 MM 설정" #: src/slic3r/GUI/Tab.cpp:2452 msgid "Single extruder multimaterial parameters" -msgstr "싱글 익스트루더 멀티메터리알 파라미터" +msgstr "싱글 익스트루더 다중메터리알 파라미터" #: src/slic3r/GUI/Tab.cpp:2465 src/libslic3r/GCode/PreviewData.cpp:477 #, c-format @@ -4462,17 +4313,15 @@ msgstr "레이어 높이 한계치" #: src/slic3r/GUI/Tab.cpp:2511 msgid "Position (for multi-extruder printers)" -msgstr "위치 (멀티 익스트루더 프린터 포함)" +msgstr "위치 (다중 익스트루더 프린터 포함)" #: src/slic3r/GUI/Tab.cpp:2517 msgid "Only lift Z" msgstr "Z축 올림" #: src/slic3r/GUI/Tab.cpp:2530 -msgid "" -"Retraction when tool is disabled (advanced settings for multi-extruder " -"setups)" -msgstr "도구 비활성화시 리트렉션 (멀티 익스트루더 고급 설정)" +msgid "Retraction when tool is disabled (advanced settings for multi-extruder setups)" +msgstr "도구 비활성화시 리트렉션 (다중 익스트루더 고급 설정)" #: src/slic3r/GUI/Tab.cpp:2693 msgid "" @@ -4558,11 +4407,8 @@ msgstr "잠긴 잠금" #. TRN Description for "LOCKED LOCK" #: src/slic3r/GUI/Tab.cpp:3334 -msgid "" -"indicates that the settings are the same as the system (or default) values " -"for the current option group" -msgstr "" -"설정이 현재 옵션 그룹의 시스템(또는 기본값) 값과 동일하다는 것을 나타냅니다." +msgid "indicates that the settings are the same as the system (or default) values for the current option group" +msgstr "설정이 현재 옵션 그룹의 시스템(또는 기본값) 값과 동일하다는 것을 나타냅니다." #: src/slic3r/GUI/Tab.cpp:3336 msgid "UNLOCKED LOCK" @@ -4571,15 +4417,11 @@ msgstr "잠금 해제 잠금" #. TRN Description for "UNLOCKED LOCK" #: src/slic3r/GUI/Tab.cpp:3338 msgid "" -"indicates that some settings were changed and are not equal to the system " -"(or default) values for the current option group.\n" -"Click the UNLOCKED LOCK icon to reset all settings for current option group " -"to the system (or default) values." +"indicates that some settings were changed and are not equal to the system (or default) values for the current option group.\n" +"Click the UNLOCKED LOCK icon to reset all settings for current option group to the system (or default) values." msgstr "" -"은 일부 설정이 변경되었으며 현재 옵션 그룹의 시스템(또는 기본값) 값과 같지 않" -"음을 나타냅니다.\n" -"잠금 해제 잠금 아이콘을 클릭하여 현재 옵션 그룹에 대한 모든 설정을 시스템(또" -"는 기본값) 값으로 재설정합니다." +"은 일부 설정이 변경되었으며 현재 옵션 그룹의 시스템(또는 기본값) 값과 같지 않음을 나타냅니다.\n" +"잠금 해제 잠금 아이콘을 클릭하여 현재 옵션 그룹에 대한 모든 설정을 시스템(또는 기본값) 값으로 재설정합니다." #: src/slic3r/GUI/Tab.cpp:3343 msgid "WHITE BULLET" @@ -4601,94 +4443,62 @@ msgstr "돌아가기 화살표" #. TRN Description for "BACK ARROW" #: src/slic3r/GUI/Tab.cpp:3350 msgid "" -"indicates that the settings were changed and are not equal to the last saved " -"preset for the current option group.\n" -"Click the BACK ARROW icon to reset all settings for the current option group " -"to the last saved preset." +"indicates that the settings were changed and are not equal to the last saved preset for the current option group.\n" +"Click the BACK ARROW icon to reset all settings for the current option group to the last saved preset." msgstr "" -"잠금 풀림;일부 설정이 변경되었으며 현재 옵션 그룹의 시스템 값과 같지 않음을 " -"나타냅니다.\n" -"현재 옵션 그룹의 모든 설정을 시스템 값으로 재설정하려면 자물쇠 잠금 아이콘을 " -"클릭하십시오." +"잠금 풀림;일부 설정이 변경되었으며 현재 옵션 그룹의 시스템 값과 같지 않음을 나타냅니다.\n" +"현재 옵션 그룹의 모든 설정을 시스템 값으로 재설정하려면 자물쇠 잠금 아이콘을 클릭하십시오." #: src/slic3r/GUI/Tab.cpp:3360 -msgid "" -"LOCKED LOCK icon indicates that the settings are the same as the system (or " -"default) values for the current option group" -msgstr "" -"LOCKED LOCK 아이콘은 설정이 현재 옵션 그룹의 시스템(또는 기본값) 값과 동일하" -"다는 것을 나타냅니다." +msgid "LOCKED LOCK icon indicates that the settings are the same as the system (or default) values for the current option group" +msgstr "LOCKED LOCK 아이콘은 설정이 현재 옵션 그룹의 시스템(또는 기본값) 값과 동일하다는 것을 나타냅니다." #: src/slic3r/GUI/Tab.cpp:3362 msgid "" -"UNLOCKED LOCK icon indicates that some settings were changed and are not " -"equal to the system (or default) values for the current option group.\n" -"Click to reset all settings for current option group to the system (or " -"default) values." +"UNLOCKED LOCK icon indicates that some settings were changed and are not equal to the system (or default) values for the current option group.\n" +"Click to reset all settings for current option group to the system (or default) values." msgstr "" -"UNLOCKED LOCK 아이콘은 일부 설정이 변경되었으며 현재 옵션 그룹의 시스템(또는 " -"기본값) 값과 같지 않음을 나타냅니다.\n" -"현재 옵션 그룹에 대한 모든 설정을 시스템(또는 기본값) 값으로 재설정하려면 클" -"릭합니다." +"UNLOCKED LOCK 아이콘은 일부 설정이 변경되었으며 현재 옵션 그룹의 시스템(또는 기본값) 값과 같지 않음을 나타냅니다.\n" +"현재 옵션 그룹에 대한 모든 설정을 시스템(또는 기본값) 값으로 재설정하려면 클릭합니다." #: src/slic3r/GUI/Tab.cpp:3365 msgid "WHITE BULLET icon indicates a non system (or non default) preset." msgstr "WHITE BULLET 아이콘은 시스템 사전 설정이 아닌 것을 나타냅니다." #: src/slic3r/GUI/Tab.cpp:3368 -msgid "" -"WHITE BULLET icon indicates that the settings are the same as in the last " -"saved preset for the current option group." -msgstr "" -"WHITE BULLET 기호 아이콘은 설정이 현재 옵션 그룹에 대해 마지막으로 저장 된 사" -"전 설정과 동일 하다는 것을 나타냅니다." +msgid "WHITE BULLET icon indicates that the settings are the same as in the last saved preset for the current option group." +msgstr "WHITE BULLET 기호 아이콘은 설정이 현재 옵션 그룹에 대해 마지막으로 저장 된 사전 설정과 동일 하다는 것을 나타냅니다." #: src/slic3r/GUI/Tab.cpp:3370 msgid "" -"BACK ARROW icon indicates that the settings were changed and are not equal " -"to the last saved preset for the current option group.\n" -"Click to reset all settings for the current option group to the last saved " -"preset." +"BACK ARROW icon indicates that the settings were changed and are not equal to the last saved preset for the current option group.\n" +"Click to reset all settings for the current option group to the last saved preset." msgstr "" -"BACK ARROW 이콘 설정을 변경 하 고 현재 옵션 그룹에 대 한 마지막 저장 된 프리" -"셋을 동일 하지 않습니다 나타냅니다.\n" -"마지막 현재 옵션 그룹에 대 한 모든 설정 다시 설정을 클릭 하 여 사전 설정을 저" -"장." +"BACK ARROW 이콘 설정을 변경 하 고 현재 옵션 그룹에 대 한 마지막 저장 된 프리셋을 동일 하지 않습니다 나타냅니다.\n" +"마지막 현재 옵션 그룹에 대 한 모든 설정 다시 설정을 클릭 하 여 사전 설정을 저장." #: src/slic3r/GUI/Tab.cpp:3376 -msgid "" -"LOCKED LOCK icon indicates that the value is the same as the system (or " -"default) value." -msgstr "" -"LOCKED LOCK 아이콘은 값이 시스템(또는 기본값) 값과 동일하다는 것을 나타냅니" -"다." +msgid "LOCKED LOCK icon indicates that the value is the same as the system (or default) value." +msgstr "LOCKED LOCK 아이콘은 값이 시스템(또는 기본값) 값과 동일하다는 것을 나타냅니다." #: src/slic3r/GUI/Tab.cpp:3377 msgid "" -"UNLOCKED LOCK icon indicates that the value was changed and is not equal to " -"the system (or default) value.\n" +"UNLOCKED LOCK icon indicates that the value was changed and is not equal to the system (or default) value.\n" "Click to reset current value to the system (or default) value." msgstr "" -"UNLOCKED LOCK 아이콘은 값이 변경되었으며 시스템(또는 기본값) 값과 같지 않음" -"을 나타냅니다.\n" +"UNLOCKED LOCK 아이콘은 값이 변경되었으며 시스템(또는 기본값) 값과 같지 않음을 나타냅니다.\n" "현재 값을 시스템(또는 기본값) 값으로 재설정하려면 클릭합니다." #: src/slic3r/GUI/Tab.cpp:3383 -msgid "" -"WHITE BULLET icon indicates that the value is the same as in the last saved " -"preset." -msgstr "" -"WHITE BULLET 기호 아이콘은 마지막으로 저장 한 사전 설정과 동일한 값을 나타냅" -"니다." +msgid "WHITE BULLET icon indicates that the value is the same as in the last saved preset." +msgstr "WHITE BULLET 기호 아이콘은 마지막으로 저장 한 사전 설정과 동일한 값을 나타냅니다." #: src/slic3r/GUI/Tab.cpp:3384 msgid "" -"BACK ARROW icon indicates that the value was changed and is not equal to the " -"last saved preset.\n" +"BACK ARROW icon indicates that the value was changed and is not equal to the last saved preset.\n" "Click to reset current value to the last saved preset." msgstr "" -"BACK ARROW 아이콘은 값이 변경되었으며 마지막으로 저장된 사전 설정과 같지 않음" -"을 나타냅니다.\n" +"BACK ARROW 아이콘은 값이 변경되었으며 마지막으로 저장된 사전 설정과 같지 않음을 나타냅니다.\n" "현재 값을 마지막으로 저장된 사전 설정으로 재설정하려면 클릭합니다." #. TRN Preset @@ -4815,15 +4625,13 @@ msgstr "구성 업데이트를 사용할 수 있음" msgid "" "Would you like to install it?\n" "\n" -"Note that a full configuration snapshot will be created first. It can then " -"be restored at any time should there be a problem with the new version.\n" +"Note that a full configuration snapshot will be created first. It can then be restored at any time should there be a problem with the new version.\n" "\n" "Updated configuration bundles:" msgstr "" "그것을 설치 하시겠습니까?\n" "\n" -"전체 구성 스냅 샷이 먼저 만들어집니다. 그런 다음 새 버전에 문제가있을 경우 언" -"제든지 복원 할 수 있습니다.\n" +"전체 구성 스냅 샷이 먼저 만들어집니다. 그런 다음 새 버전에 문제가있을 경우 언제든지 복원 할 수 있습니다.\n" "\n" "업데이트 된 구성 번들 :" @@ -4844,21 +4652,15 @@ msgstr "%s 과 호환되지 않습니다" #: src/slic3r/GUI/UpdateDialogs.cpp:155 #, c-format msgid "" -"This version of %s is not compatible with currently installed configuration " -"bundles.\n" -"This probably happened as a result of running an older %s after using a " -"newer one.\n" +"This version of %s is not compatible with currently installed configuration bundles.\n" +"This probably happened as a result of running an older %s after using a newer one.\n" "\n" -"You may either exit %s and try again with a newer version, or you may re-run " -"the initial configuration. Doing so will create a backup snapshot of the " -"existing configuration before installing files compatible with this %s.\n" +"You may either exit %s and try again with a newer version, or you may re-run the initial configuration. Doing so will create a backup snapshot of the existing configuration before installing files compatible with this %s.\n" msgstr "" "%s의 이 버전은 현재 설치 된 구성 번들과 호환 되지 않습니다.\n" "이것은 새로운 것을 사용한 후 이전 %s를 실행 한 결과로 발생 했을 것입니다.\n" "\n" -" %s를 종료하고 최신 버전으로 다시 시도 하거나 초기 구성을 다시 실행할 수 있습" -"니다. 이렇게 하면 %s와 호환 되는 파일을 설치하기 전에 기존 구성의 백업 스냅샷" -"이 생성 됩니다.\n" +" %s를 종료하고 최신 버전으로 다시 시도 하거나 초기 구성을 다시 실행할 수 있습니다. 이렇게 하면 %s와 호환 되는 파일을 설치하기 전에 기존 구성의 백업 스냅샷이 생성 됩니다.\n" #: src/slic3r/GUI/UpdateDialogs.cpp:164 #, c-format @@ -4872,7 +4674,7 @@ msgstr "호환되지 않는 번들 :" #: src/slic3r/GUI/UpdateDialogs.cpp:185 #, c-format msgid "Exit %s" -msgstr "%s Exit" +msgstr "%s 종료" #: src/slic3r/GUI/UpdateDialogs.cpp:188 msgid "Re-configure" @@ -4883,26 +4685,17 @@ msgstr "재구성" msgid "" "%s now uses an updated configuration structure.\n" "\n" -"So called 'System presets' have been introduced, which hold the built-in " -"default settings for various printers. These System presets cannot be " -"modified, instead, users now may create their own presets inheriting " -"settings from one of the System presets.\n" -"An inheriting preset may either inherit a particular value from its parent " -"or override it with a customized value.\n" +"So called 'System presets' have been introduced, which hold the built-in default settings for various printers. These System presets cannot be modified, instead, users now may create their own presets inheriting settings from one of the System presets.\n" +"An inheriting preset may either inherit a particular value from its parent or override it with a customized value.\n" "\n" -"Please proceed with the %s that follows to set up the new presets and to " -"choose whether to enable automatic preset updates." +"Please proceed with the %s that follows to set up the new presets and to choose whether to enable automatic preset updates." msgstr "" "%s이 (가) 이제 업데이트 된 구성 구조를 사용 합니다.\n" "\n" -"'시스템 프리셋 '이 도입 되었습니다, 다양한 프린터에 대한 기본 설정을 내장. 이" -"러한 시스템 프리셋은 수정할 수 없으며, 사용자는 이제 시스템 프리셋 중 하나에" -"서 설정을 상속하는 자신만의 프리셋을 생성할 수 있습니다.\n" -"상속하는 사전 설정은 해당 기본 설정에서 특정 값을 상속 하거나 사용자 지정 된 " -"값으로 재정의할 수 있습니다.\n" +"'시스템 프리셋 '이 도입 되었습니다, 다양한 프린터에 대한 기본 설정을 내장. 이러한 시스템 프리셋은 수정할 수 없으며, 사용자는 이제 시스템 프리셋 중 하나에서 설정을 상속하는 자신만의 프리셋을 생성할 수 있습니다.\n" +"상속하는 사전 설정은 해당 기본 설정에서 특정 값을 상속 하거나 사용자 지정 된 값으로 재정의할 수 있습니다.\n" "\n" -"다음의 %s를 계속 진행하여 새 프리셋을 설정하고 자동 프리셋 업데이트를 사용할" -"지 여부를 선택하십시오." +"다음의 %s를 계속 진행하여 새 프리셋을 설정하고 자동 프리셋 업데이트를 사용할지 여부를 선택하십시오." #: src/slic3r/GUI/UpdateDialogs.cpp:225 msgid "For more information please visit our wiki page:" @@ -4914,24 +4707,13 @@ msgstr "사용자 정의 다지기(Ramming)" #: src/slic3r/GUI/WipeTowerDialog.cpp:40 msgid "" -"Ramming denotes the rapid extrusion just before a tool change in a single-" -"extruder MM printer. Its purpose is to properly shape the end of the " -"unloaded filament so it does not prevent insertion of the new filament and " -"can itself be reinserted later. This phase is important and different " -"materials can require different extrusion speeds to get the good shape. For " -"this reason, the extrusion rates during ramming are adjustable.\n" +"Ramming denotes the rapid extrusion just before a tool change in a single-extruder MM printer. Its purpose is to properly shape the end of the unloaded filament so it does not prevent insertion of the new filament and can itself be reinserted later. This phase is important and different materials can require different extrusion speeds to get the good shape. For this reason, the extrusion rates during ramming are adjustable.\n" "\n" -"This is an expert-level setting, incorrect adjustment will likely lead to " -"jams, extruder wheel grinding into filament etc." +"This is an expert-level setting, incorrect adjustment will likely lead to jams, extruder wheel grinding into filament etc." msgstr "" -"래밍은 단일 압출기 MM 프린터에서 공구 교환 직전의 신속한 압출을 나타냅니다. " -"그 목적은 언로드 된 필라멘트의 끝 부분을 적절히 형성하여 새로운 필라멘트의 삽" -"입을 방지하고 나중에 다시 삽입 할 수 있도록하기위한 것입니다. 이 단계는 중요" -"하며 다른 재료는 좋은 모양을 얻기 위해 다른 압출 속도를 요구할 수 있습니다. " -"이러한 이유로, 래밍 중 압출 속도는 조정 가능합니다.\n" +"래밍은 단일 압출기 MMU 프린터에서 공구 교환 직전의 신속한 압출을 나타냅니다. 그 목적은 언로드 된 필라멘트의 끝 부분을 적절히 형성하여 새로운 필라멘트의 삽입을 방지하고 나중에 다시 삽입 할 수 있도록하기위한 것입니다. 이 단계는 중요하며 다른 재료는 좋은 모양을 얻기 위해 다른 압출 속도를 요구할 수 있습니다. 이러한 이유로, 래밍 중 압출 속도는 조정 가능합니다.\n" "\n" -"전문가 수준의 설정이므로 잘못된 조정으로 인해 용지 걸림, 압출기 휠이 필라멘" -"트 등에 연삭 될 수 있습니다." +"전문가 수준의 설정이므로 잘못된 조정으로 인해 용지 걸림, 압출기 휠이 필라멘트 등에 연삭 될 수 있습니다." #: src/slic3r/GUI/WipeTowerDialog.cpp:82 msgid "Total ramming time" @@ -4954,9 +4736,7 @@ msgid "Wipe tower - Purging volume adjustment" msgstr "와이프 타워 - 버려진 필라멘트 조절" #: src/slic3r/GUI/WipeTowerDialog.cpp:225 -msgid "" -"Here you can adjust required purging volume (mm³) for any given pair of " -"tools." +msgid "Here you can adjust required purging volume (mm³) for any given pair of tools." msgstr "여기서 주어진 도구 쌍에 필요한 정화 용량 (mm³)을 조정할 수 있습니다." #: src/slic3r/GUI/WipeTowerDialog.cpp:226 @@ -4976,12 +4756,8 @@ msgid "Tool #" msgstr "도구(Tool) #" #: src/slic3r/GUI/WipeTowerDialog.cpp:247 -msgid "" -"Total purging volume is calculated by summing two values below, depending on " -"which tools are loaded/unloaded." -msgstr "" -"총 정화 량은 어느 공구가로드 / 언로드되는지에 따라 아래의 두 값을 합산하여 계" -"산됩니다." +msgid "Total purging volume is calculated by summing two values below, depending on which tools are loaded/unloaded." +msgstr "총 정화 량은 어느 공구가로드 / 언로드되는지에 따라 아래의 두 값을 합산하여 계산됩니다." #: src/slic3r/GUI/WipeTowerDialog.cpp:248 msgid "Volume to purge (mm³) when the filament is being" @@ -4993,8 +4769,7 @@ msgstr "From" #: src/slic3r/GUI/WipeTowerDialog.cpp:327 msgid "" -"Switching to simple settings will discard changes done in the advanced " -"mode!\n" +"Switching to simple settings will discard changes done in the advanced mode!\n" "\n" "Do you want to proceed?" msgstr "" @@ -5151,19 +4926,19 @@ msgstr "복구된 3mf 파일을 가져오지 못했습니다" #: src/slic3r/Utils/FixModelByWin10.cpp:385 msgid "Repaired 3MF file does not contain any object" -msgstr "복구된 3MF 파일에 개체가 포함 되어있지 않습니다" +msgstr "복구된 3MF 파일에 객체(object)가 포함 되어있지 않습니다" #: src/slic3r/Utils/FixModelByWin10.cpp:387 msgid "Repaired 3MF file contains more than one object" -msgstr "복구된 3MF 파일에 둘 이상의 개체가 포함되어 있습니다" +msgstr "복구된 3MF 파일에 둘 이상의 객체(object)가 포함되어 있습니다" #: src/slic3r/Utils/FixModelByWin10.cpp:389 msgid "Repaired 3MF file does not contain any volume" -msgstr "복구 된 3MF 파일에 개체가 포함 되어있지 않습니다" +msgstr "복구 된 3MF 파일에 객체(object)가 포함 되어있지 않습니다" #: src/slic3r/Utils/FixModelByWin10.cpp:391 msgid "Repaired 3MF file contains more than one volume" -msgstr "복구된 3MF 파일에 둘 이상의 개체가 포함되어 있습니다" +msgstr "복구된 3MF 파일에 둘 이상의 객체(object)가 포함되어 있습니다" #: src/slic3r/Utils/FixModelByWin10.cpp:400 msgid "Model repair finished" @@ -5224,7 +4999,7 @@ msgstr "잘못 된 헤더 또는 아카이브가 손상 되었습니다" #: src/libslic3r/Zipper.cpp:50 msgid "unsupported multidisk archive" -msgstr "지원 되지 않는 멀티 디스크 아카이브" +msgstr "지원 되지 않는 다중 디스크 아카이브" #: src/libslic3r/Zipper.cpp:52 msgid "decompression failed or archive is corrupted" @@ -5316,134 +5091,79 @@ msgstr "zip 아카이브와 오류가 발생 했습니다" #: src/libslic3r/Print.cpp:1093 msgid "All objects are outside of the print volume." -msgstr "모든 개체가 인쇄 볼륨 외부에 있습니다." +msgstr "모든 객체(object)가 인쇄 볼륨 외부에 있습니다." #: src/libslic3r/Print.cpp:1120 msgid "Some objects are too close; your extruder will collide with them." -msgstr "일부 개체가 너무 가깝습니다. 귀하의 압출기가 그들과 충돌합니다." +msgstr "일부 객체(object)가 너무 가깝습니다. 귀하의 압출기가 그들과 충돌합니다." #: src/libslic3r/Print.cpp:1135 -msgid "" -"Some objects are too tall and cannot be printed without extruder collisions." -msgstr "일부 개체는 너무 크고 익스트루더 충돌없이 인쇄 할 수 없습니다." +msgid "Some objects are too tall and cannot be printed without extruder collisions." +msgstr "일부 객체(object)는 너무 크고 익스트루더 충돌없이 인쇄 할 수 없습니다." #: src/libslic3r/Print.cpp:1145 msgid "The Spiral Vase option can only be used when printing a single object." -msgstr "" -"나선형 꽃병(Spiral Vase) 옵션은 단일 개체를 인쇄 할 때만 사용할 수 있습니다." +msgstr "나선형 꽃병(Spiral Vase) 옵션은 단일 객체(object)를 인쇄 할 때만 사용할 수 있습니다." #: src/libslic3r/Print.cpp:1147 -msgid "" -"The Spiral Vase option can only be used when printing single material " -"objects." -msgstr "" -"나선형 꽃병 옵션(Spiral Vase)은 단일 재료 객체를 인쇄 할 때만 사용할 수 있습" -"니다." +msgid "The Spiral Vase option can only be used when printing single material objects." +msgstr "나선형 꽃병 옵션(Spiral Vase)은 단일 재료 객체(object)를 인쇄 할 때만 사용할 수 있습니다." #: src/libslic3r/Print.cpp:1155 -msgid "" -"The wipe tower is only supported if all extruders have the same nozzle " -"diameter and use filaments of the same diameter." -msgstr "" -"모든 압출기 의 노즐 직경이 동일하고 동일한 직경의 필라멘트를 사용하는 경우에" -"만 와이프 타워가 지원됩니다." +msgid "The wipe tower is only supported if all extruders have the same nozzle diameter and use filaments of the same diameter." +msgstr "모든 압출기 의 노즐 직경이 동일하고 동일한 직경의 필라멘트를 사용하는 경우에만 와이프 타워가 지원됩니다." #: src/libslic3r/Print.cpp:1159 -msgid "" -"The Wipe Tower is currently only supported for the Marlin, RepRap/Sprinter " -"and Repetier G-code flavors." -msgstr "" -"와이프 타워는 현재 말린, RepRap/Sprinter 및 리피티어에 대해서만 G-코드지원 됩" -"니다." +msgid "The Wipe Tower is currently only supported for the Marlin, RepRap/Sprinter and Repetier G-code flavors." +msgstr "와이프 타워는 현재 말린, RepRap/Sprinter 및 리피티어에 대해서만 G-코드지원 됩니다." #: src/libslic3r/Print.cpp:1161 -msgid "" -"The Wipe Tower is currently only supported with the relative extruder " -"addressing (use_relative_e_distances=1)." -msgstr "" -"와이프 타워는 현재 상대적 압출기 어드레싱 (use_relative_e_distances = 1)에서" -"만 지원됩니다." +msgid "The Wipe Tower is currently only supported with the relative extruder addressing (use_relative_e_distances=1)." +msgstr "와이프 타워는 현재 상대적 압출기 어드레싱 (use_relative_e_distances = 1)에서만 지원됩니다." #: src/libslic3r/Print.cpp:1165 msgid "All extruders must have the same diameter for the Wipe Tower." msgstr "모든 압출기는 와이프 타워의 지름이 같아야 합니다." #: src/libslic3r/Print.cpp:1186 -msgid "" -"The Wipe Tower is only supported for multiple objects if they have equal " -"layer heights" -msgstr "" -"와이프 타워 (Wipe Tower)는 같은 레이어 높이에 경우 여러 객체에 대해서만 지원" -"됩니다" +msgid "The Wipe Tower is only supported for multiple objects if they have equal layer heights" +msgstr "와이프 타워 (Wipe Tower)는 같은 레이어 높이에 경우 여러 객체(object)에 대해서만 지원됩니다" #: src/libslic3r/Print.cpp:1188 -msgid "" -"The Wipe Tower is only supported for multiple objects if they are printed " -"over an equal number of raft layers" -msgstr "" -"와이프 타워는 같은 수의 라프트 레이어 위에 인쇄 된 경우 여러 객체에 대해서만 " -"지원됩니다" +msgid "The Wipe Tower is only supported for multiple objects if they are printed over an equal number of raft layers" +msgstr "와이프 타워는 같은 수의 라프트 레이어 위에 인쇄 된 경우 여러 객체(object)에 대해서만 지원됩니다" #: src/libslic3r/Print.cpp:1190 -msgid "" -"The Wipe Tower is only supported for multiple objects if they are printed " -"with the same support_material_contact_distance" -msgstr "" -"와이프 타워는 동일한 support_material_contact_distance로 인쇄 된 경우 여러 객" -"체에 대해서만 지원됩니다" +msgid "The Wipe Tower is only supported for multiple objects if they are printed with the same support_material_contact_distance" +msgstr "와이프 타워는 동일한 support_material_contact_distance로 인쇄 된 경우 여러 객체(object)에 대해서만 지원됩니다" #: src/libslic3r/Print.cpp:1192 -msgid "" -"The Wipe Tower is only supported for multiple objects if they are sliced " -"equally." -msgstr "" -"와이프 타워는 똑같이 슬라이스 된 경우 여러 오브젝트에 대해서만 지원됩니다." +msgid "The Wipe Tower is only supported for multiple objects if they are sliced equally." +msgstr "와이프 타워는 똑같이 슬라이스 된 경우 여러 객체(object)에 대해서만 지원됩니다." #: src/libslic3r/Print.cpp:1220 -msgid "" -"The Wipe tower is only supported if all objects have the same layer height " -"profile" -msgstr "" -"모든 오브젝트의 레이어 높이 프로필이 동일한 경우에만 와이프 타워가 지원됩니다" +msgid "The Wipe tower is only supported if all objects have the same layer height profile" +msgstr "모든 객체(object)의 레이어 높이 프로필이 동일한 경우에만 와이프 타워가 지원됩니다" #: src/libslic3r/Print.cpp:1230 msgid "The supplied settings will cause an empty print." msgstr "제공된 설정으로 인해 빈 인쇄가 발생합니다." #: src/libslic3r/Print.cpp:1247 -msgid "" -"One or more object were assigned an extruder that the printer does not have." -msgstr "하나 이상의 개체에 프린터에없는 압출기가 지정되었습니다." +msgid "One or more object were assigned an extruder that the printer does not have." +msgstr "하나 이상의 객체(object)에 프린터에없는 압출기가 지정되었습니다." #: src/libslic3r/Print.cpp:1256 -msgid "" -"Printing with multiple extruders of differing nozzle diameters. If support " -"is to be printed with the current extruder (support_material_extruder == 0 " -"or support_material_interface_extruder == 0), all nozzles have to be of the " -"same diameter." -msgstr "" -"노즐 지름이 다른 여러 압출기로 인쇄. 지원이 현재 압출기 " -"(support_material_extruder == 0 또는 support_material_interface_extruder == " -"0)로 인쇄되는 경우 모든 노즐은 동일한 지름이어야합니다." +msgid "Printing with multiple extruders of differing nozzle diameters. If support is to be printed with the current extruder (support_material_extruder == 0 or support_material_interface_extruder == 0), all nozzles have to be of the same diameter." +msgstr "노즐 지름이 다른 여러 압출기로 인쇄. 지원이 현재 압출기 (support_material_extruder == 0 또는 support_material_interface_extruder == 0)로 인쇄되는 경우 모든 노즐은 동일한 지름이어야합니다." #: src/libslic3r/Print.cpp:1264 -msgid "" -"For the Wipe Tower to work with the soluble supports, the support layers " -"need to be synchronized with the object layers." -msgstr "" -"와이프 타워가 가용성 지지체와 함께 작동 하려면 서포트 레이어를 오브젝트 레이" -"어와 동기화 해야 합니다." +msgid "For the Wipe Tower to work with the soluble supports, the support layers need to be synchronized with the object layers." +msgstr "와이프 타워가 가용성 지지체와 함께 작동 하려면 서포트 레이어를 객체(object) 레이어와 동기화 해야 합니다." #: src/libslic3r/Print.cpp:1268 -msgid "" -"The Wipe Tower currently supports the non-soluble supports only if they are " -"printed with the current extruder without triggering a tool change. (both " -"support_material_extruder and support_material_interface_extruder need to be " -"set to 0)." -msgstr "" -"와이프 타워는 현재 공구 교체를 트리거하지 않고 현재의 압출기로 인쇄 하는 경우" -"에만 비가용성 서포트를 지원 합니다. (support_material_extruder과 " -"support_material_interface_extruder 모두 0으로 설정 해야 합니다.)" +msgid "The Wipe Tower currently supports the non-soluble supports only if they are printed with the current extruder without triggering a tool change. (both support_material_extruder and support_material_interface_extruder need to be set to 0)." +msgstr "와이프 타워는 현재 공구 교체를 트리거하지 않고 현재의 압출기로 인쇄 하는 경우에만 비가용성 서포트를 지원 합니다. (support_material_extruder과 support_material_interface_extruder 모두 0으로 설정 해야 합니다.)" #: src/libslic3r/Print.cpp:1290 msgid "First layer height can't be greater than nozzle diameter" @@ -5502,31 +5222,20 @@ msgid "Rasterizing layers" msgstr "레이어 래스터화" #: src/libslic3r/SLAPrint.cpp:650 -msgid "" -"Cannot proceed without support points! Add support points or disable support " -"generation." -msgstr "" -"서포트 포인트 없이 진행할 수 없습니다! 서포트 지점을 추가 하거나 서포트 생성" -"을 사용 하지 않도록 설정 합니다." +msgid "Cannot proceed without support points! Add support points or disable support generation." +msgstr "서포트 포인트 없이 진행할 수 없습니다! 서포트 지점을 추가 하거나 서포트 생성을 사용 하지 않도록 설정 합니다." #: src/libslic3r/SLAPrint.cpp:664 msgid "Elevation is too low for object." -msgstr "객체 고도가 너무 낮습니다." +msgstr "객체(object) 고도가 너무 낮습니다." #: src/libslic3r/SLAPrint.cpp:670 -msgid "" -"The endings of the support pillars will be deployed on the gap between the " -"object and the pad. 'Support base safety distance' has to be greater than " -"the 'Pad object gap' parameter to avoid this." -msgstr "" -"서포트 기둥 끝은 오브젝트와 패드 사이의 간격에 배치됩니다. 이를 방지하기 위" -"해 '베이스 서포트 안전 거리'는 '패드 오브젝트 갭' 매개변수보다 커야 합니다." +msgid "The endings of the support pillars will be deployed on the gap between the object and the pad. 'Support base safety distance' has to be greater than the 'Pad object gap' parameter to avoid this." +msgstr "서포트 기둥 끝은 객체(object)와 패드 사이의 간격에 배치됩니다. 이를 방지하기 위해 '베이스 서포트 안전 거리'는 '패드 객체(object) 갭' 매개변수보다 커야 합니다." #: src/libslic3r/SLAPrint.cpp:759 -msgid "" -"Slicing had to be stopped due to an internal error: Inconsistent slice index." -msgstr "" -"내부 오류: 일치하지 않는 슬라이스 인덱스로 인해 슬라이싱을 중지해야 했습니다." +msgid "Slicing had to be stopped due to an internal error: Inconsistent slice index." +msgstr "내부 오류: 일치하지 않는 슬라이스 인덱스로 인해 슬라이싱을 중지해야 했습니다." #: src/libslic3r/SLAPrint.cpp:954 src/libslic3r/SLAPrint.cpp:964 #: src/libslic3r/SLAPrint.cpp:1005 @@ -5558,21 +5267,15 @@ msgid "Bed custom model" msgstr "침대 사용자 정의 모델" #: src/libslic3r/PrintConfig.cpp:68 -msgid "" -"This setting controls the height (and thus the total number) of the slices/" -"layers. Thinner layers give better accuracy but take more time to print." -msgstr "" -"이 설정은 슬라이스/레이어의 높이(따라서 총 수)를 제어합니다. 얇은 층은 더 나" -"은 정확성을 제공하지만 인쇄하는 데는 더 많은 시간이 걸린다." +msgid "This setting controls the height (and thus the total number) of the slices/layers. Thinner layers give better accuracy but take more time to print." +msgstr "이 설정은 슬라이스/레이어의 높이(따라서 총 수)를 제어합니다. 얇은 층은 더 나은 정확성을 제공하지만 인쇄하는 데는 더 많은 시간이 걸린다." #: src/libslic3r/PrintConfig.cpp:75 msgid "Max print height" msgstr "최대 프린트 높이" #: src/libslic3r/PrintConfig.cpp:76 -msgid "" -"Set this to the maximum height that can be reached by your extruder while " -"printing." +msgid "Set this to the maximum height that can be reached by your extruder while printing." msgstr "인쇄 중에 익스트루더가 도달 할 수있는 최대 높이로 설정하십시오." #: src/libslic3r/PrintConfig.cpp:82 @@ -5580,110 +5283,64 @@ msgid "Slice gap closing radius" msgstr "슬라이스 간격 닫힘 반경" #: src/libslic3r/PrintConfig.cpp:84 -msgid "" -"Cracks smaller than 2x gap closing radius are being filled during the " -"triangle mesh slicing. The gap closing operation may reduce the final print " -"resolution, therefore it is advisable to keep the value reasonably low." -msgstr "" -"삼각형 메쉬 슬라이싱 중에, 2배 간격 폐쇄 반경 보다 작은 균열이 채워집니다. " -"틈 닫기 작업은 최종 인쇄 해상도를 줄일 수 있으므로 값을 합리적으로 낮게 유지 " -"하는 것이 좋습니다." +msgid "Cracks smaller than 2x gap closing radius are being filled during the triangle mesh slicing. The gap closing operation may reduce the final print resolution, therefore it is advisable to keep the value reasonably low." +msgstr "삼각형 메쉬 슬라이싱 중에, 2배 간격 폐쇄 반경 보다 작은 균열이 채워집니다. 틈 닫기 작업은 최종 인쇄 해상도를 줄일 수 있으므로 값을 합리적으로 낮게 유지 하는 것이 좋습니다." #: src/libslic3r/PrintConfig.cpp:92 msgid "Hostname, IP or URL" msgstr "호스트 이름(Hostname), IP or URL" #: src/libslic3r/PrintConfig.cpp:93 -msgid "" -"Slic3r can upload G-code files to a printer host. This field should contain " -"the hostname, IP address or URL of the printer host instance." -msgstr "" -"Slic3r는 프린터 호스트에 G 코드 파일을 업로드할 수 있습니다. 이 필드는 호스" -"트 이름, IP 주소 또는 프린터 호스트 복제본의 URL을 포함 해야 합니다." +msgid "Slic3r can upload G-code files to a printer host. This field should contain the hostname, IP address or URL of the printer host instance." +msgstr "Slic3r는 프린터 호스트에 G 코드 파일을 업로드할 수 있습니다. 이 필드는 호스트 이름, IP 주소 또는 프린터 호스트 복제본의 URL을 포함 해야 합니다." #: src/libslic3r/PrintConfig.cpp:99 msgid "API Key / Password" msgstr "API 키/암호" #: src/libslic3r/PrintConfig.cpp:100 -msgid "" -"Slic3r can upload G-code files to a printer host. This field should contain " -"the API Key or the password required for authentication." -msgstr "" -"Slic3r는 프린터 호스트에 G 코드 파일을 업로드할 수 있습니다. 이 필드는 API " -"키 또는 인증에 필요한 암호를 포함 해야 합니다." +msgid "Slic3r can upload G-code files to a printer host. This field should contain the API Key or the password required for authentication." +msgstr "Slic3r는 프린터 호스트에 G 코드 파일을 업로드할 수 있습니다. 이 필드는 API 키 또는 인증에 필요한 암호를 포함 해야 합니다." #: src/libslic3r/PrintConfig.cpp:106 msgid "HTTPS CA File" msgstr "HTTPS CA 파일" #: src/libslic3r/PrintConfig.cpp:107 -msgid "" -"Custom CA certificate file can be specified for HTTPS OctoPrint connections, " -"in crt/pem format. If left blank, the default OS CA certificate repository " -"is used." -msgstr "" -"사용자 지정 CA 인증서 파일은 crt/pem 형식의 HTTPS 옥토 프린트 연결에 대해 지" -"정할 수 있습니다. 비워 두면 기본 OS CA 인증서 리포지토리가 사용 됩니다." +msgid "Custom CA certificate file can be specified for HTTPS OctoPrint connections, in crt/pem format. If left blank, the default OS CA certificate repository is used." +msgstr "사용자 지정 CA 인증서 파일은 crt/pem 형식의 HTTPS 옥토 프린트 연결에 대해 지정할 수 있습니다. 비워 두면 기본 OS CA 인증서 리포지토리가 사용 됩니다." #: src/libslic3r/PrintConfig.cpp:121 msgid "Avoid crossing perimeters" -msgstr "출력된 외측을 피하세요" +msgstr "교체된 둘레를 피하세요." #: src/libslic3r/PrintConfig.cpp:122 -msgid "" -"Optimize travel moves in order to minimize the crossing of perimeters. This " -"is mostly useful with Bowden extruders which suffer from oozing. This " -"feature slows down both the print and the G-code generation." -msgstr "" -"둘레의 교차를 최소화하기 위해 여행 이동을 최적화하십시오. 이것은 보 잉 " -"(Bowling) 압출기가 흘러 나오기 쉬운 경우에 주로 유용합니다. 이 기능을 사용하" -"면 인쇄 및 G 코드 생성 속도가 느려집니다." +msgid "Optimize travel moves in order to minimize the crossing of perimeters. This is mostly useful with Bowden extruders which suffer from oozing. This feature slows down both the print and the G-code generation." +msgstr "둘레의 교차를 최소화하기 위해 여행 이동을 최적화하십시오. 이것은 보잉 (Bowling) 압출기가 흘러 나오기 쉬운 경우에 주로 유용합니다. 이 기능을 사용하면 인쇄 및 G 코드 생성 속도가 느려집니다." #: src/libslic3r/PrintConfig.cpp:129 src/libslic3r/PrintConfig.cpp:2027 msgid "Other layers" msgstr "다른 레이어" #: src/libslic3r/PrintConfig.cpp:130 -msgid "" -"Bed temperature for layers after the first one. Set this to zero to disable " -"bed temperature control commands in the output." -msgstr "" -"첫 번째 레이어 이후의 레이어 온도. 이 값을 0으로 설정하면 출력에서 ​​베드 온도 " -"제어 명령을 비활성화합니다." +msgid "Bed temperature for layers after the first one. Set this to zero to disable bed temperature control commands in the output." +msgstr "첫 번째 레이어 이후의 레이어 온도. 이 값을 0으로 설정하면 출력에서 ​​베드 온도 제어 명령을 비활성화합니다." #: src/libslic3r/PrintConfig.cpp:132 msgid "Bed temperature" msgstr "배드 온도" #: src/libslic3r/PrintConfig.cpp:139 -msgid "" -"This custom code is inserted at every layer change, right before the Z move. " -"Note that you can use placeholder variables for all Slic3r settings as well " -"as [layer_num] and [layer_z]." -msgstr "" -"이 사용자 정의 코드는 Z 이동 직전의 모든 레이어 변경에 삽입됩니다. [Slide3r] " -"설정과 [layer_num] 및 [layer_z]에 대한 자리 표시 자 변수를 사용할 수 있습니" -"다." +msgid "This custom code is inserted at every layer change, right before the Z move. Note that you can use placeholder variables for all Slic3r settings as well as [layer_num] and [layer_z]." +msgstr "이 사용자 정의 코드는 Z 이동 직전의 모든 레이어 변경에 삽입됩니다. [Slide3r] 설정과 [layer_num] 및 [layer_z]에 대한 자리 표시 자 변수를 사용할 수 있습니다." #: src/libslic3r/PrintConfig.cpp:149 msgid "Between objects G-code" -msgstr "객체 간 G 코드" +msgstr "객체(object) 간 G 코드" #: src/libslic3r/PrintConfig.cpp:150 -msgid "" -"This code is inserted between objects when using sequential printing. By " -"default extruder and bed temperature are reset using non-wait command; " -"however if M104, M109, M140 or M190 are detected in this custom code, Slic3r " -"will not add temperature commands. Note that you can use placeholder " -"variables for all Slic3r settings, so you can put a \"M109 " -"S[first_layer_temperature]\" command wherever you want." -msgstr "" -"이 코드는 순차 인쇄를 사용할 때 객체간에 삽입됩니다. 기본적으로 익스트루더 " -"및 베드 온도는 대기 모드가 아닌 명령을 사용하여 재설정됩니다. 그러나 이 사용" -"자 코드에서 M104, M109, M140 또는 M190이 감지되면 Slic3r은 온도 명령을 추가하" -"지 않습니다. 모든 Slic3r 설정에 자리 표시 변수를 사용할 수 있으므로 원하는 위" -"치에 \"M109 S [first_layer_temperature]\"명령을 넣을 수 있습니다." +msgid "This code is inserted between objects when using sequential printing. By default extruder and bed temperature are reset using non-wait command; however if M104, M109, M140 or M190 are detected in this custom code, Slic3r will not add temperature commands. Note that you can use placeholder variables for all Slic3r settings, so you can put a \"M109 S[first_layer_temperature]\" command wherever you want." +msgstr "이 코드는 순차 인쇄를 사용할 때 객체(object)간에 삽입됩니다. 기본적으로 익스트루더 및 베드 온도는 대기 모드가 아닌 명령을 사용하여 재설정됩니다. 그러나 이 사용자 코드에서 M104, M109, M140 또는 M190이 감지되면 Slic3r은 온도 명령을 추가하지 않습니다. 모든 Slic3r 설정에 자리 표시 변수를 사용할 수 있으므로 원하는 위치에 \"M109 S [first_layer_temperature]\"명령을 넣을 수 있습니다." #: src/libslic3r/PrintConfig.cpp:161 msgid "Number of solid layers to generate on bottom surfaces." @@ -5698,12 +5355,8 @@ msgid "Bridge" msgstr "브리지" #: src/libslic3r/PrintConfig.cpp:168 -msgid "" -"This is the acceleration your printer will use for bridges. Set zero to " -"disable acceleration control for bridges." -msgstr "" -"이것은 프린터가 브릿지에 사용할 가속도입니다. 브리지의 가속 제어를 사용하지 " -"않으려면 0으로 설정하십시오." +msgid "This is the acceleration your printer will use for bridges. Set zero to disable acceleration control for bridges." +msgstr "이것은 프린터가 브릿지에 사용할 가속도입니다. 브리지의 가속 제어를 사용하지 않으려면 0으로 설정하십시오." #: src/libslic3r/PrintConfig.cpp:170 src/libslic3r/PrintConfig.cpp:313 #: src/libslic3r/PrintConfig.cpp:840 src/libslic3r/PrintConfig.cpp:961 @@ -5717,14 +5370,8 @@ msgid "Bridging angle" msgstr "브릿지 각도" #: src/libslic3r/PrintConfig.cpp:178 -msgid "" -"Bridging angle override. If left to zero, the bridging angle will be " -"calculated automatically. Otherwise the provided angle will be used for all " -"bridges. Use 180° for zero angle." -msgstr "" -"브리징 각도 오버라이드(override)값이. 왼쪽으로 0 일 경우 브리징 각도가 자동으" -"로 계산됩니다. 그렇지 않으면 제공된 각도가 모든 브리지에 사용됩니다. 각도 제" -"로는 180 °를 사용하십시오." +msgid "Bridging angle override. If left to zero, the bridging angle will be calculated automatically. Otherwise the provided angle will be used for all bridges. Use 180° for zero angle." +msgstr "브리징 각도 오버라이드(override)값이. 왼쪽으로 0 일 경우 브리징 각도가 자동으로 계산됩니다. 그렇지 않으면 제공된 각도가 모든 브리지에 사용됩니다. 각도 제로는 180 °를 사용하십시오." #: src/libslic3r/PrintConfig.cpp:181 src/libslic3r/PrintConfig.cpp:758 #: src/libslic3r/PrintConfig.cpp:1619 src/libslic3r/PrintConfig.cpp:1629 @@ -5754,15 +5401,8 @@ msgid "Bridge flow ratio" msgstr "브릿지 유량(flow)값" #: src/libslic3r/PrintConfig.cpp:198 -msgid "" -"This factor affects the amount of plastic for bridging. You can decrease it " -"slightly to pull the extrudates and prevent sagging, although default " -"settings are usually good and you should experiment with cooling (use a fan) " -"before tweaking this." -msgstr "" -"이 요인은 브리징을위한 플라스틱의 양에 영향을 미칩니다. 압출 성형물을 잡아 당" -"겨 처짐을 방지하기 위해 약간 줄일 수 있지만 기본 설정은 일반적으로 좋지만이 " -"문제를 해결하기 전에 냉각 (팬 사용)을 시도해야합니다." +msgid "This factor affects the amount of plastic for bridging. You can decrease it slightly to pull the extrudates and prevent sagging, although default settings are usually good and you should experiment with cooling (use a fan) before tweaking this." +msgstr "이 요인은 브리징을위한 플라스틱의 양에 영향을 미칩니다. 압출 성형물을 잡아 당겨 처짐을 방지하기 위해 약간 줄일 수 있지만 기본 설정은 일반적으로 좋지만이 문제를 해결하기 전에 냉각 (팬 사용)을 시도해야합니다." #: src/libslic3r/PrintConfig.cpp:208 msgid "Bridges" @@ -5790,24 +5430,16 @@ msgid "Brim width" msgstr "브림 폭" #: src/libslic3r/PrintConfig.cpp:219 -msgid "" -"Horizontal width of the brim that will be printed around each object on the " -"first layer." -msgstr "첫 번째 레이어의 각 객체 주위에 인쇄 될 가장자리의 가로 폭입니다." +msgid "Horizontal width of the brim that will be printed around each object on the first layer." +msgstr "첫 번째 레이어의 각 객체(object) 주위에 인쇄 될 가장자리의 가로 폭입니다." #: src/libslic3r/PrintConfig.cpp:226 msgid "Clip multi-part objects" -msgstr "여러 파트 오브젝트 클립" +msgstr "여러 부품(Part) 객체(object) 클립" #: src/libslic3r/PrintConfig.cpp:227 -msgid "" -"When printing multi-material objects, this settings will make Slic3r to clip " -"the overlapping object parts one by the other (2nd part will be clipped by " -"the 1st, 3rd part will be clipped by the 1st and 2nd etc)." -msgstr "" -"멀티 메터리얼(multi-material) 개체를 인쇄 할 때이 설정을 사용하면 겹치는 개" -"체 파트를 서로 겹쳐서 잘라낼 수 있습니다 (두 번째 부분은 첫 번째 부분에서 클" -"리핑되며 세 번째 부분은 첫 번째 및 두 번째 부분에서 잘립니다)." +msgid "When printing multi-material objects, this settings will make Slic3r to clip the overlapping object parts one by the other (2nd part will be clipped by the 1st, 3rd part will be clipped by the 1st and 2nd etc)." +msgstr "다중 메터리얼(multi-material) 객체(object)를 인쇄 할 때이 설정을 사용하면 겹치는 객체(object) 부품(Part)를 서로 겹쳐서 잘라낼 수 있습니다 (두 번째 부분은 첫 번째 부분에서 클리핑되며 세 번째 부분은 첫 번째 및 두 번째 부분에서 잘립니다)." #: src/libslic3r/PrintConfig.cpp:234 msgid "Colorprint height" @@ -5822,54 +5454,32 @@ msgid "Compatible printers condition" msgstr "호환 가능한 프린터 조건" #: src/libslic3r/PrintConfig.cpp:246 -msgid "" -"A boolean expression using the configuration values of an active printer " -"profile. If this expression evaluates to true, this profile is considered " -"compatible with the active printer profile." -msgstr "" -"활성 프린터 프로파일의 구성 값을 사용하는 부울 표현식. 이 표현식이 true로 평" -"가되면이 프로필은 활성 프린터 프로필과 호환되는 것으로 간주됩니다." +msgid "A boolean expression using the configuration values of an active printer profile. If this expression evaluates to true, this profile is considered compatible with the active printer profile." +msgstr "활성 프린터 프로파일의 구성 값을 사용하는 부울 표현식. 이 표현식이 true로 평가되면이 프로필은 활성 프린터 프로필과 호환되는 것으로 간주됩니다." #: src/libslic3r/PrintConfig.cpp:260 msgid "Compatible print profiles condition" msgstr "호환 되는 인쇄 프로 파일 조건" #: src/libslic3r/PrintConfig.cpp:261 -msgid "" -"A boolean expression using the configuration values of an active print " -"profile. If this expression evaluates to true, this profile is considered " -"compatible with the active print profile." -msgstr "" -"활성 인쇄 프로 파일의 구성 값을 사용하는 부울식입니다. 이 식이 true로 평가 되" -"면, 이 프로필이 활성 인쇄 프로필과 호환 되는 것으로 간주 됩니다." +msgid "A boolean expression using the configuration values of an active print profile. If this expression evaluates to true, this profile is considered compatible with the active print profile." +msgstr "활성 인쇄 프로 파일의 구성 값을 사용하는 부울식입니다. 이 식이 true로 평가 되면, 이 프로필이 활성 인쇄 프로필과 호환 되는 것으로 간주 됩니다." #: src/libslic3r/PrintConfig.cpp:278 msgid "Complete individual objects" -msgstr "개별 개체 완성" +msgstr "개별 객체(object) 완성" #: src/libslic3r/PrintConfig.cpp:279 -msgid "" -"When printing multiple objects or copies, this feature will complete each " -"object before moving onto next one (and starting it from its bottom layer). " -"This feature is useful to avoid the risk of ruined prints. Slic3r should " -"warn and prevent you from extruder collisions, but beware." -msgstr "" -"여러 객체 또는 사본을 인쇄 할 때이 객체는 다음 객체로 이동하기 전에 각 객체" -"를 완성합니다 (맨 아래 레이어에서 시작). 이 기능은 인쇄물이 망가지는 위험을 " -"피할 때 유용합니다. Slic3r은 압출기 충돌을 경고하고 예방해야하지만 조심하십시" -"오." +msgid "When printing multiple objects or copies, this feature will complete each object before moving onto next one (and starting it from its bottom layer). This feature is useful to avoid the risk of ruined prints. Slic3r should warn and prevent you from extruder collisions, but beware." +msgstr "여러 객체(object) 또는 사본을 인쇄 할 때이 객체(object)는 다음 객체(object)로 이동하기 전에 각 객체(object)를 완성합니다 (맨 아래 레이어에서 시작). 이 기능은 인쇄물이 망가지는 위험을 피할 때 유용합니다. Slic3r은 압출기 충돌을 경고하고 예방해야하지만 조심하십시오." #: src/libslic3r/PrintConfig.cpp:287 msgid "Enable auto cooling" msgstr "자동 냉각 사용" #: src/libslic3r/PrintConfig.cpp:288 -msgid "" -"This flag enables the automatic cooling logic that adjusts print speed and " -"fan speed according to layer printing time." -msgstr "" -"이 플래그는 레이어 인쇄 시간에 따라 인쇄 속도와 팬 속도를 조정하는 자동 냉각 " -"논리를 활성화합니다." +msgid "This flag enables the automatic cooling logic that adjusts print speed and fan speed according to layer printing time." +msgstr "이 플래그는 레이어 인쇄 시간에 따라 인쇄 속도와 팬 속도를 조정하는 자동 냉각 논리를 활성화합니다." #: src/libslic3r/PrintConfig.cpp:293 msgid "Cooling tube position" @@ -5888,26 +5498,16 @@ msgid "Length of the cooling tube to limit space for cooling moves inside it." msgstr "내부의 냉각 이동을 위해 공간을 제한하는 냉각 튜브의 길이 " #: src/libslic3r/PrintConfig.cpp:310 -msgid "" -"This is the acceleration your printer will be reset to after the role-" -"specific acceleration values are used (perimeter/infill). Set zero to " -"prevent resetting acceleration at all." -msgstr "" -"역할 별 가속도 값이 사용 된 후에 프린터가 재설정되는 속도입니다 (둘레 / 충" -"전). 가속을 전혀 재설정하지 않으려면 0으로 설정하십시오." +msgid "This is the acceleration your printer will be reset to after the role-specific acceleration values are used (perimeter/infill). Set zero to prevent resetting acceleration at all." +msgstr "역할 별 가속도 값이 사용 된 후에 프린터가 재설정되는 속도입니다 (둘레 / 충전). 가속을 전혀 재설정하지 않으려면 0으로 설정하십시오." #: src/libslic3r/PrintConfig.cpp:319 msgid "Default filament profile" msgstr "기본 필라멘트 프로파일" #: src/libslic3r/PrintConfig.cpp:320 -msgid "" -"Default filament profile associated with the current printer profile. On " -"selection of the current printer profile, this filament profile will be " -"activated." -msgstr "" -"현재 프린터 프로파일과 연관된 기본 필라멘트 프로파일. 현재 프린터 프로파일을 " -"선택하면 이 필라멘트 프로파일이 활성화됩니다." +msgid "Default filament profile associated with the current printer profile. On selection of the current printer profile, this filament profile will be activated." +msgstr "현재 프린터 프로파일과 연관된 기본 필라멘트 프로파일. 현재 프린터 프로파일을 선택하면 이 필라멘트 프로파일이 활성화됩니다." #: src/libslic3r/PrintConfig.cpp:326 msgid "Default print profile" @@ -5915,25 +5515,16 @@ msgstr "기본 인쇄 프로파일" #: src/libslic3r/PrintConfig.cpp:327 src/libslic3r/PrintConfig.cpp:2447 #: src/libslic3r/PrintConfig.cpp:2458 -msgid "" -"Default print profile associated with the current printer profile. On " -"selection of the current printer profile, this print profile will be " -"activated." -msgstr "" -"현재 프린터 프로파일과 연관된 기본 인쇄 프로파일. 현재 프린터 프로파일을 선택" -"하면이 인쇄 프로파일이 활성화됩니다." +msgid "Default print profile associated with the current printer profile. On selection of the current printer profile, this print profile will be activated." +msgstr "현재 프린터 프로파일과 연관된 기본 인쇄 프로파일. 현재 프린터 프로파일을 선택하면이 인쇄 프로파일이 활성화됩니다." #: src/libslic3r/PrintConfig.cpp:333 msgid "Disable fan for the first" msgstr "첫 번째 팬 사용 중지" #: src/libslic3r/PrintConfig.cpp:334 -msgid "" -"You can set this to a positive value to disable fan at all during the first " -"layers, so that it does not make adhesion worse." -msgstr "" -"이 값을 양수 값으로 설정하면 첫 번째 레이어에서 팬을 사용하지 않도록 설정하" -"여 접착력을 악화시키지 않습니다." +msgid "You can set this to a positive value to disable fan at all during the first layers, so that it does not make adhesion worse." +msgstr "이 값을 양수 값으로 설정하면 첫 번째 레이어에서 팬을 사용하지 않도록 설정하여 접착력을 악화시키지 않습니다." #: src/libslic3r/PrintConfig.cpp:336 src/libslic3r/PrintConfig.cpp:971 #: src/libslic3r/PrintConfig.cpp:1484 src/libslic3r/PrintConfig.cpp:1669 @@ -5947,11 +5538,8 @@ msgid "Don't support bridges" msgstr "서포트와 브릿지를 사용하지 않음" #: src/libslic3r/PrintConfig.cpp:345 -msgid "" -"Experimental option for preventing support material from being generated " -"under bridged areas." -msgstr "" -"브릿지 영역 아래에 서포팅 재료가 생성되는 것을 방지하기위한 실험적 옵션." +msgid "Experimental option for preventing support material from being generated under bridged areas." +msgstr "브릿지 영역 아래에 서포팅 재료가 생성되는 것을 방지하기위한 실험적 옵션." #: src/libslic3r/PrintConfig.cpp:351 msgid "Distance between copies" @@ -5966,57 +5554,32 @@ msgid "Elephant foot compensation" msgstr "코끼리 발(Elephant foot) 보상값" #: src/libslic3r/PrintConfig.cpp:361 -msgid "" -"The first layer will be shrunk in the XY plane by the configured value to " -"compensate for the 1st layer squish aka an Elephant Foot effect." -msgstr "" -"첫 번째 레이어는 구성 요소 값에 따라 XY 평면에서 수축되어 일층 스 퀴시 코끼리" -"발(Elephant Foot) 효과를 보완합니다." +msgid "The first layer will be shrunk in the XY plane by the configured value to compensate for the 1st layer squish aka an Elephant Foot effect." +msgstr "첫 번째 레이어는 구성 요소 값에 따라 XY 평면에서 수축되어 일층 스 퀴시 코끼리발(Elephant Foot) 효과를 보완합니다." #: src/libslic3r/PrintConfig.cpp:370 -msgid "" -"This end procedure is inserted at the end of the output file. Note that you " -"can use placeholder variables for all Slic3r settings." -msgstr "" -"이 종료 절차는 출력 파일의 끝에 삽입된다. 모든 Slic3r 설정에 자리 표시자 변수" -"를 사용할 수 있다는 점에 유의하십시오." +msgid "This end procedure is inserted at the end of the output file. Note that you can use placeholder variables for all Slic3r settings." +msgstr "이 종료 절차는 출력 파일의 끝에 삽입된다. 모든 Slic3r 설정에 자리 표시자 변수를 사용할 수 있다는 점에 유의하십시오." #: src/libslic3r/PrintConfig.cpp:380 -msgid "" -"This end procedure is inserted at the end of the output file, before the " -"printer end gcode (and before any toolchange from this filament in case of " -"multimaterial printers). Note that you can use placeholder variables for all " -"Slic3r settings. If you have multiple extruders, the gcode is processed in " -"extruder order." -msgstr "" -"이 종료 절차는 출력 파일의 끝, 프린터 종료 gcode 이전 (및 복합 재료 프린터의 " -"경우이 필라멘트에서 도구를 변경하기 전에)에 삽입됩니다. 모든 Slic3r 설정에 자" -"리 표시 자 변수를 사용할 수 있습니다. 압출기가 여러 개인 경우 gcode는 압출기 " -"순서대로 처리됩니다." +msgid "This end procedure is inserted at the end of the output file, before the printer end gcode (and before any toolchange from this filament in case of multimaterial printers). Note that you can use placeholder variables for all Slic3r settings. If you have multiple extruders, the gcode is processed in extruder order." +msgstr "이 종료 절차는 출력 파일의 끝, 프린터 종료 gcode 이전 (및 복합 재료 프린터의 경우이 필라멘트에서 도구를 변경하기 전에)에 삽입됩니다. 모든 Slic3r 설정에 자리 표시 자 변수를 사용할 수 있습니다. 압출기가 여러 개인 경우 gcode는 압출기 순서대로 처리됩니다." #: src/libslic3r/PrintConfig.cpp:391 msgid "Ensure vertical shell thickness" msgstr "수직 쉘(shell) 두께 확인" #: src/libslic3r/PrintConfig.cpp:393 -msgid "" -"Add solid infill near sloping surfaces to guarantee the vertical shell " -"thickness (top+bottom solid layers)." -msgstr "" -"경사 표면 근처에 솔리드 인필을 추가하여 수직 셸 두께(상단+하단 솔리드 레이어)" -"를 보장하십시오." +msgid "Add solid infill near sloping surfaces to guarantee the vertical shell thickness (top+bottom solid layers)." +msgstr "경사 표면 근처에 솔리드 인필을 추가하여 수직 셸 두께(상단+하단 솔리드 레이어)를 보장하십시오." #: src/libslic3r/PrintConfig.cpp:399 msgid "Top fill pattern" msgstr "상단 채우기 패턴" #: src/libslic3r/PrintConfig.cpp:401 -msgid "" -"Fill pattern for top infill. This only affects the top visible layer, and " -"not its adjacent solid shells." -msgstr "" -"상단 채우기의 채우기 패턴. 이는 인접 한 솔리드 쉘이 아니라 보이는 상위 레이어" -"에만 영향을 줍니다." +msgid "Fill pattern for top infill. This only affects the top visible layer, and not its adjacent solid shells." +msgstr "상단 채우기의 채우기 패턴. 이는 인접 한 솔리드 쉘이 아니라 보이는 상위 레이어에만 영향을 줍니다." #: src/libslic3r/PrintConfig.cpp:409 src/libslic3r/PrintConfig.cpp:821 #: src/libslic3r/PrintConfig.cpp:1972 @@ -6044,27 +5607,16 @@ msgid "Bottom fill pattern" msgstr "아래쪽 채우기 패턴" #: src/libslic3r/PrintConfig.cpp:421 -msgid "" -"Fill pattern for bottom infill. This only affects the bottom external " -"visible layer, and not its adjacent solid shells." -msgstr "" -"하단 채우기의 채우기 패턴. 이는 인접 한 솔리드 쉘이 아니라 아래쪽에 보이는 외" -"부 레이어에만 영향을 줍니다." +msgid "Fill pattern for bottom infill. This only affects the bottom external visible layer, and not its adjacent solid shells." +msgstr "하단 채우기의 채우기 패턴. 이는 인접 한 솔리드 쉘이 아니라 아래쪽에 보이는 외부 레이어에만 영향을 줍니다." #: src/libslic3r/PrintConfig.cpp:430 src/libslic3r/PrintConfig.cpp:440 msgid "External perimeters" msgstr "외측 둘레" #: src/libslic3r/PrintConfig.cpp:432 -msgid "" -"Set this to a non-zero value to set a manual extrusion width for external " -"perimeters. If left zero, default extrusion width will be used if set, " -"otherwise 1.125 x nozzle diameter will be used. If expressed as percentage " -"(for example 200%), it will be computed over layer height." -msgstr "" -"외부 경계에 대한 수동 압출 폭을 설정하려면 이 값을 0이 아닌 값으로 설정하십시" -"오. 0인 경우 기본 압출 너비가 사용되며, 그렇지 않으면 1.125 x 노즐 직경이 사" -"용된다. 백분율(예: 200%)로 표현되는 경우, 레이어 높이에 걸쳐 계산됩니다." +msgid "Set this to a non-zero value to set a manual extrusion width for external perimeters. If left zero, default extrusion width will be used if set, otherwise 1.125 x nozzle diameter will be used. If expressed as percentage (for example 200%), it will be computed over layer height." +msgstr "외부 경계에 대한 수동 압출 폭을 설정하려면 이 값을 0이 아닌 값으로 설정하십시오. 0인 경우 기본 압출 너비가 사용되며, 그렇지 않으면 1.125 x 노즐 직경이 사용된다. 백분율(예: 200%)로 표현되는 경우, 레이어 높이에 걸쳐 계산됩니다." #: src/libslic3r/PrintConfig.cpp:435 src/libslic3r/PrintConfig.cpp:543 #: src/libslic3r/PrintConfig.cpp:860 src/libslic3r/PrintConfig.cpp:872 @@ -6076,14 +5628,8 @@ msgid "mm or %" msgstr "mm/s 또는 %" #: src/libslic3r/PrintConfig.cpp:442 -msgid "" -"This separate setting will affect the speed of external perimeters (the " -"visible ones). If expressed as percentage (for example: 80%) it will be " -"calculated on the perimeters speed setting above. Set to zero for auto." -msgstr "" -"이 별도의 설정은 외부 경계선(시각적 경계선)의 속도에 영향을 미친다. 백분율" -"(예: 80%)로 표현되는 경우 위의 Perimeter 속도 설정에 따라 계산된다. 자동을 위" -"해 0으로 설정한다." +msgid "This separate setting will affect the speed of external perimeters (the visible ones). If expressed as percentage (for example: 80%) it will be calculated on the perimeters speed setting above. Set to zero for auto." +msgstr "이 별도의 설정은 외부 경계선(시각적 경계선)의 속도에 영향을 미친다. 백분율(예: 80%)로 표현되는 경우 위의 Perimeter 속도 설정에 따라 계산된다. 자동을 위해 0으로 설정한다." #: src/libslic3r/PrintConfig.cpp:445 src/libslic3r/PrintConfig.cpp:881 #: src/libslic3r/PrintConfig.cpp:1700 src/libslic3r/PrintConfig.cpp:1751 @@ -6096,12 +5642,8 @@ msgid "External perimeters first" msgstr "외부 경계선 먼저" #: src/libslic3r/PrintConfig.cpp:454 -msgid "" -"Print contour perimeters from the outermost one to the innermost one instead " -"of the default inverse order." -msgstr "" -"기본 역순 대신 가장 바깥쪽부터 가장 안쪽까지 윤곽선을 인쇄하십시오. 타겟 TTS" -"복사하기번역 저장번역 저장번역 수정." +msgid "Print contour perimeters from the outermost one to the innermost one instead of the default inverse order." +msgstr "기본 역순 대신 가장 바깥쪽부터 가장 안쪽까지 윤곽선을 인쇄하십시오. 타겟 TTS복사하기번역 저장번역 저장번역 수정." #: src/libslic3r/PrintConfig.cpp:460 msgid "Extra perimeters if needed" @@ -6109,48 +5651,24 @@ msgstr "필요한 경우 추가 둘레" #: src/libslic3r/PrintConfig.cpp:462 #, c-format -msgid "" -"Add more perimeters when needed for avoiding gaps in sloping walls. Slic3r " -"keeps adding perimeters, until more than 70% of the loop immediately above " -"is supported." -msgstr "" -"경사 벽의 틈을 피하기 위해 필요한 경우 더 많은 둘래(perimeter)를 추가하십시" -"오. 위의 루프의 70% of 이상이 지지될 때까지 Slic3r는 계속해서 둘ㄹ를 추가한" -"다." +msgid "Add more perimeters when needed for avoiding gaps in sloping walls. Slic3r keeps adding perimeters, until more than 70% of the loop immediately above is supported." +msgstr "경사 벽의 틈을 피하기 위해 필요한 경우 더 많은 둘래(perimeter)를 추가하십시오. 위의 루프의 70% of 이상이 지지될 때까지 Slic3r는 계속해서 둘ㄹ를 추가한다." #: src/libslic3r/PrintConfig.cpp:472 -msgid "" -"The extruder to use (unless more specific extruder settings are specified). " -"This value overrides perimeter and infill extruders, but not the support " -"extruders." -msgstr "" -"사용할 압출부(더 구체적인 압출부 설정이 지정되지 않은 경우) 이 값은 경계 및 " -"압출부를 초과하지만 지원 압출자를 주입하지는 않는다." +msgid "The extruder to use (unless more specific extruder settings are specified). This value overrides perimeter and infill extruders, but not the support extruders." +msgstr "사용할 압출부(더 구체적인 압출부 설정이 지정되지 않은 경우) 이 값은 경계 및 압출부를 초과하지만 지원 압출자를 주입하지는 않는다." #: src/libslic3r/PrintConfig.cpp:484 -msgid "" -"Set this to the vertical distance between your nozzle tip and (usually) the " -"X carriage rods. In other words, this is the height of the clearance " -"cylinder around your extruder, and it represents the maximum depth the " -"extruder can peek before colliding with other printed objects." -msgstr "" -"이것을 노즐 팁과 (일반적으로) X 캐리지 로드 사이의 수직 거리로 설정하십시오. " -"다시 말하면, 이것은 당신의 압출기 주위의 틈새 실린더의 높이이며, 그것은 다른 " -"인쇄된 물체와 충돌하기 전에 압출기가 엿볼 수 있는 최대 깊이를 나타낸다." +msgid "Set this to the vertical distance between your nozzle tip and (usually) the X carriage rods. In other words, this is the height of the clearance cylinder around your extruder, and it represents the maximum depth the extruder can peek before colliding with other printed objects." +msgstr "이것을 노즐 팁과 (일반적으로) X 캐리지 로드 사이의 수직 거리로 설정하십시오. 다시 말하면, 이것은 당신의 압출기 주위의 틈새 실린더의 높이이며, 그것은 다른 인쇄된 물체와 충돌하기 전에 압출기가 엿볼 수 있는 최대 깊이를 나타낸다." #: src/libslic3r/PrintConfig.cpp:494 msgid "Radius" msgstr "반지름" #: src/libslic3r/PrintConfig.cpp:495 -msgid "" -"Set this to the clearance radius around your extruder. If the extruder is " -"not centered, choose the largest value for safety. This setting is used to " -"check for collisions and to display the graphical preview in the plater." -msgstr "" -"이것을 당신의 압출기 주변의 간극 반경으로 설정하시오. 압출부가 중앙에 있지 않" -"으면 안전을 위해 가장 큰 값을 선택하십시오. 이 설정은 충돌 여부를 확인하고 플" -"래터에 그래픽 미리 보기를 표시하기 위해 사용된다." +msgid "Set this to the clearance radius around your extruder. If the extruder is not centered, choose the largest value for safety. This setting is used to check for collisions and to display the graphical preview in the plater." +msgstr "이것을 당신의 압출기 주변의 간극 반경으로 설정하시오. 압출부가 중앙에 있지 않으면 안전을 위해 가장 큰 값을 선택하십시오. 이 설정은 충돌 여부를 확인하고 플래터에 그래픽 미리 보기를 표시하기 위해 사용된다." #: src/libslic3r/PrintConfig.cpp:505 msgid "Extruder Color" @@ -6158,92 +5676,55 @@ msgstr "익스트루더 컬러" #: src/libslic3r/PrintConfig.cpp:506 src/libslic3r/PrintConfig.cpp:566 msgid "This is only used in the Slic3r interface as a visual help." -msgstr "이것은 시각적 도움말로 Slic3r 인터페이스에서만 사용된다." +msgstr "이것은 시각적 도움말로 Slic3r 접점에서만 사용된다." #: src/libslic3r/PrintConfig.cpp:512 msgid "Extruder offset" msgstr "익스트루더 오프셋" #: src/libslic3r/PrintConfig.cpp:513 -msgid "" -"If your firmware doesn't handle the extruder displacement you need the G-" -"code to take it into account. This option lets you specify the displacement " -"of each extruder with respect to the first one. It expects positive " -"coordinates (they will be subtracted from the XY coordinate)." -msgstr "" -"펌웨어가 압출기 위치 변경을 처리하지 못하면 G 코드를 고려해야합니다. 이 옵션" -"을 사용하면 첫 번째 것에 대한 각 압출기의 변위를 지정할 수 있습니다. 양의 좌" -"표가 필요합니다 (XY 좌표에서 뺍니다)." +msgid "If your firmware doesn't handle the extruder displacement you need the G-code to take it into account. This option lets you specify the displacement of each extruder with respect to the first one. It expects positive coordinates (they will be subtracted from the XY coordinate)." +msgstr "펌웨어가 압출기 위치 변경을 처리하지 못하면 G 코드를 고려해야합니다. 이 옵션을 사용하면 첫 번째 것에 대한 각 압출기의 변위를 지정할 수 있습니다. 양의 좌표가 필요합니다 (XY 좌표에서 뺍니다)." #: src/libslic3r/PrintConfig.cpp:522 msgid "Extrusion axis" msgstr "압출 축" #: src/libslic3r/PrintConfig.cpp:523 -msgid "" -"Use this option to set the axis letter associated to your printer's extruder " -"(usually E but some printers use A)." -msgstr "" -"이 옵션을 사용하여 프린터의 압출기에 연결된 축 문자를 설정합니다 (보통 E이지" -"만 일부 프린터는 A를 사용합니다)." +msgid "Use this option to set the axis letter associated to your printer's extruder (usually E but some printers use A)." +msgstr "이 옵션을 사용하여 프린터의 압출기에 연결된 축 문자를 설정합니다 (보통 E이지만 일부 프린터는 A를 사용합니다)." #: src/libslic3r/PrintConfig.cpp:528 msgid "Extrusion multiplier" msgstr "압출 승수" #: src/libslic3r/PrintConfig.cpp:529 -msgid "" -"This factor changes the amount of flow proportionally. You may need to tweak " -"this setting to get nice surface finish and correct single wall widths. " -"Usual values are between 0.9 and 1.1. If you think you need to change this " -"more, check filament diameter and your firmware E steps." -msgstr "" -"이 요소는 비례하여 유량의 양을 변경합니다. 멋진 서페이스 마무리와 단일 벽 너" -"비를 얻기 위해이 설정을 조정해야 할 수도 있습니다. 일반적인 값은 0.9와 1.1 사" -"이입니다. 이 값을 더 변경해야한다고 판단되면 필라멘트 직경과 펌웨어 E 단계를 " -"확인하십시오." +msgid "This factor changes the amount of flow proportionally. You may need to tweak this setting to get nice surface finish and correct single wall widths. Usual values are between 0.9 and 1.1. If you think you need to change this more, check filament diameter and your firmware E steps." +msgstr "이 요소는 비례하여 유량의 양을 변경합니다. 멋진 서페이스 마무리와 단일 벽 너비를 얻기 위해이 설정을 조정해야 할 수도 있습니다. 일반적인 값은 0.9와 1.1 사이입니다. 이 값을 더 변경해야한다고 판단되면 필라멘트 직경과 펌웨어 E 단계를 확인하십시오." #: src/libslic3r/PrintConfig.cpp:537 msgid "Default extrusion width" msgstr "기본 압출 폭" #: src/libslic3r/PrintConfig.cpp:539 -msgid "" -"Set this to a non-zero value to allow a manual extrusion width. If left to " -"zero, Slic3r derives extrusion widths from the nozzle diameter (see the " -"tooltips for perimeter extrusion width, infill extrusion width etc). If " -"expressed as percentage (for example: 230%), it will be computed over layer " -"height." -msgstr "" -"수동 압출 폭을 허용하려면이 값을 0이 아닌 값으로 설정하십시오. 0으로 남겨두" -"면 Slic3r은 노즐 직경에서 압출 폭을 도출합니다 (주변 압출 폭, 성형 압출 폭 등" -"의 툴팁 참조). 백분율로 표시되는 경우 (예 : 230 %) 레이어 높이를 기준으로 계" -"산됩니다." +msgid "Set this to a non-zero value to allow a manual extrusion width. If left to zero, Slic3r derives extrusion widths from the nozzle diameter (see the tooltips for perimeter extrusion width, infill extrusion width etc). If expressed as percentage (for example: 230%), it will be computed over layer height." +msgstr "수동 압출 폭을 허용하려면이 값을 0이 아닌 값으로 설정하십시오. 0으로 남겨두면 Slic3r은 노즐 직경에서 압출 폭을 도출합니다 (주변 압출 폭, 성형 압출 폭 등의 툴팁 참조). 백분율로 표시되는 경우 (예 : 230 %) 레이어 높이를 기준으로 계산됩니다." #: src/libslic3r/PrintConfig.cpp:548 msgid "Keep fan always on" msgstr "항상 팬 켜기" #: src/libslic3r/PrintConfig.cpp:549 -msgid "" -"If this is enabled, fan will never be disabled and will be kept running at " -"least at its minimum speed. Useful for PLA, harmful for ABS." -msgstr "" -"이 기능을 사용하면 팬이 비활성화되지 않으며 최소한 최소 속도로 계속 회전합니" -"다. PLA에 유용하며 ABS에 해롭다." +msgid "If this is enabled, fan will never be disabled and will be kept running at least at its minimum speed. Useful for PLA, harmful for ABS." +msgstr "이 기능을 사용하면 팬이 비활성화되지 않으며 최소한 최소 속도로 계속 회전합니다. PLA에 유용하며 ABS에 해롭다." #: src/libslic3r/PrintConfig.cpp:554 msgid "Enable fan if layer print time is below" msgstr "레이어 인쇄 시간이 미만인 경우 팬 활성화" #: src/libslic3r/PrintConfig.cpp:555 -msgid "" -"If layer print time is estimated below this number of seconds, fan will be " -"enabled and its speed will be calculated by interpolating the minimum and " -"maximum speeds." -msgstr "" -"레이어 인쇄 시간이이 초 미만으로 예상되는 경우 팬이 활성화되고 속도는 최소 " -"및 최대 속도를 보간하여 계산됩니다." +msgid "If layer print time is estimated below this number of seconds, fan will be enabled and its speed will be calculated by interpolating the minimum and maximum speeds." +msgstr "레이어 인쇄 시간이이 초 미만으로 예상되는 경우 팬이 활성화되고 속도는 최소 및 최대 속도를 보간하여 계산됩니다." #: src/libslic3r/PrintConfig.cpp:557 src/libslic3r/PrintConfig.cpp:1687 msgid "approximate seconds" @@ -6266,13 +5747,8 @@ msgid "Max volumetric speed" msgstr "최대 체적 속도" #: src/libslic3r/PrintConfig.cpp:581 -msgid "" -"Maximum volumetric speed allowed for this filament. Limits the maximum " -"volumetric speed of a print to the minimum of print and filament volumetric " -"speed. Set to zero for no limit." -msgstr "" -"이 필라멘트에 허용되는 최대 체적 속도. 인쇄물의 최대 체적 속도를 인쇄 및 필라" -"멘트 체적 속도 최소로 제한한다. 제한 없음에 대해 0으로 설정하십시오." +msgid "Maximum volumetric speed allowed for this filament. Limits the maximum volumetric speed of a print to the minimum of print and filament volumetric speed. Set to zero for no limit." +msgstr "이 필라멘트에 허용되는 최대 체적 속도. 인쇄물의 최대 체적 속도를 인쇄 및 필라멘트 체적 속도 최소로 제한한다. 제한 없음에 대해 0으로 설정하십시오." #: src/libslic3r/PrintConfig.cpp:590 msgid "Loading speed" @@ -6295,20 +5771,15 @@ msgid "Unloading speed" msgstr "언로딩 스피드" #: src/libslic3r/PrintConfig.cpp:607 -msgid "" -"Speed used for unloading the filament on the wipe tower (does not affect " -"initial part of unloading just after ramming)." -msgstr "" -"와이퍼 타워에서 필라멘트를 언로드하는 데 사용되는 속도(램핑 후 바로 언로딩의 " -"초기 부분에는 영향을 주지 않음)." +msgid "Speed used for unloading the filament on the wipe tower (does not affect initial part of unloading just after ramming)." +msgstr "와이퍼 타워에서 필라멘트를 언로드하는 데 사용되는 속도(램핑 후 바로 언로딩의 초기 부분에는 영향을 주지 않음)." #: src/libslic3r/PrintConfig.cpp:615 msgid "Unloading speed at the start" msgstr "시작 시 언로드 속도" #: src/libslic3r/PrintConfig.cpp:616 -msgid "" -"Speed used for unloading the tip of the filament immediately after ramming." +msgid "Speed used for unloading the tip of the filament immediately after ramming." msgstr "속도는 램 밍 직후 필 라 멘 트의 팁을 언로딩 하는 데 사용 됩니다." #: src/libslic3r/PrintConfig.cpp:623 @@ -6316,25 +5787,16 @@ msgid "Delay after unloading" msgstr "언로드 후 딜레이" #: src/libslic3r/PrintConfig.cpp:624 -msgid "" -"Time to wait after the filament is unloaded. May help to get reliable " -"toolchanges with flexible materials that may need more time to shrink to " -"original dimensions." -msgstr "" -"필라멘트를 내린 후 기다리는 시간. 원래 치수로 축소하는 데, 더 많은 시간이 필" -"요할 수 있는 유연한 재료로 신뢰할 수있는 공구 교환을 얻을 수 있습니다." +msgid "Time to wait after the filament is unloaded. May help to get reliable toolchanges with flexible materials that may need more time to shrink to original dimensions." +msgstr "필라멘트를 내린 후 기다리는 시간. 원래 치수로 축소하는 데, 더 많은 시간이 필요할 수 있는 유연한 재료로 신뢰할 수있는 공구 교환을 얻을 수 있습니다." #: src/libslic3r/PrintConfig.cpp:633 msgid "Number of cooling moves" msgstr "쿨링 이동 숫자" #: src/libslic3r/PrintConfig.cpp:634 -msgid "" -"Filament is cooled by being moved back and forth in the cooling tubes. " -"Specify desired number of these moves." -msgstr "" -"필라멘트는 쿨링 튜브에서 앞뒤로 이동 하여 냉각 됩니다. 이러한 이동의 원하는 " -"값을 지정 합니다." +msgid "Filament is cooled by being moved back and forth in the cooling tubes. Specify desired number of these moves." +msgstr "필라멘트는 쿨링 튜브에서 앞뒤로 이동 하여 냉각 됩니다. 이러한 이동의 원하는 값을 지정 합니다." #: src/libslic3r/PrintConfig.cpp:642 msgid "Speed of the first cooling move" @@ -6349,18 +5811,8 @@ msgid "Minimal purge on wipe tower" msgstr "와이프(wipe) 탑의 최소 퍼지" #: src/libslic3r/PrintConfig.cpp:651 -msgid "" -"After a tool change, the exact position of the newly loaded filament inside " -"the nozzle may not be known, and the filament pressure is likely not yet " -"stable. Before purging the print head into an infill or a sacrificial " -"object, Slic3r will always prime this amount of material into the wipe tower " -"to produce successive infill or sacrificial object extrusions reliably." -msgstr "" -"공구가 변경 된 후 노즐 내부에 새로 로드 된 필라멘트의 정확한 위치를 알 수 없" -"으며, 필라멘트 압력이 아직 안정적이지 않을 수 있습니다. 프린트 헤드를 인필 또" -"는 희생(sacrificial) 객체로 소거 하기 전에 Slic3r는 항상이 양의 재료를 와이" -"프 탑에 넣어 연속적인 채우기 또는 희생(sacrificial) 객체 돌출을 안정적으로 생" -"성 합니다." +msgid "After a tool change, the exact position of the newly loaded filament inside the nozzle may not be known, and the filament pressure is likely not yet stable. Before purging the print head into an infill or a sacrificial object, Slic3r will always prime this amount of material into the wipe tower to produce successive infill or sacrificial object extrusions reliably." +msgstr "공구가 변경 된 후 노즐 내부에 새로 로드 된 필라멘트의 정확한 위치를 알 수 없으며, 필라멘트 압력이 아직 안정적이지 않을 수 있습니다. 프린트 헤드를 인필 또는 희생(sacrificial) 객체(object)로 소거 하기 전에 Slic3r는 항상이 양의 재료를 와이프 탑에 넣어 연속적인 채우기 또는 희생(sacrificial) 객체(object) 돌출을 안정적으로 생성 합니다." #: src/libslic3r/PrintConfig.cpp:655 msgid "mm³" @@ -6379,63 +5831,36 @@ msgid "Filament load time" msgstr "필라멘트 로드 시간" #: src/libslic3r/PrintConfig.cpp:670 -msgid "" -"Time for the printer firmware (or the Multi Material Unit 2.0) to load a new " -"filament during a tool change (when executing the T code). This time is " -"added to the total print time by the G-code time estimator." -msgstr "" -"프린터 펌웨어 (또는 MMU 2.0)가 공구를 변경하는 동안(T 코드를 실행할 때) 새필" -"라멘트를 로드하는 시간입니다. 이 시간은 G 코드 시간 추정기에 의해 총 인쇄 시" -"간에 추가 됩니다." +msgid "Time for the printer firmware (or the Multi Material Unit 2.0) to load a new filament during a tool change (when executing the T code). This time is added to the total print time by the G-code time estimator." +msgstr "프린터 펌웨어 (또는 MMU 2.0)가 공구를 변경하는 동안(T 코드를 실행할 때) 새필라멘트를 로드하는 시간입니다. 이 시간은 G 코드 시간 추정기에 의해 총 인쇄 시간에 추가 됩니다." #: src/libslic3r/PrintConfig.cpp:677 msgid "Ramming parameters" msgstr "래밍 파라미터" #: src/libslic3r/PrintConfig.cpp:678 -msgid "" -"This string is edited by RammingDialog and contains ramming specific " -"parameters." -msgstr "" -"이 문자열은 RammingDialog에 의해 편집되고 래밍 특정 매개 변수를 포함합니다." +msgid "This string is edited by RammingDialog and contains ramming specific parameters." +msgstr "이 문자열은 RammingDialog에 의해 편집되고 래밍 특정 매개 변수를 포함합니다." #: src/libslic3r/PrintConfig.cpp:684 msgid "Filament unload time" msgstr "필라멘트 언로드 시간" #: src/libslic3r/PrintConfig.cpp:685 -msgid "" -"Time for the printer firmware (or the Multi Material Unit 2.0) to unload a " -"filament during a tool change (when executing the T code). This time is " -"added to the total print time by the G-code time estimator." -msgstr "" -"프린터 펌웨어 (또는 MMU2.0)가 공구 교환 중에 필라멘트를 언로드하기 위한 시간" -"입니다 (T 코드를 실행할 때). 이 시간은 G 코드 시간추정기에 의해 총 인쇄 시간" -"에 추가 됩니다." +msgid "Time for the printer firmware (or the Multi Material Unit 2.0) to unload a filament during a tool change (when executing the T code). This time is added to the total print time by the G-code time estimator." +msgstr "프린터 펌웨어 (또는 MMU2.0)가 공구 교환 중에 필라멘트를 언로드하기 위한 시간입니다 (T 코드를 실행할 때). 이 시간은 G 코드 시간추정기에 의해 총 인쇄 시간에 추가 됩니다." #: src/libslic3r/PrintConfig.cpp:693 -msgid "" -"Enter your filament diameter here. Good precision is required, so use a " -"caliper and do multiple measurements along the filament, then compute the " -"average." -msgstr "" -"여기에 필라멘트 직경을 입력하십시오. 정밀도가 필요하므로 캘리퍼를 사용하여 필" -"라멘트를 따라 여러 번 측정 한 다음 평균을 계산하십시오." +msgid "Enter your filament diameter here. Good precision is required, so use a caliper and do multiple measurements along the filament, then compute the average." +msgstr "여기에 필라멘트 직경을 입력하십시오. 정밀도가 필요하므로 캘리퍼를 사용하여 필라멘트를 따라 여러 번 측정 한 다음 평균을 계산하십시오." #: src/libslic3r/PrintConfig.cpp:700 msgid "Density" msgstr "밀도" #: src/libslic3r/PrintConfig.cpp:701 -msgid "" -"Enter your filament density here. This is only for statistical information. " -"A decent way is to weigh a known length of filament and compute the ratio of " -"the length to volume. Better is to calculate the volume directly through " -"displacement." -msgstr "" -"여기서 필라멘트 밀도를 입력하십시오. 이것은 통계 정보 용입니다. 괜찮은 방법" -"은 알려진 길이의 필라멘트의 무게를 측정하고 길이와 볼륨의 비율을 계산하는 것" -"입니다. 변위를 통해 직접적으로 부피를 계산하는 것이 더 좋습니다." +msgid "Enter your filament density here. This is only for statistical information. A decent way is to weigh a known length of filament and compute the ratio of the length to volume. Better is to calculate the volume directly through displacement." +msgstr "여기서 필라멘트 밀도를 입력하십시오. 이것은 통계 정보 용입니다. 괜찮은 방법은 알려진 길이의 필라멘트의 무게를 측정하고 길이와 볼륨의 비율을 계산하는 것입니다. 변위를 통해 직접적으로 부피를 계산하는 것이 더 좋습니다." #: src/libslic3r/PrintConfig.cpp:704 msgid "g/cm³" @@ -6458,9 +5883,7 @@ msgid "Soluble material is most likely used for a soluble support." msgstr "수용성 재료눈 물에 녹는 서포트에 가장 많이 사용된다." #: src/libslic3r/PrintConfig.cpp:743 -msgid "" -"Enter your filament cost per kg here. This is only for statistical " -"information." +msgid "Enter your filament cost per kg here. This is only for statistical information." msgstr "필라멘트(kg당) 비용을 여기에 입력하십시오. 통계를 내기 위해서 입니다." #: src/libslic3r/PrintConfig.cpp:744 @@ -6472,14 +5895,8 @@ msgid "Fill angle" msgstr "채움 각도" #: src/libslic3r/PrintConfig.cpp:755 -msgid "" -"Default base angle for infill orientation. Cross-hatching will be applied to " -"this. Bridges will be infilled using the best direction Slic3r can detect, " -"so this setting does not affect them." -msgstr "" -"본 오리엔테이션 방향의 기본 각도입니다. 해칭이 적용될 것입니다. Slic3r이 감" -"지 할 수있는 최상의 방향을 사용하여 브릿징이 채워지므로이 설정은 영향을 미치" -"지 않습니다." +msgid "Default base angle for infill orientation. Cross-hatching will be applied to this. Bridges will be infilled using the best direction Slic3r can detect, so this setting does not affect them." +msgstr "본 오리엔테이션 방향의 기본 각도입니다. 해칭이 적용될 것입니다. Slic3r이 감지 할 수있는 최상의 방향을 사용하여 브릿징이 채워지므로이 설정은 영향을 미치지 않습니다." #: src/libslic3r/PrintConfig.cpp:767 msgid "Fill density" @@ -6535,106 +5952,52 @@ msgid "First layer" msgstr "첫 레이어" #: src/libslic3r/PrintConfig.cpp:838 -msgid "" -"This is the acceleration your printer will use for first layer. Set zero to " -"disable acceleration control for first layer." -msgstr "" -"이것은 프린터가 첫 번째 레이어에 사용할 가속도입니다. 0을 설정하면 첫 번째 레" -"이어에 대한 가속 제어가 사용되지 않습니다." +msgid "This is the acceleration your printer will use for first layer. Set zero to disable acceleration control for first layer." +msgstr "이것은 프린터가 첫 번째 레이어에 사용할 가속도입니다. 0을 설정하면 첫 번째 레이어에 대한 가속 제어가 사용되지 않습니다." #: src/libslic3r/PrintConfig.cpp:847 -msgid "" -"Heated build plate temperature for the first layer. Set this to zero to " -"disable bed temperature control commands in the output." -msgstr "" -"첫 번째 레이어에 대한 빌드 플레이트 온도를 가열. 이 값을 0으로 설정하면 출력" -"에서 ​​베드 온도 제어 명령을 비활성화합니다." +msgid "Heated build plate temperature for the first layer. Set this to zero to disable bed temperature control commands in the output." +msgstr "첫 번째 레이어에 대한 빌드 플레이트 온도를 가열. 이 값을 0으로 설정하면 출력에서 ​​베드 온도 제어 명령을 비활성화합니다." #: src/libslic3r/PrintConfig.cpp:856 -msgid "" -"Set this to a non-zero value to set a manual extrusion width for first " -"layer. You can use this to force fatter extrudates for better adhesion. If " -"expressed as percentage (for example 120%) it will be computed over first " -"layer height. If set to zero, it will use the default extrusion width." -msgstr "" -"첫 번째 레이어의 수동 압출 폭을 설정하려면이 값을 0이 아닌 값으로 설정합니" -"다. 이 방법을 사용하면보다 우수한 접착력을 위해 더 두꺼운 압출 성형물을 만들 " -"수 있습니다. 백분율 (예 : 120 %)로 표현하면 첫 번째 레이어 높이를 기준으로 계" -"산됩니다. 0으로 설정하면 기본 압출 폭이 사용됩니다." +msgid "Set this to a non-zero value to set a manual extrusion width for first layer. You can use this to force fatter extrudates for better adhesion. If expressed as percentage (for example 120%) it will be computed over first layer height. If set to zero, it will use the default extrusion width." +msgstr "첫 번째 레이어의 수동 압출 폭을 설정하려면이 값을 0이 아닌 값으로 설정합니다. 이 방법을 사용하면보다 우수한 접착력을 위해 더 두꺼운 압출 성형물을 만들 수 있습니다. 백분율 (예 : 120 %)로 표현하면 첫 번째 레이어 높이를 기준으로 계산됩니다. 0으로 설정하면 기본 압출 폭이 사용됩니다." #: src/libslic3r/PrintConfig.cpp:868 -msgid "" -"When printing with very low layer heights, you might still want to print a " -"thicker bottom layer to improve adhesion and tolerance for non perfect build " -"plates. This can be expressed as an absolute value or as a percentage (for " -"example: 150%) over the default layer height." -msgstr "" -"매우 낮은 층의 높이로 인쇄할 때, 당신은 여전히 완벽하지 않은 빌드 플레이트의 " -"부착력과 허용오차를 개선하기 위해 더 두꺼운 바닥 층을 인쇄하기를 원할 수 있" -"다. 이것은 절대값 또는 기본 계층 높이에 대한 백분율(예: 150%)로 표시할 수 있" -"다." +msgid "When printing with very low layer heights, you might still want to print a thicker bottom layer to improve adhesion and tolerance for non perfect build plates. This can be expressed as an absolute value or as a percentage (for example: 150%) over the default layer height." +msgstr "매우 낮은 층의 높이로 인쇄할 때, 당신은 여전히 완벽하지 않은 빌드 플레이트의 부착력과 허용오차를 개선하기 위해 더 두꺼운 바닥 층을 인쇄하기를 원할 수 있다. 이것은 절대값 또는 기본 계층 높이에 대한 백분율(예: 150%)로 표시할 수 있다." #: src/libslic3r/PrintConfig.cpp:877 msgid "First layer speed" msgstr "첫 레이어 속도" #: src/libslic3r/PrintConfig.cpp:878 -msgid "" -"If expressed as absolute value in mm/s, this speed will be applied to all " -"the print moves of the first layer, regardless of their type. If expressed " -"as a percentage (for example: 40%) it will scale the default speeds." -msgstr "" -"절대값(mm/s)으로 표현되는 경우, 이 속도는 유형에 관계없이 첫 번째 층의 모든 " -"인쇄 이동에 적용된다. 백분율(예: 40%)로 표현되는 경우 기본 속도를 스케일링한" -"다." +msgid "If expressed as absolute value in mm/s, this speed will be applied to all the print moves of the first layer, regardless of their type. If expressed as a percentage (for example: 40%) it will scale the default speeds." +msgstr "절대값(mm/s)으로 표현되는 경우, 이 속도는 유형에 관계없이 첫 번째 층의 모든 인쇄 이동에 적용된다. 백분율(예: 40%)로 표현되는 경우 기본 속도를 스케일링한다." #: src/libslic3r/PrintConfig.cpp:888 -msgid "" -"Extruder temperature for first layer. If you want to control temperature " -"manually during print, set this to zero to disable temperature control " -"commands in the output file." -msgstr "" -"첫 번째 층의 외부 온도. 인쇄 중에 온도를 수동으로 제어하려면 출력 파일에서 온" -"도 제어 명령을 사용하지 않으려면 이 값을 0으로 설정하십시오." +msgid "Extruder temperature for first layer. If you want to control temperature manually during print, set this to zero to disable temperature control commands in the output file." +msgstr "첫 번째 층의 외부 온도. 인쇄 중에 온도를 수동으로 제어하려면 출력 파일에서 온도 제어 명령을 사용하지 않으려면 이 값을 0으로 설정하십시오." #: src/libslic3r/PrintConfig.cpp:897 -msgid "" -"Speed for filling small gaps using short zigzag moves. Keep this reasonably " -"low to avoid too much shaking and resonance issues. Set zero to disable gaps " -"filling." -msgstr "" -"짧은 지그재그로 작은 틈을 메우기 위한 속도. 너무 많은 진동과 공진 문제를 피하" -"기 위해 이것을 합리적으로 낮게 유지한다. 간격 채우기를 사용하지 않으려면 0을 " -"설정하십시오." +msgid "Speed for filling small gaps using short zigzag moves. Keep this reasonably low to avoid too much shaking and resonance issues. Set zero to disable gaps filling." +msgstr "짧은 지그재그로 작은 틈을 메우기 위한 속도. 너무 많은 진동과 공진 문제를 피하기 위해 이것을 합리적으로 낮게 유지한다. 간격 채우기를 사용하지 않으려면 0을 설정하십시오." #: src/libslic3r/PrintConfig.cpp:905 msgid "Verbose G-code" msgstr "세부 G-코드" #: src/libslic3r/PrintConfig.cpp:906 -msgid "" -"Enable this to get a commented G-code file, with each line explained by a " -"descriptive text. If you print from SD card, the additional weight of the " -"file could make your firmware slow down." -msgstr "" -"설명 텍스트로 설명되는 각 행과 함께 코멘트된 G-code 파일을 가져오려면 이 옵션" -"을 선택하십시오. 만일 당신이 SD카드로 인쇄한다면, 파일의 추가 무게로 인해 펌" -"웨어의 속도가 느려질 수 있다." +msgid "Enable this to get a commented G-code file, with each line explained by a descriptive text. If you print from SD card, the additional weight of the file could make your firmware slow down." +msgstr "설명 텍스트로 설명되는 각 행과 함께 코멘트된 G-code 파일을 가져오려면 이 옵션을 선택하십시오. 만일 당신이 SD카드로 인쇄한다면, 파일의 추가 무게로 인해 펌웨어의 속도가 느려질 수 있다." #: src/libslic3r/PrintConfig.cpp:913 msgid "G-code flavor" msgstr "G-code 형식" #: src/libslic3r/PrintConfig.cpp:914 -msgid "" -"Some G/M-code commands, including temperature control and others, are not " -"universal. Set this option to your printer's firmware to get a compatible " -"output. The \"No extrusion\" flavor prevents Slic3r from exporting any " -"extrusion value at all." -msgstr "" -"온도 조절 등을 포함한 일부 G/M-코드 명령은 보편적이지 않습니다. 호환되는 출력" -"을 얻으려면 보드에 적제된 프린터의 펌웨어로 설정하십시오. \"압출 없음\" 형식" -"은 Slic3r가 어떠한 압출 값도 출력하지 못하게 합니다." +msgid "Some G/M-code commands, including temperature control and others, are not universal. Set this option to your printer's firmware to get a compatible output. The \"No extrusion\" flavor prevents Slic3r from exporting any extrusion value at all." +msgstr "온도 조절 등을 포함한 일부 G/M-코드 명령은 보편적이지 않습니다. 호환되는 출력을 얻으려면 보드에 적제된 프린터의 펌웨어로 설정하십시오. \"압출 없음\" 형식은 Slic3r가 어떠한 압출 값도 출력하지 못하게 합니다." #: src/libslic3r/PrintConfig.cpp:937 msgid "No extrusion" @@ -6642,53 +6005,31 @@ msgstr "압출 없음" #: src/libslic3r/PrintConfig.cpp:942 msgid "Label objects" -msgstr "레이블 개체" +msgstr "레이블 객체(object)" #: src/libslic3r/PrintConfig.cpp:943 -msgid "" -"Enable this to add comments into the G-Code labeling print moves with what " -"object they belong to, which is useful for the Octoprint CancelObject " -"plugin. This settings is NOT compatible with Single Extruder Multi Material " -"setup and Wipe into Object / Wipe into Infill." -msgstr "" -"이 기능을 사용 하 여 G 코드 레이블 인쇄에 주석이 속해 있는 객체와 함께 이동 " -"하 여 주석을 추가할 수 있으며,이는 옥 토 프린트 캔 커 작업 플러그인에 유용 합" -"니다. 이 설정은 단일 압출 기 다중 재료 설정과 호환 되지 않으며 객체를 닦아 " -"내 고 채우기로 닦습니다." +msgid "Enable this to add comments into the G-Code labeling print moves with what object they belong to, which is useful for the Octoprint CancelObject plugin. This settings is NOT compatible with Single Extruder Multi Material setup and Wipe into Object / Wipe into Infill." +msgstr "이 기능을 사용 하 여 G 코드 레이블 인쇄에 주석이 속해 있는 객체(object)와 함께 이동 하 여 주석을 추가할 수 있으며,이는 옥 토 프린트 캔 커 작업 플러그인에 유용 합니다. 이 설정은 단일 압출 기 다중 재료 설정과 호환 되지 않으며 객체(object)를 닦아 내 고 채우기로 닦습니다." #: src/libslic3r/PrintConfig.cpp:950 msgid "High extruder current on filament swap" msgstr "필라멘트스왑에 높은 압출 기 전류" #: src/libslic3r/PrintConfig.cpp:951 -msgid "" -"It may be beneficial to increase the extruder motor current during the " -"filament exchange sequence to allow for rapid ramming feed rates and to " -"overcome resistance when loading a filament with an ugly shaped tip." -msgstr "" -"필라멘트 교환 동안 압출기 모터 전류를 증가 시키는 것이 유리할 수 있으며, 이" -"는 빠른 래밍 공급 속도를 가능 하게하고, 불규칙한 모양의 필라멘트를 로딩할때 " -"저항을 극복하기 위한것이다." +msgid "It may be beneficial to increase the extruder motor current during the filament exchange sequence to allow for rapid ramming feed rates and to overcome resistance when loading a filament with an ugly shaped tip." +msgstr "필라멘트 교환 동안 압출기 모터 전류를 증가 시키는 것이 유리할 수 있으며, 이는 빠른 래밍 공급 속도를 가능 하게하고, 불규칙한 모양의 필라멘트를 로딩할때 저항을 극복하기 위한것이다." #: src/libslic3r/PrintConfig.cpp:959 -msgid "" -"This is the acceleration your printer will use for infill. Set zero to " -"disable acceleration control for infill." -msgstr "" -"이것은 당신 프린터의 채움 가속력이다. 주입에 대한 가속 제어를 비활성화하려면 " -"0을 설정하십시오." +msgid "This is the acceleration your printer will use for infill. Set zero to disable acceleration control for infill." +msgstr "이것은 당신 프린터의 채움 가속력이다. 주입에 대한 가속 제어를 비활성화하려면 0을 설정하십시오." #: src/libslic3r/PrintConfig.cpp:967 msgid "Combine infill every" -msgstr "다음 시간마다 결합" +msgstr "다음 레이어마다 결합" #: src/libslic3r/PrintConfig.cpp:969 -msgid "" -"This feature allows to combine infill and speed up your print by extruding " -"thicker infill layers while preserving thin perimeters, thus accuracy." -msgstr "" -"이 기능은 인필을 결합하고 얇은 주변기기를 보존하면서 두꺼운 인필 층을 압출하" -"여 인쇄 속도를 높일 수 있도록 하여 정확도를 높인다." +msgid "This feature allows to combine infill and speed up your print by extruding thicker infill layers while preserving thin perimeters, thus accuracy." +msgstr "이 기능은 인필을 결합하고 얇은 주변기기를 보존하면서 두꺼운 인필 층을 압출하여 인쇄 속도를 높일 수 있도록 하여 정확도를 높인다." #: src/libslic3r/PrintConfig.cpp:972 msgid "Combine infill every n layers" @@ -6703,57 +6044,32 @@ msgid "The extruder to use when printing infill." msgstr "채움으로 사용할 익스트루더." #: src/libslic3r/PrintConfig.cpp:988 -msgid "" -"Set this to a non-zero value to set a manual extrusion width for infill. If " -"left zero, default extrusion width will be used if set, otherwise 1.125 x " -"nozzle diameter will be used. You may want to use fatter extrudates to speed " -"up the infill and make your parts stronger. If expressed as percentage (for " -"example 90%) it will be computed over layer height." -msgstr "" -"채움에 수동 압출 폭을 설정하려면이 값을 0이 아닌 값으로 설정합니다. 0으로 설" -"정하면 설정된 경우 기본 압출 폭이 사용되고 그렇지 않으면 1.125 x 노즐 직경이 " -"사용됩니다. 채움 속도를 높이고 부품을 더 강하게 만들려면보다 큰 압출 성형물" -"을 사용하는 것이 좋습니다. 백분율 (예 : 90 %)로 표현하면 레이어 높이를 기준으" -"로 계산됩니다." +msgid "Set this to a non-zero value to set a manual extrusion width for infill. If left zero, default extrusion width will be used if set, otherwise 1.125 x nozzle diameter will be used. You may want to use fatter extrudates to speed up the infill and make your parts stronger. If expressed as percentage (for example 90%) it will be computed over layer height." +msgstr "채움에 수동 압출 폭을 설정하려면이 값을 0이 아닌 값으로 설정합니다. 0으로 설정하면 설정된 경우 기본 압출 폭이 사용되고 그렇지 않으면 1.125 x 노즐 직경이 사용됩니다. 채움 속도를 높이고 부품(Part)을 더 강하게 만들려면보다 큰 압출 성형물을 사용하는 것이 좋습니다. 백분율 (예 : 90 %)로 표현하면 레이어 높이를 기준으로 계산됩니다." #: src/libslic3r/PrintConfig.cpp:997 msgid "Infill before perimeters" msgstr "둘레보다 앞쪽에 채움" #: src/libslic3r/PrintConfig.cpp:998 -msgid "" -"This option will switch the print order of perimeters and infill, making the " -"latter first." +msgid "This option will switch the print order of perimeters and infill, making the latter first." msgstr "이 옵션은 외부출력과 채움 인쇄 순서를 바꾸어, 후자를 먼저 만든다." #: src/libslic3r/PrintConfig.cpp:1003 msgid "Only infill where needed" -msgstr "필요한 경우 채음" +msgstr "필요한 경우 채움" #: src/libslic3r/PrintConfig.cpp:1005 -msgid "" -"This option will limit infill to the areas actually needed for supporting " -"ceilings (it will act as internal support material). If enabled, slows down " -"the G-code generation due to the multiple checks involved." -msgstr "" -"이 옵션은 천장 지원에 실제로 필요한 영역에만 적용된다(내부 서포트 재료 역할" -"을 할 것이다). 활성화된 경우 관련된 여러 번의 점검으로 인해 G-code 생성 속도" -"를 늦춰라." +msgid "This option will limit infill to the areas actually needed for supporting ceilings (it will act as internal support material). If enabled, slows down the G-code generation due to the multiple checks involved." +msgstr "이 옵션은 천장 지원에 실제로 필요한 영역에만 적용된다(내부 서포트 재료 역할을 할 것이다). 활성화된 경우 관련된 여러 번의 점검으로 인해 G-code 생성 속도를 늦춰라." #: src/libslic3r/PrintConfig.cpp:1012 msgid "Infill/perimeters overlap" msgstr "채움/둘레 겹침(perimeters overlap)" #: src/libslic3r/PrintConfig.cpp:1014 -msgid "" -"This setting applies an additional overlap between infill and perimeters for " -"better bonding. Theoretically this shouldn't be needed, but backlash might " -"cause gaps. If expressed as percentage (example: 15%) it is calculated over " -"perimeter extrusion width." -msgstr "" -"이 설정은 더 나은 본딩을 위해 충전 및 둘레 사이에 추가 겹침을 적용합니다. 이" -"론적으로 이것은 필요하지 않아야하지만 백래시가 갭을 유발할 수 있습니다. 백분" -"율 (예 : 15 %)로 표시되는 경우 경계 압출 폭을 기준으로 계산됩니다." +msgid "This setting applies an additional overlap between infill and perimeters for better bonding. Theoretically this shouldn't be needed, but backlash might cause gaps. If expressed as percentage (example: 15%) it is calculated over perimeter extrusion width." +msgstr "이 설정은 더 나은 본딩을 위해 충전 및 둘레 사이에 추가 겹침을 적용합니다. 이론적으로 이것은 필요하지 않아야하지만 백래시가 갭을 유발할 수 있습니다. 백분율 (예 : 15 %)로 표시되는 경우 경계 압출 폭을 기준으로 계산됩니다." #: src/libslic3r/PrintConfig.cpp:1025 msgid "Speed for printing the internal fill. Set to zero for auto." @@ -6769,44 +6085,23 @@ msgstr "이 프로파일이 상속되는 프로파일의 이름." #: src/libslic3r/PrintConfig.cpp:1047 msgid "Interface shells" -msgstr "인터페이스 셸(shells)" +msgstr "접점 셸(shells)" #: src/libslic3r/PrintConfig.cpp:1048 -msgid "" -"Force the generation of solid shells between adjacent materials/volumes. " -"Useful for multi-extruder prints with translucent materials or manual " -"soluble support material." -msgstr "" -"인접 재료/볼륨 사이에 고체 쉘 생성을 강제하십시오. 반투명 재료 또는 수동 수용" -"성 서포트 재료를 사용한 다중 압ㅊ기 인쇄에 유용함." +msgid "Force the generation of solid shells between adjacent materials/volumes. Useful for multi-extruder prints with translucent materials or manual soluble support material." +msgstr "인접 재료/볼륨 사이에 고체 쉘 생성을 강제하십시오. 반투명 재료 또는 수동 수용성 서포트 재료를 사용한 다중 압ㅊ기 인쇄에 유용함." #: src/libslic3r/PrintConfig.cpp:1057 -msgid "" -"This custom code is inserted at every layer change, right after the Z move " -"and before the extruder moves to the first layer point. Note that you can " -"use placeholder variables for all Slic3r settings as well as [layer_num] and " -"[layer_z]." -msgstr "" -"이 사용자 정의 코드는 Z 이동 직후와 압출부가 첫 번째 레이어 포인트로 이동하" -"기 전에 모든 레이어 변경 시 삽입된다. 모든 Slic3r 설정뿐만 아니라 " -"[layer_num] 및 [layer_z]에 자리 표시자 변수를 사용할 수 있다는 점에 유의하십" -"시오." +msgid "This custom code is inserted at every layer change, right after the Z move and before the extruder moves to the first layer point. Note that you can use placeholder variables for all Slic3r settings as well as [layer_num] and [layer_z]." +msgstr "이 사용자 정의 코드는 Z 이동 직후와 압출부가 첫 번째 레이어 포인트로 이동하기 전에 모든 레이어 변경 시 삽입된다. 모든 Slic3r 설정뿐만 아니라 [layer_num] 및 [layer_z]에 자리 표시자 변수를 사용할 수 있다는 점에 유의하십시오." #: src/libslic3r/PrintConfig.cpp:1068 msgid "Supports remaining times" msgstr "남은 시간 지원" #: src/libslic3r/PrintConfig.cpp:1069 -msgid "" -"Emit M73 P[percent printed] R[remaining time in minutes] at 1 minute " -"intervals into the G-code to let the firmware show accurate remaining time. " -"As of now only the Prusa i3 MK3 firmware recognizes M73. Also the i3 MK3 " -"firmware supports M73 Qxx Sxx for the silent mode." -msgstr "" -"G 코드에 1 분 간격으로 M73 P [퍼센트 인쇄] R[remaining time in minutes]을 방" -"출하여 펌웨어가 정확한 잔여 시간을 표시 하도록 합니다. 현재만 Prusa i3 MK3 펌" -"웨어는 M73를 인식 하 고 있습니다. 또한 i3 MK3 펌웨어는 자동 모드에서 M73 Qxx " -"Sxx를 지원 합니다." +msgid "Emit M73 P[percent printed] R[remaining time in minutes] at 1 minute intervals into the G-code to let the firmware show accurate remaining time. As of now only the Prusa i3 MK3 firmware recognizes M73. Also the i3 MK3 firmware supports M73 Qxx Sxx for the silent mode." +msgstr "G 코드에 1 분 간격으로 M73 P [퍼센트 인쇄] R[remaining time in minutes]을 방출하여 펌웨어가 정확한 잔여 시간을 표시 하도록 합니다. 현재만 Prusa i3 MK3 펌웨어는 M73를 인식 하 고 있습니다. 또한 i3 MK3 펌웨어는 자동 모드에서 M73 Qxx Sxx를 지원 합니다." #: src/libslic3r/PrintConfig.cpp:1077 msgid "Supports stealth mode" @@ -6954,52 +6249,28 @@ msgstr "이 설정은 팬의 최대 속도를 나타냅니다." #: src/libslic3r/PrintConfig.cpp:1211 #, c-format -msgid "" -"This is the highest printable layer height for this extruder, used to cap " -"the variable layer height and support layer height. Maximum recommended " -"layer height is 75% of the extrusion width to achieve reasonable inter-layer " -"adhesion. If set to 0, layer height is limited to 75% of the nozzle diameter." -msgstr "" -"이것은이 익스트루더의 가장 높은 인쇄 가능 층 높이이며, 가변 층 높이 및 지지" -"층 높이를 캡하는 데 사용됩니다. 합당한 층간 접착력을 얻기 위해 최대 권장 높이" -"는 압출 폭의 75% of 입니다. 0으로 설정하면 층 높이가 노즐 지름의 75% of로 제" -"한됩니다." +msgid "This is the highest printable layer height for this extruder, used to cap the variable layer height and support layer height. Maximum recommended layer height is 75% of the extrusion width to achieve reasonable inter-layer adhesion. If set to 0, layer height is limited to 75% of the nozzle diameter." +msgstr "이것은 이 익스트루더의 가장 높은 인쇄 가능 층 높이이며, 가변 층 높이 및 지지층 높이를 캡하는 데 사용됩니다. 합당한 층간 접착력을 얻기 위해 최대 권장 높이는 압출 폭의 75% of 입니다. 0으로 설정하면 층 높이가 노즐 지름의 75% of로 제한됩니다." #: src/libslic3r/PrintConfig.cpp:1221 msgid "Max print speed" msgstr "최대 프린트 속도" #: src/libslic3r/PrintConfig.cpp:1222 -msgid "" -"When setting other speed settings to 0 Slic3r will autocalculate the optimal " -"speed in order to keep constant extruder pressure. This experimental setting " -"is used to set the highest print speed you want to allow." -msgstr "" -"다른 속도 설정을 0으로 설정할 경우, 지속적인 외부 압력을 유지하기 위해 최적" -"의 속도를 자동 계산한다. 이 실험 설정은 허용할 최대 인쇄 속도를 설정하는 데 " -"사용된다." +msgid "When setting other speed settings to 0 Slic3r will autocalculate the optimal speed in order to keep constant extruder pressure. This experimental setting is used to set the highest print speed you want to allow." +msgstr "다른 속도 설정을 0으로 설정할 경우, 지속적인 외부 압력을 유지하기 위해 최적의 속도를 자동 계산한다. 이 실험 설정은 허용할 최대 인쇄 속도를 설정하는 데 사용된다." #: src/libslic3r/PrintConfig.cpp:1232 -msgid "" -"This experimental setting is used to set the maximum volumetric speed your " -"extruder supports." -msgstr "" -"이 실험 설정은 압출기가 지원하는 최대 체적 속도를 설정하기 위해 사용된다." +msgid "This experimental setting is used to set the maximum volumetric speed your extruder supports." +msgstr "이 실험 설정은 압출기가 지원하는 최대 체적 속도를 설정하기 위해 사용된다." #: src/libslic3r/PrintConfig.cpp:1241 msgid "Max volumetric slope positive" msgstr "최대 체적 기울기 양" #: src/libslic3r/PrintConfig.cpp:1242 src/libslic3r/PrintConfig.cpp:1253 -msgid "" -"This experimental setting is used to limit the speed of change in extrusion " -"rate. A value of 1.8 mm³/s² ensures, that a change from the extrusion rate " -"of 1.8 mm³/s (0.45mm extrusion width, 0.2mm extrusion height, feedrate 20 mm/" -"s) to 5.4 mm³/s (feedrate 60 mm/s) will take at least 2 seconds." -msgstr "" -"이 실험 설정은 돌출율의 변화 속도를 제한하는데 사용된다. 1.8mm3/s2 값은 " -"1.8mm3/s(0.45mm 압출 폭, 0.2mm 압출 높이, 공급 속도 20mm/s)에서 5.4mm3/s(공" -"급 속도 60mm/s)로 변경하는 데 최소 2초 이상 걸린다." +msgid "This experimental setting is used to limit the speed of change in extrusion rate. A value of 1.8 mm³/s² ensures, that a change from the extrusion rate of 1.8 mm³/s (0.45mm extrusion width, 0.2mm extrusion height, feedrate 20 mm/s) to 5.4 mm³/s (feedrate 60 mm/s) will take at least 2 seconds." +msgstr "이 실험 설정은 돌출율의 변화 속도를 제한하는데 사용된다. 1.8mm3/s2 값은 1.8mm3/s(0.45mm 압출 폭, 0.2mm 압출 높이, 공급 속도 20mm/s)에서 5.4mm3/s(공급 속도 60mm/s)로 변경하는 데 최소 2초 이상 걸린다." #: src/libslic3r/PrintConfig.cpp:1246 src/libslic3r/PrintConfig.cpp:1257 msgid "mm³/s²" @@ -7018,13 +6289,8 @@ msgid "This setting represents the minimum PWM your fan needs to work." msgstr "이 설정은 최소 PWM팬이 활동하는데 필요한를 나타냅니다." #: src/libslic3r/PrintConfig.cpp:1274 -msgid "" -"This is the lowest printable layer height for this extruder and limits the " -"resolution for variable layer height. Typical values are between 0.05 mm and " -"0.1 mm." -msgstr "" -"이것은 이 압출기에 대한 가장 낮은 인쇄 가능한 층 높이이고 가변 층 높이에 대" -"한 분해능을 제한한다. 대표적인 값은 0.05mm와 0.1mm이다." +msgid "This is the lowest printable layer height for this extruder and limits the resolution for variable layer height. Typical values are between 0.05 mm and 0.1 mm." +msgstr "이것은 이 압출기에 대한 가장 낮은 인쇄 가능한 층 높이이고 가변 층 높이에 대한 분해능을 제한한다. 대표적인 값은 0.05mm와 0.1mm이다." #: src/libslic3r/PrintConfig.cpp:1282 msgid "Min print speed" @@ -7039,118 +6305,72 @@ msgid "Minimal filament extrusion length" msgstr "최소 필라멘트 압출 길이" #: src/libslic3r/PrintConfig.cpp:1291 -msgid "" -"Generate no less than the number of skirt loops required to consume the " -"specified amount of filament on the bottom layer. For multi-extruder " -"machines, this minimum applies to each extruder." -msgstr "" -"하단 레이어에서 지정된 양의 필라멘트를 사용하는 데 필요한 스커트 루프의 수 이" -"상으로 생성한다. 멀티 익스트루더의 경우, 이 최소값은 각 추가기기에 적용된다." +msgid "Generate no less than the number of skirt loops required to consume the specified amount of filament on the bottom layer. For multi-extruder machines, this minimum applies to each extruder." +msgstr "하단 레이어에서 지정된 양의 필라멘트를 사용하는 데 필요한 스커트 루프의 수 이상으로 생성한다. 다중 익스트루더의 경우, 이 최소값은 각 추가기기에 적용된다." #: src/libslic3r/PrintConfig.cpp:1300 msgid "Configuration notes" msgstr "구성 노트" #: src/libslic3r/PrintConfig.cpp:1301 -msgid "" -"You can put here your personal notes. This text will be added to the G-code " -"header comments." -msgstr "" -"여기에 개인 노트를 넣을 수 있다. 이 텍스트는 G-code 헤더 코멘트에 추가될 것이" -"다." +msgid "You can put here your personal notes. This text will be added to the G-code header comments." +msgstr "여기에 개인 노트를 넣을 수 있다. 이 텍스트는 G-code 헤더 코멘트에 추가될 것이다." #: src/libslic3r/PrintConfig.cpp:1311 -msgid "" -"This is the diameter of your extruder nozzle (for example: 0.5, 0.35 etc.)" -msgstr "이 지름은 엑스트루더 노즐의 직경이다(예: 0.5, 0.35 등)." +msgid "This is the diameter of your extruder nozzle (for example: 0.5, 0.35 etc.)" +msgstr "이 지름은 ㅇ스트루더 노즐의 직경이다(예: 0.5, 0.35 등)." #: src/libslic3r/PrintConfig.cpp:1316 msgid "Host Type" msgstr "호스트 유형" #: src/libslic3r/PrintConfig.cpp:1317 -msgid "" -"Slic3r can upload G-code files to a printer host. This field must contain " -"the kind of the host." -msgstr "" -"Slic3r는 프린터 호스트에 G 코드 파일을 업로드할 수 있습니다. 이 필드에는 호스" -"트의 종류가 포함 되어야 합니다." +msgid "Slic3r can upload G-code files to a printer host. This field must contain the kind of the host." +msgstr "Slic3r는 프린터 호스트에 G 코드 파일을 업로드할 수 있습니다. 이 필드에는 호스트의 종류가 포함 되어야 합니다." #: src/libslic3r/PrintConfig.cpp:1328 msgid "Only retract when crossing perimeters" msgstr "둘레를 횡단 할 때만 수축" #: src/libslic3r/PrintConfig.cpp:1329 -msgid "" -"Disables retraction when the travel path does not exceed the upper layer's " -"perimeters (and thus any ooze will be probably invisible)." -msgstr "" -"이동 경로가 상위 레이어의 경계를 초과하지 않는 경우 리트랙션을 비활성화합니" -"다. 따라서 모든 오즈가 보이지 않습니다." +msgid "Disables retraction when the travel path does not exceed the upper layer's perimeters (and thus any ooze will be probably invisible)." +msgstr "이동 경로가 상위 레이어의 경계를 초과하지 않는 경우 리트랙션을 비활성화합니다. 따라서 모든 오즈가 보이지 않습니다." #: src/libslic3r/PrintConfig.cpp:1336 -msgid "" -"This option will drop the temperature of the inactive extruders to prevent " -"oozing. It will enable a tall skirt automatically and move extruders outside " -"such skirt when changing temperatures." -msgstr "" -"이 옵션은 누출을 방지하기 위해 비활성 압출기의 온도를 떨어 뜨립니다. 온도를 " -"변경할 때 키가 큰 스커트를 자동으로 사용하고 스커트 외부로 압출기를 이동합니" -"다." +msgid "This option will drop the temperature of the inactive extruders to prevent oozing. It will enable a tall skirt automatically and move extruders outside such skirt when changing temperatures." +msgstr "이 옵션은 누출을 방지하기 위해 비활성 압출기의 온도를 떨어 뜨립니다. 온도를 변경할 때 키가 큰 스커트를 자동으로 사용하고 스커트 외부로 압출기를 이동합니다." #: src/libslic3r/PrintConfig.cpp:1343 msgid "Output filename format" msgstr "출력 파일이름 형식" #: src/libslic3r/PrintConfig.cpp:1344 -msgid "" -"You can use all configuration options as variables inside this template. For " -"example: [layer_height], [fill_density] etc. You can also use [timestamp], " -"[year], [month], [day], [hour], [minute], [second], [version], " -"[input_filename], [input_filename_base]." -msgstr "" -"모든 구성 옵션을이 템플릿 내의 변수로 사용할 수 있습니다. 예: " -"[layer_height], [fill_density] 등 또한 [타임 스탬프], [연도], [월], [일], [시" -"간], [input_filename], [input_filename_base]을 사용할 수 있습니다." +msgid "You can use all configuration options as variables inside this template. For example: [layer_height], [fill_density] etc. You can also use [timestamp], [year], [month], [day], [hour], [minute], [second], [version], [input_filename], [input_filename_base]." +msgstr "모든 구성 옵션을이 템플릿 내의 변수로 사용할 수 있습니다. 예: [layer_height], [fill_density] 등 또한 [타임 스탬프], [연도], [월], [일], [시간], [input_filename], [input_filename_base]을 사용할 수 있습니다." #: src/libslic3r/PrintConfig.cpp:1353 msgid "Detect bridging perimeters" msgstr "브릿 징 경계선 감지" #: src/libslic3r/PrintConfig.cpp:1355 -msgid "" -"Experimental option to adjust flow for overhangs (bridge flow will be used), " -"to apply bridge speed to them and enable fan." -msgstr "" -"오버행에 대한 유량을 조정하는 실험 옵션 (브리지 흐름(flow)이 사용됨)에 브릿" -"지 속도를 적용하고 팬을 활성화합니다." +msgid "Experimental option to adjust flow for overhangs (bridge flow will be used), to apply bridge speed to them and enable fan." +msgstr "오버행에 대한 유량을 조정하는 실험 옵션 (브리지 흐름(flow)이 사용됨)에 브릿지 속도를 적용하고 팬을 활성화합니다." #: src/libslic3r/PrintConfig.cpp:1361 msgid "Filament parking position" msgstr "필라멘트 멈춤 위치" #: src/libslic3r/PrintConfig.cpp:1362 -msgid "" -"Distance of the extruder tip from the position where the filament is parked " -"when unloaded. This should match the value in printer firmware." -msgstr "" -"언로딩시 필라멘트 위치에서 압출기 팁의 거리. 이 값은 프린터 펌웨어의 값과 일" -"치해야합니다." +msgid "Distance of the extruder tip from the position where the filament is parked when unloaded. This should match the value in printer firmware." +msgstr "언로딩시 필라멘트 위치에서 압출기 팁의 거리. 이 값은 프린터 펌웨어의 값과 일치해야합니다." #: src/libslic3r/PrintConfig.cpp:1370 msgid "Extra loading distance" msgstr "추가 로딩 거리" #: src/libslic3r/PrintConfig.cpp:1371 -msgid "" -"When set to zero, the distance the filament is moved from parking position " -"during load is exactly the same as it was moved back during unload. When " -"positive, it is loaded further, if negative, the loading move is shorter " -"than unloading." -msgstr "" -"0으로 설정하면로드 중에 필라멘트가 위치에서 이동 한 거리는 언로드 중에 다시 " -"이동 한 거리와 동일합니다. 양수이면 음수가 더 많이 로드되고 로드가 음수 인 경" -"우 언로드보다 짧습니다." +msgid "When set to zero, the distance the filament is moved from parking position during load is exactly the same as it was moved back during unload. When positive, it is loaded further, if negative, the loading move is shorter than unloading." +msgstr "0으로 설정하면로드 중에 필라멘트가 위치에서 이동 한 거리는 언로드 중에 다시 이동 한 거리와 동일합니다. 양수이면 음수가 더 많이 로드되고 로드가 음수 인 경우 언로드보다 짧습니다." #: src/libslic3r/PrintConfig.cpp:1379 src/libslic3r/PrintConfig.cpp:1397 #: src/libslic3r/PrintConfig.cpp:1409 src/libslic3r/PrintConfig.cpp:1419 @@ -7158,71 +6378,36 @@ msgid "Perimeters" msgstr "둘레" #: src/libslic3r/PrintConfig.cpp:1380 -msgid "" -"This is the acceleration your printer will use for perimeters. A high value " -"like 9000 usually gives good results if your hardware is up to the job. Set " -"zero to disable acceleration control for perimeters." -msgstr "" -"프린터가 둘레로 사용할 가속도입니다. 9000과 같은 높은 값은 하드웨어가 제대로 " -"작동하면 좋은 결과를 제공합니다. 주변을 가속 제어하지 않으려면 0으로 설정하십" -"시오." +msgid "This is the acceleration your printer will use for perimeters. A high value like 9000 usually gives good results if your hardware is up to the job. Set zero to disable acceleration control for perimeters." +msgstr "프린터가 둘레로 사용할 가속도입니다. 9000과 같은 높은 값은 하드웨어가 제대로 작동하면 좋은 결과를 제공합니다. 주변을 가속 제어하지 않으려면 0으로 설정하십시오." #: src/libslic3r/PrintConfig.cpp:1388 msgid "Perimeter extruder" -msgstr "주변 익스트루더" +msgstr "가장자리(Perimeter) 익스트루더" #: src/libslic3r/PrintConfig.cpp:1390 -msgid "" -"The extruder to use when printing perimeters and brim. First extruder is 1." -msgstr "" -"둘레와 가장자리를 인쇄 할 때 사용할 압출기입니다. 첫 번째 압출기는 1입니다." +msgid "The extruder to use when printing perimeters and brim. First extruder is 1." +msgstr "둘레와 가장자리를 인쇄 할 때 사용할 압출기입니다. 첫 번째 압출기는 1입니다." #: src/libslic3r/PrintConfig.cpp:1399 -msgid "" -"Set this to a non-zero value to set a manual extrusion width for perimeters. " -"You may want to use thinner extrudates to get more accurate surfaces. If " -"left zero, default extrusion width will be used if set, otherwise 1.125 x " -"nozzle diameter will be used. If expressed as percentage (for example 200%) " -"it will be computed over layer height." -msgstr "" -"이 값을 0이 아닌 값으로 설정하면 수동 압출 폭을 둘레로 설정할 수 있습니다. 보" -"다 정확한 서페이스를 얻으려면 더 얇은 압출 성형품을 사용하는 것이 좋습니다. 0" -"으로 설정하면 설정된 경우 기본 돌출 폭이 사용되고 그렇지 않으면 1.125 x 노즐 " -"직경이 사용됩니다. 백분율 (예 : 200 %)로 표현하면 레이어 높이를 기준으로 계산" -"됩니다." +msgid "Set this to a non-zero value to set a manual extrusion width for perimeters. You may want to use thinner extrudates to get more accurate surfaces. If left zero, default extrusion width will be used if set, otherwise 1.125 x nozzle diameter will be used. If expressed as percentage (for example 200%) it will be computed over layer height." +msgstr "이 값을 0이 아닌 값으로 설정하면 수동 압출 폭을 둘레로 설정할 수 있습니다. 보다 정확한 서페이스를 얻으려면 더 얇은 압출 성형품을 사용하는 것이 좋습니다. 0으로 설정하면 설정된 경우 기본 돌출 폭이 사용되고 그렇지 않으면 1.125 x 노즐 직경이 사용됩니다. 백분율 (예 : 200 %)로 표현하면 레이어 높이를 기준으로 계산됩니다." #: src/libslic3r/PrintConfig.cpp:1411 -msgid "" -"Speed for perimeters (contours, aka vertical shells). Set to zero for auto." +msgid "Speed for perimeters (contours, aka vertical shells). Set to zero for auto." msgstr "둘레의 속도 (등고선, 일명 세로 셸). 자동으로 0으로 설정하십시오." #: src/libslic3r/PrintConfig.cpp:1421 -msgid "" -"This option sets the number of perimeters to generate for each layer. Note " -"that Slic3r may increase this number automatically when it detects sloping " -"surfaces which benefit from a higher number of perimeters if the Extra " -"Perimeters option is enabled." -msgstr "" -"이 옵션은 각 레이어에 대해 생성 할 경계 수를 설정합니다. 추가 경계선 옵션을 " -"사용하면 더 큰 주변 수를 사용하는 경사면을 감지 할 때 Slic3r이이 수를 자동으" -"로 증가시킬 수 있습니다." +msgid "This option sets the number of perimeters to generate for each layer. Note that Slic3r may increase this number automatically when it detects sloping surfaces which benefit from a higher number of perimeters if the Extra Perimeters option is enabled." +msgstr "이 옵션은 각 레이어에 대해 생성 할 경계 수를 설정합니다. 추가 경계선 옵션을 사용하면 더 큰 주변 수를 사용하는 경사면을 감지 할 때 Slic3r이이 수를 자동으로 증가시킬 수 있습니다." #: src/libslic3r/PrintConfig.cpp:1425 msgid "(minimum)" msgstr "(최소)" #: src/libslic3r/PrintConfig.cpp:1433 -msgid "" -"If you want to process the output G-code through custom scripts, just list " -"their absolute paths here. Separate multiple scripts with a semicolon. " -"Scripts will be passed the absolute path to the G-code file as the first " -"argument, and they can access the Slic3r config settings by reading " -"environment variables." -msgstr "" -"사용자 정의 스크립트를 통해 출력 G 코드를 처리하려면 여기에 절대 경로를 나열" -"하십시오. 여러 개의 스크립트를 세미콜론으로 구분하십시오. 스크립트는 G 코드 " -"파일의 절대 경로를 첫 번째 인수로 전달되며 환경 변수를 읽음으로써 Slic3r 구" -"성 설정에 액세스 할 수 있습니다." +msgid "If you want to process the output G-code through custom scripts, just list their absolute paths here. Separate multiple scripts with a semicolon. Scripts will be passed the absolute path to the G-code file as the first argument, and they can access the Slic3r config settings by reading environment variables." +msgstr "사용자 정의 스크립트를 통해 출력 G 코드를 처리하려면 여기에 절대 경로를 나열하십시오. 여러 개의 스크립트를 세미콜론으로 구분하십시오. 스크립트는 G 코드 파일의 절대 경로를 첫 번째 인수로 전달되며 환경 변수를 읽음으로써 Slic3r 구성 설정에 액세스 할 수 있습니다." #: src/libslic3r/PrintConfig.cpp:1445 msgid "Printer type" @@ -7253,47 +6438,31 @@ msgid "Printer variant" msgstr "프린터 변형" #: src/libslic3r/PrintConfig.cpp:1467 -msgid "" -"Name of the printer variant. For example, the printer variants may be " -"differentiated by a nozzle diameter." -msgstr "" -"프린터 변종 이름입니다. 예를 들어, 프린터 변형은 노즐 지름으로 구별 될 수 있" -"습니다." +msgid "Name of the printer variant. For example, the printer variants may be differentiated by a nozzle diameter." +msgstr "프린터 변종 이름입니다. 예를 들어, 프린터 변형은 노즐 지름으로 구별 될 수 있습니다." #: src/libslic3r/PrintConfig.cpp:1480 msgid "Raft layers" msgstr "라프트(Raft) 레이어" #: src/libslic3r/PrintConfig.cpp:1482 -msgid "" -"The object will be raised by this number of layers, and support material " -"will be generated under it." -msgstr "" -"물체는 이 개수의 층에 의해 상승되며, 그 아래에서 서포트 재료가 생성될 것이다." +msgid "The object will be raised by this number of layers, and support material will be generated under it." +msgstr "물체는 이 개수의 층에 의해 상승되며, 그 아래에서 서포트 재료가 생성될 것이다." #: src/libslic3r/PrintConfig.cpp:1490 msgid "Resolution" -msgstr "해결" +msgstr "레졸루션" #: src/libslic3r/PrintConfig.cpp:1491 -msgid "" -"Minimum detail resolution, used to simplify the input file for speeding up " -"the slicing job and reducing memory usage. High-resolution models often " -"carry more detail than printers can render. Set to zero to disable any " -"simplification and use full resolution from input." -msgstr "" -"잘라내기 작업의 속도를 높이고 메모리 사용량을 줄이기 위해 입력 파일을 단순화" -"하는 데 사용되는 최소 세부 해상도. 고해상도 모델은 종종 프린터가 렌더링할 수 " -"있는 것보다 더 많은 디테일을 가지고 있다. 단순화를 사용하지 않고 입력에서 전" -"체 해상도를 사용하려면 0으로 설정하십시오." +msgid "Minimum detail resolution, used to simplify the input file for speeding up the slicing job and reducing memory usage. High-resolution models often carry more detail than printers can render. Set to zero to disable any simplification and use full resolution from input." +msgstr "잘라내기 작업의 속도를 높이고 메모리 사용량을 줄이기 위해 입력 파일을 단순화하는 데 사용되는 최소 세부 해상도. 고해상도 모델은 종종 프린터가 렌더링할 수 있는 것보다 더 많은 디테일을 가지고 있다. 단순화를 사용하지 않고 입력에서 전체 해상도를 사용하려면 0으로 설정하십시오." #: src/libslic3r/PrintConfig.cpp:1501 msgid "Minimum travel after retraction" msgstr "리트랙션 후 최소 이동 거리" #: src/libslic3r/PrintConfig.cpp:1502 -msgid "" -"Retraction is not triggered when travel moves are shorter than this length." +msgid "Retraction is not triggered when travel moves are shorter than this length." msgstr "이동 거리가 이 길이보다 짧으면 리트렉션이 트리거되지 않습니다." #: src/libslic3r/PrintConfig.cpp:1508 @@ -7301,12 +6470,8 @@ msgid "Retract amount before wipe" msgstr "닦아 내기 전의 수축량" #: src/libslic3r/PrintConfig.cpp:1509 -msgid "" -"With bowden extruders, it may be wise to do some amount of quick retract " -"before doing the wipe movement." -msgstr "" -"보우 덴 압출기를 사용하면 와이퍼 동작을하기 전에 약간의 빠른 리트랙션 를하는 " -"것이 좋습니다." +msgid "With bowden extruders, it may be wise to do some amount of quick retract before doing the wipe movement." +msgstr "보우 덴 압출기를 사용하면 와이퍼 동작을하기 전에 약간의 빠른 리트랙션 를하는 것이 좋습니다." #: src/libslic3r/PrintConfig.cpp:1516 msgid "Retract on layer change" @@ -7325,13 +6490,8 @@ msgid "Retraction Length" msgstr "리트랙션 길이" #: src/libslic3r/PrintConfig.cpp:1524 -msgid "" -"When retraction is triggered, filament is pulled back by the specified " -"amount (the length is measured on raw filament, before it enters the " -"extruder)." -msgstr "" -"후퇴가 트리거되면 필라멘트가 지정된 양만큼 뒤로 당겨집니다 (길이는 압출기에 " -"들어가기 전에 원시 필라멘트에서 측정됩니다)." +msgid "When retraction is triggered, filament is pulled back by the specified amount (the length is measured on raw filament, before it enters the extruder)." +msgstr "후퇴가 트리거되면 필라멘트가 지정된 양만큼 뒤로 당겨집니다 (길이는 압출기에 들어가기 전에 원시 필라멘트에서 측정됩니다)." #: src/libslic3r/PrintConfig.cpp:1526 src/libslic3r/PrintConfig.cpp:1535 msgid "mm (zero to disable)" @@ -7342,26 +6502,16 @@ msgid "Retraction Length (Toolchange)" msgstr "리트랙션 길이 (툴 체인지)" #: src/libslic3r/PrintConfig.cpp:1532 -msgid "" -"When retraction is triggered before changing tool, filament is pulled back " -"by the specified amount (the length is measured on raw filament, before it " -"enters the extruder)." -msgstr "" -"공구를 교체하기 전에 후퇴가 트리거되면 필라멘트가 지정된 양만큼 뒤로 당겨집니" -"다 (길이는 압출기에 들어가기 전에 원시 필라멘트에서 측정됩니다)." +msgid "When retraction is triggered before changing tool, filament is pulled back by the specified amount (the length is measured on raw filament, before it enters the extruder)." +msgstr "공구를 교체하기 전에 후퇴가 트리거되면 필라멘트가 지정된 양만큼 뒤로 당겨집니다 (길이는 압출기에 들어가기 전에 원시 필라멘트에서 측정됩니다)." #: src/libslic3r/PrintConfig.cpp:1540 msgid "Lift Z" msgstr "Z축 올림" #: src/libslic3r/PrintConfig.cpp:1541 -msgid "" -"If you set this to a positive value, Z is quickly raised every time a " -"retraction is triggered. When using multiple extruders, only the setting for " -"the first extruder will be considered." -msgstr "" -"이 값을 양수 값으로 설정하면 철회가 트리거 될 때마다 Z가 빠르게 올라갑니다. " -"여러 개의 압출기를 사용하는 경우 첫 번째 압출기의 설정 만 고려됩니다." +msgid "If you set this to a positive value, Z is quickly raised every time a retraction is triggered. When using multiple extruders, only the setting for the first extruder will be considered." +msgstr "이 값을 양수 값으로 설정하면 철회가 트리거 될 때마다 Z가 빠르게 올라갑니다. 여러 개의 압출기를 사용하는 경우 첫 번째 압출기의 설정 만 고려됩니다." #: src/libslic3r/PrintConfig.cpp:1548 msgid "Above Z" @@ -7372,13 +6522,8 @@ msgid "Only lift Z above" msgstr "오직 Z축 위로만" #: src/libslic3r/PrintConfig.cpp:1550 -msgid "" -"If you set this to a positive value, Z lift will only take place above the " -"specified absolute Z. You can tune this setting for skipping lift on the " -"first layers." -msgstr "" -"이것을 양의 값으로 설정하면, Z 리프트는 지정된 절대 Z 위로만 발생한다. 첫 번" -"째 층에서 리프트를 건너뛸 수 있도록 이 설정을 조정할 수 있다." +msgid "If you set this to a positive value, Z lift will only take place above the specified absolute Z. You can tune this setting for skipping lift on the first layers." +msgstr "이것을 양의 값으로 설정하면, Z 리프트는 지정된 절대 Z 위로만 발생한다. 첫 번째 층에서 리프트를 건너뛸 수 있도록 이 설정을 조정할 수 있다." #: src/libslic3r/PrintConfig.cpp:1557 msgid "Below Z" @@ -7389,33 +6534,20 @@ msgid "Only lift Z below" msgstr "Z값 아래만" #: src/libslic3r/PrintConfig.cpp:1559 -msgid "" -"If you set this to a positive value, Z lift will only take place below the " -"specified absolute Z. You can tune this setting for limiting lift to the " -"first layers." -msgstr "" -"이것을 양수 값으로 설정하면 Z 리프트가 지정된 절대 Z 아래에서만 발생합니다. " -"첫 번째 레이어로 리프트를 제한하기 위해이 설정을 조정할 수 있습니다." +msgid "If you set this to a positive value, Z lift will only take place below the specified absolute Z. You can tune this setting for limiting lift to the first layers." +msgstr "이것을 양수 값으로 설정하면 Z 리프트가 지정된 절대 Z 아래에서만 발생합니다. 첫 번째 레이어로 리프트를 제한하기 위해이 설정을 조정할 수 있습니다." #: src/libslic3r/PrintConfig.cpp:1567 src/libslic3r/PrintConfig.cpp:1575 msgid "Extra length on restart" msgstr "재시작시 여분의 길이" #: src/libslic3r/PrintConfig.cpp:1568 -msgid "" -"When the retraction is compensated after the travel move, the extruder will " -"push this additional amount of filament. This setting is rarely needed." -msgstr "" -"이동 후 리트렉셔이 보정되면 익스트루더가 추가 양의 필라멘트를 밀어냅니다. 이 " -"설정은 거의 필요하지 않습니다." +msgid "When the retraction is compensated after the travel move, the extruder will push this additional amount of filament. This setting is rarely needed." +msgstr "이동 후 리트렉셔이 보정되면 익스트루더가 추가 양의 필라멘트를 밀어냅니다. 이 설정은 거의 필요하지 않습니다." #: src/libslic3r/PrintConfig.cpp:1576 -msgid "" -"When the retraction is compensated after changing tool, the extruder will " -"push this additional amount of filament." -msgstr "" -"도구를 교환 한 후 리트렉션를 보정하면 익스트루더가 추가 양의 필라멘트를 밀게" -"됩니다." +msgid "When the retraction is compensated after changing tool, the extruder will push this additional amount of filament." +msgstr "도구를 교환 한 후 리트렉션를 보정하면 익스트루더가 추가 양의 필라멘트를 밀게됩니다." #: src/libslic3r/PrintConfig.cpp:1583 src/libslic3r/PrintConfig.cpp:1584 msgid "Retraction Speed" @@ -7430,13 +6562,8 @@ msgid "Deretraction Speed" msgstr "감속 속도" #: src/libslic3r/PrintConfig.cpp:1593 -msgid "" -"The speed for loading of a filament into extruder after retraction (it only " -"applies to the extruder motor). If left to zero, the retraction speed is " -"used." -msgstr "" -"리트랙션 후 압출기에 필라멘트를 로드하는 속도 (압출기 모터에만 적용됨). 0으" -"로 방치하면 리트랙션 속도가 사용됩니다." +msgid "The speed for loading of a filament into extruder after retraction (it only applies to the extruder motor). If left to zero, the retraction speed is used." +msgstr "리트랙션 후 압출기에 필라멘트를 로드하는 속도 (압출기 모터에만 적용됨). 0으로 방치하면 리트랙션 속도가 사용됩니다." #: src/libslic3r/PrintConfig.cpp:1600 msgid "Seam position" @@ -7496,27 +6623,19 @@ msgstr "프린터 연결을 위한 USB/시리얼 포트의 속도(보드)" #: src/libslic3r/PrintConfig.cpp:1658 msgid "Distance from object" -msgstr "객체로부터의 거리" +msgstr "객체(object)로부터의 거리" #: src/libslic3r/PrintConfig.cpp:1659 -msgid "" -"Distance between skirt and object(s). Set this to zero to attach the skirt " -"to the object(s) and get a brim for better adhesion." -msgstr "" -"스커트와 객체 사이의 거리. 스커트를 객체에 부착하고 접착력을 높이기 위해 이" -"를 0으로 설정한다." +msgid "Distance between skirt and object(s). Set this to zero to attach the skirt to the object(s) and get a brim for better adhesion." +msgstr "스커트와 객체(object) 사이의 거리. 스커트를 객체(object)에 부착하고 접착력을 높이기 위해 이를 0으로 설정한다." #: src/libslic3r/PrintConfig.cpp:1666 msgid "Skirt height" msgstr "스커트(Skirt) 높이" #: src/libslic3r/PrintConfig.cpp:1667 -msgid "" -"Height of skirt expressed in layers. Set this to a tall value to use skirt " -"as a shield against drafts." -msgstr "" -"스커트의 높이 레이어로 표현된다. 이를 높은 값으로 설정하여 스커트를 드래프트" -"에 대한 쉴ㄷ로 활용하십시오." +msgid "Height of skirt expressed in layers. Set this to a tall value to use skirt as a shield against drafts." +msgstr "스커트의 높이 레이어로 표현된다. 이를 높은 값으로 설정하여 스커트를 드래프트에 대한 쉴ㄷ로 활용하십시오." #: src/libslic3r/PrintConfig.cpp:1674 msgid "Loops (minimum)" @@ -7527,50 +6646,32 @@ msgid "Skirt Loops" msgstr "스커트 루프" #: src/libslic3r/PrintConfig.cpp:1676 -msgid "" -"Number of loops for the skirt. If the Minimum Extrusion Length option is " -"set, the number of loops might be greater than the one configured here. Set " -"this to zero to disable skirt completely." -msgstr "" -"스커트의 루프 수입니다. 최소 압출 길이 옵션을 설정한 경우 여기에 구성된 루프 " -"수보다 클 수 있다. 스커트를 완전히 비활성화하려면 이 값을 0으로 설정하십시오." +msgid "Number of loops for the skirt. If the Minimum Extrusion Length option is set, the number of loops might be greater than the one configured here. Set this to zero to disable skirt completely." +msgstr "스커트의 루프 수입니다. 최소 압출 길이 옵션을 설정한 경우 여기에 구성된 루프 수보다 클 수 있다. 스커트를 완전히 비활성화하려면 이 값을 0으로 설정하십시오." #: src/libslic3r/PrintConfig.cpp:1684 msgid "Slow down if layer print time is below" msgstr "레이어 인쇄 시간이 다음과 같은 경우 속도를 낮추십시오" #: src/libslic3r/PrintConfig.cpp:1685 -msgid "" -"If layer print time is estimated below this number of seconds, print moves " -"speed will be scaled down to extend duration to this value." -msgstr "" -"층 인쇄 시간이 이 시간보다 낮게 추정될 경우, 인쇄 이동 속도는 이 값으로 지속" -"되도록 축소된다." +msgid "If layer print time is estimated below this number of seconds, print moves speed will be scaled down to extend duration to this value." +msgstr "층 인쇄 시간이 이 시간보다 낮게 추정될 경우, 인쇄 이동 속도는 이 값으로 지속되도록 축소된다." #: src/libslic3r/PrintConfig.cpp:1695 msgid "Small perimeters" msgstr "작은 둘레" #: src/libslic3r/PrintConfig.cpp:1697 -msgid "" -"This separate setting will affect the speed of perimeters having radius <= " -"6.5mm (usually holes). If expressed as percentage (for example: 80%) it will " -"be calculated on the perimeters speed setting above. Set to zero for auto." -msgstr "" -"이 개별 설정은 반경이 6.5mm 미만인 속도 (일반적으로 구멍)에 영향을줍니다. 백" -"분율로 표시되는 경우 (예 : 80 %) 위의 속도 설정에서 계산됩니다. 자동으로 0으" -"로 설정하십시오." +msgid "This separate setting will affect the speed of perimeters having radius <= 6.5mm (usually holes). If expressed as percentage (for example: 80%) it will be calculated on the perimeters speed setting above. Set to zero for auto." +msgstr "이 개별 설정은 반경이 6.5mm 미만인 속도 (일반적으로 구멍)에 영향을줍니다. 백분율로 표시되는 경우 (예 : 80 %) 위의 속도 설정에서 계산됩니다. 자동으로 0으로 설정하십시오." #: src/libslic3r/PrintConfig.cpp:1707 msgid "Solid infill threshold area" -msgstr "솔리드 채우기 임계값 영역" +msgstr "솔리드 채우기 임계값" #: src/libslic3r/PrintConfig.cpp:1709 -msgid "" -"Force solid infill for regions having a smaller area than the specified " -"threshold." -msgstr "" -"지정된 한계값보다 작은 영역을 가진 영역에 대해 솔리드 인필을 강제 적용." +msgid "Force solid infill for regions having a smaller area than the specified threshold." +msgstr "지정된 한계값보다 작은 영역을 가진 영역에 대해 솔리드 인필을 강제 적용." #: src/libslic3r/PrintConfig.cpp:1710 msgid "mm²" @@ -7589,35 +6690,16 @@ msgid "Solid infill every" msgstr "솔리드 인필 간격" #: src/libslic3r/PrintConfig.cpp:1726 -msgid "" -"This feature allows to force a solid layer every given number of layers. " -"Zero to disable. You can set this to any value (for example 9999); Slic3r " -"will automatically choose the maximum possible number of layers to combine " -"according to nozzle diameter and layer height." -msgstr "" -"이 특징은 주어진 개수의 층마다 단단한 층을 넣을수 있게 한다. 비활성화할 수 없" -"음. 당신은 이것을 어떤 값으로도 설정할 수 있다(예: 9999). Slic3r는 노즐 직경" -"과 층 높이에 따라 결합할 최대 가능한 층 수를 자동으로 선택한다." +msgid "This feature allows to force a solid layer every given number of layers. Zero to disable. You can set this to any value (for example 9999); Slic3r will automatically choose the maximum possible number of layers to combine according to nozzle diameter and layer height." +msgstr "이 특징은 주어진 개수의 층마다 단단한 층을 넣을수 있게 한다. 비활성화할 수 없음. 당신은 이것을 어떤 값으로도 설정할 수 있다(예: 9999). Slic3r는 노즐 직경과 층 높이에 따라 결합할 최대 가능한 층 수를 자동으로 선택한다." #: src/libslic3r/PrintConfig.cpp:1738 -msgid "" -"Set this to a non-zero value to set a manual extrusion width for infill for " -"solid surfaces. If left zero, default extrusion width will be used if set, " -"otherwise 1.125 x nozzle diameter will be used. If expressed as percentage " -"(for example 90%) it will be computed over layer height." -msgstr "" -"이 값을 0이 아닌 값으로 설정하여 솔리드 표면 인필에 대한 수동 압출 폭을 설정" -"하십시오. 0인 경우 기본 압출 너비가 사용되며, 그렇지 않으면 1.125 x 노즐 직경" -"이 사용된다. 백분율(예: 90%)로 표현되는 경우, 계층 높이에 걸쳐 계산된다." +msgid "Set this to a non-zero value to set a manual extrusion width for infill for solid surfaces. If left zero, default extrusion width will be used if set, otherwise 1.125 x nozzle diameter will be used. If expressed as percentage (for example 90%) it will be computed over layer height." +msgstr "이 값을 0이 아닌 값으로 설정하여 솔리드 표면 인필에 대한 수동 압출 폭을 설정하십시오. 0인 경우 기본 압출 너비가 사용되며, 그렇지 않으면 1.125 x 노즐 직경이 사용된다. 백분율(예: 90%)로 표현되는 경우, 계층 높이에 걸쳐 계산된다." #: src/libslic3r/PrintConfig.cpp:1748 -msgid "" -"Speed for printing solid regions (top/bottom/internal horizontal shells). " -"This can be expressed as a percentage (for example: 80%) over the default " -"infill speed above. Set to zero for auto." -msgstr "" -"솔리드 영역(상단/하부/내부 수평 셸) 인쇄 속도 이는 위의 기본 주입 속도에 대" -"한 백분율(예: 80%)로 표시할 수 있다. 자동을 위해 0으로 설정한다." +msgid "Speed for printing solid regions (top/bottom/internal horizontal shells). This can be expressed as a percentage (for example: 80%) over the default infill speed above. Set to zero for auto." +msgstr "솔리드 영역(상단/하부/내부 수평 셸) 인쇄 속도 이는 위의 기본 주입 속도에 대한 백분율(예: 80%)로 표시할 수 있다. 자동을 위해 0으로 설정한다." #: src/libslic3r/PrintConfig.cpp:1760 msgid "Number of solid layers to generate on top and bottom surfaces." @@ -7628,69 +6710,24 @@ msgid "Spiral vase" msgstr "스파이럴 바이스" #: src/libslic3r/PrintConfig.cpp:1767 -msgid "" -"This feature will raise Z gradually while printing a single-walled object in " -"order to remove any visible seam. This option requires a single perimeter, " -"no infill, no top solid layers and no support material. You can still set " -"any number of bottom solid layers as well as skirt/brim loops. It won't work " -"when printing more than an object." -msgstr "" -"이 기능은 단일 벽 물체를 인쇄하는 동안 눈에 보이는 심을 제거하기 위해 Z를 점" -"진적으로 상승시킨다. 이 옵션은 단일 둘레, 주입, 상단 솔리드 레이어 및 지지 재" -"료가 필요하지 않다. 당신은 스커트/브림 루프뿐만 아니라 아래 솔리드 레이어의 " -"수에 상관없이 설정할 수 있다. 그것은 물체보다 더 많이 인쇄할 때는 작동하지 않" -"을 것이다." +msgid "This feature will raise Z gradually while printing a single-walled object in order to remove any visible seam. This option requires a single perimeter, no infill, no top solid layers and no support material. You can still set any number of bottom solid layers as well as skirt/brim loops. It won't work when printing more than an object." +msgstr "이 기능은 단일 벽 물체를 인쇄하는 동안 눈에 보이는 심을 제거하기 위해 Z를 점진적으로 상승시킨다. 이 옵션은 단일 둘레, 주입, 상단 솔리드 레이어 및 지지 재료가 필요하지 않다. 당신은 스커트/브림 루프뿐만 아니라 아래 솔리드 레이어의 수에 상관없이 설정할 수 있다. 그것은 물체보다 더 많이 인쇄할 때는 작동하지 않을 것이다." #: src/libslic3r/PrintConfig.cpp:1775 msgid "Temperature variation" msgstr "온도 변화" #: src/libslic3r/PrintConfig.cpp:1776 -msgid "" -"Temperature difference to be applied when an extruder is not active. Enables " -"a full-height \"sacrificial\" skirt on which the nozzles are periodically " -"wiped." -msgstr "" -"돌출부가 활성화되지 않은 경우 적용되는 온도 차이. 노즐을 주기적으로 닦는 전" -"체 높이 \"인공\" 스커트가 가능하다." +msgid "Temperature difference to be applied when an extruder is not active. Enables a full-height \"sacrificial\" skirt on which the nozzles are periodically wiped." +msgstr "돌출부가 활성화되지 않은 경우 적용되는 온도 차이. 노즐을 주기적으로 닦는 전체 높이 \"인공\" 스커트가 가능하다." #: src/libslic3r/PrintConfig.cpp:1786 -msgid "" -"This start procedure is inserted at the beginning, after bed has reached the " -"target temperature and extruder just started heating, and before extruder " -"has finished heating. If Slic3r detects M104 or M190 in your custom codes, " -"such commands will not be prepended automatically so you're free to " -"customize the order of heating commands and other custom actions. Note that " -"you can use placeholder variables for all Slic3r settings, so you can put a " -"\"M109 S[first_layer_temperature]\" command wherever you want." -msgstr "" -"이 시작 절차는 침대가 목표 온도에 도달하고 압출기가 막 가열을 시작한 직후 및 " -"압출기가 가열을 완료하기 전에 처음에 삽입됩니다. Slic3r이 사용자 지정 코드에" -"서 M104 또는 M190을 감지하면 이러한 명령은 자동으로 추가되지 않으므로 가열 명" -"령 및 기타 사용자 지정 동작의 순서를 자유롭게 사용자 지정할 수 있습니다. 모" -"든 Slic3r 설정에 자리 표시 자 변수를 사용할 수 있으므로 원하는 위치에 \"M109 " -"S [first_layer_temperature]\"명령을 넣을 수 있습니다." +msgid "This start procedure is inserted at the beginning, after bed has reached the target temperature and extruder just started heating, and before extruder has finished heating. If Slic3r detects M104 or M190 in your custom codes, such commands will not be prepended automatically so you're free to customize the order of heating commands and other custom actions. Note that you can use placeholder variables for all Slic3r settings, so you can put a \"M109 S[first_layer_temperature]\" command wherever you want." +msgstr "이 시작 절차는 침대가 목표 온도에 도달하고 압출기가 막 가열을 시작한 직후 및 압출기가 가열을 완료하기 전에 처음에 삽입됩니다. Slic3r이 사용자 지정 코드에서 M104 또는 M190을 감지하면 이러한 명령은 자동으로 추가되지 않으므로 가열 명령 및 기타 사용자 지정 동작의 순서를 자유롭게 사용자 지정할 수 있습니다. 모든 Slic3r 설정에 자리 표시 자 변수를 사용할 수 있으므로 원하는 위치에 \"M109 S [first_layer_temperature]\"명령을 넣을 수 있습니다." #: src/libslic3r/PrintConfig.cpp:1801 -msgid "" -"This start procedure is inserted at the beginning, after any printer start " -"gcode (and after any toolchange to this filament in case of multi-material " -"printers). This is used to override settings for a specific filament. If " -"Slic3r detects M104, M109, M140 or M190 in your custom codes, such commands " -"will not be prepended automatically so you're free to customize the order of " -"heating commands and other custom actions. Note that you can use placeholder " -"variables for all Slic3r settings, so you can put a \"M109 " -"S[first_layer_temperature]\" command wherever you want. If you have multiple " -"extruders, the gcode is processed in extruder order." -msgstr "" -"이 시작 절차는 프린터가 gcode를 시작한 후(그리고 다중 재질 프린터의 경우 이 " -"필라멘트에 대한 도구 변경 후) 처음에 삽입됩니다. 특정 필라멘트에 대한 설정을 " -"재정의하는 데 사용됩니다. Slic3r가 사용자 지정 코드에서 M104, M109, M140 또" -"는 M190을 감지하면 이러한 명령이 자동으로 준비되지 않으므로 가열 명령 및 기" -"타 사용자 지정 작업의 순서를 자유롭게 사용자 지정할 수 있습니다. 모든 Slic3r " -"설정에 자리 표시자 변수를 사용할 수 있으므로 원하는 위치에 \"M109 " -"S[first_layer_temperature]\" 명령을 넣을 수 있습니다. 압출기가 여러 개 있는 " -"경우 gcode는 압출기 순서로 처리됩니다." +msgid "This start procedure is inserted at the beginning, after any printer start gcode (and after any toolchange to this filament in case of multi-material printers). This is used to override settings for a specific filament. If Slic3r detects M104, M109, M140 or M190 in your custom codes, such commands will not be prepended automatically so you're free to customize the order of heating commands and other custom actions. Note that you can use placeholder variables for all Slic3r settings, so you can put a \"M109 S[first_layer_temperature]\" command wherever you want. If you have multiple extruders, the gcode is processed in extruder order." +msgstr "이 시작 절차는 프린터가 gcode를 시작한 후(그리고 다중 재질 프린터의 경우 이 필라멘트에 대한 도구 변경 후) 처음에 삽입됩니다. 특정 필라멘트에 대한 설정을 재정의하는 데 사용됩니다. Slic3r가 사용자 지정 코드에서 M104, M109, M140 또는 M190을 감지하면 이러한 명령이 자동으로 준비되지 않으므로 가열 명령 및 기타 사용자 지정 작업의 순서를 자유롭게 사용자 지정할 수 있습니다. 모든 Slic3r 설정에 자리 표시자 변수를 사용할 수 있으므로 원하는 위치에 \"M109 S[first_layer_temperature]\" 명령을 넣을 수 있습니다. 압출기가 여러 개 있는 경우 gcode는 압출기 순서로 처리됩니다." #: src/libslic3r/PrintConfig.cpp:1817 msgid "Single Extruder Multi Material" @@ -7698,19 +6735,15 @@ msgstr "싱글 익스트루더 멀티메터리얼" #: src/libslic3r/PrintConfig.cpp:1818 msgid "The printer multiplexes filaments into a single hot end." -msgstr "프린터는 필라멘트를 하나의 핫 엔드에 멀티플렉싱합니다." +msgstr "프린터는 필라멘트를 하나의 핫 엔드에 다중플렉싱합니다." #: src/libslic3r/PrintConfig.cpp:1823 msgid "Prime all printing extruders" msgstr "모든 인쇄 압출기 프라임" #: src/libslic3r/PrintConfig.cpp:1824 -msgid "" -"If enabled, all printing extruders will be primed at the front edge of the " -"print bed at the start of the print." -msgstr "" -"활성화 된 경우, 모든 인쇄 압출기는 인쇄 시작시 프린트 베드의 전면 가장자리에 " -"프라이밍 됩니다." +msgid "If enabled, all printing extruders will be primed at the front edge of the print bed at the start of the print." +msgstr "활성화 된 경우, 모든 인쇄 압출기는 인쇄 시작시 프린트 베드의 전면 가장자리에 프라이밍 됩니다." #: src/libslic3r/PrintConfig.cpp:1829 msgid "Generate support material" @@ -7725,57 +6758,36 @@ msgid "Auto generated supports" msgstr "자동 생성 지원" #: src/libslic3r/PrintConfig.cpp:1837 -msgid "" -"If checked, supports will be generated automatically based on the overhang " -"threshold value. If unchecked, supports will be generated inside the " -"\"Support Enforcer\" volumes only." -msgstr "" -"이 옵션을 선택 하면 오버행 임계값에 따라 서포트가 자동으로 생성 됩니다. 이 확" -"인란을 선택 하지 않으면 \"서포트 지원 영역\" 볼륨 내 에서만 지원이 생성 됩니" -"다." +msgid "If checked, supports will be generated automatically based on the overhang threshold value. If unchecked, supports will be generated inside the \"Support Enforcer\" volumes only." +msgstr "이 옵션을 선택 하면 오버행 임계값에 따라 서포트가 자동으로 생성 됩니다. 이 확인란을 선택 하지 않으면 \"서포트 지원 영역\" 볼륨 내 에서만 지원이 생성 됩니다." #: src/libslic3r/PrintConfig.cpp:1843 msgid "XY separation between an object and its support" msgstr "물체와 그 서포트 사이 XY 분리" #: src/libslic3r/PrintConfig.cpp:1845 -msgid "" -"XY separation between an object and its support. If expressed as percentage " -"(for example 50%), it will be calculated over external perimeter width." -msgstr "" -"객체와 그 서포트 사이의 XY 분리. 백분율 (예 : 50 %)로 표시되는 경우 외부 둘" -"레 너비를 기준으로 계산됩니다." +msgid "XY separation between an object and its support. If expressed as percentage (for example 50%), it will be calculated over external perimeter width." +msgstr "객체(object)와 그 서포트 사이의 XY 분리. 백분율 (예 : 50 %)로 표시되는 경우 외부 둘레 너비를 기준으로 계산됩니다." #: src/libslic3r/PrintConfig.cpp:1855 msgid "Pattern angle" msgstr "채움 각도" #: src/libslic3r/PrintConfig.cpp:1857 -msgid "" -"Use this setting to rotate the support material pattern on the horizontal " -"plane." +msgid "Use this setting to rotate the support material pattern on the horizontal plane." msgstr "이 설정을 사용하여지지 평면 패턴을 수평면으로 회전시킵니다." #: src/libslic3r/PrintConfig.cpp:1867 src/libslic3r/PrintConfig.cpp:2531 -msgid "" -"Only create support if it lies on a build plate. Don't create support on a " -"print." -msgstr "" -"그것이 빌드 플레이트에있는 경우에만 지원을 작성하십시오. 인쇄물에 대한 지원" -"을 작성하지 마십시오." +msgid "Only create support if it lies on a build plate. Don't create support on a print." +msgstr "그것이 빌드 플레이트에있는 경우에만 지원을 작성하십시오. 인쇄물에 대한 지원을 작성하지 마십시오." #: src/libslic3r/PrintConfig.cpp:1873 msgid "Contact Z distance" msgstr "Z 거리 문의" #: src/libslic3r/PrintConfig.cpp:1875 -msgid "" -"The vertical distance between object and support material interface. Setting " -"this to 0 will also prevent Slic3r from using bridge flow and speed for the " -"first object layer." -msgstr "" -"물체와 서포트 사이의 수직 거리. 이 값을 0으로 설정하면 Slic3r이 첫 번째 객체 " -"레이어에 브리지 흐름과 속도를 사용하지 못하게됩니다." +msgid "The vertical distance between object and support material interface. Setting this to 0 will also prevent Slic3r from using bridge flow and speed for the first object layer." +msgstr "물체와 서포트 사이의 수직 거리. 이 값을 0으로 설정하면 Slic3r이 첫 번째 객체(object) 레이어에 브리지 흐름과 속도를 사용하지 못하게됩니다." #: src/libslic3r/PrintConfig.cpp:1882 msgid "0 (soluble)" @@ -7790,15 +6802,8 @@ msgid "Enforce support for the first" msgstr "첫 번째 서포트 더 강화" #: src/libslic3r/PrintConfig.cpp:1890 -msgid "" -"Generate support material for the specified number of layers counting from " -"bottom, regardless of whether normal support material is enabled or not and " -"regardless of any angle threshold. This is useful for getting more adhesion " -"of objects having a very thin or poor footprint on the build plate." -msgstr "" -"일반적인 서포트 소재의 활성화 여부와, 각도 임계 값에 관계없이 하단에서부터 세" -"어 지정된 레이어 수에 대한지지 자료를 생성합니다. 이것은 빌드 플레이트에 매" -"우 얇거나 부족한 풋 프린트를 가진 물체를 더 많이 부착 할 때 유용합니다." +msgid "Generate support material for the specified number of layers counting from bottom, regardless of whether normal support material is enabled or not and regardless of any angle threshold. This is useful for getting more adhesion of objects having a very thin or poor footprint on the build plate." +msgstr "일반적인 서포트 소재의 활성화 여부와, 각도 임계 값에 관계없이 하단에서부터 세어 지정된 레이어 수에 대한지지 자료를 생성합니다. 이것은 빌드 플레이트에 매우 얇거나 부족한 풋 프린트를 가진 물체를 더 많이 부착 할 때 유용합니다." #: src/libslic3r/PrintConfig.cpp:1895 msgid "Enforce support for the first n layers" @@ -7809,73 +6814,48 @@ msgid "Support material/raft/skirt extruder" msgstr "서포트 재료 / 라프트 / 스커트 익스트루더" #: src/libslic3r/PrintConfig.cpp:1903 -msgid "" -"The extruder to use when printing support material, raft and skirt (1+, 0 to " -"use the current extruder to minimize tool changes)." -msgstr "" -"서포트 재료, 라프트 및 스커트를 인쇄 할 때 사용하는 압출기 (도구 변경을 최소" -"화하기 위해 현재 압출기를 사용하려면 1+, 0)." +msgid "The extruder to use when printing support material, raft and skirt (1+, 0 to use the current extruder to minimize tool changes)." +msgstr "서포트 재료, 라프트 및 스커트를 인쇄 할 때 사용하는 압출기 (도구 변경을 최소화하기 위해 현재 압출기를 사용하려면 1+, 0)." #: src/libslic3r/PrintConfig.cpp:1912 -msgid "" -"Set this to a non-zero value to set a manual extrusion width for support " -"material. If left zero, default extrusion width will be used if set, " -"otherwise nozzle diameter will be used. If expressed as percentage (for " -"example 90%) it will be computed over layer height." -msgstr "" -"서포트 재료의 수동 압출 폭을 설정하려면이 값을 0이 아닌 값으로 설정하십시오. " -"0으로 설정하면 설정된 경우 기본 압출 폭이 사용되고 그렇지 않으면 노즐 지름이 " -"사용됩니다. 백분율 (예 : 90 %)로 표현하면 레이어 높이를 기준으로 계산됩니다." +msgid "Set this to a non-zero value to set a manual extrusion width for support material. If left zero, default extrusion width will be used if set, otherwise nozzle diameter will be used. If expressed as percentage (for example 90%) it will be computed over layer height." +msgstr "서포트 재료의 수동 압출 폭을 설정하려면이 값을 0이 아닌 값으로 설정하십시오. 0으로 설정하면 설정된 경우 기본 압출 폭이 사용되고 그렇지 않으면 노즐 지름이 사용됩니다. 백분율 (예 : 90 %)로 표현하면 레이어 높이를 기준으로 계산됩니다." #: src/libslic3r/PrintConfig.cpp:1920 msgid "Interface loops" -msgstr "인터페이스 루프" +msgstr "접점 루프" #: src/libslic3r/PrintConfig.cpp:1922 -msgid "" -"Cover the top contact layer of the supports with loops. Disabled by default." +msgid "Cover the top contact layer of the supports with loops. Disabled by default." msgstr "지지대의 상단 접촉 층을 루프로 덮으십시오. 기본적으로 사용 안 함." #: src/libslic3r/PrintConfig.cpp:1927 msgid "Support material/raft interface extruder" -msgstr "서포트 재료/라프트 인터페이스 익스트루더" +msgstr "서포트 재료/라프트 접점 익스트루더" #: src/libslic3r/PrintConfig.cpp:1929 -msgid "" -"The extruder to use when printing support material interface (1+, 0 to use " -"the current extruder to minimize tool changes). This affects raft too." -msgstr "" -"서포트 재료 인터페이스를 인쇄 할 때 사용할 익스트루더 (도구 변경을 최소화하" -"기 위해 현재 익스트루더를 사용하려면 1+, 0). 이것은 라프트에도 영향을 미칩니" -"다." +msgid "The extruder to use when printing support material interface (1+, 0 to use the current extruder to minimize tool changes). This affects raft too." +msgstr "서포트 재료 접점를 인쇄 할 때 사용할 익스트루더 (도구 변경을 최소화하기 위해 현재 익스트루더를 사용하려면 1+, 0). 이것은 라프트에도 영향을 미칩니다." #: src/libslic3r/PrintConfig.cpp:1936 msgid "Interface layers" -msgstr "인터페이스 레이어" +msgstr "접점 레이어" #: src/libslic3r/PrintConfig.cpp:1938 -msgid "" -"Number of interface layers to insert between the object(s) and support " -"material." -msgstr "객체와 서포트 재료 사이에 삽입할 인터페이스 레이어 수입니다." +msgid "Number of interface layers to insert between the object(s) and support material." +msgstr "객체(object)와 서포트 재료 사이에 삽입할 접점 레이어 수입니다." #: src/libslic3r/PrintConfig.cpp:1945 msgid "Interface pattern spacing" -msgstr "인터페이스 패턴 간격" +msgstr "접점 패턴 간격" #: src/libslic3r/PrintConfig.cpp:1947 msgid "Spacing between interface lines. Set zero to get a solid interface." -msgstr "" -"인터페이스 라인 간 간격. 솔리드 인터페이스를 가져오려면 0을 설정하십시오." +msgstr "접점 라인 간 간격. 솔리드 접점를 가져오려면 0을 설정하십시오." #: src/libslic3r/PrintConfig.cpp:1956 -msgid "" -"Speed for printing support material interface layers. If expressed as " -"percentage (for example 50%) it will be calculated over support material " -"speed." -msgstr "" -"서포트 재료 인터페이스 레이어 인쇄 속도 백분율(예: 50%)로 표현될 경우 서포트 " -"재료 속도에 따라 계산된다." +msgid "Speed for printing support material interface layers. If expressed as percentage (for example 50%) it will be calculated over support material speed." +msgstr "서포트 재료 접점 레이어 인쇄 속도 백분율(예: 50%)로 표현될 경우 서포트 재료 속도에 따라 계산된다." #: src/libslic3r/PrintConfig.cpp:1965 msgid "Pattern" @@ -7903,60 +6883,38 @@ msgstr "서포트 재료를 인쇄하는 속도." #: src/libslic3r/PrintConfig.cpp:1997 msgid "Synchronize with object layers" -msgstr "객체 레이어와 동기화" +msgstr "객체(object) 레이어와 동기화" #: src/libslic3r/PrintConfig.cpp:1999 -msgid "" -"Synchronize support layers with the object print layers. This is useful with " -"multi-material printers, where the extruder switch is expensive." -msgstr "" -"서포트 레이어를 프린트 레이어와 동기화하십시오. 이것은 스위치가 비싼 멀티 메" -"터리얼 프린터에서 유용하다." +msgid "Synchronize support layers with the object print layers. This is useful with multi-material printers, where the extruder switch is expensive." +msgstr "서포트 레이어를 프린트 레이어와 동기화하십시오. 이것은 스위치가 비싼 다중 메터리얼 프린터에서 유용하다." #: src/libslic3r/PrintConfig.cpp:2005 msgid "Overhang threshold" msgstr "오버행 한계점" #: src/libslic3r/PrintConfig.cpp:2007 -msgid "" -"Support material will not be generated for overhangs whose slope angle (90° " -"= vertical) is above the given threshold. In other words, this value " -"represent the most horizontal slope (measured from the horizontal plane) " -"that you can print without support material. Set to zero for automatic " -"detection (recommended)." -msgstr "" -"서포트 재료는 경사각(90° = 수직)이 지정된 임계점보다 높은 압출에 대해서는 생" -"성되지 않는다. 즉, 이 값은 서포트 재료 없이 인쇄할 수 있는 가장 수평 경사(수" -"평면에서 측정됨)를 나타낸다. 자동 감지를 위해 0으로 설정하십시오(권장)." +msgid "Support material will not be generated for overhangs whose slope angle (90° = vertical) is above the given threshold. In other words, this value represent the most horizontal slope (measured from the horizontal plane) that you can print without support material. Set to zero for automatic detection (recommended)." +msgstr "서포트 재료는 경사각(90° = 수직)이 지정된 임계점보다 높은 압출에 대해서는 생성되지 않는다. 즉, 이 값은 서포트 재료 없이 인쇄할 수 있는 가장 수평 경사(수평면에서 측정됨)를 나타낸다. 자동 감지를 위해 0으로 설정하십시오(권장)." #: src/libslic3r/PrintConfig.cpp:2019 msgid "With sheath around the support" msgstr "서포트 주변이나 외부로" #: src/libslic3r/PrintConfig.cpp:2021 -msgid "" -"Add a sheath (a single perimeter line) around the base support. This makes " -"the support more reliable, but also more difficult to remove." -msgstr "" -"기본 서포트 주위에 외장 (단일 주변 선)을 추가하십시오. 이것은 페이스 업을보" -"다 신뢰성있게 만들뿐만 아니라 제거하기도 어렵습니다." +msgid "Add a sheath (a single perimeter line) around the base support. This makes the support more reliable, but also more difficult to remove." +msgstr "기본 서포트 주위에 외장 (단일 주변 선)을 추가하십시오. 이것은 페이스 업을보다 신뢰성있게 만들뿐만 아니라 제거하기도 어렵습니다." #: src/libslic3r/PrintConfig.cpp:2028 -msgid "" -"Extruder temperature for layers after the first one. Set this to zero to " -"disable temperature control commands in the output." -msgstr "" -"첫 번째 것 이후에 레이어에 대한 더 낮은 온도. 이 값을 0으로 설정하면 출력에" -"서 ​​온도 제어 명령을 비활성화 할 수 있습니다." +msgid "Extruder temperature for layers after the first one. Set this to zero to disable temperature control commands in the output." +msgstr "첫 번째 것 이후에 레이어에 대한 더 낮은 온도. 이 값을 0으로 설정하면 출력에서 ​​온도 제어 명령을 비활성화 할 수 있습니다." #: src/libslic3r/PrintConfig.cpp:2036 msgid "Detect thin walls" msgstr "얇은 벽(walls) 감지" #: src/libslic3r/PrintConfig.cpp:2038 -msgid "" -"Detect single-width walls (parts where two extrusions don't fit and we need " -"to collapse them into a single trace)." +msgid "Detect single-width walls (parts where two extrusions don't fit and we need to collapse them into a single trace)." msgstr "싱글 너비 벽 (두 부분이 맞지 않는 부분과 무너지는 부분)을 감지합니다." #: src/libslic3r/PrintConfig.cpp:2044 @@ -7964,54 +6922,20 @@ msgid "Threads" msgstr "스레드(Threads)" #: src/libslic3r/PrintConfig.cpp:2045 -msgid "" -"Threads are used to parallelize long-running tasks. Optimal threads number " -"is slightly above the number of available cores/processors." -msgstr "" -"스레드는 장기 실행 태스크를 병렬 처리하는 데 사용됩니다. 최적의 스레드 수는 " -"사용 가능한 코어 / 프로세서 수보다 약간 높습니다." +msgid "Threads are used to parallelize long-running tasks. Optimal threads number is slightly above the number of available cores/processors." +msgstr "스레드는 장기 실행 태스크를 병렬 처리하는 데 사용됩니다. 최적의 스레드 수는 사용 가능한 코어 / 프로세서 수보다 약간 높습니다." #: src/libslic3r/PrintConfig.cpp:2057 -msgid "" -"This custom code is inserted at every extruder change. If you don't leave " -"this empty, you are expected to take care of the toolchange yourself - " -"PrusaSlicer will not output any other G-code to change the filament. You can " -"use placeholder variables for all Slic3r settings as well as " -"[previous_extruder] and [next_extruder], so e.g. the standard toolchange " -"command can be scripted as T[next_extruder]." -msgstr "" -"이 사용자 지정 코드는 모든 압출기 변경 시 삽입됩니다. 이 것을 비워 두지 않으" -"면 도구 변경을 직접 처리해야합니다 - PrusaSlicer는 필라멘트를 변경하기 위해 " -"다른 G 코드를 출력하지 않습니다. 모든 Slic3r 설정과 [이전_압출기] 및 " -"[next_extruder]에 대해 자리 표시자 변수를 사용할 수 있으므로 표준 도구 변경 " -"명령을 T[next_extruder]로 스크립팅할 수 있습니다." +msgid "This custom code is inserted at every extruder change. If you don't leave this empty, you are expected to take care of the toolchange yourself - PrusaSlicer will not output any other G-code to change the filament. You can use placeholder variables for all Slic3r settings as well as [previous_extruder] and [next_extruder], so e.g. the standard toolchange command can be scripted as T[next_extruder]." +msgstr "이 사용자 지정 코드는 모든 압출기 변경 시 삽입됩니다. 이 것을 비워 두지 않으면 도구 변경을 직접 처리해야합니다 - PrusaSlicer는 필라멘트를 변경하기 위해 다른 G 코드를 출력하지 않습니다. 모든 Slic3r 설정과 [이전_압출기] 및 [next_extruder]에 대해 자리 표시자 변수를 사용할 수 있으므로 표준 도구 변경 명령을 T[next_extruder]로 스크립팅할 수 있습니다." #: src/libslic3r/PrintConfig.cpp:2070 -msgid "" -"Set this to a non-zero value to set a manual extrusion width for infill for " -"top surfaces. You may want to use thinner extrudates to fill all narrow " -"regions and get a smoother finish. If left zero, default extrusion width " -"will be used if set, otherwise nozzle diameter will be used. If expressed as " -"percentage (for example 90%) it will be computed over layer height." -msgstr "" -"이 값을 0이 아닌 값으로 설정하여 상단 서피스에 대한 infill의 수동 압출 폭을 " -"설정합니다. 얇은 압출 성형물을 사용하여 모든 좁은 지역을 채우고 더 매끄러운 " -"마무리를 할 수 있습니다. 0으로 설정된 경우 기본 압출 폭이 사용되고 그렇지 않" -"으면 노즐 지름이 사용됩니다. 백분율 (예 : 90 %)로 표현하면 레이어 높이를 기준" -"으로 계산됩니다." +msgid "Set this to a non-zero value to set a manual extrusion width for infill for top surfaces. You may want to use thinner extrudates to fill all narrow regions and get a smoother finish. If left zero, default extrusion width will be used if set, otherwise nozzle diameter will be used. If expressed as percentage (for example 90%) it will be computed over layer height." +msgstr "이 값을 0이 아닌 값으로 설정하여 상단 서피스에 대한 infill의 수동 압출 폭을 설정합니다. 얇은 압출 성형물을 사용하여 모든 좁은 지역을 채우고 더 매끄러운 마무리를 할 수 있습니다. 0으로 설정된 경우 기본 압출 폭이 사용되고 그렇지 않으면 노즐 지름이 사용됩니다. 백분율 (예 : 90 %)로 표현하면 레이어 높이를 기준으로 계산됩니다." #: src/libslic3r/PrintConfig.cpp:2081 -msgid "" -"Speed for printing top solid layers (it only applies to the uppermost " -"external layers and not to their internal solid layers). You may want to " -"slow down this to get a nicer surface finish. This can be expressed as a " -"percentage (for example: 80%) over the solid infill speed above. Set to zero " -"for auto." -msgstr "" -"상단 솔리드 레이어 인쇄 속도 (솔리드 레이어가 아닌 최상단 외부 레이어에만 적" -"용) 표면을 더 좋게 마무리하려면 속도를 늦추시기 바랍니다. 이것은 위의 고체 충" -"전 속도에 대한 백분율 (예 : 80 %)로 나타낼 수 있습니다. 자동으로 0으로 설정하" -"십시오." +msgid "Speed for printing top solid layers (it only applies to the uppermost external layers and not to their internal solid layers). You may want to slow down this to get a nicer surface finish. This can be expressed as a percentage (for example: 80%) over the solid infill speed above. Set to zero for auto." +msgstr "상단 솔리드 레이어 인쇄 속도 (솔리드 레이어가 아닌 최상단 외부 레이어에만 적용) 표면을 더 좋게 마무리하려면 속도를 늦추시기 바랍니다. 이것은 위의 고체 충전 속도에 대한 백분율 (예 : 80 %)로 나타낼 수 있습니다. 자동으로 0으로 설정하십시오." #: src/libslic3r/PrintConfig.cpp:2096 msgid "Number of solid layers to generate on top surfaces." @@ -8030,101 +6954,60 @@ msgid "Use firmware retraction" msgstr "펌웨어 철회" #: src/libslic3r/PrintConfig.cpp:2112 -msgid "" -"This experimental setting uses G10 and G11 commands to have the firmware " -"handle the retraction. This is only supported in recent Marlin." -msgstr "" -"이 실험 설정은 G10 및 G11 명령을 사용하여 펌웨어에서 취소를 처리하도록합니" -"다. 이것은 최근의 말린에서만 지원됩니다." +msgid "This experimental setting uses G10 and G11 commands to have the firmware handle the retraction. This is only supported in recent Marlin." +msgstr "이 실험 설정은 G10 및 G11 명령을 사용하여 펌웨어에서 취소를 처리하도록합니다. 이것은 최근의 말린에서만 지원됩니다." #: src/libslic3r/PrintConfig.cpp:2118 msgid "Use relative E distances" msgstr "상대적인 E 거리 사용" #: src/libslic3r/PrintConfig.cpp:2119 -msgid "" -"If your firmware requires relative E values, check this, otherwise leave it " -"unchecked. Most firmwares use absolute values." -msgstr "" -"펌웨어에 상대 E 값이 필요한 경우이 값을 선택하고, 그렇지 않으면 선택하지 마십" -"시오. 대부분의 회사는 절대 값을 사용합니다." +msgid "If your firmware requires relative E values, check this, otherwise leave it unchecked. Most firmwares use absolute values." +msgstr "펌웨어에 상대 E 값이 필요한 경우이 값을 선택하고, 그렇지 않으면 선택하지 마십시오. 대부분의 회사는 절대 값을 사용합니다." #: src/libslic3r/PrintConfig.cpp:2125 msgid "Use volumetric E" msgstr "용적 E 사용" #: src/libslic3r/PrintConfig.cpp:2126 -msgid "" -"This experimental setting uses outputs the E values in cubic millimeters " -"instead of linear millimeters. If your firmware doesn't already know " -"filament diameter(s), you can put commands like 'M200 D[filament_diameter_0] " -"T0' in your start G-code in order to turn volumetric mode on and use the " -"filament diameter associated to the filament selected in Slic3r. This is " -"only supported in recent Marlin." -msgstr "" -"이 실험 설정은 선형 밀리미터 대신에 입방 밀리미터 단위의 E 값을 출력으로 사용" -"합니다. 펌웨어가 필라멘트 직경을 모르는 경우 볼륨 모드를 켜고 선택한 필라멘트" -"와 연결된 필라멘트 직경을 사용하기 위해 시작 G 코드에 'M200 D " -"[filament_diameter_0] T0'과 같은 명령을 입력 할 수 있습니다 Slic3r. 이것은 최" -"근의 말린에서만 지원됩니다." +msgid "This experimental setting uses outputs the E values in cubic millimeters instead of linear millimeters. If your firmware doesn't already know filament diameter(s), you can put commands like 'M200 D[filament_diameter_0] T0' in your start G-code in order to turn volumetric mode on and use the filament diameter associated to the filament selected in Slic3r. This is only supported in recent Marlin." +msgstr "이 실험 설정은 선형 밀리미터 대신에 입방 밀리미터 단위의 E 값을 출력으로 사용합니다. 펌웨어가 필라멘트 직경을 모르는 경우 볼륨 모드를 켜고 선택한 필라멘트와 연결된 필라멘트 직경을 사용하기 위해 시작 G 코드에 'M200 D [filament_diameter_0] T0'과 같은 명령을 입력 할 수 있습니다 Slic3r. 이것은 최근의 말린에서만 지원됩니다." #: src/libslic3r/PrintConfig.cpp:2136 msgid "Enable variable layer height feature" msgstr "가변 레이어 높이 기능 사용" #: src/libslic3r/PrintConfig.cpp:2137 -msgid "" -"Some printers or printer setups may have difficulties printing with a " -"variable layer height. Enabled by default." -msgstr "" -"일부 프린터 또는 프린터 설정은 가변 레이어 높이로 인쇄하는 데 어려움이있을 " -"수 있습니다. 기본적으로 사용됩니다." +msgid "Some printers or printer setups may have difficulties printing with a variable layer height. Enabled by default." +msgstr "일부 프린터 또는 프린터 설정은 가변 레이어 높이로 인쇄하는 데 어려움이있을 수 있습니다. 기본적으로 사용됩니다." #: src/libslic3r/PrintConfig.cpp:2143 msgid "Wipe while retracting" msgstr "수축시 닦아내십시오" #: src/libslic3r/PrintConfig.cpp:2144 -msgid "" -"This flag will move the nozzle while retracting to minimize the possible " -"blob on leaky extruders." -msgstr "" -"이 플래그는 누출된 리트랙싱의 블럽 가능성을 최소화하기 위해 수축하는 동안 노" -"즐을 이동시킨다." +msgid "This flag will move the nozzle while retracting to minimize the possible blob on leaky extruders." +msgstr "이 플래그는 누출된 리트랙싱의 블럽 가능성을 최소화하기 위해 수축하는 동안 노즐을 이동시킨다." #: src/libslic3r/PrintConfig.cpp:2151 -msgid "" -"Multi material printers may need to prime or purge extruders on tool " -"changes. Extrude the excess material into the wipe tower." -msgstr "" -"멀티 메터리알 프린터는 공구 교환 시 익스트루더를 프라이밍하거나 제거해야 할 " -"수 있다. 과도한 물질을 와이퍼 타워에 돌출시킨다." +msgid "Multi material printers may need to prime or purge extruders on tool changes. Extrude the excess material into the wipe tower." +msgstr "다중 메터리알 프린터는 공구 교환 시 익스트루더를 프라이밍하거나 제거해야 할 수 있다. 과도한 물질을 와이퍼 타워에 돌출시킨다." #: src/libslic3r/PrintConfig.cpp:2157 msgid "Purging volumes - load/unload volumes" msgstr "볼륨 삭제 - 볼륨 로드/언로드" #: src/libslic3r/PrintConfig.cpp:2158 -msgid "" -"This vector saves required volumes to change from/to each tool used on the " -"wipe tower. These values are used to simplify creation of the full purging " -"volumes below." -msgstr "" -"이 벡터는 지우기 타워에서 사용 되는 각 도구에서/로 변경 하는 데 필요한 볼륨" -"을 저장 합니다. 이러한 값은 아래의 전체 퍼징 볼륨의 생성을 단순화 하는 데 사" -"용 됩니다." +msgid "This vector saves required volumes to change from/to each tool used on the wipe tower. These values are used to simplify creation of the full purging volumes below." +msgstr "이 벡터는 지우기 타워에서 사용 되는 각 도구에서/로 변경 하는 데 필요한 볼륨을 저장 합니다. 이러한 값은 아래의 전체 퍼징 볼륨의 생성을 단순화 하는 데 사용 됩니다." #: src/libslic3r/PrintConfig.cpp:2164 msgid "Purging volumes - matrix" msgstr "볼륨 삭제 - 행렬" #: src/libslic3r/PrintConfig.cpp:2165 -msgid "" -"This matrix describes volumes (in cubic milimetres) required to purge the " -"new filament on the wipe tower for any given pair of tools." -msgstr "" -"이 매트릭스는 지정 된 도구 쌍에 대해 와이퍼 타워의 새필라멘트를 제거 하는 데 " -"필요한 체적 (입방 밀리 미터)을 설명 합니다." +msgid "This matrix describes volumes (in cubic milimetres) required to purge the new filament on the wipe tower for any given pair of tools." +msgstr "이 매트릭스는 지정 된 도구 쌍에 대해 와이퍼 타워의 새필라멘트를 제거 하는 데 필요한 체적 (입방 밀리 미터)을 설명 합니다." #: src/libslic3r/PrintConfig.cpp:2174 msgid "Position X" @@ -8156,30 +7039,19 @@ msgstr "X 축에 대해 타워 회전 각도를 닦습니다." #: src/libslic3r/PrintConfig.cpp:2203 msgid "Wipe into this object's infill" -msgstr "이 오브젝트의 채우기로 지우기" +msgstr "이 객체(object)의 채우기로 지우기" #: src/libslic3r/PrintConfig.cpp:2204 -msgid "" -"Purging after toolchange will done inside this object's infills. This lowers " -"the amount of waste but may result in longer print time due to additional " -"travel moves." -msgstr "" -"도구 변경 후 제거는 이 개체의 채우기 내부에서 수행 됩니다. 이렇게 하면 낭비 " -"되는 양이 줄어들지만 추가적인 이동으로 인해 인쇄 시간이 길어질 수 있습니다." +msgid "Purging after toolchange will done inside this object's infills. This lowers the amount of waste but may result in longer print time due to additional travel moves." +msgstr "도구 변경 후 제거는 이 객체(object)의 채우기 내부에서 수행 됩니다. 이렇게 하면 낭비 되는 양이 줄어들지만 추가적인 이동으로 인해 인쇄 시간이 길어질 수 있습니다." #: src/libslic3r/PrintConfig.cpp:2211 msgid "Wipe into this object" -msgstr "이 개체로 지우기" +msgstr "이 객체(object)로 지우기" #: src/libslic3r/PrintConfig.cpp:2212 -msgid "" -"Object will be used to purge the nozzle after a toolchange to save material " -"that would otherwise end up in the wipe tower and decrease print time. " -"Colours of the objects will be mixed as a result." -msgstr "" -"객체는 도구 변경 후 노즐을 소거 하는 데 사용 되며, 그렇지 않으면 와이프 타워" -"에서 종료 되는 재료를 저장 하고 인쇄 시간을 줄입니다. 그 결과 개체의 색상이 " -"혼합 됩니다." +msgid "Object will be used to purge the nozzle after a toolchange to save material that would otherwise end up in the wipe tower and decrease print time. Colours of the objects will be mixed as a result." +msgstr "객체(object)는 도구 변경 후 노즐을 소거 하는 데 사용 되며, 그렇지 않으면 와이프 타워에서 종료 되는 재료를 저장 하고 인쇄 시간을 줄입니다. 그 결과 객체(object)의 색상이 혼합 됩니다." #: src/libslic3r/PrintConfig.cpp:2218 msgid "Maximal bridging distance" @@ -8194,28 +7066,16 @@ msgid "XY Size Compensation" msgstr "XY 크기 보정" #: src/libslic3r/PrintConfig.cpp:2227 -msgid "" -"The object will be grown/shrunk in the XY plane by the configured value " -"(negative = inwards, positive = outwards). This might be useful for fine-" -"tuning hole sizes." -msgstr "" -"XY 평면에서 설정된 값(음수 = 안, 양 = 바깥쪽)에 따라 객체가 증가/정격된다. 이" -"는 구멍 크기를 미세 조정하는데 유용할 수 있다." +msgid "The object will be grown/shrunk in the XY plane by the configured value (negative = inwards, positive = outwards). This might be useful for fine-tuning hole sizes." +msgstr "XY 평면에서 설정된 값(음수 = 안, 양 = 바깥쪽)에 따라 객체(object)가 증가/정격된다. 이는 구멍 크기를 미세 조정하는데 유용할 수 있다." #: src/libslic3r/PrintConfig.cpp:2235 msgid "Z offset" msgstr "Z 오프셋" #: src/libslic3r/PrintConfig.cpp:2236 -msgid "" -"This value will be added (or subtracted) from all the Z coordinates in the " -"output G-code. It is used to compensate for bad Z endstop position: for " -"example, if your endstop zero actually leaves the nozzle 0.3mm far from the " -"print bed, set this to -0.3 (or fix your endstop)." -msgstr "" -"이 값은 출력 G-코드의 모든 Z 좌표에서 추가(또는 감산)된다. 예를 들어, 엔드 스" -"톱 0이 실제로 노즐을 프린트 베드에서 0.3mm 떨어진 곳에 둔 경우, 이를 -0.3(또" -"는 엔드 스톱을 고정)으로 설정하십시오." +msgid "This value will be added (or subtracted) from all the Z coordinates in the output G-code. It is used to compensate for bad Z endstop position: for example, if your endstop zero actually leaves the nozzle 0.3mm far from the print bed, set this to -0.3 (or fix your endstop)." +msgstr "이 값은 출력 G-코드의 모든 Z 좌표에서 추가(또는 감산)된다. 예를 들어, 엔드 스톱 0이 실제로 노즐을 프린트 베드에서 0.3mm 떨어진 곳에 둔 경우, 이를 -0.3(또는 엔드 스톱을 고정)으로 설정하십시오." #: src/libslic3r/PrintConfig.cpp:2294 msgid "Display width" @@ -8274,14 +7134,8 @@ msgid "Display orientation" msgstr "디스플레이 방향" #: src/libslic3r/PrintConfig.cpp:2334 -msgid "" -"Set the actual LCD display orientation inside the SLA printer. Portrait mode " -"will flip the meaning of display width and height parameters and the output " -"images will be rotated by 90 degrees." -msgstr "" -"SLA 프린터 내에서 실제 LCD 디스플레이 방향을 설정 합니다. 세로 모드는 디스플" -"레이 너비 및 높이 매개 변수의 의미를 반전 하 고 출력 이미지는 90도 회전 합니" -"다." +msgid "Set the actual LCD display orientation inside the SLA printer. Portrait mode will flip the meaning of display width and height parameters and the output images will be rotated by 90 degrees." +msgstr "SLA 프린터 내에서 실제 LCD 디스플레이 방향을 설정 합니다. 세로 모드는 디스플레이 너비 및 높이 매개 변수의 의미를 반전 하 고 출력 이미지는 90도 회전 합니다." #: src/libslic3r/PrintConfig.cpp:2340 msgid "Landscape" @@ -8339,9 +7193,7 @@ msgid "Printer absolute correction" msgstr "프린터 절대 보정" #: src/libslic3r/PrintConfig.cpp:2382 -msgid "" -"Will inflate or deflate the sliced 2D polygons according to the sign of the " -"correction." +msgid "Will inflate or deflate the sliced 2D polygons according to the sign of the correction." msgstr "교정 기호에 따라 슬라이스된 2D 폴리곤을 팽창 하거나 수축 합니다." #: src/libslic3r/PrintConfig.cpp:2388 src/libslic3r/PrintConfig.cpp:2389 @@ -8349,14 +7201,8 @@ msgid "Printer gamma correction" msgstr "프린터 감마 보정" #: src/libslic3r/PrintConfig.cpp:2390 -msgid "" -"This will apply a gamma correction to the rasterized 2D polygons. A gamma " -"value of zero means thresholding with the threshold in the middle. This " -"behaviour eliminates antialiasing without losing holes in polygons." -msgstr "" -"이렇게 하면 래스터화된 2D 다각형에 감마 보정이 적용 됩니다. 감마 값이 0 이면 " -"중간에 임계값이 임계화 의미입니다. 이 동작은 폴리곤의 구멍을 잃지 않고 안티알" -"리아싱을 제거 합니다." +msgid "This will apply a gamma correction to the rasterized 2D polygons. A gamma value of zero means thresholding with the threshold in the middle. This behaviour eliminates antialiasing without losing holes in polygons." +msgstr "이렇게 하면 래스터화된 2D 다각형에 감마 보정이 적용 됩니다. 감마 값이 0 이면 중간에 임계값이 임계화 의미입니다. 이 동작은 폴리곤의 구멍을 잃지 않고 안티알리아싱을 제거 합니다." #: src/libslic3r/PrintConfig.cpp:2401 src/libslic3r/PrintConfig.cpp:2402 msgid "Initial layer height" @@ -8367,9 +7213,7 @@ msgid "Faded layers" msgstr "페이드 레이어" #: src/libslic3r/PrintConfig.cpp:2409 -msgid "" -"Number of the layers needed for the exposure time fade from initial exposure " -"time to the exposure time" +msgid "Number of the layers needed for the exposure time fade from initial exposure time to the exposure time" msgstr "노출 시간에 필요한 레이어 수는 초기 노출 시간에서 노출 시간으로 페이드" #: src/libslic3r/PrintConfig.cpp:2416 src/libslic3r/PrintConfig.cpp:2417 @@ -8441,14 +7285,8 @@ msgid "Support pillar connection mode" msgstr "기둥 연결 모드 지원" #: src/libslic3r/PrintConfig.cpp:2514 -msgid "" -"Controls the bridge type between two neighboring pillars. Can be zig-zag, " -"cross (double zig-zag) or dynamic which will automatically switch between " -"the first two depending on the distance of the two pillars." -msgstr "" -"인접한 두 기둥 사이의 교량 유형을 제어 합니다. 두 기둥의 거리에 따라 자동으" -"로 처음 두 사이를 전환 하는 지그재그, 크로스 (지그재그 더블 지그재그) 또는 동" -"적 수 있습니다." +msgid "Controls the bridge type between two neighboring pillars. Can be zig-zag, cross (double zig-zag) or dynamic which will automatically switch between the first two depending on the distance of the two pillars." +msgstr "인접한 두 기둥 사이의 교량 유형을 제어 합니다. 두 기둥의 거리에 따라 자동으로 처음 두 사이를 전환 하는 지그재그, 크로스 (지그재그 더블 지그재그) 또는 동적 수 있습니다." #: src/libslic3r/PrintConfig.cpp:2522 msgid "Zig-Zag" @@ -8467,12 +7305,8 @@ msgid "Pillar widening factor" msgstr "기둥 확장 계수" #: src/libslic3r/PrintConfig.cpp:2538 -msgid "" -"Merging bridges or pillars into another pillars can increase the radius. " -"Zero means no increase, one means full increase." -msgstr "" -"브릿지 또는 기둥을 다른 기둥에 병합 하면 반지름을 늘릴 수 있습니다. 0은 증가 " -"없음을 의미 하나는 전체 증가를 의미 합니다." +msgid "Merging bridges or pillars into another pillars can increase the radius. Zero means no increase, one means full increase." +msgstr "브릿지 또는 기둥을 다른 기둥에 병합 하면 반지름을 늘릴 수 있습니다. 0은 증가 없음을 의미 하나는 전체 증가를 의미 합니다." #: src/libslic3r/PrintConfig.cpp:2547 msgid "Support base diameter" @@ -8495,13 +7329,8 @@ msgid "Support base safety distance" msgstr "지지기본 안전 거리" #: src/libslic3r/PrintConfig.cpp:2569 -msgid "" -"The minimum distance of the pillar base from the model in mm. Makes sense in " -"zero elevation mode where a gap according to this parameter is inserted " -"between the model and the pad." -msgstr "" -"모델에서 기둥 베이스의 최소 거리(mm.mm.)는 이 매개변수에 따른 간격이 모델과 " -"패드 사이에 삽입되는 제로 고도 모드에서 의미가 있습니다." +msgid "The minimum distance of the pillar base from the model in mm. Makes sense in zero elevation mode where a gap according to this parameter is inserted between the model and the pad." +msgstr "모델에서 기둥 베이스의 최소 거리(mm.mm.)는 이 매개변수에 따른 간격이 모델과 패드 사이에 삽입되는 제로 고도 모드에서 의미가 있습니다." #: src/libslic3r/PrintConfig.cpp:2579 msgid "Critical angle" @@ -8524,23 +7353,16 @@ msgid "Max pillar linking distance" msgstr "최대 기둥 연결 거리" #: src/libslic3r/PrintConfig.cpp:2600 -msgid "" -"The max distance of two pillars to get linked with each other. A zero value " -"will prohibit pillar cascading." -msgstr "" -"서로 연결 되는 두기둥의 최대 거리. 0 값은 기둥을 계단식으로 금지 합니다." +msgid "The max distance of two pillars to get linked with each other. A zero value will prohibit pillar cascading." +msgstr "서로 연결 되는 두기둥의 최대 거리. 0 값은 기둥을 계단식으로 금지 합니다." #: src/libslic3r/PrintConfig.cpp:2608 msgid "Object elevation" -msgstr "객체 고도" +msgstr "객체(object) 고도" #: src/libslic3r/PrintConfig.cpp:2610 -msgid "" -"How much the supports should lift up the supported object. If this value is " -"zero, the bottom of the model geometry will be considered as part of the pad." -msgstr "" -"지원 대상을 들어 올려야 하는 양입니다. 이 값이 0이면 모델 형상의 맨 아래가 패" -"드의 일부로 간주됩니다." +msgid "How much the supports should lift up the supported object. If this value is zero, the bottom of the model geometry will be considered as part of the pad." +msgstr "지원 대상을 들어 올려야 하는 양입니다. 이 값이 0이면 모델 형상의 맨 아래가 패드의 일부로 간주됩니다." #: src/libslic3r/PrintConfig.cpp:2622 msgid "This is a relative measure of support points density." @@ -8575,29 +7397,16 @@ msgid "Pad wall height" msgstr "패드 벽 높이" #: src/libslic3r/PrintConfig.cpp:2654 -msgid "" -"Defines the pad cavity depth. Set to zero to disable the cavity. Be careful " -"when enabling this feature, as some resins may produce an extreme suction " -"effect inside the cavity, which makes peeling the print off the vat foil " -"difficult." -msgstr "" -"패드 캐비티 깊이를 정의 합니다. 캐비티를 비활성화 하려면 0으로 설정 합니다. " -"이 기능을 활성화 할 때 주의 해야할, 일부 수 캐비티 내부 극단적인 흡입 효과를 " -"생성 할 수도 있기 때문에, vat 호일 인쇄를 벗겨 어렵게 만든다." +msgid "Defines the pad cavity depth. Set to zero to disable the cavity. Be careful when enabling this feature, as some resins may produce an extreme suction effect inside the cavity, which makes peeling the print off the vat foil difficult." +msgstr "패드 캐비티 깊이를 정의 합니다. 캐비티를 비활성화 하려면 0으로 설정 합니다. 이 기능을 활성화 할 때 주의 해야할, 일부 수 캐비티 내부 극단적인 흡입 효과를 생성 할 수도 있기 때문에, vat 호일 인쇄를 벗겨 어렵게 만든다." #: src/libslic3r/PrintConfig.cpp:2667 msgid "Max merge distance" msgstr "최대 병합 거리" #: src/libslic3r/PrintConfig.cpp:2669 -msgid "" -"Some objects can get along with a few smaller pads instead of a single big " -"one. This parameter defines how far the center of two smaller pads should " -"be. If theyare closer, they will get merged into one pad." -msgstr "" -"일부 개체는 큰 하나 대신 몇 가지 작은 패드와 함께 얻을 수 있습니다. 이 매개 " -"변수는 두 개의 작은 패드의 중심이 얼마나 되어야 하는지 정의 합니다. 그들은 하" -"나의 패드에 병합을 얻을 것이다." +msgid "Some objects can get along with a few smaller pads instead of a single big one. This parameter defines how far the center of two smaller pads should be. If theyare closer, they will get merged into one pad." +msgstr "일부 객체(object)는 큰 하나 대신 몇 가지 작은 패드와 함께 얻을 수 있습니다. 이 매개 변수는 두 개의 작은 패드의 중심이 얼마나 되어야 하는지 정의 합니다. 그들은 하나의 패드에 병합을 얻을 것이다." #: src/libslic3r/PrintConfig.cpp:2680 msgid "Pad edge radius" @@ -8608,46 +7417,36 @@ msgid "Pad wall slope" msgstr "패드 벽 경사" #: src/libslic3r/PrintConfig.cpp:2691 -msgid "" -"The slope of the pad wall relative to the bed plane. 90 degrees means " -"straight walls." -msgstr "" -"침대 평면을 기준으로 하는 패드 벽의 기울기입니다. 90도는 직선 벽을 의미 합니" -"다." +msgid "The slope of the pad wall relative to the bed plane. 90 degrees means straight walls." +msgstr "침대 평면을 기준으로 하는 패드 벽의 기울기입니다. 90도는 직선 벽을 의미 합니다." #: src/libslic3r/PrintConfig.cpp:2700 msgid "Pad object gap" -msgstr "패드 오브젝트 갭" +msgstr "패드 객체(object) 갭" #: src/libslic3r/PrintConfig.cpp:2702 -msgid "" -"The gap between the object bottom and the generated pad in zero elevation " -"mode." -msgstr "0 고도 모드에서 오브젝트 바닥과 생성된 패드 사이의 간격입니다." +msgid "The gap between the object bottom and the generated pad in zero elevation mode." +msgstr "0 고도 모드에서 객체(object) 바닥과 생성된 패드 사이의 간격입니다." #: src/libslic3r/PrintConfig.cpp:2711 msgid "Pad object connector stride" -msgstr "패드 오브젝트 커넥터 보폭" +msgstr "패드 객체(object) 커넥터 보폭" #: src/libslic3r/PrintConfig.cpp:2713 -msgid "" -"Distance between two connector sticks between the object pad and the " -"generated pad." -msgstr "오브젝트 패드와 생성된 패드 사이의 두 커넥터 스틱 사이의 거리입니다." +msgid "Distance between two connector sticks between the object pad and the generated pad." +msgstr "객체(object) 패드와 생성된 패드 사이의 두 커넥터 스틱 사이의 거리입니다." #: src/libslic3r/PrintConfig.cpp:2721 msgid "Pad object connector width" -msgstr "패드 오브젝트 커넥터 너비" +msgstr "패드 객체(object) 커넥터 너비" #: src/libslic3r/PrintConfig.cpp:2723 -msgid "" -"The width of the connectors sticks which connect the object pad and the " -"generated pad." -msgstr "커넥터의 너비는 오브젝트 패드와 생성된 패드를 연결하는 스틱입니다." +msgid "The width of the connectors sticks which connect the object pad and the generated pad." +msgstr "커넥터의 너비는 객체(object) 패드와 생성된 패드를 연결하는 스틱입니다." #: src/libslic3r/PrintConfig.cpp:2731 msgid "Pad object connector penetration" -msgstr "패드 오브젝트 커넥터 침투" +msgstr "패드 객체(object) 커넥터 침투" #: src/libslic3r/PrintConfig.cpp:2734 msgid "How much should the tiny connectors penetrate into the model body." @@ -8702,11 +7501,8 @@ msgid "Slice" msgstr "슬라이스" #: src/libslic3r/PrintConfig.cpp:3134 -msgid "" -"Slice the model as FFF or SLA based on the printer_technology configuration " -"value." -msgstr "" -" printer_technology 구성 값을 기반으로 모델을 FFF 또는 SLA로 슬라이스합니다." +msgid "Slice the model as FFF or SLA based on the printer_technology configuration value." +msgstr " printer_technology 구성 값을 기반으로 모델을 FFF 또는 SLA로 슬라이스합니다." #: src/libslic3r/PrintConfig.cpp:3139 msgid "Help" @@ -8773,11 +7569,8 @@ msgid "Don't arrange" msgstr "준비하지 마십시오" #: src/libslic3r/PrintConfig.cpp:3204 -msgid "" -"Do not rearrange the given models before merging and keep their original XY " -"coordinates." -msgstr "" -"병합하기 전에 지정된 모델을 재정렬하고 원래 XY 좌표를 유지하지 마십시오." +msgid "Do not rearrange the given models before merging and keep their original XY coordinates." +msgstr "병합하기 전에 지정된 모델을 재정렬하고 원래 XY 좌표를 유지하지 마십시오." #: src/libslic3r/PrintConfig.cpp:3207 msgid "Duplicate" @@ -8800,19 +7593,12 @@ msgid "Merge" msgstr "병합" #: src/libslic3r/PrintConfig.cpp:3217 -msgid "" -"Arrange the supplied models in a plate and merge them in a single model in " -"order to perform actions once." -msgstr "" -"한 번 작업을 수행하기 위해 제공 된 모델을 정렬하고 단일 모델로 병합 합니다." +msgid "Arrange the supplied models in a plate and merge them in a single model in order to perform actions once." +msgstr "한 번 작업을 수행하기 위해 제공 된 모델을 정렬하고 단일 모델로 병합 합니다." #: src/libslic3r/PrintConfig.cpp:3222 -msgid "" -"Try to repair any non-manifold meshes (this option is implicitly added " -"whenever we need to slice the model to perform the requested action)." -msgstr "" -"메쉬를 복구 하십시오 (요청 된 작업을 수행 하기 위해 모델을 슬라이스 해야 할때" -"마다 이 옵션이 암시적으로 추가 됨)." +msgid "Try to repair any non-manifold meshes (this option is implicitly added whenever we need to slice the model to perform the requested action)." +msgstr "메쉬를 복구 하십시오 (요청 된 작업을 수행 하기 위해 모델을 슬라이스 해야 할때마다 이 옵션이 암시적으로 추가 됨)." #: src/libslic3r/PrintConfig.cpp:3226 msgid "Rotation angle around the Z axis in degrees." @@ -8839,11 +7625,8 @@ msgid "Scaling factor or percentage." msgstr "배율 인수 또는 백분율입니다." #: src/libslic3r/PrintConfig.cpp:3246 -msgid "" -"Detect unconnected parts in the given model(s) and split them into separate " -"objects." -msgstr "" -"지정 된 모델에서 연결 되지 않은 부품을 감지 하여 별도의 객체로 분할 합니다." +msgid "Detect unconnected parts in the given model(s) and split them into separate objects." +msgstr "지정 된 모델에서 연결 되지 않은 부품(Part)을 감지 하여 별도의 객체(object)로 분할 합니다." #: src/libslic3r/PrintConfig.cpp:3249 msgid "Scale to Fit" @@ -8866,60 +7649,40 @@ msgid "Load config file" msgstr "구성 파일 로드" #: src/libslic3r/PrintConfig.cpp:3264 -msgid "" -"Load configuration from the specified file. It can be used more than once to " -"load options from multiple files." -msgstr "" -"지정 된 파일에서 구성을 로드 합니다. 여러 파일에서 옵션을 로드 하는 데 두 번 " -"이상 사용할 수 있습니다." +msgid "Load configuration from the specified file. It can be used more than once to load options from multiple files." +msgstr "지정 된 파일에서 구성을 로드 합니다. 여러 파일에서 옵션을 로드 하는 데 두 번 이상 사용할 수 있습니다." #: src/libslic3r/PrintConfig.cpp:3267 msgid "Output File" msgstr "출력 파일" #: src/libslic3r/PrintConfig.cpp:3268 -msgid "" -"The file where the output will be written (if not specified, it will be " -"based on the input file)." -msgstr "" -"출력이 기록 되는 파일 (지정 하지 않은 경우 입력 파일을 기반으로 합니다)." +msgid "The file where the output will be written (if not specified, it will be based on the input file)." +msgstr "출력이 기록 되는 파일 (지정 하지 않은 경우 입력 파일을 기반으로 합니다)." #: src/libslic3r/PrintConfig.cpp:3278 msgid "Data directory" msgstr "데이터 디렉터리" #: src/libslic3r/PrintConfig.cpp:3279 -msgid "" -"Load and store settings at the given directory. This is useful for " -"maintaining different profiles or including configurations from a network " -"storage." -msgstr "" -"지정 된 디렉터리에 설정을 로드 하 고 저장 합니다. 이 기능은 다른 프로 파일을 " -"유지 관리 하거나 네트워크 스토리지의 구성을 포함 하는 데 유용 합니다." +msgid "Load and store settings at the given directory. This is useful for maintaining different profiles or including configurations from a network storage." +msgstr "지정 된 디렉터리에 설정을 로드 하 고 저장 합니다. 이 기능은 다른 프로 파일을 유지 관리 하거나 네트워크 스토리지의 구성을 포함 하는 데 유용 합니다." #: src/libslic3r/PrintConfig.cpp:3282 msgid "Logging level" msgstr "로깅 수준" #: src/libslic3r/PrintConfig.cpp:3283 -msgid "" -"Messages with severity lower or eqal to the loglevel will be printed out. 0:" -"trace, 1:debug, 2:info, 3:warning, 4:error, 5:fatal" -msgstr "" -"로그 수준에 대한 심각도가 낮거나 eqal인 메시지가 인쇄됩니다. 0:추적, 1:디버" -"그, 2:정보, 3:경고, 4:오류, 5:치명적" +msgid "Messages with severity lower or eqal to the loglevel will be printed out. 0:trace, 1:debug, 2:info, 3:warning, 4:error, 5:fatal" +msgstr "로그 수준에 대한 심각도가 낮거나 eqal인 메시지가 인쇄됩니다. 0:추적, 1:디버그, 2:정보, 3:경고, 4:오류, 5:치명적" #: src/libslic3r/PrintConfig.cpp:3288 msgid "Render with a software renderer" msgstr "소프트웨어 렌더러를 사용 하 여 렌더링" #: src/libslic3r/PrintConfig.cpp:3289 -msgid "" -"Render with a software renderer. The bundled MESA software renderer is " -"loaded instead of the default OpenGL driver." -msgstr "" -"소프트웨어 렌더러를 사용 하여 렌더링 합니다. 번들 메사 소프트웨어 렌더러는 기" -"본 OpenGL 드라이버 대신 로드 됩니다." +msgid "Render with a software renderer. The bundled MESA software renderer is loaded instead of the default OpenGL driver." +msgstr "소프트웨어 렌더러를 사용 하여 렌더링 합니다. 번들 메사 소프트웨어 렌더러는 기본 OpenGL 드라이버 대신 로드 됩니다." #: src/libslic3r/PrintObject.cpp:110 msgid "Processing triangulated mesh" From 1cc7bd9976dc96eb119c0b80f9c8a9a2dab6aa7c Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Fri, 25 Oct 2019 15:48:01 +0200 Subject: [PATCH 013/336] Fix openvdb dependency in libslic3r --- CMakeLists.txt | 3 -- cmake/modules/FindOpenVDB.cmake | 56 ++++++++++++++++++++++---------- cmake/modules/OpenVDBUtils.cmake | 8 +++-- sandboxes/openvdb/CMakeLists.txt | 6 ++++ 4 files changed, 51 insertions(+), 22 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 2b22f10016..ecae7e3c9a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -402,9 +402,6 @@ if(SLIC3R_STATIC) set(USE_BLOSC TRUE) endif() -#find_package(OpenVDB 5.0 COMPONENTS openvdb) -#slic3r_remap_configs(IlmBase::Half RelWithDebInfo Release) - # libslic3r, PrusaSlicer GUI and the PrusaSlicer executable. add_subdirectory(src) set_property(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT PrusaSlicer_app_console) diff --git a/cmake/modules/FindOpenVDB.cmake b/cmake/modules/FindOpenVDB.cmake index 9afe8a2356..dd4ff5b20e 100644 --- a/cmake/modules/FindOpenVDB.cmake +++ b/cmake/modules/FindOpenVDB.cmake @@ -108,6 +108,18 @@ if(POLICY CMP0074) cmake_policy(SET CMP0074 NEW) endif() +if(OpenVDB_FIND_QUIETLY) + set (_quiet "QUIET") +else() + set (_quiet "") +endif() + +if(OpenVDB_FIND_REQUIRED) + set (_required "REQUIRED") +else() + set (_required "") +endif() + # Include utility functions for version information include(${CMAKE_CURRENT_LIST_DIR}/OpenVDBUtils.cmake) @@ -146,7 +158,7 @@ set(_OPENVDB_ROOT_SEARCH_DIR "") # Additionally try and use pkconfig to find OpenVDB -find_package(PkgConfig) +find_package(PkgConfig ${_quiet} ${_required}) pkg_check_modules(PC_OpenVDB QUIET OpenVDB) # ------------------------------------------------------------------------ @@ -250,7 +262,7 @@ OPENVDB_ABI_VERSION_FROM_PRINT( ABI OpenVDB_ABI ) -if(NOT OpenVDB_FIND_QUIET) +if(NOT OpenVDB_FIND_QUIETLY) if(NOT OpenVDB_ABI) message(WARNING "Unable to determine OpenVDB ABI version from OpenVDB " "installation. The library major version \"${OpenVDB_MAJOR_VERSION}\" " @@ -268,7 +280,17 @@ endif() # Add standard dependencies -find_package(IlmBase COMPONENTS Half) +macro(just_fail msg) + set(OpenVDB_FOUND FALSE) + if(OpenVDB_FIND_REQUIRED) + message(FATAL_ERROR msg) + elseif(NOT OpenVDB_FIND_QUIETLY) + message(ERROR msg) + endif() + return() +endmacro() + +find_package(IlmBase QUIET COMPONENTS Half) if(NOT IlmBase_FOUND) pkg_check_modules(IlmBase QUIET IlmBase) endif() @@ -276,20 +298,20 @@ if (IlmBase_FOUND AND NOT TARGET IlmBase::Half) message(STATUS "Falling back to IlmBase found by pkg-config...") find_library(IlmHalf_LIBRARY NAMES Half) - if(IlmHalf_LIBRARY-NOTFOUND) - message(FATAL_ERROR "IlmBase::Half can not be found!") + if(IlmHalf_LIBRARY-NOTFOUND OR NOT IlmBase_INCLUDE_DIRS) + just_fail("IlmBase::Half can not be found!") endif() add_library(IlmBase::Half UNKNOWN IMPORTED) set_target_properties(IlmBase::Half PROPERTIES IMPORTED_LOCATION "${IlmHalf_LIBRARY}" - INTERFACE_INCLUDE_DIRECTORIES ${IlmBase_INCLUDE_DIRS}) + INTERFACE_INCLUDE_DIRECTORIES "${IlmBase_INCLUDE_DIRS}") elseif(NOT IlmBase_FOUND) - message(FATAL_ERROR "IlmBase::Half can not be found!") + just_fail("IlmBase::Half can not be found!") endif() -find_package(TBB REQUIRED COMPONENTS tbb) -find_package(ZLIB REQUIRED) -find_package(Boost REQUIRED COMPONENTS iostreams system) +find_package(TBB ${_quiet} ${_required} COMPONENTS tbb) +find_package(ZLIB ${_quiet} ${_required}) +find_package(Boost ${_quiet} ${_required} COMPONENTS iostreams system ) # Use GetPrerequisites to see which libraries this OpenVDB lib has linked to # which we can query for optional deps. This basically runs ldd/otoll/objdump @@ -350,7 +372,7 @@ unset(_OPENVDB_PREREQUISITE_LIST) unset(_HAS_DEP) if(OpenVDB_USES_BLOSC) - find_package(Blosc ) + find_package(Blosc QUIET) if(NOT Blosc_FOUND OR NOT TARGET Blosc::blosc) message(STATUS "find_package could not find Blosc. Using fallback blosc search...") find_path(Blosc_INCLUDE_DIR blosc.h) @@ -362,25 +384,25 @@ if(OpenVDB_USES_BLOSC) IMPORTED_LOCATION "${Blosc_LIBRARY}" INTERFACE_INCLUDE_DIRECTORIES ${Blosc_INCLUDE_DIR}) elseif() - message(FATAL_ERROR "Blosc library can not be found!") + just_fail("Blosc library can not be found!") endif() endif() endif() if(OpenVDB_USES_LOG4CPLUS) - find_package(Log4cplus REQUIRED) + find_package(Log4cplus ${_quiet} ${_required}) endif() if(OpenVDB_USES_ILM) - find_package(IlmBase REQUIRED) + find_package(IlmBase ${_quiet} ${_required}) endif() if(OpenVDB_USES_EXR) - find_package(OpenEXR REQUIRED) + find_package(OpenEXR ${_quiet} ${_required}) endif() if(UNIX) - find_package(Threads REQUIRED) + find_package(Threads ${_quiet} ${_required}) endif() # Set deps. Note that the order here is important. If we're building against @@ -481,7 +503,7 @@ foreach(COMPONENT ${OpenVDB_FIND_COMPONENTS}) endif() endforeach() -if(OpenVDB_FOUND AND NOT ${CMAKE_FIND_PACKAGE_NAME}_FIND_QUIETLY) +if(OpenVDB_FOUND AND NOT OpenVDB_FIND_QUIETLY) message(STATUS "OpenVDB libraries: ${OpenVDB_LIBRARIES}") endif() diff --git a/cmake/modules/OpenVDBUtils.cmake b/cmake/modules/OpenVDBUtils.cmake index bb3ce6e65d..f64eda6f2c 100644 --- a/cmake/modules/OpenVDBUtils.cmake +++ b/cmake/modules/OpenVDBUtils.cmake @@ -125,7 +125,9 @@ function(OPENVDB_ABI_VERSION_FROM_PRINT OPENVDB_PRINT) cmake_parse_arguments(_VDB "QUIET" "ABI" "" ${ARGN}) if(NOT EXISTS ${OPENVDB_PRINT}) - message(WARNING "vdb_print not found! ${OPENVDB_PRINT}") + if(NOT OpenVDB_FIND_QUIETLY) + message(WARNING "vdb_print not found! ${OPENVDB_PRINT}") + endif() return() endif() @@ -148,7 +150,9 @@ function(OPENVDB_ABI_VERSION_FROM_PRINT OPENVDB_PRINT) endif() if(${_VDB_PRINT_RETURN_STATUS}) - message(WARNING "vdb_print returned with status ${_VDB_PRINT_RETURN_STATUS}") + if(NOT OpenVDB_FIND_QUIETLY) + message(WARNING "vdb_print returned with status ${_VDB_PRINT_RETURN_STATUS}") + endif() return() endif() diff --git a/sandboxes/openvdb/CMakeLists.txt b/sandboxes/openvdb/CMakeLists.txt index 184452e833..250c6cc68b 100644 --- a/sandboxes/openvdb/CMakeLists.txt +++ b/sandboxes/openvdb/CMakeLists.txt @@ -1,2 +1,8 @@ add_executable(openvdb_example openvdb_example.cpp) + +find_package(OpenVDB 5.0 REQUIRED COMPONENTS openvdb) +slic3r_remap_configs(IlmBase::Half RelWithDebInfo Release) + target_link_libraries(openvdb_example libslic3r) +target_link_libraries(openvdb_example OpenVDB::openvdb) + From 39df8a5eded7dcc6e19142f0dbc468cf73b4f458 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Fri, 25 Oct 2019 16:19:50 +0200 Subject: [PATCH 014/336] Enable example test --- tests/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 7e8db00bf3..e84d312e9a 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -27,4 +27,4 @@ add_subdirectory(libslic3r) add_subdirectory(timeutils) add_subdirectory(fff_print) add_subdirectory(sla_print) -# add_subdirectory(example) +add_subdirectory(example) From 6f8ce122878823d1b703dfaaab9c6d2101809ed9 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Tue, 29 Oct 2019 13:33:29 +0100 Subject: [PATCH 015/336] Useful verbose test output on console with Catch2 --- tests/CMakeLists.txt | 2 +- tests/catch_main.hpp | 51 ++++++++++++++++++++++++ tests/example/example_tests_main.cpp | 2 +- tests/fff_print/fff_print_tests.cpp | 3 +- tests/libnest2d/libnest2d_tests_main.cpp | 4 +- tests/libslic3r/libslic3r_tests.cpp | 3 +- tests/sla_print/sla_print_tests.cpp | 3 +- tests/timeutils/timeutils_tests_main.cpp | 3 +- 8 files changed, 58 insertions(+), 13 deletions(-) create mode 100644 tests/catch_main.hpp diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index e84d312e9a..3afc1c3e26 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -10,7 +10,7 @@ target_include_directories(Catch2 INTERFACE ${CMAKE_CURRENT_LIST_DIR}) add_library(Catch2::Catch2 ALIAS Catch2) include(Catch) -set(CATCH_EXTRA_ARGS "--durations yes" CACHE STRING "Extra arguments for catch2 test suites.") +set(CATCH_EXTRA_ARGS "-r usefulconsole" CACHE STRING "Extra arguments for catch2 test suites.") add_library(test_common INTERFACE) target_compile_definitions(test_common INTERFACE TEST_DATA_DIR=R"\(${TEST_DATA_DIR}\)" CATCH_CONFIG_FAST_COMPILE) diff --git a/tests/catch_main.hpp b/tests/catch_main.hpp new file mode 100644 index 0000000000..e49ff40b4a --- /dev/null +++ b/tests/catch_main.hpp @@ -0,0 +1,51 @@ +#ifndef CATCH_MAIN +#define CATCH_MAIN + +#define CATCH_CONFIG_EXTERNAL_INTERFACES +#define CATCH_CONFIG_MAIN +#include + +namespace Catch { +struct VerboseConsoleReporter : public ConsoleReporter { + double duration = 0.; + using ConsoleReporter::ConsoleReporter; + + void testCaseStarting(TestCaseInfo const& _testInfo) override + { + Colour::use(Colour::Cyan); + stream << "Testing "; + Colour::use(Colour::None); + stream << _testInfo.name << std::endl; + ConsoleReporter::testCaseStarting(_testInfo); + } + + void sectionStarting(const SectionInfo &_sectionInfo) override + { + if (_sectionInfo.name != currentTestCaseInfo->name) + stream << _sectionInfo.name << std::endl; + + ConsoleReporter::sectionStarting(_sectionInfo); + } + + void sectionEnded(const SectionStats &_sectionStats) override { + duration += _sectionStats.durationInSeconds; + ConsoleReporter::sectionEnded(_sectionStats); + } + + void testCaseEnded(TestCaseStats const& stats) override + { + if (stats.totals.assertions.allOk()) { + Colour::use(Colour::BrightGreen); + stream << "Passed"; + Colour::use(Colour::None); + stream << " in " << duration << " [seconds]\n" << std::endl; + } + + duration = 0.; + ConsoleReporter::testCaseEnded(stats); + } +}; +CATCH_REGISTER_REPORTER( "verboseconsole", VerboseConsoleReporter ) +} + +#endif // CATCH_MAIN diff --git a/tests/example/example_tests_main.cpp b/tests/example/example_tests_main.cpp index d612f323cb..32e8d02b76 100644 --- a/tests/example/example_tests_main.cpp +++ b/tests/example/example_tests_main.cpp @@ -1,5 +1,5 @@ #define CATCH_CONFIG_MAIN -#include +#include TEST_CASE("Is example succesful", "[example]") { REQUIRE(true); diff --git a/tests/fff_print/fff_print_tests.cpp b/tests/fff_print/fff_print_tests.cpp index 5e9b82f80b..46358e5eba 100644 --- a/tests/fff_print/fff_print_tests.cpp +++ b/tests/fff_print/fff_print_tests.cpp @@ -1,4 +1,3 @@ -#define CATCH_CONFIG_MAIN -#include +#include #include "libslic3r/libslic3r.h" diff --git a/tests/libnest2d/libnest2d_tests_main.cpp b/tests/libnest2d/libnest2d_tests_main.cpp index 252bea47fe..c7259ae537 100644 --- a/tests/libnest2d/libnest2d_tests_main.cpp +++ b/tests/libnest2d/libnest2d_tests_main.cpp @@ -1,9 +1,7 @@ -#define CATCH_CONFIG_MAIN -#include +#include #include - #include #include "printer_parts.hpp" //#include diff --git a/tests/libslic3r/libslic3r_tests.cpp b/tests/libslic3r/libslic3r_tests.cpp index 907304f57a..caf5b3b9ac 100644 --- a/tests/libslic3r/libslic3r_tests.cpp +++ b/tests/libslic3r/libslic3r_tests.cpp @@ -1,5 +1,4 @@ -#define CATCH_CONFIG_MAIN -#include +#include #include "libslic3r/libslic3r.h" diff --git a/tests/sla_print/sla_print_tests.cpp b/tests/sla_print/sla_print_tests.cpp index f41fd3200a..229eb42676 100644 --- a/tests/sla_print/sla_print_tests.cpp +++ b/tests/sla_print/sla_print_tests.cpp @@ -1,5 +1,4 @@ -#define CATCH_CONFIG_MAIN -#include +#include #include #include diff --git a/tests/timeutils/timeutils_tests_main.cpp b/tests/timeutils/timeutils_tests_main.cpp index c3827374e5..9989f98716 100644 --- a/tests/timeutils/timeutils_tests_main.cpp +++ b/tests/timeutils/timeutils_tests_main.cpp @@ -1,5 +1,4 @@ -#define CATCH_CONFIG_MAIN -#include +#include #include "libslic3r/Time.hpp" From d63ae1c6085f02fa64b250b01071a3ec94406504 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Tue, 29 Oct 2019 16:27:53 +0100 Subject: [PATCH 016/336] Simple openvdb conversion test. --- CMakeLists.txt | 5 +++ sandboxes/openvdb/CMakeLists.txt | 11 +++---- tests/CMakeLists.txt | 3 +- tests/hollowing/CMakeLists.txt | 8 +++++ tests/hollowing/hollowing_tests.cpp | 49 +++++++++++++++++++++++++++++ 5 files changed, 69 insertions(+), 7 deletions(-) create mode 100644 tests/hollowing/CMakeLists.txt create mode 100644 tests/hollowing/hollowing_tests.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index ecae7e3c9a..c6ddbb0f9c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -402,6 +402,11 @@ if(SLIC3R_STATIC) set(USE_BLOSC TRUE) endif() +find_package(OpenVDB 5.0 COMPONENTS openvdb) +if(OpenVDB_FOUND) + slic3r_remap_configs(IlmBase::Half RelWithDebInfo Release) +endif() + # libslic3r, PrusaSlicer GUI and the PrusaSlicer executable. add_subdirectory(src) set_property(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT PrusaSlicer_app_console) diff --git a/sandboxes/openvdb/CMakeLists.txt b/sandboxes/openvdb/CMakeLists.txt index 250c6cc68b..c32d6c8d63 100644 --- a/sandboxes/openvdb/CMakeLists.txt +++ b/sandboxes/openvdb/CMakeLists.txt @@ -1,8 +1,7 @@ -add_executable(openvdb_example openvdb_example.cpp) +if(TARGET OpenVDB::openvdb) + add_executable(openvdb_example openvdb_example.cpp) -find_package(OpenVDB 5.0 REQUIRED COMPONENTS openvdb) -slic3r_remap_configs(IlmBase::Half RelWithDebInfo Release) - -target_link_libraries(openvdb_example libslic3r) -target_link_libraries(openvdb_example OpenVDB::openvdb) + target_link_libraries(openvdb_example libslic3r) + target_link_libraries(openvdb_example OpenVDB::openvdb) +endif() diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 3afc1c3e26..2dfe05dad3 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -27,4 +27,5 @@ add_subdirectory(libslic3r) add_subdirectory(timeutils) add_subdirectory(fff_print) add_subdirectory(sla_print) -add_subdirectory(example) +add_subdirectory(hollowing) +#add_subdirectory(example) diff --git a/tests/hollowing/CMakeLists.txt b/tests/hollowing/CMakeLists.txt new file mode 100644 index 0000000000..e6f01b0e83 --- /dev/null +++ b/tests/hollowing/CMakeLists.txt @@ -0,0 +1,8 @@ +if(TARGET OpenVDB::openvdb) + add_executable(hollowing_tests hollowing_tests.cpp) + + find_package(GTest REQUIRED) + + target_link_libraries(hollowing_tests libslic3r OpenVDB::openvdb GTest::GTest GTest::Main) + target_compile_definitions(hollowing_tests PRIVATE TEST_DATA_DIR=R"\(${TEST_DATA_DIR}\)") +endif() diff --git a/tests/hollowing/hollowing_tests.cpp b/tests/hollowing/hollowing_tests.cpp new file mode 100644 index 0000000000..2ba61a63dd --- /dev/null +++ b/tests/hollowing/hollowing_tests.cpp @@ -0,0 +1,49 @@ +#include +#include + +#include +#include +#include +#include "libslic3r/Format/OBJ.hpp" + +#if defined(WIN32) || defined(_WIN32) +#define PATH_SEPARATOR R"(\)" +#else +#define PATH_SEPARATOR R"(/)" +#endif + +class TriangleMeshDataAdapter { +public: + Slic3r::TriangleMesh mesh; + + size_t polygonCount() const { return mesh.its.indices.size(); } + size_t pointCount() const { return mesh.its.vertices.size(); } + size_t vertexCount(size_t) const { return 3; } + + // Return position pos in local grid index space for polygon n and vertex v + void getIndexSpacePoint(size_t n, size_t v, openvdb::Vec3d& pos) const { + auto vidx = size_t(mesh.its.indices[n](Eigen::Index(v))); + Slic3r::Vec3d p = mesh.its.vertices[vidx].cast(); + pos = {double(p.x()), double(p.y()), p.z()}; + } +}; + +static Slic3r::TriangleMesh load_model(const std::string &obj_filename) +{ + Slic3r::TriangleMesh mesh; + auto fpath = TEST_DATA_DIR PATH_SEPARATOR + obj_filename; + Slic3r::load_obj(fpath.c_str(), &mesh); + return mesh; +} + +TEST(Hollowing, LoadObject) { + TriangleMeshDataAdapter mesh{load_model("20mm_cube.obj")}; + auto ptr = openvdb::tools::meshToVolume(mesh, {}); + + ASSERT_TRUE(ptr); +} + +int main(int argc, char **argv) { + ::testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} From 99dd6acc7954fa3c7c1086b4658c78f13d6fea61 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Wed, 30 Oct 2019 10:47:04 +0100 Subject: [PATCH 017/336] Make verboseconsole the default reporter. --- tests/CMakeLists.txt | 2 +- tests/catch_main.hpp | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 2dfe05dad3..9453fa3143 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -10,7 +10,7 @@ target_include_directories(Catch2 INTERFACE ${CMAKE_CURRENT_LIST_DIR}) add_library(Catch2::Catch2 ALIAS Catch2) include(Catch) -set(CATCH_EXTRA_ARGS "-r usefulconsole" CACHE STRING "Extra arguments for catch2 test suites.") +set(CATCH_EXTRA_ARGS "" CACHE STRING "Extra arguments for catch2 test suites.") add_library(test_common INTERFACE) target_compile_definitions(test_common INTERFACE TEST_DATA_DIR=R"\(${TEST_DATA_DIR}\)" CATCH_CONFIG_FAST_COMPILE) diff --git a/tests/catch_main.hpp b/tests/catch_main.hpp index e49ff40b4a..5ab71fdd74 100644 --- a/tests/catch_main.hpp +++ b/tests/catch_main.hpp @@ -3,6 +3,7 @@ #define CATCH_CONFIG_EXTERNAL_INTERFACES #define CATCH_CONFIG_MAIN +#define CATCH_CONFIG_DEFAULT_REPORTER "verboseconsole" #include namespace Catch { @@ -45,7 +46,9 @@ struct VerboseConsoleReporter : public ConsoleReporter { ConsoleReporter::testCaseEnded(stats); } }; + CATCH_REGISTER_REPORTER( "verboseconsole", VerboseConsoleReporter ) -} + +} // namespace Catch #endif // CATCH_MAIN From 259e058491e877d46064eb962fa31e3231bf1d50 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Wed, 30 Oct 2019 12:38:23 +0100 Subject: [PATCH 018/336] openvdb conversion experiments. --- tests/hollowing/CMakeLists.txt | 9 +++++---- tests/hollowing/hollowing_tests.cpp | 26 +++++++++++++++++++------- 2 files changed, 24 insertions(+), 11 deletions(-) diff --git a/tests/hollowing/CMakeLists.txt b/tests/hollowing/CMakeLists.txt index e6f01b0e83..79c12baef8 100644 --- a/tests/hollowing/CMakeLists.txt +++ b/tests/hollowing/CMakeLists.txt @@ -1,8 +1,9 @@ if(TARGET OpenVDB::openvdb) add_executable(hollowing_tests hollowing_tests.cpp) - find_package(GTest REQUIRED) - - target_link_libraries(hollowing_tests libslic3r OpenVDB::openvdb GTest::GTest GTest::Main) - target_compile_definitions(hollowing_tests PRIVATE TEST_DATA_DIR=R"\(${TEST_DATA_DIR}\)") + #find_package(GTest REQUIRED) + #target_link_libraries(hollowing_tests libslic3r OpenVDB::openvdb GTest::GTest GTest::Main) + #target_compile_definitions(hollowing_tests PRIVATE TEST_DATA_DIR=R"\(${TEST_DATA_DIR}\)") + + target_link_libraries(hollowing_tests test_common libslic3r OpenVDB::openvdb) endif() diff --git a/tests/hollowing/hollowing_tests.cpp b/tests/hollowing/hollowing_tests.cpp index 2ba61a63dd..846f7e831b 100644 --- a/tests/hollowing/hollowing_tests.cpp +++ b/tests/hollowing/hollowing_tests.cpp @@ -1,8 +1,9 @@ #include -#include +#include #include #include +#include #include #include "libslic3r/Format/OBJ.hpp" @@ -36,14 +37,25 @@ static Slic3r::TriangleMesh load_model(const std::string &obj_filename) return mesh; } -TEST(Hollowing, LoadObject) { +TEST_CASE("Load object", "[Hollowing]") { TriangleMeshDataAdapter mesh{load_model("20mm_cube.obj")}; auto ptr = openvdb::tools::meshToVolume(mesh, {}); - ASSERT_TRUE(ptr); + REQUIRE(ptr); + + std::vector points; + std::vector quad_indices; + std::vector triangle_indices; + + openvdb::tools::volumeToMesh(*ptr, points, triangle_indices, quad_indices, 0.0, 1.0, true); + + std::cout << "Triangle count: " << triangle_indices.size() << std::endl; + std::cout << "Quad count: " << quad_indices.size() << std::endl; + std::cout << "Point count: " << points.size() << " vs " << mesh.mesh.its.vertices.size() << std::endl; } -int main(int argc, char **argv) { - ::testing::InitGoogleTest(&argc, argv); - return RUN_ALL_TESTS(); -} +//int main(int argc, char **argv) +//{ +// ::testing::InitGoogleTest(&argc, argv); +// return RUN_ALL_TESTS(); +//} From 5c5a3948f96f34e6ab78ce390468607b764060c1 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Wed, 30 Oct 2019 11:34:19 +0100 Subject: [PATCH 019/336] fix openvdb platform forwarding on Windows --- deps/deps-windows.cmake | 3 +++ 1 file changed, 3 insertions(+) diff --git a/deps/deps-windows.cmake b/deps/deps-windows.cmake index 08e10758d3..26763e878e 100644 --- a/deps/deps-windows.cmake +++ b/deps/deps-windows.cmake @@ -309,6 +309,7 @@ ExternalProject_Add(dep_blosc GIT_TAG v1.17.0 DEPENDS dep_zlib CMAKE_GENERATOR "${DEP_MSVC_GEN}" + CMAKE_GENERATOR_PLATFORM "${DEP_PLATFORM}" CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${DESTDIR}/usr/local -DBUILD_SHARED_LIBS=OFF @@ -332,6 +333,7 @@ ExternalProject_Add(dep_openexr GIT_TAG v2.4.0 DEPENDS dep_zlib CMAKE_GENERATOR "${DEP_MSVC_GEN}" + CMAKE_GENERATOR_PLATFORM "${DEP_PLATFORM}" CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${DESTDIR}/usr/local -DBUILD_SHARED_LIBS=OFF @@ -352,6 +354,7 @@ ExternalProject_Add(dep_openvdb GIT_TAG v6.2.1 DEPENDS dep_blosc dep_openexr dep_tbb CMAKE_GENERATOR "${DEP_MSVC_GEN}" + CMAKE_GENERATOR_PLATFORM "${DEP_PLATFORM}" CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${DESTDIR}/usr/local -DCMAKE_DEBUG_POSTFIX=d From 189bd1a8cefb9ef93c3632ee0e5b7ffead0a98aa Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Wed, 30 Oct 2019 14:50:06 +0100 Subject: [PATCH 020/336] Fixes for release only build of dependencies on windows --- deps/blosc-mods.patch | 135 +++++++------- deps/deps-windows.cmake | 44 +++-- deps/openvdb-mods.patch | 379 +++++++++++++++++++++------------------- 3 files changed, 279 insertions(+), 279 deletions(-) diff --git a/deps/blosc-mods.patch b/deps/blosc-mods.patch index 2289459ab5..9a91b4974c 100644 --- a/deps/blosc-mods.patch +++ b/deps/blosc-mods.patch @@ -1,23 +1,22 @@ -From 24640a466b28dfda26069096554676e8c0b6d090 Mon Sep 17 00:00:00 2001 +From 5669891dfaaa4c814f3ec667ca6bf4e693aea978 Mon Sep 17 00:00:00 2001 From: tamasmeszaros -Date: Tue, 22 Oct 2019 11:29:05 +0200 -Subject: [PATCH] Install.dll in prefix/bin and add config export to cmake - build +Date: Wed, 30 Oct 2019 12:54:52 +0100 +Subject: [PATCH] Blosc 1.17 fixes and cmake config script --- - CMakeLists.txt | 112 ++++++++++++++++++++---------------- - blosc/CMakeLists.txt | 121 ++++++++++----------------------------- + CMakeLists.txt | 105 +++++++++++++++++----------------- + blosc/CMakeLists.txt | 118 +++++++++------------------------------ cmake/FindLZ4.cmake | 6 +- cmake/FindSnappy.cmake | 8 ++- cmake/FindZstd.cmake | 8 ++- - cmake_config.cmake.in | 33 +++++++++++ - internal-complibs/CMakeLists.txt | 30 ++++++++++ - 7 files changed, 173 insertions(+), 145 deletions(-) + cmake_config.cmake.in | 24 ++++++++ + internal-complibs/CMakeLists.txt | 35 ++++++++++++ + 7 files changed, 157 insertions(+), 147 deletions(-) create mode 100644 cmake_config.cmake.in create mode 100644 internal-complibs/CMakeLists.txt diff --git a/CMakeLists.txt b/CMakeLists.txt -index 59d9fab..bdc0dda 100644 +index 59d9fab..e9134c2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -71,7 +71,7 @@ @@ -29,36 +28,11 @@ index 59d9fab..bdc0dda 100644 if (NOT CMAKE_VERSION VERSION_LESS 3.3) cmake_policy(SET CMP0063 NEW) endif() -@@ -124,55 +124,37 @@ option(PREFER_EXTERNAL_ZSTD +@@ -124,55 +124,30 @@ option(PREFER_EXTERNAL_ZSTD set(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake") -+set(PRIVATE_LIBS "") -+set(PUBLIC_LIBS "") -+set(PUBLIC_PACKAGES "" CACHE INTERNAL "") -+macro(use_package _pkg _tgt) -+ string(TOUPPER ${_pkg} _PKG) -+ if(NOT DEACTIVATE_${_PKG}) -+ if(PREFER_EXTERNAL_${_PKG}) -+ find_package(${_pkg}) -+ if (NOT ${_pkg}_FOUND ) -+ message(STATUS "No ${_pkg} found. Using internal sources.") -+ endif() -+ else() -+ message(STATUS "Using ${_pkg} internal sources.") -+ endif(PREFER_EXTERNAL_${_PKG}) -+ # HAVE_${_pkg} will be set to true because even if the library is -+ # not found, we will use the included sources for it -+ set(HAVE_${_PKG} TRUE) -+ if (${_pkg}_FOUND) -+ list(APPEND PUBLIC_LIBS ${_pkg}::${_tgt}) -+ set(PUBLIC_PACKAGES "${PUBLIC_PACKAGES};${_pkg}" CACHE INTERNAL "") -+ else() -+ list(APPEND PRIVATE_LIBS ${_pkg}::${_tgt}) -+ endif() -+ endif(NOT DEACTIVATE_${_PKG}) -+endmacro() - +- -if(NOT DEACTIVATE_LZ4) - if(PREFER_EXTERNAL_LZ4) - find_package(LZ4) @@ -107,6 +81,25 @@ index 59d9fab..bdc0dda 100644 - # not found, we will use the included sources for it - set(HAVE_ZSTD TRUE) -endif (NOT DEACTIVATE_ZSTD) ++set(LIBS "") ++macro(use_package _pkg _tgt) ++ string(TOUPPER ${_pkg} _PKG) ++ if(NOT DEACTIVATE_${_PKG}) ++ if(PREFER_EXTERNAL_${_PKG}) ++ find_package(${_pkg}) ++ if (NOT ${_pkg}_FOUND ) ++ message(STATUS "No ${_pkg} found. Using internal sources.") ++ endif() ++ else() ++ message(STATUS "Using ${_pkg} internal sources.") ++ endif(PREFER_EXTERNAL_${_PKG}) ++ # HAVE_${_pkg} will be set to true because even if the library is ++ # not found, we will use the included sources for it ++ set(HAVE_${_PKG} TRUE) ++ list(APPEND LIBS ${_pkg}::${_tgt}) ++ endif(NOT DEACTIVATE_${_PKG}) ++endmacro() ++ +set(ZLIB_ROOT $ENV{ZLIB_ROOT}) +use_package(ZLIB ZLIB) +use_package(LZ4 LZ4) @@ -115,7 +108,7 @@ index 59d9fab..bdc0dda 100644 # create the config.h file configure_file ("blosc/config.h.in" "blosc/config.h" ) -@@ -316,6 +298,7 @@ endif() +@@ -316,6 +291,7 @@ endif() # subdirectories @@ -123,7 +116,15 @@ index 59d9fab..bdc0dda 100644 add_subdirectory(blosc) if(BUILD_TESTS) -@@ -338,10 +321,41 @@ if (BLOSC_INSTALL) +@@ -328,7 +304,6 @@ if(BUILD_BENCHMARKS) + add_subdirectory(bench) + endif(BUILD_BENCHMARKS) + +- + # uninstall target + if (BLOSC_INSTALL) + configure_file( +@@ -338,10 +313,38 @@ if (BLOSC_INSTALL) install(FILES "${CMAKE_CURRENT_BINARY_DIR}/blosc.pc" DESTINATION lib/pkgconfig COMPONENT DEV) @@ -157,16 +158,13 @@ index 59d9fab..bdc0dda 100644 + install(FILES + "${CMAKE_CURRENT_BINARY_DIR}/cmakeexports/BloscConfig.cmake" + "${CMAKE_CURRENT_BINARY_DIR}/cmakeexports/BloscConfigVersion.cmake" -+ "${CMAKE_CURRENT_SOURCE_DIR}/cmake/FindLZ4.cmake" -+ "${CMAKE_CURRENT_SOURCE_DIR}/cmake/FindZstd.cmake" -+ "${CMAKE_CURRENT_SOURCE_DIR}/cmake/FindSnappy.cmake" + DESTINATION lib/cmake/Blosc COMPONENT DEV) + add_custom_target(uninstall COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake) endif() diff --git a/blosc/CMakeLists.txt b/blosc/CMakeLists.txt -index 1d1bebe..16aff02 100644 +index 1d1bebe..f554abe 100644 --- a/blosc/CMakeLists.txt +++ b/blosc/CMakeLists.txt @@ -1,52 +1,11 @@ @@ -222,19 +220,17 @@ index 1d1bebe..16aff02 100644 # library sources set(SOURCES blosc.c blosclz.c fastcopy.c shuffle-generic.c bitshuffle-generic.c -@@ -73,53 +32,15 @@ if(WIN32) +@@ -73,53 +32,13 @@ if(WIN32) message(STATUS "using the internal pthread library for win32 systems.") set(SOURCES ${SOURCES} win32/pthread.c) else(NOT Threads_FOUND) - set(LIBS ${LIBS} ${CMAKE_THREAD_LIBS_INIT}) -+ list(APPEND PUBLIC_LIBS Threads::Threads) -+ set(PUBLIC_PACKAGES "${PUBLIC_PACKAGES};Threads" CACHE INTERNAL "") ++ list(APPEND LIBS Threads::Threads) endif(NOT Threads_FOUND) else(WIN32) find_package(Threads REQUIRED) - set(LIBS ${LIBS} ${CMAKE_THREAD_LIBS_INIT}) -+ list(APPEND PUBLIC_LIBS Threads::Threads) -+ set(PUBLIC_PACKAGES "${PUBLIC_PACKAGES};Threads" CACHE INTERNAL "") ++ list(APPEND LIBS Threads::Threads) endif(WIN32) -if(NOT DEACTIVATE_LZ4) @@ -280,7 +276,7 @@ index 1d1bebe..16aff02 100644 # targets if (BUILD_SHARED) add_library(blosc_shared SHARED ${SOURCES}) -@@ -191,14 +112,18 @@ if (BUILD_TESTS) +@@ -191,14 +110,17 @@ if (BUILD_TESTS) endif() endif() @@ -289,8 +285,7 @@ index 1d1bebe..16aff02 100644 if (BUILD_SHARED) - target_link_libraries(blosc_shared ${LIBS}) - target_include_directories(blosc_shared PUBLIC ${BLOSC_INCLUDE_DIRS}) -+ target_link_libraries(blosc_shared PUBLIC ${PUBLIC_LIBS}) -+ target_link_libraries(blosc_shared PRIVATE ${PRIVATE_LIBS}) ++ target_link_libraries(blosc_shared PRIVATE ${LIBS}) + target_include_directories(blosc_shared PUBLIC $) + target_link_libraries(blosc INTERFACE blosc_shared) endif() @@ -298,19 +293,19 @@ index 1d1bebe..16aff02 100644 if (BUILD_TESTS) - target_link_libraries(blosc_shared_testing ${LIBS}) - target_include_directories(blosc_shared_testing PUBLIC ${BLOSC_INCLUDE_DIRS}) -+ target_link_libraries(blosc_shared_testing ${PUBLIC_LIBS} ${PRIVATE_LIBS}) ++ target_link_libraries(blosc_shared_testing PRIVATE ${LIBS}) + target_include_directories(blosc_shared_testing PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) endif() if(BUILD_STATIC) -@@ -207,17 +132,31 @@ if(BUILD_STATIC) +@@ -207,17 +129,31 @@ if(BUILD_STATIC) if (MSVC) set_target_properties(blosc_static PROPERTIES PREFIX lib) endif() - target_link_libraries(blosc_static ${LIBS}) - target_include_directories(blosc_static PUBLIC ${BLOSC_INCLUDE_DIRS}) -+ target_link_libraries(blosc_static PUBLIC ${PUBLIC_LIBS}) -+ target_link_libraries(blosc_static PRIVATE ${PRIVATE_LIBS}) ++ # With the static library, cmake has to deal with transitive dependencies ++ target_link_libraries(blosc_static PRIVATE ${LIBS}) + target_include_directories(blosc_static PUBLIC $) + if (NOT BUILD_SHARED) + target_link_libraries(blosc INTERFACE blosc_static) @@ -398,24 +393,15 @@ index 7db4bb9..cabc2f8 100644 \ No newline at end of file diff --git a/cmake_config.cmake.in b/cmake_config.cmake.in new file mode 100644 -index 0000000..b4ede30 +index 0000000..0f6af24 --- /dev/null +++ b/cmake_config.cmake.in -@@ -0,0 +1,33 @@ +@@ -0,0 +1,24 @@ +include(CMakeFindDependencyMacro) + -+list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR}) -+ -+set(_deps "@PUBLIC_PACKAGES@") -+ -+foreach(pkg ${_deps}) -+ # no minimum versions are required by upstream -+ find_dependency(${pkg}) -+endforeach() -+ +include("${CMAKE_CURRENT_LIST_DIR}/BloscTargets.cmake") + -+function(remap_configs from_Cfg to_Cfg) ++function(_blosc_remap_configs from_Cfg to_Cfg) + string(TOUPPER ${from_Cfg} from_CFG) + string(TOLOWER ${from_Cfg} from_cfg) + @@ -432,21 +418,25 @@ index 0000000..b4ede30 +# MSVC will try to link RelWithDebInfo or MinSizeRel target with debug config +# if no matching installation is present which would result in link errors. +if(MSVC) -+ remap_configs(RelWithDebInfo Release) -+ remap_configs(MinSizeRel Release) ++ _blosc_remap_configs(RelWithDebInfo Release) ++ _blosc_remap_configs(MinSizeRel Release) +endif() diff --git a/internal-complibs/CMakeLists.txt b/internal-complibs/CMakeLists.txt new file mode 100644 -index 0000000..5b23484 +index 0000000..4586efa --- /dev/null +++ b/internal-complibs/CMakeLists.txt -@@ -0,0 +1,30 @@ +@@ -0,0 +1,35 @@ +macro(add_lib_target pkg tgt incdir files) + string(TOUPPER ${pkg} TGT) + if(NOT DEACTIVATE_${TGT} AND NOT ${pkg}_FOUND) ++ add_library(${tgt}_objs OBJECT ${files}) + add_library(${tgt} INTERFACE) ++ target_include_directories(${tgt}_objs PRIVATE $) + target_include_directories(${tgt} INTERFACE $) -+ target_sources(${tgt} INTERFACE "$") ++ #set_target_properties(${tgt} PROPERTIES INTERFACE_SOURCES "$") ++ set_target_properties(${tgt}_objs PROPERTIES POSITION_INDEPENDENT_CODE ON) ++ target_sources(${tgt} INTERFACE "$>") + add_library(${pkg}::${tgt} ALIAS ${tgt}) + + # This creates dummy (empty) interface targets in the exported config. @@ -471,6 +461,7 @@ index 0000000..5b23484 +file(GLOB ZSTD_FILES ${ZSTD_DIR}/common/*.c ${ZSTD_DIR}/compress/*.c ${ZSTD_DIR}/decompress/*.c) +add_lib_target(Zstd Zstd ${ZSTD_DIR} "${ZSTD_FILES}") +target_include_directories(Zstd INTERFACE $) ++target_include_directories(Zstd_objs PRIVATE $) \ No newline at end of file -- 2.16.2.windows.1 diff --git a/deps/deps-windows.cmake b/deps/deps-windows.cmake index 26763e878e..fcb300062c 100644 --- a/deps/deps-windows.cmake +++ b/deps/deps-windows.cmake @@ -81,7 +81,6 @@ ExternalProject_Add(dep_boost INSTALL_COMMAND "" # b2 does that already ) - ExternalProject_Add(dep_tbb EXCLUDE_FROM_ALL 1 URL "https://github.com/wjakob/tbb/archive/a0dc9bf76d0120f917b641ed095360448cabc85b.tar.gz" @@ -99,22 +98,22 @@ ExternalProject_Add(dep_tbb add_debug_dep(dep_tbb) -ExternalProject_Add(dep_gtest - EXCLUDE_FROM_ALL 1 - URL "https://github.com/google/googletest/archive/release-1.8.1.tar.gz" - URL_HASH SHA256=9bf1fe5182a604b4135edc1a425ae356c9ad15e9b23f9f12a02e80184c3a249c - CMAKE_GENERATOR "${DEP_MSVC_GEN}" - CMAKE_GENERATOR_PLATFORM "${DEP_PLATFORM}" - CMAKE_ARGS - -DBUILD_GMOCK=OFF - -Dgtest_force_shared_crt=ON - -DCMAKE_POSITION_INDEPENDENT_CODE=ON - "-DCMAKE_INSTALL_PREFIX:PATH=${DESTDIR}\\usr\\local" - BUILD_COMMAND msbuild /m /P:Configuration=Release INSTALL.vcxproj - INSTALL_COMMAND "" -) +# ExternalProject_Add(dep_gtest +# EXCLUDE_FROM_ALL 1 +# URL "https://github.com/google/googletest/archive/release-1.8.1.tar.gz" +# URL_HASH SHA256=9bf1fe5182a604b4135edc1a425ae356c9ad15e9b23f9f12a02e80184c3a249c +# CMAKE_GENERATOR "${DEP_MSVC_GEN}" +# CMAKE_GENERATOR_PLATFORM "${DEP_PLATFORM}" +# CMAKE_ARGS +# -DBUILD_GMOCK=OFF +# -Dgtest_force_shared_crt=ON +# -DCMAKE_POSITION_INDEPENDENT_CODE=ON +# "-DCMAKE_INSTALL_PREFIX:PATH=${DESTDIR}\\usr\\local" +# BUILD_COMMAND msbuild /m /P:Configuration=Release INSTALL.vcxproj +# INSTALL_COMMAND "" +# ) -add_debug_dep(dep_gtest) +# add_debug_dep(dep_gtest) ExternalProject_Add(dep_cereal EXCLUDE_FROM_ALL 1 @@ -181,7 +180,6 @@ if (${DEP_DEBUG}) ) endif () - if (${DEPS_BITS} EQUAL 32) set(DEP_LIBCURL_TARGET "x86") else () @@ -305,8 +303,8 @@ endif () ExternalProject_Add(dep_blosc EXCLUDE_FROM_ALL 1 - GIT_REPOSITORY https://github.com/Blosc/c-blosc.git - GIT_TAG v1.17.0 + URL https://github.com/Blosc/c-blosc/archive/v1.17.0.zip + URL_HASH SHA256=7463a1df566704f212263312717ab2c36b45d45cba6cd0dccebf91b2cc4b4da9 DEPENDS dep_zlib CMAKE_GENERATOR "${DEP_MSVC_GEN}" CMAKE_GENERATOR_PLATFORM "${DEP_PLATFORM}" @@ -331,7 +329,7 @@ ExternalProject_Add(dep_openexr EXCLUDE_FROM_ALL 1 GIT_REPOSITORY https://github.com/openexr/openexr.git GIT_TAG v2.4.0 - DEPENDS dep_zlib + DEPENDS CMAKE_GENERATOR "${DEP_MSVC_GEN}" CMAKE_GENERATOR_PLATFORM "${DEP_PLATFORM}" CMAKE_ARGS @@ -350,9 +348,9 @@ add_debug_dep(dep_openexr) ExternalProject_Add(dep_openvdb EXCLUDE_FROM_ALL 1 - GIT_REPOSITORY https://github.com/AcademySoftwareFoundation/openvdb.git - GIT_TAG v6.2.1 - DEPENDS dep_blosc dep_openexr dep_tbb + URL https://github.com/AcademySoftwareFoundation/openvdb/archive/v6.2.1.zip + URL_HASH SHA256=dc337399dce8e1c9f21f20e97b1ce7e4933cb0a63bb3b8b734d8fcc464aa0c48 + DEPENDS dep_blosc dep_openexr dep_tbb dep_boost CMAKE_GENERATOR "${DEP_MSVC_GEN}" CMAKE_GENERATOR_PLATFORM "${DEP_PLATFORM}" CMAKE_ARGS diff --git a/deps/openvdb-mods.patch b/deps/openvdb-mods.patch index a05076e986..60687b8d17 100644 --- a/deps/openvdb-mods.patch +++ b/deps/openvdb-mods.patch @@ -1,4 +1,4 @@ -From ee867b9f226412c0f3b83fa01cd43539acc4ed95 Mon Sep 17 00:00:00 2001 +From e48f4a835fe7cb391f9f90945472bd367fb4c4f1 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Wed, 16 Oct 2019 17:42:50 +0200 Subject: [PATCH] Build fixes for PrusaSlicer integration @@ -7,17 +7,17 @@ Subject: [PATCH] Build fixes for PrusaSlicer integration CMakeLists.txt | 3 - cmake/FindBlosc.cmake | 218 --------------- cmake/FindCppUnit.cmake | 4 +- - cmake/FindIlmBase.cmake | 337 ----------------------- + cmake/FindIlmBase.cmake | 337 ---------------------- cmake/FindOpenEXR.cmake | 329 ---------------------- cmake/FindOpenVDB.cmake | 19 +- - cmake/FindTBB.cmake | 593 ++++++++++++++++++++-------------------- + cmake/FindTBB.cmake | 605 ++++++++++++++++++++-------------------- openvdb/CMakeLists.txt | 13 +- openvdb/Grid.cc | 3 + openvdb/PlatformConfig.h | 9 +- openvdb/cmd/CMakeLists.txt | 4 +- openvdb/unittest/CMakeLists.txt | 3 +- openvdb/unittest/TestFile.cc | 2 +- - 13 files changed, 325 insertions(+), 1212 deletions(-) + 13 files changed, 336 insertions(+), 1213 deletions(-) delete mode 100644 cmake/FindBlosc.cmake delete mode 100644 cmake/FindIlmBase.cmake delete mode 100644 cmake/FindOpenEXR.cmake @@ -1011,10 +1011,10 @@ index 63a2eda..6211071 100644 endforeach() diff --git a/cmake/FindTBB.cmake b/cmake/FindTBB.cmake -index bdf9c81..ffdee03 100644 +index bdf9c81..c6bdec9 100644 --- a/cmake/FindTBB.cmake +++ b/cmake/FindTBB.cmake -@@ -1,333 +1,322 @@ +@@ -1,333 +1,332 @@ -# Copyright (c) DreamWorks Animation LLC +# The MIT License (MIT) # @@ -1205,10 +1205,6 @@ index bdf9c81..ffdee03 100644 +# +# This module will also create the "tbb" target that may be used when building +# executables and libraries. -+ -+include(FindPackageHandleStandardArgs) -+ -+if(NOT TBB_FOUND) -mark_as_advanced( - Tbb_INCLUDE_DIR @@ -1227,6 +1223,39 @@ index bdf9c81..ffdee03 100644 - foreach(COMPONENT ${TBB_FIND_COMPONENTS}) - if(NOT ${COMPONENT} IN_LIST _TBB_COMPONENT_LIST) - list(APPEND _IGNORED_COMPONENTS ${COMPONENT}) +- endif() +- endforeach() ++unset(TBB_FOUND CACHE) ++unset(TBB_INCLUDE_DIRS CACHE) ++unset(TBB_LIBRARIES) ++unset(TBB_LIBRARIES_DEBUG) ++unset(TBB_LIBRARIES_RELEASE) + +- if(_IGNORED_COMPONENTS) +- message(STATUS "Ignoring unknown components of TBB:") +- foreach(COMPONENT ${_IGNORED_COMPONENTS}) +- message(STATUS " ${COMPONENT}") +- endforeach() +- list(REMOVE_ITEM TBB_FIND_COMPONENTS ${_IGNORED_COMPONENTS}) +- endif() +-else() +- set(_TBB_COMPONENTS_PROVIDED FALSE) +- set(TBB_FIND_COMPONENTS ${_TBB_COMPONENT_LIST}) +-endif() ++include(FindPackageHandleStandardArgs) ++ ++find_package(Threads QUIET REQUIRED) + +-# Append TBB_ROOT or $ENV{TBB_ROOT} if set (prioritize the direct cmake var) +-set(_TBB_ROOT_SEARCH_DIR "") ++if(NOT TBB_FOUND) + +-if(TBB_ROOT) +- list(APPEND _TBB_ROOT_SEARCH_DIR ${TBB_ROOT}) +-else() +- set(_ENV_TBB_ROOT $ENV{TBB_ROOT}) +- if(_ENV_TBB_ROOT) +- list(APPEND _TBB_ROOT_SEARCH_DIR ${_ENV_TBB_ROOT}) + ################################## + # Check the build type + ################################## @@ -1241,7 +1270,8 @@ index bdf9c81..ffdee03 100644 + set(TBB_BUILD_TYPE DEBUG) + else() + set(TBB_BUILD_TYPE RELEASE) -+ endif() + endif() +-endif() + + ################################## + # Set the TBB search directories @@ -1261,7 +1291,53 @@ index bdf9c81..ffdee03 100644 + else() + set(TBB_ARCHITECTURE "ia32") + endif() -+ + +-# Additionally try and use pkconfig to find Tbb +- +-find_package(PkgConfig) +-pkg_check_modules(PC_Tbb QUIET tbb) +- +-# ------------------------------------------------------------------------ +-# Search for tbb include DIR +-# ------------------------------------------------------------------------ +- +-set(_TBB_INCLUDE_SEARCH_DIRS "") +-list(APPEND _TBB_INCLUDE_SEARCH_DIRS +- ${TBB_INCLUDEDIR} +- ${_TBB_ROOT_SEARCH_DIR} +- ${PC_Tbb_INCLUDE_DIRS} +- ${SYSTEM_LIBRARY_PATHS} +-) +- +-# Look for a standard tbb header file. +-find_path(Tbb_INCLUDE_DIR tbb/tbb_stddef.h +- NO_DEFAULT_PATH +- PATHS ${_TBB_INCLUDE_SEARCH_DIRS} +- PATH_SUFFIXES include +-) +- +-if(EXISTS "${Tbb_INCLUDE_DIR}/tbb/tbb_stddef.h") +- file(STRINGS "${Tbb_INCLUDE_DIR}/tbb/tbb_stddef.h" +- _tbb_version_major_string REGEX "#define TBB_VERSION_MAJOR " +- ) +- string(REGEX REPLACE "#define TBB_VERSION_MAJOR" "" +- _tbb_version_major_string "${_tbb_version_major_string}" +- ) +- string(STRIP "${_tbb_version_major_string}" Tbb_VERSION_MAJOR) +- +- file(STRINGS "${Tbb_INCLUDE_DIR}/tbb/tbb_stddef.h" +- _tbb_version_minor_string REGEX "#define TBB_VERSION_MINOR " +- ) +- string(REGEX REPLACE "#define TBB_VERSION_MINOR" "" +- _tbb_version_minor_string "${_tbb_version_minor_string}" +- ) +- string(STRIP "${_tbb_version_minor_string}" Tbb_VERSION_MINOR) +- +- unset(_tbb_version_major_string) +- unset(_tbb_version_minor_string) +- +- set(Tbb_VERSION ${Tbb_VERSION_MAJOR}.${Tbb_VERSION_MINOR}) +-endif() + # Set the TBB search library path search suffix based on the version of VC + if(WINDOWS_STORE) + set(TBB_LIB_PATH_SUFFIX "lib/${TBB_ARCHITECTURE}/vc11_ui") @@ -1273,15 +1349,11 @@ index bdf9c81..ffdee03 100644 + set(TBB_LIB_PATH_SUFFIX "lib/${TBB_ARCHITECTURE}/vc11") + elseif(MSVC10) + set(TBB_LIB_PATH_SUFFIX "lib/${TBB_ARCHITECTURE}/vc10") - endif() -- endforeach() ++ endif() -- if(_IGNORED_COMPONENTS) -- message(STATUS "Ignoring unknown components of TBB:") -- foreach(COMPONENT ${_IGNORED_COMPONENTS}) -- message(STATUS " ${COMPONENT}") -- endforeach() -- list(REMOVE_ITEM TBB_FIND_COMPONENTS ${_IGNORED_COMPONENTS}) +-# ------------------------------------------------------------------------ +-# Search for TBB lib DIR +-# ------------------------------------------------------------------------ + # Add the library path search suffix for the VC independent version of TBB + list(APPEND TBB_LIB_PATH_SUFFIX "lib/${TBB_ARCHITECTURE}/vc_mt") + @@ -1332,110 +1404,19 @@ index bdf9c81..ffdee03 100644 + string(REGEX REPLACE ".*#define TBB_INTERFACE_VERSION ([0-9]+).*" "\\1" + TBB_INTERFACE_VERSION "${_tbb_version_file}") + set(TBB_VERSION "${TBB_VERSION_MAJOR}.${TBB_VERSION_MINOR}") - endif() --else() -- set(_TBB_COMPONENTS_PROVIDED FALSE) -- set(TBB_FIND_COMPONENTS ${_TBB_COMPONENT_LIST}) --endif() ++ endif() --# Append TBB_ROOT or $ENV{TBB_ROOT} if set (prioritize the direct cmake var) --set(_TBB_ROOT_SEARCH_DIR "") +-set(_TBB_LIBRARYDIR_SEARCH_DIRS "") + ################################## + # Find TBB components + ################################## --if(TBB_ROOT) -- list(APPEND _TBB_ROOT_SEARCH_DIR ${TBB_ROOT}) --else() -- set(_ENV_TBB_ROOT $ENV{TBB_ROOT}) -- if(_ENV_TBB_ROOT) -- list(APPEND _TBB_ROOT_SEARCH_DIR ${_ENV_TBB_ROOT}) +-# Append to _TBB_LIBRARYDIR_SEARCH_DIRS in priority order + if(TBB_VERSION VERSION_LESS 4.3) + set(TBB_SEARCH_COMPOMPONENTS tbb_preview tbbmalloc tbb) + else() + set(TBB_SEARCH_COMPOMPONENTS tbb_preview tbbmalloc_proxy tbbmalloc tbb) - endif() --endif() - --# Additionally try and use pkconfig to find Tbb -- --find_package(PkgConfig) --pkg_check_modules(PC_Tbb QUIET tbb) -- --# ------------------------------------------------------------------------ --# Search for tbb include DIR --# ------------------------------------------------------------------------ -- --set(_TBB_INCLUDE_SEARCH_DIRS "") --list(APPEND _TBB_INCLUDE_SEARCH_DIRS -- ${TBB_INCLUDEDIR} -- ${_TBB_ROOT_SEARCH_DIR} -- ${PC_Tbb_INCLUDE_DIRS} -- ${SYSTEM_LIBRARY_PATHS} --) -- --# Look for a standard tbb header file. --find_path(Tbb_INCLUDE_DIR tbb/tbb_stddef.h -- NO_DEFAULT_PATH -- PATHS ${_TBB_INCLUDE_SEARCH_DIRS} -- PATH_SUFFIXES include --) -- --if(EXISTS "${Tbb_INCLUDE_DIR}/tbb/tbb_stddef.h") -- file(STRINGS "${Tbb_INCLUDE_DIR}/tbb/tbb_stddef.h" -- _tbb_version_major_string REGEX "#define TBB_VERSION_MAJOR " -- ) -- string(REGEX REPLACE "#define TBB_VERSION_MAJOR" "" -- _tbb_version_major_string "${_tbb_version_major_string}" -- ) -- string(STRIP "${_tbb_version_major_string}" Tbb_VERSION_MAJOR) -- -- file(STRINGS "${Tbb_INCLUDE_DIR}/tbb/tbb_stddef.h" -- _tbb_version_minor_string REGEX "#define TBB_VERSION_MINOR " -- ) -- string(REGEX REPLACE "#define TBB_VERSION_MINOR" "" -- _tbb_version_minor_string "${_tbb_version_minor_string}" -- ) -- string(STRIP "${_tbb_version_minor_string}" Tbb_VERSION_MINOR) -- -- unset(_tbb_version_major_string) -- unset(_tbb_version_minor_string) -- -- set(Tbb_VERSION ${Tbb_VERSION_MAJOR}.${Tbb_VERSION_MINOR}) --endif() -+ if(TBB_STATIC) -+ set(TBB_STATIC_SUFFIX "_static") + endif() -+ -+ # Find each component -+ foreach(_comp ${TBB_SEARCH_COMPOMPONENTS}) -+ if(";${TBB_FIND_COMPONENTS};tbb;" MATCHES ";${_comp};") - --# ------------------------------------------------------------------------ --# Search for TBB lib DIR --# ------------------------------------------------------------------------ -+ # Search for the libraries -+ find_library(TBB_${_comp}_LIBRARY_RELEASE ${_comp}${TBB_STATIC_SUFFIX} -+ HINTS ${TBB_LIBRARY} ${TBB_SEARCH_DIR} -+ PATHS ${TBB_DEFAULT_SEARCH_DIR} ENV LIBRARY_PATH -+ PATH_SUFFIXES ${TBB_LIB_PATH_SUFFIX}) - --set(_TBB_LIBRARYDIR_SEARCH_DIRS "") -+ find_library(TBB_${_comp}_LIBRARY_DEBUG ${_comp}${TBB_STATIC_SUFFIX}_debug -+ HINTS ${TBB_LIBRARY} ${TBB_SEARCH_DIR} -+ PATHS ${TBB_DEFAULT_SEARCH_DIR} ENV LIBRARY_PATH -+ PATH_SUFFIXES ${TBB_LIB_PATH_SUFFIX}) - --# Append to _TBB_LIBRARYDIR_SEARCH_DIRS in priority order -+ if(TBB_${_comp}_LIBRARY_DEBUG) -+ list(APPEND TBB_LIBRARIES_DEBUG "${TBB_${_comp}_LIBRARY_DEBUG}") -+ endif() -+ if(TBB_${_comp}_LIBRARY_RELEASE) -+ list(APPEND TBB_LIBRARIES_RELEASE "${TBB_${_comp}_LIBRARY_RELEASE}") -+ endif() -+ if(TBB_${_comp}_LIBRARY_${TBB_BUILD_TYPE} AND NOT TBB_${_comp}_LIBRARY) -+ set(TBB_${_comp}_LIBRARY "${TBB_${_comp}_LIBRARY_${TBB_BUILD_TYPE}}") -+ endif() -set(_TBB_LIBRARYDIR_SEARCH_DIRS "") -list(APPEND _TBB_LIBRARYDIR_SEARCH_DIRS @@ -1444,41 +1425,35 @@ index bdf9c81..ffdee03 100644 - ${PC_Tbb_LIBRARY_DIRS} - ${SYSTEM_LIBRARY_PATHS} -) -+ if(TBB_${_comp}_LIBRARY AND EXISTS "${TBB_${_comp}_LIBRARY}") -+ set(TBB_${_comp}_FOUND TRUE) -+ else() -+ set(TBB_${_comp}_FOUND FALSE) -+ endif() ++ if(TBB_STATIC) ++ set(TBB_STATIC_SUFFIX "_static") ++ endif() -set(TBB_PATH_SUFFIXES - lib64 - lib -) -+ # Mark internal variables as advanced -+ mark_as_advanced(TBB_${_comp}_LIBRARY_RELEASE) -+ mark_as_advanced(TBB_${_comp}_LIBRARY_DEBUG) -+ mark_as_advanced(TBB_${_comp}_LIBRARY) ++ # Find each component ++ foreach(_comp ${TBB_SEARCH_COMPOMPONENTS}) ++ if(";${TBB_FIND_COMPONENTS};tbb;" MATCHES ";${_comp};") -# platform branching -+ endif() -+ endforeach() ++ unset(TBB_${_comp}_LIBRARY_DEBUG CACHE) ++ unset(TBB_${_comp}_LIBRARY_RELEASE CACHE) -if(UNIX) - list(INSERT TBB_PATH_SUFFIXES 0 lib/x86_64-linux-gnu) -endif() -+ ################################## -+ # Set compile flags and libraries -+ ################################## ++ # Search for the libraries ++ find_library(TBB_${_comp}_LIBRARY_RELEASE ${_comp}${TBB_STATIC_SUFFIX} ++ HINTS ${TBB_LIBRARY} ${TBB_SEARCH_DIR} ++ PATHS ${TBB_DEFAULT_SEARCH_DIR} ENV LIBRARY_PATH ++ PATH_SUFFIXES ${TBB_LIB_PATH_SUFFIX}) -if(APPLE) - if(TBB_FOR_CLANG) - list(INSERT TBB_PATH_SUFFIXES 0 lib/libc++) -+ set(TBB_DEFINITIONS_RELEASE "") -+ set(TBB_DEFINITIONS_DEBUG "TBB_USE_DEBUG=1") -+ -+ if(TBB_LIBRARIES_${TBB_BUILD_TYPE}) -+ set(TBB_LIBRARIES "${TBB_LIBRARIES_${TBB_BUILD_TYPE}}") - endif() +- endif() -elseif(WIN32) - if(MSVC10) - set(TBB_VC_DIR vc10) @@ -1498,45 +1473,26 @@ index bdf9c81..ffdee03 100644 - else() - list(INSERT TBB_PATH_SUFFIXES 0 lib/intel64/gcc4.4) - endif() -+ -+ if(NOT MSVC AND NOT TBB_LIBRARIES) -+ set(TBB_LIBRARIES ${TBB_LIBRARIES_RELEASE}) - endif() +- endif() -endif() ++ find_library(TBB_${_comp}_LIBRARY_DEBUG ${_comp}${TBB_STATIC_SUFFIX}_debug ++ HINTS ${TBB_LIBRARY} ${TBB_SEARCH_DIR} ++ PATHS ${TBB_DEFAULT_SEARCH_DIR} ENV LIBRARY_PATH ++ PATH_SUFFIXES ${TBB_LIB_PATH_SUFFIX}) -if(UNIX AND TBB_USE_STATIC_LIBS) - set(_TBB_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES}) - set(CMAKE_FIND_LIBRARY_SUFFIXES ".a") -endif() -+ if (MSVC AND TBB_STATIC) -+ set(TBB_DEFINITIONS __TBB_NO_IMPLICIT_LINKAGE) -+ endif () -+ -+ unset (TBB_STATIC_SUFFIX) -+ -+ find_package_handle_standard_args(TBB -+ REQUIRED_VARS TBB_INCLUDE_DIRS TBB_LIBRARIES -+ HANDLE_COMPONENTS -+ VERSION_VAR TBB_VERSION) -+ -+ ################################## -+ # Create targets -+ ################################## -+ -+ if(NOT CMAKE_VERSION VERSION_LESS 3.0 AND TBB_FOUND) -+ add_library(TBB::tbb UNKNOWN IMPORTED) -+ set_target_properties(TBB::tbb PROPERTIES -+ INTERFACE_INCLUDE_DIRECTORIES ${TBB_INCLUDE_DIRS} -+ IMPORTED_LOCATION ${TBB_LIBRARIES}) -+ if(TBB_LIBRARIES_RELEASE AND TBB_LIBRARIES_DEBUG) -+ set_target_properties(TBB::tbb PROPERTIES -+ INTERFACE_COMPILE_DEFINITIONS "${TBB_DEFINITIONS};$<$,$>:${TBB_DEFINITIONS_DEBUG}>;$<$:${TBB_DEFINITIONS_RELEASE}>" -+ IMPORTED_LOCATION_DEBUG ${TBB_LIBRARIES_DEBUG} -+ IMPORTED_LOCATION_RELWITHDEBINFO ${TBB_LIBRARIES_RELEASE} -+ IMPORTED_LOCATION_RELEASE ${TBB_LIBRARIES_RELEASE} -+ IMPORTED_LOCATION_MINSIZEREL ${TBB_LIBRARIES_RELEASE} -+ ) -+ endif() ++ if(TBB_${_comp}_LIBRARY_DEBUG) ++ list(APPEND TBB_LIBRARIES_DEBUG "${TBB_${_comp}_LIBRARY_DEBUG}") ++ endif() ++ if(TBB_${_comp}_LIBRARY_RELEASE) ++ list(APPEND TBB_LIBRARIES_RELEASE "${TBB_${_comp}_LIBRARY_RELEASE}") ++ endif() ++ if(TBB_${_comp}_LIBRARY_${TBB_BUILD_TYPE} AND NOT TBB_${_comp}_LIBRARY) ++ set(TBB_${_comp}_LIBRARY "${TBB_${_comp}_LIBRARY_${TBB_BUILD_TYPE}}") ++ endif() -set(Tbb_LIB_COMPONENTS "") - @@ -1559,19 +1515,84 @@ index bdf9c81..ffdee03 100644 - # Extract the directory and apply the matched text (in brackets) - get_filename_component(Tbb_${COMPONENT}_DIR "${Tbb_${COMPONENT}_LIBRARY}" DIRECTORY) - set(Tbb_${COMPONENT}_LIBRARY "${Tbb_${COMPONENT}_DIR}/${CMAKE_MATCH_1}") -- endif() -+ if(CMAKE_SYSTEM_NAME STREQUAL "Linux") -+ find_package(Threads QUIET REQUIRED) -+ set_target_properties(TBB::tbb PROPERTIES INTERFACE_LINK_LIBRARIES "${CMAKE_DL_LIBS};Threads::Threads") ++ if(TBB_${_comp}_LIBRARY AND EXISTS "${TBB_${_comp}_LIBRARY}") ++ set(TBB_${_comp}_FOUND TRUE) ++ else() ++ set(TBB_${_comp}_FOUND FALSE) + endif() ++ ++ # Mark internal variables as advanced ++ mark_as_advanced(TBB_${_comp}_LIBRARY_RELEASE) ++ mark_as_advanced(TBB_${_comp}_LIBRARY_DEBUG) ++ mark_as_advanced(TBB_${_comp}_LIBRARY) ++ endif() - endif() +- endif() ++ endforeach() - list(APPEND Tbb_LIB_COMPONENTS ${Tbb_${COMPONENT}_LIBRARY}) -- ++ ################################## ++ # Set compile flags and libraries ++ ################################## + - if(Tbb_${COMPONENT}_LIBRARY) - set(TBB_${COMPONENT}_FOUND TRUE) - else() - set(TBB_${COMPONENT}_FOUND FALSE) ++ set(TBB_DEFINITIONS_RELEASE "") ++ set(TBB_DEFINITIONS_DEBUG "TBB_USE_DEBUG=1") ++ ++ if(TBB_LIBRARIES_${TBB_BUILD_TYPE}) ++ set(TBB_LIBRARIES "${TBB_LIBRARIES_${TBB_BUILD_TYPE}}") ++ endif() ++ ++ if(NOT MSVC AND NOT TBB_LIBRARIES) ++ set(TBB_LIBRARIES ${TBB_LIBRARIES_RELEASE}) + endif() +-endforeach() + +-if(UNIX AND TBB_USE_STATIC_LIBS) +- set(CMAKE_FIND_LIBRARY_SUFFIXES ${_TBB_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES}) +- unset(_TBB_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES) +-endif() ++ set(TBB_DEFINITIONS "") ++ if (MSVC AND TBB_STATIC) ++ set(TBB_DEFINITIONS __TBB_NO_IMPLICIT_LINKAGE) ++ endif () ++ ++ unset (TBB_STATIC_SUFFIX) ++ ++ find_package_handle_standard_args(TBB ++ REQUIRED_VARS TBB_INCLUDE_DIRS TBB_LIBRARIES ++ FAIL_MESSAGE "TBB library cannot be found. Consider set TBBROOT environment variable." ++ HANDLE_COMPONENTS ++ VERSION_VAR TBB_VERSION) ++ ++ ################################## ++ # Create targets ++ ################################## ++ ++ if(NOT CMAKE_VERSION VERSION_LESS 3.0 AND TBB_FOUND) ++ add_library(TBB::tbb UNKNOWN IMPORTED) ++ set_target_properties(TBB::tbb PROPERTIES ++ INTERFACE_COMPILE_DEFINITIONS "${TBB_DEFINITIONS}" ++ INTERFACE_LINK_LIBRARIES "Threads::Threads;${CMAKE_DL_LIBS}" ++ INTERFACE_INCLUDE_DIRECTORIES ${TBB_INCLUDE_DIRS} ++ IMPORTED_LOCATION ${TBB_LIBRARIES}) ++ if(TBB_LIBRARIES_RELEASE AND TBB_LIBRARIES_DEBUG) ++ set_target_properties(TBB::tbb PROPERTIES ++ INTERFACE_COMPILE_DEFINITIONS "${TBB_DEFINITIONS};$<$,$>:${TBB_DEFINITIONS_DEBUG}>;$<$:${TBB_DEFINITIONS_RELEASE}>" ++ IMPORTED_LOCATION_DEBUG ${TBB_LIBRARIES_DEBUG} ++ IMPORTED_LOCATION_RELWITHDEBINFO ${TBB_LIBRARIES_RELEASE} ++ IMPORTED_LOCATION_RELEASE ${TBB_LIBRARIES_RELEASE} ++ IMPORTED_LOCATION_MINSIZEREL ${TBB_LIBRARIES_RELEASE} ++ ) ++ endif() ++ endif() + +-# ------------------------------------------------------------------------ +-# Cache and set TBB_FOUND +-# ------------------------------------------------------------------------ + mark_as_advanced(TBB_INCLUDE_DIRS TBB_LIBRARIES) + + unset(TBB_ARCHITECTURE) @@ -1588,18 +1609,8 @@ index bdf9c81..ffdee03 100644 + message(STATUS " TBB_LIBRARIES_DEBUG = ${TBB_LIBRARIES_DEBUG}") + message(STATUS " TBB_DEFINITIONS_RELEASE = ${TBB_DEFINITIONS_RELEASE}") + message(STATUS " TBB_LIBRARIES_RELEASE = ${TBB_LIBRARIES_RELEASE}") - endif() --endforeach() ++ endif() --if(UNIX AND TBB_USE_STATIC_LIBS) -- set(CMAKE_FIND_LIBRARY_SUFFIXES ${_TBB_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES}) -- unset(_TBB_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES) --endif() -- --# ------------------------------------------------------------------------ --# Cache and set TBB_FOUND --# ------------------------------------------------------------------------ -- -include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(TBB - FOUND_VAR TBB_FOUND From 06b2f8c210a92e78a4b51d5548d83de0a056464e Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Wed, 30 Oct 2019 15:37:08 +0100 Subject: [PATCH 021/336] Omit blosc packing in deps build --- deps/deps-windows.cmake | 1 + 1 file changed, 1 insertion(+) diff --git a/deps/deps-windows.cmake b/deps/deps-windows.cmake index fcb300062c..fa2a78b037 100644 --- a/deps/deps-windows.cmake +++ b/deps/deps-windows.cmake @@ -318,6 +318,7 @@ ExternalProject_Add(dep_blosc -DBUILD_TESTS=OFF -DBUILD_BENCHMARKS=OFF -DPREFER_EXTERNAL_ZLIB=ON + -DBLOSC_IS_SUBPROJECT=OFF PATCH_COMMAND ${GIT_EXECUTABLE} apply --whitespace=fix ${CMAKE_CURRENT_SOURCE_DIR}/blosc-mods.patch BUILD_COMMAND msbuild /m /P:Configuration=Release INSTALL.vcxproj INSTALL_COMMAND "" From af89655437a1e5976d00b7897ef5cf8d8c6d8ae0 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Wed, 30 Oct 2019 16:21:01 +0100 Subject: [PATCH 022/336] Try to fix patching by reverting to git repos in download steps Patching does not remove or rename files. --- deps/deps-windows.cmake | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/deps/deps-windows.cmake b/deps/deps-windows.cmake index fa2a78b037..4f8bbc1ab5 100644 --- a/deps/deps-windows.cmake +++ b/deps/deps-windows.cmake @@ -303,8 +303,10 @@ endif () ExternalProject_Add(dep_blosc EXCLUDE_FROM_ALL 1 - URL https://github.com/Blosc/c-blosc/archive/v1.17.0.zip - URL_HASH SHA256=7463a1df566704f212263312717ab2c36b45d45cba6cd0dccebf91b2cc4b4da9 + #URL https://github.com/Blosc/c-blosc/archive/v1.17.0.zip + #URL_HASH SHA256=7463a1df566704f212263312717ab2c36b45d45cba6cd0dccebf91b2cc4b4da9 + GIT_REPOSITORY https://github.com/Blosc/c-blosc.git + GIT_TAG v1.17.0 DEPENDS dep_zlib CMAKE_GENERATOR "${DEP_MSVC_GEN}" CMAKE_GENERATOR_PLATFORM "${DEP_PLATFORM}" @@ -318,7 +320,8 @@ ExternalProject_Add(dep_blosc -DBUILD_TESTS=OFF -DBUILD_BENCHMARKS=OFF -DPREFER_EXTERNAL_ZLIB=ON - -DBLOSC_IS_SUBPROJECT=OFF + -DBLOSC_IS_SUBPROJECT:BOOL=ON + -DBLOSC_INSTALL:BOOL=ON PATCH_COMMAND ${GIT_EXECUTABLE} apply --whitespace=fix ${CMAKE_CURRENT_SOURCE_DIR}/blosc-mods.patch BUILD_COMMAND msbuild /m /P:Configuration=Release INSTALL.vcxproj INSTALL_COMMAND "" @@ -349,8 +352,10 @@ add_debug_dep(dep_openexr) ExternalProject_Add(dep_openvdb EXCLUDE_FROM_ALL 1 - URL https://github.com/AcademySoftwareFoundation/openvdb/archive/v6.2.1.zip - URL_HASH SHA256=dc337399dce8e1c9f21f20e97b1ce7e4933cb0a63bb3b8b734d8fcc464aa0c48 + #URL https://github.com/AcademySoftwareFoundation/openvdb/archive/v6.2.1.zip + #URL_HASH SHA256=dc337399dce8e1c9f21f20e97b1ce7e4933cb0a63bb3b8b734d8fcc464aa0c48 + GIT_REPOSITORY https://github.com/AcademySoftwareFoundation/openvdb.git + GIT_TAG v6.2.1 DEPENDS dep_blosc dep_openexr dep_tbb dep_boost CMAKE_GENERATOR "${DEP_MSVC_GEN}" CMAKE_GENERATOR_PLATFORM "${DEP_PLATFORM}" From 64a5696539cee8bdcf5880a7258cfea3f8b40359 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Wed, 30 Oct 2019 17:19:43 +0100 Subject: [PATCH 023/336] Re-enable example test --- tests/CMakeLists.txt | 2 +- tests/example/example_tests_main.cpp | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 9453fa3143..0d2266dc56 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -28,4 +28,4 @@ add_subdirectory(timeutils) add_subdirectory(fff_print) add_subdirectory(sla_print) add_subdirectory(hollowing) -#add_subdirectory(example) +add_subdirectory(example) diff --git a/tests/example/example_tests_main.cpp b/tests/example/example_tests_main.cpp index 32e8d02b76..426d1ffef7 100644 --- a/tests/example/example_tests_main.cpp +++ b/tests/example/example_tests_main.cpp @@ -1,4 +1,3 @@ -#define CATCH_CONFIG_MAIN #include TEST_CASE("Is example succesful", "[example]") { From ce9c2c5dd4839318640b24141077511587d98471 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Wed, 30 Oct 2019 18:08:16 +0100 Subject: [PATCH 024/336] Add explicit ZLIB system package requirement on Unix systems. We already depended on that but is wasn't stated in the deps script. --- deps/deps-unix-common.cmake | 4 +++- deps/deps-windows.cmake | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/deps/deps-unix-common.cmake b/deps/deps-unix-common.cmake index 0df535fc31..c6caab987c 100644 --- a/deps/deps-unix-common.cmake +++ b/deps/deps-unix-common.cmake @@ -7,6 +7,8 @@ else () set(TBB_MINGW_WORKAROUND "") endif () +find_package(ZLIB REQUIRED) + ExternalProject_Add(dep_tbb EXCLUDE_FROM_ALL 1 URL "https://github.com/wjakob/tbb/archive/a0dc9bf76d0120f917b641ed095360448cabc85b.tar.gz" @@ -105,7 +107,7 @@ ExternalProject_Add(dep_blosc -DBUILD_STATIC=ON -DBUILD_TESTS=OFF -DBUILD_BENCHMARKS=OFF - -DPREFER_EXTERNAL_ZLIB=OFF + -DPREFER_EXTERNAL_ZLIB=ON PATCH_COMMAND ${GIT_EXECUTABLE} apply --ignore-space-change --ignore-whitespace ${CMAKE_CURRENT_SOURCE_DIR}/blosc-mods.patch ) diff --git a/deps/deps-windows.cmake b/deps/deps-windows.cmake index 4f8bbc1ab5..3f722ea992 100644 --- a/deps/deps-windows.cmake +++ b/deps/deps-windows.cmake @@ -333,7 +333,7 @@ ExternalProject_Add(dep_openexr EXCLUDE_FROM_ALL 1 GIT_REPOSITORY https://github.com/openexr/openexr.git GIT_TAG v2.4.0 - DEPENDS + DEPENDS dep_zlib CMAKE_GENERATOR "${DEP_MSVC_GEN}" CMAKE_GENERATOR_PLATFORM "${DEP_PLATFORM}" CMAKE_ARGS From 2165537fa59c2ab600e0a0d8fa03eed672c1e4a7 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Thu, 31 Oct 2019 14:36:33 +0100 Subject: [PATCH 025/336] Do some hollowing finally. --- src/libslic3r/SLA/SLABoilerPlate.hpp | 70 ++++++++++++---- src/libslic3r/SLA/SLAPad.cpp | 4 +- src/libslic3r/SLA/SLASupportTreeBuilder.cpp | 18 ++-- tests/hollowing/CMakeLists.txt | 2 +- tests/hollowing/hollowing_test_main.cpp | 1 + tests/hollowing/hollowing_tests.cpp | 51 ++++------- tests/hollowing/openvdb_utils.cpp | 93 +++++++++++++++++++++ tests/hollowing/openvdb_utils.hpp | 25 ++++++ 8 files changed, 202 insertions(+), 62 deletions(-) create mode 100644 tests/hollowing/hollowing_test_main.cpp create mode 100644 tests/hollowing/openvdb_utils.cpp create mode 100644 tests/hollowing/openvdb_utils.hpp diff --git a/src/libslic3r/SLA/SLABoilerPlate.hpp b/src/libslic3r/SLA/SLABoilerPlate.hpp index d7ce26bb2b..1bb1943ef1 100644 --- a/src/libslic3r/SLA/SLABoilerPlate.hpp +++ b/src/libslic3r/SLA/SLABoilerPlate.hpp @@ -12,25 +12,35 @@ #include "SLASpatIndex.hpp" namespace Slic3r { + +typedef Eigen::Matrix Vec4i; + namespace sla { /// Intermediate struct for a 3D mesh struct Contour3D { Pointf3s points; - std::vector indices; + std::vector faces3; + std::vector faces4; Contour3D& merge(const Contour3D& ctr) { - auto s3 = coord_t(points.size()); - auto s = indices.size(); + auto N = coord_t(points.size()); + auto N_f3 = faces3.size(); + auto N_f4 = faces4.size(); points.insert(points.end(), ctr.points.begin(), ctr.points.end()); - indices.insert(indices.end(), ctr.indices.begin(), ctr.indices.end()); + faces3.insert(faces3.end(), ctr.faces3.begin(), ctr.faces3.end()); + faces4.insert(faces4.end(), ctr.faces4.begin(), ctr.faces4.end()); - for(size_t n = s; n < indices.size(); n++) { - auto& idx = indices[n]; idx.x() += s3; idx.y() += s3; idx.z() += s3; + for(size_t n = N_f3; n < faces3.size(); n++) { + auto& idx = faces3[n]; idx.x() += N; idx.y() += N; idx.z() += N; } + for(size_t n = N_f4; n < faces4.size(); n++) { + auto& idx = faces4[n]; for (int k = 0; k < 4; k++) idx(k) += N; + } + return *this; } @@ -38,10 +48,10 @@ struct Contour3D { { const size_t offs = points.size(); points.insert(points.end(), triangles.begin(), triangles.end()); - indices.reserve(indices.size() + points.size() / 3); + faces3.reserve(faces3.size() + points.size() / 3); for(int i = int(offs); i < int(points.size()); i += 3) - indices.emplace_back(i, i + 1, i + 2); + faces3.emplace_back(i, i + 1, i + 2); return *this; } @@ -53,10 +63,16 @@ struct Contour3D { stream << "v " << p.transpose() << "\n"; } - for(auto& f : indices) { + for(auto& f : faces3) { stream << "f " << (f + Vec3i(1, 1, 1)).transpose() << "\n"; } + + for(auto& f : faces4) { + stream << "f " << (f + Vec4i(1, 1, 1, 1)).transpose() << "\n"; + } } + + bool empty() const { return points.empty() || (faces4.empty() && faces3.empty()); } }; using ClusterEl = std::vector; @@ -82,19 +98,45 @@ ClusteredPoints cluster( // Calculate the normals for the selected points (from 'points' set) on the // mesh. This will call squared distance for each point. PointSet normals(const PointSet& points, - const EigenMesh3D& mesh, + const EigenMesh3D& convert_mesh, double eps = 0.05, // min distance from edges std::function throw_on_cancel = [](){}, const std::vector& selected_points = {}); /// Mesh from an existing contour. -inline TriangleMesh mesh(const Contour3D& ctour) { - return {ctour.points, ctour.indices}; +inline TriangleMesh convert_mesh(const Contour3D& ctour) { + return {ctour.points, ctour.faces3}; } /// Mesh from an evaporating 3D contour -inline TriangleMesh mesh(Contour3D&& ctour) { - return {std::move(ctour.points), std::move(ctour.indices)}; +inline TriangleMesh convert_mesh(Contour3D&& ctour) { + return {std::move(ctour.points), std::move(ctour.faces3)}; +} + +inline Contour3D convert_mesh(const TriangleMesh &trmesh) { + Contour3D ret; + ret.points.reserve(trmesh.its.vertices.size()); + ret.faces3.reserve(trmesh.its.indices.size()); + + for (auto &v : trmesh.its.vertices) + ret.points.emplace_back(v.cast()); + + std::copy(trmesh.its.indices.begin(), trmesh.its.indices.end(), + std::back_inserter(ret.faces3)); + + return ret; +} + +inline Contour3D convert_mesh(TriangleMesh &&trmesh) { + Contour3D ret; + ret.points.reserve(trmesh.its.vertices.size()); + + for (auto &v : trmesh.its.vertices) + ret.points.emplace_back(v.cast()); + + ret.faces3.swap(trmesh.its.indices); + + return ret; } } diff --git a/src/libslic3r/SLA/SLAPad.cpp b/src/libslic3r/SLA/SLAPad.cpp index 7cd9eb4e42..d0e802d842 100644 --- a/src/libslic3r/SLA/SLAPad.cpp +++ b/src/libslic3r/SLA/SLAPad.cpp @@ -69,7 +69,7 @@ Contour3D walls( // Shorthand for the vertex arrays auto& upts = upper.points, &lpts = lower.points; - auto& rpts = ret.points; auto& ind = ret.indices; + auto& rpts = ret.points; auto& ind = ret.faces3; // If the Z levels are flipped, or the offset difference is negative, we // will interpret that as the triangles normals should be inverted. @@ -677,7 +677,7 @@ void create_pad(const ExPolygons &sup_blueprint, ThrowOnCancel thr) { Contour3D t = create_pad_geometry(sup_blueprint, model_blueprint, cfg, thr); - out.merge(mesh(std::move(t))); + out.merge(convert_mesh(std::move(t))); } std::string PadConfig::validate() const diff --git a/src/libslic3r/SLA/SLASupportTreeBuilder.cpp b/src/libslic3r/SLA/SLASupportTreeBuilder.cpp index 2e0310ed8d..0c276738a2 100644 --- a/src/libslic3r/SLA/SLASupportTreeBuilder.cpp +++ b/src/libslic3r/SLA/SLASupportTreeBuilder.cpp @@ -12,7 +12,7 @@ Contour3D sphere(double rho, Portion portion, double fa) { if(rho <= 1e-6 && rho >= -1e-6) return ret; auto& vertices = ret.points; - auto& facets = ret.indices; + auto& facets = ret.faces3; // Algorithm: // Add points one-by-one to the sphere grid and form facets using relative @@ -102,7 +102,7 @@ Contour3D cylinder(double r, double h, size_t ssteps, const Vec3d &sp) auto steps = int(ssteps); auto& points = ret.points; - auto& indices = ret.indices; + auto& indices = ret.faces3; points.reserve(2*ssteps); double a = 2*PI/steps; @@ -211,8 +211,8 @@ Head::Head(double r_big_mm, coord_t i1s1 = coord_t(idx1), i1s2 = coord_t(idx2); coord_t i2s1 = i1s1 + 1, i2s2 = i1s2 + 1; - mesh.indices.emplace_back(i1s1, i2s1, i2s2); - mesh.indices.emplace_back(i1s1, i2s2, i1s2); + mesh.faces3.emplace_back(i1s1, i2s1, i2s2); + mesh.faces3.emplace_back(i1s1, i2s2, i1s2); } auto i1s1 = coord_t(s1.points.size()) - coord_t(steps); @@ -220,8 +220,8 @@ Head::Head(double r_big_mm, auto i1s2 = coord_t(s1.points.size()); auto i2s2 = coord_t(s1.points.size()) + coord_t(steps) - 1; - mesh.indices.emplace_back(i2s2, i2s1, i1s1); - mesh.indices.emplace_back(i1s2, i2s2, i1s1); + mesh.faces3.emplace_back(i2s2, i2s1, i1s1); + mesh.faces3.emplace_back(i1s2, i2s2, i1s1); // To simplify further processing, we translate the mesh so that the // last vertex of the pointing sphere (the pinpoint) will be at (0,0,0) @@ -240,7 +240,7 @@ Pillar::Pillar(const Vec3d &jp, const Vec3d &endp, double radius, size_t st): // move the data. Contour3D body = cylinder(radius, height, st, endp); mesh.points.swap(body.points); - mesh.indices.swap(body.indices); + mesh.faces3.swap(body.faces3); } } @@ -275,7 +275,7 @@ Pillar &Pillar::add_base(double baseheight, double radius) base.points.emplace_back(endpt); base.points.emplace_back(ep); - auto& indices = base.indices; + auto& indices = base.faces3; auto hcenter = int(base.points.size() - 1); auto lcenter = int(base.points.size() - 2); auto offs = int(steps); @@ -466,7 +466,7 @@ const TriangleMesh &SupportTreeBuilder::merged_mesh() const return m_meshcache; } - m_meshcache = mesh(merged); + m_meshcache = convert_mesh(merged); // The mesh will be passed by const-pointer to TriangleMeshSlicer, // which will need this. diff --git a/tests/hollowing/CMakeLists.txt b/tests/hollowing/CMakeLists.txt index 79c12baef8..9679a1b777 100644 --- a/tests/hollowing/CMakeLists.txt +++ b/tests/hollowing/CMakeLists.txt @@ -1,5 +1,5 @@ if(TARGET OpenVDB::openvdb) - add_executable(hollowing_tests hollowing_tests.cpp) + add_executable(hollowing_tests hollowing_test_main.cpp hollowing_tests.cpp openvdb_utils.cpp openvdb_utils.hpp) #find_package(GTest REQUIRED) #target_link_libraries(hollowing_tests libslic3r OpenVDB::openvdb GTest::GTest GTest::Main) diff --git a/tests/hollowing/hollowing_test_main.cpp b/tests/hollowing/hollowing_test_main.cpp new file mode 100644 index 0000000000..b2aa80259d --- /dev/null +++ b/tests/hollowing/hollowing_test_main.cpp @@ -0,0 +1 @@ +#include diff --git a/tests/hollowing/hollowing_tests.cpp b/tests/hollowing/hollowing_tests.cpp index 846f7e831b..a7b2874eb0 100644 --- a/tests/hollowing/hollowing_tests.cpp +++ b/tests/hollowing/hollowing_tests.cpp @@ -1,10 +1,8 @@ #include -#include +#include +#include -#include -#include -#include -#include +#include "openvdb_utils.hpp" #include "libslic3r/Format/OBJ.hpp" #if defined(WIN32) || defined(_WIN32) @@ -13,22 +11,6 @@ #define PATH_SEPARATOR R"(/)" #endif -class TriangleMeshDataAdapter { -public: - Slic3r::TriangleMesh mesh; - - size_t polygonCount() const { return mesh.its.indices.size(); } - size_t pointCount() const { return mesh.its.vertices.size(); } - size_t vertexCount(size_t) const { return 3; } - - // Return position pos in local grid index space for polygon n and vertex v - void getIndexSpacePoint(size_t n, size_t v, openvdb::Vec3d& pos) const { - auto vidx = size_t(mesh.its.indices[n](Eigen::Index(v))); - Slic3r::Vec3d p = mesh.its.vertices[vidx].cast(); - pos = {double(p.x()), double(p.y()), p.z()}; - } -}; - static Slic3r::TriangleMesh load_model(const std::string &obj_filename) { Slic3r::TriangleMesh mesh; @@ -38,24 +20,21 @@ static Slic3r::TriangleMesh load_model(const std::string &obj_filename) } TEST_CASE("Load object", "[Hollowing]") { - TriangleMeshDataAdapter mesh{load_model("20mm_cube.obj")}; - auto ptr = openvdb::tools::meshToVolume(mesh, {}); + Slic3r::TriangleMesh mesh = load_model("20mm_cube.obj"); + + Slic3r::sla::Contour3D imesh = Slic3r::sla::convert_mesh(mesh); + auto ptr = Slic3r::meshToVolume(imesh, {}); REQUIRE(ptr); - std::vector points; - std::vector quad_indices; - std::vector triangle_indices; + Slic3r::sla::Contour3D omesh = Slic3r::volumeToMesh(*ptr, -1., 0.0, true); - openvdb::tools::volumeToMesh(*ptr, points, triangle_indices, quad_indices, 0.0, 1.0, true); + REQUIRE(!omesh.empty()); - std::cout << "Triangle count: " << triangle_indices.size() << std::endl; - std::cout << "Quad count: " << quad_indices.size() << std::endl; - std::cout << "Point count: " << points.size() << " vs " << mesh.mesh.its.vertices.size() << std::endl; + std::fstream outfile{"out.obj", std::ios::out}; + omesh.to_obj(outfile); + + imesh.merge(omesh); + std::fstream merged_outfile("merged_out.obj", std::ios::out); + imesh.to_obj(merged_outfile); } - -//int main(int argc, char **argv) -//{ -// ::testing::InitGoogleTest(&argc, argv); -// return RUN_ALL_TESTS(); -//} diff --git a/tests/hollowing/openvdb_utils.cpp b/tests/hollowing/openvdb_utils.cpp new file mode 100644 index 0000000000..38e96a885d --- /dev/null +++ b/tests/hollowing/openvdb_utils.cpp @@ -0,0 +1,93 @@ +#include "openvdb_utils.hpp" + +namespace Slic3r { + +class TriangleMeshDataAdapter { +public: + const TriangleMesh &mesh; + + size_t polygonCount() const { return mesh.its.indices.size(); } + size_t pointCount() const { return mesh.its.vertices.size(); } + size_t vertexCount(size_t) const { return 3; } + + // Return position pos in local grid index space for polygon n and vertex v + void getIndexSpacePoint(size_t n, size_t v, openvdb::Vec3d& pos) const; +}; + +class Contour3DDataAdapter { +public: + const sla::Contour3D &mesh; + + size_t polygonCount() const { return mesh.faces3.size() + mesh.faces4.size(); } + size_t pointCount() const { return mesh.points.size(); } + size_t vertexCount(size_t n) const { return n < mesh.faces3.size() ? 3 : 4; } + + // Return position pos in local grid index space for polygon n and vertex v + void getIndexSpacePoint(size_t n, size_t v, openvdb::Vec3d& pos) const; +}; + +void TriangleMeshDataAdapter::getIndexSpacePoint(size_t n, + size_t v, + openvdb::Vec3d &pos) const +{ + auto vidx = size_t(mesh.its.indices[n](Eigen::Index(v))); + Slic3r::Vec3d p = mesh.its.vertices[vidx].cast(); + pos = {p.x(), p.y(), p.z()}; +} + +void Contour3DDataAdapter::getIndexSpacePoint(size_t n, + size_t v, + openvdb::Vec3d &pos) const +{ + size_t vidx = 0; + if (n < mesh.faces3.size()) vidx = size_t(mesh.faces3[n](Eigen::Index(v))); + else vidx = size_t(mesh.faces4[n - mesh.faces3.size()](Eigen::Index(v))); + + Slic3r::Vec3d p = mesh.points[vidx]; + pos = {p.x(), p.y(), p.z()}; +} + +openvdb::FloatGrid::Ptr meshToVolume(const TriangleMesh & mesh, + const openvdb::math::Transform &tr) +{ + return openvdb::tools::meshToVolume( + TriangleMeshDataAdapter{mesh}, tr); +} + +openvdb::FloatGrid::Ptr meshToVolume(const sla::Contour3D & mesh, + const openvdb::math::Transform &tr) +{ + return openvdb::tools::meshToVolume( + Contour3DDataAdapter{mesh}, tr); +} + +inline Vec3f to_vec3f(const openvdb::Vec3s &v) { return Vec3f{v.x(), v.y(), v.z()}; } +inline Vec3d to_vec3d(const openvdb::Vec3s &v) { return to_vec3f(v).cast(); } +inline Vec3i to_vec3i(const openvdb::Vec3I &v) { return Vec3i{int(v[0]), int(v[1]), int(v[2])}; } +inline Vec4i to_vec4i(const openvdb::Vec4I &v) { return Vec4i{int(v[0]), int(v[1]), int(v[2]), int(v[3])}; } + +sla::Contour3D volumeToMesh(const openvdb::FloatGrid &grid, + double isovalue, + double adaptivity, + bool relaxDisorientedTriangles) +{ + std::vector points; + std::vector triangles; + std::vector quads; + + openvdb::tools::volumeToMesh(grid, points, triangles, quads, isovalue, + adaptivity, relaxDisorientedTriangles); + + sla::Contour3D ret; + ret.points.reserve(points.size()); + ret.faces3.reserve(triangles.size()); + ret.faces4.reserve(quads.size()); + + for (auto &v : points) ret.points.emplace_back(to_vec3d(v)); + for (auto &v : triangles) ret.faces3.emplace_back(to_vec3i(v)); + for (auto &v : quads) ret.faces4.emplace_back(to_vec4i(v)); + + return ret; +} + +} // namespace Slic3r diff --git a/tests/hollowing/openvdb_utils.hpp b/tests/hollowing/openvdb_utils.hpp new file mode 100644 index 0000000000..a2c02c0783 --- /dev/null +++ b/tests/hollowing/openvdb_utils.hpp @@ -0,0 +1,25 @@ +#ifndef OPENVDB_UTILS_HPP +#define OPENVDB_UTILS_HPP + +#include +#include +#include +#include +#include + +namespace Slic3r { + +openvdb::FloatGrid::Ptr meshToVolume(const TriangleMesh & mesh, + const openvdb::math::Transform &tr); + +openvdb::FloatGrid::Ptr meshToVolume(const sla::Contour3D & mesh, + const openvdb::math::Transform &tr); + +sla::Contour3D volumeToMesh(const openvdb::FloatGrid &grid, + double isovalue = 0.0, + double adaptivity = 0.0, + bool relaxDisorientedTriangles = true); + +} // namespace Slic3r + +#endif // OPENVDB_UTILS_HPP From 62983850c549215be667e7e7072008bf9291b66f Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Fri, 1 Nov 2019 10:56:39 +0100 Subject: [PATCH 026/336] Remove git update step from deps where patch is applied. --- deps/deps-unix-common.cmake | 45 +++---------- deps/deps-windows.cmake | 49 +++----------- deps/igl-mods.patch | 128 ------------------------------------ 3 files changed, 19 insertions(+), 203 deletions(-) delete mode 100644 deps/igl-mods.patch diff --git a/deps/deps-unix-common.cmake b/deps/deps-unix-common.cmake index c6caab987c..eae319efc6 100644 --- a/deps/deps-unix-common.cmake +++ b/deps/deps-unix-common.cmake @@ -61,42 +61,14 @@ ExternalProject_Add(dep_qhull -DBUILD_SHARED_LIBS=OFF -DCMAKE_INSTALL_PREFIX=${DESTDIR}/usr/local ${DEP_CMAKE_OPTS} - PATCH_COMMAND ${GIT_EXECUTABLE} apply --ignore-space-change --ignore-whitespace ${CMAKE_CURRENT_SOURCE_DIR}/qhull-mods.patch + UPDATE_COMMAND "" + PATCH_COMMAND ${GIT_EXECUTABLE} apply --whitespace=fix ${CMAKE_CURRENT_SOURCE_DIR}/qhull-mods.patch ) -ExternalProject_Add(dep_libigl - EXCLUDE_FROM_ALL 1 - URL "https://github.com/libigl/libigl/archive/v2.0.0.tar.gz" - URL_HASH SHA256=42518e6b106c7209c73435fd260ed5d34edeb254852495b4c95dce2d95401328 - CMAKE_ARGS - -DCMAKE_INSTALL_PREFIX=${DESTDIR}/usr/local - -DLIBIGL_BUILD_PYTHON=OFF - -DLIBIGL_BUILD_TESTS=OFF - -DLIBIGL_BUILD_TUTORIALS=OFF - -DLIBIGL_USE_STATIC_LIBRARY=OFF #${DEP_BUILD_IGL_STATIC} - -DLIBIGL_WITHOUT_COPYLEFT=OFF - -DLIBIGL_WITH_CGAL=OFF - -DLIBIGL_WITH_COMISO=OFF - -DLIBIGL_WITH_CORK=OFF - -DLIBIGL_WITH_EMBREE=OFF - -DLIBIGL_WITH_MATLAB=OFF - -DLIBIGL_WITH_MOSEK=OFF - -DLIBIGL_WITH_OPENGL=OFF - -DLIBIGL_WITH_OPENGL_GLFW=OFF - -DLIBIGL_WITH_OPENGL_GLFW_IMGUI=OFF - -DLIBIGL_WITH_PNG=OFF - -DLIBIGL_WITH_PYTHON=OFF - -DLIBIGL_WITH_TETGEN=OFF - -DLIBIGL_WITH_TRIANGLE=OFF - -DLIBIGL_WITH_XML=OFF - PATCH_COMMAND ${GIT_EXECUTABLE} apply --ignore-space-change --ignore-whitespace ${CMAKE_CURRENT_SOURCE_DIR}/igl-mods.patch -) - - ExternalProject_Add(dep_blosc EXCLUDE_FROM_ALL 1 GIT_REPOSITORY https://github.com/Blosc/c-blosc.git - GIT_TAG v1.17.0 + GIT_TAG e63775855294b50820ef44d1b157f4de1cc38d3e #v1.17.0 DEPENDS CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${DESTDIR}/usr/local @@ -108,13 +80,14 @@ ExternalProject_Add(dep_blosc -DBUILD_TESTS=OFF -DBUILD_BENCHMARKS=OFF -DPREFER_EXTERNAL_ZLIB=ON - PATCH_COMMAND ${GIT_EXECUTABLE} apply --ignore-space-change --ignore-whitespace ${CMAKE_CURRENT_SOURCE_DIR}/blosc-mods.patch + UPDATE_COMMAND "" + PATCH_COMMAND ${GIT_EXECUTABLE} apply --whitespace=fix ${CMAKE_CURRENT_SOURCE_DIR}/blosc-mods.patch ) ExternalProject_Add(dep_openexr EXCLUDE_FROM_ALL 1 GIT_REPOSITORY https://github.com/openexr/openexr.git - GIT_TAG v2.4.0 + GIT_TAG eae0e337c9f5117e78114fd05f7a415819df413a #v2.4.0 CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${DESTDIR}/usr/local -DBUILD_SHARED_LIBS=OFF @@ -123,12 +96,13 @@ ExternalProject_Add(dep_openexr -DPYILMBASE_ENABLE:BOOL=OFF -DOPENEXR_VIEWERS_ENABLE:BOOL=OFF -DOPENEXR_BUILD_UTILS:BOOL=OFF + UPDATE_COMMAND "" ) ExternalProject_Add(dep_openvdb EXCLUDE_FROM_ALL 1 GIT_REPOSITORY https://github.com/AcademySoftwareFoundation/openvdb.git - GIT_TAG v6.2.1 + GIT_TAG aebaf8d95be5e57fd33949281ec357db4a576c2e #v6.2.1 DEPENDS dep_blosc dep_openexr dep_tbb CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${DESTDIR}/usr/local @@ -142,5 +116,6 @@ ExternalProject_Add(dep_openvdb -DOPENVDB_CORE_STATIC=ON -DTBB_STATIC=ON -DOPENVDB_BUILD_VDB_PRINT=ON - PATCH_COMMAND ${GIT_EXECUTABLE} apply ${CMAKE_CURRENT_SOURCE_DIR}/openvdb-mods.patch + UPDATE_COMMAND "" + PATCH_COMMAND ${GIT_EXECUTABLE} apply --whitespace=fix ${CMAKE_CURRENT_SOURCE_DIR}/openvdb-mods.patch ) \ No newline at end of file diff --git a/deps/deps-windows.cmake b/deps/deps-windows.cmake index 3f722ea992..514a90a9ec 100644 --- a/deps/deps-windows.cmake +++ b/deps/deps-windows.cmake @@ -226,7 +226,8 @@ ExternalProject_Add(dep_qhull -DBUILD_SHARED_LIBS=OFF -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DCMAKE_DEBUG_POSTFIX=d - PATCH_COMMAND ${GIT_EXECUTABLE} apply --ignore-space-change --ignore-whitespace ${CMAKE_CURRENT_SOURCE_DIR}/qhull-mods.patch + UPDATE_COMMAND "" + PATCH_COMMAND ${GIT_EXECUTABLE} apply --whitespace=fix ${CMAKE_CURRENT_SOURCE_DIR}/qhull-mods.patch BUILD_COMMAND msbuild /m /P:Configuration=Release INSTALL.vcxproj INSTALL_COMMAND "" ) @@ -243,41 +244,6 @@ endif () find_package(Git REQUIRED) -ExternalProject_Add(dep_libigl - EXCLUDE_FROM_ALL 1 - URL "https://github.com/libigl/libigl/archive/v2.0.0.tar.gz" - URL_HASH SHA256=42518e6b106c7209c73435fd260ed5d34edeb254852495b4c95dce2d95401328 - CMAKE_GENERATOR "${DEP_MSVC_GEN}" - CMAKE_ARGS - -DCMAKE_INSTALL_PREFIX=${DESTDIR}/usr/local - -DLIBIGL_BUILD_PYTHON=OFF - -DLIBIGL_BUILD_TESTS=OFF - -DLIBIGL_BUILD_TUTORIALS=OFF - -DLIBIGL_USE_STATIC_LIBRARY=OFF #${DEP_BUILD_IGL_STATIC} - -DLIBIGL_WITHOUT_COPYLEFT=OFF - -DLIBIGL_WITH_CGAL=OFF - -DLIBIGL_WITH_COMISO=OFF - -DLIBIGL_WITH_CORK=OFF - -DLIBIGL_WITH_EMBREE=OFF - -DLIBIGL_WITH_MATLAB=OFF - -DLIBIGL_WITH_MOSEK=OFF - -DLIBIGL_WITH_OPENGL=OFF - -DLIBIGL_WITH_OPENGL_GLFW=OFF - -DLIBIGL_WITH_OPENGL_GLFW_IMGUI=OFF - -DLIBIGL_WITH_PNG=OFF - -DLIBIGL_WITH_PYTHON=OFF - -DLIBIGL_WITH_TETGEN=OFF - -DLIBIGL_WITH_TRIANGLE=OFF - -DLIBIGL_WITH_XML=OFF - -DCMAKE_POSITION_INDEPENDENT_CODE=ON - -DCMAKE_DEBUG_POSTFIX=d - PATCH_COMMAND ${GIT_EXECUTABLE} apply --ignore-space-change --ignore-whitespace ${CMAKE_CURRENT_SOURCE_DIR}/igl-mods.patch - BUILD_COMMAND msbuild /m /P:Configuration=Release INSTALL.vcxproj - INSTALL_COMMAND "" -) - -add_debug_dep(dep_libigl) - ExternalProject_Add(dep_wxwidgets EXCLUDE_FROM_ALL 1 GIT_REPOSITORY "https://github.com/prusa3d/wxWidgets" @@ -306,7 +272,7 @@ ExternalProject_Add(dep_blosc #URL https://github.com/Blosc/c-blosc/archive/v1.17.0.zip #URL_HASH SHA256=7463a1df566704f212263312717ab2c36b45d45cba6cd0dccebf91b2cc4b4da9 GIT_REPOSITORY https://github.com/Blosc/c-blosc.git - GIT_TAG v1.17.0 + GIT_TAG e63775855294b50820ef44d1b157f4de1cc38d3e #v1.17.0 DEPENDS dep_zlib CMAKE_GENERATOR "${DEP_MSVC_GEN}" CMAKE_GENERATOR_PLATFORM "${DEP_PLATFORM}" @@ -322,6 +288,7 @@ ExternalProject_Add(dep_blosc -DPREFER_EXTERNAL_ZLIB=ON -DBLOSC_IS_SUBPROJECT:BOOL=ON -DBLOSC_INSTALL:BOOL=ON + UPDATE_COMMAND "" PATCH_COMMAND ${GIT_EXECUTABLE} apply --whitespace=fix ${CMAKE_CURRENT_SOURCE_DIR}/blosc-mods.patch BUILD_COMMAND msbuild /m /P:Configuration=Release INSTALL.vcxproj INSTALL_COMMAND "" @@ -332,7 +299,7 @@ add_debug_dep(dep_blosc) ExternalProject_Add(dep_openexr EXCLUDE_FROM_ALL 1 GIT_REPOSITORY https://github.com/openexr/openexr.git - GIT_TAG v2.4.0 + GIT_TAG eae0e337c9f5117e78114fd05f7a415819df413a #v2.4.0 DEPENDS dep_zlib CMAKE_GENERATOR "${DEP_MSVC_GEN}" CMAKE_GENERATOR_PLATFORM "${DEP_PLATFORM}" @@ -344,6 +311,7 @@ ExternalProject_Add(dep_openexr -DPYILMBASE_ENABLE:BOOL=OFF -DOPENEXR_VIEWERS_ENABLE:BOOL=OFF -DOPENEXR_BUILD_UTILS:BOOL=OFF + UPDATE_COMMAND "" BUILD_COMMAND msbuild /m /P:Configuration=Release INSTALL.vcxproj INSTALL_COMMAND "" ) @@ -355,8 +323,8 @@ ExternalProject_Add(dep_openvdb #URL https://github.com/AcademySoftwareFoundation/openvdb/archive/v6.2.1.zip #URL_HASH SHA256=dc337399dce8e1c9f21f20e97b1ce7e4933cb0a63bb3b8b734d8fcc464aa0c48 GIT_REPOSITORY https://github.com/AcademySoftwareFoundation/openvdb.git - GIT_TAG v6.2.1 - DEPENDS dep_blosc dep_openexr dep_tbb dep_boost + GIT_TAG aebaf8d95be5e57fd33949281ec357db4a576c2e #v6.2.1 + DEPENDS dep_blosc dep_openexr #dep_tbb dep_boost CMAKE_GENERATOR "${DEP_MSVC_GEN}" CMAKE_GENERATOR_PLATFORM "${DEP_PLATFORM}" CMAKE_ARGS @@ -372,6 +340,7 @@ ExternalProject_Add(dep_openvdb -DTBB_STATIC=ON -DOPENVDB_BUILD_VDB_PRINT=ON BUILD_COMMAND msbuild /m /P:Configuration=Release INSTALL.vcxproj + UPDATE_COMMAND "" PATCH_COMMAND ${GIT_EXECUTABLE} apply --whitespace=fix ${CMAKE_CURRENT_SOURCE_DIR}/openvdb-mods.patch INSTALL_COMMAND "" ) diff --git a/deps/igl-mods.patch b/deps/igl-mods.patch deleted file mode 100644 index b0ff9205d0..0000000000 --- a/deps/igl-mods.patch +++ /dev/null @@ -1,128 +0,0 @@ -diff --git a/cmake/libigl-config.cmake.in b/cmake/libigl-config.cmake.in -index 317c745c..f9808e1e 100644 ---- a/cmake/libigl-config.cmake.in -+++ b/cmake/libigl-config.cmake.in -@@ -2,28 +2,28 @@ - - include(${CMAKE_CURRENT_LIST_DIR}/libigl-export.cmake) - --if (TARGET igl::core) -- if (NOT TARGET Eigen3::Eigen) -- find_package(Eigen3 QUIET) -- if (NOT Eigen3_FOUND) -- # try with PkgCOnfig -- find_package(PkgConfig REQUIRED) -- pkg_check_modules(Eigen3 QUIET IMPORTED_TARGET eigen3) -- endif() -- -- if (NOT Eigen3_FOUND) -- message(FATAL_ERROR "Could not find required dependency Eigen3") -- set(libigl_core_FOUND FALSE) -- else() -- target_link_libraries(igl::core INTERFACE PkgConfig::Eigen3) -- set(libigl_core_FOUND TRUE) -- endif() -- else() -- target_link_libraries(igl::core INTERFACE Eigen3::Eigen) -- set(libigl_core_FOUND TRUE) -- endif() -- --endif() -+# if (TARGET igl::core) -+# if (NOT TARGET Eigen3::Eigen) -+# find_package(Eigen3 QUIET) -+# if (NOT Eigen3_FOUND) -+# # try with PkgCOnfig -+# find_package(PkgConfig REQUIRED) -+# pkg_check_modules(Eigen3 QUIET IMPORTED_TARGET eigen3) -+# endif() -+# -+# if (NOT Eigen3_FOUND) -+# message(FATAL_ERROR "Could not find required dependency Eigen3") -+# set(libigl_core_FOUND FALSE) -+# else() -+# target_link_libraries(igl::core INTERFACE PkgConfig::Eigen3) -+# set(libigl_core_FOUND TRUE) -+# endif() -+# else() -+# target_link_libraries(igl::core INTERFACE Eigen3::Eigen) -+# set(libigl_core_FOUND TRUE) -+# endif() -+# -+# endif() - - check_required_components(libigl) - -diff --git a/cmake/libigl.cmake b/cmake/libigl.cmake -index 4b11007a..47e6c395 100644 ---- a/cmake/libigl.cmake -+++ b/cmake/libigl.cmake -@@ -445,6 +445,7 @@ function(install_dir_files dir_name) - if(NOT LIBIGL_USE_STATIC_LIBRARY) - file(GLOB public_sources - ${CMAKE_CURRENT_SOURCE_DIR}/include/igl${subpath}/*.cpp -+ ${CMAKE_CURRENT_SOURCE_DIR}/include/igl${subpath}/*.c - ) - endif() - list(APPEND files_to_install ${public_sources}) -diff --git a/include/igl/AABB.cpp b/include/igl/AABB.cpp -index 09537335..92e90cb7 100644 ---- a/include/igl/AABB.cpp -+++ b/include/igl/AABB.cpp -@@ -1071,5 +1071,11 @@ template void igl::AABB, 3>::init, 2>::init >(Eigen::MatrixBase > const&, Eigen::MatrixBase > const&); - template double igl::AABB, 3>::squared_distance >(Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::Matrix const&, double, int&, Eigen::PlainObjectBase >&) const; -+template float igl::AABB const, 0, Eigen::Stride<0, 0> >, 3>::squared_distance const, 0, Eigen::Stride<0, 0> > >(Eigen::MatrixBase const, 0, Eigen::Stride<0, 0> > > const&, Eigen::MatrixBase const, 0, Eigen::Stride<0, 0> > > const&, Eigen::Matrix const&, int&, Eigen::PlainObjectBase >&) const; - template bool igl::AABB, 3>::intersect_ray >(Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::Matrix const&, Eigen::Matrix const&, igl::Hit&) const; -+template bool igl::AABB, 3>::intersect_ray >(Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::Matrix const&, Eigen::Matrix const&, std::vector&) const; -+ -+template void igl::AABB const, 0, Eigen::Stride<0, 0> >, 3>::init const, 0, Eigen::Stride<0, 0> > >(Eigen::MatrixBase const, 0, Eigen::Stride<0, 0> > > const&, Eigen::MatrixBase const, 0, Eigen::Stride<0, 0> > > const&); -+ -+template bool igl::AABB const, 0, Eigen::Stride<0, 0> >, 3>::intersect_ray const, 0, Eigen::Stride<0, 0> > >(Eigen::MatrixBase const, 0, Eigen::Stride<0, 0> > > const&, Eigen::MatrixBase const, 0, Eigen::Stride<0, 0> > > const&, Eigen::Matrix const&, Eigen::Matrix const&, std::vector >&) const; - #endif -diff --git a/include/igl/barycenter.cpp b/include/igl/barycenter.cpp -index 065f82aa..ec2d96cd 100644 ---- a/include/igl/barycenter.cpp -+++ b/include/igl/barycenter.cpp -@@ -54,4 +54,6 @@ template void igl::barycenter, Eigen::M - template void igl::barycenter, Eigen::Matrix, Eigen::Matrix >(Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::PlainObjectBase >&); - template void igl::barycenter, Eigen::Matrix, Eigen::Matrix >(Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::PlainObjectBase >&); - template void igl::barycenter, Eigen::Matrix, Eigen::Matrix >(Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::PlainObjectBase >&); -+ -+template void igl::barycenter const, 0, Eigen::Stride<0, 0> >, Eigen::Map const, 0, Eigen::Stride<0, 0> >, Eigen::Matrix >(Eigen::MatrixBase const, 0, Eigen::Stride<0, 0> > > const&, Eigen::MatrixBase const, 0, Eigen::Stride<0, 0> > > const&, Eigen::PlainObjectBase >&); - #endif -diff --git a/include/igl/point_simplex_squared_distance.cpp b/include/igl/point_simplex_squared_distance.cpp -index 2b98bd28..c66d9ae1 100644 ---- a/include/igl/point_simplex_squared_distance.cpp -+++ b/include/igl/point_simplex_squared_distance.cpp -@@ -178,4 +178,6 @@ template void igl::point_simplex_squared_distance<3, Eigen::Matrix, Eigen::Matrix, Eigen::Matrix, double, Eigen::Matrix >(Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::Matrix::Index, double&, Eigen::MatrixBase >&, Eigen::PlainObjectBase >&); - template void igl::point_simplex_squared_distance<2, Eigen::Matrix, Eigen::Matrix, Eigen::Matrix, double, Eigen::Matrix >(Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::Matrix::Index, double&, Eigen::MatrixBase >&, Eigen::PlainObjectBase >&); - template void igl::point_simplex_squared_distance<2, Eigen::Matrix, Eigen::Matrix, Eigen::Matrix, double, Eigen::Matrix >(Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::Matrix::Index, double&, Eigen::MatrixBase >&, Eigen::PlainObjectBase >&); -+ -+template void igl::point_simplex_squared_distance<3, Eigen::Matrix, Eigen::Map const, 0, Eigen::Stride<0, 0> >, Eigen::Map const, 0, Eigen::Stride<0, 0> >, float, Eigen::Matrix >(Eigen::MatrixBase > const&, Eigen::MatrixBase const, 0, Eigen::Stride<0, 0> > > const&, Eigen::MatrixBase const, 0, Eigen::Stride<0, 0> > > const&, Eigen::Map const, 0, Eigen::Stride<0, 0> >::Index, float&, Eigen::MatrixBase >&); - #endif -diff --git a/include/igl/ray_box_intersect.cpp b/include/igl/ray_box_intersect.cpp -index 4a88b89e..b547f8f8 100644 ---- a/include/igl/ray_box_intersect.cpp -+++ b/include/igl/ray_box_intersect.cpp -@@ -147,4 +147,6 @@ IGL_INLINE bool igl::ray_box_intersect( - #ifdef IGL_STATIC_LIBRARY - // Explicit template instantiation - template bool igl::ray_box_intersect, Eigen::Matrix, double>(Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::AlignedBox const&, double const&, double const&, double&, double&); -+ -+template bool igl::ray_box_intersect, Eigen::Matrix, float>(Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::AlignedBox const&, float const&, float const&, float&, float&); - #endif -diff --git a/include/igl/ray_mesh_intersect.cpp b/include/igl/ray_mesh_intersect.cpp -index 9a70a22b..4233e722 100644 ---- a/include/igl/ray_mesh_intersect.cpp -+++ b/include/igl/ray_mesh_intersect.cpp -@@ -83,4 +83,7 @@ IGL_INLINE bool igl::ray_mesh_intersect( - template bool igl::ray_mesh_intersect, Eigen::Matrix, Eigen::Matrix, Eigen::Matrix >(Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, std::vector >&); - template bool igl::ray_mesh_intersect, Eigen::Matrix, Eigen::Matrix, Eigen::Matrix >(Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, igl::Hit&); - template bool igl::ray_mesh_intersect, Eigen::Matrix, Eigen::Matrix, Eigen::Block const, 1, -1, false> >(Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::MatrixBase const, 1, -1, false> > const&, igl::Hit&); -+template bool igl::ray_mesh_intersect, Eigen::Matrix, Eigen::Matrix, Eigen::Block const, 1, -1, false> >(Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::MatrixBase const, 1, -1, false> > const&, std::vector >&); -+ -+template bool igl::ray_mesh_intersect, Eigen::Matrix, Eigen::Map const, 0, Eigen::Stride<0, 0> >, Eigen::Block const, 0, Eigen::Stride<0, 0> > const, 1, -1, true> >(Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::MatrixBase const, 0, Eigen::Stride<0, 0> > > const&, Eigen::MatrixBase const, 0, Eigen::Stride<0, 0> > const, 1, -1, true> > const&, std::vector >&); - #endif From 9dafc324f09c3bc6570ed74d6563c4d81908f450 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Fri, 1 Nov 2019 12:10:03 +0100 Subject: [PATCH 027/336] Fix compilation on MSVC --- tests/hollowing/openvdb_utils.cpp | 4 ++++ tests/hollowing/openvdb_utils.hpp | 2 -- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/tests/hollowing/openvdb_utils.cpp b/tests/hollowing/openvdb_utils.cpp index 38e96a885d..62d3a14d70 100644 --- a/tests/hollowing/openvdb_utils.cpp +++ b/tests/hollowing/openvdb_utils.cpp @@ -1,5 +1,9 @@ +#define NOMINMAX #include "openvdb_utils.hpp" +#include +#include + namespace Slic3r { class TriangleMeshDataAdapter { diff --git a/tests/hollowing/openvdb_utils.hpp b/tests/hollowing/openvdb_utils.hpp index a2c02c0783..9854d924da 100644 --- a/tests/hollowing/openvdb_utils.hpp +++ b/tests/hollowing/openvdb_utils.hpp @@ -4,8 +4,6 @@ #include #include #include -#include -#include namespace Slic3r { From a8a5a884f9b5d69cb648ef56c3c62ce5ba787484 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Fri, 1 Nov 2019 15:31:26 +0100 Subject: [PATCH 028/336] Add OpenVDBUtils into libslic3r, hollwing tests in libslic3r_test --- src/libslic3r/CMakeLists.txt | 11 ++++++++++- .../libslic3r/OpenVDBUtils.cpp | 7 +++---- .../libslic3r/OpenVDBUtils.hpp | 6 +++--- tests/CMakeLists.txt | 3 +-- tests/hollowing/CMakeLists.txt | 9 --------- tests/hollowing/hollowing_test_main.cpp | 1 - tests/libslic3r/CMakeLists.txt | 6 ++++++ .../test_hollowing.cpp} | 2 +- 8 files changed, 24 insertions(+), 21 deletions(-) rename tests/hollowing/openvdb_utils.cpp => src/libslic3r/OpenVDBUtils.cpp (97%) rename tests/hollowing/openvdb_utils.hpp => src/libslic3r/OpenVDBUtils.hpp (90%) delete mode 100644 tests/hollowing/CMakeLists.txt delete mode 100644 tests/hollowing/hollowing_test_main.cpp rename tests/{hollowing/hollowing_tests.cpp => libslic3r/test_hollowing.cpp} (96%) diff --git a/src/libslic3r/CMakeLists.txt b/src/libslic3r/CMakeLists.txt index 8b162a1d58..9ee6e60c52 100644 --- a/src/libslic3r/CMakeLists.txt +++ b/src/libslic3r/CMakeLists.txt @@ -9,6 +9,11 @@ if (MINGW) add_compile_options(-Wa,-mbig-obj) endif () +set(OpenVDBUtils_SOURCES "") +if (TARGET OpenVDB::openvdb) + set(OpenVDBUtils_SOURCES OpenVDBUtils.cpp OpenVDBUtils.hpp) +endif() + add_library(libslic3r STATIC pchheader.cpp pchheader.hpp @@ -174,6 +179,7 @@ add_library(libslic3r STATIC MinAreaBoundingBox.cpp miniz_extension.hpp miniz_extension.cpp + ${OpenVDBUtils_SOURCES} SLA/SLACommon.hpp SLA/SLABoilerPlate.hpp SLA/SLAPad.hpp @@ -222,10 +228,13 @@ target_link_libraries(libslic3r qhull semver TBB::tbb - # OpenVDB::openvdb ${CMAKE_DL_LIBS} ) +if (TARGET OpenVDB::openvdb) + target_link_libraries(libslic3r OpenVDB::openvdb) +endif() + if(WIN32) target_link_libraries(libslic3r Psapi.lib) endif() diff --git a/tests/hollowing/openvdb_utils.cpp b/src/libslic3r/OpenVDBUtils.cpp similarity index 97% rename from tests/hollowing/openvdb_utils.cpp rename to src/libslic3r/OpenVDBUtils.cpp index 62d3a14d70..a5d4f0db69 100644 --- a/tests/hollowing/openvdb_utils.cpp +++ b/src/libslic3r/OpenVDBUtils.cpp @@ -1,6 +1,5 @@ #define NOMINMAX -#include "openvdb_utils.hpp" - +#include "OpenVDBUtils.hpp" #include #include @@ -55,7 +54,7 @@ openvdb::FloatGrid::Ptr meshToVolume(const TriangleMesh & mesh, const openvdb::math::Transform &tr) { return openvdb::tools::meshToVolume( - TriangleMeshDataAdapter{mesh}, tr); + TriangleMeshDataAdapter{mesh}, tr); } openvdb::FloatGrid::Ptr meshToVolume(const sla::Contour3D & mesh, @@ -78,7 +77,7 @@ sla::Contour3D volumeToMesh(const openvdb::FloatGrid &grid, std::vector points; std::vector triangles; std::vector quads; - + openvdb::tools::volumeToMesh(grid, points, triangles, quads, isovalue, adaptivity, relaxDisorientedTriangles); diff --git a/tests/hollowing/openvdb_utils.hpp b/src/libslic3r/OpenVDBUtils.hpp similarity index 90% rename from tests/hollowing/openvdb_utils.hpp rename to src/libslic3r/OpenVDBUtils.hpp index 9854d924da..e424038876 100644 --- a/tests/hollowing/openvdb_utils.hpp +++ b/src/libslic3r/OpenVDBUtils.hpp @@ -1,5 +1,5 @@ -#ifndef OPENVDB_UTILS_HPP -#define OPENVDB_UTILS_HPP +#ifndef OPENVDBUTILS_HPP +#define OPENVDBUTILS_HPP #include #include @@ -20,4 +20,4 @@ sla::Contour3D volumeToMesh(const openvdb::FloatGrid &grid, } // namespace Slic3r -#endif // OPENVDB_UTILS_HPP +#endif // OPENVDBUTILS_HPP diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 0d2266dc56..f77b4bd25f 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -27,5 +27,4 @@ add_subdirectory(libslic3r) add_subdirectory(timeutils) add_subdirectory(fff_print) add_subdirectory(sla_print) -add_subdirectory(hollowing) -add_subdirectory(example) +# add_subdirectory(example) diff --git a/tests/hollowing/CMakeLists.txt b/tests/hollowing/CMakeLists.txt deleted file mode 100644 index 9679a1b777..0000000000 --- a/tests/hollowing/CMakeLists.txt +++ /dev/null @@ -1,9 +0,0 @@ -if(TARGET OpenVDB::openvdb) - add_executable(hollowing_tests hollowing_test_main.cpp hollowing_tests.cpp openvdb_utils.cpp openvdb_utils.hpp) - - #find_package(GTest REQUIRED) - #target_link_libraries(hollowing_tests libslic3r OpenVDB::openvdb GTest::GTest GTest::Main) - #target_compile_definitions(hollowing_tests PRIVATE TEST_DATA_DIR=R"\(${TEST_DATA_DIR}\)") - - target_link_libraries(hollowing_tests test_common libslic3r OpenVDB::openvdb) -endif() diff --git a/tests/hollowing/hollowing_test_main.cpp b/tests/hollowing/hollowing_test_main.cpp deleted file mode 100644 index b2aa80259d..0000000000 --- a/tests/hollowing/hollowing_test_main.cpp +++ /dev/null @@ -1 +0,0 @@ -#include diff --git a/tests/libslic3r/CMakeLists.txt b/tests/libslic3r/CMakeLists.txt index 98aab498e4..b4f5ba01ec 100644 --- a/tests/libslic3r/CMakeLists.txt +++ b/tests/libslic3r/CMakeLists.txt @@ -1,4 +1,5 @@ get_filename_component(_TEST_NAME ${CMAKE_CURRENT_LIST_DIR} NAME) + add_executable(${_TEST_NAME}_tests ${_TEST_NAME}_tests.cpp test_3mf.cpp @@ -7,6 +8,11 @@ add_executable(${_TEST_NAME}_tests test_polygon.cpp test_stl.cpp ) + +if (TARGET OpenVDB::openvdb) + target_sources(${_TEST_NAME}_tests PRIVATE test_hollowing.cpp) +endif() + target_link_libraries(${_TEST_NAME}_tests test_common libslic3r) set_property(TARGET ${_TEST_NAME}_tests PROPERTY FOLDER "tests") diff --git a/tests/hollowing/hollowing_tests.cpp b/tests/libslic3r/test_hollowing.cpp similarity index 96% rename from tests/hollowing/hollowing_tests.cpp rename to tests/libslic3r/test_hollowing.cpp index a7b2874eb0..0e211c33ce 100644 --- a/tests/hollowing/hollowing_tests.cpp +++ b/tests/libslic3r/test_hollowing.cpp @@ -2,7 +2,7 @@ #include #include -#include "openvdb_utils.hpp" +#include "libslic3r/OpenVDBUtils.hpp" #include "libslic3r/Format/OBJ.hpp" #if defined(WIN32) || defined(_WIN32) From 7808d09d062b95c7c87c219916cb9b0e5d24eba6 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Mon, 4 Nov 2019 14:33:29 +0100 Subject: [PATCH 029/336] SLA Contour3D expanded with conversions supporting quads. --- src/libslic3r/CMakeLists.txt | 1 + src/libslic3r/Format/objparser.cpp | 29 + src/libslic3r/Format/objparser.hpp | 2 + src/libslic3r/SLA/SLABoilerPlate.hpp | 122 - src/libslic3r/SLA/SLACommon.cpp | 147 + src/libslic3r/SLA/SLACommon.hpp | 75 +- src/libslic3r/SLA/SLAPad.cpp | 2 +- src/libslic3r/SLA/SLASupportTreeBuilder.cpp | 2 +- src/libslic3r/SLA/SLASupportTreeIGL.cpp | 20 + tests/data/extruder_idler_quads.obj | 7348 +++++++++++++++++++ tests/libslic3r/test_hollowing.cpp | 17 +- tests/sla_print/CMakeLists.txt | 2 +- tests/sla_print/sla_print_tests.cpp | 268 +- tests/sla_print/sla_print_tests_main.cpp | 1 + 14 files changed, 7777 insertions(+), 259 deletions(-) create mode 100644 src/libslic3r/SLA/SLACommon.cpp create mode 100644 tests/data/extruder_idler_quads.obj create mode 100644 tests/sla_print/sla_print_tests_main.cpp diff --git a/src/libslic3r/CMakeLists.txt b/src/libslic3r/CMakeLists.txt index 9ee6e60c52..47e49eadb0 100644 --- a/src/libslic3r/CMakeLists.txt +++ b/src/libslic3r/CMakeLists.txt @@ -181,6 +181,7 @@ add_library(libslic3r STATIC miniz_extension.cpp ${OpenVDBUtils_SOURCES} SLA/SLACommon.hpp + SLA/SLACommon.cpp SLA/SLABoilerPlate.hpp SLA/SLAPad.hpp SLA/SLAPad.cpp diff --git a/src/libslic3r/Format/objparser.cpp b/src/libslic3r/Format/objparser.cpp index c805667f81..8279c55308 100644 --- a/src/libslic3r/Format/objparser.cpp +++ b/src/libslic3r/Format/objparser.cpp @@ -355,6 +355,35 @@ bool objparse(const char *path, ObjData &data) return true; } +bool objparse(std::istream &stream, ObjData &data) +{ + try { + char buf[65536 * 2]; + size_t len = 0; + size_t lenPrev = 0; + while ((len = size_t(stream.read(buf + lenPrev, 65536).gcount())) != 0) { + len += lenPrev; + size_t lastLine = 0; + for (size_t i = 0; i < len; ++ i) + if (buf[i] == '\r' || buf[i] == '\n') { + buf[i] = 0; + char *c = buf + lastLine; + while (*c == ' ' || *c == '\t') + ++ c; + obj_parseline(c, data); + lastLine = i + 1; + } + lenPrev = len - lastLine; + memmove(buf, buf + lastLine, lenPrev); + } + } + catch (std::bad_alloc&) { + printf("Out of memory\r\n"); + } + + return true; +} + template bool savevector(FILE *pFile, const std::vector &v) { diff --git a/src/libslic3r/Format/objparser.hpp b/src/libslic3r/Format/objparser.hpp index 5fc25e297b..5f3f010e4a 100644 --- a/src/libslic3r/Format/objparser.hpp +++ b/src/libslic3r/Format/objparser.hpp @@ -3,6 +3,7 @@ #include #include +#include namespace ObjParser { @@ -97,6 +98,7 @@ struct ObjData { }; extern bool objparse(const char *path, ObjData &data); +extern bool objparse(std::istream &stream, ObjData &data); extern bool objbinsave(const char *path, const ObjData &data); diff --git a/src/libslic3r/SLA/SLABoilerPlate.hpp b/src/libslic3r/SLA/SLABoilerPlate.hpp index 1bb1943ef1..9be91ac1d1 100644 --- a/src/libslic3r/SLA/SLABoilerPlate.hpp +++ b/src/libslic3r/SLA/SLABoilerPlate.hpp @@ -17,128 +17,6 @@ typedef Eigen::Matrix Vec4i; namespace sla { -/// Intermediate struct for a 3D mesh -struct Contour3D { - Pointf3s points; - std::vector faces3; - std::vector faces4; - - Contour3D& merge(const Contour3D& ctr) - { - auto N = coord_t(points.size()); - auto N_f3 = faces3.size(); - auto N_f4 = faces4.size(); - - points.insert(points.end(), ctr.points.begin(), ctr.points.end()); - faces3.insert(faces3.end(), ctr.faces3.begin(), ctr.faces3.end()); - faces4.insert(faces4.end(), ctr.faces4.begin(), ctr.faces4.end()); - - for(size_t n = N_f3; n < faces3.size(); n++) { - auto& idx = faces3[n]; idx.x() += N; idx.y() += N; idx.z() += N; - } - - for(size_t n = N_f4; n < faces4.size(); n++) { - auto& idx = faces4[n]; for (int k = 0; k < 4; k++) idx(k) += N; - } - - return *this; - } - - Contour3D& merge(const Pointf3s& triangles) - { - const size_t offs = points.size(); - points.insert(points.end(), triangles.begin(), triangles.end()); - faces3.reserve(faces3.size() + points.size() / 3); - - for(int i = int(offs); i < int(points.size()); i += 3) - faces3.emplace_back(i, i + 1, i + 2); - - return *this; - } - - // Write the index triangle structure to OBJ file for debugging purposes. - void to_obj(std::ostream& stream) - { - for(auto& p : points) { - stream << "v " << p.transpose() << "\n"; - } - - for(auto& f : faces3) { - stream << "f " << (f + Vec3i(1, 1, 1)).transpose() << "\n"; - } - - for(auto& f : faces4) { - stream << "f " << (f + Vec4i(1, 1, 1, 1)).transpose() << "\n"; - } - } - - bool empty() const { return points.empty() || (faces4.empty() && faces3.empty()); } -}; - -using ClusterEl = std::vector; -using ClusteredPoints = std::vector; - -// Clustering a set of points by the given distance. -ClusteredPoints cluster(const std::vector& indices, - std::function pointfn, - double dist, - unsigned max_points); - -ClusteredPoints cluster(const PointSet& points, - double dist, - unsigned max_points); - -ClusteredPoints cluster( - const std::vector& indices, - std::function pointfn, - std::function predicate, - unsigned max_points); - - -// Calculate the normals for the selected points (from 'points' set) on the -// mesh. This will call squared distance for each point. -PointSet normals(const PointSet& points, - const EigenMesh3D& convert_mesh, - double eps = 0.05, // min distance from edges - std::function throw_on_cancel = [](){}, - const std::vector& selected_points = {}); - -/// Mesh from an existing contour. -inline TriangleMesh convert_mesh(const Contour3D& ctour) { - return {ctour.points, ctour.faces3}; -} - -/// Mesh from an evaporating 3D contour -inline TriangleMesh convert_mesh(Contour3D&& ctour) { - return {std::move(ctour.points), std::move(ctour.faces3)}; -} - -inline Contour3D convert_mesh(const TriangleMesh &trmesh) { - Contour3D ret; - ret.points.reserve(trmesh.its.vertices.size()); - ret.faces3.reserve(trmesh.its.indices.size()); - - for (auto &v : trmesh.its.vertices) - ret.points.emplace_back(v.cast()); - - std::copy(trmesh.its.indices.begin(), trmesh.its.indices.end(), - std::back_inserter(ret.faces3)); - - return ret; -} - -inline Contour3D convert_mesh(TriangleMesh &&trmesh) { - Contour3D ret; - ret.points.reserve(trmesh.its.vertices.size()); - - for (auto &v : trmesh.its.vertices) - ret.points.emplace_back(v.cast()); - - ret.faces3.swap(trmesh.its.indices); - - return ret; -} - } } diff --git a/src/libslic3r/SLA/SLACommon.cpp b/src/libslic3r/SLA/SLACommon.cpp new file mode 100644 index 0000000000..e6fbed7ec1 --- /dev/null +++ b/src/libslic3r/SLA/SLACommon.cpp @@ -0,0 +1,147 @@ +#include "SLACommon.hpp" +#include + +namespace Slic3r { namespace sla { + +Contour3D::Contour3D(const TriangleMesh &trmesh) +{ + points.reserve(trmesh.its.vertices.size()); + faces3.reserve(trmesh.its.indices.size()); + + for (auto &v : trmesh.its.vertices) + points.emplace_back(v.cast()); + + std::copy(trmesh.its.indices.begin(), trmesh.its.indices.end(), + std::back_inserter(faces3)); +} + +Contour3D::Contour3D(TriangleMesh &&trmesh) +{ + points.reserve(trmesh.its.vertices.size()); + + for (auto &v : trmesh.its.vertices) + points.emplace_back(v.cast()); + + faces3.swap(trmesh.its.indices); +} + +Contour3D::Contour3D(const EigenMesh3D &emesh) { + points.reserve(size_t(emesh.V().rows())); + faces3.reserve(size_t(emesh.F().rows())); + + for (int r = 0; r < emesh.V().rows(); r++) + points.emplace_back(emesh.V().row(r).cast()); + + for (int i = 0; i < emesh.F().rows(); i++) + faces3.emplace_back(emesh.F().row(i)); +} + +Contour3D &Contour3D::merge(const Contour3D &ctr) +{ + auto N = coord_t(points.size()); + auto N_f3 = faces3.size(); + auto N_f4 = faces4.size(); + + points.insert(points.end(), ctr.points.begin(), ctr.points.end()); + faces3.insert(faces3.end(), ctr.faces3.begin(), ctr.faces3.end()); + faces4.insert(faces4.end(), ctr.faces4.begin(), ctr.faces4.end()); + + for(size_t n = N_f3; n < faces3.size(); n++) { + auto& idx = faces3[n]; idx.x() += N; idx.y() += N; idx.z() += N; + } + + for(size_t n = N_f4; n < faces4.size(); n++) { + auto& idx = faces4[n]; for (int k = 0; k < 4; k++) idx(k) += N; + } + + return *this; +} + +Contour3D &Contour3D::merge(const Pointf3s &triangles) +{ + const size_t offs = points.size(); + points.insert(points.end(), triangles.begin(), triangles.end()); + faces3.reserve(faces3.size() + points.size() / 3); + + for(int i = int(offs); i < int(points.size()); i += 3) + faces3.emplace_back(i, i + 1, i + 2); + + return *this; +} + +void Contour3D::to_obj(std::ostream &stream) +{ + for(auto& p : points) + stream << "v " << p.transpose() << "\n"; + + for(auto& f : faces3) + stream << "f " << (f + Vec3i(1, 1, 1)).transpose() << "\n"; + + for(auto& f : faces4) + stream << "f " << (f + Vec4i(1, 1, 1, 1)).transpose() << "\n"; +} + +void Contour3D::from_obj(std::istream &stream) +{ + ObjParser::ObjData data; + ObjParser::objparse(stream, data); + + points.reserve(data.coordinates.size() / 4 + 1); + auto &coords = data.coordinates; + for (size_t i = 0; i < coords.size(); i += 4) + points.emplace_back(coords[i], coords[i + 1], coords[i + 2]); + + Vec3i triangle; + Vec4i quad; + size_t v = 0; + while(v < data.vertices.size()) { + size_t N = 0; + size_t i = v; + while (data.vertices[v++].coordIdx != -1) ++N; + + std::function setfn; + if (N < 3 || N > 4) continue; + else if (N == 3) setfn = [&triangle](int k, int f) { triangle(k) = f; }; + else setfn = [&quad](int k, int f) { quad(k) = f; }; + + for (size_t j = 0; j < N; ++j) + setfn(int(j), data.vertices[i + j].coordIdx); + } +} + +TriangleMesh to_triangle_mesh(const Contour3D &ctour) { + if (ctour.faces4.empty()) return {ctour.points, ctour.faces3}; + + std::vector triangles; + + triangles.reserve(ctour.faces3.size() + 2 * ctour.faces4.size()); + std::copy(ctour.faces3.begin(), ctour.faces3.end(), + std::back_inserter(triangles)); + + for (auto &quad : ctour.faces4) { + triangles.emplace_back(quad(0), quad(1), quad(2)); + triangles.emplace_back(quad(2), quad(3), quad(0)); + } + + return {ctour.points, std::move(triangles)}; +} + +TriangleMesh to_triangle_mesh(Contour3D &&ctour) { + if (ctour.faces4.empty()) + return {std::move(ctour.points), std::move(ctour.faces3)}; + + std::vector triangles; + + triangles.reserve(ctour.faces3.size() + 2 * ctour.faces4.size()); + std::copy(ctour.faces3.begin(), ctour.faces3.end(), + std::back_inserter(triangles)); + + for (auto &quad : ctour.faces4) { + triangles.emplace_back(quad(0), quad(1), quad(2)); + triangles.emplace_back(quad(2), quad(3), quad(0)); + } + + return {std::move(ctour.points), std::move(triangles)}; +} + +}} // namespace Slic3r::sla diff --git a/src/libslic3r/SLA/SLACommon.hpp b/src/libslic3r/SLA/SLACommon.hpp index 97b4596761..7cdc626629 100644 --- a/src/libslic3r/SLA/SLACommon.hpp +++ b/src/libslic3r/SLA/SLACommon.hpp @@ -5,6 +5,11 @@ #include #include +#include "SLASpatIndex.hpp" + +#include +#include + // #define SLIC3R_SLA_NEEDS_WINDTREE namespace Slic3r { @@ -12,8 +17,7 @@ namespace Slic3r { // Typedefs from Point.hpp typedef Eigen::Matrix Vec3f; typedef Eigen::Matrix Vec3d; - -class TriangleMesh; +typedef Eigen::Matrix Vec4i; namespace sla { @@ -59,9 +63,11 @@ struct SupportPoint bool operator==(const SupportPoint &sp) const { - return (pos == sp.pos) && head_front_radius == sp.head_front_radius && + float rdiff = std::abs(head_front_radius - sp.head_front_radius); + return (pos == sp.pos) && rdiff < float(EPSILON) && is_new_island == sp.is_new_island; } + bool operator!=(const SupportPoint &sp) const { return !(sp == (*this)); } template void serialize(Archive &ar) @@ -72,8 +78,11 @@ struct SupportPoint using SupportPoints = std::vector; +struct Contour3D; + /// An index-triangle structure for libIGL functions. Also serves as an -/// alternative (raw) input format for the SLASupportTree +/// alternative (raw) input format for the SLASupportTree. +// Implemented in SLASupportTreeIGL.cpp class EigenMesh3D { class AABBImpl; @@ -86,6 +95,7 @@ public: EigenMesh3D(const TriangleMesh&); EigenMesh3D(const EigenMesh3D& other); + EigenMesh3D(const Contour3D &other); EigenMesh3D& operator=(const EigenMesh3D&); ~EigenMesh3D(); @@ -180,6 +190,63 @@ public: using PointSet = Eigen::MatrixXd; + +/// Dumb vertex mesh consisting of triangles (or) quads. Capable of merging with +/// other meshes of this type and converting to and from other mesh formats. +struct Contour3D { + Pointf3s points; + std::vector faces3; + std::vector faces4; + + Contour3D() = default; + Contour3D(const TriangleMesh &trmesh); + Contour3D(TriangleMesh &&trmesh); + Contour3D(const EigenMesh3D &emesh); + + Contour3D& merge(const Contour3D& ctr); + Contour3D& merge(const Pointf3s& triangles); + + // Write the index triangle structure to OBJ file for debugging purposes. + void to_obj(std::ostream& stream); + void from_obj(std::istream &stream); + + inline bool empty() const { return points.empty() || (faces4.empty() && faces3.empty()); } +}; + +using ClusterEl = std::vector; +using ClusteredPoints = std::vector; + +// Clustering a set of points by the given distance. +ClusteredPoints cluster(const std::vector& indices, + std::function pointfn, + double dist, + unsigned max_points); + +ClusteredPoints cluster(const PointSet& points, + double dist, + unsigned max_points); + +ClusteredPoints cluster( + const std::vector& indices, + std::function pointfn, + std::function predicate, + unsigned max_points); + + +// Calculate the normals for the selected points (from 'points' set) on the +// mesh. This will call squared distance for each point. +PointSet normals(const PointSet& points, + const EigenMesh3D& convert_mesh, + double eps = 0.05, // min distance from edges + std::function throw_on_cancel = [](){}, + const std::vector& selected_points = {}); + +/// Mesh from an existing contour. +TriangleMesh to_triangle_mesh(const Contour3D& ctour); + +/// Mesh from an evaporating 3D contour +TriangleMesh to_triangle_mesh(Contour3D&& ctour); + } // namespace sla } // namespace Slic3r diff --git a/src/libslic3r/SLA/SLAPad.cpp b/src/libslic3r/SLA/SLAPad.cpp index d0e802d842..264cfba9ff 100644 --- a/src/libslic3r/SLA/SLAPad.cpp +++ b/src/libslic3r/SLA/SLAPad.cpp @@ -677,7 +677,7 @@ void create_pad(const ExPolygons &sup_blueprint, ThrowOnCancel thr) { Contour3D t = create_pad_geometry(sup_blueprint, model_blueprint, cfg, thr); - out.merge(convert_mesh(std::move(t))); + out.merge(to_triangle_mesh(std::move(t))); } std::string PadConfig::validate() const diff --git a/src/libslic3r/SLA/SLASupportTreeBuilder.cpp b/src/libslic3r/SLA/SLASupportTreeBuilder.cpp index 0c276738a2..df51c6b5fb 100644 --- a/src/libslic3r/SLA/SLASupportTreeBuilder.cpp +++ b/src/libslic3r/SLA/SLASupportTreeBuilder.cpp @@ -466,7 +466,7 @@ const TriangleMesh &SupportTreeBuilder::merged_mesh() const return m_meshcache; } - m_meshcache = convert_mesh(merged); + m_meshcache = to_triangle_mesh(merged); // The mesh will be passed by const-pointer to TriangleMeshSlicer, // which will need this. diff --git a/src/libslic3r/SLA/SLASupportTreeIGL.cpp b/src/libslic3r/SLA/SLASupportTreeIGL.cpp index 05f8b19842..5e10c28c91 100644 --- a/src/libslic3r/SLA/SLASupportTreeIGL.cpp +++ b/src/libslic3r/SLA/SLASupportTreeIGL.cpp @@ -228,6 +228,26 @@ EigenMesh3D::EigenMesh3D(const EigenMesh3D &other): m_V(other.m_V), m_F(other.m_F), m_ground_level(other.m_ground_level), m_aabb( new AABBImpl(*other.m_aabb) ) {} +EigenMesh3D::EigenMesh3D(const Contour3D &other) +{ + m_V.resize(Eigen::Index(other.points.size()), 3); + m_F.resize(Eigen::Index(other.faces3.size() + 2 * other.faces4.size()), 3); + + for (Eigen::Index i = 0; i < Eigen::Index(other.points.size()); ++i) + m_V.row(i) = other.points[size_t(i)]; + + for (Eigen::Index i = 0; i < Eigen::Index(other.faces3.size()); ++i) + m_F.row(i) = other.faces3[size_t(i)]; + + size_t N = other.faces3.size() + 2 * other.faces4.size(); + for (size_t i = other.faces3.size(); i < N; i += 2) { + size_t quad_idx = (i - other.faces3.size()) / 2; + auto & quad = other.faces4[quad_idx]; + m_F.row(Eigen::Index(i)) = Vec3i{quad(0), quad(1), quad(2)}; + m_F.row(Eigen::Index(i + 1)) = Vec3i{quad(2), quad(3), quad(0)}; + } +} + EigenMesh3D &EigenMesh3D::operator=(const EigenMesh3D &other) { m_V = other.m_V; diff --git a/tests/data/extruder_idler_quads.obj b/tests/data/extruder_idler_quads.obj new file mode 100644 index 0000000000..266cb242d1 --- /dev/null +++ b/tests/data/extruder_idler_quads.obj @@ -0,0 +1,7348 @@ +#### +# +# OBJ File Generated by Meshlab +# +#### +# Object extruder_idler_quads.obj +# +# Vertices: 3660 +# Faces: 3672 +# +#### +v 61.288807 37.917557 6.068595 +v 61.312790 37.917618 6.193261 +v 61.356049 37.917774 6.504920 +v 46.677547 37.917866 9.519013 +v 55.420834 37.917618 7.326775 +v 55.396851 37.917557 7.202109 +v 70.876183 37.682098 2.970614 +v 46.216084 37.450668 7.120349 +v 61.171124 37.838562 5.456883 +v 70.404060 35.864510 0.516525 +v 70.345604 35.376511 0.212692 +v 54.692173 35.864510 3.539228 +v 54.633720 35.376511 3.235396 +v 61.171051 37.731289 7.795076 +v 55.864639 37.839470 8.386023 +v 55.279167 37.838562 6.590397 +v 46.326366 37.682098 7.693588 +v 70.566055 36.778572 1.358596 +v 70.661987 37.147907 1.857247 +v 54.854176 36.778572 4.381299 +v 46.112171 37.147907 6.580221 +v 55.054016 37.450668 5.420078 +v 60.659683 36.348526 2.798444 +v 54.767727 36.348526 3.931957 +v 45.929794 36.348526 5.632228 +v 50.387226 39.697979 28.801762 +v 50.382210 39.699635 28.775690 +v 48.877922 40.196674 20.956472 +v 48.879765 39.946739 20.966045 +v 48.897690 38.450691 21.059217 +v 48.672623 38.559273 19.889320 +v 48.627918 34.768574 19.656961 +v 48.967503 37.518620 21.422112 +v 49.148136 36.364048 22.361021 +v 49.308113 35.827209 23.192574 +v 49.224934 36.068989 22.760210 +v 50.379288 38.947979 28.760509 +v 50.332268 37.976688 28.516096 +v 50.291908 37.522064 28.306307 +v 50.557526 37.884193 29.686979 +v 49.863396 35.643738 26.078924 +v 49.771500 35.518578 25.601242 +v 50.513439 34.145573 29.457813 +v 46.316734 33.337154 7.643516 +v 45.795788 35.376511 4.935667 +v 46.366432 33.896751 7.901852 +v 45.854240 35.864510 5.239500 +v 46.306992 32.926773 7.592876 +v 46.316822 32.516430 7.643979 +v 46.420128 31.655691 8.180969 +v 46.451801 31.534010 8.345595 +v 46.486115 31.434301 8.523966 +v 46.599277 31.280785 9.112178 +v 46.099930 28.231632 6.516577 +v 46.638424 31.280876 9.315653 +v 47.221455 27.861065 12.346222 +v 46.715168 31.358620 9.714571 +v 46.785843 31.534855 10.081941 +v 47.732357 31.056692 15.001865 +v 46.930408 32.928387 10.833368 +v 46.927967 32.721592 10.820692 +v 47.124451 37.150532 11.842004 +v 47.220444 36.781719 12.340965 +v 46.817513 31.656748 10.246544 +v 46.870964 31.958406 10.524391 +v 46.891937 32.133430 10.633411 +v 47.306953 36.352104 12.790643 +v 46.391373 34.056538 8.031486 +v 46.016239 36.778572 6.081570 +v 46.441235 37.838562 8.290668 +v 46.598972 34.574272 9.110590 +v 46.560146 34.548199 8.908764 +v 46.558918 37.917557 8.902380 +v 46.714870 34.497074 9.713024 +v 47.020462 37.452759 11.301476 +v 46.910164 37.683620 10.728139 +v 46.870785 33.898132 10.523453 +v 46.891777 33.723171 10.632566 +v 46.751282 34.420887 9.902280 +v 51.630699 27.764736 35.265278 +v 52.147446 28.245863 37.951313 +v 46.795250 37.839470 10.130821 +v 71.227364 37.917866 4.796038 +v 76.205231 29.860657 30.670778 +v 70.878639 33.534252 2.983394 +v 70.916252 33.896751 3.178878 +v 70.969704 34.198410 3.456725 +v 71.001366 34.320305 3.621328 +v 70.991051 37.838562 3.567693 +v 71.108734 37.917557 4.179405 +v 71.109962 34.548199 4.185790 +v 71.226776 34.548508 4.792975 +v 71.345062 37.839470 5.407847 +v 71.459976 37.683620 6.005164 +v 71.301102 34.420887 5.179305 +v 71.441589 33.723171 5.909592 +v 70.479614 36.348526 0.909254 +v 70.866547 33.337154 2.920542 +v 70.765900 37.450668 2.397374 +v 70.916428 31.957125 3.179823 +v 70.304688 31.906664 0.000000 +v 71.001617 31.534010 3.622621 +v 71.035934 31.434301 3.800991 +v 71.149094 31.280785 4.389203 +v 71.110252 31.306643 4.187318 +v 71.227066 31.306923 4.794502 +v 71.301376 31.434967 5.180758 +v 71.264984 31.358620 4.991596 +v 71.458290 33.535702 5.996392 +v 71.477760 33.135204 6.097586 +v 71.480225 32.928387 6.110393 +v 72.579239 34.928131 11.823022 +v 73.058540 33.686779 14.314425 +v 71.367325 31.656748 5.523570 +v 73.568642 32.857552 16.965889 +v 73.831314 32.604336 18.331276 +v 75.124626 28.113617 25.053829 +v 74.363899 32.428364 21.099625 +v 74.895103 32.695507 23.860798 +v 75.156105 32.993713 25.217482 +v 75.149338 30.209538 25.182302 +v 76.679512 26.740294 33.136051 +v 76.697266 28.245863 33.228336 +v 76.180519 27.764736 30.542305 +v 71.996040 35.338497 8.791578 +v 72.012505 35.153580 8.877157 +v 56.978554 37.452759 9.385705 +v 57.088562 37.406780 9.449879 +v 71.674271 37.150532 7.119029 +v 60.551853 37.406780 8.783600 +v 59.598507 37.150532 9.442204 +v 47.382626 35.868492 13.183980 +v 71.856773 36.352104 8.067668 +v 71.770264 36.781719 7.617991 +v 59.439774 37.126163 9.506907 +v 58.300529 37.132675 9.716898 +v 58.834583 37.093670 9.668919 +v 71.570282 37.452759 6.578501 +v 71.932442 35.868492 8.461005 +v 47.446220 35.338497 13.514553 +v 44.992771 27.189064 13.242427 +v 51.780609 26.868217 17.170813 +v 61.232605 27.449877 5.863266 +v 58.929241 27.283329 9.023430 +v 58.809258 27.282513 9.059827 +v 58.359135 27.139223 11.484049 +v 58.309364 27.285778 9.102742 +v 55.616589 27.411655 7.567233 +v 47.938751 27.189064 12.675670 +v 54.076530 26.062111 29.879890 +v 54.026432 26.058466 29.948986 +v 53.712753 26.029385 30.483768 +v 53.552719 25.999935 30.994987 +v 53.514042 25.981487 31.303373 +v 53.514153 25.976261 31.388626 +v 50.928787 26.201115 28.217762 +v 53.514442 25.962425 31.614302 +v 68.806427 26.062111 27.046103 +v 68.623718 26.048828 27.297941 +v 68.756279 26.058466 27.115208 +v 68.515053 26.037975 27.495895 +v 62.093616 26.073893 28.145342 +v 68.338547 26.012682 27.942495 +v 68.254539 25.986547 28.385019 +v 68.244034 25.976261 28.554842 +v 68.218460 26.326206 22.850769 +v 73.165169 25.937754 28.236309 +v 73.194099 25.909863 28.685766 +v 73.183594 25.899576 28.855589 +v 72.995468 25.856739 29.590630 +v 72.923080 25.848146 29.744713 +v 72.631706 25.824013 30.194506 +v 71.988434 25.798077 30.741371 +v 71.553574 25.790627 30.946589 +v 71.338646 25.788862 31.016699 +v 70.807259 25.790627 31.090166 +v 70.411186 25.796120 31.076721 +v 70.327293 25.798077 31.060946 +v 70.105293 25.803261 31.019094 +v 58.193188 25.848146 32.578499 +v 68.283722 25.943062 29.088823 +v 68.361572 25.923698 29.389732 +v 68.626915 25.886189 29.950634 +v 68.759964 25.873442 30.132986 +v 58.265583 25.856739 32.424416 +v 68.965179 25.856739 30.365990 +v 69.023651 25.852247 30.428022 +v 69.089577 25.848146 30.482216 +v 69.263924 25.837296 30.625723 +v 69.527039 25.824013 30.791792 +v 69.604355 25.820885 30.827938 +v 68.476524 25.904634 29.678623 +v 58.435280 25.937754 31.070093 +v 58.463875 25.923698 31.293884 +v 58.464321 25.904634 31.604805 +v 58.369694 25.873442 32.131901 +v 68.810265 25.868631 30.201771 +v 69.454826 25.827658 30.746227 +v 57.951962 25.827658 32.959187 +v 69.808907 25.812611 30.923559 +v 57.688858 25.812611 33.255257 +v 70.023972 25.805826 30.992867 +v 57.514957 25.805826 33.399391 +v 57.109299 25.794794 33.657429 +v 56.904839 25.791292 33.753883 +v 56.823685 25.790627 33.780373 +v 56.608757 25.788862 33.850483 +v 56.302967 25.788862 33.909313 +v 56.077370 25.790627 33.923950 +v 55.375401 25.803261 33.852879 +v 54.874439 25.820885 33.661728 +v 54.080334 25.868631 33.035564 +v 52.746826 25.600410 37.667839 +v 54.359653 25.848146 33.316006 +v 54.533997 25.837296 33.459515 +v 54.797138 25.824013 33.625580 +v 55.079014 25.812611 33.757343 +v 55.766525 25.794794 33.915756 +v 55.681297 25.796120 33.910507 +v 73.076561 25.962425 27.850878 +v 72.993141 25.976261 27.641191 +v 72.811218 25.999935 27.289974 +v 71.911095 26.062111 26.448816 +v 71.833778 26.065239 26.412672 +v 71.629128 26.073511 26.317068 +v 70.716064 26.094831 26.144928 +v 70.630875 26.095497 26.150444 +v 69.598946 26.091330 26.416964 +v 69.521751 26.090002 26.453463 +v 66.578064 26.868217 14.324030 +v 66.011253 26.886908 14.128163 +v 60.892159 27.567686 4.006828 +v 61.173477 27.469414 5.555912 +v 61.073132 26.073893 28.341667 +v 58.403152 25.948370 30.903088 +v 58.263256 25.976261 30.474977 +v 58.081326 25.999935 30.123760 +v 57.948280 26.012682 29.941408 +v 57.618668 26.037975 29.592178 +v 57.684593 26.033876 29.646372 +v 57.444317 26.048828 29.448671 +v 57.181206 26.062111 29.282602 +v 57.103886 26.065239 29.246456 +v 56.684273 26.080296 29.081528 +v 56.899239 26.073511 29.150852 +v 55.986176 26.094831 28.978714 +v 55.675388 26.097260 28.998867 +v 54.869053 26.091330 29.250750 +v 54.791859 26.090002 29.287249 +v 54.719810 26.088047 29.333023 +v 54.463398 26.080296 29.508787 +v 53.421013 26.326206 25.697552 +v 54.529179 26.082863 29.454258 +v 67.902382 34.970417 12.655975 +v 47.462685 35.153580 13.600132 +v 54.822617 34.805954 17.855391 +v 58.905815 34.974163 14.325680 +v 54.142002 34.777916 18.443687 +v 56.180191 34.357391 24.912003 +v 64.640221 42.441532 22.165798 +v 64.498436 42.393948 21.428791 +v 64.108391 38.000809 19.401363 +v 65.105515 36.364048 19.291088 +v 64.965973 41.759834 23.859028 +v 65.182312 36.068989 19.690277 +v 64.884438 37.973030 18.141928 +v 64.924889 37.518620 18.352179 +v 64.831230 39.445396 17.865381 +v 64.038155 39.445889 19.036266 +v 65.353737 35.642532 20.581331 +v 65.445679 35.517838 21.059244 +v 65.633987 43.439590 22.038057 +v 64.077850 40.550362 19.242599 +v 64.837143 39.946739 17.896112 +v 65.265495 35.827209 20.122641 +v 64.330994 39.446640 20.558413 +v 64.055885 40.191998 19.128443 +v 64.350174 39.980480 20.658138 +v 64.243858 37.134884 20.105499 +v 64.108124 40.891331 19.399967 +v 64.364799 40.145279 20.734161 +v 64.042656 39.069904 19.059660 +v 64.078056 38.341614 19.243677 +v 64.339630 39.086071 20.603313 +v 64.350266 38.912914 20.658621 +v 64.405319 38.454250 20.944765 +v 64.488396 38.135056 21.376616 +v 64.430038 36.593735 21.073254 +v 64.301460 36.913589 20.404915 +v 64.520393 38.068111 21.542925 +v 64.587852 38.000175 21.893555 +v 64.569603 36.453186 21.798729 +v 64.640778 36.453377 22.168688 +v 64.711395 36.500771 22.535736 +v 64.721664 38.135670 22.589117 +v 64.846489 36.733505 23.237947 +v 64.804688 38.455292 23.020670 +v 64.826614 38.595646 23.134649 +v 65.063599 37.685196 24.366478 +v 64.845032 38.749439 23.230366 +v 64.243446 41.757961 20.103352 +v 64.405144 40.439426 20.943855 +v 64.300987 41.979553 20.402464 +v 64.458015 40.671249 21.218702 +v 64.488167 40.759056 21.375410 +v 64.429504 42.300076 21.070503 +v 64.553452 40.871548 21.714767 +v 64.569054 42.441341 21.795839 +v 64.656105 40.871815 22.248354 +v 64.689438 40.826614 22.421604 +v 64.845985 42.162468 23.235317 +v 64.908371 41.981129 23.559612 +v 64.804512 40.440468 23.019760 +v 64.844902 40.146526 23.229715 +v 64.859566 39.981804 23.305906 +v 64.876671 39.629799 23.394819 +v 64.751572 40.672024 22.744589 +v 64.779427 40.565052 22.889357 +v 65.101707 38.003387 24.564560 +v 65.153946 38.702721 24.836084 +v 65.131981 38.344357 24.721928 +v 65.167244 39.072823 24.905212 +v 65.153801 40.194855 24.835358 +v 64.363846 36.732250 20.729210 +v 64.966385 37.136757 23.861176 +v 66.068886 36.366562 24.298624 +v 65.820778 35.643738 23.008991 +v 66.289383 40.921688 25.444761 +v 66.318748 40.444027 25.597404 +v 64.975334 41.796913 18.614428 +v 64.146233 41.209522 19.598049 +v 64.363342 42.161217 20.726580 +v 65.728134 43.376877 22.527445 +v 64.779793 42.300983 22.891273 +v 64.056030 38.699863 19.129168 +v 64.975761 37.094627 18.616638 +v 64.146568 37.682812 19.599808 +v 64.191963 37.392635 19.835770 +v 64.042587 39.821896 19.059315 +v 64.498993 36.500225 21.431665 +v 64.780319 36.594643 22.894024 +v 66.137520 42.186985 24.655401 +v 65.101440 40.893909 24.563162 +v 64.191582 41.499920 19.833786 +v 65.035782 42.184120 18.928610 +v 64.924530 41.372654 18.350315 +v 65.353035 43.250977 20.577698 +v 65.991501 42.825726 23.896412 +v 66.068298 42.530670 24.295601 +v 64.710838 42.394493 22.532862 +v 65.171677 39.448830 24.928261 +v 66.336670 38.947979 25.690577 +v 65.017868 41.502083 24.128757 +v 65.063263 41.211906 24.364719 +v 66.318924 38.454502 25.598343 +v 65.018250 37.394798 24.130741 +v 64.908844 36.915165 23.562061 +v 65.992126 36.071102 23.899647 +v 65.634720 35.455376 22.041878 +v 65.131775 40.553104 24.720850 +v 65.167175 39.824814 24.904867 +v 66.336571 39.950649 25.690052 +v 65.539093 43.439342 21.544811 +v 68.963753 42.184120 18.172934 +v 65.264824 43.065830 20.119164 +v 65.181694 42.823616 19.687042 +v 68.852501 41.372654 17.594639 +v 68.782860 40.440216 17.232672 +v 64.884171 40.918030 18.140526 +v 70.264542 39.950649 24.934376 +v 70.267563 39.699635 24.950079 +v 65.444939 43.376144 21.055380 +v 65.104935 42.528164 19.288065 +v 69.032906 42.528164 18.532389 +v 64.854889 40.440216 17.988346 +v 68.903305 41.796913 17.858751 +v 69.748047 43.252190 22.249683 +v 65.820076 43.252190 23.005358 +v 65.908325 43.067505 23.464048 +v 70.217354 40.921688 24.689085 +v 70.246719 40.444027 24.841728 +v 66.198051 41.800091 24.970051 +v 70.065491 42.186985 23.899725 +v 66.248932 41.376099 25.234510 +v 70.176903 41.376099 24.478834 +v 65.539833 35.455128 21.548632 +v 65.733398 35.391171 22.554787 +v 65.737389 35.300861 22.575521 +v 65.728882 35.518578 22.531309 +v 65.908989 35.828888 23.467525 +v 66.514908 37.884193 26.617046 +v 66.289650 37.976688 25.446163 +v 66.249290 37.522064 25.236374 +v 66.138039 36.710598 24.658079 +v 66.198479 37.097805 24.972261 +v 66.339592 39.699635 25.705755 +v 66.342583 39.449322 25.721308 +v 64.837250 38.944069 17.896637 +v 64.855072 38.450691 17.989285 +v 65.036293 36.707745 18.931288 +v 64.597069 35.766628 16.648207 +v 64.835304 40.196674 17.886539 +v 70.272575 39.697979 24.976152 +v 68.773964 40.193138 17.186436 +v 64.845993 40.193138 17.942112 +v 69.192795 43.065830 19.363487 +v 69.274765 40.145279 19.789566 +v 69.315109 40.439426 19.999262 +v 69.367981 40.671249 20.274107 +v 69.398132 40.759056 20.430815 +v 69.467064 43.439342 20.789135 +v 69.372910 43.376144 20.299704 +v 69.430099 40.826176 20.596979 +v 69.497551 40.894455 20.947596 +v 69.566071 40.871815 21.303759 +v 69.531944 40.894543 21.126377 +v 69.561958 43.439590 21.282381 +v 69.656105 43.376877 21.771769 +v 69.599403 40.826614 21.477009 +v 69.836296 43.067505 22.708372 +v 69.919472 42.825726 23.140736 +v 69.689392 40.565052 21.944761 +v 69.996269 42.530670 23.539925 +v 69.714478 40.440468 22.075167 +v 69.754868 40.146526 22.285120 +v 70.126022 41.800091 24.214375 +v 69.736404 40.300220 22.189165 +v 68.763275 40.196674 17.130863 +v 68.812134 40.918030 17.384850 +v 69.249519 39.807266 19.658356 +v 69.243126 39.264919 19.625113 +v 69.109665 42.823616 18.931366 +v 69.281006 43.250977 19.822021 +v 69.240952 39.446640 19.613817 +v 69.315285 38.454250 20.000172 +v 69.340370 38.329666 20.130575 +v 68.904175 32.857552 17.863255 +v 68.646049 33.219078 16.521528 +v 68.513268 34.768574 15.831351 +v 69.368217 38.222706 20.275343 +v 69.166855 32.604336 19.228642 +v 69.699440 32.428364 21.996990 +v 69.566338 38.023182 21.305166 +v 70.442879 37.884193 25.861370 +v 69.736580 38.595646 22.190054 +v 69.769524 39.981804 22.361311 +v 69.769615 38.914249 22.361794 +v 69.780167 39.808659 22.416618 +v 69.786629 39.629799 22.450226 +v 70.230637 32.695507 24.758162 +v 67.914772 34.928131 12.720387 +v 68.394073 33.686779 15.211790 +v 66.470818 34.145573 26.387878 +v 64.642441 35.766621 16.639477 +v 64.630005 38.559273 16.819387 +v 44.275478 27.861065 12.912979 +v 46.509041 38.329666 24.522942 +v 46.462021 38.594498 24.278538 +v 46.418194 39.807266 24.050722 +v 45.931946 40.196674 21.523230 +v 46.428902 38.912914 24.106392 +v 45.951530 40.440216 21.625038 +v 45.942635 40.193138 21.578802 +v 46.443562 38.748192 24.182585 +v 46.483952 38.454250 24.392538 +v 46.567032 38.135056 24.824387 +v 47.555691 33.147514 29.963390 +v 46.800297 38.135670 26.036888 +v 46.948906 39.087452 26.809347 +v 47.088142 42.825726 27.533102 +v 46.938290 38.914249 26.754160 +v 47.234161 42.186985 28.292091 +v 47.345573 41.376099 28.871201 +v 46.883320 38.455292 26.468443 +v 47.611549 37.884193 30.253736 +v 47.415386 40.444027 29.234095 +v 46.957474 39.448078 26.853886 +v 47.441246 39.697979 29.368519 +v 46.132423 42.184120 22.565300 +v 46.566799 40.759056 24.823181 +v 46.598766 40.826176 24.989346 +v 46.632088 40.871548 25.162539 +v 46.541576 43.376144 24.692070 +v 46.666222 40.894455 25.339962 +v 46.700615 40.894543 25.518744 +v 46.734741 40.871815 25.696125 +v 46.858059 40.565052 26.337128 +v 46.905079 40.300220 26.581532 +v 46.923538 40.146526 26.677486 +v 46.948837 39.808659 26.808985 +v 47.004963 43.067505 27.100739 +v 45.655373 32.515556 20.085615 +v 48.601349 32.515556 19.518858 +v 46.635735 43.439342 25.181501 +v 49.581715 43.439342 24.614744 +v 50.034122 42.825726 26.966345 +v 46.361465 43.065830 23.755854 +v 46.449680 43.250977 24.214388 +v 48.967144 41.372654 21.420248 +v 48.926785 40.918030 21.210459 +v 45.980808 40.918030 21.777216 +v 49.017956 41.796913 21.684361 +v 46.824780 43.376877 26.164135 +v 47.433212 39.950649 29.326742 +v 47.436234 39.699635 29.342445 +v 49.487556 43.376144 24.125313 +v 46.201576 42.528164 22.924755 +v 46.278332 42.823616 23.323732 +v 48.897511 40.440216 21.058281 +v 48.888615 40.193138 21.012045 +v 46.071980 41.796913 22.251118 +v 46.021168 41.372654 21.987005 +v 46.730629 43.439590 25.674747 +v 47.164940 42.530670 27.932291 +v 46.916721 43.252190 26.642050 +v 49.950943 43.067505 26.533981 +v 50.361366 40.444027 28.667337 +v 50.379189 39.950649 28.759985 +v 50.180138 42.186985 27.725334 +v 50.240673 41.800091 28.039984 +v 47.294693 41.800091 28.606741 +v 50.291550 41.376099 28.304443 +v 47.386021 40.921688 29.081451 +v 50.331997 40.921688 28.514694 +v 49.676605 43.439590 25.107990 +v 49.677341 35.455376 25.111813 +v 49.582447 35.455128 24.618565 +v 49.862698 43.252190 26.075293 +v 50.607594 36.733505 25.977272 +v 50.541428 36.594643 25.633348 +v 49.396355 35.642532 23.651264 +v 50.669476 41.981129 26.298937 +v 50.094238 39.628387 23.308878 +v 49.799259 39.445889 21.775591 +v 49.838955 40.550362 21.981924 +v 49.869232 40.891331 22.139292 +v 50.144321 40.299072 23.569202 +v 50.166248 40.439426 23.683182 +v 50.004551 41.757961 22.842676 +v 49.817135 38.699863 21.868494 +v 50.219124 40.671249 23.958029 +v 50.100666 39.807266 23.342276 +v 50.111282 39.980480 23.397465 +v 50.249271 40.759056 24.114737 +v 50.062096 41.979553 23.141790 +v 50.191307 40.564144 23.813421 +v 50.281239 40.826176 24.280899 +v 50.190613 42.300076 23.809828 +v 50.314560 40.871548 24.454092 +v 50.401329 42.441532 24.905123 +v 50.417213 40.871815 24.987679 +v 50.471947 42.394493 25.272188 +v 50.450542 40.826614 25.160929 +v 50.482540 40.759663 25.327238 +v 50.540531 40.565052 25.628683 +v 50.862545 40.893909 27.302488 +v 50.824368 41.211906 27.104046 +v 49.839165 38.341614 21.983002 +v 50.111374 38.912914 23.397947 +v 49.869499 38.000809 22.140690 +v 50.004963 37.134884 22.844826 +v 50.191513 38.329666 23.814495 +v 50.166424 38.454250 23.684092 +v 50.219364 38.222706 23.959265 +v 50.281502 38.068111 24.282249 +v 50.260098 36.500225 24.170990 +v 50.383350 38.000263 24.811661 +v 50.401886 36.453377 24.908012 +v 50.330711 36.453186 24.538054 +v 50.472500 36.500771 25.275061 +v 50.450802 38.068542 25.162279 +v 50.482769 38.135670 25.328442 +v 50.669949 36.915165 26.301388 +v 50.540737 38.330574 25.629755 +v 50.892879 40.553104 27.460176 +v 50.637775 39.629799 26.134146 +v 50.779354 37.394798 26.870068 +v 50.914909 40.194855 27.574684 +v 50.587723 38.595646 25.873976 +v 50.862812 38.003387 27.303885 +v 50.620762 38.914249 26.045713 +v 50.631378 39.087452 26.100901 +v 50.932781 39.448830 27.667585 +v 50.727493 37.136757 26.600500 +v 50.111500 36.366562 27.368559 +v 50.361546 38.454502 28.668276 +v 50.893085 38.344357 27.461254 +v 50.915051 38.702721 27.575411 +v 49.907337 41.209522 22.337376 +v 48.879868 38.944069 20.966570 +v 49.953072 37.392635 22.575094 +v 49.907677 37.682812 22.339132 +v 49.078915 36.707745 22.001223 +v 50.062565 36.913589 23.144239 +v 50.191143 36.593735 23.812578 +v 50.124954 36.732250 23.468536 +v 49.770756 43.376877 25.597380 +v 50.607086 42.162468 25.974642 +v 50.540901 42.300983 25.630598 +v 50.778973 41.502083 26.868084 +v 50.034744 36.071102 26.969580 +v 49.951611 35.828888 26.537458 +v 50.180653 36.710598 27.728012 +v 50.928349 39.072823 27.644539 +v 49.078400 42.184120 21.998545 +v 48.927055 37.973030 21.211861 +v 49.018383 37.094627 21.686571 +v 49.488297 35.517838 24.129177 +v 50.110920 42.530670 27.365534 +v 50.727081 41.759834 26.598352 +v 50.928280 39.824814 27.644192 +v 50.385201 39.449322 28.791241 +v 50.824703 37.685196 27.105803 +v 50.241096 37.097805 28.042196 +v 49.803696 39.821896 21.798639 +v 48.873852 39.445396 20.935314 +v 49.307442 43.065830 23.189098 +v 49.952690 41.499920 22.573111 +v 49.803761 39.069904 21.798986 +v 49.395657 43.250977 23.647631 +v 49.147552 42.528164 22.357998 +v 49.224308 42.823616 22.756975 +v 50.124451 42.161217 23.465906 +v 49.816994 40.191998 21.867767 +v 50.330158 42.441341 24.535164 +v 50.259544 42.393948 24.168116 +v 68.149811 34.257607 13.942123 +v 72.566849 34.970417 11.758610 +v 72.814278 34.257607 13.044758 +v 73.310516 33.219078 15.624163 +v 74.630486 32.506702 22.485336 +v 69.432487 32.460957 20.609421 +v 74.096954 32.460957 19.712055 +v 69.966026 32.506702 23.382702 +v 70.491646 32.993713 26.114845 +v 64.621979 40.894543 22.070972 +v 64.587585 40.894455 21.892191 +v 50.348694 40.894455 24.631517 +v 50.383087 40.894543 24.810297 +v 69.788803 39.448078 22.461519 +v 46.955303 39.629799 26.842592 +v 69.340164 40.564144 20.129501 +v 64.430199 40.564144 21.074097 +v 46.483776 40.439426 24.391628 +v 64.430405 38.329666 21.075171 +v 64.364929 38.748192 20.734812 +v 69.274887 38.748192 19.790218 +v 50.126034 38.748192 23.474138 +v 69.661537 40.672024 21.799994 +v 64.339561 39.807266 20.602951 +v 69.243095 39.628387 19.624958 +v 46.411766 39.628387 24.017324 +v 46.443436 40.145279 24.181932 +v 64.458260 38.222706 21.219938 +v 69.398361 38.135056 20.432020 +v 50.249504 38.135056 24.115940 +v 46.536892 38.222706 24.667709 +v 69.463684 38.022903 20.771578 +v 69.430359 38.068111 20.598330 +v 50.314831 38.022903 24.455498 +v 69.293350 38.594498 19.886171 +v 50.144493 38.594498 23.570091 +v 69.249596 39.086071 19.658720 +v 69.260231 38.912914 19.714025 +v 50.100735 39.086071 23.342640 +v 64.870201 39.808659 23.361214 +v 64.520134 40.826176 21.541573 +v 69.463417 40.871548 20.770172 +v 46.508835 40.564144 24.521868 +v 46.536652 40.671249 24.666473 +v 64.333130 39.628387 20.569553 +v 46.409622 39.446640 24.006184 +v 50.092098 39.446640 23.297737 +v 69.260139 39.980480 19.713545 +v 50.125908 40.145279 23.473488 +v 46.428810 39.980480 24.105911 +v 64.383217 40.299072 20.829878 +v 69.293182 40.299072 19.885283 +v 46.461849 40.299072 24.277649 +v 46.599026 38.068111 24.990696 +v 64.553726 38.022903 21.716173 +v 50.348957 38.000175 24.632881 +v 46.632359 38.022903 25.163944 +v 64.383385 38.594498 20.830767 +v 64.333160 39.264919 20.569706 +v 46.418262 39.086071 24.051086 +v 46.411797 39.264919 24.017479 +v 50.094269 39.264919 23.309032 +v 46.883144 40.440468 26.467533 +v 50.565620 40.440468 25.759087 +v 69.714653 38.455292 22.076077 +v 46.905251 38.595646 26.582420 +v 50.565792 38.455292 25.759996 +v 50.620667 39.981804 26.045231 +v 46.938194 39.981804 26.753677 +v 69.497810 38.000175 20.948959 +v 46.666485 38.000175 25.341326 +v 50.587551 40.300220 25.873085 +v 50.606010 40.146526 25.969040 +v 64.779633 38.330574 22.890430 +v 69.599663 38.068542 21.478359 +v 69.631630 38.135670 21.644522 +v 46.768330 38.068542 25.870726 +v 50.631310 39.808659 26.100538 +v 64.721436 40.759663 22.587912 +v 69.631393 40.759663 21.643318 +v 46.768070 40.826614 25.869375 +v 46.830208 40.672024 26.192360 +v 50.512680 40.672024 25.483913 +v 46.800064 40.759663 26.035685 +v 64.826447 40.300220 23.133760 +v 69.786659 39.266331 22.450378 +v 64.878838 39.448078 23.406115 +v 50.637802 39.266331 26.134300 +v 50.639946 39.448078 26.145439 +v 64.876694 39.266331 23.394974 +v 46.955330 39.266331 26.842745 +v 64.751808 38.223469 22.745825 +v 69.661774 38.223469 21.801229 +v 69.689598 38.330574 21.945835 +v 46.830444 38.223469 26.193596 +v 46.858265 38.330574 26.338202 +v 50.512917 38.223469 25.485149 +v 64.656380 38.023182 22.249760 +v 64.689697 38.068542 22.422955 +v 46.735012 38.023182 25.697533 +v 64.622246 38.000263 22.072336 +v 69.532204 38.000263 21.127741 +v 46.700878 38.000263 25.520107 +v 50.417484 38.023182 24.989086 +v 69.754990 38.749439 22.285770 +v 64.859657 38.914249 23.306389 +v 50.606136 38.749439 25.969690 +v 46.923664 38.749439 26.678137 +v 64.870270 39.087452 23.361576 +v 69.780235 39.087452 22.416981 +v 61.316620 34.574280 6.299973 +v 61.312920 34.574375 6.490880 +v 55.456875 34.574280 7.427290 +v 61.036880 32.926773 4.759091 +v 61.039318 33.133568 4.771767 +v 70.859245 33.133568 2.882577 +v 55.144924 32.926773 5.892605 +v 60.995525 31.783306 7.656045 +v 60.987606 31.798721 7.674161 +v 71.395844 31.798721 5.671790 +v 55.257820 34.198410 6.479429 +v 70.866638 32.516430 2.921004 +v 71.072044 34.496571 3.988700 +v 46.522228 34.496571 8.711675 +v 46.485836 34.420193 8.522511 +v 70.895279 33.721729 3.069858 +v 46.328823 33.534252 7.706368 +v 55.183392 33.721729 6.092562 +v 55.166759 33.534252 6.006098 +v 70.941185 34.056538 3.308511 +v 61.096321 33.896751 5.068068 +v 61.058811 32.319458 4.873092 +v 70.878738 32.319458 2.983902 +v 46.328922 32.319458 7.706877 +v 70.859268 32.719955 2.882709 +v 61.046711 32.516430 4.810194 +v 46.908474 33.535702 10.719367 +v 56.492821 33.535702 8.875499 +v 56.404926 33.723171 8.802396 +v 71.420784 31.958406 5.801417 +v 60.925636 31.958406 7.820507 +v 46.846027 31.798721 10.394764 +v 61.272781 34.524712 5.985285 +v 61.256676 34.524712 5.988383 +v 55.360161 34.496571 7.011404 +v 61.312759 34.574272 6.279903 +v 71.148788 34.574272 4.387615 +v 61.273930 34.548199 6.078078 +v 55.453011 34.574272 7.407220 +v 55.414185 34.548199 7.205395 +v 46.419884 34.198410 8.179700 +v 71.035652 34.420193 3.799536 +v 55.323772 34.420193 6.822240 +v 46.451553 34.320305 8.344303 +v 46.309429 33.133568 7.605552 +v 55.147362 33.133568 5.905281 +v 61.075348 33.721729 4.959048 +v 46.345459 33.721729 7.792832 +v 61.274227 31.306643 6.079606 +v 55.414478 31.306643 7.206923 +v 61.181690 31.534010 5.511811 +v 55.289734 31.534010 6.645325 +v 70.941391 31.797485 3.309555 +v 70.969948 31.655691 3.457995 +v 46.391571 31.797485 8.032529 +v 55.258064 31.655691 6.480699 +v 61.235847 31.392776 5.793306 +v 71.072342 31.358046 3.990242 +v 46.522526 31.358046 8.713217 +v 55.376564 31.358046 7.009848 +v 61.274078 31.280785 6.288991 +v 55.418308 31.304075 7.226835 +v 46.560440 31.306643 8.910293 +v 70.895439 32.131989 3.070702 +v 46.366615 31.957125 7.902797 +v 46.345619 32.131989 7.793677 +v 55.183556 32.131989 6.093406 +v 70.856804 32.926773 2.869901 +v 46.309456 32.719955 7.605683 +v 56.676979 32.928387 8.958290 +v 46.927944 33.135204 10.820560 +v 71.470390 33.338730 6.059290 +v 60.891953 33.535702 8.029180 +v 46.920574 33.338730 10.782265 +v 60.946449 33.723171 7.928683 +v 71.367081 34.199467 5.522300 +v 46.845825 34.057674 10.393715 +v 61.258160 34.420887 7.111399 +v 71.335411 34.321148 5.357674 +v 55.812225 34.420887 8.159105 +v 46.785595 34.321148 10.080648 +v 71.441757 32.133430 5.910437 +v 56.384117 31.958406 8.694220 +v 56.476284 32.133430 8.789543 +v 71.470482 32.518005 6.059753 +v 60.814278 32.320908 8.044650 +v 46.920666 32.518005 10.782727 +v 56.570694 32.320908 8.861045 +v 60.751659 32.928387 8.174390 +v 71.335663 31.534855 5.358966 +v 61.176445 31.434967 7.128626 +v 46.751560 31.434967 9.903733 +v 55.776115 31.358620 7.971396 +v 71.188240 31.280876 4.592679 +v 61.270115 31.280876 6.500761 +v 61.266422 31.306923 6.710764 +v 56.582695 33.338730 8.923434 +v 71.420601 33.898132 5.800478 +v 61.088646 34.057674 7.653634 +v 71.395645 34.057674 5.670740 +v 61.060886 33.999672 7.707832 +v 46.817268 34.199467 10.245275 +v 56.036705 34.199467 8.471608 +v 55.928535 34.321148 8.321699 +v 71.264687 34.497074 4.990050 +v 55.613091 34.548508 7.796787 +v 46.676956 34.548508 9.515950 +v 61.303711 34.490608 6.923106 +v 55.693523 34.497074 7.985682 +v 71.187935 34.574375 4.591091 +v 46.638119 34.574375 9.314066 +v 71.458389 32.320908 5.996901 +v 60.868248 32.168861 7.961548 +v 46.908573 32.320908 10.719875 +v 71.477783 32.721592 6.097717 +v 60.770199 32.518005 8.118308 +v 56.674541 32.721592 8.945614 +v 56.638954 32.518005 8.913091 +v 61.266220 31.311365 6.728227 +v 55.655907 31.306923 7.790134 +v 46.677250 31.306923 9.517477 +v 55.662575 31.311365 7.806274 +v 45.754868 31.906664 4.722975 +v 46.792843 27.567686 6.719300 +v 70.601196 28.748648 1.541240 +v 60.484760 31.906664 1.889190 +v 54.592804 31.906664 3.022704 +v 51.725163 32.743256 35.756310 +v 76.274979 32.743256 31.033335 +v 75.544533 25.600410 33.281940 +v 52.123806 26.241262 37.828434 +v 72.279839 27.965517 28.017206 +v 71.904739 28.001427 27.503540 +v 71.559708 28.020782 27.254135 +v 71.366455 28.028603 27.163761 +v 70.953598 28.039904 27.058821 +v 70.527489 28.044874 27.059690 +v 67.170486 28.113617 26.584072 +v 69.045937 27.965517 28.639355 +v 69.125305 27.990200 28.221403 +v 69.203674 28.001427 28.023180 +v 69.306305 28.011675 27.836245 +v 69.577461 28.028603 27.507933 +v 69.921913 28.039904 27.257298 +v 69.741806 28.035006 27.371834 +v 70.114883 28.043211 27.166206 +v 72.439278 27.912836 28.845966 +v 72.412743 27.900188 29.057392 +v 72.359901 27.888153 29.263918 +v 72.178909 27.866678 29.649078 +v 71.743401 27.843346 30.113489 +v 71.370232 27.835142 30.319136 +v 71.167282 27.833479 30.385315 +v 69.073219 27.939177 29.063824 +v 68.226372 27.764736 32.072548 +v 69.205376 27.912836 29.468115 +v 70.531616 27.838449 30.426502 +v 70.744606 27.835142 30.439495 +v 70.321869 27.843346 30.386969 +v 69.925507 27.857569 30.231188 +v 69.745140 27.866678 30.117294 +v 69.580475 27.876926 29.981783 +v 69.434158 27.888153 29.826784 +v 67.195198 30.209538 26.712547 +v 71.908768 30.209538 25.805735 +v 72.964653 29.860657 31.294212 +v 72.943474 28.064154 31.184092 +v 68.251091 29.860657 32.201023 +v 68.569992 30.209538 26.448061 +v 71.887581 28.413034 25.695614 +v 57.682102 27.939177 31.255283 +v 57.321167 27.990200 30.492323 +v 57.174850 28.001427 30.337324 +v 57.010181 28.011675 30.201813 +v 56.829819 28.020782 30.087919 +v 56.433453 28.035006 29.932138 +v 55.797596 28.044874 29.893476 +v 55.588039 28.044874 29.933792 +v 55.385090 28.043211 29.999971 +v 54.316307 27.952452 31.686220 +v 54.316055 27.965517 31.473139 +v 54.395416 27.990200 31.055189 +v 54.576412 28.011675 30.670029 +v 54.701645 28.020782 30.497345 +v 55.011921 28.035006 30.205618 +v 55.192024 28.039904 30.091084 +v 57.709126 27.925900 31.466671 +v 57.709385 27.912836 31.679752 +v 57.630016 27.888153 32.097702 +v 57.551651 27.876926 32.295929 +v 59.584839 27.764736 33.735035 +v 57.449020 27.866678 32.482864 +v 56.640343 27.835142 33.152920 +v 56.437393 27.833479 33.219101 +v 56.227837 27.833479 33.259415 +v 54.343330 27.939177 31.897608 +v 50.574806 28.113617 29.776804 +v 54.578556 27.900188 32.488392 +v 55.015247 27.866678 32.951080 +v 58.234764 29.860657 34.127998 +v 53.840099 30.209538 29.281845 +v 50.599525 30.209538 29.905277 +v 53.818913 28.413034 29.171724 +v 58.528950 28.113617 28.246559 +v 57.157688 28.413034 28.529400 +v 58.553665 30.209538 28.375034 +v 58.213581 28.064154 34.017876 +v 59.609554 29.860657 33.863510 +v 51.655415 29.860657 35.393753 +v 69.604698 28.064154 31.826416 +v 72.962326 28.057924 31.282099 +v 69.623550 28.057924 31.924423 +v 69.104996 30.633932 29.229004 +v 68.780930 30.440424 27.544506 +v 69.422005 30.228603 30.876797 +v 69.625877 29.860657 31.936537 +v 68.548805 28.413034 26.337940 +v 69.648270 30.153843 32.052898 +v 72.760780 30.228603 30.234472 +v 71.893440 30.515184 25.726080 +v 68.554665 30.515184 26.368404 +v 68.529945 28.419264 26.239931 +v 71.868721 28.419264 25.597607 +v 72.119705 30.440424 26.902182 +v 72.443771 30.633932 28.586679 +v 72.987045 30.153843 31.410572 +v 72.764313 30.528021 30.252825 +v 72.471054 30.607592 29.011148 +v 72.470795 30.620655 28.798069 +v 72.391685 30.582907 29.429100 +v 72.210686 30.561432 29.814259 +v 72.313316 30.571682 29.627323 +v 71.775185 30.538101 30.278669 +v 71.595078 30.533205 30.393206 +v 69.425537 30.528021 30.895151 +v 69.776917 30.561432 30.282476 +v 69.340240 30.594944 29.819784 +v 72.123238 30.739841 26.920534 +v 72.390434 30.647207 28.380356 +v 72.208527 30.672918 27.995901 +v 71.771851 30.706430 27.533209 +v 71.398232 30.723356 27.328941 +v 71.195122 30.729761 27.263535 +v 70.772285 30.737967 27.211027 +v 68.784454 30.739841 27.562859 +v 69.773590 30.729761 27.537014 +v 69.609238 30.723356 27.673115 +v 69.235451 30.696182 28.188360 +v 69.338081 30.706430 28.001427 +v 69.077972 30.647207 29.017616 +v 58.232433 28.057924 34.115883 +v 54.051037 30.440424 30.378290 +v 53.824776 30.515184 29.202190 +v 53.800060 28.419264 29.073715 +v 54.692116 30.228603 33.710583 +v 54.893661 28.057924 34.758209 +v 54.895992 29.860657 34.770321 +v 54.918377 30.153843 34.886681 +v 54.874805 28.064154 34.660202 +v 58.257153 30.153843 34.244358 +v 57.389812 30.440424 29.735966 +v 57.163551 30.515184 28.559864 +v 57.138832 28.419264 28.431391 +v 57.178875 30.209538 28.639521 +v 57.661793 30.582907 32.262886 +v 57.583431 30.571682 32.461109 +v 57.355564 30.552324 32.820728 +v 58.034420 30.528021 33.086609 +v 56.672123 30.529896 33.318100 +v 54.695644 30.528021 33.728935 +v 55.420643 30.544506 33.320526 +v 55.047028 30.561432 33.116261 +v 54.736042 30.582907 32.825748 +v 54.882362 30.571682 32.980751 +v 54.507275 30.607592 32.467079 +v 54.375107 30.633932 32.062790 +v 57.581722 30.660273 31.016172 +v 55.829376 30.739630 30.058657 +v 57.393345 30.739841 29.754320 +v 55.223801 30.734657 30.256264 +v 54.374340 30.672918 31.426899 +v 54.054569 30.739841 30.396645 +v 54.348083 30.647207 31.851400 +v 58.030888 30.228603 33.068256 +v 72.358658 27.952452 28.215174 +v 72.411995 27.939177 28.421499 +v 69.126556 27.925900 29.270149 +v 69.067329 27.440147 29.033234 +v 71.161400 27.334450 30.354727 +v 70.957726 27.833479 30.425631 +v 70.951836 27.334450 30.395042 +v 69.919617 27.358541 30.200598 +v 69.739250 27.367649 30.086706 +v 69.780449 30.860849 30.300829 +v 69.431534 28.020782 27.663559 +v 69.777115 31.029179 27.555368 +v 69.302582 27.401161 29.624014 +v 69.469467 30.882324 30.010319 +v 70.947708 27.540874 27.028231 +v 71.157455 27.535978 27.067764 +v 70.985374 30.734657 27.224001 +v 70.988907 31.034075 27.242355 +v 69.072472 27.978165 28.427931 +v 69.157089 30.684956 28.386585 +v 69.104248 30.672918 28.593111 +v 69.735924 27.535978 27.341244 +v 69.953697 30.734657 27.422480 +v 70.150192 31.037384 27.349741 +v 71.907753 27.849751 29.977388 +v 70.315987 27.344318 30.356379 +v 70.563393 30.533205 30.591682 +v 70.154068 30.843924 30.505096 +v 69.960815 30.851742 30.414722 +v 69.957283 30.552324 30.396368 +v 69.199493 27.413807 29.437527 +v 69.308464 27.900188 29.654604 +v 72.311615 30.660273 28.182388 +v 71.740074 28.011675 27.368027 +v 71.734192 27.512646 27.337439 +v 71.591484 30.715538 27.419315 +v 71.898857 27.502398 27.472950 +v 72.045174 27.491171 27.627949 +v 72.051056 27.990200 27.658539 +v 71.936516 30.696182 27.668720 +v 72.082832 30.684956 27.823719 +v 70.734627 27.544182 27.015257 +v 70.740509 28.043211 27.045845 +v 70.775818 31.037384 27.229380 +v 70.317932 28.044874 27.100006 +v 70.349709 30.739630 27.265188 +v 70.559265 30.739630 27.224873 +v 71.163345 28.035006 27.098354 +v 71.401764 31.022774 27.347296 +v 69.040314 27.453424 28.821846 +v 69.081505 30.946625 29.035971 +v 69.160614 30.984373 28.404938 +v 69.040054 27.466488 28.608767 +v 69.077713 30.660273 28.804537 +v 69.046196 27.952452 28.852436 +v 69.463310 30.715538 27.828741 +v 69.466843 31.014956 27.847094 +v 69.612770 31.022774 27.691467 +v 70.108994 27.544182 27.135616 +v 70.146660 30.737967 27.331387 +v 71.402016 30.529896 30.484316 +v 71.202591 30.827650 30.568850 +v 71.199059 30.528233 30.550497 +v 71.778709 30.837519 30.297024 +v 72.047791 27.358541 29.791174 +v 72.085457 30.552324 29.986944 +v 72.088989 30.851742 30.005297 +v 71.943062 30.843924 30.160923 +v 71.939529 30.544506 30.142570 +v 72.173027 27.367649 29.618488 +v 72.316849 30.871098 29.645678 +v 72.444519 30.594944 29.222574 +v 70.118759 27.849751 30.321562 +v 70.112869 27.350721 30.290972 +v 70.353645 30.538101 30.552149 +v 70.150536 30.544506 30.486742 +v 70.566925 30.832623 30.610037 +v 70.989502 30.528233 30.590813 +v 70.776382 30.529896 30.604677 +v 69.465935 30.582907 29.991964 +v 69.574585 27.377897 29.951195 +v 69.612251 30.571682 30.146965 +v 69.120674 27.426872 29.239559 +v 69.158333 30.620655 29.435329 +v 69.240685 30.907009 29.651649 +v 69.237152 30.607592 29.633297 +v 72.170860 27.479136 27.800131 +v 72.176750 27.978165 27.830719 +v 72.212059 30.972336 28.014254 +v 71.775383 31.005848 27.551561 +v 70.562798 31.039047 27.243225 +v 71.563293 27.838449 30.228024 +v 71.598602 30.832623 30.411558 +v 72.053680 27.857569 29.821762 +v 72.275658 27.377897 29.431553 +v 72.281540 27.876926 29.462143 +v 72.439018 27.925900 28.632887 +v 57.622879 27.453424 31.018370 +v 57.676220 27.440147 31.224695 +v 54.396667 27.925900 32.103931 +v 56.469170 30.528233 33.384281 +v 56.263145 30.827650 33.442951 +v 56.259613 30.528233 33.424599 +v 55.189728 27.358541 33.034382 +v 55.227390 30.552324 33.230152 +v 54.736954 31.014956 30.680880 +v 55.006035 27.535978 30.175030 +v 55.227333 31.034075 30.274618 +v 55.043697 30.729761 30.370800 +v 54.704266 27.888153 32.660568 +v 54.610332 30.594944 32.653572 +v 56.223705 28.039904 29.892605 +v 56.217823 27.540874 29.862017 +v 56.427567 27.535978 29.901550 +v 56.468761 31.029179 30.115673 +v 56.255486 30.734657 30.057787 +v 56.465229 30.729761 30.097321 +v 56.630680 27.529573 29.966957 +v 54.342564 27.978165 31.261719 +v 54.336678 27.479136 31.231129 +v 54.427197 30.684956 31.220369 +v 54.847572 28.028603 30.341719 +v 54.841686 27.529573 30.311129 +v 54.879349 30.723356 30.506899 +v 55.186138 27.540874 30.060493 +v 55.379204 27.544182 29.969383 +v 55.416866 30.737967 30.165154 +v 57.013512 27.843346 32.947273 +v 57.213169 30.843924 32.994709 +v 57.048820 30.837519 33.130810 +v 57.209641 30.544506 32.976357 +v 55.586098 27.344318 33.190163 +v 55.833504 30.533205 33.425468 +v 55.627289 30.837519 33.404289 +v 55.623760 30.538101 33.385933 +v 55.195614 27.857569 33.064972 +v 55.230923 30.851742 33.248508 +v 54.469612 27.413807 32.271309 +v 54.510807 30.907009 32.485432 +v 57.549946 27.965517 30.850992 +v 57.628765 27.952452 31.048958 +v 57.660542 30.647207 31.214140 +v 57.585255 30.959690 31.034527 +v 57.356476 30.984373 30.675858 +v 57.478638 30.672918 30.829685 +v 56.861599 30.715538 30.253101 +v 57.041962 30.706430 30.366993 +v 57.210159 30.995600 30.520859 +v 57.352943 30.684956 30.657505 +v 55.619820 30.739630 30.098972 +v 56.636566 28.028603 29.997545 +v 56.668343 30.723356 30.162727 +v 54.347836 30.660273 31.638319 +v 54.467896 27.502398 30.826376 +v 54.389534 27.491171 31.024599 +v 54.505558 30.696182 31.022146 +v 54.473782 28.001427 30.856964 +v 54.608192 30.706430 30.835211 +v 54.310173 27.466488 31.442549 +v 54.351364 30.959690 31.656673 +v 54.695759 27.521755 30.466755 +v 54.733421 30.715538 30.662525 +v 55.623348 31.039047 30.117327 +v 57.713882 30.633932 31.420465 +v 57.740902 30.620655 31.631853 +v 56.431507 27.334450 33.188511 +v 56.833408 27.838449 33.061810 +v 57.045292 30.538101 33.112453 +v 56.865185 30.533205 33.226990 +v 57.177860 27.849751 32.811172 +v 57.359097 30.851742 32.839081 +v 57.682850 27.900188 31.891176 +v 57.714626 30.594944 32.056358 +v 57.676964 27.401161 31.860588 +v 57.744694 30.907009 31.863287 +v 57.718159 30.894361 32.074711 +v 55.591980 27.843346 33.220753 +v 55.388866 27.849751 33.155346 +v 55.424175 30.843924 33.338882 +v 55.801727 27.838449 33.260288 +v 56.014816 27.835142 33.273262 +v 56.050125 30.829313 33.456795 +v 56.046593 30.529896 33.438442 +v 54.850582 27.876926 32.815567 +v 54.844696 27.377897 32.784981 +v 55.050560 30.860849 33.134613 +v 54.475498 27.912836 32.301899 +v 54.428448 30.620655 32.269115 +v 57.440971 27.479136 30.633915 +v 57.446857 27.978165 30.664505 +v 57.206627 30.696182 30.502504 +v 55.791714 27.545847 29.862886 +v 56.010616 28.043211 29.879631 +v 56.004734 27.544182 29.849041 +v 56.045925 31.037384 30.063166 +v 56.042397 30.737967 30.044811 +v 56.675652 30.829313 33.336456 +v 57.323788 27.857569 32.655548 +v 57.317902 27.358541 32.624958 +v 57.480797 30.561432 32.648045 +v 57.484329 30.860849 32.666397 +v 57.545769 27.377897 32.265339 +v 57.703499 27.413807 31.649162 +v 57.741161 30.607592 31.844933 +v 73.133041 25.948370 28.069304 +v 68.864822 26.065239 26.983849 +v 72.354019 27.389124 29.233330 +v 72.406853 27.401161 29.026802 +v 73.155472 25.886189 29.079416 +v 72.433388 27.413807 28.815378 +v 72.352768 27.453424 28.184586 +v 71.360573 27.529573 27.133171 +v 71.414162 26.080296 26.247744 +v 71.026947 26.090002 26.163887 +v 71.110840 26.088047 26.179663 +v 72.418747 25.812611 30.421471 +v 73.194214 25.904634 28.771019 +v 72.678169 26.012682 27.107624 +v 72.920380 25.986547 27.487391 +v 71.983307 26.058466 26.494383 +v 69.803406 26.094831 26.320511 +v 70.099487 26.097260 26.223911 +v 70.521606 27.545847 27.029102 +v 70.312042 27.545847 27.069418 +v 70.405281 26.097260 26.165081 +v 68.272964 25.948370 29.004301 +v 68.243927 25.981487 28.469589 +v 68.442665 26.029385 27.649981 +v 68.359734 26.017492 27.859955 +v 69.119423 27.491171 28.190815 +v 70.525734 27.339420 30.395912 +v 70.496414 25.794794 31.081974 +v 71.032852 25.788862 31.075527 +v 68.517754 25.899576 29.753220 +v 68.305092 25.937754 29.171307 +v 72.244850 25.805826 30.565607 +v 72.179062 25.803261 30.620136 +v 72.814415 25.837296 29.942667 +v 71.901863 27.350721 29.946800 +v 72.964188 25.852247 29.669930 +v 73.099586 25.873442 29.298115 +v 73.078400 25.868631 29.380653 +v 72.414482 26.033876 26.812588 +v 72.348557 26.037975 26.758394 +v 72.472954 26.029385 26.874619 +v 72.627869 26.017492 27.038837 +v 72.174210 26.048828 26.614885 +v 71.332840 26.082863 26.221514 +v 71.553825 27.521755 27.223545 +v 69.449699 26.088047 26.499239 +v 69.916031 27.540874 27.226709 +v 69.884560 26.095497 26.294022 +v 70.941620 26.091330 26.158655 +v 68.244370 25.962425 28.780510 +v 69.425652 27.521755 27.632971 +v 68.473946 26.033876 27.570681 +v 69.197784 27.502398 27.992590 +v 68.282661 25.999935 28.161194 +v 69.066589 27.479136 28.397341 +v 70.738724 27.336113 30.408907 +v 69.428268 27.389124 29.796194 +v 68.444992 25.909863 29.599417 +v 71.364349 27.336113 30.288546 +v 71.634727 25.791292 30.920099 +v 71.839088 25.794794 30.823664 +v 71.557411 27.339420 30.197435 +v 71.916382 25.796120 30.787148 +v 71.737518 27.344318 30.082899 +v 73.193764 25.923698 28.460100 +v 72.406113 27.440147 28.390909 +v 73.154411 25.943062 28.151785 +v 72.433128 27.426872 28.602299 +v 72.961609 25.981487 27.561985 +v 72.273949 27.466488 27.986618 +v 69.193283 26.080296 26.675001 +v 69.571579 27.529573 27.477345 +v 69.019287 26.073511 26.819159 +v 69.300415 27.512646 27.805655 +v 70.722069 25.791292 31.095680 +v 72.573311 25.820885 30.256760 +v 72.681854 25.827658 30.125401 +v 69.259071 26.082863 26.620474 +v 58.424519 25.943062 30.985571 +v 57.258545 25.798077 33.575157 +v 55.597404 25.798077 33.894730 +v 58.348507 25.868631 32.214439 +v 58.453705 25.899576 31.689375 +v 57.544060 27.466488 30.820402 +v 58.346668 25.962425 30.684662 +v 56.602951 26.082863 29.055300 +v 56.380947 26.088047 29.013447 +v 55.369595 26.097260 29.057695 +v 55.382980 27.350721 33.124756 +v 57.171974 27.350721 32.780586 +v 58.190487 25.986547 30.321175 +v 57.004299 27.512646 30.171223 +v 57.253414 26.058466 29.328167 +v 55.073513 26.094831 29.154295 +v 53.744095 26.033876 30.404459 +v 53.608658 26.012682 30.776279 +v 53.629807 26.017492 30.693748 +v 53.896976 25.886189 32.784428 +v 54.337444 27.440147 31.867020 +v 54.310421 27.453424 31.655630 +v 53.543034 25.948370 31.838093 +v 53.575165 25.937754 32.005100 +v 54.390781 27.426872 32.073345 +v 53.631645 25.923698 32.223526 +v 57.449173 25.803261 33.453922 +v 57.007629 27.344318 32.916683 +v 57.443134 27.367649 32.452274 +v 58.084530 25.837296 32.776451 +v 57.624130 27.389124 32.067116 +v 58.425587 25.886189 31.913200 +v 58.464214 25.909863 31.519552 +v 57.315281 27.491171 30.461735 +v 57.743065 26.029385 29.708405 +v 57.168964 27.502398 30.306734 +v 56.823933 27.521755 30.057331 +v 55.154671 26.095497 29.127806 +v 55.582157 27.545847 29.903202 +v 56.211830 26.091330 28.992420 +v 56.297058 26.090002 28.997673 +v 55.900986 26.095497 28.984228 +v 53.893787 26.048828 30.131733 +v 53.785137 26.037975 30.329685 +v 54.134899 26.065239 29.817640 +v 53.524647 25.986547 31.218805 +v 55.795841 27.339420 33.229698 +v 53.787865 25.899576 32.587002 +v 54.572670 27.401161 32.457802 +v 54.698380 27.389124 32.629978 +v 54.030071 25.873442 32.966770 +v 54.235268 25.856739 33.199780 +v 54.293797 25.852247 33.261799 +v 55.009365 27.367649 32.920490 +v 54.724979 25.827658 33.580006 +v 53.715111 25.909863 32.433201 +v 53.746639 25.904634 32.512405 +v 53.553837 25.943062 31.922609 +v 57.901814 25.824013 33.028290 +v 56.634460 27.336113 33.122330 +v 57.186497 25.796120 33.620930 +v 56.827522 27.339420 33.031219 +v 58.234299 25.852247 32.503712 +v 57.703239 27.426872 31.436083 +v 58.231724 25.981487 30.395771 +v 57.897980 26.017492 29.872623 +v 54.289398 26.073511 29.652943 +v 54.570530 27.512646 30.639441 +v 56.221951 27.334450 33.228828 +v 56.008930 27.336113 33.242672 +v 55.992176 25.791292 33.929466 +v 57.843426 25.820885 33.090546 +v 55.294083 25.805826 33.826653 +v 72.689682 32.936100 28.577045 +v 69.957222 31.034075 27.440832 +v 69.108528 30.933350 29.247358 +v 68.913231 32.922829 29.520058 +v 68.855606 32.944691 29.174501 +v 68.873070 32.936100 29.311298 +v 72.655136 32.944691 28.443537 +v 69.657249 32.846298 30.625416 +v 72.717247 32.884747 29.409529 +v 69.370560 33.026978 27.733027 +v 69.653427 33.039387 27.476149 +v 72.393967 30.946625 28.398708 +v 69.237755 32.876957 30.205971 +v 72.448051 30.894361 29.240927 +v 69.547142 33.035244 27.564184 +v 69.770012 33.042557 27.401987 +v 70.803802 32.810127 30.994938 +v 72.447304 30.933350 28.605034 +v 72.474327 30.920073 28.816422 +v 72.656609 32.870937 29.646420 +v 71.832893 32.816372 30.695118 +v 69.081245 30.959690 28.822889 +v 68.855453 32.953144 29.036612 +v 68.886566 32.929462 29.416945 +v 69.238983 30.995600 28.206715 +v 69.234924 33.018517 27.897144 +v 70.353241 31.039047 27.283541 +v 70.314301 33.050713 27.164234 +v 72.134529 33.000874 27.627140 +v 71.415482 33.035244 27.204746 +v 70.454575 32.816372 30.960283 +v 70.357178 30.837519 30.570503 +v 69.864136 32.835857 30.755957 +v 69.468384 32.858055 30.469965 +v 69.038193 32.899254 29.880606 +v 69.343773 30.894361 29.838139 +v 72.474586 30.907009 29.029501 +v 72.747452 32.905785 29.060493 +v 72.605949 32.863670 29.774776 +v 72.214218 30.860849 29.832613 +v 72.566765 32.858055 29.873888 +v 72.395218 30.882324 29.447453 +v 72.682976 32.876957 29.543167 +v 69.107780 30.972336 28.611465 +v 69.341614 31.005848 28.019779 +v 69.297539 33.023071 27.810801 +v 70.661209 33.049877 27.111113 +v 71.198654 31.029179 27.281889 +v 70.779915 30.829313 30.623030 +v 69.615784 30.871098 30.165318 +v 72.137970 32.826893 30.464764 +v 71.949486 32.819542 30.620956 +v 72.055763 32.823685 30.532921 +v 72.367989 32.840412 30.199961 +v 72.086365 30.984373 27.842073 +v 71.595016 31.014956 27.437670 +v 71.738770 33.023071 27.341148 +v 71.945656 33.012627 27.471689 +v 71.043518 33.045006 27.117043 +v 71.148338 33.042557 27.136820 +v 69.161865 30.920073 29.453684 +v 70.559395 32.813923 30.980062 +v 69.550751 32.852936 30.537661 +v 71.405540 30.829313 30.502670 +v 71.646355 32.812271 30.797882 +v 71.390076 32.809052 30.899731 +v 71.048218 32.808216 30.979116 +v 72.305374 32.835857 30.286304 +v 72.315147 30.959690 28.200741 +v 71.940048 30.995600 27.687075 +v 70.941696 32.809052 30.985991 +v 70.993034 30.827650 30.609165 +v 54.357590 33.005993 30.963581 +v 54.156677 32.929462 32.250729 +v 54.378639 30.933350 32.081142 +v 54.431976 30.920073 32.287468 +v 57.635265 32.981972 30.724920 +v 54.143177 32.936100 32.145084 +v 57.874226 32.953144 31.149218 +v 57.987358 32.884747 32.243313 +v 54.817253 33.035244 30.397968 +v 55.047230 31.029179 30.389153 +v 56.685593 33.035244 30.038530 +v 54.426495 32.884747 32.928364 +v 58.004532 32.892925 32.106560 +v 54.189991 32.981972 31.387732 +v 54.138645 32.966003 31.658104 +v 55.040123 33.042557 30.235771 +v 55.584408 33.050713 29.998020 +v 55.824802 33.050713 29.951773 +v 55.832905 31.039047 30.077011 +v 56.211807 32.809052 33.819775 +v 54.739574 30.882324 32.844105 +v 54.570660 32.870937 33.125854 +v 57.717411 30.933350 31.438818 +v 57.744434 30.920073 31.650206 +v 54.125698 32.944691 32.008289 +v 54.351616 30.946625 31.869755 +v 54.216408 32.987988 31.284470 +v 54.267094 32.995258 31.156109 +v 54.430725 30.984373 31.238724 +v 54.505032 33.018517 30.730928 +v 54.611721 31.005848 30.853563 +v 54.882881 31.022774 30.525253 +v 56.069214 33.048801 29.935953 +v 56.671875 31.022774 30.181080 +v 55.134247 32.835857 33.589741 +v 54.885891 30.871098 32.999104 +v 54.820824 32.852936 33.371452 +v 54.613865 30.894361 32.671925 +v 54.359818 32.892925 32.807743 +v 54.308266 32.899254 32.714397 +v 58.017681 32.899254 32.000771 +v 56.660187 32.809052 33.733517 +v 57.103004 32.816372 33.528904 +v 57.785500 32.852936 32.801102 +v 57.665325 30.882324 32.281239 +v 57.586960 30.871098 32.479462 +v 57.836872 32.858055 32.707672 +v 57.953087 32.876957 32.376953 +v 57.926720 32.870937 32.480206 +v 54.125408 32.959675 31.763912 +v 54.377872 30.972336 31.445253 +v 54.509090 30.995600 31.040499 +v 54.567650 33.023071 30.644585 +v 55.420399 31.037384 30.183506 +v 57.572468 32.987988 30.638821 +v 57.045490 31.005848 30.385347 +v 56.259014 31.034075 30.076139 +v 55.931320 33.049877 29.944899 +v 54.217865 32.914238 32.487358 +v 55.837036 30.832623 33.443821 +v 55.936039 32.812271 33.820282 +v 55.829506 32.813923 33.813847 +v 55.230915 32.831951 33.634872 +v 54.738510 32.858055 33.303745 +v 57.719166 32.846298 32.922104 +v 57.477795 32.995258 30.538424 +v 57.783360 32.966003 30.956921 +v 57.482166 30.972336 30.848040 +v 56.912216 33.026978 30.129803 +v 56.865128 31.014956 30.271454 +v 57.008881 33.023071 30.174932 +v 56.313625 33.045006 29.950829 +v 56.418449 33.042557 29.970606 +v 55.457539 32.823685 33.726143 +v 55.355911 32.826893 33.693352 +v 56.868717 30.832623 33.245342 +v 57.013000 32.813923 33.586163 +v 56.916462 32.812271 33.631668 +v 56.472702 30.827650 33.402634 +v 56.318329 32.808216 33.812901 +v 57.834824 32.959675 31.050283 +v 57.664074 30.946625 31.232492 +v 57.404636 33.000874 30.460924 +v 66.344604 39.697979 25.731829 +v 45.726643 38.559273 20.456078 +v 68.557976 38.559273 16.063711 +v 59.756031 34.946129 14.619476 +v 57.905457 27.120533 11.876236 +v 65.778191 34.374424 22.787634 +v 65.364769 34.357391 23.145042 +v 55.329880 34.385426 24.618225 +v 64.885788 34.768574 16.529219 +v 65.773750 35.392830 22.519989 +v 65.713318 35.397808 22.450407 +v 64.642441 35.766628 16.639479 +v 61.281570 34.189182 26.674751 +v 64.857506 34.777916 16.382204 +v 61.639938 26.055202 28.537531 +v 47.359364 27.719242 12.310676 +v 50.426838 26.801964 29.007669 +v 69.590553 27.567686 2.333402 +v 70.554688 33.050713 27.117987 +v 70.212830 33.049877 27.197374 +v 70.081459 33.048801 27.240231 +v 69.956558 33.046658 27.299223 +v 69.860016 33.045006 27.344728 +v 69.464935 33.032036 27.632341 +v 57.215771 33.012627 30.305473 +v 69.153854 33.012627 28.008785 +v 68.919930 32.981972 28.553938 +v 68.855339 32.959675 28.930120 +v 57.986450 32.929462 31.513945 +v 57.925243 32.944691 31.277321 +v 68.885658 32.974182 28.687576 +v 57.716671 32.974182 30.836304 +v 68.946297 32.987988 28.450686 +v 69.036140 33.000874 28.223217 +v 69.087517 33.005993 28.129789 +v 57.959789 32.936100 31.410831 +v 68.868484 32.966003 28.824327 +v 68.996964 32.995258 28.322329 +v 57.322266 33.005993 30.393229 +v 57.099064 33.018517 30.231880 +v 56.787216 33.032036 30.071323 +v 56.554234 33.039387 29.996216 +v 70.387024 33.147514 25.571024 +v 56.207088 33.046658 29.944391 +v 55.226669 33.046658 30.133007 +v 54.155811 32.974182 31.521353 +v 54.125526 32.953144 31.870403 +v 50.501671 33.147514 29.396635 +v 54.306274 33.000874 31.056999 +v 54.423965 33.012627 30.842569 +v 54.735046 33.032036 30.466125 +v 54.640671 33.026978 30.566811 +v 54.923534 33.039387 30.309935 +v 55.130127 33.045006 30.178513 +v 55.351574 33.048801 30.074015 +v 55.482941 33.049877 30.031158 +v 72.564713 32.959675 28.216497 +v 72.604118 32.953144 28.315432 +v 72.446564 32.974182 28.002518 +v 72.513252 32.966003 28.123137 +v 72.302361 32.987988 27.805037 +v 72.365158 32.981972 27.891134 +v 75.218338 33.092384 25.540936 +v 72.207687 32.995258 27.704639 +v 72.052155 33.005993 27.559443 +v 71.828957 33.018517 27.398094 +v 71.642105 33.026978 27.296019 +v 71.517105 33.032036 27.237537 +v 70.553871 33.092384 26.438301 +v 71.284119 33.039387 27.162430 +v 70.936981 33.046658 27.110605 +v 70.799103 33.048801 27.102167 +v 72.729843 32.922829 28.785805 +v 72.716339 32.929462 28.680161 +v 72.747299 32.914238 28.922602 +v 72.734421 32.892925 29.272776 +v 72.747574 32.899254 29.166985 +v 72.515388 32.852936 29.967316 +v 72.449051 32.846298 30.088320 +v 72.232353 32.831951 30.364079 +v 71.742889 32.813923 30.752377 +v 71.521446 32.810127 30.856874 +v 71.288612 32.808216 30.932869 +v 57.575481 32.835857 33.120090 +v 57.999950 32.922829 31.619591 +v 68.947769 32.914238 29.653568 +v 58.017410 32.914238 31.756388 +v 68.998795 32.905785 29.781673 +v 58.017563 32.905785 31.894278 +v 69.089661 32.892925 29.973969 +v 69.156349 32.884747 30.094587 +v 69.300552 32.870937 30.292068 +v 69.395226 32.863670 30.392466 +v 57.876057 32.863670 32.608562 +v 57.638096 32.840412 33.033745 +v 69.773956 32.840412 30.699009 +v 69.960800 32.831951 30.801086 +v 57.502460 32.831951 33.197865 +v 70.085800 32.826893 30.859566 +v 70.187431 32.823685 30.892359 +v 57.325878 32.823685 33.366707 +v 70.318787 32.819542 30.934675 +v 57.408081 32.826893 33.298550 +v 57.219593 32.819542 33.454739 +v 70.665932 32.812271 30.986498 +v 56.791557 32.810127 33.690659 +v 56.558720 32.808216 33.766655 +v 54.507816 32.876957 33.039764 +v 54.183338 32.922829 32.353844 +v 54.268864 32.905785 32.615463 +v 56.073917 32.810127 33.828720 +v 55.724682 32.816372 33.794067 +v 55.588898 32.819542 33.768459 +v 55.044064 32.840412 33.532795 +v 54.927361 32.846298 33.459202 +v 54.665352 32.863670 33.226246 +v 47.791321 32.554409 23.248281 +v 48.639805 32.274055 27.658665 +v 47.329750 34.144943 21.907705 +v 47.370945 37.638145 22.121828 +v 48.502254 37.264343 28.002338 +v 48.698654 37.264343 27.964556 +v 47.567341 37.638145 22.084045 +v 48.443409 32.274055 27.696447 +v 69.065254 32.274055 23.729149 +v 67.933945 32.647858 17.848639 +v 69.124100 37.264343 24.035040 +v 69.320503 37.264343 23.997257 +v 68.189186 37.638145 18.116745 +v 69.261650 32.274055 23.691366 +v 67.992790 37.638145 18.154530 +v 68.130341 32.647858 17.810854 +v 59.409355 27.286600 8.877703 +v 55.492302 31.280785 7.401309 +v 55.574558 31.280876 7.596490 +v 55.372860 27.449877 6.990583 +v 55.496300 37.917774 7.632237 +v 55.570572 37.917866 7.808144 +v 55.531143 34.574375 7.603197 +v 55.739853 37.864441 8.207960 +v 55.700066 34.490608 8.001154 +v 61.077744 27.375963 7.098868 +v 61.134232 31.534855 7.321551 +v 61.127060 31.557924 7.355211 +v 61.165653 34.199467 7.484885 +v 61.200024 37.745140 7.734471 +v 56.505417 33.498474 8.885402 +v 56.646233 33.135204 8.950924 +v 56.489738 32.168861 8.803900 +v 56.142513 31.656748 8.452569 +v 56.272274 31.798721 8.581312 +v 56.432846 27.344353 8.508171 +v 55.975113 27.375963 8.080529 +v 56.553570 37.581589 9.135686 +v 56.316475 37.683620 8.918522 +v 56.170826 34.057674 8.599740 +v 56.297031 33.898132 8.710000 +v 55.313728 27.469414 6.683230 +v 55.359997 31.392776 6.923721 +v 55.436939 37.917618 7.323677 +v 58.218220 37.150532 9.707748 +v 57.562119 27.298674 9.036112 +v 57.679352 37.239975 9.645487 +v 56.969593 27.318205 8.831476 +v 58.184422 27.286600 9.113360 +v 55.894501 31.434967 8.144784 +v 56.005283 31.534855 8.308274 +v 56.024429 31.557924 8.336872 +v 56.097393 37.745140 8.716132 +v 56.055264 34.172634 8.497147 +v 58.924877 37.087070 9.660819 +v 60.630196 37.452759 8.683191 +v 60.826279 33.338730 8.107039 +v 60.777477 33.135204 8.156141 +v 60.432880 27.318205 8.165197 +v 60.749218 32.721592 8.161714 +v 61.236313 31.358046 5.882530 +v 61.296688 37.917618 6.196359 +v 61.060333 31.656748 7.506463 +v 61.157894 34.172634 7.515486 +v 60.075809 37.239975 9.184449 +v 59.958572 27.298674 8.575074 +v 59.525467 37.132675 9.481241 +v 61.278057 31.304075 6.099518 +v 61.220230 27.411655 6.489185 +v 61.352345 37.917866 6.695827 +v 61.308647 34.548508 6.701057 +v 61.304043 34.497074 6.906312 +v 61.343494 37.864441 7.129913 +v 61.293682 37.839470 7.341565 +v 61.210480 34.321148 7.305542 +v 61.207512 34.312927 7.317633 +v 61.215351 37.760574 7.670162 +v 61.222050 31.358620 6.923690 +v 61.191738 27.404522 6.611038 +v 61.200790 31.394100 7.019108 +v 60.864689 27.350676 7.552396 +v 60.811356 27.344353 7.665818 +v 60.875416 32.133430 7.943223 +v 60.932079 37.581589 8.293333 +v 61.012363 33.898132 7.802849 +v 60.883930 33.498474 8.043050 +v 61.071674 37.683620 8.003700 +v 55.154667 33.337154 5.943245 +v 55.204365 33.896751 6.201581 +v 55.229305 34.056538 6.331215 +v 55.289486 34.320305 6.644032 +v 54.950108 37.147907 4.879951 +v 55.164299 37.682098 5.993318 +v 55.147388 32.719955 5.905413 +v 55.154755 32.516430 5.943708 +v 55.166855 32.319458 6.006606 +v 55.204548 31.957125 6.202527 +v 55.000202 27.567686 5.140342 +v 55.229507 31.797485 6.332258 +v 55.324051 31.434301 6.823695 +v 61.058716 33.534252 4.872584 +v 61.046623 33.337154 4.809731 +v 60.525677 35.376511 2.101882 +v 60.584129 35.864510 2.405715 +v 61.039345 32.719955 4.771899 +v 61.075512 32.131989 4.959892 +v 61.121464 31.797485 5.198744 +v 61.096504 31.957125 5.069013 +v 61.150021 31.655691 5.347185 +v 61.189579 27.469414 5.552814 +v 61.216007 31.434301 5.690181 +v 61.121262 34.056538 5.197701 +v 60.746132 36.778572 3.247786 +v 61.149776 34.198410 5.345915 +v 60.842064 37.147907 3.746436 +v 61.181442 34.320305 5.510518 +v 60.945972 37.450668 4.286564 +v 61.056255 37.682098 4.859804 +v 61.252117 34.496571 5.877890 +v 61.215725 34.420193 5.688726 +v 61.219742 31.392776 5.796404 +v 55.343891 31.392776 6.926820 +v 55.297623 27.469414 6.686328 +v 55.396927 34.524712 7.115701 +v 55.380825 34.524712 7.118799 +v 44.786377 31.056692 15.568623 +v 48.252270 30.884907 17.704353 +v 45.306290 30.884907 18.271109 +v 44.413383 27.719242 12.877433 +v 47.231552 28.717300 12.398706 +v 44.285572 28.717300 12.965464 +v 47.480862 26.801964 29.574427 +v 47.982811 26.201115 28.784519 +v 47.594925 32.554409 23.286064 +v 47.526150 34.144943 21.869921 +v 66.210762 37.917587 5.186333 +v 61.326370 37.917694 6.350639 +v 66.291702 37.917820 5.650479 +v 55.466621 37.917694 7.477957 +v 50.989876 37.917587 8.114577 +v 51.086922 37.917820 8.575625 +v 65.612869 36.563549 2.078520 +v 50.391983 36.563549 5.006763 +v 65.911079 37.566383 3.628589 +v 50.690193 37.566383 6.556833 +v 66.139931 37.878059 4.818144 +v 50.919044 37.878059 7.746388 +v 65.464867 35.620510 1.309204 +v 50.243980 35.620510 4.237448 +v 66.376831 37.761543 6.673365 +v 61.207687 37.752857 7.702316 +v 61.185539 37.738213 7.764773 +v 66.265823 37.683620 7.004432 +v 51.387402 37.761543 9.557081 +v 51.613319 37.683620 9.823330 +v 66.023651 37.760330 4.213748 +v 50.802765 37.760330 7.141993 +v 65.704056 36.963242 2.552516 +v 50.483173 36.963242 5.480761 +v 65.803986 37.299286 3.071905 +v 50.583092 37.299286 6.000150 +v 65.531876 36.106518 1.657485 +v 50.310982 36.106518 4.585728 +v 50.383705 39.574478 28.783466 +v 50.382244 39.198650 28.775875 +v 50.472374 38.791084 29.244370 +v 48.883270 40.194908 20.984259 +v 48.775272 39.377975 20.422897 +v 48.773239 39.002335 20.412317 +v 48.785156 38.504982 20.474270 +v 48.820061 38.038948 20.655716 +v 48.823151 35.931602 20.671766 +v 48.888027 35.566311 21.008991 +v 49.266525 35.948097 22.976391 +v 49.352234 35.734871 23.421919 +v 49.442326 35.580185 23.890221 +v 49.535370 35.486481 24.373871 +v 49.629894 35.455254 24.865189 +v 50.459534 38.169350 29.177628 +v 50.312088 37.749374 28.411201 +v 50.399311 37.490997 28.864588 +v 50.347046 35.428085 28.592913 +v 49.570679 34.457073 24.557388 +v 49.724419 35.486977 25.356527 +v 49.817448 35.581158 25.840084 +v 49.907501 35.736313 26.308191 +v 50.274094 35.108337 28.213696 +v 45.775330 33.641586 4.829321 +v 46.322777 33.435703 7.674942 +v 46.337143 33.627991 7.749600 +v 46.081108 34.636631 6.418759 +v 46.245750 30.014559 7.274553 +v 46.308212 33.030170 7.599214 +v 46.313080 33.235359 7.624534 +v 46.308224 32.823364 7.599279 +v 46.313141 32.618195 7.624831 +v 46.322872 32.417946 7.675428 +v 46.337273 32.225723 7.750277 +v 46.356117 32.044556 7.848237 +v 46.379093 31.877304 7.967663 +v 46.435966 31.594851 8.263283 +v 46.468956 31.484156 8.434780 +v 46.504318 31.396173 8.618591 +v 46.541481 31.332344 8.811754 +v 46.579857 31.293713 9.011235 +v 46.618851 31.280830 9.213915 +v 46.660690 28.046349 9.431399 +v 47.226501 28.289183 12.372464 +v 46.657837 31.293900 9.416565 +v 46.733364 31.396793 9.809153 +v 46.768700 31.484911 9.992837 +v 47.331383 31.992538 12.917617 +v 47.072456 37.301643 11.571739 +v 46.924316 32.619797 10.801710 +v 47.172447 36.966125 12.091484 +v 46.914619 32.419456 10.751301 +v 47.263699 36.566910 12.565804 +v 47.312149 31.595062 12.817638 +v 46.696209 31.332771 9.616024 +v 46.801678 31.595802 10.164242 +v 46.831772 31.727734 10.320654 +v 46.858498 31.878563 10.459578 +v 46.881451 32.045918 10.578901 +v 47.454453 35.246040 13.557343 +v 47.344788 36.110298 12.987311 +v 47.414421 35.603493 13.349266 +v 47.857475 33.019241 15.652243 +v 48.426811 31.700232 18.611607 +v 46.148113 35.122639 6.767040 +v 46.203804 35.417557 7.056528 +v 46.266029 35.673157 7.379961 +v 46.333817 35.885487 7.732326 +v 46.406101 36.051147 8.108049 +v 46.481731 36.167564 8.501171 +v 46.559532 36.232880 8.905572 +v 46.598518 36.245964 9.108223 +v 46.677254 36.233185 9.517482 +v 46.755058 36.168274 9.921923 +v 46.830723 36.052254 10.315209 +v 46.768440 34.371017 9.991465 +v 46.801430 34.260307 10.162962 +v 46.831547 34.128571 10.319494 +v 46.858307 33.977905 10.458584 +v 46.881279 33.810654 10.578010 +v 46.900124 33.629436 10.675966 +v 46.914524 33.437218 10.750816 +v 46.924259 33.236969 10.801413 +v 46.929176 33.031796 10.826964 +v 50.587166 29.161577 29.841042 +v 51.102753 27.939177 32.521042 +v 51.643059 28.812696 35.329514 +v 51.275322 26.521614 33.418053 +v 52.135628 27.243563 37.889874 +v 51.936302 30.494560 36.853813 +v 50.464256 29.974739 29.202152 +v 51.162346 31.476397 32.830795 +v 51.182911 37.878670 8.969482 +v 55.802246 37.851955 8.296991 +v 66.348701 37.878670 6.051837 +v 61.318588 37.851955 7.235739 +v 75.183838 31.650961 25.361618 +v 76.486122 30.494560 32.130836 +v 75.746658 32.917820 28.287136 +v 70.606079 34.356834 1.566617 +v 70.872589 33.435703 2.951968 +v 70.886963 33.627991 3.026626 +v 70.905762 33.809242 3.124368 +v 70.928719 33.976646 3.243695 +v 71.031548 36.167564 3.778196 +v 70.955444 34.127472 3.382618 +v 70.985535 34.259357 3.539026 +v 70.900772 35.935432 3.098455 +v 71.109344 36.232880 4.182598 +v 71.053848 34.458382 3.894118 +v 71.188080 36.246071 4.591826 +v 71.227066 36.233185 4.794507 +v 71.304871 36.168274 5.198948 +v 71.380539 36.052254 5.592235 +v 71.452850 35.886955 5.968088 +v 71.520676 35.674999 6.320664 +v 71.582954 35.419697 6.644365 +v 71.638687 35.125118 6.934073 +v 71.687012 34.795830 7.185299 +v 70.673080 34.842842 1.914898 +v 70.764267 35.242531 2.388895 +v 70.325150 33.641586 0.106346 +v 70.858025 33.030170 2.876239 +v 70.858032 32.823364 2.876305 +v 70.862953 32.618195 2.901856 +v 70.872688 32.417946 2.952453 +v 70.887085 32.225723 3.027302 +v 70.610558 31.931894 1.589911 +v 70.928909 31.877304 3.244689 +v 70.955673 31.726589 3.383775 +v 70.985779 31.594851 3.540308 +v 71.018776 31.484156 3.711806 +v 71.054138 31.396173 3.895617 +v 71.091293 31.332344 4.088780 +v 71.129669 31.293713 4.288260 +v 71.168671 31.280830 4.490941 +v 71.207657 31.293900 4.693590 +v 71.246025 31.332771 4.893049 +v 71.283180 31.396793 5.086177 +v 71.318520 31.484911 5.269862 +v 71.727051 34.438377 7.393374 +v 71.464340 33.437218 6.027841 +v 71.474075 33.236969 6.078438 +v 71.478989 33.031796 6.103990 +v 71.479004 32.824989 6.104055 +v 71.474136 32.619797 6.078735 +v 71.464432 32.419456 6.028327 +v 72.295868 35.040855 10.350090 +v 72.696762 34.592869 12.433889 +v 71.450073 32.227169 5.953669 +v 71.431274 32.045918 5.855927 +v 72.936409 33.972191 13.679592 +v 71.408310 31.878563 5.736604 +v 71.381584 31.727734 5.597680 +v 73.184525 33.452927 14.969294 +v 71.351494 31.595802 5.441268 +v 73.439575 33.038315 16.295025 +v 72.084915 30.803101 9.253565 +v 73.699982 32.730942 17.648582 +v 73.964134 32.532646 19.021666 +v 74.230423 32.444660 20.405840 +v 74.497192 32.467533 21.792480 +v 74.762794 32.601105 23.173067 +v 75.025604 32.844612 24.539139 +v 75.136978 29.161577 25.118065 +v 76.430016 27.252514 31.839178 +v 76.192871 28.812696 30.606541 +v 73.640350 27.744471 17.338646 +v 59.737595 35.153580 11.238645 +v 57.033558 37.429771 9.417791 +v 57.383957 37.323380 9.547683 +v 57.948784 37.195251 9.676618 +v 66.152237 37.301643 7.901110 +v 60.313831 37.323380 8.984024 +v 65.636391 37.150532 8.280617 +v 63.723949 36.029697 9.904218 +v 59.561989 37.141602 9.461723 +v 59.482620 37.129417 9.494074 +v 59.182327 37.106617 9.583863 +v 58.879730 37.090370 9.664869 +v 52.760487 36.957199 11.028932 +v 59.495354 36.781719 9.979478 +v 61.001877 37.632607 8.148517 +v 60.781136 37.517174 8.488262 +v 56.435020 37.632607 9.027103 +v 53.517529 37.495701 9.940955 +v 63.791565 35.515163 10.255713 +v 48.386688 27.028641 15.206619 +v 61.211090 27.459644 5.708040 +v 61.226418 27.430767 6.176226 +v 61.205986 27.408089 6.550112 +v 61.134743 27.390244 6.854953 +v 60.971214 27.363319 7.325632 +v 60.838020 27.347515 7.609107 +v 60.622116 27.331280 7.915508 +v 60.195724 27.308439 8.370136 +v 62.185196 27.013065 12.806107 +v 59.683964 27.292637 8.726389 +v 59.169296 27.284966 8.950566 +v 58.869247 27.282921 9.041628 +v 58.559311 27.284145 9.081285 +v 58.246895 27.286190 9.108051 +v 57.960625 27.218948 10.260080 +v 57.265854 27.308439 8.933794 +v 56.701218 27.331280 8.669824 +v 52.922104 27.154799 12.275953 +v 56.203979 27.360157 8.294350 +v 55.343292 27.459644 6.836906 +v 55.795853 27.393810 7.823881 +v 51.655807 27.319469 9.833126 +v 52.696091 26.140705 28.863274 +v 52.477608 26.129791 29.083374 +v 52.356964 26.119545 29.273724 +v 52.320770 26.115250 29.350765 +v 53.619232 26.015087 30.735014 +v 53.580688 26.006310 30.885633 +v 53.538681 25.993240 31.106895 +v 53.519344 25.984016 31.261089 +v 53.514099 25.978874 31.346001 +v 53.514297 25.969343 31.501465 +v 53.548435 25.945717 31.880352 +v 53.564499 25.940407 31.963856 +v 53.528740 25.955399 31.726196 +v 50.701912 26.263660 27.241035 +v 51.045235 27.518551 6.702814 +v 68.942055 26.069374 26.901505 +v 68.835625 26.063675 27.014977 +v 68.781357 26.060287 27.080654 +v 68.690002 26.053646 27.206573 +v 68.569382 26.043402 27.396919 +v 68.494499 26.035927 27.533287 +v 68.458305 26.031631 27.610331 +v 65.226677 26.045692 28.002647 +v 65.188141 26.036915 28.153267 +v 65.168770 26.027691 28.307465 +v 65.168991 26.018158 28.462925 +v 65.156036 26.200050 25.498055 +v 65.188667 26.008476 28.617083 +v 73.143723 25.945717 28.110544 +v 73.159790 25.940407 28.194046 +v 73.179466 25.930725 28.348206 +v 73.193932 25.916780 28.572933 +v 73.194153 25.907249 28.728394 +v 73.188904 25.902105 28.813305 +v 73.169533 25.892883 28.967503 +v 73.127533 25.879814 29.188766 +v 73.088989 25.871037 29.339384 +v 73.036934 25.862686 29.485641 +v 72.979828 25.854492 29.630280 +v 72.943634 25.850197 29.707321 +v 74.179474 25.718853 31.612305 +v 74.088120 25.712212 31.738224 +v 73.981644 25.706511 31.851706 +v 73.861801 25.701836 31.951038 +v 71.952408 25.797098 30.764259 +v 71.877731 25.795456 30.805405 +v 71.736908 25.793043 30.871881 +v 71.594147 25.790958 30.933344 +v 71.446106 25.789745 30.981644 +v 71.185745 25.788862 31.046112 +v 70.920059 25.789745 31.082848 +v 70.764664 25.790958 31.092922 +v 70.609238 25.793043 31.088827 +v 70.453796 25.795456 31.079348 +v 70.369240 25.797098 31.068832 +v 70.216293 25.800669 31.040020 +v 66.496857 25.701836 33.367931 +v 70.064636 25.804543 31.005981 +v 69.706635 25.816748 30.875748 +v 63.728554 25.842720 31.602112 +v 68.333328 25.930725 29.280519 +v 68.403282 25.916780 29.494576 +v 65.285072 25.989264 28.911983 +v 68.497139 25.902105 29.715921 +v 68.572334 25.892883 29.851927 +v 68.693436 25.879814 30.041809 +v 65.225098 25.961918 29.369652 +v 63.656845 25.862686 31.290215 +v 63.644615 25.854492 31.426220 +v 63.608421 25.850197 31.503262 +v 69.359375 25.832478 30.685974 +v 69.490936 25.825836 30.769009 +v 69.565697 25.822449 30.809864 +v 57.482063 25.804543 33.426659 +v 59.748825 26.008476 29.663620 +v 58.429901 25.940407 31.027832 +v 58.449577 25.930725 31.181988 +v 58.464043 25.916780 31.406719 +v 58.464268 25.907249 31.562180 +v 58.459015 25.902105 31.647091 +v 58.439644 25.892883 31.801289 +v 58.397640 25.879814 32.022552 +v 58.359100 25.871037 32.173172 +v 58.018246 25.832478 32.867821 +v 57.926888 25.825836 32.993736 +v 57.872620 25.822449 33.059418 +v 57.766144 25.816748 33.172901 +v 57.601906 25.809219 33.327324 +v 69.916443 25.809219 30.958214 +v 57.222519 25.797098 33.598045 +v 64.145676 25.600410 35.474892 +v 57.147896 25.795456 33.639179 +v 57.007069 25.793043 33.705658 +v 56.864262 25.790958 33.767128 +v 56.716221 25.789745 33.815430 +v 56.455864 25.788862 33.879898 +v 56.190170 25.789745 33.916634 +v 55.879349 25.793043 33.922611 +v 55.639351 25.797098 33.902618 +v 54.020454 25.703117 35.747246 +v 53.810631 25.710648 35.664783 +v 53.640411 25.718853 35.563675 +v 54.055202 25.871037 33.001167 +v 53.842422 25.892883 32.685715 +v 53.603405 25.930725 32.114311 +v 51.837807 25.900763 32.942802 +v 53.673378 25.916780 32.328362 +v 53.730873 25.907249 32.472801 +v 53.767250 25.902105 32.549706 +v 53.963524 25.879814 32.875599 +v 54.157799 25.862686 33.117672 +v 53.520309 25.726330 35.464821 +v 54.761059 25.825836 33.602791 +v 55.486404 25.800669 33.873802 +v 55.723911 25.795456 33.913132 +v 56.034775 25.790958 33.926708 +v 73.104797 25.955399 27.960091 +v 72.567543 26.584049 17.807671 +v 73.034851 25.969343 27.746035 +v 72.977371 25.978874 27.601589 +v 72.940994 25.984016 27.524689 +v 72.865799 25.993240 27.388683 +v 72.744690 26.006310 27.198799 +v 72.653015 26.015087 27.073231 +v 72.550415 26.023438 26.956728 +v 72.443718 26.031631 26.843603 +v 72.381516 26.035927 26.785492 +v 72.261383 26.043402 26.686640 +v 72.078758 26.053646 26.554634 +v 71.947205 26.060287 26.471600 +v 71.872437 26.063675 26.430744 +v 71.731453 26.069374 26.364870 +v 71.521645 26.076904 26.282406 +v 71.373505 26.081579 26.234629 +v 71.221840 26.085455 26.200588 +v 71.068893 26.089024 26.171776 +v 70.984283 26.090666 26.161270 +v 70.828842 26.093081 26.151791 +v 70.673470 26.095165 26.147686 +v 70.518082 26.096378 26.157763 +v 69.158974 26.211733 24.537340 +v 69.010933 26.210518 24.585640 +v 68.870102 26.208103 24.652115 +v 68.738770 26.204535 24.735622 +v 69.106285 26.076904 26.747080 +v 67.398262 26.597212 18.587399 +v 68.084305 27.217953 8.328716 +v 65.597847 27.286371 7.690868 +v 61.040871 27.518551 4.779821 +v 59.709900 26.018158 29.513165 +v 59.652428 26.027691 29.368719 +v 59.577229 26.036915 29.232714 +v 59.485558 26.045692 29.107145 +v 57.713829 26.031631 29.677387 +v 57.651630 26.035927 29.619274 +v 57.531494 26.043402 29.520424 +v 57.348866 26.053646 29.388420 +v 57.217308 26.060287 29.305386 +v 57.142548 26.063675 29.264530 +v 57.001564 26.069374 29.198654 +v 56.791756 26.076904 29.116190 +v 56.643612 26.081579 29.068413 +v 56.491951 26.085455 29.034374 +v 56.339005 26.089024 29.005560 +v 56.254444 26.090666 28.995047 +v 56.099003 26.093081 28.985567 +v 55.943581 26.095165 28.981472 +v 55.788185 26.096378 28.991547 +v 54.145035 26.208767 27.474152 +v 54.070412 26.207127 27.515287 +v 57.247070 26.200050 27.019609 +v 54.395302 26.211733 27.377625 +v 55.114090 26.095165 29.141050 +v 54.496288 26.081579 29.481522 +v 52.531845 26.133177 29.017700 +v 69.957443 35.061996 10.766566 +v 66.685387 34.773247 16.106777 +v 62.306770 34.862022 15.500840 +v 59.330925 34.960144 14.472578 +v 56.864216 34.890060 16.090534 +v 50.802345 34.965748 16.021910 +v 66.124504 34.259998 24.587757 +v 63.323170 34.273285 24.909897 +v 54.735939 34.581673 21.530956 +v 58.492126 34.145573 27.922846 +v 58.730881 34.273285 25.793377 +v 55.755035 34.371407 24.765114 +v 65.089661 42.940437 21.855305 +v 65.018768 42.916645 21.486801 +v 64.496414 37.986919 18.771645 +v 65.488335 42.255898 23.927607 +v 64.648743 36.878342 19.563429 +v 65.007645 35.985512 21.428986 +v 64.858185 42.706097 20.652138 +v 65.543083 42.016376 24.212179 +v 65.344055 42.684242 23.177662 +v 64.783478 36.370399 20.263779 +v 64.437698 39.194977 18.466452 +v 64.847763 36.210472 20.597946 +v 64.937859 36.055786 21.066250 +v 65.543564 36.880680 24.214684 +v 64.466370 40.495289 18.615473 +v 64.583458 41.648415 19.224106 +v 64.535385 41.291088 18.974182 +v 64.772522 42.492416 20.206810 +v 64.925735 42.822464 21.003244 +v 65.184174 42.909203 22.346622 +v 64.535728 37.600716 18.975994 +v 64.470230 38.336449 18.635548 +v 64.437653 39.696312 18.466190 +v 64.186829 39.258270 19.809036 +v 64.186790 39.634270 19.808865 +v 64.194595 38.982391 19.849438 +v 64.208847 38.713844 19.923496 +v 64.194504 39.910194 19.848999 +v 64.229324 38.456863 20.029991 +v 64.255753 38.215500 20.167309 +v 64.208710 40.178814 19.922775 +v 64.287674 37.993568 20.333267 +v 64.324585 37.794567 20.525131 +v 64.229149 40.435905 20.029053 +v 64.365936 37.621628 20.740044 +v 64.411057 37.477478 20.974575 +v 64.459213 37.364395 21.224934 +v 64.509689 37.284168 21.487295 +v 64.561661 37.238045 21.757450 +v 64.595924 37.226723 21.935532 +v 64.648575 37.238281 22.209225 +v 64.700546 37.284657 22.479345 +v 64.750992 37.365158 22.741570 +v 64.799149 37.478485 22.991886 +v 64.844238 37.622871 23.226246 +v 64.885536 37.796024 23.440922 +v 64.922432 37.995224 23.632694 +v 64.954315 38.217316 23.798422 +v 64.255516 40.677399 20.166105 +v 64.287399 40.899498 20.331833 +v 64.324295 41.098694 20.523603 +v 64.365593 41.271851 20.738281 +v 64.410675 41.416233 20.972641 +v 64.458832 41.529564 21.222958 +v 64.509285 41.610062 21.485182 +v 64.561249 41.656445 21.755302 +v 64.595520 41.667942 21.933407 +v 64.648163 41.656673 22.207077 +v 64.700134 41.610554 22.477234 +v 64.750610 41.530323 22.739594 +v 64.798782 41.417244 22.989952 +v 64.843903 41.273090 23.224483 +v 64.885239 41.100151 23.439394 +v 64.922157 40.901154 23.631260 +v 64.954086 40.679214 23.797218 +v 64.980499 40.437859 23.934534 +v 65.000992 40.180882 24.041031 +v 65.015236 39.912327 24.115089 +v 65.023010 39.636444 24.155491 +v 64.980682 38.458817 23.935474 +v 65.001129 38.715904 24.041752 +v 65.015320 38.984528 24.115528 +v 65.023041 39.260452 24.155663 +v 65.608368 37.246300 24.551502 +v 65.479256 36.603928 23.880411 +v 65.333633 36.188622 23.123470 +v 65.266083 36.072254 22.772364 +v 65.721588 40.558273 25.140060 +v 65.745186 40.072754 25.262705 +v 64.501190 40.961510 18.796457 +v 64.712570 42.290787 19.895197 +v 65.253967 42.838928 22.709358 +v 64.446640 38.821968 18.512901 +v 64.591431 37.195278 19.265549 +v 64.444290 40.007515 18.500713 +v 64.850441 40.316677 17.965229 +v 64.703491 36.638817 19.848001 +v 65.690636 37.933212 24.979151 +v 65.173058 35.978073 22.288807 +v 65.600388 41.699448 24.510059 +v 65.695412 40.907799 25.003962 +v 64.648254 42.014042 19.560925 +v 65.408348 42.524315 23.511829 +v 65.754913 39.261070 25.313259 +v 65.743088 38.763664 25.251778 +v 65.725449 38.399429 25.160135 +v 65.656448 37.603630 24.801426 +v 65.419312 36.402306 23.568798 +v 65.102158 35.954281 21.920303 +v 65.656097 41.294003 24.799614 +v 65.753387 39.762222 25.305311 +v 66.341087 39.574478 25.713531 +v 67.550522 43.439468 21.413597 +v 67.034348 42.356140 18.730499 +v 67.272919 43.158401 19.970592 +v 67.187241 42.944725 19.525265 +v 66.868332 41.145340 17.867582 +v 66.833511 40.679123 17.686600 +v 66.969543 41.990517 18.393681 +v 68.302063 39.825142 25.320065 +v 67.362976 43.313560 20.438702 +v 67.456001 43.407745 20.922256 +v 67.107300 42.675888 19.109715 +v 68.778412 40.316677 17.209553 +v 66.913918 41.584785 18.104534 +v 67.645050 43.408234 21.904913 +v 67.738091 43.314533 22.388565 +v 68.066895 42.358826 24.097664 +v 67.828186 43.159847 22.856865 +v 68.268051 40.682858 25.143246 +v 68.233139 41.148895 24.961798 +v 67.993881 42.678200 23.718168 +v 68.291641 40.197338 25.265890 +v 68.131775 41.993538 24.434887 +v 68.187477 41.588097 24.724442 +v 67.913895 42.946617 23.302391 +v 65.674019 35.426590 22.246143 +v 65.723358 35.394489 22.502598 +v 65.735397 35.346016 22.565155 +v 65.757790 34.837643 22.681578 +v 65.761017 35.517830 22.698362 +v 65.843590 35.101654 23.127579 +v 66.269852 35.256065 25.343250 +v 66.416916 38.169350 26.107695 +v 66.382095 37.703129 25.926710 +v 66.492859 36.014885 26.502462 +v 66.269112 35.984661 25.339407 +v 66.428741 38.666756 26.169178 +v 64.613541 37.162949 16.733797 +v 64.730621 39.002335 17.342384 +v 64.742538 38.504982 17.404335 +v 64.760979 36.642624 17.500193 +v 64.816681 36.237186 17.789747 +v 64.889694 35.917809 18.169243 +v 64.975403 35.704582 18.614769 +v 65.068451 35.610878 19.098419 +v 64.732651 39.377975 17.352962 +v 64.840652 40.194908 17.914326 +v 68.306084 39.698807 25.340954 +v 66.799286 40.196674 17.508701 +v 69.246307 39.717827 19.641657 +v 69.254829 39.893875 19.685951 +v 69.267456 40.062881 19.751556 +v 69.283974 40.222176 19.837425 +v 69.304146 40.369247 19.942272 +v 69.401505 42.101158 20.448341 +v 69.327637 40.501785 20.064381 +v 69.354073 40.617699 20.201805 +v 69.295464 41.912445 19.897152 +v 69.414116 40.792618 20.513897 +v 69.465240 42.155445 20.779654 +v 69.529755 42.167023 21.114988 +v 69.564011 42.155701 21.293070 +v 69.627754 42.101746 21.624390 +v 69.689720 42.005928 21.946501 +v 69.748917 41.869766 22.254183 +v 69.804428 41.695389 22.542747 +v 69.855377 41.485569 22.807545 +v 69.900948 41.243603 23.044445 +v 69.940445 40.973309 23.249748 +v 68.936630 38.506760 18.031940 +v 68.665970 39.376205 16.625072 +v 69.030823 40.362648 18.521603 +v 69.076416 40.802090 18.758553 +v 69.246361 39.175495 19.641916 +v 69.141212 41.167717 19.095371 +v 69.183998 41.898907 19.317736 +v 69.242020 39.537514 19.619389 +v 69.242035 39.355782 19.619465 +v 69.254913 38.999493 19.686373 +v 69.267563 38.830551 19.752121 +v 69.284119 38.671345 19.838196 +v 69.327827 38.391960 20.065372 +v 68.940742 36.495640 18.053347 +v 68.775116 33.038315 17.192390 +v 69.151268 35.496304 19.147636 +v 69.414360 38.101585 20.515175 +v 69.315269 35.313622 20.000111 +v 69.480743 38.011539 20.860268 +v 69.482346 35.230610 20.868580 +v 69.549271 38.011723 21.216454 +v 69.649551 35.248451 21.737675 +v 69.615646 38.102104 21.561440 +v 69.646698 38.179569 21.722876 +v 69.675690 38.277023 21.873531 +v 69.702126 38.392933 22.010956 +v 69.725616 38.525467 22.133064 +v 69.745789 38.672543 22.237911 +v 70.106247 38.399223 24.111582 +v 69.774925 39.000851 22.389387 +v 69.783447 39.176891 22.433680 +v 69.973213 40.678951 23.420073 +v 69.998764 40.365173 23.552853 +v 70.016678 40.036911 23.645977 +v 70.027100 39.664719 23.700153 +v 69.787735 39.357204 22.455948 +v 70.204453 35.195450 24.622036 +v 70.357727 38.791084 25.418762 +v 70.414948 35.515854 25.716198 +v 70.361145 32.844612 25.436504 +v 70.522758 33.043049 26.276573 +v 67.908577 34.949272 12.688181 +v 68.032288 34.592869 13.331255 +v 68.271942 33.972191 14.576957 +v 68.520065 33.452927 15.866659 +v 47.518276 29.974739 29.768909 +v 49.062492 36.014885 29.855774 +v 49.523602 33.480202 29.605947 +v 60.444347 33.147514 27.483829 +v 66.600204 37.162949 16.351595 +v 66.577850 35.267597 16.235415 +v 44.535973 29.886997 14.267043 +v 45.046333 30.970798 16.919865 +v 45.691010 35.537415 20.270847 +v 46.452789 38.671345 24.230560 +v 46.180412 40.000202 22.814762 +v 45.829292 39.377975 20.989655 +v 46.072453 38.822670 22.253582 +v 46.415031 39.175495 24.034283 +v 46.410694 39.537514 24.011753 +v 46.199501 40.362648 22.913969 +v 46.224991 40.676567 23.046459 +v 46.257706 40.971096 23.216526 +v 46.410709 39.355782 24.011831 +v 46.436234 38.830551 24.144489 +v 46.472984 38.524376 24.335537 +v 46.496498 38.391960 24.457741 +v 46.522964 38.276184 24.595325 +v 46.551964 38.178879 24.746048 +v 46.583031 38.101585 24.907541 +v 46.615692 38.045509 25.077320 +v 46.649422 38.011539 25.252636 +v 47.111088 35.573845 27.652359 +v 46.717945 38.011723 25.608820 +v 46.751671 38.045860 25.784130 +v 46.784313 38.102104 25.953808 +v 47.193069 35.685493 28.078493 +v 47.196854 39.573856 28.098166 +v 47.046555 42.946617 27.316921 +v 46.952118 39.176891 26.826046 +v 47.126541 42.678200 27.732697 +v 47.187263 39.306942 28.048302 +v 47.199551 42.358826 28.112190 +v 46.930977 38.831844 26.716148 +v 47.264427 41.993538 28.449417 +v 46.914459 38.672543 26.630280 +v 47.320133 41.588097 28.738972 +v 46.894287 38.525467 26.525433 +v 47.365799 41.148895 28.976326 +v 46.870792 38.392933 26.403322 +v 47.400703 40.682858 29.157772 +v 45.480831 31.700232 19.178362 +v 47.424301 40.197338 29.280418 +v 46.844353 38.277023 26.265900 +v 45.878170 27.331514 21.243702 +v 47.526398 38.791084 29.811127 +v 46.297134 41.241596 23.421474 +v 46.342674 41.483795 23.658192 +v 46.393585 41.693878 23.922800 +v 46.449059 41.868538 24.211163 +v 46.508240 42.005016 24.518784 +v 46.570171 42.101158 24.840708 +v 46.633911 42.155445 25.172020 +v 46.668175 42.166943 25.350122 +v 46.732685 42.155701 25.685436 +v 46.796425 42.101746 26.016754 +v 46.858391 42.005928 26.338867 +v 46.815136 40.715843 26.114021 +v 46.844131 40.618538 26.264744 +v 46.870602 40.502762 26.402330 +v 46.894112 40.370346 26.524532 +v 46.914307 40.223373 26.629509 +v 46.930866 40.064163 26.715582 +v 46.943516 39.895233 26.781330 +v 46.952072 39.719231 26.825788 +v 46.956390 39.538940 26.848240 +v 48.911728 39.698807 29.072104 +v 47.415627 40.193138 21.295424 +v 47.675732 37.295708 20.000786 +v 47.628216 33.266563 19.753813 +v 48.156170 43.439468 25.144745 +v 47.639988 42.356140 22.461651 +v 48.477951 43.067505 26.817360 +v 47.878563 43.158401 23.701742 +v 47.792885 42.944725 23.256416 +v 47.473976 41.145340 21.598732 +v 47.439159 40.679123 21.417747 +v 47.575188 41.990517 22.124830 +v 48.343739 43.314533 26.119713 +v 48.907711 39.825142 29.051216 +v 50.346680 40.682858 28.591015 +v 47.968620 43.313560 24.169849 +v 48.061646 43.407745 24.653408 +v 47.712944 42.675888 22.840866 +v 48.893063 40.316677 21.035164 +v 47.519562 41.584785 21.835682 +v 48.250694 43.408234 25.636063 +v 50.145531 42.358826 27.545433 +v 49.906822 43.159847 26.304638 +v 50.072521 42.678200 27.165939 +v 50.370277 40.197338 28.713661 +v 50.210403 41.993538 27.882660 +v 50.266113 41.588097 28.172215 +v 50.311775 41.148895 28.409569 +v 49.991524 42.940437 24.759933 +v 50.086044 42.909203 25.251251 +v 50.155830 42.838928 25.613989 +v 49.550606 36.878342 22.468058 +v 50.930565 39.260826 27.656063 +v 50.445427 36.880680 27.119312 +v 50.801670 41.356995 26.986065 +v 50.202412 36.119190 25.856136 +v 50.381119 36.603928 26.785040 +v 50.577362 37.762726 27.805096 +v 50.627316 38.399429 28.064766 +v 49.674377 42.492416 23.111441 +v 49.437592 37.600716 21.880623 +v 50.310211 42.524315 26.416458 +v 50.612438 40.737396 27.987434 +v 49.955616 39.910194 22.588322 +v 49.946747 39.537140 22.542234 +v 49.969810 40.178814 22.662100 +v 49.990257 40.435905 22.768379 +v 49.947929 39.258270 22.548363 +v 50.016624 40.677399 22.905432 +v 50.048508 40.899498 23.071156 +v 49.955704 38.982391 22.588764 +v 50.085400 41.098694 23.262928 +v 50.126701 41.271851 23.477606 +v 49.969948 38.713844 22.662821 +v 50.171787 41.416233 23.711967 +v 50.219940 41.529564 23.962282 +v 50.270393 41.610062 24.224506 +v 50.322357 41.656445 24.494629 +v 50.375011 41.667992 24.768320 +v 50.409271 41.656673 24.946400 +v 50.461243 41.610554 25.216558 +v 50.511719 41.530323 25.478918 +v 50.559883 41.417244 25.729279 +v 50.605003 41.273090 25.963810 +v 50.646351 41.100151 26.178719 +v 50.576584 40.370346 25.816086 +v 50.715187 40.679214 26.536543 +v 50.741608 40.437859 26.673859 +v 49.990437 38.456863 22.769318 +v 50.016853 38.215500 22.906635 +v 50.048782 37.993568 23.072594 +v 50.085693 37.794567 23.264458 +v 50.127037 37.621628 23.479366 +v 50.172157 37.477478 23.713902 +v 50.220322 37.364395 23.964260 +v 50.270798 37.284168 24.226620 +v 50.304527 37.250198 24.401936 +v 50.357033 37.226723 24.674858 +v 50.409683 37.238281 24.948549 +v 50.461651 37.284657 25.218670 +v 50.512100 37.365158 25.480896 +v 50.560257 37.478485 25.731211 +v 50.605343 37.622871 25.965572 +v 50.646645 37.796024 26.180248 +v 50.683540 37.995224 26.372021 +v 50.715420 38.217316 26.537746 +v 50.741787 38.458817 26.674799 +v 50.762230 38.715904 26.781078 +v 50.776428 38.984528 26.854855 +v 50.762093 40.180882 26.780357 +v 50.776344 39.912327 26.854416 +v 50.784111 39.636444 26.894815 +v 50.638874 39.357204 26.139870 +v 50.532898 37.391502 27.573999 +v 49.485321 41.648415 22.128735 +v 49.760056 42.706097 23.556768 +v 49.339561 39.194977 21.371080 +v 49.372093 38.336449 21.540176 +v 49.493294 37.195278 22.170177 +v 49.605350 36.638817 22.752630 +v 49.716534 36.279732 23.330555 +v 50.366314 42.510319 26.046408 +v 50.659489 41.160637 27.570328 +v 50.039612 35.954376 25.009912 +v 50.321167 36.402306 26.473427 +v 50.400372 37.067734 27.546759 +v 50.644947 38.763664 28.156406 +v 49.368233 40.495289 21.520103 +v 49.614429 42.290787 22.799826 +v 49.348503 38.821968 21.417532 +v 49.874199 36.009033 24.150084 +v 50.418999 42.145252 26.981943 +v 50.653732 39.887733 28.202087 +v 50.747757 39.657757 28.029158 +v 49.403049 40.961510 21.701086 +v 49.338776 39.633644 21.366978 +v 49.550121 42.014042 22.465553 +v 49.398277 37.986919 21.676275 +v 49.437241 41.291088 21.878811 +v 49.920631 42.916645 24.391430 +v 49.827599 42.822464 23.907873 +v 49.346153 40.007515 21.405342 +v 71.016159 34.956318 12.079202 +v 71.431984 32.480591 22.621675 +v 70.634117 32.688740 18.474390 +v 70.898766 32.508747 19.850039 +v 71.165276 32.439228 21.235346 +v 71.697258 32.632572 24.000555 +v 73.622032 33.026604 25.624420 +v 67.059769 40.894501 21.509285 +v 48.524654 40.894501 25.075130 +v 65.968369 39.386066 20.247313 +v 48.866055 39.325497 23.541418 +v 67.332733 39.538940 22.928169 +v 49.411007 39.569225 26.374060 +v 66.885178 40.564144 20.601799 +v 48.337540 40.501785 24.102524 +v 66.885391 38.329666 20.602873 +v 48.325188 38.454250 24.038315 +v 65.991806 38.858006 20.369154 +v 48.893658 38.803097 23.684891 +v 67.220482 40.618538 22.344675 +v 49.303757 40.600708 25.816574 +v 66.943146 40.759056 20.903112 +v 48.424019 40.792618 24.552040 +v 65.983292 39.922745 20.324879 +v 48.264740 39.893875 23.724094 +v 65.974068 39.747639 20.276953 +v 48.256218 39.717827 23.679800 +v 66.013733 40.247807 20.483109 +v 48.293877 40.222176 23.875568 +v 66.928314 38.178879 20.825979 +v 49.001919 38.193485 24.247637 +v 66.085625 38.258358 20.856817 +v 48.973309 38.294010 24.098902 +v 66.992035 38.045509 21.157251 +v 49.065121 38.053043 24.576147 +v 66.849335 38.524376 20.415468 +v 65.979828 39.028351 20.306885 +v 48.264816 38.999493 23.724516 +v 67.328415 39.719231 22.905720 +v 49.405975 39.749039 26.347891 +v 66.991776 40.848862 21.155872 +v 48.456665 40.848862 24.721718 +v 67.025497 40.883003 21.331181 +v 48.490391 40.883003 24.897026 +v 48.363979 40.617699 24.239948 +v 66.104713 40.700520 20.956072 +v 48.392960 40.715153 24.390606 +v 65.969078 39.567806 20.250975 +v 48.865322 39.507221 23.537600 +v 65.996582 40.090347 20.393955 +v 48.277359 40.062881 23.789700 +v 66.034492 40.392639 20.590998 +v 48.314049 40.369247 23.980415 +v 66.146385 38.090427 21.172623 +v 49.032681 38.112743 24.407526 +v 67.042831 38.000175 21.421257 +v 49.098713 38.015327 24.750772 +v 66.007729 38.696960 20.451933 +v 48.910847 38.645729 23.774256 +v 65.971977 39.205303 20.266043 +v 48.871090 39.145687 23.567587 +v 67.094025 40.883179 21.687366 +v 48.558914 40.883179 25.253212 +v 67.246948 40.502762 22.482262 +v 49.329762 40.481998 25.951767 +v 66.448647 38.502075 22.743797 +v 49.352921 38.548859 26.072130 +v 67.307213 40.064163 22.795513 +v 49.383404 40.091618 26.230585 +v 66.247437 38.000233 21.697876 +v 48.524918 38.000221 25.076492 +v 67.290657 40.223373 22.709440 +v 49.366215 40.248989 26.141220 +v 67.234619 38.330574 22.418133 +v 49.329952 38.413719 25.952730 +v 66.347664 38.113293 22.218864 +v 49.233967 38.090916 25.453814 +v 67.319870 39.895233 22.861263 +v 49.396725 39.924091 26.299814 +v 67.160416 40.793137 22.032459 +v 48.625305 40.793137 25.598307 +v 67.191483 40.715843 22.193954 +v 49.275143 40.701237 25.667837 +v 67.127754 40.849213 21.862682 +v 48.592644 40.849213 25.428528 +v 67.270462 40.370346 22.604462 +v 66.514061 39.326916 23.083822 +v 48.796566 39.266331 26.488522 +v 66.509064 39.147079 23.057844 +v 48.671680 38.223469 25.839373 +v 66.378418 38.194202 22.378723 +v 49.265331 38.164936 25.616827 +v 67.128021 38.045860 21.864059 +v 49.201099 38.038300 25.282965 +v 66.281654 38.015545 21.875753 +v 49.167236 38.007904 25.106951 +v 67.307327 38.831844 22.796080 +v 48.779526 38.914249 26.399937 +v 66.469406 38.646912 22.851690 +v 49.372509 38.698177 26.173935 +v 66.499847 38.971985 23.009918 +v 49.400349 39.029720 26.318655 +v 66.232704 34.574276 5.343794 +v 66.250427 34.574375 5.540986 +v 51.084633 34.574375 8.458632 +v 51.027924 34.574276 8.268940 +v 65.949280 33.133568 3.827172 +v 55.146141 33.030170 5.898943 +v 60.991566 31.791014 7.665103 +v 61.027931 31.720028 7.581254 +v 56.207394 31.727734 8.516941 +v 61.135521 34.127472 5.271808 +v 50.824596 34.127472 7.255457 +v 66.006470 31.957125 4.124418 +v 55.217026 31.877304 6.267393 +v 61.052761 32.417946 4.841643 +v 55.160805 32.417946 5.975157 +v 66.125687 34.420193 4.744131 +v 50.923000 34.458382 7.766957 +v 61.067032 33.627991 4.915816 +v 55.175076 33.627991 6.049330 +v 61.108791 33.976646 5.132885 +v 50.797867 33.976646 7.116533 +v 61.198849 31.484156 5.600996 +v 55.306892 31.484156 6.734510 +v 61.067162 32.225723 4.916492 +v 55.175205 32.225723 6.050006 +v 61.043030 32.618195 4.791047 +v 55.151070 32.618195 5.924561 +v 66.202370 33.629436 6.962537 +v 56.448875 33.629436 8.838947 +v 60.956619 31.878563 7.747334 +v 56.328194 31.878563 8.637766 +v 66.172409 34.510643 4.986992 +v 61.273354 34.536453 6.031681 +v 55.405556 34.536453 7.160548 +v 50.987167 34.548199 8.057079 +v 50.960152 34.522385 7.960084 +v 66.211365 34.561234 5.232846 +v 55.433598 34.561234 7.306308 +v 61.165611 34.259357 5.428216 +v 50.854687 34.259357 7.411866 +v 61.198586 34.370247 5.599622 +v 50.887661 34.370247 7.583271 +v 61.052670 33.435703 4.841157 +v 55.160713 33.435703 5.974671 +v 61.042969 33.235359 4.790749 +v 55.151016 33.235359 5.924263 +v 61.085835 33.809242 5.013558 +v 50.774910 33.809242 6.997207 +v 61.255272 31.332344 5.981068 +v 55.395523 31.332344 7.108386 +v 61.165855 31.594851 5.429498 +v 50.839096 31.655691 7.330834 +v 61.135742 31.726589 5.272964 +v 55.243786 31.726589 6.406479 +v 61.225929 31.413540 5.741743 +v 61.228027 31.375412 5.839467 +v 64.514832 31.369623 5.222026 +v 55.333969 31.413540 6.875257 +v 55.368279 31.375412 6.966784 +v 52.414326 31.369623 7.549962 +v 61.276142 31.305359 6.089562 +v 61.276070 31.292431 6.194254 +v 55.455307 31.292431 7.314072 +v 55.416393 31.305359 7.216879 +v 61.086006 32.044556 5.014452 +v 55.194054 32.044556 6.147966 +v 61.038113 32.823364 4.765495 +v 55.146156 32.823364 5.899009 +v 60.764568 33.031796 8.165266 +v 51.803696 32.928387 9.895829 +v 60.887939 33.517090 8.036115 +v 60.855103 33.418602 8.075045 +v 56.499119 33.517090 8.880450 +v 56.544056 33.418602 8.904418 +v 66.226974 33.810654 6.856220 +v 56.350979 33.810654 8.756198 +v 66.280647 34.128571 6.577813 +v 66.242142 34.057674 6.662187 +v 56.113045 34.115154 8.548443 +v 56.045982 34.186050 8.484377 +v 66.296783 34.371017 6.234537 +v 55.870380 34.371017 8.240402 +v 60.900528 32.045918 7.881865 +v 51.684113 32.133430 9.711477 +v 60.792236 32.419456 8.081479 +v 56.604824 32.419456 8.887068 +v 66.113503 32.721592 7.129715 +v 51.801254 32.721592 9.883153 +v 61.155338 31.484911 7.225088 +v 55.949890 31.484911 8.226529 +v 61.211418 31.376360 6.971399 +v 61.188618 31.414534 7.073867 +v 55.835308 31.396793 8.058090 +v 61.268269 31.293900 6.605762 +v 55.615234 31.293900 7.693312 +v 61.272095 31.280830 6.394876 +v 55.533432 31.280830 7.498899 +v 60.801880 33.236969 8.131590 +v 56.614464 33.236969 8.937180 +v 61.074768 34.028671 7.680733 +v 61.036625 33.948902 7.755341 +v 56.233929 33.977905 8.654870 +v 66.288780 34.260307 6.413921 +v 61.186584 34.256195 7.401259 +v 55.982620 34.260307 8.396654 +v 66.286667 34.522789 5.845553 +v 51.163979 34.522789 8.754906 +v 66.302574 34.458981 6.042809 +v 61.280937 34.455750 7.017253 +v 55.756145 34.455750 8.080130 +v 51.222404 34.458981 8.943981 +v 61.310783 34.561440 6.595968 +v 55.572117 34.561440 7.699992 +v 60.841263 32.244884 8.003099 +v 60.871834 32.151146 7.952385 +v 56.530216 32.244884 8.832472 +v 56.483009 32.151146 8.796721 +v 61.130646 31.546391 7.338381 +v 61.093697 31.607336 7.430837 +v 56.014854 31.546391 8.322573 +v 56.083473 31.607336 8.394720 +v 61.266319 31.309143 6.719496 +v 61.244133 31.334991 6.825958 +v 55.659241 31.309143 7.798204 +v 55.719345 31.334991 7.888835 +v 50.692825 29.737175 4.871002 +v 46.215881 29.235327 5.986284 +v 69.947617 29.737175 1.166701 +v 60.688461 29.737175 2.948009 +v 54.613262 33.641586 3.129050 +v 60.505219 33.641586 1.995536 +v 76.120895 26.923138 33.255138 +v 74.296257 27.851955 29.481903 +v 72.385330 27.945814 28.318336 +v 72.319244 27.958984 28.116190 +v 72.228294 27.971840 27.923962 +v 72.113907 27.984182 27.744629 +v 71.977898 27.995813 27.581039 +v 71.822403 28.006550 27.435783 +v 71.649887 28.016228 27.311081 +v 71.463081 28.024693 27.208948 +v 71.264900 28.031803 27.131058 +v 71.058472 28.037455 27.078587 +v 70.847054 28.041557 27.052334 +v 70.634003 28.044043 27.052769 +v 71.147552 28.113617 25.818951 +v 70.422714 28.044874 27.079849 +v 69.059708 27.945814 28.958130 +v 69.046066 27.958984 28.745895 +v 69.059204 27.971840 28.533642 +v 69.098892 27.984182 28.324667 +v 69.164490 27.995813 28.122292 +v 69.254990 28.006550 27.929712 +v 69.368919 28.016228 27.749901 +v 69.504501 28.024693 27.585747 +v 69.659637 28.031803 27.439884 +v 69.831863 28.037455 27.314566 +v 70.018402 28.041557 27.211752 +v 70.216408 28.044043 27.133106 +v 72.439148 27.919369 28.739426 +v 72.426010 27.906513 28.951679 +v 72.386322 27.894171 29.160656 +v 72.320724 27.882540 29.363029 +v 72.230225 27.871803 29.555611 +v 72.116295 27.862123 29.735420 +v 71.980713 27.853661 29.899574 +v 71.825577 27.846548 30.045439 +v 71.653351 27.840897 30.170757 +v 71.466766 27.836796 30.273579 +v 71.268753 27.834311 30.352226 +v 71.062500 27.833479 30.405472 +v 70.851166 27.834311 30.432564 +v 67.698425 27.939177 29.328310 +v 69.099884 27.932537 29.166986 +v 69.165970 27.919369 29.369133 +v 72.203445 27.764736 31.307426 +v 70.638107 27.836796 30.432999 +v 70.426743 27.840897 30.406734 +v 70.220314 27.846548 30.354265 +v 70.022133 27.853661 30.276375 +v 69.835327 27.862123 30.174240 +v 69.662811 27.871803 30.049538 +v 69.507317 27.882540 29.904284 +v 69.371307 27.894171 29.740694 +v 69.256920 27.906513 29.561359 +v 67.182846 29.161577 26.648310 +v 68.410538 30.035097 29.324543 +v 74.056992 30.035097 28.238258 +v 72.954063 28.962406 31.239151 +v 68.927895 28.962406 32.013718 +v 71.274086 28.064154 31.505253 +v 68.559402 29.311287 26.393002 +v 70.218193 28.413034 26.016777 +v 71.898178 29.311287 25.750675 +v 59.056892 27.939177 30.990797 +v 57.655434 27.945814 31.152121 +v 57.589355 27.958984 30.949974 +v 57.498402 27.971840 30.757748 +v 57.384010 27.984182 30.578415 +v 57.248009 27.995813 30.414824 +v 57.092514 28.006550 30.269569 +v 56.919998 28.016228 30.144867 +v 56.733192 28.024693 30.042732 +v 56.535011 28.031803 29.964842 +v 56.328579 28.037455 29.912373 +v 56.117161 28.041557 29.886118 +v 55.904106 28.044043 29.886555 +v 55.692818 28.044874 29.913635 +v 54.551880 28.113617 29.011681 +v 55.486565 28.044043 29.966881 +v 54.329819 27.945814 31.791914 +v 54.316181 27.958984 31.579679 +v 54.329308 27.971840 31.367428 +v 54.368988 27.984182 31.158455 +v 54.434601 27.995813 30.956078 +v 54.525097 28.006550 30.763496 +v 54.639030 28.016228 30.583687 +v 54.774609 28.024693 30.419533 +v 54.929749 28.031803 30.273668 +v 55.101974 28.037455 30.148350 +v 55.288559 28.041557 30.045528 +v 57.695614 27.932537 31.360977 +v 57.709255 27.919369 31.573212 +v 57.696117 27.906513 31.785465 +v 57.656433 27.894171 31.994438 +v 57.590836 27.882540 32.196815 +v 57.500336 27.871803 32.389397 +v 57.386406 27.862123 32.569206 +v 57.250824 27.853661 32.733360 +v 57.095688 27.846548 32.879223 +v 56.923462 27.840897 33.004539 +v 56.736877 27.836796 33.107365 +v 56.538868 27.834311 33.186012 +v 56.332615 27.833479 33.239258 +v 56.121326 27.834311 33.266338 +v 55.908272 27.836796 33.266777 +v 54.369999 27.932537 32.000771 +v 54.436081 27.919369 32.202915 +v 54.527027 27.906513 32.395145 +v 54.641411 27.894171 32.574478 +v 54.777424 27.882540 32.738068 +v 55.607769 27.764736 34.500156 +v 55.696854 27.840897 33.240520 +v 55.490425 27.846548 33.188049 +v 55.292240 27.853661 33.110161 +v 55.105431 27.862123 33.008026 +v 54.932915 27.871803 32.883324 +v 58.394215 30.035097 31.251516 +v 52.747757 30.035097 32.337799 +v 53.829506 29.311287 29.226784 +v 57.855675 29.311287 28.452217 +v 55.488300 28.413034 28.850563 +v 59.597198 28.812696 33.799271 +v 58.224174 28.962406 34.072937 +v 56.544193 28.064154 34.339039 +v 54.885399 28.962406 34.715263 +v 71.292938 28.057924 31.603260 +v 70.199333 28.419264 25.918770 +v 68.942963 30.537178 28.386755 +v 68.562332 30.362362 26.408234 +v 69.423767 30.378311 30.885975 +v 68.996002 30.219070 28.662430 +v 69.535141 30.191223 31.464848 +v 69.624710 28.959290 31.930481 +v 72.873917 30.191223 30.822521 +v 70.337189 30.477804 26.635292 +v 69.659355 29.816544 26.111471 +v 71.901108 30.362362 25.765907 +v 72.281738 30.537178 27.744431 +v 72.334778 30.219070 28.020103 +v 72.974686 29.105885 31.346336 +v 72.762543 30.378311 30.243649 +v 72.457283 30.627293 28.692375 +v 72.470924 30.614124 28.904610 +v 72.457787 30.601269 29.116861 +v 72.418106 30.588924 29.325836 +v 72.352501 30.577293 29.528212 +v 72.262001 30.566557 29.720791 +v 72.148071 30.556877 29.900600 +v 72.012497 30.548416 30.064758 +v 71.857361 30.541304 30.210621 +v 71.685135 30.535652 30.335938 +v 71.498550 30.531551 30.438761 +v 71.300537 30.529064 30.517406 +v 71.094284 30.528233 30.570656 +v 70.207520 30.528126 30.742981 +v 70.669891 30.531551 30.598179 +v 70.458519 30.535652 30.571915 +v 70.252090 30.541304 30.519445 +v 70.053909 30.548416 30.441555 +v 69.867096 30.556877 30.339422 +v 69.694580 30.566557 30.214722 +v 69.539093 30.577293 30.069466 +v 69.403091 30.588924 29.905874 +v 69.288696 30.601269 29.726540 +v 69.197739 30.614124 29.534313 +v 69.131668 30.627293 29.332167 +v 72.417099 30.640570 28.483517 +v 72.351028 30.653740 28.281372 +v 72.260071 30.666595 28.089146 +v 72.145676 30.678936 27.909809 +v 72.009674 30.690569 27.746220 +v 71.854187 30.701305 27.600964 +v 71.681671 30.710983 27.476261 +v 71.494858 30.719448 27.374128 +v 71.296677 30.726559 27.296238 +v 71.090248 30.732208 27.243767 +v 70.878830 30.736313 27.217514 +v 70.665771 30.738798 27.217949 +v 70.454483 30.739630 27.245029 +v 70.453842 30.739841 27.241695 +v 70.248184 30.738798 27.298286 +v 70.050179 30.736313 27.376934 +v 69.863647 30.732208 27.479748 +v 69.691414 30.726559 27.605064 +v 69.536270 30.719448 27.750927 +v 69.400696 30.710983 27.915085 +v 69.286766 30.701305 28.094894 +v 69.196274 30.690569 28.287472 +v 69.130669 30.678936 28.489849 +v 69.090981 30.666595 28.698824 +v 69.077843 30.653740 28.911076 +v 69.091484 30.640570 29.123310 +v 71.007957 30.540230 27.122408 +v 56.563049 28.057924 34.437046 +v 55.469444 28.419264 28.752552 +v 54.213074 30.537178 31.220539 +v 53.832436 30.362362 29.242018 +v 54.693878 30.378311 33.719757 +v 54.266106 30.219070 31.496214 +v 54.805244 30.191223 34.298630 +v 54.902679 29.357473 34.805073 +v 58.144020 30.191223 33.656307 +v 55.607292 30.477804 29.469078 +v 54.929462 29.816544 28.945257 +v 57.158852 29.314400 28.535456 +v 57.284344 30.324982 29.187744 +v 57.551849 30.537178 30.578217 +v 57.814846 30.099600 31.945259 +v 58.244793 29.105885 34.180122 +v 58.032654 30.378311 33.077431 +v 57.727394 30.627293 31.526159 +v 57.741032 30.614124 31.738392 +v 57.727894 30.601269 31.950645 +v 57.688210 30.588924 32.159622 +v 57.622612 30.577293 32.362000 +v 57.532112 30.566557 32.554577 +v 57.418182 30.556877 32.734386 +v 57.282600 30.548416 32.898544 +v 57.127464 30.541304 33.044403 +v 56.955238 30.535652 33.169724 +v 56.768654 30.531551 33.272545 +v 56.570648 30.529064 33.351189 +v 56.364391 30.528233 33.404442 +v 55.477631 30.528126 33.576767 +v 55.940048 30.531551 33.431953 +v 55.728630 30.535652 33.405701 +v 55.522202 30.541304 33.353230 +v 55.324017 30.548416 33.275337 +v 55.137207 30.556877 33.173206 +v 54.964695 30.566557 33.048508 +v 54.809204 30.577293 32.903252 +v 54.673187 30.588924 32.739662 +v 54.558804 30.601269 32.560326 +v 54.467861 30.614124 32.368095 +v 54.401779 30.627293 32.165955 +v 57.687210 30.640570 31.317303 +v 57.621132 30.653740 31.115156 +v 57.530182 30.666595 30.922928 +v 57.415791 30.678936 30.743595 +v 57.279785 30.690569 30.580006 +v 57.124294 30.701305 30.434750 +v 56.951782 30.710983 30.310047 +v 56.764969 30.719448 30.207914 +v 56.566788 30.726559 30.130024 +v 56.360359 30.732208 30.077553 +v 56.148941 30.736313 30.051300 +v 55.935886 30.738798 30.051735 +v 55.724598 30.739630 30.078815 +v 55.723957 30.739841 30.075481 +v 55.518341 30.738798 30.132063 +v 55.320335 30.736313 30.210709 +v 55.133751 30.732208 30.313532 +v 54.961525 30.726559 30.438850 +v 54.806385 30.719448 30.584713 +v 54.670807 30.710983 30.748867 +v 54.556877 30.701305 30.928679 +v 54.466377 30.690569 31.121258 +v 54.400768 30.678936 31.323635 +v 54.361088 30.666595 31.532608 +v 54.347961 30.653740 31.744860 +v 54.361595 30.640570 31.957096 +v 56.278065 30.540230 29.956192 +v 72.420639 30.939987 28.501871 +v 72.379440 27.446785 28.287746 +v 69.135193 30.926712 29.350521 +v 69.094002 27.433510 29.136396 +v 71.056618 27.334450 30.374886 +v 71.097809 30.827650 30.589008 +v 69.742195 27.617165 30.102001 +v 69.870636 30.856297 30.357777 +v 69.363037 27.517200 27.719313 +v 69.339844 30.856140 28.010603 +v 69.825974 27.538425 27.283978 +v 69.867172 31.031628 27.498100 +v 69.365425 27.395142 29.710104 +v 69.406616 30.888344 29.924229 +v 71.052582 27.538425 27.047997 +v 71.093781 31.031628 27.262123 +v 71.457199 27.525665 27.178358 +v 71.498390 31.018864 27.392483 +v 69.093002 27.485153 28.294079 +v 69.134201 30.978355 28.508202 +v 69.653748 27.532776 27.409294 +v 69.694946 31.025976 27.623417 +v 70.012512 27.542528 27.181164 +v 70.053711 31.035728 27.395287 +v 71.819687 27.347519 30.014851 +v 71.860886 30.840721 30.228973 +v 70.420860 27.341869 30.376144 +v 70.462051 30.835072 30.590271 +v 70.016243 27.354631 30.245785 +v 70.057442 30.847832 30.459909 +v 69.251038 27.407484 29.530769 +v 69.292229 30.900684 29.744894 +v 72.313354 27.459957 28.085602 +v 72.354553 30.953157 28.299725 +v 72.108017 27.485153 27.714039 +v 72.149216 30.978355 27.928164 +v 71.737137 27.762161 27.352734 +v 71.685196 31.010403 27.494616 +v 71.972015 27.496784 27.550449 +v 72.013206 30.989986 27.764574 +v 70.841171 27.542528 27.021744 +v 70.882362 31.035728 27.235867 +v 70.416824 27.545847 27.049259 +v 70.458023 31.039047 27.263382 +v 71.259018 27.532776 27.100468 +v 71.300209 31.025976 27.314592 +v 69.040184 27.459957 28.715305 +v 69.081375 30.953157 28.929430 +v 69.158600 27.496784 28.091702 +v 69.199799 30.989986 28.305826 +v 69.249100 27.507523 27.899122 +v 69.053322 27.472813 28.503054 +v 69.094513 30.966013 28.717178 +v 69.095016 30.939987 29.141665 +v 69.053818 27.446785 28.927540 +v 69.498611 27.525665 27.555157 +v 69.539810 31.018864 27.769279 +v 70.210518 27.545013 27.102516 +v 70.251717 31.038216 27.316641 +v 71.262878 27.335281 30.321636 +v 71.304062 30.828482 30.535759 +v 71.647461 27.341869 30.140167 +v 71.688660 30.835072 30.354290 +v 71.974823 27.354631 29.868988 +v 72.016022 30.847832 30.083111 +v 72.224342 27.372772 29.525021 +v 72.212448 30.711140 29.823437 +v 72.380432 27.395142 29.130066 +v 72.421631 30.888344 29.344189 +v 72.420120 27.407484 28.921089 +v 72.461319 30.900684 29.135214 +v 72.460815 30.926712 28.710728 +v 72.422562 27.683025 28.511898 +v 70.214432 27.347519 30.323675 +v 70.255623 30.840721 30.537800 +v 70.632233 27.337767 30.402409 +v 70.778152 30.679604 30.613853 +v 70.845276 27.335281 30.401974 +v 70.886475 30.828482 30.616096 +v 69.501427 27.383511 29.873695 +v 69.542625 30.876711 30.087818 +v 69.698120 30.865974 30.233074 +v 69.160080 27.420340 29.338543 +v 69.201279 30.913540 29.552666 +v 72.222404 27.472813 27.893375 +v 72.263603 30.966013 28.107498 +v 71.857712 31.000725 27.619318 +v 70.628113 27.545013 27.022179 +v 70.669312 31.038216 27.236301 +v 71.460876 27.337767 30.242990 +v 71.502075 30.830967 30.457115 +v 72.110413 27.363094 29.704830 +v 72.314835 27.383511 29.332441 +v 72.356033 30.876711 29.546566 +v 72.433258 27.420340 28.708839 +v 72.474457 30.913540 28.922962 +v 57.690742 30.939987 31.335655 +v 57.649551 27.446785 31.121532 +v 54.405308 30.926712 32.184303 +v 54.364113 27.433510 31.970182 +v 56.326729 27.334450 33.208672 +v 56.367924 30.827650 33.422791 +v 55.012306 27.617165 32.935783 +v 55.140739 30.856297 33.191559 +v 54.633144 27.517200 30.553097 +v 54.609955 30.856140 30.844387 +v 55.096085 27.538425 30.117762 +v 55.137283 31.031628 30.331886 +v 54.635525 27.395142 32.543892 +v 54.676720 30.888344 32.758015 +v 56.322693 27.538425 29.881783 +v 56.363888 31.031628 30.095905 +v 56.727306 27.525665 30.012144 +v 56.768501 31.018864 30.226267 +v 54.363106 27.485153 31.127865 +v 54.404297 30.978355 31.341988 +v 54.923859 27.532776 30.243080 +v 54.965057 31.025976 30.457203 +v 55.282669 27.542528 30.014938 +v 55.323868 31.035728 30.229061 +v 57.089802 27.347519 32.848633 +v 57.130997 30.840721 33.062759 +v 55.690971 27.341869 33.209930 +v 55.732162 30.835072 33.424057 +v 55.286354 27.354631 33.079567 +v 55.327549 30.847832 33.293694 +v 54.521141 27.407484 32.364555 +v 54.562336 30.900684 32.578678 +v 57.583469 27.459957 30.919386 +v 57.624664 30.953157 31.133511 +v 57.378128 27.485153 30.547825 +v 57.419319 30.978355 30.761948 +v 57.007240 27.762161 30.186518 +v 56.955307 31.010403 30.328400 +v 57.242123 27.496784 30.384235 +v 57.283318 30.989986 30.598358 +v 56.111279 27.542528 29.855530 +v 56.152470 31.035728 30.069653 +v 55.686935 27.545847 29.883045 +v 55.728127 31.039047 30.097168 +v 56.529121 27.532776 29.934254 +v 56.570320 31.025976 30.148376 +v 54.310295 27.459957 31.549089 +v 54.351490 30.953157 31.763214 +v 54.428715 27.496784 30.925488 +v 54.469910 30.989986 31.139610 +v 54.519211 27.507523 30.732908 +v 54.323425 27.472813 31.336838 +v 54.364616 30.966013 31.550964 +v 54.365128 30.939987 31.975449 +v 54.323933 27.446785 31.761326 +v 54.768723 27.525665 30.388943 +v 54.809917 31.018864 30.603065 +v 55.480682 27.545013 29.936293 +v 55.521873 31.038216 30.150417 +v 57.730923 30.926712 31.544512 +v 57.689728 27.433510 31.330389 +v 56.532982 27.335281 33.155418 +v 56.574177 30.828482 33.369545 +v 56.917576 27.341869 32.973953 +v 56.958771 30.835072 33.188076 +v 57.244938 27.354631 32.702774 +v 57.286133 30.847832 32.916893 +v 57.494453 27.372772 32.358807 +v 57.482563 30.711140 32.657219 +v 57.650547 27.395142 31.963852 +v 57.691742 30.888344 32.177975 +v 57.690231 27.407484 31.754875 +v 57.731426 30.900684 31.968998 +v 55.484539 27.347519 33.157459 +v 55.525734 30.840721 33.371586 +v 55.902386 27.337767 33.236183 +v 56.048359 30.679604 33.447617 +v 56.115440 27.335281 33.235748 +v 56.156635 30.828482 33.449875 +v 54.771538 27.383511 32.707481 +v 54.812733 30.876711 32.921604 +v 54.968224 30.865974 33.066856 +v 54.430199 27.420340 32.172325 +v 54.471390 30.913540 32.386452 +v 57.492516 27.472813 30.727158 +v 57.533710 30.966013 30.941284 +v 57.127823 31.000725 30.453102 +v 55.898224 27.545013 29.855965 +v 55.939415 31.038216 30.070087 +v 56.730991 27.337767 33.076775 +v 56.772186 30.830967 33.290901 +v 57.380516 27.363094 32.538616 +v 57.584949 27.383511 32.166229 +v 57.626144 30.876711 32.380348 +v 57.703369 27.420340 31.542622 +v 57.744564 30.913540 31.756746 +v 71.968338 26.315218 30.481468 +v 70.098694 26.579535 26.529116 +v 69.414413 26.607899 30.284462 +v 72.160309 26.581665 30.184135 +v 71.733040 27.032171 27.003265 +v 69.956200 26.819508 26.728064 +v 70.342125 26.580122 26.472696 +v 68.642342 26.707924 28.801178 +v 68.660568 26.732841 28.391180 +v 68.739578 26.754332 28.025385 +v 69.299118 26.615072 30.189610 +v 68.675522 26.691605 29.061028 +v 72.108589 26.319937 30.377516 +v 72.493721 26.602472 29.780579 +v 72.015846 27.016306 27.207657 +v 69.592812 26.812012 26.920242 +v 69.678917 26.574068 26.699045 +v 68.562599 26.497252 28.167009 +v 68.509338 26.474747 28.544397 +v 69.119263 26.628878 29.998981 +v 69.728638 26.850067 30.359697 +v 68.707001 26.409433 29.571854 +v 72.668144 26.934923 28.409842 +v 72.417603 26.334480 30.080812 +v 72.495529 26.339773 29.979467 +v 69.341316 26.564245 26.924273 +v 54.651581 26.609947 33.091145 +v 58.167965 26.443861 31.037786 +v 57.984772 26.707924 30.851517 +v 57.238449 26.315218 33.315254 +v 54.565544 26.801542 29.982037 +v 58.079407 26.371498 32.235325 +v 58.013012 26.474747 30.563715 +v 55.368805 26.579535 29.362902 +v 54.993431 26.591278 33.329979 +v 55.230995 26.581665 33.441048 +v 54.771683 26.602472 33.190002 +v 57.761147 26.739536 30.378838 +v 57.003143 27.032171 29.837051 +v 55.107254 26.576782 29.458143 +v 53.974915 26.521887 30.571533 +v 53.910694 26.512682 30.734039 +v 57.818161 26.607899 32.515388 +v 57.606628 26.754332 30.167179 +v 57.285950 27.016306 30.041443 +v 54.862923 26.812012 29.754026 +v 54.949017 26.574068 29.532829 +v 55.612232 26.580122 29.306482 +v 54.232159 26.780737 30.385586 +v 54.302399 26.549704 30.054762 +v 54.033253 26.528168 30.457861 +v 54.457920 26.362295 33.082184 +v 58.015217 26.362295 32.397823 +v 57.954395 26.482391 30.450287 +v 54.224499 26.544409 30.156107 +v 55.350819 26.319937 33.601429 +v 72.581818 31.931406 28.642597 +v 69.247734 32.009239 28.014282 +v 69.908287 33.045830 27.321976 +v 72.610809 31.917156 28.869511 +v 68.997543 31.931406 29.332151 +v 72.329315 31.973259 28.008385 +v 68.968552 31.945658 29.105236 +v 72.524551 31.945658 28.421124 +v 69.718849 31.853573 30.463123 +v 72.582649 31.889553 29.325228 +v 69.417747 33.029507 27.682684 +v 69.600281 33.037315 27.520166 +v 71.349800 33.037315 27.183588 +v 69.250061 31.889553 29.966362 +v 72.740997 32.896088 29.219879 +v 72.040512 31.835407 30.312843 +v 68.996719 31.973259 28.649521 +v 69.773560 32.035866 27.478678 +v 69.506042 33.033638 27.598263 +v 70.333771 32.044880 27.223888 +v 70.872749 32.809589 30.990463 +v 69.385010 31.876631 30.151194 +v 72.525909 31.876631 29.546936 +v 71.864098 31.828529 30.458990 +v 68.855392 32.956409 28.983366 +v 69.053452 31.986179 28.427811 +v 69.137558 31.998238 28.214966 +v 69.382187 32.019012 27.828947 +v 72.171112 32.998066 27.665890 +v 70.787460 32.043091 27.165773 +v 71.459435 32.027405 27.292416 +v 70.386681 32.817955 30.947479 +v 70.253113 32.821613 30.913517 +v 69.819046 32.838135 30.727482 +v 69.509567 32.855495 30.503813 +v 69.063927 32.896088 29.927288 +v 72.747513 32.902519 29.113739 +v 71.455765 32.809589 30.878304 +v 71.787888 32.815147 30.723747 +v 72.331635 31.853573 29.960466 +v 72.441803 31.864576 29.759783 +v 72.541077 32.855495 29.920601 +v 68.861908 32.962837 28.877224 +v 69.061829 33.003433 28.176502 +v 69.266235 33.020794 27.853973 +v 70.019012 33.047729 27.269726 +v 70.147141 33.049339 27.218803 +v 72.194366 31.986179 27.823555 +v 71.860519 32.009239 27.511625 +v 70.990250 33.045830 27.113823 +v 71.173492 32.035866 27.209354 +v 70.607948 33.050293 27.114550 +v 69.054817 31.917156 29.553627 +v 70.722923 31.820793 30.804764 +v 70.612663 32.813095 30.983280 +v 70.119934 31.835407 30.682331 +v 69.912468 32.833904 30.778522 +v 69.431808 32.860863 30.431215 +v 71.783859 33.020794 27.369621 +v 71.690437 33.025024 27.318584 +v 69.018494 32.902519 29.831139 +v 70.506989 32.815147 30.970173 +v 71.694626 32.813095 30.775129 +v 71.583900 32.811199 30.827377 +v 71.339340 32.808632 30.916300 +v 71.168411 32.808216 30.955994 +v 72.259796 31.848354 30.059460 +v 72.268860 32.833904 30.325191 +v 72.538986 32.962837 28.169817 +v 72.584412 32.956409 28.265965 +v 72.093338 33.003433 27.593292 +v 70.994957 32.808632 30.982553 +v 57.851929 31.931406 31.476381 +v 54.517845 32.009239 30.848066 +v 55.178398 33.045830 30.155760 +v 57.880920 31.917156 31.703297 +v 54.267658 31.931406 32.165936 +v 57.599419 31.973259 30.842171 +v 54.238655 31.945658 31.939022 +v 57.794659 31.945658 31.254906 +v 54.988960 31.853573 33.296906 +v 57.852760 31.889553 32.159012 +v 54.808964 32.027405 30.495689 +v 54.985382 32.034283 30.349545 +v 56.511497 32.034283 30.055944 +v 54.520180 31.889553 32.800144 +v 58.011108 32.896088 32.053665 +v 57.310623 31.835407 33.146629 +v 54.266842 31.973259 31.483303 +v 55.085125 33.043781 30.207142 +v 55.704605 33.050713 29.974895 +v 56.142860 32.809589 33.824249 +v 54.655117 31.876631 32.984978 +v 57.796021 31.876631 32.380722 +v 57.161301 32.817955 33.491821 +v 54.125465 32.956409 31.817158 +v 54.323566 31.986179 31.261597 +v 54.407684 31.998238 31.048748 +v 54.652302 32.019012 30.662731 +v 55.533676 33.050293 30.014589 +v 57.441216 32.998066 30.499674 +v 56.057571 32.043091 29.999559 +v 56.729546 32.027405 30.126202 +v 55.608093 31.828529 33.586372 +v 55.089157 32.838135 33.561268 +v 54.779667 32.855495 33.337601 +v 54.334042 32.896088 32.761070 +v 58.017624 32.902519 31.947525 +v 56.725872 32.809589 33.712090 +v 57.058002 32.815147 33.557533 +v 57.601746 31.853573 32.794250 +v 57.711914 31.864576 32.593567 +v 57.811188 32.855495 32.754387 +v 54.132027 32.962837 31.711008 +v 54.331932 33.003433 31.010290 +v 54.536339 33.020794 30.687756 +v 55.385986 32.043091 30.128761 +v 57.464470 31.986179 30.657339 +v 57.130630 32.009239 30.345409 +v 56.260357 33.045830 29.947609 +v 55.878059 33.050293 29.948336 +v 54.324921 31.917156 32.387413 +v 55.993080 31.820793 33.638538 +v 55.882774 32.813095 33.817062 +v 55.390045 31.835407 33.516117 +v 55.182579 32.833904 33.612305 +v 54.701931 32.860863 33.264996 +v 57.272736 32.821613 33.410721 +v 57.053970 33.020794 30.203407 +v 56.960548 33.025024 30.152367 +v 56.366035 33.043781 29.960716 +v 54.288567 32.902519 32.664932 +v 55.777092 32.815147 33.803955 +v 56.964729 32.813095 33.608917 +v 56.854012 32.811199 33.661163 +v 56.609451 32.808632 33.750084 +v 56.438522 32.808216 33.789780 +v 57.529907 31.848354 32.893242 +v 57.538971 32.833904 33.158978 +v 57.809090 32.962837 31.003601 +v 57.854523 32.956409 31.099751 +v 57.363449 33.003433 30.427076 +v 56.265068 32.808632 33.816338 +v 67.710693 39.093384 25.775009 +v 58.390137 29.744638 12.561989 +v 53.301613 30.837086 17.513102 +v 66.998322 30.350315 22.819202 +v 53.510498 29.193283 22.495529 +v 65.717789 30.823067 15.353117 +v 65.329773 35.080704 19.524605 +v 65.208099 35.579727 19.579735 +v 65.675636 35.415257 22.173010 +v 61.460754 30.122192 27.606140 +v 47.649055 27.454153 12.493173 +v 47.290409 27.790154 12.328449 +v 70.123520 33.096260 26.457876 +v 70.434082 33.071548 26.801268 +v 69.936821 33.076488 26.816385 +v 69.685043 33.065853 27.038284 +v 69.770439 33.080070 26.789906 +v 63.151642 33.009308 29.217632 +v 63.290779 32.984978 29.587803 +v 63.429760 32.932781 30.412621 +v 63.407700 32.940395 30.292667 +v 63.390350 32.948917 30.156967 +v 63.334511 32.970093 29.822248 +v 63.318298 32.978077 29.695122 +v 63.284714 32.991623 29.480576 +v 65.170296 32.997131 29.027990 +v 61.567287 33.059551 28.702791 +v 63.587120 33.089775 27.821175 +v 63.470627 33.093452 27.783619 +v 60.887775 33.080994 28.483789 +v 54.167400 33.082066 29.759163 +v 52.926620 33.098160 29.735325 +v 52.659462 33.091377 29.897301 +v 52.462818 33.080070 30.119602 +v 52.384384 33.071388 30.276371 +v 52.328743 33.060848 30.458994 +v 52.313683 33.046104 30.702461 +v 52.329174 33.038490 30.823681 +v 52.969357 33.039158 30.689613 +v 52.571171 33.087246 29.981724 +v 53.488445 33.076488 29.980782 +v 73.954010 33.014244 27.058990 +v 73.492531 32.996738 27.433302 +v 73.832451 33.033283 26.771727 +v 73.760345 33.040184 26.672985 +v 73.582001 33.052505 26.506313 +v 73.367722 33.062210 26.389236 +v 71.162155 33.053223 26.960196 +v 70.851105 33.067471 26.787560 +v 70.676483 33.070595 26.770233 +v 74.502411 32.833042 29.909569 +v 73.923241 32.854427 29.672142 +v 74.496109 32.814003 30.221432 +v 74.465790 32.807098 30.339878 +v 73.815895 32.821659 30.227333 +v 74.362015 32.794777 30.560827 +v 73.649445 32.806507 30.506533 +v 74.206474 32.785072 30.749050 +v 74.112228 32.781399 30.827145 +v 63.571854 32.884747 31.168949 +v 63.482590 32.914238 30.704979 +v 63.449841 32.926147 30.517002 +v 65.286980 32.919964 30.264404 +v 61.677921 32.908604 31.144112 +v 65.416847 32.890198 30.725039 +v 63.595421 32.876957 31.291462 +v 63.613636 32.870937 31.386137 +v 61.732666 32.866093 31.827078 +v 61.727100 32.859928 31.928732 +v 63.721375 32.849617 31.713259 +v 63.746559 32.843353 31.810556 +v 61.692570 32.837376 32.303265 +v 63.794128 32.829422 32.028717 +v 65.893768 32.825825 31.683489 +v 61.684250 32.823376 32.533310 +v 66.160912 32.812107 31.855865 +v 66.533264 32.776691 32.361996 +v 53.116489 32.810104 34.398037 +v 52.954250 32.833042 34.055077 +v 53.403961 32.854427 33.619709 +v 53.503826 32.840313 33.830807 +v 53.653728 32.825954 34.036137 +v 54.578373 32.788551 34.468437 +v 53.657028 32.781399 34.762383 +v 53.540535 32.785072 34.724831 +v 53.326263 32.794777 34.607758 +v 48.117363 32.414230 25.472364 +v 47.936600 37.451244 25.062084 +v 47.462337 33.349678 22.596886 +v 48.472832 34.769199 27.849392 +v 48.132996 37.451244 25.024300 +v 47.448547 35.891544 21.995876 +v 47.658737 33.349678 22.559101 +v 48.669228 34.769199 27.811611 +v 68.597794 32.460957 20.770002 +v 68.529022 34.956100 20.941839 +v 68.656647 37.451244 21.075893 +v 68.725418 34.956100 20.904057 +v 69.192871 34.769199 23.863203 +v 68.061569 35.143002 17.982693 +v 55.493916 28.714106 7.319708 +v 55.513721 36.246075 7.617717 +v 55.613857 36.785557 7.873100 +v 55.716690 36.180756 8.096821 +v 61.174526 35.372417 7.578281 +v 56.715851 36.162281 9.156989 +v 56.882771 35.167583 9.204084 +v 56.822067 30.019897 8.888545 +v 56.431080 30.478729 8.663978 +v 56.156376 36.533798 8.710601 +v 55.448944 35.688725 7.386063 +v 58.242477 32.209637 9.415129 +v 57.847332 33.890442 9.466166 +v 55.887363 36.691738 8.367769 +v 60.789288 36.162281 8.373327 +v 60.650536 35.064186 8.472656 +v 60.650768 30.852600 8.148406 +v 61.226772 28.741980 5.832928 +v 61.276680 36.221165 6.092371 +v 61.304726 36.245945 6.238131 +v 61.139194 35.320530 7.654732 +v 59.853283 33.890442 9.080255 +v 61.334484 36.246075 6.497900 +v 61.323769 36.180756 7.018112 +v 61.336254 36.785557 6.772207 +v 61.212914 36.040863 7.487852 +v 61.270916 36.696884 7.311611 +v 61.101208 36.471527 7.835536 +v 60.939262 35.652382 8.111008 +v 55.129189 35.673710 5.810829 +v 55.272560 36.103405 6.556059 +v 55.155918 35.824539 5.949753 +v 55.188896 35.935432 6.121159 +v 55.388840 36.221134 7.160454 +v 55.282745 35.532955 6.608987 +v 54.923420 34.600830 4.741237 +v 55.004421 35.057861 5.162272 +v 55.052929 35.978577 5.414425 +v 54.940838 30.423944 4.831768 +v 55.182667 30.252462 6.088789 +v 55.207291 28.823801 6.216789 +v 60.840225 34.880630 3.736892 +v 60.853653 32.655666 3.806683 +v 60.900909 31.887091 4.052315 +v 60.842358 35.727879 3.747977 +v 60.912659 36.041630 4.113379 +v 60.989826 36.306293 4.514506 +v 61.135990 36.051147 5.274265 +v 61.164520 36.103405 5.422544 +v 61.280792 36.221134 6.026940 +v 61.204659 29.431095 5.674609 +v 55.328812 29.431095 6.805025 +v 61.294086 36.786648 6.124968 +v 55.408882 36.221165 7.221238 +v 46.259369 31.056692 15.285244 +v 44.349480 28.218271 12.921448 +v 44.634125 27.525064 13.077703 +v 49.204826 26.501539 28.896095 +v 45.588505 27.542517 12.810178 +# 3660 vertices, 0 vertices normals + +f 90 1792 1 1782 +f 2 1784 83 1782 +f 1783 3 1784 2 +f 3 3624 1716 1784 +f 1785 1690 3655 5 +f 1786 73 1882 4 +f 1787 1667 1785 5 +f 4 1903 1668 1787 +f 1786 5 3635 6 +f 1759 1804 18 1788 +f 97 1808 23 1788 +f 69 1805 20 1789 +f 24 1809 25 1789 +f 7 1918 99 1790 +f 1763 3649 1764 1790 +f 1739 3634 22 1791 +f 8 1879 17 1791 +f 90 1919 89 1792 +f 9 3651 1 1792 +f 6 3635 16 1793 +f 70 1881 73 1793 +f 1750 1808 10 1794 +f 11 1932 1749 1794 +f 47 1809 12 1795 +f 13 2847 45 1795 +f 94 1923 93 1796 +f 1796 1720 3628 1723 +f 1797 1676 1798 94 +f 1798 14 1799 94 +f 15 1904 82 1800 +f 76 1801 1699 1800 +f 1801 1685 3611 1699 +f 89 1915 7 1802 +f 1764 3650 9 1802 +f 16 3632 1739 1803 +f 17 1880 70 1803 +f 19 1931 18 1804 +f 1759 3647 1761 1804 +f 1738 3638 20 1805 +f 69 1877 21 1805 +f 99 1931 19 1806 +f 1761 3648 1763 1806 +f 22 3639 1738 1807 +f 21 1878 8 1807 +f 1810 27 2494 26 +f 1811 612 1812 40 +f 510 2615 29 1813 +f 1814 28 1813 29 +f 1815 31 1814 29 +f 1815 616 2590 590 +f 31 1815 590 1816 +f 1816 30 2591 606 +f 31 1816 606 1817 +f 33 1818 32 1817 +f 1818 607 2592 593 +f 32 1818 593 1819 +f 1819 34 2593 36 +f 1820 35 1821 32 +f 1821 531 1822 32 +f 1822 608 1823 32 +f 1823 527 1829 32 +f 1824 526 1830 43 +f 586 2600 37 1825 +f 1825 40 1826 38 +f 614 2587 39 1827 +f 1827 40 2424 43 +f 1828 603 2599 614 +f 43 1833 585 1828 +f 1830 42 1831 43 +f 1831 41 1832 43 +f 1832 602 1833 43 +f 1833 601 2530 585 +f 1834 859 1840 44 +f 1835 753 1836 45 +f 1836 784 1837 45 +f 46 1875 47 1837 +f 1838 791 1846 859 +f 1839 781 1840 859 +f 1841 48 1839 859 +f 1842 805 1841 859 +f 1843 49 1842 859 +f 1844 760 1843 859 +f 1845 802 1844 859 +f 1846 801 1845 859 +f 1838 54 1847 50 +f 1848 51 1847 54 +f 1849 52 1848 54 +f 1850 795 1849 54 +f 1851 799 1850 54 +f 1852 53 1851 54 +f 1853 56 1854 55 +f 1854 1776 1855 55 +f 1856 57 1865 1776 +f 1857 828 1856 1776 +f 60 2805 61 1858 +f 1859 75 1894 60 +f 1860 823 1862 59 +f 1861 62 1859 60 +f 1862 850 1864 59 +f 1863 63 1861 60 +f 1865 857 1855 1776 +f 1866 58 1857 1776 +f 1867 64 1866 1776 +f 1868 768 1867 1776 +f 1869 65 1868 1776 +f 66 1869 1776 1864 +f 1870 140 1872 60 +f 1871 67 1863 60 +f 1872 132 1871 60 +f 59 1873 255 1858 +f 1874 493 2497 32 +f 1873 1773 1874 32 +f 1875 25 1809 47 +f 1875 46 2738 68 +f 1876 69 1789 25 +f 1876 68 2728 777 +f 1877 777 2757 780 +f 1878 780 2759 751 +f 1879 751 2734 750 +f 1880 750 2753 72 +f 1881 72 2752 71 +f 73 1881 71 1882 +f 1882 847 1883 4 +f 1884 82 1883 843 +f 1885 76 1884 74 +f 1886 817 1887 75 +f 1887 838 1888 75 +f 1888 813 1889 75 +f 1889 77 1890 75 +f 1890 78 1891 75 +f 1891 763 1892 75 +f 1892 810 1893 75 +f 1893 807 1894 75 +f 1885 79 1886 75 +f 1895 938 1901 1547 +f 1896 933 1895 1547 +f 1897 80 1899 81 +f 1898 867 1899 80 +f 1900 864 1902 945 +f 938 2966 945 1902 +f 864 3539 1578 1902 +f 82 1904 1670 1903 +f 93 1922 83 1905 +f 1905 1716 3626 1719 +f 1906 1720 1796 93 +f 121 1974 120 1907 +f 1907 1593 1909 84 +f 1908 123 1977 84 +f 1909 865 1908 84 +f 98 2722 742 1910 +f 1911 98 1931 99 +f 1912 85 1911 99 +f 1913 752 1912 99 +f 1914 86 1913 99 +f 1915 749 1920 7 +f 1916 756 1914 99 +f 1917 87 1916 99 +f 778 2733 88 1918 +f 1919 91 1915 89 +f 1920 778 1918 7 +f 1919 90 1921 773 +f 1921 83 1922 846 +f 92 2719 846 1922 +f 1923 841 2823 92 +f 1924 95 2825 841 +f 1924 94 1799 138 +f 1925 815 2798 95 +f 1925 138 1983 129 +f 1926 812 2820 815 +f 1926 129 1985 134 +f 1927 836 2794 812 +f 1927 134 1992 133 +f 1928 834 2795 836 +f 1928 133 1986 139 +f 1929 139 1997 125 +f 1929 96 2792 834 +f 11 1794 10 1910 +f 1930 98 1910 10 +f 97 1788 18 1930 +f 1931 98 1930 18 +f 1932 11 1910 742 +f 1933 804 1934 101 +f 1934 761 1935 101 +f 1935 748 1936 101 +f 1936 759 1937 101 +f 1937 800 1938 101 +f 100 1939 861 1938 +f 1939 789 1940 861 +f 1940 790 1941 861 +f 1941 102 1942 861 +f 1942 103 1943 861 +f 1943 794 1944 861 +f 1944 105 1945 861 +f 1945 104 1946 861 +f 1946 830 1947 861 +f 1947 106 1948 861 +f 1948 108 1949 861 +f 1949 107 1968 861 +f 1950 826 1967 115 +f 96 1929 125 1951 +f 126 1952 109 1951 +f 1953 808 1952 126 +f 1954 110 1953 126 +f 1955 111 1954 126 +f 1956 851 1955 126 +f 1957 821 1956 126 +f 1958 112 1959 848 +f 1959 629 1960 848 +f 126 2196 628 1958 +f 1961 818 1960 629 +f 1962 113 1963 766 +f 1964 746 1963 113 +f 1965 630 1966 114 +f 1969 116 1970 117 +f 1970 633 1971 117 +f 1971 118 1972 117 +f 1972 631 1975 117 +f 1973 119 1974 121 +f 1968 115 1969 117 +f 1976 122 1978 117 +f 1978 861 1968 117 +f 124 1977 123 1976 +f 1870 255 1979 125 +f 1979 126 1951 125 +f 1859 62 1980 127 +f 1981 128 1980 62 +f 1982 1693 1981 62 +f 1983 1702 1994 130 +f 1984 1711 1985 129 +f 1871 132 1986 133 +f 132 1872 139 1986 +f 1985 131 1987 134 +f 1987 1713 1988 134 +f 1988 135 1989 134 +f 1989 1701 1992 134 +f 1990 137 3613 136 +f 1861 63 1991 1691 +f 1991 136 1982 1691 +f 63 1992 1701 1991 +f 1992 63 1863 133 +f 1863 67 1871 133 +f 1799 1733 1993 138 +f 1993 1730 1994 138 +f 1994 1702 1983 138 +f 1801 76 1885 75 +f 1995 1685 1801 75 +f 75 1859 127 1996 +f 1872 140 1997 139 +f 140 1870 125 1997 +f 142 2034 1779 1998 +f 141 3512 149 1998 +f 1999 1756 2169 1548 +f 2000 143 1999 1548 +f 2001 1715 2000 1548 +f 2002 1725 2168 231 +f 2003 1672 2002 231 +f 2004 1727 2003 231 +f 2005 1728 2004 231 +f 2006 1705 2005 231 +f 2007 146 2008 1712 +f 2009 1663 2008 146 +f 2010 144 2009 146 +f 2011 145 2010 146 +f 2012 147 2011 146 +f 1692 3613 1695 2013 +f 2013 146 3503 1535 +f 2014 1692 2013 1535 +f 2015 1694 2014 1535 +f 2016 149 2017 1682 +f 2018 1666 2035 1769 +f 1535 3504 142 2016 +f 2019 1683 2017 149 +f 2020 1666 3602 148 +f 2020 149 3512 860 +f 156 2034 252 2021 +f 2022 156 2195 150 +f 151 3351 1345 2022 +f 2023 156 2022 1345 +f 1346 3353 1319 2023 +f 2024 156 2023 1319 +f 152 3344 1321 2024 +f 2025 1320 2026 156 +f 2026 153 2027 156 +f 2027 1348 2028 156 +f 2028 154 2029 156 +f 2029 155 2030 156 +f 2030 157 2033 156 +f 2031 1360 2032 156 +f 2032 1326 2126 156 +f 2033 1325 2031 156 +f 860 2843 1744 2035 +f 2036 1226 2037 166 +f 2037 158 2038 166 +f 2038 160 2039 166 +f 2039 159 2047 166 +f 2040 161 2041 162 +f 2041 1276 2042 162 +f 2042 1248 2043 162 +f 1249 3312 163 2043 +f 2044 162 2043 163 +f 1278 3311 164 2044 +f 2045 162 2044 164 +f 1247 3321 165 2045 +f 2046 162 2045 165 +f 2046 1274 3310 1246 +f 2048 162 2046 1246 +f 2049 1225 2137 866 +f 2050 1291 2049 866 +f 2051 167 2050 866 +f 2052 1289 2051 866 +f 2053 168 2052 866 +f 2054 1237 2053 866 +f 2055 169 2054 866 +f 2056 1229 2055 866 +f 2057 1261 2056 866 +f 2058 1262 2057 866 +f 2059 170 2058 866 +f 2060 1260 2059 866 +f 1258 3316 171 2061 +f 2061 866 2062 1301 +f 172 3327 1301 2062 +f 2062 866 2063 1300 +f 1236 3306 1300 2063 +f 2063 866 2064 1256 +f 1257 3315 1256 2064 +f 2064 866 2065 173 +f 2066 1287 2065 866 +f 2067 1285 2066 866 +f 2068 1284 2067 866 +f 2069 174 2068 866 +f 2070 175 2069 866 +f 2071 1253 2070 866 +f 2072 176 2071 866 +f 2073 1299 2072 866 +f 2074 1252 2073 866 +f 2075 177 2074 866 +f 2076 178 2075 866 +f 2077 1329 2078 179 +f 2079 200 2107 1374 +f 2080 180 2090 188 +f 2048 181 3314 1255 +f 2081 182 2082 162 +f 2082 1282 2083 162 +f 2084 1254 2085 1545 +f 2085 183 2086 1545 +f 2086 184 2087 1545 +f 2088 1306 2087 197 +f 2089 185 2088 186 +f 2090 187 3305 188 +f 2091 198 2104 1332 +f 2092 190 2105 199 +f 2093 191 2079 1374 +f 2094 203 2109 202 +f 2083 192 2084 1545 +f 2095 234 3511 1545 +f 2089 187 2090 1365 +f 2096 1303 2095 1545 +f 2097 193 2096 1545 +f 2098 194 2097 1545 +f 2099 1335 2098 1545 +f 2100 195 2099 1545 +f 2101 1307 2100 1545 +f 2102 1334 2101 1545 +f 2103 196 2102 1545 +f 180 3345 1365 2090 +f 2080 189 2091 1332 +f 2106 1361 2105 190 +f 2108 201 2107 200 +f 2077 866 2110 1304 +f 2111 213 2112 1363 +f 2113 204 2112 213 +f 2114 205 2113 213 +f 2115 206 2114 213 +f 2116 207 2115 213 +f 2117 208 2116 213 +f 2118 1373 2136 213 +f 2119 219 2135 213 +f 1375 3358 210 2120 +f 211 3338 217 2121 +f 2122 213 2132 214 +f 2123 212 2131 213 +f 2124 1322 2130 213 +f 2125 1328 2127 213 +f 2127 1358 2128 213 +f 2128 1359 2129 213 +f 2129 1350 2124 213 +f 2130 1353 2123 213 +f 2131 1354 2132 213 +f 2132 1355 3329 214 +f 2122 215 3339 1357 +f 2133 216 2121 213 +f 213 2121 217 2120 +f 2134 1305 2119 213 +f 2135 218 2118 213 +f 2136 209 2117 213 +f 2137 220 2138 866 +f 2139 221 2140 1548 +f 2140 1293 2141 1548 +f 2141 1239 2142 1548 +f 2142 222 2143 1548 +f 2143 1238 2144 1548 +f 2144 1266 2145 1548 +f 2145 1265 2146 1548 +f 2146 1263 2167 1548 +f 2147 1264 2148 230 +f 2148 1267 2149 230 +f 2149 1240 2150 230 +f 2150 223 2166 230 +f 2151 224 2152 166 +f 2152 225 2153 166 +f 2153 1233 2154 166 +f 2154 1268 2155 166 +f 2155 1235 2156 166 +f 2156 1234 2157 166 +f 2157 1273 2158 166 +f 2158 226 2159 166 +f 2159 227 2160 166 +f 2160 1245 2161 166 +f 1242 3304 1272 2161 +f 2162 166 2161 1272 +f 1241 3308 228 2162 +f 2163 166 2162 228 +f 229 3318 1270 2163 +f 2164 166 2163 1270 +f 1302 3328 1295 2164 +f 2165 1297 2036 166 +f 2167 230 3507 231 +f 1548 2167 231 2168 +f 2169 232 2846 1548 +f 143 3619 233 1999 +f 2095 1303 3330 235 +f 234 2095 235 2170 +f 2170 1309 3331 236 +f 234 2170 236 2171 +f 2171 1367 3356 1315 +f 234 2171 1315 2172 +f 2172 237 3340 238 +f 234 2172 238 2173 +f 2173 1368 3346 1337 +f 2174 240 2175 234 +f 2175 239 2176 234 +f 2176 241 2177 234 +f 2177 1317 2178 234 +f 2178 242 2179 234 +f 2179 243 2180 234 +f 2180 245 2181 234 +f 2181 244 2182 234 +f 2182 1310 2191 234 +f 2183 1311 2184 252 +f 2184 1343 2185 252 +f 2185 1342 2186 252 +f 2186 246 2187 252 +f 2187 1344 2188 252 +f 2188 247 2192 252 +f 248 3349 249 2189 +f 250 3348 253 2190 +f 251 3333 1369 2021 +f 2192 1312 3336 1340 +f 2193 1318 2189 252 +f 252 2189 249 2190 +f 2194 251 2021 252 +f 1347 3352 150 2195 +f 2195 156 2021 1369 +f 254 2616 628 2196 +f 2197 439 2419 254 +f 2198 1544 2197 254 +f 2196 126 1979 257 +f 2199 1534 2198 254 +f 2200 257 1979 255 +f 2201 255 1873 32 +f 2201 258 3504 256 +f 1544 3507 1539 2197 +f 2202 1536 3505 1537 +f 2203 1543 2205 453 +f 2204 258 2201 32 +f 2206 259 2207 43 +f 2207 1538 1829 43 +f 260 2227 272 2208 +f 2209 363 2319 372 +f 2210 262 2236 283 +f 2211 312 2269 264 +f 2212 338 2291 400 +f 263 2294 279 2212 +f 2213 271 2353 386 +f 2214 347 2312 365 +f 2215 349 2211 264 +f 2216 379 2326 378 +f 2217 289 2294 265 +f 2210 266 2349 267 +f 269 2230 268 2218 +f 398 2290 282 2218 +f 2219 275 2352 270 +f 2220 288 2219 270 +f 2221 356 2253 325 +f 353 2297 342 2215 +f 2222 273 2287 369 +f 344 2299 345 2223 +f 331 2223 330 2224 +f 332 2214 365 2225 +f 261 2209 372 2226 +f 332 2261 306 2214 +f 2216 334 2267 311 +f 2227 333 2323 272 +f 2228 267 2349 336 +f 2229 335 2290 399 +f 2228 337 2237 262 +f 2222 375 2293 277 +f 269 2232 339 2230 +f 274 2347 268 2230 +f 275 2219 324 2217 +f 2231 276 2232 269 +f 2233 685 2231 282 +f 2232 276 2663 671 +f 2234 284 2233 335 +f 2235 277 2292 339 +f 2236 285 2234 283 +f 2235 671 2641 650 +f 2237 646 2236 262 +f 2238 273 2222 277 +f 2239 684 2237 337 +f 2238 650 2639 278 +f 2240 286 2239 338 +f 2241 280 2287 273 +f 2241 278 2665 281 +f 2242 645 2240 279 +f 2243 654 2242 289 +f 2244 287 2243 324 +f 2245 290 2244 288 +f 2245 340 2246 681 +f 2246 292 2247 291 +f 727 2685 291 2247 +f 2247 292 2306 293 +f 2248 724 2710 727 +f 2248 293 2296 294 +f 2249 725 2708 724 +f 2249 294 2284 341 +f 2250 295 2691 725 +f 2250 341 2283 296 +f 2251 718 2706 295 +f 2251 296 2305 357 +f 2252 700 2689 718 +f 2252 357 2282 325 +f 2253 297 2689 700 +f 2254 298 2681 297 +f 2254 356 2281 299 +f 2255 299 2304 319 +f 2255 300 2714 298 +f 2256 331 2224 280 +f 2256 281 2643 677 +f 2257 344 2223 331 +f 2257 677 2667 302 +f 2258 301 2299 344 +f 2258 302 2629 643 +f 2259 303 2288 301 +f 2259 643 2629 304 +f 2260 332 2225 303 +f 2260 304 2661 305 +f 2261 305 2637 667 +f 2262 261 2226 306 +f 2262 667 2656 307 +f 2263 308 2209 261 +f 2263 307 2658 637 +f 308 2263 637 2264 +f 2264 636 2265 260 +f 2266 350 2265 309 +f 2267 334 2266 310 +f 2268 311 2267 705 +f 2269 312 2268 317 +f 2270 264 2269 318 +f 2271 353 2270 313 +f 2272 354 2271 711 +f 2273 343 2272 314 +f 2274 360 2273 315 +f 2275 323 2274 666 +f 2276 361 2275 316 +f 2277 732 2712 300 +f 2277 319 2295 321 +f 2278 735 2716 732 +f 2278 321 2303 320 +f 2279 716 2704 735 +f 2279 320 2302 322 +f 2280 713 2702 716 +f 2280 322 2301 351 +f 2276 713 2280 351 +f 2219 288 2244 324 +f 2281 356 2221 394 +f 358 2340 326 2282 +f 327 2339 390 2283 +f 2284 294 2296 389 +f 327 2283 341 2284 +f 323 2286 329 2285 +f 362 2330 329 2286 +f 2287 346 2314 369 +f 2288 366 2320 373 +f 2225 366 2288 303 +f 334 2216 378 2289 +f 2290 398 2348 399 +f 266 2210 283 2229 +f 2291 337 2228 336 +f 405 2355 274 2292 +f 2293 405 2292 277 +f 2294 289 2242 279 +f 2294 263 2351 265 +f 271 2213 340 2220 +f 2213 292 2246 340 +f 393 2342 392 2295 +f 326 2340 394 2221 +f 359 2334 389 2296 +f 354 2307 382 2297 +f 2285 328 2298 360 +f 2298 328 2328 384 +f 2299 373 2311 345 +f 2224 346 2287 280 +f 2226 347 2214 306 +f 2208 363 2209 308 +f 2211 349 2329 348 +f 312 2211 348 2300 +f 2289 333 2227 350 +f 2227 260 2265 350 +f 335 2233 282 2290 +f 397 2309 351 2301 +f 322 2302 352 2301 +f 355 2341 352 2302 +f 2303 355 2302 320 +f 393 2295 319 2304 +f 2305 296 2283 390 +f 359 2296 293 2306 +f 2306 292 2213 386 +f 2307 384 2332 382 +f 2307 354 2272 343 +f 2300 379 2216 311 +f 2303 321 2295 392 +f 395 2304 299 2281 +f 358 2282 357 2305 +f 2298 343 2273 360 +f 361 2276 351 2308 +f 396 2317 362 2308 +f 2309 396 2308 351 +f 2286 323 2275 361 +f 417 2369 411 2310 +f 363 2208 272 2310 +f 373 2320 374 2311 +f 364 2316 345 2311 +f 433 2366 406 2312 +f 406 2384 432 2313 +f 366 2225 365 2313 +f 346 2322 367 2314 +f 429 2315 369 2314 +f 368 2321 375 2315 +f 376 2322 330 2316 +f 370 2330 362 2317 +f 396 2356 371 2317 +f 412 2363 433 2318 +f 347 2226 372 2318 +f 411 2368 412 2319 +f 432 2383 374 2320 +f 2321 404 2293 375 +f 418 2370 417 2323 +f 377 2371 418 2324 +f 333 2289 378 2324 +f 383 2375 423 2325 +f 349 2215 342 2325 +f 420 2372 377 2326 +f 380 2328 328 2327 +f 329 2330 381 2327 +f 385 2332 384 2328 +f 423 2374 421 2329 +f 383 2325 342 2331 +f 382 2332 426 2331 +f 421 2373 420 2333 +f 379 2300 348 2333 +f 359 2306 386 2334 +f 2334 1541 2335 389 +f 2335 387 2338 389 +f 2336 388 2337 327 +f 2337 1536 2339 327 +f 327 2284 389 2338 +f 2339 1536 2202 358 +f 2202 453 2340 358 +f 453 2344 394 2340 +f 391 2345 352 2341 +f 2341 355 2303 392 +f 391 2341 392 2342 +f 2342 393 2304 395 +f 2343 391 2342 395 +f 453 2343 395 2344 +f 2309 397 2345 1531 +f 2345 397 2301 352 +f 391 3502 1531 2345 +f 2346 401 2349 266 +f 2347 455 2348 398 +f 2348 455 2346 266 +f 2349 401 2350 336 +f 400 2291 336 2350 +f 2350 401 2351 263 +f 2351 401 2352 275 +f 2352 401 2353 271 +f 2354 455 2347 274 +f 2355 402 2354 274 +f 403 2415 371 2356 +f 396 2309 1531 2356 +f 2357 402 2355 404 +f 2355 405 2293 404 +f 2358 651 2385 404 +f 2359 430 2384 406 +f 2360 674 2359 406 +f 2361 407 2360 406 +f 2362 678 2361 406 +f 2363 413 2367 433 +f 2364 408 2362 406 +f 2365 642 2364 406 +f 410 2637 409 2366 +f 2367 410 2366 433 +f 2368 668 2363 412 +f 2368 411 2369 414 +f 2369 417 2370 416 +f 415 2677 416 2370 +f 2371 419 2699 415 +f 2372 706 2695 419 +f 2373 649 2697 706 +f 2374 422 2635 649 +f 2375 424 2679 422 +f 2376 427 2701 424 +f 2376 383 2331 426 +f 2377 426 2332 385 +f 2377 425 2687 427 +f 2378 435 2390 439 +f 1533 2357 428 2379 +f 2379 404 2382 663 +f 2321 368 2380 430 +f 429 2314 367 2380 +f 2381 430 2380 367 +f 376 2316 364 2381 +f 2383 430 2381 364 +f 2385 434 2386 404 +f 2386 431 2382 404 +f 2387 664 2388 1533 +f 2388 647 2389 1533 +f 2389 661 2378 1533 +f 2390 436 2391 439 +f 2392 438 2422 439 +f 440 2393 437 2391 +f 655 2394 441 2393 +f 2394 659 2395 441 +f 2396 696 2397 632 +f 2395 658 2396 632 +f 2398 443 2399 442 +f 2400 702 2401 634 +f 2401 719 2414 634 +f 2402 720 2403 444 +f 2403 691 2404 444 +f 2404 445 2405 444 +f 2405 731 2406 444 +f 2397 728 2398 442 +f 2407 736 2408 371 +f 2408 712 2413 371 +f 2409 446 2683 425 +f 2409 385 2328 380 +f 2410 448 2693 446 +f 2410 380 2327 381 +f 2406 447 2407 371 +f 2411 449 2654 448 +f 2411 381 2330 370 +f 449 2411 370 2412 +f 371 2413 640 2412 +f 2415 444 2406 371 +f 2399 701 2400 634 +f 444 2416 450 2414 +f 2416 1573 2417 450 +f 2418 635 2417 1573 +f 2420 451 2419 439 +f 2421 627 2420 439 +f 2422 452 2421 439 +f 2423 1778 1901 1578 +f 43 2424 467 2425 +f 2424 475 2454 467 +f 2343 453 2416 444 +f 2205 43 2425 1578 +f 2426 1573 2416 453 +f 1542 2346 455 2427 +f 2427 1533 2428 454 +f 439 2197 1539 2428 +f 2429 1777 3657 456 +f 2430 1772 2429 456 +f 2431 492 2445 457 +f 2432 464 2442 1532 +f 2433 459 2438 462 +f 2434 1532 2435 463 +f 1532 2442 461 2435 +f 2436 687 2441 463 +f 2437 652 2433 463 +f 2438 501 2504 462 +f 2438 459 2640 676 +f 2439 676 2666 653 +f 2440 653 2644 679 +f 2440 511 2513 512 +f 2439 512 2503 501 +f 2441 672 2437 463 +f 686 2436 463 2435 +f 2443 458 2432 1532 +f 2444 465 2443 1532 +f 2446 657 2445 492 +f 2447 466 2446 492 +f 2448 680 2447 492 +f 2449 683 2448 492 +f 697 2449 492 2450 +f 467 2451 729 2450 +f 2452 726 2451 467 +f 2453 703 2452 467 +f 2454 721 2705 468 +f 477 2703 717 2455 +f 2456 491 2493 477 +f 2457 469 2459 505 +f 2458 470 2456 477 +f 2460 514 2458 477 +f 2461 734 2463 475 +f 2462 472 2460 477 +f 2463 692 2465 475 +f 2464 521 2462 477 +f 2465 474 2467 475 +f 2466 473 2464 477 +f 2467 722 2471 475 +f 2468 523 2466 477 +f 2469 1774 2472 1778 +f 505 2507 504 2455 +f 2470 476 2468 477 +f 2471 721 2454 475 +f 2423 467 2450 492 +f 2459 471 2461 475 +f 2473 478 2494 505 +f 2474 479 2505 511 +f 2474 679 2668 644 +f 2475 507 2499 479 +f 2475 644 2630 669 +f 2476 508 2511 507 +f 2476 669 2660 670 +f 2477 497 2502 508 +f 2477 670 2662 480 +f 2478 498 2501 497 +f 2478 480 2638 481 +f 2479 483 2509 498 +f 2479 481 2657 482 +f 2480 494 2510 483 +f 2480 482 2659 484 +f 494 2480 484 2481 +f 2481 485 2482 513 +f 2483 503 2482 486 +f 2484 515 2483 707 +f 2485 708 2486 491 +f 2486 487 2487 491 +f 2487 689 2488 491 +f 2488 488 2489 491 +f 2489 489 2490 491 +f 2490 695 2491 491 +f 2491 490 2492 491 +f 2492 641 2493 491 +f 2484 710 2485 491 +f 1813 28 1814 460 +f 2495 510 1813 460 +f 1532 2434 31 2496 +f 2431 1532 2496 32 +f 525 2522 495 2498 +f 494 2481 513 2498 +f 507 2511 621 2499 +f 605 2505 479 2499 +f 2500 491 2456 496 +f 2456 470 2517 496 +f 620 2589 617 2501 +f 617 2533 622 2502 +f 512 2513 499 2503 +f 500 2504 501 2503 +f 509 2512 462 2504 +f 502 2513 511 2505 +f 528 2524 597 2506 +f 503 2483 515 2506 +f 518 2518 504 2507 +f 505 2494 27 2507 +f 2468 476 2508 524 +f 506 2614 620 2509 +f 495 2613 506 2510 +f 622 2602 621 2511 +f 2512 510 2495 462 +f 2495 463 2433 462 +f 597 2523 525 2514 +f 513 2482 503 2514 +f 2515 609 2458 514 +f 2460 472 2462 519 +f 2516 528 2506 515 +f 2500 516 2516 515 +f 2470 504 2518 517 +f 2462 521 2519 519 +f 2464 473 2520 520 +f 2466 523 2521 522 +f 2522 550 2552 625 +f 2523 597 2524 552 +f 527 1823 569 1824 +f 34 1819 593 2525 +f 2526 583 1810 612 +f 1811 37 2600 604 +f 2527 577 2599 603 +f 1823 608 2604 569 +f 2528 600 2515 519 +f 2529 530 2574 529 +f 2530 584 2527 585 +f 42 1830 570 1831 +f 41 1831 570 2529 +f 2531 580 2580 587 +f 2532 586 1825 38 +f 33 2611 560 2534 +f 1821 35 2594 595 +f 2516 516 2595 599 +f 550 2522 525 2523 +f 532 2556 598 2535 +f 2536 524 2508 578 +f 575 2561 556 2536 +f 2537 533 2538 615 +f 2538 534 2609 615 +f 2539 542 2537 624 +f 2538 533 2664 673 +f 2540 543 2539 535 +f 2541 619 2590 534 +f 2542 675 2540 536 +f 2541 673 2626 688 +f 2543 537 2542 589 +f 2544 540 2603 619 +f 2545 538 2543 618 +f 2544 688 2676 665 +f 2546 546 2545 539 +f 2547 558 2591 540 +f 2547 665 2653 559 +f 2548 541 2546 545 +f 2549 544 2548 623 +f 2550 547 2549 548 +f 2551 549 2550 626 +f 2551 625 2552 638 +f 2552 550 2553 639 +f 551 2678 639 2553 +f 2553 550 2523 552 +f 2554 553 2700 551 +f 2554 552 2524 599 +f 2555 554 2696 553 +f 2555 599 2595 598 +f 2556 709 2698 554 +f 2557 555 2636 709 +f 2557 532 2605 610 +f 2558 690 2680 555 +f 2558 610 2605 600 +f 2559 690 2558 600 +f 2528 557 2560 698 +f 2560 699 2688 698 +f 2560 557 2596 556 +f 2561 694 2684 699 +f 2562 560 2611 558 +f 2562 559 2634 648 +f 2563 592 2534 560 +f 2563 648 2674 662 +f 2564 591 2592 592 +f 2564 662 2632 563 +f 2565 561 2525 591 +f 2565 563 2632 562 +f 2566 594 2593 561 +f 2566 562 2648 564 +f 2567 596 2594 594 +f 2567 564 2646 656 +f 2568 595 2594 596 +f 2568 656 2670 565 +f 2569 566 2604 595 +f 2569 565 2650 660 +f 566 2569 660 2570 +f 2570 682 2571 569 +f 2572 568 2571 567 +f 2573 570 2572 730 +f 2574 530 2573 571 +f 2575 529 2574 572 +f 2576 573 2575 723 +f 2577 584 2576 574 +f 2578 577 2577 693 +f 2579 613 2578 579 +f 2580 580 2579 733 +f 2581 587 2580 581 +f 2582 588 2581 582 +f 2583 704 2694 694 +f 2583 575 2536 578 +f 2584 576 2655 704 +f 2584 578 2606 611 +f 2585 715 2628 576 +f 2585 611 2607 583 +f 2586 715 2585 583 +f 2526 604 2582 714 +f 601 2598 573 2530 +f 41 2529 529 1832 +f 39 2531 587 1826 +f 2587 613 2531 39 +f 587 2581 588 2532 +f 2588 618 2543 589 +f 2589 620 2614 548 +f 2593 594 1820 36 +f 34 2525 561 2593 +f 1822 531 1821 595 +f 2517 609 2605 532 +f 2535 516 2500 496 +f 518 2606 578 2518 +f 2508 517 2518 578 +f 2521 524 2536 556 +f 2520 522 2596 557 +f 2519 520 2520 557 +f 526 2597 570 1830 +f 2597 568 2572 570 +f 2598 529 2575 573 +f 2598 601 1833 602 +f 586 2532 588 2600 +f 2588 502 2505 605 +f 509 2504 500 2601 +f 539 2610 621 2602 +f 2603 540 2591 30 +f 2534 592 2592 607 +f 35 1820 594 2594 +f 2604 566 2570 569 +f 608 1822 595 2604 +f 2605 609 2515 600 +f 2606 518 2507 27 +f 27 1810 583 2607 +f 526 1824 569 2597 +f 614 2599 577 2587 +f 535 2601 500 2608 +f 616 1815 29 2609 +f 623 2533 617 2589 +f 2603 590 2590 619 +f 606 2591 558 2611 +f 2608 499 2612 536 +f 2612 499 2513 502 +f 626 2614 506 2613 +f 618 2588 605 2610 +f 2602 622 2533 545 +f 2533 623 2548 545 +f 2612 589 2542 536 +f 615 2609 29 2615 +f 2512 509 2601 624 +f 2615 510 2512 624 +f 2601 535 2539 624 +f 2613 495 2522 625 +f 2614 626 2550 548 +f 1962 629 2420 627 +f 2421 452 1965 113 +f 1967 630 2422 438 +f 2392 437 1969 115 +f 112 1958 628 2616 +f 2419 451 1959 112 +f 1972 118 2620 442 +f 442 2399 634 2617 +f 437 2393 441 2618 +f 1970 116 2618 441 +f 441 2395 632 2619 +f 1971 633 2619 632 +f 632 2397 442 2620 +f 1974 119 2621 450 +f 2417 635 2622 120 +f 1973 631 2617 634 +f 634 2414 450 2621 +f 1593 1907 120 2622 +f 2418 1599 3548 1593 +f 414 2369 416 2623 +f 636 2264 637 2623 +f 638 2552 639 2624 +f 485 2481 484 2624 +f 434 2385 276 2625 +f 2386 434 2625 685 +f 2441 687 2626 673 +f 687 2436 688 2626 +f 316 2654 449 2627 +f 640 2413 713 2627 +f 641 2492 576 2628 +f 2493 641 2628 715 +f 2364 642 2629 302 +f 546 2660 669 2630 +f 644 2668 538 2630 +f 2390 435 2651 286 +f 2631 436 2390 286 +f 2632 465 2444 562 +f 2444 457 2648 562 +f 664 2387 285 2633 +f 2388 664 2633 646 +f 2442 464 2634 559 +f 464 2432 648 2634 +f 318 2269 317 2635 +f 2486 708 2698 709 +f 2367 413 2656 667 +f 2637 410 2367 667 +f 544 2549 547 2638 +f 674 2360 278 2639 +f 2359 674 2639 650 +f 543 2666 676 2640 +f 459 2642 542 2640 +f 430 2359 650 2641 +f 2358 430 2641 671 +f 652 2437 533 2642 +f 678 2362 677 2643 +f 2361 678 2643 281 +f 537 2668 679 2644 +f 653 2666 675 2644 +f 655 2393 440 2645 +f 654 2243 287 2645 +f 2446 466 2670 656 +f 2631 645 2647 440 +f 645 2242 654 2647 +f 2445 657 2646 564 +f 658 2395 659 2649 +f 290 2245 681 2649 +f 2448 683 2672 660 +f 661 2389 684 2651 +f 2443 465 2632 662 +f 663 2382 284 2652 +f 2387 663 2652 285 +f 665 2676 686 2653 +f 461 2442 559 2653 +f 666 2693 448 2654 +f 490 2491 704 2655 +f 2492 490 2655 576 +f 413 2363 668 2656 +f 547 2550 549 2657 +f 668 2368 414 2658 +f 549 2551 638 2659 +f 2365 409 2661 304 +f 2629 642 2365 304 +f 546 2546 541 2660 +f 2637 305 2661 409 +f 541 2548 544 2662 +f 651 2358 671 2663 +f 2385 651 2663 276 +f 2437 672 2664 533 +f 672 2441 673 2664 +f 407 2361 281 2665 +f 2360 407 2665 278 +f 408 2364 302 2667 +f 2362 408 2667 677 +f 2394 655 2645 287 +f 287 2244 290 2669 +f 2447 680 2650 565 +f 2396 658 2649 681 +f 2671 696 2396 681 +f 682 2570 660 2672 +f 2449 697 2686 682 +f 647 2388 646 2673 +f 2389 647 2673 684 +f 2432 458 2674 648 +f 458 2443 662 2674 +f 431 2386 685 2675 +f 2382 431 2675 284 +f 2436 686 2676 688 +f 309 2265 636 2677 +f 486 2482 485 2678 +f 313 2270 318 2679 +f 2487 487 2636 555 +f 2404 691 2681 298 +f 691 2403 297 2681 +f 692 2463 579 2682 +f 2465 692 2682 693 +f 314 2687 425 2683 +f 446 2693 315 2683 +f 489 2489 699 2684 +f 2490 489 2684 694 +f 2671 291 2685 728 +f 567 2571 682 2686 +f 697 2450 729 2686 +f 711 2701 427 2687 +f 488 2488 698 2688 +f 2489 488 2688 699 +f 2403 720 2689 297 +f 474 2465 693 2690 +f 2467 474 2690 574 +f 2400 701 2708 725 +f 572 2574 571 2692 +f 2453 468 2707 572 +f 695 2490 694 2694 +f 2491 695 2694 704 +f 705 2267 310 2695 +f 710 2484 707 2696 +f 317 2268 705 2697 +f 2485 710 2696 554 +f 310 2266 309 2699 +f 707 2483 486 2700 +f 313 2679 424 2701 +f 2559 698 2488 689 +f 2413 712 2702 713 +f 712 2408 716 2702 +f 2586 714 2703 477 +f 2408 736 2704 716 +f 736 2407 735 2704 +f 2703 714 2582 582 +f 2457 717 2703 582 +f 2402 719 2706 718 +f 2689 720 2402 718 +f 2705 721 2471 574 +f 2471 722 2467 574 +f 2401 702 2691 295 +f 723 2575 572 2707 +f 2705 723 2707 468 +f 701 2399 443 2708 +f 571 2573 730 2709 +f 2452 703 2692 571 +f 2398 728 2685 727 +f 730 2572 567 2711 +f 2451 726 2709 730 +f 732 2716 447 2712 +f 731 2405 300 2712 +f 2713 581 2580 733 +f 2461 471 2713 733 +f 2405 445 2714 300 +f 445 2404 298 2714 +f 734 2461 733 2715 +f 2463 734 2715 579 +f 2407 447 2716 735 +f 469 2457 582 2717 +f 2713 471 2459 469 +f 2718 773 1921 846 +f 2719 738 3624 737 +f 737 3621 772 2718 +f 2720 847 2721 739 +f 71 2755 775 2721 +f 2722 741 3644 740 +f 1933 742 2722 740 +f 1839 48 2723 782 +f 2724 745 1963 746 +f 1964 114 2836 1709 +f 2725 744 2724 746 +f 2726 1680 1867 768 +f 2727 1758 1916 87 +f 747 2757 777 2728 +f 68 2738 1736 2728 +f 2729 1754 3645 1753 +f 1939 100 2729 1753 +f 1846 791 2730 1743 +f 2731 758 1936 748 +f 1843 760 2732 1741 +f 1920 749 2749 1765 +f 2733 778 1920 1765 +f 779 3636 771 2734 +f 2735 1747 1912 752 +f 1836 753 2736 754 +f 2737 757 1914 756 +f 46 2765 1735 2738 +f 1942 102 2768 787 +f 2739 1757 1943 103 +f 2740 788 1847 51 +f 1848 52 2775 1746 +f 2741 1752 1937 759 +f 1844 802 2742 1742 +f 2743 762 1935 761 +f 1842 49 2744 1740 +f 811 2792 96 2745 +f 109 1952 809 2745 +f 2746 764 1892 763 +f 1891 78 2793 765 +f 2747 767 1961 766 +f 2748 1681 1868 65 +f 2749 749 1915 91 +f 769 2749 91 2750 +f 774 3620 770 2750 +f 769 3650 1765 2749 +f 2751 776 2752 1771 +f 2752 72 2753 1771 +f 771 3632 1771 2753 +f 91 1919 773 2754 +f 772 3621 774 2754 +f 2752 776 2755 71 +f 1917 88 2758 1762 +f 2756 1760 2727 87 +f 747 3633 1737 2757 +f 2733 1766 2758 88 +f 1737 3634 779 2759 +f 2760 1748 1911 85 +f 1835 44 2761 755 +f 2762 741 2722 98 +f 1840 781 2763 1734 +f 2764 783 1913 86 +f 784 1836 754 2765 +f 1944 794 2774 1707 +f 2766 785 2778 105 +f 2767 796 2777 795 +f 1850 799 2781 786 +f 1941 790 2770 1755 +f 2769 50 1847 788 +f 1940 789 1939 1753 +f 2771 1745 2730 791 +f 2769 792 2771 791 +f 2772 793 2774 794 +f 2773 1707 2774 793 +f 2776 1689 3653 1768 +f 1849 795 2777 1768 +f 2778 1714 1945 105 +f 2779 797 1946 104 +f 1851 53 2780 798 +f 2782 1754 2729 800 +f 2729 100 1938 800 +f 1845 801 2783 803 +f 2784 1751 1934 804 +f 1841 805 2785 743 +f 1954 111 2786 1704 +f 2787 60 1894 1678 +f 1894 807 2816 1678 +f 1952 808 2788 809 +f 2789 1732 2788 808 +f 2790 1677 2791 810 +f 2791 833 1893 810 +f 1731 2818 834 2792 +f 1890 77 2819 1687 +f 1675 2821 812 2794 +f 2794 836 2795 1710 +f 2795 835 3622 1710 +f 2796 1686 1889 813 +f 2797 1700 2796 813 +f 1888 838 2822 839 +f 814 2826 95 2798 +f 815 2820 1721 2798 +f 2799 840 1887 817 +f 1886 79 2827 816 +f 2800 1729 1960 818 +f 2801 820 3610 819 +f 1869 66 2801 819 +f 1957 848 2831 822 +f 2802 852 1956 821 +f 2803 824 1862 823 +f 1955 851 2804 825 +f 2804 1706 3617 825 +f 2787 806 3608 853 +f 1950 107 2809 827 +f 2806 1673 1966 826 +f 1857 58 2807 1696 +f 1949 108 2840 1724 +f 2808 1726 2809 107 +f 1856 828 2810 829 +f 1947 830 2813 831 +f 2811 832 1948 106 +f 1855 857 2812 1665 +f 1852 55 2814 1664 +f 1953 110 2815 1703 +f 2817 835 2795 834 +f 2818 837 2817 834 +f 2820 812 2821 1722 +f 1717 2829 92 2823 +f 841 2825 1718 2823 +f 842 3605 845 2824 +f 74 1884 843 2824 +f 2825 95 2826 844 +f 845 3605 1671 2828 +f 79 1885 74 2828 +f 2829 738 2719 92 +f 2830 842 2824 843 +f 2720 1669 2830 843 +f 2832 849 2831 848 +f 2833 1679 2834 850 +f 2834 820 2801 850 +f 2801 66 1864 850 +f 2804 851 1956 852 +f 2805 853 3609 854 +f 1860 61 2805 854 +f 2835 1674 2836 114 +f 1866 64 2837 1697 +f 2838 1698 2837 64 +f 2839 855 2840 108 +f 1865 57 2841 856 +f 2842 858 2841 57 +f 2843 860 2844 859 +f 863 3640 1744 2843 +f 860 1853 54 2844 +f 101 1938 861 2845 +f 1548 2846 862 2845 +f 2847 863 1834 45 +f 1932 101 2848 1749 +f 1900 81 1908 865 +f 123 1908 81 2849 +f 1899 867 1898 213 +f 2111 866 2849 81 +f 866 2138 122 2849 +f 2850 124 1976 117 +f 2851 1022 2850 117 +f 2852 1021 2851 117 +f 2853 868 2852 117 +f 2854 1108 2853 117 +f 2855 1059 2854 117 +f 2856 869 2855 117 +f 2857 1054 2856 117 +f 2858 870 2857 117 +f 2859 871 2858 117 +f 2860 1068 2859 117 +f 2861 872 2860 117 +f 2862 1063 2861 117 +f 2863 874 2864 873 +f 2865 1075 2866 874 +f 2866 875 2867 874 +f 2867 1039 2868 874 +f 2868 876 2869 874 +f 2869 877 2870 874 +f 2870 878 2871 874 +f 2871 1031 2872 874 +f 2872 879 2873 874 +f 2873 881 2874 874 +f 2874 880 2875 874 +f 2875 882 2876 874 +f 2876 1065 2864 874 +f 2850 1022 3183 1117 +f 2877 883 2878 124 +f 2878 884 2879 124 +f 2879 885 2880 124 +f 2880 1116 2881 124 +f 2881 886 2882 124 +f 2882 1114 2883 124 +f 2883 1045 2884 124 +f 2884 887 2885 124 +f 2885 1112 2886 124 +f 2886 888 2887 124 +f 2887 889 2893 124 +f 2888 1026 2889 891 +f 2889 894 2894 891 +f 2890 891 2891 890 +f 2892 1023 2891 891 +f 2894 893 2895 891 +f 2895 895 2896 891 +f 2896 1093 2897 891 +f 2897 896 2898 891 +f 2898 897 2899 891 +f 2899 898 2900 891 +f 2900 899 2901 891 +f 2901 1052 2902 891 +f 2902 892 2892 891 +f 2903 900 2904 904 +f 2890 874 2903 904 +f 905 2979 952 2904 +f 121 1907 84 2905 +f 902 2987 901 2905 +f 2906 902 2905 84 +f 2893 891 2908 903 +f 1977 124 2893 903 +f 904 2904 952 2907 +f 2907 946 2908 891 +f 2909 905 2904 900 +f 2910 953 2903 874 +f 2911 906 1975 121 +f 2863 117 1975 906 +f 2912 940 2913 907 +f 2914 1161 2913 940 +f 2915 1160 2914 940 +f 2916 1210 2915 940 +f 2917 908 2916 940 +f 2918 909 2917 940 +f 2919 910 2918 940 +f 2920 911 2919 940 +f 2921 1171 2920 940 +f 2922 912 2921 940 +f 2923 1132 2922 940 +f 2924 1213 2923 940 +f 2925 913 2924 940 +f 2926 933 2927 914 +f 2928 916 2929 933 +f 2929 917 2930 933 +f 2930 1139 2931 933 +f 2931 918 2932 933 +f 2932 1177 2933 933 +f 2933 919 2934 933 +f 2934 920 2935 933 +f 2935 1142 2936 933 +f 2936 921 2937 933 +f 2937 922 2938 933 +f 2938 915 2927 933 +f 2939 923 2940 927 +f 2940 924 2941 927 +f 2941 1192 2942 927 +f 2942 925 2943 927 +f 2943 926 2944 927 +f 2944 928 2945 927 +f 2945 1218 2946 927 +f 2946 1190 2947 927 +f 2947 1148 2948 927 +f 2948 1187 2949 927 +f 2949 929 2950 927 +f 2950 930 2951 927 +f 2951 931 2959 927 +f 2952 1201 2953 80 +f 2953 1200 2960 80 +f 1896 80 2954 932 +f 2955 1120 2954 80 +f 2956 1207 2955 80 +f 2957 934 2956 80 +f 2958 1130 2957 80 +f 2960 1197 2961 80 +f 2961 1198 2962 80 +f 2962 1156 2963 80 +f 2963 935 2964 80 +f 2964 1204 2958 80 +f 942 2970 944 2965 +f 936 3056 1000 2965 +f 937 3047 993 2966 +f 2967 937 2966 938 +f 2926 940 2969 939 +f 1895 933 2926 939 +f 942 2965 1000 2968 +f 2968 941 2969 940 +f 2912 927 2970 942 +f 2971 936 2965 944 +f 2972 943 2970 927 +f 2973 995 1897 945 +f 2959 80 1897 995 +f 2908 946 2974 947 +f 2975 958 2910 906 +f 2976 950 3028 981 +f 905 2909 958 2977 +f 2977 957 2983 950 +f 2976 949 2978 951 +f 2979 905 2977 950 +f 2979 951 2980 952 +f 2980 954 2981 952 +f 948 2974 946 2981 +f 2909 953 2910 958 +f 2982 962 2988 954 +f 2980 951 2978 955 +f 956 2985 960 2983 +f 956 2983 957 2984 +f 2975 959 2985 956 +f 2906 903 2908 947 +f 2911 901 2985 959 +f 2985 901 2987 960 +f 961 3015 974 2986 +f 2987 955 2986 960 +f 2982 955 2987 902 +f 2988 962 2982 902 +f 2989 963 2990 961 +f 2988 947 2974 954 +f 2974 948 2981 954 +f 2991 965 2990 963 +f 2992 964 2991 963 +f 2993 1092 2992 963 +f 2994 966 2993 963 +f 2995 968 2994 963 +f 2996 967 2995 963 +f 2997 1086 2996 963 +f 2998 1089 2997 963 +f 2999 969 2998 963 +f 3000 970 2999 963 +f 3001 1081 3000 963 +f 3002 1083 3001 963 +f 1098 3002 963 3003 +f 3003 971 3004 1099 +f 3005 1047 3004 971 +f 3006 1095 3005 971 +f 3007 1096 3006 971 +f 3008 1050 3007 971 +f 3009 972 3008 971 +f 3010 1102 3009 971 +f 3011 1100 3010 971 +f 3012 973 3011 971 +f 3013 1106 3012 971 +f 3014 1104 3013 971 +f 3015 975 3016 974 +f 3016 1053 3017 974 +f 3017 976 3018 974 +f 3018 1061 3019 974 +f 3019 1060 3020 974 +f 3020 977 3021 974 +f 3021 1056 3022 974 +f 3022 978 3023 974 +f 3023 979 3024 974 +f 3024 1037 3025 974 +f 3025 980 3026 974 +f 3026 1067 3027 974 +f 3027 1066 3028 974 +f 3029 1080 3030 981 +f 3030 1043 3031 981 +f 3031 982 3032 981 +f 3032 983 3033 981 +f 3033 1076 3034 981 +f 3034 985 3035 981 +f 3035 984 3036 981 +f 3036 1040 3037 981 +f 3037 1041 3038 981 +f 3038 1074 3039 981 +f 3039 986 3040 981 +f 3040 949 2976 981 +f 2989 955 2978 971 +f 950 2983 960 3041 +f 2972 995 3042 987 +f 3043 990 2969 941 +f 3044 988 3097 1018 +f 937 2967 990 3045 +f 3045 989 3051 988 +f 3044 1012 3046 991 +f 3047 937 3045 988 +f 3047 991 3048 993 +f 3048 994 3049 993 +f 2973 993 3049 992 +f 2967 939 2969 990 +f 3050 996 3057 994 +f 3048 991 3046 1020 +f 998 3054 997 3051 +f 998 3051 989 3052 +f 3043 999 3053 998 +f 2971 943 2972 987 +f 999 3043 941 3053 +f 1000 3054 998 3053 +f 1184 3084 1015 3055 +f 3054 1000 3056 1020 +f 3055 997 3054 1020 +f 3050 1020 3056 936 +f 3057 996 3050 936 +f 3058 1004 3059 1184 +f 3057 987 3042 994 +f 3042 992 3049 994 +f 3060 1185 3059 1004 +f 3061 1224 3060 1004 +f 3062 1193 3061 1004 +f 3063 1001 3062 1004 +f 3064 1002 3063 1004 +f 3065 1220 3064 1004 +f 3066 1003 3065 1004 +f 3067 1151 3066 1004 +f 3068 1188 3067 1004 +f 3069 1189 3068 1004 +f 3070 1005 3069 1004 +f 3071 1121 3070 1004 +f 1123 3071 1004 3072 +f 3072 1006 3073 1203 +f 3074 1153 3073 1006 +f 3075 1155 3074 1006 +f 3076 1007 3075 1006 +f 3077 1125 3076 1006 +f 3078 1008 3077 1006 +f 3079 1010 3078 1006 +f 3080 1009 3079 1006 +f 3081 1131 3080 1006 +f 3082 1011 3081 1006 +f 3083 1208 3082 1006 +f 3084 1162 3085 1015 +f 3085 1013 3086 1015 +f 3086 1165 3087 1015 +f 3087 1169 3088 1015 +f 3088 1211 3089 1015 +f 3089 1167 3090 1015 +f 3090 1166 3091 1015 +f 3091 1172 3092 1015 +f 3092 1137 3093 1015 +f 3093 1136 3094 1015 +f 3094 1216 3095 1015 +f 3095 1014 3096 1015 +f 3096 1170 3097 1015 +f 3098 1147 3099 1018 +f 3099 1016 3100 1018 +f 3100 1129 3101 1018 +f 3101 1144 3102 1018 +f 3102 1182 3103 1018 +f 3103 1178 3104 1018 +f 3104 1176 3105 1018 +f 3105 1141 3106 1018 +f 3106 1017 3107 1018 +f 3107 1173 3108 1018 +f 3108 1019 3109 1018 +f 3109 1012 3044 1018 +f 988 3051 997 3110 +f 3058 1020 3046 1006 +f 3015 961 3111 1387 +f 3112 1290 2851 1021 +f 3113 1436 3014 949 +f 2891 1023 3114 1024 +f 2888 889 3170 1025 +f 3115 1027 2889 1026 +f 3116 1082 3001 1083 +f 3002 1098 3189 1447 +f 2898 896 3139 1028 +f 3117 897 2898 1028 +f 3118 1049 3007 1050 +f 3008 972 3009 1030 +f 2871 878 2870 1298 +f 3119 1275 2872 1031 +f 3120 985 3034 1077 +f 3034 1076 3167 1077 +f 2874 881 3131 1042 +f 3121 1271 2875 880 +f 3122 1032 3032 982 +f 3031 1043 3134 1377 +f 2901 899 3123 1033 +f 3124 1034 3011 973 +f 2860 872 3151 1035 +f 3125 1036 2859 1068 +f 3126 1038 3025 1037 +f 3024 979 3156 1423 +f 2858 871 3155 1232 +f 3127 1269 2857 870 +f 3128 1069 3023 978 +f 3022 1056 3148 1431 +f 2868 1039 3129 1250 +f 3130 1419 3037 1040 +f 2873 879 3166 1296 +f 3132 1078 3033 983 +f 3133 1079 2876 882 +f 3030 1080 3169 1044 +f 2884 1045 3174 1259 +f 3135 1288 2885 887 +f 3136 1088 2997 1089 +f 2998 969 3173 1084 +f 2895 893 3186 1251 +f 3137 1046 2896 895 +f 3138 1097 3004 1047 +f 3005 1095 3185 1407 +f 2897 1093 3184 1094 +f 3140 1048 3006 1096 +f 2902 1052 3141 1051 +f 3142 1411 3012 1106 +f 3143 1231 2852 868 +f 3016 975 3144 1444 +f 3145 1107 2854 1059 +f 3018 976 3146 1430 +f 3147 1054 2857 1269 +f 3021 977 3020 1110 +f 3149 1058 2855 869 +f 3019 1061 3150 1445 +f 2861 1063 3198 1062 +f 3152 1064 3026 980 +f 2864 1065 3168 1244 +f 3153 1243 2862 873 +f 3154 1402 3029 1066 +f 3027 1067 3199 1111 +f 2866 1075 3157 1073 +f 3158 1071 3039 1074 +f 2869 876 3159 1277 +f 3160 1072 3036 984 +f 2870 877 3161 1298 +f 3120 1420 3385 1400 +f 3035 985 3120 1400 +f 2867 875 3162 1279 +f 3163 1397 3038 1041 +f 3164 1378 3040 986 +f 2865 890 3165 1070 +f 2887 888 3200 1283 +f 3171 1439 3000 1081 +f 3172 1286 2886 1112 +f 2999 970 3201 1113 +f 2883 1114 3202 1085 +f 3175 1087 2996 1086 +f 3176 1090 2881 1116 +f 2995 967 3177 1091 +f 3177 1415 3399 1091 +f 3178 1227 2879 884 +f 2993 966 3179 1389 +f 3180 1228 2878 883 +f 2992 1092 3181 1412 +f 2990 965 3182 1393 +f 1022 2851 1290 3183 +f 1292 3205 1117 3183 +f 2894 894 3188 1280 +f 3187 1099 3004 1097 +f 3187 1424 3189 1098 +f 2900 898 3190 1281 +f 3191 1425 3010 1100 +f 2899 897 3117 1101 +f 3117 1029 3313 1101 +f 3192 1030 3009 1102 +f 2892 892 3193 1103 +f 3194 1105 3013 1104 +f 3195 1294 2853 1108 +f 3017 1053 3196 1109 +f 3147 1055 3317 1057 +f 2856 1054 3147 1057 +f 3020 1060 3197 1110 +f 2882 886 2881 1090 +f 3177 967 2996 1087 +f 3203 1115 2880 885 +f 2994 968 3204 1417 +f 3205 1230 2877 1117 +f 2991 964 3206 1394 +f 3084 1184 3207 1529 +f 3208 1119 2913 1161 +f 3209 1451 3083 1012 +f 2954 1120 3210 1323 +f 2951 930 3268 1186 +f 3211 1371 2952 931 +f 3212 1526 3070 1121 +f 3071 1123 3285 1122 +f 2963 1156 3235 1124 +f 3213 935 2963 1124 +f 3214 1157 3076 1125 +f 3077 1008 3078 1206 +f 2934 919 2933 1370 +f 3215 1181 2935 920 +f 3216 1178 3103 1126 +f 3103 1182 3263 1126 +f 2937 921 3227 1127 +f 3217 1145 2938 922 +f 3218 1457 3101 1129 +f 3100 1016 3230 1128 +f 2957 1130 3219 1351 +f 3220 1468 3080 1131 +f 2922 1132 3247 1133 +f 3221 1134 2921 912 +f 3222 1504 3094 1136 +f 3093 1137 3252 1135 +f 2920 1171 3251 1138 +f 3223 1339 2919 911 +f 3224 1481 3092 1172 +f 3091 1166 3244 1517 +f 2931 1139 3225 1175 +f 3226 1498 3106 1141 +f 2936 1142 3262 1143 +f 3228 1479 3102 1144 +f 3229 1146 2927 915 +f 3099 1147 3265 1501 +f 2947 1190 3272 1314 +f 3231 1330 2948 1148 +f 3232 1149 3066 1151 +f 3067 1188 3271 1150 +f 2960 1200 3282 1349 +f 3233 1152 2961 1197 +f 3234 1507 3073 1153 +f 3074 1155 3281 1154 +f 2962 1198 3280 1313 +f 3236 1199 3075 1007 +f 2956 934 3237 1158 +f 3238 1485 3081 1011 +f 3239 1118 2914 1160 +f 3085 1162 3240 1163 +f 3241 1209 2916 908 +f 3087 1165 3242 1164 +f 3243 910 2919 1339 +f 3090 1167 3089 1503 +f 3245 1336 2917 909 +f 3088 1169 3246 1168 +f 2923 1213 3294 1214 +f 3248 1215 3095 1216 +f 2925 914 3264 1341 +f 3249 1212 2924 913 +f 3250 1183 3098 1170 +f 3096 1014 3295 1466 +f 2929 916 3253 1179 +f 3254 1473 3108 1173 +f 2932 918 3255 1174 +f 3256 1476 3105 1176 +f 2933 1177 3257 1370 +f 3216 1478 3456 1499 +f 3104 1178 3216 1499 +f 2930 917 3258 1140 +f 3259 1180 3107 1017 +f 3260 1450 3109 1019 +f 2928 932 3261 1324 +f 3059 1185 3266 1470 +f 3267 1366 2939 907 +f 2950 929 3296 1362 +f 3269 1217 3069 1005 +f 3270 1364 2949 1187 +f 3068 1189 3297 1523 +f 2946 1218 3298 1219 +f 3273 1191 3065 1003 +f 3274 1331 2944 926 +f 3064 1220 3275 1493 +f 3275 1221 3470 1493 +f 3276 1333 2942 1192 +f 3062 1001 3277 1196 +f 3278 1194 2941 924 +f 3061 1193 3279 1195 +f 2953 1201 3284 1372 +f 3283 1203 3073 1507 +f 3283 1202 3285 1123 +f 2958 1204 3286 1352 +f 3287 1483 3079 1009 +f 2964 935 3213 1205 +f 3213 1356 3329 1205 +f 3288 1206 3078 1010 +f 2955 1207 3289 1327 +f 3290 1159 3082 1208 +f 3291 1308 2915 1210 +f 3086 1013 3292 1515 +f 3243 1316 3347 1338 +f 2918 910 3243 1338 +f 3089 1211 3293 1503 +f 2945 928 2944 1331 +f 3275 1220 3065 1191 +f 3299 1222 2943 925 +f 3063 1002 3300 1492 +f 3301 1223 2940 923 +f 3060 1224 3302 1471 +f 2049 1291 2050 1290 +f 3112 1231 2137 1225 +f 1257 2064 173 3303 +f 2036 1297 2165 1296 +f 2076 179 3184 1046 +f 2058 170 3203 1227 +f 2055 1229 2056 1228 +f 3180 1230 2053 1237 +f 2054 169 2055 1228 +f 2140 221 3143 1294 +f 2139 220 2137 1231 +f 3155 1036 2155 1268 +f 2154 1233 2153 1232 +f 3125 1035 2157 1234 +f 2156 1235 2155 1036 +f 1244 3168 1272 3304 +f 3139 1094 2079 191 +f 2093 190 3323 1028 +f 1029 2091 189 3305 +f 2082 182 2081 1103 +f 3306 1259 3174 1300 +f 3205 1292 2052 168 +f 2143 222 2142 1107 +f 2142 1239 2141 1107 +f 1055 3147 1269 3307 +f 2150 1240 2149 1055 +f 2152 224 3127 1232 +f 2153 225 2152 1232 +f 1079 3133 228 3308 +f 3153 1244 3304 1242 +f 1242 2161 1245 3309 +f 2160 227 3198 1243 +f 1070 3165 1246 3310 +f 2041 161 2040 1298 +f 3161 1277 2042 1276 +f 3311 1279 3162 1247 +f 3162 1073 3321 1247 +f 3312 1249 2043 1248 +f 3312 1250 3129 163 +f 3129 1279 3320 163 +f 3186 1280 2073 1252 +f 2074 177 3137 1251 +f 2071 176 3188 1027 +f 3141 1033 2084 192 +f 3190 1101 3313 186 +f 3313 187 2089 186 +f 3314 1024 3114 1255 +f 3114 1103 2081 1255 +f 1259 3306 1256 3315 +f 3135 1259 3315 1257 +f 1258 2061 1301 3316 +f 1236 2063 1256 3306 +f 2069 175 3115 1025 +f 3176 1115 2059 1260 +f 2060 171 3316 1090 +f 3178 1228 2056 1261 +f 2057 1262 2058 1227 +f 2144 1238 3145 1058 +f 2147 1263 3317 1055 +f 1263 2146 1057 3317 +f 2145 1266 2144 1058 +f 2148 1264 2147 1055 +f 2149 1267 2148 1055 +f 2151 223 3307 1269 +f 3121 1042 3318 229 +f 1271 3121 229 3319 +f 3133 1271 3319 228 +f 3308 1241 2162 1272 +f 3168 1079 3308 1272 +f 3151 1062 2158 1273 +f 2159 226 2158 1062 +f 3310 1274 2046 165 +f 2039 160 2038 1298 +f 2037 1226 3166 1275 +f 3159 1250 3312 1248 +f 1279 3311 1278 3320 +f 3157 1070 3310 165 +f 2109 200 2079 1094 +f 2072 1299 2073 1280 +f 2086 183 2085 1033 +f 2085 1254 2084 1033 +f 3123 1281 3322 184 +f 3322 197 2087 184 +f 1281 3190 186 3322 +f 1029 3117 1028 3323 +f 2092 198 2091 1029 +f 3193 1051 3324 1282 +f 1051 3141 192 3324 +f 3165 1024 3314 1246 +f 3314 181 2048 1246 +f 2067 1284 2068 1283 +f 2068 174 3170 1283 +f 2066 1285 3200 1286 +f 2065 1287 3172 1288 +f 2070 1253 2071 1027 +f 2051 1289 2052 1292 +f 2050 167 3325 1290 +f 167 2051 1292 3325 +f 2141 1293 3195 1107 +f 2146 1265 3149 1057 +f 2165 1295 3328 1296 +f 2040 159 2039 1298 +f 2038 158 3119 1298 +f 2075 178 2076 1046 +f 1085 3202 172 3326 +f 3174 1085 3326 1300 +f 1090 3316 1301 3327 +f 3202 1090 3327 172 +f 1042 3131 1302 3318 +f 3131 1296 3328 1302 +f 2078 202 2109 1094 +f 1355 3354 1205 3329 +f 1356 3339 214 3329 +f 3208 1118 3331 235 +f 1309 2170 235 3331 +f 1329 2077 1304 3332 +f 1143 3262 1347 3333 +f 2134 210 3280 1152 +f 1306 2088 185 3334 +f 2101 1334 2102 1194 +f 3278 1223 2099 195 +f 2100 1307 2101 1194 +f 1308 3291 1367 3335 +f 3239 1308 3335 236 +f 3331 1118 3239 236 +f 3251 1134 2183 1310 +f 2182 244 2181 1138 +f 3221 1133 2185 1343 +f 2184 1311 2183 1134 +f 1341 3264 1340 3336 +f 3235 1313 3338 211 +f 3337 1124 3235 211 +f 3339 215 2122 214 +f 2127 1328 2125 1327 +f 2107 201 2108 1314 +f 3301 1366 2098 1335 +f 3340 1209 3241 238 +f 237 2172 1315 3340 +f 1316 3243 1339 3341 +f 2178 1317 2177 1316 +f 2180 243 3223 1138 +f 2181 245 2180 1138 +f 1146 3229 248 3342 +f 2030 155 3253 1324 +f 152 2024 1319 3343 +f 3255 1175 3344 152 +f 2025 1321 3344 1175 +f 3225 1140 2026 1320 +f 2027 153 2026 1140 +f 2117 209 3284 1371 +f 2130 1322 2124 1351 +f 3261 1323 2031 1325 +f 2125 1326 3210 1327 +f 2094 1329 3231 1314 +f 2104 199 2105 1331 +f 2108 203 2094 1314 +f 2115 207 3211 1186 +f 180 2080 1332 3345 +f 3276 1194 2102 196 +f 2103 1306 3334 1333 +f 3346 1336 3245 1337 +f 2175 240 3347 1316 +f 240 2174 1338 3347 +f 2174 1337 3245 1338 +f 2176 239 2175 1316 +f 2177 241 2176 1316 +f 2179 242 3341 1339 +f 3348 250 2190 249 +f 3217 1127 3348 249 +f 1145 3217 249 3349 +f 3229 1145 3349 248 +f 2193 1340 3264 1146 +f 3247 1214 2186 1342 +f 2188 1344 3294 1212 +f 3249 1341 3336 1312 +f 1312 2192 247 3350 +f 2187 246 2186 1214 +f 2033 157 2030 1324 +f 1370 3353 1346 3351 +f 1181 3215 150 3352 +f 3262 1181 3352 1347 +f 3257 1174 3343 1319 +f 2028 1348 2027 1140 +f 3258 1179 2029 154 +f 3233 1349 2135 219 +f 2119 1305 2134 1152 +f 3282 1372 2118 218 +f 2124 1350 2129 1351 +f 3219 1352 2123 1353 +f 3286 1205 3354 1354 +f 2131 212 2123 1352 +f 1356 2133 1357 3339 +f 3337 216 2133 1356 +f 3289 1158 2128 1358 +f 3237 1351 2129 1359 +f 2032 1360 2031 1323 +f 2105 1361 3298 1331 +f 2113 205 2114 1362 +f 2114 206 3268 1362 +f 2112 204 3296 1364 +f 2110 1363 3270 1330 +f 2116 208 2117 1371 +f 3274 1222 3355 1365 +f 3345 1331 3274 1365 +f 3299 1333 3334 185 +f 185 2089 1365 3355 +f 2097 194 2098 1366 +f 2096 193 3267 1119 +f 1209 3340 1315 3356 +f 3291 1209 3356 1367 +f 3346 1368 2173 238 +f 3241 1336 3346 238 +f 1370 3351 151 3357 +f 3215 1370 3357 150 +f 1313 3358 1375 3338 +f 2136 1373 2118 1372 +f 2106 1374 3272 1219 +f 1127 3227 253 3348 +f 2194 253 3227 1143 +f 3111 1393 3359 1376 +f 3359 1604 3543 1376 +f 3360 1556 3519 1565 +f 3361 1553 3122 1377 +f 3134 1044 3404 1552 +f 3362 1605 3552 1603 +f 3363 1399 3563 1379 +f 3113 1378 3363 1379 +f 3364 1589 3545 1592 +f 3365 1380 3522 1381 +f 3366 1382 3544 1588 +f 3367 1383 3572 1626 +f 3368 1384 3554 1606 +f 1385 3167 1078 3369 +f 1390 3132 1032 3370 +f 1600 3409 1423 3371 +f 3366 1387 3111 1376 +f 3372 1621 3561 1388 +f 3362 1394 3206 1413 +f 3181 1389 3373 1607 +f 3374 1426 3559 1610 +f 3375 1419 3130 1557 +f 3375 1561 3524 1567 +f 3376 1032 3122 1553 +f 3377 1554 3369 1078 +f 3376 1391 3516 1386 +f 3378 1402 3154 1549 +f 3154 1111 3410 1549 +f 1446 3189 1424 3379 +f 3124 1411 3372 1388 +f 3380 1034 3124 1388 +f 3359 1393 3182 1603 +f 3182 1394 3362 1603 +f 3381 1417 3204 1414 +f 3382 1084 3397 1396 +f 3365 1071 3158 1398 +f 3383 1398 3158 1397 +f 3384 1563 3520 1557 +f 3130 1072 3384 1557 +f 3363 1378 3164 1381 +f 3164 1071 3365 1381 +f 3384 1072 3160 1568 +f 3385 1564 3527 1568 +f 3160 1400 3385 1568 +f 3360 1420 3403 1401 +f 3386 1077 3167 1385 +f 3169 1402 3378 1550 +f 3378 1403 3515 1550 +f 3387 1404 3197 1445 +f 3150 1430 3406 1594 +f 3388 1064 3152 1601 +f 3156 1069 3389 1405 +f 3389 1598 3549 1405 +f 1406 3420 1407 3390 +f 1632 3390 1407 3391 +f 3118 1030 3392 1408 +f 3380 1622 3568 1623 +f 3192 1425 3416 1409 +f 3393 1438 3367 1030 +f 3372 1411 3394 1620 +f 3142 1105 3419 1410 +f 3206 1412 3395 1413 +f 1612 3422 1439 3396 +f 3173 1113 3421 1611 +f 3398 1609 3557 1608 +f 3204 1091 3399 1414 +f 3399 1416 3556 1414 +f 3400 1416 3399 1415 +f 3179 1417 3381 1418 +f 3381 1395 3555 1418 +f 3368 1389 3179 1418 +f 3401 1558 3163 1419 +f 3402 1564 3385 1420 +f 3386 1421 3403 1420 +f 1551 3404 1044 3405 +f 3406 1430 3146 1592 +f 3146 1109 3364 1592 +f 3407 1433 3547 1596 +f 3388 1602 3551 1422 +f 3152 1038 3408 1601 +f 3199 1064 3388 1422 +f 3411 1616 3562 1618 +f 3411 1436 3113 1379 +f 3412 1635 3577 1392 +f 3412 1424 3187 1097 +f 3413 1635 3412 1097 +f 3414 1048 3140 1627 +f 3140 1049 3415 1627 +f 3191 1034 3380 1623 +f 3374 1088 3136 1428 +f 3136 1084 3382 1428 +f 3382 1427 3560 1428 +f 3398 1415 3425 1429 +f 3406 1591 3546 1594 +f 3364 1109 3427 1590 +f 3148 1110 3417 1432 +f 3407 1110 3429 1595 +f 3389 1069 3128 1597 +f 3128 1431 3418 1597 +f 3126 1423 3409 1434 +f 3409 1435 3550 1434 +f 3194 1436 3411 1618 +f 3138 1407 3420 1437 +f 3185 1048 3414 1630 +f 3414 1629 3575 1630 +f 3201 1439 3422 1440 +f 3171 1082 3423 1441 +f 3424 1613 3423 1082 +f 3116 1447 3430 1442 +f 1443 3558 1429 3425 +f 1415 3177 1087 3425 +f 3426 1443 3425 1087 +f 3175 1088 3374 1610 +f 3196 1444 3428 1587 +f 3144 1387 3366 1588 +f 3207 1470 3431 1566 +f 3431 1559 3521 1566 +f 3432 1580 3535 1448 +f 3433 1584 3218 1128 +f 3230 1501 3475 1575 +f 3434 1617 3562 1615 +f 3435 1449 3580 1639 +f 3209 1450 3435 1639 +f 3436 1562 3525 1452 +f 3437 1472 3538 1453 +f 3438 1560 3523 1454 +f 3439 1645 3587 1644 +f 3440 1455 3561 1460 +f 3441 1581 3541 1582 +f 3442 1583 3534 1456 +f 3443 1135 3252 1458 +f 3438 1529 3207 1566 +f 3444 1459 3579 1638 +f 3434 1471 3302 1619 +f 3279 1196 3445 1488 +f 3446 1633 3574 1628 +f 3447 1498 3226 1461 +f 3447 1576 3537 1462 +f 3448 1463 3442 1457 +f 3441 1479 3228 1456 +f 3228 1457 3442 1456 +f 3449 1464 3458 1183 +f 3250 1466 3479 1465 +f 1467 3285 1202 3450 +f 3220 1485 3444 1638 +f 3451 1468 3220 1638 +f 3431 1470 3266 1615 +f 3266 1471 3434 1615 +f 3452 1492 3300 1624 +f 1634 3486 1150 3453 +f 3437 1473 3254 1577 +f 3454 1577 3254 1180 +f 3455 1474 3540 1461 +f 3226 1476 3455 1461 +f 3435 1450 3260 1453 +f 3260 1473 3437 1453 +f 3455 1476 3256 1475 +f 3456 1579 3536 1475 +f 3256 1499 3456 1475 +f 3432 1478 3474 1477 +f 3457 1126 3263 1582 +f 3263 1479 3441 1582 +f 3265 1183 3458 1586 +f 3459 1530 3293 1168 +f 3246 1164 3476 1513 +f 3460 1215 3248 1574 +f 3252 1481 3461 1458 +f 3461 1571 3529 1458 +f 3462 1643 3585 1642 +f 3462 1154 3281 1521 +f 3214 1206 3463 1482 +f 3451 1469 3583 1646 +f 3288 1483 3485 1511 +f 3464 1484 3439 1206 +f 3444 1485 3465 1486 +f 3238 1159 3490 1487 +f 3302 1195 3466 1619 +f 1636 3493 1217 3467 +f 3468 1490 3453 1150 +f 3271 1523 3492 1524 +f 3469 1512 3571 1491 +f 3300 1493 3470 1624 +f 3470 1494 3570 1624 +f 3471 1494 3470 1221 +f 3277 1492 3452 1495 +f 3452 1496 3568 1495 +f 3440 1196 3277 1495 +f 3472 1497 3259 1498 +f 3473 1579 3456 1478 +f 3457 1500 3474 1478 +f 3475 1585 3533 1575 +f 3475 1501 3265 1586 +f 3476 1164 3242 1452 +f 3242 1515 3436 1452 +f 3477 1555 3528 1570 +f 3460 1480 3532 1505 +f 3248 1504 3478 1574 +f 3443 1572 3530 1520 +f 3295 1215 3460 1505 +f 3480 1506 3581 1640 +f 3480 1451 3209 1639 +f 3481 1508 3584 1641 +f 3481 1202 3283 1507 +f 3482 1508 3481 1507 +f 3483 1199 3236 1510 +f 3236 1157 3484 1510 +f 3287 1468 3451 1646 +f 3446 1149 3232 1631 +f 3232 1150 3486 1631 +f 3469 1221 3496 1625 +f 3476 1502 3526 1513 +f 3436 1515 3498 1514 +f 3244 1503 3487 1518 +f 3477 1503 3500 1569 +f 3461 1481 3224 1516 +f 3224 1517 3488 1516 +f 3222 1135 3489 1519 +f 3290 1451 3480 1640 +f 3234 1154 3491 1509 +f 3281 1199 3483 1521 +f 3483 1522 3586 1521 +f 3297 1217 3493 1525 +f 3269 1526 3494 1489 +f 3495 1637 3494 1526 +f 3212 1122 3501 1527 +f 1614 3573 1625 3496 +f 1221 3275 1191 3496 +f 3497 1614 3496 1191 +f 3273 1149 3446 1628 +f 3292 1163 3499 1528 +f 3240 1529 3438 1454 +f 2473 475 1812 26 +f 403 2356 1531 3502 +f 2415 403 3502 391 +f 1814 31 2434 460 +f 2354 402 2357 1533 +f 2199 257 3503 146 +f 2007 231 2198 1534 +f 2200 256 3504 1535 +f 2337 388 2336 1540 +f 1536 2337 1540 3505 +f 3505 166 2047 1537 +f 2047 162 2203 1537 +f 2204 1538 3506 142 +f 1538 2207 252 3506 +f 3507 230 2166 1539 +f 3508 1540 3509 454 +f 3509 1542 2427 454 +f 2166 166 3508 1539 +f 3509 1540 3510 386 +f 1540 2335 1541 3510 +f 2353 401 2346 1542 +f 2206 1543 3511 234 +f 2191 252 2207 259 +f 3507 1544 2198 231 +f 2336 387 2335 1540 +f 3511 1543 2203 162 +f 3512 1546 3513 860 +f 3513 56 1853 860 +f 1898 1547 2126 213 +f 1978 122 2138 1548 +f 3514 1553 3361 1599 +f 3410 1422 3551 1599 +f 1403 3378 1549 3515 +f 3515 1599 3405 1550 +f 3404 1551 3405 1599 +f 3361 1552 3404 1599 +f 3514 1573 3516 1391 +f 3370 1386 3516 1573 +f 3377 1390 3370 1573 +f 3369 1554 3377 1573 +f 1421 3386 1385 3517 +f 3403 1421 3517 1573 +f 1556 3360 1401 3518 +f 3518 1573 3528 1555 +f 3520 1452 3525 1557 +f 3383 1558 3499 1454 +f 1559 3563 1399 3521 +f 3522 1566 3521 1381 +f 1560 3522 1380 3523 +f 3401 1567 3498 1528 +f 3524 1514 3498 1567 +f 1562 3524 1561 3525 +f 3526 1502 3520 1563 +f 3519 1555 3477 1569 +f 3523 1398 3383 1454 +f 3526 1568 3527 1513 +f 3459 1513 3527 1564 +f 3500 1530 3459 1564 +f 3402 1565 3519 1569 +f 3487 1570 3528 1573 +f 3488 1518 3487 1573 +f 1571 3461 1516 3529 +f 3529 1573 3530 1458 +f 1572 3443 1458 3530 +f 3530 1573 3489 1520 +f 3478 1519 3489 1573 +f 1480 3460 1574 3531 +f 2426 1578 3532 1480 +f 1578 3479 1505 3532 +f 3533 1578 3433 1575 +f 3474 1500 3541 1578 +f 3535 1578 3473 1448 +f 3537 1578 3472 1462 +f 3538 1578 3539 1453 +f 3539 1449 3435 1453 +f 3538 1472 3437 1577 +f 3454 1497 3472 1578 +f 3537 1576 3447 1461 +f 1578 3537 1461 3540 +f 1578 3540 1474 3536 +f 3535 1580 3432 1477 +f 1578 3541 1581 3534 +f 1578 3534 1583 3542 +f 3448 1584 3433 1578 +f 3533 1585 3475 1586 +f 3458 1464 3449 1578 +f 3449 1465 3479 1578 +f 1909 1593 3543 1604 +f 3543 1593 3544 1382 +f 3428 1588 3544 1593 +f 3427 1587 3428 1593 +f 1589 3364 1590 3545 +f 3545 1593 3546 1592 +f 1591 3406 1592 3546 +f 3546 1593 3387 1594 +f 3429 1404 3387 1593 +f 1433 3407 1595 3547 +f 3547 1593 3417 1596 +f 3418 1432 3417 1593 +f 1598 3389 1597 3548 +f 1599 3371 1405 3549 +f 3550 1435 3409 1600 +f 1599 3408 1434 3550 +f 3551 1602 3388 1601 +f 865 1909 1604 3552 +f 865 3552 1605 3553 +f 3395 1607 3373 865 +f 3373 1606 3554 865 +f 3554 1384 3368 1418 +f 865 3554 1418 3555 +f 3555 1395 3381 1414 +f 865 3555 1414 3556 +f 3400 1608 3557 865 +f 3557 1609 3398 1429 +f 865 3557 1429 3558 +f 3426 1610 3559 865 +f 3559 1426 3374 1428 +f 865 3559 1428 3560 +f 3560 1427 3382 1396 +f 3397 1611 3421 865 +f 3421 1440 3422 865 +f 3422 1612 3396 865 +f 3396 1441 3423 865 +f 3423 1613 3424 865 +f 3424 1442 3430 865 +f 3430 1446 3379 865 +f 3379 1392 3578 865 +f 3415 1408 3573 1614 +f 3561 1455 3567 1388 +f 3562 1617 3565 1618 +f 3563 1559 3431 1615 +f 1615 3562 1616 3564 +f 3419 1618 3565 1619 +f 3466 1488 3394 1410 +f 3445 1460 3566 1620 +f 1460 3561 1621 3566 +f 1495 3568 1622 3567 +f 1496 3569 1623 3568 +f 3416 1623 3569 1624 +f 1409 3416 1624 3570 +f 3393 1409 3570 1494 +f 3471 1491 3571 1438 +f 3571 1383 3367 1438 +f 3572 1512 3469 1625 +f 3392 1626 3572 1625 +f 1408 3392 1625 3573 +f 3497 1628 3574 1627 +f 3574 1629 3414 1627 +f 1633 3391 1630 3575 +f 1632 3391 1633 3576 +f 3486 1634 3390 1632 +f 3420 1406 3390 1634 +f 3453 1490 3468 1437 +f 3468 1524 3413 1437 +f 1524 3492 1392 3577 +f 3492 1525 3493 1392 +f 3493 1636 3578 1392 +f 3467 1489 3494 864 +f 3494 1637 3495 864 +f 3495 1527 3501 864 +f 3484 1482 3463 864 +f 864 3581 1506 3580 +f 864 3490 1640 3581 +f 3465 1487 3490 864 +f 864 3579 1459 3582 +f 864 3583 1469 3579 +f 864 3485 1646 3583 +f 3578 1636 3467 864 +f 3501 1467 3450 864 +f 3450 1641 3584 864 +f 3482 1509 3491 864 +f 3491 1642 3585 864 +f 3585 1643 3462 1521 +f 864 3585 1521 3586 +f 3586 1522 3483 1510 +f 3463 1644 3587 864 +f 3587 1645 3439 1484 +f 3464 1511 3485 864 +f 1780 3594 1647 3588 +f 1648 3591 1654 3588 +f 3589 1650 3593 1649 +f 3590 1780 3591 1651 +f 3592 1653 3589 1651 +f 1653 3592 1781 3593 +f 3594 1781 3592 1652 +f 3595 1648 3588 1647 +f 3595 1652 3592 1651 +f 1656 3601 1662 3596 +f 1660 3600 1655 3596 +f 1657 3598 1661 3597 +f 1656 3596 1655 3597 +f 1657 3600 1658 3598 +f 1659 3601 1661 3598 +f 1660 3596 1662 3599 +f 1659 3598 1658 3599 +f 1660 3599 1658 3600 +f 1657 3597 1655 3600 +f 1656 3597 1661 3601 +f 1659 3599 1662 3601 +f 1988 1713 2008 1663 +f 2009 144 1989 135 +f 2780 1664 3602 1666 +f 2814 1665 2812 148 +f 2812 856 2841 148 +f 2841 858 2019 148 +f 1667 1787 1668 3603 +f 1669 2720 739 3603 +f 1669 3603 1668 3604 +f 2830 1669 3604 1670 +f 1670 1904 1671 3605 +f 2002 1672 2809 1726 +f 2806 827 2809 1672 +f 2835 1673 2806 1672 +f 2821 1675 3606 1676 +f 1675 2794 1710 3606 +f 1797 1723 3627 1722 +f 1980 128 3607 1684 +f 1677 2790 1684 3607 +f 2791 1677 3607 128 +f 2816 833 2791 128 +f 806 2787 1678 3608 +f 3608 128 3609 853 +f 3609 1694 2803 854 +f 2833 824 2803 1694 +f 2015 1682 2834 1679 +f 2838 1680 2726 1682 +f 2726 1681 2748 1682 +f 2748 819 3610 1682 +f 2017 1683 2837 1698 +f 1700 2797 1699 3611 +f 1995 1684 2796 1700 +f 2819 1686 2796 1684 +f 2793 1687 2819 1684 +f 2746 765 2793 1684 +f 2790 764 2746 1684 +f 2776 796 2767 1688 +f 2767 786 2018 1688 +f 2781 798 2780 1666 +f 2751 1770 3655 1690 +f 2755 776 2751 1690 +f 1785 1667 3603 739 +f 739 2721 775 3612 +f 1692 2014 1693 3614 +f 2014 1694 1981 1693 +f 2012 1695 3613 137 +f 2842 829 2810 1683 +f 2810 1696 2807 1683 +f 2807 1697 2837 1683 +f 1904 15 3615 1671 +f 2827 1671 3615 1699 +f 2799 816 2827 1699 +f 2822 840 2799 1699 +f 2797 839 2822 1699 +f 2011 147 1990 1701 +f 2010 145 2011 1701 +f 1994 1730 3616 130 +f 2789 1703 2815 130 +f 2815 1704 2786 130 +f 2786 825 3617 130 +f 2005 1705 2831 849 +f 2802 822 2831 1705 +f 1705 3617 1706 3618 +f 2773 1767 3652 233 +f 2766 1707 2773 233 +f 785 2766 233 3619 +f 2778 785 3619 143 +f 1708 3620 774 3621 +f 1783 1708 3621 737 +f 2003 1727 2836 1674 +f 2725 1709 2836 1727 +f 1798 1676 3606 1710 +f 14 1798 1710 3622 +f 2817 837 3629 14 +f 1984 130 3617 1705 +f 2006 1712 3623 1711 +f 1987 131 1985 1711 +f 1713 1987 1711 3623 +f 2779 1714 2778 143 +f 2000 1715 2813 797 +f 2811 831 2813 1715 +f 2839 832 2811 1715 +f 3 1783 737 3624 +f 3624 738 3626 1716 +f 2829 1717 3625 1719 +f 1718 2825 844 3625 +f 2826 814 3627 1723 +f 1906 1719 3625 844 +f 1721 2820 1722 3627 +f 2001 1725 2840 855 +f 2808 1724 2840 1725 +f 2004 1728 2724 744 +f 2747 745 2724 1728 +f 2800 767 2747 1728 +f 2832 1729 2800 1728 +f 1733 1799 14 3629 +f 2818 1731 3630 1730 +f 811 2745 809 3630 +f 2788 1732 3616 1730 +f 1993 1733 3629 837 +f 2763 782 2847 13 +f 2761 1734 3639 22 +f 2736 755 2761 22 +f 1735 2765 754 3631 +f 3631 22 3633 1736 +f 747 2728 1736 3633 +f 3633 22 3634 1737 +f 3635 1771 3632 16 +f 3637 1734 2763 13 +f 12 1809 24 3637 +f 3638 1734 3637 24 +f 2723 743 2785 863 +f 2785 1740 2744 863 +f 2744 1741 2732 863 +f 2732 1742 2742 863 +f 2742 803 2783 863 +f 2783 1743 2730 863 +f 2730 1745 3640 863 +f 1745 2771 1744 3640 +f 2771 792 3641 1744 +f 2740 1746 3642 1744 +f 2775 1768 3653 1769 +f 1769 2035 1744 3642 +f 2848 862 2762 1748 +f 2760 1747 2735 1749 +f 2735 783 2764 1749 +f 3643 1750 1794 1749 +f 757 2737 23 3643 +f 2846 232 2770 1753 +f 862 2784 740 3644 +f 2743 1751 2784 862 +f 2731 762 2743 862 +f 2741 758 2731 862 +f 2782 1752 2741 862 +f 2768 1755 2770 232 +f 2739 787 2768 232 +f 2169 1756 2772 1757 +f 2764 757 3643 1749 +f 2737 1758 3646 23 +f 1758 2727 1759 3646 +f 2727 1760 3647 1759 +f 1760 2756 1761 3647 +f 2756 1762 3648 1761 +f 1762 2758 1763 3648 +f 2758 1766 3649 1763 +f 3649 1766 2733 1765 +f 1764 3649 1765 3650 +f 769 3651 9 3650 +f 769 3654 2 3651 +f 1767 2773 793 3652 +f 1756 1999 233 3652 +f 1688 2018 1769 3653 +f 1708 1783 2 3654 +f 3620 1708 3654 769 +f 1770 2751 1771 3655 +f 3656 1772 2430 1773 +f 2430 1774 1874 1773 +f 1777 2429 1776 3657 +f 1854 56 3513 1775 +f 3513 1546 3660 1775 +f 1775 3658 456 3657 +f 3656 59 1864 1776 +f 2429 1772 3656 1776 +f 3658 141 1998 1779 +f 2472 456 3658 1779 +f 1547 1901 1778 3659 +f 1779 2034 156 3659 +f 141 3658 1775 3660 +f 2469 492 2497 493 +f 3590 1649 3593 1781 +f 1782 1 3651 2 +f 1782 83 1921 90 +f 1784 1716 1905 83 +f 1785 739 3612 1690 +f 1786 4 1787 5 +f 1786 6 1793 73 +f 1788 23 3646 1759 +f 1789 20 3638 24 +f 1790 99 1806 1763 +f 1790 1764 1802 7 +f 1791 22 1807 8 +f 1791 17 1803 1739 +f 1792 89 1802 9 +f 1793 16 1803 70 +f 1795 12 3637 13 +f 1795 45 1837 47 +f 1796 1723 1797 94 +f 1797 1722 2821 1676 +f 1800 82 1884 76 +f 1800 1699 3615 15 +f 1804 1761 1806 19 +f 1805 21 1807 1738 +f 1808 97 1930 10 +f 1808 1750 3643 23 +f 1810 26 1812 612 +f 40 1825 37 1811 +f 1811 604 2526 612 +f 475 2424 40 1812 +f 1816 590 2603 30 +f 1817 606 2611 33 +f 1817 32 2496 31 +f 1818 33 2534 607 +f 1819 36 1820 32 +f 1824 43 1829 527 +f 1826 40 1827 39 +f 1826 587 2532 38 +f 1827 43 1828 614 +f 1828 585 2527 603 +f 1538 2204 32 1829 +f 1832 529 2598 602 +f 1834 44 1835 45 +f 863 2843 859 1834 +f 755 2736 753 1835 +f 1837 784 2765 46 +f 859 2844 54 1838 +f 50 2769 791 1838 +f 782 2763 781 1839 +f 1734 2761 44 1840 +f 743 2723 48 1841 +f 1740 2785 805 1842 +f 1741 2744 49 1843 +f 1742 2732 760 1844 +f 803 2742 802 1845 +f 1743 2783 801 1846 +f 1848 1746 2740 51 +f 1768 2775 52 1849 +f 1850 786 2767 795 +f 798 2781 799 1851 +f 1852 54 1853 55 +f 1664 2780 53 1852 +f 1854 1775 3657 1776 +f 1665 2814 55 1855 +f 829 2842 57 1856 +f 1696 2810 828 1857 +f 1858 61 1860 59 +f 1858 255 1870 60 +f 854 2803 823 1860 +f 1691 1982 62 1861 +f 824 2833 850 1862 +f 856 2812 857 1865 +f 1697 2807 58 1866 +f 1680 2838 64 1867 +f 1681 2726 768 1868 +f 819 2748 65 1869 +f 1873 59 3656 1773 +f 1874 1774 2469 493 +f 1875 68 1876 25 +f 1876 777 1877 69 +f 1877 780 1878 21 +f 1878 751 1879 8 +f 1879 750 1880 17 +f 1880 72 1881 70 +f 1882 71 2721 847 +f 1883 847 2720 843 +f 82 1903 4 1883 +f 1886 816 2799 817 +f 1887 840 2822 838 +f 1888 839 2797 813 +f 1889 1686 2819 77 +f 1890 1687 2793 78 +f 1891 765 2746 763 +f 1892 764 2790 810 +f 1893 833 2816 807 +f 939 2967 938 1895 +f 1896 1547 1898 80 +f 932 2928 933 1896 +f 1897 81 1900 945 +f 1899 213 2111 81 +f 865 3578 864 1900 +f 938 1902 1578 1901 +f 1903 1670 3604 1668 +f 1905 1719 1906 93 +f 1906 844 3628 1720 +f 1748 2762 98 1911 +f 1747 2760 85 1912 +f 783 2735 752 1913 +f 757 2764 86 1914 +f 1758 2737 756 1916 +f 1917 99 1918 88 +f 1917 1762 2756 87 +f 1922 93 1923 92 +f 1923 94 1924 841 +f 1924 138 1925 95 +f 1925 129 1926 815 +f 1926 134 1927 812 +f 1927 133 1928 836 +f 1928 139 1929 834 +f 742 1933 101 1932 +f 740 2784 804 1933 +f 1751 2743 761 1934 +f 762 2731 748 1935 +f 758 2741 759 1936 +f 1752 2782 800 1937 +f 1940 1753 2770 790 +f 1941 1755 2768 102 +f 1942 787 2739 103 +f 1943 1757 2772 794 +f 1944 1707 2766 105 +f 1714 2779 104 1945 +f 1946 797 2813 830 +f 1947 831 2811 106 +f 1948 832 2839 108 +f 1949 1724 2808 107 +f 1950 115 1968 107 +f 1950 827 2806 826 +f 1951 109 2745 96 +f 1703 2789 808 1953 +f 1704 2815 110 1954 +f 825 2786 111 1955 +f 126 1958 848 1957 +f 1957 822 2802 821 +f 1959 451 2420 629 +f 1960 1729 2832 848 +f 629 1962 766 1961 +f 1961 767 2800 818 +f 1962 627 2421 113 +f 1963 745 2747 766 +f 113 1965 114 1964 +f 1964 1709 2725 746 +f 1965 452 2422 630 +f 630 1967 826 1966 +f 1966 1673 2835 114 +f 1967 438 2392 115 +f 1969 437 2618 116 +f 1970 441 2619 633 +f 1971 632 2620 118 +f 1972 442 2617 631 +f 1973 121 1975 631 +f 1973 634 2621 119 +f 1974 450 2417 120 +f 1976 123 2849 122 +f 903 2906 84 1977 +f 1548 2845 861 1978 +f 1684 1996 127 1980 +f 1694 3609 128 1981 +f 1982 136 3614 1693 +f 1983 130 1984 129 +f 1984 1705 2006 1711 +f 1988 1663 2009 135 +f 1989 144 2010 1701 +f 1990 136 1991 1701 +f 147 2012 137 1990 +f 1993 837 2818 1730 +f 75 1996 1684 1995 +f 1700 3611 1685 1995 +f 1998 149 2016 142 +f 797 2779 143 2000 +f 2001 1548 2168 1725 +f 855 2839 1715 2001 +f 1726 2808 1725 2002 +f 1674 2835 1672 2003 +f 744 2725 1727 2004 +f 849 2832 1728 2005 +f 2006 231 2007 1712 +f 2007 1534 2199 146 +f 2008 1713 3623 1712 +f 146 2013 1695 2012 +f 2015 1535 2016 1682 +f 2015 1679 2833 1694 +f 2017 1698 2838 1682 +f 2018 786 2781 1666 +f 149 2020 148 2019 +f 2019 858 2842 1683 +f 2020 860 2035 1666 +f 150 3357 151 2022 +f 1345 3351 1346 2023 +f 2024 1321 2025 156 +f 2025 1175 3225 1320 +f 2028 1140 3258 154 +f 2029 1179 3253 155 +f 2032 1323 3210 1326 +f 1324 3261 1325 2033 +f 2034 142 3506 252 +f 1296 3166 1226 2036 +f 1275 3119 158 2037 +f 2040 162 2047 159 +f 2041 1298 3161 1276 +f 2042 1277 3159 1248 +f 163 3320 1278 2044 +f 164 3311 1247 2045 +f 2048 1255 2081 162 +f 2049 1290 3112 1225 +f 2053 1230 3205 168 +f 2054 1228 3180 1237 +f 2057 1227 3178 1261 +f 2059 1115 3203 170 +f 2060 866 2061 171 +f 2060 1090 3176 1260 +f 1300 3326 172 2062 +f 1288 3303 173 2065 +f 1286 3172 1287 2066 +f 2067 1283 3200 1285 +f 2069 1025 3170 174 +f 2070 1027 3115 175 +f 2072 1280 3188 176 +f 2074 1251 3186 1252 +f 2075 1046 3137 177 +f 2076 866 2077 179 +f 1329 2094 202 2078 +f 2078 1094 3184 179 +f 188 3305 189 2080 +f 1103 3193 1282 2082 +f 2083 1282 3324 192 +f 1545 3511 162 2083 +f 1033 3123 184 2086 +f 1306 2103 1545 2087 +f 197 3322 186 2088 +f 2092 199 2104 198 +f 2092 1029 3323 190 +f 1374 2106 190 2093 +f 2093 1028 3139 191 +f 1119 3330 1303 2096 +f 2097 1366 3267 193 +f 2099 1223 3301 1335 +f 2100 1194 3278 195 +f 2103 1333 3276 196 +f 2104 1331 3345 1332 +f 1219 3298 1361 2106 +f 2107 1314 3272 1374 +f 2108 200 2109 203 +f 2110 866 2111 1363 +f 1330 3332 1304 2110 +f 1364 3270 1363 2112 +f 2113 1362 3296 204 +f 2115 1186 3268 206 +f 2116 1371 3211 207 +f 2119 1152 3233 219 +f 2120 210 2134 213 +f 2120 217 3338 1375 +f 2121 216 3337 211 +f 2122 1357 2133 213 +f 2125 213 2126 1326 +f 1547 3659 156 2126 +f 1327 3289 1358 2127 +f 1158 3237 1359 2128 +f 1351 3219 1353 2130 +f 1352 3286 1354 2131 +f 2132 1354 3354 1355 +f 2135 1349 3282 218 +f 2136 1372 3284 209 +f 220 2139 1548 2138 +f 2139 1231 3143 221 +f 1294 3195 1293 2140 +f 2143 1107 3145 1238 +f 2145 1058 3149 1265 +f 2147 230 2167 1263 +f 2150 1055 3307 223 +f 2151 166 2166 223 +f 2151 1269 3127 224 +f 2154 1232 3155 1268 +f 2156 1036 3125 1234 +f 2157 1035 3151 1273 +f 2159 1062 3198 227 +f 2160 1243 3309 1245 +f 228 3319 229 2163 +f 1270 3318 1302 2164 +f 2164 1295 2165 166 +f 1757 2739 232 2169 +f 2171 236 3335 1367 +f 2173 1337 2174 234 +f 2178 1316 3341 242 +f 2179 1339 3223 243 +f 2182 1138 3251 1310 +f 2183 252 2191 1310 +f 2184 1134 3221 1343 +f 2185 1133 3247 1342 +f 2187 1214 3294 1344 +f 2188 1212 3350 247 +f 2189 1318 3342 248 +f 2190 253 2194 252 +f 259 2206 234 2191 +f 2192 1340 2193 252 +f 1146 3342 1318 2193 +f 1143 3333 251 2194 +f 1369 3333 1347 2195 +f 2196 257 2199 254 +f 2200 255 2201 256 +f 2200 1535 3503 257 +f 2202 1537 2203 453 +f 142 3504 258 2204 +f 2205 1543 2206 43 +f 1578 2426 453 2205 +f 308 2264 260 2208 +f 267 2228 262 2210 +f 2212 400 2350 263 +f 2212 279 2240 338 +f 2215 264 2270 353 +f 2217 265 2351 275 +f 2217 324 2243 289 +f 2218 268 2347 398 +f 2218 282 2231 269 +f 2220 270 2352 271 +f 2220 340 2245 288 +f 2221 325 2282 326 +f 2222 369 2315 375 +f 2223 345 2316 330 +f 2224 330 2322 346 +f 2229 399 2348 266 +f 2229 283 2234 335 +f 2230 339 2292 274 +f 685 2625 276 2231 +f 2232 671 2235 339 +f 284 2675 685 2233 +f 285 2652 284 2234 +f 2235 650 2238 277 +f 646 2633 285 2236 +f 684 2673 646 2237 +f 2238 278 2241 273 +f 337 2291 338 2239 +f 286 2651 684 2239 +f 645 2631 286 2240 +f 2241 281 2256 280 +f 291 2671 681 2246 +f 2247 293 2248 727 +f 2248 294 2249 724 +f 2249 341 2250 725 +f 2250 296 2251 295 +f 2251 357 2252 718 +f 2252 325 2253 700 +f 2253 356 2254 297 +f 2254 299 2255 298 +f 2255 319 2277 300 +f 2256 677 2257 331 +f 2257 302 2258 344 +f 2258 643 2259 301 +f 2259 304 2260 303 +f 2260 305 2261 332 +f 2261 667 2262 306 +f 2262 307 2263 261 +f 334 2289 350 2266 +f 312 2300 311 2268 +f 313 2701 711 2271 +f 354 2297 353 2271 +f 711 2687 314 2272 +f 314 2683 315 2273 +f 315 2693 666 2274 +f 323 2285 360 2274 +f 666 2654 316 2275 +f 316 2627 713 2276 +f 2277 321 2278 732 +f 2278 320 2279 735 +f 2279 322 2280 716 +f 394 2344 395 2281 +f 2285 329 2327 328 +f 361 2308 362 2286 +f 2288 373 2299 301 +f 2297 382 2331 342 +f 2298 384 2307 343 +f 390 2339 358 2305 +f 2310 411 2319 363 +f 2310 272 2323 417 +f 2311 374 2383 364 +f 2312 406 2313 365 +f 2312 347 2318 433 +f 2313 432 2320 366 +f 2315 429 2380 368 +f 2317 371 2412 370 +f 2318 372 2319 412 +f 2321 430 2358 404 +f 2322 376 2381 367 +f 2323 333 2324 418 +f 2324 378 2326 377 +f 2325 423 2329 349 +f 2326 379 2333 420 +f 2329 421 2333 348 +f 2334 386 3510 1541 +f 2336 327 2338 387 +f 444 2415 391 2343 +f 2353 1542 3509 386 +f 1533 2427 455 2354 +f 404 2379 428 2357 +f 2365 406 2366 409 +f 2370 418 2371 415 +f 2371 377 2372 419 +f 2372 420 2373 706 +f 2373 421 2374 649 +f 2374 423 2375 422 +f 2375 383 2376 424 +f 2376 426 2377 427 +f 2377 385 2409 425 +f 439 2428 1533 2378 +f 2378 661 2651 435 +f 2379 663 2387 1533 +f 2383 432 2384 430 +f 2391 436 2631 440 +f 2391 437 2392 439 +f 2394 287 2669 659 +f 2397 696 2671 728 +f 2398 727 2710 443 +f 2400 725 2691 702 +f 2401 295 2706 719 +f 2402 444 2414 719 +f 731 2712 447 2406 +f 2409 380 2410 446 +f 2410 381 2411 448 +f 2412 640 2627 449 +f 1573 3514 1599 2418 +f 2418 1593 2622 635 +f 2419 112 2616 254 +f 1578 2425 467 2423 +f 2423 492 2469 1778 +f 1480 3531 1573 2426 +f 2428 1539 3508 454 +f 2430 456 2472 1774 +f 2431 457 2444 1532 +f 2431 32 2497 492 +f 2433 652 2642 459 +f 463 2495 460 2434 +f 2435 461 2653 686 +f 2438 676 2439 501 +f 2439 653 2440 512 +f 2440 679 2474 511 +f 2445 564 2648 457 +f 2446 656 2646 657 +f 2447 565 2670 466 +f 2448 660 2650 680 +f 2449 682 2672 683 +f 2451 730 2711 729 +f 2452 571 2709 726 +f 467 2454 468 2453 +f 2453 572 2692 703 +f 2455 717 2457 505 +f 2455 504 2470 477 +f 2458 609 2517 470 +f 475 2473 505 2459 +f 2460 519 2515 514 +f 520 2519 521 2464 +f 522 2520 473 2466 +f 524 2521 523 2468 +f 517 2508 476 2470 +f 2472 1779 3659 1778 +f 26 2494 478 2473 +f 2474 644 2475 479 +f 2475 669 2476 507 +f 2476 670 2477 508 +f 2477 480 2478 497 +f 2478 481 2479 498 +f 2479 482 2480 483 +f 491 2500 515 2484 +f 2485 554 2698 708 +f 2486 709 2636 487 +f 2487 555 2680 689 +f 715 2586 477 2493 +f 2498 495 2510 494 +f 2498 513 2514 525 +f 2499 621 2610 605 +f 2501 617 2502 497 +f 2501 498 2509 620 +f 2502 622 2511 508 +f 2503 499 2608 500 +f 2506 597 2514 503 +f 2509 483 2510 506 +f 599 2524 528 2516 +f 532 2535 496 2517 +f 557 2528 519 2519 +f 556 2596 522 2521 +f 2525 593 2592 591 +f 714 2586 583 2526 +f 2527 584 2577 577 +f 698 2559 600 2528 +f 2529 570 2573 530 +f 2530 573 2576 584 +f 2531 613 2579 580 +f 2535 598 2595 516 +f 615 2615 624 2537 +f 542 2642 533 2537 +f 2538 673 2541 534 +f 543 2640 542 2539 +f 535 2608 536 2540 +f 675 2666 543 2540 +f 2541 688 2544 619 +f 537 2644 675 2542 +f 538 2668 537 2543 +f 2544 665 2547 540 +f 618 2610 539 2545 +f 546 2630 538 2545 +f 539 2602 545 2546 +f 2547 559 2562 558 +f 623 2589 548 2549 +f 626 2613 625 2551 +f 2553 552 2554 551 +f 2554 599 2555 553 +f 2555 598 2556 554 +f 2556 532 2557 709 +f 2557 610 2558 555 +f 689 2680 690 2559 +f 2560 556 2561 699 +f 2561 575 2583 694 +f 2562 648 2563 560 +f 2563 662 2564 592 +f 2564 563 2565 591 +f 2565 562 2566 561 +f 2566 564 2567 594 +f 2567 656 2568 596 +f 2568 565 2569 595 +f 568 2597 569 2571 +f 723 2705 574 2576 +f 574 2690 693 2577 +f 693 2682 579 2578 +f 613 2587 577 2578 +f 579 2715 733 2579 +f 581 2717 582 2581 +f 604 2600 588 2582 +f 2583 578 2584 704 +f 2584 611 2585 576 +f 589 2612 502 2588 +f 2590 616 2609 534 +f 2606 27 2607 611 +f 2623 416 2677 636 +f 2623 637 2658 414 +f 2624 639 2678 485 +f 2624 484 2659 638 +f 2635 422 2679 318 +f 2635 317 2697 649 +f 2638 547 2657 481 +f 2638 480 2662 544 +f 2645 440 2647 654 +f 2649 659 2669 290 +f 2656 668 2658 307 +f 2657 549 2659 482 +f 2660 541 2662 670 +f 2677 415 2699 309 +f 2678 551 2700 486 +f 2686 729 2711 567 +f 2695 706 2697 705 +f 2695 310 2699 419 +f 2696 707 2700 553 +f 2708 443 2710 724 +f 2713 469 2717 581 +f 2718 846 2719 737 +f 2718 772 2754 773 +f 2723 863 2847 782 +f 2734 771 2753 750 +f 2734 751 2759 779 +f 2736 22 3631 754 +f 2738 1735 3631 1736 +f 1744 3641 788 2740 +f 2750 91 2754 774 +f 2750 770 3620 769 +f 2755 1690 3612 775 +f 2757 1737 2759 780 +f 1749 2848 1748 2760 +f 862 3644 741 2762 +f 788 3641 792 2769 +f 1756 3652 793 2772 +f 2775 1769 3642 1746 +f 2776 1768 2777 796 +f 1688 3653 1689 2776 +f 2782 862 3645 1754 +f 2787 853 2805 60 +f 2788 1730 3630 809 +f 130 3616 1732 2789 +f 2792 811 3630 1731 +f 2798 1721 3627 814 +f 1705 3618 852 2802 +f 852 3618 1706 2804 +f 2814 148 3602 1664 +f 2816 128 3608 1678 +f 2817 14 3622 835 +f 2823 1718 3625 1717 +f 2824 845 2828 74 +f 2826 1723 3628 844 +f 2827 79 2828 1671 +f 2829 1719 3626 738 +f 1670 3605 842 2830 +f 2834 1682 3610 820 +f 2845 862 2848 101 +f 2846 1753 3645 862 +f 2850 1117 2877 124 +f 1231 3112 1021 2852 +f 1294 3143 868 2853 +f 1107 3195 1108 2854 +f 1058 3145 1059 2855 +f 1057 3149 869 2856 +f 2858 1232 3127 870 +f 2859 1036 3155 871 +f 2860 1035 3125 1068 +f 2861 1062 3151 872 +f 2862 117 2863 873 +f 2862 1243 3198 1063 +f 906 2910 874 2863 +f 2864 1244 3153 873 +f 874 2890 890 2865 +f 1070 3157 1075 2865 +f 1073 3162 875 2866 +f 1279 3129 1039 2867 +f 1250 3159 876 2868 +f 1277 3161 877 2869 +f 2871 1298 3119 1031 +f 2872 1275 3166 879 +f 2873 1296 3131 881 +f 2874 1042 3121 880 +f 2875 1271 3133 882 +f 2876 1079 3168 1065 +f 1230 3180 883 2877 +f 1228 3178 884 2878 +f 1227 3203 885 2879 +f 1115 3176 1116 2880 +f 2882 1090 3202 1114 +f 2883 1085 3174 1045 +f 2884 1259 3135 887 +f 2885 1288 3172 1112 +f 2886 1286 3200 888 +f 2887 1283 3170 889 +f 2888 891 2893 889 +f 2888 1025 3115 1026 +f 2889 1027 3188 894 +f 904 2907 891 2890 +f 1024 3165 890 2891 +f 1103 3114 1023 2892 +f 2894 1280 3186 893 +f 2895 1251 3137 895 +f 2896 1046 3184 1093 +f 2897 1094 3139 896 +f 1101 3190 898 2899 +f 1281 3123 899 2900 +f 1033 3141 1052 2901 +f 1051 3193 892 2902 +f 953 2909 900 2903 +f 2905 901 2911 121 +f 947 2988 902 2906 +f 2907 952 2981 946 +f 959 2975 906 2911 +f 907 2939 927 2912 +f 942 2968 940 2912 +f 1119 3267 907 2913 +f 1118 3208 1161 2914 +f 1308 3239 1160 2915 +f 1209 3291 1210 2916 +f 1336 3241 908 2917 +f 1338 3245 909 2918 +f 2920 1138 3223 911 +f 2921 1134 3251 1171 +f 2922 1133 3221 912 +f 2923 1214 3247 1132 +f 2924 1212 3294 1213 +f 2925 940 2926 914 +f 2925 1341 3249 913 +f 2927 1146 3264 914 +f 1324 3253 916 2928 +f 1179 3258 917 2929 +f 1140 3225 1139 2930 +f 1175 3255 918 2931 +f 1174 3257 1177 2932 +f 2934 1370 3215 920 +f 2935 1181 3262 1142 +f 2936 1143 3227 921 +f 2937 1127 3217 922 +f 2938 1145 3229 915 +f 1366 3301 923 2939 +f 1223 3278 924 2940 +f 1194 3276 1192 2941 +f 1333 3299 925 2942 +f 1222 3274 926 2943 +f 2945 1331 3298 1218 +f 2946 1219 3272 1190 +f 2947 1314 3231 1148 +f 2948 1330 3270 1187 +f 2949 1364 3296 929 +f 2950 1362 3268 930 +f 2951 1186 3211 931 +f 2952 80 2959 931 +f 2952 1371 3284 1201 +f 2953 1372 3282 1200 +f 1323 3261 932 2954 +f 1327 3210 1120 2955 +f 1158 3289 1207 2956 +f 1351 3237 934 2957 +f 1352 3219 1130 2958 +f 995 2972 927 2959 +f 2960 1349 3233 1197 +f 2961 1152 3280 1198 +f 2962 1313 3235 1156 +f 1205 3286 1204 2964 +f 2966 993 2973 945 +f 2968 1000 3053 941 +f 943 2971 944 2970 +f 987 3057 936 2971 +f 992 3042 995 2973 +f 2975 956 2984 958 +f 2976 951 2979 950 +f 2977 958 2984 957 +f 949 3014 971 2978 +f 2980 955 2982 954 +f 2986 974 3041 960 +f 955 2989 961 2986 +f 971 3003 963 2989 +f 1393 3111 961 2990 +f 1394 3182 965 2991 +f 1412 3206 964 2992 +f 1389 3181 1092 2993 +f 1417 3179 966 2994 +f 1091 3204 968 2995 +f 2997 1088 3175 1086 +f 2998 1084 3136 1089 +f 2999 1113 3173 969 +f 3000 1439 3201 970 +f 3001 1082 3171 1081 +f 3002 1447 3116 1083 +f 1099 3187 1098 3003 +f 3005 1407 3138 1047 +f 3006 1048 3185 1095 +f 3007 1049 3140 1096 +f 3008 1030 3118 1050 +f 1425 3192 1102 3010 +f 1034 3191 1100 3011 +f 1411 3124 973 3012 +f 1105 3142 1106 3013 +f 1436 3194 1104 3014 +f 1387 3144 975 3015 +f 1444 3196 1053 3016 +f 1109 3146 976 3017 +f 1430 3150 1061 3018 +f 1445 3197 1060 3019 +f 3021 1110 3148 1056 +f 3022 1431 3128 978 +f 3023 1069 3156 979 +f 3024 1423 3126 1037 +f 3025 1038 3152 980 +f 3026 1064 3199 1067 +f 3027 1111 3154 1066 +f 3028 1066 3029 981 +f 3028 950 3041 974 +f 3029 1402 3169 1080 +f 3030 1044 3134 1043 +f 3031 1377 3122 982 +f 3032 1032 3132 983 +f 3033 1078 3167 1076 +f 1400 3160 984 3035 +f 1072 3130 1040 3036 +f 1419 3163 1041 3037 +f 1397 3158 1074 3038 +f 1071 3164 986 3039 +f 1378 3113 949 3040 +f 3043 998 3052 990 +f 3044 991 3047 988 +f 3045 990 3052 989 +f 1012 3083 1006 3046 +f 3048 1020 3050 994 +f 3055 1015 3110 997 +f 1020 3058 1184 3055 +f 1006 3072 1004 3058 +f 1470 3207 1184 3059 +f 1471 3266 1185 3060 +f 1195 3302 1224 3061 +f 1196 3279 1193 3062 +f 1492 3277 1001 3063 +f 1493 3300 1002 3064 +f 3066 1149 3273 1003 +f 3067 1150 3232 1151 +f 3068 1523 3271 1188 +f 3069 1217 3297 1189 +f 3070 1526 3269 1005 +f 3071 1122 3212 1121 +f 1203 3283 1123 3072 +f 3074 1154 3234 1153 +f 3075 1199 3281 1155 +f 3076 1157 3236 1007 +f 3077 1206 3214 1125 +f 1483 3288 1010 3079 +f 1468 3287 1009 3080 +f 1485 3220 1131 3081 +f 1159 3238 1011 3082 +f 1451 3290 1208 3083 +f 1529 3240 1162 3084 +f 1163 3292 1013 3085 +f 1515 3242 1165 3086 +f 1164 3246 1169 3087 +f 1168 3293 1211 3088 +f 3090 1503 3244 1166 +f 3091 1517 3224 1172 +f 3092 1481 3252 1137 +f 3093 1135 3222 1136 +f 3094 1504 3248 1216 +f 3095 1215 3295 1014 +f 3096 1466 3250 1170 +f 3097 1170 3098 1018 +f 3097 988 3110 1015 +f 3098 1183 3265 1147 +f 3099 1501 3230 1016 +f 3100 1128 3218 1129 +f 3101 1457 3228 1144 +f 3102 1479 3263 1182 +f 1499 3256 1176 3104 +f 1476 3226 1141 3105 +f 1498 3259 1017 3106 +f 1180 3254 1173 3107 +f 1473 3260 1019 3108 +f 1450 3209 1012 3109 +f 3116 1442 3424 1082 +f 1408 3415 1049 3118 +f 1077 3386 1420 3120 +f 1434 3408 1038 3126 +f 3132 1390 3377 1078 +f 3134 1552 3361 1377 +f 1257 3303 1288 3135 +f 1437 3413 1097 3138 +f 3142 1410 3394 1411 +f 3144 1588 3428 1444 +f 1432 3418 1431 3148 +f 3150 1594 3387 1445 +f 3153 1242 3309 1243 +f 1405 3371 1423 3156 +f 3157 165 3321 1073 +f 1558 3383 1397 3163 +f 1550 3405 1044 3169 +f 1441 3396 1439 3171 +f 3173 1611 3397 1084 +f 3175 1610 3426 1087 +f 1607 3395 1412 3181 +f 3183 1290 3325 1292 +f 1630 3391 1407 3185 +f 3189 1446 3430 1447 +f 3191 1623 3416 1425 +f 3192 1409 3393 1030 +f 3194 1618 3419 1105 +f 3196 1587 3427 1109 +f 3197 1404 3429 1110 +f 3199 1422 3410 1111 +f 3201 1440 3421 1113 +f 3208 235 3330 1119 +f 3212 1527 3495 1526 +f 1124 3337 1356 3213 +f 1482 3484 1157 3214 +f 1126 3457 1478 3216 +f 3218 1584 3448 1457 +f 1519 3478 1504 3222 +f 3230 1575 3433 1128 +f 1329 3332 1330 3231 +f 1509 3482 1507 3234 +f 3238 1487 3465 1485 +f 3240 1454 3499 1163 +f 1518 3488 1517 3244 +f 3246 1513 3459 1168 +f 3249 1312 3350 1212 +f 3250 1465 3449 1183 +f 3255 152 3343 1174 +f 3257 1319 3353 1370 +f 1497 3454 1180 3259 +f 1489 3467 1217 3269 +f 3271 1524 3468 1150 +f 3273 1628 3497 1191 +f 1488 3466 1195 3279 +f 3280 210 3358 1313 +f 3285 1467 3501 1122 +f 3287 1646 3485 1483 +f 3288 1511 3464 1206 +f 3290 1640 3490 1159 +f 3292 1528 3498 1515 +f 3293 1530 3500 1503 +f 3295 1505 3479 1466 +f 3297 1525 3492 1523 +f 3299 185 3355 1222 +f 3305 187 3313 1029 +f 1603 3552 1604 3359 +f 1565 3402 1420 3360 +f 3362 1413 3553 1605 +f 1381 3521 1399 3363 +f 3365 1398 3523 1380 +f 3366 1376 3543 1382 +f 1626 3392 1030 3367 +f 1606 3373 1389 3368 +f 3369 1573 3517 1385 +f 3370 1032 3376 1386 +f 1599 3550 1600 3371 +f 3372 1620 3566 1621 +f 3375 1557 3525 1561 +f 1567 3401 1419 3375 +f 1553 3514 1391 3376 +f 3379 1424 3412 1392 +f 1388 3567 1622 3380 +f 3384 1568 3526 1563 +f 1494 3471 1438 3393 +f 1488 3445 1620 3394 +f 865 3553 1413 3395 +f 865 3560 1396 3397 +f 1608 3400 1415 3398 +f 865 3556 1416 3400 +f 3401 1528 3499 1558 +f 1569 3500 1564 3402 +f 3403 1573 3518 1401 +f 1596 3417 1110 3407 +f 1599 3551 1601 3408 +f 3410 1599 3515 1549 +f 3411 1379 3564 1616 +f 1524 3577 1635 3413 +f 3415 1614 3497 1627 +f 3418 1593 3548 1597 +f 1619 3466 1410 3419 +f 1634 3453 1437 3420 +f 865 3558 1443 3426 +f 3427 1593 3545 1590 +f 3429 1593 3547 1595 +f 1448 3473 1478 3432 +f 3434 1619 3565 1617 +f 3436 1514 3524 1562 +f 3438 1566 3522 1560 +f 1644 3463 1206 3439 +f 1460 3445 1196 3440 +f 3440 1495 3567 1455 +f 1456 3534 1581 3441 +f 3442 1463 3542 1583 +f 1520 3489 1135 3443 +f 3444 1486 3582 1459 +f 1631 3576 1633 3446 +f 1462 3472 1498 3447 +f 1578 3542 1463 3448 +f 3450 1202 3481 1641 +f 1638 3579 1469 3451 +f 3452 1624 3569 1496 +f 1578 3538 1577 3454 +f 3455 1475 3536 1474 +f 1582 3541 1500 3457 +f 1578 3533 1586 3458 +f 1642 3491 1154 3462 +f 864 3587 1484 3464 +f 864 3582 1486 3465 +f 1491 3471 1221 3469 +f 1578 3536 1579 3473 +f 3474 1578 3535 1477 +f 1452 3520 1502 3476 +f 1570 3487 1503 3477 +f 3478 1573 3531 1574 +f 3480 1639 3580 1506 +f 864 3584 1508 3482 +f 3484 864 3586 1510 +f 1632 3576 1631 3486 +f 3488 1573 3529 1516 +f 3505 1540 3508 166 +f 3512 141 3660 1546 +f 3518 1555 3519 1556 +f 3539 864 3580 1449 +f 3548 1599 3549 1598 +f 3563 1615 3564 1379 +f 3571 1512 3572 1383 +f 3574 1633 3575 1629 +f 3588 1654 3591 1780 +f 3589 1649 3590 1651 +f 1653 3593 1650 3589 +f 3590 1781 3594 1780 +f 3591 1648 3595 1651 +f 1652 3595 1647 3594 +f 3613 1692 3614 136 +f 3632 771 3636 1739 +f 3634 1739 3636 779 +f 3635 5 3655 1771 +f 3638 1738 3639 1734 +# 3672 faces, 0 coords texture + +# End of File diff --git a/tests/libslic3r/test_hollowing.cpp b/tests/libslic3r/test_hollowing.cpp index 0e211c33ce..c0acb4f25d 100644 --- a/tests/libslic3r/test_hollowing.cpp +++ b/tests/libslic3r/test_hollowing.cpp @@ -19,10 +19,19 @@ static Slic3r::TriangleMesh load_model(const std::string &obj_filename) return mesh; } -TEST_CASE("Load object", "[Hollowing]") { - Slic3r::TriangleMesh mesh = load_model("20mm_cube.obj"); +static bool _check_normals(const Slic3r::sla::Contour3D &mesh) +{ + for (auto & face : mesh.faces3) + { + + } - Slic3r::sla::Contour3D imesh = Slic3r::sla::convert_mesh(mesh); + return false; +} + +TEST_CASE("Negative 3D offset should produce smaller object.", "[Hollowing]") +{ + Slic3r::sla::Contour3D imesh = Slic3r::sla::Contour3D{load_model("20mm_cube.obj")}; auto ptr = Slic3r::meshToVolume(imesh, {}); REQUIRE(ptr); @@ -31,6 +40,8 @@ TEST_CASE("Load object", "[Hollowing]") { REQUIRE(!omesh.empty()); + + std::fstream outfile{"out.obj", std::ios::out}; omesh.to_obj(outfile); diff --git a/tests/sla_print/CMakeLists.txt b/tests/sla_print/CMakeLists.txt index e8921ba486..ecc68db0a4 100644 --- a/tests/sla_print/CMakeLists.txt +++ b/tests/sla_print/CMakeLists.txt @@ -1,5 +1,5 @@ get_filename_component(_TEST_NAME ${CMAKE_CURRENT_LIST_DIR} NAME) -add_executable(${_TEST_NAME}_tests ${_TEST_NAME}_tests.cpp) +add_executable(${_TEST_NAME}_tests ${_TEST_NAME}_tests_main.cpp sla_print_tests.cpp) target_link_libraries(${_TEST_NAME}_tests test_common libslic3r) set_property(TARGET ${_TEST_NAME}_tests PROPERTY FOLDER "tests") diff --git a/tests/sla_print/sla_print_tests.cpp b/tests/sla_print/sla_print_tests.cpp index 229eb42676..e4d5e05d2f 100644 --- a/tests/sla_print/sla_print_tests.cpp +++ b/tests/sla_print/sla_print_tests.cpp @@ -1,9 +1,9 @@ -#include - #include #include #include +#include + // Debug #include @@ -50,21 +50,21 @@ void check_validity(const TriangleMesh &input_mesh, ASSUME_NO_REPAIR) { TriangleMesh mesh{input_mesh}; - + if (flags & ASSUME_NO_EMPTY) { REQUIRE_FALSE(mesh.empty()); } else if (mesh.empty()) return; // If it can be empty and it is, there is nothing left to do. - + REQUIRE(stl_validate(&mesh.stl)); - + bool do_update_shared_vertices = false; mesh.repair(do_update_shared_vertices); - + if (flags & ASSUME_NO_REPAIR) { REQUIRE_FALSE(mesh.needed_repair()); } - + if (flags & ASSUME_MANIFOLD) { mesh.require_shared_vertices(); if (!mesh.is_manifold()) mesh.WriteOBJFile("non_manifold.obj"); @@ -82,36 +82,36 @@ struct PadByproducts void _test_concave_hull(const Polygons &hull, const ExPolygons &polys) { REQUIRE(polys.size() >=hull.size()); - + double polys_area = 0; for (const ExPolygon &p : polys) polys_area += p.area(); - + double cchull_area = 0; for (const Slic3r::Polygon &p : hull) cchull_area += p.area(); - + REQUIRE(cchull_area >= Approx(polys_area)); - + size_t cchull_holes = 0; for (const Slic3r::Polygon &p : hull) cchull_holes += p.is_clockwise() ? 1 : 0; - + REQUIRE(cchull_holes == 0); - + Polygons intr = diff(to_polygons(polys), hull); REQUIRE(intr.empty()); } void test_concave_hull(const ExPolygons &polys) { sla::PadConfig pcfg; - + Slic3r::sla::ConcaveHull cchull{polys, pcfg.max_merge_dist_mm, []{}}; - + _test_concave_hull(cchull.polygons(), polys); - + coord_t delta = scaled(pcfg.brim_size_mm + pcfg.wing_distance()); ExPolygons wafflex = sla::offset_waffle_style_ex(cchull, delta); Polygons waffl = sla::offset_waffle_style(cchull, delta); - + _test_concave_hull(to_polygons(wafflex), polys); _test_concave_hull(waffl, polys); } @@ -121,23 +121,23 @@ void test_pad(const std::string & obj_filename, PadByproducts & out) { REQUIRE(padcfg.validate().empty()); - + TriangleMesh mesh = load_model(obj_filename); - + REQUIRE_FALSE(mesh.empty()); - + // Create pad skeleton only from the model Slic3r::sla::pad_blueprint(mesh, out.model_contours); - + test_concave_hull(out.model_contours); - + REQUIRE_FALSE(out.model_contours.empty()); - + // Create the pad geometry for the model contours only Slic3r::sla::create_pad({}, out.model_contours, out.mesh, padcfg); - + check_validity(out.mesh); - + auto bb = out.mesh.bounding_box(); REQUIRE(bb.max.z() - bb.min.z() == Approx(padcfg.full_height())); } @@ -166,42 +166,42 @@ void check_support_tree_integrity(const sla::SupportTreeBuilder &stree, double gnd = stree.ground_level; double H1 = cfg.max_solo_pillar_height_mm; double H2 = cfg.max_dual_pillar_height_mm; - + for (const sla::Head &head : stree.heads()) { REQUIRE((!head.is_valid() || head.pillar_id != sla::ID_UNSET || head.bridge_id != sla::ID_UNSET)); } - + for (const sla::Pillar &pillar : stree.pillars()) { if (std::abs(pillar.endpoint().z() - gnd) < EPSILON) { double h = pillar.height; - + if (h > H1) REQUIRE(pillar.links >= 1); else if(h > H2) { REQUIRE(pillar.links >= 2); } } - + REQUIRE(pillar.links <= cfg.pillar_cascade_neighbors); REQUIRE(pillar.bridges <= cfg.max_bridges_on_pillar); } - + double max_bridgelen = 0.; auto chck_bridge = [&cfg](const sla::Bridge &bridge, double &max_brlen) { Vec3d n = bridge.endp - bridge.startp; double d = sla::distance(n); max_brlen = std::max(d, max_brlen); - + double z = n.z(); double polar = std::acos(z / d); double slope = -polar + PI / 2.; REQUIRE(std::abs(slope) >= cfg.bridge_slope - EPSILON); }; - + for (auto &bridge : stree.bridges()) chck_bridge(bridge, max_bridgelen); REQUIRE(max_bridgelen <= cfg.max_bridge_length_mm); - + max_bridgelen = 0; for (auto &bridge : stree.crossbridges()) chck_bridge(bridge, max_bridgelen); - + double md = cfg.max_pillar_link_distance_mm / std::cos(-cfg.bridge_slope); REQUIRE(max_bridgelen <= md); } @@ -212,35 +212,35 @@ void test_supports(const std::string & obj_filename, { using namespace Slic3r; TriangleMesh mesh = load_model(obj_filename); - + REQUIRE_FALSE(mesh.empty()); - + TriangleMeshSlicer slicer{&mesh}; - + auto bb = mesh.bounding_box(); double zmin = bb.min.z(); double zmax = bb.max.z(); double gnd = zmin - supportcfg.object_elevation_mm; auto layer_h = 0.05f; - + out.slicegrid = grid(float(gnd), float(zmax), layer_h); slicer.slice(out.slicegrid , CLOSING_RADIUS, &out.model_slices, []{}); - + // Create the special index-triangle mesh with spatial indexing which // is the input of the support point and support mesh generators sla::EigenMesh3D emesh{mesh}; - + // Create the support point generator sla::SLAAutoSupports::Config autogencfg; autogencfg.head_diameter = float(2 * supportcfg.head_front_radius_mm); sla::SLAAutoSupports point_gen{emesh, out.model_slices, out.slicegrid, autogencfg, [] {}, [](int) {}}; - + // Get the calculated support points. std::vector support_points = point_gen.output(); - + int validityflags = ASSUME_NO_REPAIR; - + // If there is no elevation, support points shall be removed from the // bottom of the object. if (std::abs(supportcfg.object_elevation_mm) < EPSILON) { @@ -249,32 +249,32 @@ void test_supports(const std::string & obj_filename, } else { // Should be support points at least on the bottom of the model REQUIRE_FALSE(support_points.empty()); - + // Also the support mesh should not be empty. validityflags |= ASSUME_NO_EMPTY; } - + // Generate the actual support tree sla::SupportTreeBuilder treebuilder; treebuilder.build(sla::SupportableMesh{emesh, support_points, supportcfg}); - + check_support_tree_integrity(treebuilder, supportcfg); - + const TriangleMesh &output_mesh = treebuilder.retrieve_mesh(); - + check_validity(output_mesh, validityflags); - + // Quick check if the dimensions and placement of supports are correct auto obb = output_mesh.bounding_box(); - + double allowed_zmin = zmin - supportcfg.object_elevation_mm; - + if (std::abs(supportcfg.object_elevation_mm) < EPSILON) allowed_zmin = zmin - 2 * supportcfg.head_back_radius_mm; - + REQUIRE(obb.min.z() >= allowed_zmin); REQUIRE(obb.max.z() <= zmax); - + // Move out the support tree into the byproducts, we can examine it further // in various tests. out.obj_fname = std::move(obj_filename); @@ -296,7 +296,7 @@ void export_failed_case(const std::vector &support_slices, const ExPolygons &sup_slice = support_slices[n]; const ExPolygons &mod_slice = byproducts.model_slices[n]; Polygons intersections = intersection(sup_slice, mod_slice); - + std::stringstream ss; if (!intersections.empty()) { ss << byproducts.obj_fname << std::setprecision(4) << n << ".svg"; @@ -307,7 +307,7 @@ void export_failed_case(const std::vector &support_slices, svg.Close(); } } - + TriangleMesh m; byproducts.supporttree.retrieve_full_mesh(m); m.merge(byproducts.input_mesh); @@ -321,56 +321,56 @@ void test_support_model_collision( const sla::SupportConfig &input_supportcfg = {}) { SupportByproducts byproducts; - + sla::SupportConfig supportcfg = input_supportcfg; - + // Set head penetration to a small negative value which should ensure that // the supports will not touch the model body. supportcfg.head_penetration_mm = -0.15; - + // TODO: currently, the tailheads penetrating into the model body do not // respect the penetration parameter properly. No issues were reported so // far but we should definitely fix this. supportcfg.ground_facing_only = true; - + test_supports(obj_filename, supportcfg, byproducts); - + // Slice the support mesh given the slice grid of the model. std::vector support_slices = byproducts.supporttree.slice(byproducts.slicegrid, CLOSING_RADIUS); - + // The slices originate from the same slice grid so the numbers must match - + bool support_mesh_is_empty = byproducts.supporttree.retrieve_mesh(sla::MeshType::Pad).empty() && byproducts.supporttree.retrieve_mesh(sla::MeshType::Support).empty(); - + if (support_mesh_is_empty) REQUIRE(support_slices.empty()); else REQUIRE(support_slices.size() == byproducts.model_slices.size()); - + bool notouch = true; for (size_t n = 0; notouch && n < support_slices.size(); ++n) { const ExPolygons &sup_slice = support_slices[n]; const ExPolygons &mod_slice = byproducts.model_slices[n]; - + Polygons intersections = intersection(sup_slice, mod_slice); - + notouch = notouch && intersections.empty(); } - + if (!notouch) export_failed_case(support_slices, byproducts); - + REQUIRE(notouch); } -const char * const BELOW_PAD_TEST_OBJECTS[] = { +const char *const BELOW_PAD_TEST_OBJECTS[] = { "20mm_cube.obj", "V.obj", }; -const char * const AROUND_PAD_TEST_OBJECTS[] = { +const char *const AROUND_PAD_TEST_OBJECTS[] = { "20mm_cube.obj", "V.obj", "frog_legs.obj", @@ -392,46 +392,46 @@ template void test_pairhash() I A[nums] = {0}, B[nums] = {0}; std::unordered_set CH; std::unordered_map> ints; - + std::random_device rd; std::mt19937 gen(rd()); - + const I Ibits = int(sizeof(I) * CHAR_BIT); const II IIbits = int(sizeof(II) * CHAR_BIT); - + int bits = IIbits / 2 < Ibits ? Ibits / 2 : Ibits; if (std::is_signed::value) bits -= 1; const I Imin = 0; const I Imax = I(std::pow(2., bits) - 1); - + std::uniform_int_distribution dis(Imin, Imax); - + for (size_t i = 0; i < nums;) { I a = dis(gen); if (CH.find(a) == CH.end()) { CH.insert(a); A[i] = a; ++i; } } - + for (size_t i = 0; i < nums;) { I b = dis(gen); if (CH.find(b) == CH.end()) { CH.insert(b); B[i] = b; ++i; } } - + for (size_t i = 0; i < nums; ++i) { I a = A[i], b = B[i]; - + REQUIRE(a != b); - + II hash_ab = sla::pairhash(a, b); II hash_ba = sla::pairhash(b, a); REQUIRE(hash_ab == hash_ba); - + auto it = ints.find(hash_ab); - + if (it != ints.end()) { REQUIRE(( (it->second.first == a && it->second.second == b) || (it->second.first == b && it->second.second == a) - )); + )); } else ints[hash_ab] = std::make_pair(a, b); } @@ -446,72 +446,72 @@ TEST_CASE("Pillar pairhash should be unique", "[SLASupportGeneration]") { TEST_CASE("Flat pad geometry is valid", "[SLASupportGeneration]") { sla::PadConfig padcfg; - + // Disable wings padcfg.wall_height_mm = .0; - + for (auto &fname : BELOW_PAD_TEST_OBJECTS) test_pad(fname, padcfg); } TEST_CASE("WingedPadGeometryIsValid", "[SLASupportGeneration]") { sla::PadConfig padcfg; - + // Add some wings to the pad to test the cavity padcfg.wall_height_mm = 1.; - + for (auto &fname : BELOW_PAD_TEST_OBJECTS) test_pad(fname, padcfg); } TEST_CASE("FlatPadAroundObjectIsValid", "[SLASupportGeneration]") { sla::PadConfig padcfg; - + // Add some wings to the pad to test the cavity padcfg.wall_height_mm = 0.; // padcfg.embed_object.stick_stride_mm = 0.; padcfg.embed_object.enabled = true; padcfg.embed_object.everywhere = true; - + for (auto &fname : AROUND_PAD_TEST_OBJECTS) test_pad(fname, padcfg); } TEST_CASE("WingedPadAroundObjectIsValid", "[SLASupportGeneration]") { sla::PadConfig padcfg; - + // Add some wings to the pad to test the cavity padcfg.wall_height_mm = 1.; padcfg.embed_object.enabled = true; padcfg.embed_object.everywhere = true; - + for (auto &fname : AROUND_PAD_TEST_OBJECTS) test_pad(fname, padcfg); } TEST_CASE("ElevatedSupportGeometryIsValid", "[SLASupportGeneration]") { sla::SupportConfig supportcfg; supportcfg.object_elevation_mm = 5.; - + for (auto fname : SUPPORT_TEST_MODELS) test_supports(fname); } TEST_CASE("FloorSupportGeometryIsValid", "[SLASupportGeneration]") { sla::SupportConfig supportcfg; supportcfg.object_elevation_mm = 0; - + for (auto &fname: SUPPORT_TEST_MODELS) test_supports(fname, supportcfg); } TEST_CASE("ElevatedSupportsDoNotPierceModel", "[SLASupportGeneration]") { - + sla::SupportConfig supportcfg; - + for (auto fname : SUPPORT_TEST_MODELS) test_support_model_collision(fname, supportcfg); } TEST_CASE("FloorSupportsDoNotPierceModel", "[SLASupportGeneration]") { - + sla::SupportConfig supportcfg; supportcfg.object_elevation_mm = 0; - + for (auto fname : SUPPORT_TEST_MODELS) test_support_model_collision(fname, supportcfg); } @@ -525,7 +525,7 @@ TEST_CASE("InitializedRasterShouldBeNONEmpty", "[SLARasterOutput]") { // Default Prusa SL1 display parameters sla::Raster::Resolution res{2560, 1440}; sla::Raster::PixelDim pixdim{120. / res.width_px, 68. / res.height_px}; - + sla::Raster raster; raster.reset(res, pixdim); REQUIRE_FALSE(raster.empty()); @@ -547,54 +547,54 @@ static void check_raster_transformations(sla::Raster::Orientation o, double disp_w = 120., disp_h = 68.; sla::Raster::Resolution res{2560, 1440}; sla::Raster::PixelDim pixdim{disp_w / res.width_px, disp_h / res.height_px}; - + auto bb = BoundingBox({0, 0}, {scaled(disp_w), scaled(disp_h)}); sla::Raster::Trafo trafo{o, mirroring}; trafo.origin_x = bb.center().x(); trafo.origin_y = bb.center().y(); - + sla::Raster raster{res, pixdim, trafo}; - + // create box of size 32x32 pixels (not 1x1 to avoid antialiasing errors) coord_t pw = 32 * coord_t(std::ceil(scaled(pixdim.w_mm))); coord_t ph = 32 * coord_t(std::ceil(scaled(pixdim.h_mm))); ExPolygon box; box.contour.points = {{-pw, -ph}, {pw, -ph}, {pw, ph}, {-pw, ph}}; - + double tr_x = scaled(20.), tr_y = tr_x; - + box.translate(tr_x, tr_y); ExPolygon expected_box = box; - + // Now calculate the position of the translated box according to output // trafo. if (o == sla::Raster::Orientation::roPortrait) expected_box.rotate(PI / 2.); - + if (mirroring[X]) for (auto &p : expected_box.contour.points) p.x() = -p.x(); - + if (mirroring[Y]) for (auto &p : expected_box.contour.points) p.y() = -p.y(); - + raster.draw(box); - + Point expected_coords = expected_box.contour.bounding_box().center(); double rx = unscaled(expected_coords.x() + bb.center().x()) / pixdim.w_mm; double ry = unscaled(expected_coords.y() + bb.center().y()) / pixdim.h_mm; auto w = size_t(std::floor(rx)); auto h = res.height_px - size_t(std::floor(ry)); - + REQUIRE((w < res.width_px && h < res.height_px)); - + auto px = raster.read_pixel(w, h); - + if (px != FullWhite) { sla::PNGImage img; std::fstream outf("out.png", std::ios::out); - + outf << img.serialize(raster); } - + REQUIRE(px == FullWhite); } @@ -603,7 +603,7 @@ TEST_CASE("MirroringShouldBeCorrect", "[SLARasterOutput]") { sla::Raster::MirrorX, sla::Raster::MirrorY, sla::Raster::MirrorXY}; - + sla::Raster::Orientation orientations[] = {sla::Raster::roLandscape, sla::Raster::roPortrait}; for (auto orientation : orientations) @@ -615,7 +615,7 @@ static ExPolygon square_with_hole(double v) { ExPolygon poly; coord_t V = scaled(v / 2.); - + poly.contour.points = {{-V, -V}, {V, -V}, {V, V}, {-V, V}}; poly.holes.emplace_back(); V = V / 2; @@ -631,16 +631,16 @@ static double pixel_area(TPixel px, const sla::Raster::PixelDim &pxdim) static double raster_white_area(const sla::Raster &raster) { if (raster.empty()) return std::nan(""); - + auto res = raster.resolution(); double a = 0; - + for (size_t x = 0; x < res.width_px; ++x) for (size_t y = 0; y < res.height_px; ++y) { auto px = raster.read_pixel(x, y); a += pixel_area(px, raster.pixel_dimensions()); } - + return a; } @@ -648,15 +648,15 @@ static double predict_error(const ExPolygon &p, const sla::Raster::PixelDim &pd) { auto lines = p.lines(); double pix_err = pixel_area(FullWhite, pd) / 2.; - + // Worst case is when a line is parallel to the shorter axis of one pixel, // when the line will be composed of the max number of pixels double pix_l = std::min(pd.h_mm, pd.w_mm); - + double error = 0.; for (auto &l : lines) error += (unscaled(l.length()) / pix_l) * pix_err; - + return error; } @@ -664,28 +664,42 @@ TEST_CASE("RasterizedPolygonAreaShouldMatch", "[SLARasterOutput]") { double disp_w = 120., disp_h = 68.; sla::Raster::Resolution res{2560, 1440}; sla::Raster::PixelDim pixdim{disp_w / res.width_px, disp_h / res.height_px}; - + sla::Raster raster{res, pixdim}; auto bb = BoundingBox({0, 0}, {scaled(disp_w), scaled(disp_h)}); - + ExPolygon poly = square_with_hole(10.); poly.translate(bb.center().x(), bb.center().y()); raster.draw(poly); - + double a = poly.area() / (scaled(1.) * scaled(1.)); double ra = raster_white_area(raster); double diff = std::abs(a - ra); - + REQUIRE(diff <= predict_error(poly, pixdim)); - + raster.clear(); poly = square_with_hole(60.); poly.translate(bb.center().x(), bb.center().y()); raster.draw(poly); - + a = poly.area() / (scaled(1.) * scaled(1.)); ra = raster_white_area(raster); diff = std::abs(a - ra); - + REQUIRE(diff <= predict_error(poly, pixdim)); } + +TEST_CASE("Triangle mesh conversions should be correct", "[SLAConversions]") +{ + sla::Contour3D cntr; + + { + std::fstream infile{"extruder_idler_quads.obj", std::ios::in}; + cntr.from_obj(infile); + } + + + + +} diff --git a/tests/sla_print/sla_print_tests_main.cpp b/tests/sla_print/sla_print_tests_main.cpp new file mode 100644 index 0000000000..b2aa80259d --- /dev/null +++ b/tests/sla_print/sla_print_tests_main.cpp @@ -0,0 +1 @@ +#include From d9d11e5686607fa4659dbd9f9bfef3760f73bc60 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Tue, 5 Nov 2019 09:43:42 +0100 Subject: [PATCH 030/336] Add additional parameters to openvdbutils --- src/libslic3r/OpenVDBUtils.cpp | 39 +++++++++++++++++++++++----- src/libslic3r/OpenVDBUtils.hpp | 14 +++++++--- tests/libslic3r/test_hollowing.cpp | 41 +++++++++++++++++++++++++----- 3 files changed, 76 insertions(+), 18 deletions(-) diff --git a/src/libslic3r/OpenVDBUtils.cpp b/src/libslic3r/OpenVDBUtils.cpp index a5d4f0db69..9842db2da9 100644 --- a/src/libslic3r/OpenVDBUtils.cpp +++ b/src/libslic3r/OpenVDBUtils.cpp @@ -50,18 +50,32 @@ void Contour3DDataAdapter::getIndexSpacePoint(size_t n, pos = {p.x(), p.y(), p.z()}; } -openvdb::FloatGrid::Ptr meshToVolume(const TriangleMesh & mesh, +openvdb::FloatGrid::Ptr meshToVolume(const TriangleMesh &mesh, + float exteriorBandWidth, + float interiorBandWidth, + int flags, const openvdb::math::Transform &tr) { + openvdb::initialize(); return openvdb::tools::meshToVolume( - TriangleMeshDataAdapter{mesh}, tr); + TriangleMeshDataAdapter{mesh}, tr, exteriorBandWidth, + interiorBandWidth, flags); } +// TODO: Do I need to call initialize? Seems to work without it as well but the +// docs say it should be called ones. It does a mutex lock-unlock sequence all +// even if was called previously. + openvdb::FloatGrid::Ptr meshToVolume(const sla::Contour3D & mesh, + float exteriorBandWidth, + float interiorBandWidth, + int flags, const openvdb::math::Transform &tr) { + openvdb::initialize(); return openvdb::tools::meshToVolume( - Contour3DDataAdapter{mesh}, tr); + Contour3DDataAdapter{mesh}, tr, exteriorBandWidth, interiorBandWidth, + flags); } inline Vec3f to_vec3f(const openvdb::Vec3s &v) { return Vec3f{v.x(), v.y(), v.z()}; } @@ -69,11 +83,14 @@ inline Vec3d to_vec3d(const openvdb::Vec3s &v) { return to_vec3f(v).cast inline Vec3i to_vec3i(const openvdb::Vec3I &v) { return Vec3i{int(v[0]), int(v[1]), int(v[2])}; } inline Vec4i to_vec4i(const openvdb::Vec4I &v) { return Vec4i{int(v[0]), int(v[1]), int(v[2]), int(v[3])}; } -sla::Contour3D volumeToMesh(const openvdb::FloatGrid &grid, - double isovalue, - double adaptivity, - bool relaxDisorientedTriangles) +template +sla::Contour3D _volumeToMesh(const Grid &grid, + double isovalue, + double adaptivity, + bool relaxDisorientedTriangles) { + openvdb::initialize(); + std::vector points; std::vector triangles; std::vector quads; @@ -93,4 +110,12 @@ sla::Contour3D volumeToMesh(const openvdb::FloatGrid &grid, return ret; } +sla::Contour3D volumeToMesh(const openvdb::FloatGrid &grid, + double isovalue, + double adaptivity, + bool relaxDisorientedTriangles) +{ + return _volumeToMesh(grid, isovalue, adaptivity, relaxDisorientedTriangles); +} + } // namespace Slic3r diff --git a/src/libslic3r/OpenVDBUtils.hpp b/src/libslic3r/OpenVDBUtils.hpp index e424038876..ee740dd06b 100644 --- a/src/libslic3r/OpenVDBUtils.hpp +++ b/src/libslic3r/OpenVDBUtils.hpp @@ -7,11 +7,17 @@ namespace Slic3r { -openvdb::FloatGrid::Ptr meshToVolume(const TriangleMesh & mesh, - const openvdb::math::Transform &tr); +openvdb::FloatGrid::Ptr meshToVolume(const TriangleMesh &mesh, + float exteriorBandWidth = 3.0f, + float interiorBandWidth = 3.0f, + int flags = 0, + const openvdb::math::Transform &tr = {}); -openvdb::FloatGrid::Ptr meshToVolume(const sla::Contour3D & mesh, - const openvdb::math::Transform &tr); +openvdb::FloatGrid::Ptr meshToVolume(const sla::Contour3D &mesh, + float exteriorBandWidth = 3.0f, + float interiorBandWidth = 3.0f, + int flags = 0, + const openvdb::math::Transform &tr = {}); sla::Contour3D volumeToMesh(const openvdb::FloatGrid &grid, double isovalue = 0.0, diff --git a/tests/libslic3r/test_hollowing.cpp b/tests/libslic3r/test_hollowing.cpp index c0acb4f25d..b74eb76aba 100644 --- a/tests/libslic3r/test_hollowing.cpp +++ b/tests/libslic3r/test_hollowing.cpp @@ -29,23 +29,50 @@ static bool _check_normals(const Slic3r::sla::Contour3D &mesh) return false; } -TEST_CASE("Negative 3D offset should produce smaller object.", "[Hollowing]") +TEST_CASE("Passing OpenVDB grid conversion produce similar geometry.", "[Hollowing]") { - Slic3r::sla::Contour3D imesh = Slic3r::sla::Contour3D{load_model("20mm_cube.obj")}; + Slic3r::TriangleMesh in_mesh = load_model("20mm_cube.obj"); + Slic3r::sla::Contour3D imesh = Slic3r::sla::Contour3D{in_mesh}; auto ptr = Slic3r::meshToVolume(imesh, {}); REQUIRE(ptr); - Slic3r::sla::Contour3D omesh = Slic3r::volumeToMesh(*ptr, -1., 0.0, true); + std::cout << "Grid class = " << ptr->getGridClass() << std::endl; + + Slic3r::sla::Contour3D omesh = Slic3r::volumeToMesh(*ptr, -2.9, 1.0, true); + + std::cout << "Triangle count: " << omesh.faces3.size() << std::endl; + std::cout << "Quad count: " << omesh.faces4.size() << std::endl; REQUIRE(!omesh.empty()); + SECTION("Converting to Contour3D to TriangleMesh") { + Slic3r::TriangleMesh msh = Slic3r::sla::to_triangle_mesh(omesh); + + msh.require_shared_vertices(); + msh.WriteOBJFile("out_tr.obj"); + + REQUIRE(msh.volume() == Approx(in_mesh.volume())); + } - +// omesh.faces4.clear(); std::fstream outfile{"out.obj", std::ios::out}; omesh.to_obj(outfile); - imesh.merge(omesh); - std::fstream merged_outfile("merged_out.obj", std::ios::out); - imesh.to_obj(merged_outfile); } + +//TEST_CASE("Negative 3D offset should produce smaller object.", "[Hollowing]") +//{ +// Slic3r::sla::Contour3D imesh = Slic3r::sla::Contour3D{load_model("20mm_cube.obj")}; +// auto ptr = Slic3r::meshToVolume(imesh, {}); + +// REQUIRE(ptr); + +// Slic3r::sla::Contour3D omesh = Slic3r::volumeToMesh(*ptr, -1., 0.0, true); + +// REQUIRE(!omesh.empty()); + +// imesh.merge(omesh); +// std::fstream merged_outfile("merged_out.obj", std::ios::out); +// imesh.to_obj(merged_outfile); +//} From 04bcdff1105694469a127983135295670624fb6a Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Mon, 4 Nov 2019 17:01:26 +0100 Subject: [PATCH 031/336] Added new hollowing gizmo Basically just copied SLA support gizmo and removed all functionality that will not be needed --- resources/icons/hollow.svg | 42 + src/slic3r/CMakeLists.txt | 2 + src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp | 1019 +++++++++++++++++++++ src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp | 160 ++++ src/slic3r/GUI/Gizmos/GLGizmos.hpp | 1 + src/slic3r/GUI/Gizmos/GLGizmosManager.cpp | 23 +- src/slic3r/GUI/Gizmos/GLGizmosManager.hpp | 1 + 7 files changed, 1241 insertions(+), 7 deletions(-) create mode 100644 resources/icons/hollow.svg create mode 100644 src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp create mode 100644 src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp diff --git a/resources/icons/hollow.svg b/resources/icons/hollow.svg new file mode 100644 index 0000000000..119fb6afcc --- /dev/null +++ b/resources/icons/hollow.svg @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/slic3r/CMakeLists.txt b/src/slic3r/CMakeLists.txt index 17b76e6296..5a527990cb 100644 --- a/src/slic3r/CMakeLists.txt +++ b/src/slic3r/CMakeLists.txt @@ -47,6 +47,8 @@ set(SLIC3R_GUI_SOURCES GUI/Gizmos/GLGizmoFlatten.hpp GUI/Gizmos/GLGizmoCut.cpp GUI/Gizmos/GLGizmoCut.hpp + GUI/Gizmos/GLGizmoHollow.cpp + GUI/Gizmos/GLGizmoHollow.hpp GUI/GLSelectionRectangle.cpp GUI/GLSelectionRectangle.hpp GUI/GLTexture.hpp diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp new file mode 100644 index 0000000000..8063d58904 --- /dev/null +++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp @@ -0,0 +1,1019 @@ +// Include GLGizmoBase.hpp before I18N.hpp as it includes some libigl code, which overrides our localization "L" macro. +#include "GLGizmoHollow.hpp" +#include "slic3r/GUI/GLCanvas3D.hpp" +#include "slic3r/GUI/Gizmos/GLGizmos.hpp" + +#include + +//#include +//#include +//#include + +#include "slic3r/GUI/GUI_App.hpp" +#include "slic3r/GUI/GUI.hpp" +#include "slic3r/GUI/GUI_ObjectSettings.hpp" +#include "slic3r/GUI/GUI_ObjectList.hpp" +#include "slic3r/GUI/MeshUtils.hpp" +#include "slic3r/GUI/Plater.hpp" +#include "slic3r/GUI/PresetBundle.hpp" +#include "libslic3r/SLAPrint.hpp" + + +namespace Slic3r { +namespace GUI { + +GLGizmoHollow::GLGizmoHollow(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id) + : GLGizmoBase(parent, icon_filename, sprite_id) + , m_quadric(nullptr) + , m_its(nullptr) +{ + m_clipping_plane.reset(new ClippingPlane(Vec3d::Zero(), 0.)); + m_quadric = ::gluNewQuadric(); + if (m_quadric != nullptr) + // using GLU_FILL does not work when the instance's transformation + // contains mirroring (normals are reverted) + ::gluQuadricDrawStyle(m_quadric, GLU_FILL); +} + +GLGizmoHollow::~GLGizmoHollow() +{ + if (m_quadric != nullptr) + ::gluDeleteQuadric(m_quadric); +} + +bool GLGizmoHollow::on_init() +{ + m_shortcut_key = WXK_CONTROL_L; + + m_desc["head_diameter"] = _(L("Head diameter")) + ": "; + m_desc["lock_supports"] = _(L("Lock supports under new islands")); + m_desc["remove_selected"] = _(L("Remove selected points")); + m_desc["remove_all"] = _(L("Remove all points")); + m_desc["apply_changes"] = _(L("Apply changes")); + m_desc["discard_changes"] = _(L("Discard changes")); + m_desc["minimal_distance"] = _(L("Minimal points distance")) + ": "; + m_desc["points_density"] = _(L("Support points density")) + ": "; + m_desc["auto_generate"] = _(L("Auto-generate points")); + m_desc["manual_editing"] = _(L("Manual editing")); + m_desc["clipping_of_view"] = _(L("Clipping of view"))+ ": "; + m_desc["reset_direction"] = _(L("Reset direction")); + + return true; +} + +void GLGizmoHollow::set_sla_support_data(ModelObject* model_object, const Selection& selection) +{ + if (! model_object || selection.is_empty()) { + m_model_object = nullptr; + return; + } + + if (m_model_object != model_object || m_model_object_id != model_object->id()) { + m_model_object = model_object; + m_print_object_idx = -1; + } + + m_active_instance = selection.get_instance_idx(); + + if (model_object && selection.is_from_single_instance()) + { + // Cache the bb - it's needed for dealing with the clipping plane quite often + // It could be done inside update_mesh but one has to account for scaling of the instance. + //FIXME calling ModelObject::instance_bounding_box() is expensive! + m_active_instance_bb_radius = m_model_object->instance_bounding_box(m_active_instance).radius(); + + if (is_mesh_update_necessary()) { + update_mesh(); + reload_cache(); + } + + if (m_state == On) { + m_parent.toggle_model_objects_visibility(false); + m_parent.toggle_model_objects_visibility(true, m_model_object, m_active_instance); + } + else + m_parent.toggle_model_objects_visibility(true, nullptr, -1); + } +} + + + +void GLGizmoHollow::on_render() const +{ + const Selection& selection = m_parent.get_selection(); + + // If current m_model_object does not match selection, ask GLCanvas3D to turn us off + if (m_state == On + && (m_model_object != selection.get_model()->objects[selection.get_object_idx()] + || m_active_instance != selection.get_instance_idx() + || m_model_object_id != m_model_object->id())) { + m_parent.post_event(SimpleEvent(EVT_GLCANVAS_RESETGIZMOS)); + return; + } + + if (! m_its || ! m_mesh) + const_cast(this)->update_mesh(); + + glsafe(::glEnable(GL_BLEND)); + glsafe(::glEnable(GL_DEPTH_TEST)); + + m_z_shift = selection.get_volume(*selection.get_volume_idxs().begin())->get_sla_shift_z(); + + if (m_quadric != nullptr && selection.is_from_single_instance()) + render_points(selection, false); + + m_selection_rectangle.render(m_parent); + render_clipping_plane(selection); + + glsafe(::glDisable(GL_BLEND)); +} + + + +void GLGizmoHollow::render_clipping_plane(const Selection& selection) const +{ + if (m_clipping_plane_distance == 0.f) + return; + + // Get transformation of the instance + const GLVolume* vol = selection.get_volume(*selection.get_volume_idxs().begin()); + Geometry::Transformation trafo = vol->get_instance_transformation(); + trafo.set_offset(trafo.get_offset() + Vec3d(0., 0., m_z_shift)); + + // Get transformation of supports + Geometry::Transformation supports_trafo; + supports_trafo.set_offset(Vec3d(trafo.get_offset()(0), trafo.get_offset()(1), vol->get_sla_shift_z())); + supports_trafo.set_rotation(Vec3d(0., 0., trafo.get_rotation()(2))); + // I don't know why, but following seems to be correct. + supports_trafo.set_mirror(Vec3d(trafo.get_mirror()(0) * trafo.get_mirror()(1) * trafo.get_mirror()(2), + 1, + 1.)); + + // Now initialize the TMS for the object, perform the cut and save the result. + if (! m_object_clipper) { + m_object_clipper.reset(new MeshClipper); + m_object_clipper->set_mesh(*m_mesh); + } + m_object_clipper->set_plane(*m_clipping_plane); + m_object_clipper->set_transformation(trafo); + + + // Next, ask the backend if supports are already calculated. If so, we are gonna cut them too. + // First we need a pointer to the respective SLAPrintObject. The index into objects vector is + // cached so we don't have todo it on each render. We only search for the po if needed: + if (m_print_object_idx < 0 || (int)m_parent.sla_print()->objects().size() != m_print_objects_count) { + m_print_objects_count = m_parent.sla_print()->objects().size(); + m_print_object_idx = -1; + for (const SLAPrintObject* po : m_parent.sla_print()->objects()) { + ++m_print_object_idx; + if (po->model_object()->id() == m_model_object->id()) + break; + } + } + if (m_print_object_idx >= 0) { + const SLAPrintObject* print_object = m_parent.sla_print()->objects()[m_print_object_idx]; + + if (print_object->is_step_done(slaposSupportTree)) { + // If the supports are already calculated, save the timestamp of the respective step + // so we can later tell they were recalculated. + size_t timestamp = print_object->step_state_with_timestamp(slaposSupportTree).timestamp; + + if (! m_supports_clipper || (int)timestamp != m_old_timestamp) { + // The timestamp has changed. + m_supports_clipper.reset(new MeshClipper); + // The mesh should already have the shared vertices calculated. + m_supports_clipper->set_mesh(print_object->support_mesh()); + m_old_timestamp = timestamp; + } + m_supports_clipper->set_plane(*m_clipping_plane); + m_supports_clipper->set_transformation(supports_trafo); + } + else + // The supports are not valid. We better dump the cached data. + m_supports_clipper.reset(); + } + + // At this point we have the triangulated cuts for both the object and supports - let's render. + if (! m_object_clipper->get_triangles().empty()) { + ::glPushMatrix(); + ::glColor3f(1.0f, 0.37f, 0.0f); + ::glBegin(GL_TRIANGLES); + for (const Vec3f& point : m_object_clipper->get_triangles()) + ::glVertex3f(point(0), point(1), point(2)); + ::glEnd(); + ::glPopMatrix(); + } + + if (m_supports_clipper && ! m_supports_clipper->get_triangles().empty() && !m_editing_mode) { + // The supports are hidden in the editing mode, so it makes no sense to render the cuts. + ::glPushMatrix(); + ::glColor3f(1.0f, 0.f, 0.37f); + ::glBegin(GL_TRIANGLES); + for (const Vec3f& point : m_supports_clipper->get_triangles()) + ::glVertex3f(point(0), point(1), point(2)); + ::glEnd(); + ::glPopMatrix(); + } +} + + +void GLGizmoHollow::on_render_for_picking() const +{ + const Selection& selection = m_parent.get_selection(); +#if ENABLE_RENDER_PICKING_PASS + m_z_shift = selection.get_volume(*selection.get_volume_idxs().begin())->get_sla_shift_z(); +#endif + + glsafe(::glEnable(GL_DEPTH_TEST)); + render_points(selection, true); +} + +void GLGizmoHollow::render_points(const Selection& selection, bool picking) const +{ + if (!picking) + glsafe(::glEnable(GL_LIGHTING)); + + const GLVolume* vol = selection.get_volume(*selection.get_volume_idxs().begin()); + const Transform3d& instance_scaling_matrix_inverse = vol->get_instance_transformation().get_matrix(true, true, false, true).inverse(); + const Transform3d& instance_matrix = vol->get_instance_transformation().get_matrix(); + + glsafe(::glPushMatrix()); + glsafe(::glTranslated(0.0, 0.0, m_z_shift)); + glsafe(::glMultMatrixd(instance_matrix.data())); + + float render_color[4]; + size_t cache_size = m_editing_mode ? m_editing_cache.size() : m_normal_cache.size(); + for (size_t i = 0; i < cache_size; ++i) + { + const sla::SupportPoint& support_point = m_editing_mode ? m_editing_cache[i].support_point : m_normal_cache[i]; + const bool& point_selected = m_editing_mode ? m_editing_cache[i].selected : false; + + if (is_mesh_point_clipped(support_point.pos.cast())) + continue; + + // First decide about the color of the point. + if (picking) { + std::array color = picking_color_component(i); + render_color[0] = color[0]; + render_color[1] = color[1]; + render_color[2] = color[2]; + render_color[3] = color[3]; + } + else { + render_color[3] = 1.f; + if ((size_t(m_hover_id) == i && m_editing_mode)) { // ignore hover state unless editing mode is active + render_color[0] = 0.f; + render_color[1] = 1.0f; + render_color[2] = 1.0f; + } + else { // neigher hover nor picking + render_color[0] = point_selected ? 1.0f : 0.7f; + render_color[1] = point_selected ? 0.3f : 0.7f; + render_color[2] = point_selected ? 0.3f : 0.7f; + } + } + glsafe(::glColor4fv(render_color)); + float render_color_emissive[4] = { 0.5f * render_color[0], 0.5f * render_color[1], 0.5f * render_color[2], 1.f}; + glsafe(::glMaterialfv(GL_FRONT, GL_EMISSION, render_color_emissive)); + + // Inverse matrix of the instance scaling is applied so that the mark does not scale with the object. + glsafe(::glPushMatrix()); + glsafe(::glTranslatef(support_point.pos(0), support_point.pos(1), support_point.pos(2))); + glsafe(::glMultMatrixd(instance_scaling_matrix_inverse.data())); + + if (vol->is_left_handed()) + glFrontFace(GL_CW); + + // Matrices set, we can render the point mark now. + // If in editing mode, we'll also render a cone pointing to the sphere. + if (m_editing_mode) { + // in case the normal is not yet cached, find and cache it + if (m_editing_cache[i].normal == Vec3f::Zero()) + m_mesh_raycaster->get_closest_point(m_editing_cache[i].support_point.pos, &m_editing_cache[i].normal); + + Eigen::Quaterniond q; + q.setFromTwoVectors(Vec3d{0., 0., 1.}, instance_scaling_matrix_inverse * m_editing_cache[i].normal.cast()); + Eigen::AngleAxisd aa(q); + glsafe(::glRotated(aa.angle() * (180. / M_PI), aa.axis()(0), aa.axis()(1), aa.axis()(2))); + + const double cone_radius = 0.25; // mm + const double cone_height = 0.75; + glsafe(::glPushMatrix()); + glsafe(::glTranslatef(0.f, 0.f, support_point.head_front_radius * RenderPointScale)); + ::gluCylinder(m_quadric, 0., cone_radius, cone_height, 24, 1); + glsafe(::glTranslatef(0.f, 0.f, cone_height)); + ::gluDisk(m_quadric, 0.0, cone_radius, 24, 1); + glsafe(::glPopMatrix()); + } + ::gluSphere(m_quadric, (double)support_point.head_front_radius * RenderPointScale, 24, 12); + if (vol->is_left_handed()) + glFrontFace(GL_CCW); + + glsafe(::glPopMatrix()); + } + + { + // Reset emissive component to zero (the default value) + float render_color_emissive[4] = { 0.f, 0.f, 0.f, 1.f }; + glsafe(::glMaterialfv(GL_FRONT, GL_EMISSION, render_color_emissive)); + } + + if (!picking) + glsafe(::glDisable(GL_LIGHTING)); + + glsafe(::glPopMatrix()); +} + + + +bool GLGizmoHollow::is_mesh_point_clipped(const Vec3d& point) const +{ + if (m_clipping_plane_distance == 0.f) + return false; + + Vec3d transformed_point = m_model_object->instances.front()->get_transformation().get_matrix() * point; + transformed_point(2) += m_z_shift; + return m_clipping_plane->is_point_clipped(transformed_point); +} + + + +bool GLGizmoHollow::is_mesh_update_necessary() const +{ + return ((m_state == On) && (m_model_object != nullptr) && !m_model_object->instances.empty()) + && ((m_model_object->id() != m_model_object_id) || m_its == nullptr); +} + + + +void GLGizmoHollow::update_mesh() +{ + if (! m_model_object) + return; + + wxBusyCursor wait; + // this way we can use that mesh directly. + // This mesh does not account for the possible Z up SLA offset. + m_mesh = &m_model_object->volumes.front()->mesh(); + m_its = &m_mesh->its; + + // If this is different mesh than last time or if the AABB tree is uninitialized, recalculate it. + if (m_model_object_id != m_model_object->id() || ! m_mesh_raycaster) + m_mesh_raycaster.reset(new MeshRaycaster(*m_mesh)); + + m_model_object_id = m_model_object->id(); +} + + + +// Unprojects the mouse position on the mesh and saves hit point and normal of the facet into pos_and_normal +// Return false if no intersection was found, true otherwise. +bool GLGizmoHollow::unproject_on_mesh(const Vec2d& mouse_pos, std::pair& pos_and_normal) +{ + // if the gizmo doesn't have the V, F structures for igl, calculate them first: + if (! m_mesh_raycaster) + update_mesh(); + + const Camera& camera = m_parent.get_camera(); + const Selection& selection = m_parent.get_selection(); + const GLVolume* volume = selection.get_volume(*selection.get_volume_idxs().begin()); + Geometry::Transformation trafo = volume->get_instance_transformation(); + trafo.set_offset(trafo.get_offset() + Vec3d(0., 0., m_z_shift)); + + // The raycaster query + Vec3f hit; + Vec3f normal; + if (m_mesh_raycaster->unproject_on_mesh(mouse_pos, trafo.get_matrix(), camera, hit, normal, m_clipping_plane.get())) { + // Return both the point and the facet normal. + pos_and_normal = std::make_pair(hit, normal); + return true; + } + else + return false; +} + +// Following function is called from GLCanvas3D to inform the gizmo about a mouse/keyboard event. +// The gizmo has an opportunity to react - if it does, it should return true so that the Canvas3D is +// aware that the event was reacted to and stops trying to make different sense of it. If the gizmo +// concludes that the event was not intended for it, it should return false. +bool GLGizmoHollow::gizmo_event(SLAGizmoEventType action, const Vec2d& mouse_position, bool shift_down, bool alt_down, bool control_down) +{ + if (m_editing_mode) { + + // left down with shift - show the selection rectangle: + if (action == SLAGizmoEventType::LeftDown && (shift_down || alt_down || control_down)) { + if (m_hover_id == -1) { + if (shift_down || alt_down) { + m_selection_rectangle.start_dragging(mouse_position, shift_down ? GLSelectionRectangle::Select : GLSelectionRectangle::Deselect); + } + } + else { + if (m_editing_cache[m_hover_id].selected) + unselect_point(m_hover_id); + else { + if (!alt_down) + select_point(m_hover_id); + } + } + + return true; + } + + // left down without selection rectangle - place point on the mesh: + if (action == SLAGizmoEventType::LeftDown && !m_selection_rectangle.is_dragging() && !shift_down) { + // If any point is in hover state, this should initiate its move - return control back to GLCanvas: + if (m_hover_id != -1) + return false; + + // If there is some selection, don't add new point and deselect everything instead. + if (m_selection_empty) { + std::pair pos_and_normal; + if (unproject_on_mesh(mouse_position, pos_and_normal)) { // we got an intersection + Plater::TakeSnapshot snapshot(wxGetApp().plater(), _(L("Add support point"))); + m_editing_cache.emplace_back(sla::SupportPoint(pos_and_normal.first, m_new_point_head_diameter/2.f, false), false, pos_and_normal.second); + m_parent.set_as_dirty(); + m_wait_for_up_event = true; + } + else + return false; + } + else + select_point(NoPoints); + + return true; + } + + // left up with selection rectangle - select points inside the rectangle: + if ((action == SLAGizmoEventType::LeftUp || action == SLAGizmoEventType::ShiftUp || action == SLAGizmoEventType::AltUp) && m_selection_rectangle.is_dragging()) { + // Is this a selection or deselection rectangle? + GLSelectionRectangle::EState rectangle_status = m_selection_rectangle.get_state(); + + // First collect positions of all the points in world coordinates. + Geometry::Transformation trafo = m_model_object->instances[m_active_instance]->get_transformation(); + trafo.set_offset(trafo.get_offset() + Vec3d(0., 0., m_z_shift)); + std::vector points; + for (unsigned int i=0; i()); + + // Now ask the rectangle which of the points are inside. + std::vector points_inside; + std::vector points_idxs = m_selection_rectangle.stop_dragging(m_parent, points); + for (size_t idx : points_idxs) + points_inside.push_back(points[idx].cast()); + + // Only select/deselect points that are actually visible + for (size_t idx : m_mesh_raycaster->get_unobscured_idxs(trafo, m_parent.get_camera(), points_inside, m_clipping_plane.get())) + { + if (rectangle_status == GLSelectionRectangle::Deselect) + unselect_point(points_idxs[idx]); + else + select_point(points_idxs[idx]); + } + return true; + } + + // left up with no selection rectangle + if (action == SLAGizmoEventType::LeftUp) { + if (m_wait_for_up_event) { + m_wait_for_up_event = false; + return true; + } + } + + // dragging the selection rectangle: + if (action == SLAGizmoEventType::Dragging) { + if (m_wait_for_up_event) + return true; // point has been placed and the button not released yet + // this prevents GLCanvas from starting scene rotation + + if (m_selection_rectangle.is_dragging()) { + m_selection_rectangle.dragging(mouse_position); + return true; + } + + return false; + } + + if (action == SLAGizmoEventType::Delete) { + // delete key pressed + delete_selected_points(); + return true; + } + + if (action == SLAGizmoEventType::RightDown) { + if (m_hover_id != -1) { + select_point(NoPoints); + select_point(m_hover_id); + delete_selected_points(); + return true; + } + return false; + } + + if (action == SLAGizmoEventType::SelectAll) { + select_point(AllPoints); + return true; + } + } + + if (action == SLAGizmoEventType::MouseWheelUp && control_down) { + m_clipping_plane_distance = std::min(1.f, m_clipping_plane_distance + 0.01f); + update_clipping_plane(true); + return true; + } + + if (action == SLAGizmoEventType::MouseWheelDown && control_down) { + m_clipping_plane_distance = std::max(0.f, m_clipping_plane_distance - 0.01f); + update_clipping_plane(true); + return true; + } + + if (action == SLAGizmoEventType::ResetClippingPlane) { + update_clipping_plane(); + return true; + } + + return false; +} + +void GLGizmoHollow::delete_selected_points(bool force) +{ + if (! m_editing_mode) { + std::cout << "DEBUGGING: delete_selected_points called out of editing mode!" << std::endl; + std::abort(); + } + + Plater::TakeSnapshot snapshot(wxGetApp().plater(), _(L("Delete support point"))); + + for (unsigned int idx=0; idx pos_and_normal; + if (! unproject_on_mesh(data.mouse_pos.cast(), pos_and_normal)) + return; + m_editing_cache[m_hover_id].support_point.pos = pos_and_normal.first; + m_editing_cache[m_hover_id].support_point.is_new_island = false; + m_editing_cache[m_hover_id].normal = pos_and_normal.second; + // Do not update immediately, wait until the mouse is released. + // m_parent.post_event(SimpleEvent(EVT_GLCANVAS_SCHEDULE_BACKGROUND_PROCESS)); + } + } +} + +std::vector GLGizmoHollow::get_config_options(const std::vector& keys) const +{ + std::vector out; + + if (!m_model_object) + return out; + + const DynamicPrintConfig& object_cfg = m_model_object->config; + const DynamicPrintConfig& print_cfg = wxGetApp().preset_bundle->sla_prints.get_edited_preset().config; + std::unique_ptr default_cfg = nullptr; + + for (const std::string& key : keys) { + if (object_cfg.has(key)) + out.push_back(object_cfg.option(key)); + else + if (print_cfg.has(key)) + out.push_back(print_cfg.option(key)); + else { // we must get it from defaults + if (default_cfg == nullptr) + default_cfg.reset(DynamicPrintConfig::new_from_defaults_keys(keys)); + out.push_back(default_cfg->option(key)); + } + } + + return out; +} + + +ClippingPlane GLGizmoHollow::get_sla_clipping_plane() const +{ + if (!m_model_object || m_state == Off || m_clipping_plane_distance == 0.f) + return ClippingPlane::ClipsNothing(); + else + return ClippingPlane(-m_clipping_plane->get_normal(), m_clipping_plane->get_data()[3]); +} + + +void GLGizmoHollow::on_render_input_window(float x, float y, float bottom_limit) +{ + if (!m_model_object) + return; + + bool first_run = true; // This is a hack to redraw the button when all points are removed, + // so it is not delayed until the background process finishes. +RENDER_AGAIN: + //m_imgui->set_next_window_pos(x, y, ImGuiCond_Always); + //const ImVec2 window_size(m_imgui->scaled(18.f, 16.f)); + //ImGui::SetNextWindowPos(ImVec2(x, y - std::max(0.f, y+window_size.y-bottom_limit) )); + //ImGui::SetNextWindowSize(ImVec2(window_size)); + + const float approx_height = m_imgui->scaled(18.0f); + y = std::min(y, bottom_limit - approx_height); + m_imgui->set_next_window_pos(x, y, ImGuiCond_Always); + m_imgui->set_next_window_bg_alpha(0.5f); + m_imgui->begin(on_get_name(), ImGuiWindowFlags_NoMove | ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoCollapse); + + // First calculate width of all the texts that are could possibly be shown. We will decide set the dialog width based on that: + + const float settings_sliders_left = std::max(m_imgui->calc_text_size(m_desc.at("minimal_distance")).x, m_imgui->calc_text_size(m_desc.at("points_density")).x) + m_imgui->scaled(1.f); + const float clipping_slider_left = std::max(m_imgui->calc_text_size(m_desc.at("clipping_of_view")).x, m_imgui->calc_text_size(m_desc.at("reset_direction")).x) + m_imgui->scaled(1.5f); + const float diameter_slider_left = m_imgui->calc_text_size(m_desc.at("head_diameter")).x + m_imgui->scaled(1.f); + const float minimal_slider_width = m_imgui->scaled(4.f); + const float buttons_width_approx = m_imgui->calc_text_size(m_desc.at("apply_changes")).x + m_imgui->calc_text_size(m_desc.at("discard_changes")).x + m_imgui->scaled(1.5f); + const float lock_supports_width_approx = m_imgui->calc_text_size(m_desc.at("lock_supports")).x + m_imgui->scaled(2.f); + + float window_width = minimal_slider_width + std::max(std::max(settings_sliders_left, clipping_slider_left), diameter_slider_left); + window_width = std::max(std::max(window_width, buttons_width_approx), lock_supports_width_approx); + + + bool force_refresh = false; + bool remove_selected = false; + bool remove_all = false; + + if (m_editing_mode) { + + float diameter_upper_cap = static_cast(wxGetApp().preset_bundle->sla_prints.get_edited_preset().config.option("support_pillar_diameter"))->value; + if (m_new_point_head_diameter > diameter_upper_cap) + m_new_point_head_diameter = diameter_upper_cap; + m_imgui->text(m_desc.at("head_diameter")); + ImGui::SameLine(diameter_slider_left); + ImGui::PushItemWidth(window_width - diameter_slider_left); + + // Following is a nasty way to: + // - save the initial value of the slider before one starts messing with it + // - keep updating the head radius during sliding so it is continuosly refreshed in 3D scene + // - take correct undo/redo snapshot after the user is done with moving the slider + float initial_value = m_new_point_head_diameter; + ImGui::SliderFloat("", &m_new_point_head_diameter, 0.1f, diameter_upper_cap, "%.1f"); + if (ImGui::IsItemClicked()) { + if (m_old_point_head_diameter == 0.f) + m_old_point_head_diameter = initial_value; + } + if (ImGui::IsItemEdited()) { + for (auto& cache_entry : m_editing_cache) + if (cache_entry.selected) + cache_entry.support_point.head_front_radius = m_new_point_head_diameter / 2.f; + } + if (ImGui::IsItemDeactivatedAfterEdit()) { + // momentarily restore the old value to take snapshot + for (auto& cache_entry : m_editing_cache) + if (cache_entry.selected) + cache_entry.support_point.head_front_radius = m_old_point_head_diameter / 2.f; + float backup = m_new_point_head_diameter; + m_new_point_head_diameter = m_old_point_head_diameter; + Plater::TakeSnapshot snapshot(wxGetApp().plater(), _(L("Change point head diameter"))); + m_new_point_head_diameter = backup; + for (auto& cache_entry : m_editing_cache) + if (cache_entry.selected) + cache_entry.support_point.head_front_radius = m_new_point_head_diameter / 2.f; + m_old_point_head_diameter = 0.f; + } + + m_imgui->disabled_begin(m_selection_empty); + remove_selected = m_imgui->button(m_desc.at("remove_selected")); + m_imgui->disabled_end(); + + m_imgui->disabled_begin(m_editing_cache.empty()); + remove_all = m_imgui->button(m_desc.at("remove_all")); + m_imgui->disabled_end(); + + m_imgui->text(" "); // vertical gap + } + else { // not in editing mode: + m_imgui->text(m_desc.at("minimal_distance")); + ImGui::SameLine(settings_sliders_left); + ImGui::PushItemWidth(window_width - settings_sliders_left); + + std::vector opts = get_config_options({"support_points_density_relative", "support_points_minimal_distance"}); + float density = static_cast(opts[0])->value; + float minimal_point_distance = static_cast(opts[1])->value; + + ImGui::SliderFloat("", &minimal_point_distance, 0.f, 20.f, "%.f mm"); + bool slider_clicked = ImGui::IsItemClicked(); // someone clicked the slider + bool slider_edited = ImGui::IsItemEdited(); // someone is dragging the slider + bool slider_released = ImGui::IsItemDeactivatedAfterEdit(); // someone has just released the slider + + m_imgui->text(m_desc.at("points_density")); + ImGui::SameLine(settings_sliders_left); + + ImGui::SliderFloat(" ", &density, 0.f, 200.f, "%.f %%"); + slider_clicked |= ImGui::IsItemClicked(); + slider_edited |= ImGui::IsItemEdited(); + slider_released |= ImGui::IsItemDeactivatedAfterEdit(); + + if (slider_clicked) { // stash the values of the settings so we know what to revert to after undo + m_minimal_point_distance_stash = minimal_point_distance; + m_density_stash = density; + } + if (slider_edited) { + m_model_object->config.opt("support_points_minimal_distance", true)->value = minimal_point_distance; + m_model_object->config.opt("support_points_density_relative", true)->value = (int)density; + } + if (slider_released) { + m_model_object->config.opt("support_points_minimal_distance", true)->value = m_minimal_point_distance_stash; + m_model_object->config.opt("support_points_density_relative", true)->value = (int)m_density_stash; + Plater::TakeSnapshot snapshot(wxGetApp().plater(), _(L("Support parameter change"))); + m_model_object->config.opt("support_points_minimal_distance", true)->value = minimal_point_distance; + m_model_object->config.opt("support_points_density_relative", true)->value = (int)density; + wxGetApp().obj_list()->update_and_show_object_settings_item(); + } + + + m_imgui->disabled_begin(m_normal_cache.empty()); + remove_all = m_imgui->button(m_desc.at("remove_all")); + m_imgui->disabled_end(); + + } + + + // Following is rendered in both editing and non-editing mode: + m_imgui->text(""); + if (m_clipping_plane_distance == 0.f) + m_imgui->text(m_desc.at("clipping_of_view")); + else { + if (m_imgui->button(m_desc.at("reset_direction"))) { + wxGetApp().CallAfter([this](){ + update_clipping_plane(); + }); + } + } + + ImGui::SameLine(clipping_slider_left); + ImGui::PushItemWidth(window_width - clipping_slider_left); + if (ImGui::SliderFloat(" ", &m_clipping_plane_distance, 0.f, 1.f, "%.2f")) + update_clipping_plane(true); + + + if (m_imgui->button("?")) { + wxGetApp().CallAfter([]() { + SlaGizmoHelpDialog help_dlg; + help_dlg.ShowModal(); + }); + } + + m_imgui->end(); + + if (m_editing_mode != m_old_editing_state) { // user toggled between editing/non-editing mode + m_parent.toggle_sla_auxiliaries_visibility(!m_editing_mode, m_model_object, m_active_instance); + force_refresh = true; + } + m_old_editing_state = m_editing_mode; + + if (remove_selected || remove_all) { + force_refresh = false; + m_parent.set_as_dirty(); + bool was_in_editing = m_editing_mode; + if (remove_all) { + select_point(AllPoints); + delete_selected_points(true); // true - delete regardless of locked status + } + if (remove_selected) + delete_selected_points(false); // leave locked points + + if (first_run) { + first_run = false; + goto RENDER_AGAIN; + } + } + + if (force_refresh) + m_parent.set_as_dirty(); +} + +bool GLGizmoHollow::on_is_activable() const +{ + const Selection& selection = m_parent.get_selection(); + + if (wxGetApp().preset_bundle->printers.get_edited_preset().printer_technology() != ptSLA + || !selection.is_from_single_instance()) + return false; + + // Check that none of the selected volumes is outside. Only SLA auxiliaries (supports) are allowed outside. + const Selection::IndicesList& list = selection.get_volume_idxs(); + for (const auto& idx : list) + if (selection.get_volume(idx)->is_outside && selection.get_volume(idx)->composite_id.volume_id >= 0) + return false; + + return true; +} + +bool GLGizmoHollow::on_is_selectable() const +{ + return (wxGetApp().preset_bundle->printers.get_edited_preset().printer_technology() == ptSLA); +} + +std::string GLGizmoHollow::on_get_name() const +{ + return (_(L("Hollowing")) + " [H]").ToUTF8().data(); +} + + + +void GLGizmoHollow::on_set_state() +{ + // m_model_object pointer can be invalid (for instance because of undo/redo action), + // we should recover it from the object id + m_model_object = nullptr; + for (const auto mo : wxGetApp().model().objects) { + if (mo->id() == m_model_object_id) { + m_model_object = mo; + break; + } + } + + if (m_state == m_old_state) + return; + + if (m_state == On && m_old_state != On) { // the gizmo was just turned on + Plater::TakeSnapshot snapshot(wxGetApp().plater(), _(L("SLA gizmo turned on"))); + if (is_mesh_update_necessary()) + update_mesh(); + + // we'll now reload support points: + if (m_model_object) + reload_cache(); + + m_parent.toggle_model_objects_visibility(false); + if (m_model_object) + m_parent.toggle_model_objects_visibility(true, m_model_object, m_active_instance); + + // Set default head diameter from config. + const DynamicPrintConfig& cfg = wxGetApp().preset_bundle->sla_prints.get_edited_preset().config; + m_new_point_head_diameter = static_cast(cfg.option("support_head_front_diameter"))->value; + } + if (m_state == Off && m_old_state != Off) { // the gizmo was just turned Off + bool will_ask = m_model_object && false; + if (will_ask) { + wxGetApp().CallAfter([this]() { + }); + // refuse to be turned off so the gizmo is active when the CallAfter is executed + m_state = m_old_state; + } + else { + // we are actually shutting down + Plater::TakeSnapshot snapshot(wxGetApp().plater(), _(L("SLA gizmo turned off"))); + m_parent.toggle_model_objects_visibility(true); + m_normal_cache.clear(); + m_clipping_plane_distance = 0.f; + // Release clippers and the AABB raycaster. + m_its = nullptr; + m_object_clipper.reset(); + m_supports_clipper.reset(); + m_mesh_raycaster.reset(); + } + } + m_old_state = m_state; +} + + + +void GLGizmoHollow::on_start_dragging() +{ + if (m_hover_id != -1) { + select_point(NoPoints); + select_point(m_hover_id); + m_point_before_drag = m_editing_cache[m_hover_id]; + } + else + m_point_before_drag = CacheEntry(); +} + + +void GLGizmoHollow::on_stop_dragging() +{ + if (m_hover_id != -1) { + CacheEntry backup = m_editing_cache[m_hover_id]; + + if (m_point_before_drag.support_point.pos != Vec3f::Zero() // some point was touched + && backup.support_point.pos != m_point_before_drag.support_point.pos) // and it was moved, not just selected + { + m_editing_cache[m_hover_id] = m_point_before_drag; + Plater::TakeSnapshot snapshot(wxGetApp().plater(), _(L("Move support point"))); + m_editing_cache[m_hover_id] = backup; + } + } + m_point_before_drag = CacheEntry(); +} + + + +void GLGizmoHollow::on_load(cereal::BinaryInputArchive& ar) +{ + ar(m_clipping_plane_distance, + *m_clipping_plane, + m_model_object_id, + m_new_point_head_diameter, + m_normal_cache, + m_editing_cache, + m_selection_empty + ); +} + + + +void GLGizmoHollow::on_save(cereal::BinaryOutputArchive& ar) const +{ + ar(m_clipping_plane_distance, + *m_clipping_plane, + m_model_object_id, + m_new_point_head_diameter, + m_normal_cache, + m_editing_cache, + m_selection_empty + ); +} + + + +void GLGizmoHollow::select_point(int i) +{ + if (! m_editing_mode) { + std::cout << "DEBUGGING: select_point called when out of editing mode!" << std::endl; + std::abort(); + } + + if (i == AllPoints || i == NoPoints) { + for (auto& point_and_selection : m_editing_cache) + point_and_selection.selected = ( i == AllPoints ); + m_selection_empty = (i == NoPoints); + + if (i == AllPoints) + m_new_point_head_diameter = m_editing_cache[0].support_point.head_front_radius * 2.f; + } + else { + m_editing_cache[i].selected = true; + m_selection_empty = false; + m_new_point_head_diameter = m_editing_cache[i].support_point.head_front_radius * 2.f; + } +} + + +void GLGizmoHollow::unselect_point(int i) +{ + if (! m_editing_mode) { + std::cout << "DEBUGGING: unselect_point called when out of editing mode!" << std::endl; + std::abort(); + } + + m_editing_cache[i].selected = false; + m_selection_empty = true; + for (const CacheEntry& ce : m_editing_cache) { + if (ce.selected) { + m_selection_empty = false; + break; + } + } +} + + +bool GLGizmoHollow::unsaved_changes() const +{ + if (m_editing_cache.size() != m_normal_cache.size()) + return true; + + for (size_t i=0; iget_normal() != Vec3d::Zero() ? + m_clipping_plane->get_normal() : -m_parent.get_camera().get_dir_forward()); + + const Vec3d& center = m_model_object->instances[m_active_instance]->get_offset() + Vec3d(0., 0., m_z_shift); + float dist = normal.dot(center); + *m_clipping_plane = ClippingPlane(normal, (dist - (-m_active_instance_bb_radius) - m_clipping_plane_distance * 2*m_active_instance_bb_radius)); + m_parent.set_as_dirty(); +} + + + + +} // namespace GUI +} // namespace Slic3r diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp new file mode 100644 index 0000000000..40c7788459 --- /dev/null +++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp @@ -0,0 +1,160 @@ +#ifndef slic3r_GLGizmoHollow_hpp_ +#define slic3r_GLGizmoHollow_hpp_ + +#include "GLGizmoBase.hpp" +#include "slic3r/GUI/GLSelectionRectangle.hpp" + +#include "libslic3r/SLA/SLACommon.hpp" +#include + +#include + + +namespace Slic3r { +namespace GUI { + +class ClippingPlane; +class MeshClipper; +class MeshRaycaster; +enum class SLAGizmoEventType : unsigned char; + +class GLGizmoHollow : public GLGizmoBase +{ +private: + ModelObject* m_model_object = nullptr; + ObjectID m_model_object_id = 0; + int m_active_instance = -1; + float m_active_instance_bb_radius; // to cache the bb + mutable double m_z_shift = 0.f; + bool unproject_on_mesh(const Vec2d& mouse_pos, std::pair& pos_and_normal); + + const float RenderPointScale = 1.f; + + GLUquadricObj* m_quadric; + + std::unique_ptr m_mesh_raycaster; + const TriangleMesh* m_mesh; + const indexed_triangle_set* m_its; + mutable const TriangleMesh* m_supports_mesh; + mutable std::vector m_triangles; + mutable std::vector m_supports_triangles; + mutable int m_old_timestamp = -1; + mutable int m_print_object_idx = -1; + mutable int m_print_objects_count = -1; + + class CacheEntry { + public: + CacheEntry() : + support_point(sla::SupportPoint()), selected(false), normal(Vec3f::Zero()) {} + + CacheEntry(const sla::SupportPoint& point, bool sel = false, const Vec3f& norm = Vec3f::Zero()) : + support_point(point), selected(sel), normal(norm) {} + + bool operator==(const CacheEntry& rhs) const { + return (support_point == rhs.support_point); + } + + bool operator!=(const CacheEntry& rhs) const { + return ! ((*this) == rhs); + } + + sla::SupportPoint support_point; + bool selected; // whether the point is selected + Vec3f normal; + + template + void serialize(Archive & ar) + { + ar(support_point, selected, normal); + } + }; + +public: + GLGizmoHollow(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id); + ~GLGizmoHollow() override; + void set_sla_support_data(ModelObject* model_object, const Selection& selection); + bool gizmo_event(SLAGizmoEventType action, const Vec2d& mouse_position, bool shift_down, bool alt_down, bool control_down); + void delete_selected_points(bool force = false); + ClippingPlane get_sla_clipping_plane() const; + + bool is_selection_rectangle_dragging() const { return m_selection_rectangle.is_dragging(); } + +private: + bool on_init() override; + void on_update(const UpdateData& data) override; + void on_render() const override; + void on_render_for_picking() const override; + + //void render_selection_rectangle() const; + void render_points(const Selection& selection, bool picking = false) const; + void render_clipping_plane(const Selection& selection) const; + bool is_mesh_update_necessary() const; + void update_mesh(); + bool unsaved_changes() const; + + bool m_editing_mode = true; // Is editing mode active? + bool m_old_editing_state = false; // To keep track of whether the user toggled between the modes (needed for imgui refreshes). + float m_new_point_head_diameter; // Size of a new point. + CacheEntry m_point_before_drag; // undo/redo - so we know what state was edited + float m_old_point_head_diameter = 0.; // the same + float m_minimal_point_distance_stash = 0.f; // and again + float m_density_stash = 0.f; // and again + mutable std::vector m_editing_cache; // a support point and whether it is currently selected + std::vector m_normal_cache; // to restore after discarding changes or undo/redo + + float m_clipping_plane_distance = 0.f; + std::unique_ptr m_clipping_plane; + + // This map holds all translated description texts, so they can be easily referenced during layout calculations + // etc. When language changes, GUI is recreated and this class constructed again, so the change takes effect. + std::map m_desc; + + GLSelectionRectangle m_selection_rectangle; + + bool m_wait_for_up_event = false; + bool m_selection_empty = true; + EState m_old_state = Off; // to be able to see that the gizmo has just been closed (see on_set_state) + + mutable std::unique_ptr m_object_clipper; + mutable std::unique_ptr m_supports_clipper; + + std::vector get_config_options(const std::vector& keys) const; + bool is_mesh_point_clipped(const Vec3d& point) const; + //void find_intersecting_facets(const igl::AABB* aabb, const Vec3f& normal, double offset, std::vector& out) const; + + // Methods that do the model_object and editing cache synchronization, + // editing mode selection, etc: + enum { + AllPoints = -2, + NoPoints, + }; + void select_point(int i); + void unselect_point(int i); + void reload_cache(); + void update_clipping_plane(bool keep_normal = false) const; + +protected: + void on_set_state() override; + void on_set_hover_id() override + + { + if (! m_editing_mode || (int)m_editing_cache.size() <= m_hover_id) + m_hover_id = -1; + } + void on_start_dragging() override; + void on_stop_dragging() override; + void on_render_input_window(float x, float y, float bottom_limit) override; + + std::string on_get_name() const override; + bool on_is_activable() const override; + bool on_is_selectable() const override; + void on_load(cereal::BinaryInputArchive& ar) override; + void on_save(cereal::BinaryOutputArchive& ar) const override; +}; + + + +} // namespace GUI +} // namespace Slic3r + +#endif // slic3r_GLGizmoHollow_hpp_ diff --git a/src/slic3r/GUI/Gizmos/GLGizmos.hpp b/src/slic3r/GUI/Gizmos/GLGizmos.hpp index 272fa098a3..9f97c42b46 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmos.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmos.hpp @@ -32,5 +32,6 @@ enum class SLAGizmoEventType : unsigned char { #include "slic3r/GUI/Gizmos/GLGizmoFlatten.hpp" #include "slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp" #include "slic3r/GUI/Gizmos/GLGizmoCut.hpp" +#include "slic3r/GUI/Gizmos/GLGizmoHollow.hpp" #endif //slic3r_GLGizmos_hpp_ diff --git a/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp b/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp index 25dab03360..1f581c9b5b 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp @@ -94,6 +94,7 @@ bool GLGizmosManager::init() m_gizmos.emplace_back(new GLGizmoFlatten(m_parent, "place.svg", 3)); m_gizmos.emplace_back(new GLGizmoCut(m_parent, "cut.svg", 4)); m_gizmos.emplace_back(new GLGizmoSlaSupports(m_parent, "sla_supports.svg", 5)); + m_gizmos.emplace_back(new GLGizmoHollow(m_parent, "hollow.svg", 6)); for (auto& gizmo : m_gizmos) { if (! gizmo->init()) { @@ -350,6 +351,7 @@ void GLGizmosManager::set_sla_support_data(ModelObject* model_object) return; dynamic_cast(m_gizmos[SlaSupports].get())->set_sla_support_data(model_object, m_parent.get_selection()); + dynamic_cast(m_gizmos[Hollow].get())->set_sla_support_data(model_object, m_parent.get_selection()); } // Returns true if the gizmo used the event to do something, false otherwise. @@ -358,15 +360,22 @@ bool GLGizmosManager::gizmo_event(SLAGizmoEventType action, const Vec2d& mouse_p if (!m_enabled || m_gizmos.empty()) return false; - return dynamic_cast(m_gizmos[SlaSupports].get())->gizmo_event(action, mouse_position, shift_down, alt_down, control_down); + if (m_current == SlaSupports) + return dynamic_cast(m_gizmos[SlaSupports].get())->gizmo_event(action, mouse_position, shift_down, alt_down, control_down); + if (m_current == Hollow) + return dynamic_cast(m_gizmos[Hollow].get())->gizmo_event(action, mouse_position, shift_down, alt_down, control_down); + return false; } ClippingPlane GLGizmosManager::get_sla_clipping_plane() const { - if (!m_enabled || m_current != SlaSupports || m_gizmos.empty()) + if (!m_enabled || (m_current != SlaSupports && m_current != Hollow) || m_gizmos.empty()) return ClippingPlane::ClipsNothing(); - return dynamic_cast(m_gizmos[SlaSupports].get())->get_sla_clipping_plane(); + if (m_current == SlaSupports) + return dynamic_cast(m_gizmos[SlaSupports].get())->get_sla_clipping_plane(); + else + return dynamic_cast(m_gizmos[Hollow].get())->get_sla_clipping_plane(); } bool GLGizmosManager::wants_reslice_supports_on_undo() const @@ -464,7 +473,7 @@ bool GLGizmosManager::on_mouse(wxMouseEvent& evt) if (evt.LeftDown()) { - if ((m_current == SlaSupports) && gizmo_event(SLAGizmoEventType::LeftDown, mouse_pos, evt.ShiftDown(), evt.AltDown(), evt.ControlDown())) + if ((m_current == SlaSupports || m_current == Hollow) && gizmo_event(SLAGizmoEventType::LeftDown, mouse_pos, evt.ShiftDown(), evt.AltDown(), evt.ControlDown())) // the gizmo got the event and took some action, there is no need to do anything more processed = true; else if (!selection.is_empty() && grabber_contains_mouse()) { @@ -489,10 +498,10 @@ bool GLGizmosManager::on_mouse(wxMouseEvent& evt) // event was taken care of by the SlaSupports gizmo processed = true; } - else if (evt.Dragging() && (m_parent.get_move_volume_id() != -1) && (m_current == SlaSupports)) + else if (evt.Dragging() && (m_parent.get_move_volume_id() != -1) && (m_current == SlaSupports || m_current == Hollow)) // don't allow dragging objects with the Sla gizmo on processed = true; - else if (evt.Dragging() && (m_current == SlaSupports) && gizmo_event(SLAGizmoEventType::Dragging, mouse_pos, evt.ShiftDown(), evt.AltDown(), evt.ControlDown())) + else if (evt.Dragging() && (m_current == SlaSupports || m_current == Hollow) && gizmo_event(SLAGizmoEventType::Dragging, mouse_pos, evt.ShiftDown(), evt.AltDown(), evt.ControlDown())) { // the gizmo got the event and took some action, no need to do anything more here m_parent.set_as_dirty(); @@ -568,7 +577,7 @@ bool GLGizmosManager::on_mouse(wxMouseEvent& evt) processed = true; } - else if (evt.LeftUp() && (m_current == SlaSupports) && !m_parent.is_mouse_dragging()) + else if (evt.LeftUp() && (m_current == SlaSupports || m_current == Hollow) && !m_parent.is_mouse_dragging()) { // in case SLA gizmo is selected, we just pass the LeftUp event and stop processing - neither // object moving or selecting is suppressed in that case diff --git a/src/slic3r/GUI/Gizmos/GLGizmosManager.hpp b/src/slic3r/GUI/Gizmos/GLGizmosManager.hpp index 0defb13483..0368e433ed 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmosManager.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmosManager.hpp @@ -60,6 +60,7 @@ public: Flatten, Cut, SlaSupports, + Hollow, Undefined }; From 3fe160e60ad7529339c956ab4208bb228b9e6932 Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Tue, 5 Nov 2019 10:16:10 +0100 Subject: [PATCH 032/336] Added possibility to change hole height and taper The parameters are yet not saved in ModelObject and they are common for all holes --- src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp | 39 +++++++++++++++---------- src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp | 2 ++ 2 files changed, 26 insertions(+), 15 deletions(-) diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp index 8063d58904..6c06bbbe64 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp @@ -195,14 +195,14 @@ void GLGizmoHollow::render_clipping_plane(const Selection& selection) const // At this point we have the triangulated cuts for both the object and supports - let's render. if (! m_object_clipper->get_triangles().empty()) { - ::glPushMatrix(); + ::glPushMatrix(); ::glColor3f(1.0f, 0.37f, 0.0f); ::glBegin(GL_TRIANGLES); for (const Vec3f& point : m_object_clipper->get_triangles()) ::glVertex3f(point(0), point(1), point(2)); ::glEnd(); - ::glPopMatrix(); - } + ::glPopMatrix(); + } if (m_supports_clipper && ! m_supports_clipper->get_triangles().empty() && !m_editing_mode) { // The supports are hidden in the editing mode, so it makes no sense to render the cuts. @@ -212,8 +212,8 @@ void GLGizmoHollow::render_clipping_plane(const Selection& selection) const for (const Vec3f& point : m_supports_clipper->get_triangles()) ::glVertex3f(point(0), point(1), point(2)); ::glEnd(); - ::glPopMatrix(); - } + ::glPopMatrix(); + } } @@ -221,7 +221,7 @@ void GLGizmoHollow::on_render_for_picking() const { const Selection& selection = m_parent.get_selection(); #if ENABLE_RENDER_PICKING_PASS - m_z_shift = selection.get_volume(*selection.get_volume_idxs().begin())->get_sla_shift_z(); + m_z_shift = selection.get_volume(*selection.get_volume_idxs().begin())->get_sla_shift_z(); #endif glsafe(::glEnable(GL_DEPTH_TEST)); @@ -257,7 +257,7 @@ void GLGizmoHollow::render_points(const Selection& selection, bool picking) cons render_color[0] = color[0]; render_color[1] = color[1]; render_color[2] = color[2]; - render_color[3] = color[3]; + render_color[3] = color[3]; } else { render_color[3] = 1.f; @@ -270,6 +270,7 @@ void GLGizmoHollow::render_points(const Selection& selection, bool picking) cons render_color[0] = point_selected ? 1.0f : 0.7f; render_color[1] = point_selected ? 0.3f : 0.7f; render_color[2] = point_selected ? 0.3f : 0.7f; + render_color[3] = 0.5f; } } glsafe(::glColor4fv(render_color)); @@ -296,16 +297,20 @@ void GLGizmoHollow::render_points(const Selection& selection, bool picking) cons Eigen::AngleAxisd aa(q); glsafe(::glRotated(aa.angle() * (180. / M_PI), aa.axis()(0), aa.axis()(1), aa.axis()(2))); - const double cone_radius = 0.25; // mm - const double cone_height = 0.75; + const double cone_radius = double(support_point.head_front_radius) * RenderPointScale; //0.25; // mm + const double cone_height = m_new_cone_height; + //const double cone_rad_diff = m_new_cone_angle*(cone_radius/(cone_height/2.))*(cone_height/2.); + const double cone_rad_diff = m_new_cone_angle*cone_radius; glsafe(::glPushMatrix()); - glsafe(::glTranslatef(0.f, 0.f, support_point.head_front_radius * RenderPointScale)); - ::gluCylinder(m_quadric, 0., cone_radius, cone_height, 24, 1); + glsafe(::glTranslatef(0.f, 0.f, -cone_height/2.)); + //::gluCylinder(m_quadric, cone_radius, cone_radius, cone_height, 24, 1); + ::gluCylinder(m_quadric, cone_radius+cone_rad_diff, cone_radius-cone_rad_diff, cone_height, 24, 1); glsafe(::glTranslatef(0.f, 0.f, cone_height)); - ::gluDisk(m_quadric, 0.0, cone_radius, 24, 1); + //::gluDisk(m_quadric, 0.0, cone_radius, 24, 1); + ::gluDisk(m_quadric, 0.0, cone_radius-cone_rad_diff, 24, 1); glsafe(::glPopMatrix()); } - ::gluSphere(m_quadric, (double)support_point.head_front_radius * RenderPointScale, 24, 12); + //::gluSphere(m_quadric, (double)support_point.head_front_radius * RenderPointScale, 24, 12); if (vol->is_left_handed()) glFrontFace(GL_CCW); @@ -623,7 +628,7 @@ RENDER_AGAIN: //const ImVec2 window_size(m_imgui->scaled(18.f, 16.f)); //ImGui::SetNextWindowPos(ImVec2(x, y - std::max(0.f, y+window_size.y-bottom_limit) )); //ImGui::SetNextWindowSize(ImVec2(window_size)); - + const float approx_height = m_imgui->scaled(18.0f); y = std::min(y, bottom_limit - approx_height); m_imgui->set_next_window_pos(x, y, ImGuiCond_Always); @@ -686,6 +691,10 @@ RENDER_AGAIN: m_old_point_head_diameter = 0.f; } + // !!!! Something as above should be done for the cone angle + ImGui::SliderFloat(" ", &m_new_cone_angle, -1.f, 1.f, "%.1f"); + ImGui::SliderFloat(" ", &m_new_cone_height, 0.1f, 10.f, "%.1f"); + m_imgui->disabled_begin(m_selection_empty); remove_selected = m_imgui->button(m_desc.at("remove_selected")); m_imgui->disabled_end(); @@ -757,7 +766,7 @@ RENDER_AGAIN: ImGui::SameLine(clipping_slider_left); ImGui::PushItemWidth(window_width - clipping_slider_left); - if (ImGui::SliderFloat(" ", &m_clipping_plane_distance, 0.f, 1.f, "%.2f")) + if (ImGui::SliderFloat(" ", &m_clipping_plane_distance, 0.f, 1.f, "%.2f")) update_clipping_plane(true); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp index 40c7788459..60e2fbf612 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp @@ -95,6 +95,8 @@ private: bool m_editing_mode = true; // Is editing mode active? bool m_old_editing_state = false; // To keep track of whether the user toggled between the modes (needed for imgui refreshes). float m_new_point_head_diameter; // Size of a new point. + float m_new_cone_angle = 0.f; + float m_new_cone_height = 5.f; CacheEntry m_point_before_drag; // undo/redo - so we know what state was edited float m_old_point_head_diameter = 0.; // the same float m_minimal_point_distance_stash = 0.f; // and again From 013e61322103c0968fd4cec1da320f3800d384c5 Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Tue, 5 Nov 2019 14:40:22 +0100 Subject: [PATCH 033/336] Hollowing gizmo can now actually trigger the hollowing and render result --- src/slic3r/GUI/GLCanvas3D.hpp | 1 + src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp | 71 +++++++++++++++++++++-- src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp | 7 +++ src/slic3r/GUI/Gizmos/GLGizmosManager.cpp | 6 +- 4 files changed, 78 insertions(+), 7 deletions(-) diff --git a/src/slic3r/GUI/GLCanvas3D.hpp b/src/slic3r/GUI/GLCanvas3D.hpp index 2c2676ae77..dc25f77d80 100644 --- a/src/slic3r/GUI/GLCanvas3D.hpp +++ b/src/slic3r/GUI/GLCanvas3D.hpp @@ -486,6 +486,7 @@ public: void set_color_by(const std::string& value); const Camera& get_camera() const { return m_camera; } + const Shader& get_shader() const { return m_shader; } BoundingBoxf3 volumes_bounding_box() const; BoundingBoxf3 scene_bounding_box() const; diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp index 6c06bbbe64..5b6620ef68 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp @@ -17,6 +17,7 @@ #include "slic3r/GUI/Plater.hpp" #include "slic3r/GUI/PresetBundle.hpp" #include "libslic3r/SLAPrint.hpp" +#include "libslic3r/OpenVDBUtils.hpp" namespace Slic3r { @@ -57,6 +58,7 @@ bool GLGizmoHollow::on_init() m_desc["manual_editing"] = _(L("Manual editing")); m_desc["clipping_of_view"] = _(L("Clipping of view"))+ ": "; m_desc["reset_direction"] = _(L("Reset direction")); + m_desc["hollow"] = _(L("Hollow")); return true; } @@ -114,6 +116,12 @@ void GLGizmoHollow::on_render() const if (! m_its || ! m_mesh) const_cast(this)->update_mesh(); + if (m_volume_with_cavity) { + m_parent.get_shader().start_using(); + m_volume_with_cavity->render(); + m_parent.get_shader().stop_using(); + } + glsafe(::glEnable(GL_BLEND)); glsafe(::glEnable(GL_DEPTH_TEST)); @@ -152,7 +160,7 @@ void GLGizmoHollow::render_clipping_plane(const Selection& selection) const // Now initialize the TMS for the object, perform the cut and save the result. if (! m_object_clipper) { m_object_clipper.reset(new MeshClipper); - m_object_clipper->set_mesh(*m_mesh); + m_object_clipper->set_mesh(*mesh()); } m_object_clipper->set_plane(*m_clipping_plane); m_object_clipper->set_transformation(trafo); @@ -362,8 +370,15 @@ void GLGizmoHollow::update_mesh() m_mesh = &m_model_object->volumes.front()->mesh(); m_its = &m_mesh->its; - // If this is different mesh than last time or if the AABB tree is uninitialized, recalculate it. - if (m_model_object_id != m_model_object->id() || ! m_mesh_raycaster) + // If this is different mesh than last time + if (m_model_object_id != m_model_object->id()) { + m_cavity_mesh.reset(); // dump the cavity + m_volume_with_cavity.reset(); + m_parent.toggle_model_objects_visibility(true, m_model_object, m_active_instance); + m_mesh_raycaster.reset(); + } + + if (! m_mesh_raycaster) m_mesh_raycaster.reset(new MeshRaycaster(*m_mesh)); m_model_object_id = m_model_object->id(); @@ -579,6 +594,32 @@ void GLGizmoHollow::on_update(const UpdateData& data) } } + +void GLGizmoHollow::hollow_mesh(float offset, float adaptibility) +{ + Slic3r::sla::Contour3D imesh{*m_mesh}; + auto ptr = meshToVolume(imesh, {}); + sla::Contour3D omesh = volumeToMesh(*ptr, -offset, adaptibility, true); + + if (omesh.empty()) + return; + + imesh.merge(omesh); + m_cavity_mesh.reset(new TriangleMesh); + *m_cavity_mesh = sla::to_triangle_mesh(imesh); + m_cavity_mesh.get()->require_shared_vertices(); + m_mesh_raycaster.reset(new MeshRaycaster(*m_cavity_mesh.get())); + m_object_clipper.reset(); + + // create a new GLVolume that only has the cavity inside + m_volume_with_cavity.reset(new GLVolume(1.f, 0.f, 0.f, 0.5f)); + m_volume_with_cavity->indexed_vertex_array.load_mesh(*m_cavity_mesh.get()); + m_volume_with_cavity->finalize_geometry(true); + m_volume_with_cavity->set_volume_transformation(m_model_object->volumes.front()->get_transformation()); + m_volume_with_cavity->set_instance_transformation(m_model_object->instances[m_active_instance]->get_transformation()); + m_parent.toggle_model_objects_visibility(false, m_model_object, m_active_instance); +} + std::vector GLGizmoHollow::get_config_options(const std::vector& keys) const { std::vector out; @@ -654,6 +695,10 @@ RENDER_AGAIN: if (m_editing_mode) { + if (m_imgui->button(m_desc.at("hollow"))) { + hollow_mesh(m_offset, m_adaptibility); + } + float diameter_upper_cap = static_cast(wxGetApp().preset_bundle->sla_prints.get_edited_preset().config.option("support_pillar_diameter"))->value; if (m_new_point_head_diameter > diameter_upper_cap) m_new_point_head_diameter = diameter_upper_cap; @@ -692,7 +737,11 @@ RENDER_AGAIN: } // !!!! Something as above should be done for the cone angle + m_imgui->text("Hole taper: "); + ImGui::SameLine(); ImGui::SliderFloat(" ", &m_new_cone_angle, -1.f, 1.f, "%.1f"); + m_imgui->text("Hole height: "); + ImGui::SameLine(); ImGui::SliderFloat(" ", &m_new_cone_height, 0.1f, 10.f, "%.1f"); m_imgui->disabled_begin(m_selection_empty); @@ -704,6 +753,14 @@ RENDER_AGAIN: m_imgui->disabled_end(); m_imgui->text(" "); // vertical gap + + + m_imgui->text("Offset: "); + ImGui::SameLine(); + ImGui::SliderFloat(" ", &m_offset, 0.f, 10.f, "%.1f"); + m_imgui->text("Adaptibility: "); + ImGui::SameLine(); + ImGui::SliderFloat(" ", &m_adaptibility, 0.f, 1.f, "%.1f"); } else { // not in editing mode: m_imgui->text(m_desc.at("minimal_distance")); @@ -766,7 +823,7 @@ RENDER_AGAIN: ImGui::SameLine(clipping_slider_left); ImGui::PushItemWidth(window_width - clipping_slider_left); - if (ImGui::SliderFloat(" ", &m_clipping_plane_distance, 0.f, 1.f, "%.2f")) + if (ImGui::SliderFloat(" ", &m_clipping_plane_distance, 0.f, 1.f, "%.2f")) update_clipping_plane(true); @@ -834,6 +891,10 @@ std::string GLGizmoHollow::on_get_name() const } +const TriangleMesh* GLGizmoHollow::mesh() const { + return (! m_mesh ? nullptr : (m_cavity_mesh ? m_cavity_mesh.get() : m_mesh)); +} + void GLGizmoHollow::on_set_state() { @@ -886,6 +947,8 @@ void GLGizmoHollow::on_set_state() m_object_clipper.reset(); m_supports_clipper.reset(); m_mesh_raycaster.reset(); + m_cavity_mesh.reset(); + m_volume_with_cavity.reset(); } } m_old_state = m_state; diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp index 60e2fbf612..82455a9f40 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp @@ -33,6 +33,8 @@ private: GLUquadricObj* m_quadric; std::unique_ptr m_mesh_raycaster; + std::unique_ptr m_cavity_mesh; + std::unique_ptr m_volume_with_cavity; const TriangleMesh* m_mesh; const indexed_triangle_set* m_its; mutable const TriangleMesh* m_supports_mesh; @@ -90,7 +92,9 @@ private: void render_clipping_plane(const Selection& selection) const; bool is_mesh_update_necessary() const; void update_mesh(); + void hollow_mesh(float offset = 2.f, float adaptability = 1.f); bool unsaved_changes() const; + const TriangleMesh* mesh() const; bool m_editing_mode = true; // Is editing mode active? bool m_old_editing_state = false; // To keep track of whether the user toggled between the modes (needed for imgui refreshes). @@ -104,6 +108,9 @@ private: mutable std::vector m_editing_cache; // a support point and whether it is currently selected std::vector m_normal_cache; // to restore after discarding changes or undo/redo + float m_offset = 2.f; + float m_adaptibility = 1.f; + float m_clipping_plane_distance = 0.f; std::unique_ptr m_clipping_plane; diff --git a/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp b/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp index 1f581c9b5b..be200b56d6 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp @@ -415,7 +415,7 @@ bool GLGizmosManager::on_mouse_wheel(wxMouseEvent& evt) { bool processed = false; - if (m_current == SlaSupports) { + if (m_current == SlaSupports || m_current == Hollow) { float rot = (float)evt.GetWheelRotation() / (float)evt.GetWheelDelta(); if (gizmo_event((rot > 0.f ? SLAGizmoEventType::MouseWheelUp : SLAGizmoEventType::MouseWheelDown), Vec2d::Zero(), evt.ShiftDown(), evt.AltDown(), evt.ControlDown())) processed = true; @@ -676,7 +676,7 @@ bool GLGizmosManager::on_char(wxKeyEvent& evt) case 'r' : case 'R' : { - if ((m_current == SlaSupports) && gizmo_event(SLAGizmoEventType::ResetClippingPlane)) + if ((m_current == SlaSupports || m_current == Hollow) && gizmo_event(SLAGizmoEventType::ResetClippingPlane)) processed = true; break; @@ -688,7 +688,7 @@ bool GLGizmosManager::on_char(wxKeyEvent& evt) case WXK_DELETE: #endif /* __APPLE__ */ { - if ((m_current == SlaSupports) && gizmo_event(SLAGizmoEventType::Delete)) + if ((m_current == SlaSupports || m_current == Hollow) && gizmo_event(SLAGizmoEventType::Delete)) processed = true; break; From 07fb9f6559554d089d5c3e7241597a126c330e4b Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Tue, 5 Nov 2019 14:48:00 +0100 Subject: [PATCH 034/336] Add oversampling and gaussian filter to hollowing. * Additional steps hollowing and drilling in SPAPrint * Remove SLABoilerPlate.hpp as it was empty. --- src/libslic3r/CMakeLists.txt | 1 - src/libslic3r/OpenVDBUtils.cpp | 8 +-- src/libslic3r/OpenVDBUtils.hpp | 14 ++--- src/libslic3r/SLA/SLABoilerPlate.hpp | 23 ------- src/libslic3r/SLA/SLABoostAdapter.hpp | 2 +- src/libslic3r/SLA/SLACommon.hpp | 2 + src/libslic3r/SLA/SLAPad.cpp | 2 +- src/libslic3r/SLA/SLARotfinder.cpp | 2 +- src/libslic3r/SLA/SLASupportTree.cpp | 2 +- src/libslic3r/SLA/SLASupportTreeBuilder.hpp | 2 +- src/libslic3r/SLA/SLASupportTreeIGL.cpp | 2 +- src/libslic3r/SLAPrint.cpp | 29 ++++++--- src/libslic3r/SLAPrint.hpp | 2 + tests/libslic3r/test_hollowing.cpp | 68 ++++++++------------- 14 files changed, 66 insertions(+), 93 deletions(-) delete mode 100644 src/libslic3r/SLA/SLABoilerPlate.hpp diff --git a/src/libslic3r/CMakeLists.txt b/src/libslic3r/CMakeLists.txt index 47e49eadb0..1fe6a38519 100644 --- a/src/libslic3r/CMakeLists.txt +++ b/src/libslic3r/CMakeLists.txt @@ -182,7 +182,6 @@ add_library(libslic3r STATIC ${OpenVDBUtils_SOURCES} SLA/SLACommon.hpp SLA/SLACommon.cpp - SLA/SLABoilerPlate.hpp SLA/SLAPad.hpp SLA/SLAPad.cpp SLA/SLASupportTreeBuilder.hpp diff --git a/src/libslic3r/OpenVDBUtils.cpp b/src/libslic3r/OpenVDBUtils.cpp index 9842db2da9..97a57315b6 100644 --- a/src/libslic3r/OpenVDBUtils.cpp +++ b/src/libslic3r/OpenVDBUtils.cpp @@ -51,10 +51,10 @@ void Contour3DDataAdapter::getIndexSpacePoint(size_t n, } openvdb::FloatGrid::Ptr meshToVolume(const TriangleMesh &mesh, + const openvdb::math::Transform &tr, float exteriorBandWidth, float interiorBandWidth, - int flags, - const openvdb::math::Transform &tr) + int flags) { openvdb::initialize(); return openvdb::tools::meshToVolume( @@ -67,10 +67,10 @@ openvdb::FloatGrid::Ptr meshToVolume(const TriangleMesh &mesh, // even if was called previously. openvdb::FloatGrid::Ptr meshToVolume(const sla::Contour3D & mesh, + const openvdb::math::Transform &tr, float exteriorBandWidth, float interiorBandWidth, - int flags, - const openvdb::math::Transform &tr) + int flags) { openvdb::initialize(); return openvdb::tools::meshToVolume( diff --git a/src/libslic3r/OpenVDBUtils.hpp b/src/libslic3r/OpenVDBUtils.hpp index ee740dd06b..eae1e051dc 100644 --- a/src/libslic3r/OpenVDBUtils.hpp +++ b/src/libslic3r/OpenVDBUtils.hpp @@ -2,22 +2,22 @@ #define OPENVDBUTILS_HPP #include -#include +#include #include namespace Slic3r { -openvdb::FloatGrid::Ptr meshToVolume(const TriangleMesh &mesh, +openvdb::FloatGrid::Ptr meshToVolume(const TriangleMesh & mesh, + const openvdb::math::Transform &tr = {}, float exteriorBandWidth = 3.0f, float interiorBandWidth = 3.0f, - int flags = 0, - const openvdb::math::Transform &tr = {}); + int flags = 0); -openvdb::FloatGrid::Ptr meshToVolume(const sla::Contour3D &mesh, +openvdb::FloatGrid::Ptr meshToVolume(const sla::Contour3D & mesh, + const openvdb::math::Transform &tr = {}, float exteriorBandWidth = 3.0f, float interiorBandWidth = 3.0f, - int flags = 0, - const openvdb::math::Transform &tr = {}); + int flags = 0); sla::Contour3D volumeToMesh(const openvdb::FloatGrid &grid, double isovalue = 0.0, diff --git a/src/libslic3r/SLA/SLABoilerPlate.hpp b/src/libslic3r/SLA/SLABoilerPlate.hpp deleted file mode 100644 index 9be91ac1d1..0000000000 --- a/src/libslic3r/SLA/SLABoilerPlate.hpp +++ /dev/null @@ -1,23 +0,0 @@ -#ifndef SLABOILERPLATE_HPP -#define SLABOILERPLATE_HPP - -#include -#include -#include - -#include -#include - -#include "SLACommon.hpp" -#include "SLASpatIndex.hpp" - -namespace Slic3r { - -typedef Eigen::Matrix Vec4i; - -namespace sla { - -} -} - -#endif // SLABOILERPLATE_HPP diff --git a/src/libslic3r/SLA/SLABoostAdapter.hpp b/src/libslic3r/SLA/SLABoostAdapter.hpp index 1e9daf4613..5147929eb8 100644 --- a/src/libslic3r/SLA/SLABoostAdapter.hpp +++ b/src/libslic3r/SLA/SLABoostAdapter.hpp @@ -1,7 +1,7 @@ #ifndef SLABOOSTADAPTER_HPP #define SLABOOSTADAPTER_HPP -#include "SLA/SLABoilerPlate.hpp" +#include "SLA/SLACommon.hpp" #include namespace boost { diff --git a/src/libslic3r/SLA/SLACommon.hpp b/src/libslic3r/SLA/SLACommon.hpp index 7cdc626629..634c5611f4 100644 --- a/src/libslic3r/SLA/SLACommon.hpp +++ b/src/libslic3r/SLA/SLACommon.hpp @@ -3,6 +3,8 @@ #include #include +#include +#include #include #include "SLASpatIndex.hpp" diff --git a/src/libslic3r/SLA/SLAPad.cpp b/src/libslic3r/SLA/SLAPad.cpp index 264cfba9ff..9e5c306d1e 100644 --- a/src/libslic3r/SLA/SLAPad.cpp +++ b/src/libslic3r/SLA/SLAPad.cpp @@ -1,5 +1,5 @@ #include "SLAPad.hpp" -#include "SLABoilerPlate.hpp" +#include "SLACommon.hpp" #include "SLASpatIndex.hpp" #include "ConcaveHull.hpp" diff --git a/src/libslic3r/SLA/SLARotfinder.cpp b/src/libslic3r/SLA/SLARotfinder.cpp index 2e64059d68..5938469ed2 100644 --- a/src/libslic3r/SLA/SLARotfinder.cpp +++ b/src/libslic3r/SLA/SLARotfinder.cpp @@ -2,7 +2,7 @@ #include #include -#include "SLABoilerPlate.hpp" +#include "SLACommon.hpp" #include "SLARotfinder.hpp" #include "SLASupportTree.hpp" #include "Model.hpp" diff --git a/src/libslic3r/SLA/SLASupportTree.cpp b/src/libslic3r/SLA/SLASupportTree.cpp index fea8bf731c..219c4b6588 100644 --- a/src/libslic3r/SLA/SLASupportTree.cpp +++ b/src/libslic3r/SLA/SLASupportTree.cpp @@ -5,7 +5,7 @@ #include #include "SLASupportTree.hpp" -#include "SLABoilerPlate.hpp" +#include "SLACommon.hpp" #include "SLASpatIndex.hpp" #include "SLASupportTreeBuilder.hpp" diff --git a/src/libslic3r/SLA/SLASupportTreeBuilder.hpp b/src/libslic3r/SLA/SLASupportTreeBuilder.hpp index c0d9f04c0f..fec553fe82 100644 --- a/src/libslic3r/SLA/SLASupportTreeBuilder.hpp +++ b/src/libslic3r/SLA/SLASupportTreeBuilder.hpp @@ -2,7 +2,7 @@ #define SUPPORTTREEBUILDER_HPP #include "SLAConcurrency.hpp" -#include "SLABoilerPlate.hpp" +#include "SLACommon.hpp" #include "SLASupportTree.hpp" #include "SLAPad.hpp" #include diff --git a/src/libslic3r/SLA/SLASupportTreeIGL.cpp b/src/libslic3r/SLA/SLASupportTreeIGL.cpp index 5e10c28c91..03d4a563c0 100644 --- a/src/libslic3r/SLA/SLASupportTreeIGL.cpp +++ b/src/libslic3r/SLA/SLASupportTreeIGL.cpp @@ -1,6 +1,6 @@ #include #include "SLA/SLASupportTree.hpp" -#include "SLA/SLABoilerPlate.hpp" +#include "SLA/SLACommon.hpp" #include "SLA/SLASpatIndex.hpp" // Workaround: IGL signed_distance.h will define PI in the igl namespace. diff --git a/src/libslic3r/SLAPrint.cpp b/src/libslic3r/SLAPrint.cpp index 2a1ae74d74..8c03853e3d 100644 --- a/src/libslic3r/SLAPrint.cpp +++ b/src/libslic3r/SLAPrint.cpp @@ -52,7 +52,9 @@ namespace { // should add up to 100 (%) const std::array OBJ_STEP_LEVELS = { - 30, // slaposObjectSlice, + 5, // slaposHollowing, + 20, // slaposObjectSlice, + 5, // slaposDrillHolesIfHollowed 20, // slaposSupportPoints, 10, // slaposSupportTree, 10, // slaposPad, @@ -63,14 +65,17 @@ const std::array OBJ_STEP_LEVELS = std::string OBJ_STEP_LABELS(size_t idx) { switch (idx) { - case slaposObjectSlice: return L("Slicing model"); - case slaposSupportPoints: return L("Generating support points"); - case slaposSupportTree: return L("Generating support tree"); - case slaposPad: return L("Generating pad"); - case slaposSliceSupports: return L("Slicing supports"); + case slaposHollowing: return L("Hollowing out the model"); + case slaposObjectSlice: return L("Slicing model"); + case slaposDrillHolesIfHollowed: return L("Drilling holes into hollowed model."); + case slaposSupportPoints: return L("Generating support points"); + case slaposSupportTree: return L("Generating support tree"); + case slaposPad: return L("Generating pad"); + case slaposSliceSupports: return L("Slicing supports"); default:; } - assert(false); return "Out of bounds!"; + assert(false); + return "Out of bounds!"; }; // Should also add up to 100 (%) @@ -1460,7 +1465,7 @@ void SLAPrint::process() slaposFn pobj_program[] = { - slice_model, support_points, support_tree, generate_pad, slice_supports + [](SLAPrintObject&){}, slice_model, [](SLAPrintObject&){}, support_points, support_tree, generate_pad, slice_supports }; // We want to first process all objects... @@ -1760,8 +1765,14 @@ bool SLAPrintObject::invalidate_step(SLAPrintObjectStep step) { bool invalidated = Inherited::invalidate_step(step); // propagate to dependent steps - if (step == slaposObjectSlice) { + if (step == slaposHollowing) { invalidated |= this->invalidate_all_steps(); + } else if (step == slaposObjectSlice) { + invalidated |= this->invalidate_steps({ slaposDrillHolesIfHollowed, slaposSupportPoints, slaposSupportTree, slaposPad, slaposSliceSupports }); + invalidated |= m_print->invalidate_step(slapsMergeSlicesAndEval); + } else if (step == slaposDrillHolesIfHollowed) { + invalidated |= this->invalidate_steps({ slaposSupportPoints, slaposSupportTree, slaposPad, slaposSliceSupports }); + invalidated |= m_print->invalidate_step(slapsMergeSlicesAndEval); } else if (step == slaposSupportPoints) { invalidated |= this->invalidate_steps({ slaposSupportTree, slaposPad, slaposSliceSupports }); invalidated |= m_print->invalidate_step(slapsMergeSlicesAndEval); diff --git a/src/libslic3r/SLAPrint.hpp b/src/libslic3r/SLAPrint.hpp index 2dc2a9040a..38e3737754 100644 --- a/src/libslic3r/SLAPrint.hpp +++ b/src/libslic3r/SLAPrint.hpp @@ -18,7 +18,9 @@ enum SLAPrintStep : unsigned int { }; enum SLAPrintObjectStep : unsigned int { + slaposHollowing, slaposObjectSlice, + slaposDrillHolesIfHollowed, slaposSupportPoints, slaposSupportTree, slaposPad, diff --git a/tests/libslic3r/test_hollowing.cpp b/tests/libslic3r/test_hollowing.cpp index b74eb76aba..4b7465a3da 100644 --- a/tests/libslic3r/test_hollowing.cpp +++ b/tests/libslic3r/test_hollowing.cpp @@ -3,8 +3,11 @@ #include #include "libslic3r/OpenVDBUtils.hpp" +#include #include "libslic3r/Format/OBJ.hpp" +#include + #if defined(WIN32) || defined(_WIN32) #define PATH_SEPARATOR R"(\)" #else @@ -19,60 +22,39 @@ static Slic3r::TriangleMesh load_model(const std::string &obj_filename) return mesh; } -static bool _check_normals(const Slic3r::sla::Contour3D &mesh) -{ - for (auto & face : mesh.faces3) - { - - } - - return false; -} - -TEST_CASE("Passing OpenVDB grid conversion produce similar geometry.", "[Hollowing]") +TEST_CASE("Negative 3D offset should produce smaller object.", "[Hollowing]") { Slic3r::TriangleMesh in_mesh = load_model("20mm_cube.obj"); + in_mesh.scale(3.); Slic3r::sla::Contour3D imesh = Slic3r::sla::Contour3D{in_mesh}; - auto ptr = Slic3r::meshToVolume(imesh, {}); + + Benchmark bench; + bench.start(); + + openvdb::math::Transform tr; + auto ptr = Slic3r::meshToVolume(imesh, {}, 0.0f, 10.0f); REQUIRE(ptr); - std::cout << "Grid class = " << ptr->getGridClass() << std::endl; + openvdb::tools::Filter{*ptr}.gaussian(1, 3); - Slic3r::sla::Contour3D omesh = Slic3r::volumeToMesh(*ptr, -2.9, 1.0, true); - std::cout << "Triangle count: " << omesh.faces3.size() << std::endl; - std::cout << "Quad count: " << omesh.faces4.size() << std::endl; + double iso_surface = -3.0; + double adaptivity = 0.5; + Slic3r::sla::Contour3D omesh = Slic3r::volumeToMesh(*ptr, iso_surface, adaptivity); REQUIRE(!omesh.empty()); - SECTION("Converting to Contour3D to TriangleMesh") { - Slic3r::TriangleMesh msh = Slic3r::sla::to_triangle_mesh(omesh); - - msh.require_shared_vertices(); - msh.WriteOBJFile("out_tr.obj"); - - REQUIRE(msh.volume() == Approx(in_mesh.volume())); - } + imesh.merge(omesh); -// omesh.faces4.clear(); - std::fstream outfile{"out.obj", std::ios::out}; + for (auto &p : imesh.points) p /= 3.; + + bench.stop(); + + std::cout << "Elapsed processing time: " << bench.getElapsedSec() << std::endl; + std::fstream merged_outfile("merged_out.obj", std::ios::out); + imesh.to_obj(merged_outfile); + + std::fstream outfile("out.obj", std::ios::out); omesh.to_obj(outfile); - } - -//TEST_CASE("Negative 3D offset should produce smaller object.", "[Hollowing]") -//{ -// Slic3r::sla::Contour3D imesh = Slic3r::sla::Contour3D{load_model("20mm_cube.obj")}; -// auto ptr = Slic3r::meshToVolume(imesh, {}); - -// REQUIRE(ptr); - -// Slic3r::sla::Contour3D omesh = Slic3r::volumeToMesh(*ptr, -1., 0.0, true); - -// REQUIRE(!omesh.empty()); - -// imesh.merge(omesh); -// std::fstream merged_outfile("merged_out.obj", std::ios::out); -// imesh.to_obj(merged_outfile); -//} From f913be2d93ff69c0fdf2f6db36cb735ed7f48fb3 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Tue, 5 Nov 2019 17:00:11 +0100 Subject: [PATCH 035/336] Streamlined hollowing method. --- tests/libslic3r/test_hollowing.cpp | 43 +++++++++++++++++------------- 1 file changed, 25 insertions(+), 18 deletions(-) diff --git a/tests/libslic3r/test_hollowing.cpp b/tests/libslic3r/test_hollowing.cpp index 4b7465a3da..8f57828a10 100644 --- a/tests/libslic3r/test_hollowing.cpp +++ b/tests/libslic3r/test_hollowing.cpp @@ -22,39 +22,46 @@ static Slic3r::TriangleMesh load_model(const std::string &obj_filename) return mesh; } -TEST_CASE("Negative 3D offset should produce smaller object.", "[Hollowing]") +static Slic3r::TriangleMesh hollowed_interior(const Slic3r::TriangleMesh &mesh, + double min_thickness) { - Slic3r::TriangleMesh in_mesh = load_model("20mm_cube.obj"); - in_mesh.scale(3.); - Slic3r::sla::Contour3D imesh = Slic3r::sla::Contour3D{in_mesh}; + Slic3r::sla::Contour3D imesh = Slic3r::sla::Contour3D{mesh}; - Benchmark bench; - bench.start(); + double scale = std::max(1.0, 3. / min_thickness); + double offset = scale * min_thickness; + float range = float(std::max(2 * offset, scale)); - openvdb::math::Transform tr; - auto ptr = Slic3r::meshToVolume(imesh, {}, 0.0f, 10.0f); + for (auto &p : imesh.points) p *= scale; + auto ptr = Slic3r::meshToVolume(imesh, {}, 0.1f * float(offset), range); REQUIRE(ptr); - openvdb::tools::Filter{*ptr}.gaussian(1, 3); + openvdb::tools::Filter{*ptr}.gaussian(int(scale), 1); - - double iso_surface = -3.0; - double adaptivity = 0.5; + double iso_surface = -offset; + double adaptivity = 0.; Slic3r::sla::Contour3D omesh = Slic3r::volumeToMesh(*ptr, iso_surface, adaptivity); REQUIRE(!omesh.empty()); - imesh.merge(omesh); + for (auto &p : omesh.points) p /= scale; - for (auto &p : imesh.points) p /= 3.; + return to_triangle_mesh(omesh); +} + +TEST_CASE("Negative 3D offset should produce smaller object.", "[Hollowing]") +{ + Slic3r::TriangleMesh in_mesh = load_model("20mm_cube.obj"); + Benchmark bench; + bench.start(); + + Slic3r::TriangleMesh out_mesh = hollowed_interior(in_mesh, 2); bench.stop(); std::cout << "Elapsed processing time: " << bench.getElapsedSec() << std::endl; - std::fstream merged_outfile("merged_out.obj", std::ios::out); - imesh.to_obj(merged_outfile); - std::fstream outfile("out.obj", std::ios::out); - omesh.to_obj(outfile); + in_mesh.merge(out_mesh); + in_mesh.require_shared_vertices(); + in_mesh.WriteOBJFile("merged_out.obj"); } From bdf6f7342ef539a3f198aa0446311b3add9bd820 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Wed, 6 Nov 2019 13:38:43 +0100 Subject: [PATCH 036/336] Hollowing step in SLAPrint process, PrintConfig params added. --- resources/icons/hollowing.svg | 25 +++++ resources/icons/white/hollowing.svg | 25 +++++ src/libslic3r/Model.cpp | 7 +- src/libslic3r/OpenVDBUtils.cpp | 122 ++++++++++++++++++++---- src/libslic3r/OpenVDBUtils.hpp | 23 +++-- src/libslic3r/PrintConfig.cpp | 16 ++++ src/libslic3r/PrintConfig.hpp | 22 ++++- src/libslic3r/SLAPrint.cpp | 56 ++++++++++- src/libslic3r/SLAPrint.hpp | 10 +- src/slic3r/GUI/GUI_ObjectList.cpp | 1 + src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp | 22 +++-- src/slic3r/GUI/Preset.cpp | 2 + src/slic3r/GUI/Tab.cpp | 5 + tests/libslic3r/test_hollowing.cpp | 40 ++++---- 14 files changed, 311 insertions(+), 65 deletions(-) create mode 100644 resources/icons/hollowing.svg create mode 100644 resources/icons/white/hollowing.svg diff --git a/resources/icons/hollowing.svg b/resources/icons/hollowing.svg new file mode 100644 index 0000000000..65c7592c83 --- /dev/null +++ b/resources/icons/hollowing.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/icons/white/hollowing.svg b/resources/icons/white/hollowing.svg new file mode 100644 index 0000000000..65c7592c83 --- /dev/null +++ b/resources/icons/white/hollowing.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/libslic3r/Model.cpp b/src/libslic3r/Model.cpp index 061c5bd50a..607f11bc65 100644 --- a/src/libslic3r/Model.cpp +++ b/src/libslic3r/Model.cpp @@ -1142,7 +1142,8 @@ ModelObjectPtrs ModelObject::cut(size_t instance, coordf_t z, bool keep_upper, b if (keep_upper) { upper->add_volume(*volume); } if (keep_lower) { lower->add_volume(*volume); } } - else { + else if (! volume->mesh().empty()) { + TriangleMesh upper_mesh, lower_mesh; // Transform the mesh by the combined transformation matrix. @@ -1150,7 +1151,9 @@ ModelObjectPtrs ModelObject::cut(size_t instance, coordf_t z, bool keep_upper, b TriangleMesh mesh(volume->mesh()); mesh.transform(instance_matrix * volume_matrix, true); volume->reset_mesh(); - + + mesh.require_shared_vertices(); + // Perform cut TriangleMeshSlicer tms(&mesh); tms.cut(float(z), &upper_mesh, &lower_mesh); diff --git a/src/libslic3r/OpenVDBUtils.cpp b/src/libslic3r/OpenVDBUtils.cpp index 97a57315b6..08c69bdb5d 100644 --- a/src/libslic3r/OpenVDBUtils.cpp +++ b/src/libslic3r/OpenVDBUtils.cpp @@ -2,6 +2,9 @@ #include "OpenVDBUtils.hpp" #include #include +#include +#include +#include "MTUtils.hpp" namespace Slic3r { @@ -50,6 +53,11 @@ void Contour3DDataAdapter::getIndexSpacePoint(size_t n, pos = {p.x(), p.y(), p.z()}; } + +// TODO: Do I need to call initialize? Seems to work without it as well but the +// docs say it should be called ones. It does a mutex lock-unlock sequence all +// even if was called previously. + openvdb::FloatGrid::Ptr meshToVolume(const TriangleMesh &mesh, const openvdb::math::Transform &tr, float exteriorBandWidth, @@ -62,11 +70,7 @@ openvdb::FloatGrid::Ptr meshToVolume(const TriangleMesh &mesh, interiorBandWidth, flags); } -// TODO: Do I need to call initialize? Seems to work without it as well but the -// docs say it should be called ones. It does a mutex lock-unlock sequence all -// even if was called previously. - -openvdb::FloatGrid::Ptr meshToVolume(const sla::Contour3D & mesh, +static openvdb::FloatGrid::Ptr meshToVolume(const sla::Contour3D &mesh, const openvdb::math::Transform &tr, float exteriorBandWidth, float interiorBandWidth, @@ -84,10 +88,10 @@ inline Vec3i to_vec3i(const openvdb::Vec3I &v) { return Vec3i{int(v[0]), int(v[1 inline Vec4i to_vec4i(const openvdb::Vec4I &v) { return Vec4i{int(v[0]), int(v[1]), int(v[2]), int(v[3])}; } template -sla::Contour3D _volumeToMesh(const Grid &grid, - double isovalue, - double adaptivity, - bool relaxDisorientedTriangles) +sla::Contour3D __volumeToMesh(const Grid &grid, + double isovalue, + double adaptivity, + bool relaxDisorientedTriangles) { openvdb::initialize(); @@ -102,20 +106,106 @@ sla::Contour3D _volumeToMesh(const Grid &grid, ret.points.reserve(points.size()); ret.faces3.reserve(triangles.size()); ret.faces4.reserve(quads.size()); - + for (auto &v : points) ret.points.emplace_back(to_vec3d(v)); for (auto &v : triangles) ret.faces3.emplace_back(to_vec3i(v)); for (auto &v : quads) ret.faces4.emplace_back(to_vec4i(v)); - + return ret; } -sla::Contour3D volumeToMesh(const openvdb::FloatGrid &grid, - double isovalue, - double adaptivity, - bool relaxDisorientedTriangles) +template inline +Mesh _volumeToMesh(const openvdb::FloatGrid &grid, + double isovalue = 0.0, + double adaptivity = 0.0, + bool relaxDisorientedTriangles = true); + +template<> inline +TriangleMesh _volumeToMesh(const openvdb::FloatGrid &grid, + double isovalue, + double adaptivity, + bool relaxDisorientedTriangles) { - return _volumeToMesh(grid, isovalue, adaptivity, relaxDisorientedTriangles); + return to_triangle_mesh(__volumeToMesh(grid, isovalue, adaptivity, + relaxDisorientedTriangles)); +} + +template<> inline +sla::Contour3D _volumeToMesh(const openvdb::FloatGrid &grid, + double isovalue, + double adaptivity, + bool relaxDisorientedTriangles) +{ + return __volumeToMesh(grid, isovalue, adaptivity, + relaxDisorientedTriangles); +} + +TriangleMesh volumeToMesh(const openvdb::FloatGrid &grid, + double isovalue, + double adaptivity, + bool relaxDisorientedTriangles) +{ + return _volumeToMesh(grid, isovalue, adaptivity, + relaxDisorientedTriangles); +} + +template> +inline void _scale(S s, TriangleMesh &m) { m.scale(float(s)); } + +template> +inline void _scale(S s, sla::Contour3D &m) +{ + for (auto &p : m.points) p *= s; +} + +template +remove_cvref_t _hollowed_interior(Mesh &&mesh, + double min_thickness, + int oversampling, + double smoothing) +{ + using MMesh = remove_cvref_t; + MMesh imesh{std::forward(mesh)}; + + // I can't figure out how to increase the grid resolution through openvdb API + // so the model will be scaled up before conversion and the result scaled + // down. Voxels have a unit size. If I set voxelSize smaller, it scales + // the whole geometry down, and doesn't increase the number of voxels. + auto scale = double(oversampling); + + _scale(scale, imesh); + + double offset = scale * min_thickness; + float range = float(std::max(2 * offset, scale)); + auto gridptr = meshToVolume(imesh, {}, 0.1f * float(offset), range); + + assert(gridptr); + + if (!gridptr) { + BOOST_LOG_TRIVIAL(error) << "Returned OpenVDB grid is NULL"; + return MMesh{}; + } + + // Filtering: + int width = int(smoothing * scale); + int count = 1; + openvdb::tools::Filter{*gridptr}.gaussian(width, count); + + double iso_surface = -offset; + double adaptivity = 0.; + auto omesh = _volumeToMesh(*gridptr, iso_surface, adaptivity); + + _scale(1. / scale, omesh); + + return omesh; +} + +TriangleMesh hollowed_interior(const TriangleMesh &mesh, + double min_thickness, + int oversampling, + double smoothing) +{ + return _hollowed_interior(mesh, min_thickness, oversampling, smoothing); } } // namespace Slic3r diff --git a/src/libslic3r/OpenVDBUtils.hpp b/src/libslic3r/OpenVDBUtils.hpp index eae1e051dc..8e55300bd2 100644 --- a/src/libslic3r/OpenVDBUtils.hpp +++ b/src/libslic3r/OpenVDBUtils.hpp @@ -13,16 +13,21 @@ openvdb::FloatGrid::Ptr meshToVolume(const TriangleMesh & mesh, float interiorBandWidth = 3.0f, int flags = 0); -openvdb::FloatGrid::Ptr meshToVolume(const sla::Contour3D & mesh, - const openvdb::math::Transform &tr = {}, - float exteriorBandWidth = 3.0f, - float interiorBandWidth = 3.0f, - int flags = 0); +TriangleMesh volumeToMesh(const openvdb::FloatGrid &grid, + double isovalue = 0.0, + double adaptivity = 0.0, + bool relaxDisorientedTriangles = true); -sla::Contour3D volumeToMesh(const openvdb::FloatGrid &grid, - double isovalue = 0.0, - double adaptivity = 0.0, - bool relaxDisorientedTriangles = true); +sla::Contour3D hollowed_interior(sla::Contour3D&& mesh, double min_thickness); +sla::Contour3D hollowed_interior(sla::Contour3D& mesh, double min_thickness); + +// Generate an interior for any solid geometry maintaining a given minimum +// wall thickness. The returned mesh has triangles with normals facing inside +// the mesh so the result can be directly merged with the input to finish the +// hollowing. +// TODO: The thicknes is not strictly maintained due to the used gaussian filter +TriangleMesh hollowed_interior(const TriangleMesh &mesh, double min_thickness, + int oversampling = 3, double smoothing = 0.5); } // namespace Slic3r diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index e639a6734d..4cfd81bc55 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -2830,6 +2830,22 @@ void PrintConfigDef::init_sla_params() def->min = 0; def->mode = comExpert; def->set_default_value(new ConfigOptionFloat(0.3)); + + def = this->add("hollowing_enable", coBool); + def->label = L("Enable hollowing"); + def->category = L("Hollowing"); + def->tooltip = L("Hollow out a model to have an empty interior"); + def->mode = comSimple; + def->set_default_value(new ConfigOptionBool(false)); + + def = this->add("hollowing_min_thickness", coFloat); + def->label = L("Hollowing thickness"); + def->category = L("Hollowing"); + def->tooltip = L("Minimum wall thickness of a hollowed model."); + def->sidetext = L("mm"); + def->min = 1; + def->mode = comSimple; + def->set_default_value(new ConfigOptionFloat(4)); } void PrintConfigDef::handle_legacy(t_config_option_key &opt_key, std::string &value) diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index 4b007fc51c..6bcc3f9ad2 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -1014,7 +1014,7 @@ public: ConfigOptionFloat support_base_height /*= 1.0*/; // The minimum distance of the pillar base from the model in mm. - ConfigOptionFloat support_base_safety_distance; /*= 1.0*/; + ConfigOptionFloat support_base_safety_distance; /*= 1.0*/ // The default angle for connecting support sticks and junctions. ConfigOptionFloat support_critical_angle /*= 45*/; @@ -1059,7 +1059,7 @@ public: // ///////////////////////////////////////////////////////////////////////// // Zero elevation mode parameters: - // - The object pad will be derived from the the model geometry. + // - The object pad will be derived from the model geometry. // - There will be a gap between the object pad and the generated pad // according to the support_base_safety_distance parameter. // - The two pads will be connected with tiny connector sticks @@ -1081,6 +1081,22 @@ public: // How much should the tiny connectors penetrate into the model body ConfigOptionFloat pad_object_connector_penetration; + + // ///////////////////////////////////////////////////////////////////////// + // Model hollowing parameters: + // - Models can be hollowed out as part of the SLA print process + // - Thickness of the hollowed model walls can be adjusted + // - + // - Additional holes will be drilled into the hollow model to allow for + // - resin removal. + // ///////////////////////////////////////////////////////////////////////// + + ConfigOptionBool hollowing_enable; + + // The minimum thickness of the model walls to maintain. Note that the + // resulting walls may be thicker due to smoothing out fine cavities where + // resin could stuck. + ConfigOptionFloat hollowing_min_thickness; protected: void initialize(StaticCacheBase &cache, const char *base_ptr) @@ -1118,6 +1134,8 @@ protected: OPT_PTR(pad_object_connector_stride); OPT_PTR(pad_object_connector_width); OPT_PTR(pad_object_connector_penetration); + OPT_PTR(hollowing_enable); + OPT_PTR(hollowing_min_thickness); } }; diff --git a/src/libslic3r/SLAPrint.cpp b/src/libslic3r/SLAPrint.cpp index 8c03853e3d..0f5cb20b8c 100644 --- a/src/libslic3r/SLAPrint.cpp +++ b/src/libslic3r/SLAPrint.cpp @@ -3,6 +3,7 @@ #include "SLA/SLAPad.hpp" #include "SLA/SLAAutoSupports.hpp" #include "ClipperUtils.hpp" +#include "OpenVDBUtils.hpp" #include "Geometry.hpp" #include "MTUtils.hpp" @@ -47,6 +48,14 @@ public: } }; +class SLAPrintObject::HollowingData +{ +public: + + TriangleMesh interior; + // std::vector +}; + namespace { // should add up to 100 (%) @@ -752,6 +761,28 @@ void SLAPrint::process() // the coefficient that multiplies the per object status values which // are set up for <0, 100>. They need to be scaled into the whole process const double ostepd = (max_objstatus - min_objstatus) / (objcount * 100.0); + + auto hollow_model = [](SLAPrintObject &po) { + + if (!po.m_config.hollowing_enable.getBool()) { + BOOST_LOG_TRIVIAL(info) << "Skipping hollowing step!"; + po.m_hollowing_data.reset(); + return; + } else { + BOOST_LOG_TRIVIAL(info) << "Performing hollowing step!"; + } + + if (!po.m_hollowing_data) + po.m_hollowing_data.reset(new SLAPrintObject::HollowingData()); + + double thickness = po.m_config.hollowing_min_thickness.getFloat(); + + po.m_hollowing_data->interior = + hollowed_interior(po.transformed_mesh(), thickness, 4, 0.5); + + if (po.m_hollowing_data->interior.empty()) + BOOST_LOG_TRIVIAL(warning) << "Hollowed interior is empty!"; + }; // The slicing will be performed on an imaginary 1D grid which starts from // the bottom of the bounding box created around the supported model. So @@ -765,7 +796,20 @@ void SLAPrint::process() // Slicing the model object. This method is oversimplified and needs to // be compared with the fff slicing algorithm for verification auto slice_model = [this, ilhs, ilh](SLAPrintObject& po) { - const TriangleMesh& mesh = po.transformed_mesh(); + + TriangleMesh hollowed_mesh; + + bool is_hollowing = po.m_config.hollowing_enable.getBool() && + po.m_hollowing_data; + + if (is_hollowing) { + hollowed_mesh = po.transformed_mesh(); + hollowed_mesh.merge(po.m_hollowing_data->interior); + hollowed_mesh.require_shared_vertices(); + } + + const TriangleMesh &mesh = is_hollowing ? hollowed_mesh : + po.transformed_mesh(); // We need to prepare the slice index... @@ -1465,12 +1509,12 @@ void SLAPrint::process() slaposFn pobj_program[] = { - [](SLAPrintObject&){}, slice_model, [](SLAPrintObject&){}, support_points, support_tree, generate_pad, slice_supports + hollow_model, slice_model, [](SLAPrintObject&){}, support_points, support_tree, generate_pad, slice_supports }; // We want to first process all objects... std::vector level1_obj_steps = { - slaposObjectSlice, slaposSupportPoints, slaposSupportTree, slaposPad + slaposHollowing, slaposObjectSlice, slaposSupportPoints, slaposSupportTree, slaposPad }; // and then slice all supports to allow preview to be displayed ASAP @@ -1707,7 +1751,11 @@ bool SLAPrintObject::invalidate_state_by_config_options(const std::vector steps; bool invalidated = false; for (const t_config_option_key &opt_key : opt_keys) { - if ( opt_key == "layer_height" + if ( opt_key == "hollowing_enable" + || opt_key == "hollowing_min_thickness") { + steps.emplace_back(slaposHollowing); + } else if ( + opt_key == "layer_height" || opt_key == "faded_layers" || opt_key == "pad_enable" || opt_key == "pad_wall_thickness" diff --git a/src/libslic3r/SLAPrint.hpp b/src/libslic3r/SLAPrint.hpp index 38e3737754..1b8b126e23 100644 --- a/src/libslic3r/SLAPrint.hpp +++ b/src/libslic3r/SLAPrint.hpp @@ -74,8 +74,11 @@ public: // Support mesh is only valid if this->is_step_done(slaposSupportTree) is true. const TriangleMesh& support_mesh() const; // Get a pad mesh centered around origin in XY, and with zero rotation around Z applied. - // Support mesh is only valid if this->is_step_done(slaposBasePool) is true. + // Support mesh is only valid if this->is_step_done(slaposPad) is true. const TriangleMesh& pad_mesh() const; + + // Ready after this->is_step_done(slaposHollowing) is true + const TriangleMesh& hollowed_interior_mesh() const; // This will return the transformed mesh which is cached const TriangleMesh& transformed_mesh() const; @@ -288,9 +291,12 @@ private: // Caching the transformed (m_trafo) raw mesh of the object mutable CachedObject m_transformed_rmesh; - + class SupportData; std::unique_ptr m_supportdata; + + class HollowingData; + std::unique_ptr m_hollowing_data; }; using PrintObjects = std::vector; diff --git a/src/slic3r/GUI/GUI_ObjectList.cpp b/src/slic3r/GUI/GUI_ObjectList.cpp index a88980a8d4..45d55c0b94 100644 --- a/src/slic3r/GUI/GUI_ObjectList.cpp +++ b/src/slic3r/GUI/GUI_ObjectList.cpp @@ -98,6 +98,7 @@ ObjectList::ObjectList(wxWindow* parent) : // ptSLA CATEGORY_ICON[L("Supports")] = create_scaled_bitmap(nullptr, "support"/*"sla_supports"*/); CATEGORY_ICON[L("Pad")] = create_scaled_bitmap(nullptr, "pad"); + CATEGORY_ICON[L("Hollowing")] = create_scaled_bitmap(nullptr, "hollowing"); } // create control diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp index 5b6620ef68..34173366d2 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp @@ -597,16 +597,20 @@ void GLGizmoHollow::on_update(const UpdateData& data) void GLGizmoHollow::hollow_mesh(float offset, float adaptibility) { - Slic3r::sla::Contour3D imesh{*m_mesh}; - auto ptr = meshToVolume(imesh, {}); - sla::Contour3D omesh = volumeToMesh(*ptr, -offset, adaptibility, true); +// Slic3r::sla::Contour3D imesh{*m_mesh}; +// auto ptr = meshToVolume(imesh, {}); +// sla::Contour3D omesh = volumeToMesh(*ptr, -offset, adaptibility, true); - if (omesh.empty()) +// if (omesh.empty()) +// return; + +// imesh.merge(omesh); + TriangleMesh cavity = hollowed_interior(*m_mesh, double(offset), int(adaptibility)); + if (cavity.empty()) return; - - imesh.merge(omesh); - m_cavity_mesh.reset(new TriangleMesh); - *m_cavity_mesh = sla::to_triangle_mesh(imesh); + + m_cavity_mesh.reset(new TriangleMesh(cavity)); + m_cavity_mesh->merge(*m_mesh); m_cavity_mesh.get()->require_shared_vertices(); m_mesh_raycaster.reset(new MeshRaycaster(*m_cavity_mesh.get())); m_object_clipper.reset(); @@ -616,7 +620,7 @@ void GLGizmoHollow::hollow_mesh(float offset, float adaptibility) m_volume_with_cavity->indexed_vertex_array.load_mesh(*m_cavity_mesh.get()); m_volume_with_cavity->finalize_geometry(true); m_volume_with_cavity->set_volume_transformation(m_model_object->volumes.front()->get_transformation()); - m_volume_with_cavity->set_instance_transformation(m_model_object->instances[m_active_instance]->get_transformation()); + m_volume_with_cavity->set_instance_transformation(m_model_object->instances[size_t(m_active_instance)]->get_transformation()); m_parent.toggle_model_objects_visibility(false, m_model_object, m_active_instance); } diff --git a/src/slic3r/GUI/Preset.cpp b/src/slic3r/GUI/Preset.cpp index a360aaf1a0..edbb5fb750 100644 --- a/src/slic3r/GUI/Preset.cpp +++ b/src/slic3r/GUI/Preset.cpp @@ -496,6 +496,8 @@ const std::vector& Preset::sla_print_options() "pad_object_connector_stride", "pad_object_connector_width", "pad_object_connector_penetration", + "hollowing_enable", + "hollowing_min_thickness", "output_filename_format", "default_sla_print_profile", "compatible_printers", diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index c2a258e69b..22c4bfb9bf 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -3563,6 +3563,11 @@ void TabSLAPrint::build() optgroup->append_single_option_line("pad_object_connector_stride"); optgroup->append_single_option_line("pad_object_connector_width"); optgroup->append_single_option_line("pad_object_connector_penetration"); + + page = add_options_page(_(L("Hollowing")), "hollowing"); + optgroup = page->new_optgroup(_(L("Hollowing"))); + optgroup->append_single_option_line("hollowing_enable"); + optgroup->append_single_option_line("hollowing_min_thickness"); page = add_options_page(_(L("Advanced")), "wrench"); optgroup = page->new_optgroup(_(L("Slicing"))); diff --git a/tests/libslic3r/test_hollowing.cpp b/tests/libslic3r/test_hollowing.cpp index 8f57828a10..b463fd863e 100644 --- a/tests/libslic3r/test_hollowing.cpp +++ b/tests/libslic3r/test_hollowing.cpp @@ -22,40 +22,38 @@ static Slic3r::TriangleMesh load_model(const std::string &obj_filename) return mesh; } -static Slic3r::TriangleMesh hollowed_interior(const Slic3r::TriangleMesh &mesh, - double min_thickness) -{ - Slic3r::sla::Contour3D imesh = Slic3r::sla::Contour3D{mesh}; +//static Slic3r::TriangleMesh hollowed_interior(const Slic3r::TriangleMesh &mesh, +// double min_thickness) +//{ +// Slic3r::sla::Contour3D imesh = Slic3r::sla::Contour3D{mesh}; - double scale = std::max(1.0, 3. / min_thickness); - double offset = scale * min_thickness; - float range = float(std::max(2 * offset, scale)); +// double scale = std::max(1.0, 3. / min_thickness); +// double offset = scale * min_thickness; +// float range = float(std::max(2 * offset, scale)); - for (auto &p : imesh.points) p *= scale; - auto ptr = Slic3r::meshToVolume(imesh, {}, 0.1f * float(offset), range); +// for (auto &p : imesh.points) p *= scale; +// auto ptr = Slic3r::meshToVolume(imesh, {}, 0.1f * float(offset), range); - REQUIRE(ptr); +// REQUIRE(ptr); - openvdb::tools::Filter{*ptr}.gaussian(int(scale), 1); +// openvdb::tools::Filter{*ptr}.gaussian(int(scale), 1); - double iso_surface = -offset; - double adaptivity = 0.; - Slic3r::sla::Contour3D omesh = Slic3r::volumeToMesh(*ptr, iso_surface, adaptivity); +// double iso_surface = -offset; +// double adaptivity = 0.; +// Slic3r::sla::Contour3D omesh = Slic3r::volumeToMesh(*ptr, iso_surface, adaptivity); - REQUIRE(!omesh.empty()); +// for (auto &p : omesh.points) p /= scale; - for (auto &p : omesh.points) p /= scale; - - return to_triangle_mesh(omesh); -} +// return to_triangle_mesh(omesh); +//} TEST_CASE("Negative 3D offset should produce smaller object.", "[Hollowing]") { - Slic3r::TriangleMesh in_mesh = load_model("20mm_cube.obj"); + Slic3r::TriangleMesh in_mesh = load_model("zaba.obj"); Benchmark bench; bench.start(); - Slic3r::TriangleMesh out_mesh = hollowed_interior(in_mesh, 2); + Slic3r::TriangleMesh out_mesh = hollowed_interior(in_mesh, 0.5); bench.stop(); From a82f1268f328b3c38c049896cadde2a551dc2871 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Wed, 6 Nov 2019 14:25:03 +0100 Subject: [PATCH 037/336] Hollowed interior is now visible in preview --- src/libslic3r/SLAPrint.cpp | 8 ++++++++ src/slic3r/GUI/GLCanvas3D.cpp | 2 ++ src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp | 17 +++-------------- src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp | 3 +-- tests/libslic3r/test_hollowing.cpp | 2 +- 5 files changed, 15 insertions(+), 17 deletions(-) diff --git a/src/libslic3r/SLAPrint.cpp b/src/libslic3r/SLAPrint.cpp index 0f5cb20b8c..2e8a704005 100644 --- a/src/libslic3r/SLAPrint.cpp +++ b/src/libslic3r/SLAPrint.cpp @@ -1975,6 +1975,14 @@ const TriangleMesh& SLAPrintObject::pad_mesh() const return EMPTY_MESH; } +const TriangleMesh &SLAPrintObject::hollowed_interior_mesh() const +{ + if (m_hollowing_data && m_config.hollowing_enable.getBool()) + return m_hollowing_data->interior; + + return EMPTY_MESH; +} + const TriangleMesh &SLAPrintObject::transformed_mesh() const { // we need to transform the raw mesh... // currently all the instances share the same x and y rotation and scaling diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 268b4dc30b..52d1df3179 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -5362,6 +5362,8 @@ void GLCanvas3D::_load_sla_shells() unsigned int initial_volumes_count = (unsigned int)m_volumes.volumes.size(); for (const SLAPrintObject::Instance& instance : obj->instances()) { add_volume(*obj, 0, instance, obj->transformed_mesh(), GLVolume::MODEL_COLOR[0], true); + if (! obj->hollowed_interior_mesh().empty()) + add_volume(*obj, -int(slaposHollowing), instance, obj->hollowed_interior_mesh(), GLVolume::MODEL_COLOR[0], false); // Set the extruder_id and volume_id to achieve the same color as in the 3D scene when // through the update_volumes_colors_by_extruder() call. m_volumes.volumes.back()->extruder_id = obj->model_object()->volumes.front()->extruder_id(); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp index 34173366d2..2c3620dd7b 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp @@ -595,17 +595,9 @@ void GLGizmoHollow::on_update(const UpdateData& data) } -void GLGizmoHollow::hollow_mesh(float offset, float adaptibility) +void GLGizmoHollow::hollow_mesh(float offset) { -// Slic3r::sla::Contour3D imesh{*m_mesh}; -// auto ptr = meshToVolume(imesh, {}); -// sla::Contour3D omesh = volumeToMesh(*ptr, -offset, adaptibility, true); - -// if (omesh.empty()) -// return; - -// imesh.merge(omesh); - TriangleMesh cavity = hollowed_interior(*m_mesh, double(offset), int(adaptibility)); + TriangleMesh cavity = hollowed_interior(*m_mesh, double(offset)); if (cavity.empty()) return; @@ -700,7 +692,7 @@ RENDER_AGAIN: if (m_editing_mode) { if (m_imgui->button(m_desc.at("hollow"))) { - hollow_mesh(m_offset, m_adaptibility); + hollow_mesh(m_offset); } float diameter_upper_cap = static_cast(wxGetApp().preset_bundle->sla_prints.get_edited_preset().config.option("support_pillar_diameter"))->value; @@ -762,9 +754,6 @@ RENDER_AGAIN: m_imgui->text("Offset: "); ImGui::SameLine(); ImGui::SliderFloat(" ", &m_offset, 0.f, 10.f, "%.1f"); - m_imgui->text("Adaptibility: "); - ImGui::SameLine(); - ImGui::SliderFloat(" ", &m_adaptibility, 0.f, 1.f, "%.1f"); } else { // not in editing mode: m_imgui->text(m_desc.at("minimal_distance")); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp index 82455a9f40..ba950594a2 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp @@ -92,7 +92,7 @@ private: void render_clipping_plane(const Selection& selection) const; bool is_mesh_update_necessary() const; void update_mesh(); - void hollow_mesh(float offset = 2.f, float adaptability = 1.f); + void hollow_mesh(float offset = 2.f); bool unsaved_changes() const; const TriangleMesh* mesh() const; @@ -109,7 +109,6 @@ private: std::vector m_normal_cache; // to restore after discarding changes or undo/redo float m_offset = 2.f; - float m_adaptibility = 1.f; float m_clipping_plane_distance = 0.f; std::unique_ptr m_clipping_plane; diff --git a/tests/libslic3r/test_hollowing.cpp b/tests/libslic3r/test_hollowing.cpp index b463fd863e..9a2ea2e726 100644 --- a/tests/libslic3r/test_hollowing.cpp +++ b/tests/libslic3r/test_hollowing.cpp @@ -49,7 +49,7 @@ static Slic3r::TriangleMesh load_model(const std::string &obj_filename) TEST_CASE("Negative 3D offset should produce smaller object.", "[Hollowing]") { - Slic3r::TriangleMesh in_mesh = load_model("zaba.obj"); + Slic3r::TriangleMesh in_mesh = load_model("20mm_cube.obj"); Benchmark bench; bench.start(); From bc3d22348aa6ee03c86aeab93dbdd1d2da7694b9 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Thu, 7 Nov 2019 09:34:34 +0100 Subject: [PATCH 038/336] Hollowing params: accuracy and smoothness --- src/libslic3r/OpenVDBUtils.cpp | 28 ++++++++++++++++++------- src/libslic3r/OpenVDBUtils.hpp | 5 +---- src/libslic3r/PrintConfig.cpp | 19 +++++++++++++++++ src/libslic3r/PrintConfig.hpp | 9 ++++++++ src/libslic3r/SLAPrint.cpp | 10 ++++++--- src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp | 24 +++++++++++++++------ src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp | 9 ++++++-- src/slic3r/GUI/Preset.cpp | 2 ++ src/slic3r/GUI/Tab.cpp | 2 ++ 9 files changed, 85 insertions(+), 23 deletions(-) diff --git a/src/libslic3r/OpenVDBUtils.cpp b/src/libslic3r/OpenVDBUtils.cpp index 08c69bdb5d..53f9d5ae9f 100644 --- a/src/libslic3r/OpenVDBUtils.cpp +++ b/src/libslic3r/OpenVDBUtils.cpp @@ -158,20 +158,35 @@ inline void _scale(S s, sla::Contour3D &m) for (auto &p : m.points) p *= s; } +static void filter_grid(openvdb::FloatGrid &grid, double scale, double gain) +{ + static const double ROUNDNESS_COEFF = 1.; + + // Filtering: + if (gain > 0.) { + double rounding = ROUNDNESS_COEFF * gain; + int width = int(rounding * scale); + int count = 1; + openvdb::tools::Filter{grid}.gaussian(width, count); + } +} + template remove_cvref_t _hollowed_interior(Mesh &&mesh, double min_thickness, - int oversampling, + double accuracy, double smoothing) { using MMesh = remove_cvref_t; MMesh imesh{std::forward(mesh)}; + static const double ACCURACY_COEFF = 7.; + // I can't figure out how to increase the grid resolution through openvdb API // so the model will be scaled up before conversion and the result scaled // down. Voxels have a unit size. If I set voxelSize smaller, it scales // the whole geometry down, and doesn't increase the number of voxels. - auto scale = double(oversampling); + auto scale = (1.0 + ACCURACY_COEFF * accuracy); // max 8x upscale, min is native voxel size _scale(scale, imesh); @@ -186,10 +201,7 @@ remove_cvref_t _hollowed_interior(Mesh &&mesh, return MMesh{}; } - // Filtering: - int width = int(smoothing * scale); - int count = 1; - openvdb::tools::Filter{*gridptr}.gaussian(width, count); + filter_grid(*gridptr, scale, smoothing); double iso_surface = -offset; double adaptivity = 0.; @@ -202,10 +214,10 @@ remove_cvref_t _hollowed_interior(Mesh &&mesh, TriangleMesh hollowed_interior(const TriangleMesh &mesh, double min_thickness, - int oversampling, + double accuracy, double smoothing) { - return _hollowed_interior(mesh, min_thickness, oversampling, smoothing); + return _hollowed_interior(mesh, min_thickness, accuracy, smoothing); } } // namespace Slic3r diff --git a/src/libslic3r/OpenVDBUtils.hpp b/src/libslic3r/OpenVDBUtils.hpp index 8e55300bd2..95b95db7ce 100644 --- a/src/libslic3r/OpenVDBUtils.hpp +++ b/src/libslic3r/OpenVDBUtils.hpp @@ -18,16 +18,13 @@ TriangleMesh volumeToMesh(const openvdb::FloatGrid &grid, double adaptivity = 0.0, bool relaxDisorientedTriangles = true); -sla::Contour3D hollowed_interior(sla::Contour3D&& mesh, double min_thickness); -sla::Contour3D hollowed_interior(sla::Contour3D& mesh, double min_thickness); - // Generate an interior for any solid geometry maintaining a given minimum // wall thickness. The returned mesh has triangles with normals facing inside // the mesh so the result can be directly merged with the input to finish the // hollowing. // TODO: The thicknes is not strictly maintained due to the used gaussian filter TriangleMesh hollowed_interior(const TriangleMesh &mesh, double min_thickness, - int oversampling = 3, double smoothing = 0.5); + double accuracy = 0.5, double smoothing = 0.5); } // namespace Slic3r diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index 4cfd81bc55..e621d4b340 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -2846,6 +2846,25 @@ void PrintConfigDef::init_sla_params() def->min = 1; def->mode = comSimple; def->set_default_value(new ConfigOptionFloat(4)); + + def = this->add("hollowing_accuracy", coFloat); + def->label = L("Hollowing accuracy"); + def->category = L("Hollowing"); + def->tooltip = L("Performance vs accuracy of calculation. Lower values may produce unwanted artifacts."); + def->min = 0; + def->max = 1; + def->mode = comExpert; + def->set_default_value(new ConfigOptionFloat(0.5)); + + def = this->add("hollowing_smoothness", coFloat); + def->label = L("Hollowing smoothness"); + def->category = L("Hollowing"); + def->tooltip = L("The cavity shape is a smoothed version of the outside original shape. " + "Possible values span from 0 to 1 and control the amount of surface smoothing."); + def->min = 0; + def->max = 1; + def->mode = comExpert; + def->set_default_value(new ConfigOptionFloat(0.5)); } void PrintConfigDef::handle_legacy(t_config_option_key &opt_key, std::string &value) diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index 6bcc3f9ad2..d07999c886 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -1097,6 +1097,13 @@ public: // resulting walls may be thicker due to smoothing out fine cavities where // resin could stuck. ConfigOptionFloat hollowing_min_thickness; + + // Indirectly controls the voxel size (resolution) used by openvdb + ConfigOptionFloat hollowing_accuracy; + + // Indirectly controls the amount of filtering used to blur geometry + // features in the created cavity. + ConfigOptionFloat hollowing_smoothness; protected: void initialize(StaticCacheBase &cache, const char *base_ptr) @@ -1136,6 +1143,8 @@ protected: OPT_PTR(pad_object_connector_penetration); OPT_PTR(hollowing_enable); OPT_PTR(hollowing_min_thickness); + OPT_PTR(hollowing_accuracy); + OPT_PTR(hollowing_smoothness); } }; diff --git a/src/libslic3r/SLAPrint.cpp b/src/libslic3r/SLAPrint.cpp index 2e8a704005..d2200bcfb2 100644 --- a/src/libslic3r/SLAPrint.cpp +++ b/src/libslic3r/SLAPrint.cpp @@ -776,9 +776,10 @@ void SLAPrint::process() po.m_hollowing_data.reset(new SLAPrintObject::HollowingData()); double thickness = po.m_config.hollowing_min_thickness.getFloat(); - + double accuracy = po.m_config.hollowing_accuracy.getFloat(); + double blur = po.m_config.hollowing_smoothness.getFloat(); po.m_hollowing_data->interior = - hollowed_interior(po.transformed_mesh(), thickness, 4, 0.5); + hollowed_interior(po.transformed_mesh(), thickness, accuracy, blur); if (po.m_hollowing_data->interior.empty()) BOOST_LOG_TRIVIAL(warning) << "Hollowed interior is empty!"; @@ -1752,7 +1753,10 @@ bool SLAPrintObject::invalidate_state_by_config_options(const std::vectormerge(*m_mesh); m_cavity_mesh.get()->require_shared_vertices(); @@ -692,7 +694,7 @@ RENDER_AGAIN: if (m_editing_mode) { if (m_imgui->button(m_desc.at("hollow"))) { - hollow_mesh(m_offset); + hollow_mesh(); } float diameter_upper_cap = static_cast(wxGetApp().preset_bundle->sla_prints.get_edited_preset().config.option("support_pillar_diameter"))->value; @@ -748,12 +750,22 @@ RENDER_AGAIN: remove_all = m_imgui->button(m_desc.at("remove_all")); m_imgui->disabled_end(); - m_imgui->text(" "); // vertical gap +// m_imgui->text(" "); // vertical gap m_imgui->text("Offset: "); ImGui::SameLine(); ImGui::SliderFloat(" ", &m_offset, 0.f, 10.f, "%.1f"); + + // TODO: only in expert mode: + m_imgui->text("Accuracy: "); + ImGui::SameLine(); + ImGui::SliderFloat(" ", &m_accuracy, 0.f, 1.f, "%.1f"); + + // TODO: only in expert mode: + m_imgui->text("Smoothness: "); + ImGui::SameLine(); + ImGui::SliderFloat(" ", &m_smoothness, 0.f, 1.f, "%.1f"); } else { // not in editing mode: m_imgui->text(m_desc.at("minimal_distance")); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp index ba950594a2..0cf1e1ecb1 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp @@ -92,7 +92,7 @@ private: void render_clipping_plane(const Selection& selection) const; bool is_mesh_update_necessary() const; void update_mesh(); - void hollow_mesh(float offset = 2.f); + void hollow_mesh(); bool unsaved_changes() const; const TriangleMesh* mesh() const; @@ -108,14 +108,19 @@ private: mutable std::vector m_editing_cache; // a support point and whether it is currently selected std::vector m_normal_cache; // to restore after discarding changes or undo/redo - float m_offset = 2.f; + float m_offset = 2.0f; float m_clipping_plane_distance = 0.f; std::unique_ptr m_clipping_plane; + + float m_accuracy = 0.5f; // This map holds all translated description texts, so they can be easily referenced during layout calculations // etc. When language changes, GUI is recreated and this class constructed again, so the change takes effect. std::map m_desc; + + + float m_smoothness = 0.5f; GLSelectionRectangle m_selection_rectangle; diff --git a/src/slic3r/GUI/Preset.cpp b/src/slic3r/GUI/Preset.cpp index edbb5fb750..483bff8e55 100644 --- a/src/slic3r/GUI/Preset.cpp +++ b/src/slic3r/GUI/Preset.cpp @@ -498,6 +498,8 @@ const std::vector& Preset::sla_print_options() "pad_object_connector_penetration", "hollowing_enable", "hollowing_min_thickness", + "hollowing_accuracy", + "hollowing_smoothness", "output_filename_format", "default_sla_print_profile", "compatible_printers", diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index 22c4bfb9bf..d20e0ee6c8 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -3568,6 +3568,8 @@ void TabSLAPrint::build() optgroup = page->new_optgroup(_(L("Hollowing"))); optgroup->append_single_option_line("hollowing_enable"); optgroup->append_single_option_line("hollowing_min_thickness"); + optgroup->append_single_option_line("hollowing_accuracy"); + optgroup->append_single_option_line("hollowing_smoothness"); page = add_options_page(_(L("Advanced")), "wrench"); optgroup = page->new_optgroup(_(L("Slicing"))); From 9836533cb3fc86812619e118af825a23b861fa88 Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Thu, 7 Nov 2019 14:25:03 +0100 Subject: [PATCH 039/336] Hollowing task triggered by the gizmo now spawns a UI job to not block the UI thread The AABB tree calculation is still done in the UI thread, so it gets blocked for some time --- src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp | 120 ++++++++++------------ src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp | 7 +- src/slic3r/GUI/Gizmos/GLGizmosManager.hpp | 3 +- src/slic3r/GUI/Plater.cpp | 66 +++++++++++- src/slic3r/GUI/Plater.hpp | 1 + 5 files changed, 125 insertions(+), 72 deletions(-) diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp index 5b6620ef68..f0aaca9ade 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp @@ -5,19 +5,13 @@ #include -//#include -//#include -//#include - #include "slic3r/GUI/GUI_App.hpp" -#include "slic3r/GUI/GUI.hpp" #include "slic3r/GUI/GUI_ObjectSettings.hpp" #include "slic3r/GUI/GUI_ObjectList.hpp" #include "slic3r/GUI/MeshUtils.hpp" #include "slic3r/GUI/Plater.hpp" #include "slic3r/GUI/PresetBundle.hpp" #include "libslic3r/SLAPrint.hpp" -#include "libslic3r/OpenVDBUtils.hpp" namespace Slic3r { @@ -26,7 +20,6 @@ namespace GUI { GLGizmoHollow::GLGizmoHollow(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id) : GLGizmoBase(parent, icon_filename, sprite_id) , m_quadric(nullptr) - , m_its(nullptr) { m_clipping_plane.reset(new ClippingPlane(Vec3d::Zero(), 0.)); m_quadric = ::gluNewQuadric(); @@ -48,8 +41,8 @@ bool GLGizmoHollow::on_init() m_desc["head_diameter"] = _(L("Head diameter")) + ": "; m_desc["lock_supports"] = _(L("Lock supports under new islands")); - m_desc["remove_selected"] = _(L("Remove selected points")); - m_desc["remove_all"] = _(L("Remove all points")); + m_desc["remove_selected"] = _(L("Remove selected holes")); + m_desc["remove_all"] = _(L("Remove all holes")); m_desc["apply_changes"] = _(L("Apply changes")); m_desc["discard_changes"] = _(L("Discard changes")); m_desc["minimal_distance"] = _(L("Minimal points distance")) + ": "; @@ -113,7 +106,7 @@ void GLGizmoHollow::on_render() const return; } - if (! m_its || ! m_mesh) + if (! m_mesh) const_cast(this)->update_mesh(); if (m_volume_with_cavity) { @@ -212,7 +205,7 @@ void GLGizmoHollow::render_clipping_plane(const Selection& selection) const ::glPopMatrix(); } - if (m_supports_clipper && ! m_supports_clipper->get_triangles().empty() && !m_editing_mode) { + if (m_supports_clipper && ! m_supports_clipper->get_triangles().empty()) { // The supports are hidden in the editing mode, so it makes no sense to render the cuts. ::glPushMatrix(); ::glColor3f(1.0f, 0.f, 0.37f); @@ -310,12 +303,14 @@ void GLGizmoHollow::render_points(const Selection& selection, bool picking) cons //const double cone_rad_diff = m_new_cone_angle*(cone_radius/(cone_height/2.))*(cone_height/2.); const double cone_rad_diff = m_new_cone_angle*cone_radius; glsafe(::glPushMatrix()); - glsafe(::glTranslatef(0.f, 0.f, -cone_height/2.)); + glsafe(::glTranslated(0., 0., -cone_height/2.)); //::gluCylinder(m_quadric, cone_radius, cone_radius, cone_height, 24, 1); ::gluCylinder(m_quadric, cone_radius+cone_rad_diff, cone_radius-cone_rad_diff, cone_height, 24, 1); - glsafe(::glTranslatef(0.f, 0.f, cone_height)); - //::gluDisk(m_quadric, 0.0, cone_radius, 24, 1); + glsafe(::glTranslated(0., 0., cone_height)); ::gluDisk(m_quadric, 0.0, cone_radius-cone_rad_diff, 24, 1); + glsafe(::glTranslated(0., 0., -cone_height)); + glsafe(::glRotatef(180.f, 1.f, 0.f, 0.f)); + ::gluDisk(m_quadric, 0.0, cone_radius+cone_rad_diff, 24, 1); glsafe(::glPopMatrix()); } //::gluSphere(m_quadric, (double)support_point.head_front_radius * RenderPointScale, 24, 12); @@ -354,7 +349,7 @@ bool GLGizmoHollow::is_mesh_point_clipped(const Vec3d& point) const bool GLGizmoHollow::is_mesh_update_necessary() const { return ((m_state == On) && (m_model_object != nullptr) && !m_model_object->instances.empty()) - && ((m_model_object->id() != m_model_object_id) || m_its == nullptr); + && ((m_model_object->id() != m_model_object_id) || ! m_mesh); } @@ -368,7 +363,6 @@ void GLGizmoHollow::update_mesh() // this way we can use that mesh directly. // This mesh does not account for the possible Z up SLA offset. m_mesh = &m_model_object->volumes.front()->mesh(); - m_its = &m_mesh->its; // If this is different mesh than last time if (m_model_object_id != m_model_object->id()) { @@ -449,7 +443,7 @@ bool GLGizmoHollow::gizmo_event(SLAGizmoEventType action, const Vec2d& mouse_pos if (m_selection_empty) { std::pair pos_and_normal; if (unproject_on_mesh(mouse_position, pos_and_normal)) { // we got an intersection - Plater::TakeSnapshot snapshot(wxGetApp().plater(), _(L("Add support point"))); + Plater::TakeSnapshot snapshot(wxGetApp().plater(), _(L("Add drainage hole"))); m_editing_cache.emplace_back(sla::SupportPoint(pos_and_normal.first, m_new_point_head_diameter/2.f, false), false, pos_and_normal.second); m_parent.set_as_dirty(); m_wait_for_up_event = true; @@ -563,7 +557,7 @@ void GLGizmoHollow::delete_selected_points(bool force) std::abort(); } - Plater::TakeSnapshot snapshot(wxGetApp().plater(), _(L("Delete support point"))); + Plater::TakeSnapshot snapshot(wxGetApp().plater(), _(L("Delete drainage hole"))); for (unsigned int idx=0; idxhollow(); +} + +void GLGizmoHollow::update_hollowed_mesh(std::unique_ptr mesh) +{ + // Called from Plater when the UI job finishes + m_cavity_mesh = std::move(mesh); - imesh.merge(omesh); - m_cavity_mesh.reset(new TriangleMesh); - *m_cavity_mesh = sla::to_triangle_mesh(imesh); - m_cavity_mesh.get()->require_shared_vertices(); m_mesh_raycaster.reset(new MeshRaycaster(*m_cavity_mesh.get())); m_object_clipper.reset(); + m_volume_with_cavity.reset(); - // create a new GLVolume that only has the cavity inside - m_volume_with_cavity.reset(new GLVolume(1.f, 0.f, 0.f, 0.5f)); - m_volume_with_cavity->indexed_vertex_array.load_mesh(*m_cavity_mesh.get()); - m_volume_with_cavity->finalize_geometry(true); - m_volume_with_cavity->set_volume_transformation(m_model_object->volumes.front()->get_transformation()); - m_volume_with_cavity->set_instance_transformation(m_model_object->instances[m_active_instance]->get_transformation()); - m_parent.toggle_model_objects_visibility(false, m_model_object, m_active_instance); + if(m_cavity_mesh) {// create a new GLVolume that only has the cavity inside + Geometry::Transformation volume_trafo = m_model_object->volumes.front()->get_transformation(); + volume_trafo.set_offset(volume_trafo.get_offset() + Vec3d(0., 0., m_z_shift)); + m_volume_with_cavity.reset(new GLVolume(1.f, 0.f, 0.f, 0.5f)); + m_volume_with_cavity->indexed_vertex_array.load_mesh(*m_cavity_mesh.get()); + m_volume_with_cavity->finalize_geometry(true); + m_volume_with_cavity->set_volume_transformation(volume_trafo); + m_volume_with_cavity->set_instance_transformation(m_model_object->instances[m_active_instance]->get_transformation()); + } + m_parent.toggle_model_objects_visibility(! m_cavity_mesh, m_model_object, m_active_instance); } std::vector GLGizmoHollow::get_config_options(const std::vector& keys) const @@ -695,9 +697,8 @@ RENDER_AGAIN: if (m_editing_mode) { - if (m_imgui->button(m_desc.at("hollow"))) { - hollow_mesh(m_offset, m_adaptibility); - } + if (m_imgui->button(m_desc.at("hollow"))) + hollow_mesh(); float diameter_upper_cap = static_cast(wxGetApp().preset_bundle->sla_prints.get_edited_preset().config.option("support_pillar_diameter"))->value; if (m_new_point_head_diameter > diameter_upper_cap) @@ -728,7 +729,7 @@ RENDER_AGAIN: cache_entry.support_point.head_front_radius = m_old_point_head_diameter / 2.f; float backup = m_new_point_head_diameter; m_new_point_head_diameter = m_old_point_head_diameter; - Plater::TakeSnapshot snapshot(wxGetApp().plater(), _(L("Change point head diameter"))); + Plater::TakeSnapshot snapshot(wxGetApp().plater(), _(L("Change drainage hole diameter"))); m_new_point_head_diameter = backup; for (auto& cache_entry : m_editing_cache) if (cache_entry.selected) @@ -757,10 +758,10 @@ RENDER_AGAIN: m_imgui->text("Offset: "); ImGui::SameLine(); - ImGui::SliderFloat(" ", &m_offset, 0.f, 10.f, "%.1f"); + ImGui::SliderFloat(" ", &m_offset, 0.f, 5.f, "%.1f"); m_imgui->text("Adaptibility: "); ImGui::SameLine(); - ImGui::SliderFloat(" ", &m_adaptibility, 0.f, 1.f, "%.1f"); + ImGui::SliderFloat(" ", &m_adaptability, 0.f, 1.f, "%.1f"); } else { // not in editing mode: m_imgui->text(m_desc.at("minimal_distance")); @@ -912,7 +913,7 @@ void GLGizmoHollow::on_set_state() return; if (m_state == On && m_old_state != On) { // the gizmo was just turned on - Plater::TakeSnapshot snapshot(wxGetApp().plater(), _(L("SLA gizmo turned on"))); + //Plater::TakeSnapshot snapshot(wxGetApp().plater(), _(L("SLA gizmo turned on"))); if (is_mesh_update_necessary()) update_mesh(); @@ -929,27 +930,16 @@ void GLGizmoHollow::on_set_state() m_new_point_head_diameter = static_cast(cfg.option("support_head_front_diameter"))->value; } if (m_state == Off && m_old_state != Off) { // the gizmo was just turned Off - bool will_ask = m_model_object && false; - if (will_ask) { - wxGetApp().CallAfter([this]() { - }); - // refuse to be turned off so the gizmo is active when the CallAfter is executed - m_state = m_old_state; - } - else { - // we are actually shutting down - Plater::TakeSnapshot snapshot(wxGetApp().plater(), _(L("SLA gizmo turned off"))); - m_parent.toggle_model_objects_visibility(true); - m_normal_cache.clear(); - m_clipping_plane_distance = 0.f; - // Release clippers and the AABB raycaster. - m_its = nullptr; - m_object_clipper.reset(); - m_supports_clipper.reset(); - m_mesh_raycaster.reset(); - m_cavity_mesh.reset(); - m_volume_with_cavity.reset(); - } + //Plater::TakeSnapshot snapshot(wxGetApp().plater(), _(L("SLA gizmo turned off"))); + m_parent.toggle_model_objects_visibility(true); + m_normal_cache.clear(); + m_clipping_plane_distance = 0.f; + // Release clippers and the AABB raycaster. + m_object_clipper.reset(); + m_supports_clipper.reset(); + m_mesh_raycaster.reset(); + m_cavity_mesh.reset(); + m_volume_with_cavity.reset(); } m_old_state = m_state; } @@ -977,7 +967,7 @@ void GLGizmoHollow::on_stop_dragging() && backup.support_point.pos != m_point_before_drag.support_point.pos) // and it was moved, not just selected { m_editing_cache[m_hover_id] = m_point_before_drag; - Plater::TakeSnapshot snapshot(wxGetApp().plater(), _(L("Move support point"))); + Plater::TakeSnapshot snapshot(wxGetApp().plater(), _(L("Move drainage hole"))); m_editing_cache[m_hover_id] = backup; } } diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp index 82455a9f40..afaaf659b5 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp @@ -36,7 +36,6 @@ private: std::unique_ptr m_cavity_mesh; std::unique_ptr m_volume_with_cavity; const TriangleMesh* m_mesh; - const indexed_triangle_set* m_its; mutable const TriangleMesh* m_supports_mesh; mutable std::vector m_triangles; mutable std::vector m_supports_triangles; @@ -78,6 +77,8 @@ public: bool gizmo_event(SLAGizmoEventType action, const Vec2d& mouse_position, bool shift_down, bool alt_down, bool control_down); void delete_selected_points(bool force = false); ClippingPlane get_sla_clipping_plane() const; + void update_hollowed_mesh(std::unique_ptr mesh); + void get_hollowing_parameters(TriangleMesh const** object_mesh, float& offset, float& adaptability) const; bool is_selection_rectangle_dragging() const { return m_selection_rectangle.is_dragging(); } @@ -92,7 +93,7 @@ private: void render_clipping_plane(const Selection& selection) const; bool is_mesh_update_necessary() const; void update_mesh(); - void hollow_mesh(float offset = 2.f, float adaptability = 1.f); + void hollow_mesh(); bool unsaved_changes() const; const TriangleMesh* mesh() const; @@ -109,7 +110,7 @@ private: std::vector m_normal_cache; // to restore after discarding changes or undo/redo float m_offset = 2.f; - float m_adaptibility = 1.f; + float m_adaptability = 1.f; float m_clipping_plane_distance = 0.f; std::unique_ptr m_clipping_plane; diff --git a/src/slic3r/GUI/Gizmos/GLGizmosManager.hpp b/src/slic3r/GUI/Gizmos/GLGizmosManager.hpp index 0368e433ed..2c4d713161 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmosManager.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmosManager.hpp @@ -158,6 +158,7 @@ public: void update_data(); EType get_current_type() const { return m_current; } + GLGizmoBase* get_current() const; bool is_running() const; bool handle_shortcut(int key); @@ -206,8 +207,6 @@ private: float get_total_overlay_height() const; float get_total_overlay_width() const; - GLGizmoBase* get_current() const; - bool generate_icons_texture() const; void update_on_off_state(const Vec2d& mouse_pos); diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index c67fac733a..eb7ec49779 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -33,6 +33,7 @@ #include "libslic3r/Format/3mf.hpp" #include "libslic3r/GCode/PreviewData.hpp" #include "libslic3r/Model.hpp" +#include "libslic3r/OpenVDBUtils.hpp" #include "libslic3r/Polygon.hpp" #include "libslic3r/Print.hpp" #include "libslic3r/PrintConfig.hpp" @@ -1559,7 +1560,8 @@ struct Plater::priv enum class Jobs : size_t { Arrange, - Rotoptimize + Rotoptimize, + Hollow }; class ArrangeJob : public Job @@ -1703,6 +1705,20 @@ struct Plater::priv void process() override; }; + class HollowJob : public Job + { + public: + using Job::Job; + void prepare() override; + void process() override; + void finalize() override; + private: + std::unique_ptr m_output; + const TriangleMesh* m_object_mesh = nullptr; + float m_offset = 0.f; + float m_adaptability = 0.f; + }; + // Jobs defined inside the group class will be managed so that only one can // run at a time. Also, the background process will be stopped if a job is // started. @@ -1714,6 +1730,7 @@ struct Plater::priv ArrangeJob arrange_job{m_plater}; RotoptimizeJob rotoptimize_job{m_plater}; + HollowJob hollow_job{m_plater}; // To create a new job, just define a new subclass of Job, implement // the process and the optional prepare() and finalize() methods @@ -1721,7 +1738,8 @@ struct Plater::priv // if it cannot run concurrently with other jobs in this group std::vector> m_jobs{arrange_job, - rotoptimize_job}; + rotoptimize_job, + hollow_job}; public: ExclusiveJobGroup(priv *_plater) : m_plater(_plater) {} @@ -1816,6 +1834,7 @@ struct Plater::priv void reset(); void mirror(Axis axis); void arrange(); + void hollow(); void sla_optimize_rotation(); void split_object(); void split_volume(); @@ -2703,6 +2722,12 @@ void Plater::priv::arrange() m_ui_jobs.start(Jobs::Arrange); } +void Plater::priv::hollow() +{ + this->take_snapshot(_(L("Hollow"))); + m_ui_jobs.start(Jobs::Hollow); +} + // This method will find an optimal orientation for the currently selected item // Very similar in nature to the arrange method above... void Plater::priv::sla_optimize_rotation() { @@ -2834,6 +2859,38 @@ void Plater::priv::RotoptimizeJob::process() : _(L("Orientation found."))); } +void Plater::priv::HollowJob::prepare() +{ + const GLGizmosManager& gizmo_manager = plater().q->canvas3D()->get_gizmos_manager(); + const GLGizmoHollow* gizmo_hollow = dynamic_cast(gizmo_manager.get_current()); + assert(gizmo_hollow); + gizmo_hollow->get_hollowing_parameters(&m_object_mesh, m_offset, m_adaptability); + m_output.reset(); +} + +void Plater::priv::HollowJob::process() +{ + Slic3r::sla::Contour3D imesh{*m_object_mesh}; + auto ptr = meshToVolume(imesh, {}); + sla::Contour3D omesh = volumeToMesh(*ptr, -m_offset, m_adaptability, true); + + if (omesh.empty()) + return; + + imesh.merge(omesh); + m_output.reset(new TriangleMesh()); + *m_output = sla::to_triangle_mesh(imesh); + m_output->require_shared_vertices(); +} + +void Plater::priv::HollowJob::finalize() +{ + const GLGizmosManager& gizmo_manager = plater().q->canvas3D()->get_gizmos_manager(); + GLGizmoHollow* gizmo_hollow = dynamic_cast(gizmo_manager.get_current()); + assert(gizmo_hollow); + gizmo_hollow->update_hollowed_mesh(std::move(m_output)); +} + void Plater::priv::split_object() { int obj_idx = get_selected_object_idx(); @@ -4661,6 +4718,11 @@ void Plater::export_toolpaths_to_obj() const p->preview->get_canvas3d()->export_toolpaths_to_obj(into_u8(path).c_str()); } +void Plater::hollow() +{ + p->hollow(); +} + void Plater::reslice() { // Stop arrange and (or) optimize rotation tasks. diff --git a/src/slic3r/GUI/Plater.hpp b/src/slic3r/GUI/Plater.hpp index 00ceb89bc3..9ede19d719 100644 --- a/src/slic3r/GUI/Plater.hpp +++ b/src/slic3r/GUI/Plater.hpp @@ -190,6 +190,7 @@ public: void reload_from_disk(); bool has_toolpaths_to_export() const; void export_toolpaths_to_obj() const; + void hollow(); void reslice(); void reslice_SLA_supports(const ModelObject &object, bool postpone_error_messages = false); void changed_object(int obj_idx); From 4b088658096ad38937795a9153ffd8406ce827a3 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Fri, 8 Nov 2019 09:21:30 +0100 Subject: [PATCH 040/336] hollowing params renamed, filtering generalized --- src/libslic3r/CMakeLists.txt | 2 + src/libslic3r/OpenVDBUtils.cpp | 31 ++++---------- src/libslic3r/OpenVDBUtils.hpp | 6 ++- src/libslic3r/PrintConfig.cpp | 4 +- src/libslic3r/PrintConfig.hpp | 8 ++-- src/libslic3r/SLA/Hollowing.cpp | 55 +++++++++++++++++++++++++ src/libslic3r/SLA/Hollowing.hpp | 17 ++++++++ src/libslic3r/SLAPrint.cpp | 12 +++--- src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp | 11 ++--- src/slic3r/GUI/Preset.cpp | 4 +- src/slic3r/GUI/Tab.cpp | 4 +- tests/libslic3r/test_hollowing.cpp | 29 +------------ 12 files changed, 111 insertions(+), 72 deletions(-) create mode 100644 src/libslic3r/SLA/Hollowing.cpp create mode 100644 src/libslic3r/SLA/Hollowing.hpp diff --git a/src/libslic3r/CMakeLists.txt b/src/libslic3r/CMakeLists.txt index e4b6ccd100..e28917b5f3 100644 --- a/src/libslic3r/CMakeLists.txt +++ b/src/libslic3r/CMakeLists.txt @@ -204,6 +204,8 @@ add_library(libslic3r STATIC SLA/SLARasterWriter.cpp SLA/ConcaveHull.hpp SLA/ConcaveHull.cpp + SLA/Hollowing.hpp + SLA/Hollowing.cpp ) encoding_check(libslic3r) diff --git a/src/libslic3r/OpenVDBUtils.cpp b/src/libslic3r/OpenVDBUtils.cpp index 53f9d5ae9f..91ccdd5c4e 100644 --- a/src/libslic3r/OpenVDBUtils.cpp +++ b/src/libslic3r/OpenVDBUtils.cpp @@ -2,7 +2,7 @@ #include "OpenVDBUtils.hpp" #include #include -#include +#include #include #include "MTUtils.hpp" @@ -158,35 +158,22 @@ inline void _scale(S s, sla::Contour3D &m) for (auto &p : m.points) p *= s; } -static void filter_grid(openvdb::FloatGrid &grid, double scale, double gain) -{ - static const double ROUNDNESS_COEFF = 1.; - - // Filtering: - if (gain > 0.) { - double rounding = ROUNDNESS_COEFF * gain; - int width = int(rounding * scale); - int count = 1; - openvdb::tools::Filter{grid}.gaussian(width, count); - } -} - template remove_cvref_t _hollowed_interior(Mesh &&mesh, double min_thickness, - double accuracy, - double smoothing) + double quality, + HollowingFilter filt) { using MMesh = remove_cvref_t; MMesh imesh{std::forward(mesh)}; - static const double ACCURACY_COEFF = 7.; + static const double QUALITY_COEFF = 7.; // I can't figure out how to increase the grid resolution through openvdb API // so the model will be scaled up before conversion and the result scaled // down. Voxels have a unit size. If I set voxelSize smaller, it scales // the whole geometry down, and doesn't increase the number of voxels. - auto scale = (1.0 + ACCURACY_COEFF * accuracy); // max 8x upscale, min is native voxel size + auto scale = (1.0 + QUALITY_COEFF * quality); // max 8x upscale, min is native voxel size _scale(scale, imesh); @@ -201,7 +188,7 @@ remove_cvref_t _hollowed_interior(Mesh &&mesh, return MMesh{}; } - filter_grid(*gridptr, scale, smoothing); + if (filt) filt(*gridptr, min_thickness, scale); double iso_surface = -offset; double adaptivity = 0.; @@ -214,10 +201,10 @@ remove_cvref_t _hollowed_interior(Mesh &&mesh, TriangleMesh hollowed_interior(const TriangleMesh &mesh, double min_thickness, - double accuracy, - double smoothing) + double quality, + HollowingFilter filt) { - return _hollowed_interior(mesh, min_thickness, accuracy, smoothing); + return _hollowed_interior(mesh, min_thickness, quality, filt); } } // namespace Slic3r diff --git a/src/libslic3r/OpenVDBUtils.hpp b/src/libslic3r/OpenVDBUtils.hpp index 95b95db7ce..bd52e81eec 100644 --- a/src/libslic3r/OpenVDBUtils.hpp +++ b/src/libslic3r/OpenVDBUtils.hpp @@ -18,13 +18,15 @@ TriangleMesh volumeToMesh(const openvdb::FloatGrid &grid, double adaptivity = 0.0, bool relaxDisorientedTriangles = true); +using HollowingFilter = std::function; + // Generate an interior for any solid geometry maintaining a given minimum // wall thickness. The returned mesh has triangles with normals facing inside // the mesh so the result can be directly merged with the input to finish the // hollowing. -// TODO: The thicknes is not strictly maintained due to the used gaussian filter TriangleMesh hollowed_interior(const TriangleMesh &mesh, double min_thickness, - double accuracy = 0.5, double smoothing = 0.5); + double quality = 0.5, + HollowingFilter filt = nullptr); } // namespace Slic3r diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index e621d4b340..96b84cf817 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -2847,7 +2847,7 @@ void PrintConfigDef::init_sla_params() def->mode = comSimple; def->set_default_value(new ConfigOptionFloat(4)); - def = this->add("hollowing_accuracy", coFloat); + def = this->add("hollowing_quality", coFloat); def->label = L("Hollowing accuracy"); def->category = L("Hollowing"); def->tooltip = L("Performance vs accuracy of calculation. Lower values may produce unwanted artifacts."); @@ -2856,7 +2856,7 @@ void PrintConfigDef::init_sla_params() def->mode = comExpert; def->set_default_value(new ConfigOptionFloat(0.5)); - def = this->add("hollowing_smoothness", coFloat); + def = this->add("hollowing_flatness", coFloat); def->label = L("Hollowing smoothness"); def->category = L("Hollowing"); def->tooltip = L("The cavity shape is a smoothed version of the outside original shape. " diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index d07999c886..9ed63e5d4c 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -1099,11 +1099,11 @@ public: ConfigOptionFloat hollowing_min_thickness; // Indirectly controls the voxel size (resolution) used by openvdb - ConfigOptionFloat hollowing_accuracy; + ConfigOptionFloat hollowing_quality; // Indirectly controls the amount of filtering used to blur geometry // features in the created cavity. - ConfigOptionFloat hollowing_smoothness; + ConfigOptionFloat hollowing_flatness; protected: void initialize(StaticCacheBase &cache, const char *base_ptr) @@ -1143,8 +1143,8 @@ protected: OPT_PTR(pad_object_connector_penetration); OPT_PTR(hollowing_enable); OPT_PTR(hollowing_min_thickness); - OPT_PTR(hollowing_accuracy); - OPT_PTR(hollowing_smoothness); + OPT_PTR(hollowing_quality); + OPT_PTR(hollowing_flatness); } }; diff --git a/src/libslic3r/SLA/Hollowing.cpp b/src/libslic3r/SLA/Hollowing.cpp new file mode 100644 index 0000000000..4309003134 --- /dev/null +++ b/src/libslic3r/SLA/Hollowing.cpp @@ -0,0 +1,55 @@ +#include "Hollowing.hpp" +#include +#include +#include +#include + +namespace Slic3r { +namespace sla { + +namespace { + +void filter_grid_sla(openvdb::FloatGrid &grid, double scale, double /*thickness*/, double flatness) +{ + static const double ROUNDNESS_COEFF = 1.; + + // Filtering: + if (flatness > 0.) { + double rounding = ROUNDNESS_COEFF * flatness; + int width = int(rounding * scale); + int count = 1; + openvdb::tools::Filter{grid}.gaussian(width, count); + } +} +// openvdb::tools::levelSetRebuild(grid, -float(thickness * 2)); +// filter_grid_sla(grid, scale, thickness, flatness); + +// openvdb::tools::levelSetRebuild(grid, float(thickness)); + + +void redist_grid_sla(openvdb::FloatGrid &grid, double scale, double thickness, double flatness) +{ +// openvdb::tools::levelSetRebuild(grid, -float(scale * thickness)); + + + openvdb::tools::LevelSetFilter filt{grid}; + +// filt.gaussian(int(flatness * scale)); + +// openvdb::tools::levelSetRebuild(grid, float(scale * thickness)); + //grid = openvdb::tools::topologyToLevelSet(grid); +} + +} + +TriangleMesh generate_interior(const TriangleMesh &mesh, + double min_thickness, + double quality, + double flatness) +{ + namespace plc = std::placeholders; + auto filt = std::bind(filter_grid_sla, plc::_1, plc::_2, plc::_3, flatness); + return hollowed_interior(mesh, min_thickness, quality, filt); +} + +}} // namespace Slic3r::sla diff --git a/src/libslic3r/SLA/Hollowing.hpp b/src/libslic3r/SLA/Hollowing.hpp new file mode 100644 index 0000000000..6abbe9f994 --- /dev/null +++ b/src/libslic3r/SLA/Hollowing.hpp @@ -0,0 +1,17 @@ +#ifndef HOLLOWINGFILTER_HPP +#define HOLLOWINGFILTER_HPP + +#include + +namespace Slic3r { +namespace sla { + +TriangleMesh generate_interior(const TriangleMesh &mesh, + double min_thickness, + double quality = 0.5, + double flatness = 0.5); + +} +} + +#endif // HOLLOWINGFILTER_H diff --git a/src/libslic3r/SLAPrint.cpp b/src/libslic3r/SLAPrint.cpp index d2200bcfb2..b150a4f768 100644 --- a/src/libslic3r/SLAPrint.cpp +++ b/src/libslic3r/SLAPrint.cpp @@ -3,7 +3,7 @@ #include "SLA/SLAPad.hpp" #include "SLA/SLAAutoSupports.hpp" #include "ClipperUtils.hpp" -#include "OpenVDBUtils.hpp" +#include "SLA/Hollowing.hpp" #include "Geometry.hpp" #include "MTUtils.hpp" @@ -776,10 +776,10 @@ void SLAPrint::process() po.m_hollowing_data.reset(new SLAPrintObject::HollowingData()); double thickness = po.m_config.hollowing_min_thickness.getFloat(); - double accuracy = po.m_config.hollowing_accuracy.getFloat(); - double blur = po.m_config.hollowing_smoothness.getFloat(); + double accuracy = po.m_config.hollowing_quality.getFloat(); + double blur = po.m_config.hollowing_flatness.getFloat(); po.m_hollowing_data->interior = - hollowed_interior(po.transformed_mesh(), thickness, accuracy, blur); + generate_interior(po.transformed_mesh(), thickness, accuracy, blur); if (po.m_hollowing_data->interior.empty()) BOOST_LOG_TRIVIAL(warning) << "Hollowed interior is empty!"; @@ -1754,8 +1754,8 @@ bool SLAPrintObject::invalidate_state_by_config_options(const std::vector& Preset::sla_print_options() "pad_object_connector_penetration", "hollowing_enable", "hollowing_min_thickness", - "hollowing_accuracy", - "hollowing_smoothness", + "hollowing_quality", + "hollowing_flatness", "output_filename_format", "default_sla_print_profile", "compatible_printers", diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index d20e0ee6c8..333384802a 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -3568,8 +3568,8 @@ void TabSLAPrint::build() optgroup = page->new_optgroup(_(L("Hollowing"))); optgroup->append_single_option_line("hollowing_enable"); optgroup->append_single_option_line("hollowing_min_thickness"); - optgroup->append_single_option_line("hollowing_accuracy"); - optgroup->append_single_option_line("hollowing_smoothness"); + optgroup->append_single_option_line("hollowing_quality"); + optgroup->append_single_option_line("hollowing_flatness"); page = add_options_page(_(L("Advanced")), "wrench"); optgroup = page->new_optgroup(_(L("Slicing"))); diff --git a/tests/libslic3r/test_hollowing.cpp b/tests/libslic3r/test_hollowing.cpp index 9a2ea2e726..4264774a3e 100644 --- a/tests/libslic3r/test_hollowing.cpp +++ b/tests/libslic3r/test_hollowing.cpp @@ -2,7 +2,7 @@ #include #include -#include "libslic3r/OpenVDBUtils.hpp" +#include "libslic3r/SLA/Hollowing.hpp" #include #include "libslic3r/Format/OBJ.hpp" @@ -22,38 +22,13 @@ static Slic3r::TriangleMesh load_model(const std::string &obj_filename) return mesh; } -//static Slic3r::TriangleMesh hollowed_interior(const Slic3r::TriangleMesh &mesh, -// double min_thickness) -//{ -// Slic3r::sla::Contour3D imesh = Slic3r::sla::Contour3D{mesh}; - -// double scale = std::max(1.0, 3. / min_thickness); -// double offset = scale * min_thickness; -// float range = float(std::max(2 * offset, scale)); - -// for (auto &p : imesh.points) p *= scale; -// auto ptr = Slic3r::meshToVolume(imesh, {}, 0.1f * float(offset), range); - -// REQUIRE(ptr); - -// openvdb::tools::Filter{*ptr}.gaussian(int(scale), 1); - -// double iso_surface = -offset; -// double adaptivity = 0.; -// Slic3r::sla::Contour3D omesh = Slic3r::volumeToMesh(*ptr, iso_surface, adaptivity); - -// for (auto &p : omesh.points) p /= scale; - -// return to_triangle_mesh(omesh); -//} - TEST_CASE("Negative 3D offset should produce smaller object.", "[Hollowing]") { Slic3r::TriangleMesh in_mesh = load_model("20mm_cube.obj"); Benchmark bench; bench.start(); - Slic3r::TriangleMesh out_mesh = hollowed_interior(in_mesh, 0.5); + Slic3r::TriangleMesh out_mesh = Slic3r::sla::generate_interior(in_mesh, 0.5); bench.stop(); From 645f13a0ae7eb606e8a745eddbad864b7c28c46d Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Fri, 8 Nov 2019 14:05:56 +0100 Subject: [PATCH 041/336] Drain holes are now saved in ModelObject Internal changes in GLGizmoHollow.cpp --- src/libslic3r/Model.cpp | 4 + src/libslic3r/Model.hpp | 5 +- src/libslic3r/SLA/SLACommon.hpp | 33 ++ src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp | 545 +++++++++------------- src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp | 32 +- src/slic3r/GUI/Gizmos/GLGizmosManager.cpp | 19 +- 6 files changed, 289 insertions(+), 349 deletions(-) diff --git a/src/libslic3r/Model.cpp b/src/libslic3r/Model.cpp index 061c5bd50a..fa865a8b1b 100644 --- a/src/libslic3r/Model.cpp +++ b/src/libslic3r/Model.cpp @@ -606,6 +606,7 @@ ModelObject& ModelObject::assign_copy(const ModelObject &rhs) assert(this->config.id() == rhs.config.id()); this->sla_support_points = rhs.sla_support_points; this->sla_points_status = rhs.sla_points_status; + this->sla_drain_holes = rhs.sla_drain_holes; this->layer_config_ranges = rhs.layer_config_ranges; // #ys_FIXME_experiment this->layer_height_profile = rhs.layer_height_profile; this->printable = rhs.printable; @@ -646,6 +647,7 @@ ModelObject& ModelObject::assign_copy(ModelObject &&rhs) assert(this->config.id() == rhs.config.id()); this->sla_support_points = std::move(rhs.sla_support_points); this->sla_points_status = std::move(rhs.sla_points_status); + this->sla_drain_holes = std::move(rhs.sla_drain_holes); this->layer_config_ranges = std::move(rhs.layer_config_ranges); // #ys_FIXME_experiment this->layer_height_profile = std::move(rhs.layer_height_profile); this->origin_translation = std::move(rhs.origin_translation); @@ -1099,6 +1101,7 @@ ModelObjectPtrs ModelObject::cut(size_t instance, coordf_t z, bool keep_upper, b if (keep_upper) { upper->set_model(nullptr); upper->sla_support_points.clear(); + lower->sla_drain_holes.clear(); upper->sla_points_status = sla::PointsStatus::NoPoints; upper->clear_volumes(); upper->input_file = ""; @@ -1107,6 +1110,7 @@ ModelObjectPtrs ModelObject::cut(size_t instance, coordf_t z, bool keep_upper, b if (keep_lower) { lower->set_model(nullptr); lower->sla_support_points.clear(); + lower->sla_drain_holes.clear(); lower->sla_points_status = sla::PointsStatus::NoPoints; lower->clear_volumes(); lower->input_file = ""; diff --git a/src/libslic3r/Model.hpp b/src/libslic3r/Model.hpp index 410c2d3ef4..f0641a1822 100644 --- a/src/libslic3r/Model.hpp +++ b/src/libslic3r/Model.hpp @@ -203,6 +203,9 @@ public: // the SLA gizmo and the backend). sla::PointsStatus sla_points_status = sla::PointsStatus::NoPoints; + // Holes to be drilled into the object so resin can flow out + std::vector sla_drain_holes; + /* This vector accumulates the total translation applied to the object by the center_around_origin() method. Callers might want to apply the same translation to new volumes before adding them to this object in order to preserve alignment @@ -372,7 +375,7 @@ private: template void serialize(Archive &ar) { ar(cereal::base_class(this)); Internal::StaticSerializationWrapper config_wrapper(config); - ar(name, input_file, instances, volumes, config_wrapper, layer_config_ranges, layer_height_profile, sla_support_points, sla_points_status, printable, origin_translation, + ar(name, input_file, instances, volumes, config_wrapper, layer_config_ranges, layer_height_profile, sla_support_points, sla_points_status, sla_drain_holes, printable, origin_translation, m_bounding_box, m_bounding_box_valid, m_raw_bounding_box, m_raw_bounding_box_valid, m_raw_mesh_bounding_box, m_raw_mesh_bounding_box_valid); } }; diff --git a/src/libslic3r/SLA/SLACommon.hpp b/src/libslic3r/SLA/SLACommon.hpp index 634c5611f4..6e56b6de75 100644 --- a/src/libslic3r/SLA/SLACommon.hpp +++ b/src/libslic3r/SLA/SLACommon.hpp @@ -80,6 +80,39 @@ struct SupportPoint using SupportPoints = std::vector; +struct DrainHole +{ + Vec3f m_pos; + Vec3f m_normal; + float m_radius; + float m_height; + + DrainHole() + : m_pos(Vec3f::Zero()), m_normal(Vec3f::UnitZ()), m_radius(5.f), + m_height(10.f) + {} + + DrainHole(Vec3f position, Vec3f normal, float radius, float height) + : m_pos(position) + , m_normal(normal) + , m_radius(radius) + , m_height(height) + {} + + bool operator==(const DrainHole &sp) const + { + return (m_pos == sp.m_pos) && (m_normal == sp.m_normal) + && is_approx(m_radius, sp.m_radius) && is_approx(m_height, sp.m_height); + } + + bool operator!=(const DrainHole &sp) const { return !(sp == (*this)); } + + template void serialize(Archive &ar) + { + ar(m_pos, m_normal, m_radius, m_height); + } +}; + struct Contour3D; /// An index-triangle structure for libIGL functions. Also serves as an diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp index f0aaca9ade..806069663b 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp @@ -52,6 +52,7 @@ bool GLGizmoHollow::on_init() m_desc["clipping_of_view"] = _(L("Clipping of view"))+ ": "; m_desc["reset_direction"] = _(L("Reset direction")); m_desc["hollow"] = _(L("Hollow")); + m_desc["show_supports"] = _(L("Show supports")); return true; } @@ -243,13 +244,13 @@ void GLGizmoHollow::render_points(const Selection& selection, bool picking) cons glsafe(::glMultMatrixd(instance_matrix.data())); float render_color[4]; - size_t cache_size = m_editing_mode ? m_editing_cache.size() : m_normal_cache.size(); + size_t cache_size = m_model_object->sla_drain_holes.size(); for (size_t i = 0; i < cache_size; ++i) { - const sla::SupportPoint& support_point = m_editing_mode ? m_editing_cache[i].support_point : m_normal_cache[i]; - const bool& point_selected = m_editing_mode ? m_editing_cache[i].selected : false; + const sla::DrainHole& drain_hole = m_model_object->sla_drain_holes[i]; + const bool& point_selected = m_selected[i]; - if (is_mesh_point_clipped(support_point.pos.cast())) + if (is_mesh_point_clipped(drain_hole.m_pos.cast())) continue; // First decide about the color of the point. @@ -262,7 +263,7 @@ void GLGizmoHollow::render_points(const Selection& selection, bool picking) cons } else { render_color[3] = 1.f; - if ((size_t(m_hover_id) == i && m_editing_mode)) { // ignore hover state unless editing mode is active + if (size_t(m_hover_id) == i) { render_color[0] = 0.f; render_color[1] = 1.0f; render_color[2] = 1.0f; @@ -280,43 +281,34 @@ void GLGizmoHollow::render_points(const Selection& selection, bool picking) cons // Inverse matrix of the instance scaling is applied so that the mark does not scale with the object. glsafe(::glPushMatrix()); - glsafe(::glTranslatef(support_point.pos(0), support_point.pos(1), support_point.pos(2))); + glsafe(::glTranslatef(drain_hole.m_pos(0), drain_hole.m_pos(1), drain_hole.m_pos(2))); glsafe(::glMultMatrixd(instance_scaling_matrix_inverse.data())); if (vol->is_left_handed()) glFrontFace(GL_CW); // Matrices set, we can render the point mark now. - // If in editing mode, we'll also render a cone pointing to the sphere. - if (m_editing_mode) { - // in case the normal is not yet cached, find and cache it - if (m_editing_cache[i].normal == Vec3f::Zero()) - m_mesh_raycaster->get_closest_point(m_editing_cache[i].support_point.pos, &m_editing_cache[i].normal); - Eigen::Quaterniond q; - q.setFromTwoVectors(Vec3d{0., 0., 1.}, instance_scaling_matrix_inverse * m_editing_cache[i].normal.cast()); - Eigen::AngleAxisd aa(q); - glsafe(::glRotated(aa.angle() * (180. / M_PI), aa.axis()(0), aa.axis()(1), aa.axis()(2))); + Eigen::Quaterniond q; + q.setFromTwoVectors(Vec3d{0., 0., 1.}, instance_scaling_matrix_inverse * drain_hole.m_normal.cast()); + Eigen::AngleAxisd aa(q); + glsafe(::glRotated(aa.angle() * (180. / M_PI), aa.axis()(0), aa.axis()(1), aa.axis()(2))); + + const double cylinder_radius = double(drain_hole.m_radius) * RenderPointScale; //0.25; // mm + const double stick_out_length = 1.; + const double cone_height = m_new_hole_height + stick_out_length; + glsafe(::glPushMatrix()); + glsafe(::glTranslated(0., 0., -cone_height+stick_out_length)); + ::gluCylinder(m_quadric, cylinder_radius, cylinder_radius, cone_height, 24, 1); + glsafe(::glTranslated(0., 0., cone_height)); + ::gluDisk(m_quadric, 0.0, cylinder_radius, 24, 1); + glsafe(::glTranslated(0., 0., -cone_height)); + glsafe(::glRotatef(180.f, 1.f, 0.f, 0.f)); + ::gluDisk(m_quadric, 0.0, cylinder_radius, 24, 1); + glsafe(::glPopMatrix()); - const double cone_radius = double(support_point.head_front_radius) * RenderPointScale; //0.25; // mm - const double cone_height = m_new_cone_height; - //const double cone_rad_diff = m_new_cone_angle*(cone_radius/(cone_height/2.))*(cone_height/2.); - const double cone_rad_diff = m_new_cone_angle*cone_radius; - glsafe(::glPushMatrix()); - glsafe(::glTranslated(0., 0., -cone_height/2.)); - //::gluCylinder(m_quadric, cone_radius, cone_radius, cone_height, 24, 1); - ::gluCylinder(m_quadric, cone_radius+cone_rad_diff, cone_radius-cone_rad_diff, cone_height, 24, 1); - glsafe(::glTranslated(0., 0., cone_height)); - ::gluDisk(m_quadric, 0.0, cone_radius-cone_rad_diff, 24, 1); - glsafe(::glTranslated(0., 0., -cone_height)); - glsafe(::glRotatef(180.f, 1.f, 0.f, 0.f)); - ::gluDisk(m_quadric, 0.0, cone_radius+cone_rad_diff, 24, 1); - glsafe(::glPopMatrix()); - } - //::gluSphere(m_quadric, (double)support_point.head_front_radius * RenderPointScale, 24, 12); if (vol->is_left_handed()) glFrontFace(GL_CCW); - glsafe(::glPopMatrix()); } @@ -412,122 +404,121 @@ bool GLGizmoHollow::unproject_on_mesh(const Vec2d& mouse_pos, std::pair pos_and_normal; - if (unproject_on_mesh(mouse_position, pos_and_normal)) { // we got an intersection - Plater::TakeSnapshot snapshot(wxGetApp().plater(), _(L("Add drainage hole"))); - m_editing_cache.emplace_back(sla::SupportPoint(pos_and_normal.first, m_new_point_head_diameter/2.f, false), false, pos_and_normal.second); - m_parent.set_as_dirty(); - m_wait_for_up_event = true; - } - else - return false; + // left down without selection rectangle - place point on the mesh: + if (action == SLAGizmoEventType::LeftDown && !m_selection_rectangle.is_dragging() && !shift_down) { + // If any point is in hover state, this should initiate its move - return control back to GLCanvas: + if (m_hover_id != -1) + return false; + + // If there is some selection, don't add new point and deselect everything instead. + if (m_selection_empty) { + std::pair pos_and_normal; + if (unproject_on_mesh(mouse_position, pos_and_normal)) { // we got an intersection + Plater::TakeSnapshot snapshot(wxGetApp().plater(), _(L("Add drainage hole"))); + m_model_object->sla_drain_holes.emplace_back(pos_and_normal.first, pos_and_normal.second, m_new_hole_radius, m_new_hole_height); + m_selected.push_back(false); + assert(m_selected.size == m_model_object->sla_drain_holes.size()); + m_parent.set_as_dirty(); + m_wait_for_up_event = true; } else - select_point(NoPoints); + return false; + } + else + select_point(NoPoints); + return true; + } + + // left up with selection rectangle - select points inside the rectangle: + if ((action == SLAGizmoEventType::LeftUp || action == SLAGizmoEventType::ShiftUp || action == SLAGizmoEventType::AltUp) && m_selection_rectangle.is_dragging()) { + // Is this a selection or deselection rectangle? + GLSelectionRectangle::EState rectangle_status = m_selection_rectangle.get_state(); + + // First collect positions of all the points in world coordinates. + Geometry::Transformation trafo = m_model_object->instances[m_active_instance]->get_transformation(); + trafo.set_offset(trafo.get_offset() + Vec3d(0., 0., m_z_shift)); + std::vector points; + for (unsigned int i=0; isla_drain_holes.size(); ++i) + points.push_back(trafo.get_matrix() * m_model_object->sla_drain_holes[i].m_pos.cast()); + + // Now ask the rectangle which of the points are inside. + std::vector points_inside; + std::vector points_idxs = m_selection_rectangle.stop_dragging(m_parent, points); + for (size_t idx : points_idxs) + points_inside.push_back(points[idx].cast()); + + // Only select/deselect points that are actually visible + for (size_t idx : m_mesh_raycaster->get_unobscured_idxs(trafo, m_parent.get_camera(), points_inside, m_clipping_plane.get())) + { + if (rectangle_status == GLSelectionRectangle::Deselect) + unselect_point(points_idxs[idx]); + else + select_point(points_idxs[idx]); + } + return true; + } + + // left up with no selection rectangle + if (action == SLAGizmoEventType::LeftUp) { + if (m_wait_for_up_event) { + m_wait_for_up_event = false; + return true; + } + } + + // dragging the selection rectangle: + if (action == SLAGizmoEventType::Dragging) { + if (m_wait_for_up_event) + return true; // point has been placed and the button not released yet + // this prevents GLCanvas from starting scene rotation + + if (m_selection_rectangle.is_dragging()) { + m_selection_rectangle.dragging(mouse_position); return true; } - // left up with selection rectangle - select points inside the rectangle: - if ((action == SLAGizmoEventType::LeftUp || action == SLAGizmoEventType::ShiftUp || action == SLAGizmoEventType::AltUp) && m_selection_rectangle.is_dragging()) { - // Is this a selection or deselection rectangle? - GLSelectionRectangle::EState rectangle_status = m_selection_rectangle.get_state(); + return false; + } - // First collect positions of all the points in world coordinates. - Geometry::Transformation trafo = m_model_object->instances[m_active_instance]->get_transformation(); - trafo.set_offset(trafo.get_offset() + Vec3d(0., 0., m_z_shift)); - std::vector points; - for (unsigned int i=0; i()); + if (action == SLAGizmoEventType::Delete) { + // delete key pressed + delete_selected_points(); + return true; + } - // Now ask the rectangle which of the points are inside. - std::vector points_inside; - std::vector points_idxs = m_selection_rectangle.stop_dragging(m_parent, points); - for (size_t idx : points_idxs) - points_inside.push_back(points[idx].cast()); - - // Only select/deselect points that are actually visible - for (size_t idx : m_mesh_raycaster->get_unobscured_idxs(trafo, m_parent.get_camera(), points_inside, m_clipping_plane.get())) - { - if (rectangle_status == GLSelectionRectangle::Deselect) - unselect_point(points_idxs[idx]); - else - select_point(points_idxs[idx]); - } - return true; - } - - // left up with no selection rectangle - if (action == SLAGizmoEventType::LeftUp) { - if (m_wait_for_up_event) { - m_wait_for_up_event = false; - return true; - } - } - - // dragging the selection rectangle: - if (action == SLAGizmoEventType::Dragging) { - if (m_wait_for_up_event) - return true; // point has been placed and the button not released yet - // this prevents GLCanvas from starting scene rotation - - if (m_selection_rectangle.is_dragging()) { - m_selection_rectangle.dragging(mouse_position); - return true; - } - - return false; - } - - if (action == SLAGizmoEventType::Delete) { - // delete key pressed + if (action == SLAGizmoEventType::RightDown) { + if (m_hover_id != -1) { + select_point(NoPoints); + select_point(m_hover_id); delete_selected_points(); return true; } + return false; + } - if (action == SLAGizmoEventType::RightDown) { - if (m_hover_id != -1) { - select_point(NoPoints); - select_point(m_hover_id); - delete_selected_points(); - return true; - } - return false; - } - - if (action == SLAGizmoEventType::SelectAll) { - select_point(AllPoints); - return true; - } + if (action == SLAGizmoEventType::SelectAll) { + select_point(AllPoints); + return true; } if (action == SLAGizmoEventType::MouseWheelUp && control_down) { @@ -552,39 +543,26 @@ bool GLGizmoHollow::gizmo_event(SLAGizmoEventType action, const Vec2d& mouse_pos void GLGizmoHollow::delete_selected_points(bool force) { - if (! m_editing_mode) { - std::cout << "DEBUGGING: delete_selected_points called out of editing mode!" << std::endl; - std::abort(); - } - Plater::TakeSnapshot snapshot(wxGetApp().plater(), _(L("Delete drainage hole"))); - for (unsigned int idx=0; idxsla_drain_holes.size(); ++idx) { + if (m_selected[idx]) { + m_selected.erase(m_selected.begin()+idx); + m_model_object->sla_drain_holes.erase(m_model_object->sla_drain_holes.begin() + (idx--)); } } select_point(NoPoints); - - //m_parent.post_event(SimpleEvent(EVT_GLCANVAS_SCHEDULE_BACKGROUND_PROCESS)); } void GLGizmoHollow::on_update(const UpdateData& data) { - if (! m_editing_mode) - return; - else { - if (m_hover_id != -1) { - std::pair pos_and_normal; - if (! unproject_on_mesh(data.mouse_pos.cast(), pos_and_normal)) - return; - m_editing_cache[m_hover_id].support_point.pos = pos_and_normal.first; - m_editing_cache[m_hover_id].support_point.is_new_island = false; - m_editing_cache[m_hover_id].normal = pos_and_normal.second; - // Do not update immediately, wait until the mouse is released. - // m_parent.post_event(SimpleEvent(EVT_GLCANVAS_SCHEDULE_BACKGROUND_PROCESS)); - } + if (m_hover_id != -1) { + std::pair pos_and_normal; + if (! unproject_on_mesh(data.mouse_pos.cast(), pos_and_normal)) + return; + m_model_object->sla_drain_holes[m_hover_id].m_pos = pos_and_normal.first; + m_model_object->sla_drain_holes[m_hover_id].m_normal = pos_and_normal.second; } } @@ -661,17 +639,12 @@ ClippingPlane GLGizmoHollow::get_sla_clipping_plane() const void GLGizmoHollow::on_render_input_window(float x, float y, float bottom_limit) { - if (!m_model_object) + if (! m_model_object) return; bool first_run = true; // This is a hack to redraw the button when all points are removed, // so it is not delayed until the background process finishes. RENDER_AGAIN: - //m_imgui->set_next_window_pos(x, y, ImGuiCond_Always); - //const ImVec2 window_size(m_imgui->scaled(18.f, 16.f)); - //ImGui::SetNextWindowPos(ImVec2(x, y - std::max(0.f, y+window_size.y-bottom_limit) )); - //ImGui::SetNextWindowSize(ImVec2(window_size)); - const float approx_height = m_imgui->scaled(18.0f); y = std::min(y, bottom_limit - approx_height); m_imgui->set_next_window_pos(x, y, ImGuiCond_Always); @@ -679,7 +652,6 @@ RENDER_AGAIN: m_imgui->begin(on_get_name(), ImGuiWindowFlags_NoMove | ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoCollapse); // First calculate width of all the texts that are could possibly be shown. We will decide set the dialog width based on that: - const float settings_sliders_left = std::max(m_imgui->calc_text_size(m_desc.at("minimal_distance")).x, m_imgui->calc_text_size(m_desc.at("points_density")).x) + m_imgui->scaled(1.f); const float clipping_slider_left = std::max(m_imgui->calc_text_size(m_desc.at("clipping_of_view")).x, m_imgui->calc_text_size(m_desc.at("reset_direction")).x) + m_imgui->scaled(1.5f); const float diameter_slider_left = m_imgui->calc_text_size(m_desc.at("head_diameter")).x + m_imgui->scaled(1.f); @@ -690,125 +662,72 @@ RENDER_AGAIN: float window_width = minimal_slider_width + std::max(std::max(settings_sliders_left, clipping_slider_left), diameter_slider_left); window_width = std::max(std::max(window_width, buttons_width_approx), lock_supports_width_approx); - bool force_refresh = false; bool remove_selected = false; bool remove_all = false; - if (m_editing_mode) { + if (m_imgui->button(m_desc.at("hollow"))) + hollow_mesh(); - if (m_imgui->button(m_desc.at("hollow"))) - hollow_mesh(); + float diameter_upper_cap = 20.f; //static_cast(wxGetApp().preset_bundle->sla_prints.get_edited_preset().config.option("support_pillar_diameter"))->value; + if (m_new_hole_radius > diameter_upper_cap) + m_new_hole_radius = diameter_upper_cap; + m_imgui->text(m_desc.at("head_diameter")); + ImGui::SameLine(diameter_slider_left); + ImGui::PushItemWidth(window_width - diameter_slider_left); - float diameter_upper_cap = static_cast(wxGetApp().preset_bundle->sla_prints.get_edited_preset().config.option("support_pillar_diameter"))->value; - if (m_new_point_head_diameter > diameter_upper_cap) - m_new_point_head_diameter = diameter_upper_cap; - m_imgui->text(m_desc.at("head_diameter")); - ImGui::SameLine(diameter_slider_left); - ImGui::PushItemWidth(window_width - diameter_slider_left); - - // Following is a nasty way to: - // - save the initial value of the slider before one starts messing with it - // - keep updating the head radius during sliding so it is continuosly refreshed in 3D scene - // - take correct undo/redo snapshot after the user is done with moving the slider - float initial_value = m_new_point_head_diameter; - ImGui::SliderFloat("", &m_new_point_head_diameter, 0.1f, diameter_upper_cap, "%.1f"); - if (ImGui::IsItemClicked()) { - if (m_old_point_head_diameter == 0.f) - m_old_point_head_diameter = initial_value; - } - if (ImGui::IsItemEdited()) { - for (auto& cache_entry : m_editing_cache) - if (cache_entry.selected) - cache_entry.support_point.head_front_radius = m_new_point_head_diameter / 2.f; - } - if (ImGui::IsItemDeactivatedAfterEdit()) { - // momentarily restore the old value to take snapshot - for (auto& cache_entry : m_editing_cache) - if (cache_entry.selected) - cache_entry.support_point.head_front_radius = m_old_point_head_diameter / 2.f; - float backup = m_new_point_head_diameter; - m_new_point_head_diameter = m_old_point_head_diameter; - Plater::TakeSnapshot snapshot(wxGetApp().plater(), _(L("Change drainage hole diameter"))); - m_new_point_head_diameter = backup; - for (auto& cache_entry : m_editing_cache) - if (cache_entry.selected) - cache_entry.support_point.head_front_radius = m_new_point_head_diameter / 2.f; - m_old_point_head_diameter = 0.f; - } - - // !!!! Something as above should be done for the cone angle - m_imgui->text("Hole taper: "); - ImGui::SameLine(); - ImGui::SliderFloat(" ", &m_new_cone_angle, -1.f, 1.f, "%.1f"); - m_imgui->text("Hole height: "); - ImGui::SameLine(); - ImGui::SliderFloat(" ", &m_new_cone_height, 0.1f, 10.f, "%.1f"); - - m_imgui->disabled_begin(m_selection_empty); - remove_selected = m_imgui->button(m_desc.at("remove_selected")); - m_imgui->disabled_end(); - - m_imgui->disabled_begin(m_editing_cache.empty()); - remove_all = m_imgui->button(m_desc.at("remove_all")); - m_imgui->disabled_end(); - - m_imgui->text(" "); // vertical gap - - - m_imgui->text("Offset: "); - ImGui::SameLine(); - ImGui::SliderFloat(" ", &m_offset, 0.f, 5.f, "%.1f"); - m_imgui->text("Adaptibility: "); - ImGui::SameLine(); - ImGui::SliderFloat(" ", &m_adaptability, 0.f, 1.f, "%.1f"); + // Following is a nasty way to: + // - save the initial value of the slider before one starts messing with it + // - keep updating the head radius during sliding so it is continuosly refreshed in 3D scene + // - take correct undo/redo snapshot after the user is done with moving the slider + float initial_value = m_new_hole_radius; + ImGui::SliderFloat("", &m_new_hole_radius, 0.1f, diameter_upper_cap, "%.1f"); + if (ImGui::IsItemClicked()) { + if (m_old_hole_radius == 0.f) + m_old_hole_radius = initial_value; } - else { // not in editing mode: - m_imgui->text(m_desc.at("minimal_distance")); - ImGui::SameLine(settings_sliders_left); - ImGui::PushItemWidth(window_width - settings_sliders_left); - - std::vector opts = get_config_options({"support_points_density_relative", "support_points_minimal_distance"}); - float density = static_cast(opts[0])->value; - float minimal_point_distance = static_cast(opts[1])->value; - - ImGui::SliderFloat("", &minimal_point_distance, 0.f, 20.f, "%.f mm"); - bool slider_clicked = ImGui::IsItemClicked(); // someone clicked the slider - bool slider_edited = ImGui::IsItemEdited(); // someone is dragging the slider - bool slider_released = ImGui::IsItemDeactivatedAfterEdit(); // someone has just released the slider - - m_imgui->text(m_desc.at("points_density")); - ImGui::SameLine(settings_sliders_left); - - ImGui::SliderFloat(" ", &density, 0.f, 200.f, "%.f %%"); - slider_clicked |= ImGui::IsItemClicked(); - slider_edited |= ImGui::IsItemEdited(); - slider_released |= ImGui::IsItemDeactivatedAfterEdit(); - - if (slider_clicked) { // stash the values of the settings so we know what to revert to after undo - m_minimal_point_distance_stash = minimal_point_distance; - m_density_stash = density; - } - if (slider_edited) { - m_model_object->config.opt("support_points_minimal_distance", true)->value = minimal_point_distance; - m_model_object->config.opt("support_points_density_relative", true)->value = (int)density; - } - if (slider_released) { - m_model_object->config.opt("support_points_minimal_distance", true)->value = m_minimal_point_distance_stash; - m_model_object->config.opt("support_points_density_relative", true)->value = (int)m_density_stash; - Plater::TakeSnapshot snapshot(wxGetApp().plater(), _(L("Support parameter change"))); - m_model_object->config.opt("support_points_minimal_distance", true)->value = minimal_point_distance; - m_model_object->config.opt("support_points_density_relative", true)->value = (int)density; - wxGetApp().obj_list()->update_and_show_object_settings_item(); - } - - - m_imgui->disabled_begin(m_normal_cache.empty()); - remove_all = m_imgui->button(m_desc.at("remove_all")); - m_imgui->disabled_end(); - + if (ImGui::IsItemEdited()) { + for (size_t idx=0; idxsla_drain_holes[idx].m_radius = m_new_hole_radius; + } + if (ImGui::IsItemDeactivatedAfterEdit()) { + // momentarily restore the old value to take snapshot + for (size_t idx=0; idxsla_drain_holes[idx].m_radius = m_old_hole_radius; + float backup = m_new_hole_radius; + m_new_hole_radius = m_old_hole_radius; + Plater::TakeSnapshot snapshot(wxGetApp().plater(), _(L("Change drainage hole diameter"))); + m_new_hole_radius = backup; + for (size_t idx=0; idxsla_drain_holes[idx].m_radius = m_new_hole_radius; + m_old_hole_radius = 0.f; } + // !!!! Something as above should be done for the undo/redo + m_imgui->text("Hole height: "); + ImGui::SameLine(); + ImGui::SliderFloat(" ", &m_new_hole_height, 0.1f, 10.f, "%.1f"); + + m_imgui->disabled_begin(m_selection_empty); + remove_selected = m_imgui->button(m_desc.at("remove_selected")); + m_imgui->disabled_end(); + + m_imgui->disabled_begin(m_model_object->sla_drain_holes.empty()); + remove_all = m_imgui->button(m_desc.at("remove_all")); + m_imgui->disabled_end(); + + m_imgui->text(" "); // vertical gap + + + m_imgui->text("Offset: "); + ImGui::SameLine(); + ImGui::SliderFloat(" ", &m_offset, 0.f, 5.f, "%.1f"); + m_imgui->text("Adaptibility: "); + ImGui::SameLine(); + ImGui::SliderFloat(" ", &m_adaptability, 0.f, 1.f, "%.1f"); // Following is rendered in both editing and non-editing mode: m_imgui->text(""); @@ -827,7 +746,6 @@ RENDER_AGAIN: if (ImGui::SliderFloat(" ", &m_clipping_plane_distance, 0.f, 1.f, "%.2f")) update_clipping_plane(true); - if (m_imgui->button("?")) { wxGetApp().CallAfter([]() { SlaGizmoHelpDialog help_dlg; @@ -835,18 +753,18 @@ RENDER_AGAIN: }); } - m_imgui->end(); - - if (m_editing_mode != m_old_editing_state) { // user toggled between editing/non-editing mode - m_parent.toggle_sla_auxiliaries_visibility(!m_editing_mode, m_model_object, m_active_instance); + if (m_imgui->checkbox(m_desc["show_supports"], m_show_supports)) { + m_parent.toggle_sla_auxiliaries_visibility(m_show_supports, m_model_object, m_active_instance); force_refresh = true; } - m_old_editing_state = m_editing_mode; + + m_imgui->end(); + if (remove_selected || remove_all) { force_refresh = false; m_parent.set_as_dirty(); - bool was_in_editing = m_editing_mode; + if (remove_all) { select_point(AllPoints); delete_selected_points(true); // true - delete regardless of locked status @@ -927,12 +845,11 @@ void GLGizmoHollow::on_set_state() // Set default head diameter from config. const DynamicPrintConfig& cfg = wxGetApp().preset_bundle->sla_prints.get_edited_preset().config; - m_new_point_head_diameter = static_cast(cfg.option("support_head_front_diameter"))->value; + m_new_hole_radius = static_cast(cfg.option("support_head_front_diameter"))->value; } if (m_state == Off && m_old_state != Off) { // the gizmo was just turned Off //Plater::TakeSnapshot snapshot(wxGetApp().plater(), _(L("SLA gizmo turned off"))); m_parent.toggle_model_objects_visibility(true); - m_normal_cache.clear(); m_clipping_plane_distance = 0.f; // Release clippers and the AABB raycaster. m_object_clipper.reset(); @@ -951,27 +868,27 @@ void GLGizmoHollow::on_start_dragging() if (m_hover_id != -1) { select_point(NoPoints); select_point(m_hover_id); - m_point_before_drag = m_editing_cache[m_hover_id]; + m_hole_before_drag = m_model_object->sla_drain_holes[m_hover_id].m_pos; } else - m_point_before_drag = CacheEntry(); + m_hole_before_drag = Vec3f::Zero(); } void GLGizmoHollow::on_stop_dragging() { if (m_hover_id != -1) { - CacheEntry backup = m_editing_cache[m_hover_id]; + Vec3f backup = m_model_object->sla_drain_holes[m_hover_id].m_pos; - if (m_point_before_drag.support_point.pos != Vec3f::Zero() // some point was touched - && backup.support_point.pos != m_point_before_drag.support_point.pos) // and it was moved, not just selected + if (m_hole_before_drag != Vec3f::Zero() // some point was touched + && backup != m_hole_before_drag) // and it was moved, not just selected { - m_editing_cache[m_hover_id] = m_point_before_drag; + m_model_object->sla_drain_holes[m_hover_id].m_pos = m_hole_before_drag; Plater::TakeSnapshot snapshot(wxGetApp().plater(), _(L("Move drainage hole"))); - m_editing_cache[m_hover_id] = backup; + m_model_object->sla_drain_holes[m_hover_id].m_pos = backup; } } - m_point_before_drag = CacheEntry(); + m_hole_before_drag = Vec3f::Zero(); } @@ -981,9 +898,8 @@ void GLGizmoHollow::on_load(cereal::BinaryInputArchive& ar) ar(m_clipping_plane_distance, *m_clipping_plane, m_model_object_id, - m_new_point_head_diameter, - m_normal_cache, - m_editing_cache, + m_new_hole_radius, + m_selected, m_selection_empty ); } @@ -995,9 +911,8 @@ void GLGizmoHollow::on_save(cereal::BinaryOutputArchive& ar) const ar(m_clipping_plane_distance, *m_clipping_plane, m_model_object_id, - m_new_point_head_diameter, - m_normal_cache, - m_editing_cache, + m_new_hole_radius, + m_selected, m_selection_empty ); } @@ -1006,63 +921,41 @@ void GLGizmoHollow::on_save(cereal::BinaryOutputArchive& ar) const void GLGizmoHollow::select_point(int i) { - if (! m_editing_mode) { - std::cout << "DEBUGGING: select_point called when out of editing mode!" << std::endl; - std::abort(); - } - if (i == AllPoints || i == NoPoints) { - for (auto& point_and_selection : m_editing_cache) - point_and_selection.selected = ( i == AllPoints ); + m_selected.assign(m_selected.size(), i == AllPoints); m_selection_empty = (i == NoPoints); if (i == AllPoints) - m_new_point_head_diameter = m_editing_cache[0].support_point.head_front_radius * 2.f; + m_new_hole_radius = m_model_object->sla_drain_holes[0].m_radius; } else { - m_editing_cache[i].selected = true; + while (size_t(i) >= m_selected.size()) + m_selected.push_back(false); + m_selected[i] = true; m_selection_empty = false; - m_new_point_head_diameter = m_editing_cache[i].support_point.head_front_radius * 2.f; + m_new_hole_radius = m_model_object->sla_drain_holes[i].m_radius; } } void GLGizmoHollow::unselect_point(int i) { - if (! m_editing_mode) { - std::cout << "DEBUGGING: unselect_point called when out of editing mode!" << std::endl; - std::abort(); - } - - m_editing_cache[i].selected = false; + m_selected[i] = false; m_selection_empty = true; - for (const CacheEntry& ce : m_editing_cache) { - if (ce.selected) { + for (const bool sel : m_selected) { + if (sel) { m_selection_empty = false; break; } } } - -bool GLGizmoHollow::unsaved_changes() const -{ - if (m_editing_cache.size() != m_normal_cache.size()) - return true; - - for (size_t i=0; isla_drain_holes.size(), false); } - void GLGizmoHollow::update_clipping_plane(bool keep_normal) const { Vec3d normal = (keep_normal && m_clipping_plane->get_normal() != Vec3d::Zero() ? diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp index afaaf659b5..ce3d60f27b 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp @@ -25,7 +25,7 @@ private: ObjectID m_model_object_id = 0; int m_active_instance = -1; float m_active_instance_bb_radius; // to cache the bb - mutable double m_z_shift = 0.f; + mutable double m_z_shift = 0.; bool unproject_on_mesh(const Vec2d& mouse_pos, std::pair& pos_and_normal); const float RenderPointScale = 1.f; @@ -46,27 +46,26 @@ private: class CacheEntry { public: CacheEntry() : - support_point(sla::SupportPoint()), selected(false), normal(Vec3f::Zero()) {} + drain_hole(sla::DrainHole()), selected(false) {} - CacheEntry(const sla::SupportPoint& point, bool sel = false, const Vec3f& norm = Vec3f::Zero()) : - support_point(point), selected(sel), normal(norm) {} + CacheEntry(const sla::DrainHole& point, bool sel = false) : + drain_hole(point), selected(sel) {} bool operator==(const CacheEntry& rhs) const { - return (support_point == rhs.support_point); + return (drain_hole == rhs.drain_hole); } bool operator!=(const CacheEntry& rhs) const { return ! ((*this) == rhs); } - sla::SupportPoint support_point; + sla::DrainHole drain_hole; bool selected; // whether the point is selected - Vec3f normal; template void serialize(Archive & ar) { - ar(support_point, selected, normal); + ar(drain_hole, selected); } }; @@ -97,17 +96,14 @@ private: bool unsaved_changes() const; const TriangleMesh* mesh() const; - bool m_editing_mode = true; // Is editing mode active? - bool m_old_editing_state = false; // To keep track of whether the user toggled between the modes (needed for imgui refreshes). - float m_new_point_head_diameter; // Size of a new point. - float m_new_cone_angle = 0.f; - float m_new_cone_height = 5.f; - CacheEntry m_point_before_drag; // undo/redo - so we know what state was edited - float m_old_point_head_diameter = 0.; // the same + bool m_show_supports = true; + float m_new_hole_radius; // Size of a new hole. + float m_new_hole_height = 5.f; + float m_old_hole_radius = 0.; // undo/redo - so we know what state was edited + Vec3f m_hole_before_drag = Vec3f::Zero(); float m_minimal_point_distance_stash = 0.f; // and again float m_density_stash = 0.f; // and again - mutable std::vector m_editing_cache; // a support point and whether it is currently selected - std::vector m_normal_cache; // to restore after discarding changes or undo/redo + mutable std::vector m_selected; // which holes are currently selected float m_offset = 2.f; float m_adaptability = 1.f; @@ -148,7 +144,7 @@ protected: void on_set_hover_id() override { - if (! m_editing_mode || (int)m_editing_cache.size() <= m_hover_id) + if (int(m_model_object->sla_drain_holes.size()) <= m_hover_id) m_hover_id = -1; } void on_start_dragging() override; diff --git a/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp b/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp index be200b56d6..f4427638b1 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp @@ -750,20 +750,31 @@ bool GLGizmosManager::on_key(wxKeyEvent& evt) if (evt.GetEventType() == wxEVT_KEY_UP) { - if (m_current == SlaSupports) + if (m_current == SlaSupports || m_current == Hollow) { - GLGizmoSlaSupports* gizmo = dynamic_cast(get_current()); + bool is_editing = true; + bool is_rectangle_dragging = false; + + if (m_current == SlaSupports) { + GLGizmoSlaSupports* gizmo = dynamic_cast(get_current()); + is_editing = gizmo->is_in_editing_mode(); + is_rectangle_dragging = gizmo->is_selection_rectangle_dragging(); + } + else { + GLGizmoHollow* gizmo = dynamic_cast(get_current()); + is_rectangle_dragging = gizmo->is_selection_rectangle_dragging(); + } if (keyCode == WXK_SHIFT) { // shift has been just released - SLA gizmo might want to close rectangular selection. - if (gizmo_event(SLAGizmoEventType::ShiftUp) || (gizmo->is_in_editing_mode() && gizmo->is_selection_rectangle_dragging())) + if (gizmo_event(SLAGizmoEventType::ShiftUp) || (is_editing && is_rectangle_dragging)) processed = true; } else if (keyCode == WXK_ALT) { // alt has been just released - SLA gizmo might want to close rectangular selection. - if (gizmo_event(SLAGizmoEventType::AltUp) || (gizmo->is_in_editing_mode() && gizmo->is_selection_rectangle_dragging())) + if (gizmo_event(SLAGizmoEventType::AltUp) || (is_editing && is_rectangle_dragging)) processed = true; } } From ac8eab5fa8e6c38faf788349bcb4f0f707d6bbbe Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Fri, 8 Nov 2019 16:51:43 +0100 Subject: [PATCH 042/336] Enhanced hollowing scheme, closing distance working as expected. --- src/libslic3r/OpenVDBUtils.cpp | 109 +++---------------- src/libslic3r/OpenVDBUtils.hpp | 33 ++++-- src/libslic3r/PrintConfig.cpp | 10 +- src/libslic3r/PrintConfig.hpp | 9 +- src/libslic3r/SLA/Hollowing.cpp | 135 ++++++++++++++++++------ src/libslic3r/SLAPrint.cpp | 8 +- src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp | 8 +- src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp | 9 +- src/slic3r/GUI/Preset.cpp | 2 +- src/slic3r/GUI/Tab.cpp | 2 +- 10 files changed, 160 insertions(+), 165 deletions(-) diff --git a/src/libslic3r/OpenVDBUtils.cpp b/src/libslic3r/OpenVDBUtils.cpp index 91ccdd5c4e..c76bad96c5 100644 --- a/src/libslic3r/OpenVDBUtils.cpp +++ b/src/libslic3r/OpenVDBUtils.cpp @@ -2,9 +2,9 @@ #include "OpenVDBUtils.hpp" #include #include -#include -#include -#include "MTUtils.hpp" +#include + +//#include "MTUtils.hpp" namespace Slic3r { @@ -58,7 +58,7 @@ void Contour3DDataAdapter::getIndexSpacePoint(size_t n, // docs say it should be called ones. It does a mutex lock-unlock sequence all // even if was called previously. -openvdb::FloatGrid::Ptr meshToVolume(const TriangleMesh &mesh, +openvdb::FloatGrid::Ptr mesh_to_grid(const TriangleMesh &mesh, const openvdb::math::Transform &tr, float exteriorBandWidth, float interiorBandWidth, @@ -70,7 +70,7 @@ openvdb::FloatGrid::Ptr meshToVolume(const TriangleMesh &mesh, interiorBandWidth, flags); } -static openvdb::FloatGrid::Ptr meshToVolume(const sla::Contour3D &mesh, +openvdb::FloatGrid::Ptr mesh_to_grid(const sla::Contour3D &mesh, const openvdb::math::Transform &tr, float exteriorBandWidth, float interiorBandWidth, @@ -82,13 +82,8 @@ static openvdb::FloatGrid::Ptr meshToVolume(const sla::Contour3D &mesh, flags); } -inline Vec3f to_vec3f(const openvdb::Vec3s &v) { return Vec3f{v.x(), v.y(), v.z()}; } -inline Vec3d to_vec3d(const openvdb::Vec3s &v) { return to_vec3f(v).cast(); } -inline Vec3i to_vec3i(const openvdb::Vec3I &v) { return Vec3i{int(v[0]), int(v[1]), int(v[2])}; } -inline Vec4i to_vec4i(const openvdb::Vec4I &v) { return Vec4i{int(v[0]), int(v[1]), int(v[2]), int(v[3])}; } - template -sla::Contour3D __volumeToMesh(const Grid &grid, +sla::Contour3D _volumeToMesh(const Grid &grid, double isovalue, double adaptivity, bool relaxDisorientedTriangles) @@ -114,97 +109,27 @@ sla::Contour3D __volumeToMesh(const Grid &grid, return ret; } -template inline -Mesh _volumeToMesh(const openvdb::FloatGrid &grid, - double isovalue = 0.0, - double adaptivity = 0.0, - bool relaxDisorientedTriangles = true); - -template<> inline -TriangleMesh _volumeToMesh(const openvdb::FloatGrid &grid, +TriangleMesh grid_to_mesh(const openvdb::FloatGrid &grid, double isovalue, double adaptivity, bool relaxDisorientedTriangles) { - return to_triangle_mesh(__volumeToMesh(grid, isovalue, adaptivity, - relaxDisorientedTriangles)); + return to_triangle_mesh( + _volumeToMesh(grid, isovalue, adaptivity, relaxDisorientedTriangles)); } -template<> inline -sla::Contour3D _volumeToMesh(const openvdb::FloatGrid &grid, - double isovalue, - double adaptivity, - bool relaxDisorientedTriangles) +sla::Contour3D grid_to_contour3d(const openvdb::FloatGrid &grid, + double isovalue, + double adaptivity, + bool relaxDisorientedTriangles) { - return __volumeToMesh(grid, isovalue, adaptivity, - relaxDisorientedTriangles); + return _volumeToMesh(grid, isovalue, adaptivity, + relaxDisorientedTriangles); } -TriangleMesh volumeToMesh(const openvdb::FloatGrid &grid, - double isovalue, - double adaptivity, - bool relaxDisorientedTriangles) +openvdb::FloatGrid::Ptr redistance_grid(const openvdb::FloatGrid &grid, double iso, double er, double ir) { - return _volumeToMesh(grid, isovalue, adaptivity, - relaxDisorientedTriangles); -} - -template> -inline void _scale(S s, TriangleMesh &m) { m.scale(float(s)); } - -template> -inline void _scale(S s, sla::Contour3D &m) -{ - for (auto &p : m.points) p *= s; -} - -template -remove_cvref_t _hollowed_interior(Mesh &&mesh, - double min_thickness, - double quality, - HollowingFilter filt) -{ - using MMesh = remove_cvref_t; - MMesh imesh{std::forward(mesh)}; - - static const double QUALITY_COEFF = 7.; - - // I can't figure out how to increase the grid resolution through openvdb API - // so the model will be scaled up before conversion and the result scaled - // down. Voxels have a unit size. If I set voxelSize smaller, it scales - // the whole geometry down, and doesn't increase the number of voxels. - auto scale = (1.0 + QUALITY_COEFF * quality); // max 8x upscale, min is native voxel size - - _scale(scale, imesh); - - double offset = scale * min_thickness; - float range = float(std::max(2 * offset, scale)); - auto gridptr = meshToVolume(imesh, {}, 0.1f * float(offset), range); - - assert(gridptr); - - if (!gridptr) { - BOOST_LOG_TRIVIAL(error) << "Returned OpenVDB grid is NULL"; - return MMesh{}; - } - - if (filt) filt(*gridptr, min_thickness, scale); - - double iso_surface = -offset; - double adaptivity = 0.; - auto omesh = _volumeToMesh(*gridptr, iso_surface, adaptivity); - - _scale(1. / scale, omesh); - - return omesh; -} - -TriangleMesh hollowed_interior(const TriangleMesh &mesh, - double min_thickness, - double quality, - HollowingFilter filt) -{ - return _hollowed_interior(mesh, min_thickness, quality, filt); + return openvdb::tools::levelSetRebuild(grid, float(iso), float(er), float(ir)); } } // namespace Slic3r diff --git a/src/libslic3r/OpenVDBUtils.hpp b/src/libslic3r/OpenVDBUtils.hpp index bd52e81eec..151647bfc4 100644 --- a/src/libslic3r/OpenVDBUtils.hpp +++ b/src/libslic3r/OpenVDBUtils.hpp @@ -7,26 +7,37 @@ namespace Slic3r { -openvdb::FloatGrid::Ptr meshToVolume(const TriangleMesh & mesh, +inline Vec3f to_vec3f(const openvdb::Vec3s &v) { return Vec3f{v.x(), v.y(), v.z()}; } +inline Vec3d to_vec3d(const openvdb::Vec3s &v) { return to_vec3f(v).cast(); } +inline Vec3i to_vec3i(const openvdb::Vec3I &v) { return Vec3i{int(v[0]), int(v[1]), int(v[2])}; } +inline Vec4i to_vec4i(const openvdb::Vec4I &v) { return Vec4i{int(v[0]), int(v[1]), int(v[2]), int(v[3])}; } + +openvdb::FloatGrid::Ptr mesh_to_grid(const TriangleMesh & mesh, const openvdb::math::Transform &tr = {}, float exteriorBandWidth = 3.0f, float interiorBandWidth = 3.0f, int flags = 0); -TriangleMesh volumeToMesh(const openvdb::FloatGrid &grid, +openvdb::FloatGrid::Ptr mesh_to_grid(const sla::Contour3D & mesh, + const openvdb::math::Transform &tr = {}, + float exteriorBandWidth = 3.0f, + float interiorBandWidth = 3.0f, + int flags = 0); + +sla::Contour3D grid_to_contour3d(const openvdb::FloatGrid &grid, + double isovalue, + double adaptivity, + bool relaxDisorientedTriangles = true); + +TriangleMesh grid_to_mesh(const openvdb::FloatGrid &grid, double isovalue = 0.0, double adaptivity = 0.0, bool relaxDisorientedTriangles = true); -using HollowingFilter = std::function; - -// Generate an interior for any solid geometry maintaining a given minimum -// wall thickness. The returned mesh has triangles with normals facing inside -// the mesh so the result can be directly merged with the input to finish the -// hollowing. -TriangleMesh hollowed_interior(const TriangleMesh &mesh, double min_thickness, - double quality = 0.5, - HollowingFilter filt = nullptr); +openvdb::FloatGrid::Ptr redistance_grid(const openvdb::FloatGrid &grid, + double iso, + double ext_range = 3., + double int_range = 3.); } // namespace Slic3r diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index 96b84cf817..58212f1289 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -2856,15 +2856,13 @@ void PrintConfigDef::init_sla_params() def->mode = comExpert; def->set_default_value(new ConfigOptionFloat(0.5)); - def = this->add("hollowing_flatness", coFloat); - def->label = L("Hollowing smoothness"); + def = this->add("hollowing_closing_distance", coFloat); + def->label = L("Hollowing closing distance"); def->category = L("Hollowing"); - def->tooltip = L("The cavity shape is a smoothed version of the outside original shape. " - "Possible values span from 0 to 1 and control the amount of surface smoothing."); + def->tooltip = L(""); def->min = 0; - def->max = 1; def->mode = comExpert; - def->set_default_value(new ConfigOptionFloat(0.5)); + def->set_default_value(new ConfigOptionFloat(2.0)); } void PrintConfigDef::handle_legacy(t_config_option_key &opt_key, std::string &value) diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index 9ed63e5d4c..671a6ce8e1 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -1100,10 +1100,9 @@ public: // Indirectly controls the voxel size (resolution) used by openvdb ConfigOptionFloat hollowing_quality; - - // Indirectly controls the amount of filtering used to blur geometry - // features in the created cavity. - ConfigOptionFloat hollowing_flatness; + + // Indirectly controls the minimum size of created cavities. + ConfigOptionFloat hollowing_closing_distance; protected: void initialize(StaticCacheBase &cache, const char *base_ptr) @@ -1144,7 +1143,7 @@ protected: OPT_PTR(hollowing_enable); OPT_PTR(hollowing_min_thickness); OPT_PTR(hollowing_quality); - OPT_PTR(hollowing_flatness); + OPT_PTR(hollowing_closing_distance); } }; diff --git a/src/libslic3r/SLA/Hollowing.cpp b/src/libslic3r/SLA/Hollowing.cpp index 4309003134..c3993f2c89 100644 --- a/src/libslic3r/SLA/Hollowing.cpp +++ b/src/libslic3r/SLA/Hollowing.cpp @@ -1,55 +1,122 @@ -#include "Hollowing.hpp" -#include -#include -#include #include +//#include +#include + +#include "Hollowing.hpp" +#include + namespace Slic3r { namespace sla { -namespace { +//namespace { -void filter_grid_sla(openvdb::FloatGrid &grid, double scale, double /*thickness*/, double flatness) -{ - static const double ROUNDNESS_COEFF = 1.; +//void filter_grid_sla(openvdb::FloatGrid::Ptr &grid, double scale, double /*thickness*/, double flatness, double closing_dist) +//{ +// static const double ROUNDNESS_COEFF = 1.; - // Filtering: - if (flatness > 0.) { - double rounding = ROUNDNESS_COEFF * flatness; - int width = int(rounding * scale); - int count = 1; - openvdb::tools::Filter{grid}.gaussian(width, count); +// // Filtering: +// if (flatness > 0.) { +// double rounding = ROUNDNESS_COEFF * flatness; +// int width = int(rounding * scale); +// int count = 1; +// openvdb::tools::Filter{*grid}.gaussian(width, count); +// } +//} + +//} + +template> +inline void _scale(S s, TriangleMesh &m) { m.scale(float(s)); } + +template> +inline void _scale(S s, sla::Contour3D &m) +{ + for (auto &p : m.points) p *= s; +} + +template +remove_cvref_t _grid_to_mesh(const openvdb::FloatGrid &grid, + double isosurf, + double adapt); + +template<> +TriangleMesh _grid_to_mesh(const openvdb::FloatGrid &grid, + double isosurf, + double adapt) +{ + return grid_to_mesh(grid, isosurf, adapt); +} + +template<> +sla::Contour3D _grid_to_mesh(const openvdb::FloatGrid &grid, + double isosurf, + double adapt) +{ + return grid_to_contour3d(grid, isosurf, adapt); +} + +template +remove_cvref_t _generate_interior(Mesh &&mesh, + double min_thickness, + double voxel_scale, + double closing_dist) +{ +// namespace plc = std::placeholders; +// auto filt = std::bind(redist_grid_sla, plc::_1, plc::_2, plc::_3, flatness, closing_dist); +// return hollowed_interior(mesh, min_thickness, quality, filt); + + using MMesh = remove_cvref_t; + MMesh imesh{std::forward(mesh)}; + + _scale(voxel_scale, imesh); + + double offset = voxel_scale * min_thickness; + double D = voxel_scale * closing_dist; + float out_range = 0.1f * float(offset); + float in_range = 1.1f * float(offset + D); + auto gridptr = mesh_to_grid(imesh, {}, out_range, in_range); + + assert(gridptr); + + if (!gridptr) { + BOOST_LOG_TRIVIAL(error) << "Returned OpenVDB grid is NULL"; + return MMesh{}; } -} -// openvdb::tools::levelSetRebuild(grid, -float(thickness * 2)); -// filter_grid_sla(grid, scale, thickness, flatness); - -// openvdb::tools::levelSetRebuild(grid, float(thickness)); - - -void redist_grid_sla(openvdb::FloatGrid &grid, double scale, double thickness, double flatness) -{ -// openvdb::tools::levelSetRebuild(grid, -float(scale * thickness)); + if (closing_dist > .0) { + gridptr = redistance_grid(*gridptr, -(offset + D), double(in_range)); + } else { + D = -offset; + } - openvdb::tools::LevelSetFilter filt{grid}; +// openvdb::tools::Filter filt{*gridptr}; +// filt.offset(float(offset + D)); -// filt.gaussian(int(flatness * scale)); + double iso_surface = D; + double adaptivity = 0.; + auto omesh = _grid_to_mesh(*gridptr, iso_surface, adaptivity); -// openvdb::tools::levelSetRebuild(grid, float(scale * thickness)); - //grid = openvdb::tools::topologyToLevelSet(grid); -} - + _scale(1. / voxel_scale, omesh); + + return omesh; } TriangleMesh generate_interior(const TriangleMesh &mesh, double min_thickness, double quality, - double flatness) + double closing_dist) { - namespace plc = std::placeholders; - auto filt = std::bind(filter_grid_sla, plc::_1, plc::_2, plc::_3, flatness); - return hollowed_interior(mesh, min_thickness, quality, filt); + static const double MAX_OVERSAMPL = 7.; + + // I can't figure out how to increase the grid resolution through openvdb API + // so the model will be scaled up before conversion and the result scaled + // down. Voxels have a unit size. If I set voxelSize smaller, it scales + // the whole geometry down, and doesn't increase the number of voxels. + // + // max 8x upscale, min is native voxel size + auto voxel_scale = (1.0 + MAX_OVERSAMPL * quality); + return _generate_interior(mesh, min_thickness, voxel_scale, closing_dist); } }} // namespace Slic3r::sla diff --git a/src/libslic3r/SLAPrint.cpp b/src/libslic3r/SLAPrint.cpp index b150a4f768..3273cbcfed 100644 --- a/src/libslic3r/SLAPrint.cpp +++ b/src/libslic3r/SLAPrint.cpp @@ -776,10 +776,10 @@ void SLAPrint::process() po.m_hollowing_data.reset(new SLAPrintObject::HollowingData()); double thickness = po.m_config.hollowing_min_thickness.getFloat(); - double accuracy = po.m_config.hollowing_quality.getFloat(); - double blur = po.m_config.hollowing_flatness.getFloat(); + double quality = po.m_config.hollowing_quality.getFloat(); + double closing_d = po.m_config.hollowing_closing_distance.getFloat(); po.m_hollowing_data->interior = - generate_interior(po.transformed_mesh(), thickness, accuracy, blur); + generate_interior(po.transformed_mesh(), thickness, quality, closing_d); if (po.m_hollowing_data->interior.empty()) BOOST_LOG_TRIVIAL(warning) << "Hollowed interior is empty!"; @@ -1755,7 +1755,7 @@ bool SLAPrintObject::invalidate_state_by_config_options(const std::vectortext(" "); // vertical gap - m_imgui->text("Offset: "); ImGui::SameLine(); ImGui::SliderFloat(" ", &m_offset, 0.f, 10.f, "%.1f"); @@ -763,10 +762,9 @@ RENDER_AGAIN: ImGui::SameLine(); ImGui::SliderFloat(" ", &m_accuracy, 0.f, 1.f, "%.1f"); - // TODO: only in expert mode: - m_imgui->text("Smoothness: "); + m_imgui->text("Closing distance: "); ImGui::SameLine(); - ImGui::SliderFloat(" ", &m_smoothness, 0.f, 1.f, "%.1f"); + ImGui::SliderFloat(" ", &m_closing_d, 0.f, 20.f, "%.1f"); } else { // not in editing mode: m_imgui->text(m_desc.at("minimal_distance")); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp index 0cf1e1ecb1..642f7f5a28 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp @@ -109,18 +109,15 @@ private: std::vector m_normal_cache; // to restore after discarding changes or undo/redo float m_offset = 2.0f; - + float m_accuracy = 0.5f; + float m_closing_d = 2.f; + float m_clipping_plane_distance = 0.f; std::unique_ptr m_clipping_plane; - float m_accuracy = 0.5f; - // This map holds all translated description texts, so they can be easily referenced during layout calculations // etc. When language changes, GUI is recreated and this class constructed again, so the change takes effect. std::map m_desc; - - - float m_smoothness = 0.5f; GLSelectionRectangle m_selection_rectangle; diff --git a/src/slic3r/GUI/Preset.cpp b/src/slic3r/GUI/Preset.cpp index 6f511fdec4..3b5a2f9852 100644 --- a/src/slic3r/GUI/Preset.cpp +++ b/src/slic3r/GUI/Preset.cpp @@ -499,7 +499,7 @@ const std::vector& Preset::sla_print_options() "hollowing_enable", "hollowing_min_thickness", "hollowing_quality", - "hollowing_flatness", + "hollowing_closing_distance", "output_filename_format", "default_sla_print_profile", "compatible_printers", diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index 333384802a..6f17abea44 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -3569,7 +3569,7 @@ void TabSLAPrint::build() optgroup->append_single_option_line("hollowing_enable"); optgroup->append_single_option_line("hollowing_min_thickness"); optgroup->append_single_option_line("hollowing_quality"); - optgroup->append_single_option_line("hollowing_flatness"); + optgroup->append_single_option_line("hollowing_closing_distance"); page = add_options_page(_(L("Advanced")), "wrench"); optgroup = page->new_optgroup(_(L("Slicing"))); From b4795e12920ea8f20b796a1f9b3d068b53a03c6f Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Fri, 8 Nov 2019 20:18:14 +0100 Subject: [PATCH 043/336] Unified igl calls in MeshRaycaster and EigenMesh3D MeshRaycaster is still aware of the clipping plane but it now uses EigenMesh3D internally Public interface of both classes is unchanged --- src/libslic3r/SLA/SLACommon.hpp | 3 + src/libslic3r/SLA/SLASupportTreeIGL.cpp | 25 ++++++ src/slic3r/GUI/MeshUtils.cpp | 105 ++++-------------------- src/slic3r/GUI/MeshUtils.hpp | 10 +-- 4 files changed, 51 insertions(+), 92 deletions(-) diff --git a/src/libslic3r/SLA/SLACommon.hpp b/src/libslic3r/SLA/SLACommon.hpp index 6e56b6de75..0a3ee311b3 100644 --- a/src/libslic3r/SLA/SLACommon.hpp +++ b/src/libslic3r/SLA/SLACommon.hpp @@ -189,6 +189,9 @@ public: // Casting a ray on the mesh, returns the distance where the hit occures. hit_result query_ray_hit(const Vec3d &s, const Vec3d &dir) const; + // Casts a ray on the mesh and returns all hits + std::vector query_ray_hits(const Vec3d &s, const Vec3d &dir) const; + class si_result { double m_value; int m_fidx; diff --git a/src/libslic3r/SLA/SLASupportTreeIGL.cpp b/src/libslic3r/SLA/SLASupportTreeIGL.cpp index 03d4a563c0..ea2be6be11 100644 --- a/src/libslic3r/SLA/SLASupportTreeIGL.cpp +++ b/src/libslic3r/SLA/SLASupportTreeIGL.cpp @@ -272,6 +272,31 @@ EigenMesh3D::query_ray_hit(const Vec3d &s, const Vec3d &dir) const return ret; } +std::vector +EigenMesh3D::query_ray_hits(const Vec3d &s, const Vec3d &dir) const +{ + std::vector outs; + std::vector hits; + m_aabb->intersect_ray(m_V, m_F, s, dir, hits); + + // The sort is necessary, the hits are not always sorted. + std::sort(hits.begin(), hits.end(), + [](const igl::Hit& a, const igl::Hit& b) { return a.t < b.t; }); + + // Convert the igl::Hit into hit_result + outs.reserve(hits.size()); + for (const igl::Hit& hit : hits) { + outs.emplace_back(EigenMesh3D::hit_result(*this)); + outs.back().m_t = double(hit.t); + outs.back().m_dir = dir; + outs.back().m_source = s; + if(!std::isinf(hit.t) && !std::isnan(hit.t)) + outs.back().m_face_id = hit.id; + } + + return outs; +} + #ifdef SLIC3R_SLA_NEEDS_WINDTREE EigenMesh3D::si_result EigenMesh3D::signed_distance(const Vec3d &p) const { double sign = 0; double sqdst = 0; int i = 0; Vec3d c; diff --git a/src/slic3r/GUI/MeshUtils.cpp b/src/slic3r/GUI/MeshUtils.cpp index 62a6813a66..8b37161e9d 100644 --- a/src/slic3r/GUI/MeshUtils.cpp +++ b/src/slic3r/GUI/MeshUtils.cpp @@ -5,10 +5,6 @@ #include "slic3r/GUI/Camera.hpp" -// There is an L function in igl that would be overridden by our localization macro. -#undef L -#include - #include @@ -99,59 +95,6 @@ void MeshClipper::recalculate_triangles() } -class MeshRaycaster::AABBWrapper { -public: - AABBWrapper(const TriangleMesh* mesh); - ~AABBWrapper() { m_AABB.deinit(); } - - typedef Eigen::Map> MapMatrixXfUnaligned; - typedef Eigen::Map> MapMatrixXiUnaligned; - igl::AABB m_AABB; - - Vec3f get_hit_pos(const igl::Hit& hit) const; - Vec3f get_hit_normal(const igl::Hit& hit) const; - -private: - const TriangleMesh* m_mesh; -}; - -MeshRaycaster::AABBWrapper::AABBWrapper(const TriangleMesh* mesh) - : m_mesh(mesh) -{ - m_AABB.init( - MapMatrixXfUnaligned(m_mesh->its.vertices.front().data(), m_mesh->its.vertices.size(), 3), - MapMatrixXiUnaligned(m_mesh->its.indices.front().data(), m_mesh->its.indices.size(), 3)); -} - - -MeshRaycaster::MeshRaycaster(const TriangleMesh& mesh) - : m_AABB_wrapper(new AABBWrapper(&mesh)), m_mesh(&mesh) -{ -} - -MeshRaycaster::~MeshRaycaster() -{ - delete m_AABB_wrapper; -} - -Vec3f MeshRaycaster::AABBWrapper::get_hit_pos(const igl::Hit& hit) const -{ - const stl_triangle_vertex_indices& indices = m_mesh->its.indices[hit.id]; - return Vec3f((1-hit.u-hit.v) * m_mesh->its.vertices[indices(0)] - + hit.u * m_mesh->its.vertices[indices(1)] - + hit.v * m_mesh->its.vertices[indices(2)]); -} - - -Vec3f MeshRaycaster::AABBWrapper::get_hit_normal(const igl::Hit& hit) const -{ - const stl_triangle_vertex_indices& indices = m_mesh->its.indices[hit.id]; - Vec3f a(m_mesh->its.vertices[indices(1)] - m_mesh->its.vertices[indices(0)]); - Vec3f b(m_mesh->its.vertices[indices(2)] - m_mesh->its.vertices[indices(0)]); - return Vec3f(a.cross(b)); -} - - bool MeshRaycaster::unproject_on_mesh(const Vec2d& mouse_pos, const Transform3d& trafo, const Camera& camera, Vec3f& position, Vec3f& normal, const ClippingPlane* clipping_plane) const { @@ -164,27 +107,20 @@ bool MeshRaycaster::unproject_on_mesh(const Vec2d& mouse_pos, const Transform3d& ::gluUnProject(mouse_pos(0), viewport[3] - mouse_pos(1), 0., model_mat.data(), proj_mat.data(), viewport.data(), &pt1(0), &pt1(1), &pt1(2)); ::gluUnProject(mouse_pos(0), viewport[3] - mouse_pos(1), 1., model_mat.data(), proj_mat.data(), viewport.data(), &pt2(0), &pt2(1), &pt2(2)); - std::vector hits; - Transform3d inv = trafo.inverse(); - pt1 = inv * pt1; pt2 = inv * pt2; - if (! m_AABB_wrapper->m_AABB.intersect_ray( - AABBWrapper::MapMatrixXfUnaligned(m_mesh->its.vertices.front().data(), m_mesh->its.vertices.size(), 3), - AABBWrapper::MapMatrixXiUnaligned(m_mesh->its.indices.front().data(), m_mesh->its.indices.size(), 3), - pt1.cast(), (pt2-pt1).cast(), hits)) + std::vector hits = m_emesh.query_ray_hits(pt1, pt2-pt1); + if (hits.empty()) return false; // no intersection found - std::sort(hits.begin(), hits.end(), [](const igl::Hit& a, const igl::Hit& b) { return a.t < b.t; }); - unsigned i = 0; // Remove points that are obscured or cut by the clipping plane if (clipping_plane) { for (i=0; iis_point_clipped(trafo * m_AABB_wrapper->get_hit_pos(hits[i]).cast())) + if (! clipping_plane->is_point_clipped(trafo * hits[i].position())) break; if (i==hits.size() || (hits.size()-i) % 2 != 0) { @@ -195,8 +131,8 @@ bool MeshRaycaster::unproject_on_mesh(const Vec2d& mouse_pos, const Transform3d& } // Now stuff the points in the provided vector and calculate normals if asked about them: - position = m_AABB_wrapper->get_hit_pos(hits[i]); - normal = m_AABB_wrapper->get_hit_normal(hits[i]); + position = hits[i].position().cast(); + normal = hits[i].normal().cast(); return true; } @@ -220,24 +156,21 @@ std::vector MeshRaycaster::get_unobscured_idxs(const Geometry::Transfo bool is_obscured = false; // Cast a ray in the direction of the camera and look for intersection with the mesh: - std::vector hits; + std::vector hits; // Offset the start of the ray by EPSILON to account for numerical inaccuracies. - if (m_AABB_wrapper->m_AABB.intersect_ray( - AABBWrapper::MapMatrixXfUnaligned(m_mesh->its.vertices.front().data(), m_mesh->its.vertices.size(), 3), - AABBWrapper::MapMatrixXiUnaligned(m_mesh->its.indices.front().data(), m_mesh->its.indices.size(), 3), - inverse_trafo * pt + direction_to_camera_mesh * EPSILON, direction_to_camera_mesh, hits)) { + hits = m_emesh.query_ray_hits((inverse_trafo * pt + direction_to_camera_mesh * EPSILON).cast(), + direction_to_camera.cast()); - std::sort(hits.begin(), hits.end(), [](const igl::Hit& h1, const igl::Hit& h2) { return h1.t < h2.t; }); + if (! hits.empty()) { // If the closest hit facet normal points in the same direction as the ray, // we are looking through the mesh and should therefore discard the point: - if (m_AABB_wrapper->get_hit_normal(hits.front()).dot(direction_to_camera_mesh) > 0.f) + if (hits.front().normal().dot(direction_to_camera_mesh.cast()) > 0) is_obscured = true; // Eradicate all hits that the caller wants to ignore for (unsigned j=0; jis_point_clipped(trafo.get_matrix() * m_AABB_wrapper->get_hit_pos(hit).cast())) { + if (clipping_plane && clipping_plane->is_point_clipped(trafo.get_matrix() * hits[j].position())) { hits.erase(hits.begin()+j); --j; } @@ -258,17 +191,15 @@ std::vector MeshRaycaster::get_unobscured_idxs(const Geometry::Transfo Vec3f MeshRaycaster::get_closest_point(const Vec3f& point, Vec3f* normal) const { int idx = 0; - Eigen::Matrix closest_point; - m_AABB_wrapper->m_AABB.squared_distance( - AABBWrapper::MapMatrixXfUnaligned(m_mesh->its.vertices.front().data(), m_mesh->its.vertices.size(), 3), - AABBWrapper::MapMatrixXiUnaligned(m_mesh->its.indices.front().data(), m_mesh->its.indices.size(), 3), - point, idx, closest_point); + Vec3d closest_point; + m_emesh.squared_distance(point.cast(), idx, closest_point); if (normal) { - igl::Hit imag_hit; - imag_hit.id = idx; - *normal = m_AABB_wrapper->get_hit_normal(imag_hit); + const stl_triangle_vertex_indices& indices = m_mesh->its.indices[idx]; + Vec3f a(m_mesh->its.vertices[indices(1)] - m_mesh->its.vertices[indices(0)]); + Vec3f b(m_mesh->its.vertices[indices(2)] - m_mesh->its.vertices[indices(0)]); + *normal = Vec3f(a.cross(b)); } - return closest_point; + return closest_point.cast(); } diff --git a/src/slic3r/GUI/MeshUtils.hpp b/src/slic3r/GUI/MeshUtils.hpp index e4c4c20d22..8dae2a2f00 100644 --- a/src/slic3r/GUI/MeshUtils.hpp +++ b/src/slic3r/GUI/MeshUtils.hpp @@ -3,6 +3,7 @@ #include "libslic3r/Point.hpp" #include "libslic3r/Geometry.hpp" +#include "libslic3r/SLA/SLACommon.hpp" #include @@ -93,8 +94,9 @@ private: class MeshRaycaster { public: - MeshRaycaster(const TriangleMesh& mesh); - ~MeshRaycaster(); + MeshRaycaster(const TriangleMesh& mesh) + : m_mesh(&mesh), m_emesh(mesh) + {} void set_transformation(const Geometry::Transformation& trafo); void set_camera(const Camera& camera); @@ -107,9 +109,7 @@ public: Vec3f get_closest_point(const Vec3f& point, Vec3f* normal = nullptr) const; private: - // PIMPL wrapper around igl::AABB so I don't have to include the header-only IGL here - class AABBWrapper; - AABBWrapper* m_AABB_wrapper; + sla::EigenMesh3D m_emesh; const TriangleMesh* m_mesh = nullptr; }; From 35ba7a481cbc38f13fd5777c40412feb7fb4feaf Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Mon, 11 Nov 2019 13:56:05 +0100 Subject: [PATCH 044/336] adding precompiled header should probably be the last statement. --- src/libslic3r/CMakeLists.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/libslic3r/CMakeLists.txt b/src/libslic3r/CMakeLists.txt index c2f3115910..f6934ac8e2 100644 --- a/src/libslic3r/CMakeLists.txt +++ b/src/libslic3r/CMakeLists.txt @@ -216,10 +216,6 @@ add_library(libslic3r STATIC encoding_check(libslic3r) -if (SLIC3R_PCH AND NOT SLIC3R_SYNTAXONLY) - add_precompiled_header(libslic3r pchheader.hpp FORCEINCLUDE) -endif () - target_compile_definitions(libslic3r PUBLIC -DUSE_TBB -DTBB_USE_CAPTURED_EXCEPTION=0) target_include_directories(libslic3r PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} ${LIBNEST2D_INCLUDES} PUBLIC ${CMAKE_CURRENT_BINARY_DIR}) target_link_libraries(libslic3r @@ -252,3 +248,7 @@ endif() if(SLIC3R_PROFILE) target_link_libraries(slic3r Shiny) endif() + +if (SLIC3R_PCH AND NOT SLIC3R_SYNTAXONLY) + add_precompiled_header(libslic3r pchheader.hpp FORCEINCLUDE) +endif () From 60650d0dfc0cc99e8ab7bef2ea469bc4825d242e Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Mon, 11 Nov 2019 16:10:46 +0100 Subject: [PATCH 045/336] Progress indication for hollowing gizmo. --- src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp | 39 +++++++++++--------- src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp | 5 ++- src/slic3r/GUI/Plater.cpp | 49 ++++++++++++++++++++----- 3 files changed, 66 insertions(+), 27 deletions(-) diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp index e48c6f8056..0516052361 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp @@ -571,30 +571,35 @@ std::pair GLGizmoHollow::get_hollowi return std::make_pair(m_mesh, sla::HollowingConfig{double(m_offset), double(m_accuracy), double(m_closing_d)}); } +void GLGizmoHollow::set_hollowing_result(std::unique_ptr mesh) +{ + // Called from Plater when the UI job finishes + m_cavity_mesh = std::move(mesh); + + m_mesh_raycaster.reset(new MeshRaycaster(*m_cavity_mesh.get())); + m_object_clipper.reset(); + m_volume_with_cavity.reset(); + + if(m_cavity_mesh) {// create a new GLVolume that only has the cavity inside + Geometry::Transformation volume_trafo = m_model_object->volumes.front()->get_transformation(); + volume_trafo.set_offset(volume_trafo.get_offset() + Vec3d(0., 0., m_z_shift)); + m_volume_with_cavity.reset(new GLVolume(1.f, 0.f, 0.f, 0.5f)); + m_volume_with_cavity->indexed_vertex_array.load_mesh(*m_cavity_mesh.get()); + + m_volume_with_cavity->set_volume_transformation(volume_trafo); + m_volume_with_cavity->set_instance_transformation(m_model_object->instances[size_t(m_active_instance)]->get_transformation()); + } +} + void GLGizmoHollow::hollow_mesh() { // Trigger a UI job to hollow the mesh. wxGetApp().plater()->hollow(); } -void GLGizmoHollow::update_hollowed_mesh(std::unique_ptr mesh) +void GLGizmoHollow::update_hollowed_mesh() { - // Called from Plater when the UI job finishes - m_cavity_mesh = std::move(mesh); - - m_mesh_raycaster.reset(new MeshRaycaster(*m_cavity_mesh.get())); - m_object_clipper.reset(); - m_volume_with_cavity.reset(); - - if(m_cavity_mesh) {// create a new GLVolume that only has the cavity inside - Geometry::Transformation volume_trafo = m_model_object->volumes.front()->get_transformation(); - volume_trafo.set_offset(volume_trafo.get_offset() + Vec3d(0., 0., m_z_shift)); - m_volume_with_cavity.reset(new GLVolume(1.f, 0.f, 0.f, 0.5f)); - m_volume_with_cavity->indexed_vertex_array.load_mesh(*m_cavity_mesh.get()); - m_volume_with_cavity->finalize_geometry(true); - m_volume_with_cavity->set_volume_transformation(volume_trafo); - m_volume_with_cavity->set_instance_transformation(m_model_object->instances[m_active_instance]->get_transformation()); - } + if (m_volume_with_cavity) m_volume_with_cavity->finalize_geometry(true); m_parent.toggle_model_objects_visibility(! m_cavity_mesh, m_model_object, m_active_instance); } diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp index 321be0dfbc..cea7a5245d 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp @@ -76,8 +76,11 @@ public: bool gizmo_event(SLAGizmoEventType action, const Vec2d& mouse_position, bool shift_down, bool alt_down, bool control_down); void delete_selected_points(bool force = false); ClippingPlane get_sla_clipping_plane() const; - void update_hollowed_mesh(std::unique_ptr mesh); + + std::pair get_hollowing_parameters() const; + void set_hollowing_result(std::unique_ptr mesh); + void update_hollowed_mesh(); bool is_selection_rectangle_dragging() const { return m_selection_rectangle.is_dragging(); } diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index a92f9de5f9..d52f21bb24 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -1714,6 +1714,9 @@ struct Plater::priv void process() override; void finalize() override; private: + GLGizmoHollow * get_gizmo(); + const GLGizmoHollow * get_gizmo() const; + std::unique_ptr m_output; const TriangleMesh* m_object_mesh = nullptr; sla::HollowingConfig m_cfg; @@ -2873,22 +2876,50 @@ void Plater::priv::HollowJob::prepare() void Plater::priv::HollowJob::process() { sla::JobController ctl; + ctl.stopcondition = [this]{ return was_canceled(); }; + ctl.statuscb = [this](unsigned st, const std::string &s) { + if (st < 100) update_status(int(st), s); + }; TriangleMesh omesh = sla::generate_interior(*m_object_mesh, m_cfg, ctl); - if (omesh.empty()) return; - - m_output.reset(new TriangleMesh{*m_object_mesh}); - m_output->merge(omesh); - m_output->require_shared_vertices(); + if (!omesh.empty()) { + m_output.reset(new TriangleMesh{*m_object_mesh}); + m_output->merge(omesh); + m_output->require_shared_vertices(); + + update_status(90, "Rendering hollowed object"); + + auto gizmo = get_gizmo(); + if (gizmo) gizmo->set_hollowing_result(std::move(m_output)); + + update_status(100, was_canceled() ? _(L("Hollowing cancelled.")) : + _(L("Hollowing done."))); + } else { + update_status(100, _(L("Hollowing failed."))); + } } void Plater::priv::HollowJob::finalize() +{ + auto gizmo = get_gizmo(); + if (gizmo) gizmo->update_hollowed_mesh(); +} + +GLGizmoHollow *Plater::priv::HollowJob::get_gizmo() { const GLGizmosManager& gizmo_manager = plater().q->canvas3D()->get_gizmos_manager(); - GLGizmoHollow* gizmo_hollow = dynamic_cast(gizmo_manager.get_current()); - assert(gizmo_hollow); - gizmo_hollow->update_hollowed_mesh(std::move(m_output)); + auto ret = dynamic_cast(gizmo_manager.get_current()); + assert(ret); + return ret; +} + +const GLGizmoHollow *Plater::priv::HollowJob::get_gizmo() const +{ + const GLGizmosManager& gizmo_manager = plater().q->canvas3D()->get_gizmos_manager(); + auto ret = dynamic_cast(gizmo_manager.get_current()); + assert(ret); + return ret; } void Plater::priv::split_object() @@ -2896,7 +2927,7 @@ void Plater::priv::split_object() int obj_idx = get_selected_object_idx(); if (obj_idx == -1) return; - + // we clone model object because split_object() adds the split volumes // into the same model object, thus causing duplicates when we call load_model_objects() Model new_model = model; From a69e80b9878b7eec13351f5166b29008525ae0fa Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Mon, 11 Nov 2019 17:27:32 +0100 Subject: [PATCH 046/336] Fix non thread-safe data flow between plater and hollowing gizmo. --- src/libslic3r/SLA/Hollowing.cpp | 4 --- src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp | 33 ++++++++++++------------- src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp | 4 +-- src/slic3r/GUI/Plater.cpp | 22 +++++++++-------- 4 files changed, 30 insertions(+), 33 deletions(-) diff --git a/src/libslic3r/SLA/Hollowing.cpp b/src/libslic3r/SLA/Hollowing.cpp index 11fe0cb5b3..b224bc98c1 100644 --- a/src/libslic3r/SLA/Hollowing.cpp +++ b/src/libslic3r/SLA/Hollowing.cpp @@ -3,7 +3,6 @@ #include #include -//#include #include #include @@ -87,9 +86,6 @@ remove_cvref_t _generate_interior(Mesh &&mesh, if (ctl.stopcondition()) return {}; else ctl.statuscb(70, L("Hollowing")); -// openvdb::tools::Filter filt{*gridptr}; -// filt.offset(float(offset + D)); - double iso_surface = D; double adaptivity = 0.; auto omesh = _grid_to_mesh(*gridptr, iso_surface, adaptivity); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp index 0516052361..cbdadc4759 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp @@ -571,24 +571,11 @@ std::pair GLGizmoHollow::get_hollowi return std::make_pair(m_mesh, sla::HollowingConfig{double(m_offset), double(m_accuracy), double(m_closing_d)}); } -void GLGizmoHollow::set_hollowing_result(std::unique_ptr mesh) +void GLGizmoHollow::update_mesh_raycaster(std::unique_ptr &&rc) { - // Called from Plater when the UI job finishes - m_cavity_mesh = std::move(mesh); - - m_mesh_raycaster.reset(new MeshRaycaster(*m_cavity_mesh.get())); + m_mesh_raycaster = std::move(rc); m_object_clipper.reset(); m_volume_with_cavity.reset(); - - if(m_cavity_mesh) {// create a new GLVolume that only has the cavity inside - Geometry::Transformation volume_trafo = m_model_object->volumes.front()->get_transformation(); - volume_trafo.set_offset(volume_trafo.get_offset() + Vec3d(0., 0., m_z_shift)); - m_volume_with_cavity.reset(new GLVolume(1.f, 0.f, 0.f, 0.5f)); - m_volume_with_cavity->indexed_vertex_array.load_mesh(*m_cavity_mesh.get()); - - m_volume_with_cavity->set_volume_transformation(volume_trafo); - m_volume_with_cavity->set_instance_transformation(m_model_object->instances[size_t(m_active_instance)]->get_transformation()); - } } void GLGizmoHollow::hollow_mesh() @@ -597,9 +584,21 @@ void GLGizmoHollow::hollow_mesh() wxGetApp().plater()->hollow(); } -void GLGizmoHollow::update_hollowed_mesh() +void GLGizmoHollow::update_hollowed_mesh(std::unique_ptr &&mesh) { - if (m_volume_with_cavity) m_volume_with_cavity->finalize_geometry(true); + // Called from Plater when the UI job finishes + m_cavity_mesh = std::move(mesh); + + if(m_cavity_mesh) {// create a new GLVolume that only has the cavity inside + Geometry::Transformation volume_trafo = m_model_object->volumes.front()->get_transformation(); + volume_trafo.set_offset(volume_trafo.get_offset() + Vec3d(0., 0., m_z_shift)); + m_volume_with_cavity.reset(new GLVolume(1.f, 0.f, 0.f, 0.5f)); + m_volume_with_cavity->indexed_vertex_array.load_mesh(*m_cavity_mesh.get()); + m_volume_with_cavity->finalize_geometry(true); + m_volume_with_cavity->set_volume_transformation(volume_trafo); + m_volume_with_cavity->set_instance_transformation(m_model_object->instances[size_t(m_active_instance)]->get_transformation()); + } + m_parent.toggle_model_objects_visibility(! m_cavity_mesh, m_model_object, m_active_instance); } diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp index cea7a5245d..290a793407 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp @@ -79,8 +79,8 @@ public: std::pair get_hollowing_parameters() const; - void set_hollowing_result(std::unique_ptr mesh); - void update_hollowed_mesh(); + void update_mesh_raycaster(std::unique_ptr &&rc); + void update_hollowed_mesh(std::unique_ptr &&mesh); bool is_selection_rectangle_dragging() const { return m_selection_rectangle.is_dragging(); } diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index d52f21bb24..1d4926d92b 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -1717,7 +1717,8 @@ struct Plater::priv GLGizmoHollow * get_gizmo(); const GLGizmoHollow * get_gizmo() const; - std::unique_ptr m_output; + std::unique_ptr m_output_mesh; + std::unique_ptr m_output_raycaster; const TriangleMesh* m_object_mesh = nullptr; sla::HollowingConfig m_cfg; }; @@ -2870,7 +2871,7 @@ void Plater::priv::HollowJob::prepare() auto hlw_data = gizmo_hollow->get_hollowing_parameters(); m_object_mesh = hlw_data.first; m_cfg = hlw_data.second; - m_output.reset(); + m_output_mesh.reset(); } void Plater::priv::HollowJob::process() @@ -2884,14 +2885,13 @@ void Plater::priv::HollowJob::process() TriangleMesh omesh = sla::generate_interior(*m_object_mesh, m_cfg, ctl); if (!omesh.empty()) { - m_output.reset(new TriangleMesh{*m_object_mesh}); - m_output->merge(omesh); - m_output->require_shared_vertices(); + m_output_mesh.reset(new TriangleMesh{*m_object_mesh}); + m_output_mesh->merge(omesh); + m_output_mesh->require_shared_vertices(); - update_status(90, "Rendering hollowed object"); + update_status(90, _(L("Indexing hollowed object"))); - auto gizmo = get_gizmo(); - if (gizmo) gizmo->set_hollowing_result(std::move(m_output)); + m_output_raycaster.reset(new MeshRaycaster(*m_output_mesh)); update_status(100, was_canceled() ? _(L("Hollowing cancelled.")) : _(L("Hollowing done."))); @@ -2902,8 +2902,10 @@ void Plater::priv::HollowJob::process() void Plater::priv::HollowJob::finalize() { - auto gizmo = get_gizmo(); - if (gizmo) gizmo->update_hollowed_mesh(); + if (auto gizmo = get_gizmo()) { + gizmo->update_mesh_raycaster(std::move(m_output_raycaster)); + gizmo->update_hollowed_mesh(std::move(m_output_mesh)); + } } GLGizmoHollow *Plater::priv::HollowJob::get_gizmo() From dfa4a58dc695a692adf987af5949d1ed3cb70d88 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Tue, 12 Nov 2019 10:28:00 +0100 Subject: [PATCH 047/336] Bump up C++ to 14 --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f7829fc9a9..4d23556a7d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -102,7 +102,7 @@ list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake/modules/) enable_testing () # Enable C++11 language standard. -set(CMAKE_CXX_STANDARD 11) +set(CMAKE_CXX_STANDARD 14) set(CMAKE_CXX_STANDARD_REQUIRED ON) if(NOT WIN32) From b6edd5ddb9e7971a0334db6ce66c4ae3d37cfaf6 Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Tue, 12 Nov 2019 11:48:12 +0100 Subject: [PATCH 048/336] SLA support points gizmo renders the holes and does not allow to place a support point in them --- src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp | 25 ++++----- src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp | 2 +- src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp | 58 +++++++++++++++++++- src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp | 1 + 4 files changed, 70 insertions(+), 16 deletions(-) diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp index cbdadc4759..909907a88f 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp @@ -290,21 +290,17 @@ void GLGizmoHollow::render_points(const Selection& selection, bool picking) cons // Matrices set, we can render the point mark now. Eigen::Quaterniond q; - q.setFromTwoVectors(Vec3d{0., 0., 1.}, instance_scaling_matrix_inverse * drain_hole.m_normal.cast()); + q.setFromTwoVectors(Vec3d{0., 0., 1.}, instance_scaling_matrix_inverse * (-drain_hole.m_normal).cast()); Eigen::AngleAxisd aa(q); glsafe(::glRotated(aa.angle() * (180. / M_PI), aa.axis()(0), aa.axis()(1), aa.axis()(2))); - - const double cylinder_radius = double(drain_hole.m_radius) * RenderPointScale; //0.25; // mm - const double stick_out_length = 1.; - const double cone_height = m_new_hole_height + stick_out_length; glsafe(::glPushMatrix()); - glsafe(::glTranslated(0., 0., -cone_height+stick_out_length)); - ::gluCylinder(m_quadric, cylinder_radius, cylinder_radius, cone_height, 24, 1); - glsafe(::glTranslated(0., 0., cone_height)); - ::gluDisk(m_quadric, 0.0, cylinder_radius, 24, 1); - glsafe(::glTranslated(0., 0., -cone_height)); + glsafe(::glTranslated(0., 0., -drain_hole.m_height)); + ::gluCylinder(m_quadric, drain_hole.m_radius, drain_hole.m_radius, drain_hole.m_height, 24, 1); + glsafe(::glTranslated(0., 0., drain_hole.m_height)); + ::gluDisk(m_quadric, 0.0, drain_hole.m_radius, 24, 1); + glsafe(::glTranslated(0., 0., -drain_hole.m_height)); glsafe(::glRotatef(180.f, 1.f, 0.f, 0.f)); - ::gluDisk(m_quadric, 0.0, cylinder_radius, 24, 1); + ::gluDisk(m_quadric, 0.0, drain_hole.m_radius, 24, 1); glsafe(::glPopMatrix()); if (vol->is_left_handed()) @@ -434,7 +430,8 @@ bool GLGizmoHollow::gizmo_event(SLAGizmoEventType action, const Vec2d& mouse_pos std::pair pos_and_normal; if (unproject_on_mesh(mouse_position, pos_and_normal)) { // we got an intersection Plater::TakeSnapshot snapshot(wxGetApp().plater(), _(L("Add drainage hole"))); - m_model_object->sla_drain_holes.emplace_back(pos_and_normal.first, pos_and_normal.second, m_new_hole_radius, m_new_hole_height); + m_model_object->sla_drain_holes.emplace_back(pos_and_normal.first + HoleStickOutLength * pos_and_normal.second, + -pos_and_normal.second, m_new_hole_radius, m_new_hole_height+HoleStickOutLength); m_selected.push_back(false); assert(m_selected.size == m_model_object->sla_drain_holes.size()); m_parent.set_as_dirty(); @@ -561,8 +558,8 @@ void GLGizmoHollow::on_update(const UpdateData& data) std::pair pos_and_normal; if (! unproject_on_mesh(data.mouse_pos.cast(), pos_and_normal)) return; - m_model_object->sla_drain_holes[m_hover_id].m_pos = pos_and_normal.first; - m_model_object->sla_drain_holes[m_hover_id].m_normal = pos_and_normal.second; + m_model_object->sla_drain_holes[m_hover_id].m_pos = pos_and_normal.first + HoleStickOutLength * pos_and_normal.second; + m_model_object->sla_drain_holes[m_hover_id].m_normal = -pos_and_normal.second; } } diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp index 290a793407..428a978c48 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp @@ -28,7 +28,7 @@ private: mutable double m_z_shift = 0.; bool unproject_on_mesh(const Vec2d& mouse_pos, std::pair& pos_and_normal); - const float RenderPointScale = 1.f; + const float HoleStickOutLength = 1.f; GLUquadricObj* m_quadric; diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp index 000ddf8c95..a7ad02cd8d 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp @@ -327,6 +327,43 @@ void GLGizmoSlaSupports::render_points(const Selection& selection, bool picking) glsafe(::glMaterialfv(GL_FRONT, GL_EMISSION, render_color_emissive)); } + // Now render the drain holes: + render_color[0] = 0.7f; + render_color[1] = 0.7f; + render_color[2] = 0.7f; + render_color[3] = 0.7f; + glsafe(::glColor4fv(render_color)); + for (const sla::DrainHole& drain_hole : m_model_object->sla_drain_holes) { + // Inverse matrix of the instance scaling is applied so that the mark does not scale with the object. + glsafe(::glPushMatrix()); + glsafe(::glTranslatef(drain_hole.m_pos(0), drain_hole.m_pos(1), drain_hole.m_pos(2))); + glsafe(::glMultMatrixd(instance_scaling_matrix_inverse.data())); + + if (vol->is_left_handed()) + glFrontFace(GL_CW); + + // Matrices set, we can render the point mark now. + + Eigen::Quaterniond q; + q.setFromTwoVectors(Vec3d{0., 0., 1.}, instance_scaling_matrix_inverse * (-drain_hole.m_normal).cast()); + Eigen::AngleAxisd aa(q); + glsafe(::glRotated(aa.angle() * (180. / M_PI), aa.axis()(0), aa.axis()(1), aa.axis()(2))); + glsafe(::glPushMatrix()); + glsafe(::glTranslated(0., 0., -drain_hole.m_height)); + ::gluCylinder(m_quadric, drain_hole.m_radius, drain_hole.m_radius, drain_hole.m_height, 24, 1); + glsafe(::glTranslated(0., 0., drain_hole.m_height)); + ::gluDisk(m_quadric, 0.0, drain_hole.m_radius, 24, 1); + glsafe(::glTranslated(0., 0., -drain_hole.m_height)); + glsafe(::glRotatef(180.f, 1.f, 0.f, 0.f)); + ::gluDisk(m_quadric, 0.0, drain_hole.m_radius, 24, 1); + glsafe(::glPopMatrix()); + + if (vol->is_left_handed()) + glFrontFace(GL_CCW); + glsafe(::glPopMatrix()); + + } + if (!picking) glsafe(::glDisable(GL_LIGHTING)); @@ -375,6 +412,24 @@ void GLGizmoSlaSupports::update_mesh() } +bool GLGizmoSlaSupports::is_point_in_hole(const Vec3f& pt) const +{ + auto squared_distance_from_line = [](const Vec3f pt, const Vec3f& line_pt, const Vec3f& dir) -> float { + Vec3f diff = line_pt - pt; + return (diff - diff.dot(dir) * dir).squaredNorm(); + }; + + + for (const sla::DrainHole& hole : m_model_object->sla_drain_holes) { + if ( hole.m_normal.dot(pt-hole.m_pos) < EPSILON + || hole.m_normal.dot(pt-(hole.m_pos+hole.m_height * hole.m_normal)) > 0.f) + continue; + if ( squared_distance_from_line(pt, hole.m_pos, hole.m_normal) < pow(hole.m_radius, 2.f)) + return true; + } + + return false; +} // Unprojects the mouse position on the mesh and saves hit point and normal of the facet into pos_and_normal // Return false if no intersection was found, true otherwise. @@ -393,7 +448,8 @@ bool GLGizmoSlaSupports::unproject_on_mesh(const Vec2d& mouse_pos, std::pairunproject_on_mesh(mouse_pos, trafo.get_matrix(), camera, hit, normal, m_clipping_plane.get())) { + if (m_mesh_raycaster->unproject_on_mesh(mouse_pos, trafo.get_matrix(), camera, hit, normal, m_clipping_plane.get()) + && ! is_point_in_hole(hit)) { // Return both the point and the facet normal. pos_and_normal = std::make_pair(hit, normal); return true; diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp index 85835f9d0e..e536aab40f 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp @@ -126,6 +126,7 @@ private: std::vector get_config_options(const std::vector& keys) const; bool is_mesh_point_clipped(const Vec3d& point) const; + bool is_point_in_hole(const Vec3f& pt) const; //void find_intersecting_facets(const igl::AABB* aabb, const Vec3f& normal, double offset, std::vector& out) const; // Methods that do the model_object and editing cache synchronization, From 73ae73348434b110da1a09a83e9d152bb8afda8c Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Tue, 12 Nov 2019 15:04:40 +0100 Subject: [PATCH 049/336] New icon for the hollowing gizmo --- resources/icons/hollow.svg | 104 ++++++++++++++++-------- src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp | 7 -- 2 files changed, 71 insertions(+), 40 deletions(-) diff --git a/resources/icons/hollow.svg b/resources/icons/hollow.svg index 119fb6afcc..13e96ada96 100644 --- a/resources/icons/hollow.svg +++ b/resources/icons/hollow.svg @@ -1,42 +1,80 @@ - + - + - + + + + + + - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp index 909907a88f..c6c02947f1 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp @@ -748,13 +748,6 @@ RENDER_AGAIN: if (ImGui::SliderFloat(" ", &m_clipping_plane_distance, 0.f, 1.f, "%.2f")) update_clipping_plane(true); - if (m_imgui->button("?")) { - wxGetApp().CallAfter([]() { - SlaGizmoHelpDialog help_dlg; - help_dlg.ShowModal(); - }); - } - if (m_imgui->checkbox(m_desc["show_supports"], m_show_supports)) { m_parent.toggle_sla_auxiliaries_visibility(m_show_supports, m_model_object, m_active_instance); force_refresh = true; From 4e067c42f03bac019066849401fb42f70cacda87 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Tue, 12 Nov 2019 16:53:47 +0100 Subject: [PATCH 050/336] SLAPrint steps moved to separate module. * Lambdas replaced with class methods --- src/libslic3r/CMakeLists.txt | 2 + src/libslic3r/SLA/Common.cpp | 235 +++---- src/libslic3r/SLA/Hollowing.cpp | 26 +- src/libslic3r/SLA/Hollowing.hpp | 21 +- src/libslic3r/SLA/RasterWriter.cpp | 2 + src/libslic3r/SLA/RasterWriter.hpp | 8 +- src/libslic3r/SLAPrint.cpp | 1017 +++------------------------- src/libslic3r/SLAPrint.hpp | 50 +- src/libslic3r/SLAPrintSteps.cpp | 848 +++++++++++++++++++++++ src/libslic3r/SLAPrintSteps.hpp | 68 ++ src/slic3r/GUI/Plater.cpp | 7 +- tests/libslic3r/test_hollowing.cpp | 6 +- 12 files changed, 1214 insertions(+), 1076 deletions(-) create mode 100644 src/libslic3r/SLAPrintSteps.cpp create mode 100644 src/libslic3r/SLAPrintSteps.hpp diff --git a/src/libslic3r/CMakeLists.txt b/src/libslic3r/CMakeLists.txt index f6934ac8e2..0d483d9979 100644 --- a/src/libslic3r/CMakeLists.txt +++ b/src/libslic3r/CMakeLists.txt @@ -150,6 +150,8 @@ add_library(libslic3r STATIC ShortestPath.cpp ShortestPath.hpp SLAPrint.cpp + SLAPrintSteps.cpp + SLAPrintSteps.hpp SLAPrint.hpp Slicing.cpp Slicing.hpp diff --git a/src/libslic3r/SLA/Common.cpp b/src/libslic3r/SLA/Common.cpp index f85731603f..caabdd7554 100644 --- a/src/libslic3r/SLA/Common.cpp +++ b/src/libslic3r/SLA/Common.cpp @@ -1,11 +1,13 @@ #include #include +#include #include #include #include #include #include + // Workaround: IGL signed_distance.h will define PI in the igl namespace. #undef PI @@ -351,128 +353,131 @@ PointSet normals(const PointSet& points, std::function thr, // throw on cancel const std::vector& pt_indices) { - if(points.rows() == 0 || mesh.V().rows() == 0 || mesh.F().rows() == 0) + if (points.rows() == 0 || mesh.V().rows() == 0 || mesh.F().rows() == 0) return {}; - + std::vector range = pt_indices; - if(range.empty()) { + if (range.empty()) { range.resize(size_t(points.rows()), 0); std::iota(range.begin(), range.end(), 0); } - - PointSet ret(range.size(), 3); - + + PointSet ret(range.size(), 3); + // for (size_t ridx = 0; ridx < range.size(); ++ridx) - tbb::parallel_for(size_t(0), range.size(), - [&ret, &range, &mesh, &points, thr, eps](size_t ridx) - { - thr(); - auto eidx = Eigen::Index(range[ridx]); - int faceid = 0; - Vec3d p; - - mesh.squared_distance(points.row(eidx), faceid, p); - - auto trindex = mesh.F().row(faceid); - - const Vec3d& p1 = mesh.V().row(trindex(0)); - const Vec3d& p2 = mesh.V().row(trindex(1)); - const Vec3d& p3 = mesh.V().row(trindex(2)); - - // We should check if the point lies on an edge of the hosting triangle. - // If it does then all the other triangles using the same two points - // have to be searched and the final normal should be some kind of - // aggregation of the participating triangle normals. We should also - // consider the cases where the support point lies right on a vertex - // of its triangle. The procedure is the same, get the neighbor - // triangles and calculate an average normal. - - // mark the vertex indices of the edge. ia and ib marks and edge ic - // will mark a single vertex. - int ia = -1, ib = -1, ic = -1; - - if(std::abs(distance(p, p1)) < eps) { - ic = trindex(0); - } - else if(std::abs(distance(p, p2)) < eps) { - ic = trindex(1); - } - else if(std::abs(distance(p, p3)) < eps) { - ic = trindex(2); - } - else if(point_on_edge(p, p1, p2, eps)) { - ia = trindex(0); ib = trindex(1); - } - else if(point_on_edge(p, p2, p3, eps)) { - ia = trindex(1); ib = trindex(2); - } - else if(point_on_edge(p, p1, p3, eps)) { - ia = trindex(0); ib = trindex(2); - } - - // vector for the neigboring triangles including the detected one. - std::vector neigh; - if(ic >= 0) { // The point is right on a vertex of the triangle - for(int n = 0; n < mesh.F().rows(); ++n) { - thr(); - Vec3i ni = mesh.F().row(n); - if((ni(X) == ic || ni(Y) == ic || ni(Z) == ic)) - neigh.emplace_back(ni); - } - } - else if(ia >= 0 && ib >= 0) { // the point is on and edge - // now get all the neigboring triangles - for(int n = 0; n < mesh.F().rows(); ++n) { - thr(); - Vec3i ni = mesh.F().row(n); - if((ni(X) == ia || ni(Y) == ia || ni(Z) == ia) && - (ni(X) == ib || ni(Y) == ib || ni(Z) == ib)) - neigh.emplace_back(ni); - } - } - - // Calculate the normals for the neighboring triangles - std::vector neighnorms; neighnorms.reserve(neigh.size()); - for(const Vec3i& tri : neigh) { - const Vec3d& pt1 = mesh.V().row(tri(0)); - const Vec3d& pt2 = mesh.V().row(tri(1)); - const Vec3d& pt3 = mesh.V().row(tri(2)); - Eigen::Vector3d U = pt2 - pt1; - Eigen::Vector3d V = pt3 - pt1; - neighnorms.emplace_back(U.cross(V).normalized()); - } - - // Throw out duplicates. They would cause trouble with summing. We will - // use std::unique which works on sorted ranges. We will sort by the - // coefficient-wise sum of the normals. It should force the same - // elements to be consecutive. - std::sort(neighnorms.begin(), neighnorms.end(), - [](const Vec3d& v1, const Vec3d& v2){ - return v1.sum() < v2.sum(); - }); - - auto lend = std::unique(neighnorms.begin(), neighnorms.end(), - [](const Vec3d& n1, const Vec3d& n2) { - // Compare normals for equivalence. This is controvers stuff. - auto deq = [](double a, double b) { return std::abs(a-b) < 1e-3; }; - return deq(n1(X), n2(X)) && deq(n1(Y), n2(Y)) && deq(n1(Z), n2(Z)); - }); - - if(!neighnorms.empty()) { // there were neighbors to count with - // sum up the normals and then normalize the result again. - // This unification seems to be enough. - Vec3d sumnorm(0, 0, 0); - sumnorm = std::accumulate(neighnorms.begin(), lend, sumnorm); - sumnorm.normalize(); - ret.row(long(ridx)) = sumnorm; - } - else { // point lies safely within its triangle - Eigen::Vector3d U = p2 - p1; - Eigen::Vector3d V = p3 - p1; - ret.row(long(ridx)) = U.cross(V).normalized(); - } + ccr::enumerate( + range.begin(), range.end(), + [&ret, &mesh, &points, thr, eps](unsigned el, size_t ridx) { + thr(); + auto eidx = Eigen::Index(el); + int faceid = 0; + Vec3d p; + + mesh.squared_distance(points.row(eidx), faceid, p); + + auto trindex = mesh.F().row(faceid); + + const Vec3d &p1 = mesh.V().row(trindex(0)); + const Vec3d &p2 = mesh.V().row(trindex(1)); + const Vec3d &p3 = mesh.V().row(trindex(2)); + + // We should check if the point lies on an edge of the hosting + // triangle. If it does then all the other triangles using the + // same two points have to be searched and the final normal should + // be some kind of aggregation of the participating triangle + // normals. We should also consider the cases where the support + // point lies right on a vertex of its triangle. The procedure is + // the same, get the neighbor triangles and calculate an average + // normal. + + // mark the vertex indices of the edge. ia and ib marks and edge + // ic will mark a single vertex. + int ia = -1, ib = -1, ic = -1; + + if (std::abs(distance(p, p1)) < eps) { + ic = trindex(0); + } else if (std::abs(distance(p, p2)) < eps) { + ic = trindex(1); + } else if (std::abs(distance(p, p3)) < eps) { + ic = trindex(2); + } else if (point_on_edge(p, p1, p2, eps)) { + ia = trindex(0); + ib = trindex(1); + } else if (point_on_edge(p, p2, p3, eps)) { + ia = trindex(1); + ib = trindex(2); + } else if (point_on_edge(p, p1, p3, eps)) { + ia = trindex(0); + ib = trindex(2); + } + + // vector for the neigboring triangles including the detected one. + std::vector neigh; + if (ic >= 0) { // The point is right on a vertex of the triangle + for (int n = 0; n < mesh.F().rows(); ++n) { + thr(); + Vec3i ni = mesh.F().row(n); + if ((ni(X) == ic || ni(Y) == ic || ni(Z) == ic)) + neigh.emplace_back(ni); + } + } else if (ia >= 0 && ib >= 0) { // the point is on and edge + // now get all the neigboring triangles + for (int n = 0; n < mesh.F().rows(); ++n) { + thr(); + Vec3i ni = mesh.F().row(n); + if ((ni(X) == ia || ni(Y) == ia || ni(Z) == ia) && + (ni(X) == ib || ni(Y) == ib || ni(Z) == ib)) + neigh.emplace_back(ni); + } + } + + // Calculate the normals for the neighboring triangles + std::vector neighnorms; + neighnorms.reserve(neigh.size()); + for (const Vec3i &tri : neigh) { + const Vec3d & pt1 = mesh.V().row(tri(0)); + const Vec3d & pt2 = mesh.V().row(tri(1)); + const Vec3d & pt3 = mesh.V().row(tri(2)); + Eigen::Vector3d U = pt2 - pt1; + Eigen::Vector3d V = pt3 - pt1; + neighnorms.emplace_back(U.cross(V).normalized()); + } + + // Throw out duplicates. They would cause trouble with summing. We + // will use std::unique which works on sorted ranges. We will sort + // by the coefficient-wise sum of the normals. It should force the + // same elements to be consecutive. + std::sort(neighnorms.begin(), neighnorms.end(), + [](const Vec3d &v1, const Vec3d &v2) { + return v1.sum() < v2.sum(); }); - + + auto lend = std::unique(neighnorms.begin(), neighnorms.end(), + [](const Vec3d &n1, const Vec3d &n2) { + // Compare normals for equivalence. + // This is controvers stuff. + auto deq = [](double a, double b) { + return std::abs(a - b) < 1e-3; + }; + return deq(n1(X), n2(X)) && + deq(n1(Y), n2(Y)) && + deq(n1(Z), n2(Z)); + }); + + if (!neighnorms.empty()) { // there were neighbors to count with + // sum up the normals and then normalize the result again. + // This unification seems to be enough. + Vec3d sumnorm(0, 0, 0); + sumnorm = std::accumulate(neighnorms.begin(), lend, sumnorm); + sumnorm.normalize(); + ret.row(long(ridx)) = sumnorm; + } else { // point lies safely within its triangle + Eigen::Vector3d U = p2 - p1; + Eigen::Vector3d V = p3 - p1; + ret.row(long(ridx)) = U.cross(V).normalized(); + } + }); + return ret; } diff --git a/src/libslic3r/SLA/Hollowing.cpp b/src/libslic3r/SLA/Hollowing.cpp index b224bc98c1..c3763dbc9b 100644 --- a/src/libslic3r/SLA/Hollowing.cpp +++ b/src/libslic3r/SLA/Hollowing.cpp @@ -1,5 +1,7 @@ #include +#include +#include #include #include @@ -98,18 +100,30 @@ remove_cvref_t _generate_interior(Mesh &&mesh, return omesh; } -TriangleMesh generate_interior(const TriangleMesh &mesh, const HollowingConfig &hc, const JobController &ctl) +std::unique_ptr generate_interior(const TriangleMesh & mesh, + const HollowingConfig &hc, + const JobController & ctl) { static const double MAX_OVERSAMPL = 7.; - // I can't figure out how to increase the grid resolution through openvdb API - // so the model will be scaled up before conversion and the result scaled - // down. Voxels have a unit size. If I set voxelSize smaller, it scales - // the whole geometry down, and doesn't increase the number of voxels. + // I can't figure out how to increase the grid resolution through openvdb + // API so the model will be scaled up before conversion and the result + // scaled down. Voxels have a unit size. If I set voxelSize smaller, it + // scales the whole geometry down, and doesn't increase the number of + // voxels. // // max 8x upscale, min is native voxel size auto voxel_scale = (1.0 + MAX_OVERSAMPL * hc.quality); - return _generate_interior(mesh, ctl, hc.min_thickness, voxel_scale, hc.closing_distance); + return std::make_unique( + _generate_interior(mesh, ctl, hc.min_thickness, voxel_scale, + hc.closing_distance)); +} + +bool DrainHole::operator==(const DrainHole &sp) const +{ + return (m_pos == sp.m_pos) && (m_normal == sp.m_normal) && + is_approx(m_radius, sp.m_radius) && + is_approx(m_height, sp.m_height); } }} // namespace Slic3r::sla diff --git a/src/libslic3r/SLA/Hollowing.hpp b/src/libslic3r/SLA/Hollowing.hpp index 93a1f90fde..cb5c2bd15e 100644 --- a/src/libslic3r/SLA/Hollowing.hpp +++ b/src/libslic3r/SLA/Hollowing.hpp @@ -1,10 +1,14 @@ #ifndef SLA_HOLLOWING_HPP #define SLA_HOLLOWING_HPP -#include +#include +#include #include namespace Slic3r { + +class TriangleMesh; + namespace sla { struct HollowingConfig @@ -33,24 +37,19 @@ struct DrainHole , m_height(height) {} - bool operator==(const DrainHole &sp) const - { - return (m_pos == sp.m_pos) && (m_normal == sp.m_normal) && - is_approx(m_radius, sp.m_radius) && - is_approx(m_height, sp.m_height); - } + bool operator==(const DrainHole &sp) const; bool operator!=(const DrainHole &sp) const { return !(sp == (*this)); } - template void serialize(Archive &ar) + template inline void serialize(Archive &ar) { ar(m_pos, m_normal, m_radius, m_height); } }; -TriangleMesh generate_interior(const TriangleMesh &mesh, - const HollowingConfig & = {}, - const JobController &ctl = {}); +std::unique_ptr generate_interior(const TriangleMesh &mesh, + const HollowingConfig & = {}, + const JobController &ctl = {}); } } diff --git a/src/libslic3r/SLA/RasterWriter.cpp b/src/libslic3r/SLA/RasterWriter.cpp index b3da0d2a5a..0d55b769d5 100644 --- a/src/libslic3r/SLA/RasterWriter.cpp +++ b/src/libslic3r/SLA/RasterWriter.cpp @@ -1,4 +1,6 @@ #include + +#include "libslic3r/PrintConfig.hpp" #include #include diff --git a/src/libslic3r/SLA/RasterWriter.hpp b/src/libslic3r/SLA/RasterWriter.hpp index a7792d55da..62ed44ca85 100644 --- a/src/libslic3r/SLA/RasterWriter.hpp +++ b/src/libslic3r/SLA/RasterWriter.hpp @@ -9,11 +9,13 @@ #include #include -#include "libslic3r/PrintConfig.hpp" - #include -namespace Slic3r { namespace sla { +namespace Slic3r { + +class DynamicPrintConfig; + +namespace sla { // API to write the zipped sla output layers and metadata. // Implementation uses PNG raster output. diff --git a/src/libslic3r/SLAPrint.cpp b/src/libslic3r/SLAPrint.cpp index 05440ad528..53a0e82233 100644 --- a/src/libslic3r/SLAPrint.cpp +++ b/src/libslic3r/SLAPrint.cpp @@ -1,8 +1,6 @@ #include "SLAPrint.hpp" -#include "SLA/SupportTree.hpp" -#include "SLA/Pad.hpp" -#include "SLA/SupportPointGenerator.hpp" -#include "SLA/Hollowing.hpp" +#include "SLAPrintSteps.hpp" + #include "ClipperUtils.hpp" #include "Geometry.hpp" #include "MTUtils.hpp" @@ -14,9 +12,6 @@ #include #include -// For geometry algorithms with native Clipper types (no copies and conversions) -#include - // #define SLAPRINT_DO_BENCHMARK #ifdef SLAPRINT_DO_BENCHMARK @@ -33,78 +28,86 @@ namespace Slic3r { -class SLAPrintObject::SupportData : public sla::SupportableMesh + +bool is_zero_elevation(const SLAPrintObjectConfig &c) { -public: - sla::SupportTree::UPtr support_tree_ptr; // the supports - std::vector support_slices; // sliced supports + return c.pad_enable.getBool() && c.pad_around_object.getBool(); +} + +// Compile the argument for support creation from the static print config. +sla::SupportConfig make_support_cfg(const SLAPrintObjectConfig& c) +{ + sla::SupportConfig scfg; - inline SupportData(const TriangleMesh &t): sla::SupportableMesh{t, {}, {}} {} + scfg.enabled = c.supports_enable.getBool(); + scfg.head_front_radius_mm = 0.5*c.support_head_front_diameter.getFloat(); + scfg.head_back_radius_mm = 0.5*c.support_pillar_diameter.getFloat(); + scfg.head_penetration_mm = c.support_head_penetration.getFloat(); + scfg.head_width_mm = c.support_head_width.getFloat(); + scfg.object_elevation_mm = is_zero_elevation(c) ? + 0. : c.support_object_elevation.getFloat(); + scfg.bridge_slope = c.support_critical_angle.getFloat() * PI / 180.0 ; + scfg.max_bridge_length_mm = c.support_max_bridge_length.getFloat(); + scfg.max_pillar_link_distance_mm = c.support_max_pillar_link_distance.getFloat(); + switch(c.support_pillar_connection_mode.getInt()) { + case slapcmZigZag: + scfg.pillar_connection_mode = sla::PillarConnectionMode::zigzag; break; + case slapcmCross: + scfg.pillar_connection_mode = sla::PillarConnectionMode::cross; break; + case slapcmDynamic: + scfg.pillar_connection_mode = sla::PillarConnectionMode::dynamic; break; + } + scfg.ground_facing_only = c.support_buildplate_only.getBool(); + scfg.pillar_widening_factor = c.support_pillar_widening_factor.getFloat(); + scfg.base_radius_mm = 0.5*c.support_base_diameter.getFloat(); + scfg.base_height_mm = c.support_base_height.getFloat(); + scfg.pillar_base_safety_distance_mm = + c.support_base_safety_distance.getFloat() < EPSILON ? + scfg.safety_distance_mm : c.support_base_safety_distance.getFloat(); - sla::SupportTree::UPtr &create_support_tree(const sla::JobController &ctl) - { - support_tree_ptr = sla::SupportTree::create(*this, ctl); - return support_tree_ptr; - } -}; + return scfg; +} -class SLAPrintObject::HollowingData +sla::PadConfig::EmbedObject builtin_pad_cfg(const SLAPrintObjectConfig& c) { -public: + sla::PadConfig::EmbedObject ret; - TriangleMesh interior; - // std::vector -}; - -namespace { - -// should add up to 100 (%) -const std::array OBJ_STEP_LEVELS = -{ - 5, // slaposHollowing, - 20, // slaposObjectSlice, - 5, // slaposDrillHolesIfHollowed - 20, // slaposSupportPoints, - 10, // slaposSupportTree, - 10, // slaposPad, - 30, // slaposSliceSupports, -}; - -// Object step to status label. The labels are localized at the time of calling, thus supporting language switching. -std::string OBJ_STEP_LABELS(size_t idx) -{ - switch (idx) { - case slaposHollowing: return L("Hollowing out the model"); - case slaposObjectSlice: return L("Slicing model"); - case slaposDrillHolesIfHollowed: return L("Drilling holes into hollowed model."); - case slaposSupportPoints: return L("Generating support points"); - case slaposSupportTree: return L("Generating support tree"); - case slaposPad: return L("Generating pad"); - case slaposSliceSupports: return L("Slicing supports"); - default:; + ret.enabled = is_zero_elevation(c); + + if(ret.enabled) { + ret.everywhere = c.pad_around_object_everywhere.getBool(); + ret.object_gap_mm = c.pad_object_gap.getFloat(); + ret.stick_width_mm = c.pad_object_connector_width.getFloat(); + ret.stick_stride_mm = c.pad_object_connector_stride.getFloat(); + ret.stick_penetration_mm = c.pad_object_connector_penetration + .getFloat(); } - assert(false); - return "Out of bounds!"; -}; + + return ret; +} -// Should also add up to 100 (%) -const std::array PRINT_STEP_LEVELS = +sla::PadConfig make_pad_cfg(const SLAPrintObjectConfig& c) { - 10, // slapsMergeSlicesAndEval - 90, // slapsRasterize -}; + sla::PadConfig pcfg; + + pcfg.wall_thickness_mm = c.pad_wall_thickness.getFloat(); + pcfg.wall_slope = c.pad_wall_slope.getFloat() * PI / 180.0; + + pcfg.max_merge_dist_mm = c.pad_max_merge_distance.getFloat(); + pcfg.wall_height_mm = c.pad_wall_height.getFloat(); + pcfg.brim_size_mm = c.pad_brim_size.getFloat(); + + // set builtin pad implicitly ON + pcfg.embed_object = builtin_pad_cfg(c); + + return pcfg; +} -// Print step to status label. The labels are localized at the time of calling, thus supporting language switching. -std::string PRINT_STEP_LABELS(size_t idx) +bool validate_pad(const TriangleMesh &pad, const sla::PadConfig &pcfg) { - switch (idx) { - case slapsMergeSlicesAndEval: return L("Merging slices and calculating statistics"); - case slapsRasterize: return L("Rasterizing layers"); - default:; - } - assert(false); return "Out of bounds!"; -}; - + // An empty pad can only be created if embed_object mode is enabled + // and the pad is not forced everywhere + return !pad.empty() || (pcfg.embed_object.enabled && !pcfg.embed_object.everywhere); } void SLAPrint::clear() @@ -590,87 +593,6 @@ std::string SLAPrint::output_filename(const std::string &filename_base) const return this->PrintBase::output_filename(m_print_config.output_filename_format.value, ".sl1", filename_base, &config); } -namespace { - -bool is_zero_elevation(const SLAPrintObjectConfig &c) { - return c.pad_enable.getBool() && c.pad_around_object.getBool(); -} - -// Compile the argument for support creation from the static print config. -sla::SupportConfig make_support_cfg(const SLAPrintObjectConfig& c) { - sla::SupportConfig scfg; - - scfg.enabled = c.supports_enable.getBool(); - scfg.head_front_radius_mm = 0.5*c.support_head_front_diameter.getFloat(); - scfg.head_back_radius_mm = 0.5*c.support_pillar_diameter.getFloat(); - scfg.head_penetration_mm = c.support_head_penetration.getFloat(); - scfg.head_width_mm = c.support_head_width.getFloat(); - scfg.object_elevation_mm = is_zero_elevation(c) ? - 0. : c.support_object_elevation.getFloat(); - scfg.bridge_slope = c.support_critical_angle.getFloat() * PI / 180.0 ; - scfg.max_bridge_length_mm = c.support_max_bridge_length.getFloat(); - scfg.max_pillar_link_distance_mm = c.support_max_pillar_link_distance.getFloat(); - switch(c.support_pillar_connection_mode.getInt()) { - case slapcmZigZag: - scfg.pillar_connection_mode = sla::PillarConnectionMode::zigzag; break; - case slapcmCross: - scfg.pillar_connection_mode = sla::PillarConnectionMode::cross; break; - case slapcmDynamic: - scfg.pillar_connection_mode = sla::PillarConnectionMode::dynamic; break; - } - scfg.ground_facing_only = c.support_buildplate_only.getBool(); - scfg.pillar_widening_factor = c.support_pillar_widening_factor.getFloat(); - scfg.base_radius_mm = 0.5*c.support_base_diameter.getFloat(); - scfg.base_height_mm = c.support_base_height.getFloat(); - scfg.pillar_base_safety_distance_mm = - c.support_base_safety_distance.getFloat() < EPSILON ? - scfg.safety_distance_mm : c.support_base_safety_distance.getFloat(); - - return scfg; -} - -sla::PadConfig::EmbedObject builtin_pad_cfg(const SLAPrintObjectConfig& c) { - sla::PadConfig::EmbedObject ret; - - ret.enabled = is_zero_elevation(c); - - if(ret.enabled) { - ret.everywhere = c.pad_around_object_everywhere.getBool(); - ret.object_gap_mm = c.pad_object_gap.getFloat(); - ret.stick_width_mm = c.pad_object_connector_width.getFloat(); - ret.stick_stride_mm = c.pad_object_connector_stride.getFloat(); - ret.stick_penetration_mm = c.pad_object_connector_penetration - .getFloat(); - } - - return ret; -} - -sla::PadConfig make_pad_cfg(const SLAPrintObjectConfig& c) { - sla::PadConfig pcfg; - - pcfg.wall_thickness_mm = c.pad_wall_thickness.getFloat(); - pcfg.wall_slope = c.pad_wall_slope.getFloat() * PI / 180.0; - - pcfg.max_merge_dist_mm = c.pad_max_merge_distance.getFloat(); - pcfg.wall_height_mm = c.pad_wall_height.getFloat(); - pcfg.brim_size_mm = c.pad_brim_size.getFloat(); - - // set builtin pad implicitly ON - pcfg.embed_object = builtin_pad_cfg(c); - - return pcfg; -} - -bool validate_pad(const TriangleMesh &pad, const sla::PadConfig &pcfg) -{ - // An empty pad can only be created if embed_object mode is enabled - // and the pad is not forced everywhere - return !pad.empty() || (pcfg.embed_object.enabled && !pcfg.embed_object.everywhere); -} - -} - std::string SLAPrint::validate() const { for(SLAPrintObject * po : m_objects) { @@ -740,775 +662,12 @@ bool SLAPrint::invalidate_step(SLAPrintStep step) void SLAPrint::process() { - using namespace sla; - using ExPolygon = Slic3r::ExPolygon; - if(m_objects.empty()) return; // Assumption: at this point the print objects should be populated only with // the model objects we have to process and the instances are also filtered - - // shortcut to initial layer height - double ilhd = m_material_config.initial_layer_height.getFloat(); - auto ilh = float(ilhd); - - coord_t ilhs = scaled(ilhd); - const size_t objcount = m_objects.size(); - - static const unsigned min_objstatus = 0; // where the per object operations start - static const unsigned max_objstatus = 50; // where the per object operations end - - // the coefficient that multiplies the per object status values which - // are set up for <0, 100>. They need to be scaled into the whole process - const double ostepd = (max_objstatus - min_objstatus) / (objcount * 100.0); - auto hollow_model = [](SLAPrintObject &po) { - - if (!po.m_config.hollowing_enable.getBool()) { - BOOST_LOG_TRIVIAL(info) << "Skipping hollowing step!"; - po.m_hollowing_data.reset(); - return; - } else { - BOOST_LOG_TRIVIAL(info) << "Performing hollowing step!"; - } - - if (!po.m_hollowing_data) - po.m_hollowing_data.reset(new SLAPrintObject::HollowingData()); - - double thickness = po.m_config.hollowing_min_thickness.getFloat(); - double quality = po.m_config.hollowing_quality.getFloat(); - double closing_d = po.m_config.hollowing_closing_distance.getFloat(); - po.m_hollowing_data->interior = - generate_interior(po.transformed_mesh(), {thickness, quality, closing_d}); - - if (po.m_hollowing_data->interior.empty()) - BOOST_LOG_TRIVIAL(warning) << "Hollowed interior is empty!"; - }; - - // The slicing will be performed on an imaginary 1D grid which starts from - // the bottom of the bounding box created around the supported model. So - // the first layer which is usually thicker will be part of the supports - // not the model geometry. Exception is when the model is not in the air - // (elevation is zero) and no pad creation was requested. In this case the - // model geometry starts on the ground level and the initial layer is part - // of it. In any case, the model and the supports have to be sliced in the - // same imaginary grid (the height vector argument to TriangleMeshSlicer). - - // Slicing the model object. This method is oversimplified and needs to - // be compared with the fff slicing algorithm for verification - auto slice_model = [this, ilhs, ilh](SLAPrintObject& po) { - - TriangleMesh hollowed_mesh; - - bool is_hollowing = po.m_config.hollowing_enable.getBool() && - po.m_hollowing_data; - - if (is_hollowing) { - hollowed_mesh = po.transformed_mesh(); - hollowed_mesh.merge(po.m_hollowing_data->interior); - hollowed_mesh.require_shared_vertices(); - } - - const TriangleMesh &mesh = is_hollowing ? hollowed_mesh : - po.transformed_mesh(); - - // We need to prepare the slice index... - - double lhd = m_objects.front()->m_config.layer_height.getFloat(); - float lh = float(lhd); - coord_t lhs = scaled(lhd); - auto && bb3d = mesh.bounding_box(); - double minZ = bb3d.min(Z) - po.get_elevation(); - double maxZ = bb3d.max(Z); - auto minZf = float(minZ); - coord_t minZs = scaled(minZ); - coord_t maxZs = scaled(maxZ); - - po.m_slice_index.clear(); - - size_t cap = size_t(1 + (maxZs - minZs - ilhs) / lhs); - po.m_slice_index.reserve(cap); - - po.m_slice_index.emplace_back(minZs + ilhs, minZf + ilh / 2.f, ilh); - - for(coord_t h = minZs + ilhs + lhs; h <= maxZs; h += lhs) - po.m_slice_index.emplace_back(h, unscaled(h) - lh / 2.f, lh); - - // Just get the first record that is from the model: - auto slindex_it = - po.closest_slice_record(po.m_slice_index, float(bb3d.min(Z))); - - if(slindex_it == po.m_slice_index.end()) - //TRN To be shown at the status bar on SLA slicing error. - throw std::runtime_error( - L("Slicing had to be stopped due to an internal error: " - "Inconsistent slice index.")); - - po.m_model_height_levels.clear(); - po.m_model_height_levels.reserve(po.m_slice_index.size()); - for(auto it = slindex_it; it != po.m_slice_index.end(); ++it) - po.m_model_height_levels.emplace_back(it->slice_level()); - - TriangleMeshSlicer slicer(&mesh); - - po.m_model_slices.clear(); - slicer.slice(po.m_model_height_levels, - float(po.config().slice_closing_radius.value), - &po.m_model_slices, - [this](){ throw_if_canceled(); }); - - auto mit = slindex_it; - double doffs = m_printer_config.absolute_correction.getFloat(); - coord_t clpr_offs = scaled(doffs); - for(size_t id = 0; - id < po.m_model_slices.size() && mit != po.m_slice_index.end(); - id++) - { - // We apply the printer correction offset here. - if(clpr_offs != 0) - po.m_model_slices[id] = - offset_ex(po.m_model_slices[id], float(clpr_offs)); - - mit->set_model_slice_idx(po, id); ++mit; - } - - if(po.m_config.supports_enable.getBool() || - po.m_config.pad_enable.getBool()) - { - po.m_supportdata.reset( - new SLAPrintObject::SupportData(po.transformed_mesh()) ); - } - }; - - // In this step we check the slices, identify island and cover them with - // support points. Then we sprinkle the rest of the mesh. - auto support_points = [this, ostepd](SLAPrintObject& po) { - // If supports are disabled, we can skip the model scan. - if(!po.m_config.supports_enable.getBool()) return; - - if (!po.m_supportdata) - po.m_supportdata.reset( - new SLAPrintObject::SupportData(po.transformed_mesh())); - - const ModelObject& mo = *po.m_model_object; - - BOOST_LOG_TRIVIAL(debug) << "Support point count " - << mo.sla_support_points.size(); - - // Unless the user modified the points or we already did the calculation, we will do - // the autoplacement. Otherwise we will just blindly copy the frontend data - // into the backend cache. - if (mo.sla_points_status != sla::PointsStatus::UserModified) { - - // Hypothetical use of the slice index: - // auto bb = po.transformed_mesh().bounding_box(); - // auto range = po.get_slice_records(bb.min(Z)); - // std::vector heights; heights.reserve(range.size()); - // for(auto& record : range) heights.emplace_back(record.slice_level()); - - // calculate heights of slices (slices are calculated already) - const std::vector& heights = po.m_model_height_levels; - - this->throw_if_canceled(); - SupportPointGenerator::Config config; - const SLAPrintObjectConfig& cfg = po.config(); - - // the density config value is in percents: - config.density_relative = float(cfg.support_points_density_relative / 100.f); - config.minimal_distance = float(cfg.support_points_minimal_distance); - config.head_diameter = float(cfg.support_head_front_diameter); - - // scaling for the sub operations - double d = ostepd * OBJ_STEP_LEVELS[slaposSupportPoints] / 100.0; - double init = m_report_status.status(); - - auto statuscb = [this, d, init](unsigned st) - { - double current = init + st * d; - if(std::round(m_report_status.status()) < std::round(current)) - m_report_status(*this, current, - OBJ_STEP_LABELS(slaposSupportPoints)); - - }; - - // Construction of this object does the calculation. - this->throw_if_canceled(); - SupportPointGenerator auto_supports( - po.m_supportdata->emesh, po.get_model_slices(), heights, - config, [this]() { throw_if_canceled(); }, statuscb); - - // Now let's extract the result. - const std::vector& points = auto_supports.output(); - this->throw_if_canceled(); - po.m_supportdata->pts = points; - - BOOST_LOG_TRIVIAL(debug) << "Automatic support points: " - << po.m_supportdata->pts.size(); - - // Using RELOAD_SLA_SUPPORT_POINTS to tell the Plater to pass - // the update status to GLGizmoSlaSupports - m_report_status(*this, - -1, - L("Generating support points"), - SlicingStatus::RELOAD_SLA_SUPPORT_POINTS); - } - else { - // There are either some points on the front-end, or the user - // removed them on purpose. No calculation will be done. - po.m_supportdata->pts = po.transformed_support_points(); - } - - // If the zero elevation mode is engaged, we have to filter out all the - // points that are on the bottom of the object - if (is_zero_elevation(po.config())) { - double tolerance = po.config().pad_enable.getBool() - ? po.m_config.pad_wall_thickness.getFloat() - : po.m_config.support_base_height.getFloat(); - - remove_bottom_points(po.m_supportdata->pts, - po.m_supportdata->emesh.ground_level(), - tolerance); - } - }; - - // In this step we create the supports - auto support_tree = [this, ostepd](SLAPrintObject& po) - { - if(!po.m_supportdata) return; - - sla::PadConfig pcfg = make_pad_cfg(po.m_config); - - if (pcfg.embed_object) - po.m_supportdata->emesh.ground_level_offset(pcfg.wall_thickness_mm); - - po.m_supportdata->cfg = make_support_cfg(po.m_config); - - // scaling for the sub operations - double d = ostepd * OBJ_STEP_LEVELS[slaposSupportTree] / 100.0; - double init = m_report_status.status(); - JobController ctl; - - ctl.statuscb = [this, d, init](unsigned st, const std::string &logmsg) { - double current = init + st * d; - if (std::round(m_report_status.status()) < std::round(current)) - m_report_status(*this, current, - OBJ_STEP_LABELS(slaposSupportTree), - SlicingStatus::DEFAULT, logmsg); - }; - ctl.stopcondition = [this]() { return canceled(); }; - ctl.cancelfn = [this]() { throw_if_canceled(); }; - - po.m_supportdata->create_support_tree(ctl); - - if (!po.m_config.supports_enable.getBool()) return; - - throw_if_canceled(); - - // Create the unified mesh - auto rc = SlicingStatus::RELOAD_SCENE; - - // This is to prevent "Done." being displayed during merged_mesh() - m_report_status(*this, -1, L("Visualizing supports")); - - BOOST_LOG_TRIVIAL(debug) << "Processed support point count " - << po.m_supportdata->pts.size(); - - // Check the mesh for later troubleshooting. - if(po.support_mesh().empty()) - BOOST_LOG_TRIVIAL(warning) << "Support mesh is empty"; - - m_report_status(*this, -1, L("Visualizing supports"), rc); - }; - - // This step generates the sla base pad - auto generate_pad = [this](SLAPrintObject& po) { - // this step can only go after the support tree has been created - // and before the supports had been sliced. (or the slicing has to be - // repeated) - - if(po.m_config.pad_enable.getBool()) - { - // Get the distilled pad configuration from the config - sla::PadConfig pcfg = make_pad_cfg(po.m_config); - - ExPolygons bp; // This will store the base plate of the pad. - double pad_h = pcfg.full_height(); - const TriangleMesh &trmesh = po.transformed_mesh(); - - // This call can get pretty time consuming - auto thrfn = [this](){ throw_if_canceled(); }; - - if (!po.m_config.supports_enable.getBool() || pcfg.embed_object) { - // No support (thus no elevation) or zero elevation mode - // we sometimes call it "builtin pad" is enabled so we will - // get a sample from the bottom of the mesh and use it for pad - // creation. - sla::pad_blueprint(trmesh, bp, float(pad_h), - float(po.m_config.layer_height.getFloat()), - thrfn); - } - - po.m_supportdata->support_tree_ptr->add_pad(bp, pcfg); - auto &pad_mesh = po.m_supportdata->support_tree_ptr->retrieve_mesh(MeshType::Pad); - - if (!validate_pad(pad_mesh, pcfg)) - throw std::runtime_error( - L("No pad can be generated for this model with the " - "current configuration")); - - } else if(po.m_supportdata && po.m_supportdata->support_tree_ptr) { - po.m_supportdata->support_tree_ptr->remove_pad(); - } - - po.throw_if_canceled(); - auto rc = SlicingStatus::RELOAD_SCENE; - m_report_status(*this, -1, L("Visualizing supports"), rc); - }; - - // Slicing the support geometries similarly to the model slicing procedure. - // If the pad had been added previously (see step "base_pool" than it will - // be part of the slices) - auto slice_supports = [this](SLAPrintObject& po) { - auto& sd = po.m_supportdata; - - if(sd) sd->support_slices.clear(); - - // Don't bother if no supports and no pad is present. - if (!po.m_config.supports_enable.getBool() && - !po.m_config.pad_enable.getBool()) - return; - - if(sd && sd->support_tree_ptr) { - - std::vector heights; heights.reserve(po.m_slice_index.size()); - - for(auto& rec : po.m_slice_index) { - heights.emplace_back(rec.slice_level()); - } - - sd->support_slices = sd->support_tree_ptr->slice( - heights, float(po.config().slice_closing_radius.value)); - } - - double doffs = m_printer_config.absolute_correction.getFloat(); - coord_t clpr_offs = scaled(doffs); - for(size_t i = 0; - i < sd->support_slices.size() && i < po.m_slice_index.size(); - ++i) - { - // We apply the printer correction offset here. - if(clpr_offs != 0) - sd->support_slices[i] = - offset_ex(sd->support_slices[i], float(clpr_offs)); - - po.m_slice_index[i].set_support_slice_idx(po, i); - } - - // Using RELOAD_SLA_PREVIEW to tell the Plater to pass the update - // status to the 3D preview to load the SLA slices. - m_report_status(*this, -2, "", SlicingStatus::RELOAD_SLA_PREVIEW); - }; - - // Merging the slices from all the print objects into one slice grid and - // calculating print statistics from the merge result. - auto merge_slices_and_eval_stats = [this, ilhs]() { - - // clear the rasterizer input - m_printer_input.clear(); - - size_t mx = 0; - for(SLAPrintObject * o : m_objects) { - if(auto m = o->get_slice_index().size() > mx) mx = m; - } - - m_printer_input.reserve(mx); - - auto eps = coord_t(SCALED_EPSILON); - - for(SLAPrintObject * o : m_objects) { - coord_t gndlvl = o->get_slice_index().front().print_level() - ilhs; - - for(const SliceRecord& slicerecord : o->get_slice_index()) { - coord_t lvlid = slicerecord.print_level() - gndlvl; - - // Neat trick to round the layer levels to the grid. - lvlid = eps * (lvlid / eps); - - auto it = std::lower_bound(m_printer_input.begin(), - m_printer_input.end(), - PrintLayer(lvlid)); - - if(it == m_printer_input.end() || it->level() != lvlid) - it = m_printer_input.insert(it, PrintLayer(lvlid)); - - - it->add(slicerecord); - } - } - - m_print_statistics.clear(); - - using ClipperPoint = ClipperLib::IntPoint; - using ClipperPolygon = ClipperLib::Polygon; // see clipper_polygon.hpp in libnest2d - using ClipperPolygons = std::vector; - namespace sl = libnest2d::shapelike; // For algorithms - - // Set up custom union and diff functions for clipper polygons - auto polyunion = [] (const ClipperPolygons& subjects) - { - ClipperLib::Clipper clipper; - - bool closed = true; - - for(auto& path : subjects) { - clipper.AddPath(path.Contour, ClipperLib::ptSubject, closed); - clipper.AddPaths(path.Holes, ClipperLib::ptSubject, closed); - } - - auto mode = ClipperLib::pftPositive; - - return libnest2d::clipper_execute(clipper, ClipperLib::ctUnion, mode, mode); - }; - - auto polydiff = [](const ClipperPolygons& subjects, const ClipperPolygons& clips) - { - ClipperLib::Clipper clipper; - - bool closed = true; - - for(auto& path : subjects) { - clipper.AddPath(path.Contour, ClipperLib::ptSubject, closed); - clipper.AddPaths(path.Holes, ClipperLib::ptSubject, closed); - } - - for(auto& path : clips) { - clipper.AddPath(path.Contour, ClipperLib::ptClip, closed); - clipper.AddPaths(path.Holes, ClipperLib::ptClip, closed); - } - - auto mode = ClipperLib::pftPositive; - - return libnest2d::clipper_execute(clipper, ClipperLib::ctDifference, mode, mode); - }; - - // libnest calculates positive area for clockwise polygons, Slic3r is in counter-clockwise - auto areafn = [](const ClipperPolygon& poly) { return - sl::area(poly); }; - - const double area_fill = m_printer_config.area_fill.getFloat()*0.01;// 0.5 (50%); - const double fast_tilt = m_printer_config.fast_tilt_time.getFloat();// 5.0; - const double slow_tilt = m_printer_config.slow_tilt_time.getFloat();// 8.0; - - const double init_exp_time = m_material_config.initial_exposure_time.getFloat(); - const double exp_time = m_material_config.exposure_time.getFloat(); - - const int fade_layers_cnt = m_default_object_config.faded_layers.getInt();// 10 // [3;20] - - const auto width = scaled(m_printer_config.display_width.getFloat()); - const auto height = scaled(m_printer_config.display_height.getFloat()); - const double display_area = width*height; - - // get polygons for all instances in the object - auto get_all_polygons = - [](const ExPolygons& input_polygons, - const std::vector& instances, - bool is_lefthanded) - { - ClipperPolygons polygons; - polygons.reserve(input_polygons.size() * instances.size()); - - for (const ExPolygon& polygon : input_polygons) { - if(polygon.contour.empty()) continue; - - for (size_t i = 0; i < instances.size(); ++i) - { - ClipperPolygon poly; - - // We need to reverse if is_lefthanded is true but - bool needreverse = is_lefthanded; - - // should be a move - poly.Contour.reserve(polygon.contour.size() + 1); - - auto& cntr = polygon.contour.points; - if(needreverse) - for(auto it = cntr.rbegin(); it != cntr.rend(); ++it) - poly.Contour.emplace_back(it->x(), it->y()); - else - for(auto& p : cntr) - poly.Contour.emplace_back(p.x(), p.y()); - - for(auto& h : polygon.holes) { - poly.Holes.emplace_back(); - auto& hole = poly.Holes.back(); - hole.reserve(h.points.size() + 1); - - if(needreverse) - for(auto it = h.points.rbegin(); it != h.points.rend(); ++it) - hole.emplace_back(it->x(), it->y()); - else - for(auto& p : h.points) - hole.emplace_back(p.x(), p.y()); - } - - if(is_lefthanded) { - for(auto& p : poly.Contour) p.X = -p.X; - for(auto& h : poly.Holes) for(auto& p : h) p.X = -p.X; - } - - sl::rotate(poly, double(instances[i].rotation)); - sl::translate(poly, ClipperPoint{instances[i].shift(X), - instances[i].shift(Y)}); - - polygons.emplace_back(std::move(poly)); - } - } - return polygons; - }; - - double supports_volume(0.0); - double models_volume(0.0); - - double estim_time(0.0); - - size_t slow_layers = 0; - size_t fast_layers = 0; - - const double delta_fade_time = (init_exp_time - exp_time) / (fade_layers_cnt + 1); - double fade_layer_time = init_exp_time; - - SpinMutex mutex; - using Lock = std::lock_guard; - - // Going to parallel: - auto printlayerfn = [this, - // functions and read only vars - get_all_polygons, polyunion, polydiff, areafn, - area_fill, display_area, exp_time, init_exp_time, fast_tilt, slow_tilt, delta_fade_time, - - // write vars - &mutex, &models_volume, &supports_volume, &estim_time, &slow_layers, - &fast_layers, &fade_layer_time](size_t sliced_layer_cnt) - { - PrintLayer& layer = m_printer_input[sliced_layer_cnt]; - - // vector of slice record references - auto& slicerecord_references = layer.slices(); - - if(slicerecord_references.empty()) return; - - // Layer height should match for all object slices for a given level. - const auto l_height = double(slicerecord_references.front().get().layer_height()); - - // Calculation of the consumed material - - ClipperPolygons model_polygons; - ClipperPolygons supports_polygons; - - size_t c = std::accumulate(layer.slices().begin(), - layer.slices().end(), - size_t(0), - [](size_t a, const SliceRecord &sr) { - return a + sr.get_slice(soModel) - .size(); - }); - - model_polygons.reserve(c); - - c = std::accumulate(layer.slices().begin(), - layer.slices().end(), - size_t(0), - [](size_t a, const SliceRecord &sr) { - return a + sr.get_slice(soModel).size(); - }); - - supports_polygons.reserve(c); - - for(const SliceRecord& record : layer.slices()) { - const SLAPrintObject *po = record.print_obj(); - - const ExPolygons &modelslices = record.get_slice(soModel); - - bool is_lefth = record.print_obj()->is_left_handed(); - if (!modelslices.empty()) { - ClipperPolygons v = get_all_polygons(modelslices, po->instances(), is_lefth); - for(ClipperPolygon& p_tmp : v) model_polygons.emplace_back(std::move(p_tmp)); - } - - const ExPolygons &supportslices = record.get_slice(soSupport); - - if (!supportslices.empty()) { - ClipperPolygons v = get_all_polygons(supportslices, po->instances(), is_lefth); - for(ClipperPolygon& p_tmp : v) supports_polygons.emplace_back(std::move(p_tmp)); - } - } - - model_polygons = polyunion(model_polygons); - double layer_model_area = 0; - for (const ClipperPolygon& polygon : model_polygons) - layer_model_area += areafn(polygon); - - if (layer_model_area < 0 || layer_model_area > 0) { - Lock lck(mutex); models_volume += layer_model_area * l_height; - } - - if(!supports_polygons.empty()) { - if(model_polygons.empty()) supports_polygons = polyunion(supports_polygons); - else supports_polygons = polydiff(supports_polygons, model_polygons); - // allegedly, union of subject is done withing the diff according to the pftPositive polyFillType - } - - double layer_support_area = 0; - for (const ClipperPolygon& polygon : supports_polygons) - layer_support_area += areafn(polygon); - - if (layer_support_area < 0 || layer_support_area > 0) { - Lock lck(mutex); supports_volume += layer_support_area * l_height; - } - - // Here we can save the expensively calculated polygons for printing - ClipperPolygons trslices; - trslices.reserve(model_polygons.size() + supports_polygons.size()); - for(ClipperPolygon& poly : model_polygons) trslices.emplace_back(std::move(poly)); - for(ClipperPolygon& poly : supports_polygons) trslices.emplace_back(std::move(poly)); - - layer.transformed_slices(polyunion(trslices)); - - // Calculation of the slow and fast layers to the future controlling those values on FW - - const bool is_fast_layer = (layer_model_area + layer_support_area) <= display_area*area_fill; - const double tilt_time = is_fast_layer ? fast_tilt : slow_tilt; - - { Lock lck(mutex); - if (is_fast_layer) - fast_layers++; - else - slow_layers++; - - - // Calculation of the printing time - - if (sliced_layer_cnt < 3) - estim_time += init_exp_time; - else if (fade_layer_time > exp_time) - { - fade_layer_time -= delta_fade_time; - estim_time += fade_layer_time; - } - else - estim_time += exp_time; - - estim_time += tilt_time; - } - }; - - // sequential version for debugging: - // for(size_t i = 0; i < m_printer_input.size(); ++i) printlayerfn(i); - tbb::parallel_for(0, m_printer_input.size(), printlayerfn); - - auto SCALING2 = SCALING_FACTOR * SCALING_FACTOR; - m_print_statistics.support_used_material = supports_volume * SCALING2; - m_print_statistics.objects_used_material = models_volume * SCALING2; - - // Estimated printing time - // A layers count o the highest object - if (m_printer_input.size() == 0) - m_print_statistics.estimated_print_time = std::nan(""); - else - m_print_statistics.estimated_print_time = estim_time; - - m_print_statistics.fast_layers_count = fast_layers; - m_print_statistics.slow_layers_count = slow_layers; - - m_report_status(*this, -2, "", SlicingStatus::RELOAD_SLA_PREVIEW); - }; - - // Rasterizing the model objects, and their supports - auto rasterize = [this]() { - if(canceled()) return; - - // Set up the printer, allocate space for all the layers - sla::RasterWriter &printer = init_printer(); - - auto lvlcnt = unsigned(m_printer_input.size()); - printer.layers(lvlcnt); - - // coefficient to map the rasterization state (0-99) to the allocated - // portion (slot) of the process state - double sd = (100 - max_objstatus) / 100.0; - - // slot is the portion of 100% that is realted to rasterization - unsigned slot = PRINT_STEP_LEVELS[slapsRasterize]; - - // pst: previous state - double pst = m_report_status.status(); - - double increment = (slot * sd) / m_printer_input.size(); - double dstatus = m_report_status.status(); - - SpinMutex slck; - - // procedure to process one height level. This will run in parallel - auto lvlfn = - [this, &slck, &printer, increment, &dstatus, &pst] - (unsigned level_id) - { - if(canceled()) return; - - PrintLayer& printlayer = m_printer_input[level_id]; - - // Switch to the appropriate layer in the printer - printer.begin_layer(level_id); - - for(const ClipperLib::Polygon& poly : printlayer.transformed_slices()) - printer.draw_polygon(poly, level_id); - - // Finish the layer for later saving it. - printer.finish_layer(level_id); - - // Status indication guarded with the spinlock - { - std::lock_guard lck(slck); - dstatus += increment; - double st = std::round(dstatus); - if(st > pst) { - m_report_status(*this, st, - PRINT_STEP_LABELS(slapsRasterize)); - pst = st; - } - } - }; - - // last minute escape - if(canceled()) return; - - // Sequential version (for testing) - // for(unsigned l = 0; l < lvlcnt; ++l) lvlfn(l); - - // Print all the layers in parallel - tbb::parallel_for(0, lvlcnt, lvlfn); - - // Set statistics values to the printer - sla::RasterWriter::PrintStatistics stats; - stats.used_material = (m_print_statistics.objects_used_material + - m_print_statistics.support_used_material) / - 1000; - - int num_fade = m_default_object_config.faded_layers.getInt(); - stats.num_fade = num_fade >= 0 ? size_t(num_fade) : size_t(0); - stats.num_fast = m_print_statistics.fast_layers_count; - stats.num_slow = m_print_statistics.slow_layers_count; - stats.estimated_print_time_s = m_print_statistics.estimated_print_time; - - m_printer->set_statistics(stats); - }; - - using slaposFn = std::function; - using slapsFn = std::function; - - slaposFn pobj_program[] = - { - hollow_model, slice_model, [](SLAPrintObject&){}, support_points, support_tree, generate_pad, slice_supports - }; + Steps printsteps{this}; // We want to first process all objects... std::vector level1_obj_steps = { @@ -1520,10 +679,9 @@ void SLAPrint::process() slaposSliceSupports }; - slapsFn print_program[] = { merge_slices_and_eval_stats, rasterize }; SLAPrintStep print_steps[] = { slapsMergeSlicesAndEval, slapsRasterize }; - - double st = min_objstatus; + + double st = Steps::min_objstatus; BOOST_LOG_TRIVIAL(info) << "Start slicing process."; @@ -1538,10 +696,10 @@ void SLAPrint::process() std::array step_times {}; auto apply_steps_on_objects = - [this, &st, ostepd, &pobj_program, &step_times, &bench] + [this, &st, &printsteps, &step_times, &bench] (const std::vector &steps) { - unsigned incr = 0; + double incr = 0; for (SLAPrintObject *po : m_objects) { for (SLAPrintObjectStep step : steps) { @@ -1551,19 +709,19 @@ void SLAPrint::process() // throws the canceled signal. throw_if_canceled(); - st += incr * ostepd; + st += incr; if (po->m_stepmask[step] && po->set_started(step)) { - m_report_status(*this, st, OBJ_STEP_LABELS(step)); + m_report_status(*this, st, printsteps.label(step)); bench.start(); - pobj_program[step](*po); + printsteps.execute(step, *po); bench.stop(); step_times[step] += bench.getElapsedSec(); throw_if_canceled(); po->set_done(step); } - incr = OBJ_STEP_LEVELS[step]; + incr = printsteps.progressrange(step); } } }; @@ -1573,23 +731,22 @@ void SLAPrint::process() // this would disable the rasterization step // std::fill(m_stepmask.begin(), m_stepmask.end(), false); - - double pstd = (100 - max_objstatus) / 100.0; - st = max_objstatus; + + st = Steps::max_objstatus; for(SLAPrintStep currentstep : print_steps) { throw_if_canceled(); if (m_stepmask[currentstep] && set_started(currentstep)) { - m_report_status(*this, st, PRINT_STEP_LABELS(currentstep)); + m_report_status(*this, st, printsteps.label(currentstep)); bench.start(); - print_program[currentstep](); + printsteps.execute(currentstep); bench.stop(); step_times[slaposCount + currentstep] += bench.getElapsedSec(); throw_if_canceled(); set_done(currentstep); } - st += PRINT_STEP_LEVELS[currentstep] * pstd; + st += printsteps.progressrange(currentstep); } // If everything vent well @@ -1598,10 +755,10 @@ void SLAPrint::process() #ifdef SLAPRINT_DO_BENCHMARK std::string csvbenchstr; for (size_t i = 0; i < size_t(slaposCount); ++i) - csvbenchstr += OBJ_STEP_LABELS(i) + ";"; + csvbenchstr += printsteps.label(SLAPrintObjectStep(i)) + ";"; for (size_t i = 0; i < size_t(slapsCount); ++i) - csvbenchstr += PRINT_STEP_LABELS(i) + ";"; + csvbenchstr += printsteps.label(SLAPrintStep(i)) + ";"; csvbenchstr += "\n"; for (double t : step_times) csvbenchstr += std::to_string(t) + ";"; diff --git a/src/libslic3r/SLAPrint.hpp b/src/libslic3r/SLAPrint.hpp index 6c8a6e26b9..2edede1099 100644 --- a/src/libslic3r/SLAPrint.hpp +++ b/src/libslic3r/SLAPrint.hpp @@ -3,8 +3,8 @@ #include #include "PrintBase.hpp" -//#include "PrintExport.hpp" #include "SLA/RasterWriter.hpp" +#include "SLA/SupportTree.hpp" #include "Point.hpp" #include "MTUtils.hpp" #include @@ -292,10 +292,33 @@ private: // Caching the transformed (m_trafo) raw mesh of the object mutable CachedObject m_transformed_rmesh; - class SupportData; + class SupportData : public sla::SupportableMesh + { + public: + sla::SupportTree::UPtr support_tree_ptr; // the supports + std::vector support_slices; // sliced supports + + inline SupportData(const TriangleMesh &t) + : sla::SupportableMesh{t, {}, {}} + {} + + sla::SupportTree::UPtr &create_support_tree(const sla::JobController &ctl) + { + support_tree_ptr = sla::SupportTree::create(*this, ctl); + return support_tree_ptr; + } + }; + std::unique_ptr m_supportdata; - class HollowingData; + class HollowingData + { + public: + + TriangleMesh interior; + // std::vector + }; + std::unique_ptr m_hollowing_data; }; @@ -346,7 +369,9 @@ class SLAPrint : public PrintBaseWithState { private: // Prevents erroneous use by other classes. typedef PrintBaseWithState Inherited; - + + class Steps; // See SLAPrintSteps.cpp + public: SLAPrint(): m_stepmask(slapsCount, true) {} @@ -402,8 +427,8 @@ public: template void transformed_slices(Container&& c) { m_transformed_slices = std::forward(c); } - - friend void SLAPrint::process(); + + friend class SLAPrint::Steps; public: @@ -479,6 +504,19 @@ private: friend SLAPrintObject; }; +// Helper functions: + +bool is_zero_elevation(const SLAPrintObjectConfig &c); + +sla::SupportConfig make_support_cfg(const SLAPrintObjectConfig& c); + +sla::PadConfig::EmbedObject builtin_pad_cfg(const SLAPrintObjectConfig& c); + +sla::PadConfig make_pad_cfg(const SLAPrintObjectConfig& c); + +bool validate_pad(const TriangleMesh &pad, const sla::PadConfig &pcfg); + + } // namespace Slic3r #endif /* slic3r_SLAPrint_hpp_ */ diff --git a/src/libslic3r/SLAPrintSteps.cpp b/src/libslic3r/SLAPrintSteps.cpp new file mode 100644 index 0000000000..61d00dff8d --- /dev/null +++ b/src/libslic3r/SLAPrintSteps.cpp @@ -0,0 +1,848 @@ +#include + +#include +#include +#include + +#include + +// For geometry algorithms with native Clipper types (no copies and conversions) +#include + +#include + +#include "I18N.hpp" + +//! macro used to mark string used at localization, +//! return same string +#define L(s) Slic3r::I18N::translate(s) + +namespace Slic3r { + +namespace { + +const std::array OBJ_STEP_LEVELS = { + 5, // slaposHollowing, + 20, // slaposObjectSlice, + 5, // slaposDrillHolesIfHollowed + 20, // slaposSupportPoints, + 10, // slaposSupportTree, + 10, // slaposPad, + 30, // slaposSliceSupports, +}; + +std::string OBJ_STEP_LABELS(size_t idx) +{ + switch (idx) { + case slaposHollowing: return L("Hollowing out the model"); + case slaposObjectSlice: return L("Slicing model"); + case slaposDrillHolesIfHollowed: return L("Drilling holes into hollowed model."); + case slaposSupportPoints: return L("Generating support points"); + case slaposSupportTree: return L("Generating support tree"); + case slaposPad: return L("Generating pad"); + case slaposSliceSupports: return L("Slicing supports"); + default:; + } + assert(false); + return "Out of bounds!"; +}; + +const std::array PRINT_STEP_LEVELS = { + 10, // slapsMergeSlicesAndEval + 90, // slapsRasterize +}; + +std::string PRINT_STEP_LABELS(size_t idx) +{ + switch (idx) { + case slapsMergeSlicesAndEval: return L("Merging slices and calculating statistics"); + case slapsRasterize: return L("Rasterizing layers"); + default:; + } + assert(false); return "Out of bounds!"; +}; + +} + +SLAPrint::Steps::Steps(SLAPrint *print) + : m_print{print} + , objcount{m_print->m_objects.size()} + , ilhd{m_print->m_material_config.initial_layer_height.getFloat()} + , ilh{float(ilhd)} + , ilhs{scaled(ilhd)} + , objectstep_scale{(max_objstatus - min_objstatus) / (objcount * 100.0)} +{} + +void SLAPrint::Steps::hollow_model(SLAPrintObject &po) +{ + + if (!po.m_config.hollowing_enable.getBool()) { + BOOST_LOG_TRIVIAL(info) << "Skipping hollowing step!"; + po.m_hollowing_data.reset(); + return; + } else { + BOOST_LOG_TRIVIAL(info) << "Performing hollowing step!"; + } + + if (!po.m_hollowing_data) + po.m_hollowing_data.reset(new SLAPrintObject::HollowingData()); + + double thickness = po.m_config.hollowing_min_thickness.getFloat(); + double quality = po.m_config.hollowing_quality.getFloat(); + double closing_d = po.m_config.hollowing_closing_distance.getFloat(); + sla::HollowingConfig hlwcfg{thickness, quality, closing_d}; + auto meshptr = generate_interior(po.transformed_mesh(), hlwcfg); + if (meshptr) po.m_hollowing_data->interior = *meshptr; + + if (po.m_hollowing_data->interior.empty()) + BOOST_LOG_TRIVIAL(warning) << "Hollowed interior is empty!"; +} + +// The slicing will be performed on an imaginary 1D grid which starts from +// the bottom of the bounding box created around the supported model. So +// the first layer which is usually thicker will be part of the supports +// not the model geometry. Exception is when the model is not in the air +// (elevation is zero) and no pad creation was requested. In this case the +// model geometry starts on the ground level and the initial layer is part +// of it. In any case, the model and the supports have to be sliced in the +// same imaginary grid (the height vector argument to TriangleMeshSlicer). +void SLAPrint::Steps::slice_model(SLAPrintObject &po) +{ + + TriangleMesh hollowed_mesh; + + bool is_hollowing = po.m_config.hollowing_enable.getBool() && + po.m_hollowing_data; + + if (is_hollowing) { + hollowed_mesh = po.transformed_mesh(); + hollowed_mesh.merge(po.m_hollowing_data->interior); + hollowed_mesh.require_shared_vertices(); + } + + const TriangleMesh &mesh = is_hollowing ? hollowed_mesh : + po.transformed_mesh(); + + // We need to prepare the slice index... + + double lhd = m_print->m_objects.front()->m_config.layer_height.getFloat(); + float lh = float(lhd); + coord_t lhs = scaled(lhd); + auto && bb3d = mesh.bounding_box(); + double minZ = bb3d.min(Z) - po.get_elevation(); + double maxZ = bb3d.max(Z); + auto minZf = float(minZ); + coord_t minZs = scaled(minZ); + coord_t maxZs = scaled(maxZ); + + po.m_slice_index.clear(); + + size_t cap = size_t(1 + (maxZs - minZs - ilhs) / lhs); + po.m_slice_index.reserve(cap); + + po.m_slice_index.emplace_back(minZs + ilhs, minZf + ilh / 2.f, ilh); + + for(coord_t h = minZs + ilhs + lhs; h <= maxZs; h += lhs) + po.m_slice_index.emplace_back(h, unscaled(h) - lh / 2.f, lh); + + // Just get the first record that is from the model: + auto slindex_it = + po.closest_slice_record(po.m_slice_index, float(bb3d.min(Z))); + + if(slindex_it == po.m_slice_index.end()) + //TRN To be shown at the status bar on SLA slicing error. + throw std::runtime_error( + L("Slicing had to be stopped due to an internal error: " + "Inconsistent slice index.")); + + po.m_model_height_levels.clear(); + po.m_model_height_levels.reserve(po.m_slice_index.size()); + for(auto it = slindex_it; it != po.m_slice_index.end(); ++it) + po.m_model_height_levels.emplace_back(it->slice_level()); + + TriangleMeshSlicer slicer(&mesh); + + po.m_model_slices.clear(); + slicer.slice(po.m_model_height_levels, + float(po.config().slice_closing_radius.value), + &po.m_model_slices, + [this](){ m_print->throw_if_canceled(); }); + + auto mit = slindex_it; + double doffs = m_print->m_printer_config.absolute_correction.getFloat(); + coord_t clpr_offs = scaled(doffs); + for(size_t id = 0; + id < po.m_model_slices.size() && mit != po.m_slice_index.end(); + id++) + { + // We apply the printer correction offset here. + if(clpr_offs != 0) + po.m_model_slices[id] = + offset_ex(po.m_model_slices[id], float(clpr_offs)); + + mit->set_model_slice_idx(po, id); ++mit; + } + + if(po.m_config.supports_enable.getBool() || + po.m_config.pad_enable.getBool()) + { + po.m_supportdata.reset( + new SLAPrintObject::SupportData(po.transformed_mesh()) ); + } +} + +// In this step we check the slices, identify island and cover them with +// support points. Then we sprinkle the rest of the mesh. +void SLAPrint::Steps::support_points(SLAPrintObject &po) +{ + // If supports are disabled, we can skip the model scan. + if(!po.m_config.supports_enable.getBool()) return; + + if (!po.m_supportdata) + po.m_supportdata.reset( + new SLAPrintObject::SupportData(po.transformed_mesh())); + + const ModelObject& mo = *po.m_model_object; + + BOOST_LOG_TRIVIAL(debug) << "Support point count " + << mo.sla_support_points.size(); + + // Unless the user modified the points or we already did the calculation, + // we will do the autoplacement. Otherwise we will just blindly copy the + // frontend data into the backend cache. + if (mo.sla_points_status != sla::PointsStatus::UserModified) { + + // calculate heights of slices (slices are calculated already) + const std::vector& heights = po.m_model_height_levels; + + throw_if_canceled(); + sla::SupportPointGenerator::Config config; + const SLAPrintObjectConfig& cfg = po.config(); + + // the density config value is in percents: + config.density_relative = float(cfg.support_points_density_relative / 100.f); + config.minimal_distance = float(cfg.support_points_minimal_distance); + config.head_diameter = float(cfg.support_head_front_diameter); + + // scaling for the sub operations + double d = objectstep_scale * OBJ_STEP_LEVELS[slaposSupportPoints] / 100.0; + double init = current_status(); + + auto statuscb = [this, d, init](unsigned st) + { + double current = init + st * d; + if(std::round(current_status()) < std::round(current)) + report_status(current, OBJ_STEP_LABELS(slaposSupportPoints)); + }; + + // Construction of this object does the calculation. + throw_if_canceled(); + sla::SupportPointGenerator auto_supports( + po.m_supportdata->emesh, po.get_model_slices(), heights, config, + [this]() { throw_if_canceled(); }, statuscb); + + // Now let's extract the result. + const std::vector& points = auto_supports.output(); + throw_if_canceled(); + po.m_supportdata->pts = points; + + BOOST_LOG_TRIVIAL(debug) << "Automatic support points: " + << po.m_supportdata->pts.size(); + + // Using RELOAD_SLA_SUPPORT_POINTS to tell the Plater to pass + // the update status to GLGizmoSlaSupports + report_status(-1, L("Generating support points"), + SlicingStatus::RELOAD_SLA_SUPPORT_POINTS); + } else { + // There are either some points on the front-end, or the user + // removed them on purpose. No calculation will be done. + po.m_supportdata->pts = po.transformed_support_points(); + } + + // If the zero elevation mode is engaged, we have to filter out all the + // points that are on the bottom of the object + if (is_zero_elevation(po.config())) { + double tolerance = po.config().pad_enable.getBool() ? + po.m_config.pad_wall_thickness.getFloat() : + po.m_config.support_base_height.getFloat(); + + remove_bottom_points(po.m_supportdata->pts, + po.m_supportdata->emesh.ground_level(), + tolerance); + } +} + +void SLAPrint::Steps::support_tree(SLAPrintObject &po) +{ + if(!po.m_supportdata) return; + + sla::PadConfig pcfg = make_pad_cfg(po.m_config); + + if (pcfg.embed_object) + po.m_supportdata->emesh.ground_level_offset(pcfg.wall_thickness_mm); + + po.m_supportdata->cfg = make_support_cfg(po.m_config); + + // scaling for the sub operations + double d = objectstep_scale * OBJ_STEP_LEVELS[slaposSupportTree] / 100.0; + double init = current_status(); + sla::JobController ctl; + + ctl.statuscb = [this, d, init](unsigned st, const std::string &logmsg) { + double current = init + st * d; + if (std::round(current_status()) < std::round(current)) + report_status(current, OBJ_STEP_LABELS(slaposSupportTree), + SlicingStatus::DEFAULT, logmsg); + }; + ctl.stopcondition = [this]() { return canceled(); }; + ctl.cancelfn = [this]() { throw_if_canceled(); }; + + po.m_supportdata->create_support_tree(ctl); + + if (!po.m_config.supports_enable.getBool()) return; + + throw_if_canceled(); + + // Create the unified mesh + auto rc = SlicingStatus::RELOAD_SCENE; + + // This is to prevent "Done." being displayed during merged_mesh() + report_status(-1, L("Visualizing supports")); + + BOOST_LOG_TRIVIAL(debug) << "Processed support point count " + << po.m_supportdata->pts.size(); + + // Check the mesh for later troubleshooting. + if(po.support_mesh().empty()) + BOOST_LOG_TRIVIAL(warning) << "Support mesh is empty"; + + report_status(-1, L("Visualizing supports"), rc); +} + +void SLAPrint::Steps::generate_pad(SLAPrintObject &po) { + // this step can only go after the support tree has been created + // and before the supports had been sliced. (or the slicing has to be + // repeated) + + if(po.m_config.pad_enable.getBool()) + { + // Get the distilled pad configuration from the config + sla::PadConfig pcfg = make_pad_cfg(po.m_config); + + ExPolygons bp; // This will store the base plate of the pad. + double pad_h = pcfg.full_height(); + const TriangleMesh &trmesh = po.transformed_mesh(); + + if (!po.m_config.supports_enable.getBool() || pcfg.embed_object) { + // No support (thus no elevation) or zero elevation mode + // we sometimes call it "builtin pad" is enabled so we will + // get a sample from the bottom of the mesh and use it for pad + // creation. + sla::pad_blueprint(trmesh, bp, float(pad_h), + float(po.m_config.layer_height.getFloat()), + [this](){ throw_if_canceled(); }); + } + + po.m_supportdata->support_tree_ptr->add_pad(bp, pcfg); + auto &pad_mesh = po.m_supportdata->support_tree_ptr->retrieve_mesh(sla::MeshType::Pad); + + if (!validate_pad(pad_mesh, pcfg)) + throw std::runtime_error( + L("No pad can be generated for this model with the " + "current configuration")); + + } else if(po.m_supportdata && po.m_supportdata->support_tree_ptr) { + po.m_supportdata->support_tree_ptr->remove_pad(); + } + + throw_if_canceled(); + report_status(-1, L("Visualizing supports"), SlicingStatus::RELOAD_SCENE); +} + +// Slicing the support geometries similarly to the model slicing procedure. +// If the pad had been added previously (see step "base_pool" than it will +// be part of the slices) +void SLAPrint::Steps::slice_supports(SLAPrintObject &po) { + auto& sd = po.m_supportdata; + + if(sd) sd->support_slices.clear(); + + // Don't bother if no supports and no pad is present. + if (!po.m_config.supports_enable.getBool() && + !po.m_config.pad_enable.getBool()) + return; + + if(sd && sd->support_tree_ptr) { + + std::vector heights; heights.reserve(po.m_slice_index.size()); + + for(auto& rec : po.m_slice_index) heights.emplace_back(rec.slice_level()); + + sd->support_slices = sd->support_tree_ptr->slice( + heights, float(po.config().slice_closing_radius.value)); + } + + double doffs = m_print->m_printer_config.absolute_correction.getFloat(); + coord_t clpr_offs = scaled(doffs); + + for (size_t i = 0; i < sd->support_slices.size() && i < po.m_slice_index.size(); ++i) { + // We apply the printer correction offset here. + if (clpr_offs != 0) + sd->support_slices[i] = offset_ex(sd->support_slices[i], float(clpr_offs)); + + po.m_slice_index[i].set_support_slice_idx(po, i); + } + + // Using RELOAD_SLA_PREVIEW to tell the Plater to pass the update + // status to the 3D preview to load the SLA slices. + report_status(-2, "", SlicingStatus::RELOAD_SLA_PREVIEW); +} + +using ClipperPoint = ClipperLib::IntPoint; +using ClipperPolygon = ClipperLib::Polygon; // see clipper_polygon.hpp in libnest2d +using ClipperPolygons = std::vector; + +static ClipperPolygons polyunion(const ClipperPolygons &subjects) +{ + ClipperLib::Clipper clipper; + + bool closed = true; + + for(auto& path : subjects) { + clipper.AddPath(path.Contour, ClipperLib::ptSubject, closed); + clipper.AddPaths(path.Holes, ClipperLib::ptSubject, closed); + } + + auto mode = ClipperLib::pftPositive; + + return libnest2d::clipper_execute(clipper, ClipperLib::ctUnion, mode, mode); +} + +static ClipperPolygons polydiff(const ClipperPolygons &subjects, const ClipperPolygons& clips) +{ + ClipperLib::Clipper clipper; + + bool closed = true; + + for(auto& path : subjects) { + clipper.AddPath(path.Contour, ClipperLib::ptSubject, closed); + clipper.AddPaths(path.Holes, ClipperLib::ptSubject, closed); + } + + for(auto& path : clips) { + clipper.AddPath(path.Contour, ClipperLib::ptClip, closed); + clipper.AddPaths(path.Holes, ClipperLib::ptClip, closed); + } + + auto mode = ClipperLib::pftPositive; + + return libnest2d::clipper_execute(clipper, ClipperLib::ctDifference, mode, mode); +} + +// get polygons for all instances in the object +static ClipperPolygons get_all_polygons( + const ExPolygons & input_polygons, + const std::vector &instances, + bool is_lefthanded) +{ + namespace sl = libnest2d::sl; + + ClipperPolygons polygons; + polygons.reserve(input_polygons.size() * instances.size()); + + for (const ExPolygon& polygon : input_polygons) { + if(polygon.contour.empty()) continue; + + for (size_t i = 0; i < instances.size(); ++i) + { + ClipperPolygon poly; + + // We need to reverse if is_lefthanded is true but + bool needreverse = is_lefthanded; + + // should be a move + poly.Contour.reserve(polygon.contour.size() + 1); + + auto& cntr = polygon.contour.points; + if(needreverse) + for(auto it = cntr.rbegin(); it != cntr.rend(); ++it) + poly.Contour.emplace_back(it->x(), it->y()); + else + for(auto& p : cntr) + poly.Contour.emplace_back(p.x(), p.y()); + + for(auto& h : polygon.holes) { + poly.Holes.emplace_back(); + auto& hole = poly.Holes.back(); + hole.reserve(h.points.size() + 1); + + if(needreverse) + for(auto it = h.points.rbegin(); it != h.points.rend(); ++it) + hole.emplace_back(it->x(), it->y()); + else + for(auto& p : h.points) + hole.emplace_back(p.x(), p.y()); + } + + if(is_lefthanded) { + for(auto& p : poly.Contour) p.X = -p.X; + for(auto& h : poly.Holes) for(auto& p : h) p.X = -p.X; + } + + sl::rotate(poly, double(instances[i].rotation)); + sl::translate(poly, ClipperPoint{instances[i].shift(X), + instances[i].shift(Y)}); + + polygons.emplace_back(std::move(poly)); + } + } + + return polygons; +} + +void SLAPrint::Steps::initialize_printer_input() +{ + auto &printer_input = m_print->m_printer_input; + + // clear the rasterizer input + printer_input.clear(); + + size_t mx = 0; + for(SLAPrintObject * o : m_print->m_objects) { + if(auto m = o->get_slice_index().size() > mx) mx = m; + } + + printer_input.reserve(mx); + + auto eps = coord_t(SCALED_EPSILON); + + for(SLAPrintObject * o : m_print->m_objects) { + coord_t gndlvl = o->get_slice_index().front().print_level() - ilhs; + + for(const SliceRecord& slicerecord : o->get_slice_index()) { + coord_t lvlid = slicerecord.print_level() - gndlvl; + + // Neat trick to round the layer levels to the grid. + lvlid = eps * (lvlid / eps); + + auto it = std::lower_bound(printer_input.begin(), + printer_input.end(), + PrintLayer(lvlid)); + + if(it == printer_input.end() || it->level() != lvlid) + it = printer_input.insert(it, PrintLayer(lvlid)); + + + it->add(slicerecord); + } + } +} + +// Merging the slices from all the print objects into one slice grid and +// calculating print statistics from the merge result. +void SLAPrint::Steps::merge_slices_and_eval_stats() { + + initialize_printer_input(); + + auto &print_statistics = m_print->m_print_statistics; + auto &printer_config = m_print->m_printer_config; + auto &material_config = m_print->m_material_config; + auto &printer_input = m_print->m_printer_input; + + print_statistics.clear(); + + // libnest calculates positive area for clockwise polygons, Slic3r is in counter-clockwise + auto areafn = [](const ClipperPolygon& poly) { return - libnest2d::sl::area(poly); }; + + const double area_fill = printer_config.area_fill.getFloat()*0.01;// 0.5 (50%); + const double fast_tilt = printer_config.fast_tilt_time.getFloat();// 5.0; + const double slow_tilt = printer_config.slow_tilt_time.getFloat();// 8.0; + + const double init_exp_time = material_config.initial_exposure_time.getFloat(); + const double exp_time = material_config.exposure_time.getFloat(); + + const int fade_layers_cnt = m_print->m_default_object_config.faded_layers.getInt();// 10 // [3;20] + + const auto width = scaled(printer_config.display_width.getFloat()); + const auto height = scaled(printer_config.display_height.getFloat()); + const double display_area = width*height; + + double supports_volume(0.0); + double models_volume(0.0); + + double estim_time(0.0); + + size_t slow_layers = 0; + size_t fast_layers = 0; + + const double delta_fade_time = (init_exp_time - exp_time) / (fade_layers_cnt + 1); + double fade_layer_time = init_exp_time; + + SpinMutex mutex; + using Lock = std::lock_guard; + + // Going to parallel: + auto printlayerfn = [ + // functions and read only vars + areafn, area_fill, display_area, exp_time, init_exp_time, fast_tilt, slow_tilt, delta_fade_time, + + // write vars + &mutex, &models_volume, &supports_volume, &estim_time, &slow_layers, + &fast_layers, &fade_layer_time](PrintLayer& layer, size_t sliced_layer_cnt) + { + // vector of slice record references + auto& slicerecord_references = layer.slices(); + + if(slicerecord_references.empty()) return; + + // Layer height should match for all object slices for a given level. + const auto l_height = double(slicerecord_references.front().get().layer_height()); + + // Calculation of the consumed material + + ClipperPolygons model_polygons; + ClipperPolygons supports_polygons; + + size_t c = std::accumulate(layer.slices().begin(), + layer.slices().end(), + size_t(0), + [](size_t a, const SliceRecord &sr) { + return a + sr.get_slice(soModel) + .size(); + }); + + model_polygons.reserve(c); + + c = std::accumulate(layer.slices().begin(), + layer.slices().end(), + size_t(0), + [](size_t a, const SliceRecord &sr) { + return a + sr.get_slice(soModel).size(); + }); + + supports_polygons.reserve(c); + + for(const SliceRecord& record : layer.slices()) { + const SLAPrintObject *po = record.print_obj(); + + const ExPolygons &modelslices = record.get_slice(soModel); + + bool is_lefth = record.print_obj()->is_left_handed(); + if (!modelslices.empty()) { + ClipperPolygons v = get_all_polygons(modelslices, po->instances(), is_lefth); + for(ClipperPolygon& p_tmp : v) model_polygons.emplace_back(std::move(p_tmp)); + } + + const ExPolygons &supportslices = record.get_slice(soSupport); + + if (!supportslices.empty()) { + ClipperPolygons v = get_all_polygons(supportslices, po->instances(), is_lefth); + for(ClipperPolygon& p_tmp : v) supports_polygons.emplace_back(std::move(p_tmp)); + } + } + + model_polygons = polyunion(model_polygons); + double layer_model_area = 0; + for (const ClipperPolygon& polygon : model_polygons) + layer_model_area += areafn(polygon); + + if (layer_model_area < 0 || layer_model_area > 0) { + Lock lck(mutex); models_volume += layer_model_area * l_height; + } + + if(!supports_polygons.empty()) { + if(model_polygons.empty()) supports_polygons = polyunion(supports_polygons); + else supports_polygons = polydiff(supports_polygons, model_polygons); + // allegedly, union of subject is done withing the diff according to the pftPositive polyFillType + } + + double layer_support_area = 0; + for (const ClipperPolygon& polygon : supports_polygons) + layer_support_area += areafn(polygon); + + if (layer_support_area < 0 || layer_support_area > 0) { + Lock lck(mutex); supports_volume += layer_support_area * l_height; + } + + // Here we can save the expensively calculated polygons for printing + ClipperPolygons trslices; + trslices.reserve(model_polygons.size() + supports_polygons.size()); + for(ClipperPolygon& poly : model_polygons) trslices.emplace_back(std::move(poly)); + for(ClipperPolygon& poly : supports_polygons) trslices.emplace_back(std::move(poly)); + + layer.transformed_slices(polyunion(trslices)); + + // Calculation of the slow and fast layers to the future controlling those values on FW + + const bool is_fast_layer = (layer_model_area + layer_support_area) <= display_area*area_fill; + const double tilt_time = is_fast_layer ? fast_tilt : slow_tilt; + + { Lock lck(mutex); + if (is_fast_layer) + fast_layers++; + else + slow_layers++; + + + // Calculation of the printing time + + if (sliced_layer_cnt < 3) + estim_time += init_exp_time; + else if (fade_layer_time > exp_time) + { + fade_layer_time -= delta_fade_time; + estim_time += fade_layer_time; + } + else + estim_time += exp_time; + + estim_time += tilt_time; + } + }; + + // sequential version for debugging: + // for(size_t i = 0; i < m_printer_input.size(); ++i) printlayerfn(i); + sla::ccr::enumerate(printer_input.begin(), printer_input.end(), printlayerfn); + + auto SCALING2 = SCALING_FACTOR * SCALING_FACTOR; + print_statistics.support_used_material = supports_volume * SCALING2; + print_statistics.objects_used_material = models_volume * SCALING2; + + // Estimated printing time + // A layers count o the highest object + if (printer_input.size() == 0) + print_statistics.estimated_print_time = std::nan(""); + else + print_statistics.estimated_print_time = estim_time; + + print_statistics.fast_layers_count = fast_layers; + print_statistics.slow_layers_count = slow_layers; + + report_status(-2, "", SlicingStatus::RELOAD_SLA_PREVIEW); +} + +// Rasterizing the model objects, and their supports +void SLAPrint::Steps::rasterize() +{ + if(canceled()) return; + + auto &print_statistics = m_print->m_print_statistics; + auto &printer_input = m_print->m_printer_input; + + // Set up the printer, allocate space for all the layers + sla::RasterWriter &printer = m_print->init_printer(); + + auto lvlcnt = unsigned(printer_input.size()); + printer.layers(lvlcnt); + + // coefficient to map the rasterization state (0-99) to the allocated + // portion (slot) of the process state + double sd = (100 - max_objstatus) / 100.0; + + // slot is the portion of 100% that is realted to rasterization + unsigned slot = PRINT_STEP_LEVELS[slapsRasterize]; + + // pst: previous state + double pst = current_status(); + + double increment = (slot * sd) / printer_input.size(); + double dstatus = current_status(); + + SpinMutex slck; + + // procedure to process one height level. This will run in parallel + auto lvlfn = [this, &slck, &printer, increment, &dstatus, &pst] (unsigned level_id) + { + if(canceled()) return; + + PrintLayer& printlayer = m_print->m_printer_input[level_id]; + + // Switch to the appropriate layer in the printer + printer.begin_layer(level_id); + + for(const ClipperLib::Polygon& poly : printlayer.transformed_slices()) + printer.draw_polygon(poly, level_id); + + // Finish the layer for later saving it. + printer.finish_layer(level_id); + + // Status indication guarded with the spinlock + { + std::lock_guard lck(slck); + dstatus += increment; + double st = std::round(dstatus); + if(st > pst) { + report_status(st, PRINT_STEP_LABELS(slapsRasterize)); + pst = st; + } + } + }; + + // last minute escape + if(canceled()) return; + + // Sequential version (for testing) + // for(unsigned l = 0; l < lvlcnt; ++l) lvlfn(l); + + // Print all the layers in parallel + tbb::parallel_for(0, lvlcnt, lvlfn); + + // Set statistics values to the printer + sla::RasterWriter::PrintStatistics stats; + stats.used_material = (print_statistics.objects_used_material + + print_statistics.support_used_material) / + 1000; + + int num_fade = m_print->m_default_object_config.faded_layers.getInt(); + stats.num_fade = num_fade >= 0 ? size_t(num_fade) : size_t(0); + stats.num_fast = print_statistics.fast_layers_count; + stats.num_slow = print_statistics.slow_layers_count; + stats.estimated_print_time_s = print_statistics.estimated_print_time; + + printer.set_statistics(stats); +} + +std::string SLAPrint::Steps::label(SLAPrintObjectStep step) +{ + return OBJ_STEP_LABELS(step); +} + +std::string SLAPrint::Steps::label(SLAPrintStep step) +{ + return PRINT_STEP_LABELS(step); +} + +double SLAPrint::Steps::progressrange(SLAPrintObjectStep step) const +{ + return OBJ_STEP_LEVELS[step] * objectstep_scale; +} + +double SLAPrint::Steps::progressrange(SLAPrintStep step) const +{ + return PRINT_STEP_LEVELS[step] * (100 - max_objstatus) / 100.0; +} + +void SLAPrint::Steps::execute(SLAPrintObjectStep step, SLAPrintObject &obj) +{ + switch(step) { + case slaposHollowing: hollow_model(obj); break; + case slaposObjectSlice: slice_model(obj); break; + case slaposDrillHolesIfHollowed: break; + case slaposSupportPoints: support_points(obj); break; + case slaposSupportTree: support_tree(obj); break; + case slaposPad: generate_pad(obj); break; + case slaposSliceSupports: slice_supports(obj); break; + case slaposCount: assert(false); + } +} + +void SLAPrint::Steps::execute(SLAPrintStep step) +{ + switch (step) { + case slapsMergeSlicesAndEval: merge_slices_and_eval_stats(); break; + case slapsRasterize: rasterize(); break; + case slapsCount: assert(false); + } +} + +} diff --git a/src/libslic3r/SLAPrintSteps.hpp b/src/libslic3r/SLAPrintSteps.hpp new file mode 100644 index 0000000000..c62558671c --- /dev/null +++ b/src/libslic3r/SLAPrintSteps.hpp @@ -0,0 +1,68 @@ +#ifndef SLAPRINTSTEPS_HPP +#define SLAPRINTSTEPS_HPP + +#include + +#include +#include + +namespace Slic3r { + +class SLAPrint::Steps +{ +private: + SLAPrint *m_print = nullptr; + +public: + // where the per object operations start and end + static const constexpr unsigned min_objstatus = 0; + static const constexpr unsigned max_objstatus = 50; + +private: + const size_t objcount; + + // shortcut to initial layer height + const double ilhd; + const float ilh; + const coord_t ilhs; + + // the coefficient that multiplies the per object status values which + // are set up for <0, 100>. They need to be scaled into the whole process + const double objectstep_scale; + + template void report_status(Args&&...args) + { + m_print->m_report_status(*m_print, std::forward(args)...); + } + + double current_status() const { return m_print->m_report_status.status(); } + void throw_if_canceled() const { m_print->throw_if_canceled(); } + bool canceled() const { return m_print->canceled(); } + void initialize_printer_input(); + +public: + Steps(SLAPrint *print); + + void hollow_model(SLAPrintObject &po); + void slice_model(SLAPrintObject& po); + void support_points(SLAPrintObject& po); + void support_tree(SLAPrintObject& po); + void generate_pad(SLAPrintObject& po); + void slice_supports(SLAPrintObject& po); + + void merge_slices_and_eval_stats(); + void rasterize(); + + void execute(SLAPrintObjectStep step, SLAPrintObject &obj); + void execute(SLAPrintStep step); + + static std::string label(SLAPrintObjectStep step); + static std::string label(SLAPrintStep step); + + double progressrange(SLAPrintObjectStep step) const; + double progressrange(SLAPrintStep step) const; +}; + +} + +#endif // SLAPRINTSTEPS_HPP diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 1d4926d92b..615d971b49 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -2882,11 +2882,12 @@ void Plater::priv::HollowJob::process() if (st < 100) update_status(int(st), s); }; - TriangleMesh omesh = sla::generate_interior(*m_object_mesh, m_cfg, ctl); + std::unique_ptr omesh = + sla::generate_interior(*m_object_mesh, m_cfg, ctl); - if (!omesh.empty()) { + if (omesh && !omesh->empty()) { m_output_mesh.reset(new TriangleMesh{*m_object_mesh}); - m_output_mesh->merge(omesh); + m_output_mesh->merge(*omesh); m_output_mesh->require_shared_vertices(); update_status(90, _(L("Indexing hollowed object"))); diff --git a/tests/libslic3r/test_hollowing.cpp b/tests/libslic3r/test_hollowing.cpp index 5e7f1a568d..0cb1ac343c 100644 --- a/tests/libslic3r/test_hollowing.cpp +++ b/tests/libslic3r/test_hollowing.cpp @@ -2,6 +2,7 @@ #include #include +#include #include "libslic3r/SLA/Hollowing.hpp" #include #include "libslic3r/Format/OBJ.hpp" @@ -28,13 +29,14 @@ TEST_CASE("Negative 3D offset should produce smaller object.", "[Hollowing]") Benchmark bench; bench.start(); - Slic3r::TriangleMesh out_mesh = Slic3r::sla::generate_interior(in_mesh); + std::unique_ptr out_mesh_ptr = + Slic3r::sla::generate_interior(in_mesh); bench.stop(); std::cout << "Elapsed processing time: " << bench.getElapsedSec() << std::endl; - in_mesh.merge(out_mesh); + if (out_mesh_ptr) in_mesh.merge(*out_mesh_ptr); in_mesh.require_shared_vertices(); in_mesh.WriteOBJFile("merged_out.obj"); } From d4d037792d086b009473eeb3e3bda20e60808f59 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Wed, 13 Nov 2019 15:55:37 +0100 Subject: [PATCH 051/336] Holes are now visible on slices in preview. --- cmake/modules/FindOpenVDB.cmake | 4 +- src/libslic3r/Model.hpp | 6 +- src/libslic3r/SLA/SupportTreeBuilder.hpp | 2 +- src/libslic3r/SLAPrint.cpp | 39 +++++++---- src/libslic3r/SLAPrint.hpp | 3 +- src/libslic3r/SLAPrintSteps.cpp | 72 +++++++++++++++----- src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp | 44 ++++++------ src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp | 22 +++--- src/slic3r/GUI/MeshUtils.hpp | 2 +- 9 files changed, 123 insertions(+), 71 deletions(-) diff --git a/cmake/modules/FindOpenVDB.cmake b/cmake/modules/FindOpenVDB.cmake index dd4ff5b20e..70bbe05f55 100644 --- a/cmake/modules/FindOpenVDB.cmake +++ b/cmake/modules/FindOpenVDB.cmake @@ -283,9 +283,9 @@ endif() macro(just_fail msg) set(OpenVDB_FOUND FALSE) if(OpenVDB_FIND_REQUIRED) - message(FATAL_ERROR msg) + message(FATAL_ERROR ${msg}) elseif(NOT OpenVDB_FIND_QUIETLY) - message(ERROR msg) + message(WARNING ${msg}) endif() return() endmacro() diff --git a/src/libslic3r/Model.hpp b/src/libslic3r/Model.hpp index 9083e35e08..ccc48d52bb 100644 --- a/src/libslic3r/Model.hpp +++ b/src/libslic3r/Model.hpp @@ -199,13 +199,13 @@ public: // This vector holds position of selected support points for SLA. The data are // saved in mesh coordinates to allow using them for several instances. // The format is (x, y, z, point_size, supports_island) - std::vector sla_support_points; + sla::SupportPoints sla_support_points; // To keep track of where the points came from (used for synchronization between // the SLA gizmo and the backend). - sla::PointsStatus sla_points_status = sla::PointsStatus::NoPoints; + sla::PointsStatus sla_points_status = sla::PointsStatus::NoPoints; // Holes to be drilled into the object so resin can flow out - std::vector sla_drain_holes; + sla::DrainHoles sla_drain_holes; /* This vector accumulates the total translation applied to the object by the center_around_origin() method. Callers might want to apply the same translation diff --git a/src/libslic3r/SLA/SupportTreeBuilder.hpp b/src/libslic3r/SLA/SupportTreeBuilder.hpp index 4859b004c3..90cf417c83 100644 --- a/src/libslic3r/SLA/SupportTreeBuilder.hpp +++ b/src/libslic3r/SLA/SupportTreeBuilder.hpp @@ -74,7 +74,7 @@ Contour3D sphere(double rho, Portion portion = make_portion(0.0, 2.0*PI), // h: Height // ssteps: how many edges will create the base circle // sp: starting point -Contour3D cylinder(double r, double h, size_t ssteps, const Vec3d &sp = {0,0,0}); +Contour3D cylinder(double r, double h, size_t ssteps = 45, const Vec3d &sp = {0,0,0}); const constexpr long ID_UNSET = -1; diff --git a/src/libslic3r/SLAPrint.cpp b/src/libslic3r/SLAPrint.cpp index 53a0e82233..61723721e4 100644 --- a/src/libslic3r/SLAPrint.cpp +++ b/src/libslic3r/SLAPrint.cpp @@ -414,6 +414,12 @@ SLAPrint::ApplyStatus SLAPrint::apply(const Model &model, DynamicPrintConfig con model_object.sla_support_points = model_object_new.sla_support_points; } model_object.sla_points_status = model_object_new.sla_points_status; + + if (model_object.sla_drain_holes.size() != model_object_new.sla_drain_holes.size()) + { + model_object.sla_drain_holes = model_object_new.sla_drain_holes; + update_apply_status(it_print_object_status->print_object->invalidate_step(slaposHollowing)); + } // Copy the ModelObject name, input_file and instances. The instances will compared against PrintObject instances in the next step. model_object.name = model_object_new.name; @@ -1154,21 +1160,30 @@ const TriangleMesh &SLAPrintObject::transformed_mesh() const { return m_transformed_rmesh.get(); } -std::vector SLAPrintObject::transformed_support_points() const +template::value_type> +std::vector transform_pts(It from, It to, Trafo &&tr) +{ + auto ret = reserve_vector(to - from); + for(auto it = from; it != to; ++it) { + V v = *it; + v.pos = tr * it->pos; + ret.emplace_back(std::move(v)); + } + return ret; +} + +sla::SupportPoints SLAPrintObject::transformed_support_points() const { assert(m_model_object != nullptr); - std::vector& spts = m_model_object->sla_support_points; + auto& spts = m_model_object->sla_support_points; + return transform_pts(spts.begin(), spts.end(), trafo().cast()); +} - // this could be cached as well - std::vector ret; - ret.reserve(spts.size()); - - for(sla::SupportPoint& sp : spts) { - Vec3f transformed_pos = trafo().cast() * sp.pos; - ret.emplace_back(transformed_pos, sp.head_front_radius, sp.is_new_island); - } - - return ret; +sla::DrainHoles SLAPrintObject::transformed_drainhole_points() const +{ + assert(m_model_object != nullptr); + auto& spts = m_model_object->sla_drain_holes; + return transform_pts(spts.begin(), spts.end(), trafo().cast()); } DynamicConfig SLAPrintStatistics::config() const diff --git a/src/libslic3r/SLAPrint.hpp b/src/libslic3r/SLAPrint.hpp index 2edede1099..8be69545e1 100644 --- a/src/libslic3r/SLAPrint.hpp +++ b/src/libslic3r/SLAPrint.hpp @@ -83,7 +83,8 @@ public: // This will return the transformed mesh which is cached const TriangleMesh& transformed_mesh() const; - std::vector transformed_support_points() const; + sla::SupportPoints transformed_support_points() const; + sla::DrainHoles transformed_drainhole_points() const; // Get the needed Z elevation for the model geometry if supports should be // displayed. This Z offset should also be applied to the support diff --git a/src/libslic3r/SLAPrintSteps.cpp b/src/libslic3r/SLAPrintSteps.cpp index 09d449576f..55359cc5c1 100644 --- a/src/libslic3r/SLAPrintSteps.cpp +++ b/src/libslic3r/SLAPrintSteps.cpp @@ -1,5 +1,9 @@ #include + +// Need the cylinder method for the the drainholes in hollowing step +#include + #include #include #include @@ -98,6 +102,42 @@ void SLAPrint::Steps::hollow_model(SLAPrintObject &po) BOOST_LOG_TRIVIAL(warning) << "Hollowed interior is empty!"; } +static void cut_drainholes(std::vector & obj_slices, + const std::vector &slicegrid, + float closing_radius, + const sla::DrainHoles & holes, + std::function thr) +{ + TriangleMesh mesh; + for (const sla::DrainHole &holept : holes) { + auto r = double(holept.radius); + auto h = double(holept.height); + sla::Contour3D hole = sla::cylinder(r, h); + Eigen::Quaterniond q; + q.setFromTwoVectors(Vec3d{0., 0., 1.}, holept.normal.cast()); + for(auto& p : hole.points) p = q * p + holept.pos.cast(); + mesh.merge(sla::to_triangle_mesh(hole)); + } + + if (mesh.empty()) return; + + mesh.require_shared_vertices(); + + TriangleMeshSlicer slicer(&mesh); + + std::vector hole_slices; + slicer.slice(slicegrid, closing_radius, &hole_slices, thr); + + if (obj_slices.size() != hole_slices.size()) + BOOST_LOG_TRIVIAL(warning) + << "Sliced object and drain-holes layer count does not match!"; + + size_t until = std::min(obj_slices.size(), hole_slices.size()); + + for (size_t i = 0; i < until; ++i) + obj_slices[i] = diff_ex(obj_slices[i], hole_slices[i]); +} + // The slicing will be performed on an imaginary 1D grid which starts from // the bottom of the bounding box created around the supported model. So // the first layer which is usually thicker will be part of the supports @@ -107,12 +147,10 @@ void SLAPrint::Steps::hollow_model(SLAPrintObject &po) // of it. In any case, the model and the supports have to be sliced in the // same imaginary grid (the height vector argument to TriangleMeshSlicer). void SLAPrint::Steps::slice_model(SLAPrintObject &po) -{ - +{ TriangleMesh hollowed_mesh; - bool is_hollowing = po.m_config.hollowing_enable.getBool() && - po.m_hollowing_data; + bool is_hollowing = po.m_config.hollowing_enable.getBool() && po.m_hollowing_data; if (is_hollowing) { hollowed_mesh = po.transformed_mesh(); @@ -120,8 +158,7 @@ void SLAPrint::Steps::slice_model(SLAPrintObject &po) hollowed_mesh.require_shared_vertices(); } - const TriangleMesh &mesh = is_hollowing ? hollowed_mesh : - po.transformed_mesh(); + const TriangleMesh &mesh = is_hollowing ? hollowed_mesh : po.transformed_mesh(); // We need to prepare the slice index... @@ -163,10 +200,13 @@ void SLAPrint::Steps::slice_model(SLAPrintObject &po) TriangleMeshSlicer slicer(&mesh); po.m_model_slices.clear(); - slicer.slice(po.m_model_height_levels, - float(po.config().slice_closing_radius.value), - &po.m_model_slices, - [this](){ m_print->throw_if_canceled(); }); + float closing_r = float(po.config().slice_closing_radius.value); + auto thr = [this]() { m_print->throw_if_canceled(); }; + auto &slice_grid = po.m_model_height_levels; + slicer.slice(slice_grid, closing_r, &po.m_model_slices, thr); + + sla::DrainHoles drainholes = po.transformed_drainhole_points(); + cut_drainholes(po.m_model_slices, slice_grid, closing_r, drainholes, thr); auto mit = slindex_it; double doffs = m_print->m_printer_config.absolute_correction.getFloat(); @@ -183,8 +223,7 @@ void SLAPrint::Steps::slice_model(SLAPrintObject &po) mit->set_model_slice_idx(po, id); ++mit; } - if(po.m_config.supports_enable.getBool() || - po.m_config.pad_enable.getBool()) + if(po.m_config.supports_enable.getBool() || po.m_config.pad_enable.getBool()) { po.m_supportdata.reset( new SLAPrintObject::SupportData(po.transformed_mesh()) ); @@ -324,8 +363,7 @@ void SLAPrint::Steps::generate_pad(SLAPrintObject &po) { // and before the supports had been sliced. (or the slicing has to be // repeated) - if(po.m_config.pad_enable.getBool()) - { + if(po.m_config.pad_enable.getBool()) { // Get the distilled pad configuration from the config sla::PadConfig pcfg = make_pad_cfg(po.m_config); @@ -368,13 +406,11 @@ void SLAPrint::Steps::slice_supports(SLAPrintObject &po) { if(sd) sd->support_slices.clear(); // Don't bother if no supports and no pad is present. - if (!po.m_config.supports_enable.getBool() && - !po.m_config.pad_enable.getBool()) + if (!po.m_config.supports_enable.getBool() && !po.m_config.pad_enable.getBool()) return; if(sd && sd->support_tree_ptr) { - - std::vector heights; heights.reserve(po.m_slice_index.size()); + auto heights = reserve_vector(po.m_slice_index.size()); for(auto& rec : po.m_slice_index) heights.emplace_back(rec.slice_level()); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp index c6c02947f1..b320c6bbe7 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp @@ -250,7 +250,7 @@ void GLGizmoHollow::render_points(const Selection& selection, bool picking) cons const sla::DrainHole& drain_hole = m_model_object->sla_drain_holes[i]; const bool& point_selected = m_selected[i]; - if (is_mesh_point_clipped(drain_hole.m_pos.cast())) + if (is_mesh_point_clipped(drain_hole.pos.cast())) continue; // First decide about the color of the point. @@ -281,7 +281,7 @@ void GLGizmoHollow::render_points(const Selection& selection, bool picking) cons // Inverse matrix of the instance scaling is applied so that the mark does not scale with the object. glsafe(::glPushMatrix()); - glsafe(::glTranslatef(drain_hole.m_pos(0), drain_hole.m_pos(1), drain_hole.m_pos(2))); + glsafe(::glTranslatef(drain_hole.pos(0), drain_hole.pos(1), drain_hole.pos(2))); glsafe(::glMultMatrixd(instance_scaling_matrix_inverse.data())); if (vol->is_left_handed()) @@ -290,17 +290,17 @@ void GLGizmoHollow::render_points(const Selection& selection, bool picking) cons // Matrices set, we can render the point mark now. Eigen::Quaterniond q; - q.setFromTwoVectors(Vec3d{0., 0., 1.}, instance_scaling_matrix_inverse * (-drain_hole.m_normal).cast()); + q.setFromTwoVectors(Vec3d{0., 0., 1.}, instance_scaling_matrix_inverse * (-drain_hole.normal).cast()); Eigen::AngleAxisd aa(q); glsafe(::glRotated(aa.angle() * (180. / M_PI), aa.axis()(0), aa.axis()(1), aa.axis()(2))); glsafe(::glPushMatrix()); - glsafe(::glTranslated(0., 0., -drain_hole.m_height)); - ::gluCylinder(m_quadric, drain_hole.m_radius, drain_hole.m_radius, drain_hole.m_height, 24, 1); - glsafe(::glTranslated(0., 0., drain_hole.m_height)); - ::gluDisk(m_quadric, 0.0, drain_hole.m_radius, 24, 1); - glsafe(::glTranslated(0., 0., -drain_hole.m_height)); + glsafe(::glTranslated(0., 0., -drain_hole.height)); + ::gluCylinder(m_quadric, drain_hole.radius, drain_hole.radius, drain_hole.height, 24, 1); + glsafe(::glTranslated(0., 0., drain_hole.height)); + ::gluDisk(m_quadric, 0.0, drain_hole.radius, 24, 1); + glsafe(::glTranslated(0., 0., -drain_hole.height)); glsafe(::glRotatef(180.f, 1.f, 0.f, 0.f)); - ::gluDisk(m_quadric, 0.0, drain_hole.m_radius, 24, 1); + ::gluDisk(m_quadric, 0.0, drain_hole.radius, 24, 1); glsafe(::glPopMatrix()); if (vol->is_left_handed()) @@ -433,7 +433,7 @@ bool GLGizmoHollow::gizmo_event(SLAGizmoEventType action, const Vec2d& mouse_pos m_model_object->sla_drain_holes.emplace_back(pos_and_normal.first + HoleStickOutLength * pos_and_normal.second, -pos_and_normal.second, m_new_hole_radius, m_new_hole_height+HoleStickOutLength); m_selected.push_back(false); - assert(m_selected.size == m_model_object->sla_drain_holes.size()); + assert(m_selected.size() == m_model_object->sla_drain_holes.size()); m_parent.set_as_dirty(); m_wait_for_up_event = true; } @@ -456,7 +456,7 @@ bool GLGizmoHollow::gizmo_event(SLAGizmoEventType action, const Vec2d& mouse_pos trafo.set_offset(trafo.get_offset() + Vec3d(0., 0., m_z_shift)); std::vector points; for (unsigned int i=0; isla_drain_holes.size(); ++i) - points.push_back(trafo.get_matrix() * m_model_object->sla_drain_holes[i].m_pos.cast()); + points.push_back(trafo.get_matrix() * m_model_object->sla_drain_holes[i].pos.cast()); // Now ask the rectangle which of the points are inside. std::vector points_inside; @@ -558,8 +558,8 @@ void GLGizmoHollow::on_update(const UpdateData& data) std::pair pos_and_normal; if (! unproject_on_mesh(data.mouse_pos.cast(), pos_and_normal)) return; - m_model_object->sla_drain_holes[m_hover_id].m_pos = pos_and_normal.first + HoleStickOutLength * pos_and_normal.second; - m_model_object->sla_drain_holes[m_hover_id].m_normal = -pos_and_normal.second; + m_model_object->sla_drain_holes[m_hover_id].pos = pos_and_normal.first + HoleStickOutLength * pos_and_normal.second; + m_model_object->sla_drain_holes[m_hover_id].normal = -pos_and_normal.second; } } @@ -688,20 +688,20 @@ RENDER_AGAIN: if (ImGui::IsItemEdited()) { for (size_t idx=0; idxsla_drain_holes[idx].m_radius = m_new_hole_radius; + m_model_object->sla_drain_holes[idx].radius = m_new_hole_radius; } if (ImGui::IsItemDeactivatedAfterEdit()) { // momentarily restore the old value to take snapshot for (size_t idx=0; idxsla_drain_holes[idx].m_radius = m_old_hole_radius; + m_model_object->sla_drain_holes[idx].radius = m_old_hole_radius; float backup = m_new_hole_radius; m_new_hole_radius = m_old_hole_radius; Plater::TakeSnapshot snapshot(wxGetApp().plater(), _(L("Change drainage hole diameter"))); m_new_hole_radius = backup; for (size_t idx=0; idxsla_drain_holes[idx].m_radius = m_new_hole_radius; + m_model_object->sla_drain_holes[idx].radius = m_new_hole_radius; m_old_hole_radius = 0.f; } @@ -863,7 +863,7 @@ void GLGizmoHollow::on_start_dragging() if (m_hover_id != -1) { select_point(NoPoints); select_point(m_hover_id); - m_hole_before_drag = m_model_object->sla_drain_holes[m_hover_id].m_pos; + m_hole_before_drag = m_model_object->sla_drain_holes[m_hover_id].pos; } else m_hole_before_drag = Vec3f::Zero(); @@ -873,14 +873,14 @@ void GLGizmoHollow::on_start_dragging() void GLGizmoHollow::on_stop_dragging() { if (m_hover_id != -1) { - Vec3f backup = m_model_object->sla_drain_holes[m_hover_id].m_pos; + Vec3f backup = m_model_object->sla_drain_holes[m_hover_id].pos; if (m_hole_before_drag != Vec3f::Zero() // some point was touched && backup != m_hole_before_drag) // and it was moved, not just selected { - m_model_object->sla_drain_holes[m_hover_id].m_pos = m_hole_before_drag; + m_model_object->sla_drain_holes[m_hover_id].pos = m_hole_before_drag; Plater::TakeSnapshot snapshot(wxGetApp().plater(), _(L("Move drainage hole"))); - m_model_object->sla_drain_holes[m_hover_id].m_pos = backup; + m_model_object->sla_drain_holes[m_hover_id].pos = backup; } } m_hole_before_drag = Vec3f::Zero(); @@ -921,14 +921,14 @@ void GLGizmoHollow::select_point(int i) m_selection_empty = (i == NoPoints); if (i == AllPoints) - m_new_hole_radius = m_model_object->sla_drain_holes[0].m_radius; + m_new_hole_radius = m_model_object->sla_drain_holes[0].radius; } else { while (size_t(i) >= m_selected.size()) m_selected.push_back(false); m_selected[i] = true; m_selection_empty = false; - m_new_hole_radius = m_model_object->sla_drain_holes[i].m_radius; + m_new_hole_radius = m_model_object->sla_drain_holes[i].radius; } } diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp index a7ad02cd8d..15f46aab63 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp @@ -336,7 +336,7 @@ void GLGizmoSlaSupports::render_points(const Selection& selection, bool picking) for (const sla::DrainHole& drain_hole : m_model_object->sla_drain_holes) { // Inverse matrix of the instance scaling is applied so that the mark does not scale with the object. glsafe(::glPushMatrix()); - glsafe(::glTranslatef(drain_hole.m_pos(0), drain_hole.m_pos(1), drain_hole.m_pos(2))); + glsafe(::glTranslatef(drain_hole.pos(0), drain_hole.pos(1), drain_hole.pos(2))); glsafe(::glMultMatrixd(instance_scaling_matrix_inverse.data())); if (vol->is_left_handed()) @@ -345,17 +345,17 @@ void GLGizmoSlaSupports::render_points(const Selection& selection, bool picking) // Matrices set, we can render the point mark now. Eigen::Quaterniond q; - q.setFromTwoVectors(Vec3d{0., 0., 1.}, instance_scaling_matrix_inverse * (-drain_hole.m_normal).cast()); + q.setFromTwoVectors(Vec3d{0., 0., 1.}, instance_scaling_matrix_inverse * (-drain_hole.normal).cast()); Eigen::AngleAxisd aa(q); glsafe(::glRotated(aa.angle() * (180. / M_PI), aa.axis()(0), aa.axis()(1), aa.axis()(2))); glsafe(::glPushMatrix()); - glsafe(::glTranslated(0., 0., -drain_hole.m_height)); - ::gluCylinder(m_quadric, drain_hole.m_radius, drain_hole.m_radius, drain_hole.m_height, 24, 1); - glsafe(::glTranslated(0., 0., drain_hole.m_height)); - ::gluDisk(m_quadric, 0.0, drain_hole.m_radius, 24, 1); - glsafe(::glTranslated(0., 0., -drain_hole.m_height)); + glsafe(::glTranslated(0., 0., -drain_hole.height)); + ::gluCylinder(m_quadric, drain_hole.radius, drain_hole.radius, drain_hole.height, 24, 1); + glsafe(::glTranslated(0., 0., drain_hole.height)); + ::gluDisk(m_quadric, 0.0, drain_hole.radius, 24, 1); + glsafe(::glTranslated(0., 0., -drain_hole.height)); glsafe(::glRotatef(180.f, 1.f, 0.f, 0.f)); - ::gluDisk(m_quadric, 0.0, drain_hole.m_radius, 24, 1); + ::gluDisk(m_quadric, 0.0, drain_hole.radius, 24, 1); glsafe(::glPopMatrix()); if (vol->is_left_handed()) @@ -421,10 +421,10 @@ bool GLGizmoSlaSupports::is_point_in_hole(const Vec3f& pt) const for (const sla::DrainHole& hole : m_model_object->sla_drain_holes) { - if ( hole.m_normal.dot(pt-hole.m_pos) < EPSILON - || hole.m_normal.dot(pt-(hole.m_pos+hole.m_height * hole.m_normal)) > 0.f) + if ( hole.normal.dot(pt-hole.pos) < EPSILON + || hole.normal.dot(pt-(hole.pos+hole.height * hole.normal)) > 0.f) continue; - if ( squared_distance_from_line(pt, hole.m_pos, hole.m_normal) < pow(hole.m_radius, 2.f)) + if ( squared_distance_from_line(pt, hole.pos, hole.normal) < pow(hole.radius, 2.f)) return true; } diff --git a/src/slic3r/GUI/MeshUtils.hpp b/src/slic3r/GUI/MeshUtils.hpp index a12c8d6c69..5900cb820a 100644 --- a/src/slic3r/GUI/MeshUtils.hpp +++ b/src/slic3r/GUI/MeshUtils.hpp @@ -47,7 +47,7 @@ public: bool operator!=(const ClippingPlane& cp) const { return ! (*this==cp); } double distance(const Vec3d& pt) const { - assert(is_approx(get_normal().norm(), 1.)); + // FIXME: this fails: assert(is_approx(get_normal().norm(), 1.)); return (-get_normal().dot(pt) + m_data[3]); } From 9dd18a8d6d34941887daabf536da26024e769e9b Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Fri, 15 Nov 2019 15:48:52 +0100 Subject: [PATCH 052/336] Started work on extending EigenMesh3D to account for possible drain holes when raycasting --- src/libslic3r/SLA/Common.cpp | 25 ++++- src/libslic3r/SLA/EigenMesh3D.hpp | 9 +- src/libslic3r/SLA/Hollowing.cpp | 96 ++++++++++++++++++++ src/libslic3r/SLA/Hollowing.hpp | 6 ++ src/libslic3r/SLAPrint.cpp | 3 +- src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp | 42 ++++----- 6 files changed, 149 insertions(+), 32 deletions(-) diff --git a/src/libslic3r/SLA/Common.cpp b/src/libslic3r/SLA/Common.cpp index caabdd7554..4b02e361a0 100644 --- a/src/libslic3r/SLA/Common.cpp +++ b/src/libslic3r/SLA/Common.cpp @@ -6,6 +6,7 @@ #include #include #include +#include // Workaround: IGL signed_distance.h will define PI in the igl namespace. @@ -181,6 +182,19 @@ void BoxIndex::foreach(std::function fn) for(auto& el : m_impl->m_store) fn(el); } + +namespace { +// Iterates over hits and holes and returns the true hit, possibly +// on the inside of a hole. Free function so it can return igl::Hit +// without including igl in a header. +igl::Hit filter_hits(const std::vector& hits, + const std::vector& holes) +{ + return igl::Hit(); +} + +} // namespace + /* **************************************************************************** * EigenMesh3D implementation * ****************************************************************************/ @@ -261,11 +275,18 @@ EigenMesh3D &EigenMesh3D::operator=(const EigenMesh3D &other) } EigenMesh3D::hit_result -EigenMesh3D::query_ray_hit(const Vec3d &s, const Vec3d &dir) const +EigenMesh3D::query_ray_hit(const Vec3d &s, + const Vec3d &dir, + const std::vector* holes + ) const { igl::Hit hit; hit.t = std::numeric_limits::infinity(); - m_aabb->intersect_ray(m_V, m_F, s, dir, hit); + + if (! holes) + m_aabb->intersect_ray(m_V, m_F, s, dir, hit); + else + hit = filter_hits(query_ray_hits(s, dir), *holes); hit_result ret(*this); ret.m_t = double(hit.t); diff --git a/src/libslic3r/SLA/EigenMesh3D.hpp b/src/libslic3r/SLA/EigenMesh3D.hpp index d272af3b1e..2144a8f7f6 100644 --- a/src/libslic3r/SLA/EigenMesh3D.hpp +++ b/src/libslic3r/SLA/EigenMesh3D.hpp @@ -10,10 +10,11 @@ class TriangleMesh; namespace sla { struct Contour3D; +struct DrainHole; /// An index-triangle structure for libIGL functions. Also serves as an /// alternative (raw) input format for the SLASupportTree. -// Implemented in SLASupportTreeIGL.cpp +// Implemented in libslic3r/SLA/Common.cpp class EigenMesh3D { class AABBImpl; @@ -83,11 +84,13 @@ public: }; // Casting a ray on the mesh, returns the distance where the hit occures. - hit_result query_ray_hit(const Vec3d &s, const Vec3d &dir) const; + hit_result query_ray_hit(const Vec3d &s, + const Vec3d &dir, + const std::vector* holes = nullptr) const; // Casts a ray on the mesh and returns all hits std::vector query_ray_hits(const Vec3d &s, const Vec3d &dir) const; - + class si_result { double m_value; int m_fidx; diff --git a/src/libslic3r/SLA/Hollowing.cpp b/src/libslic3r/SLA/Hollowing.cpp index 2a496d2765..c336f49b3c 100644 --- a/src/libslic3r/SLA/Hollowing.cpp +++ b/src/libslic3r/SLA/Hollowing.cpp @@ -126,4 +126,100 @@ bool DrainHole::operator==(const DrainHole &sp) const is_approx(height, sp.height); } +bool DrainHole::is_inside(const Vec3f& pt) const +{ + Eigen::Hyperplane plane(normal, pos); + float dist = plane.signedDistance(pt); + if (dist < EPSILON || dist > height) + return false; + + Eigen::ParametrizedLine axis(pos, normal); + if ( axis.squaredDistance(pt) < pow(radius, 2.f)) + return true; + + return false; +} + + +// Given a line s+dir*t, return parameter t of intersections with the hole. +// If there is no intersection, returns nan. +std::pair DrainHole::get_intersections(const Vec3f& s, + const Vec3f& dir) const +{ + assert(is_approx(normal.norm(), 1.f)); + const Eigen::ParametrizedLine ray(s, dir.normalized()); + + std::pair out(std::nan(""), std::nan("")); + const float sqr_radius = pow(radius, 2.f); + + // first check a bounding sphere of the hole: + Vec3f center = pos+normal*height/2.f; + float sqr_dist_limit = pow(height/2.f, 2.f) + sqr_radius ; + if (ray.squaredDistance(center) > sqr_dist_limit) + return out; + + // The line intersects the bounding sphere, look for intersections with + // bases of the cylinder. + + size_t found = 0; // counts how many intersections were found + Eigen::Hyperplane base; + if (! is_approx(ray.direction().dot(normal), 0.f)) { + for (size_t i=1; i<=1; --i) { + Vec3f cylinder_center = pos+i*height*normal; + base = Eigen::Hyperplane(normal, cylinder_center); + Vec3f intersection = ray.intersectionPoint(base); + // Only accept the point if it is inside the cylinder base. + if ((cylinder_center-intersection).squaredNorm() < sqr_radius) { + (found ? out.second : out.first) = ray.intersectionParameter(base); + ++found; + } + } + } + else + { + // In case the line was perpendicular to the cylinder axis, previous + // block was skipped, but base will later be assumed to be valid. + base = Eigen::Hyperplane(normal, pos); + } + + // In case there is still an intersection to be found, check the wall + if (found != 2 && ! is_approx(std::abs(ray.direction().dot(normal)), 1.f)) { + // Project the ray onto the base plane + Vec3f proj_origin = base.projection(ray.origin()); + Vec3f proj_dir = base.projection(ray.origin()+ray.direction())-proj_origin; + // save how the parameter scales and normalize the projected direction + float par_scale = proj_dir.norm(); + proj_dir = proj_dir/par_scale; + Eigen::ParametrizedLine projected_ray(proj_origin, proj_dir); + // Calculate point on the secant that's closest to the center + // and its distance to the circle along the projected line + Vec3f closest = projected_ray.projection(pos); + float dist = sqrt((sqr_radius - (closest-pos).squaredNorm())); + // Unproject both intersections on the original line and check + // they are on the cylinder and not past it: + for (int i=-1; i<=1 && found !=2; i+=2) { + Vec3f isect = closest + i*dist * projected_ray.direction(); + float par = (isect-proj_origin).norm() / par_scale; + isect = ray.pointAt(par); + // check that the intersection is between the base planes: + float vert_dist = base.signedDistance(isect); + if (vert_dist > 0.f && vert_dist < height) { + (found ? out.second : out.first) = par; + ++found; + } + } + } + + // If only one intersection was found, it is some corner case, + // no intersection will be returned: + if (found != 0) + return std::pair(std::nan(""), std::nan("")); + + // Sort the intersections: + if (out.first > out.second) + std::swap(out.first, out.second); + + return out; +} + }} // namespace Slic3r::sla diff --git a/src/libslic3r/SLA/Hollowing.hpp b/src/libslic3r/SLA/Hollowing.hpp index 543f5e6cf4..f2f6c468ae 100644 --- a/src/libslic3r/SLA/Hollowing.hpp +++ b/src/libslic3r/SLA/Hollowing.hpp @@ -36,6 +36,12 @@ struct DrainHole bool operator==(const DrainHole &sp) const; bool operator!=(const DrainHole &sp) const { return !(sp == (*this)); } + + bool is_inside(const Vec3f& pt) const; + + std::pair get_intersections(const Vec3f& s, + const Vec3f& dir + ) const; template inline void serialize(Archive &ar) { diff --git a/src/libslic3r/SLAPrint.cpp b/src/libslic3r/SLAPrint.cpp index 61723721e4..b1d1cf5ea2 100644 --- a/src/libslic3r/SLAPrint.cpp +++ b/src/libslic3r/SLAPrint.cpp @@ -415,7 +415,8 @@ SLAPrint::ApplyStatus SLAPrint::apply(const Model &model, DynamicPrintConfig con } model_object.sla_points_status = model_object_new.sla_points_status; - if (model_object.sla_drain_holes.size() != model_object_new.sla_drain_holes.size()) + // Invalidate hollowing if drain holes have changed + if (model_object.sla_drain_holes != model_object_new.sla_drain_holes) { model_object.sla_drain_holes = model_object_new.sla_drain_holes; update_apply_status(it_print_object_status->print_object->invalidate_step(slaposHollowing)); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp index 15f46aab63..29eb72fc52 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp @@ -412,25 +412,6 @@ void GLGizmoSlaSupports::update_mesh() } -bool GLGizmoSlaSupports::is_point_in_hole(const Vec3f& pt) const -{ - auto squared_distance_from_line = [](const Vec3f pt, const Vec3f& line_pt, const Vec3f& dir) -> float { - Vec3f diff = line_pt - pt; - return (diff - diff.dot(dir) * dir).squaredNorm(); - }; - - - for (const sla::DrainHole& hole : m_model_object->sla_drain_holes) { - if ( hole.normal.dot(pt-hole.pos) < EPSILON - || hole.normal.dot(pt-(hole.pos+hole.height * hole.normal)) > 0.f) - continue; - if ( squared_distance_from_line(pt, hole.pos, hole.normal) < pow(hole.radius, 2.f)) - return true; - } - - return false; -} - // Unprojects the mouse position on the mesh and saves hit point and normal of the facet into pos_and_normal // Return false if no intersection was found, true otherwise. bool GLGizmoSlaSupports::unproject_on_mesh(const Vec2d& mouse_pos, std::pair& pos_and_normal) @@ -448,14 +429,23 @@ bool GLGizmoSlaSupports::unproject_on_mesh(const Vec2d& mouse_pos, std::pairunproject_on_mesh(mouse_pos, trafo.get_matrix(), camera, hit, normal, m_clipping_plane.get()) - && ! is_point_in_hole(hit)) { - // Return both the point and the facet normal. - pos_and_normal = std::make_pair(hit, normal); - return true; + if (m_mesh_raycaster->unproject_on_mesh(mouse_pos, trafo.get_matrix(), camera, hit, normal, m_clipping_plane.get())) { + // Check whether the hit is in a hole + bool in_hole = false; + for (const sla::DrainHole& hole : m_model_object->sla_drain_holes) { + if (hole.is_inside(hit)) { + in_hole = true; + break; + } + } + if (! in_hole) { + // Return both the point and the facet normal. + pos_and_normal = std::make_pair(hit, normal); + return true; + } } - else - return false; + + return false; } // Following function is called from GLCanvas3D to inform the gizmo about a mouse/keyboard event. From 2c1d256b0ce7003995700687b6e4d4cc1e9d2dbc Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Tue, 19 Nov 2019 14:27:05 +0100 Subject: [PATCH 053/336] EigenMesh3D raycaster should now be able to pick a correct intersection on the object or inside a hole --- src/libslic3r/SLA/Common.cpp | 122 ++++++++++++++++---- src/libslic3r/SLA/EigenMesh3D.hpp | 40 ++++--- src/libslic3r/SLA/Hollowing.cpp | 33 +++--- src/libslic3r/SLA/Hollowing.hpp | 5 +- src/libslic3r/SLA/SupportPointGenerator.cpp | 4 +- 5 files changed, 147 insertions(+), 57 deletions(-) diff --git a/src/libslic3r/SLA/Common.cpp b/src/libslic3r/SLA/Common.cpp index 4b02e361a0..c54d78afa2 100644 --- a/src/libslic3r/SLA/Common.cpp +++ b/src/libslic3r/SLA/Common.cpp @@ -183,18 +183,6 @@ void BoxIndex::foreach(std::function fn) } -namespace { -// Iterates over hits and holes and returns the true hit, possibly -// on the inside of a hole. Free function so it can return igl::Hit -// without including igl in a header. -igl::Hit filter_hits(const std::vector& hits, - const std::vector& holes) -{ - return igl::Hit(); -} - -} // namespace - /* **************************************************************************** * EigenMesh3D implementation * ****************************************************************************/ @@ -280,21 +268,26 @@ EigenMesh3D::query_ray_hit(const Vec3d &s, const std::vector* holes ) const { + assert(is_approx(dir.norm(), 1.)); igl::Hit hit; hit.t = std::numeric_limits::infinity(); - if (! holes) + if (! holes) { m_aabb->intersect_ray(m_V, m_F, s, dir, hit); - else - hit = filter_hits(query_ray_hits(s, dir), *holes); - - hit_result ret(*this); - ret.m_t = double(hit.t); - ret.m_dir = dir; - ret.m_source = s; - if(!std::isinf(hit.t) && !std::isnan(hit.t)) ret.m_face_id = hit.id; - - return ret; + hit_result ret(*this); + ret.m_t = double(hit.t); + ret.m_dir = dir; + ret.m_source = s; + if(!std::isinf(hit.t) && !std::isnan(hit.t)) + ret.m_normal = this->normal_by_face_id(hit.id); + + return ret; + } + else { + // If there are holes, the hit_results will be made by + // query_ray_hits (object) and filter_hits (holes): + return filter_hits(query_ray_hits(s, dir), *holes); + } } std::vector @@ -316,12 +309,91 @@ EigenMesh3D::query_ray_hits(const Vec3d &s, const Vec3d &dir) const outs.back().m_dir = dir; outs.back().m_source = s; if(!std::isinf(hit.t) && !std::isnan(hit.t)) - outs.back().m_face_id = hit.id; + outs.back().m_normal = this->normal_by_face_id(hit.id); } - + return outs; } +EigenMesh3D::hit_result EigenMesh3D::filter_hits( + const std::vector& object_hits, + const std::vector& holes) const +{ + hit_result out(*this); + out.m_t = std::nan(""); + + if (! holes.empty() && ! object_hits.empty()) { + Vec3d s = object_hits.front().source(); + Vec3d dir = object_hits.front().direction(); + + struct HoleHit { + HoleHit(float t_p, const Vec3d& normal_p, bool entry_p) : + t(t_p), normal(normal_p), entry(entry_p) {} + float t; + Vec3d normal; + bool entry; + }; + std::vector hole_isects; + + // Collect hits on all holes, preserve information about entry/exit + for (const sla::DrainHole& hole : holes) { + std::array, 2> isects; + if (hole.get_intersections(s.cast(), + dir.cast(), isects)) { + hole_isects.emplace_back(isects[0].first, isects[0].second, true); + hole_isects.emplace_back(isects[1].first, isects[1].second, false); + } + } + // Holes can intersect each other, sort the hits by t + std::sort(hole_isects.begin(), hole_isects.end(), + [](const HoleHit& a, const HoleHit& b) { return a.t < b.t; }); + + // Now inspect the intersections with object and holes, keep track how + // deep are we nested in mesh/holes and pick the correct intersection + int hole_nested = 0; + int object_nested = 0; + + bool is_hole = false; + bool is_entry = false; + const HoleHit* next_hole_hit = &hole_isects.front(); + const hit_result* next_mesh_hit = &object_hits.front(); + + while (next_hole_hit || next_mesh_hit) { + if (next_hole_hit && next_mesh_hit) // still have hole and obj hits + is_hole = (next_hole_hit->t < next_mesh_hit->m_t); + else + is_hole = next_hole_hit; // one or the other ran out + + // Is this entry or exit hit? + is_entry = is_hole ? next_hole_hit->entry : ! next_mesh_hit->is_inside(); + + if (! is_hole && is_entry && hole_nested == 0) { + // This mesh point is the one we seek + return *next_mesh_hit; + } + if (is_hole && ! is_entry && object_nested != 0) { + // This holehit is the one we seek + out.m_t = next_hole_hit->t; + out.m_normal = next_hole_hit->normal; + out.m_source = s; + out.m_dir = dir; + return out; + } + + hole_nested += (is_hole ? (is_entry ? 1 : -1) : 0); + object_nested += (! is_hole ? (is_entry ? 1 : -1) : 0); + + // Advance the pointer + if (is_hole && next_hole_hit++ == &hole_isects.back()) + next_hole_hit = nullptr; + if (! is_hole && next_mesh_hit++ == &object_hits.back()) + next_mesh_hit = nullptr; + } + } + + return out; +} + #ifdef SLIC3R_SLA_NEEDS_WINDTREE EigenMesh3D::si_result EigenMesh3D::signed_distance(const Vec3d &p) const { double sign = 0; double sqdst = 0; int i = 0; Vec3d c; diff --git a/src/libslic3r/SLA/EigenMesh3D.hpp b/src/libslic3r/SLA/EigenMesh3D.hpp index 2144a8f7f6..c92094756f 100644 --- a/src/libslic3r/SLA/EigenMesh3D.hpp +++ b/src/libslic3r/SLA/EigenMesh3D.hpp @@ -42,10 +42,10 @@ public: // Result of a raycast class hit_result { double m_t = std::nan(""); - int m_face_id = -1; const EigenMesh3D *m_mesh = nullptr; Vec3d m_dir; Vec3d m_source; + Vec3d m_normal = Vec3d::Zero(); friend class EigenMesh3D; // A valid object of this class can only be obtained from @@ -60,26 +60,23 @@ public: inline double distance() const { return m_t; } inline const Vec3d& direction() const { return m_dir; } + inline const Vec3d& source() const { return m_source; } inline Vec3d position() const { return m_source + m_dir * m_t; } - inline int face() const { return m_face_id; } inline bool is_valid() const { return m_mesh != nullptr; } + inline bool is_hit() const { return m_normal != Vec3d::Zero(); } // Hit_result can decay into a double as the hit distance. inline operator double() const { return distance(); } - - inline Vec3d normal() const { - if(m_face_id < 0 || !is_valid()) return {}; - auto trindex = m_mesh->m_F.row(m_face_id); - const Vec3d& p1 = m_mesh->V().row(trindex(0)); - const Vec3d& p2 = m_mesh->V().row(trindex(1)); - const Vec3d& p3 = m_mesh->V().row(trindex(2)); - Eigen::Vector3d U = p2 - p1; - Eigen::Vector3d V = p3 - p1; - return U.cross(V).normalized(); + + inline const Vec3d& normal() const { + if(!is_valid()) + throw std::runtime_error("EigenMesh3D::hit_result::normal() " + "called on invalid object."); + return m_normal; } - inline bool is_inside() { - return m_face_id >= 0 && normal().dot(m_dir) > 0; + inline bool is_inside() const { + return normal().dot(m_dir) > 0; } }; @@ -91,6 +88,11 @@ public: // Casts a ray on the mesh and returns all hits std::vector query_ray_hits(const Vec3d &s, const Vec3d &dir) const; + // Iterates over hits and holes and returns the true hit, possibly + // on the inside of a hole. + hit_result filter_hits(const std::vector& obj_hits, + const std::vector& holes) const; + class si_result { double m_value; int m_fidx; @@ -123,6 +125,16 @@ public: Vec3d c; return squared_distance(p, i, c); } + + Vec3d normal_by_face_id(int face_id) const { + auto trindex = F().row(face_id); + const Vec3d& p1 = V().row(trindex(0)); + const Vec3d& p2 = V().row(trindex(1)); + const Vec3d& p3 = V().row(trindex(2)); + Eigen::Vector3d U = p2 - p1; + Eigen::Vector3d V = p3 - p1; + return U.cross(V).normalized(); + } }; // Calculate the normals for the selected points (from 'points' set) on the diff --git a/src/libslic3r/SLA/Hollowing.cpp b/src/libslic3r/SLA/Hollowing.cpp index c336f49b3c..a510ab3da0 100644 --- a/src/libslic3r/SLA/Hollowing.cpp +++ b/src/libslic3r/SLA/Hollowing.cpp @@ -141,22 +141,26 @@ bool DrainHole::is_inside(const Vec3f& pt) const } -// Given a line s+dir*t, return parameter t of intersections with the hole. -// If there is no intersection, returns nan. -std::pair DrainHole::get_intersections(const Vec3f& s, - const Vec3f& dir) const +// Given a line s+dir*t, find parameter t of intersections with the hole +// and the normal (points inside the hole). Outputs through out reference, +// returns true if two intersections were found. +bool DrainHole::get_intersections(const Vec3f& s, const Vec3f& dir, + std::array, 2>& out) + const { assert(is_approx(normal.norm(), 1.f)); const Eigen::ParametrizedLine ray(s, dir.normalized()); - std::pair out(std::nan(""), std::nan("")); + for (size_t i=0; i<2; ++i) + out[i] = std::make_pair(std::nan(""), Vec3d::Zero()); + const float sqr_radius = pow(radius, 2.f); // first check a bounding sphere of the hole: Vec3f center = pos+normal*height/2.f; float sqr_dist_limit = pow(height/2.f, 2.f) + sqr_radius ; if (ray.squaredDistance(center) > sqr_dist_limit) - return out; + return false; // The line intersects the bounding sphere, look for intersections with // bases of the cylinder. @@ -170,7 +174,8 @@ std::pair DrainHole::get_intersections(const Vec3f& s, Vec3f intersection = ray.intersectionPoint(base); // Only accept the point if it is inside the cylinder base. if ((cylinder_center-intersection).squaredNorm() < sqr_radius) { - (found ? out.second : out.first) = ray.intersectionParameter(base); + out[found].first = ray.intersectionParameter(base); + out[found].second = (i==0 ? 1. : -1.) * normal.cast(); ++found; } } @@ -200,11 +205,13 @@ std::pair DrainHole::get_intersections(const Vec3f& s, for (int i=-1; i<=1 && found !=2; i+=2) { Vec3f isect = closest + i*dist * projected_ray.direction(); float par = (isect-proj_origin).norm() / par_scale; + Vec3d hit_normal = (pos-isect).normalized().cast(); isect = ray.pointAt(par); // check that the intersection is between the base planes: float vert_dist = base.signedDistance(isect); if (vert_dist > 0.f && vert_dist < height) { - (found ? out.second : out.first) = par; + out[found].first = par; + out[found].second = hit_normal; ++found; } } @@ -212,14 +219,14 @@ std::pair DrainHole::get_intersections(const Vec3f& s, // If only one intersection was found, it is some corner case, // no intersection will be returned: - if (found != 0) - return std::pair(std::nan(""), std::nan("")); + if (found != 2) + return false; // Sort the intersections: - if (out.first > out.second) - std::swap(out.first, out.second); + if (out[0].first > out[1].first) + std::swap(out[0], out[1]); - return out; + return true; } }} // namespace Slic3r::sla diff --git a/src/libslic3r/SLA/Hollowing.hpp b/src/libslic3r/SLA/Hollowing.hpp index f2f6c468ae..d5c0d49fc8 100644 --- a/src/libslic3r/SLA/Hollowing.hpp +++ b/src/libslic3r/SLA/Hollowing.hpp @@ -39,9 +39,8 @@ struct DrainHole bool is_inside(const Vec3f& pt) const; - std::pair get_intersections(const Vec3f& s, - const Vec3f& dir - ) const; + bool get_intersections(const Vec3f& s, const Vec3f& dir, + std::array, 2>& out) const; template inline void serialize(Archive &ar) { diff --git a/src/libslic3r/SLA/SupportPointGenerator.cpp b/src/libslic3r/SLA/SupportPointGenerator.cpp index 446dd3f403..36361f9ca7 100644 --- a/src/libslic3r/SLA/SupportPointGenerator.cpp +++ b/src/libslic3r/SLA/SupportPointGenerator.cpp @@ -83,8 +83,8 @@ void SupportPointGenerator::project_onto_mesh(std::vector& po sla::EigenMesh3D::hit_result hit_up = m_emesh.query_ray_hit(p.cast(), Vec3d(0., 0., 1.)); sla::EigenMesh3D::hit_result hit_down = m_emesh.query_ray_hit(p.cast(), Vec3d(0., 0., -1.)); - bool up = hit_up.face() != -1; - bool down = hit_down.face() != -1; + bool up = hit_up.is_hit(); + bool down = hit_down.is_hit(); if (!up && !down) continue; From bc0db7dc91f207d9704b0dec31ca062a719ac62d Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Fri, 22 Nov 2019 15:45:48 +0100 Subject: [PATCH 054/336] Quickly added a hole height setting --- src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp index b320c6bbe7..9c0e2c4d90 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp @@ -709,6 +709,9 @@ RENDER_AGAIN: m_imgui->text("Hole height: "); ImGui::SameLine(); ImGui::SliderFloat(" ", &m_new_hole_height, 0.1f, 10.f, "%.1f"); + for (size_t idx=0; idxsla_drain_holes[idx].height = m_new_hole_height; m_imgui->disabled_begin(m_selection_empty); remove_selected = m_imgui->button(m_desc.at("remove_selected")); @@ -894,6 +897,7 @@ void GLGizmoHollow::on_load(cereal::BinaryInputArchive& ar) *m_clipping_plane, m_model_object_id, m_new_hole_radius, + m_new_hole_height, m_selected, m_selection_empty ); @@ -907,6 +911,7 @@ void GLGizmoHollow::on_save(cereal::BinaryOutputArchive& ar) const *m_clipping_plane, m_model_object_id, m_new_hole_radius, + m_new_hole_height, m_selected, m_selection_empty ); @@ -920,8 +925,10 @@ void GLGizmoHollow::select_point(int i) m_selected.assign(m_selected.size(), i == AllPoints); m_selection_empty = (i == NoPoints); - if (i == AllPoints) + if (i == AllPoints) { m_new_hole_radius = m_model_object->sla_drain_holes[0].radius; + m_new_hole_height = m_model_object->sla_drain_holes[0].height; + } } else { while (size_t(i) >= m_selected.size()) @@ -929,6 +936,7 @@ void GLGizmoHollow::select_point(int i) m_selected[i] = true; m_selection_empty = false; m_new_hole_radius = m_model_object->sla_drain_holes[i].radius; + m_new_hole_height = m_model_object->sla_drain_holes[i].height; } } From 281762db45bda41ca5449ad36957c2dc7b5d6d2d Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Tue, 26 Nov 2019 14:18:56 +0100 Subject: [PATCH 055/336] Add hollowed interiors to the support data --- src/libslic3r/SLAPrintSteps.cpp | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/libslic3r/SLAPrintSteps.cpp b/src/libslic3r/SLAPrintSteps.cpp index 55359cc5c1..0eb83d3c15 100644 --- a/src/libslic3r/SLAPrintSteps.cpp +++ b/src/libslic3r/SLAPrintSteps.cpp @@ -237,9 +237,19 @@ void SLAPrint::Steps::support_points(SLAPrintObject &po) // If supports are disabled, we can skip the model scan. if(!po.m_config.supports_enable.getBool()) return; + bool is_hollowing = po.m_config.hollowing_enable.getBool() && po.m_hollowing_data; + + TriangleMesh hollowed_mesh; + if (is_hollowing) { + hollowed_mesh = po.transformed_mesh(); + hollowed_mesh.merge(po.m_hollowing_data->interior); + hollowed_mesh.require_shared_vertices(); + } + + const TriangleMesh &mesh = is_hollowing ? hollowed_mesh : po.transformed_mesh(); + if (!po.m_supportdata) - po.m_supportdata.reset( - new SLAPrintObject::SupportData(po.transformed_mesh())); + po.m_supportdata.reset(new SLAPrintObject::SupportData(mesh)); const ModelObject& mo = *po.m_model_object; From 73af7c64b8028a11d0123a95e236af014dc28008 Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Tue, 26 Nov 2019 11:36:09 +0100 Subject: [PATCH 056/336] SLATreeSupports generator now takes account for holes and can build supports through them --- src/libslic3r/SLA/Common.cpp | 113 +++++++++++--------- src/libslic3r/SLA/EigenMesh3D.hpp | 44 ++++---- src/libslic3r/SLA/Hollowing.cpp | 10 +- src/libslic3r/SLA/SupportPointGenerator.cpp | 7 -- src/libslic3r/SLA/SupportTreeBuildsteps.cpp | 2 +- src/libslic3r/SLAPrintSteps.cpp | 6 ++ 6 files changed, 103 insertions(+), 79 deletions(-) diff --git a/src/libslic3r/SLA/Common.cpp b/src/libslic3r/SLA/Common.cpp index c54d78afa2..3710bf3bed 100644 --- a/src/libslic3r/SLA/Common.cpp +++ b/src/libslic3r/SLA/Common.cpp @@ -263,16 +263,13 @@ EigenMesh3D &EigenMesh3D::operator=(const EigenMesh3D &other) } EigenMesh3D::hit_result -EigenMesh3D::query_ray_hit(const Vec3d &s, - const Vec3d &dir, - const std::vector* holes - ) const +EigenMesh3D::query_ray_hit(const Vec3d &s, const Vec3d &dir) const { assert(is_approx(dir.norm(), 1.)); igl::Hit hit; hit.t = std::numeric_limits::infinity(); - if (! holes) { + if (m_holes.empty()) { m_aabb->intersect_ray(m_V, m_F, s, dir, hit); hit_result ret(*this); ret.m_t = double(hit.t); @@ -286,7 +283,7 @@ EigenMesh3D::query_ray_hit(const Vec3d &s, else { // If there are holes, the hit_results will be made by // query_ray_hits (object) and filter_hits (holes): - return filter_hits(query_ray_hits(s, dir), *holes); + return filter_hits(query_ray_hits(s, dir)); } } @@ -316,46 +313,59 @@ EigenMesh3D::query_ray_hits(const Vec3d &s, const Vec3d &dir) const } EigenMesh3D::hit_result EigenMesh3D::filter_hits( - const std::vector& object_hits, - const std::vector& holes) const + const std::vector& object_hits) const { + assert(! m_holes.empty()); hit_result out(*this); - out.m_t = std::nan(""); - if (! holes.empty() && ! object_hits.empty()) { - Vec3d s = object_hits.front().source(); - Vec3d dir = object_hits.front().direction(); + if (object_hits.empty()) + return out; - struct HoleHit { - HoleHit(float t_p, const Vec3d& normal_p, bool entry_p) : - t(t_p), normal(normal_p), entry(entry_p) {} - float t; - Vec3d normal; - bool entry; - }; - std::vector hole_isects; + const Vec3d& s = object_hits.front().source(); + const Vec3d& dir = object_hits.front().direction(); - // Collect hits on all holes, preserve information about entry/exit - for (const sla::DrainHole& hole : holes) { - std::array, 2> isects; - if (hole.get_intersections(s.cast(), - dir.cast(), isects)) { - hole_isects.emplace_back(isects[0].first, isects[0].second, true); - hole_isects.emplace_back(isects[1].first, isects[1].second, false); - } + // A helper struct to save an intersetion with a hole + struct HoleHit { + HoleHit(float t_p, const Vec3d& normal_p, bool entry_p) : + t(t_p), normal(normal_p), entry(entry_p) {} + float t; + Vec3d normal; + bool entry; + }; + std::vector hole_isects; + + // Collect hits on all holes, preserve information about entry/exit + for (const sla::DrainHole& hole : m_holes) { + std::array, 2> isects; + if (hole.get_intersections(s.cast(), + dir.cast(), isects)) { + hole_isects.emplace_back(isects[0].first, isects[0].second, true); + hole_isects.emplace_back(isects[1].first, isects[1].second, false); } - // Holes can intersect each other, sort the hits by t - std::sort(hole_isects.begin(), hole_isects.end(), - [](const HoleHit& a, const HoleHit& b) { return a.t < b.t; }); + } + // Remove hole hits behind the source + for (int i=0; i=0; --dry_run) { + hole_nested = -hole_nested; + object_nested = -object_nested; bool is_hole = false; bool is_entry = false; - const HoleHit* next_hole_hit = &hole_isects.front(); + const HoleHit* next_hole_hit = hole_isects.empty() ? nullptr : &hole_isects.front(); const hit_result* next_mesh_hit = &object_hits.front(); while (next_hole_hit || next_mesh_hit) { @@ -367,23 +377,25 @@ EigenMesh3D::hit_result EigenMesh3D::filter_hits( // Is this entry or exit hit? is_entry = is_hole ? next_hole_hit->entry : ! next_mesh_hit->is_inside(); - if (! is_hole && is_entry && hole_nested == 0) { - // This mesh point is the one we seek - return *next_mesh_hit; - } - if (is_hole && ! is_entry && object_nested != 0) { - // This holehit is the one we seek - out.m_t = next_hole_hit->t; - out.m_normal = next_hole_hit->normal; - out.m_source = s; - out.m_dir = dir; - return out; + if (! dry_run) { + if (! is_hole && hole_nested == 0) { + // This is a valid object hit + return *next_mesh_hit; + } + if (is_hole && ! is_entry && object_nested != 0) { + // This holehit is the one we seek + out.m_t = next_hole_hit->t; + out.m_normal = next_hole_hit->normal; + out.m_source = s; + out.m_dir = dir; + return out; + } } - hole_nested += (is_hole ? (is_entry ? 1 : -1) : 0); - object_nested += (! is_hole ? (is_entry ? 1 : -1) : 0); + // Increase/decrease the counter + (is_hole ? hole_nested : object_nested) += (is_entry ? 1 : -1); - // Advance the pointer + // Advance the respective pointer if (is_hole && next_hole_hit++ == &hole_isects.back()) next_hole_hit = nullptr; if (! is_hole && next_mesh_hit++ == &object_hits.back()) @@ -391,6 +403,7 @@ EigenMesh3D::hit_result EigenMesh3D::filter_hits( } } + // if we got here, the ray ended up in infinity return out; } diff --git a/src/libslic3r/SLA/EigenMesh3D.hpp b/src/libslic3r/SLA/EigenMesh3D.hpp index c92094756f..15176f0cbb 100644 --- a/src/libslic3r/SLA/EigenMesh3D.hpp +++ b/src/libslic3r/SLA/EigenMesh3D.hpp @@ -2,6 +2,7 @@ #define SLA_EIGENMESH3D_H #include +#include "libslic3r/SLA/Hollowing.hpp" namespace Slic3r { @@ -10,7 +11,6 @@ class TriangleMesh; namespace sla { struct Contour3D; -struct DrainHole; /// An index-triangle structure for libIGL functions. Also serves as an /// alternative (raw) input format for the SLASupportTree. @@ -23,6 +23,11 @@ class EigenMesh3D { double m_ground_level = 0, m_gnd_offset = 0; std::unique_ptr m_aabb; + + // This holds a copy of holes in the mesh. Initialized externally + // by load_mesh setter. + std::vector m_holes; + public: EigenMesh3D(const TriangleMesh&); @@ -41,57 +46,58 @@ public: // Result of a raycast class hit_result { - double m_t = std::nan(""); + // m_t holds a distance from m_source to the intersection. + double m_t = infty(); const EigenMesh3D *m_mesh = nullptr; Vec3d m_dir; Vec3d m_source; - Vec3d m_normal = Vec3d::Zero(); + Vec3d m_normal; friend class EigenMesh3D; // A valid object of this class can only be obtained from // EigenMesh3D::query_ray_hit method. explicit inline hit_result(const EigenMesh3D& em): m_mesh(&em) {} public: + // This denotes no hit on the mesh. + static inline constexpr double infty() { return std::numeric_limits::infinity(); } - // This can create a placeholder object which is invalid (not created - // by a query_ray_hit call) but the distance can be preset to - // a specific value for distinguishing the placeholder. - inline hit_result(double val = std::nan("")): m_t(val) {} + explicit inline hit_result(double val = infty()) : m_t(val) {} inline double distance() const { return m_t; } inline const Vec3d& direction() const { return m_dir; } inline const Vec3d& source() const { return m_source; } inline Vec3d position() const { return m_source + m_dir * m_t; } inline bool is_valid() const { return m_mesh != nullptr; } - inline bool is_hit() const { return m_normal != Vec3d::Zero(); } - + inline bool is_hit() const { return m_t != infty(); } + // Hit_result can decay into a double as the hit distance. inline operator double() const { return distance(); } inline const Vec3d& normal() const { - if(!is_valid()) - throw std::runtime_error("EigenMesh3D::hit_result::normal() " - "called on invalid object."); + assert(is_valid()); return m_normal; } - + inline bool is_inside() const { - return normal().dot(m_dir) > 0; + return is_hit() && normal().dot(m_dir) > 0; } }; + // Inform the object about location of holes + // creates internal copy of the vector + void load_holes(const std::vector& holes) { + m_holes = holes; + } + // Casting a ray on the mesh, returns the distance where the hit occures. - hit_result query_ray_hit(const Vec3d &s, - const Vec3d &dir, - const std::vector* holes = nullptr) const; + hit_result query_ray_hit(const Vec3d &s, const Vec3d &dir) const; // Casts a ray on the mesh and returns all hits std::vector query_ray_hits(const Vec3d &s, const Vec3d &dir) const; // Iterates over hits and holes and returns the true hit, possibly // on the inside of a hole. - hit_result filter_hits(const std::vector& obj_hits, - const std::vector& holes) const; + hit_result filter_hits(const std::vector& obj_hits) const; class si_result { double m_value; diff --git a/src/libslic3r/SLA/Hollowing.cpp b/src/libslic3r/SLA/Hollowing.cpp index a510ab3da0..46e60f91cb 100644 --- a/src/libslic3r/SLA/Hollowing.cpp +++ b/src/libslic3r/SLA/Hollowing.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include @@ -152,7 +153,7 @@ bool DrainHole::get_intersections(const Vec3f& s, const Vec3f& dir, const Eigen::ParametrizedLine ray(s, dir.normalized()); for (size_t i=0; i<2; ++i) - out[i] = std::make_pair(std::nan(""), Vec3d::Zero()); + out[i] = std::make_pair(sla::EigenMesh3D::hit_result::infty(), Vec3d::Zero()); const float sqr_radius = pow(radius, 2.f); @@ -170,6 +171,11 @@ bool DrainHole::get_intersections(const Vec3f& s, const Vec3f& dir, if (! is_approx(ray.direction().dot(normal), 0.f)) { for (size_t i=1; i<=1; --i) { Vec3f cylinder_center = pos+i*height*normal; + if (i == 0) { + // The hole base can be identical to mesh surface if it is flat + // let's better move the base outward a bit + cylinder_center -= EPSILON*normal; + } base = Eigen::Hyperplane(normal, cylinder_center); Vec3f intersection = ray.intersectionPoint(base); // Only accept the point if it is inside the cylinder base. @@ -184,7 +190,7 @@ bool DrainHole::get_intersections(const Vec3f& s, const Vec3f& dir, { // In case the line was perpendicular to the cylinder axis, previous // block was skipped, but base will later be assumed to be valid. - base = Eigen::Hyperplane(normal, pos); + base = Eigen::Hyperplane(normal, pos-EPSILON*normal); } // In case there is still an intersection to be found, check the wall diff --git a/src/libslic3r/SLA/SupportPointGenerator.cpp b/src/libslic3r/SLA/SupportPointGenerator.cpp index 36361f9ca7..66b6ea3f41 100644 --- a/src/libslic3r/SLA/SupportPointGenerator.cpp +++ b/src/libslic3r/SLA/SupportPointGenerator.cpp @@ -77,9 +77,6 @@ void SupportPointGenerator::project_onto_mesh(std::vector& po m_throw_on_cancel(); Vec3f& p = points[point_id].pos; // Project the point upward and downward and choose the closer intersection with the mesh. - //bool up = igl::ray_mesh_intersect(p.cast(), Vec3f(0., 0., 1.), m_V, m_F, hit_up); - //bool down = igl::ray_mesh_intersect(p.cast(), Vec3f(0., 0., -1.), m_V, m_F, hit_down); - sla::EigenMesh3D::hit_result hit_up = m_emesh.query_ray_hit(p.cast(), Vec3d(0., 0., 1.)); sla::EigenMesh3D::hit_result hit_down = m_emesh.query_ray_hit(p.cast(), Vec3d(0., 0., -1.)); @@ -90,10 +87,6 @@ void SupportPointGenerator::project_onto_mesh(std::vector& po continue; sla::EigenMesh3D::hit_result& hit = (!down || (hit_up.distance() < hit_down.distance())) ? hit_up : hit_down; - //int fid = hit.face(); - //Vec3f bc(1-hit.u-hit.v, hit.u, hit.v); - //p = (bc(0) * m_V.row(m_F(fid, 0)) + bc(1) * m_V.row(m_F(fid, 1)) + bc(2)*m_V.row(m_F(fid, 2))).cast(); - p = p + (hit.distance() * hit.direction()).cast(); } }); diff --git a/src/libslic3r/SLA/SupportTreeBuildsteps.cpp b/src/libslic3r/SLA/SupportTreeBuildsteps.cpp index 46a6160c1b..68afb73919 100644 --- a/src/libslic3r/SLA/SupportTreeBuildsteps.cpp +++ b/src/libslic3r/SLA/SupportTreeBuildsteps.cpp @@ -778,7 +778,7 @@ void SupportTreeBuildsteps::filter() nn = Vec3d(std::cos(azimuth) * std::sin(polar), std::sin(azimuth) * std::sin(polar), std::cos(polar)).normalized(); - t = oresult.score; + t = EigenMesh3D::hit_result(oresult.score); } } diff --git a/src/libslic3r/SLAPrintSteps.cpp b/src/libslic3r/SLAPrintSteps.cpp index 55359cc5c1..3135c33dde 100644 --- a/src/libslic3r/SLAPrintSteps.cpp +++ b/src/libslic3r/SLAPrintSteps.cpp @@ -253,6 +253,11 @@ void SLAPrint::Steps::support_points(SLAPrintObject &po) // calculate heights of slices (slices are calculated already) const std::vector& heights = po.m_model_height_levels; + + // Tell the mesh where drain holes are. Although the points are + // calculated on slices, the algorithm then raycasts the points + // so they actually lie on the mesh. + po.m_supportdata->emesh.load_holes(po.transformed_drainhole_points()); throw_if_canceled(); sla::SupportPointGenerator::Config config; @@ -321,6 +326,7 @@ void SLAPrint::Steps::support_tree(SLAPrintObject &po) po.m_supportdata->emesh.ground_level_offset(pcfg.wall_thickness_mm); po.m_supportdata->cfg = make_support_cfg(po.m_config); + po.m_supportdata->emesh.load_holes(po.transformed_drainhole_points()); // scaling for the sub operations double d = objectstep_scale * OBJ_STEP_LEVELS[slaposSupportTree] / 100.0; From 735f82c01988d65efb8befa2c828747c76db5b34 Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Fri, 29 Nov 2019 13:49:38 +0100 Subject: [PATCH 057/336] Hollowing gizmo has now its own shortcut [H], fixed a situation with supports showed in editing mode --- src/slic3r/GUI/GLCanvas3D.cpp | 6 +++++- src/slic3r/GUI/GLCanvas3D.hpp | 2 +- src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp | 10 ++++------ src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp | 16 +++++----------- src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp | 1 - 5 files changed, 15 insertions(+), 20 deletions(-) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index c49c7c66d3..c5ade144ed 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -1301,8 +1301,11 @@ int GLCanvas3D::check_volumes_outside_state() const return (int)state; } -void GLCanvas3D::toggle_sla_auxiliaries_visibility(bool visible, const ModelObject* mo, int instance_idx) +bool GLCanvas3D::toggle_sla_auxiliaries_visibility(bool visible, const ModelObject* mo, int instance_idx) { + if (m_render_sla_auxiliaries == visible) + return false; + for (GLVolume* vol : m_volumes.volumes) { if ((mo == nullptr || m_model->objects[vol->composite_id.object_id] == mo) && (instance_idx == -1 || vol->composite_id.instance_id == instance_idx) @@ -1311,6 +1314,7 @@ void GLCanvas3D::toggle_sla_auxiliaries_visibility(bool visible, const ModelObje } m_render_sla_auxiliaries = visible; + return true; } void GLCanvas3D::toggle_model_objects_visibility(bool visible, const ModelObject* mo, int instance_idx) diff --git a/src/slic3r/GUI/GLCanvas3D.hpp b/src/slic3r/GUI/GLCanvas3D.hpp index 3430c3692f..32974a8df9 100644 --- a/src/slic3r/GUI/GLCanvas3D.hpp +++ b/src/slic3r/GUI/GLCanvas3D.hpp @@ -462,7 +462,7 @@ public: void reset_volumes(); int check_volumes_outside_state() const; - void toggle_sla_auxiliaries_visibility(bool visible, const ModelObject* mo = nullptr, int instance_idx = -1); + bool toggle_sla_auxiliaries_visibility(bool visible, const ModelObject* mo = nullptr, int instance_idx = -1); void toggle_model_objects_visibility(bool visible, const ModelObject* mo = nullptr, int instance_idx = -1); void update_instance_printable_state_for_object(size_t obj_idx); void update_instance_printable_state_for_objects(std::vector& object_idxs); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp index 9c0e2c4d90..50bfb767a3 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp @@ -37,7 +37,7 @@ GLGizmoHollow::~GLGizmoHollow() bool GLGizmoHollow::on_init() { - m_shortcut_key = WXK_CONTROL_L; + m_shortcut_key = WXK_CONTROL_H; m_desc["head_diameter"] = _(L("Head diameter")) + ": "; m_desc["lock_supports"] = _(L("Lock supports under new islands")); @@ -595,7 +595,6 @@ void GLGizmoHollow::update_hollowed_mesh(std::unique_ptr &&mesh) m_volume_with_cavity->set_volume_transformation(volume_trafo); m_volume_with_cavity->set_instance_transformation(m_model_object->instances[size_t(m_active_instance)]->get_transformation()); } - m_parent.toggle_model_objects_visibility(! m_cavity_mesh, m_model_object, m_active_instance); } @@ -751,10 +750,9 @@ RENDER_AGAIN: if (ImGui::SliderFloat(" ", &m_clipping_plane_distance, 0.f, 1.f, "%.2f")) update_clipping_plane(true); - if (m_imgui->checkbox(m_desc["show_supports"], m_show_supports)) { - m_parent.toggle_sla_auxiliaries_visibility(m_show_supports, m_model_object, m_active_instance); - force_refresh = true; - } + // make sure supports are shown/hidden as appropriate + m_imgui->checkbox(m_desc["show_supports"], m_show_supports); + force_refresh = m_parent.toggle_sla_auxiliaries_visibility(m_show_supports, m_model_object, m_active_instance); m_imgui->end(); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp index 29eb72fc52..9d8b7687c6 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp @@ -738,11 +738,6 @@ void GLGizmoSlaSupports::on_render_input_window(float x, float y, float bottom_l bool first_run = true; // This is a hack to redraw the button when all points are removed, // so it is not delayed until the background process finishes. RENDER_AGAIN: - //m_imgui->set_next_window_pos(x, y, ImGuiCond_Always); - //const ImVec2 window_size(m_imgui->scaled(18.f, 16.f)); - //ImGui::SetNextWindowPos(ImVec2(x, y - std::max(0.f, y+window_size.y-bottom_limit) )); - //ImGui::SetNextWindowSize(ImVec2(window_size)); - const float approx_height = m_imgui->scaled(18.0f); y = std::min(y, bottom_limit - approx_height); m_imgui->set_next_window_pos(x, y, ImGuiCond_Always); @@ -761,7 +756,6 @@ RENDER_AGAIN: float window_width = minimal_slider_width + std::max(std::max(settings_sliders_left, clipping_slider_left), diameter_slider_left); window_width = std::max(std::max(window_width, buttons_width_approx), lock_supports_width_approx); - bool force_refresh = false; bool remove_selected = false; bool remove_all = false; @@ -917,11 +911,11 @@ RENDER_AGAIN: m_imgui->end(); - if (m_editing_mode != m_old_editing_state) { // user toggled between editing/non-editing mode - m_parent.toggle_sla_auxiliaries_visibility(!m_editing_mode, m_model_object, m_active_instance); - force_refresh = true; - } - m_old_editing_state = m_editing_mode; + // Make sure that the supports are (not) visible as they should be. This + // is done on each refresh because the user can switch the editing mode + // before background process finishes. + force_refresh = m_parent.toggle_sla_auxiliaries_visibility( + ! m_editing_mode, m_model_object, m_active_instance); if (remove_selected || remove_all) { force_refresh = false; diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp index e536aab40f..1de241a53c 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp @@ -99,7 +99,6 @@ private: bool m_lock_unique_islands = false; bool m_editing_mode = false; // Is editing mode active? - bool m_old_editing_state = false; // To keep track of whether the user toggled between the modes (needed for imgui refreshes). float m_new_point_head_diameter; // Size of a new point. CacheEntry m_point_before_drag; // undo/redo - so we know what state was edited float m_old_point_head_diameter = 0.; // the same From 14d56929e7d27bf21bbda1aa9f178c219a62a6e7 Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Fri, 29 Nov 2019 14:09:53 +0100 Subject: [PATCH 058/336] SLA drain holes can be removed by right click, Ctrl+A selects all holes --- src/slic3r/GUI/Gizmos/GLGizmosManager.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp b/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp index f4427638b1..1ca764a031 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp @@ -491,7 +491,7 @@ bool GLGizmosManager::on_mouse(wxMouseEvent& evt) processed = true; } } - else if (evt.RightDown() && (selected_object_idx != -1) && (m_current == SlaSupports) && gizmo_event(SLAGizmoEventType::RightDown)) + else if (evt.RightDown() && (selected_object_idx != -1) && (m_current == SlaSupports || m_current == Hollow) && gizmo_event(SLAGizmoEventType::RightDown)) { // we need to set the following right up as processed to avoid showing the context menu if the user release the mouse over the object pending_right_up = true; @@ -642,7 +642,7 @@ bool GLGizmosManager::on_char(wxKeyEvent& evt) #endif /* __APPLE__ */ { // Sla gizmo selects all support points - if ((m_current == SlaSupports) && gizmo_event(SLAGizmoEventType::SelectAll)) + if ((m_current == SlaSupports || m_current == Hollow) && gizmo_event(SLAGizmoEventType::SelectAll)) processed = true; break; From a6e737f05adae6e69a662b7147642fd3e72fe798 Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Tue, 3 Dec 2019 10:45:49 +0100 Subject: [PATCH 059/336] Various small changes in hollowing gizmo: - changed layout of controls - fixed supports appearing when they shouldn't - fixed clipping plane (holes were hidden at a bit different position of the plane then appropriate) - when hollowing is done, clipping plane is automatically moved to show the cavity - the dialog should no longed overlap bottom-left corner controls - gizmo controls now correspond to config values in ObjectSettings box and both update each other - added undo/redo support when manipulating holes --- src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp | 206 ++++++++++++++++-------- src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp | 48 ++---- 2 files changed, 151 insertions(+), 103 deletions(-) diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp index 50bfb767a3..07ed8450e2 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp @@ -38,20 +38,17 @@ GLGizmoHollow::~GLGizmoHollow() bool GLGizmoHollow::on_init() { m_shortcut_key = WXK_CONTROL_H; - - m_desc["head_diameter"] = _(L("Head diameter")) + ": "; - m_desc["lock_supports"] = _(L("Lock supports under new islands")); + m_desc["enable"] = _(L("Hollow this object")); + m_desc["preview"] = _(L("Preview")); + m_desc["offset"] = _(L("Offset")) + ": "; + m_desc["quality"] = _(L("Quality")) + ": "; + m_desc["closing_distance"] = _(L("Closing distance")) + ": "; + m_desc["hole_diameter"] = _(L("Hole diameter")) + ": "; + m_desc["hole_depth"] = _(L("Hole depth")) + ": "; m_desc["remove_selected"] = _(L("Remove selected holes")); m_desc["remove_all"] = _(L("Remove all holes")); - m_desc["apply_changes"] = _(L("Apply changes")); - m_desc["discard_changes"] = _(L("Discard changes")); - m_desc["minimal_distance"] = _(L("Minimal points distance")) + ": "; - m_desc["points_density"] = _(L("Support points density")) + ": "; - m_desc["auto_generate"] = _(L("Auto-generate points")); - m_desc["manual_editing"] = _(L("Manual editing")); m_desc["clipping_of_view"] = _(L("Clipping of view"))+ ": "; m_desc["reset_direction"] = _(L("Reset direction")); - m_desc["hollow"] = _(L("Hollow")); m_desc["show_supports"] = _(L("Show supports")); return true; @@ -206,8 +203,7 @@ void GLGizmoHollow::render_clipping_plane(const Selection& selection) const ::glPopMatrix(); } - if (m_supports_clipper && ! m_supports_clipper->get_triangles().empty()) { - // The supports are hidden in the editing mode, so it makes no sense to render the cuts. + if (m_show_supports && m_supports_clipper && ! m_supports_clipper->get_triangles().empty()) { ::glPushMatrix(); ::glColor3f(1.0f, 0.f, 0.37f); ::glBegin(GL_TRIANGLES); @@ -250,7 +246,7 @@ void GLGizmoHollow::render_points(const Selection& selection, bool picking) cons const sla::DrainHole& drain_hole = m_model_object->sla_drain_holes[i]; const bool& point_selected = m_selected[i]; - if (is_mesh_point_clipped(drain_hole.pos.cast())) + if (is_mesh_point_clipped((drain_hole.pos+HoleStickOutLength*drain_hole.normal).cast())) continue; // First decide about the color of the point. @@ -565,7 +561,13 @@ void GLGizmoHollow::on_update(const UpdateData& data) std::pair GLGizmoHollow::get_hollowing_parameters() const { - return std::make_pair(m_mesh, sla::HollowingConfig{double(m_offset), double(m_accuracy), double(m_closing_d)}); + // FIXME this function is probably obsolete, caller could + // get the data from model config himself + std::vector opts = get_config_options({"hollowing_min_thickness", "hollowing_quality", "hollowing_closing_distance"}); + float offset = static_cast(opts[0])->value; + float quality = static_cast(opts[1])->value; + float closing_d = static_cast(opts[2])->value; + return std::make_pair(m_mesh, sla::HollowingConfig{double(offset), double(quality), double(closing_d)}); } void GLGizmoHollow::update_mesh_raycaster(std::unique_ptr &&rc) @@ -596,6 +598,10 @@ void GLGizmoHollow::update_hollowed_mesh(std::unique_ptr &&mesh) m_volume_with_cavity->set_instance_transformation(m_model_object->instances[size_t(m_active_instance)]->get_transformation()); } m_parent.toggle_model_objects_visibility(! m_cavity_mesh, m_model_object, m_active_instance); + if (m_clipping_plane_distance == 0.f) { + m_clipping_plane_distance = 0.5f; + update_clipping_plane(); + } } std::vector GLGizmoHollow::get_config_options(const std::vector& keys) const @@ -643,74 +649,151 @@ void GLGizmoHollow::on_render_input_window(float x, float y, float bottom_limit) bool first_run = true; // This is a hack to redraw the button when all points are removed, // so it is not delayed until the background process finishes. RENDER_AGAIN: - const float approx_height = m_imgui->scaled(18.0f); + const float approx_height = m_imgui->scaled(20.0f); y = std::min(y, bottom_limit - approx_height); m_imgui->set_next_window_pos(x, y, ImGuiCond_Always); m_imgui->set_next_window_bg_alpha(0.5f); m_imgui->begin(on_get_name(), ImGuiWindowFlags_NoMove | ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoCollapse); // First calculate width of all the texts that are could possibly be shown. We will decide set the dialog width based on that: - const float settings_sliders_left = std::max(m_imgui->calc_text_size(m_desc.at("minimal_distance")).x, m_imgui->calc_text_size(m_desc.at("points_density")).x) + m_imgui->scaled(1.f); + const float settings_sliders_left = + std::max(std::max(m_imgui->calc_text_size(m_desc.at("offset")).x, + m_imgui->calc_text_size(m_desc.at("quality")).x), + m_imgui->calc_text_size(m_desc.at("closing_distance")).x) + + m_imgui->scaled(1.f); + const float clipping_slider_left = std::max(m_imgui->calc_text_size(m_desc.at("clipping_of_view")).x, m_imgui->calc_text_size(m_desc.at("reset_direction")).x) + m_imgui->scaled(1.5f); - const float diameter_slider_left = m_imgui->calc_text_size(m_desc.at("head_diameter")).x + m_imgui->scaled(1.f); + const float diameter_slider_left = m_imgui->calc_text_size(m_desc.at("hole_diameter")).x + m_imgui->scaled(1.f); const float minimal_slider_width = m_imgui->scaled(4.f); - const float buttons_width_approx = m_imgui->calc_text_size(m_desc.at("apply_changes")).x + m_imgui->calc_text_size(m_desc.at("discard_changes")).x + m_imgui->scaled(1.5f); - const float lock_supports_width_approx = m_imgui->calc_text_size(m_desc.at("lock_supports")).x + m_imgui->scaled(2.f); + //const float buttons_width_approx = m_imgui->calc_text_size(m_desc.at("apply_changes")).x + m_imgui->calc_text_size(m_desc.at("discard_changes")).x + m_imgui->scaled(1.5f); float window_width = minimal_slider_width + std::max(std::max(settings_sliders_left, clipping_slider_left), diameter_slider_left); - window_width = std::max(std::max(window_width, buttons_width_approx), lock_supports_width_approx); + window_width = std::max(std::max(window_width, /*buttons_width_approx*/0.f), 0.f); + + { + std::vector opts = get_config_options({"hollowing_enable"}); + m_enable_hollowing = static_cast(opts[0])->value; + if (m_imgui->checkbox(m_desc["enable"], m_enable_hollowing)) { + m_model_object->config.opt("hollowing_enable", true)->value = m_enable_hollowing; + wxGetApp().obj_list()->update_and_show_object_settings_item(); + } + } + m_imgui->disabled_begin(! m_enable_hollowing); + + ImGui::SameLine(); + if (m_imgui->button(m_desc["preview"])) + hollow_mesh(); + + std::vector opts = get_config_options({"hollowing_min_thickness", "hollowing_quality", "hollowing_closing_distance"}); + float offset = static_cast(opts[0])->value; + float quality = static_cast(opts[1])->value; + float closing_d = static_cast(opts[2])->value; + + m_imgui->text(m_desc.at("offset")); + ImGui::SameLine(settings_sliders_left); + ImGui::PushItemWidth(window_width - settings_sliders_left); + ImGui::SliderFloat(" ", &offset, 0.f, 5.f, "%.1f"); + bool slider_clicked = ImGui::IsItemClicked(); // someone clicked the slider + bool slider_edited = ImGui::IsItemEdited(); // someone is dragging the slider + bool slider_released = ImGui::IsItemDeactivatedAfterEdit(); // someone has just released the slider + + m_imgui->text(m_desc.at("quality")); + ImGui::SameLine(settings_sliders_left); + ImGui::SliderFloat(" ", &quality, 0.f, 1.f, "%.1f"); + slider_clicked |= ImGui::IsItemClicked(); + slider_edited |= ImGui::IsItemEdited(); + slider_released |= ImGui::IsItemDeactivatedAfterEdit(); + + m_imgui->text(m_desc.at("closing_distance")); + ImGui::SameLine(settings_sliders_left); + ImGui::SliderFloat(" ", &closing_d, 0.f, 10.f, "%.1f"); + slider_clicked |= ImGui::IsItemClicked(); + slider_edited |= ImGui::IsItemEdited(); + slider_released |= ImGui::IsItemDeactivatedAfterEdit(); + + if (slider_clicked) { + m_offset_stash = offset; + m_quality_stash = quality; + m_closing_d_stash = closing_d; + } + if (slider_edited || slider_released) { + if (slider_released) { + m_model_object->config.opt("hollowing_min_thickness", true)->value = m_offset_stash; + m_model_object->config.opt("hollowing_quality", true)->value = m_quality_stash; + m_model_object->config.opt("hollowing_closing_distance", true)->value = m_closing_d_stash; + Plater::TakeSnapshot snapshot(wxGetApp().plater(), _(L("Hollowing parameter change"))); + } + m_model_object->config.opt("hollowing_min_thickness", true)->value = offset; + m_model_object->config.opt("hollowing_quality", true)->value = quality; + m_model_object->config.opt("hollowing_closing_distance", true)->value = closing_d; + if (slider_released) + wxGetApp().obj_list()->update_and_show_object_settings_item(); + } + + m_imgui->disabled_end(); bool force_refresh = false; bool remove_selected = false; bool remove_all = false; - if (m_imgui->button(m_desc.at("hollow"))) - hollow_mesh(); + m_imgui->text(" "); // vertical gap float diameter_upper_cap = 20.f; //static_cast(wxGetApp().preset_bundle->sla_prints.get_edited_preset().config.option("support_pillar_diameter"))->value; if (m_new_hole_radius > diameter_upper_cap) m_new_hole_radius = diameter_upper_cap; - m_imgui->text(m_desc.at("head_diameter")); + m_imgui->text(m_desc.at("hole_diameter")); ImGui::SameLine(diameter_slider_left); ImGui::PushItemWidth(window_width - diameter_slider_left); + ImGui::SliderFloat("", &m_new_hole_radius, 0.1f, diameter_upper_cap, "%.1f"); + bool clicked = ImGui::IsItemClicked(); + bool edited = ImGui::IsItemEdited(); + bool deactivated = ImGui::IsItemDeactivatedAfterEdit(); + + m_imgui->text(m_desc["hole_depth"]); + ImGui::SameLine(diameter_slider_left); + m_new_hole_height -= HoleStickOutLength; + ImGui::SliderFloat(" ", &m_new_hole_height, 0.f, 10.f, "%.1f"); + m_new_hole_height += HoleStickOutLength; + + clicked |= ImGui::IsItemClicked(); + edited |= ImGui::IsItemEdited(); + deactivated |= ImGui::IsItemDeactivatedAfterEdit(); + // Following is a nasty way to: // - save the initial value of the slider before one starts messing with it // - keep updating the head radius during sliding so it is continuosly refreshed in 3D scene // - take correct undo/redo snapshot after the user is done with moving the slider - float initial_value = m_new_hole_radius; - ImGui::SliderFloat("", &m_new_hole_radius, 0.1f, diameter_upper_cap, "%.1f"); - if (ImGui::IsItemClicked()) { - if (m_old_hole_radius == 0.f) - m_old_hole_radius = initial_value; + if (! m_selection_empty) { + if (clicked) { + m_holes_stash = m_model_object->sla_drain_holes; + } + if (edited) { + for (size_t idx=0; idxsla_drain_holes[idx].radius = m_new_hole_radius; + m_model_object->sla_drain_holes[idx].height = m_new_hole_height; + } + } + if (deactivated) { + // momentarily restore the old value to take snapshot + sla::DrainHoles new_holes = m_model_object->sla_drain_holes; + m_model_object->sla_drain_holes = m_holes_stash; + float backup_rad = m_new_hole_radius; + float backup_hei = m_new_hole_height; + for (size_t i=0; isla_drain_holes = new_holes; + } } - if (ImGui::IsItemEdited()) { - for (size_t idx=0; idxsla_drain_holes[idx].radius = m_new_hole_radius; - } - if (ImGui::IsItemDeactivatedAfterEdit()) { - // momentarily restore the old value to take snapshot - for (size_t idx=0; idxsla_drain_holes[idx].radius = m_old_hole_radius; - float backup = m_new_hole_radius; - m_new_hole_radius = m_old_hole_radius; - Plater::TakeSnapshot snapshot(wxGetApp().plater(), _(L("Change drainage hole diameter"))); - m_new_hole_radius = backup; - for (size_t idx=0; idxsla_drain_holes[idx].radius = m_new_hole_radius; - m_old_hole_radius = 0.f; - } - - // !!!! Something as above should be done for the undo/redo - m_imgui->text("Hole height: "); - ImGui::SameLine(); - ImGui::SliderFloat(" ", &m_new_hole_height, 0.1f, 10.f, "%.1f"); - for (size_t idx=0; idxsla_drain_holes[idx].height = m_new_hole_height; m_imgui->disabled_begin(m_selection_empty); remove_selected = m_imgui->button(m_desc.at("remove_selected")); @@ -720,19 +803,6 @@ RENDER_AGAIN: remove_all = m_imgui->button(m_desc.at("remove_all")); m_imgui->disabled_end(); - m_imgui->text(" "); // vertical gap - - - m_imgui->text("Offset: "); - ImGui::SameLine(); - ImGui::SliderFloat(" ", &m_offset, 0.f, 5.f, "%.1f"); - m_imgui->text("Quality: "); - ImGui::SameLine(); - ImGui::SliderFloat(" ", &m_accuracy, 0.f, 1.f, "%.1f"); - m_imgui->text("Closing distance: "); - ImGui::SameLine(); - ImGui::SliderFloat(" ", &m_closing_d, 0.f, 10.f, "%.1f"); - // Following is rendered in both editing and non-editing mode: m_imgui->text(""); if (m_clipping_plane_distance == 0.f) diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp index 428a978c48..1c548e14ab 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp @@ -43,32 +43,6 @@ private: mutable int m_print_object_idx = -1; mutable int m_print_objects_count = -1; - class CacheEntry { - public: - CacheEntry() : - drain_hole(sla::DrainHole()), selected(false) {} - - CacheEntry(const sla::DrainHole& point, bool sel = false) : - drain_hole(point), selected(sel) {} - - bool operator==(const CacheEntry& rhs) const { - return (drain_hole == rhs.drain_hole); - } - - bool operator!=(const CacheEntry& rhs) const { - return ! ((*this) == rhs); - } - - sla::DrainHole drain_hole; - bool selected; // whether the point is selected - - template - void serialize(Archive & ar) - { - ar(drain_hole, selected); - } - }; - public: GLGizmoHollow(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id); ~GLGizmoHollow() override; @@ -90,7 +64,6 @@ private: void on_render() const override; void on_render_for_picking() const override; - //void render_selection_rectangle() const; void render_points(const Selection& selection, bool picking = false) const; void render_clipping_plane(const Selection& selection) const; bool is_mesh_update_necessary() const; @@ -102,15 +75,21 @@ private: bool m_show_supports = true; float m_new_hole_radius; // Size of a new hole. float m_new_hole_height = 5.f; - float m_old_hole_radius = 0.; // undo/redo - so we know what state was edited - Vec3f m_hole_before_drag = Vec3f::Zero(); - float m_minimal_point_distance_stash = 0.f; // and again - float m_density_stash = 0.f; // and again mutable std::vector m_selected; // which holes are currently selected - float m_offset = 2.0f; - float m_accuracy = 0.5f; - float m_closing_d = 2.f; + bool m_enable_hollowing = true; + + // Stashes to keep data for undo redo. Is taken after the editing + // is done, the data are updated continuously. + float m_offset_stash = 2.0f; + float m_quality_stash = 0.5f; + float m_closing_d_stash = 2.f; + Vec3f m_hole_before_drag = Vec3f::Zero(); + + + sla::DrainHoles m_holes_stash; + + float m_clipping_plane_distance = 0.f; std::unique_ptr m_clipping_plane; @@ -130,7 +109,6 @@ private: std::vector get_config_options(const std::vector& keys) const; bool is_mesh_point_clipped(const Vec3d& point) const; - //void find_intersecting_facets(const igl::AABB* aabb, const Vec3f& normal, double offset, std::vector& out) const; // Methods that do the model_object and editing cache synchronization, // editing mode selection, etc: From 3b0241c98b342722b87d0c794a0bf6684ff91b4c Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Fri, 6 Dec 2019 10:59:05 +0100 Subject: [PATCH 060/336] Fix trianglemesh slicer error with empty meshes --- src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp | 4 ++-- src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp index 07ed8450e2..6b4f00a8cd 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp @@ -131,7 +131,7 @@ void GLGizmoHollow::on_render() const void GLGizmoHollow::render_clipping_plane(const Selection& selection) const { - if (m_clipping_plane_distance == 0.f) + if (m_clipping_plane_distance == 0.f || mesh()->empty()) return; // Get transformation of the instance @@ -172,7 +172,7 @@ void GLGizmoHollow::render_clipping_plane(const Selection& selection) const if (m_print_object_idx >= 0) { const SLAPrintObject* print_object = m_parent.sla_print()->objects()[m_print_object_idx]; - if (print_object->is_step_done(slaposSupportTree)) { + if (print_object->is_step_done(slaposSupportTree) && !print_object->get_mesh(slaposSupportTree).empty()) { // If the supports are already calculated, save the timestamp of the respective step // so we can later tell they were recalculated. size_t timestamp = print_object->step_state_with_timestamp(slaposSupportTree).timestamp; diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp index 9d8b7687c6..ac3dd80589 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp @@ -136,7 +136,7 @@ void GLGizmoSlaSupports::on_render() const void GLGizmoSlaSupports::render_clipping_plane(const Selection& selection) const { - if (m_clipping_plane_distance == 0.f) + if (m_clipping_plane_distance == 0.f || m_mesh->empty()) return; // Get transformation of the instance @@ -177,7 +177,7 @@ void GLGizmoSlaSupports::render_clipping_plane(const Selection& selection) const if (m_print_object_idx >= 0) { const SLAPrintObject* print_object = m_parent.sla_print()->objects()[m_print_object_idx]; - if (print_object->is_step_done(slaposSupportTree)) { + if (print_object->is_step_done(slaposSupportTree) && !print_object->get_mesh(slaposSupportTree).empty()) { // If the supports are already calculated, save the timestamp of the respective step // so we can later tell they were recalculated. size_t timestamp = print_object->step_state_with_timestamp(slaposSupportTree).timestamp; From 5be66a52c0b2a16794ba722974bd68f21fd405b9 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Fri, 6 Dec 2019 15:47:58 +0100 Subject: [PATCH 061/336] add drain hole 3mf export and import --- src/libslic3r/Format/3mf.cpp | 165 +++++++++++++++++++++++++++- src/libslic3r/Format/3mf.hpp | 4 + src/libslic3r/libslic3r.h | 16 +++ tests/libslic3r/libslic3r_tests.cpp | 27 +++++ 4 files changed, 210 insertions(+), 2 deletions(-) diff --git a/src/libslic3r/Format/3mf.cpp b/src/libslic3r/Format/3mf.cpp index ff3cf777d3..ee40adb566 100644 --- a/src/libslic3r/Format/3mf.cpp +++ b/src/libslic3r/Format/3mf.cpp @@ -51,6 +51,7 @@ const std::string MODEL_CONFIG_FILE = "Metadata/Slic3r_PE_model.config"; const std::string LAYER_HEIGHTS_PROFILE_FILE = "Metadata/Slic3r_PE_layer_heights_profile.txt"; const std::string LAYER_CONFIG_RANGES_FILE = "Metadata/Prusa_Slicer_layer_config_ranges.xml"; const std::string SLA_SUPPORT_POINTS_FILE = "Metadata/Slic3r_PE_sla_support_points.txt"; +const std::string SLA_DRAIN_HOLES_FILE = "Metadata/Slic3r_PE_sla_drain_holes.txt"; const char* MODEL_TAG = "model"; const char* RESOURCES_TAG = "resources"; @@ -227,6 +228,15 @@ bool is_valid_object_type(const std::string& type) return false; } +template std::string string_printf(const char *const fmt, Args &&...args) +{ + int bufflen = snprintf(nullptr, 0, fmt, std::forward(args)...); + std::vector buffer(size_t(bufflen), '\0'); + + snprintf(buffer.data(), buffer.size(), fmt, std::forward(args)...); + return std::string(buffer.begin(), buffer.end()); +} + namespace Slic3r { //! macro used to mark string used at localization, @@ -379,6 +389,7 @@ namespace Slic3r { typedef std::map> IdToLayerHeightsProfileMap; typedef std::map IdToLayerConfigRangesMap; typedef std::map> IdToSlaSupportPointsMap; + typedef std::map> IdToSlaDrainHolesMap; // Version of the 3mf file unsigned int m_version; @@ -397,6 +408,7 @@ namespace Slic3r { IdToLayerHeightsProfileMap m_layer_heights_profiles; IdToLayerConfigRangesMap m_layer_config_ranges; IdToSlaSupportPointsMap m_sla_support_points; + IdToSlaDrainHolesMap m_sla_drain_holes; std::string m_curr_metadata_name; std::string m_curr_characters; std::string m_name; @@ -416,6 +428,7 @@ namespace Slic3r { void _extract_layer_heights_profile_config_from_archive(mz_zip_archive& archive, const mz_zip_archive_file_stat& stat); void _extract_layer_config_ranges_from_archive(mz_zip_archive& archive, const mz_zip_archive_file_stat& stat); void _extract_sla_support_points_from_archive(mz_zip_archive& archive, const mz_zip_archive_file_stat& stat); + void _extract_sla_drain_holes_from_archive(mz_zip_archive& archive, const mz_zip_archive_file_stat& stat); void _extract_print_config_from_archive(mz_zip_archive& archive, const mz_zip_archive_file_stat& stat, DynamicPrintConfig& config, const std::string& archive_filename); bool _extract_model_config_from_archive(mz_zip_archive& archive, const mz_zip_archive_file_stat& stat, Model& model); @@ -621,6 +634,11 @@ namespace Slic3r { // extract sla support points file _extract_sla_support_points_from_archive(archive, stat); } + else if (boost::algorithm::iequals(name, SLA_DRAIN_HOLES_FILE)) + { + // extract sla support points file + _extract_sla_drain_holes_from_archive(archive, stat); + } else if (boost::algorithm::iequals(name, PRINT_CONFIG_FILE)) { // extract slic3r print config file @@ -670,6 +688,11 @@ namespace Slic3r { model_object->sla_support_points = obj_sla_support_points->second; model_object->sla_points_status = sla::PointsStatus::UserModified; } + + IdToSlaDrainHolesMap::iterator obj_drain_holes = m_sla_drain_holes.find(object.second + 1); + if (obj_drain_holes != m_sla_drain_holes.end() && !obj_drain_holes->second.empty()) { + model_object->sla_drain_holes = obj_drain_holes->second; + } IdToMetadataMap::iterator obj_metadata = m_objects_metadata.find(object.first); if (obj_metadata != m_objects_metadata.end()) @@ -942,8 +965,9 @@ namespace Slic3r { // Info on format versioning - see 3mf.hpp int version = 0; - if (!objects.empty() && objects[0].find("support_points_format_version=") != std::string::npos) { - objects[0].erase(objects[0].begin(), objects[0].begin() + 30); // removes the string + std::string key("support_points_format_version="); + if (!objects.empty() && objects[0].find(key) != std::string::npos) { + objects[0].erase(objects[0].begin(), objects[0].begin() + long(key.size())); // removes the string version = std::stoi(objects[0]); objects.erase(objects.begin()); // pop the header } @@ -1009,6 +1033,90 @@ namespace Slic3r { } } } + + void _3MF_Importer::_extract_sla_drain_holes_from_archive(mz_zip_archive& archive, const mz_zip_archive_file_stat& stat) + { + if (stat.m_uncomp_size > 0) + { + std::string buffer(size_t(stat.m_uncomp_size), 0); + mz_bool res = mz_zip_reader_extract_file_to_mem(&archive, stat.m_filename, (void*)buffer.data(), (size_t)stat.m_uncomp_size, 0); + if (res == 0) + { + add_error("Error while reading sla support points data to buffer"); + return; + } + + if (buffer.back() == '\n') + buffer.pop_back(); + + std::vector objects; + boost::split(objects, buffer, boost::is_any_of("\n"), boost::token_compress_off); + + // Info on format versioning - see 3mf.hpp + int version = 0; + std::string key("drain_holes_format_version="); + if (!objects.empty() && objects[0].find(key) != std::string::npos) { + objects[0].erase(objects[0].begin(), objects[0].begin() + long(key.size())); // removes the string + version = std::stoi(objects[0]); + objects.erase(objects.begin()); // pop the header + } + + for (const std::string& object : objects) + { + std::vector object_data; + boost::split(object_data, object, boost::is_any_of("|"), boost::token_compress_off); + + if (object_data.size() != 2) + { + add_error("Error while reading object data"); + continue; + } + + std::vector object_data_id; + boost::split(object_data_id, object_data[0], boost::is_any_of("="), boost::token_compress_off); + if (object_data_id.size() != 2) + { + add_error("Error while reading object id"); + continue; + } + + int object_id = std::atoi(object_data_id[1].c_str()); + if (object_id == 0) + { + add_error("Found invalid object id"); + continue; + } + + IdToSlaDrainHolesMap::iterator object_item = m_sla_drain_holes.find(object_id); + if (object_item != m_sla_drain_holes.end()) + { + add_error("Found duplicated SLA drain holes"); + continue; + } + + std::vector object_data_points; + boost::split(object_data_points, object_data[1], boost::is_any_of(" "), boost::token_compress_off); + + sla::DrainHoles sla_drain_holes; + + if (version == 1) { + for (unsigned int i=0; isla_drain_holes; + if (!drain_holes.empty()) + { + out += string_printf(fmt, count); + + // Store the layer height profile as a single space separated list. + for (size_t i = 0; i < drain_holes.size(); ++i) + out += string_printf((i == 0 ? "%f %f %f %f %f %f %f %f" : " %f %f %f %f %f %f %f %f"), + drain_holes[i].pos(0), + drain_holes[i].pos(1), + drain_holes[i].pos(2), + drain_holes[i].normal(0), + drain_holes[i].normal(1), + drain_holes[i].normal(2), + drain_holes[i].radius, + drain_holes[i].height); + + out += "\n"; + } + } + + if (!out.empty()) + { + // Adds version header at the beginning: + out = std::string("drain_holes_format_version=") + std::to_string(drain_holes_format_version) + std::string("\n") + out; + + if (!mz_zip_writer_add_mem(&archive, SLA_DRAIN_HOLES_FILE.c_str(), static_cast(out.data()), out.length(), mz_uint(MZ_DEFAULT_COMPRESSION))) + { + add_error("Unable to add sla support points file to archive"); + return false; + } + } + return true; + } bool _3MF_Exporter::_add_print_config_file_to_archive(mz_zip_archive& archive, const DynamicPrintConfig &config) { diff --git a/src/libslic3r/Format/3mf.hpp b/src/libslic3r/Format/3mf.hpp index 2e85b7f59e..7da0ce7fc4 100644 --- a/src/libslic3r/Format/3mf.hpp +++ b/src/libslic3r/Format/3mf.hpp @@ -19,6 +19,10 @@ namespace Slic3r { enum { support_points_format_version = 1 }; + + enum { + drain_holes_format_version = 1 + }; class Model; class DynamicPrintConfig; diff --git a/src/libslic3r/libslic3r.h b/src/libslic3r/libslic3r.h index afbf94fa39..f2dd001143 100644 --- a/src/libslic3r/libslic3r.h +++ b/src/libslic3r/libslic3r.h @@ -183,6 +183,22 @@ static inline bool is_approx(Number value, Number test_value) return std::fabs(double(value) - double(test_value)) < double(EPSILON); } +template +std::string string_printf(const char *const fmt, Args &&...args) +{ + static const size_t INITIAL_LEN = 1024; + std::vector buffer(INITIAL_LEN, '\0'); + + int bufflen = snprintf(buffer.data(), INITIAL_LEN - 1, fmt, std::forward(args)...); + + if (bufflen >= int(INITIAL_LEN)) { + buffer.resize(size_t(bufflen) + 1); + snprintf(buffer.data(), buffer.size(), fmt, std::forward(args)...); + } + + return std::string(buffer.begin(), buffer.begin() + bufflen); +} + } // namespace Slic3r #endif diff --git a/tests/libslic3r/libslic3r_tests.cpp b/tests/libslic3r/libslic3r_tests.cpp index caf5b3b9ac..b9c615d90a 100644 --- a/tests/libslic3r/libslic3r_tests.cpp +++ b/tests/libslic3r/libslic3r_tests.cpp @@ -11,4 +11,31 @@ TEST_CASE("sort_remove_duplicates", "[utils]") { REQUIRE(data_src == data_dst); } +TEST_CASE("string_printf", "[utils]") { + SECTION("Empty format with empty data should return empty string") { + std::string outs = Slic3r::string_printf(""); + REQUIRE(outs.empty()); + } + + SECTION("String output length should be the same as input") { + std::string outs = Slic3r::string_printf("1234"); + REQUIRE(outs.size() == 4); + } + + SECTION("String format should be interpreted as with sprintf") { + std::string outs = Slic3r::string_printf("%d %f %s", 10, 11.4, " This is a string"); + char buffer[1024]; + + sprintf(buffer, "%d %f %s", 10, 11.4, " This is a string"); + + REQUIRE(outs.compare(buffer) == 0); + } + + SECTION("String format should survive large input data") { + std::string input(2048, 'A'); + std::string outs = Slic3r::string_printf("%s", input.c_str()); + REQUIRE(outs.compare(input) == 0); + } +} + } From 5d77c345675046343316dbffc14b634087903f6b Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Fri, 6 Dec 2019 16:28:14 +0100 Subject: [PATCH 062/336] Forgot to remove string_printf from 3mf.cpp --- src/libslic3r/Format/3mf.cpp | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/libslic3r/Format/3mf.cpp b/src/libslic3r/Format/3mf.cpp index ee40adb566..516dc2919e 100644 --- a/src/libslic3r/Format/3mf.cpp +++ b/src/libslic3r/Format/3mf.cpp @@ -228,15 +228,6 @@ bool is_valid_object_type(const std::string& type) return false; } -template std::string string_printf(const char *const fmt, Args &&...args) -{ - int bufflen = snprintf(nullptr, 0, fmt, std::forward(args)...); - std::vector buffer(size_t(bufflen), '\0'); - - snprintf(buffer.data(), buffer.size(), fmt, std::forward(args)...); - return std::string(buffer.begin(), buffer.end()); -} - namespace Slic3r { //! macro used to mark string used at localization, From 0c4297b4f9b0d241a60280616c37ceb3fba0c71c Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Tue, 10 Dec 2019 13:40:40 +0100 Subject: [PATCH 063/336] Small fix for OpenVDB find script --- cmake/modules/FindOpenVDB.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/modules/FindOpenVDB.cmake b/cmake/modules/FindOpenVDB.cmake index 70bbe05f55..3400fa786b 100644 --- a/cmake/modules/FindOpenVDB.cmake +++ b/cmake/modules/FindOpenVDB.cmake @@ -158,7 +158,7 @@ set(_OPENVDB_ROOT_SEARCH_DIR "") # Additionally try and use pkconfig to find OpenVDB -find_package(PkgConfig ${_quiet} ${_required}) +find_package(PkgConfig ${_quiet} ) pkg_check_modules(PC_OpenVDB QUIET OpenVDB) # ------------------------------------------------------------------------ From 135660decfd2cdb6d8b26059c05fa084e399bff2 Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Thu, 12 Dec 2019 10:37:15 +0100 Subject: [PATCH 064/336] SLA gizmos fix: clipping of points/holes always used coords from the first instance Few warnings fixed --- src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp | 16 ++++++++-------- src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp | 2 +- src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp | 2 +- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp index 6b4f00a8cd..0bbaa19c42 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp @@ -323,7 +323,7 @@ bool GLGizmoHollow::is_mesh_point_clipped(const Vec3d& point) const if (m_clipping_plane_distance == 0.f) return false; - Vec3d transformed_point = m_model_object->instances.front()->get_transformation().get_matrix() * point; + Vec3d transformed_point = m_model_object->instances[m_active_instance]->get_transformation().get_matrix() * point; transformed_point(2) += m_z_shift; return m_clipping_plane->is_point_clipped(transformed_point); } @@ -534,7 +534,7 @@ bool GLGizmoHollow::gizmo_event(SLAGizmoEventType action, const Vec2d& mouse_pos return false; } -void GLGizmoHollow::delete_selected_points(bool force) +void GLGizmoHollow::delete_selected_points() { Plater::TakeSnapshot snapshot(wxGetApp().plater(), _(L("Delete drainage hole"))); @@ -564,10 +564,10 @@ std::pair GLGizmoHollow::get_hollowi // FIXME this function is probably obsolete, caller could // get the data from model config himself std::vector opts = get_config_options({"hollowing_min_thickness", "hollowing_quality", "hollowing_closing_distance"}); - float offset = static_cast(opts[0])->value; - float quality = static_cast(opts[1])->value; - float closing_d = static_cast(opts[2])->value; - return std::make_pair(m_mesh, sla::HollowingConfig{double(offset), double(quality), double(closing_d)}); + double offset = static_cast(opts[0])->value; + double quality = static_cast(opts[1])->value; + double closing_d = static_cast(opts[2])->value; + return std::make_pair(m_mesh, sla::HollowingConfig{offset, quality, closing_d}); } void GLGizmoHollow::update_mesh_raycaster(std::unique_ptr &&rc) @@ -833,10 +833,10 @@ RENDER_AGAIN: if (remove_all) { select_point(AllPoints); - delete_selected_points(true); // true - delete regardless of locked status + delete_selected_points(); } if (remove_selected) - delete_selected_points(false); // leave locked points + delete_selected_points(); if (first_run) { first_run = false; diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp index 1c548e14ab..8e022eb1e6 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp @@ -48,7 +48,7 @@ public: ~GLGizmoHollow() override; void set_sla_support_data(ModelObject* model_object, const Selection& selection); bool gizmo_event(SLAGizmoEventType action, const Vec2d& mouse_position, bool shift_down, bool alt_down, bool control_down); - void delete_selected_points(bool force = false); + void delete_selected_points(); ClippingPlane get_sla_clipping_plane() const; diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp index ac3dd80589..cf3f91dac7 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp @@ -377,7 +377,7 @@ bool GLGizmoSlaSupports::is_mesh_point_clipped(const Vec3d& point) const if (m_clipping_plane_distance == 0.f) return false; - Vec3d transformed_point = m_model_object->instances.front()->get_transformation().get_matrix() * point; + Vec3d transformed_point = m_model_object->instances[m_active_instance]->get_transformation().get_matrix() * point; transformed_point(2) += m_z_shift; return m_clipping_plane->is_point_clipped(transformed_point); } From 9805b02a25f3d24120ba8331cf14e00afe998708 Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Thu, 12 Dec 2019 13:19:16 +0100 Subject: [PATCH 065/336] Removed an obsolete variable from MeshRaycaster --- src/slic3r/GUI/MeshUtils.cpp | 8 ++++---- src/slic3r/GUI/MeshUtils.hpp | 7 +++---- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/src/slic3r/GUI/MeshUtils.cpp b/src/slic3r/GUI/MeshUtils.cpp index 573952f75a..3bf99f73c6 100644 --- a/src/slic3r/GUI/MeshUtils.cpp +++ b/src/slic3r/GUI/MeshUtils.cpp @@ -195,10 +195,10 @@ Vec3f MeshRaycaster::get_closest_point(const Vec3f& point, Vec3f* normal) const Vec3d closest_point; m_emesh.squared_distance(point.cast(), idx, closest_point); if (normal) { - const stl_triangle_vertex_indices& indices = m_mesh->its.indices[idx]; - Vec3f a(m_mesh->its.vertices[indices(1)] - m_mesh->its.vertices[indices(0)]); - Vec3f b(m_mesh->its.vertices[indices(2)] - m_mesh->its.vertices[indices(0)]); - *normal = Vec3f(a.cross(b)); + auto indices = m_emesh.F().row(idx); + Vec3d a(m_emesh.V().row(indices(1)) - m_emesh.V().row(indices(0))); + Vec3d b(m_emesh.V().row(indices(2)) - m_emesh.V().row(indices(0))); + *normal = Vec3f(a.cross(b).cast()); } return closest_point.cast(); } diff --git a/src/slic3r/GUI/MeshUtils.hpp b/src/slic3r/GUI/MeshUtils.hpp index 56d726596f..b4ad030114 100644 --- a/src/slic3r/GUI/MeshUtils.hpp +++ b/src/slic3r/GUI/MeshUtils.hpp @@ -105,10 +105,10 @@ private: // whether certain points are visible or obscured by the mesh etc. class MeshRaycaster { public: - // The class saves a const* to the mesh, calledz is responsible - // for making sure it does not get invalid. + // The class makes a copy of the mesh as EigenMesh3D. + // The pointer can be invalidated after constructor returns. MeshRaycaster(const TriangleMesh& mesh) - : m_emesh(mesh), m_mesh(&mesh) + : m_emesh(mesh) {} // Given a mouse position, this returns true in case it is on the mesh. @@ -138,7 +138,6 @@ public: private: sla::EigenMesh3D m_emesh; - const TriangleMesh* m_mesh = nullptr; }; From 2cb30f3641d13ccbc93bcaebd35ac2892e1e606b Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Fri, 13 Dec 2019 13:42:10 +0100 Subject: [PATCH 066/336] First prototype of CGAL hole-drilling --- src/libslic3r/CMakeLists.txt | 2 ++ src/slic3r/CMakeLists.txt | 2 +- src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp | 30 ++++++++++++++++++++----- 3 files changed, 28 insertions(+), 6 deletions(-) diff --git a/src/libslic3r/CMakeLists.txt b/src/libslic3r/CMakeLists.txt index 2571748fdb..922d153e43 100644 --- a/src/libslic3r/CMakeLists.txt +++ b/src/libslic3r/CMakeLists.txt @@ -117,6 +117,8 @@ add_library(libslic3r STATIC "${CMAKE_CURRENT_BINARY_DIR}/libslic3r_version.h" Line.cpp Line.hpp + MeshBoolean.cpp + MeshBoolean.hpp Model.cpp Model.hpp Arrange.hpp diff --git a/src/slic3r/CMakeLists.txt b/src/slic3r/CMakeLists.txt index 859c17e89d..eec2b6a01b 100644 --- a/src/slic3r/CMakeLists.txt +++ b/src/slic3r/CMakeLists.txt @@ -176,7 +176,7 @@ add_library(libslic3r_gui STATIC ${SLIC3R_GUI_SOURCES}) encoding_check(libslic3r_gui) -target_link_libraries(libslic3r_gui libslic3r avrdude cereal imgui GLEW::GLEW OpenGL::GL OpenGL::GLU hidapi) +target_link_libraries(libslic3r_gui libslic3r avrdude cereal imgui GLEW::GLEW OpenGL::GL OpenGL::GLU hidapi CGAL::CGAL) if (SLIC3R_PCH AND NOT SLIC3R_SYNTAXONLY) add_precompiled_header(libslic3r_gui pchheader.hpp FORCEINCLUDE) endif () diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp index 0bbaa19c42..cad0243f08 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp @@ -1,4 +1,3 @@ -// Include GLGizmoBase.hpp before I18N.hpp as it includes some libigl code, which overrides our localization "L" macro. #include "GLGizmoHollow.hpp" #include "slic3r/GUI/GLCanvas3D.hpp" #include "slic3r/GUI/Gizmos/GLGizmos.hpp" @@ -12,6 +11,8 @@ #include "slic3r/GUI/Plater.hpp" #include "slic3r/GUI/PresetBundle.hpp" #include "libslic3r/SLAPrint.hpp" +#include "libslic3r/TriangleMesh.hpp" +#include "libslic3r/MeshBoolean.hpp" namespace Slic3r { @@ -107,15 +108,15 @@ void GLGizmoHollow::on_render() const if (! m_mesh) const_cast(this)->update_mesh(); + glsafe(::glEnable(GL_BLEND)); + glsafe(::glEnable(GL_DEPTH_TEST)); + if (m_volume_with_cavity) { m_parent.get_shader().start_using(); m_volume_with_cavity->render(); m_parent.get_shader().stop_using(); } - glsafe(::glEnable(GL_BLEND)); - glsafe(::glEnable(GL_DEPTH_TEST)); - m_z_shift = selection.get_volume(*selection.get_volume_idxs().begin())->get_sla_shift_z(); if (m_quadric != nullptr && selection.is_from_single_instance()) @@ -583,12 +584,31 @@ void GLGizmoHollow::hollow_mesh() wxGetApp().plater()->hollow(); } + void GLGizmoHollow::update_hollowed_mesh(std::unique_ptr &&mesh) { // Called from Plater when the UI job finishes m_cavity_mesh = std::move(mesh); - if(m_cavity_mesh) {// create a new GLVolume that only has the cavity inside + if(m_cavity_mesh) { + // First subtract the holes: + if (! m_model_object->sla_drain_holes.empty()) { + TriangleMesh holes_mesh; + for (const sla::DrainHole& hole : m_model_object->sla_drain_holes) { + TriangleMesh hole_mesh = make_cylinder(hole.radius, hole.height, 2*M_PI/8); + Eigen::Quaternionf q; + Transform3f m = Transform3f::Identity(); + m.matrix().block(0, 0, 3, 3) = q.setFromTwoVectors(Vec3f::UnitZ(), hole.normal).toRotationMatrix(); + hole_mesh.transform(m.cast()); + hole_mesh.translate(hole.pos); + holes_mesh.merge(hole_mesh); + //MeshBoolean::minus(*m_cavity_mesh.get(), hole_mesh); + } + MeshBoolean::minus(*m_cavity_mesh.get(), holes_mesh); + } + + + // create a new GLVolume that only has the cavity inside Geometry::Transformation volume_trafo = m_model_object->volumes.front()->get_transformation(); volume_trafo.set_offset(volume_trafo.get_offset() + Vec3d(0., 0., m_z_shift)); m_volume_with_cavity.reset(new GLVolume(1.f, 0.f, 0.f, 0.5f)); From f60ff1c7ce02a577003910902a27414612b8de14 Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Fri, 13 Dec 2019 15:08:44 +0100 Subject: [PATCH 067/336] Fixup of previous commit: actually adding new source files --- src/libslic3r/MeshBoolean.cpp | 63 +++++++++++++++++++++++++++++++++++ src/libslic3r/MeshBoolean.hpp | 17 ++++++++++ 2 files changed, 80 insertions(+) create mode 100644 src/libslic3r/MeshBoolean.cpp create mode 100644 src/libslic3r/MeshBoolean.hpp diff --git a/src/libslic3r/MeshBoolean.cpp b/src/libslic3r/MeshBoolean.cpp new file mode 100644 index 0000000000..e639319a20 --- /dev/null +++ b/src/libslic3r/MeshBoolean.cpp @@ -0,0 +1,63 @@ +#include "MeshBoolean.hpp" + +// Include igl first. It defines "L" macro which then clashes with our localization +#include +#undef L + +#include "libslic3r/TriangleMesh.hpp" + + +namespace Slic3r { +namespace MeshBoolean { + +typedef Eigen::Map> MapMatrixXfUnaligned; +typedef Eigen::Map> MapMatrixXiUnaligned; + +static TriangleMesh eigen_to_triangle_mesh(const Eigen::MatrixXd& VC, const Eigen::MatrixXi& FC) +{ + Pointf3s vertices; + for (size_t i=0; i facets; + for (size_t i=0; i(); + Eigen::MatrixXi FA = MapMatrixXiUnaligned(A.its.indices.front().data(), A.its.indices.size(), 3); + Eigen::MatrixXd VB = MapMatrixXfUnaligned(B.its.vertices.front().data(), B.its.vertices.size(), 3).cast(); + Eigen::MatrixXi FB = MapMatrixXiUnaligned(B.its.indices.front().data(), B.its.indices.size(), 3); + + Eigen::MatrixXd VC; + Eigen::MatrixXi FC; + igl::MeshBooleanType boolean_type(igl::MESH_BOOLEAN_TYPE_MINUS); + igl::copyleft::cgal::mesh_boolean(VA, FA, VB, FB, boolean_type, VC, FC); + + A = eigen_to_triangle_mesh(VC, FC); +} + + +void self_union(TriangleMesh& mesh) +{ + Eigen::MatrixXd V = MapMatrixXfUnaligned(mesh.its.vertices.front().data(), mesh.its.vertices.size(), 3).cast(); + Eigen::MatrixXi F = MapMatrixXiUnaligned(mesh.its.indices.front().data(), mesh.its.indices.size(), 3); + + Eigen::MatrixXd VC; + Eigen::MatrixXi FC; + + igl::MeshBooleanType boolean_type(igl::MESH_BOOLEAN_TYPE_UNION); + igl::copyleft::cgal::mesh_boolean(V, F, Eigen::MatrixXd(), Eigen::MatrixXi(), boolean_type, VC, FC); + mesh = eigen_to_triangle_mesh(VC, FC); +} + + + +} // namespace MeshBoolean +} // namespace Slic3r diff --git a/src/libslic3r/MeshBoolean.hpp b/src/libslic3r/MeshBoolean.hpp new file mode 100644 index 0000000000..783bde3f58 --- /dev/null +++ b/src/libslic3r/MeshBoolean.hpp @@ -0,0 +1,17 @@ +#ifndef libslic3r_MeshBoolean_hpp_ +#define libslic3r_MeshBoolean_hpp_ + + +namespace Slic3r { + +class TriangleMesh; + +namespace MeshBoolean { + +void minus(TriangleMesh& A, const TriangleMesh& B); +void self_union(TriangleMesh& mesh); + + +} // namespace MeshBoolean +} // namespace Slic3r +#endif // libslic3r_MeshBoolean_hpp_ From a9403319b7767e920d7d993e91bf0623c91c7b4b Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Mon, 16 Dec 2019 09:47:31 +0100 Subject: [PATCH 068/336] Separate Job, ProgressStatusBar and ProgressIndicator * Separate GUI::Job * make use of ProgressIndicator interface * make ProgressStatusbar independent from GUI::App --- src/slic3r/CMakeLists.txt | 1 + src/slic3r/GUI/Job.hpp | 154 +++++++++++++++++++++++++++ src/slic3r/GUI/MainFrame.cpp | 3 +- src/slic3r/GUI/MainFrame.hpp | 2 +- src/slic3r/GUI/Plater.cpp | 143 ++++--------------------- src/slic3r/GUI/ProgressIndicator.hpp | 63 ++--------- src/slic3r/GUI/ProgressStatusBar.cpp | 12 ++- src/slic3r/GUI/ProgressStatusBar.hpp | 20 ++-- 8 files changed, 206 insertions(+), 192 deletions(-) create mode 100644 src/slic3r/GUI/Job.hpp diff --git a/src/slic3r/CMakeLists.txt b/src/slic3r/CMakeLists.txt index eec2b6a01b..5ce464eb19 100644 --- a/src/slic3r/CMakeLists.txt +++ b/src/slic3r/CMakeLists.txt @@ -140,6 +140,7 @@ set(SLIC3R_GUI_SOURCES GUI/ProgressStatusBar.cpp GUI/PrintHostDialogs.cpp GUI/PrintHostDialogs.hpp + GUI/Job.hpp GUI/Mouse3DController.cpp GUI/Mouse3DController.hpp Utils/Http.cpp diff --git a/src/slic3r/GUI/Job.hpp b/src/slic3r/GUI/Job.hpp new file mode 100644 index 0000000000..9accd0ef39 --- /dev/null +++ b/src/slic3r/GUI/Job.hpp @@ -0,0 +1,154 @@ +#ifndef JOB_HPP +#define JOB_HPP + +#include + +#include +#include +#include + +#include + +#include + +namespace Slic3r { namespace GUI { + +// A class to handle UI jobs like arranging and optimizing rotation. +// These are not instant jobs, the user has to be informed about their +// state in the status progress indicator. On the other hand they are +// separated from the background slicing process. Ideally, these jobs should +// run when the background process is not running. +// +// TODO: A mechanism would be useful for blocking the plater interactions: +// objects would be frozen for the user. In case of arrange, an animation +// could be shown, or with the optimize orientations, partial results +// could be displayed. +class Job : public wxEvtHandler +{ + int m_range = 100; + boost::thread m_thread; + std::atomic m_running{false}, m_canceled{false}; + bool m_finalized = false; + std::shared_ptr m_progress; + + void run() + { + m_running.store(true); + process(); + m_running.store(false); + + // ensure to call the last status to finalize the job + update_status(status_range(), ""); + } + +protected: + // status range for a particular job + virtual int status_range() const { return 100; } + + // status update, to be used from the work thread (process() method) + void update_status(int st, const wxString &msg = "") + { + auto evt = new wxThreadEvent(); + evt->SetInt(st); + evt->SetString(msg); + wxQueueEvent(this, evt); + } + + bool was_canceled() const { return m_canceled.load(); } + + // Launched just before start(), a job can use it to prepare internals + virtual void prepare() {} + + // Launched when the job is finished. It refreshes the 3Dscene by def. + virtual void finalize() { m_finalized = true; } + + bool is_finalized() const { return m_finalized; } + +public: + Job(std::shared_ptr pri) : m_progress(pri) + { + Bind(wxEVT_THREAD, [this](const wxThreadEvent &evt) { + auto msg = evt.GetString(); + if (!msg.empty()) + m_progress->set_status_text(msg.ToUTF8().data()); + + if (m_finalized) return; + + m_progress->set_progress(evt.GetInt()); + if (evt.GetInt() == status_range()) { + // set back the original range and cancel callback + m_progress->set_range(m_range); + m_progress->set_cancel_callback(); + wxEndBusyCursor(); + + finalize(); + + // dont do finalization again for the same process + m_finalized = true; + } + }); + } + + Job(const Job &) = delete; + Job(Job &&) = delete; + Job &operator=(const Job &) = delete; + Job &operator=(Job &&) = delete; + + virtual void process() = 0; + + void start() + { // Start the job. No effect if the job is already running + if (!m_running.load()) { + prepare(); + + // Save the current status indicatior range and push the new one + m_range = m_progress->get_range(); + m_progress->set_range(status_range()); + + // init cancellation flag and set the cancel callback + m_canceled.store(false); + m_progress->set_cancel_callback( + [this]() { m_canceled.store(true); }); + + m_finalized = false; + + // Changing cursor to busy + wxBeginBusyCursor(); + + try { // Execute the job + m_thread = create_thread([this] { this->run(); }); + } catch (std::exception &) { + update_status(status_range(), + _(L("ERROR: not enough resources to " + "execute a new job."))); + } + + // The state changes will be undone when the process hits the + // last status value, in the status update handler (see ctor) + } + } + + // To wait for the running job and join the threads. False is + // returned if the timeout has been reached and the job is still + // running. Call cancel() before this fn if you want to explicitly + // end the job. + bool join(int timeout_ms = 0) + { + if (!m_thread.joinable()) return true; + + if (timeout_ms <= 0) + m_thread.join(); + else if (!m_thread.try_join_for(boost::chrono::milliseconds(timeout_ms))) + return false; + + return true; + } + + bool is_running() const { return m_running.load(); } + void cancel() { m_canceled.store(true); } +}; + +} +} + +#endif // JOB_HPP diff --git a/src/slic3r/GUI/MainFrame.cpp b/src/slic3r/GUI/MainFrame.cpp index e613e69150..9e70fbaa2e 100644 --- a/src/slic3r/GUI/MainFrame.cpp +++ b/src/slic3r/GUI/MainFrame.cpp @@ -58,7 +58,8 @@ DPIFrame(NULL, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, wxDEFAULT_FRAME_S #endif // _WIN32 // initialize status bar - m_statusbar.reset(new ProgressStatusBar(this)); + m_statusbar = std::make_shared(this); + m_statusbar->set_font(GUI::wxGetApp().normal_font()); m_statusbar->embed(this); m_statusbar->set_status_text(_(L("Version")) + " " + SLIC3R_VERSION + diff --git a/src/slic3r/GUI/MainFrame.hpp b/src/slic3r/GUI/MainFrame.hpp index 28bd0242b5..1a75680928 100644 --- a/src/slic3r/GUI/MainFrame.hpp +++ b/src/slic3r/GUI/MainFrame.hpp @@ -135,7 +135,7 @@ public: Plater* m_plater { nullptr }; wxNotebook* m_tabpanel { nullptr }; wxProgressDialog* m_progress_dialog { nullptr }; - std::unique_ptr m_statusbar; + std::shared_ptr m_statusbar; }; } // GUI diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index df705f25f6..43d2f06a58 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -69,6 +69,7 @@ #include "Camera.hpp" #include "Mouse3DController.hpp" #include "Tab.hpp" +#include "Job.hpp" #include "PresetBundle.hpp" #include "BackgroundSlicingProcess.hpp" #include "ProgressStatusBar.hpp" @@ -1457,136 +1458,30 @@ struct Plater::priv // objects would be frozen for the user. In case of arrange, an animation // could be shown, or with the optimize orientations, partial results // could be displayed. - class Job : public wxEvtHandler + class PlaterJob: public Job { - int m_range = 100; - boost::thread m_thread; - priv * m_plater = nullptr; - std::atomic m_running{false}, m_canceled{false}; - bool m_finalized = false; - - void run() - { - m_running.store(true); - process(); - m_running.store(false); - - // ensure to call the last status to finalize the job - update_status(status_range(), ""); - } - + priv *m_plater; protected: - // status range for a particular job - virtual int status_range() const { return 100; } - - // status update, to be used from the work thread (process() method) - void update_status(int st, const wxString &msg = "") - { - auto evt = new wxThreadEvent(); - evt->SetInt(st); - evt->SetString(msg); - wxQueueEvent(this, evt); - } priv & plater() { return *m_plater; } const priv &plater() const { return *m_plater; } - bool was_canceled() const { return m_canceled.load(); } - - // Launched just before start(), a job can use it to prepare internals - virtual void prepare() {} // Launched when the job is finished. It refreshes the 3Dscene by def. - virtual void finalize() + void finalize() override { // Do a full refresh of scene tree, including regenerating // all the GLVolumes. FIXME The update function shall just // reload the modified matrices. - if (!was_canceled()) + if (!Job::was_canceled()) plater().update(unsigned(UpdateParams::FORCE_FULL_SCREEN_REFRESH)); + + Job::finalize(); } public: - Job(priv *_plater) : m_plater(_plater) - { - Bind(wxEVT_THREAD, [this](const wxThreadEvent &evt) { - auto msg = evt.GetString(); - if (!msg.empty()) - plater().statusbar()->set_status_text(msg); - - if (m_finalized) return; - - plater().statusbar()->set_progress(evt.GetInt()); - if (evt.GetInt() == status_range()) { - // set back the original range and cancel callback - plater().statusbar()->set_range(m_range); - plater().statusbar()->set_cancel_callback(); - wxEndBusyCursor(); - - finalize(); - - // dont do finalization again for the same process - m_finalized = true; - } - }); - } - - Job(const Job &) = delete; - Job(Job &&) = delete; - Job &operator=(const Job &) = delete; - Job &operator=(Job &&) = delete; - - virtual void process() = 0; - - void start() - { // Start the job. No effect if the job is already running - if (!m_running.load()) { - prepare(); - - // Save the current status indicatior range and push the new one - m_range = plater().statusbar()->get_range(); - plater().statusbar()->set_range(status_range()); - - // init cancellation flag and set the cancel callback - m_canceled.store(false); - plater().statusbar()->set_cancel_callback( - [this]() { m_canceled.store(true); }); - - m_finalized = false; - - // Changing cursor to busy - wxBeginBusyCursor(); - - try { // Execute the job - m_thread = create_thread([this] { this->run(); }); - } catch (std::exception &) { - update_status(status_range(), - _(L("ERROR: not enough resources to " - "execute a new job."))); - } - - // The state changes will be undone when the process hits the - // last status value, in the status update handler (see ctor) - } - } - - // To wait for the running job and join the threads. False is - // returned if the timeout has been reached and the job is still - // running. Call cancel() before this fn if you want to explicitly - // end the job. - bool join(int timeout_ms = 0) - { - if (!m_thread.joinable()) return true; - - if (timeout_ms <= 0) - m_thread.join(); - else if (!m_thread.try_join_for(boost::chrono::milliseconds(timeout_ms))) - return false; - - return true; - } - - bool is_running() const { return m_running.load(); } - void cancel() { m_canceled.store(true); } + PlaterJob(priv *_plater) + : Job(_plater->statusbar()), m_plater(_plater) + {} }; enum class Jobs : size_t { @@ -1595,7 +1490,7 @@ struct Plater::priv Hollow }; - class ArrangeJob : public Job + class ArrangeJob : public PlaterJob { using ArrangePolygon = arrangement::ArrangePolygon; using ArrangePolygons = arrangement::ArrangePolygons; @@ -1712,7 +1607,7 @@ struct Plater::priv } public: - using Job::Job; + using PlaterJob::PlaterJob; int status_range() const override { return int(m_selected.size()); } @@ -1729,17 +1624,17 @@ struct Plater::priv } }; - class RotoptimizeJob : public Job + class RotoptimizeJob : public PlaterJob { public: - using Job::Job; + using PlaterJob::PlaterJob; void process() override; }; - class HollowJob : public Job + class HollowJob : public PlaterJob { public: - using Job::Job; + using PlaterJob::PlaterJob; void prepare() override; void process() override; void finalize() override; @@ -1847,7 +1742,7 @@ struct Plater::priv void reset_all_gizmos(); void update_ui_from_settings(); - ProgressStatusBar* statusbar(); + std::shared_ptr statusbar(); std::string get_config(const std::string &key) const; BoundingBoxf bed_shape_bb() const; BoundingBox scaled_bed_shape_bb() const; @@ -2266,9 +2161,9 @@ void Plater::priv::update_ui_from_settings() preview->get_canvas3d()->update_ui_from_settings(); } -ProgressStatusBar* Plater::priv::statusbar() +std::shared_ptr Plater::priv::statusbar() { - return main_frame->m_statusbar.get(); + return main_frame->m_statusbar; } std::string Plater::priv::get_config(const std::string &key) const diff --git a/src/slic3r/GUI/ProgressIndicator.hpp b/src/slic3r/GUI/ProgressIndicator.hpp index 280ba63ac8..674a81ba26 100644 --- a/src/slic3r/GUI/ProgressIndicator.hpp +++ b/src/slic3r/GUI/ProgressIndicator.hpp @@ -11,58 +11,17 @@ namespace Slic3r { */ class ProgressIndicator { public: - using CancelFn = std::function; // Cancel function signature. - -private: - float m_state = .0f, m_max = 1.f, m_step; - CancelFn m_cancelfunc = [](){}; - -public: - - inline virtual ~ProgressIndicator() {} - - /// Get the maximum of the progress range. - float max() const { return m_max; } - - /// Get the current progress state - float state() const { return m_state; } - - /// Set the maximum of the progress range - virtual void max(float maxval) { m_max = maxval; } - - /// Set the current state of the progress. - virtual void state(float val) { m_state = val; } - - /** - * @brief Number of states int the progress. Can be used instead of giving a - * maximum value. - */ - virtual void states(unsigned statenum) { - m_step = m_max / statenum; - } - - /// Message shown on the next status update. - virtual void message(const std::string&) = 0; - - /// Title of the operation. - virtual void title(const std::string&) = 0; - - /// Formatted message for the next status update. Works just like sprintf. - virtual void message_fmt(const std::string& fmt, ...); - - /// Set up a cancel callback for the operation if feasible. - virtual void on_cancel(CancelFn func = CancelFn()) { m_cancelfunc = func; } - - /** - * Explicitly shut down the progress indicator and call the associated - * callback. - */ - virtual void cancel() { m_cancelfunc(); } - - /// Convenience function to call message and status update in one function. - void update(float st, const std::string& msg) { - message(msg); state(st); - } + + /// Cancel callback function type + using CancelFn = std::function; + + virtual ~ProgressIndicator() = default; + + virtual void set_range(int range) = 0; + virtual void set_cancel_callback(CancelFn = CancelFn()) = 0; + virtual void set_progress(int pr) = 0; + virtual void set_status_text(const char *) = 0; // utf8 char array + virtual int get_range() const = 0; }; } diff --git a/src/slic3r/GUI/ProgressStatusBar.cpp b/src/slic3r/GUI/ProgressStatusBar.cpp index 33e4855cdd..1ec2b81930 100644 --- a/src/slic3r/GUI/ProgressStatusBar.cpp +++ b/src/slic3r/GUI/ProgressStatusBar.cpp @@ -15,8 +15,7 @@ namespace Slic3r { ProgressStatusBar::ProgressStatusBar(wxWindow *parent, int id) - : self{new wxStatusBar(parent ? parent : GUI::wxGetApp().mainframe, - id == -1 ? wxID_ANY : id)} + : self{new wxStatusBar(parent, id == -1 ? wxID_ANY : id)} , m_prog{new wxGauge(self, wxGA_HORIZONTAL, 100, @@ -32,7 +31,6 @@ ProgressStatusBar::ProgressStatusBar(wxWindow *parent, int id) m_prog->Hide(); m_cancelbutton->Hide(); - self->SetFont(GUI::wxGetApp().normal_font()); self->SetFieldsCount(3); int w[] = {-1, 150, 155}; self->SetStatusWidths(3, w); @@ -149,8 +147,7 @@ void ProgressStatusBar::run(int rate) void ProgressStatusBar::embed(wxFrame *frame) { - wxFrame* mf = frame ? frame : GUI::wxGetApp().mainframe; - if(mf) mf->SetStatusBar(self); + if(frame) frame->SetStatusBar(self); } void ProgressStatusBar::set_status_text(const wxString& txt) @@ -173,6 +170,11 @@ wxString ProgressStatusBar::get_status_text() const return self->GetStatusText(); } +void ProgressStatusBar::set_font(const wxFont &font) +{ + self->SetFont(font); +} + void ProgressStatusBar::show_cancel_button() { if(m_cancelbutton) m_cancelbutton->Show(); diff --git a/src/slic3r/GUI/ProgressStatusBar.hpp b/src/slic3r/GUI/ProgressStatusBar.hpp index 1aab67d5aa..faeb7a34ef 100644 --- a/src/slic3r/GUI/ProgressStatusBar.hpp +++ b/src/slic3r/GUI/ProgressStatusBar.hpp @@ -6,6 +6,8 @@ #include #include +#include "ProgressIndicator.hpp" + class wxTimer; class wxGauge; class wxButton; @@ -14,6 +16,7 @@ class wxStatusBar; class wxWindow; class wxFrame; class wxString; +class wxFont; namespace Slic3r { @@ -22,7 +25,7 @@ namespace Slic3r { * of the Slicer main window. It consists of a message area to the left and a * progress indication area to the right with an optional cancel button. */ -class ProgressStatusBar +class ProgressStatusBar : public ProgressIndicator { wxStatusBar *self; // we cheat! It should be the base class but: perl! wxGauge *m_prog; @@ -30,30 +33,29 @@ class ProgressStatusBar std::unique_ptr m_timer; public: - /// Cancel callback function type - using CancelFn = std::function; ProgressStatusBar(wxWindow *parent = nullptr, int id = -1); - ~ProgressStatusBar(); + ~ProgressStatusBar() override; int get_progress() const; // if the argument is less than 0 it shows the last state or // pulses if no state was set before. - void set_progress(int); - int get_range() const; - void set_range(int = 100); + void set_progress(int) override; + int get_range() const override; + void set_range(int = 100) override; void show_progress(bool); void start_busy(int = 100); void stop_busy(); inline bool is_busy() const { return m_busy; } - void set_cancel_callback(CancelFn = CancelFn()); + void set_cancel_callback(CancelFn = CancelFn()) override; inline void reset_cancel_callback() { set_cancel_callback(); } void run(int rate); void embed(wxFrame *frame = nullptr); void set_status_text(const wxString& txt); void set_status_text(const std::string& txt); - void set_status_text(const char *txt); + void set_status_text(const char *txt) override; wxString get_status_text() const; + void set_font(const wxFont &font); // Temporary methods to satisfy Perl side void show_cancel_button(); From 464ec8da6ab42b1014aa2b39b58dd480860f2cc3 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Mon, 16 Dec 2019 11:08:36 +0100 Subject: [PATCH 069/336] Add MeshBoolean.cpp with CGAL as object library. --- src/libslic3r/CMakeLists.txt | 21 +++++++++++++++++++-- src/slic3r/CMakeLists.txt | 2 +- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/libslic3r/CMakeLists.txt b/src/libslic3r/CMakeLists.txt index 922d153e43..1ddb7fa8b1 100644 --- a/src/libslic3r/CMakeLists.txt +++ b/src/libslic3r/CMakeLists.txt @@ -117,8 +117,6 @@ add_library(libslic3r STATIC "${CMAKE_CURRENT_BINARY_DIR}/libslic3r_version.h" Line.cpp Line.hpp - MeshBoolean.cpp - MeshBoolean.hpp Model.cpp Model.hpp Arrange.hpp @@ -220,6 +218,24 @@ add_library(libslic3r STATIC SLA/Clustering.hpp ) +if (SLIC3R_STATIC) + set(CGAL_Boost_USE_STATIC_LIBS ON) + set(CGAL_DO_NOT_WARN_ABOUT_CMAKE_BUILD_TYPE TRUE) +endif () + +find_package(CGAL REQUIRED) + +add_library(libslic3r_cgal OBJECT MeshBoolean.cpp MeshBoolean.hpp) +target_include_directories(libslic3r_cgal PRIVATE + ${CMAKE_CURRENT_BINARY_DIR} + $ + $) +target_compile_definitions(libslic3r_cgal PRIVATE + $) +target_compile_options(libslic3r_cgal PRIVATE + $) +target_sources(libslic3r PRIVATE $) + encoding_check(libslic3r) target_compile_definitions(libslic3r PUBLIC -DUSE_TBB -DTBB_USE_CAPTURED_EXCEPTION=0) @@ -240,6 +256,7 @@ target_link_libraries(libslic3r qhull semver TBB::tbb + $ ${CMAKE_DL_LIBS} ) diff --git a/src/slic3r/CMakeLists.txt b/src/slic3r/CMakeLists.txt index 5ce464eb19..4156481b0d 100644 --- a/src/slic3r/CMakeLists.txt +++ b/src/slic3r/CMakeLists.txt @@ -177,7 +177,7 @@ add_library(libslic3r_gui STATIC ${SLIC3R_GUI_SOURCES}) encoding_check(libslic3r_gui) -target_link_libraries(libslic3r_gui libslic3r avrdude cereal imgui GLEW::GLEW OpenGL::GL OpenGL::GLU hidapi CGAL::CGAL) +target_link_libraries(libslic3r_gui libslic3r avrdude cereal imgui GLEW::GLEW OpenGL::GL OpenGL::GLU hidapi) if (SLIC3R_PCH AND NOT SLIC3R_SYNTAXONLY) add_precompiled_header(libslic3r_gui pchheader.hpp FORCEINCLUDE) endif () From 66759e10e348c627ace37085c225113841f768e6 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Mon, 16 Dec 2019 11:02:54 +0100 Subject: [PATCH 070/336] Add opencsg demo sandbox --- sandboxes/CMakeLists.txt | 3 +- sandboxes/opencsg/CMakeLists.txt | 21 ++ sandboxes/opencsg/Canvas.hpp | 112 +++++++ sandboxes/opencsg/GLScene.cpp | 509 +++++++++++++++++++++++++++++++ sandboxes/opencsg/GLScene.hpp | 321 +++++++++++++++++++ sandboxes/opencsg/main.cpp | 195 ++++++++++++ src/libslic3r/SLA/Hollowing.cpp | 14 +- src/libslic3r/SLA/Hollowing.hpp | 3 + 8 files changed, 1176 insertions(+), 2 deletions(-) create mode 100644 sandboxes/opencsg/CMakeLists.txt create mode 100644 sandboxes/opencsg/Canvas.hpp create mode 100644 sandboxes/opencsg/GLScene.cpp create mode 100644 sandboxes/opencsg/GLScene.hpp create mode 100644 sandboxes/opencsg/main.cpp diff --git a/sandboxes/CMakeLists.txt b/sandboxes/CMakeLists.txt index 91d6ca225e..181c70d48e 100644 --- a/sandboxes/CMakeLists.txt +++ b/sandboxes/CMakeLists.txt @@ -1,3 +1,4 @@ #add_subdirectory(slasupporttree) #add_subdirectory(openvdb) -add_subdirectory(meshboolean) +#add_subdirectory(meshboolean) +add_subdirectory(opencsg) diff --git a/sandboxes/opencsg/CMakeLists.txt b/sandboxes/opencsg/CMakeLists.txt new file mode 100644 index 0000000000..9a216a7dc1 --- /dev/null +++ b/sandboxes/opencsg/CMakeLists.txt @@ -0,0 +1,21 @@ +cmake_minimum_required(VERSION 3.0) + +project(OpenCSG-example) + +add_executable(opencsg_example main.cpp GLScene.hpp GLScene.cpp Canvas.hpp + ${CMAKE_CURRENT_SOURCE_DIR}/../../src/slic3r/GUI/ProgressStatusBar.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../../src/slic3r/GUI/I18N.hpp + ${CMAKE_CURRENT_SOURCE_DIR}/../../src/slic3r/GUI/I18N.cpp) + +find_package(wxWidgets 3.1 REQUIRED COMPONENTS core base gl html) +find_package(OpenGL REQUIRED) +find_package(GLEW REQUIRED) +find_package(OpenCSG REQUIRED) +find_package(GLUT REQUIRED) +include(${wxWidgets_USE_FILE}) + + +target_link_libraries(opencsg_example libslic3r) +target_include_directories(opencsg_example PRIVATE ${wxWidgets_INCLUDE_DIRS}) +target_compile_definitions(opencsg_example PRIVATE ${wxWidgets_DEFINITIONS}) +target_link_libraries(opencsg_example ${wxWidgets_LIBRARIES} GLEW::GLEW OpenCSG::opencsg GLUT::GLUT OpenGL::OpenGL -lXrandr -lXext -lX11) diff --git a/sandboxes/opencsg/Canvas.hpp b/sandboxes/opencsg/Canvas.hpp new file mode 100644 index 0000000000..85d490ddf5 --- /dev/null +++ b/sandboxes/opencsg/Canvas.hpp @@ -0,0 +1,112 @@ +#ifndef CANVAS_HPP +#define CANVAS_HPP + +#include + +// For compilers that support precompilation, includes "wx/wx.h". +#include +#ifndef WX_PRECOMP +#include +#endif + +#include +#include + +#include "GLScene.hpp" + +namespace Slic3r { namespace GL { + +class Canvas: public wxGLCanvas, public Slic3r::GL::Display +{ + std::unique_ptr m_context; +public: + + void set_active(long w, long h) override + { + SetCurrent(*m_context); + Slic3r::GL::Display::set_active(w, h); + } + + void repaint(long width, long height) override + { + Slic3r::GL::Display::repaint(width, height); + } + + using Slic3r::GL::Display::repaint; + + void swap_buffers() override { SwapBuffers(); } + + void on_scroll(long v, long d, Slic3r::GL::MouseInput::WheelAxis wa) override + { + Slic3r::GL::Display::on_scroll(v, d, wa); + } + + template + Canvas(Args &&...args): wxGLCanvas(std::forward(args)...) + { + auto ctx = new wxGLContext(this); + if (!ctx || !ctx->IsOK()) { + wxMessageBox("Could not create OpenGL context.", "Error", + wxOK | wxICON_ERROR); + return; + } + + m_context.reset(ctx); + + Bind( + wxEVT_MOUSEWHEEL, + [this](wxMouseEvent &evt) { + on_scroll(evt.GetWheelRotation(), evt.GetWheelDelta(), + evt.GetWheelAxis() == wxMOUSE_WHEEL_VERTICAL ? + Slic3r::GL::MouseInput::waVertical : + Slic3r::GL::MouseInput::waHorizontal); + }, + GetId()); + + Bind( + wxEVT_MOTION, + [this](wxMouseEvent &evt) { + on_moved_to(evt.GetPosition().x, evt.GetPosition().y); + }, + GetId()); + + Bind( + wxEVT_RIGHT_DOWN, + [this](wxMouseEvent & /*evt*/) { on_right_click_down(); }, + GetId()); + + Bind( + wxEVT_RIGHT_UP, + [this](wxMouseEvent & /*evt*/) { on_right_click_up(); }, + GetId()); + + Bind( + wxEVT_LEFT_DOWN, + [this](wxMouseEvent & /*evt*/) { on_left_click_down(); }, + GetId()); + + Bind( + wxEVT_LEFT_UP, + [this](wxMouseEvent & /*evt*/) { on_left_click_up(); }, + GetId()); + + Bind(wxEVT_PAINT, [this](wxPaintEvent &) { + // This is required even though dc is not used otherwise. + wxPaintDC dc(this); + + // Set the OpenGL viewport according to the client size of this + // canvas. This is done here rather than in a wxSizeEvent handler + // because our OpenGL rendering context (and thus viewport setting) is + // used with multiple canvases: If we updated the viewport in the + // wxSizeEvent handler, changing the size of one canvas causes a + // viewport setting that is wrong when next another canvas is + // repainted. + const wxSize ClientSize = GetClientSize(); + repaint(ClientSize.x, ClientSize.y); + }, GetId()); + } +}; + +}} // namespace Slic3r::GL + +#endif // CANVAS_HPP diff --git a/sandboxes/opencsg/GLScene.cpp b/sandboxes/opencsg/GLScene.cpp new file mode 100644 index 0000000000..5f4a205327 --- /dev/null +++ b/sandboxes/opencsg/GLScene.cpp @@ -0,0 +1,509 @@ +#include "GLScene.hpp" +#include +#include +#include + +#include + +#ifdef __APPLE__ +#include +#else +#include +#endif + +#include + +#ifndef NDEBUG +#define HAS_GLSAFE +#endif + +#ifdef HAS_GLSAFE +extern void glAssertRecentCallImpl(const char *file_name, unsigned int line, const char *function_name); +inline void glAssertRecentCall() { glAssertRecentCallImpl(__FILE__, __LINE__, __FUNCTION__); } +#define glsafe(cmd) do { cmd; glAssertRecentCallImpl(__FILE__, __LINE__, __FUNCTION__); } while (false) +#define glcheck() do { glAssertRecentCallImpl(__FILE__, __LINE__, __FUNCTION__); } while (false) + +void glAssertRecentCallImpl(const char *file_name, unsigned int line, const char *function_name) +{ + GLenum err = glGetError(); + if (err == GL_NO_ERROR) + return; + const char *sErr = 0; + switch (err) { + case GL_INVALID_ENUM: sErr = "Invalid Enum"; break; + case GL_INVALID_VALUE: sErr = "Invalid Value"; break; + // be aware that GL_INVALID_OPERATION is generated if glGetError is executed between the execution of glBegin and the corresponding execution of glEnd + case GL_INVALID_OPERATION: sErr = "Invalid Operation"; break; + case GL_STACK_OVERFLOW: sErr = "Stack Overflow"; break; + case GL_STACK_UNDERFLOW: sErr = "Stack Underflow"; break; + case GL_OUT_OF_MEMORY: sErr = "Out Of Memory"; break; + default: sErr = "Unknown"; break; + } + BOOST_LOG_TRIVIAL(error) << "OpenGL error in " << file_name << ":" << line << ", function " << function_name << "() : " << (int)err << " - " << sErr; + assert(false); +} + +#else +inline void glAssertRecentCall() { } +#define glsafe(cmd) cmd +#define glcheck() +#endif + +namespace Slic3r { namespace GL { + +Scene::Scene() = default; + +Scene::~Scene() = default; + +void renderfps () { + static std::ostringstream fpsStream; + static int fps = 0; + static int ancient = 0; + static int last = 0; + static int msec = 0; + + last = msec; + msec = glutGet(GLUT_ELAPSED_TIME); + if (last / 1000 != msec / 1000) { + + float correctedFps = fps * 1000.0f / float(msec - ancient); + fpsStream.str(""); + fpsStream << "fps: " << correctedFps << std::ends; + + ancient = msec; + fps = 0; + } + glDisable(GL_DEPTH_TEST); + glLoadIdentity(); + glMatrixMode(GL_PROJECTION); + glPushMatrix(); + glLoadIdentity(); + glColor3f(0.0f, 0.0f, 0.0f); + glRasterPos2f(-1.0f, -1.0f); + glDisable(GL_LIGHTING); + std::string s = fpsStream.str(); + for (unsigned int i=0; icsg_primitives()); + + glDepthFunc(GL_EQUAL); + for (auto& p : m_scene->csg_primitives()) p->render(); + glDepthFunc(GL_LESS); + + for (auto& p : m_scene->free_primitives()) p->render(); + + glFlush(); +} + +template::value_type> +std::vector transform_pts( + It from, It to, Trafo &&tr, GetPt &&point) +{ + auto ret = reserve_vector(to - from); + for(auto it = from; it != to; ++it) { + V v = *it; + v.pos = tr * point(*it); + ret.emplace_back(std::move(v)); + } + return ret; +} + +void Scene::set_print(uqptr &&print) +{ + m_print = std::move(print); + + for (const SLAPrintObject *po : m_print->objects()) { + const ModelObject *mo = po->model_object(); + TriangleMesh msh = mo->raw_mesh(); + + sla::DrainHoles holedata = mo->sla_drain_holes; + + for (const ModelInstance *mi : mo->instances) { + + TriangleMesh mshinst = msh; + auto interior = po->hollowed_interior_mesh(); + interior.transform(po->trafo().inverse()); + + mshinst.merge(interior); + mshinst.require_shared_vertices(); + + mi->transform_mesh(&mshinst); + + auto bb = mshinst.bounding_box(); + auto center = bb.center().cast(); + mshinst.translate(-center); + + mshinst.require_shared_vertices(); + add_mesh(mshinst, OpenCSG::Intersection, 15); + + auto tr = Transform3f::Identity(); + tr.translate(-center); + + transform_pts(holedata.begin(), holedata.end(), tr, + [](const sla::DrainHole &dh) { + return dh.pos; + }); + + transform_pts(holedata.begin(), holedata.end(), tr, + [](const sla::DrainHole &dh) { + return dh.normal; + }); + } + + for (const sla::DrainHole &holept : holedata) { + TriangleMesh holemesh = sla::to_triangle_mesh(holept.to_mesh()); + holemesh.require_shared_vertices(); + add_mesh(holemesh, OpenCSG::Subtraction, 1); + } + } + + // Notify displays + call(&Display::on_scene_updated, m_displays); +} + +BoundingBoxf3 Scene::get_bounding_box() const +{ + return m_print->model().bounding_box(); +} + +shptr Scene::add_mesh(const TriangleMesh &mesh) +{ + auto p = std::make_shared(); + p->load_mesh(mesh); + m_primitives.emplace_back(p); + m_primitives_free.emplace_back(p.get()); + return p; +} + +shptr Scene::add_mesh(const TriangleMesh &mesh, OpenCSG::Operation o, unsigned c) +{ + auto p = std::make_shared(o, c); + p->load_mesh(mesh); + m_primitives.emplace_back(p); + m_primitives_csg.emplace_back(p.get()); + return p; +} + +void IndexedVertexArray::push_geometry(float x, float y, float z, float nx, float ny, float nz) +{ + assert(this->vertices_and_normals_interleaved_VBO_id == 0); + if (this->vertices_and_normals_interleaved_VBO_id != 0) + return; + + if (this->vertices_and_normals_interleaved.size() + 6 > this->vertices_and_normals_interleaved.capacity()) + this->vertices_and_normals_interleaved.reserve(next_highest_power_of_2(this->vertices_and_normals_interleaved.size() + 6)); + this->vertices_and_normals_interleaved.emplace_back(nx); + this->vertices_and_normals_interleaved.emplace_back(ny); + this->vertices_and_normals_interleaved.emplace_back(nz); + this->vertices_and_normals_interleaved.emplace_back(x); + this->vertices_and_normals_interleaved.emplace_back(y); + this->vertices_and_normals_interleaved.emplace_back(z); + + this->vertices_and_normals_interleaved_size = this->vertices_and_normals_interleaved.size(); +} + +void IndexedVertexArray::push_triangle(int idx1, int idx2, int idx3) { + assert(this->vertices_and_normals_interleaved_VBO_id == 0); + if (this->vertices_and_normals_interleaved_VBO_id != 0) + return; + + if (this->triangle_indices.size() + 3 > this->vertices_and_normals_interleaved.capacity()) + this->triangle_indices.reserve(next_highest_power_of_2(this->triangle_indices.size() + 3)); + this->triangle_indices.emplace_back(idx1); + this->triangle_indices.emplace_back(idx2); + this->triangle_indices.emplace_back(idx3); + this->triangle_indices_size = this->triangle_indices.size(); +} + +void IndexedVertexArray::load_mesh(const TriangleMesh &mesh) +{ + assert(triangle_indices.empty() && vertices_and_normals_interleaved_size == 0); + assert(quad_indices.empty() && triangle_indices_size == 0); + assert(vertices_and_normals_interleaved.size() % 6 == 0 && quad_indices_size == vertices_and_normals_interleaved.size()); + + this->vertices_and_normals_interleaved.reserve(this->vertices_and_normals_interleaved.size() + 3 * 3 * 2 * mesh.facets_count()); + + int vertices_count = 0; + for (size_t i = 0; i < mesh.stl.stats.number_of_facets; ++i) { + const stl_facet &facet = mesh.stl.facet_start[i]; + for (int j = 0; j < 3; ++j) + this->push_geometry(facet.vertex[j](0), facet.vertex[j](1), facet.vertex[j](2), facet.normal(0), facet.normal(1), facet.normal(2)); + + this->push_triangle(vertices_count, vertices_count + 1, vertices_count + 2); + vertices_count += 3; + } +} + +void IndexedVertexArray::finalize_geometry() +{ + assert(this->vertices_and_normals_interleaved_VBO_id == 0); + assert(this->triangle_indices_VBO_id == 0); + assert(this->quad_indices_VBO_id == 0); + + if (!this->vertices_and_normals_interleaved.empty()) { + glsafe( + ::glGenBuffers(1, &this->vertices_and_normals_interleaved_VBO_id)); + glsafe(::glBindBuffer(GL_ARRAY_BUFFER, + this->vertices_and_normals_interleaved_VBO_id)); + glsafe( + ::glBufferData(GL_ARRAY_BUFFER, + GLsizeiptr( + this->vertices_and_normals_interleaved.size() * + 4), + this->vertices_and_normals_interleaved.data(), + GL_STATIC_DRAW)); + glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); + this->vertices_and_normals_interleaved.clear(); + } + if (!this->triangle_indices.empty()) { + glsafe(::glGenBuffers(1, &this->triangle_indices_VBO_id)); + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, + this->triangle_indices_VBO_id)); + glsafe(::glBufferData(GL_ELEMENT_ARRAY_BUFFER, + GLsizeiptr(this->triangle_indices.size() * 4), + this->triangle_indices.data(), GL_STATIC_DRAW)); + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); + this->triangle_indices.clear(); + } + if (!this->quad_indices.empty()) { + glsafe(::glGenBuffers(1, &this->quad_indices_VBO_id)); + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, + this->quad_indices_VBO_id)); + glsafe(::glBufferData(GL_ELEMENT_ARRAY_BUFFER, + GLsizeiptr(this->quad_indices.size() * 4), + this->quad_indices.data(), GL_STATIC_DRAW)); + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); + this->quad_indices.clear(); + } +} + +void IndexedVertexArray::release_geometry() +{ + if (this->vertices_and_normals_interleaved_VBO_id) { + glsafe( + ::glDeleteBuffers(1, + &this->vertices_and_normals_interleaved_VBO_id)); + this->vertices_and_normals_interleaved_VBO_id = 0; + } + if (this->triangle_indices_VBO_id) { + glsafe(::glDeleteBuffers(1, &this->triangle_indices_VBO_id)); + this->triangle_indices_VBO_id = 0; + } + if (this->quad_indices_VBO_id) { + glsafe(::glDeleteBuffers(1, &this->quad_indices_VBO_id)); + this->quad_indices_VBO_id = 0; + } + this->clear(); +} + +void IndexedVertexArray::render() const +{ + assert(this->vertices_and_normals_interleaved_VBO_id != 0); + assert(this->triangle_indices_VBO_id != 0 || + this->quad_indices_VBO_id != 0); + + glsafe(::glBindBuffer(GL_ARRAY_BUFFER, + this->vertices_and_normals_interleaved_VBO_id)); + glsafe(::glVertexPointer(3, GL_FLOAT, 6 * sizeof(float), + reinterpret_cast(3 * sizeof(float)))); + glsafe(::glNormalPointer(GL_FLOAT, 6 * sizeof(float), nullptr)); + + glsafe(::glEnableClientState(GL_VERTEX_ARRAY)); + glsafe(::glEnableClientState(GL_NORMAL_ARRAY)); + + // Render using the Vertex Buffer Objects. + if (this->triangle_indices_size > 0) { + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, + this->triangle_indices_VBO_id)); + glsafe(::glDrawElements(GL_TRIANGLES, + GLsizei(this->triangle_indices_size), + GL_UNSIGNED_INT, nullptr)); + glsafe(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); + } + if (this->quad_indices_size > 0) { + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, + this->quad_indices_VBO_id)); + glsafe(::glDrawElements(GL_QUADS, GLsizei(this->quad_indices_size), + GL_UNSIGNED_INT, nullptr)); + glsafe(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); + } + + glsafe(::glDisableClientState(GL_VERTEX_ARRAY)); + glsafe(::glDisableClientState(GL_NORMAL_ARRAY)); + + glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); +} + +void IndexedVertexArray::clear() { + this->vertices_and_normals_interleaved.clear(); + this->triangle_indices.clear(); + this->quad_indices.clear(); + vertices_and_normals_interleaved_size = 0; + triangle_indices_size = 0; + quad_indices_size = 0; +} + +void IndexedVertexArray::shrink_to_fit() { + this->vertices_and_normals_interleaved.shrink_to_fit(); + this->triangle_indices.shrink_to_fit(); + this->quad_indices.shrink_to_fit(); +} + +void Primitive::render() +{ + glsafe(::glPushMatrix()); + glsafe(::glMultMatrixd(m_trafo.get_matrix().data())); + m_geom.render(); + glsafe(::glPopMatrix()); +} + +void Display::clear_screen() +{ + glViewport(0, 0, GLsizei(m_size.x()), GLsizei(m_size.y())); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); +} + +void Display::set_active(long width, long height) +{ + static int argc = 0; + + if (!m_initialized) { + glewInit(); + glutInit(&argc, nullptr); + m_initialized = true; + } + + m_size = {width, height}; + + // gray background + glClearColor(0.9f, 0.9f, 0.9f, 1.0f); + + // Enable two OpenGL lights + GLfloat light_diffuse[] = { 1.0f, 1.0f, 0.0f, 1.0f}; // White diffuse light + GLfloat light_position0[] = {-1.0f, -1.0f, -1.0f, 0.0f}; // Infinite light location + GLfloat light_position1[] = { 1.0f, 1.0f, 1.0f, 0.0f}; // Infinite light location + + glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse); + glLightfv(GL_LIGHT0, GL_POSITION, light_position0); + glEnable(GL_LIGHT0); + glLightfv(GL_LIGHT1, GL_DIFFUSE, light_diffuse); + glLightfv(GL_LIGHT1, GL_POSITION, light_position1); + glEnable(GL_LIGHT1); + glEnable(GL_LIGHTING); + glEnable(GL_NORMALIZE); + + // Use depth buffering for hidden surface elimination + glEnable(GL_DEPTH_TEST); + glEnable(GL_STENCIL_TEST); + + m_camera->set_screen(width, height); +} + +void Display::repaint(long width, long height) +{ + if (m_size.x() != width || m_size.y() != height) + m_camera->set_screen(width, height); + + m_size = {width, height}; + + clear_screen(); + + m_camera->view(); + render_scene(); + + renderfps(); + + swap_buffers(); +} + +void Display::on_scroll(long v, long d, MouseInput::WheelAxis wa) +{ + m_wheel_pos += v / d; + + m_camera->set_zoom(m_wheel_pos); + + m_scene->on_scroll(v, d, wa); + + repaint(m_size.x(), m_size.y()); +} + +void Display::on_moved_to(long x, long y) +{ + if (m_left_btn) { + m_camera->rotate((Vec2i{x, y} - m_mouse_pos).cast()); + repaint(); + } + m_mouse_pos = {x, y}; +} + +void CSGSettings::set_csg_algo(OpenCSG::Algorithm alg) { m_csgalg = alg; } + +void Display::on_scene_updated() +{ + auto bb = m_scene->get_bounding_box(); + double d = std::max(std::max(bb.size().x(), bb.size().y()), bb.size().z()); + m_wheel_pos = long(2 * d); + m_camera->set_zoom(m_wheel_pos); + repaint(); +} + +void Display::set_scene(shptr scene) +{ + m_scene = scene; + m_scene->add_display(shared_from_this()); +} + +void Camera::view() +{ + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + gluLookAt(0.0, m_zoom, 0.0, /* eye is at (0,zoom,0) */ + m_referene.x(), m_referene.y(), m_referene.z(), + 0.0, 0.0, 1.0); /* up is in positive Y direction */ + + // TODO Could have been set in prevoius gluLookAt in first argument + glRotatef(m_rot.y(), 1.0, 0.0, 0.0); + glRotatef(m_rot.x(), 0.0, 0.0, 1.0); + + // glClipPlane() +} + +void PerspectiveCamera::set_screen(long width, long height) +{ + // Setup the view of the CSG shape + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + gluPerspective(45.0, width / double(height), .1, 200.0); + glMatrixMode(GL_MODELVIEW); +} + +bool enable_multisampling(bool e) +{ + if (!e) { glDisable(GL_MULTISAMPLE); return false; } + + GLint is_ms_context; + glGetIntegerv(GL_SAMPLE_BUFFERS, &is_ms_context); + + if (is_ms_context) { glEnable(GL_MULTISAMPLE); return true; } + else return false; +} + +}} // namespace Slic3r::GL diff --git a/sandboxes/opencsg/GLScene.hpp b/sandboxes/opencsg/GLScene.hpp new file mode 100644 index 0000000000..411b0db71d --- /dev/null +++ b/sandboxes/opencsg/GLScene.hpp @@ -0,0 +1,321 @@ +#ifndef GLSCENE_HPP +#define GLSCENE_HPP + +#include +#include + +#include +#include +#include +#include +#include + +namespace Slic3r { + +class SLAPrint; + +namespace GL { + +template using shptr = std::shared_ptr; +template using uqptr = std::unique_ptr; +template using wkptr = std::weak_ptr; + +template> +using Collection = std::vector; + +template void cleanup(Collection> &listeners) { + auto it = std::remove_if(listeners.begin(), listeners.end(), + [](auto &l) { return !l.lock(); }); + listeners.erase(it, listeners.end()); +} + +template +void call(F &&f, Collection> &listeners, Args&&... args) { + for (auto &l : listeners) + if (auto p = l.lock()) ((p.get())->*f)(std::forward(args)...); +} + +class MouseInput +{ +public: + + enum WheelAxis { + waVertical, waHorizontal + }; + + class Listener { + public: + + virtual ~Listener() = default; + + virtual void on_left_click_down() {} + virtual void on_left_click_up() {} + virtual void on_right_click_down() {} + virtual void on_right_click_up() {} + virtual void on_double_click() {} + virtual void on_scroll(long /*v*/, long /*delta*/, WheelAxis ) {} + virtual void on_moved_to(long /*x*/, long /*y*/) {} + }; + +private: + Collection> m_listeners; + +public: + virtual ~MouseInput() = default; + + virtual void left_click_down() + { + call(&Listener::on_left_click_down, m_listeners); + } + virtual void left_click_up() + { + call(&Listener::on_left_click_up, m_listeners); + } + virtual void right_click_down() + { + call(&Listener::on_right_click_down, m_listeners); + } + virtual void right_click_up() + { + call(&Listener::on_right_click_up, m_listeners); + } + virtual void double_click() + { + call(&Listener::on_double_click, m_listeners); + } + virtual void scroll(long v, long d, WheelAxis wa) + { + call(&Listener::on_scroll, m_listeners, v, d, wa); + } + virtual void move_to(long x, long y) + { + call(&Listener::on_moved_to, m_listeners, x, y); + } + + void add_listener(shptr listener) + { + m_listeners.emplace_back(listener); + cleanup(m_listeners); + } +}; + +class IndexedVertexArray { +public: + ~IndexedVertexArray() { release_geometry(); } + + // Vertices and their normals, interleaved to be used by void + // glInterleavedArrays(GL_N3F_V3F, 0, x) + Collection vertices_and_normals_interleaved; + Collection triangle_indices; + Collection quad_indices; + + // When the geometry data is loaded into the graphics card as Vertex + // Buffer Objects, the above mentioned std::vectors are cleared and the + // following variables keep their original length. + size_t vertices_and_normals_interleaved_size{ 0 }; + size_t triangle_indices_size{ 0 }; + size_t quad_indices_size{ 0 }; + + // IDs of the Vertex Array Objects, into which the geometry has been loaded. + // Zero if the VBOs are not sent to GPU yet. + unsigned int vertices_and_normals_interleaved_VBO_id{ 0 }; + unsigned int triangle_indices_VBO_id{ 0 }; + unsigned int quad_indices_VBO_id{ 0 }; + + + void push_geometry(float x, float y, float z, float nx, float ny, float nz); + + inline void push_geometry( + double x, double y, double z, double nx, double ny, double nz) + { + push_geometry(float(x), float(y), float(z), float(nx), float(ny), float(nz)); + } + + inline void push_geometry(const Vec3d &p, const Vec3d &n) + { + push_geometry(p(0), p(1), p(2), n(0), n(1), n(2)); + } + + void push_triangle(int idx1, int idx2, int idx3); + + void load_mesh(const TriangleMesh &mesh); + + inline bool has_VBOs() const + { + return vertices_and_normals_interleaved_VBO_id != 0; + } + + // Finalize the initialization of the geometry & indices, + // upload the geometry and indices to OpenGL VBO objects + // and shrink the allocated data, possibly relasing it if it has been + // loaded into the VBOs. + void finalize_geometry(); + // Release the geometry data, release OpenGL VBOs. + void release_geometry(); + + void render() const; + + // Is there any geometry data stored? + bool empty() const { return vertices_and_normals_interleaved_size == 0; } + + void clear(); + + // Shrink the internal storage to tighly fit the data stored. + void shrink_to_fit(); +}; + +bool enable_multisampling(bool e = true); +void renderfps(); + +class Primitive : public OpenCSG::Primitive +{ + IndexedVertexArray m_geom; + Geometry::Transformation m_trafo; +public: + + using OpenCSG::Primitive::Primitive; + + Primitive() : OpenCSG::Primitive(OpenCSG::Intersection, 1) {} + + void render(); + + void translation(const Vec3d &offset) { m_trafo.set_offset(offset); } + void rotation(const Vec3d &rot) { m_trafo.set_rotation(rot); } + void scale(const Vec3d &scaleing) { m_trafo.set_scaling_factor(scaleing); } + void scale(double s) { scale({s, s, s}); } + + inline void load_mesh(const TriangleMesh &mesh) { + m_geom.load_mesh(mesh); + m_geom.finalize_geometry(); + } +}; + +class Scene; + +class Camera { +protected: + Vec2f m_rot = {0., 0.}; + Vec3d m_referene = {0., 0., 0.}; + double m_zoom = 0.; + double m_clip_z = 0.; +public: + + virtual ~Camera() = default; + + virtual void view(); + virtual void set_screen(long width, long height) = 0; + + void set_rotation(const Vec2f &rotation) { m_rot = rotation; } + void rotate(const Vec2f &rotation) { m_rot += rotation; } + void set_zoom(double z) { m_zoom = z; } + void set_reference_point(const Vec3d &p) { m_referene = p; } + void set_clip_z(double z) { m_clip_z = z; } +}; + +class PerspectiveCamera: public Camera { +public: + + void set_screen(long width, long height) override; +}; + +class CSGSettings { + OpenCSG::Algorithm m_csgalg = OpenCSG::Algorithm::Automatic; +public: + void set_csg_algo(OpenCSG::Algorithm alg); +}; + +class Display : public std::enable_shared_from_this, + public MouseInput::Listener +{ +protected: + shptr m_scene; + long m_wheel_pos = 0; + Vec2i m_mouse_pos, m_mouse_pos_rprev, m_mouse_pos_lprev; + Vec2i m_size; + bool m_initialized = false, m_left_btn = false, m_right_btn = false; + + CSGSettings m_csgsettings; + + shptr m_camera; + +public: + Display(shptr scene = nullptr, shptr camera = nullptr) + : m_scene(scene) + , m_camera(camera ? camera : std::make_shared()) + {} + + virtual void swap_buffers() = 0; + + virtual void set_active(long width, long height); + + virtual void repaint(long width, long height); + void repaint() { repaint(m_size.x(), m_size.y()); } + + void set_scene(shptr scene); + shptr get_scene() { return m_scene; } + + bool is_initialized() const { return m_initialized; } + + void on_scroll(long v, long d, MouseInput::WheelAxis wa) override; + void on_moved_to(long x, long y) override; + void on_left_click_down() override { m_left_btn = true; } + void on_left_click_up() override { m_left_btn = false; } + void on_right_click_down() override { m_right_btn = true; } + void on_right_click_up() override { m_right_btn = false; } + + void move_clip_plane(double z) { m_camera->set_clip_z(z); } + + const CSGSettings & csgsettings() const { return m_csgsettings; } + void csgsettings(const CSGSettings &settings) { m_csgsettings = settings; } + + virtual void on_scene_updated(); + virtual void clear_screen(); + virtual void render_scene(); +}; + +class Scene: public MouseInput::Listener +{ + Collection> m_primitives; + Collection m_primitives_free; + Collection m_primitives_csg; + + uqptr m_print; +public: + + Scene(); + ~Scene(); + + const Collection& free_primitives() const + { + return m_primitives_free; + } + + const Collection& csg_primitives() const + { + return m_primitives_csg; + } + + void add_display(shptr disp) + { + m_displays.emplace_back(disp); + cleanup(m_displays); + } + + void set_print(uqptr &&print); + + BoundingBoxf3 get_bounding_box() const; + +protected: + + shptr add_mesh(const TriangleMesh &mesh); + shptr add_mesh(const TriangleMesh &mesh, + OpenCSG::Operation op, + unsigned covexity); + +private: + + Collection> m_displays; +}; + +}} // namespace Slic3r::GL +#endif // GLSCENE_HPP diff --git a/sandboxes/opencsg/main.cpp b/sandboxes/opencsg/main.cpp new file mode 100644 index 0000000000..f2e9dc6c1b --- /dev/null +++ b/sandboxes/opencsg/main.cpp @@ -0,0 +1,195 @@ +#include +#include +#include + +#include + +#include +// For compilers that support precompilation, includes "wx/wx.h". +#include +#ifndef WX_PRECOMP + #include +#endif + +#include +#include +#include +#include + +#include "Canvas.hpp" +#include "GLScene.hpp" + +#include "libslic3r/Model.hpp" +#include "libslic3r/Format/3mf.hpp" +#include "libslic3r/SLAPrint.hpp" + +#include "slic3r/GUI/Job.hpp" +#include "slic3r/GUI/ProgressStatusBar.hpp" +//#include "slic3r/GUI/3DEngine.hpp" + +using namespace Slic3r::GL; + +class MyFrame: public wxFrame +{ + std::shared_ptr m_canvas; + std::shared_ptr m_stbar; + std::unique_ptr m_ui_job; + + class SLAJob: public Slic3r::GUI::Job { + MyFrame *m_parent; + std::unique_ptr m_print; + std::string m_fname; + public: + + SLAJob(MyFrame *frame, const std::string &fname) + : Slic3r::GUI::Job{frame->m_stbar} + , m_parent{frame} + , m_fname{fname} + { + } + + void process() override + { + using Status = Slic3r::PrintBase::SlicingStatus; + + Slic3r::DynamicPrintConfig cfg; + auto model = Slic3r::Model::read_from_file(m_fname, &cfg); + + m_print = std::make_unique(); + m_print->apply(model, cfg); + + m_print->set_status_callback([this](const Status &status) { + update_status(status.percent, status.text); + }); + + m_print->process(); + } + + protected: + + void finalize() override + { + m_parent->m_canvas->get_scene()->set_print(std::move(m_print)); + m_parent->m_stbar->set_status_text( + wxString::Format("Model %s loaded.", m_fname)); + } + }; + +public: + MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size): + wxFrame(nullptr, wxID_ANY, title, pos, size) + { + wxMenu *menuFile = new wxMenu; + menuFile->Append(wxID_OPEN); + menuFile->Append(wxID_EXIT); + wxMenuBar *menuBar = new wxMenuBar; + menuBar->Append( menuFile, "&File" ); + SetMenuBar( menuBar ); + + m_stbar = std::make_shared(this); + m_stbar->embed(this); + + SetStatusText( "Welcome to wxWidgets!" ); + + int attribList[] = + {WX_GL_RGBA, WX_GL_DOUBLEBUFFER, + // RGB channels each should be allocated with 8 bit depth. One + // should almost certainly get these bit depths by default. + WX_GL_MIN_RED, 8, WX_GL_MIN_GREEN, 8, WX_GL_MIN_BLUE, 8, + // Requesting an 8 bit alpha channel. Interestingly, the NVIDIA + // drivers would most likely work with some alpha plane, but + // glReadPixels would not return the alpha channel on NVIDIA if + // not requested when the GL context is created. + WX_GL_MIN_ALPHA, 8, WX_GL_DEPTH_SIZE, 8, WX_GL_STENCIL_SIZE, 8, WX_GL_SAMPLE_BUFFERS, + GL_TRUE, WX_GL_SAMPLES, 4, 0}; + + m_canvas = std::make_shared(this, wxID_ANY, attribList, + wxDefaultPosition, wxDefaultSize, + wxWANTS_CHARS | wxFULL_REPAINT_ON_RESIZE); + + wxPanel *control_panel = new wxPanel(this); + auto controlsizer = new wxBoxSizer(wxHORIZONTAL); + auto slider_sizer = new wxBoxSizer(wxVERTICAL); + auto console_sizer = new wxBoxSizer(wxVERTICAL); + + auto slider = new wxSlider(control_panel, wxID_ANY, 0, 0, 100, wxDefaultPosition, wxDefaultSize, wxSL_VERTICAL); + auto toggle = new wxToggleButton(control_panel, wxID_ANY, "Multisampling"); + wxString algorithms [] = {"Default", "Different"}; + auto alg_select = new wxComboBox(control_panel, wxID_ANY, "Default", wxDefaultPosition, wxDefaultSize, 2, algorithms); + + slider_sizer->Add(slider, 1, wxEXPAND); + console_sizer->Add(toggle, 0, wxALL, 5); + console_sizer->Add(alg_select, 0, wxALL, 5); + controlsizer->Add(slider_sizer, 0, wxEXPAND); + controlsizer->Add(console_sizer, 1, wxEXPAND); + control_panel->SetSizer(controlsizer); + + auto sizer = new wxBoxSizer(wxHORIZONTAL); + sizer->Add(m_canvas.get(), 1, wxEXPAND); + sizer->Add(control_panel, 0, wxEXPAND); + SetSizer(sizer); + + Bind(wxEVT_MENU, &MyFrame::OnOpen, this, wxID_OPEN); + Bind(wxEVT_MENU, &MyFrame::OnExit, this, wxID_EXIT); + Bind(wxEVT_SHOW, &MyFrame::OnShown, this, GetId()); + Bind(wxEVT_SLIDER, [this, slider](wxCommandEvent &) { + m_canvas->move_clip_plane(double(slider->GetValue())); + }, slider->GetId()); + + Bind(wxEVT_TOGGLEBUTTON, [this, toggle](wxCommandEvent &){ + enable_multisampling(toggle->GetValue()); + m_canvas->repaint(); + }, toggle->GetId()); + + m_canvas->set_scene(std::make_shared()); + } + +private: + + void OnExit(wxCommandEvent& /*event*/) + { + RemoveChild(m_canvas.get()); + m_canvas->Destroy(); + Close( true ); + } + + void OnOpen(wxCommandEvent &/*evt*/) + { + wxFileDialog dlg(this, "Select project file", + wxEmptyString, wxEmptyString, "*.3mf"); + + if (dlg.ShowModal() == wxID_OK) + { + m_ui_job = std::make_unique(this, dlg.GetPath().ToStdString()); + m_ui_job->start(); + } + } + + void OnShown(wxShowEvent&) + { + const wxSize ClientSize = GetClientSize(); + m_canvas->set_active(ClientSize.x, ClientSize.y); + + m_canvas->repaint(ClientSize.x, ClientSize.y); + + // Do the repaint continuously + Bind(wxEVT_IDLE, [this](wxIdleEvent &evt) { + m_canvas->repaint(); + evt.RequestMore(); + }); + } +}; + +class App : public wxApp { + MyFrame *m_frame; +public: + bool OnInit() override { + + m_frame = new MyFrame( "PrusaSlicer OpenCSG Demo", wxDefaultPosition, wxSize(1024, 768) ); + m_frame->Show( true ); + + return true; + } +}; + +wxIMPLEMENT_APP(App); diff --git a/src/libslic3r/SLA/Hollowing.cpp b/src/libslic3r/SLA/Hollowing.cpp index 46e60f91cb..2b35722478 100644 --- a/src/libslic3r/SLA/Hollowing.cpp +++ b/src/libslic3r/SLA/Hollowing.cpp @@ -5,6 +5,7 @@ #include #include #include +#include #include @@ -120,6 +121,17 @@ std::unique_ptr generate_interior(const TriangleMesh & mesh, hc.closing_distance)); } +Contour3D DrainHole::to_mesh() const +{ + auto r = double(radius); + auto h = double(height); + sla::Contour3D hole = sla::cylinder(r, h); + Eigen::Quaterniond q; + q.setFromTwoVectors(Vec3d{0., 0., 1.}, normal.cast()); + for(auto& p : hole.points) p = q * p + pos.cast(); + return hole; +} + bool DrainHole::operator==(const DrainHole &sp) const { return (pos == sp.pos) && (normal == sp.normal) && @@ -131,7 +143,7 @@ bool DrainHole::is_inside(const Vec3f& pt) const { Eigen::Hyperplane plane(normal, pos); float dist = plane.signedDistance(pt); - if (dist < EPSILON || dist > height) + if (dist < float(EPSILON) || dist > height) return false; Eigen::ParametrizedLine axis(pos, normal); diff --git a/src/libslic3r/SLA/Hollowing.hpp b/src/libslic3r/SLA/Hollowing.hpp index d5c0d49fc8..ba1eb2d622 100644 --- a/src/libslic3r/SLA/Hollowing.hpp +++ b/src/libslic3r/SLA/Hollowing.hpp @@ -3,6 +3,7 @@ #include #include +#include #include namespace Slic3r { @@ -42,6 +43,8 @@ struct DrainHole bool get_intersections(const Vec3f& s, const Vec3f& dir, std::array, 2>& out) const; + Contour3D to_mesh() const; + template inline void serialize(Archive &ar) { ar(pos, normal, radius, height); From b1186e339dd7b756d5995f2e74de7fdc6144d696 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Mon, 16 Dec 2019 12:36:44 +0100 Subject: [PATCH 071/336] Added opencsg parameter console --- sandboxes/opencsg/GLScene.cpp | 9 +++++- sandboxes/opencsg/GLScene.hpp | 15 +++++++-- sandboxes/opencsg/main.cpp | 59 +++++++++++++++++++++++++++++------ 3 files changed, 70 insertions(+), 13 deletions(-) diff --git a/sandboxes/opencsg/GLScene.cpp b/sandboxes/opencsg/GLScene.cpp index 5f4a205327..60eb0ce03b 100644 --- a/sandboxes/opencsg/GLScene.cpp +++ b/sandboxes/opencsg/GLScene.cpp @@ -454,7 +454,14 @@ void Display::on_moved_to(long x, long y) m_mouse_pos = {x, y}; } -void CSGSettings::set_csg_algo(OpenCSG::Algorithm alg) { m_csgalg = alg; } +void Display::apply_csgsettings(const CSGSettings &settings) +{ + using namespace OpenCSG; + m_csgsettings = settings; + setOption(AlgorithmSetting, m_csgsettings.get_algo()); + setOption(DepthComplexitySetting, m_csgsettings.get_depth_algo()); + setOption(DepthBoundsOptimization, m_csgsettings.get_optimization()); +} void Display::on_scene_updated() { diff --git a/sandboxes/opencsg/GLScene.hpp b/sandboxes/opencsg/GLScene.hpp index 411b0db71d..6beecb79a6 100644 --- a/sandboxes/opencsg/GLScene.hpp +++ b/sandboxes/opencsg/GLScene.hpp @@ -220,8 +220,17 @@ public: class CSGSettings { OpenCSG::Algorithm m_csgalg = OpenCSG::Algorithm::Automatic; + OpenCSG::DepthComplexityAlgorithm m_depth_algo = OpenCSG::DepthComplexityAlgorithm::NoDepthComplexitySampling; + OpenCSG::Optimization m_optim = OpenCSG::Optimization::OptimizationDefault; public: - void set_csg_algo(OpenCSG::Algorithm alg); + int get_algo() const { return int(m_csgalg); } + void set_algo(OpenCSG::Algorithm alg) { m_csgalg = alg; } + + int get_depth_algo() const { return int(m_depth_algo); } + void set_depth_algo(OpenCSG::DepthComplexityAlgorithm alg) { m_depth_algo = alg; } + + int get_optimization() const { return int(m_optim); } + void set_optimization(OpenCSG::Optimization o) { m_optim = o; } }; class Display : public std::enable_shared_from_this, @@ -265,8 +274,8 @@ public: void move_clip_plane(double z) { m_camera->set_clip_z(z); } - const CSGSettings & csgsettings() const { return m_csgsettings; } - void csgsettings(const CSGSettings &settings) { m_csgsettings = settings; } + const CSGSettings & get_csgsettings() const { return m_csgsettings; } + void apply_csgsettings(const CSGSettings &settings); virtual void on_scene_updated(); virtual void clear_screen(); diff --git a/sandboxes/opencsg/main.cpp b/sandboxes/opencsg/main.cpp index f2e9dc6c1b..8c106fa85c 100644 --- a/sandboxes/opencsg/main.cpp +++ b/sandboxes/opencsg/main.cpp @@ -100,8 +100,8 @@ public: // drivers would most likely work with some alpha plane, but // glReadPixels would not return the alpha channel on NVIDIA if // not requested when the GL context is created. - WX_GL_MIN_ALPHA, 8, WX_GL_DEPTH_SIZE, 8, WX_GL_STENCIL_SIZE, 8, WX_GL_SAMPLE_BUFFERS, - GL_TRUE, WX_GL_SAMPLES, 4, 0}; + WX_GL_MIN_ALPHA, 8, WX_GL_DEPTH_SIZE, 8, WX_GL_STENCIL_SIZE, 8, + WX_GL_SAMPLE_BUFFERS, GL_TRUE, WX_GL_SAMPLES, 4, 0}; m_canvas = std::make_shared(this, wxID_ANY, attribList, wxDefaultPosition, wxDefaultSize, @@ -111,17 +111,33 @@ public: auto controlsizer = new wxBoxSizer(wxHORIZONTAL); auto slider_sizer = new wxBoxSizer(wxVERTICAL); auto console_sizer = new wxBoxSizer(wxVERTICAL); - + auto slider = new wxSlider(control_panel, wxID_ANY, 0, 0, 100, wxDefaultPosition, wxDefaultSize, wxSL_VERTICAL); - auto toggle = new wxToggleButton(control_panel, wxID_ANY, "Multisampling"); - wxString algorithms [] = {"Default", "Different"}; - auto alg_select = new wxComboBox(control_panel, wxID_ANY, "Default", wxDefaultPosition, wxDefaultSize, 2, algorithms); - slider_sizer->Add(slider, 1, wxEXPAND); - console_sizer->Add(toggle, 0, wxALL, 5); - console_sizer->Add(alg_select, 0, wxALL, 5); + + auto toggle = new wxToggleButton(control_panel, wxID_ANY, "Multisampling"); + console_sizer->Add(toggle, 0, wxALL | wxEXPAND, 5); + + auto add_combobox = [control_panel, console_sizer] + (const wxString &label, std::vector &&list) { + auto widget = new wxComboBox(control_panel, wxID_ANY, list[0], + wxDefaultPosition, wxDefaultSize, + int(list.size()), list.data()); + auto sz = new wxBoxSizer(wxHORIZONTAL); + sz->Add(new wxStaticText(control_panel, wxID_ANY, label), 0, wxALL | wxALIGN_CENTER, 5); + sz->Add(widget, 1, wxALL | wxEXPAND, 5); + console_sizer->Add(sz, 0, wxEXPAND); + return widget; + }; + + auto alg_select = add_combobox("Algorithm", {"Auto", "Goldfeather", "SCS"}); + auto depth_select = add_combobox("Depth Complexity", {"Off", "OcclusionQuery", "On"}); + depth_select->Disable(); + auto optimization_select = add_combobox("Optimization", { "Default", "ForceOn", "On", "Off" }); + controlsizer->Add(slider_sizer, 0, wxEXPAND); controlsizer->Add(console_sizer, 1, wxEXPAND); + control_panel->SetSizer(controlsizer); auto sizer = new wxBoxSizer(wxHORIZONTAL); @@ -141,6 +157,31 @@ public: m_canvas->repaint(); }, toggle->GetId()); + Bind(wxEVT_COMBOBOX, [this, alg_select, depth_select](wxCommandEvent &) + { + int sel = alg_select->GetSelection(); + depth_select->Enable(sel > 0); + CSGSettings settings = m_canvas->get_csgsettings(); + settings.set_algo(OpenCSG::Algorithm(sel)); + m_canvas->apply_csgsettings(settings); + }, alg_select->GetId()); + + Bind(wxEVT_COMBOBOX, [this, depth_select](wxCommandEvent &) + { + int sel = depth_select->GetSelection(); + CSGSettings settings = m_canvas->get_csgsettings(); + settings.set_depth_algo(OpenCSG::DepthComplexityAlgorithm(sel)); + m_canvas->apply_csgsettings(settings); + }, depth_select->GetId()); + + Bind(wxEVT_COMBOBOX, [this, optimization_select](wxCommandEvent &) + { + int sel = optimization_select->GetSelection(); + CSGSettings settings = m_canvas->get_csgsettings(); + settings.set_optimization(OpenCSG::Optimization(sel)); + m_canvas->apply_csgsettings(settings); + }, depth_select->GetId()); + m_canvas->set_scene(std::make_shared()); } From 878f8a8ead6ffa4b53e77b3dd7ff226dc74fe0b1 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Mon, 16 Dec 2019 14:04:26 +0100 Subject: [PATCH 072/336] Add convexity to csgsettings. Defer all rendering to Display. --- sandboxes/opencsg/GLScene.cpp | 143 ++++++++++++++++++++-------------- sandboxes/opencsg/GLScene.hpp | 51 ++++++------ sandboxes/opencsg/main.cpp | 65 +++++++++++++--- 3 files changed, 169 insertions(+), 90 deletions(-) diff --git a/sandboxes/opencsg/GLScene.cpp b/sandboxes/opencsg/GLScene.cpp index 60eb0ce03b..5037ef6a54 100644 --- a/sandboxes/opencsg/GLScene.cpp +++ b/sandboxes/opencsg/GLScene.cpp @@ -99,13 +99,15 @@ void Display::render_scene() GLfloat color[] = {1.f, 1.f, 0.f, 0.f}; glsafe(::glColor4fv(color)); - OpenCSG::render(m_scene->csg_primitives()); + if (m_csgsettings.is_enabled()) { + OpenCSG::render(m_scene_cache.primitives_csg); + glDepthFunc(GL_EQUAL); + } - glDepthFunc(GL_EQUAL); - for (auto& p : m_scene->csg_primitives()) p->render(); - glDepthFunc(GL_LESS); + for (auto& p : m_scene_cache.primitives_csg) p->render(); + if (m_csgsettings.is_enabled()) glDepthFunc(GL_LESS); - for (auto& p : m_scene->free_primitives()) p->render(); + for (auto& p : m_scene_cache.primitives_free) p->render(); glFlush(); } @@ -127,53 +129,8 @@ std::vector transform_pts( } void Scene::set_print(uqptr &&print) -{ +{ m_print = std::move(print); - - for (const SLAPrintObject *po : m_print->objects()) { - const ModelObject *mo = po->model_object(); - TriangleMesh msh = mo->raw_mesh(); - - sla::DrainHoles holedata = mo->sla_drain_holes; - - for (const ModelInstance *mi : mo->instances) { - - TriangleMesh mshinst = msh; - auto interior = po->hollowed_interior_mesh(); - interior.transform(po->trafo().inverse()); - - mshinst.merge(interior); - mshinst.require_shared_vertices(); - - mi->transform_mesh(&mshinst); - - auto bb = mshinst.bounding_box(); - auto center = bb.center().cast(); - mshinst.translate(-center); - - mshinst.require_shared_vertices(); - add_mesh(mshinst, OpenCSG::Intersection, 15); - - auto tr = Transform3f::Identity(); - tr.translate(-center); - - transform_pts(holedata.begin(), holedata.end(), tr, - [](const sla::DrainHole &dh) { - return dh.pos; - }); - - transform_pts(holedata.begin(), holedata.end(), tr, - [](const sla::DrainHole &dh) { - return dh.normal; - }); - } - - for (const sla::DrainHole &holept : holedata) { - TriangleMesh holemesh = sla::to_triangle_mesh(holept.to_mesh()); - holemesh.require_shared_vertices(); - add_mesh(holemesh, OpenCSG::Subtraction, 1); - } - } // Notify displays call(&Display::on_scene_updated, m_displays); @@ -184,21 +141,30 @@ BoundingBoxf3 Scene::get_bounding_box() const return m_print->model().bounding_box(); } -shptr Scene::add_mesh(const TriangleMesh &mesh) +void Display::SceneCache::clear() +{ + primitives_csg.clear(); + primitives_free.clear(); + primitives.clear(); +} + +shptr Display::SceneCache::add_mesh(const TriangleMesh &mesh) { auto p = std::make_shared(); p->load_mesh(mesh); - m_primitives.emplace_back(p); - m_primitives_free.emplace_back(p.get()); + primitives.emplace_back(p); + primitives_free.emplace_back(p.get()); return p; } -shptr Scene::add_mesh(const TriangleMesh &mesh, OpenCSG::Operation o, unsigned c) +shptr Display::SceneCache::add_mesh(const TriangleMesh &mesh, + OpenCSG::Operation o, + unsigned c) { auto p = std::make_shared(o, c); p->load_mesh(mesh); - m_primitives.emplace_back(p); - m_primitives_csg.emplace_back(p.get()); + primitives.emplace_back(p); + primitives_csg.emplace_back(p.get()); return p; } @@ -457,18 +423,79 @@ void Display::on_moved_to(long x, long y) void Display::apply_csgsettings(const CSGSettings &settings) { using namespace OpenCSG; + + bool update = m_csgsettings.get_convexity() != settings.get_convexity(); + m_csgsettings = settings; setOption(AlgorithmSetting, m_csgsettings.get_algo()); setOption(DepthComplexitySetting, m_csgsettings.get_depth_algo()); setOption(DepthBoundsOptimization, m_csgsettings.get_optimization()); + + if (update) on_scene_updated(); + + repaint(); } void Display::on_scene_updated() { + const SLAPrint *print = m_scene->get_print(); + if (!print) return; + + { auto bb = m_scene->get_bounding_box(); double d = std::max(std::max(bb.size().x(), bb.size().y()), bb.size().z()); m_wheel_pos = long(2 * d); m_camera->set_zoom(m_wheel_pos); + } + + m_scene_cache.clear(); + + for (const SLAPrintObject *po : print->objects()) { + const ModelObject *mo = po->model_object(); + TriangleMesh msh = mo->raw_mesh(); + + sla::DrainHoles holedata = mo->sla_drain_holes; + + for (const ModelInstance *mi : mo->instances) { + + TriangleMesh mshinst = msh; + auto interior = po->hollowed_interior_mesh(); + interior.transform(po->trafo().inverse()); + + mshinst.merge(interior); + mshinst.require_shared_vertices(); + + mi->transform_mesh(&mshinst); + + auto bb = mshinst.bounding_box(); + auto center = bb.center().cast(); + mshinst.translate(-center); + + mshinst.require_shared_vertices(); + m_scene_cache.add_mesh(mshinst, OpenCSG::Intersection, + m_csgsettings.get_convexity()); + + auto tr = Transform3f::Identity(); + tr.translate(-center); + + transform_pts(holedata.begin(), holedata.end(), tr, + [](const sla::DrainHole &dh) { + return dh.pos; + }); + + transform_pts(holedata.begin(), holedata.end(), tr, + [](const sla::DrainHole &dh) { + return dh.normal; + }); + } + + for (const sla::DrainHole &holept : holedata) { + TriangleMesh holemesh = sla::to_triangle_mesh(holept.to_mesh()); + holemesh.require_shared_vertices(); + m_scene_cache.add_mesh(holemesh, OpenCSG::Subtraction, 1); + } + } + repaint(); } @@ -513,4 +540,6 @@ bool enable_multisampling(bool e) else return false; } +MouseInput::Listener::~Listener() = default; + }} // namespace Slic3r::GL diff --git a/sandboxes/opencsg/GLScene.hpp b/sandboxes/opencsg/GLScene.hpp index 6beecb79a6..a127ab90be 100644 --- a/sandboxes/opencsg/GLScene.hpp +++ b/sandboxes/opencsg/GLScene.hpp @@ -45,8 +45,7 @@ public: class Listener { public: - - virtual ~Listener() = default; + virtual ~Listener(); virtual void on_left_click_down() {} virtual void on_left_click_up() {} @@ -219,9 +218,16 @@ public: }; class CSGSettings { +public: + static const constexpr unsigned DEFAULT_CONVEXITY = 10; + +private: OpenCSG::Algorithm m_csgalg = OpenCSG::Algorithm::Automatic; OpenCSG::DepthComplexityAlgorithm m_depth_algo = OpenCSG::DepthComplexityAlgorithm::NoDepthComplexitySampling; OpenCSG::Optimization m_optim = OpenCSG::Optimization::OptimizationDefault; + bool m_enable = true; + unsigned int m_convexity = DEFAULT_CONVEXITY; + public: int get_algo() const { return int(m_csgalg); } void set_algo(OpenCSG::Algorithm alg) { m_csgalg = alg; } @@ -231,6 +237,12 @@ public: int get_optimization() const { return int(m_optim); } void set_optimization(OpenCSG::Optimization o) { m_optim = o; } + + void enable_csg(bool en = true) { m_enable = en; } + bool is_enabled() const { return m_enable; } + + unsigned get_convexity() const { return m_convexity; } + void set_convexity(unsigned c) { m_convexity = c; } }; class Display : public std::enable_shared_from_this, @@ -247,6 +259,19 @@ protected: shptr m_camera; + struct SceneCache { + Collection> primitives; + Collection primitives_free; + Collection primitives_csg; + + void clear(); + + shptr add_mesh(const TriangleMesh &mesh); + shptr add_mesh(const TriangleMesh &mesh, + OpenCSG::Operation op, + unsigned covexity); + } m_scene_cache; + public: Display(shptr scene = nullptr, shptr camera = nullptr) : m_scene(scene) @@ -284,26 +309,12 @@ public: class Scene: public MouseInput::Listener { - Collection> m_primitives; - Collection m_primitives_free; - Collection m_primitives_csg; - uqptr m_print; public: Scene(); ~Scene(); - const Collection& free_primitives() const - { - return m_primitives_free; - } - - const Collection& csg_primitives() const - { - return m_primitives_csg; - } - void add_display(shptr disp) { m_displays.emplace_back(disp); @@ -311,16 +322,10 @@ public: } void set_print(uqptr &&print); + const SLAPrint * get_print() const { return m_print.get(); } BoundingBoxf3 get_bounding_box() const; -protected: - - shptr add_mesh(const TriangleMesh &mesh); - shptr add_mesh(const TriangleMesh &mesh, - OpenCSG::Operation op, - unsigned covexity); - private: Collection> m_displays; diff --git a/sandboxes/opencsg/main.cpp b/sandboxes/opencsg/main.cpp index 8c106fa85c..6274f264a1 100644 --- a/sandboxes/opencsg/main.cpp +++ b/sandboxes/opencsg/main.cpp @@ -14,6 +14,7 @@ #include #include #include +#include #include #include "Canvas.hpp" @@ -111,25 +112,53 @@ public: auto controlsizer = new wxBoxSizer(wxHORIZONTAL); auto slider_sizer = new wxBoxSizer(wxVERTICAL); auto console_sizer = new wxBoxSizer(wxVERTICAL); - - auto slider = new wxSlider(control_panel, wxID_ANY, 0, 0, 100, wxDefaultPosition, wxDefaultSize, wxSL_VERTICAL); + + auto slider = new wxSlider(control_panel, wxID_ANY, 0, 0, 100, + wxDefaultPosition, wxDefaultSize, + wxSL_VERTICAL); slider_sizer->Add(slider, 1, wxEXPAND); - auto toggle = new wxToggleButton(control_panel, wxID_ANY, "Multisampling"); - console_sizer->Add(toggle, 0, wxALL | wxEXPAND, 5); - + auto ms_toggle = new wxToggleButton(control_panel, wxID_ANY, "Multisampling"); + console_sizer->Add(ms_toggle, 0, wxALL | wxEXPAND, 5); + + auto csg_toggle = new wxToggleButton(control_panel, wxID_ANY, "CSG"); + csg_toggle->SetValue(true); + console_sizer->Add(csg_toggle, 0, wxALL | wxEXPAND, 5); + auto add_combobox = [control_panel, console_sizer] - (const wxString &label, std::vector &&list) { + (const wxString &label, std::vector &&list) + { auto widget = new wxComboBox(control_panel, wxID_ANY, list[0], wxDefaultPosition, wxDefaultSize, int(list.size()), list.data()); + auto sz = new wxBoxSizer(wxHORIZONTAL); - sz->Add(new wxStaticText(control_panel, wxID_ANY, label), 0, wxALL | wxALIGN_CENTER, 5); + sz->Add(new wxStaticText(control_panel, wxID_ANY, label), 0, + wxALL | wxALIGN_CENTER, 5); sz->Add(widget, 1, wxALL | wxEXPAND, 5); console_sizer->Add(sz, 0, wxEXPAND); return widget; }; + auto add_spinctl = [control_panel, console_sizer] + (const wxString &label, int initial, int min, int max) + { + auto widget = new wxSpinCtrl( + control_panel, wxID_ANY, + wxString::Format("%d", initial), + wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, min, max, + initial); + + auto sz = new wxBoxSizer(wxHORIZONTAL); + sz->Add(new wxStaticText(control_panel, wxID_ANY, label), 0, + wxALL | wxALIGN_CENTER, 5); + sz->Add(widget, 1, wxALL | wxEXPAND, 5); + console_sizer->Add(sz, 0, wxEXPAND); + return widget; + }; + + auto convexity_spin = add_spinctl("Convexity", CSGSettings::DEFAULT_CONVEXITY, 0, 100); + auto alg_select = add_combobox("Algorithm", {"Auto", "Goldfeather", "SCS"}); auto depth_select = add_combobox("Depth Complexity", {"Off", "OcclusionQuery", "On"}); depth_select->Disable(); @@ -152,10 +181,16 @@ public: m_canvas->move_clip_plane(double(slider->GetValue())); }, slider->GetId()); - Bind(wxEVT_TOGGLEBUTTON, [this, toggle](wxCommandEvent &){ - enable_multisampling(toggle->GetValue()); + Bind(wxEVT_TOGGLEBUTTON, [this, ms_toggle](wxCommandEvent &){ + enable_multisampling(ms_toggle->GetValue()); m_canvas->repaint(); - }, toggle->GetId()); + }, ms_toggle->GetId()); + + Bind(wxEVT_TOGGLEBUTTON, [this, csg_toggle](wxCommandEvent &){ + CSGSettings settings = m_canvas->get_csgsettings(); + settings.enable_csg(csg_toggle->GetValue()); + m_canvas->apply_csgsettings(settings); + }, csg_toggle->GetId()); Bind(wxEVT_COMBOBOX, [this, alg_select, depth_select](wxCommandEvent &) { @@ -182,6 +217,16 @@ public: m_canvas->apply_csgsettings(settings); }, depth_select->GetId()); + Bind(wxEVT_SPINCTRL, [this, convexity_spin](wxSpinEvent &) { + CSGSettings settings = m_canvas->get_csgsettings(); + int c = convexity_spin->GetValue(); + + if (c > 0) { + settings.set_convexity(unsigned(c)); + m_canvas->apply_csgsettings(settings); + } + }, convexity_spin->GetId()); + m_canvas->set_scene(std::make_shared()); } From 5aaddd82a44475c37f933d476a10351f03ddee01 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Mon, 16 Dec 2019 15:36:43 +0100 Subject: [PATCH 073/336] Remove bloat, add some clipping plane functionality. --- sandboxes/opencsg/Canvas.hpp | 14 +- sandboxes/opencsg/GLScene.cpp | 8 +- sandboxes/opencsg/main.cpp | 314 +++++++++++++++++----------------- 3 files changed, 168 insertions(+), 168 deletions(-) diff --git a/sandboxes/opencsg/Canvas.hpp b/sandboxes/opencsg/Canvas.hpp index 85d490ddf5..17fd8f0440 100644 --- a/sandboxes/opencsg/Canvas.hpp +++ b/sandboxes/opencsg/Canvas.hpp @@ -27,20 +27,8 @@ public: Slic3r::GL::Display::set_active(w, h); } - void repaint(long width, long height) override - { - Slic3r::GL::Display::repaint(width, height); - } - - using Slic3r::GL::Display::repaint; - void swap_buffers() override { SwapBuffers(); } - - void on_scroll(long v, long d, Slic3r::GL::MouseInput::WheelAxis wa) override - { - Slic3r::GL::Display::on_scroll(v, d, wa); - } - + template Canvas(Args &&...args): wxGLCanvas(std::forward(args)...) { diff --git a/sandboxes/opencsg/GLScene.cpp b/sandboxes/opencsg/GLScene.cpp index 5037ef6a54..02a4b79914 100644 --- a/sandboxes/opencsg/GLScene.cpp +++ b/sandboxes/opencsg/GLScene.cpp @@ -517,7 +517,13 @@ void Camera::view() glRotatef(m_rot.y(), 1.0, 0.0, 0.0); glRotatef(m_rot.x(), 0.0, 0.0, 1.0); - // glClipPlane() + if (m_clip_z > 0.) { + GLdouble plane[] = {0., 0., 1., m_clip_z}; + glClipPlane(GL_CLIP_PLANE0, plane); + glEnable(GL_CLIP_PLANE0); + } else { + glDisable(GL_CLIP_PLANE0); + } } void PerspectiveCamera::set_screen(long width, long height) diff --git a/sandboxes/opencsg/main.cpp b/sandboxes/opencsg/main.cpp index 6274f264a1..ac18e177d1 100644 --- a/sandboxes/opencsg/main.cpp +++ b/sandboxes/opencsg/main.cpp @@ -26,7 +26,6 @@ #include "slic3r/GUI/Job.hpp" #include "slic3r/GUI/ProgressStatusBar.hpp" -//#include "slic3r/GUI/3DEngine.hpp" using namespace Slic3r::GL; @@ -59,6 +58,10 @@ class MyFrame: public wxFrame m_print = std::make_unique(); m_print->apply(model, cfg); + Slic3r::PrintBase::TaskParams params; + params.to_object_step = Slic3r::slaposHollowing; + m_print->set_task(params); + m_print->set_status_callback([this](const Status &status) { update_status(status.percent, status.text); }); @@ -77,158 +80,7 @@ class MyFrame: public wxFrame }; public: - MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size): - wxFrame(nullptr, wxID_ANY, title, pos, size) - { - wxMenu *menuFile = new wxMenu; - menuFile->Append(wxID_OPEN); - menuFile->Append(wxID_EXIT); - wxMenuBar *menuBar = new wxMenuBar; - menuBar->Append( menuFile, "&File" ); - SetMenuBar( menuBar ); - - m_stbar = std::make_shared(this); - m_stbar->embed(this); - - SetStatusText( "Welcome to wxWidgets!" ); - - int attribList[] = - {WX_GL_RGBA, WX_GL_DOUBLEBUFFER, - // RGB channels each should be allocated with 8 bit depth. One - // should almost certainly get these bit depths by default. - WX_GL_MIN_RED, 8, WX_GL_MIN_GREEN, 8, WX_GL_MIN_BLUE, 8, - // Requesting an 8 bit alpha channel. Interestingly, the NVIDIA - // drivers would most likely work with some alpha plane, but - // glReadPixels would not return the alpha channel on NVIDIA if - // not requested when the GL context is created. - WX_GL_MIN_ALPHA, 8, WX_GL_DEPTH_SIZE, 8, WX_GL_STENCIL_SIZE, 8, - WX_GL_SAMPLE_BUFFERS, GL_TRUE, WX_GL_SAMPLES, 4, 0}; - - m_canvas = std::make_shared(this, wxID_ANY, attribList, - wxDefaultPosition, wxDefaultSize, - wxWANTS_CHARS | wxFULL_REPAINT_ON_RESIZE); - - wxPanel *control_panel = new wxPanel(this); - auto controlsizer = new wxBoxSizer(wxHORIZONTAL); - auto slider_sizer = new wxBoxSizer(wxVERTICAL); - auto console_sizer = new wxBoxSizer(wxVERTICAL); - - auto slider = new wxSlider(control_panel, wxID_ANY, 0, 0, 100, - wxDefaultPosition, wxDefaultSize, - wxSL_VERTICAL); - slider_sizer->Add(slider, 1, wxEXPAND); - - auto ms_toggle = new wxToggleButton(control_panel, wxID_ANY, "Multisampling"); - console_sizer->Add(ms_toggle, 0, wxALL | wxEXPAND, 5); - - auto csg_toggle = new wxToggleButton(control_panel, wxID_ANY, "CSG"); - csg_toggle->SetValue(true); - console_sizer->Add(csg_toggle, 0, wxALL | wxEXPAND, 5); - - auto add_combobox = [control_panel, console_sizer] - (const wxString &label, std::vector &&list) - { - auto widget = new wxComboBox(control_panel, wxID_ANY, list[0], - wxDefaultPosition, wxDefaultSize, - int(list.size()), list.data()); - - auto sz = new wxBoxSizer(wxHORIZONTAL); - sz->Add(new wxStaticText(control_panel, wxID_ANY, label), 0, - wxALL | wxALIGN_CENTER, 5); - sz->Add(widget, 1, wxALL | wxEXPAND, 5); - console_sizer->Add(sz, 0, wxEXPAND); - return widget; - }; - - auto add_spinctl = [control_panel, console_sizer] - (const wxString &label, int initial, int min, int max) - { - auto widget = new wxSpinCtrl( - control_panel, wxID_ANY, - wxString::Format("%d", initial), - wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, min, max, - initial); - - auto sz = new wxBoxSizer(wxHORIZONTAL); - sz->Add(new wxStaticText(control_panel, wxID_ANY, label), 0, - wxALL | wxALIGN_CENTER, 5); - sz->Add(widget, 1, wxALL | wxEXPAND, 5); - console_sizer->Add(sz, 0, wxEXPAND); - return widget; - }; - - auto convexity_spin = add_spinctl("Convexity", CSGSettings::DEFAULT_CONVEXITY, 0, 100); - - auto alg_select = add_combobox("Algorithm", {"Auto", "Goldfeather", "SCS"}); - auto depth_select = add_combobox("Depth Complexity", {"Off", "OcclusionQuery", "On"}); - depth_select->Disable(); - auto optimization_select = add_combobox("Optimization", { "Default", "ForceOn", "On", "Off" }); - - controlsizer->Add(slider_sizer, 0, wxEXPAND); - controlsizer->Add(console_sizer, 1, wxEXPAND); - - control_panel->SetSizer(controlsizer); - - auto sizer = new wxBoxSizer(wxHORIZONTAL); - sizer->Add(m_canvas.get(), 1, wxEXPAND); - sizer->Add(control_panel, 0, wxEXPAND); - SetSizer(sizer); - - Bind(wxEVT_MENU, &MyFrame::OnOpen, this, wxID_OPEN); - Bind(wxEVT_MENU, &MyFrame::OnExit, this, wxID_EXIT); - Bind(wxEVT_SHOW, &MyFrame::OnShown, this, GetId()); - Bind(wxEVT_SLIDER, [this, slider](wxCommandEvent &) { - m_canvas->move_clip_plane(double(slider->GetValue())); - }, slider->GetId()); - - Bind(wxEVT_TOGGLEBUTTON, [this, ms_toggle](wxCommandEvent &){ - enable_multisampling(ms_toggle->GetValue()); - m_canvas->repaint(); - }, ms_toggle->GetId()); - - Bind(wxEVT_TOGGLEBUTTON, [this, csg_toggle](wxCommandEvent &){ - CSGSettings settings = m_canvas->get_csgsettings(); - settings.enable_csg(csg_toggle->GetValue()); - m_canvas->apply_csgsettings(settings); - }, csg_toggle->GetId()); - - Bind(wxEVT_COMBOBOX, [this, alg_select, depth_select](wxCommandEvent &) - { - int sel = alg_select->GetSelection(); - depth_select->Enable(sel > 0); - CSGSettings settings = m_canvas->get_csgsettings(); - settings.set_algo(OpenCSG::Algorithm(sel)); - m_canvas->apply_csgsettings(settings); - }, alg_select->GetId()); - - Bind(wxEVT_COMBOBOX, [this, depth_select](wxCommandEvent &) - { - int sel = depth_select->GetSelection(); - CSGSettings settings = m_canvas->get_csgsettings(); - settings.set_depth_algo(OpenCSG::DepthComplexityAlgorithm(sel)); - m_canvas->apply_csgsettings(settings); - }, depth_select->GetId()); - - Bind(wxEVT_COMBOBOX, [this, optimization_select](wxCommandEvent &) - { - int sel = optimization_select->GetSelection(); - CSGSettings settings = m_canvas->get_csgsettings(); - settings.set_optimization(OpenCSG::Optimization(sel)); - m_canvas->apply_csgsettings(settings); - }, depth_select->GetId()); - - Bind(wxEVT_SPINCTRL, [this, convexity_spin](wxSpinEvent &) { - CSGSettings settings = m_canvas->get_csgsettings(); - int c = convexity_spin->GetValue(); - - if (c > 0) { - settings.set_convexity(unsigned(c)); - m_canvas->apply_csgsettings(settings); - } - }, convexity_spin->GetId()); - - m_canvas->set_scene(std::make_shared()); - } + MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size); private: @@ -270,8 +122,8 @@ class App : public wxApp { MyFrame *m_frame; public: bool OnInit() override { + m_frame = new MyFrame("PrusaSlicer OpenCSG Demo", wxDefaultPosition, wxSize(1024, 768)); - m_frame = new MyFrame( "PrusaSlicer OpenCSG Demo", wxDefaultPosition, wxSize(1024, 768) ); m_frame->Show( true ); return true; @@ -279,3 +131,157 @@ public: }; wxIMPLEMENT_APP(App); + +MyFrame::MyFrame(const wxString &title, const wxPoint &pos, const wxSize &size): + wxFrame(nullptr, wxID_ANY, title, pos, size) +{ + wxMenu *menuFile = new wxMenu; + menuFile->Append(wxID_OPEN); + menuFile->Append(wxID_EXIT); + wxMenuBar *menuBar = new wxMenuBar; + menuBar->Append( menuFile, "&File" ); + SetMenuBar( menuBar ); + + m_stbar = std::make_shared(this); + m_stbar->embed(this); + + SetStatusText( "Welcome to wxWidgets!" ); + + int attribList[] = + {WX_GL_RGBA, WX_GL_DOUBLEBUFFER, + // RGB channels each should be allocated with 8 bit depth. One + // should almost certainly get these bit depths by default. + WX_GL_MIN_RED, 8, WX_GL_MIN_GREEN, 8, WX_GL_MIN_BLUE, 8, + // Requesting an 8 bit alpha channel. Interestingly, the NVIDIA + // drivers would most likely work with some alpha plane, but + // glReadPixels would not return the alpha channel on NVIDIA if + // not requested when the GL context is created. + WX_GL_MIN_ALPHA, 8, WX_GL_DEPTH_SIZE, 8, WX_GL_STENCIL_SIZE, 8, + WX_GL_SAMPLE_BUFFERS, GL_TRUE, WX_GL_SAMPLES, 4, 0}; + + m_canvas = std::make_shared(this, wxID_ANY, attribList, + wxDefaultPosition, wxDefaultSize, + wxWANTS_CHARS | wxFULL_REPAINT_ON_RESIZE); + + wxPanel *control_panel = new wxPanel(this); + auto controlsizer = new wxBoxSizer(wxHORIZONTAL); + auto slider_sizer = new wxBoxSizer(wxVERTICAL); + auto console_sizer = new wxBoxSizer(wxVERTICAL); + + auto slider = new wxSlider(control_panel, wxID_ANY, 0, 0, 100, + wxDefaultPosition, wxDefaultSize, + wxSL_VERTICAL); + slider_sizer->Add(slider, 1, wxEXPAND); + + auto ms_toggle = new wxToggleButton(control_panel, wxID_ANY, "Multisampling"); + console_sizer->Add(ms_toggle, 0, wxALL | wxEXPAND, 5); + + auto csg_toggle = new wxToggleButton(control_panel, wxID_ANY, "CSG"); + csg_toggle->SetValue(true); + console_sizer->Add(csg_toggle, 0, wxALL | wxEXPAND, 5); + + auto add_combobox = [control_panel, console_sizer] + (const wxString &label, std::vector &&list) + { + auto widget = new wxComboBox(control_panel, wxID_ANY, list[0], + wxDefaultPosition, wxDefaultSize, + int(list.size()), list.data()); + + auto sz = new wxBoxSizer(wxHORIZONTAL); + sz->Add(new wxStaticText(control_panel, wxID_ANY, label), 0, + wxALL | wxALIGN_CENTER, 5); + sz->Add(widget, 1, wxALL | wxEXPAND, 5); + console_sizer->Add(sz, 0, wxEXPAND); + return widget; + }; + + auto add_spinctl = [control_panel, console_sizer] + (const wxString &label, int initial, int min, int max) + { + auto widget = new wxSpinCtrl( + control_panel, wxID_ANY, + wxString::Format("%d", initial), + wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, min, max, + initial); + + auto sz = new wxBoxSizer(wxHORIZONTAL); + sz->Add(new wxStaticText(control_panel, wxID_ANY, label), 0, + wxALL | wxALIGN_CENTER, 5); + sz->Add(widget, 1, wxALL | wxEXPAND, 5); + console_sizer->Add(sz, 0, wxEXPAND); + return widget; + }; + + auto convexity_spin = add_spinctl("Convexity", CSGSettings::DEFAULT_CONVEXITY, 0, 100); + + auto alg_select = add_combobox("Algorithm", {"Auto", "Goldfeather", "SCS"}); + auto depth_select = add_combobox("Depth Complexity", {"Off", "OcclusionQuery", "On"}); + auto optimization_select = add_combobox("Optimization", { "Default", "ForceOn", "On", "Off" }); + depth_select->Disable(); + + controlsizer->Add(slider_sizer, 0, wxEXPAND); + controlsizer->Add(console_sizer, 1, wxEXPAND); + + control_panel->SetSizer(controlsizer); + + auto sizer = new wxBoxSizer(wxHORIZONTAL); + sizer->Add(m_canvas.get(), 1, wxEXPAND); + sizer->Add(control_panel, 0, wxEXPAND); + SetSizer(sizer); + + Bind(wxEVT_MENU, &MyFrame::OnOpen, this, wxID_OPEN); + Bind(wxEVT_MENU, &MyFrame::OnExit, this, wxID_EXIT); + Bind(wxEVT_SHOW, &MyFrame::OnShown, this, GetId()); + + Bind(wxEVT_SLIDER, [this, slider](wxCommandEvent &) { + m_canvas->move_clip_plane(double(slider->GetValue())); + }, slider->GetId()); + + Bind(wxEVT_TOGGLEBUTTON, [this, ms_toggle](wxCommandEvent &){ + enable_multisampling(ms_toggle->GetValue()); + m_canvas->repaint(); + }, ms_toggle->GetId()); + + Bind(wxEVT_TOGGLEBUTTON, [this, csg_toggle](wxCommandEvent &){ + CSGSettings settings = m_canvas->get_csgsettings(); + settings.enable_csg(csg_toggle->GetValue()); + m_canvas->apply_csgsettings(settings); + }, csg_toggle->GetId()); + + Bind(wxEVT_COMBOBOX, [this, alg_select, depth_select](wxCommandEvent &) + { + int sel = alg_select->GetSelection(); + depth_select->Enable(sel > 0); + CSGSettings settings = m_canvas->get_csgsettings(); + settings.set_algo(OpenCSG::Algorithm(sel)); + m_canvas->apply_csgsettings(settings); + }, alg_select->GetId()); + + Bind(wxEVT_COMBOBOX, [this, depth_select](wxCommandEvent &) + { + int sel = depth_select->GetSelection(); + CSGSettings settings = m_canvas->get_csgsettings(); + settings.set_depth_algo(OpenCSG::DepthComplexityAlgorithm(sel)); + m_canvas->apply_csgsettings(settings); + }, depth_select->GetId()); + + Bind(wxEVT_COMBOBOX, [this, optimization_select](wxCommandEvent &) + { + int sel = optimization_select->GetSelection(); + CSGSettings settings = m_canvas->get_csgsettings(); + settings.set_optimization(OpenCSG::Optimization(sel)); + m_canvas->apply_csgsettings(settings); + }, depth_select->GetId()); + + Bind(wxEVT_SPINCTRL, [this, convexity_spin](wxSpinEvent &) { + CSGSettings settings = m_canvas->get_csgsettings(); + int c = convexity_spin->GetValue(); + + if (c > 0) { + settings.set_convexity(unsigned(c)); + m_canvas->apply_csgsettings(settings); + } + }, convexity_spin->GetId()); + + m_canvas->set_scene(std::make_shared()); +} From 47ec708c3a33beb9c14c5d6c7c730f3eee4a4e94 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Mon, 16 Dec 2019 15:55:49 +0100 Subject: [PATCH 074/336] Fix event dispatching to handlers --- sandboxes/opencsg/main.cpp | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/sandboxes/opencsg/main.cpp b/sandboxes/opencsg/main.cpp index ac18e177d1..ddd4bf33ef 100644 --- a/sandboxes/opencsg/main.cpp +++ b/sandboxes/opencsg/main.cpp @@ -235,45 +235,45 @@ MyFrame::MyFrame(const wxString &title, const wxPoint &pos, const wxSize &size): Bind(wxEVT_SLIDER, [this, slider](wxCommandEvent &) { m_canvas->move_clip_plane(double(slider->GetValue())); - }, slider->GetId()); + }); - Bind(wxEVT_TOGGLEBUTTON, [this, ms_toggle](wxCommandEvent &){ + ms_toggle->Bind(wxEVT_TOGGLEBUTTON, [this, ms_toggle](wxCommandEvent &){ enable_multisampling(ms_toggle->GetValue()); m_canvas->repaint(); - }, ms_toggle->GetId()); + }); - Bind(wxEVT_TOGGLEBUTTON, [this, csg_toggle](wxCommandEvent &){ + csg_toggle->Bind(wxEVT_TOGGLEBUTTON, [this, csg_toggle](wxCommandEvent &){ CSGSettings settings = m_canvas->get_csgsettings(); settings.enable_csg(csg_toggle->GetValue()); m_canvas->apply_csgsettings(settings); - }, csg_toggle->GetId()); + }); - Bind(wxEVT_COMBOBOX, [this, alg_select, depth_select](wxCommandEvent &) + alg_select->Bind(wxEVT_COMBOBOX, + [this, alg_select, depth_select](wxCommandEvent &) { int sel = alg_select->GetSelection(); depth_select->Enable(sel > 0); CSGSettings settings = m_canvas->get_csgsettings(); settings.set_algo(OpenCSG::Algorithm(sel)); m_canvas->apply_csgsettings(settings); - }, alg_select->GetId()); + }); - Bind(wxEVT_COMBOBOX, [this, depth_select](wxCommandEvent &) - { + depth_select->Bind(wxEVT_COMBOBOX, [this, depth_select](wxCommandEvent &) { int sel = depth_select->GetSelection(); CSGSettings settings = m_canvas->get_csgsettings(); settings.set_depth_algo(OpenCSG::DepthComplexityAlgorithm(sel)); m_canvas->apply_csgsettings(settings); - }, depth_select->GetId()); + }); - Bind(wxEVT_COMBOBOX, [this, optimization_select](wxCommandEvent &) - { + optimization_select->Bind(wxEVT_COMBOBOX, + [this, optimization_select](wxCommandEvent &) { int sel = optimization_select->GetSelection(); CSGSettings settings = m_canvas->get_csgsettings(); settings.set_optimization(OpenCSG::Optimization(sel)); m_canvas->apply_csgsettings(settings); - }, depth_select->GetId()); + }); - Bind(wxEVT_SPINCTRL, [this, convexity_spin](wxSpinEvent &) { + convexity_spin->Bind(wxEVT_SPINCTRL, [this, convexity_spin](wxSpinEvent &) { CSGSettings settings = m_canvas->get_csgsettings(); int c = convexity_spin->GetValue(); @@ -281,7 +281,7 @@ MyFrame::MyFrame(const wxString &title, const wxPoint &pos, const wxSize &size): settings.set_convexity(unsigned(c)); m_canvas->apply_csgsettings(settings); } - }, convexity_spin->GetId()); + }); m_canvas->set_scene(std::make_shared()); } From bb3b39016fa9381506e1594cd46f361c6d348fd6 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Mon, 16 Dec 2019 18:49:44 +0100 Subject: [PATCH 075/336] Add ctl and fix applying opencsg params on the fly. --- sandboxes/opencsg/Canvas.hpp | 52 --------------- sandboxes/opencsg/GLScene.cpp | 63 ++++++++++-------- sandboxes/opencsg/GLScene.hpp | 122 ++++++++++++++++++++++------------ sandboxes/opencsg/main.cpp | 122 +++++++++++++++++++++++++--------- 4 files changed, 205 insertions(+), 154 deletions(-) diff --git a/sandboxes/opencsg/Canvas.hpp b/sandboxes/opencsg/Canvas.hpp index 17fd8f0440..4245799458 100644 --- a/sandboxes/opencsg/Canvas.hpp +++ b/sandboxes/opencsg/Canvas.hpp @@ -40,58 +40,6 @@ public: } m_context.reset(ctx); - - Bind( - wxEVT_MOUSEWHEEL, - [this](wxMouseEvent &evt) { - on_scroll(evt.GetWheelRotation(), evt.GetWheelDelta(), - evt.GetWheelAxis() == wxMOUSE_WHEEL_VERTICAL ? - Slic3r::GL::MouseInput::waVertical : - Slic3r::GL::MouseInput::waHorizontal); - }, - GetId()); - - Bind( - wxEVT_MOTION, - [this](wxMouseEvent &evt) { - on_moved_to(evt.GetPosition().x, evt.GetPosition().y); - }, - GetId()); - - Bind( - wxEVT_RIGHT_DOWN, - [this](wxMouseEvent & /*evt*/) { on_right_click_down(); }, - GetId()); - - Bind( - wxEVT_RIGHT_UP, - [this](wxMouseEvent & /*evt*/) { on_right_click_up(); }, - GetId()); - - Bind( - wxEVT_LEFT_DOWN, - [this](wxMouseEvent & /*evt*/) { on_left_click_down(); }, - GetId()); - - Bind( - wxEVT_LEFT_UP, - [this](wxMouseEvent & /*evt*/) { on_left_click_up(); }, - GetId()); - - Bind(wxEVT_PAINT, [this](wxPaintEvent &) { - // This is required even though dc is not used otherwise. - wxPaintDC dc(this); - - // Set the OpenGL viewport according to the client size of this - // canvas. This is done here rather than in a wxSizeEvent handler - // because our OpenGL rendering context (and thus viewport setting) is - // used with multiple canvases: If we updated the viewport in the - // wxSizeEvent handler, changing the size of one canvas causes a - // viewport setting that is wrong when next another canvas is - // repainted. - const wxSize ClientSize = GetClientSize(); - repaint(ClientSize.x, ClientSize.y); - }, GetId()); } }; diff --git a/sandboxes/opencsg/GLScene.cpp b/sandboxes/opencsg/GLScene.cpp index 02a4b79914..1cfccb3b19 100644 --- a/sandboxes/opencsg/GLScene.cpp +++ b/sandboxes/opencsg/GLScene.cpp @@ -133,7 +133,7 @@ void Scene::set_print(uqptr &&print) m_print = std::move(print); // Notify displays - call(&Display::on_scene_updated, m_displays); + call(&Listener::on_scene_updated, m_listeners, *this); } BoundingBoxf3 Scene::get_bounding_box() const @@ -383,13 +383,18 @@ void Display::set_active(long width, long height) m_camera->set_screen(width, height); } -void Display::repaint(long width, long height) +void Display::set_screen_size(long width, long height) { if (m_size.x() != width || m_size.y() != height) m_camera->set_screen(width, height); m_size = {width, height}; + repaint(); +} + +void Display::repaint() +{ clear_screen(); m_camera->view(); @@ -400,23 +405,34 @@ void Display::repaint(long width, long height) swap_buffers(); } -void Display::on_scroll(long v, long d, MouseInput::WheelAxis wa) +void Controller::on_scene_updated(const Scene &scene) +{ + const SLAPrint *print = scene.get_print(); + if (!print) return; + + auto bb = scene.get_bounding_box(); + double d = std::max(std::max(bb.size().x(), bb.size().y()), bb.size().z()); + m_wheel_pos = long(2 * d); + + call_cameras(&Camera::set_zoom, m_wheel_pos); + call(&Display::on_scene_updated, m_displays, scene); +} + +void Controller::on_scroll(long v, long d, MouseInput::WheelAxis /*wa*/) { m_wheel_pos += v / d; - m_camera->set_zoom(m_wheel_pos); - - m_scene->on_scroll(v, d, wa); - - repaint(m_size.x(), m_size.y()); + call_cameras(&Camera::set_zoom, m_wheel_pos); + call(&Display::repaint, m_displays); } -void Display::on_moved_to(long x, long y) +void Controller::on_moved_to(long x, long y) { if (m_left_btn) { - m_camera->rotate((Vec2i{x, y} - m_mouse_pos).cast()); - repaint(); + call_cameras(&Camera::rotate, (Vec2i{x, y} - m_mouse_pos).cast()); + call(&Display::repaint, m_displays); } + m_mouse_pos = {x, y}; } @@ -424,30 +440,27 @@ void Display::apply_csgsettings(const CSGSettings &settings) { using namespace OpenCSG; - bool update = m_csgsettings.get_convexity() != settings.get_convexity(); + bool needupdate = m_csgsettings.get_convexity() != settings.get_convexity(); m_csgsettings = settings; setOption(AlgorithmSetting, m_csgsettings.get_algo()); setOption(DepthComplexitySetting, m_csgsettings.get_depth_algo()); setOption(DepthBoundsOptimization, m_csgsettings.get_optimization()); - if (update) on_scene_updated(); + if (needupdate) { + for (OpenCSG::Primitive * p : m_scene_cache.primitives_csg) + if (p->getConvexity() > 1) + p->setConvexity(m_csgsettings.get_convexity()); + } repaint(); } -void Display::on_scene_updated() +void Display::on_scene_updated(const Scene &scene) { - const SLAPrint *print = m_scene->get_print(); + const SLAPrint *print = scene.get_print(); if (!print) return; - { - auto bb = m_scene->get_bounding_box(); - double d = std::max(std::max(bb.size().x(), bb.size().y()), bb.size().z()); - m_wheel_pos = long(2 * d); - m_camera->set_zoom(m_wheel_pos); - } - m_scene_cache.clear(); for (const SLAPrintObject *po : print->objects()) { @@ -499,12 +512,6 @@ void Display::on_scene_updated() repaint(); } -void Display::set_scene(shptr scene) -{ - m_scene = scene; - m_scene->add_display(shared_from_this()); -} - void Camera::view() { glMatrixMode(GL_MODELVIEW); diff --git a/sandboxes/opencsg/GLScene.hpp b/sandboxes/opencsg/GLScene.hpp index a127ab90be..5a4afb396b 100644 --- a/sandboxes/opencsg/GLScene.hpp +++ b/sandboxes/opencsg/GLScene.hpp @@ -223,8 +223,8 @@ public: private: OpenCSG::Algorithm m_csgalg = OpenCSG::Algorithm::Automatic; - OpenCSG::DepthComplexityAlgorithm m_depth_algo = OpenCSG::DepthComplexityAlgorithm::NoDepthComplexitySampling; - OpenCSG::Optimization m_optim = OpenCSG::Optimization::OptimizationDefault; + OpenCSG::DepthComplexityAlgorithm m_depth_algo = OpenCSG::NoDepthComplexitySampling; + OpenCSG::Optimization m_optim = OpenCSG::OptimizationDefault; bool m_enable = true; unsigned int m_convexity = DEFAULT_CONVEXITY; @@ -244,21 +244,44 @@ public: unsigned get_convexity() const { return m_convexity; } void set_convexity(unsigned c) { m_convexity = c; } }; - -class Display : public std::enable_shared_from_this, - public MouseInput::Listener + +class Scene +{ + uqptr m_print; +public: + + class Listener { + public: + virtual ~Listener() = default; + virtual void on_scene_updated(const Scene &scene) = 0; + }; + + Scene(); + ~Scene(); + + void set_print(uqptr &&print); + const SLAPrint * get_print() const { return m_print.get(); } + + BoundingBoxf3 get_bounding_box() const; + + void add_listener(shptr listener) + { + m_listeners.emplace_back(listener); + cleanup(m_listeners); + } + +private: + Collection> m_listeners; +}; + +class Display : public Scene::Listener { protected: - shptr m_scene; - long m_wheel_pos = 0; - Vec2i m_mouse_pos, m_mouse_pos_rprev, m_mouse_pos_lprev; Vec2i m_size; - bool m_initialized = false, m_left_btn = false, m_right_btn = false; + bool m_initialized = false; CSGSettings m_csgsettings; - shptr m_camera; - struct SceneCache { Collection> primitives; Collection primitives_free; @@ -272,64 +295,79 @@ protected: unsigned covexity); } m_scene_cache; + shptr m_camera; + public: - Display(shptr scene = nullptr, shptr camera = nullptr) - : m_scene(scene) - , m_camera(camera ? camera : std::make_shared()) + + explicit Display(shptr camera = nullptr) + : m_camera(camera ? camera : std::make_shared()) {} - + + Camera * camera() { return m_camera.get(); } + virtual void swap_buffers() = 0; - virtual void set_active(long width, long height); + virtual void set_screen_size(long width, long height); + Vec2i get_screen_size() const { return m_size; } - virtual void repaint(long width, long height); - void repaint() { repaint(m_size.x(), m_size.y()); } - - void set_scene(shptr scene); - shptr get_scene() { return m_scene; } + virtual void repaint(); bool is_initialized() const { return m_initialized; } - void on_scroll(long v, long d, MouseInput::WheelAxis wa) override; - void on_moved_to(long x, long y) override; - void on_left_click_down() override { m_left_btn = true; } - void on_left_click_up() override { m_left_btn = false; } - void on_right_click_down() override { m_right_btn = true; } - void on_right_click_up() override { m_right_btn = false; } - - void move_clip_plane(double z) { m_camera->set_clip_z(z); } - const CSGSettings & get_csgsettings() const { return m_csgsettings; } void apply_csgsettings(const CSGSettings &settings); - virtual void on_scene_updated(); + void on_scene_updated(const Scene &scene) override; + virtual void clear_screen(); virtual void render_scene(); }; -class Scene: public MouseInput::Listener +class Controller : public std::enable_shared_from_this, + public MouseInput::Listener, + public Scene::Listener { - uqptr m_print; + long m_wheel_pos = 0; + Vec2i m_mouse_pos, m_mouse_pos_rprev, m_mouse_pos_lprev; + bool m_left_btn = false, m_right_btn = false; + + shptr m_scene; + Collection> m_displays; + + template + void call_cameras(F &&f, Args&&... args) { + for (wkptr &l : m_displays) + if (auto disp = l.lock()) if (disp->camera()) + (disp->camera()->*f)(std::forward(args)...); + } + public: - Scene(); - ~Scene(); + void set_scene(shptr scene) + { + m_scene = scene; + m_scene->add_listener(shared_from_this()); + } + const Scene * get_scene() const { return m_scene.get(); } + void add_display(shptr disp) { m_displays.emplace_back(disp); cleanup(m_displays); } - void set_print(uqptr &&print); - const SLAPrint * get_print() const { return m_print.get(); } + void on_scene_updated(const Scene &scene) override; - BoundingBoxf3 get_bounding_box() const; + void on_left_click_down() override { m_left_btn = true; } + void on_left_click_up() override { m_left_btn = false; } + void on_right_click_down() override { m_right_btn = true; } + void on_right_click_up() override { m_right_btn = false; } + + void on_scroll(long v, long d, MouseInput::WheelAxis wa) override; + void on_moved_to(long x, long y) override; -private: - - Collection> m_displays; + void move_clip_plane(double z) { call_cameras(&Camera::set_clip_z, z); } }; - }} // namespace Slic3r::GL #endif // GLSCENE_HPP diff --git a/sandboxes/opencsg/main.cpp b/sandboxes/opencsg/main.cpp index ddd4bf33ef..d01687428e 100644 --- a/sandboxes/opencsg/main.cpp +++ b/sandboxes/opencsg/main.cpp @@ -31,49 +31,31 @@ using namespace Slic3r::GL; class MyFrame: public wxFrame { - std::shared_ptr m_canvas; - std::shared_ptr m_stbar; - std::unique_ptr m_ui_job; + shptr m_scene; // Model + shptr m_canvas; // View + shptr m_ctl; // Controller + + shptr m_stbar; + uqptr m_ui_job; class SLAJob: public Slic3r::GUI::Job { MyFrame *m_parent; std::unique_ptr m_print; std::string m_fname; public: - - SLAJob(MyFrame *frame, const std::string &fname) + SLAJob(MyFrame *frame, const std::string &fname) : Slic3r::GUI::Job{frame->m_stbar} , m_parent{frame} , m_fname{fname} - { - } - - void process() override - { - using Status = Slic3r::PrintBase::SlicingStatus; - - Slic3r::DynamicPrintConfig cfg; - auto model = Slic3r::Model::read_from_file(m_fname, &cfg); - - m_print = std::make_unique(); - m_print->apply(model, cfg); - - Slic3r::PrintBase::TaskParams params; - params.to_object_step = Slic3r::slaposHollowing; - m_print->set_task(params); - - m_print->set_status_callback([this](const Status &status) { - update_status(status.percent, status.text); - }); - - m_print->process(); - } + {} + + void process() override; protected: void finalize() override { - m_parent->m_canvas->get_scene()->set_print(std::move(m_print)); + m_parent->m_scene->set_print(std::move(m_print)); m_parent->m_stbar->set_status_text( wxString::Format("Model %s loaded.", m_fname)); } @@ -84,6 +66,8 @@ public: private: + void bind_canvas_events_to_controller(); + void OnExit(wxCommandEvent& /*event*/) { RemoveChild(m_canvas.get()); @@ -108,7 +92,8 @@ private: const wxSize ClientSize = GetClientSize(); m_canvas->set_active(ClientSize.x, ClientSize.y); - m_canvas->repaint(ClientSize.x, ClientSize.y); + m_canvas->set_screen_size(ClientSize.x, ClientSize.y); + m_canvas->repaint(); // Do the repaint continuously Bind(wxEVT_IDLE, [this](wxIdleEvent &evt) { @@ -159,9 +144,14 @@ MyFrame::MyFrame(const wxString &title, const wxPoint &pos, const wxSize &size): WX_GL_MIN_ALPHA, 8, WX_GL_DEPTH_SIZE, 8, WX_GL_STENCIL_SIZE, 8, WX_GL_SAMPLE_BUFFERS, GL_TRUE, WX_GL_SAMPLES, 4, 0}; + m_scene = std::make_shared(); + m_ctl = std::make_shared(); + m_ctl->set_scene(m_scene); + m_canvas = std::make_shared(this, wxID_ANY, attribList, wxDefaultPosition, wxDefaultSize, wxWANTS_CHARS | wxFULL_REPAINT_ON_RESIZE); + m_ctl->add_display(m_canvas); wxPanel *control_panel = new wxPanel(this); auto controlsizer = new wxBoxSizer(wxHORIZONTAL); @@ -234,7 +224,7 @@ MyFrame::MyFrame(const wxString &title, const wxPoint &pos, const wxSize &size): Bind(wxEVT_SHOW, &MyFrame::OnShown, this, GetId()); Bind(wxEVT_SLIDER, [this, slider](wxCommandEvent &) { - m_canvas->move_clip_plane(double(slider->GetValue())); + m_ctl->move_clip_plane(double(slider->GetValue())); }); ms_toggle->Bind(wxEVT_TOGGLEBUTTON, [this, ms_toggle](wxCommandEvent &){ @@ -283,5 +273,73 @@ MyFrame::MyFrame(const wxString &title, const wxPoint &pos, const wxSize &size): } }); - m_canvas->set_scene(std::make_shared()); + bind_canvas_events_to_controller(); +} + +void MyFrame::bind_canvas_events_to_controller() +{ + m_canvas->Bind(wxEVT_MOUSEWHEEL, [this](wxMouseEvent &evt) { + m_ctl->on_scroll(evt.GetWheelRotation(), evt.GetWheelDelta(), + evt.GetWheelAxis() == wxMOUSE_WHEEL_VERTICAL ? + Slic3r::GL::MouseInput::waVertical : + Slic3r::GL::MouseInput::waHorizontal); + }); + + m_canvas->Bind(wxEVT_MOTION, [this](wxMouseEvent &evt) { + m_ctl->on_moved_to(evt.GetPosition().x, evt.GetPosition().y); + }); + + m_canvas->Bind(wxEVT_RIGHT_DOWN, [this](wxMouseEvent & /*evt*/) { + m_ctl->on_right_click_down(); + }); + + m_canvas->Bind(wxEVT_RIGHT_UP, [this](wxMouseEvent & /*evt*/) { + m_ctl->on_right_click_up(); + }); + + m_canvas->Bind(wxEVT_LEFT_DOWN, [this](wxMouseEvent & /*evt*/) { + m_ctl->on_left_click_down(); + }); + + m_canvas->Bind(wxEVT_LEFT_UP, [this](wxMouseEvent & /*evt*/) { + m_ctl->on_left_click_up(); + }); + + m_canvas->Bind(wxEVT_PAINT, [this](wxPaintEvent &) { + // This is required even though dc is not used otherwise. + wxPaintDC dc(this); + + // Set the OpenGL viewport according to the client size of this + // canvas. This is done here rather than in a wxSizeEvent handler + // because our OpenGL rendering context (and thus viewport setting) is + // used with multiple canvases: If we updated the viewport in the + // wxSizeEvent handler, changing the size of one canvas causes a + // viewport setting that is wrong when next another canvas is + // repainted. + const wxSize ClientSize = m_canvas->GetClientSize(); + + m_canvas->set_screen_size(ClientSize.x, ClientSize.y); + m_canvas->repaint(); + }); +} + +void MyFrame::SLAJob::process() +{ + using Status = Slic3r::PrintBase::SlicingStatus; + + Slic3r::DynamicPrintConfig cfg; + auto model = Slic3r::Model::read_from_file(m_fname, &cfg); + + m_print = std::make_unique(); + m_print->apply(model, cfg); + + Slic3r::PrintBase::TaskParams params; + params.to_object_step = Slic3r::slaposHollowing; + m_print->set_task(params); + + m_print->set_status_callback([this](const Status &status) { + update_status(status.percent, status.text); + }); + + m_print->process(); } From 11b98b22419df799f73f61d79fd8bb09bb9ca880 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Tue, 17 Dec 2019 10:12:37 +0100 Subject: [PATCH 076/336] Deal with cmake warnings caused by find CGAL --- src/libslic3r/CMakeLists.txt | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/libslic3r/CMakeLists.txt b/src/libslic3r/CMakeLists.txt index 1ddb7fa8b1..8a3817b95e 100644 --- a/src/libslic3r/CMakeLists.txt +++ b/src/libslic3r/CMakeLists.txt @@ -219,11 +219,14 @@ add_library(libslic3r STATIC ) if (SLIC3R_STATIC) - set(CGAL_Boost_USE_STATIC_LIBS ON) - set(CGAL_DO_NOT_WARN_ABOUT_CMAKE_BUILD_TYPE TRUE) + set(CGAL_Boost_USE_STATIC_LIBS ON CACHE BOOL "" FORCE) endif () +set(CGAL_DO_NOT_WARN_ABOUT_CMAKE_BUILD_TYPE ON CACHE BOOL "" FORCE) +cmake_policy(PUSH) +cmake_policy(SET CMP0011 NEW) find_package(CGAL REQUIRED) +cmake_policy(POP) add_library(libslic3r_cgal OBJECT MeshBoolean.cpp MeshBoolean.hpp) target_include_directories(libslic3r_cgal PRIVATE @@ -234,7 +237,6 @@ target_compile_definitions(libslic3r_cgal PRIVATE $) target_compile_options(libslic3r_cgal PRIVATE $) -target_sources(libslic3r PRIVATE $) encoding_check(libslic3r) @@ -275,3 +277,5 @@ endif() if (SLIC3R_PCH AND NOT SLIC3R_SYNTAXONLY) add_precompiled_header(libslic3r pchheader.hpp FORCEINCLUDE) endif () + +target_sources(libslic3r PRIVATE $) From 695950b2e6f9ae534c5568b52500c643d10cb257 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Tue, 17 Dec 2019 10:19:46 +0100 Subject: [PATCH 077/336] further simplification --- sandboxes/opencsg/CMakeLists.txt | 2 +- sandboxes/opencsg/Canvas.hpp | 48 -------------------------------- sandboxes/opencsg/GLScene.hpp | 25 +++++++++-------- sandboxes/opencsg/main.cpp | 29 ++++++++++++++++++- 4 files changed, 42 insertions(+), 62 deletions(-) delete mode 100644 sandboxes/opencsg/Canvas.hpp diff --git a/sandboxes/opencsg/CMakeLists.txt b/sandboxes/opencsg/CMakeLists.txt index 9a216a7dc1..651fbe82f7 100644 --- a/sandboxes/opencsg/CMakeLists.txt +++ b/sandboxes/opencsg/CMakeLists.txt @@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 3.0) project(OpenCSG-example) -add_executable(opencsg_example main.cpp GLScene.hpp GLScene.cpp Canvas.hpp +add_executable(opencsg_example main.cpp GLScene.hpp GLScene.cpp ${CMAKE_CURRENT_SOURCE_DIR}/../../src/slic3r/GUI/ProgressStatusBar.cpp ${CMAKE_CURRENT_SOURCE_DIR}/../../src/slic3r/GUI/I18N.hpp ${CMAKE_CURRENT_SOURCE_DIR}/../../src/slic3r/GUI/I18N.cpp) diff --git a/sandboxes/opencsg/Canvas.hpp b/sandboxes/opencsg/Canvas.hpp deleted file mode 100644 index 4245799458..0000000000 --- a/sandboxes/opencsg/Canvas.hpp +++ /dev/null @@ -1,48 +0,0 @@ -#ifndef CANVAS_HPP -#define CANVAS_HPP - -#include - -// For compilers that support precompilation, includes "wx/wx.h". -#include -#ifndef WX_PRECOMP -#include -#endif - -#include -#include - -#include "GLScene.hpp" - -namespace Slic3r { namespace GL { - -class Canvas: public wxGLCanvas, public Slic3r::GL::Display -{ - std::unique_ptr m_context; -public: - - void set_active(long w, long h) override - { - SetCurrent(*m_context); - Slic3r::GL::Display::set_active(w, h); - } - - void swap_buffers() override { SwapBuffers(); } - - template - Canvas(Args &&...args): wxGLCanvas(std::forward(args)...) - { - auto ctx = new wxGLContext(this); - if (!ctx || !ctx->IsOK()) { - wxMessageBox("Could not create OpenGL context.", "Error", - wxOK | wxICON_ERROR); - return; - } - - m_context.reset(ctx); - } -}; - -}} // namespace Slic3r::GL - -#endif // CANVAS_HPP diff --git a/sandboxes/opencsg/GLScene.hpp b/sandboxes/opencsg/GLScene.hpp index 5a4afb396b..68cc59b01c 100644 --- a/sandboxes/opencsg/GLScene.hpp +++ b/sandboxes/opencsg/GLScene.hpp @@ -21,16 +21,16 @@ template using uqptr = std::unique_ptr; template using wkptr = std::weak_ptr; template> -using Collection = std::vector; +using vector = std::vector; -template void cleanup(Collection> &listeners) { +template void cleanup(vector> &listeners) { auto it = std::remove_if(listeners.begin(), listeners.end(), [](auto &l) { return !l.lock(); }); listeners.erase(it, listeners.end()); } template -void call(F &&f, Collection> &listeners, Args&&... args) { +void call(F &&f, vector> &listeners, Args&&... args) { for (auto &l : listeners) if (auto p = l.lock()) ((p.get())->*f)(std::forward(args)...); } @@ -57,7 +57,7 @@ public: }; private: - Collection> m_listeners; + vector> m_listeners; public: virtual ~MouseInput() = default; @@ -104,9 +104,9 @@ public: // Vertices and their normals, interleaved to be used by void // glInterleavedArrays(GL_N3F_V3F, 0, x) - Collection vertices_and_normals_interleaved; - Collection triangle_indices; - Collection quad_indices; + vector vertices_and_normals_interleaved; + vector triangle_indices; + vector quad_indices; // When the geometry data is loaded into the graphics card as Vertex // Buffer Objects, the above mentioned std::vectors are cleared and the @@ -271,7 +271,7 @@ public: } private: - Collection> m_listeners; + vector> m_listeners; }; class Display : public Scene::Listener @@ -283,9 +283,9 @@ protected: CSGSettings m_csgsettings; struct SceneCache { - Collection> primitives; - Collection primitives_free; - Collection primitives_csg; + vector> primitives; + vector primitives_free; + vector primitives_csg; void clear(); @@ -332,8 +332,9 @@ class Controller : public std::enable_shared_from_this, bool m_left_btn = false, m_right_btn = false; shptr m_scene; - Collection> m_displays; + vector> m_displays; + // Call a method of Camera on all the cameras of the attached displays template void call_cameras(F &&f, Args&&... args) { for (wkptr &l : m_displays) diff --git a/sandboxes/opencsg/main.cpp b/sandboxes/opencsg/main.cpp index d01687428e..c2f8a74aa1 100644 --- a/sandboxes/opencsg/main.cpp +++ b/sandboxes/opencsg/main.cpp @@ -15,9 +15,9 @@ #include #include #include +#include #include -#include "Canvas.hpp" #include "GLScene.hpp" #include "libslic3r/Model.hpp" @@ -29,6 +29,33 @@ using namespace Slic3r::GL; +class Canvas: public wxGLCanvas, public Slic3r::GL::Display +{ + std::unique_ptr m_context; +public: + + void set_active(long w, long h) override + { + SetCurrent(*m_context); + Slic3r::GL::Display::set_active(w, h); + } + + void swap_buffers() override { SwapBuffers(); } + + template + Canvas(Args &&...args): wxGLCanvas(std::forward(args)...) + { + auto ctx = new wxGLContext(this); + if (!ctx || !ctx->IsOK()) { + wxMessageBox("Could not create OpenGL context.", "Error", + wxOK | wxICON_ERROR); + return; + } + + m_context.reset(ctx); + } +}; + class MyFrame: public wxFrame { shptr m_scene; // Model From c81b1fbbbdd3c7a1dcec5eb5883b7a88499a04a4 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Tue, 17 Dec 2019 10:51:18 +0100 Subject: [PATCH 078/336] Fix missing gmpxx from dep_GMP --- deps/GMP/GMP.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deps/GMP/GMP.cmake b/deps/GMP/GMP.cmake index 6c93107c42..8bcf948592 100644 --- a/deps/GMP/GMP.cmake +++ b/deps/GMP/GMP.cmake @@ -20,7 +20,7 @@ else () ExternalProject_Add(dep_GMP URL https://gmplib.org/download/gmp/gmp-6.1.2.tar.bz2 BUILD_IN_SOURCE ON - CONFIGURE_COMMAND ./configure --enable-shared=no --enable-static=yes "--prefix=${DESTDIR}/usr/local" --with-pic + CONFIGURE_COMMAND ./configure --enable-shared=no --enable-cxx=yes --enable-static=yes "--prefix=${DESTDIR}/usr/local" --with-pic BUILD_COMMAND make -j INSTALL_COMMAND make install ) From d349f2402196cf9c69d8e8542b20fbe6326b66b8 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Tue, 17 Dec 2019 13:05:18 +0100 Subject: [PATCH 079/336] Fix CGAL config script being non-relocatable --- deps/CGAL/CGAL.cmake | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/deps/CGAL/CGAL.cmake b/deps/CGAL/CGAL.cmake index 4b127cd512..96a6292580 100644 --- a/deps/CGAL/CGAL.cmake +++ b/deps/CGAL/CGAL.cmake @@ -6,4 +6,10 @@ prusaslicer_add_cmake_project( # URL https://github.com/CGAL/cgal/archive/releases/CGAL-5.0.zip # URL_HASH SHA256=bd9327be903ab7ee379a8a7a0609eba0962f5078d2497cf8e13e8e1598584154 DEPENDS dep_boost dep_GMP dep_MPFR +) + +ExternalProject_Add_Step(dep_CGAL dep_CGAL_relocation_fix + DEPENDEES install + COMMAND ${CMAKE_COMMAND} -E remove CGALConfig-installation-dirs.cmake + WORKING_DIRECTORY "${DESTDIR}/usr/local/lib/cmake/CGAL" ) \ No newline at end of file From 57cf3d17e2dc25c1500f403e584684430f9580a0 Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Tue, 17 Dec 2019 15:57:24 +0100 Subject: [PATCH 080/336] First steps on SLA and Hollowing gizmo data sharing --- src/slic3r/GUI/Gizmos/GLGizmoBase.cpp | 3 +- src/slic3r/GUI/Gizmos/GLGizmoBase.hpp | 36 ++- src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp | 262 +++++++++---------- src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp | 34 ++- src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp | 194 +++++++------- src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp | 27 +- src/slic3r/GUI/Gizmos/GLGizmosManager.cpp | 6 +- src/slic3r/GUI/Gizmos/GLGizmosManager.hpp | 1 + 8 files changed, 296 insertions(+), 267 deletions(-) diff --git a/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp b/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp index cb18bdb166..7dce249f28 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp @@ -135,7 +135,7 @@ void GLGizmoBase::Grabber::render_face(float half_size) const } -GLGizmoBase::GLGizmoBase(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id) +GLGizmoBase::GLGizmoBase(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id, CommonGizmosData* common_data_ptr) : m_parent(parent) , m_group_id(-1) , m_state(Off) @@ -146,6 +146,7 @@ GLGizmoBase::GLGizmoBase(GLCanvas3D& parent, const std::string& icon_filename, u , m_dragging(false) , m_imgui(wxGetApp().imgui()) , m_first_input_window_render(true) + , m_c(common_data_ptr) { ::memcpy((void*)m_base_color, (const void*)DEFAULT_BASE_COLOR, 4 * sizeof(float)); ::memcpy((void*)m_drag_color, (const void*)DEFAULT_DRAG_COLOR, 4 * sizeof(float)); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp b/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp index da30427793..9479174fbd 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp @@ -30,7 +30,7 @@ static const float CONSTRAINED_COLOR[4] = { 0.5f, 0.5f, 0.5f, 1.0f }; class ImGuiWrapper; - +class CommonGizmosData; class GLGizmoBase { @@ -99,9 +99,13 @@ protected: mutable std::vector m_grabbers; ImGuiWrapper* m_imgui; bool m_first_input_window_render; + CommonGizmosData* m_c = nullptr; public: - GLGizmoBase(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id); + GLGizmoBase(GLCanvas3D& parent, + const std::string& icon_filename, + unsigned int sprite_id, + CommonGizmosData* common_data = nullptr); virtual ~GLGizmoBase() {} bool init() { return on_init(); } @@ -179,6 +183,34 @@ protected: // were not interpolated by alpha blending or multi sampling. extern unsigned char picking_checksum_alpha_channel(unsigned char red, unsigned char green, unsigned char blue); +class MeshRaycaster; +class MeshClipper; + +class CommonGizmosData { +public: + const TriangleMesh* mesh() const { + return (! m_mesh ? nullptr : (m_cavity_mesh ? m_cavity_mesh.get() : m_mesh)); + } + + + + ModelObject* m_model_object = nullptr; + const TriangleMesh* m_mesh; + std::unique_ptr m_mesh_raycaster; + std::unique_ptr m_object_clipper; + std::unique_ptr m_supports_clipper; + + std::unique_ptr m_cavity_mesh; + std::unique_ptr m_volume_with_cavity; + + int m_active_instance = -1; + float m_active_instance_bb_radius = 0; + ObjectID m_model_object_id = 0; + int m_print_object_idx = -1; + int m_print_objects_count = -1; + int m_old_timestamp = -1; +}; + } // namespace GUI } // namespace Slic3r diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp index cad0243f08..f8f2e125fc 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp @@ -18,8 +18,8 @@ namespace Slic3r { namespace GUI { -GLGizmoHollow::GLGizmoHollow(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id) - : GLGizmoBase(parent, icon_filename, sprite_id) +GLGizmoHollow::GLGizmoHollow(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id, CommonGizmosData* cd) + : GLGizmoBase(parent, icon_filename, sprite_id, cd) , m_quadric(nullptr) { m_clipping_plane.reset(new ClippingPlane(Vec3d::Zero(), 0.)); @@ -58,23 +58,23 @@ bool GLGizmoHollow::on_init() void GLGizmoHollow::set_sla_support_data(ModelObject* model_object, const Selection& selection) { if (! model_object || selection.is_empty()) { - m_model_object = nullptr; + m_c->m_model_object = nullptr; return; } - if (m_model_object != model_object || m_model_object_id != model_object->id()) { - m_model_object = model_object; - m_print_object_idx = -1; + if (m_c->m_model_object != model_object || m_c->m_model_object_id != model_object->id()) { + m_c->m_model_object = model_object; + m_c->m_print_object_idx = -1; } - m_active_instance = selection.get_instance_idx(); + m_c->m_active_instance = selection.get_instance_idx(); if (model_object && selection.is_from_single_instance()) { // Cache the bb - it's needed for dealing with the clipping plane quite often // It could be done inside update_mesh but one has to account for scaling of the instance. //FIXME calling ModelObject::instance_bounding_box() is expensive! - m_active_instance_bb_radius = m_model_object->instance_bounding_box(m_active_instance).radius(); + m_c->m_active_instance_bb_radius = m_c->m_model_object->instance_bounding_box(m_c->m_active_instance).radius(); if (is_mesh_update_necessary()) { update_mesh(); @@ -83,7 +83,7 @@ void GLGizmoHollow::set_sla_support_data(ModelObject* model_object, const Select if (m_state == On) { m_parent.toggle_model_objects_visibility(false); - m_parent.toggle_model_objects_visibility(true, m_model_object, m_active_instance); + m_parent.toggle_model_objects_visibility(true, m_c->m_model_object, m_c->m_active_instance); } else m_parent.toggle_model_objects_visibility(true, nullptr, -1); @@ -96,24 +96,24 @@ void GLGizmoHollow::on_render() const { const Selection& selection = m_parent.get_selection(); - // If current m_model_object does not match selection, ask GLCanvas3D to turn us off + // If current m_c->m_model_object does not match selection, ask GLCanvas3D to turn us off if (m_state == On - && (m_model_object != selection.get_model()->objects[selection.get_object_idx()] - || m_active_instance != selection.get_instance_idx() - || m_model_object_id != m_model_object->id())) { + && (m_c->m_model_object != selection.get_model()->objects[selection.get_object_idx()] + || m_c->m_active_instance != selection.get_instance_idx() + || m_c->m_model_object_id != m_c->m_model_object->id())) { m_parent.post_event(SimpleEvent(EVT_GLCANVAS_RESETGIZMOS)); return; } - if (! m_mesh) + if (! m_c->m_mesh) const_cast(this)->update_mesh(); glsafe(::glEnable(GL_BLEND)); glsafe(::glEnable(GL_DEPTH_TEST)); - if (m_volume_with_cavity) { + if (m_c->m_volume_with_cavity) { m_parent.get_shader().start_using(); - m_volume_with_cavity->render(); + m_c->m_volume_with_cavity->render(); m_parent.get_shader().stop_using(); } @@ -132,7 +132,7 @@ void GLGizmoHollow::on_render() const void GLGizmoHollow::render_clipping_plane(const Selection& selection) const { - if (m_clipping_plane_distance == 0.f || mesh()->empty()) + if (m_clipping_plane_distance == 0.f || m_c->mesh()->empty()) return; // Get transformation of the instance @@ -150,65 +150,65 @@ void GLGizmoHollow::render_clipping_plane(const Selection& selection) const 1.)); // Now initialize the TMS for the object, perform the cut and save the result. - if (! m_object_clipper) { - m_object_clipper.reset(new MeshClipper); - m_object_clipper->set_mesh(*mesh()); + if (! m_c->m_object_clipper) { + m_c->m_object_clipper.reset(new MeshClipper); + m_c->m_object_clipper->set_mesh(*m_c->mesh()); } - m_object_clipper->set_plane(*m_clipping_plane); - m_object_clipper->set_transformation(trafo); + m_c->m_object_clipper->set_plane(*m_clipping_plane); + m_c->m_object_clipper->set_transformation(trafo); // Next, ask the backend if supports are already calculated. If so, we are gonna cut them too. // First we need a pointer to the respective SLAPrintObject. The index into objects vector is // cached so we don't have todo it on each render. We only search for the po if needed: - if (m_print_object_idx < 0 || (int)m_parent.sla_print()->objects().size() != m_print_objects_count) { - m_print_objects_count = m_parent.sla_print()->objects().size(); - m_print_object_idx = -1; + if (m_c->m_print_object_idx < 0 || (int)m_parent.sla_print()->objects().size() != m_c->m_print_objects_count) { + m_c->m_print_objects_count = m_parent.sla_print()->objects().size(); + m_c->m_print_object_idx = -1; for (const SLAPrintObject* po : m_parent.sla_print()->objects()) { - ++m_print_object_idx; - if (po->model_object()->id() == m_model_object->id()) + ++m_c->m_print_object_idx; + if (po->model_object()->id() == m_c->m_model_object->id()) break; } } - if (m_print_object_idx >= 0) { - const SLAPrintObject* print_object = m_parent.sla_print()->objects()[m_print_object_idx]; + if (m_c->m_print_object_idx >= 0) { + const SLAPrintObject* print_object = m_parent.sla_print()->objects()[m_c->m_print_object_idx]; if (print_object->is_step_done(slaposSupportTree) && !print_object->get_mesh(slaposSupportTree).empty()) { // If the supports are already calculated, save the timestamp of the respective step // so we can later tell they were recalculated. size_t timestamp = print_object->step_state_with_timestamp(slaposSupportTree).timestamp; - if (! m_supports_clipper || (int)timestamp != m_old_timestamp) { + if (! m_c->m_supports_clipper || (int)timestamp != m_c->m_old_timestamp) { // The timestamp has changed. - m_supports_clipper.reset(new MeshClipper); + m_c->m_supports_clipper.reset(new MeshClipper); // The mesh should already have the shared vertices calculated. - m_supports_clipper->set_mesh(print_object->support_mesh()); - m_old_timestamp = timestamp; + m_c->m_supports_clipper->set_mesh(print_object->support_mesh()); + m_c->m_old_timestamp = timestamp; } - m_supports_clipper->set_plane(*m_clipping_plane); - m_supports_clipper->set_transformation(supports_trafo); + m_c->m_supports_clipper->set_plane(*m_clipping_plane); + m_c->m_supports_clipper->set_transformation(supports_trafo); } else // The supports are not valid. We better dump the cached data. - m_supports_clipper.reset(); + m_c->m_supports_clipper.reset(); } // At this point we have the triangulated cuts for both the object and supports - let's render. - if (! m_object_clipper->get_triangles().empty()) { + if (! m_c->m_object_clipper->get_triangles().empty()) { ::glPushMatrix(); ::glColor3f(1.0f, 0.37f, 0.0f); ::glBegin(GL_TRIANGLES); - for (const Vec3f& point : m_object_clipper->get_triangles()) + for (const Vec3f& point : m_c->m_object_clipper->get_triangles()) ::glVertex3f(point(0), point(1), point(2)); ::glEnd(); ::glPopMatrix(); } - if (m_show_supports && m_supports_clipper && ! m_supports_clipper->get_triangles().empty()) { + if (m_show_supports && m_c->m_supports_clipper && ! m_c->m_supports_clipper->get_triangles().empty()) { ::glPushMatrix(); ::glColor3f(1.0f, 0.f, 0.37f); ::glBegin(GL_TRIANGLES); - for (const Vec3f& point : m_supports_clipper->get_triangles()) + for (const Vec3f& point : m_c->m_supports_clipper->get_triangles()) ::glVertex3f(point(0), point(1), point(2)); ::glEnd(); ::glPopMatrix(); @@ -241,10 +241,10 @@ void GLGizmoHollow::render_points(const Selection& selection, bool picking) cons glsafe(::glMultMatrixd(instance_matrix.data())); float render_color[4]; - size_t cache_size = m_model_object->sla_drain_holes.size(); + size_t cache_size = m_c->m_model_object->sla_drain_holes.size(); for (size_t i = 0; i < cache_size; ++i) { - const sla::DrainHole& drain_hole = m_model_object->sla_drain_holes[i]; + const sla::DrainHole& drain_hole = m_c->m_model_object->sla_drain_holes[i]; const bool& point_selected = m_selected[i]; if (is_mesh_point_clipped((drain_hole.pos+HoleStickOutLength*drain_hole.normal).cast())) @@ -324,7 +324,7 @@ bool GLGizmoHollow::is_mesh_point_clipped(const Vec3d& point) const if (m_clipping_plane_distance == 0.f) return false; - Vec3d transformed_point = m_model_object->instances[m_active_instance]->get_transformation().get_matrix() * point; + Vec3d transformed_point = m_c->m_model_object->instances[m_c->m_active_instance]->get_transformation().get_matrix() * point; transformed_point(2) += m_z_shift; return m_clipping_plane->is_point_clipped(transformed_point); } @@ -333,34 +333,34 @@ bool GLGizmoHollow::is_mesh_point_clipped(const Vec3d& point) const bool GLGizmoHollow::is_mesh_update_necessary() const { - return ((m_state == On) && (m_model_object != nullptr) && !m_model_object->instances.empty()) - && ((m_model_object->id() != m_model_object_id) || ! m_mesh); + return ((m_state == On) && (m_c->m_model_object != nullptr) && !m_c->m_model_object->instances.empty()) + && ((m_c->m_model_object->id() != m_c->m_model_object_id) || ! m_c->m_mesh); } void GLGizmoHollow::update_mesh() { - if (! m_model_object) + if (! m_c->m_model_object) return; wxBusyCursor wait; // this way we can use that mesh directly. // This mesh does not account for the possible Z up SLA offset. - m_mesh = &m_model_object->volumes.front()->mesh(); + m_c->m_mesh = &m_c->m_model_object->volumes.front()->mesh(); // If this is different mesh than last time - if (m_model_object_id != m_model_object->id()) { - m_cavity_mesh.reset(); // dump the cavity - m_volume_with_cavity.reset(); - m_parent.toggle_model_objects_visibility(true, m_model_object, m_active_instance); - m_mesh_raycaster.reset(); + if (m_c->m_model_object_id != m_c->m_model_object->id()) { + m_c->m_cavity_mesh.reset(); // dump the cavity + m_c->m_volume_with_cavity.reset(); + m_parent.toggle_model_objects_visibility(true, m_c->m_model_object, m_c->m_active_instance); + m_c->m_mesh_raycaster.reset(); } - if (! m_mesh_raycaster) - m_mesh_raycaster.reset(new MeshRaycaster(*m_mesh)); + if (! m_c->m_mesh_raycaster) + m_c->m_mesh_raycaster.reset(new MeshRaycaster(*m_c->mesh())); - m_model_object_id = m_model_object->id(); + m_c->m_model_object_id = m_c->m_model_object->id(); } @@ -370,7 +370,7 @@ void GLGizmoHollow::update_mesh() bool GLGizmoHollow::unproject_on_mesh(const Vec2d& mouse_pos, std::pair& pos_and_normal) { // if the gizmo doesn't have the V, F structures for igl, calculate them first: - if (! m_mesh_raycaster) + if (! m_c->m_mesh_raycaster) update_mesh(); const Camera& camera = m_parent.get_camera(); @@ -382,7 +382,7 @@ bool GLGizmoHollow::unproject_on_mesh(const Vec2d& mouse_pos, std::pairunproject_on_mesh(mouse_pos, trafo.get_matrix(), camera, hit, normal, m_clipping_plane.get())) { + if (m_c->m_mesh_raycaster->unproject_on_mesh(mouse_pos, trafo.get_matrix(), camera, hit, normal, m_clipping_plane.get())) { // Return both the point and the facet normal. pos_and_normal = std::make_pair(hit, normal); return true; @@ -427,10 +427,10 @@ bool GLGizmoHollow::gizmo_event(SLAGizmoEventType action, const Vec2d& mouse_pos std::pair pos_and_normal; if (unproject_on_mesh(mouse_position, pos_and_normal)) { // we got an intersection Plater::TakeSnapshot snapshot(wxGetApp().plater(), _(L("Add drainage hole"))); - m_model_object->sla_drain_holes.emplace_back(pos_and_normal.first + HoleStickOutLength * pos_and_normal.second, + m_c->m_model_object->sla_drain_holes.emplace_back(pos_and_normal.first + HoleStickOutLength * pos_and_normal.second, -pos_and_normal.second, m_new_hole_radius, m_new_hole_height+HoleStickOutLength); m_selected.push_back(false); - assert(m_selected.size() == m_model_object->sla_drain_holes.size()); + assert(m_selected.size() == m_c->m_model_object->sla_drain_holes.size()); m_parent.set_as_dirty(); m_wait_for_up_event = true; } @@ -449,11 +449,11 @@ bool GLGizmoHollow::gizmo_event(SLAGizmoEventType action, const Vec2d& mouse_pos GLSelectionRectangle::EState rectangle_status = m_selection_rectangle.get_state(); // First collect positions of all the points in world coordinates. - Geometry::Transformation trafo = m_model_object->instances[m_active_instance]->get_transformation(); + Geometry::Transformation trafo = m_c->m_model_object->instances[m_c->m_active_instance]->get_transformation(); trafo.set_offset(trafo.get_offset() + Vec3d(0., 0., m_z_shift)); std::vector points; - for (unsigned int i=0; isla_drain_holes.size(); ++i) - points.push_back(trafo.get_matrix() * m_model_object->sla_drain_holes[i].pos.cast()); + for (unsigned int i=0; im_model_object->sla_drain_holes.size(); ++i) + points.push_back(trafo.get_matrix() * m_c->m_model_object->sla_drain_holes[i].pos.cast()); // Now ask the rectangle which of the points are inside. std::vector points_inside; @@ -462,7 +462,7 @@ bool GLGizmoHollow::gizmo_event(SLAGizmoEventType action, const Vec2d& mouse_pos points_inside.push_back(points[idx].cast()); // Only select/deselect points that are actually visible - for (size_t idx : m_mesh_raycaster->get_unobscured_idxs(trafo, m_parent.get_camera(), points_inside, m_clipping_plane.get())) + for (size_t idx : m_c->m_mesh_raycaster->get_unobscured_idxs(trafo, m_parent.get_camera(), points_inside, m_clipping_plane.get())) { if (rectangle_status == GLSelectionRectangle::Deselect) unselect_point(points_idxs[idx]); @@ -539,10 +539,10 @@ void GLGizmoHollow::delete_selected_points() { Plater::TakeSnapshot snapshot(wxGetApp().plater(), _(L("Delete drainage hole"))); - for (unsigned int idx=0; idxsla_drain_holes.size(); ++idx) { + for (unsigned int idx=0; idxm_model_object->sla_drain_holes.size(); ++idx) { if (m_selected[idx]) { m_selected.erase(m_selected.begin()+idx); - m_model_object->sla_drain_holes.erase(m_model_object->sla_drain_holes.begin() + (idx--)); + m_c->m_model_object->sla_drain_holes.erase(m_c->m_model_object->sla_drain_holes.begin() + (idx--)); } } @@ -555,8 +555,8 @@ void GLGizmoHollow::on_update(const UpdateData& data) std::pair pos_and_normal; if (! unproject_on_mesh(data.mouse_pos.cast(), pos_and_normal)) return; - m_model_object->sla_drain_holes[m_hover_id].pos = pos_and_normal.first + HoleStickOutLength * pos_and_normal.second; - m_model_object->sla_drain_holes[m_hover_id].normal = -pos_and_normal.second; + m_c->m_model_object->sla_drain_holes[m_hover_id].pos = pos_and_normal.first + HoleStickOutLength * pos_and_normal.second; + m_c->m_model_object->sla_drain_holes[m_hover_id].normal = -pos_and_normal.second; } } @@ -568,14 +568,14 @@ std::pair GLGizmoHollow::get_hollowi double offset = static_cast(opts[0])->value; double quality = static_cast(opts[1])->value; double closing_d = static_cast(opts[2])->value; - return std::make_pair(m_mesh, sla::HollowingConfig{offset, quality, closing_d}); + return std::make_pair(m_c->m_mesh, sla::HollowingConfig{offset, quality, closing_d}); } void GLGizmoHollow::update_mesh_raycaster(std::unique_ptr &&rc) { - m_mesh_raycaster = std::move(rc); - m_object_clipper.reset(); - m_volume_with_cavity.reset(); + m_c->m_mesh_raycaster = std::move(rc); + m_c->m_object_clipper.reset(); + m_c->m_volume_with_cavity.reset(); } void GLGizmoHollow::hollow_mesh() @@ -588,13 +588,13 @@ void GLGizmoHollow::hollow_mesh() void GLGizmoHollow::update_hollowed_mesh(std::unique_ptr &&mesh) { // Called from Plater when the UI job finishes - m_cavity_mesh = std::move(mesh); + m_c->m_cavity_mesh = std::move(mesh); - if(m_cavity_mesh) { + if(m_c->m_cavity_mesh) { // First subtract the holes: - if (! m_model_object->sla_drain_holes.empty()) { + if (! m_c->m_model_object->sla_drain_holes.empty()) { TriangleMesh holes_mesh; - for (const sla::DrainHole& hole : m_model_object->sla_drain_holes) { + for (const sla::DrainHole& hole : m_c->m_model_object->sla_drain_holes) { TriangleMesh hole_mesh = make_cylinder(hole.radius, hole.height, 2*M_PI/8); Eigen::Quaternionf q; Transform3f m = Transform3f::Identity(); @@ -602,22 +602,22 @@ void GLGizmoHollow::update_hollowed_mesh(std::unique_ptr &&mesh) hole_mesh.transform(m.cast()); hole_mesh.translate(hole.pos); holes_mesh.merge(hole_mesh); - //MeshBoolean::minus(*m_cavity_mesh.get(), hole_mesh); + //MeshBoolean::minus(*m_c->m_cavity_mesh.get(), hole_mesh); } - MeshBoolean::minus(*m_cavity_mesh.get(), holes_mesh); + MeshBoolean::minus(*m_c->m_cavity_mesh.get(), holes_mesh); } // create a new GLVolume that only has the cavity inside - Geometry::Transformation volume_trafo = m_model_object->volumes.front()->get_transformation(); + Geometry::Transformation volume_trafo = m_c->m_model_object->volumes.front()->get_transformation(); volume_trafo.set_offset(volume_trafo.get_offset() + Vec3d(0., 0., m_z_shift)); - m_volume_with_cavity.reset(new GLVolume(1.f, 0.f, 0.f, 0.5f)); - m_volume_with_cavity->indexed_vertex_array.load_mesh(*m_cavity_mesh.get()); - m_volume_with_cavity->finalize_geometry(true); - m_volume_with_cavity->set_volume_transformation(volume_trafo); - m_volume_with_cavity->set_instance_transformation(m_model_object->instances[size_t(m_active_instance)]->get_transformation()); + m_c->m_volume_with_cavity.reset(new GLVolume(1.f, 0.f, 0.f, 0.5f)); + m_c->m_volume_with_cavity->indexed_vertex_array.load_mesh(*m_c->m_cavity_mesh.get()); + m_c->m_volume_with_cavity->finalize_geometry(true); + m_c->m_volume_with_cavity->set_volume_transformation(volume_trafo); + m_c->m_volume_with_cavity->set_instance_transformation(m_c->m_model_object->instances[size_t(m_c->m_active_instance)]->get_transformation()); } - m_parent.toggle_model_objects_visibility(! m_cavity_mesh, m_model_object, m_active_instance); + m_parent.toggle_model_objects_visibility(! m_c->m_cavity_mesh, m_c->m_model_object, m_c->m_active_instance); if (m_clipping_plane_distance == 0.f) { m_clipping_plane_distance = 0.5f; update_clipping_plane(); @@ -628,10 +628,10 @@ std::vector GLGizmoHollow::get_config_options(const std::ve { std::vector out; - if (!m_model_object) + if (!m_c->m_model_object) return out; - const DynamicPrintConfig& object_cfg = m_model_object->config; + const DynamicPrintConfig& object_cfg = m_c->m_model_object->config; const DynamicPrintConfig& print_cfg = wxGetApp().preset_bundle->sla_prints.get_edited_preset().config; std::unique_ptr default_cfg = nullptr; @@ -654,7 +654,7 @@ std::vector GLGizmoHollow::get_config_options(const std::ve ClippingPlane GLGizmoHollow::get_sla_clipping_plane() const { - if (!m_model_object || m_state == Off || m_clipping_plane_distance == 0.f) + if (!m_c->m_model_object || m_state == Off || m_clipping_plane_distance == 0.f) return ClippingPlane::ClipsNothing(); else return ClippingPlane(-m_clipping_plane->get_normal(), m_clipping_plane->get_data()[3]); @@ -663,7 +663,7 @@ ClippingPlane GLGizmoHollow::get_sla_clipping_plane() const void GLGizmoHollow::on_render_input_window(float x, float y, float bottom_limit) { - if (! m_model_object) + if (! m_c->m_model_object) return; bool first_run = true; // This is a hack to redraw the button when all points are removed, @@ -694,7 +694,7 @@ RENDER_AGAIN: std::vector opts = get_config_options({"hollowing_enable"}); m_enable_hollowing = static_cast(opts[0])->value; if (m_imgui->checkbox(m_desc["enable"], m_enable_hollowing)) { - m_model_object->config.opt("hollowing_enable", true)->value = m_enable_hollowing; + m_c->m_model_object->config.opt("hollowing_enable", true)->value = m_enable_hollowing; wxGetApp().obj_list()->update_and_show_object_settings_item(); } } @@ -738,14 +738,14 @@ RENDER_AGAIN: } if (slider_edited || slider_released) { if (slider_released) { - m_model_object->config.opt("hollowing_min_thickness", true)->value = m_offset_stash; - m_model_object->config.opt("hollowing_quality", true)->value = m_quality_stash; - m_model_object->config.opt("hollowing_closing_distance", true)->value = m_closing_d_stash; + m_c->m_model_object->config.opt("hollowing_min_thickness", true)->value = m_offset_stash; + m_c->m_model_object->config.opt("hollowing_quality", true)->value = m_quality_stash; + m_c->m_model_object->config.opt("hollowing_closing_distance", true)->value = m_closing_d_stash; Plater::TakeSnapshot snapshot(wxGetApp().plater(), _(L("Hollowing parameter change"))); } - m_model_object->config.opt("hollowing_min_thickness", true)->value = offset; - m_model_object->config.opt("hollowing_quality", true)->value = quality; - m_model_object->config.opt("hollowing_closing_distance", true)->value = closing_d; + m_c->m_model_object->config.opt("hollowing_min_thickness", true)->value = offset; + m_c->m_model_object->config.opt("hollowing_quality", true)->value = quality; + m_c->m_model_object->config.opt("hollowing_closing_distance", true)->value = closing_d; if (slider_released) wxGetApp().obj_list()->update_and_show_object_settings_item(); } @@ -786,19 +786,19 @@ RENDER_AGAIN: // - take correct undo/redo snapshot after the user is done with moving the slider if (! m_selection_empty) { if (clicked) { - m_holes_stash = m_model_object->sla_drain_holes; + m_holes_stash = m_c->m_model_object->sla_drain_holes; } if (edited) { for (size_t idx=0; idxsla_drain_holes[idx].radius = m_new_hole_radius; - m_model_object->sla_drain_holes[idx].height = m_new_hole_height; + m_c->m_model_object->sla_drain_holes[idx].radius = m_new_hole_radius; + m_c->m_model_object->sla_drain_holes[idx].height = m_new_hole_height; } } if (deactivated) { // momentarily restore the old value to take snapshot - sla::DrainHoles new_holes = m_model_object->sla_drain_holes; - m_model_object->sla_drain_holes = m_holes_stash; + sla::DrainHoles new_holes = m_c->m_model_object->sla_drain_holes; + m_c->m_model_object->sla_drain_holes = m_holes_stash; float backup_rad = m_new_hole_radius; float backup_hei = m_new_hole_height; for (size_t i=0; isla_drain_holes = new_holes; + m_c->m_model_object->sla_drain_holes = new_holes; } } @@ -819,7 +819,7 @@ RENDER_AGAIN: remove_selected = m_imgui->button(m_desc.at("remove_selected")); m_imgui->disabled_end(); - m_imgui->disabled_begin(m_model_object->sla_drain_holes.empty()); + m_imgui->disabled_begin(m_c->m_model_object->sla_drain_holes.empty()); remove_all = m_imgui->button(m_desc.at("remove_all")); m_imgui->disabled_end(); @@ -842,7 +842,7 @@ RENDER_AGAIN: // make sure supports are shown/hidden as appropriate m_imgui->checkbox(m_desc["show_supports"], m_show_supports); - force_refresh = m_parent.toggle_sla_auxiliaries_visibility(m_show_supports, m_model_object, m_active_instance); + force_refresh = m_parent.toggle_sla_auxiliaries_visibility(m_show_supports, m_c->m_model_object, m_c->m_active_instance); m_imgui->end(); @@ -896,19 +896,19 @@ std::string GLGizmoHollow::on_get_name() const } -const TriangleMesh* GLGizmoHollow::mesh() const { - return (! m_mesh ? nullptr : (m_cavity_mesh ? m_cavity_mesh.get() : m_mesh)); -} +//const TriangleMesh* GLGizmoHollow::mesh() const { +// return (! m_c->m_mesh ? nullptr : (m_c->m_cavity_mesh ? m_c->m_cavity_mesh.get() : m_c->m_mesh)); +//} void GLGizmoHollow::on_set_state() { - // m_model_object pointer can be invalid (for instance because of undo/redo action), + // m_c->m_model_object pointer can be invalid (for instance because of undo/redo action), // we should recover it from the object id - m_model_object = nullptr; + m_c->m_model_object = nullptr; for (const auto mo : wxGetApp().model().objects) { - if (mo->id() == m_model_object_id) { - m_model_object = mo; + if (mo->id() == m_c->m_model_object_id) { + m_c->m_model_object = mo; break; } } @@ -922,12 +922,12 @@ void GLGizmoHollow::on_set_state() update_mesh(); // we'll now reload support points: - if (m_model_object) + if (m_c->m_model_object) reload_cache(); m_parent.toggle_model_objects_visibility(false); - if (m_model_object) - m_parent.toggle_model_objects_visibility(true, m_model_object, m_active_instance); + if (m_c->m_model_object) + m_parent.toggle_model_objects_visibility(true, m_c->m_model_object, m_c->m_active_instance); // Set default head diameter from config. const DynamicPrintConfig& cfg = wxGetApp().preset_bundle->sla_prints.get_edited_preset().config; @@ -938,11 +938,11 @@ void GLGizmoHollow::on_set_state() m_parent.toggle_model_objects_visibility(true); m_clipping_plane_distance = 0.f; // Release clippers and the AABB raycaster. - m_object_clipper.reset(); - m_supports_clipper.reset(); - m_mesh_raycaster.reset(); - m_cavity_mesh.reset(); - m_volume_with_cavity.reset(); + m_c->m_object_clipper.reset(); + m_c->m_supports_clipper.reset(); + m_c->m_mesh_raycaster.reset(); + m_c->m_cavity_mesh.reset(); + m_c->m_volume_with_cavity.reset(); } m_old_state = m_state; } @@ -954,7 +954,7 @@ void GLGizmoHollow::on_start_dragging() if (m_hover_id != -1) { select_point(NoPoints); select_point(m_hover_id); - m_hole_before_drag = m_model_object->sla_drain_holes[m_hover_id].pos; + m_hole_before_drag = m_c->m_model_object->sla_drain_holes[m_hover_id].pos; } else m_hole_before_drag = Vec3f::Zero(); @@ -964,14 +964,14 @@ void GLGizmoHollow::on_start_dragging() void GLGizmoHollow::on_stop_dragging() { if (m_hover_id != -1) { - Vec3f backup = m_model_object->sla_drain_holes[m_hover_id].pos; + Vec3f backup = m_c->m_model_object->sla_drain_holes[m_hover_id].pos; if (m_hole_before_drag != Vec3f::Zero() // some point was touched && backup != m_hole_before_drag) // and it was moved, not just selected { - m_model_object->sla_drain_holes[m_hover_id].pos = m_hole_before_drag; + m_c->m_model_object->sla_drain_holes[m_hover_id].pos = m_hole_before_drag; Plater::TakeSnapshot snapshot(wxGetApp().plater(), _(L("Move drainage hole"))); - m_model_object->sla_drain_holes[m_hover_id].pos = backup; + m_c->m_model_object->sla_drain_holes[m_hover_id].pos = backup; } } m_hole_before_drag = Vec3f::Zero(); @@ -983,7 +983,7 @@ void GLGizmoHollow::on_load(cereal::BinaryInputArchive& ar) { ar(m_clipping_plane_distance, *m_clipping_plane, - m_model_object_id, + m_c->m_model_object_id, m_new_hole_radius, m_new_hole_height, m_selected, @@ -997,7 +997,7 @@ void GLGizmoHollow::on_save(cereal::BinaryOutputArchive& ar) const { ar(m_clipping_plane_distance, *m_clipping_plane, - m_model_object_id, + m_c->m_model_object_id, m_new_hole_radius, m_new_hole_height, m_selected, @@ -1014,8 +1014,8 @@ void GLGizmoHollow::select_point(int i) m_selection_empty = (i == NoPoints); if (i == AllPoints) { - m_new_hole_radius = m_model_object->sla_drain_holes[0].radius; - m_new_hole_height = m_model_object->sla_drain_holes[0].height; + m_new_hole_radius = m_c->m_model_object->sla_drain_holes[0].radius; + m_new_hole_height = m_c->m_model_object->sla_drain_holes[0].height; } } else { @@ -1023,8 +1023,8 @@ void GLGizmoHollow::select_point(int i) m_selected.push_back(false); m_selected[i] = true; m_selection_empty = false; - m_new_hole_radius = m_model_object->sla_drain_holes[i].radius; - m_new_hole_height = m_model_object->sla_drain_holes[i].height; + m_new_hole_radius = m_c->m_model_object->sla_drain_holes[i].radius; + m_new_hole_height = m_c->m_model_object->sla_drain_holes[i].height; } } @@ -1044,7 +1044,7 @@ void GLGizmoHollow::unselect_point(int i) void GLGizmoHollow::reload_cache() { m_selected.clear(); - m_selected.assign(m_model_object->sla_drain_holes.size(), false); + m_selected.assign(m_c->m_model_object->sla_drain_holes.size(), false); } void GLGizmoHollow::update_clipping_plane(bool keep_normal) const @@ -1052,9 +1052,9 @@ void GLGizmoHollow::update_clipping_plane(bool keep_normal) const Vec3d normal = (keep_normal && m_clipping_plane->get_normal() != Vec3d::Zero() ? m_clipping_plane->get_normal() : -m_parent.get_camera().get_dir_forward()); - const Vec3d& center = m_model_object->instances[m_active_instance]->get_offset() + Vec3d(0., 0., m_z_shift); + const Vec3d& center = m_c->m_model_object->instances[m_c->m_active_instance]->get_offset() + Vec3d(0., 0., m_z_shift); float dist = normal.dot(center); - *m_clipping_plane = ClippingPlane(normal, (dist - (-m_active_instance_bb_radius) - m_clipping_plane_distance * 2*m_active_instance_bb_radius)); + *m_clipping_plane = ClippingPlane(normal, (dist - (-m_c->m_active_instance_bb_radius) - m_clipping_plane_distance * 2*m_c->m_active_instance_bb_radius)); m_parent.set_as_dirty(); } diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp index 8e022eb1e6..bea3960973 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp @@ -21,10 +21,10 @@ enum class SLAGizmoEventType : unsigned char; class GLGizmoHollow : public GLGizmoBase { private: - ModelObject* m_model_object = nullptr; - ObjectID m_model_object_id = 0; - int m_active_instance = -1; - float m_active_instance_bb_radius; // to cache the bb + //ModelObject* m_model_object = nullptr; + //ObjectID m_model_object_id = 0; + //int m_active_instance = -1; + //float m_active_instance_bb_radius; // to cache the bb mutable double m_z_shift = 0.; bool unproject_on_mesh(const Vec2d& mouse_pos, std::pair& pos_and_normal); @@ -32,19 +32,16 @@ private: GLUquadricObj* m_quadric; - std::unique_ptr m_mesh_raycaster; - std::unique_ptr m_cavity_mesh; - std::unique_ptr m_volume_with_cavity; - const TriangleMesh* m_mesh; - mutable const TriangleMesh* m_supports_mesh; - mutable std::vector m_triangles; - mutable std::vector m_supports_triangles; - mutable int m_old_timestamp = -1; - mutable int m_print_object_idx = -1; - mutable int m_print_objects_count = -1; + //std::unique_ptr m_mesh_raycaster; + //std::unique_ptr m_cavity_mesh; + //std::unique_ptr m_volume_with_cavity; + //const TriangleMesh* m_mesh; + //mutable int m_old_timestamp = -1; + //mutable int m_print_object_idx = -1; + //mutable int m_print_objects_count = -1; public: - GLGizmoHollow(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id); + GLGizmoHollow(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id, CommonGizmosData* cd); ~GLGizmoHollow() override; void set_sla_support_data(ModelObject* model_object, const Selection& selection); bool gizmo_event(SLAGizmoEventType action, const Vec2d& mouse_position, bool shift_down, bool alt_down, bool control_down); @@ -70,7 +67,6 @@ private: void update_mesh(); void hollow_mesh(); bool unsaved_changes() const; - const TriangleMesh* mesh() const; bool m_show_supports = true; float m_new_hole_radius; // Size of a new hole. @@ -104,8 +100,8 @@ private: bool m_selection_empty = true; EState m_old_state = Off; // to be able to see that the gizmo has just been closed (see on_set_state) - mutable std::unique_ptr m_object_clipper; - mutable std::unique_ptr m_supports_clipper; + //mutable std::unique_ptr m_object_clipper; + //mutable std::unique_ptr m_supports_clipper; std::vector get_config_options(const std::vector& keys) const; bool is_mesh_point_clipped(const Vec3d& point) const; @@ -126,7 +122,7 @@ protected: void on_set_hover_id() override { - if (int(m_model_object->sla_drain_holes.size()) <= m_hover_id) + if (int(m_c->m_model_object->sla_drain_holes.size()) <= m_hover_id) m_hover_id = -1; } void on_start_dragging() override; diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp index b10f571089..85d57a211e 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp @@ -22,8 +22,8 @@ namespace Slic3r { namespace GUI { -GLGizmoSlaSupports::GLGizmoSlaSupports(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id) - : GLGizmoBase(parent, icon_filename, sprite_id) +GLGizmoSlaSupports::GLGizmoSlaSupports(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id, CommonGizmosData* cd) + : GLGizmoBase(parent, icon_filename, sprite_id, cd) , m_quadric(nullptr) , m_its(nullptr) { @@ -64,23 +64,23 @@ bool GLGizmoSlaSupports::on_init() void GLGizmoSlaSupports::set_sla_support_data(ModelObject* model_object, const Selection& selection) { if (! model_object || selection.is_empty()) { - m_model_object = nullptr; + m_c->m_model_object = nullptr; return; } - if (m_model_object != model_object || m_model_object_id != model_object->id()) { - m_model_object = model_object; - m_print_object_idx = -1; + if (m_c->m_model_object != model_object || m_c->m_model_object_id != model_object->id()) { + m_c->m_model_object = model_object; + m_c->m_print_object_idx = -1; } - m_active_instance = selection.get_instance_idx(); + m_c->m_active_instance = selection.get_instance_idx(); if (model_object && selection.is_from_single_instance()) { // Cache the bb - it's needed for dealing with the clipping plane quite often // It could be done inside update_mesh but one has to account for scaling of the instance. //FIXME calling ModelObject::instance_bounding_box() is expensive! - m_active_instance_bb_radius = m_model_object->instance_bounding_box(m_active_instance).radius(); + m_c->m_active_instance_bb_radius = m_c->m_model_object->instance_bounding_box(m_c->m_active_instance).radius(); if (is_mesh_update_necessary()) { update_mesh(); @@ -88,12 +88,12 @@ void GLGizmoSlaSupports::set_sla_support_data(ModelObject* model_object, const S } // If we triggered autogeneration before, check backend and fetch results if they are there - if (m_model_object->sla_points_status == sla::PointsStatus::Generating) + if (m_c->m_model_object->sla_points_status == sla::PointsStatus::Generating) get_data_from_backend(); if (m_state == On) { m_parent.toggle_model_objects_visibility(false); - m_parent.toggle_model_objects_visibility(true, m_model_object, m_active_instance); + m_parent.toggle_model_objects_visibility(true, m_c->m_model_object, m_c->m_active_instance); } else m_parent.toggle_model_objects_visibility(true, nullptr, -1); @@ -106,16 +106,16 @@ void GLGizmoSlaSupports::on_render() const { const Selection& selection = m_parent.get_selection(); - // If current m_model_object does not match selection, ask GLCanvas3D to turn us off + // If current m_c->m_model_object does not match selection, ask GLCanvas3D to turn us off if (m_state == On - && (m_model_object != selection.get_model()->objects[selection.get_object_idx()] - || m_active_instance != selection.get_instance_idx() - || m_model_object_id != m_model_object->id())) { + && (m_c->m_model_object != selection.get_model()->objects[selection.get_object_idx()] + || m_c->m_active_instance != selection.get_instance_idx() + || m_c->m_model_object_id != m_c->m_model_object->id())) { m_parent.post_event(SimpleEvent(EVT_GLCANVAS_RESETGIZMOS)); return; } - if (! m_its || ! m_mesh) + if (! m_its || ! m_c->m_mesh) const_cast(this)->update_mesh(); glsafe(::glEnable(GL_BLEND)); @@ -136,7 +136,7 @@ void GLGizmoSlaSupports::on_render() const void GLGizmoSlaSupports::render_clipping_plane(const Selection& selection) const { - if (m_clipping_plane_distance == 0.f || m_mesh->empty()) + if (m_clipping_plane_distance == 0.f || m_c->m_mesh->empty()) return; // Get transformation of the instance @@ -154,66 +154,66 @@ void GLGizmoSlaSupports::render_clipping_plane(const Selection& selection) const 1.)); // Now initialize the TMS for the object, perform the cut and save the result. - if (! m_object_clipper) { - m_object_clipper.reset(new MeshClipper); - m_object_clipper->set_mesh(*m_mesh); + if (! m_c->m_object_clipper) { + m_c->m_object_clipper.reset(new MeshClipper); + m_c->m_object_clipper->set_mesh(*m_c->mesh()); } - m_object_clipper->set_plane(*m_clipping_plane); - m_object_clipper->set_transformation(trafo); + m_c->m_object_clipper->set_plane(*m_clipping_plane); + m_c->m_object_clipper->set_transformation(trafo); // Next, ask the backend if supports are already calculated. If so, we are gonna cut them too. // First we need a pointer to the respective SLAPrintObject. The index into objects vector is // cached so we don't have todo it on each render. We only search for the po if needed: - if (m_print_object_idx < 0 || (int)m_parent.sla_print()->objects().size() != m_print_objects_count) { - m_print_objects_count = m_parent.sla_print()->objects().size(); - m_print_object_idx = -1; + if (m_c->m_print_object_idx < 0 || (int)m_parent.sla_print()->objects().size() != m_c->m_print_objects_count) { + m_c->m_print_objects_count = m_parent.sla_print()->objects().size(); + m_c->m_print_object_idx = -1; for (const SLAPrintObject* po : m_parent.sla_print()->objects()) { - ++m_print_object_idx; - if (po->model_object()->id() == m_model_object->id()) + ++m_c->m_print_object_idx; + if (po->model_object()->id() == m_c->m_model_object->id()) break; } } - if (m_print_object_idx >= 0) { - const SLAPrintObject* print_object = m_parent.sla_print()->objects()[m_print_object_idx]; + if (m_c->m_print_object_idx >= 0) { + const SLAPrintObject* print_object = m_parent.sla_print()->objects()[m_c->m_print_object_idx]; if (print_object->is_step_done(slaposSupportTree) && !print_object->get_mesh(slaposSupportTree).empty()) { // If the supports are already calculated, save the timestamp of the respective step // so we can later tell they were recalculated. size_t timestamp = print_object->step_state_with_timestamp(slaposSupportTree).timestamp; - if (! m_supports_clipper || (int)timestamp != m_old_timestamp) { + if (! m_c->m_supports_clipper || (int)timestamp != m_c->m_old_timestamp) { // The timestamp has changed. - m_supports_clipper.reset(new MeshClipper); + m_c->m_supports_clipper.reset(new MeshClipper); // The mesh should already have the shared vertices calculated. - m_supports_clipper->set_mesh(print_object->support_mesh()); - m_old_timestamp = timestamp; + m_c->m_supports_clipper->set_mesh(print_object->support_mesh()); + m_c->m_old_timestamp = timestamp; } - m_supports_clipper->set_plane(*m_clipping_plane); - m_supports_clipper->set_transformation(supports_trafo); + m_c->m_supports_clipper->set_plane(*m_clipping_plane); + m_c->m_supports_clipper->set_transformation(supports_trafo); } else // The supports are not valid. We better dump the cached data. - m_supports_clipper.reset(); + m_c->m_supports_clipper.reset(); } // At this point we have the triangulated cuts for both the object and supports - let's render. - if (! m_object_clipper->get_triangles().empty()) { + if (! m_c->m_object_clipper->get_triangles().empty()) { ::glPushMatrix(); ::glColor3f(1.0f, 0.37f, 0.0f); ::glBegin(GL_TRIANGLES); - for (const Vec3f& point : m_object_clipper->get_triangles()) + for (const Vec3f& point : m_c->m_object_clipper->get_triangles()) ::glVertex3f(point(0), point(1), point(2)); ::glEnd(); ::glPopMatrix(); } - if (m_supports_clipper && ! m_supports_clipper->get_triangles().empty() && !m_editing_mode) { + if (m_c->m_supports_clipper && ! m_c->m_supports_clipper->get_triangles().empty() && !m_editing_mode) { // The supports are hidden in the editing mode, so it makes no sense to render the cuts. ::glPushMatrix(); ::glColor3f(1.0f, 0.f, 0.37f); ::glBegin(GL_TRIANGLES); - for (const Vec3f& point : m_supports_clipper->get_triangles()) + for (const Vec3f& point : m_c->m_supports_clipper->get_triangles()) ::glVertex3f(point(0), point(1), point(2)); ::glEnd(); ::glPopMatrix(); @@ -298,7 +298,7 @@ void GLGizmoSlaSupports::render_points(const Selection& selection, bool picking) if (m_editing_mode) { // in case the normal is not yet cached, find and cache it if (m_editing_cache[i].normal == Vec3f::Zero()) - m_mesh_raycaster->get_closest_point(m_editing_cache[i].support_point.pos, &m_editing_cache[i].normal); + m_c->m_mesh_raycaster->get_closest_point(m_editing_cache[i].support_point.pos, &m_editing_cache[i].normal); Eigen::Quaterniond q; q.setFromTwoVectors(Vec3d{0., 0., 1.}, instance_scaling_matrix_inverse * m_editing_cache[i].normal.cast()); @@ -333,7 +333,7 @@ void GLGizmoSlaSupports::render_points(const Selection& selection, bool picking) render_color[2] = 0.7f; render_color[3] = 0.7f; glsafe(::glColor4fv(render_color)); - for (const sla::DrainHole& drain_hole : m_model_object->sla_drain_holes) { + for (const sla::DrainHole& drain_hole : m_c->m_model_object->sla_drain_holes) { // Inverse matrix of the instance scaling is applied so that the mark does not scale with the object. glsafe(::glPushMatrix()); glsafe(::glTranslatef(drain_hole.pos(0), drain_hole.pos(1), drain_hole.pos(2))); @@ -377,7 +377,7 @@ bool GLGizmoSlaSupports::is_mesh_point_clipped(const Vec3d& point) const if (m_clipping_plane_distance == 0.f) return false; - Vec3d transformed_point = m_model_object->instances[m_active_instance]->get_transformation().get_matrix() * point; + Vec3d transformed_point = m_c->m_model_object->instances[m_c->m_active_instance]->get_transformation().get_matrix() * point; transformed_point(2) += m_z_shift; return m_clipping_plane->is_point_clipped(transformed_point); } @@ -386,28 +386,28 @@ bool GLGizmoSlaSupports::is_mesh_point_clipped(const Vec3d& point) const bool GLGizmoSlaSupports::is_mesh_update_necessary() const { - return ((m_state == On) && (m_model_object != nullptr) && !m_model_object->instances.empty()) - && ((m_model_object->id() != m_model_object_id) || m_its == nullptr); + return ((m_state == On) && (m_c->m_model_object != nullptr) && !m_c->m_model_object->instances.empty()) + && ((m_c->m_model_object->id() != m_c->m_model_object_id) || m_its == nullptr); } void GLGizmoSlaSupports::update_mesh() { - if (! m_model_object) + if (! m_c->m_model_object) return; wxBusyCursor wait; // this way we can use that mesh directly. // This mesh does not account for the possible Z up SLA offset. - m_mesh = &m_model_object->volumes.front()->mesh(); - m_its = &m_mesh->its; + m_c->m_mesh = &m_c->m_model_object->volumes.front()->mesh(); + m_its = &m_c->m_mesh->its; // If this is different mesh than last time or if the AABB tree is uninitialized, recalculate it. - if (m_model_object_id != m_model_object->id() || ! m_mesh_raycaster) - m_mesh_raycaster.reset(new MeshRaycaster(*m_mesh)); + if (m_c->m_model_object_id != m_c->m_model_object->id() || ! m_c->m_mesh_raycaster) + m_c->m_mesh_raycaster.reset(new MeshRaycaster(*m_c->mesh())); - m_model_object_id = m_model_object->id(); + m_c->m_model_object_id = m_c->m_model_object->id(); disable_editing_mode(); } @@ -417,7 +417,7 @@ void GLGizmoSlaSupports::update_mesh() bool GLGizmoSlaSupports::unproject_on_mesh(const Vec2d& mouse_pos, std::pair& pos_and_normal) { // if the gizmo doesn't have the V, F structures for igl, calculate them first: - if (! m_mesh_raycaster) + if (! m_c->m_mesh_raycaster) update_mesh(); const Camera& camera = m_parent.get_camera(); @@ -429,10 +429,10 @@ bool GLGizmoSlaSupports::unproject_on_mesh(const Vec2d& mouse_pos, std::pairunproject_on_mesh(mouse_pos, trafo.get_matrix(), camera, hit, normal, m_clipping_plane.get())) { + if (m_c->m_mesh_raycaster->unproject_on_mesh(mouse_pos, trafo.get_matrix(), camera, hit, normal, m_clipping_plane.get())) { // Check whether the hit is in a hole bool in_hole = false; - for (const sla::DrainHole& hole : m_model_object->sla_drain_holes) { + for (const sla::DrainHole& hole : m_c->m_model_object->sla_drain_holes) { if (hole.is_inside(hit)) { in_hole = true; break; @@ -505,7 +505,7 @@ bool GLGizmoSlaSupports::gizmo_event(SLAGizmoEventType action, const Vec2d& mous GLSelectionRectangle::EState rectangle_status = m_selection_rectangle.get_state(); // First collect positions of all the points in world coordinates. - Geometry::Transformation trafo = m_model_object->instances[m_active_instance]->get_transformation(); + Geometry::Transformation trafo = m_c->m_model_object->instances[m_c->m_active_instance]->get_transformation(); trafo.set_offset(trafo.get_offset() + Vec3d(0., 0., m_z_shift)); std::vector points; for (unsigned int i=0; i()); // Only select/deselect points that are actually visible - for (size_t idx : m_mesh_raycaster->get_unobscured_idxs(trafo, m_parent.get_camera(), points_inside, m_clipping_plane.get())) + for (size_t idx : m_c->m_mesh_raycaster->get_unobscured_idxs(trafo, m_parent.get_camera(), points_inside, m_clipping_plane.get())) { if (rectangle_status == GLSelectionRectangle::Deselect) unselect_point(points_idxs[idx]); @@ -656,10 +656,10 @@ std::vector GLGizmoSlaSupports::get_config_options(const st { std::vector out; - if (!m_model_object) + if (!m_c->m_model_object) return out; - const DynamicPrintConfig& object_cfg = m_model_object->config; + const DynamicPrintConfig& object_cfg = m_c->m_model_object->config; const DynamicPrintConfig& print_cfg = wxGetApp().preset_bundle->sla_prints.get_edited_preset().config; std::unique_ptr default_cfg = nullptr; @@ -682,7 +682,7 @@ std::vector GLGizmoSlaSupports::get_config_options(const st ClippingPlane GLGizmoSlaSupports::get_sla_clipping_plane() const { - if (!m_model_object || m_state == Off || m_clipping_plane_distance == 0.f) + if (!m_c->m_model_object || m_state == Off || m_clipping_plane_distance == 0.f) return ClippingPlane::ClipsNothing(); else return ClippingPlane(-m_clipping_plane->get_normal(), m_clipping_plane->get_data()[3]); @@ -711,7 +711,7 @@ void GLGizmoSlaSupports::find_intersecting_facets(const igl::AABBvolumes.front()->mesh); + TriangleMeshSlicer tms(&m_c->m_model_object->volumes.front()->mesh); Vec3f normal(0.f, 1.f, 1.f); double d = 0.; @@ -732,7 +732,7 @@ void GLGizmoSlaSupports::make_line_segments() const void GLGizmoSlaSupports::on_render_input_window(float x, float y, float bottom_limit) { - if (!m_model_object) + if (!m_c->m_model_object) return; bool first_run = true; // This is a hack to redraw the button when all points are removed, @@ -853,15 +853,15 @@ RENDER_AGAIN: m_density_stash = density; } if (slider_edited) { - m_model_object->config.opt("support_points_minimal_distance", true)->value = minimal_point_distance; - m_model_object->config.opt("support_points_density_relative", true)->value = (int)density; + m_c->m_model_object->config.opt("support_points_minimal_distance", true)->value = minimal_point_distance; + m_c->m_model_object->config.opt("support_points_density_relative", true)->value = (int)density; } if (slider_released) { - m_model_object->config.opt("support_points_minimal_distance", true)->value = m_minimal_point_distance_stash; - m_model_object->config.opt("support_points_density_relative", true)->value = (int)m_density_stash; + m_c->m_model_object->config.opt("support_points_minimal_distance", true)->value = m_minimal_point_distance_stash; + m_c->m_model_object->config.opt("support_points_density_relative", true)->value = (int)m_density_stash; Plater::TakeSnapshot snapshot(wxGetApp().plater(), _(L("Support parameter change"))); - m_model_object->config.opt("support_points_minimal_distance", true)->value = minimal_point_distance; - m_model_object->config.opt("support_points_density_relative", true)->value = (int)density; + m_c->m_model_object->config.opt("support_points_minimal_distance", true)->value = minimal_point_distance; + m_c->m_model_object->config.opt("support_points_density_relative", true)->value = (int)density; wxGetApp().obj_list()->update_and_show_object_settings_item(); } @@ -879,10 +879,10 @@ RENDER_AGAIN: m_imgui->disabled_end(); // m_imgui->text(""); - // m_imgui->text(m_model_object->sla_points_status == sla::PointsStatus::NoPoints ? _(L("No points (will be autogenerated)")) : - // (m_model_object->sla_points_status == sla::PointsStatus::AutoGenerated ? _(L("Autogenerated points (no modifications)")) : - // (m_model_object->sla_points_status == sla::PointsStatus::UserModified ? _(L("User-modified points")) : - // (m_model_object->sla_points_status == sla::PointsStatus::Generating ? _(L("Generation in progress...")) : "UNKNOWN STATUS")))); + // m_imgui->text(m_c->m_model_object->sla_points_status == sla::PointsStatus::NoPoints ? _(L("No points (will be autogenerated)")) : + // (m_c->m_model_object->sla_points_status == sla::PointsStatus::AutoGenerated ? _(L("Autogenerated points (no modifications)")) : + // (m_c->m_model_object->sla_points_status == sla::PointsStatus::UserModified ? _(L("User-modified points")) : + // (m_c->m_model_object->sla_points_status == sla::PointsStatus::Generating ? _(L("Generation in progress...")) : "UNKNOWN STATUS")))); } @@ -920,7 +920,7 @@ RENDER_AGAIN: // is done on each refresh because the user can switch the editing mode // before background process finishes. force_refresh = m_parent.toggle_sla_auxiliaries_visibility( - ! m_editing_mode, m_model_object, m_active_instance); + ! m_editing_mode, m_c->m_model_object, m_c->m_active_instance); if (remove_selected || remove_all) { force_refresh = false; @@ -978,12 +978,12 @@ std::string GLGizmoSlaSupports::on_get_name() const void GLGizmoSlaSupports::on_set_state() { - // m_model_object pointer can be invalid (for instance because of undo/redo action), + // m_c->m_model_object pointer can be invalid (for instance because of undo/redo action), // we should recover it from the object id - m_model_object = nullptr; + m_c->m_model_object = nullptr; for (const auto mo : wxGetApp().model().objects) { - if (mo->id() == m_model_object_id) { - m_model_object = mo; + if (mo->id() == m_c->m_model_object_id) { + m_c->m_model_object = mo; break; } } @@ -997,19 +997,19 @@ void GLGizmoSlaSupports::on_set_state() update_mesh(); // we'll now reload support points: - if (m_model_object) + if (m_c->m_model_object) reload_cache(); m_parent.toggle_model_objects_visibility(false); - if (m_model_object) - m_parent.toggle_model_objects_visibility(true, m_model_object, m_active_instance); + if (m_c->m_model_object) + m_parent.toggle_model_objects_visibility(true, m_c->m_model_object, m_c->m_active_instance); // Set default head diameter from config. const DynamicPrintConfig& cfg = wxGetApp().preset_bundle->sla_prints.get_edited_preset().config; m_new_point_head_diameter = static_cast(cfg.option("support_head_front_diameter"))->value; } if (m_state == Off && m_old_state != Off) { // the gizmo was just turned Off - bool will_ask = m_model_object && m_editing_mode && unsaved_changes(); + bool will_ask = m_c->m_model_object && m_editing_mode && unsaved_changes(); if (will_ask) { wxGetApp().CallAfter([this]() { // Following is called through CallAfter, because otherwise there was a problem @@ -1033,9 +1033,9 @@ void GLGizmoSlaSupports::on_set_state() m_clipping_plane_distance = 0.f; // Release clippers and the AABB raycaster. m_its = nullptr; - m_object_clipper.reset(); - m_supports_clipper.reset(); - m_mesh_raycaster.reset(); + m_c->m_object_clipper.reset(); + m_c->m_supports_clipper.reset(); + m_c->m_mesh_raycaster.reset(); } } m_old_state = m_state; @@ -1077,7 +1077,7 @@ void GLGizmoSlaSupports::on_load(cereal::BinaryInputArchive& ar) { ar(m_clipping_plane_distance, *m_clipping_plane, - m_model_object_id, + m_c->m_model_object_id, m_new_point_head_diameter, m_normal_cache, m_editing_cache, @@ -1091,7 +1091,7 @@ void GLGizmoSlaSupports::on_save(cereal::BinaryOutputArchive& ar) const { ar(m_clipping_plane_distance, *m_clipping_plane, - m_model_object_id, + m_c->m_model_object_id, m_new_point_head_diameter, m_normal_cache, m_editing_cache, @@ -1169,9 +1169,9 @@ void GLGizmoSlaSupports::editing_mode_apply_changes() for (const CacheEntry& ce : m_editing_cache) m_normal_cache.push_back(ce.support_point); - m_model_object->sla_points_status = sla::PointsStatus::UserModified; - m_model_object->sla_support_points.clear(); - m_model_object->sla_support_points = m_normal_cache; + m_c->m_model_object->sla_points_status = sla::PointsStatus::UserModified; + m_c->m_model_object->sla_support_points.clear(); + m_c->m_model_object->sla_support_points = m_normal_cache; reslice_SLA_supports(); } @@ -1182,10 +1182,10 @@ void GLGizmoSlaSupports::editing_mode_apply_changes() void GLGizmoSlaSupports::reload_cache() { m_normal_cache.clear(); - if (m_model_object->sla_points_status == sla::PointsStatus::AutoGenerated || m_model_object->sla_points_status == sla::PointsStatus::Generating) + if (m_c->m_model_object->sla_points_status == sla::PointsStatus::AutoGenerated || m_c->m_model_object->sla_points_status == sla::PointsStatus::Generating) get_data_from_backend(); else - for (const sla::SupportPoint& point : m_model_object->sla_support_points) + for (const sla::SupportPoint& point : m_c->m_model_object->sla_support_points) m_normal_cache.emplace_back(point); } @@ -1194,7 +1194,7 @@ bool GLGizmoSlaSupports::has_backend_supports() const { // find SlaPrintObject with this ID for (const SLAPrintObject* po : m_parent.sla_print()->objects()) { - if (po->model_object()->id() == m_model_object->id()) + if (po->model_object()->id() == m_c->m_model_object->id()) return po->is_step_done(slaposSupportPoints); } return false; @@ -1202,7 +1202,7 @@ bool GLGizmoSlaSupports::has_backend_supports() const void GLGizmoSlaSupports::reslice_SLA_supports(bool postpone_error_messages) const { - wxGetApp().CallAfter([this, postpone_error_messages]() { wxGetApp().plater()->reslice_SLA_supports(*m_model_object, postpone_error_messages); }); + wxGetApp().CallAfter([this, postpone_error_messages]() { wxGetApp().plater()->reslice_SLA_supports(*m_c->m_model_object, postpone_error_messages); }); } void GLGizmoSlaSupports::get_data_from_backend() @@ -1212,14 +1212,14 @@ void GLGizmoSlaSupports::get_data_from_backend() // find the respective SLAPrintObject, we need a pointer to it for (const SLAPrintObject* po : m_parent.sla_print()->objects()) { - if (po->model_object()->id() == m_model_object->id()) { + if (po->model_object()->id() == m_c->m_model_object->id()) { m_normal_cache.clear(); const std::vector& points = po->get_support_points(); auto mat = po->trafo().inverse().cast(); for (unsigned int i=0; isla_points_status = sla::PointsStatus::AutoGenerated; + m_c->m_model_object->sla_points_status = sla::PointsStatus::AutoGenerated; break; } } @@ -1236,10 +1236,10 @@ void GLGizmoSlaSupports::auto_generate() _(L("Are you sure you want to do it?")) + "\n", _(L("Warning")), wxICON_WARNING | wxYES | wxNO); - if (m_model_object->sla_points_status != sla::PointsStatus::UserModified || m_normal_cache.empty() || dlg.ShowModal() == wxID_YES) { + if (m_c->m_model_object->sla_points_status != sla::PointsStatus::UserModified || m_normal_cache.empty() || dlg.ShowModal() == wxID_YES) { Plater::TakeSnapshot snapshot(wxGetApp().plater(), _(L("Autogenerate support points"))); wxGetApp().CallAfter([this]() { reslice_SLA_supports(); }); - m_model_object->sla_points_status = sla::PointsStatus::Generating; + m_c->m_model_object->sla_points_status = sla::PointsStatus::Generating; } } @@ -1284,9 +1284,9 @@ void GLGizmoSlaSupports::update_clipping_plane(bool keep_normal) const Vec3d normal = (keep_normal && m_clipping_plane->get_normal() != Vec3d::Zero() ? m_clipping_plane->get_normal() : -m_parent.get_camera().get_dir_forward()); - const Vec3d& center = m_model_object->instances[m_active_instance]->get_offset() + Vec3d(0., 0., m_z_shift); + const Vec3d& center = m_c->m_model_object->instances[m_c->m_active_instance]->get_offset() + Vec3d(0., 0., m_z_shift); float dist = normal.dot(center); - *m_clipping_plane = ClippingPlane(normal, (dist - (-m_active_instance_bb_radius) - m_clipping_plane_distance * 2*m_active_instance_bb_radius)); + *m_clipping_plane = ClippingPlane(normal, (dist - (-m_c->m_active_instance_bb_radius) - m_clipping_plane_distance * 2*m_c->m_active_instance_bb_radius)); m_parent.set_as_dirty(); } diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp index 1de241a53c..7700ad3a61 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp @@ -21,10 +21,10 @@ enum class SLAGizmoEventType : unsigned char; class GLGizmoSlaSupports : public GLGizmoBase { private: - ModelObject* m_model_object = nullptr; - ObjectID m_model_object_id = 0; - int m_active_instance = -1; - float m_active_instance_bb_radius; // to cache the bb + //ModelObject* m_model_object = nullptr; + //ObjectID m_model_object_id = 0; + //int m_active_instance = -1; + //float m_active_instance_bb_radius; // to cache the bb mutable double m_z_shift = 0.f; bool unproject_on_mesh(const Vec2d& mouse_pos, std::pair& pos_and_normal); @@ -34,15 +34,12 @@ private: typedef Eigen::Map> MapMatrixXfUnaligned; typedef Eigen::Map> MapMatrixXiUnaligned; - std::unique_ptr m_mesh_raycaster; - const TriangleMesh* m_mesh; + //std::unique_ptr m_mesh_raycaster; + //const TriangleMesh* m_mesh; const indexed_triangle_set* m_its; - mutable const TriangleMesh* m_supports_mesh; - mutable std::vector m_triangles; - mutable std::vector m_supports_triangles; - mutable int m_old_timestamp = -1; - mutable int m_print_object_idx = -1; - mutable int m_print_objects_count = -1; + //mutable int m_old_timestamp = -1; + //mutable int m_print_object_idx = -1; + //mutable int m_print_objects_count = -1; class CacheEntry { public: @@ -72,7 +69,7 @@ private: }; public: - GLGizmoSlaSupports(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id); + GLGizmoSlaSupports(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id, CommonGizmosData* cd); ~GLGizmoSlaSupports() override; void set_sla_support_data(ModelObject* model_object, const Selection& selection); bool gizmo_event(SLAGizmoEventType action, const Vec2d& mouse_position, bool shift_down, bool alt_down, bool control_down); @@ -120,8 +117,8 @@ private: bool m_selection_empty = true; EState m_old_state = Off; // to be able to see that the gizmo has just been closed (see on_set_state) - mutable std::unique_ptr m_object_clipper; - mutable std::unique_ptr m_supports_clipper; + //mutable std::unique_ptr m_object_clipper; + //mutable std::unique_ptr m_supports_clipper; std::vector get_config_options(const std::vector& keys) const; bool is_mesh_point_clipped(const Vec3d& point) const; diff --git a/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp b/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp index 89a3134456..e089de3fc9 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp @@ -88,13 +88,15 @@ bool GLGizmosManager::init() return false; } + m_common_gizmos_data.reset(new CommonGizmosData()); + m_gizmos.emplace_back(new GLGizmoMove3D(m_parent, "move.svg", 0)); m_gizmos.emplace_back(new GLGizmoScale3D(m_parent, "scale.svg", 1)); m_gizmos.emplace_back(new GLGizmoRotate3D(m_parent, "rotate.svg", 2)); m_gizmos.emplace_back(new GLGizmoFlatten(m_parent, "place.svg", 3)); m_gizmos.emplace_back(new GLGizmoCut(m_parent, "cut.svg", 4)); - m_gizmos.emplace_back(new GLGizmoSlaSupports(m_parent, "sla_supports.svg", 5)); - m_gizmos.emplace_back(new GLGizmoHollow(m_parent, "hollow.svg", 6)); + m_gizmos.emplace_back(new GLGizmoSlaSupports(m_parent, "sla_supports.svg", 5, m_common_gizmos_data.get())); + m_gizmos.emplace_back(new GLGizmoHollow(m_parent, "hollow.svg", 6, m_common_gizmos_data.get())); for (auto& gizmo : m_gizmos) { if (! gizmo->init()) { diff --git a/src/slic3r/GUI/Gizmos/GLGizmosManager.hpp b/src/slic3r/GUI/Gizmos/GLGizmosManager.hpp index 2c4d713161..f816056a00 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmosManager.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmosManager.hpp @@ -101,6 +101,7 @@ private: MouseCapture m_mouse_capture; std::string m_tooltip; bool m_serializing; + std::unique_ptr m_common_gizmos_data; public: explicit GLGizmosManager(GLCanvas3D& parent); From 17de6ff51a7a1cab9cb90ec877f57ea44729fe80 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Tue, 17 Dec 2019 16:26:06 +0100 Subject: [PATCH 081/336] Fix linking of OpenVDB in debug mode on multi conf generators. --- cmake/modules/FindOpenVDB.cmake | 50 +++++++++++++++++++++++++++------ deps/CMakeLists.txt | 1 + 2 files changed, 43 insertions(+), 8 deletions(-) diff --git a/cmake/modules/FindOpenVDB.cmake b/cmake/modules/FindOpenVDB.cmake index 3400fa786b..e000b05dde 100644 --- a/cmake/modules/FindOpenVDB.cmake +++ b/cmake/modules/FindOpenVDB.cmake @@ -215,20 +215,44 @@ if(UNIX AND OPENVDB_USE_STATIC_LIBS) endif() set(OpenVDB_LIB_COMPONENTS "") +set(OpenVDB_DEBUG_SUFFIX "d" CACHE STRING "Suffix for the debug libraries") + +get_property(_is_multi GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) foreach(COMPONENT ${OpenVDB_FIND_COMPONENTS}) set(LIB_NAME ${COMPONENT}) - find_library(OpenVDB_${COMPONENT}_LIBRARY ${LIB_NAME} lib${LIB_NAME} + + find_library(OpenVDB_${COMPONENT}_LIBRARY_RELEASE ${LIB_NAME} lib${LIB_NAME} PATHS ${_OPENVDB_LIBRARYDIR_SEARCH_DIRS} PATH_SUFFIXES ${OPENVDB_PATH_SUFFIXES} ) - list(APPEND OpenVDB_LIB_COMPONENTS ${OpenVDB_${COMPONENT}_LIBRARY}) - if(OpenVDB_${COMPONENT}_LIBRARY) - set(OpenVDB_${COMPONENT}_FOUND TRUE) - else() - set(OpenVDB_${COMPONENT}_FOUND FALSE) - endif() + find_library(OpenVDB_${COMPONENT}_LIBRARY_DEBUG ${LIB_NAME}${OpenVDB_DEBUG_SUFFIX} lib${LIB_NAME}${OpenVDB_DEBUG_SUFFIX} + PATHS ${_OPENVDB_LIBRARYDIR_SEARCH_DIRS} + PATH_SUFFIXES ${OPENVDB_PATH_SUFFIXES} + ) + + if (_is_multi) + list(APPEND OpenVDB_LIB_COMPONENTS ${OpenVDB_${COMPONENT}_LIBRARY_RELEASE} ${OpenVDB_${COMPONENT}_LIBRARY_DEBUG}) + + if(OpenVDB_${COMPONENT}_LIBRARY_RELEASE AND ${OpenVDB_${COMPONENT}_LIBRARY_DEBUG}) + set(OpenVDB_${COMPONENT}_FOUND TRUE) + else() + set(OpenVDB_${COMPONENT}_FOUND FALSE) + endif() + else () + string(TOUPPER "${CMAKE_BUILD_TYPE}" _BUILD_TYPE) + + set(OpenVDB_${COMPONENT}_LIBRARY ${OpenVDB_${COMPONENT}_LIBRARY_${_BUILD_TYPE}}) + + list(APPEND OpenVDB_LIB_COMPONENTS ${OpenVDB_${COMPONENT}_LIBRARY}) + + if(OpenVDB_${COMPONENT}_LIBRARY) + set(OpenVDB_${COMPONENT}_FOUND TRUE) + else() + set(OpenVDB_${COMPONENT}_FOUND FALSE) + endif() + endif () endforeach() if(UNIX AND OPENVDB_USE_STATIC_LIBS) @@ -487,7 +511,6 @@ foreach(COMPONENT ${OpenVDB_FIND_COMPONENTS}) if(NOT TARGET OpenVDB::${COMPONENT}) add_library(OpenVDB::${COMPONENT} UNKNOWN IMPORTED) set_target_properties(OpenVDB::${COMPONENT} PROPERTIES - IMPORTED_LOCATION "${OpenVDB_${COMPONENT}_LIBRARY}" INTERFACE_COMPILE_OPTIONS "${OpenVDB_DEFINITIONS}" INTERFACE_INCLUDE_DIRECTORIES "${OpenVDB_INCLUDE_DIR}" IMPORTED_LINK_DEPENDENT_LIBRARIES "${_OPENVDB_HIDDEN_DEPENDENCIES}" # non visible deps @@ -495,6 +518,17 @@ foreach(COMPONENT ${OpenVDB_FIND_COMPONENTS}) INTERFACE_COMPILE_FEATURES cxx_std_11 ) + if (_is_multi) + set_target_properties(OpenVDB::${COMPONENT} PROPERTIES + IMPORTED_LOCATION_RELEASE "${OpenVDB_${COMPONENT}_LIBRARY_RELEASE}" + IMPORTED_LOCATION_DEBUG "${OpenVDB_${COMPONENT}_LIBRARY_DEBUG}" + ) + else () + set_target_properties(OpenVDB::${COMPONENT} PROPERTIES + IMPORTED_LOCATION "${OpenVDB_${COMPONENT}_LIBRARY}" + ) + endif () + if (OPENVDB_USE_STATIC_LIBS) set_target_properties(OpenVDB::${COMPONENT} PROPERTIES INTERFACE_COMPILE_DEFINITIONS "OPENVDB_STATICLIB;OPENVDB_OPENEXR_STATICLIB" diff --git a/deps/CMakeLists.txt b/deps/CMakeLists.txt index 5e6d28b587..3e6f70e427 100644 --- a/deps/CMakeLists.txt +++ b/deps/CMakeLists.txt @@ -47,6 +47,7 @@ message(STATUS "PrusaSlicer deps debug build: ${DEP_DEBUG}") find_package(Git REQUIRED) +get_property(_is_multi GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) function(prusaslicer_add_cmake_project projectname) cmake_parse_arguments(P_ARGS "" "INSTALL_DIR;BUILD_COMMAND;INSTALL_COMMAND" "CMAKE_ARGS" ${ARGN}) From 558529146cae7b031bedb97cc389fdab8b9cef3d Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Tue, 17 Dec 2019 16:27:28 +0100 Subject: [PATCH 082/336] Fix opencsg example on Win32 --- sandboxes/opencsg/CMakeLists.txt | 12 ++++++++--- sandboxes/opencsg/GLScene.cpp | 35 ++++++++++++++++---------------- sandboxes/opencsg/GLScene.hpp | 3 +++ sandboxes/opencsg/main.cpp | 34 +++++++++++++++++++------------ 4 files changed, 51 insertions(+), 33 deletions(-) diff --git a/sandboxes/opencsg/CMakeLists.txt b/sandboxes/opencsg/CMakeLists.txt index 651fbe82f7..cf66867a56 100644 --- a/sandboxes/opencsg/CMakeLists.txt +++ b/sandboxes/opencsg/CMakeLists.txt @@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 3.0) project(OpenCSG-example) -add_executable(opencsg_example main.cpp GLScene.hpp GLScene.cpp +add_executable(opencsg_example WIN32 main.cpp GLScene.hpp GLScene.cpp ${CMAKE_CURRENT_SOURCE_DIR}/../../src/slic3r/GUI/ProgressStatusBar.cpp ${CMAKE_CURRENT_SOURCE_DIR}/../../src/slic3r/GUI/I18N.hpp ${CMAKE_CURRENT_SOURCE_DIR}/../../src/slic3r/GUI/I18N.cpp) @@ -11,11 +11,17 @@ find_package(wxWidgets 3.1 REQUIRED COMPONENTS core base gl html) find_package(OpenGL REQUIRED) find_package(GLEW REQUIRED) find_package(OpenCSG REQUIRED) -find_package(GLUT REQUIRED) +# find_package(GLUT REQUIRED) include(${wxWidgets_USE_FILE}) target_link_libraries(opencsg_example libslic3r) target_include_directories(opencsg_example PRIVATE ${wxWidgets_INCLUDE_DIRS}) target_compile_definitions(opencsg_example PRIVATE ${wxWidgets_DEFINITIONS}) -target_link_libraries(opencsg_example ${wxWidgets_LIBRARIES} GLEW::GLEW OpenCSG::opencsg GLUT::GLUT OpenGL::OpenGL -lXrandr -lXext -lX11) + +target_link_libraries(opencsg_example ${wxWidgets_LIBRARIES} + OpenCSG::opencsg + GLEW::GLEW + OpenGL::GL + #-lXrandr -lXext -lX11 + ) diff --git a/sandboxes/opencsg/GLScene.cpp b/sandboxes/opencsg/GLScene.cpp index 1cfccb3b19..2c3d1ffcd1 100644 --- a/sandboxes/opencsg/GLScene.cpp +++ b/sandboxes/opencsg/GLScene.cpp @@ -5,11 +5,11 @@ #include -#ifdef __APPLE__ -#include -#else -#include -#endif +//#ifdef __APPLE__ +//#include +//#else +//#include +//#endif #include @@ -63,7 +63,7 @@ void renderfps () { static int msec = 0; last = msec; - msec = glutGet(GLUT_ELAPSED_TIME); +// msec = glutGet(GLUT_ELAPSED_TIME); if (last / 1000 != msec / 1000) { float correctedFps = fps * 1000.0f / float(msec - ancient); @@ -82,9 +82,9 @@ void renderfps () { glRasterPos2f(-1.0f, -1.0f); glDisable(GL_LIGHTING); std::string s = fpsStream.str(); - for (unsigned int i=0; iset_screen(width, height); + set_screen_size(width, height); } void Display::set_screen_size(long width, long height) @@ -389,8 +392,6 @@ void Display::set_screen_size(long width, long height) m_camera->set_screen(width, height); m_size = {width, height}; - - repaint(); } void Display::repaint() diff --git a/sandboxes/opencsg/GLScene.hpp b/sandboxes/opencsg/GLScene.hpp index 68cc59b01c..62863dc0b2 100644 --- a/sandboxes/opencsg/GLScene.hpp +++ b/sandboxes/opencsg/GLScene.hpp @@ -303,6 +303,8 @@ public: : m_camera(camera ? camera : std::make_shared()) {} + ~Display() override; + Camera * camera() { return m_camera.get(); } virtual void swap_buffers() = 0; @@ -370,5 +372,6 @@ public: void move_clip_plane(double z) { call_cameras(&Camera::set_clip_z, z); } }; + }} // namespace Slic3r::GL #endif // GLSCENE_HPP diff --git a/sandboxes/opencsg/main.cpp b/sandboxes/opencsg/main.cpp index c2f8a74aa1..3f764fe626 100644 --- a/sandboxes/opencsg/main.cpp +++ b/sandboxes/opencsg/main.cpp @@ -8,7 +8,7 @@ // For compilers that support precompilation, includes "wx/wx.h". #include #ifndef WX_PRECOMP - #include +#include #endif #include @@ -31,7 +31,7 @@ using namespace Slic3r::GL; class Canvas: public wxGLCanvas, public Slic3r::GL::Display { - std::unique_ptr m_context; + shptr m_context; public: void set_active(long w, long h) override @@ -54,6 +54,12 @@ public: m_context.reset(ctx); } + + ~Canvas() override + { + m_scene_cache.clear(); + m_context.reset(); + } }; class MyFrame: public wxFrame @@ -95,11 +101,11 @@ private: void bind_canvas_events_to_controller(); - void OnExit(wxCommandEvent& /*event*/) + void OnClose(wxCloseEvent& /*event*/) { RemoveChild(m_canvas.get()); - m_canvas->Destroy(); - Close( true ); + m_canvas.reset(); + Destroy(); } void OnOpen(wxCommandEvent &/*evt*/) @@ -117,10 +123,7 @@ private: void OnShown(wxShowEvent&) { const wxSize ClientSize = GetClientSize(); - m_canvas->set_active(ClientSize.x, ClientSize.y); - - m_canvas->set_screen_size(ClientSize.x, ClientSize.y); - m_canvas->repaint(); + m_canvas->set_active(ClientSize.x, ClientSize.y); // Do the repaint continuously Bind(wxEVT_IDLE, [this](wxIdleEvent &evt) { @@ -179,8 +182,9 @@ MyFrame::MyFrame(const wxString &title, const wxPoint &pos, const wxSize &size): wxDefaultPosition, wxDefaultSize, wxWANTS_CHARS | wxFULL_REPAINT_ON_RESIZE); m_ctl->add_display(m_canvas); - + wxPanel *control_panel = new wxPanel(this); + auto controlsizer = new wxBoxSizer(wxHORIZONTAL); auto slider_sizer = new wxBoxSizer(wxVERTICAL); auto console_sizer = new wxBoxSizer(wxVERTICAL); @@ -247,7 +251,9 @@ MyFrame::MyFrame(const wxString &title, const wxPoint &pos, const wxSize &size): SetSizer(sizer); Bind(wxEVT_MENU, &MyFrame::OnOpen, this, wxID_OPEN); - Bind(wxEVT_MENU, &MyFrame::OnExit, this, wxID_EXIT); + Bind(wxEVT_CLOSE_WINDOW, &MyFrame::OnClose, this); + Bind(wxEVT_MENU, [this](wxCommandEvent &) { Close(true); }, wxID_EXIT); + Bind(wxEVT_SHOW, &MyFrame::OnShown, this, GetId()); Bind(wxEVT_SLIDER, [this, slider](wxCommandEvent &) { @@ -334,7 +340,7 @@ void MyFrame::bind_canvas_events_to_controller() m_canvas->Bind(wxEVT_PAINT, [this](wxPaintEvent &) { // This is required even though dc is not used otherwise. - wxPaintDC dc(this); + wxPaintDC dc(m_canvas.get()); // Set the OpenGL viewport according to the client size of this // canvas. This is done here rather than in a wxSizeEvent handler @@ -347,7 +353,7 @@ void MyFrame::bind_canvas_events_to_controller() m_canvas->set_screen_size(ClientSize.x, ClientSize.y); m_canvas->repaint(); - }); + }, m_canvas->GetId()); } void MyFrame::SLAJob::process() @@ -370,3 +376,5 @@ void MyFrame::SLAJob::process() m_print->process(); } + +//int main() {} From 4e27faa236ae3ac8eeb603e638ae3db5f6ee027f Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Tue, 17 Dec 2019 16:53:45 +0100 Subject: [PATCH 083/336] Only consider openvdb debug if necessary. Add REQUIRED to openvdb --- CMakeLists.txt | 3 +-- cmake/modules/FindOpenVDB.cmake | 4 +++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f489e46c4b..26619e4594 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -409,8 +409,7 @@ if(SLIC3R_STATIC) set(USE_BLOSC TRUE) endif() - -find_package(OpenVDB 5.0 COMPONENTS openvdb) +find_package(OpenVDB 5.0 REQUIRED COMPONENTS openvdb) if(OpenVDB_FOUND) slic3r_remap_configs(IlmBase::Half RelWithDebInfo Release) endif() diff --git a/cmake/modules/FindOpenVDB.cmake b/cmake/modules/FindOpenVDB.cmake index e000b05dde..84b5f41169 100644 --- a/cmake/modules/FindOpenVDB.cmake +++ b/cmake/modules/FindOpenVDB.cmake @@ -235,7 +235,9 @@ foreach(COMPONENT ${OpenVDB_FIND_COMPONENTS}) if (_is_multi) list(APPEND OpenVDB_LIB_COMPONENTS ${OpenVDB_${COMPONENT}_LIBRARY_RELEASE} ${OpenVDB_${COMPONENT}_LIBRARY_DEBUG}) - if(OpenVDB_${COMPONENT}_LIBRARY_RELEASE AND ${OpenVDB_${COMPONENT}_LIBRARY_DEBUG}) + list(FIND CMAKE_CONFIGURATION_TYPES "Debug" _has_debug) + + if(OpenVDB_${COMPONENT}_LIBRARY_RELEASE AND (_has_debug LESS 0 OR OpenVDB_${COMPONENT}_LIBRARY_DEBUG)) set(OpenVDB_${COMPONENT}_FOUND TRUE) else() set(OpenVDB_${COMPONENT}_FOUND FALSE) From e25cd1ce1a2051d5ec61568120beb5fc340eafb7 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Tue, 17 Dec 2019 17:08:43 +0100 Subject: [PATCH 084/336] Grab the release in debug mode if there is no debug when not on msvc --- cmake/modules/FindOpenVDB.cmake | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/cmake/modules/FindOpenVDB.cmake b/cmake/modules/FindOpenVDB.cmake index 84b5f41169..7bc44bebb5 100644 --- a/cmake/modules/FindOpenVDB.cmake +++ b/cmake/modules/FindOpenVDB.cmake @@ -247,6 +247,10 @@ foreach(COMPONENT ${OpenVDB_FIND_COMPONENTS}) set(OpenVDB_${COMPONENT}_LIBRARY ${OpenVDB_${COMPONENT}_LIBRARY_${_BUILD_TYPE}}) + if (NOT MSVC AND NOT OpenVDB_${COMPONENT}_LIBRARY) + set(OpenVDB_${COMPONENT}_LIBRARY ${OpenVDB_${COMPONENT}_LIBRARY_RELEASE}) + endif () + list(APPEND OpenVDB_LIB_COMPONENTS ${OpenVDB_${COMPONENT}_LIBRARY}) if(OpenVDB_${COMPONENT}_LIBRARY) From acfaff3741380f81bd67f1cffb2e307f5f1c5802 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Tue, 17 Dec 2019 18:39:01 +0100 Subject: [PATCH 085/336] Dont use glut for fps measure. --- sandboxes/opencsg/CMakeLists.txt | 3 +- sandboxes/opencsg/GLScene.cpp | 58 ++++++++++++++++++++------------ 2 files changed, 38 insertions(+), 23 deletions(-) diff --git a/sandboxes/opencsg/CMakeLists.txt b/sandboxes/opencsg/CMakeLists.txt index cf66867a56..145912431f 100644 --- a/sandboxes/opencsg/CMakeLists.txt +++ b/sandboxes/opencsg/CMakeLists.txt @@ -11,7 +11,7 @@ find_package(wxWidgets 3.1 REQUIRED COMPONENTS core base gl html) find_package(OpenGL REQUIRED) find_package(GLEW REQUIRED) find_package(OpenCSG REQUIRED) -# find_package(GLUT REQUIRED) + find_package(GLUT REQUIRED) include(${wxWidgets_USE_FILE}) @@ -22,6 +22,7 @@ target_compile_definitions(opencsg_example PRIVATE ${wxWidgets_DEFINITIONS}) target_link_libraries(opencsg_example ${wxWidgets_LIBRARIES} OpenCSG::opencsg GLEW::GLEW + GLUT::GLUT OpenGL::GL #-lXrandr -lXext -lX11 ) diff --git a/sandboxes/opencsg/GLScene.cpp b/sandboxes/opencsg/GLScene.cpp index 2c3d1ffcd1..9df3b601ed 100644 --- a/sandboxes/opencsg/GLScene.cpp +++ b/sandboxes/opencsg/GLScene.cpp @@ -1,3 +1,5 @@ +#include + #include "GLScene.hpp" #include #include @@ -5,11 +7,11 @@ #include -//#ifdef __APPLE__ -//#include -//#else -//#include -//#endif +#ifdef __APPLE__ +#include +#else +#include +#endif #include @@ -56,23 +58,36 @@ Scene::Scene() = default; Scene::~Scene() = default; void renderfps () { - static std::ostringstream fpsStream; - static int fps = 0; - static int ancient = 0; - static int last = 0; - static int msec = 0; + using Clock = std::chrono::high_resolution_clock; + using Duration = Clock::duration; + using TimePoint = Clock::time_point; - last = msec; -// msec = glutGet(GLUT_ELAPSED_TIME); - if (last / 1000 != msec / 1000) { + static std::ostringstream fpsStream; + static int frames = 0; + static TimePoint last = Clock::now(); + + static const double resolution = 0.01; + static double fps = 0.; + + auto to_sec = [](Duration d) -> double { + return d.count() * double(Duration::period::num) / Duration::period::den; + }; + + ++frames; + + TimePoint msec = Clock::now(); + double seconds = to_sec(msec - last); + if (seconds >= resolution) { + last = msec; + + fps = 0.5 * (fps + frames / seconds); - float correctedFps = fps * 1000.0f / float(msec - ancient); fpsStream.str(""); - fpsStream << "fps: " << correctedFps << std::ends; + fpsStream << "fps: " << std::setprecision(4) << fps << std::ends; - ancient = msec; - fps = 0; + frames = 0; } + glDisable(GL_DEPTH_TEST); glLoadIdentity(); glMatrixMode(GL_PROJECTION); @@ -82,15 +97,14 @@ void renderfps () { glRasterPos2f(-1.0f, -1.0f); glDisable(GL_LIGHTING); std::string s = fpsStream.str(); -// for (unsigned int i=0; i Date: Wed, 18 Dec 2019 12:00:28 +0100 Subject: [PATCH 086/336] Separate fps counter and remove glut dependency --- sandboxes/opencsg/CMakeLists.txt | 3 -- sandboxes/opencsg/GLScene.cpp | 68 ++------------------------------ sandboxes/opencsg/GLScene.hpp | 64 ++++++++++++++++++++++++++++++ sandboxes/opencsg/main.cpp | 6 +++ 4 files changed, 73 insertions(+), 68 deletions(-) diff --git a/sandboxes/opencsg/CMakeLists.txt b/sandboxes/opencsg/CMakeLists.txt index 145912431f..a6256250d5 100644 --- a/sandboxes/opencsg/CMakeLists.txt +++ b/sandboxes/opencsg/CMakeLists.txt @@ -11,10 +11,8 @@ find_package(wxWidgets 3.1 REQUIRED COMPONENTS core base gl html) find_package(OpenGL REQUIRED) find_package(GLEW REQUIRED) find_package(OpenCSG REQUIRED) - find_package(GLUT REQUIRED) include(${wxWidgets_USE_FILE}) - target_link_libraries(opencsg_example libslic3r) target_include_directories(opencsg_example PRIVATE ${wxWidgets_INCLUDE_DIRS}) target_compile_definitions(opencsg_example PRIVATE ${wxWidgets_DEFINITIONS}) @@ -22,7 +20,6 @@ target_compile_definitions(opencsg_example PRIVATE ${wxWidgets_DEFINITIONS}) target_link_libraries(opencsg_example ${wxWidgets_LIBRARIES} OpenCSG::opencsg GLEW::GLEW - GLUT::GLUT OpenGL::GL #-lXrandr -lXext -lX11 ) diff --git a/sandboxes/opencsg/GLScene.cpp b/sandboxes/opencsg/GLScene.cpp index 9df3b601ed..5744e8be74 100644 --- a/sandboxes/opencsg/GLScene.cpp +++ b/sandboxes/opencsg/GLScene.cpp @@ -1,5 +1,3 @@ -#include - #include "GLScene.hpp" #include #include @@ -7,12 +5,6 @@ #include -#ifdef __APPLE__ -#include -#else -#include -#endif - #include #ifndef NDEBUG @@ -54,60 +46,8 @@ inline void glAssertRecentCall() { } namespace Slic3r { namespace GL { Scene::Scene() = default; - Scene::~Scene() = default; -void renderfps () { - using Clock = std::chrono::high_resolution_clock; - using Duration = Clock::duration; - using TimePoint = Clock::time_point; - - static std::ostringstream fpsStream; - static int frames = 0; - static TimePoint last = Clock::now(); - - static const double resolution = 0.01; - static double fps = 0.; - - auto to_sec = [](Duration d) -> double { - return d.count() * double(Duration::period::num) / Duration::period::den; - }; - - ++frames; - - TimePoint msec = Clock::now(); - double seconds = to_sec(msec - last); - if (seconds >= resolution) { - last = msec; - - fps = 0.5 * (fps + frames / seconds); - - fpsStream.str(""); - fpsStream << "fps: " << std::setprecision(4) << fps << std::ends; - - frames = 0; - } - - glDisable(GL_DEPTH_TEST); - glLoadIdentity(); - glMatrixMode(GL_PROJECTION); - glPushMatrix(); - glLoadIdentity(); - glColor3f(0.0f, 0.0f, 0.0f); - glRasterPos2f(-1.0f, -1.0f); - glDisable(GL_LIGHTING); - std::string s = fpsStream.str(); - for (unsigned int i=0; iview(); render_scene(); - renderfps(); +// renderfps(); + m_fps_counter.update(); swap_buffers(); } diff --git a/sandboxes/opencsg/GLScene.hpp b/sandboxes/opencsg/GLScene.hpp index 62863dc0b2..4fd524af23 100644 --- a/sandboxes/opencsg/GLScene.hpp +++ b/sandboxes/opencsg/GLScene.hpp @@ -3,6 +3,7 @@ #include #include +#include #include #include @@ -211,6 +212,60 @@ public: void set_clip_z(double z) { m_clip_z = z; } }; +class FpsCounter { + vector> m_listeners; + + using Clock = std::chrono::high_resolution_clock; + using Duration = Clock::duration; + using TimePoint = Clock::time_point; + + int m_frames = 0; + TimePoint m_last = Clock::now(), m_window = m_last; + + double m_resolution = 0.1, m_window_size = 1.0; + double m_fps = 0.; + + static double to_sec(Duration d) + { + return d.count() * double(Duration::period::num) / Duration::period::den; + } + +public: + + void update() + { + ++m_frames; + + TimePoint msec = Clock::now(); + + double seconds_window = to_sec(msec - m_window); + m_fps = 0.5 * m_fps + 0.5 * (m_frames / seconds_window); + + if (to_sec(msec - m_last) >= m_resolution) { + m_last = msec; + for (auto &l : m_listeners) l(m_fps); + } + + if (seconds_window >= m_window_size) { + m_frames = 0; + m_window = msec; + } + } + + void add_listener(std::function lst) + { + m_listeners.emplace_back(lst); + } + + void clear_listeners() { m_listeners = {}; } + + void set_notification_interval(double seconds); + void set_measure_window_size(double seconds); + + double get_notification_interval() const { return m_resolution; } + double get_mesure_window_size() const { return m_window_size; } +}; + class PerspectiveCamera: public Camera { public: @@ -296,6 +351,7 @@ protected: } m_scene_cache; shptr m_camera; + FpsCounter m_fps_counter; public: @@ -323,6 +379,14 @@ public: virtual void clear_screen(); virtual void render_scene(); + + template void set_fps_counter(_FpsCounter &&fpsc) + { + m_fps_counter = std::forward<_FpsCounter>(fpsc); + } + + const FpsCounter &get_fps_counter() const { return m_fps_counter; } + FpsCounter &get_fps_counter() { return m_fps_counter; } }; class Controller : public std::enable_shared_from_this, diff --git a/sandboxes/opencsg/main.cpp b/sandboxes/opencsg/main.cpp index 3f764fe626..28aa89f6d0 100644 --- a/sandboxes/opencsg/main.cpp +++ b/sandboxes/opencsg/main.cpp @@ -240,6 +240,12 @@ MyFrame::MyFrame(const wxString &title, const wxPoint &pos, const wxSize &size): auto optimization_select = add_combobox("Optimization", { "Default", "ForceOn", "On", "Off" }); depth_select->Disable(); + auto fpstext = new wxStaticText(control_panel, wxID_ANY, ""); + console_sizer->Add(fpstext, 0, wxALL, 5); + m_canvas->get_fps_counter().add_listener([fpstext](double fps) { + fpstext->SetLabel(wxString::Format("fps: %.2f", fps) ); + }); + controlsizer->Add(slider_sizer, 0, wxEXPAND); controlsizer->Add(console_sizer, 1, wxEXPAND); From fafc2a35100ca4bb63b6f153da8d7c20bac58625 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Wed, 18 Dec 2019 16:24:41 +0100 Subject: [PATCH 087/336] Recording and playback works --- sandboxes/opencsg/GLScene.cpp | 21 ++- sandboxes/opencsg/GLScene.hpp | 45 ++---- sandboxes/opencsg/main.cpp | 287 ++++++++++++++++++++++++++-------- 3 files changed, 254 insertions(+), 99 deletions(-) diff --git a/sandboxes/opencsg/GLScene.cpp b/sandboxes/opencsg/GLScene.cpp index 5744e8be74..dcd1217092 100644 --- a/sandboxes/opencsg/GLScene.cpp +++ b/sandboxes/opencsg/GLScene.cpp @@ -352,7 +352,6 @@ void Display::repaint() m_camera->view(); render_scene(); -// renderfps(); m_fps_counter.update(); swap_buffers(); @@ -508,4 +507,24 @@ bool enable_multisampling(bool e) MouseInput::Listener::~Listener() = default; +void FpsCounter::update() +{ + ++m_frames; + + TimePoint msec = Clock::now(); + + double seconds_window = to_sec(msec - m_window); + m_fps = 0.5 * m_fps + 0.5 * (m_frames / seconds_window); + + if (to_sec(msec - m_last) >= m_resolution) { + m_last = msec; + for (auto &l : m_listeners) l(m_fps); + } + + if (seconds_window >= m_window_size) { + m_frames = 0; + m_window = msec; + } +} + }} // namespace Slic3r::GL diff --git a/sandboxes/opencsg/GLScene.hpp b/sandboxes/opencsg/GLScene.hpp index 4fd524af23..d996528970 100644 --- a/sandboxes/opencsg/GLScene.hpp +++ b/sandboxes/opencsg/GLScene.hpp @@ -165,7 +165,6 @@ public: }; bool enable_multisampling(bool e = true); -void renderfps(); class Primitive : public OpenCSG::Primitive { @@ -190,8 +189,6 @@ public: } }; -class Scene; - class Camera { protected: Vec2f m_rot = {0., 0.}; @@ -212,6 +209,20 @@ public: void set_clip_z(double z) { m_clip_z = z; } }; +inline void reset(Camera &cam) +{ + cam.set_rotation({0., 0.}); + cam.set_zoom(0.); + cam.set_reference_point({0., 0., 0.}); + cam.set_clip_z(0.); +} + +class PerspectiveCamera: public Camera { +public: + + void set_screen(long width, long height) override; +}; + class FpsCounter { vector> m_listeners; @@ -232,25 +243,7 @@ class FpsCounter { public: - void update() - { - ++m_frames; - - TimePoint msec = Clock::now(); - - double seconds_window = to_sec(msec - m_window); - m_fps = 0.5 * m_fps + 0.5 * (m_frames / seconds_window); - - if (to_sec(msec - m_last) >= m_resolution) { - m_last = msec; - for (auto &l : m_listeners) l(m_fps); - } - - if (seconds_window >= m_window_size) { - m_frames = 0; - m_window = msec; - } - } + void update(); void add_listener(std::function lst) { @@ -266,12 +259,6 @@ public: double get_mesure_window_size() const { return m_window_size; } }; -class PerspectiveCamera: public Camera { -public: - - void set_screen(long width, long height) override; -}; - class CSGSettings { public: static const constexpr unsigned DEFAULT_CONVEXITY = 10; @@ -397,7 +384,7 @@ class Controller : public std::enable_shared_from_this, Vec2i m_mouse_pos, m_mouse_pos_rprev, m_mouse_pos_lprev; bool m_left_btn = false, m_right_btn = false; - shptr m_scene; + shptr m_scene; vector> m_displays; // Call a method of Camera on all the cameras of the attached displays diff --git a/sandboxes/opencsg/main.cpp b/sandboxes/opencsg/main.cpp index 28aa89f6d0..8050ae792e 100644 --- a/sandboxes/opencsg/main.cpp +++ b/sandboxes/opencsg/main.cpp @@ -53,6 +53,23 @@ public: } m_context.reset(ctx); + + Bind(wxEVT_PAINT, [this](wxPaintEvent &) { + // This is required even though dc is not used otherwise. + wxPaintDC dc(this); + + // Set the OpenGL viewport according to the client size of this + // canvas. This is done here rather than in a wxSizeEvent handler + // because our OpenGL rendering context (and thus viewport + // setting) is used with multiple canvases: If we updated the + // viewport in the wxSizeEvent handler, changing the size of one + // canvas causes a viewport setting that is wrong when next + // another canvas is repainted. + const wxSize ClientSize = GetClientSize(); + + set_screen_size(ClientSize.x, ClientSize.y); + repaint(); + }); } ~Canvas() override @@ -62,6 +79,93 @@ public: } }; +enum EEvents { LCLK_U, RCLK_U, LCLK_D, RCLK_D, DDCLK, SCRL, MV }; +struct Event +{ + EEvents type; + long a, b; + Event(EEvents t, long x = 0, long y = 0) : type{t}, a{x}, b{y} {} +}; + +class RecorderMouseInput: public MouseInput { + std::vector m_events; + bool m_recording = false, m_playing = false; + +public: + void left_click_down() override + { + if (m_recording) m_events.emplace_back(LCLK_D); + if (!m_playing) MouseInput::left_click_down(); + } + void left_click_up() override + { + if (m_recording) m_events.emplace_back(LCLK_U); + if (!m_playing) MouseInput::left_click_up(); + } + void right_click_down() override + { + if (m_recording) m_events.emplace_back(RCLK_D); + if (!m_playing) MouseInput::right_click_down(); + } + void right_click_up() override + { + if (m_recording) m_events.emplace_back(RCLK_U); + if (!m_playing) MouseInput::right_click_up(); + } + void double_click() override + { + if (m_recording) m_events.emplace_back(DDCLK); + if (!m_playing) MouseInput::double_click(); + } + void scroll(long v, long d, WheelAxis wa) override + { + if (m_recording) m_events.emplace_back(SCRL, v, d); + if (!m_playing) MouseInput::scroll(v, d, wa); + } + void move_to(long x, long y) override + { + if (m_recording) m_events.emplace_back(MV, x, y); + if (!m_playing) MouseInput::move_to(x, y); + } + + void save(std::ostream &stream) + { + for (const Event &evt : m_events) + stream << evt.type << " " << evt.a << " " << evt.b << std::endl; + } + + void load(std::istream &stream) + { + m_events.clear(); + while (stream.good()) { + int type; long a, b; + stream >> type >> a >> b; + m_events.emplace_back(EEvents(type), a, b); + } + } + + void record(bool r) { m_recording = r; if (r) m_events.clear(); } + + void play() + { + m_playing = true; + for (const Event &evt : m_events) { + switch (evt.type) { + case LCLK_U: MouseInput::left_click_up(); break; + case LCLK_D: MouseInput::left_click_down(); break; + case RCLK_U: MouseInput::right_click_up(); break; + case RCLK_D: MouseInput::right_click_down(); break; + case DDCLK: MouseInput::double_click(); break; + case SCRL: MouseInput::scroll(evt.a, evt.b, WheelAxis::waVertical); break; + case MV: MouseInput::move_to(evt.a, evt.b); break; + } + + wxSafeYield(); + } + m_playing = false; + } +}; + class MyFrame: public wxFrame { shptr m_scene; // Model @@ -69,12 +173,14 @@ class MyFrame: public wxFrame shptr m_ctl; // Controller shptr m_stbar; - uqptr m_ui_job; + + RecorderMouseInput m_mouse; class SLAJob: public Slic3r::GUI::Job { MyFrame *m_parent; std::unique_ptr m_print; std::string m_fname; + public: SLAJob(MyFrame *frame, const std::string &fname) : Slic3r::GUI::Job{frame->m_stbar} @@ -84,8 +190,9 @@ class MyFrame: public wxFrame void process() override; - protected: + const std::string & get_project_fname() const { return m_fname; } + protected: void finalize() override { m_parent->m_scene->set_print(std::move(m_print)); @@ -94,52 +201,53 @@ class MyFrame: public wxFrame } }; + uqptr m_ui_job; + public: MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size); -private: - - void bind_canvas_events_to_controller(); - - void OnClose(wxCloseEvent& /*event*/) - { - RemoveChild(m_canvas.get()); - m_canvas.reset(); - Destroy(); + void load_model(const std::string &fname) { + m_ui_job = std::make_unique(this, fname); + m_ui_job->start(); } - void OnOpen(wxCommandEvent &/*evt*/) + void play_back_mouse(const std::string &events_fname) { - wxFileDialog dlg(this, "Select project file", - wxEmptyString, wxEmptyString, "*.3mf"); - - if (dlg.ShowModal() == wxID_OK) - { - m_ui_job = std::make_unique(this, dlg.GetPath().ToStdString()); - m_ui_job->start(); + std::fstream stream(events_fname, std::fstream::in); + + if (stream.good()) { + std::string model_name; + std::getline(stream, model_name); + load_model(model_name); + m_mouse.load(stream); + m_mouse.play(); } } - void OnShown(wxShowEvent&) - { - const wxSize ClientSize = GetClientSize(); - m_canvas->set_active(ClientSize.x, ClientSize.y); - - // Do the repaint continuously - Bind(wxEVT_IDLE, [this](wxIdleEvent &evt) { - m_canvas->repaint(); - evt.RequestMore(); - }); - } + void bind_canvas_events(MouseInput &msinput); }; class App : public wxApp { MyFrame *m_frame; + public: bool OnInit() override { + + std::string fname; + std::string command; + + if (argc > 2) { + command = argv[1]; + fname = argv[2]; + } + m_frame = new MyFrame("PrusaSlicer OpenCSG Demo", wxDefaultPosition, wxSize(1024, 768)); - m_frame->Show( true ); + if (command == "play") { + m_frame->Show( true ); + m_frame->play_back_mouse(fname); + m_frame->Close( true ); + } else m_frame->Show( true ); return true; } @@ -246,6 +354,9 @@ MyFrame::MyFrame(const wxString &title, const wxPoint &pos, const wxSize &size): fpstext->SetLabel(wxString::Format("fps: %.2f", fps) ); }); + auto record_btn = new wxToggleButton(control_panel, wxID_ANY, "Record"); + console_sizer->Add(record_btn, 0, wxALL | wxEXPAND, 5); + controlsizer->Add(slider_sizer, 0, wxEXPAND); controlsizer->Add(console_sizer, 1, wxEXPAND); @@ -256,11 +367,26 @@ MyFrame::MyFrame(const wxString &title, const wxPoint &pos, const wxSize &size): sizer->Add(control_panel, 0, wxEXPAND); SetSizer(sizer); - Bind(wxEVT_MENU, &MyFrame::OnOpen, this, wxID_OPEN); - Bind(wxEVT_CLOSE_WINDOW, &MyFrame::OnClose, this); + Bind(wxEVT_CLOSE_WINDOW, [this](wxCloseEvent &){ + RemoveChild(m_canvas.get()); + m_canvas.reset(); + Destroy(); + }); + + Bind(wxEVT_MENU, [this](wxCommandEvent &) { + wxFileDialog dlg(this, "Select project file", wxEmptyString, + wxEmptyString, "*.3mf", wxFD_OPEN|wxFD_FILE_MUST_EXIST); + + if (dlg.ShowModal() == wxID_OK) load_model(dlg.GetPath().ToStdString()); + }, wxID_OPEN); + Bind(wxEVT_MENU, [this](wxCommandEvent &) { Close(true); }, wxID_EXIT); - Bind(wxEVT_SHOW, &MyFrame::OnShown, this, GetId()); + Bind(wxEVT_SHOW, [this, ms_toggle](wxShowEvent &) { + const wxSize ClientSize = GetClientSize(); + m_canvas->set_active(ClientSize.x, ClientSize.y); + enable_multisampling(ms_toggle->GetValue()); + }); Bind(wxEVT_SLIDER, [this, slider](wxCommandEvent &) { m_ctl->move_clip_plane(double(slider->GetValue())); @@ -312,54 +438,73 @@ MyFrame::MyFrame(const wxString &title, const wxPoint &pos, const wxSize &size): } }); - bind_canvas_events_to_controller(); + record_btn->Bind(wxEVT_TOGGLEBUTTON, [this, record_btn](wxCommandEvent &) { + if (!m_ui_job) { + m_stbar->set_status_text("No project loaded!"); + return; + } + + if (record_btn->GetValue()) { + if (m_canvas->camera()) reset(*m_canvas->camera()); + m_ctl->on_scene_updated(*m_scene); + m_mouse.record(true); + } else { + m_mouse.record(false); + wxFileDialog dlg(this, "Select output file", + wxEmptyString, wxEmptyString, "*.events", + wxFD_SAVE|wxFD_OVERWRITE_PROMPT); + + if (dlg.ShowModal() == wxID_OK) { + std::fstream stream(dlg.GetPath().ToStdString(), + std::fstream::out); + + if (stream.good()) { + stream << m_ui_job->get_project_fname() << "\n"; + m_mouse.save(stream); + } + } + } + }); + + // Do the repaint continuously + m_canvas->Bind(wxEVT_IDLE, [this](wxIdleEvent &evt) { + if (m_canvas->IsShown()) m_canvas->repaint(); + evt.RequestMore(); + }); + + bind_canvas_events(m_mouse); } -void MyFrame::bind_canvas_events_to_controller() +void MyFrame::bind_canvas_events(MouseInput &ms) { - m_canvas->Bind(wxEVT_MOUSEWHEEL, [this](wxMouseEvent &evt) { - m_ctl->on_scroll(evt.GetWheelRotation(), evt.GetWheelDelta(), - evt.GetWheelAxis() == wxMOUSE_WHEEL_VERTICAL ? - Slic3r::GL::MouseInput::waVertical : - Slic3r::GL::MouseInput::waHorizontal); + m_canvas->Bind(wxEVT_MOUSEWHEEL, [&ms](wxMouseEvent &evt) { + ms.scroll(evt.GetWheelRotation(), evt.GetWheelDelta(), + evt.GetWheelAxis() == wxMOUSE_WHEEL_VERTICAL ? + Slic3r::GL::MouseInput::waVertical : + Slic3r::GL::MouseInput::waHorizontal); }); - m_canvas->Bind(wxEVT_MOTION, [this](wxMouseEvent &evt) { - m_ctl->on_moved_to(evt.GetPosition().x, evt.GetPosition().y); + m_canvas->Bind(wxEVT_MOTION, [&ms](wxMouseEvent &evt) { + ms.move_to(evt.GetPosition().x, evt.GetPosition().y); }); - m_canvas->Bind(wxEVT_RIGHT_DOWN, [this](wxMouseEvent & /*evt*/) { - m_ctl->on_right_click_down(); + m_canvas->Bind(wxEVT_RIGHT_DOWN, [&ms](wxMouseEvent & /*evt*/) { + ms.right_click_down(); }); - m_canvas->Bind(wxEVT_RIGHT_UP, [this](wxMouseEvent & /*evt*/) { - m_ctl->on_right_click_up(); + m_canvas->Bind(wxEVT_RIGHT_UP, [&ms](wxMouseEvent & /*evt*/) { + ms.right_click_up(); }); - m_canvas->Bind(wxEVT_LEFT_DOWN, [this](wxMouseEvent & /*evt*/) { - m_ctl->on_left_click_down(); + m_canvas->Bind(wxEVT_LEFT_DOWN, [&ms](wxMouseEvent & /*evt*/) { + ms.left_click_down(); }); - m_canvas->Bind(wxEVT_LEFT_UP, [this](wxMouseEvent & /*evt*/) { - m_ctl->on_left_click_up(); + m_canvas->Bind(wxEVT_LEFT_UP, [&ms](wxMouseEvent & /*evt*/) { + ms.left_click_up(); }); - - m_canvas->Bind(wxEVT_PAINT, [this](wxPaintEvent &) { - // This is required even though dc is not used otherwise. - wxPaintDC dc(m_canvas.get()); - - // Set the OpenGL viewport according to the client size of this - // canvas. This is done here rather than in a wxSizeEvent handler - // because our OpenGL rendering context (and thus viewport setting) is - // used with multiple canvases: If we updated the viewport in the - // wxSizeEvent handler, changing the size of one canvas causes a - // viewport setting that is wrong when next another canvas is - // repainted. - const wxSize ClientSize = m_canvas->GetClientSize(); - - m_canvas->set_screen_size(ClientSize.x, ClientSize.y); - m_canvas->repaint(); - }, m_canvas->GetId()); + + ms.add_listener(m_ctl); } void MyFrame::SLAJob::process() @@ -380,7 +525,11 @@ void MyFrame::SLAJob::process() update_status(status.percent, status.text); }); - m_print->process(); + try { + m_print->process(); + } catch(std::exception &e) { + update_status(0, wxString("Exception during processing: ") + e.what()); + } } //int main() {} From bf44da0e37a2ffafa8a2a40fac79e9820b6cdd18 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Thu, 19 Dec 2019 01:55:46 +0100 Subject: [PATCH 088/336] Make it work with mesa sw renderer --- sandboxes/opencsg/main.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/sandboxes/opencsg/main.cpp b/sandboxes/opencsg/main.cpp index 8050ae792e..c7be068559 100644 --- a/sandboxes/opencsg/main.cpp +++ b/sandboxes/opencsg/main.cpp @@ -2,6 +2,8 @@ #include #include +#include "GLScene.hpp" + #include #include @@ -18,8 +20,6 @@ #include #include -#include "GLScene.hpp" - #include "libslic3r/Model.hpp" #include "libslic3r/Format/3mf.hpp" #include "libslic3r/SLAPrint.hpp" @@ -68,7 +68,7 @@ public: const wxSize ClientSize = GetClientSize(); set_screen_size(ClientSize.x, ClientSize.y); - repaint(); +// repaint(); }); } @@ -280,7 +280,7 @@ MyFrame::MyFrame(const wxString &title, const wxPoint &pos, const wxSize &size): // glReadPixels would not return the alpha channel on NVIDIA if // not requested when the GL context is created. WX_GL_MIN_ALPHA, 8, WX_GL_DEPTH_SIZE, 8, WX_GL_STENCIL_SIZE, 8, - WX_GL_SAMPLE_BUFFERS, GL_TRUE, WX_GL_SAMPLES, 4, 0}; + /*WX_GL_SAMPLE_BUFFERS, GL_TRUE, WX_GL_SAMPLES, 4,*/ 0}; m_scene = std::make_shared(); m_ctl = std::make_shared(); @@ -509,7 +509,7 @@ void MyFrame::bind_canvas_events(MouseInput &ms) void MyFrame::SLAJob::process() { - using Status = Slic3r::PrintBase::SlicingStatus; + using SlStatus = Slic3r::PrintBase::SlicingStatus; Slic3r::DynamicPrintConfig cfg; auto model = Slic3r::Model::read_from_file(m_fname, &cfg); @@ -521,7 +521,7 @@ void MyFrame::SLAJob::process() params.to_object_step = Slic3r::slaposHollowing; m_print->set_task(params); - m_print->set_status_callback([this](const Status &status) { + m_print->set_status_callback([this](const SlStatus &status) { update_status(status.percent, status.text); }); From 8126cdd50762c43b632c243e8a875c0c00c66aff Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Thu, 19 Dec 2019 14:51:38 +0100 Subject: [PATCH 089/336] Add command line options. Rename GLScene to Engine --- sandboxes/opencsg/CMakeLists.txt | 2 +- sandboxes/opencsg/{GLScene.cpp => Engine.cpp} | 20 +- sandboxes/opencsg/{GLScene.hpp => Engine.hpp} | 55 ++--- sandboxes/opencsg/main.cpp | 195 ++++++++++++------ 4 files changed, 175 insertions(+), 97 deletions(-) rename sandboxes/opencsg/{GLScene.cpp => Engine.cpp} (97%) rename sandboxes/opencsg/{GLScene.hpp => Engine.hpp} (98%) diff --git a/sandboxes/opencsg/CMakeLists.txt b/sandboxes/opencsg/CMakeLists.txt index a6256250d5..600ef7884a 100644 --- a/sandboxes/opencsg/CMakeLists.txt +++ b/sandboxes/opencsg/CMakeLists.txt @@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 3.0) project(OpenCSG-example) -add_executable(opencsg_example WIN32 main.cpp GLScene.hpp GLScene.cpp +add_executable(opencsg_example WIN32 main.cpp Engine.hpp Engine.cpp ${CMAKE_CURRENT_SOURCE_DIR}/../../src/slic3r/GUI/ProgressStatusBar.cpp ${CMAKE_CURRENT_SOURCE_DIR}/../../src/slic3r/GUI/I18N.hpp ${CMAKE_CURRENT_SOURCE_DIR}/../../src/slic3r/GUI/I18N.cpp) diff --git a/sandboxes/opencsg/GLScene.cpp b/sandboxes/opencsg/Engine.cpp similarity index 97% rename from sandboxes/opencsg/GLScene.cpp rename to sandboxes/opencsg/Engine.cpp index dcd1217092..590faa2967 100644 --- a/sandboxes/opencsg/GLScene.cpp +++ b/sandboxes/opencsg/Engine.cpp @@ -1,4 +1,4 @@ -#include "GLScene.hpp" +#include "Engine.hpp" #include #include #include @@ -48,7 +48,7 @@ namespace Slic3r { namespace GL { Scene::Scene() = default; Scene::~Scene() = default; -void Display::render_scene() +void CSGDisplay::render_scene() { GLfloat color[] = {1.f, 1.f, 0.f, 0.f}; glsafe(::glColor4fv(color)); @@ -95,14 +95,14 @@ BoundingBoxf3 Scene::get_bounding_box() const return m_print->model().bounding_box(); } -void Display::SceneCache::clear() +void CSGDisplay::SceneCache::clear() { primitives_csg.clear(); primitives_free.clear(); primitives.clear(); } -shptr Display::SceneCache::add_mesh(const TriangleMesh &mesh) +shptr CSGDisplay::SceneCache::add_mesh(const TriangleMesh &mesh) { auto p = std::make_shared(); p->load_mesh(mesh); @@ -111,9 +111,9 @@ shptr Display::SceneCache::add_mesh(const TriangleMesh &mesh) return p; } -shptr Display::SceneCache::add_mesh(const TriangleMesh &mesh, - OpenCSG::Operation o, - unsigned c) +shptr CSGDisplay::SceneCache::add_mesh(const TriangleMesh &mesh, + OpenCSG::Operation o, + unsigned c) { auto p = std::make_shared(o, c); p->load_mesh(mesh); @@ -388,7 +388,7 @@ void Controller::on_moved_to(long x, long y) m_mouse_pos = {x, y}; } -void Display::apply_csgsettings(const CSGSettings &settings) +void CSGDisplay::apply_csgsettings(const CSGSettings &settings) { using namespace OpenCSG; @@ -404,11 +404,9 @@ void Display::apply_csgsettings(const CSGSettings &settings) if (p->getConvexity() > 1) p->setConvexity(m_csgsettings.get_convexity()); } - - repaint(); } -void Display::on_scene_updated(const Scene &scene) +void CSGDisplay::on_scene_updated(const Scene &scene) { const SLAPrint *print = scene.get_print(); if (!print) return; diff --git a/sandboxes/opencsg/GLScene.hpp b/sandboxes/opencsg/Engine.hpp similarity index 98% rename from sandboxes/opencsg/GLScene.hpp rename to sandboxes/opencsg/Engine.hpp index d996528970..5e70305236 100644 --- a/sandboxes/opencsg/GLScene.hpp +++ b/sandboxes/opencsg/Engine.hpp @@ -1,5 +1,5 @@ -#ifndef GLSCENE_HPP -#define GLSCENE_HPP +#ifndef SLIC3R_OCSG_EXMP_ENGINE_HPP +#define SLIC3R_OCSG_EXMP_ENGINE_HPP_HPP #include #include @@ -322,21 +322,6 @@ protected: Vec2i m_size; bool m_initialized = false; - CSGSettings m_csgsettings; - - struct SceneCache { - vector> primitives; - vector primitives_free; - vector primitives_csg; - - void clear(); - - shptr add_mesh(const TriangleMesh &mesh); - shptr add_mesh(const TriangleMesh &mesh, - OpenCSG::Operation op, - unsigned covexity); - } m_scene_cache; - shptr m_camera; FpsCounter m_fps_counter; @@ -359,13 +344,8 @@ public: bool is_initialized() const { return m_initialized; } - const CSGSettings & get_csgsettings() const { return m_csgsettings; } - void apply_csgsettings(const CSGSettings &settings); - - void on_scene_updated(const Scene &scene) override; - virtual void clear_screen(); - virtual void render_scene(); + virtual void render_scene() {} template void set_fps_counter(_FpsCounter &&fpsc) { @@ -376,6 +356,33 @@ public: FpsCounter &get_fps_counter() { return m_fps_counter; } }; +class CSGDisplay : public Display { +protected: + CSGSettings m_csgsettings; + + struct SceneCache { + vector> primitives; + vector primitives_free; + vector primitives_csg; + + void clear(); + + shptr add_mesh(const TriangleMesh &mesh); + shptr add_mesh(const TriangleMesh &mesh, + OpenCSG::Operation op, + unsigned covexity); + } m_scene_cache; + +public: + + const CSGSettings & get_csgsettings() const { return m_csgsettings; } + void apply_csgsettings(const CSGSettings &settings); + + void render_scene() override; + + void on_scene_updated(const Scene &scene) override; +}; + class Controller : public std::enable_shared_from_this, public MouseInput::Listener, public Scene::Listener @@ -425,4 +432,4 @@ public: }; }} // namespace Slic3r::GL -#endif // GLSCENE_HPP +#endif // SLIC3R_OCSG_EXMP_ENGINE_HPP diff --git a/sandboxes/opencsg/main.cpp b/sandboxes/opencsg/main.cpp index c7be068559..1352e1ba0a 100644 --- a/sandboxes/opencsg/main.cpp +++ b/sandboxes/opencsg/main.cpp @@ -2,7 +2,7 @@ #include #include -#include "GLScene.hpp" +#include "Engine.hpp" #include @@ -19,6 +19,7 @@ #include #include #include +#include #include "libslic3r/Model.hpp" #include "libslic3r/Format/3mf.hpp" @@ -29,31 +30,47 @@ using namespace Slic3r::GL; -class Canvas: public wxGLCanvas, public Slic3r::GL::Display +class Canvas: public wxGLCanvas { - shptr m_context; + class OCSGRenderer: public Slic3r::GL::CSGDisplay { + Canvas *m_canvas; + shptr m_context; + public: + + OCSGRenderer(Canvas *c): m_canvas{c} { + auto ctx = new wxGLContext(m_canvas); + if (!ctx || !ctx->IsOK()) { + wxMessageBox("Could not create OpenGL context.", "Error", + wxOK | wxICON_ERROR); + return; + } + + m_context.reset(ctx); + } + + void set_active(long w, long h) override + { + m_canvas->SetCurrent(*m_context); + Slic3r::GL::Display::set_active(w, h); + } + + wxGLContext * context() { return m_context.get(); } + const wxGLContext * context() const { return m_context.get(); } + + void swap_buffers() override { m_canvas->SwapBuffers(); } + + ~OCSGRenderer() override { m_scene_cache.clear(); } + }; + + shptr m_ocsgdisplay = std::make_shared(this); + + shptr m_display = m_ocsgdisplay; + public: - void set_active(long w, long h) override - { - SetCurrent(*m_context); - Slic3r::GL::Display::set_active(w, h); - } - - void swap_buffers() override { SwapBuffers(); } - template Canvas(Args &&...args): wxGLCanvas(std::forward(args)...) { - auto ctx = new wxGLContext(this); - if (!ctx || !ctx->IsOK()) { - wxMessageBox("Could not create OpenGL context.", "Error", - wxOK | wxICON_ERROR); - return; - } - - m_context.reset(ctx); - Bind(wxEVT_PAINT, [this](wxPaintEvent &) { // This is required even though dc is not used otherwise. wxPaintDC dc(this); @@ -67,16 +84,14 @@ public: // another canvas is repainted. const wxSize ClientSize = GetClientSize(); - set_screen_size(ClientSize.x, ClientSize.y); -// repaint(); + m_display->set_screen_size(ClientSize.x, ClientSize.y); }); } - - ~Canvas() override - { - m_scene_cache.clear(); - m_context.reset(); - } + + shptr get_display() const { return m_display; } + void set_display(shptr d) { m_display = d; } + + shptr get_ocsg_display() const { return m_ocsgdisplay; } }; enum EEvents { LCLK_U, RCLK_U, LCLK_D, RCLK_D, DDCLK, SCRL, MV }; @@ -204,7 +219,7 @@ class MyFrame: public wxFrame uqptr m_ui_job; public: - MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size); + MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size, const Slic3r::GL::CSGSettings &settings); void load_model(const std::string &fname) { m_ui_job = std::make_unique(this, fname); @@ -224,29 +239,76 @@ public: } } + Canvas * canvas() { return m_canvas.get(); } + const Canvas * canvas() const { return m_canvas.get(); } + void bind_canvas_events(MouseInput &msinput); }; +static const std::vector CSG_ALGS = {"Auto", "Goldfeather", "SCS"}; +static const std::vector CSG_DEPTH = {"Off", "OcclusionQuery", "On"}; +static const std::vector CSG_OPT = { "Default", "ForceOn", "On", "Off" }; + class App : public wxApp { - MyFrame *m_frame; + MyFrame *m_frame = nullptr; public: bool OnInit() override { - std::string fname; - std::string command; + wxCmdLineParser parser(argc, argv); - if (argc > 2) { - command = argv[1]; - fname = argv[2]; - } - - m_frame = new MyFrame("PrusaSlicer OpenCSG Demo", wxDefaultPosition, wxSize(1024, 768)); + parser.AddOption("p", "play", "play back file", wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL); + parser.AddOption("a", "algorithm", "OpenCSG algorithm [Auto|Goldfeather|SCS]", wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL); + parser.AddOption("d", "depth", "OpenCSG depth strategy [Off|OcclusionQuery|On]", wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL); + parser.AddOption("o", "optimization", "OpenCSG optimization strategy [Default|ForceOn|On|Off]", wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL); + parser.AddOption("c", "convexity", "OpenCSG convexity parameter for generic meshes", wxCMD_LINE_VAL_NUMBER, wxCMD_LINE_PARAM_OPTIONAL); + parser.AddSwitch("", "disable-csg", "Disable csg rendering", wxCMD_LINE_PARAM_OPTIONAL); - if (command == "play") { + parser.Parse(); + + wxString fname; + bool is_play = parser.Found("play", &fname); + + wxString alg; + parser.Found("algorithm", &alg); + + wxString depth; + parser.Found("depth", &depth); + + wxString opt; + parser.Found("optimization", &opt); + + long convexity = 1; + parser.Found("convexity", &convexity); + + bool csg_off = parser.Found("disable-csg"); + + auto get_idx = [](const wxString &a, const std::vector &v) { + auto it = std::find(v.begin(), v.end(), a.ToStdString()); + return it - v.begin(); + }; + + Slic3r::GL::CSGSettings settings; + + if (auto a = get_idx(alg, CSG_ALGS) < OpenCSG::AlgorithmUnused) + settings.set_algo(OpenCSG::Algorithm(a)); + + if (auto a = get_idx(depth, CSG_DEPTH) < OpenCSG::DepthComplexityAlgorithmUnused) + settings.set_depth_algo(OpenCSG::DepthComplexityAlgorithm(a)); + + if (auto a = get_idx(opt, CSG_OPT) < OpenCSG::OptimizationUnused) + settings.set_optimization(OpenCSG::Optimization(a)); + + settings.set_convexity(unsigned(convexity)); + settings.enable_csg(!csg_off); + + m_frame = new MyFrame("PrusaSlicer OpenCSG Demo", wxDefaultPosition, wxSize(1024, 768), settings); + + if (is_play) { m_frame->Show( true ); - m_frame->play_back_mouse(fname); + m_frame->play_back_mouse(fname.ToStdString()); m_frame->Close( true ); + } else m_frame->Show( true ); return true; @@ -255,7 +317,8 @@ public: wxIMPLEMENT_APP(App); -MyFrame::MyFrame(const wxString &title, const wxPoint &pos, const wxSize &size): +MyFrame::MyFrame(const wxString &title, const wxPoint &pos, const wxSize &size, + const Slic3r::GL::CSGSettings &settings): wxFrame(nullptr, wxID_ANY, title, pos, size) { wxMenu *menuFile = new wxMenu; @@ -289,7 +352,10 @@ MyFrame::MyFrame(const wxString &title, const wxPoint &pos, const wxSize &size): m_canvas = std::make_shared(this, wxID_ANY, attribList, wxDefaultPosition, wxDefaultSize, wxWANTS_CHARS | wxFULL_REPAINT_ON_RESIZE); - m_ctl->add_display(m_canvas); + + m_canvas->get_ocsg_display()->apply_csgsettings(settings); + + m_ctl->add_display(m_canvas->get_display()); wxPanel *control_panel = new wxPanel(this); @@ -310,7 +376,7 @@ MyFrame::MyFrame(const wxString &title, const wxPoint &pos, const wxSize &size): console_sizer->Add(csg_toggle, 0, wxALL | wxEXPAND, 5); auto add_combobox = [control_panel, console_sizer] - (const wxString &label, std::vector &&list) + (const wxString &label, const std::vector &list) { auto widget = new wxComboBox(control_panel, wxID_ANY, list[0], wxDefaultPosition, wxDefaultSize, @@ -343,14 +409,14 @@ MyFrame::MyFrame(const wxString &title, const wxPoint &pos, const wxSize &size): auto convexity_spin = add_spinctl("Convexity", CSGSettings::DEFAULT_CONVEXITY, 0, 100); - auto alg_select = add_combobox("Algorithm", {"Auto", "Goldfeather", "SCS"}); - auto depth_select = add_combobox("Depth Complexity", {"Off", "OcclusionQuery", "On"}); - auto optimization_select = add_combobox("Optimization", { "Default", "ForceOn", "On", "Off" }); + auto alg_select = add_combobox("Algorithm", CSG_ALGS); + auto depth_select = add_combobox("Depth Complexity", CSG_DEPTH); + auto optimization_select = add_combobox("Optimization", CSG_OPT); depth_select->Disable(); auto fpstext = new wxStaticText(control_panel, wxID_ANY, ""); console_sizer->Add(fpstext, 0, wxALL, 5); - m_canvas->get_fps_counter().add_listener([fpstext](double fps) { + m_canvas->get_ocsg_display()->get_fps_counter().add_listener([fpstext](double fps) { fpstext->SetLabel(wxString::Format("fps: %.2f", fps) ); }); @@ -367,6 +433,13 @@ MyFrame::MyFrame(const wxString &title, const wxPoint &pos, const wxSize &size): sizer->Add(control_panel, 0, wxEXPAND); SetSizer(sizer); + if (settings.get_algo() > 0) depth_select->Enable(true); + alg_select->SetSelection(settings.get_algo()); + depth_select->SetSelection(settings.get_depth_algo()); + optimization_select->SetSelection(settings.get_optimization()); + convexity_spin->SetValue(int(settings.get_convexity())); + csg_toggle->SetValue(settings.is_enabled()); + Bind(wxEVT_CLOSE_WINDOW, [this](wxCloseEvent &){ RemoveChild(m_canvas.get()); m_canvas.reset(); @@ -384,7 +457,7 @@ MyFrame::MyFrame(const wxString &title, const wxPoint &pos, const wxSize &size): Bind(wxEVT_SHOW, [this, ms_toggle](wxShowEvent &) { const wxSize ClientSize = GetClientSize(); - m_canvas->set_active(ClientSize.x, ClientSize.y); + m_canvas->get_display()->set_active(ClientSize.x, ClientSize.y); enable_multisampling(ms_toggle->GetValue()); }); @@ -394,13 +467,13 @@ MyFrame::MyFrame(const wxString &title, const wxPoint &pos, const wxSize &size): ms_toggle->Bind(wxEVT_TOGGLEBUTTON, [this, ms_toggle](wxCommandEvent &){ enable_multisampling(ms_toggle->GetValue()); - m_canvas->repaint(); + m_canvas->get_display()->repaint(); }); csg_toggle->Bind(wxEVT_TOGGLEBUTTON, [this, csg_toggle](wxCommandEvent &){ - CSGSettings settings = m_canvas->get_csgsettings(); + CSGSettings settings = m_canvas->get_ocsg_display()->get_csgsettings(); settings.enable_csg(csg_toggle->GetValue()); - m_canvas->apply_csgsettings(settings); + m_canvas->get_ocsg_display()->apply_csgsettings(settings); }); alg_select->Bind(wxEVT_COMBOBOX, @@ -408,33 +481,33 @@ MyFrame::MyFrame(const wxString &title, const wxPoint &pos, const wxSize &size): { int sel = alg_select->GetSelection(); depth_select->Enable(sel > 0); - CSGSettings settings = m_canvas->get_csgsettings(); + CSGSettings settings = m_canvas->get_ocsg_display()->get_csgsettings(); settings.set_algo(OpenCSG::Algorithm(sel)); - m_canvas->apply_csgsettings(settings); + m_canvas->get_ocsg_display()->apply_csgsettings(settings); }); depth_select->Bind(wxEVT_COMBOBOX, [this, depth_select](wxCommandEvent &) { int sel = depth_select->GetSelection(); - CSGSettings settings = m_canvas->get_csgsettings(); + CSGSettings settings = m_canvas->get_ocsg_display()->get_csgsettings(); settings.set_depth_algo(OpenCSG::DepthComplexityAlgorithm(sel)); - m_canvas->apply_csgsettings(settings); + m_canvas->get_ocsg_display()->apply_csgsettings(settings); }); optimization_select->Bind(wxEVT_COMBOBOX, [this, optimization_select](wxCommandEvent &) { int sel = optimization_select->GetSelection(); - CSGSettings settings = m_canvas->get_csgsettings(); + CSGSettings settings = m_canvas->get_ocsg_display()->get_csgsettings(); settings.set_optimization(OpenCSG::Optimization(sel)); - m_canvas->apply_csgsettings(settings); + m_canvas->get_ocsg_display()->apply_csgsettings(settings); }); convexity_spin->Bind(wxEVT_SPINCTRL, [this, convexity_spin](wxSpinEvent &) { - CSGSettings settings = m_canvas->get_csgsettings(); + CSGSettings settings = m_canvas->get_ocsg_display()->get_csgsettings(); int c = convexity_spin->GetValue(); if (c > 0) { settings.set_convexity(unsigned(c)); - m_canvas->apply_csgsettings(settings); + m_canvas->get_ocsg_display()->apply_csgsettings(settings); } }); @@ -445,7 +518,7 @@ MyFrame::MyFrame(const wxString &title, const wxPoint &pos, const wxSize &size): } if (record_btn->GetValue()) { - if (m_canvas->camera()) reset(*m_canvas->camera()); + if (auto c = m_canvas->get_display()->camera()) reset(*c); m_ctl->on_scene_updated(*m_scene); m_mouse.record(true); } else { @@ -468,7 +541,7 @@ MyFrame::MyFrame(const wxString &title, const wxPoint &pos, const wxSize &size): // Do the repaint continuously m_canvas->Bind(wxEVT_IDLE, [this](wxIdleEvent &evt) { - if (m_canvas->IsShown()) m_canvas->repaint(); + if (m_canvas->IsShown()) m_canvas->get_display()->repaint(); evt.RequestMore(); }); From bb8a6b898f9a3f1becc3e6b9e841dfd6f0653a01 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Thu, 19 Dec 2019 15:26:04 +0100 Subject: [PATCH 090/336] Save and load window size. Add fps average output. --- sandboxes/opencsg/main.cpp | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/sandboxes/opencsg/main.cpp b/sandboxes/opencsg/main.cpp index 1352e1ba0a..95e00b3664 100644 --- a/sandboxes/opencsg/main.cpp +++ b/sandboxes/opencsg/main.cpp @@ -218,6 +218,8 @@ class MyFrame: public wxFrame uqptr m_ui_job; + double m_fps_avg = 0.; + public: MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size, const Slic3r::GL::CSGSettings &settings); @@ -234,6 +236,11 @@ public: std::string model_name; std::getline(stream, model_name); load_model(model_name); + + int w, h; + stream >> w >> h; + SetSize(w, h); + m_mouse.load(stream); m_mouse.play(); } @@ -243,6 +250,8 @@ public: const Canvas * canvas() const { return m_canvas.get(); } void bind_canvas_events(MouseInput &msinput); + + double get_fps_average() const { return m_fps_avg; } }; static const std::vector CSG_ALGS = {"Auto", "Goldfeather", "SCS"}; @@ -308,6 +317,7 @@ public: m_frame->Show( true ); m_frame->play_back_mouse(fname.ToStdString()); m_frame->Close( true ); + std::cout << m_frame->get_fps_average() << std::endl; } else m_frame->Show( true ); @@ -416,8 +426,9 @@ MyFrame::MyFrame(const wxString &title, const wxPoint &pos, const wxSize &size, auto fpstext = new wxStaticText(control_panel, wxID_ANY, ""); console_sizer->Add(fpstext, 0, wxALL, 5); - m_canvas->get_ocsg_display()->get_fps_counter().add_listener([fpstext](double fps) { - fpstext->SetLabel(wxString::Format("fps: %.2f", fps) ); + m_canvas->get_ocsg_display()->get_fps_counter().add_listener([this, fpstext](double fps) { + fpstext->SetLabel(wxString::Format("fps: %.2f", fps) ); + m_fps_avg = 0.9 * m_fps_avg + 0.1 * fps; }); auto record_btn = new wxToggleButton(control_panel, wxID_ANY, "Record"); @@ -533,6 +544,8 @@ MyFrame::MyFrame(const wxString &title, const wxPoint &pos, const wxSize &size, if (stream.good()) { stream << m_ui_job->get_project_fname() << "\n"; + wxSize winsize = GetSize(); + stream << winsize.x << " " << winsize.y << "\n"; m_mouse.save(stream); } } From d3925abb13aa6e43257eafa0638d94e39b41e3a5 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Thu, 19 Dec 2019 16:10:34 +0100 Subject: [PATCH 091/336] Add some comments. --- sandboxes/opencsg/Engine.hpp | 54 ++++++++++++++++++++++++++------ sandboxes/opencsg/main.cpp | 60 +++++++++++++++++++++++++----------- 2 files changed, 87 insertions(+), 27 deletions(-) diff --git a/sandboxes/opencsg/Engine.hpp b/sandboxes/opencsg/Engine.hpp index 5e70305236..2b58e9b75c 100644 --- a/sandboxes/opencsg/Engine.hpp +++ b/sandboxes/opencsg/Engine.hpp @@ -17,33 +17,36 @@ class SLAPrint; namespace GL { +// Simple shorthands for smart pointers template using shptr = std::shared_ptr; template using uqptr = std::unique_ptr; template using wkptr = std::weak_ptr; -template> -using vector = std::vector; +template> using vector = std::vector; +// remove empty weak pointers from a vector template void cleanup(vector> &listeners) { auto it = std::remove_if(listeners.begin(), listeners.end(), [](auto &l) { return !l.lock(); }); listeners.erase(it, listeners.end()); } +// Call a class method on each element of a vector of objects (weak pointers) +// of the same type. template void call(F &&f, vector> &listeners, Args&&... args) { for (auto &l : listeners) if (auto p = l.lock()) ((p.get())->*f)(std::forward(args)...); } +// A representation of a mouse input for the engine. class MouseInput { public: + enum WheelAxis { waVertical, waHorizontal }; - enum WheelAxis { - waVertical, waHorizontal - }; - + // Interface to implement if an object wants to receive notifications + // about mouse events. class Listener { public: virtual ~Listener(); @@ -99,6 +102,7 @@ public: } }; +// This is a stripped down version of Slic3r::IndexedVertexArray class IndexedVertexArray { public: ~IndexedVertexArray() { release_geometry(); } @@ -164,8 +168,11 @@ public: void shrink_to_fit(); }; +// Try to enable or disable multisampling. bool enable_multisampling(bool e = true); +// A primitive that can be used with OpenCSG rendering algorithms. +// Does a similar job to GLVolume. class Primitive : public OpenCSG::Primitive { IndexedVertexArray m_geom; @@ -176,19 +183,21 @@ public: Primitive() : OpenCSG::Primitive(OpenCSG::Intersection, 1) {} - void render(); + void render() override; void translation(const Vec3d &offset) { m_trafo.set_offset(offset); } void rotation(const Vec3d &rot) { m_trafo.set_rotation(rot); } void scale(const Vec3d &scaleing) { m_trafo.set_scaling_factor(scaleing); } void scale(double s) { scale({s, s, s}); } - inline void load_mesh(const TriangleMesh &mesh) { + inline void load_mesh(const TriangleMesh &mesh) + { m_geom.load_mesh(mesh); m_geom.finalize_geometry(); } }; +// A simple representation of a camera in a 3D scene class Camera { protected: Vec2f m_rot = {0., 0.}; @@ -209,6 +218,7 @@ public: void set_clip_z(double z) { m_clip_z = z; } }; +// Reset a camera object inline void reset(Camera &cam) { cam.set_rotation({0., 0.}); @@ -217,12 +227,15 @@ inline void reset(Camera &cam) cam.set_clip_z(0.); } +// Specialization of a camera which shows in perspective projection class PerspectiveCamera: public Camera { public: void set_screen(long width, long height) override; }; +// A simple counter of FPS. Subscribed objects will receive updates of the +// current fps. class FpsCounter { vector> m_listeners; @@ -259,6 +272,7 @@ public: double get_mesure_window_size() const { return m_window_size; } }; +// Collection of the used OpenCSG library settings. class CSGSettings { public: static const constexpr unsigned DEFAULT_CONVEXITY = 10; @@ -286,12 +300,19 @@ public: unsigned get_convexity() const { return m_convexity; } void set_convexity(unsigned c) { m_convexity = c; } }; - + +// The scene is a wrapper around SLAPrint which holds the data to be visualized. class Scene { uqptr m_print; public: + // Subscribers will be notified if the model is changed. This might be a + // display which will have to load the meshes and repaint itself when + // the scene data changes. + // eg. We load a new 3mf through the UI, this will notify the controller + // associated with the scene and all the displays that the controller is + // connected with. class Listener { public: virtual ~Listener() = default; @@ -316,6 +337,11 @@ private: vector> m_listeners; }; +// The basic Display. This is almost just an interface but will do all the +// initialization and show the fps values. Overriding the render_scene is +// needed to show the scene content. The specific method of displaying the +// scene is up the the particular implementation (OpenCSG or other screen space +// boolean algorithms) class Display : public Scene::Listener { protected: @@ -356,10 +382,13 @@ public: FpsCounter &get_fps_counter() { return m_fps_counter; } }; +// Special dispaly using OpenCSG for rendering the scene. class CSGDisplay : public Display { protected: CSGSettings m_csgsettings; + // Cache the renderable primitives. These will be fetched when the scene + // is modified. struct SceneCache { vector> primitives; vector primitives_free; @@ -375,6 +404,7 @@ protected: public: + // Receive or apply the new settings. const CSGSettings & get_csgsettings() const { return m_csgsettings; } void apply_csgsettings(const CSGSettings &settings); @@ -383,6 +413,11 @@ public: void on_scene_updated(const Scene &scene) override; }; + +// The controller is a hub which dispatches mouse events to the connected +// displays. It keeps track of the mouse wheel position, the states whether +// the mouse is being held, dragged, etc... All the connected displays will +// mirror the camera movement (if there is more than one display). class Controller : public std::enable_shared_from_this, public MouseInput::Listener, public Scene::Listener @@ -404,6 +439,7 @@ class Controller : public std::enable_shared_from_this, public: + // Set the scene that will be controlled. void set_scene(shptr scene) { m_scene = scene; diff --git a/sandboxes/opencsg/main.cpp b/sandboxes/opencsg/main.cpp index 95e00b3664..b609657c01 100644 --- a/sandboxes/opencsg/main.cpp +++ b/sandboxes/opencsg/main.cpp @@ -30,8 +30,11 @@ using namespace Slic3r::GL; +// The opengl rendering facility. Here we implement the rendering objects. class Canvas: public wxGLCanvas { + + // Tell the CSGDisplay how to swap buffers and set the gl context. class OCSGRenderer: public Slic3r::GL::CSGDisplay { Canvas *m_canvas; shptr m_context; @@ -62,8 +65,10 @@ class Canvas: public wxGLCanvas ~OCSGRenderer() override { m_scene_cache.clear(); } }; + // Create the OCSGDisplay for rendering with OpenCSG algorithms shptr m_ocsgdisplay = std::make_shared(this); + // One display is active at a time, the OCSGRenderer by default. shptr m_display = m_ocsgdisplay; public: @@ -94,6 +99,7 @@ public: shptr get_ocsg_display() const { return m_ocsgdisplay; } }; +// Enumerate possible mouse events, we will record them. enum EEvents { LCLK_U, RCLK_U, LCLK_D, RCLK_D, DDCLK, SCRL, MV }; struct Event { @@ -102,6 +108,8 @@ struct Event Event(EEvents t, long x = 0, long y = 0) : type{t}, a{x}, b{y} {} }; +// Create a special mouse input adapter, which can store (record) the received +// mouse signals into a file and play back the stored events later. class RecorderMouseInput: public MouseInput { std::vector m_events; bool m_recording = false, m_playing = false; @@ -181,16 +189,20 @@ public: } }; +// The top level frame of the application. class MyFrame: public wxFrame { + // Instantiate the 3D engine. shptr m_scene; // Model shptr m_canvas; // View shptr m_ctl; // Controller - + + // Add a status bar with progress indication. shptr m_stbar; RecorderMouseInput m_mouse; + // When loading a Model from 3mf and preparing it, we use a separate thread. class SLAJob: public Slic3r::GUI::Job { MyFrame *m_parent; std::unique_ptr m_print; @@ -202,12 +214,15 @@ class MyFrame: public wxFrame , m_parent{frame} , m_fname{fname} {} - + + // Runs in separate thread void process() override; const std::string & get_project_fname() const { return m_fname; } protected: + + // Runs in the UI thread. void finalize() override { m_parent->m_scene->set_print(std::move(m_print)); @@ -218,16 +233,22 @@ class MyFrame: public wxFrame uqptr m_ui_job; + // To keep track of the running average of measured fps values. double m_fps_avg = 0.; public: - MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size, const Slic3r::GL::CSGSettings &settings); + MyFrame(const wxString & title, + const wxPoint & pos, + const wxSize & size, + const Slic3r::GL::CSGSettings &settings); + // Grab a 3mf and load (hollow it out) within the UI job. void load_model(const std::string &fname) { m_ui_job = std::make_unique(this, fname); m_ui_job->start(); } + // Load a previously stored mouse event log and play it back. void play_back_mouse(const std::string &events_fname) { std::fstream stream(events_fname, std::fstream::in); @@ -249,11 +270,14 @@ public: Canvas * canvas() { return m_canvas.get(); } const Canvas * canvas() const { return m_canvas.get(); } + // Bind the canvas mouse events to a class implementing MouseInput interface void bind_canvas_events(MouseInput &msinput); double get_fps_average() const { return m_fps_avg; } }; +// Possible OpenCSG configuration values. Will be used on the command line and +// on the UI widgets. static const std::vector CSG_ALGS = {"Auto", "Goldfeather", "SCS"}; static const std::vector CSG_DEPTH = {"Off", "OcclusionQuery", "On"}; static const std::vector CSG_OPT = { "Default", "ForceOn", "On", "Off" }; @@ -482,9 +506,9 @@ MyFrame::MyFrame(const wxString &title, const wxPoint &pos, const wxSize &size, }); csg_toggle->Bind(wxEVT_TOGGLEBUTTON, [this, csg_toggle](wxCommandEvent &){ - CSGSettings settings = m_canvas->get_ocsg_display()->get_csgsettings(); - settings.enable_csg(csg_toggle->GetValue()); - m_canvas->get_ocsg_display()->apply_csgsettings(settings); + CSGSettings stt = m_canvas->get_ocsg_display()->get_csgsettings(); + stt.enable_csg(csg_toggle->GetValue()); + m_canvas->get_ocsg_display()->apply_csgsettings(stt); }); alg_select->Bind(wxEVT_COMBOBOX, @@ -492,33 +516,33 @@ MyFrame::MyFrame(const wxString &title, const wxPoint &pos, const wxSize &size, { int sel = alg_select->GetSelection(); depth_select->Enable(sel > 0); - CSGSettings settings = m_canvas->get_ocsg_display()->get_csgsettings(); - settings.set_algo(OpenCSG::Algorithm(sel)); - m_canvas->get_ocsg_display()->apply_csgsettings(settings); + CSGSettings stt = m_canvas->get_ocsg_display()->get_csgsettings(); + stt.set_algo(OpenCSG::Algorithm(sel)); + m_canvas->get_ocsg_display()->apply_csgsettings(stt); }); depth_select->Bind(wxEVT_COMBOBOX, [this, depth_select](wxCommandEvent &) { int sel = depth_select->GetSelection(); - CSGSettings settings = m_canvas->get_ocsg_display()->get_csgsettings(); - settings.set_depth_algo(OpenCSG::DepthComplexityAlgorithm(sel)); - m_canvas->get_ocsg_display()->apply_csgsettings(settings); + CSGSettings stt = m_canvas->get_ocsg_display()->get_csgsettings(); + stt.set_depth_algo(OpenCSG::DepthComplexityAlgorithm(sel)); + m_canvas->get_ocsg_display()->apply_csgsettings(stt); }); optimization_select->Bind(wxEVT_COMBOBOX, [this, optimization_select](wxCommandEvent &) { int sel = optimization_select->GetSelection(); - CSGSettings settings = m_canvas->get_ocsg_display()->get_csgsettings(); - settings.set_optimization(OpenCSG::Optimization(sel)); - m_canvas->get_ocsg_display()->apply_csgsettings(settings); + CSGSettings stt = m_canvas->get_ocsg_display()->get_csgsettings(); + stt.set_optimization(OpenCSG::Optimization(sel)); + m_canvas->get_ocsg_display()->apply_csgsettings(stt); }); convexity_spin->Bind(wxEVT_SPINCTRL, [this, convexity_spin](wxSpinEvent &) { - CSGSettings settings = m_canvas->get_ocsg_display()->get_csgsettings(); + CSGSettings stt = m_canvas->get_ocsg_display()->get_csgsettings(); int c = convexity_spin->GetValue(); if (c > 0) { - settings.set_convexity(unsigned(c)); - m_canvas->get_ocsg_display()->apply_csgsettings(settings); + stt.set_convexity(unsigned(c)); + m_canvas->get_ocsg_display()->apply_csgsettings(stt); } }); From 4f97a7122f160986d0675d09586310f64671291e Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Fri, 20 Dec 2019 01:21:13 +0100 Subject: [PATCH 092/336] Fix closing while playback --- sandboxes/opencsg/main.cpp | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/sandboxes/opencsg/main.cpp b/sandboxes/opencsg/main.cpp index b609657c01..ff7e36b8be 100644 --- a/sandboxes/opencsg/main.cpp +++ b/sandboxes/opencsg/main.cpp @@ -183,10 +183,15 @@ public: case MV: MouseInput::move_to(evt.a, evt.b); break; } - wxSafeYield(); + wxYield(); + if (!m_playing) + break; } m_playing = false; } + + void stop() { m_playing = false; } + bool is_playing() const { return m_playing; } }; // The top level frame of the application. @@ -236,6 +241,8 @@ class MyFrame: public wxFrame // To keep track of the running average of measured fps values. double m_fps_avg = 0.; + wxToggleButton *m_record_btn; + public: MyFrame(const wxString & title, const wxPoint & pos, @@ -263,6 +270,7 @@ public: SetSize(w, h); m_mouse.load(stream); + if (m_record_btn) m_record_btn->Disable(); m_mouse.play(); } } @@ -284,7 +292,6 @@ static const std::vector CSG_OPT = { "Default", "ForceOn", "On", "Of class App : public wxApp { MyFrame *m_frame = nullptr; - public: bool OnInit() override { @@ -340,9 +347,11 @@ public: if (is_play) { m_frame->Show( true ); m_frame->play_back_mouse(fname.ToStdString()); - m_frame->Close( true ); + std::cout << m_frame->get_fps_average() << std::endl; + m_frame->Destroy(); + } else m_frame->Show( true ); return true; @@ -455,8 +464,8 @@ MyFrame::MyFrame(const wxString &title, const wxPoint &pos, const wxSize &size, m_fps_avg = 0.9 * m_fps_avg + 0.1 * fps; }); - auto record_btn = new wxToggleButton(control_panel, wxID_ANY, "Record"); - console_sizer->Add(record_btn, 0, wxALL | wxEXPAND, 5); + m_record_btn = new wxToggleButton(control_panel, wxID_ANY, "Record"); + console_sizer->Add(m_record_btn, 0, wxALL | wxEXPAND, 5); controlsizer->Add(slider_sizer, 0, wxEXPAND); controlsizer->Add(console_sizer, 1, wxEXPAND); @@ -475,10 +484,11 @@ MyFrame::MyFrame(const wxString &title, const wxPoint &pos, const wxSize &size, convexity_spin->SetValue(int(settings.get_convexity())); csg_toggle->SetValue(settings.is_enabled()); - Bind(wxEVT_CLOSE_WINDOW, [this](wxCloseEvent &){ - RemoveChild(m_canvas.get()); + Bind(wxEVT_CLOSE_WINDOW, [this](wxCloseEvent &evt){ + if (m_canvas) RemoveChild(m_canvas.get()); m_canvas.reset(); - Destroy(); + if (!m_mouse.is_playing()) evt.Skip(); + else m_mouse.stop(); }); Bind(wxEVT_MENU, [this](wxCommandEvent &) { @@ -546,13 +556,13 @@ MyFrame::MyFrame(const wxString &title, const wxPoint &pos, const wxSize &size, } }); - record_btn->Bind(wxEVT_TOGGLEBUTTON, [this, record_btn](wxCommandEvent &) { + m_record_btn->Bind(wxEVT_TOGGLEBUTTON, [this](wxCommandEvent &) { if (!m_ui_job) { m_stbar->set_status_text("No project loaded!"); return; } - if (record_btn->GetValue()) { + if (m_record_btn->GetValue()) { if (auto c = m_canvas->get_display()->camera()) reset(*c); m_ctl->on_scene_updated(*m_scene); m_mouse.record(true); From d1f86e0a802eb5bea511ec06c2b7852093781fdc Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Fri, 20 Dec 2019 10:17:59 +0100 Subject: [PATCH 093/336] SLA supports gizmo now uses hollowed mesh when available Bugfix: SLA support tree is is now given the hollowed mesh, not the original Added ImGui separators and change background alpha in hollowing gizmo dialog (to match the other gizmos) --- src/libslic3r/SLAPrintSteps.cpp | 3 +- src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp | 35 ++++++--- src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp | 77 ++++++++++++-------- 3 files changed, 72 insertions(+), 43 deletions(-) diff --git a/src/libslic3r/SLAPrintSteps.cpp b/src/libslic3r/SLAPrintSteps.cpp index f16aa7cfa6..e0c92a71c5 100644 --- a/src/libslic3r/SLAPrintSteps.cpp +++ b/src/libslic3r/SLAPrintSteps.cpp @@ -225,8 +225,7 @@ void SLAPrint::Steps::slice_model(SLAPrintObject &po) if(po.m_config.supports_enable.getBool() || po.m_config.pad_enable.getBool()) { - po.m_supportdata.reset( - new SLAPrintObject::SupportData(po.transformed_mesh()) ); + po.m_supportdata.reset(new SLAPrintObject::SupportData(mesh)); } } diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp index f8f2e125fc..75a21057af 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp @@ -112,10 +112,21 @@ void GLGizmoHollow::on_render() const glsafe(::glEnable(GL_DEPTH_TEST)); if (m_c->m_volume_with_cavity) { + m_c->m_volume_with_cavity->set_sla_shift_z(m_z_shift); m_parent.get_shader().start_using(); - m_c->m_volume_with_cavity->render(); + + GLint current_program_id; + glsafe(::glGetIntegerv(GL_CURRENT_PROGRAM, ¤t_program_id)); + GLint color_id = (current_program_id > 0) ? ::glGetUniformLocation(current_program_id, "uniform_color") : -1; + GLint print_box_detection_id = (current_program_id > 0) ? ::glGetUniformLocation(current_program_id, "print_box.volume_detection") : -1; + GLint print_box_worldmatrix_id = (current_program_id > 0) ? ::glGetUniformLocation(current_program_id, "print_box.volume_world_matrix") : -1; + glcheck(); + m_c->m_volume_with_cavity->set_render_color(); + m_c->m_volume_with_cavity->render(color_id, print_box_detection_id, print_box_worldmatrix_id); m_parent.get_shader().stop_using(); } + // Show/hide the original object + m_parent.toggle_model_objects_visibility(! m_c->m_cavity_mesh, m_c->m_model_object, m_c->m_active_instance); m_z_shift = selection.get_volume(*selection.get_volume_idxs().begin())->get_sla_shift_z(); @@ -602,22 +613,22 @@ void GLGizmoHollow::update_hollowed_mesh(std::unique_ptr &&mesh) hole_mesh.transform(m.cast()); hole_mesh.translate(hole.pos); holes_mesh.merge(hole_mesh); - //MeshBoolean::minus(*m_c->m_cavity_mesh.get(), hole_mesh); + holes_mesh.repair(); } MeshBoolean::minus(*m_c->m_cavity_mesh.get(), holes_mesh); } - // create a new GLVolume that only has the cavity inside Geometry::Transformation volume_trafo = m_c->m_model_object->volumes.front()->get_transformation(); volume_trafo.set_offset(volume_trafo.get_offset() + Vec3d(0., 0., m_z_shift)); - m_c->m_volume_with_cavity.reset(new GLVolume(1.f, 0.f, 0.f, 0.5f)); + m_c->m_volume_with_cavity.reset(new GLVolume(GLVolume::MODEL_COLOR[2])); m_c->m_volume_with_cavity->indexed_vertex_array.load_mesh(*m_c->m_cavity_mesh.get()); m_c->m_volume_with_cavity->finalize_geometry(true); m_c->m_volume_with_cavity->set_volume_transformation(volume_trafo); m_c->m_volume_with_cavity->set_instance_transformation(m_c->m_model_object->instances[size_t(m_c->m_active_instance)]->get_transformation()); + m_c->m_volume_with_cavity->force_transparent = false; } - m_parent.toggle_model_objects_visibility(! m_c->m_cavity_mesh, m_c->m_model_object, m_c->m_active_instance); + if (m_clipping_plane_distance == 0.f) { m_clipping_plane_distance = 0.5f; update_clipping_plane(); @@ -672,7 +683,7 @@ RENDER_AGAIN: const float approx_height = m_imgui->scaled(20.0f); y = std::min(y, bottom_limit - approx_height); m_imgui->set_next_window_pos(x, y, ImGuiCond_Always); - m_imgui->set_next_window_bg_alpha(0.5f); + m_imgui->begin(on_get_name(), ImGuiWindowFlags_NoMove | ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoCollapse); // First calculate width of all the texts that are could possibly be shown. We will decide set the dialog width based on that: @@ -756,7 +767,8 @@ RENDER_AGAIN: bool remove_selected = false; bool remove_all = false; - m_imgui->text(" "); // vertical gap + // m_imgui->text(" "); // vertical gap + ImGui::Separator(); float diameter_upper_cap = 20.f; //static_cast(wxGetApp().preset_bundle->sla_prints.get_edited_preset().config.option("support_pillar_diameter"))->value; if (m_new_hole_radius > diameter_upper_cap) @@ -824,7 +836,8 @@ RENDER_AGAIN: m_imgui->disabled_end(); // Following is rendered in both editing and non-editing mode: - m_imgui->text(""); + // m_imgui->text(""); + ImGui::Separator(); if (m_clipping_plane_distance == 0.f) m_imgui->text(m_desc.at("clipping_of_view")); else { @@ -940,9 +953,9 @@ void GLGizmoHollow::on_set_state() // Release clippers and the AABB raycaster. m_c->m_object_clipper.reset(); m_c->m_supports_clipper.reset(); - m_c->m_mesh_raycaster.reset(); - m_c->m_cavity_mesh.reset(); - m_c->m_volume_with_cavity.reset(); + //m_c->m_mesh_raycaster.reset(); + //m_c->m_cavity_mesh.reset(); + //m_c->m_volume_with_cavity.reset(); } m_old_state = m_state; } diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp index 85d57a211e..ddde79c521 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp @@ -121,6 +121,23 @@ void GLGizmoSlaSupports::on_render() const glsafe(::glEnable(GL_BLEND)); glsafe(::glEnable(GL_DEPTH_TEST)); + if (m_c->m_volume_with_cavity) { + m_c->m_volume_with_cavity->set_sla_shift_z(m_z_shift); + m_parent.get_shader().start_using(); + + GLint current_program_id; + glsafe(::glGetIntegerv(GL_CURRENT_PROGRAM, ¤t_program_id)); + GLint color_id = (current_program_id > 0) ? ::glGetUniformLocation(current_program_id, "uniform_color") : -1; + GLint print_box_detection_id = (current_program_id > 0) ? ::glGetUniformLocation(current_program_id, "print_box.volume_detection") : -1; + GLint print_box_worldmatrix_id = (current_program_id > 0) ? ::glGetUniformLocation(current_program_id, "print_box.volume_world_matrix") : -1; + glcheck(); + m_c->m_volume_with_cavity->set_render_color(); + m_c->m_volume_with_cavity->render(color_id, print_box_detection_id, print_box_worldmatrix_id); + m_parent.get_shader().stop_using(); + } + // Show/hide the original object + m_parent.toggle_model_objects_visibility(! m_c->m_cavity_mesh, m_c->m_model_object, m_c->m_active_instance); + m_z_shift = selection.get_volume(*selection.get_volume_idxs().begin())->get_sla_shift_z(); if (m_quadric != nullptr && selection.is_from_single_instance()) @@ -328,41 +345,41 @@ void GLGizmoSlaSupports::render_points(const Selection& selection, bool picking) } // Now render the drain holes: - render_color[0] = 0.7f; - render_color[1] = 0.7f; - render_color[2] = 0.7f; - render_color[3] = 0.7f; - glsafe(::glColor4fv(render_color)); - for (const sla::DrainHole& drain_hole : m_c->m_model_object->sla_drain_holes) { - // Inverse matrix of the instance scaling is applied so that the mark does not scale with the object. - glsafe(::glPushMatrix()); - glsafe(::glTranslatef(drain_hole.pos(0), drain_hole.pos(1), drain_hole.pos(2))); - glsafe(::glMultMatrixd(instance_scaling_matrix_inverse.data())); +// render_color[0] = 0.7f; +// render_color[1] = 0.7f; +// render_color[2] = 0.7f; +// render_color[3] = 0.7f; +// glsafe(::glColor4fv(render_color)); +// for (const sla::DrainHole& drain_hole : m_c->m_model_object->sla_drain_holes) { +// // Inverse matrix of the instance scaling is applied so that the mark does not scale with the object. +// glsafe(::glPushMatrix()); +// glsafe(::glTranslatef(drain_hole.pos(0), drain_hole.pos(1), drain_hole.pos(2))); +// glsafe(::glMultMatrixd(instance_scaling_matrix_inverse.data())); - if (vol->is_left_handed()) - glFrontFace(GL_CW); +// if (vol->is_left_handed()) +// glFrontFace(GL_CW); - // Matrices set, we can render the point mark now. +// // Matrices set, we can render the point mark now. - Eigen::Quaterniond q; - q.setFromTwoVectors(Vec3d{0., 0., 1.}, instance_scaling_matrix_inverse * (-drain_hole.normal).cast()); - Eigen::AngleAxisd aa(q); - glsafe(::glRotated(aa.angle() * (180. / M_PI), aa.axis()(0), aa.axis()(1), aa.axis()(2))); - glsafe(::glPushMatrix()); - glsafe(::glTranslated(0., 0., -drain_hole.height)); - ::gluCylinder(m_quadric, drain_hole.radius, drain_hole.radius, drain_hole.height, 24, 1); - glsafe(::glTranslated(0., 0., drain_hole.height)); - ::gluDisk(m_quadric, 0.0, drain_hole.radius, 24, 1); - glsafe(::glTranslated(0., 0., -drain_hole.height)); - glsafe(::glRotatef(180.f, 1.f, 0.f, 0.f)); - ::gluDisk(m_quadric, 0.0, drain_hole.radius, 24, 1); - glsafe(::glPopMatrix()); +// Eigen::Quaterniond q; +// q.setFromTwoVectors(Vec3d{0., 0., 1.}, instance_scaling_matrix_inverse * (-drain_hole.normal).cast()); +// Eigen::AngleAxisd aa(q); +// glsafe(::glRotated(aa.angle() * (180. / M_PI), aa.axis()(0), aa.axis()(1), aa.axis()(2))); +// glsafe(::glPushMatrix()); +// glsafe(::glTranslated(0., 0., -drain_hole.height)); +// ::gluCylinder(m_quadric, drain_hole.radius, drain_hole.radius, drain_hole.height, 24, 1); +// glsafe(::glTranslated(0., 0., drain_hole.height)); +// ::gluDisk(m_quadric, 0.0, drain_hole.radius, 24, 1); +// glsafe(::glTranslated(0., 0., -drain_hole.height)); +// glsafe(::glRotatef(180.f, 1.f, 0.f, 0.f)); +// ::gluDisk(m_quadric, 0.0, drain_hole.radius, 24, 1); +// glsafe(::glPopMatrix()); - if (vol->is_left_handed()) - glFrontFace(GL_CCW); - glsafe(::glPopMatrix()); +// if (vol->is_left_handed()) +// glFrontFace(GL_CCW); +// glsafe(::glPopMatrix()); - } +// } if (!picking) glsafe(::glDisable(GL_LIGHTING)); From 4d182a57480ed680d2b5fbfa77539c84da60d8ad Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Fri, 20 Dec 2019 11:33:14 +0100 Subject: [PATCH 094/336] Fixed scaling of the holes and instance showing/hiding --- src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp | 13 ++++++++++++- src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp | 2 +- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp index 75a21057af..f0b71f2608 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp @@ -83,7 +83,7 @@ void GLGizmoHollow::set_sla_support_data(ModelObject* model_object, const Select if (m_state == On) { m_parent.toggle_model_objects_visibility(false); - m_parent.toggle_model_objects_visibility(true, m_c->m_model_object, m_c->m_active_instance); + m_parent.toggle_model_objects_visibility(! m_c->m_cavity_mesh, m_c->m_model_object, m_c->m_active_instance); } else m_parent.toggle_model_objects_visibility(true, nullptr, -1); @@ -607,10 +607,18 @@ void GLGizmoHollow::update_hollowed_mesh(std::unique_ptr &&mesh) TriangleMesh holes_mesh; for (const sla::DrainHole& hole : m_c->m_model_object->sla_drain_holes) { TriangleMesh hole_mesh = make_cylinder(hole.radius, hole.height, 2*M_PI/8); + + // Rotate the cylinder appropriately Eigen::Quaternionf q; Transform3f m = Transform3f::Identity(); m.matrix().block(0, 0, 3, 3) = q.setFromTwoVectors(Vec3f::UnitZ(), hole.normal).toRotationMatrix(); hole_mesh.transform(m.cast()); + + // If the instance is scaled, undo the scaling of the hole + Vec3d scaling = m_c->m_model_object->instances[m_c->m_active_instance]->get_scaling_factor(); + hole_mesh.scale(Vec3d(1/scaling(0), 1/scaling(1), 1/scaling(2))); + + // Translate the hole into position and merge with the others hole_mesh.translate(hole.pos); holes_mesh.merge(hole_mesh); holes_mesh.repair(); @@ -627,6 +635,9 @@ void GLGizmoHollow::update_hollowed_mesh(std::unique_ptr &&mesh) m_c->m_volume_with_cavity->set_volume_transformation(volume_trafo); m_c->m_volume_with_cavity->set_instance_transformation(m_c->m_model_object->instances[size_t(m_c->m_active_instance)]->get_transformation()); m_c->m_volume_with_cavity->force_transparent = false; + + // Reset raycaster so it works with the new mesh: + m_c->m_mesh_raycaster.reset(new MeshRaycaster(*m_c->mesh())); } if (m_clipping_plane_distance == 0.f) { diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp index 350bc8c9e6..c689be2141 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp @@ -93,7 +93,7 @@ void GLGizmoSlaSupports::set_sla_support_data(ModelObject* model_object, const S if (m_state == On) { m_parent.toggle_model_objects_visibility(false); - m_parent.toggle_model_objects_visibility(true, m_c->m_model_object, m_c->m_active_instance); + m_parent.toggle_model_objects_visibility(! m_c->m_cavity_mesh, m_c->m_model_object, m_c->m_active_instance); } else m_parent.toggle_model_objects_visibility(true, nullptr, -1); From 93d0bbd7efe92cf9b4a0e9bc021d846a901c8812 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Fri, 20 Dec 2019 12:25:44 +0100 Subject: [PATCH 095/336] Add boilerplate for shader based csg --- sandboxes/opencsg/CMakeLists.txt | 5 +- sandboxes/opencsg/Engine.cpp | 19 +-- sandboxes/opencsg/Engine.hpp | 45 +++-- sandboxes/opencsg/ShaderCSGDisplay.cpp | 81 +++++++++ sandboxes/opencsg/ShaderCSGDisplay.hpp | 26 +++ sandboxes/opencsg/main.cpp | 225 +++++++++++++++---------- src/slic3r/GUI/Job.hpp | 3 +- 7 files changed, 282 insertions(+), 122 deletions(-) create mode 100644 sandboxes/opencsg/ShaderCSGDisplay.cpp create mode 100644 sandboxes/opencsg/ShaderCSGDisplay.hpp diff --git a/sandboxes/opencsg/CMakeLists.txt b/sandboxes/opencsg/CMakeLists.txt index 600ef7884a..e9a51b0f4e 100644 --- a/sandboxes/opencsg/CMakeLists.txt +++ b/sandboxes/opencsg/CMakeLists.txt @@ -2,7 +2,10 @@ cmake_minimum_required(VERSION 3.0) project(OpenCSG-example) -add_executable(opencsg_example WIN32 main.cpp Engine.hpp Engine.cpp +add_executable(opencsg_example WIN32 + main.cpp + Engine.hpp Engine.cpp + ShaderCSGDisplay.hpp ShaderCSGDisplay.cpp ${CMAKE_CURRENT_SOURCE_DIR}/../../src/slic3r/GUI/ProgressStatusBar.cpp ${CMAKE_CURRENT_SOURCE_DIR}/../../src/slic3r/GUI/I18N.hpp ${CMAKE_CURRENT_SOURCE_DIR}/../../src/slic3r/GUI/I18N.cpp) diff --git a/sandboxes/opencsg/Engine.cpp b/sandboxes/opencsg/Engine.cpp index 590faa2967..bd9da6540a 100644 --- a/sandboxes/opencsg/Engine.cpp +++ b/sandboxes/opencsg/Engine.cpp @@ -1,7 +1,6 @@ #include "Engine.hpp" #include #include -#include #include @@ -66,22 +65,6 @@ void CSGDisplay::render_scene() glFlush(); } -template::value_type> -std::vector transform_pts( - It from, It to, Trafo &&tr, GetPt &&point) -{ - auto ret = reserve_vector(to - from); - for(auto it = from; it != to; ++it) { - V v = *it; - v.pos = tr * point(*it); - ret.emplace_back(std::move(v)); - } - return ret; -} - void Scene::set_print(uqptr &&print) { m_print = std::move(print); @@ -287,7 +270,7 @@ void IndexedVertexArray::shrink_to_fit() { this->quad_indices.shrink_to_fit(); } -void Primitive::render() +void Volume::render() { glsafe(::glPushMatrix()); glsafe(::glMultMatrixd(m_trafo.get_matrix().data())); diff --git a/sandboxes/opencsg/Engine.hpp b/sandboxes/opencsg/Engine.hpp index 2b58e9b75c..79bf9582bf 100644 --- a/sandboxes/opencsg/Engine.hpp +++ b/sandboxes/opencsg/Engine.hpp @@ -1,5 +1,5 @@ #ifndef SLIC3R_OCSG_EXMP_ENGINE_HPP -#define SLIC3R_OCSG_EXMP_ENGINE_HPP_HPP +#define SLIC3R_OCSG_EXMP_ENGINE_HPP #include #include @@ -25,7 +25,7 @@ template using wkptr = std::weak_ptr; template> using vector = std::vector; // remove empty weak pointers from a vector -template void cleanup(vector> &listeners) { +template inline void cleanup(vector> &listeners) { auto it = std::remove_if(listeners.begin(), listeners.end(), [](auto &l) { return !l.lock(); }); listeners.erase(it, listeners.end()); @@ -34,7 +34,7 @@ template void cleanup(vector> &listeners) { // Call a class method on each element of a vector of objects (weak pointers) // of the same type. template -void call(F &&f, vector> &listeners, Args&&... args) { +inline void call(F &&f, vector> &listeners, Args&&... args) { for (auto &l : listeners) if (auto p = l.lock()) ((p.get())->*f)(std::forward(args)...); } @@ -171,19 +171,30 @@ public: // Try to enable or disable multisampling. bool enable_multisampling(bool e = true); -// A primitive that can be used with OpenCSG rendering algorithms. -// Does a similar job to GLVolume. -class Primitive : public OpenCSG::Primitive +template::value_type> +inline std::vector transform_pts( + It from, It to, Trafo &&tr, GetPt &&point) { + vector ret; + ret.reserve(to - from); + for(auto it = from; it != to; ++it) { + V v = *it; + v.pos = tr * point(*it); + ret.emplace_back(std::move(v)); + } + return ret; +} + +class Volume { IndexedVertexArray m_geom; Geometry::Transformation m_trafo; + public: - using OpenCSG::Primitive::Primitive; - - Primitive() : OpenCSG::Primitive(OpenCSG::Intersection, 1) {} - - void render() override; + void render(); void translation(const Vec3d &offset) { m_trafo.set_offset(offset); } void rotation(const Vec3d &rot) { m_trafo.set_rotation(rot); } @@ -197,6 +208,18 @@ public: } }; +// A primitive that can be used with OpenCSG rendering algorithms. +// Does a similar job to GLVolume. +class Primitive : public Volume, public OpenCSG::Primitive +{ +public: + using OpenCSG::Primitive::Primitive; + + Primitive() : OpenCSG::Primitive(OpenCSG::Intersection, 1) {} + + void render() override { Volume::render(); } +}; + // A simple representation of a camera in a 3D scene class Camera { protected: diff --git a/sandboxes/opencsg/ShaderCSGDisplay.cpp b/sandboxes/opencsg/ShaderCSGDisplay.cpp new file mode 100644 index 0000000000..7339e408c5 --- /dev/null +++ b/sandboxes/opencsg/ShaderCSGDisplay.cpp @@ -0,0 +1,81 @@ +#include "ShaderCSGDisplay.hpp" +#include "libslic3r/SLAPrint.hpp" +#include + +namespace Slic3r { namespace GL { + +void ShaderCSGDisplay::add_mesh(const TriangleMesh &mesh) +{ + auto v = std::make_shared(); + v->load_mesh(mesh); + m_volumes.emplace_back(v); +} + +void ShaderCSGDisplay::render_scene() +{ + GLfloat color[] = {1.f, 1.f, 0.f, 0.f}; + glColor4fv(color); + glDepthFunc(GL_LESS); + for (auto &v : m_volumes) v->render(); + glFlush(); +} + +void ShaderCSGDisplay::on_scene_updated(const Scene &scene) +{ + // TriangleMesh mesh = print->objects().front()->hollowed_interior_mesh(); + // Look at CSGDisplay::on_scene_updated to see how its done there. + + const SLAPrint *print = scene.get_print(); + if (!print) return; + + m_volumes.clear(); + + for (const SLAPrintObject *po : print->objects()) { + const ModelObject *mo = po->model_object(); + TriangleMesh msh = mo->raw_mesh(); + + sla::DrainHoles holedata = mo->sla_drain_holes; + + for (const ModelInstance *mi : mo->instances) { + + TriangleMesh mshinst = msh; + auto interior = po->hollowed_interior_mesh(); + interior.transform(po->trafo().inverse()); + + mshinst.merge(interior); + mshinst.require_shared_vertices(); + + mi->transform_mesh(&mshinst); + + auto bb = mshinst.bounding_box(); + auto center = bb.center().cast(); + mshinst.translate(-center); + + mshinst.require_shared_vertices(); + add_mesh(mshinst); + + auto tr = Transform3f::Identity(); + tr.translate(-center); + + transform_pts(holedata.begin(), holedata.end(), tr, + [](const sla::DrainHole &dh) { + return dh.pos; + }); + + transform_pts(holedata.begin(), holedata.end(), tr, + [](const sla::DrainHole &dh) { + return dh.normal; + }); + } + + for (const sla::DrainHole &holept : holedata) { + TriangleMesh holemesh = sla::to_triangle_mesh(holept.to_mesh()); + holemesh.require_shared_vertices(); + add_mesh(holemesh); + } + } + + repaint(); +} + +}} // namespace Slic3r::GL diff --git a/sandboxes/opencsg/ShaderCSGDisplay.hpp b/sandboxes/opencsg/ShaderCSGDisplay.hpp new file mode 100644 index 0000000000..e1d96213e1 --- /dev/null +++ b/sandboxes/opencsg/ShaderCSGDisplay.hpp @@ -0,0 +1,26 @@ +#ifndef SHADERCSGDISPLAY_HPP +#define SHADERCSGDISPLAY_HPP + +#include "Engine.hpp" + +namespace Slic3r { namespace GL { + +class CSGVolume: public Volume +{ + // Extend... +}; + +class ShaderCSGDisplay: public Display { + vector> m_volumes; + + void add_mesh(const TriangleMesh &mesh); +public: + + void render_scene() override; + + void on_scene_updated(const Scene &scene) override; +}; + +}} + +#endif // SHADERCSGDISPLAY_HPP diff --git a/sandboxes/opencsg/main.cpp b/sandboxes/opencsg/main.cpp index ff7e36b8be..b98d812ece 100644 --- a/sandboxes/opencsg/main.cpp +++ b/sandboxes/opencsg/main.cpp @@ -3,6 +3,7 @@ #include #include "Engine.hpp" +#include "ShaderCSGDisplay.hpp" #include @@ -30,41 +31,64 @@ using namespace Slic3r::GL; +class Renderer { +protected: + wxGLCanvas *m_canvas; + shptr m_context; +public: + + Renderer(wxGLCanvas *c): m_canvas{c} { + auto ctx = new wxGLContext(m_canvas); + if (!ctx || !ctx->IsOK()) { + wxMessageBox("Could not create OpenGL context.", "Error", + wxOK | wxICON_ERROR); + return; + } + + m_context.reset(ctx); + } + + wxGLContext * context() { return m_context.get(); } + const wxGLContext * context() const { return m_context.get(); } +}; + +// Tell the CSGDisplay how to swap buffers and set the gl context. +class OCSGRenderer: public Renderer, public Slic3r::GL::CSGDisplay { +public: + + OCSGRenderer(wxGLCanvas *c): Renderer{c} {} + + void set_active(long w, long h) override + { + m_canvas->SetCurrent(*m_context); + Slic3r::GL::Display::set_active(w, h); + } + + void swap_buffers() override { m_canvas->SwapBuffers(); } + + ~OCSGRenderer() override { m_scene_cache.clear(); } +}; + +// Tell the CSGDisplay how to swap buffers and set the gl context. +class ShaderCSGRenderer : public Renderer, + public Slic3r::GL::ShaderCSGDisplay +{ +public: + + ShaderCSGRenderer(wxGLCanvas *c): Renderer{c} {} + + void set_active(long w, long h) override + { + m_canvas->SetCurrent(*m_context); + Slic3r::GL::Display::set_active(w, h); + } + + void swap_buffers() override { m_canvas->SwapBuffers(); } +}; + // The opengl rendering facility. Here we implement the rendering objects. class Canvas: public wxGLCanvas { - - // Tell the CSGDisplay how to swap buffers and set the gl context. - class OCSGRenderer: public Slic3r::GL::CSGDisplay { - Canvas *m_canvas; - shptr m_context; - public: - - OCSGRenderer(Canvas *c): m_canvas{c} { - auto ctx = new wxGLContext(m_canvas); - if (!ctx || !ctx->IsOK()) { - wxMessageBox("Could not create OpenGL context.", "Error", - wxOK | wxICON_ERROR); - return; - } - - m_context.reset(ctx); - } - - void set_active(long w, long h) override - { - m_canvas->SetCurrent(*m_context); - Slic3r::GL::Display::set_active(w, h); - } - - wxGLContext * context() { return m_context.get(); } - const wxGLContext * context() const { return m_context.get(); } - - void swap_buffers() override { m_canvas->SwapBuffers(); } - - ~OCSGRenderer() override { m_scene_cache.clear(); } - }; - // Create the OCSGDisplay for rendering with OpenCSG algorithms shptr m_ocsgdisplay = std::make_shared(this); @@ -90,12 +114,14 @@ public: const wxSize ClientSize = GetClientSize(); m_display->set_screen_size(ClientSize.x, ClientSize.y); + m_display->repaint(); }); } shptr get_display() const { return m_display; } + void set_display(shptr d) { m_display = d; } - + shptr get_ocsg_display() const { return m_ocsgdisplay; } }; @@ -172,6 +198,7 @@ public: void play() { m_playing = true; + std::cout << "Mouse is playing back" << std::endl; for (const Event &evt : m_events) { switch (evt.type) { case LCLK_U: MouseInput::left_click_up(); break; @@ -233,6 +260,7 @@ class MyFrame: public wxFrame m_parent->m_scene->set_print(std::move(m_print)); m_parent->m_stbar->set_status_text( wxString::Format("Model %s loaded.", m_fname)); + std::cout << "Model loaded" << std::endl; } }; @@ -247,7 +275,7 @@ public: MyFrame(const wxString & title, const wxPoint & pos, const wxSize & size, - const Slic3r::GL::CSGSettings &settings); + const wxCmdLineParser &settings); // Grab a 3mf and load (hollow it out) within the UI job. void load_model(const std::string &fname) { @@ -264,6 +292,9 @@ public: std::string model_name; std::getline(stream, model_name); load_model(model_name); + while (!m_ui_job->is_finalized()) { + wxYield(); + } int w, h; stream >> w >> h; @@ -286,7 +317,7 @@ public: // Possible OpenCSG configuration values. Will be used on the command line and // on the UI widgets. -static const std::vector CSG_ALGS = {"Auto", "Goldfeather", "SCS"}; +static const std::vector CSG_ALGS = {"Auto", "Goldfeather", "SCS", "EnricoShader"}; static const std::vector CSG_DEPTH = {"Off", "OcclusionQuery", "On"}; static const std::vector CSG_OPT = { "Default", "ForceOn", "On", "Off" }; @@ -309,41 +340,8 @@ public: wxString fname; bool is_play = parser.Found("play", &fname); - wxString alg; - parser.Found("algorithm", &alg); - - wxString depth; - parser.Found("depth", &depth); - - wxString opt; - parser.Found("optimization", &opt); - - long convexity = 1; - parser.Found("convexity", &convexity); - - bool csg_off = parser.Found("disable-csg"); - - auto get_idx = [](const wxString &a, const std::vector &v) { - auto it = std::find(v.begin(), v.end(), a.ToStdString()); - return it - v.begin(); - }; - - Slic3r::GL::CSGSettings settings; - - if (auto a = get_idx(alg, CSG_ALGS) < OpenCSG::AlgorithmUnused) - settings.set_algo(OpenCSG::Algorithm(a)); - - if (auto a = get_idx(depth, CSG_DEPTH) < OpenCSG::DepthComplexityAlgorithmUnused) - settings.set_depth_algo(OpenCSG::DepthComplexityAlgorithm(a)); - - if (auto a = get_idx(opt, CSG_OPT) < OpenCSG::OptimizationUnused) - settings.set_optimization(OpenCSG::Optimization(a)); - - settings.set_convexity(unsigned(convexity)); - settings.enable_csg(!csg_off); - - m_frame = new MyFrame("PrusaSlicer OpenCSG Demo", wxDefaultPosition, wxSize(1024, 768), settings); - + m_frame = new MyFrame("PrusaSlicer OpenCSG Demo", wxDefaultPosition, wxSize(1024, 768), parser); + if (is_play) { m_frame->Show( true ); m_frame->play_back_mouse(fname.ToStdString()); @@ -361,7 +359,7 @@ public: wxIMPLEMENT_APP(App); MyFrame::MyFrame(const wxString &title, const wxPoint &pos, const wxSize &size, - const Slic3r::GL::CSGSettings &settings): + const wxCmdLineParser &parser): wxFrame(nullptr, wxID_ANY, title, pos, size) { wxMenu *menuFile = new wxMenu; @@ -396,9 +394,40 @@ MyFrame::MyFrame(const wxString &title, const wxPoint &pos, const wxSize &size, wxDefaultPosition, wxDefaultSize, wxWANTS_CHARS | wxFULL_REPAINT_ON_RESIZE); - m_canvas->get_ocsg_display()->apply_csgsettings(settings); + wxString alg; + parser.Found("algorithm", &alg); - m_ctl->add_display(m_canvas->get_display()); + wxString depth; + parser.Found("depth", &depth); + + wxString opt; + parser.Found("optimization", &opt); + + long convexity = 1; + parser.Found("convexity", &convexity); + + bool csg_off = parser.Found("disable-csg"); + + auto get_idx = [](const wxString &a, const std::vector &v) { + auto it = std::find(v.begin(), v.end(), a.ToStdString()); + return it - v.begin(); + }; + + Slic3r::GL::CSGSettings settings; + + if (auto a = get_idx(alg, CSG_ALGS) < OpenCSG::AlgorithmUnused) + settings.set_algo(OpenCSG::Algorithm(a)); + + if (auto a = get_idx(depth, CSG_DEPTH) < OpenCSG::DepthComplexityAlgorithmUnused) + settings.set_depth_algo(OpenCSG::DepthComplexityAlgorithm(a)); + + if (auto a = get_idx(opt, CSG_OPT) < OpenCSG::OptimizationUnused) + settings.set_optimization(OpenCSG::Optimization(a)); + + settings.set_convexity(unsigned(convexity)); + settings.enable_csg(!csg_off); + + m_canvas->get_ocsg_display()->apply_csgsettings(settings); wxPanel *control_panel = new wxPanel(this); @@ -459,10 +488,6 @@ MyFrame::MyFrame(const wxString &title, const wxPoint &pos, const wxSize &size, auto fpstext = new wxStaticText(control_panel, wxID_ANY, ""); console_sizer->Add(fpstext, 0, wxALL, 5); - m_canvas->get_ocsg_display()->get_fps_counter().add_listener([this, fpstext](double fps) { - fpstext->SetLabel(wxString::Format("fps: %.2f", fps) ); - m_fps_avg = 0.9 * m_fps_avg + 0.1 * fps; - }); m_record_btn = new wxToggleButton(control_panel, wxID_ANY, "Record"); console_sizer->Add(m_record_btn, 0, wxALL | wxEXPAND, 5); @@ -477,12 +502,28 @@ MyFrame::MyFrame(const wxString &title, const wxPoint &pos, const wxSize &size, sizer->Add(control_panel, 0, wxEXPAND); SetSizer(sizer); - if (settings.get_algo() > 0) depth_select->Enable(true); - alg_select->SetSelection(settings.get_algo()); - depth_select->SetSelection(settings.get_depth_algo()); - optimization_select->SetSelection(settings.get_optimization()); - convexity_spin->SetValue(int(settings.get_convexity())); - csg_toggle->SetValue(settings.is_enabled()); + if (alg != "EnricoShader") { + if (settings.get_algo() > 0) depth_select->Enable(true); + alg_select->SetSelection(settings.get_algo()); + depth_select->SetSelection(settings.get_depth_algo()); + optimization_select->SetSelection(settings.get_optimization()); + convexity_spin->SetValue(int(settings.get_convexity())); + csg_toggle->SetValue(settings.is_enabled()); + } else { + alg_select->SetSelection(int(get_idx("EnricoShader", CSG_ALGS))); + depth_select->Disable(); + optimization_select->Disable(); + convexity_spin->Disable(); + csg_toggle->Disable(); + auto renderer = std::make_shared(canvas()); + canvas()->set_display(renderer); + } + + m_ctl->add_display(m_canvas->get_display()); + m_canvas->get_display()->get_fps_counter().add_listener([this, fpstext](double fps) { + fpstext->SetLabel(wxString::Format("fps: %.2f", fps) ); + m_fps_avg = 0.9 * m_fps_avg + 0.1 * fps; + }); Bind(wxEVT_CLOSE_WINDOW, [this](wxCloseEvent &evt){ if (m_canvas) RemoveChild(m_canvas.get()); @@ -504,6 +545,16 @@ MyFrame::MyFrame(const wxString &title, const wxPoint &pos, const wxSize &size, const wxSize ClientSize = GetClientSize(); m_canvas->get_display()->set_active(ClientSize.x, ClientSize.y); enable_multisampling(ms_toggle->GetValue()); + + // Do the repaint continuously + m_canvas->Bind(wxEVT_IDLE, [this](wxIdleEvent &evt) { + if (IsShown() && m_canvas->IsShown()) + m_canvas->get_display()->repaint(); + + evt.RequestMore(); + }); + + bind_canvas_events(m_mouse); }); Bind(wxEVT_SLIDER, [this, slider](wxCommandEvent &) { @@ -585,14 +636,6 @@ MyFrame::MyFrame(const wxString &title, const wxPoint &pos, const wxSize &size, } } }); - - // Do the repaint continuously - m_canvas->Bind(wxEVT_IDLE, [this](wxIdleEvent &evt) { - if (m_canvas->IsShown()) m_canvas->get_display()->repaint(); - evt.RequestMore(); - }); - - bind_canvas_events(m_mouse); } void MyFrame::bind_canvas_events(MouseInput &ms) diff --git a/src/slic3r/GUI/Job.hpp b/src/slic3r/GUI/Job.hpp index 9accd0ef39..ac31b9bdb0 100644 --- a/src/slic3r/GUI/Job.hpp +++ b/src/slic3r/GUI/Job.hpp @@ -62,7 +62,6 @@ protected: // Launched when the job is finished. It refreshes the 3Dscene by def. virtual void finalize() { m_finalized = true; } - bool is_finalized() const { return m_finalized; } public: Job(std::shared_ptr pri) : m_progress(pri) @@ -89,6 +88,8 @@ public: }); } + bool is_finalized() const { return m_finalized; } + Job(const Job &) = delete; Job(Job &&) = delete; Job &operator=(const Job &) = delete; From 083b557ec2c1d2222e9177d5b6552a97c3336e29 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Fri, 20 Dec 2019 15:12:54 +0100 Subject: [PATCH 096/336] Display switching --- sandboxes/opencsg/Engine.hpp | 28 ++- sandboxes/opencsg/ShaderCSGDisplay.hpp | 1 + sandboxes/opencsg/main.cpp | 314 ++++++++++++++----------- 3 files changed, 200 insertions(+), 143 deletions(-) diff --git a/sandboxes/opencsg/Engine.hpp b/sandboxes/opencsg/Engine.hpp index 79bf9582bf..c078a39d86 100644 --- a/sandboxes/opencsg/Engine.hpp +++ b/sandboxes/opencsg/Engine.hpp @@ -309,13 +309,25 @@ private: public: int get_algo() const { return int(m_csgalg); } - void set_algo(OpenCSG::Algorithm alg) { m_csgalg = alg; } + void set_algo(int alg) + { + if (alg < OpenCSG::Algorithm::AlgorithmUnused) + m_csgalg = OpenCSG::Algorithm(alg); + } int get_depth_algo() const { return int(m_depth_algo); } - void set_depth_algo(OpenCSG::DepthComplexityAlgorithm alg) { m_depth_algo = alg; } + void set_depth_algo(int alg) + { + if (alg < OpenCSG::DepthComplexityAlgorithmUnused) + m_depth_algo = OpenCSG::DepthComplexityAlgorithm(alg); + } int get_optimization() const { return int(m_optim); } - void set_optimization(OpenCSG::Optimization o) { m_optim = o; } + void set_optimization(int o) + { + if (o < OpenCSG::Optimization::OptimizationUnused) + m_optim = OpenCSG::Optimization(o); + } void enable_csg(bool en = true) { m_enable = en; } bool is_enabled() const { return m_enable; } @@ -382,7 +394,9 @@ public: ~Display() override; - Camera * camera() { return m_camera.get(); } + shptr get_camera() const { return m_camera; } + shptr get_camera() { return m_camera; } + void set_camera(shptr cam) { m_camera = cam; } virtual void swap_buffers() = 0; virtual void set_active(long width, long height); @@ -456,8 +470,8 @@ class Controller : public std::enable_shared_from_this, template void call_cameras(F &&f, Args&&... args) { for (wkptr &l : m_displays) - if (auto disp = l.lock()) if (disp->camera()) - (disp->camera()->*f)(std::forward(args)...); + if (auto disp = l.lock()) if (auto cam = disp->get_camera()) + (cam.get()->*f)(std::forward(args)...); } public: @@ -477,6 +491,8 @@ public: cleanup(m_displays); } + void remove_displays() { m_displays = {}; } + void on_scene_updated(const Scene &scene) override; void on_left_click_down() override { m_left_btn = true; } diff --git a/sandboxes/opencsg/ShaderCSGDisplay.hpp b/sandboxes/opencsg/ShaderCSGDisplay.hpp index e1d96213e1..bf0c3a4240 100644 --- a/sandboxes/opencsg/ShaderCSGDisplay.hpp +++ b/sandboxes/opencsg/ShaderCSGDisplay.hpp @@ -11,6 +11,7 @@ class CSGVolume: public Volume }; class ShaderCSGDisplay: public Display { +protected: vector> m_volumes; void add_mesh(const TriangleMesh &mesh); diff --git a/sandboxes/opencsg/main.cpp b/sandboxes/opencsg/main.cpp index b98d812ece..c82ff2f485 100644 --- a/sandboxes/opencsg/main.cpp +++ b/sandboxes/opencsg/main.cpp @@ -65,14 +65,10 @@ public: } void swap_buffers() override { m_canvas->SwapBuffers(); } - - ~OCSGRenderer() override { m_scene_cache.clear(); } }; // Tell the CSGDisplay how to swap buffers and set the gl context. -class ShaderCSGRenderer : public Renderer, - public Slic3r::GL::ShaderCSGDisplay -{ +class ShaderCSGRenderer : public Renderer, public Slic3r::GL::ShaderCSGDisplay { public: ShaderCSGRenderer(wxGLCanvas *c): Renderer{c} {} @@ -88,12 +84,9 @@ public: // The opengl rendering facility. Here we implement the rendering objects. class Canvas: public wxGLCanvas -{ - // Create the OCSGDisplay for rendering with OpenCSG algorithms - shptr m_ocsgdisplay = std::make_shared(this); - +{ // One display is active at a time, the OCSGRenderer by default. - shptr m_display = m_ocsgdisplay; + shptr m_display; public: @@ -121,8 +114,6 @@ public: shptr get_display() const { return m_display; } void set_display(shptr d) { m_display = d; } - - shptr get_ocsg_display() const { return m_ocsgdisplay; } }; // Enumerate possible mouse events, we will record them. @@ -198,7 +189,6 @@ public: void play() { m_playing = true; - std::cout << "Mouse is playing back" << std::endl; for (const Event &evt : m_events) { switch (evt.type) { case LCLK_U: MouseInput::left_click_up(); break; @@ -225,10 +215,12 @@ public: class MyFrame: public wxFrame { // Instantiate the 3D engine. - shptr m_scene; // Model - shptr m_canvas; // View - shptr m_ctl; // Controller - + shptr m_scene; // Model + shptr m_canvas; // Views store + shptr m_ocsgdisplay; // View + shptr m_shadercsg_display; // Another view + shptr m_ctl; // Controller + // Add a status bar with progress indication. shptr m_stbar; @@ -260,7 +252,6 @@ class MyFrame: public wxFrame m_parent->m_scene->set_print(std::move(m_print)); m_parent->m_stbar->set_status_text( wxString::Format("Model %s loaded.", m_fname)); - std::cout << "Model loaded" << std::endl; } }; @@ -269,14 +260,30 @@ class MyFrame: public wxFrame // To keep track of the running average of measured fps values. double m_fps_avg = 0.; + // We need the record button across methods wxToggleButton *m_record_btn; + wxComboBox * m_alg_select; + wxComboBox * m_depth_select; + wxComboBox * m_optimization_select; + wxSpinCtrl * m_convexity_spin; + wxToggleButton *m_csg_toggle; + wxToggleButton *m_ms_toggle; + wxStaticText *m_fpstext; + + CSGSettings m_csg_settings; + + void read_csg_settings(const wxCmdLineParser &parser); + + void set_renderer_algorithm(const wxString &alg); + + void activate_canvas_display(); public: - MyFrame(const wxString & title, - const wxPoint & pos, - const wxSize & size, - const wxCmdLineParser &settings); - + MyFrame(const wxString & title, + const wxPoint & pos, + const wxSize & size, + const wxCmdLineParser &parser); + // Grab a 3mf and load (hollow it out) within the UI job. void load_model(const std::string &fname) { m_ui_job = std::make_unique(this, fname); @@ -321,6 +328,12 @@ static const std::vector CSG_ALGS = {"Auto", "Goldfeather", "SCS", "E static const std::vector CSG_DEPTH = {"Off", "OcclusionQuery", "On"}; static const std::vector CSG_OPT = { "Default", "ForceOn", "On", "Off" }; +inline long get_idx(const wxString &a, const std::vector &v) +{ + auto it = std::find(v.begin(), v.end(), a.ToStdString()); + return it - v.begin(); +}; + class App : public wxApp { MyFrame *m_frame = nullptr; public: @@ -358,6 +371,105 @@ public: wxIMPLEMENT_APP(App); +void MyFrame::read_csg_settings(const wxCmdLineParser &parser) +{ + wxString alg; + parser.Found("algorithm", &alg); + + wxString depth; + parser.Found("depth", &depth); + + wxString opt; + parser.Found("optimization", &opt); + + long convexity = 1; + parser.Found("convexity", &convexity); + + bool csg_off = parser.Found("disable-csg"); + + if (auto a = get_idx(alg, CSG_ALGS) < OpenCSG::AlgorithmUnused) + m_csg_settings.set_algo(OpenCSG::Algorithm(a)); + + if (auto a = get_idx(depth, CSG_DEPTH) < OpenCSG::DepthComplexityAlgorithmUnused) + m_csg_settings.set_depth_algo(OpenCSG::DepthComplexityAlgorithm(a)); + + if (auto a = get_idx(opt, CSG_OPT) < OpenCSG::OptimizationUnused) + m_csg_settings.set_optimization(OpenCSG::Optimization(a)); + + m_csg_settings.set_convexity(unsigned(convexity)); + m_csg_settings.enable_csg(!csg_off); + + if (m_ocsgdisplay) m_ocsgdisplay->apply_csgsettings(m_csg_settings); +} + +void MyFrame::set_renderer_algorithm(const wxString &alg) +{ + long alg_idx = get_idx("EnricoShader", CSG_ALGS); + if (alg_idx < 0 || alg_idx >= CSG_ALGS.size()) return; + + // If there is a valid display in place, save its camera. + auto cam = m_canvas->get_display() ? + m_canvas->get_display()->get_camera() : nullptr; + + if (alg == "EnricoShader") { + m_alg_select->SetSelection(int(alg_idx)); + m_depth_select->Disable(); + m_optimization_select->Disable(); + m_csg_toggle->Disable(); + + m_ocsgdisplay.reset(); + canvas()->set_display(nullptr); + m_shadercsg_display = std::make_shared(canvas()); + canvas()->set_display(m_shadercsg_display); + } else { + if (m_csg_settings.get_algo() > 0) m_depth_select->Enable(true); + m_alg_select->SetSelection(m_csg_settings.get_algo()); + m_depth_select->SetSelection(m_csg_settings.get_depth_algo()); + m_optimization_select->SetSelection(m_csg_settings.get_optimization()); + m_convexity_spin->SetValue(int(m_csg_settings.get_convexity())); + m_csg_toggle->SetValue(m_csg_settings.is_enabled()); + m_optimization_select->Enable(); + m_csg_toggle->Enable(); + + m_shadercsg_display.reset(); + canvas()->set_display(nullptr); + m_ocsgdisplay = std::make_shared(canvas()); + m_ocsgdisplay->apply_csgsettings(m_csg_settings); + canvas()->set_display(m_ocsgdisplay); + } + + if (cam) m_canvas->get_display()->set_camera(cam); + + m_ctl->remove_displays(); + m_ctl->add_display(m_canvas->get_display()); + m_canvas->get_display()->get_fps_counter().add_listener([this](double fps) { + m_fpstext->SetLabel(wxString::Format("fps: %.2f", fps)); + m_fps_avg = 0.9 * m_fps_avg + 0.1 * fps; + }); + + if (IsShown()) { + activate_canvas_display(); + m_canvas->get_display()->on_scene_updated(*m_scene); + } +} + +void MyFrame::activate_canvas_display() +{ + const wxSize ClientSize = m_canvas->GetClientSize(); + m_canvas->get_display()->set_active(ClientSize.x, ClientSize.y); + enable_multisampling(m_ms_toggle->GetValue()); + + // Do the repaint continuously + m_canvas->Bind(wxEVT_IDLE, [this](wxIdleEvent &evt) { + if (IsShown() && m_canvas->IsShown()) + m_canvas->get_display()->repaint(); + + evt.RequestMore(); + }); + + bind_canvas_events(m_mouse); +} + MyFrame::MyFrame(const wxString &title, const wxPoint &pos, const wxSize &size, const wxCmdLineParser &parser): wxFrame(nullptr, wxID_ANY, title, pos, size) @@ -384,7 +496,7 @@ MyFrame::MyFrame(const wxString &title, const wxPoint &pos, const wxSize &size, // glReadPixels would not return the alpha channel on NVIDIA if // not requested when the GL context is created. WX_GL_MIN_ALPHA, 8, WX_GL_DEPTH_SIZE, 8, WX_GL_STENCIL_SIZE, 8, - /*WX_GL_SAMPLE_BUFFERS, GL_TRUE, WX_GL_SAMPLES, 4,*/ 0}; + WX_GL_SAMPLE_BUFFERS, GL_TRUE, WX_GL_SAMPLES, 4, 0}; m_scene = std::make_shared(); m_ctl = std::make_shared(); @@ -394,40 +506,7 @@ MyFrame::MyFrame(const wxString &title, const wxPoint &pos, const wxSize &size, wxDefaultPosition, wxDefaultSize, wxWANTS_CHARS | wxFULL_REPAINT_ON_RESIZE); - wxString alg; - parser.Found("algorithm", &alg); - - wxString depth; - parser.Found("depth", &depth); - - wxString opt; - parser.Found("optimization", &opt); - - long convexity = 1; - parser.Found("convexity", &convexity); - - bool csg_off = parser.Found("disable-csg"); - - auto get_idx = [](const wxString &a, const std::vector &v) { - auto it = std::find(v.begin(), v.end(), a.ToStdString()); - return it - v.begin(); - }; - - Slic3r::GL::CSGSettings settings; - - if (auto a = get_idx(alg, CSG_ALGS) < OpenCSG::AlgorithmUnused) - settings.set_algo(OpenCSG::Algorithm(a)); - - if (auto a = get_idx(depth, CSG_DEPTH) < OpenCSG::DepthComplexityAlgorithmUnused) - settings.set_depth_algo(OpenCSG::DepthComplexityAlgorithm(a)); - - if (auto a = get_idx(opt, CSG_OPT) < OpenCSG::OptimizationUnused) - settings.set_optimization(OpenCSG::Optimization(a)); - - settings.set_convexity(unsigned(convexity)); - settings.enable_csg(!csg_off); - - m_canvas->get_ocsg_display()->apply_csgsettings(settings); + read_csg_settings(parser); wxPanel *control_panel = new wxPanel(this); @@ -440,12 +519,12 @@ MyFrame::MyFrame(const wxString &title, const wxPoint &pos, const wxSize &size, wxSL_VERTICAL); slider_sizer->Add(slider, 1, wxEXPAND); - auto ms_toggle = new wxToggleButton(control_panel, wxID_ANY, "Multisampling"); - console_sizer->Add(ms_toggle, 0, wxALL | wxEXPAND, 5); + m_ms_toggle = new wxToggleButton(control_panel, wxID_ANY, "Multisampling"); + console_sizer->Add(m_ms_toggle, 0, wxALL | wxEXPAND, 5); - auto csg_toggle = new wxToggleButton(control_panel, wxID_ANY, "CSG"); - csg_toggle->SetValue(true); - console_sizer->Add(csg_toggle, 0, wxALL | wxEXPAND, 5); + m_csg_toggle = new wxToggleButton(control_panel, wxID_ANY, "CSG"); + m_csg_toggle->SetValue(true); + console_sizer->Add(m_csg_toggle, 0, wxALL | wxEXPAND, 5); auto add_combobox = [control_panel, console_sizer] (const wxString &label, const std::vector &list) @@ -479,15 +558,14 @@ MyFrame::MyFrame(const wxString &title, const wxPoint &pos, const wxSize &size, return widget; }; - auto convexity_spin = add_spinctl("Convexity", CSGSettings::DEFAULT_CONVEXITY, 0, 100); + m_convexity_spin = add_spinctl("Convexity", CSGSettings::DEFAULT_CONVEXITY, 0, 100); - auto alg_select = add_combobox("Algorithm", CSG_ALGS); - auto depth_select = add_combobox("Depth Complexity", CSG_DEPTH); - auto optimization_select = add_combobox("Optimization", CSG_OPT); - depth_select->Disable(); + m_alg_select = add_combobox("Algorithm", CSG_ALGS); + m_depth_select = add_combobox("Depth Complexity", CSG_DEPTH); + m_optimization_select = add_combobox("Optimization", CSG_OPT); - auto fpstext = new wxStaticText(control_panel, wxID_ANY, ""); - console_sizer->Add(fpstext, 0, wxALL, 5); + m_fpstext = new wxStaticText(control_panel, wxID_ANY, ""); + console_sizer->Add(m_fpstext, 0, wxALL, 5); m_record_btn = new wxToggleButton(control_panel, wxID_ANY, "Record"); console_sizer->Add(m_record_btn, 0, wxALL | wxEXPAND, 5); @@ -502,28 +580,10 @@ MyFrame::MyFrame(const wxString &title, const wxPoint &pos, const wxSize &size, sizer->Add(control_panel, 0, wxEXPAND); SetSizer(sizer); - if (alg != "EnricoShader") { - if (settings.get_algo() > 0) depth_select->Enable(true); - alg_select->SetSelection(settings.get_algo()); - depth_select->SetSelection(settings.get_depth_algo()); - optimization_select->SetSelection(settings.get_optimization()); - convexity_spin->SetValue(int(settings.get_convexity())); - csg_toggle->SetValue(settings.is_enabled()); - } else { - alg_select->SetSelection(int(get_idx("EnricoShader", CSG_ALGS))); - depth_select->Disable(); - optimization_select->Disable(); - convexity_spin->Disable(); - csg_toggle->Disable(); - auto renderer = std::make_shared(canvas()); - canvas()->set_display(renderer); - } + wxString alg; + if (!parser.Found("algorithm", &alg)) alg = "Auto"; - m_ctl->add_display(m_canvas->get_display()); - m_canvas->get_display()->get_fps_counter().add_listener([this, fpstext](double fps) { - fpstext->SetLabel(wxString::Format("fps: %.2f", fps) ); - m_fps_avg = 0.9 * m_fps_avg + 0.1 * fps; - }); + set_renderer_algorithm(alg); Bind(wxEVT_CLOSE_WINDOW, [this](wxCloseEvent &evt){ if (m_canvas) RemoveChild(m_canvas.get()); @@ -541,69 +601,49 @@ MyFrame::MyFrame(const wxString &title, const wxPoint &pos, const wxSize &size, Bind(wxEVT_MENU, [this](wxCommandEvent &) { Close(true); }, wxID_EXIT); - Bind(wxEVT_SHOW, [this, ms_toggle](wxShowEvent &) { - const wxSize ClientSize = GetClientSize(); - m_canvas->get_display()->set_active(ClientSize.x, ClientSize.y); - enable_multisampling(ms_toggle->GetValue()); - - // Do the repaint continuously - m_canvas->Bind(wxEVT_IDLE, [this](wxIdleEvent &evt) { - if (IsShown() && m_canvas->IsShown()) - m_canvas->get_display()->repaint(); - - evt.RequestMore(); - }); - - bind_canvas_events(m_mouse); + Bind(wxEVT_SHOW, [this](wxShowEvent &) { + activate_canvas_display(); }); Bind(wxEVT_SLIDER, [this, slider](wxCommandEvent &) { m_ctl->move_clip_plane(double(slider->GetValue())); }); - ms_toggle->Bind(wxEVT_TOGGLEBUTTON, [this, ms_toggle](wxCommandEvent &){ - enable_multisampling(ms_toggle->GetValue()); + m_ms_toggle->Bind(wxEVT_TOGGLEBUTTON, [this](wxCommandEvent &){ + enable_multisampling(m_ms_toggle->GetValue()); m_canvas->get_display()->repaint(); }); - csg_toggle->Bind(wxEVT_TOGGLEBUTTON, [this, csg_toggle](wxCommandEvent &){ - CSGSettings stt = m_canvas->get_ocsg_display()->get_csgsettings(); - stt.enable_csg(csg_toggle->GetValue()); - m_canvas->get_ocsg_display()->apply_csgsettings(stt); + m_csg_toggle->Bind(wxEVT_TOGGLEBUTTON, [this](wxCommandEvent &){ + CSGSettings stt = m_ocsgdisplay->get_csgsettings(); + stt.enable_csg(m_csg_toggle->GetValue()); + m_ocsgdisplay->apply_csgsettings(stt); }); - alg_select->Bind(wxEVT_COMBOBOX, - [this, alg_select, depth_select](wxCommandEvent &) - { - int sel = alg_select->GetSelection(); - depth_select->Enable(sel > 0); - CSGSettings stt = m_canvas->get_ocsg_display()->get_csgsettings(); - stt.set_algo(OpenCSG::Algorithm(sel)); - m_canvas->get_ocsg_display()->apply_csgsettings(stt); + m_alg_select->Bind(wxEVT_COMBOBOX, [this](wxCommandEvent &) { + wxString alg = m_alg_select->GetValue(); + int sel = m_alg_select->GetSelection(); + m_csg_settings.set_algo(sel); + set_renderer_algorithm(alg); }); - depth_select->Bind(wxEVT_COMBOBOX, [this, depth_select](wxCommandEvent &) { - int sel = depth_select->GetSelection(); - CSGSettings stt = m_canvas->get_ocsg_display()->get_csgsettings(); - stt.set_depth_algo(OpenCSG::DepthComplexityAlgorithm(sel)); - m_canvas->get_ocsg_display()->apply_csgsettings(stt); + m_depth_select->Bind(wxEVT_COMBOBOX, [this](wxCommandEvent &) { + int sel = m_depth_select->GetSelection(); + m_csg_settings.set_depth_algo(sel); + if (m_ocsgdisplay) m_ocsgdisplay->apply_csgsettings(m_csg_settings); }); - optimization_select->Bind(wxEVT_COMBOBOX, - [this, optimization_select](wxCommandEvent &) { - int sel = optimization_select->GetSelection(); - CSGSettings stt = m_canvas->get_ocsg_display()->get_csgsettings(); - stt.set_optimization(OpenCSG::Optimization(sel)); - m_canvas->get_ocsg_display()->apply_csgsettings(stt); + m_optimization_select->Bind(wxEVT_COMBOBOX, [this](wxCommandEvent &) { + int sel = m_optimization_select->GetSelection(); + m_csg_settings.set_optimization(sel); + if (m_ocsgdisplay) m_ocsgdisplay->apply_csgsettings(m_csg_settings); }); - convexity_spin->Bind(wxEVT_SPINCTRL, [this, convexity_spin](wxSpinEvent &) { - CSGSettings stt = m_canvas->get_ocsg_display()->get_csgsettings(); - int c = convexity_spin->GetValue(); - + m_convexity_spin->Bind(wxEVT_SPINCTRL, [this](wxSpinEvent &) { + int c = m_convexity_spin->GetValue(); if (c > 0) { - stt.set_convexity(unsigned(c)); - m_canvas->get_ocsg_display()->apply_csgsettings(stt); + m_csg_settings.set_convexity(unsigned(c)); + if (m_ocsgdisplay) m_ocsgdisplay->apply_csgsettings(m_csg_settings); } }); @@ -614,7 +654,7 @@ MyFrame::MyFrame(const wxString &title, const wxPoint &pos, const wxSize &size, } if (m_record_btn->GetValue()) { - if (auto c = m_canvas->get_display()->camera()) reset(*c); + if (auto c = m_canvas->get_display()->get_camera()) reset(*c); m_ctl->on_scene_updated(*m_scene); m_mouse.record(true); } else { From 3a185d7f574ec512c1f9e172b3bf90e2938a552c Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Fri, 20 Dec 2019 19:57:34 +0100 Subject: [PATCH 097/336] fix windows widgets while playback --- sandboxes/opencsg/main.cpp | 39 ++++++++++++++++++++++---------------- 1 file changed, 23 insertions(+), 16 deletions(-) diff --git a/sandboxes/opencsg/main.cpp b/sandboxes/opencsg/main.cpp index c82ff2f485..c1bda6b398 100644 --- a/sandboxes/opencsg/main.cpp +++ b/sandboxes/opencsg/main.cpp @@ -109,6 +109,13 @@ public: m_display->set_screen_size(ClientSize.x, ClientSize.y); m_display->repaint(); }); + + Bind(wxEVT_SIZE, [this](wxSizeEvent &) { + const wxSize ClientSize = GetClientSize(); + + m_display->set_screen_size(ClientSize.x, ClientSize.y); + m_display->repaint(); + }); } shptr get_display() const { return m_display; } @@ -200,7 +207,7 @@ public: case MV: MouseInput::move_to(evt.a, evt.b); break; } - wxYield(); + wxTheApp->Yield(); if (!m_playing) break; } @@ -299,9 +306,9 @@ public: std::string model_name; std::getline(stream, model_name); load_model(model_name); - while (!m_ui_job->is_finalized()) { - wxYield(); - } + + while (!m_ui_job->is_finalized()) + wxTheApp->Yield();; int w, h; stream >> w >> h; @@ -336,6 +343,7 @@ inline long get_idx(const wxString &a, const std::vector &v) class App : public wxApp { MyFrame *m_frame = nullptr; + wxString m_fname; public: bool OnInit() override { @@ -350,23 +358,23 @@ public: parser.Parse(); - wxString fname; - bool is_play = parser.Found("play", &fname); + bool is_play = parser.Found("play", &m_fname); m_frame = new MyFrame("PrusaSlicer OpenCSG Demo", wxDefaultPosition, wxSize(1024, 768), parser); if (is_play) { + Bind(wxEVT_IDLE, &App::Play, this); m_frame->Show( true ); - m_frame->play_back_mouse(fname.ToStdString()); - - std::cout << m_frame->get_fps_average() << std::endl; - - m_frame->Destroy(); - } else m_frame->Show( true ); return true; } + + void Play(wxIdleEvent &) { + Unbind(wxEVT_IDLE, &App::Play, this); + m_frame->play_back_mouse(m_fname.ToStdString()); + m_frame->Destroy(); + } }; wxIMPLEMENT_APP(App); @@ -438,7 +446,8 @@ void MyFrame::set_renderer_algorithm(const wxString &alg) canvas()->set_display(m_ocsgdisplay); } - if (cam) m_canvas->get_display()->set_camera(cam); + if (cam) + m_canvas->get_display()->set_camera(cam); m_ctl->remove_displays(); m_ctl->add_display(m_canvas->get_display()); @@ -461,9 +470,7 @@ void MyFrame::activate_canvas_display() // Do the repaint continuously m_canvas->Bind(wxEVT_IDLE, [this](wxIdleEvent &evt) { - if (IsShown() && m_canvas->IsShown()) - m_canvas->get_display()->repaint(); - + m_canvas->get_display()->repaint(); evt.RequestMore(); }); From 451f04b590f3455eb2400e4553d790fa4c8d4164 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Fri, 20 Dec 2019 20:18:23 +0100 Subject: [PATCH 098/336] Fix linux assertion --- sandboxes/opencsg/main.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/sandboxes/opencsg/main.cpp b/sandboxes/opencsg/main.cpp index c1bda6b398..3922706e74 100644 --- a/sandboxes/opencsg/main.cpp +++ b/sandboxes/opencsg/main.cpp @@ -110,11 +110,9 @@ public: m_display->repaint(); }); - Bind(wxEVT_SIZE, [this](wxSizeEvent &) { + Bind(wxEVT_SIZE, [this](wxSizeEvent &) { const wxSize ClientSize = GetClientSize(); - m_display->set_screen_size(ClientSize.x, ClientSize.y); - m_display->repaint(); }); } From 6a870ef8bb94beea865c11a4fe6bba56894776e6 Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Mon, 6 Jan 2020 16:02:55 +0100 Subject: [PATCH 099/336] Fixed incorrect z-shift when showing hollowed object --- src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp | 4 +++- src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp | 2 ++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp index f0b71f2608..44894a0fb7 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp @@ -84,6 +84,7 @@ void GLGizmoHollow::set_sla_support_data(ModelObject* model_object, const Select if (m_state == On) { m_parent.toggle_model_objects_visibility(false); m_parent.toggle_model_objects_visibility(! m_c->m_cavity_mesh, m_c->m_model_object, m_c->m_active_instance); + m_parent.toggle_sla_auxiliaries_visibility(bool(m_c->m_cavity_mesh), m_c->m_model_object, m_c->m_active_instance); } else m_parent.toggle_model_objects_visibility(true, nullptr, -1); @@ -127,6 +128,7 @@ void GLGizmoHollow::on_render() const } // Show/hide the original object m_parent.toggle_model_objects_visibility(! m_c->m_cavity_mesh, m_c->m_model_object, m_c->m_active_instance); + m_parent.toggle_sla_auxiliaries_visibility(bool(m_c->m_cavity_mesh), m_c->m_model_object, m_c->m_active_instance); m_z_shift = selection.get_volume(*selection.get_volume_idxs().begin())->get_sla_shift_z(); @@ -628,7 +630,7 @@ void GLGizmoHollow::update_hollowed_mesh(std::unique_ptr &&mesh) // create a new GLVolume that only has the cavity inside Geometry::Transformation volume_trafo = m_c->m_model_object->volumes.front()->get_transformation(); - volume_trafo.set_offset(volume_trafo.get_offset() + Vec3d(0., 0., m_z_shift)); + volume_trafo.set_offset(volume_trafo.get_offset()); m_c->m_volume_with_cavity.reset(new GLVolume(GLVolume::MODEL_COLOR[2])); m_c->m_volume_with_cavity->indexed_vertex_array.load_mesh(*m_c->m_cavity_mesh.get()); m_c->m_volume_with_cavity->finalize_geometry(true); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp index c689be2141..cb9dc27539 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp @@ -94,6 +94,7 @@ void GLGizmoSlaSupports::set_sla_support_data(ModelObject* model_object, const S if (m_state == On) { m_parent.toggle_model_objects_visibility(false); m_parent.toggle_model_objects_visibility(! m_c->m_cavity_mesh, m_c->m_model_object, m_c->m_active_instance); + m_parent.toggle_sla_auxiliaries_visibility(bool(m_c->m_cavity_mesh), m_c->m_model_object, m_c->m_active_instance); } else m_parent.toggle_model_objects_visibility(true, nullptr, -1); @@ -137,6 +138,7 @@ void GLGizmoSlaSupports::on_render() const } // Show/hide the original object m_parent.toggle_model_objects_visibility(! m_c->m_cavity_mesh, m_c->m_model_object, m_c->m_active_instance); + m_parent.toggle_sla_auxiliaries_visibility(bool(m_c->m_cavity_mesh), m_c->m_model_object, m_c->m_active_instance); m_z_shift = selection.get_volume(*selection.get_volume_idxs().begin())->get_sla_shift_z(); From 7d55df052fe99908664744bb9b1340b4c7b9d718 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Wed, 8 Jan 2020 09:39:48 +0100 Subject: [PATCH 100/336] repaint causes crash on linux --- sandboxes/opencsg/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sandboxes/opencsg/main.cpp b/sandboxes/opencsg/main.cpp index 3922706e74..82efb8ada5 100644 --- a/sandboxes/opencsg/main.cpp +++ b/sandboxes/opencsg/main.cpp @@ -107,12 +107,12 @@ public: const wxSize ClientSize = GetClientSize(); m_display->set_screen_size(ClientSize.x, ClientSize.y); - m_display->repaint(); }); Bind(wxEVT_SIZE, [this](wxSizeEvent &) { const wxSize ClientSize = GetClientSize(); m_display->set_screen_size(ClientSize.x, ClientSize.y); + m_display->repaint(); }); } From f874b618817f0a9e965e8f2f3919643984462658 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Wed, 8 Jan 2020 10:10:24 +0100 Subject: [PATCH 101/336] Transform the position AND the normals of drainhole points --- src/libslic3r/SLAPrint.cpp | 31 +++++++++++++++---------------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/src/libslic3r/SLAPrint.cpp b/src/libslic3r/SLAPrint.cpp index 897963f199..1e00e6edb1 100644 --- a/src/libslic3r/SLAPrint.cpp +++ b/src/libslic3r/SLAPrint.cpp @@ -1165,30 +1165,29 @@ const TriangleMesh &SLAPrintObject::transformed_mesh() const { return m_transformed_rmesh.get(); } -template::value_type> -std::vector transform_pts(It from, It to, Trafo &&tr) -{ - auto ret = reserve_vector(to - from); - for(auto it = from; it != to; ++it) { - V v = *it; - v.pos = tr * it->pos; - ret.emplace_back(std::move(v)); - } - return ret; -} - sla::SupportPoints SLAPrintObject::transformed_support_points() const { assert(m_model_object != nullptr); - auto& spts = m_model_object->sla_support_points; - return transform_pts(spts.begin(), spts.end(), trafo().cast()); + auto spts = m_model_object->sla_support_points; + auto tr = trafo().cast(); + for (sla::SupportPoint& suppt : spts) { + suppt.pos = tr * suppt.pos; + } + + return spts; } sla::DrainHoles SLAPrintObject::transformed_drainhole_points() const { assert(m_model_object != nullptr); - auto& spts = m_model_object->sla_drain_holes; - return transform_pts(spts.begin(), spts.end(), trafo().cast()); + auto pts = m_model_object->sla_drain_holes; + auto tr = trafo().cast(); + for (sla::DrainHole &hl : pts) { + hl.pos = tr * hl.pos; + hl.normal = tr * hl.normal; + } + + return pts; } DynamicConfig SLAPrintStatistics::config() const From a3a99d7a076df8b2dad39c8e22e83b0e60f500e8 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Wed, 8 Jan 2020 10:49:54 +0100 Subject: [PATCH 102/336] Do not translate the normal of drainhole points. --- src/libslic3r/SLAPrint.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libslic3r/SLAPrint.cpp b/src/libslic3r/SLAPrint.cpp index 1e00e6edb1..4d34c09c7b 100644 --- a/src/libslic3r/SLAPrint.cpp +++ b/src/libslic3r/SLAPrint.cpp @@ -1184,7 +1184,7 @@ sla::DrainHoles SLAPrintObject::transformed_drainhole_points() const auto tr = trafo().cast(); for (sla::DrainHole &hl : pts) { hl.pos = tr * hl.pos; - hl.normal = tr * hl.normal; + hl.normal = tr * hl.normal - tr.translation(); } return pts; From bb62f36df3915f125c7460c6c12ab88a47efe798 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Wed, 8 Jan 2020 17:10:11 +0100 Subject: [PATCH 103/336] Add tests for EigenMesh3D raycaster with hole support. Tests fail! Supports are intersecting the object when holes are added. --- src/libslic3r/SLA/Hollowing.cpp | 37 +++ src/libslic3r/SLA/Hollowing.hpp | 7 + src/libslic3r/SLAPrintSteps.cpp | 37 --- tests/sla_print/CMakeLists.txt | 5 +- tests/sla_print/sla_print_tests.cpp | 364 +------------------------- tests/sla_print/sla_raycast_tests.cpp | 61 +++++ tests/sla_print/sla_test_utils.cpp | 297 +++++++++++++++++++++ tests/sla_print/sla_test_utils.hpp | 112 ++++++++ tests/test_utils.hpp | 21 ++ 9 files changed, 541 insertions(+), 400 deletions(-) create mode 100644 tests/sla_print/sla_raycast_tests.cpp create mode 100644 tests/sla_print/sla_test_utils.cpp create mode 100644 tests/sla_print/sla_test_utils.hpp create mode 100644 tests/test_utils.hpp diff --git a/src/libslic3r/SLA/Hollowing.cpp b/src/libslic3r/SLA/Hollowing.cpp index 2b35722478..8dc2d30929 100644 --- a/src/libslic3r/SLA/Hollowing.cpp +++ b/src/libslic3r/SLA/Hollowing.cpp @@ -6,6 +6,7 @@ #include #include #include +#include #include @@ -247,4 +248,40 @@ bool DrainHole::get_intersections(const Vec3f& s, const Vec3f& dir, return true; } +void cut_drainholes(std::vector & obj_slices, + const std::vector &slicegrid, + float closing_radius, + const sla::DrainHoles & holes, + std::function thr) +{ + TriangleMesh mesh; + for (const sla::DrainHole &holept : holes) { + auto r = double(holept.radius); + auto h = double(holept.height); + sla::Contour3D hole = sla::cylinder(r, h); + Eigen::Quaterniond q; + q.setFromTwoVectors(Vec3d{0., 0., 1.}, holept.normal.cast()); + for(auto& p : hole.points) p = q * p + holept.pos.cast(); + mesh.merge(sla::to_triangle_mesh(hole)); + } + + if (mesh.empty()) return; + + mesh.require_shared_vertices(); + + TriangleMeshSlicer slicer(&mesh); + + std::vector hole_slices; + slicer.slice(slicegrid, closing_radius, &hole_slices, thr); + + if (obj_slices.size() != hole_slices.size()) + BOOST_LOG_TRIVIAL(warning) + << "Sliced object and drain-holes layer count does not match!"; + + size_t until = std::min(obj_slices.size(), hole_slices.size()); + + for (size_t i = 0; i < until; ++i) + obj_slices[i] = diff_ex(obj_slices[i], hole_slices[i]); +} + }} // namespace Slic3r::sla diff --git a/src/libslic3r/SLA/Hollowing.hpp b/src/libslic3r/SLA/Hollowing.hpp index ba1eb2d622..b3375ed1ae 100644 --- a/src/libslic3r/SLA/Hollowing.hpp +++ b/src/libslic3r/SLA/Hollowing.hpp @@ -17,6 +17,7 @@ struct HollowingConfig double min_thickness = 2.; double quality = 0.5; double closing_distance = 0.5; + bool enabled = true; }; struct DrainHole @@ -57,6 +58,12 @@ std::unique_ptr generate_interior(const TriangleMesh &mesh, const HollowingConfig & = {}, const JobController &ctl = {}); +void cut_drainholes(std::vector & obj_slices, + const std::vector &slicegrid, + float closing_radius, + const sla::DrainHoles & holes, + std::function thr); + } } diff --git a/src/libslic3r/SLAPrintSteps.cpp b/src/libslic3r/SLAPrintSteps.cpp index e0c92a71c5..0ae0e66a44 100644 --- a/src/libslic3r/SLAPrintSteps.cpp +++ b/src/libslic3r/SLAPrintSteps.cpp @@ -79,7 +79,6 @@ SLAPrint::Steps::Steps(SLAPrint *print) void SLAPrint::Steps::hollow_model(SLAPrintObject &po) { - if (!po.m_config.hollowing_enable.getBool()) { BOOST_LOG_TRIVIAL(info) << "Skipping hollowing step!"; po.m_hollowing_data.reset(); @@ -102,42 +101,6 @@ void SLAPrint::Steps::hollow_model(SLAPrintObject &po) BOOST_LOG_TRIVIAL(warning) << "Hollowed interior is empty!"; } -static void cut_drainholes(std::vector & obj_slices, - const std::vector &slicegrid, - float closing_radius, - const sla::DrainHoles & holes, - std::function thr) -{ - TriangleMesh mesh; - for (const sla::DrainHole &holept : holes) { - auto r = double(holept.radius); - auto h = double(holept.height); - sla::Contour3D hole = sla::cylinder(r, h); - Eigen::Quaterniond q; - q.setFromTwoVectors(Vec3d{0., 0., 1.}, holept.normal.cast()); - for(auto& p : hole.points) p = q * p + holept.pos.cast(); - mesh.merge(sla::to_triangle_mesh(hole)); - } - - if (mesh.empty()) return; - - mesh.require_shared_vertices(); - - TriangleMeshSlicer slicer(&mesh); - - std::vector hole_slices; - slicer.slice(slicegrid, closing_radius, &hole_slices, thr); - - if (obj_slices.size() != hole_slices.size()) - BOOST_LOG_TRIVIAL(warning) - << "Sliced object and drain-holes layer count does not match!"; - - size_t until = std::min(obj_slices.size(), hole_slices.size()); - - for (size_t i = 0; i < until; ++i) - obj_slices[i] = diff_ex(obj_slices[i], hole_slices[i]); -} - // The slicing will be performed on an imaginary 1D grid which starts from // the bottom of the bounding box created around the supported model. So // the first layer which is usually thicker will be part of the supports diff --git a/tests/sla_print/CMakeLists.txt b/tests/sla_print/CMakeLists.txt index ecc68db0a4..9d47f3ae4d 100644 --- a/tests/sla_print/CMakeLists.txt +++ b/tests/sla_print/CMakeLists.txt @@ -1,5 +1,8 @@ get_filename_component(_TEST_NAME ${CMAKE_CURRENT_LIST_DIR} NAME) -add_executable(${_TEST_NAME}_tests ${_TEST_NAME}_tests_main.cpp sla_print_tests.cpp) +add_executable(${_TEST_NAME}_tests ${_TEST_NAME}_tests_main.cpp + sla_print_tests.cpp + sla_test_utils.hpp sla_test_utils.cpp + sla_raycast_tests.cpp) target_link_libraries(${_TEST_NAME}_tests test_common libslic3r) set_property(TARGET ${_TEST_NAME}_tests PROPERTY FOLDER "tests") diff --git a/tests/sla_print/sla_print_tests.cpp b/tests/sla_print/sla_print_tests.cpp index 1cc959c3a7..4fefeb6bbd 100644 --- a/tests/sla_print/sla_print_tests.cpp +++ b/tests/sla_print/sla_print_tests.cpp @@ -2,369 +2,9 @@ #include #include -#include +#include "sla_test_utils.hpp" -// Debug -#include - -#include "libslic3r/libslic3r.h" -#include "libslic3r/Format/OBJ.hpp" -#include "libslic3r/SLAPrint.hpp" -#include "libslic3r/TriangleMesh.hpp" -#include "libslic3r/SLA/Pad.hpp" -#include "libslic3r/SLA/SupportTreeBuilder.hpp" -#include "libslic3r/SLA/SupportTreeBuildsteps.hpp" -#include "libslic3r/SLA/SupportPointGenerator.hpp" -#include "libslic3r/SLA/Raster.hpp" -#include "libslic3r/SLA/ConcaveHull.hpp" -#include "libslic3r/MTUtils.hpp" - -#include "libslic3r/SVG.hpp" -#include "libslic3r/Format/OBJ.hpp" - -#if defined(WIN32) || defined(_WIN32) -#define PATH_SEPARATOR R"(\)" -#else -#define PATH_SEPARATOR R"(/)" -#endif - -namespace { -using namespace Slic3r; - -TriangleMesh load_model(const std::string &obj_filename) -{ - TriangleMesh mesh; - auto fpath = TEST_DATA_DIR PATH_SEPARATOR + obj_filename; - load_obj(fpath.c_str(), &mesh); - return mesh; -} - -enum e_validity { - ASSUME_NO_EMPTY = 1, - ASSUME_MANIFOLD = 2, - ASSUME_NO_REPAIR = 4 -}; - -void check_validity(const TriangleMesh &input_mesh, - int flags = ASSUME_NO_EMPTY | ASSUME_MANIFOLD | - ASSUME_NO_REPAIR) -{ - TriangleMesh mesh{input_mesh}; - - if (flags & ASSUME_NO_EMPTY) { - REQUIRE_FALSE(mesh.empty()); - } else if (mesh.empty()) - return; // If it can be empty and it is, there is nothing left to do. - - REQUIRE(stl_validate(&mesh.stl)); - - bool do_update_shared_vertices = false; - mesh.repair(do_update_shared_vertices); - - if (flags & ASSUME_NO_REPAIR) { - REQUIRE_FALSE(mesh.needed_repair()); - } - - if (flags & ASSUME_MANIFOLD) { - mesh.require_shared_vertices(); - if (!mesh.is_manifold()) mesh.WriteOBJFile("non_manifold.obj"); - REQUIRE(mesh.is_manifold()); - } -} - -struct PadByproducts -{ - ExPolygons model_contours; - ExPolygons support_contours; - TriangleMesh mesh; -}; - -void _test_concave_hull(const Polygons &hull, const ExPolygons &polys) -{ - REQUIRE(polys.size() >=hull.size()); - - double polys_area = 0; - for (const ExPolygon &p : polys) polys_area += p.area(); - - double cchull_area = 0; - for (const Slic3r::Polygon &p : hull) cchull_area += p.area(); - - REQUIRE(cchull_area >= Approx(polys_area)); - - size_t cchull_holes = 0; - for (const Slic3r::Polygon &p : hull) - cchull_holes += p.is_clockwise() ? 1 : 0; - - REQUIRE(cchull_holes == 0); - - Polygons intr = diff(to_polygons(polys), hull); - REQUIRE(intr.empty()); -} - -void test_concave_hull(const ExPolygons &polys) { - sla::PadConfig pcfg; - - Slic3r::sla::ConcaveHull cchull{polys, pcfg.max_merge_dist_mm, []{}}; - - _test_concave_hull(cchull.polygons(), polys); - - coord_t delta = scaled(pcfg.brim_size_mm + pcfg.wing_distance()); - ExPolygons wafflex = sla::offset_waffle_style_ex(cchull, delta); - Polygons waffl = sla::offset_waffle_style(cchull, delta); - - _test_concave_hull(to_polygons(wafflex), polys); - _test_concave_hull(waffl, polys); -} - -void test_pad(const std::string & obj_filename, - const sla::PadConfig &padcfg, - PadByproducts & out) -{ - REQUIRE(padcfg.validate().empty()); - - TriangleMesh mesh = load_model(obj_filename); - - REQUIRE_FALSE(mesh.empty()); - - // Create pad skeleton only from the model - Slic3r::sla::pad_blueprint(mesh, out.model_contours); - - test_concave_hull(out.model_contours); - - REQUIRE_FALSE(out.model_contours.empty()); - - // Create the pad geometry for the model contours only - Slic3r::sla::create_pad({}, out.model_contours, out.mesh, padcfg); - - check_validity(out.mesh); - - auto bb = out.mesh.bounding_box(); - REQUIRE(bb.max.z() - bb.min.z() == Approx(padcfg.full_height())); -} - -void test_pad(const std::string & obj_filename, - const sla::PadConfig &padcfg = {}) -{ - PadByproducts byproducts; - test_pad(obj_filename, padcfg, byproducts); -} - -struct SupportByproducts -{ - std::string obj_fname; - std::vector slicegrid; - std::vector model_slices; - sla::SupportTreeBuilder supporttree; - TriangleMesh input_mesh; -}; - -const constexpr float CLOSING_RADIUS = 0.005f; - -void check_support_tree_integrity(const sla::SupportTreeBuilder &stree, - const sla::SupportConfig &cfg) -{ - double gnd = stree.ground_level; - double H1 = cfg.max_solo_pillar_height_mm; - double H2 = cfg.max_dual_pillar_height_mm; - - for (const sla::Head &head : stree.heads()) { - REQUIRE((!head.is_valid() || head.pillar_id != sla::ID_UNSET || - head.bridge_id != sla::ID_UNSET)); - } - - for (const sla::Pillar &pillar : stree.pillars()) { - if (std::abs(pillar.endpoint().z() - gnd) < EPSILON) { - double h = pillar.height; - - if (h > H1) REQUIRE(pillar.links >= 1); - else if(h > H2) { REQUIRE(pillar.links >= 2); } - } - - REQUIRE(pillar.links <= cfg.pillar_cascade_neighbors); - REQUIRE(pillar.bridges <= cfg.max_bridges_on_pillar); - } - - double max_bridgelen = 0.; - auto chck_bridge = [&cfg](const sla::Bridge &bridge, double &max_brlen) { - Vec3d n = bridge.endp - bridge.startp; - double d = sla::distance(n); - max_brlen = std::max(d, max_brlen); - - double z = n.z(); - double polar = std::acos(z / d); - double slope = -polar + PI / 2.; - REQUIRE(std::abs(slope) >= cfg.bridge_slope - EPSILON); - }; - - for (auto &bridge : stree.bridges()) chck_bridge(bridge, max_bridgelen); - REQUIRE(max_bridgelen <= cfg.max_bridge_length_mm); - - max_bridgelen = 0; - for (auto &bridge : stree.crossbridges()) chck_bridge(bridge, max_bridgelen); - - double md = cfg.max_pillar_link_distance_mm / std::cos(-cfg.bridge_slope); - REQUIRE(max_bridgelen <= md); -} - -void test_supports(const std::string & obj_filename, - const sla::SupportConfig &supportcfg, - SupportByproducts & out) -{ - using namespace Slic3r; - TriangleMesh mesh = load_model(obj_filename); - - REQUIRE_FALSE(mesh.empty()); - - TriangleMeshSlicer slicer{&mesh}; - - auto bb = mesh.bounding_box(); - double zmin = bb.min.z(); - double zmax = bb.max.z(); - double gnd = zmin - supportcfg.object_elevation_mm; - auto layer_h = 0.05f; - - out.slicegrid = grid(float(gnd), float(zmax), layer_h); - slicer.slice(out.slicegrid , CLOSING_RADIUS, &out.model_slices, []{}); - - // Create the special index-triangle mesh with spatial indexing which - // is the input of the support point and support mesh generators - sla::EigenMesh3D emesh{mesh}; - - // Create the support point generator - sla::SupportPointGenerator::Config autogencfg; - autogencfg.head_diameter = float(2 * supportcfg.head_front_radius_mm); - sla::SupportPointGenerator point_gen{emesh, out.model_slices, - out.slicegrid, autogencfg, - [] {}, [](int) {}}; - - // Get the calculated support points. - std::vector support_points = point_gen.output(); - - int validityflags = ASSUME_NO_REPAIR; - - // If there is no elevation, support points shall be removed from the - // bottom of the object. - if (std::abs(supportcfg.object_elevation_mm) < EPSILON) { - sla::remove_bottom_points(support_points, zmin, - supportcfg.base_height_mm); - } else { - // Should be support points at least on the bottom of the model - REQUIRE_FALSE(support_points.empty()); - - // Also the support mesh should not be empty. - validityflags |= ASSUME_NO_EMPTY; - } - - // Generate the actual support tree - sla::SupportTreeBuilder treebuilder; - treebuilder.build(sla::SupportableMesh{emesh, support_points, supportcfg}); - - check_support_tree_integrity(treebuilder, supportcfg); - - const TriangleMesh &output_mesh = treebuilder.retrieve_mesh(); - - check_validity(output_mesh, validityflags); - - // Quick check if the dimensions and placement of supports are correct - auto obb = output_mesh.bounding_box(); - - double allowed_zmin = zmin - supportcfg.object_elevation_mm; - - if (std::abs(supportcfg.object_elevation_mm) < EPSILON) - allowed_zmin = zmin - 2 * supportcfg.head_back_radius_mm; - - REQUIRE(obb.min.z() >= allowed_zmin); - REQUIRE(obb.max.z() <= zmax); - - // Move out the support tree into the byproducts, we can examine it further - // in various tests. - out.obj_fname = std::move(obj_filename); - out.supporttree = std::move(treebuilder); - out.input_mesh = std::move(mesh); -} - -void test_supports(const std::string & obj_filename, - const sla::SupportConfig &supportcfg = {}) -{ - SupportByproducts byproducts; - test_supports(obj_filename, supportcfg, byproducts); -} - -void export_failed_case(const std::vector &support_slices, - const SupportByproducts &byproducts) -{ - for (size_t n = 0; n < support_slices.size(); ++n) { - const ExPolygons &sup_slice = support_slices[n]; - const ExPolygons &mod_slice = byproducts.model_slices[n]; - Polygons intersections = intersection(sup_slice, mod_slice); - - std::stringstream ss; - if (!intersections.empty()) { - ss << byproducts.obj_fname << std::setprecision(4) << n << ".svg"; - SVG svg(ss.str()); - svg.draw(sup_slice, "green"); - svg.draw(mod_slice, "blue"); - svg.draw(intersections, "red"); - svg.Close(); - } - } - - TriangleMesh m; - byproducts.supporttree.retrieve_full_mesh(m); - m.merge(byproducts.input_mesh); - m.repair(); - m.require_shared_vertices(); - m.WriteOBJFile(byproducts.obj_fname.c_str()); -} - -void test_support_model_collision( - const std::string & obj_filename, - const sla::SupportConfig &input_supportcfg = {}) -{ - SupportByproducts byproducts; - - sla::SupportConfig supportcfg = input_supportcfg; - - // Set head penetration to a small negative value which should ensure that - // the supports will not touch the model body. - supportcfg.head_penetration_mm = -0.15; - - // TODO: currently, the tailheads penetrating into the model body do not - // respect the penetration parameter properly. No issues were reported so - // far but we should definitely fix this. - supportcfg.ground_facing_only = true; - - test_supports(obj_filename, supportcfg, byproducts); - - // Slice the support mesh given the slice grid of the model. - std::vector support_slices = - byproducts.supporttree.slice(byproducts.slicegrid, CLOSING_RADIUS); - - // The slices originate from the same slice grid so the numbers must match - - bool support_mesh_is_empty = - byproducts.supporttree.retrieve_mesh(sla::MeshType::Pad).empty() && - byproducts.supporttree.retrieve_mesh(sla::MeshType::Support).empty(); - - if (support_mesh_is_empty) - REQUIRE(support_slices.empty()); - else - REQUIRE(support_slices.size() == byproducts.model_slices.size()); - - bool notouch = true; - for (size_t n = 0; notouch && n < support_slices.size(); ++n) { - const ExPolygons &sup_slice = support_slices[n]; - const ExPolygons &mod_slice = byproducts.model_slices[n]; - - Polygons intersections = intersection(sup_slice, mod_slice); - - notouch = notouch && intersections.empty(); - } - - if (!notouch) export_failed_case(support_slices, byproducts); - - REQUIRE(notouch); -} +namespace { const char *const BELOW_PAD_TEST_OBJECTS[] = { "20mm_cube.obj", diff --git a/tests/sla_print/sla_raycast_tests.cpp b/tests/sla_print/sla_raycast_tests.cpp new file mode 100644 index 0000000000..c50aa1f2f2 --- /dev/null +++ b/tests/sla_print/sla_raycast_tests.cpp @@ -0,0 +1,61 @@ +#include +#include + +#include +#include + +#include "sla_test_utils.hpp" + +using namespace Slic3r; + +// Create a simple scene with a 20mm cube and a big hole in the front wall +// with 5mm radius. Then shoot rays from interesting positions and see where +// they land. +TEST_CASE("Raycaster with loaded drillholes", "[sla_raycast]") +{ + // Load the cube and make it hollow. + TriangleMesh cube = load_model("20mm_cube.obj"); + sla::HollowingConfig hcfg; + std::unique_ptr cube_inside = sla::generate_interior(cube, hcfg); + REQUIRE(cube_inside); + + // Helper bb + auto boxbb = cube.bounding_box(); + + // Create the big 10mm long drainhole in the front wall. + Vec3f center = boxbb.center().cast(); + Vec3f p = {center.x(), 0., center.z()}; + Vec3f normal = {0.f, 1.f, 0.f}; + float radius = 5.f; + float hole_length = 10.; + sla::DrainHoles holes = { sla::DrainHole{p, normal, radius, hole_length} }; + + cube.merge(*cube_inside); + cube.require_shared_vertices(); + + sla::EigenMesh3D emesh{cube}; + emesh.load_holes(holes); + + Vec3d s = center.cast(); + SECTION("Fire from center, should hit the interior wall") { + auto hit = emesh.query_ray_hit(s, {0, 1., 0.}); + REQUIRE(hit.distance() == Approx(boxbb.size().x() / 2 - hcfg.min_thickness)); + } + + SECTION("Fire upward from hole center, hit distance equals the radius") { + s.y() = hcfg.min_thickness / 2; + auto hit = emesh.query_ray_hit(s, {0, 0., 1.}); + REQUIRE(hit.distance() == Approx(radius)); + } + + // Shouldn't this hit the inside wall through the hole? + SECTION("Fire from outside, hit the back side of the hole cylinder.") { + s.y() = -1.; + auto hit = emesh.query_ray_hit(s, {0, 1., 0.}); + REQUIRE(hit.distance() == Approx(hole_length + 1.f)); + } + + SECTION("Check for support tree correctness") { + test_support_model_collision("20mm_cube.obj", {}, hcfg, holes); + } +} diff --git a/tests/sla_print/sla_test_utils.cpp b/tests/sla_print/sla_test_utils.cpp new file mode 100644 index 0000000000..3da28a50e6 --- /dev/null +++ b/tests/sla_print/sla_test_utils.cpp @@ -0,0 +1,297 @@ +#include "sla_test_utils.hpp" + +void test_support_model_collision(const std::string &obj_filename, + const sla::SupportConfig &input_supportcfg, + const sla::HollowingConfig &hollowingcfg, + const sla::DrainHoles &drainholes) +{ + SupportByproducts byproducts; + + sla::SupportConfig supportcfg = input_supportcfg; + + // Set head penetration to a small negative value which should ensure that + // the supports will not touch the model body. + supportcfg.head_penetration_mm = -0.15; + + // TODO: currently, the tailheads penetrating into the model body do not + // respect the penetration parameter properly. No issues were reported so + // far but we should definitely fix this. + supportcfg.ground_facing_only = true; + + test_supports(obj_filename, supportcfg, hollowingcfg, drainholes, byproducts); + + // Slice the support mesh given the slice grid of the model. + std::vector support_slices = + byproducts.supporttree.slice(byproducts.slicegrid, CLOSING_RADIUS); + + // The slices originate from the same slice grid so the numbers must match + + bool support_mesh_is_empty = + byproducts.supporttree.retrieve_mesh(sla::MeshType::Pad).empty() && + byproducts.supporttree.retrieve_mesh(sla::MeshType::Support).empty(); + + if (support_mesh_is_empty) + REQUIRE(support_slices.empty()); + else + REQUIRE(support_slices.size() == byproducts.model_slices.size()); + + bool notouch = true; + for (size_t n = 0; notouch && n < support_slices.size(); ++n) { + const ExPolygons &sup_slice = support_slices[n]; + const ExPolygons &mod_slice = byproducts.model_slices[n]; + + Polygons intersections = intersection(sup_slice, mod_slice); + + notouch = notouch && intersections.empty(); + } + + /*if (!notouch) */export_failed_case(support_slices, byproducts); + + REQUIRE(notouch); +} + +void export_failed_case(const std::vector &support_slices, const SupportByproducts &byproducts) +{ + for (size_t n = 0; n < support_slices.size(); ++n) { + const ExPolygons &sup_slice = support_slices[n]; + const ExPolygons &mod_slice = byproducts.model_slices[n]; + Polygons intersections = intersection(sup_slice, mod_slice); + + std::stringstream ss; + if (!intersections.empty()) { + ss << byproducts.obj_fname << std::setprecision(4) << n << ".svg"; + SVG svg(ss.str()); + svg.draw(sup_slice, "green"); + svg.draw(mod_slice, "blue"); + svg.draw(intersections, "red"); + svg.Close(); + } + } + + TriangleMesh m; + byproducts.supporttree.retrieve_full_mesh(m); + m.merge(byproducts.input_mesh); + m.repair(); + m.require_shared_vertices(); + m.WriteOBJFile(byproducts.obj_fname.c_str()); +} + +void test_supports(const std::string &obj_filename, + const sla::SupportConfig &supportcfg, + const sla::HollowingConfig &hollowingcfg, + const sla::DrainHoles &drainholes, + SupportByproducts &out) +{ + using namespace Slic3r; + TriangleMesh mesh = load_model(obj_filename); + + REQUIRE_FALSE(mesh.empty()); + + if (hollowingcfg.enabled) { + auto inside = sla::generate_interior(mesh, hollowingcfg); + REQUIRE(inside); + mesh.merge(*inside); + mesh.require_shared_vertices(); + } + + TriangleMeshSlicer slicer{&mesh}; + + auto bb = mesh.bounding_box(); + double zmin = bb.min.z(); + double zmax = bb.max.z(); + double gnd = zmin - supportcfg.object_elevation_mm; + auto layer_h = 0.05f; + + out.slicegrid = grid(float(gnd), float(zmax), layer_h); + slicer.slice(out.slicegrid , CLOSING_RADIUS, &out.model_slices, []{}); + sla::cut_drainholes(out.model_slices, out.slicegrid, CLOSING_RADIUS, drainholes, []{}); + + // Create the special index-triangle mesh with spatial indexing which + // is the input of the support point and support mesh generators + sla::EigenMesh3D emesh{mesh}; + if (hollowingcfg.enabled) + emesh.load_holes(drainholes); + + // Create the support point generator + sla::SupportPointGenerator::Config autogencfg; + autogencfg.head_diameter = float(2 * supportcfg.head_front_radius_mm); + sla::SupportPointGenerator point_gen{emesh, out.model_slices, out.slicegrid, + autogencfg, [] {}, [](int) {}}; + + // Get the calculated support points. + std::vector support_points = point_gen.output(); + + int validityflags = ASSUME_NO_REPAIR; + + // If there is no elevation, support points shall be removed from the + // bottom of the object. + if (std::abs(supportcfg.object_elevation_mm) < EPSILON) { + sla::remove_bottom_points(support_points, zmin, + supportcfg.base_height_mm); + } else { + // Should be support points at least on the bottom of the model + REQUIRE_FALSE(support_points.empty()); + + // Also the support mesh should not be empty. + validityflags |= ASSUME_NO_EMPTY; + } + + // Generate the actual support tree + sla::SupportTreeBuilder treebuilder; + treebuilder.build(sla::SupportableMesh{emesh, support_points, supportcfg}); + + check_support_tree_integrity(treebuilder, supportcfg); + + const TriangleMesh &output_mesh = treebuilder.retrieve_mesh(); + + check_validity(output_mesh, validityflags); + + // Quick check if the dimensions and placement of supports are correct + auto obb = output_mesh.bounding_box(); + + double allowed_zmin = zmin - supportcfg.object_elevation_mm; + + if (std::abs(supportcfg.object_elevation_mm) < EPSILON) + allowed_zmin = zmin - 2 * supportcfg.head_back_radius_mm; + + REQUIRE(obb.min.z() >= allowed_zmin); + REQUIRE(obb.max.z() <= zmax); + + // Move out the support tree into the byproducts, we can examine it further + // in various tests. + out.obj_fname = std::move(obj_filename); + out.supporttree = std::move(treebuilder); + out.input_mesh = std::move(mesh); +} + +void check_support_tree_integrity(const sla::SupportTreeBuilder &stree, + const sla::SupportConfig &cfg) +{ + double gnd = stree.ground_level; + double H1 = cfg.max_solo_pillar_height_mm; + double H2 = cfg.max_dual_pillar_height_mm; + + for (const sla::Head &head : stree.heads()) { + REQUIRE((!head.is_valid() || head.pillar_id != sla::ID_UNSET || + head.bridge_id != sla::ID_UNSET)); + } + + for (const sla::Pillar &pillar : stree.pillars()) { + if (std::abs(pillar.endpoint().z() - gnd) < EPSILON) { + double h = pillar.height; + + if (h > H1) REQUIRE(pillar.links >= 1); + else if(h > H2) { REQUIRE(pillar.links >= 2); } + } + + REQUIRE(pillar.links <= cfg.pillar_cascade_neighbors); + REQUIRE(pillar.bridges <= cfg.max_bridges_on_pillar); + } + + double max_bridgelen = 0.; + auto chck_bridge = [&cfg](const sla::Bridge &bridge, double &max_brlen) { + Vec3d n = bridge.endp - bridge.startp; + double d = sla::distance(n); + max_brlen = std::max(d, max_brlen); + + double z = n.z(); + double polar = std::acos(z / d); + double slope = -polar + PI / 2.; + REQUIRE(std::abs(slope) >= cfg.bridge_slope - EPSILON); + }; + + for (auto &bridge : stree.bridges()) chck_bridge(bridge, max_bridgelen); + REQUIRE(max_bridgelen <= cfg.max_bridge_length_mm); + + max_bridgelen = 0; + for (auto &bridge : stree.crossbridges()) chck_bridge(bridge, max_bridgelen); + + double md = cfg.max_pillar_link_distance_mm / std::cos(-cfg.bridge_slope); + REQUIRE(max_bridgelen <= md); +} + +void test_pad(const std::string &obj_filename, const sla::PadConfig &padcfg, PadByproducts &out) +{ + REQUIRE(padcfg.validate().empty()); + + TriangleMesh mesh = load_model(obj_filename); + + REQUIRE_FALSE(mesh.empty()); + + // Create pad skeleton only from the model + Slic3r::sla::pad_blueprint(mesh, out.model_contours); + + test_concave_hull(out.model_contours); + + REQUIRE_FALSE(out.model_contours.empty()); + + // Create the pad geometry for the model contours only + Slic3r::sla::create_pad({}, out.model_contours, out.mesh, padcfg); + + check_validity(out.mesh); + + auto bb = out.mesh.bounding_box(); + REQUIRE(bb.max.z() - bb.min.z() == Approx(padcfg.full_height())); +} + +static void _test_concave_hull(const Polygons &hull, const ExPolygons &polys) +{ + REQUIRE(polys.size() >=hull.size()); + + double polys_area = 0; + for (const ExPolygon &p : polys) polys_area += p.area(); + + double cchull_area = 0; + for (const Slic3r::Polygon &p : hull) cchull_area += p.area(); + + REQUIRE(cchull_area >= Approx(polys_area)); + + size_t cchull_holes = 0; + for (const Slic3r::Polygon &p : hull) + cchull_holes += p.is_clockwise() ? 1 : 0; + + REQUIRE(cchull_holes == 0); + + Polygons intr = diff(to_polygons(polys), hull); + REQUIRE(intr.empty()); +} + +void test_concave_hull(const ExPolygons &polys) { + sla::PadConfig pcfg; + + Slic3r::sla::ConcaveHull cchull{polys, pcfg.max_merge_dist_mm, []{}}; + + _test_concave_hull(cchull.polygons(), polys); + + coord_t delta = scaled(pcfg.brim_size_mm + pcfg.wing_distance()); + ExPolygons wafflex = sla::offset_waffle_style_ex(cchull, delta); + Polygons waffl = sla::offset_waffle_style(cchull, delta); + + _test_concave_hull(to_polygons(wafflex), polys); + _test_concave_hull(waffl, polys); +} + +void check_validity(const TriangleMesh &input_mesh, int flags) +{ + TriangleMesh mesh{input_mesh}; + + if (flags & ASSUME_NO_EMPTY) { + REQUIRE_FALSE(mesh.empty()); + } else if (mesh.empty()) + return; // If it can be empty and it is, there is nothing left to do. + + REQUIRE(stl_validate(&mesh.stl)); + + bool do_update_shared_vertices = false; + mesh.repair(do_update_shared_vertices); + + if (flags & ASSUME_NO_REPAIR) { + REQUIRE_FALSE(mesh.needed_repair()); + } + + if (flags & ASSUME_MANIFOLD) { + mesh.require_shared_vertices(); + if (!mesh.is_manifold()) mesh.WriteOBJFile("non_manifold.obj"); + REQUIRE(mesh.is_manifold()); + } +} diff --git a/tests/sla_print/sla_test_utils.hpp b/tests/sla_print/sla_test_utils.hpp new file mode 100644 index 0000000000..dcb4934ef6 --- /dev/null +++ b/tests/sla_print/sla_test_utils.hpp @@ -0,0 +1,112 @@ +#ifndef SLA_TEST_UTILS_HPP +#define SLA_TEST_UTILS_HPP + +#include +#include + +// Debug +#include + +#include "libslic3r/libslic3r.h" +#include "libslic3r/Format/OBJ.hpp" +#include "libslic3r/SLAPrint.hpp" +#include "libslic3r/TriangleMesh.hpp" +#include "libslic3r/SLA/Pad.hpp" +#include "libslic3r/SLA/SupportTreeBuilder.hpp" +#include "libslic3r/SLA/SupportTreeBuildsteps.hpp" +#include "libslic3r/SLA/SupportPointGenerator.hpp" +#include "libslic3r/SLA/Raster.hpp" +#include "libslic3r/SLA/ConcaveHull.hpp" +#include "libslic3r/MTUtils.hpp" + +#include "libslic3r/SVG.hpp" +#include "libslic3r/Format/OBJ.hpp" + +using namespace Slic3r; + +enum e_validity { + ASSUME_NO_EMPTY = 1, + ASSUME_MANIFOLD = 2, + ASSUME_NO_REPAIR = 4 +}; + +void check_validity(const TriangleMesh &input_mesh, + int flags = ASSUME_NO_EMPTY | ASSUME_MANIFOLD | + ASSUME_NO_REPAIR); + +struct PadByproducts +{ + ExPolygons model_contours; + ExPolygons support_contours; + TriangleMesh mesh; +}; + +void test_concave_hull(const ExPolygons &polys); + +void test_pad(const std::string & obj_filename, + const sla::PadConfig &padcfg, + PadByproducts & out); + +inline void test_pad(const std::string & obj_filename, + const sla::PadConfig &padcfg = {}) +{ + PadByproducts byproducts; + test_pad(obj_filename, padcfg, byproducts); +} + +struct SupportByproducts +{ + std::string obj_fname; + std::vector slicegrid; + std::vector model_slices; + sla::SupportTreeBuilder supporttree; + TriangleMesh input_mesh; +}; + +const constexpr float CLOSING_RADIUS = 0.005f; + +void check_support_tree_integrity(const sla::SupportTreeBuilder &stree, + const sla::SupportConfig &cfg); + +void test_supports(const std::string &obj_filename, + const sla::SupportConfig &supportcfg, + const sla::HollowingConfig &hollowingcfg, + const sla::DrainHoles &drainholes, + SupportByproducts &out); + +inline void test_supports(const std::string &obj_filename, + const sla::SupportConfig &supportcfg, + SupportByproducts &out) +{ + sla::HollowingConfig hcfg; + hcfg.enabled = false; + test_supports(obj_filename, supportcfg, hcfg, {}, out); +} + +inline void test_supports(const std::string &obj_filename, + const sla::SupportConfig &supportcfg = {}) +{ + SupportByproducts byproducts; + test_supports(obj_filename, supportcfg, byproducts); +} + +void export_failed_case(const std::vector &support_slices, + const SupportByproducts &byproducts); + + +void test_support_model_collision( + const std::string &obj_filename, + const sla::SupportConfig &input_supportcfg, + const sla::HollowingConfig &hollowingcfg, + const sla::DrainHoles &drainholes); + +inline void test_support_model_collision( + const std::string &obj_filename, + const sla::SupportConfig &input_supportcfg = {}) +{ + sla::HollowingConfig hcfg; + hcfg.enabled = false; + test_support_model_collision(obj_filename, input_supportcfg, hcfg, {}); +} + +#endif // SLA_TEST_UTILS_HPP diff --git a/tests/test_utils.hpp b/tests/test_utils.hpp new file mode 100644 index 0000000000..b129cc79f1 --- /dev/null +++ b/tests/test_utils.hpp @@ -0,0 +1,21 @@ +#ifndef SLIC3R_TEST_UTILS +#define SLIC3R_TEST_UTILS + +#include +#include + +#if defined(WIN32) || defined(_WIN32) +#define PATH_SEPARATOR R"(\)" +#else +#define PATH_SEPARATOR R"(/)" +#endif + +inline Slic3r::TriangleMesh load_model(const std::string &obj_filename) +{ + Slic3r::TriangleMesh mesh; + auto fpath = TEST_DATA_DIR PATH_SEPARATOR + obj_filename; + Slic3r::load_obj(fpath.c_str(), &mesh); + return mesh; +} + +#endif // SLIC3R_TEST_UTILS From 578fcbc37c116950cfb9a1d412fe761e1973f371 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Wed, 8 Jan 2020 17:12:06 +0100 Subject: [PATCH 104/336] Performance improvements in raycaster --- src/libslic3r/SLA/Common.cpp | 19 +++++++++++-------- src/libslic3r/SLA/EigenMesh3D.hpp | 2 +- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/src/libslic3r/SLA/Common.cpp b/src/libslic3r/SLA/Common.cpp index 3710bf3bed..a0fc2f3bb6 100644 --- a/src/libslic3r/SLA/Common.cpp +++ b/src/libslic3r/SLA/Common.cpp @@ -333,20 +333,23 @@ EigenMesh3D::hit_result EigenMesh3D::filter_hits( bool entry; }; std::vector hole_isects; + hole_isects.reserve(m_holes.size()); + + auto sf = s.cast(); + auto dirf = dir.cast(); // Collect hits on all holes, preserve information about entry/exit for (const sla::DrainHole& hole : m_holes) { std::array, 2> isects; - if (hole.get_intersections(s.cast(), - dir.cast(), isects)) { - hole_isects.emplace_back(isects[0].first, isects[0].second, true); - hole_isects.emplace_back(isects[1].first, isects[1].second, false); + if (hole.get_intersections(sf, dirf, isects)) { + if (isects[0].first > 0.f) hole_isects.emplace_back(isects[0].first, isects[0].second, true); + if (isects[1].first > 0.f) hole_isects.emplace_back(isects[1].first, isects[1].second, false); } } - // Remove hole hits behind the source - for (int i=0; i Date: Tue, 7 Jan 2020 14:52:04 +0100 Subject: [PATCH 105/336] Switched order of hollowing and support points gizmos --- src/slic3r/GUI/Gizmos/GLGizmosManager.cpp | 15 ++++++++------- src/slic3r/GUI/Gizmos/GLGizmosManager.hpp | 3 ++- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp b/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp index 2501a9633b..8300d74794 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp @@ -85,13 +85,14 @@ bool GLGizmosManager::init() m_common_gizmos_data.reset(new CommonGizmosData()); + // Order of gizmos in the vector must match order in EType! m_gizmos.emplace_back(new GLGizmoMove3D(m_parent, "move.svg", 0)); m_gizmos.emplace_back(new GLGizmoScale3D(m_parent, "scale.svg", 1)); m_gizmos.emplace_back(new GLGizmoRotate3D(m_parent, "rotate.svg", 2)); m_gizmos.emplace_back(new GLGizmoFlatten(m_parent, "place.svg", 3)); m_gizmos.emplace_back(new GLGizmoCut(m_parent, "cut.svg", 4)); - m_gizmos.emplace_back(new GLGizmoSlaSupports(m_parent, "sla_supports.svg", 5, m_common_gizmos_data.get())); - m_gizmos.emplace_back(new GLGizmoHollow(m_parent, "hollow.svg", 6, m_common_gizmos_data.get())); + m_gizmos.emplace_back(new GLGizmoHollow(m_parent, "hollow.svg", 5, m_common_gizmos_data.get())); + m_gizmos.emplace_back(new GLGizmoSlaSupports(m_parent, "sla_supports.svg", 6, m_common_gizmos_data.get())); for (auto& gizmo : m_gizmos) { if (! gizmo->init()) { @@ -524,10 +525,10 @@ bool GLGizmosManager::on_mouse(wxMouseEvent& evt) case Scale: { // Apply new temporary scale factors - TransformationType transformation_type(TransformationType::Local_Absolute_Joint); - if (evt.AltDown()) - transformation_type.set_independent(); - selection.scale(get_scale(), transformation_type); + TransformationType transformation_type(TransformationType::Local_Absolute_Joint); + if (evt.AltDown()) + transformation_type.set_independent(); + selection.scale(get_scale(), transformation_type); if (evt.ControlDown()) selection.translate(get_scale_offset(), true); wxGetApp().obj_manipul()->set_dirty(); @@ -706,7 +707,7 @@ bool GLGizmosManager::on_char(wxKeyEvent& evt) { if ((m_current == SlaSupports) && gizmo_event(SLAGizmoEventType::ManualEditing)) processed = true; - + break; } case 'F': diff --git a/src/slic3r/GUI/Gizmos/GLGizmosManager.hpp b/src/slic3r/GUI/Gizmos/GLGizmosManager.hpp index bab084cd24..2110e7b69b 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmosManager.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmosManager.hpp @@ -54,13 +54,14 @@ public: enum EType : unsigned char { + // Order must match index in m_gizmos! Move, Scale, Rotate, Flatten, Cut, - SlaSupports, Hollow, + SlaSupports, Undefined }; From e159344ce50d5d59f8e594b3cd489873f0be7e59 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Thu, 9 Jan 2020 11:22:24 +0100 Subject: [PATCH 106/336] further fixes for X window crashes. --- sandboxes/opencsg/main.cpp | 39 +++++++++++++++----------------------- 1 file changed, 15 insertions(+), 24 deletions(-) diff --git a/sandboxes/opencsg/main.cpp b/sandboxes/opencsg/main.cpp index 82efb8ada5..ab379c196e 100644 --- a/sandboxes/opencsg/main.cpp +++ b/sandboxes/opencsg/main.cpp @@ -91,30 +91,7 @@ class Canvas: public wxGLCanvas public: template - Canvas(Args &&...args): wxGLCanvas(std::forward(args)...) - { - Bind(wxEVT_PAINT, [this](wxPaintEvent &) { - // This is required even though dc is not used otherwise. - wxPaintDC dc(this); - - // Set the OpenGL viewport according to the client size of this - // canvas. This is done here rather than in a wxSizeEvent handler - // because our OpenGL rendering context (and thus viewport - // setting) is used with multiple canvases: If we updated the - // viewport in the wxSizeEvent handler, changing the size of one - // canvas causes a viewport setting that is wrong when next - // another canvas is repainted. - const wxSize ClientSize = GetClientSize(); - - m_display->set_screen_size(ClientSize.x, ClientSize.y); - }); - - Bind(wxEVT_SIZE, [this](wxSizeEvent &) { - const wxSize ClientSize = GetClientSize(); - m_display->set_screen_size(ClientSize.x, ClientSize.y); - m_display->repaint(); - }); - } + Canvas(Args &&...args): wxGLCanvas(std::forward(args)...) {} shptr get_display() const { return m_display; } @@ -466,6 +443,20 @@ void MyFrame::activate_canvas_display() m_canvas->get_display()->set_active(ClientSize.x, ClientSize.y); enable_multisampling(m_ms_toggle->GetValue()); + m_canvas->Bind(wxEVT_PAINT, [this](wxPaintEvent &) { + // This is required even though dc is not used otherwise. + wxPaintDC dc(this); + const wxSize csize = GetClientSize(); + m_canvas->get_display()->set_screen_size(csize.x, csize.y); + m_canvas->get_display()->repaint(); + }); + + m_canvas->Bind(wxEVT_SIZE, [this](wxSizeEvent &) { + const wxSize csize = GetClientSize(); + m_canvas->get_display()->set_screen_size(csize.x, csize.y); + m_canvas->get_display()->repaint(); + }); + // Do the repaint continuously m_canvas->Bind(wxEVT_IDLE, [this](wxIdleEvent &evt) { m_canvas->get_display()->repaint(); From e9d340c87f846d1095b181bb55f740b163d5f1d2 Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Thu, 9 Jan 2020 10:03:33 +0100 Subject: [PATCH 107/336] Fixed transformations of the hollowed GLVolume --- src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp | 7 +++---- src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp | 3 +++ 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp index 44894a0fb7..048392b450 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp @@ -123,6 +123,9 @@ void GLGizmoHollow::on_render() const GLint print_box_worldmatrix_id = (current_program_id > 0) ? ::glGetUniformLocation(current_program_id, "print_box.volume_world_matrix") : -1; glcheck(); m_c->m_volume_with_cavity->set_render_color(); + const Geometry::Transformation& volume_trafo = m_c->m_model_object->volumes.front()->get_transformation(); + m_c->m_volume_with_cavity->set_volume_transformation(volume_trafo); + m_c->m_volume_with_cavity->set_instance_transformation(m_c->m_model_object->instances[size_t(m_c->m_active_instance)]->get_transformation()); m_c->m_volume_with_cavity->render(color_id, print_box_detection_id, print_box_worldmatrix_id); m_parent.get_shader().stop_using(); } @@ -629,13 +632,9 @@ void GLGizmoHollow::update_hollowed_mesh(std::unique_ptr &&mesh) } // create a new GLVolume that only has the cavity inside - Geometry::Transformation volume_trafo = m_c->m_model_object->volumes.front()->get_transformation(); - volume_trafo.set_offset(volume_trafo.get_offset()); m_c->m_volume_with_cavity.reset(new GLVolume(GLVolume::MODEL_COLOR[2])); m_c->m_volume_with_cavity->indexed_vertex_array.load_mesh(*m_c->m_cavity_mesh.get()); m_c->m_volume_with_cavity->finalize_geometry(true); - m_c->m_volume_with_cavity->set_volume_transformation(volume_trafo); - m_c->m_volume_with_cavity->set_instance_transformation(m_c->m_model_object->instances[size_t(m_c->m_active_instance)]->get_transformation()); m_c->m_volume_with_cavity->force_transparent = false; // Reset raycaster so it works with the new mesh: diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp index cb9dc27539..2dc41edcac 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp @@ -133,6 +133,9 @@ void GLGizmoSlaSupports::on_render() const GLint print_box_worldmatrix_id = (current_program_id > 0) ? ::glGetUniformLocation(current_program_id, "print_box.volume_world_matrix") : -1; glcheck(); m_c->m_volume_with_cavity->set_render_color(); + const Geometry::Transformation& volume_trafo = m_c->m_model_object->volumes.front()->get_transformation(); + m_c->m_volume_with_cavity->set_volume_transformation(volume_trafo); + m_c->m_volume_with_cavity->set_instance_transformation(m_c->m_model_object->instances[size_t(m_c->m_active_instance)]->get_transformation()); m_c->m_volume_with_cavity->render(color_id, print_box_detection_id, print_box_worldmatrix_id); m_parent.get_shader().stop_using(); } From f22961edaed244337f463fefad1634a0883c727f Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Thu, 9 Jan 2020 14:06:39 +0100 Subject: [PATCH 108/336] Fixed a raycaster problem with handling duplicate hits from igl The duplicate hits confused winding number calculations in the raycaster, which in turn returned incorrect hit. --- src/libslic3r/SLA/Common.cpp | 14 +++++++++----- tests/sla_print/sla_raycast_tests.cpp | 3 +-- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/libslic3r/SLA/Common.cpp b/src/libslic3r/SLA/Common.cpp index a0fc2f3bb6..3d31c55226 100644 --- a/src/libslic3r/SLA/Common.cpp +++ b/src/libslic3r/SLA/Common.cpp @@ -297,7 +297,14 @@ EigenMesh3D::query_ray_hits(const Vec3d &s, const Vec3d &dir) const // The sort is necessary, the hits are not always sorted. std::sort(hits.begin(), hits.end(), [](const igl::Hit& a, const igl::Hit& b) { return a.t < b.t; }); - + + // Remove duplicates. They sometimes appear, for example when the ray is cast + // along an axis of a cube due to floating-point approximations in igl (?) + hits.erase(std::unique(hits.begin(), hits.end(), + [](const igl::Hit& a, const igl::Hit& b) + { return a.t == b.t; }), + hits.end()); + // Convert the igl::Hit into hit_result outs.reserve(hits.size()); for (const igl::Hit& hit : hits) { @@ -342,14 +349,11 @@ EigenMesh3D::hit_result EigenMesh3D::filter_hits( for (const sla::DrainHole& hole : m_holes) { std::array, 2> isects; if (hole.get_intersections(sf, dirf, isects)) { + // Ignore hole hits behind the source if (isects[0].first > 0.f) hole_isects.emplace_back(isects[0].first, isects[0].second, true); if (isects[1].first > 0.f) hole_isects.emplace_back(isects[1].first, isects[1].second, false); } } -// // Remove hole hits behind the source -// for (int i=0; i Date: Thu, 9 Jan 2020 16:57:11 +0100 Subject: [PATCH 109/336] more raycaster tests, without repeating the hollowing every time --- tests/sla_print/sla_raycast_tests.cpp | 40 +++++++++++++++------------ 1 file changed, 22 insertions(+), 18 deletions(-) diff --git a/tests/sla_print/sla_raycast_tests.cpp b/tests/sla_print/sla_raycast_tests.cpp index c60f4c8ee0..4a994f2a93 100644 --- a/tests/sla_print/sla_raycast_tests.cpp +++ b/tests/sla_print/sla_raycast_tests.cpp @@ -37,24 +37,28 @@ TEST_CASE("Raycaster with loaded drillholes", "[sla_raycast]") emesh.load_holes(holes); Vec3d s = center.cast(); - SECTION("Fire from center, should hit the interior wall") { - auto hit = emesh.query_ray_hit(s, {0, 1., 0.}); - REQUIRE(hit.distance() == Approx(boxbb.size().x() / 2 - hcfg.min_thickness)); - } + // Fire from center, should hit the interior wall + auto hit = emesh.query_ray_hit(s, {0, 1., 0.}); + REQUIRE(hit.distance() == Approx(boxbb.size().x() / 2 - hcfg.min_thickness)); - SECTION("Fire upward from hole center, hit distance equals the radius") { - s.y() = hcfg.min_thickness / 2; - auto hit = emesh.query_ray_hit(s, {0, 0., 1.}); - REQUIRE(hit.distance() == Approx(radius)); - } + // Fire upward from hole center, hit distance equals the radius (hits the + // side of the hole cut. + s.y() = hcfg.min_thickness / 2; + hit = emesh.query_ray_hit(s, {0, 0., 1.}); + REQUIRE(hit.distance() == Approx(radius)); + + // Fire from outside, hit the back side of the cube interior + s.y() = -1.; + hit = emesh.query_ray_hit(s, {0, 1., 0.}); + REQUIRE(hit.distance() == Approx(boxbb.max.y() - hcfg.min_thickness - s.y())); - SECTION("Fire from outside, hit the back side of the hole cylinder.") { - s.y() = -1.; - auto hit = emesh.query_ray_hit(s, {0, 1., 0.}); - REQUIRE(hit.distance() == Approx(boxbb.size().y() - hcfg.min_thickness + 1.)); - } - - SECTION("Check for support tree correctness") { - test_support_model_collision("20mm_cube.obj", {}, hcfg, holes); - } + // Fire downwards from above the hole cylinder. Has to go through the cyl. + // as it was not there. + s = center.cast(); + s.z() = boxbb.max.z() - hcfg.min_thickness - 1.; + hit = emesh.query_ray_hit(s, {0, 0., -1.}); + REQUIRE(hit.distance() == Approx(s.z() - boxbb.min.z() - hcfg.min_thickness)); + + // Check for support tree correctness + test_support_model_collision("20mm_cube.obj", {}, hcfg, holes); } From d0d73e610979ec6774f38f9d7d2576e91ccf96bf Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Tue, 14 Jan 2020 10:33:10 +0100 Subject: [PATCH 110/336] Hollowing config values contain min/max values, these are respected when setting through the gizmo Rendering and hole transformation fixes (still WIP, though) --- src/libslic3r/PrintConfig.cpp | 4 +- src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp | 91 +++++++++++----- src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp | 20 +--- src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp | 106 ++++++++++--------- 4 files changed, 128 insertions(+), 93 deletions(-) diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index 89d256a90a..00c33dcfba 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -2887,8 +2887,9 @@ void PrintConfigDef::init_sla_params() def->tooltip = L("Minimum wall thickness of a hollowed model."); def->sidetext = L("mm"); def->min = 1; + def->max = 10; def->mode = comSimple; - def->set_default_value(new ConfigOptionFloat(4)); + def->set_default_value(new ConfigOptionFloat(3.)); def = this->add("hollowing_quality", coFloat); def->label = L("Hollowing accuracy"); @@ -2904,6 +2905,7 @@ void PrintConfigDef::init_sla_params() def->category = L("Hollowing"); def->tooltip = L(""); def->min = 0; + def->max = 10; def->mode = comExpert; def->set_default_value(new ConfigOptionFloat(2.0)); } diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp index 048392b450..efb1101995 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp @@ -443,7 +443,13 @@ bool GLGizmoHollow::gizmo_event(SLAGizmoEventType action, const Vec2d& mouse_pos std::pair pos_and_normal; if (unproject_on_mesh(mouse_position, pos_and_normal)) { // we got an intersection Plater::TakeSnapshot snapshot(wxGetApp().plater(), _(L("Add drainage hole"))); - m_c->m_model_object->sla_drain_holes.emplace_back(pos_and_normal.first + HoleStickOutLength * pos_and_normal.second, + + Vec3d scaling = m_c->m_model_object->instances[m_c->m_active_instance]->get_scaling_factor(); + Vec3f normal_transformed(pos_and_normal.second(0)/scaling(0), + pos_and_normal.second(1)/scaling(1), + pos_and_normal.second(2)/scaling(2)); + + m_c->m_model_object->sla_drain_holes.emplace_back(pos_and_normal.first + HoleStickOutLength * pos_and_normal.second/* normal_transformed.normalized()*/, -pos_and_normal.second, m_new_hole_radius, m_new_hole_height+HoleStickOutLength); m_selected.push_back(false); assert(m_selected.size() == m_c->m_model_object->sla_drain_holes.size()); @@ -580,10 +586,10 @@ std::pair GLGizmoHollow::get_hollowi { // FIXME this function is probably obsolete, caller could // get the data from model config himself - std::vector opts = get_config_options({"hollowing_min_thickness", "hollowing_quality", "hollowing_closing_distance"}); - double offset = static_cast(opts[0])->value; - double quality = static_cast(opts[1])->value; - double closing_d = static_cast(opts[2])->value; + auto opts = get_config_options({"hollowing_min_thickness", "hollowing_quality", "hollowing_closing_distance"}); + double offset = static_cast(opts[0].first)->value; + double quality = static_cast(opts[1].first)->value; + double closing_d = static_cast(opts[2].first)->value; return std::make_pair(m_c->m_mesh, sla::HollowingConfig{offset, quality, closing_d}); } @@ -611,16 +617,19 @@ void GLGizmoHollow::update_hollowed_mesh(std::unique_ptr &&mesh) if (! m_c->m_model_object->sla_drain_holes.empty()) { TriangleMesh holes_mesh; for (const sla::DrainHole& hole : m_c->m_model_object->sla_drain_holes) { - TriangleMesh hole_mesh = make_cylinder(hole.radius, hole.height, 2*M_PI/8); + TriangleMesh hole_mesh = make_cylinder(hole.radius, hole.height, 2*M_PI/32); + + Vec3d scaling = m_c->m_model_object->instances[m_c->m_active_instance]->get_scaling_factor(); + Vec3d normal_transformed = Vec3d(hole.normal(0)/scaling(0), hole.normal(1)/scaling(1), hole.normal(2)/scaling(2)); + normal_transformed.normalize(); // Rotate the cylinder appropriately - Eigen::Quaternionf q; - Transform3f m = Transform3f::Identity(); - m.matrix().block(0, 0, 3, 3) = q.setFromTwoVectors(Vec3f::UnitZ(), hole.normal).toRotationMatrix(); - hole_mesh.transform(m.cast()); + Eigen::Quaterniond q; + Transform3d m = Transform3d::Identity(); + m.matrix().block(0, 0, 3, 3) = q.setFromTwoVectors(Vec3d::UnitZ(), normal_transformed).toRotationMatrix(); + hole_mesh.transform(m); // If the instance is scaled, undo the scaling of the hole - Vec3d scaling = m_c->m_model_object->instances[m_c->m_active_instance]->get_scaling_factor(); hole_mesh.scale(Vec3d(1/scaling(0), 1/scaling(1), 1/scaling(2))); // Translate the hole into position and merge with the others @@ -647,9 +656,9 @@ void GLGizmoHollow::update_hollowed_mesh(std::unique_ptr &&mesh) } } -std::vector GLGizmoHollow::get_config_options(const std::vector& keys) const +std::vector> GLGizmoHollow::get_config_options(const std::vector& keys) const { - std::vector out; + std::vector> out; if (!m_c->m_model_object) return out; @@ -660,14 +669,14 @@ std::vector GLGizmoHollow::get_config_options(const std::ve for (const std::string& key : keys) { if (object_cfg.has(key)) - out.push_back(object_cfg.option(key)); + out.emplace_back(object_cfg.option(key), &object_cfg.def()->options.at(key)); // at() needed for const map else if (print_cfg.has(key)) - out.push_back(print_cfg.option(key)); + out.emplace_back(print_cfg.option(key), &print_cfg.def()->options.at(key)); else { // we must get it from defaults if (default_cfg == nullptr) default_cfg.reset(DynamicPrintConfig::new_from_defaults_keys(keys)); - out.push_back(default_cfg->option(key)); + out.emplace_back(default_cfg->option(key), &default_cfg->def()->options.at(key)); } } @@ -714,8 +723,8 @@ RENDER_AGAIN: window_width = std::max(std::max(window_width, /*buttons_width_approx*/0.f), 0.f); { - std::vector opts = get_config_options({"hollowing_enable"}); - m_enable_hollowing = static_cast(opts[0])->value; + auto opts = get_config_options({"hollowing_enable"}); + m_enable_hollowing = static_cast(opts[0].first)->value; if (m_imgui->checkbox(m_desc["enable"], m_enable_hollowing)) { m_c->m_model_object->config.opt("hollowing_enable", true)->value = m_enable_hollowing; wxGetApp().obj_list()->update_and_show_object_settings_item(); @@ -727,29 +736,57 @@ RENDER_AGAIN: if (m_imgui->button(m_desc["preview"])) hollow_mesh(); - std::vector opts = get_config_options({"hollowing_min_thickness", "hollowing_quality", "hollowing_closing_distance"}); - float offset = static_cast(opts[0])->value; - float quality = static_cast(opts[1])->value; - float closing_d = static_cast(opts[2])->value; + std::vector opts_keys = {"hollowing_min_thickness", "hollowing_quality", "hollowing_closing_distance"}; + auto opts = get_config_options(opts_keys); + auto* offset_cfg = static_cast(opts[0].first); + float offset = offset_cfg->value; + double offset_min = opts[0].second->min; + double offset_max = opts[0].second->max; + + auto* quality_cfg = static_cast(opts[1].first); + float quality = quality_cfg->value; + double quality_min = opts[1].second->min; + double quality_max = opts[1].second->max; + + auto* closing_d_cfg = static_cast(opts[2].first); + float closing_d = closing_d_cfg->value; + double closing_d_min = opts[2].second->min; + double closing_d_max = opts[2].second->max; + m_imgui->text(m_desc.at("offset")); ImGui::SameLine(settings_sliders_left); ImGui::PushItemWidth(window_width - settings_sliders_left); - ImGui::SliderFloat(" ", &offset, 0.f, 5.f, "%.1f"); + ImGui::SliderFloat(" ", &offset, offset_min, offset_max, "%.1f"); + if (ImGui::IsItemHovered()) { + ImGui::BeginTooltip(); + ImGui::TextUnformatted(_(opts[0].second->tooltip).ToUTF8()); + ImGui::EndTooltip(); + } bool slider_clicked = ImGui::IsItemClicked(); // someone clicked the slider bool slider_edited = ImGui::IsItemEdited(); // someone is dragging the slider bool slider_released = ImGui::IsItemDeactivatedAfterEdit(); // someone has just released the slider m_imgui->text(m_desc.at("quality")); ImGui::SameLine(settings_sliders_left); - ImGui::SliderFloat(" ", &quality, 0.f, 1.f, "%.1f"); + ImGui::SliderFloat(" ", &quality, quality_min, quality_max, "%.1f"); + if (ImGui::IsItemHovered()) { + ImGui::BeginTooltip(); + ImGui::TextUnformatted(_(opts[1].second->tooltip).ToUTF8()); + ImGui::EndTooltip(); + } slider_clicked |= ImGui::IsItemClicked(); slider_edited |= ImGui::IsItemEdited(); slider_released |= ImGui::IsItemDeactivatedAfterEdit(); m_imgui->text(m_desc.at("closing_distance")); ImGui::SameLine(settings_sliders_left); - ImGui::SliderFloat(" ", &closing_d, 0.f, 10.f, "%.1f"); + ImGui::SliderFloat(" ", &closing_d, closing_d_min, closing_d_max, "%.1f"); + if (ImGui::IsItemHovered()) { + ImGui::BeginTooltip(); + ImGui::TextUnformatted(_(opts[2].second->tooltip).ToUTF8()); + ImGui::EndTooltip(); + } slider_clicked |= ImGui::IsItemClicked(); slider_edited |= ImGui::IsItemEdited(); slider_released |= ImGui::IsItemDeactivatedAfterEdit(); @@ -955,8 +992,8 @@ void GLGizmoHollow::on_set_state() m_parent.toggle_model_objects_visibility(true, m_c->m_model_object, m_c->m_active_instance); // Set default head diameter from config. - const DynamicPrintConfig& cfg = wxGetApp().preset_bundle->sla_prints.get_edited_preset().config; - m_new_hole_radius = static_cast(cfg.option("support_head_front_diameter"))->value; + //const DynamicPrintConfig& cfg = wxGetApp().preset_bundle->sla_prints.get_edited_preset().config; + //m_new_hole_radius = static_cast(cfg.option("support_head_front_diameter"))->value; } if (m_state == Off && m_old_state != Off) { // the gizmo was just turned Off //Plater::TakeSnapshot snapshot(wxGetApp().plater(), _(L("SLA gizmo turned off"))); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp index bea3960973..ba2935a561 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp @@ -21,10 +21,6 @@ enum class SLAGizmoEventType : unsigned char; class GLGizmoHollow : public GLGizmoBase { private: - //ModelObject* m_model_object = nullptr; - //ObjectID m_model_object_id = 0; - //int m_active_instance = -1; - //float m_active_instance_bb_radius; // to cache the bb mutable double m_z_shift = 0.; bool unproject_on_mesh(const Vec2d& mouse_pos, std::pair& pos_and_normal); @@ -32,13 +28,6 @@ private: GLUquadricObj* m_quadric; - //std::unique_ptr m_mesh_raycaster; - //std::unique_ptr m_cavity_mesh; - //std::unique_ptr m_volume_with_cavity; - //const TriangleMesh* m_mesh; - //mutable int m_old_timestamp = -1; - //mutable int m_print_object_idx = -1; - //mutable int m_print_objects_count = -1; public: GLGizmoHollow(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id, CommonGizmosData* cd); @@ -69,7 +58,7 @@ private: bool unsaved_changes() const; bool m_show_supports = true; - float m_new_hole_radius; // Size of a new hole. + float m_new_hole_radius = 4.f; // Size of a new hole. float m_new_hole_height = 5.f; mutable std::vector m_selected; // which holes are currently selected @@ -77,7 +66,7 @@ private: // Stashes to keep data for undo redo. Is taken after the editing // is done, the data are updated continuously. - float m_offset_stash = 2.0f; + float m_offset_stash = 3.0f; float m_quality_stash = 0.5f; float m_closing_d_stash = 2.f; Vec3f m_hole_before_drag = Vec3f::Zero(); @@ -100,10 +89,7 @@ private: bool m_selection_empty = true; EState m_old_state = Off; // to be able to see that the gizmo has just been closed (see on_set_state) - //mutable std::unique_ptr m_object_clipper; - //mutable std::unique_ptr m_supports_clipper; - - std::vector get_config_options(const std::vector& keys) const; + std::vector> get_config_options(const std::vector& keys) const; bool is_mesh_point_clipped(const Vec3d& point) const; // Methods that do the model_object and editing cache synchronization, diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp index 2dc41edcac..4e00b0f77f 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp @@ -68,19 +68,31 @@ void GLGizmoSlaSupports::set_sla_support_data(ModelObject* model_object, const S return; } - if (m_c->m_model_object != model_object || m_c->m_model_object_id != model_object->id()) { + bool something_changed = false; + + if (m_c->m_model_object != model_object + || m_c->m_model_object_id != model_object->id() + || m_c->m_active_instance != selection.get_instance_idx()) { m_c->m_model_object = model_object; m_c->m_print_object_idx = -1; + m_c->m_active_instance = selection.get_instance_idx(); + something_changed = true; } - m_c->m_active_instance = selection.get_instance_idx(); - if (model_object && selection.is_from_single_instance()) { // Cache the bb - it's needed for dealing with the clipping plane quite often // It could be done inside update_mesh but one has to account for scaling of the instance. - //FIXME calling ModelObject::instance_bounding_box() is expensive! - m_c->m_active_instance_bb_radius = m_c->m_model_object->instance_bounding_box(m_c->m_active_instance).radius(); + if (something_changed) { + m_c->m_active_instance_bb_radius = m_c->m_model_object->instance_bounding_box(m_c->m_active_instance).radius(); + if (m_state == On) { + m_parent.toggle_model_objects_visibility(false); + m_parent.toggle_model_objects_visibility(! m_c->m_cavity_mesh, m_c->m_model_object, m_c->m_active_instance); + m_parent.toggle_sla_auxiliaries_visibility(bool(m_c->m_cavity_mesh), m_c->m_model_object, m_c->m_active_instance); + } + else + m_parent.toggle_model_objects_visibility(true, nullptr, -1); + } if (is_mesh_update_necessary()) { update_mesh(); @@ -90,14 +102,6 @@ void GLGizmoSlaSupports::set_sla_support_data(ModelObject* model_object, const S // If we triggered autogeneration before, check backend and fetch results if they are there if (m_c->m_model_object->sla_points_status == sla::PointsStatus::Generating) get_data_from_backend(); - - if (m_state == On) { - m_parent.toggle_model_objects_visibility(false); - m_parent.toggle_model_objects_visibility(! m_c->m_cavity_mesh, m_c->m_model_object, m_c->m_active_instance); - m_parent.toggle_sla_auxiliaries_visibility(bool(m_c->m_cavity_mesh), m_c->m_model_object, m_c->m_active_instance); - } - else - m_parent.toggle_model_objects_visibility(true, nullptr, -1); } } @@ -350,41 +354,42 @@ void GLGizmoSlaSupports::render_points(const Selection& selection, bool picking) } // Now render the drain holes: -// render_color[0] = 0.7f; -// render_color[1] = 0.7f; -// render_color[2] = 0.7f; -// render_color[3] = 0.7f; -// glsafe(::glColor4fv(render_color)); -// for (const sla::DrainHole& drain_hole : m_c->m_model_object->sla_drain_holes) { -// // Inverse matrix of the instance scaling is applied so that the mark does not scale with the object. -// glsafe(::glPushMatrix()); -// glsafe(::glTranslatef(drain_hole.pos(0), drain_hole.pos(1), drain_hole.pos(2))); -// glsafe(::glMultMatrixd(instance_scaling_matrix_inverse.data())); + if (! m_c->m_cavity_mesh) { + render_color[0] = 0.7f; + render_color[1] = 0.7f; + render_color[2] = 0.7f; + render_color[3] = 0.7f; + glsafe(::glColor4fv(render_color)); + for (const sla::DrainHole& drain_hole : m_c->m_model_object->sla_drain_holes) { + // Inverse matrix of the instance scaling is applied so that the mark does not scale with the object. + glsafe(::glPushMatrix()); + glsafe(::glTranslatef(drain_hole.pos(0), drain_hole.pos(1), drain_hole.pos(2))); + glsafe(::glMultMatrixd(instance_scaling_matrix_inverse.data())); -// if (vol->is_left_handed()) -// glFrontFace(GL_CW); + if (vol->is_left_handed()) + glFrontFace(GL_CW); -// // Matrices set, we can render the point mark now. + // Matrices set, we can render the point mark now. -// Eigen::Quaterniond q; -// q.setFromTwoVectors(Vec3d{0., 0., 1.}, instance_scaling_matrix_inverse * (-drain_hole.normal).cast()); -// Eigen::AngleAxisd aa(q); -// glsafe(::glRotated(aa.angle() * (180. / M_PI), aa.axis()(0), aa.axis()(1), aa.axis()(2))); -// glsafe(::glPushMatrix()); -// glsafe(::glTranslated(0., 0., -drain_hole.height)); -// ::gluCylinder(m_quadric, drain_hole.radius, drain_hole.radius, drain_hole.height, 24, 1); -// glsafe(::glTranslated(0., 0., drain_hole.height)); -// ::gluDisk(m_quadric, 0.0, drain_hole.radius, 24, 1); -// glsafe(::glTranslated(0., 0., -drain_hole.height)); -// glsafe(::glRotatef(180.f, 1.f, 0.f, 0.f)); -// ::gluDisk(m_quadric, 0.0, drain_hole.radius, 24, 1); -// glsafe(::glPopMatrix()); + Eigen::Quaterniond q; + q.setFromTwoVectors(Vec3d{0., 0., 1.}, instance_scaling_matrix_inverse * (-drain_hole.normal).cast()); + Eigen::AngleAxisd aa(q); + glsafe(::glRotated(aa.angle() * (180. / M_PI), aa.axis()(0), aa.axis()(1), aa.axis()(2))); + glsafe(::glPushMatrix()); + glsafe(::glTranslated(0., 0., -drain_hole.height)); + ::gluCylinder(m_quadric, drain_hole.radius, drain_hole.radius, drain_hole.height, 24, 1); + glsafe(::glTranslated(0., 0., drain_hole.height)); + ::gluDisk(m_quadric, 0.0, drain_hole.radius, 24, 1); + glsafe(::glTranslated(0., 0., -drain_hole.height)); + glsafe(::glRotatef(180.f, 1.f, 0.f, 0.f)); + ::gluDisk(m_quadric, 0.0, drain_hole.radius, 24, 1); + glsafe(::glPopMatrix()); -// if (vol->is_left_handed()) -// glFrontFace(GL_CCW); -// glsafe(::glPopMatrix()); - -// } + if (vol->is_left_handed()) + glFrontFace(GL_CCW); + glsafe(::glPopMatrix()); + } + } if (!picking) glsafe(::glDisable(GL_LIGHTING)); @@ -454,10 +459,15 @@ bool GLGizmoSlaSupports::unproject_on_mesh(const Vec2d& mouse_pos, std::pairm_mesh_raycaster->unproject_on_mesh(mouse_pos, trafo.get_matrix(), camera, hit, normal, m_clipping_plane.get())) { // Check whether the hit is in a hole bool in_hole = false; - for (const sla::DrainHole& hole : m_c->m_model_object->sla_drain_holes) { - if (hole.is_inside(hit)) { - in_hole = true; - break; + // In case the hollowed and drilled mesh is available, we can allow + // placing points in holes, because they should never end up + // on surface that's been drilled away. + if (! m_c->m_cavity_mesh) { + for (const sla::DrainHole& hole : m_c->m_model_object->sla_drain_holes) { + if (hole.is_inside(hit)) { + in_hole = true; + break; + } } } if (! in_hole) { From 45220e26c0783652abbc27fc93c7ef97f873301b Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Fri, 10 Jan 2020 11:31:30 +0100 Subject: [PATCH 111/336] Fix zero elevation support maneuvers and comment to clarify the alg. --- src/libslic3r/SLA/SupportTreeBuildsteps.cpp | 63 ++++++++++----------- src/libslic3r/SLA/SupportTreeBuildsteps.hpp | 18 ++++++ 2 files changed, 49 insertions(+), 32 deletions(-) diff --git a/src/libslic3r/SLA/SupportTreeBuildsteps.cpp b/src/libslic3r/SLA/SupportTreeBuildsteps.cpp index 68afb73919..b2570570dc 100644 --- a/src/libslic3r/SLA/SupportTreeBuildsteps.cpp +++ b/src/libslic3r/SLA/SupportTreeBuildsteps.cpp @@ -561,8 +561,8 @@ void SupportTreeBuildsteps::create_ground_pillar(const Vec3d &jp, long head_id) { // People were killed for this number (seriously) - static const double SQR2 = std::sqrt(2.0); static const Vec3d DOWN = {0.0, 0.0, -1.0}; + const double SLOPE = 1. / std::cos(m_cfg.bridge_slope); double gndlvl = m_builder.ground_level; Vec3d endp = {jp(X), jp(Y), gndlvl}; @@ -573,38 +573,47 @@ void SupportTreeBuildsteps::create_ground_pillar(const Vec3d &jp, bool can_add_base = true; bool normal_mode = true; + // If in zero elevation mode and the pillar is too close to the model body, + // the support pillar can not be placed in the gap between the model and + // the pad, and the pillar bases must not touch the model body either. + // To solve this, a corrector bridge is inserted between the starting point + // (jp) and the new pillar. if (m_cfg.object_elevation_mm < EPSILON && (dist = std::sqrt(m_mesh.squared_distance(endp))) < min_dist) { // Get the distance from the mesh. This can be later optimized // to get the distance in 2D plane because we are dealing with // the ground level only. - - normal_mode = false; - double mind = min_dist - dist; - double azimuth = std::atan2(sourcedir(Y), sourcedir(X)); - double sinpolar = std::sin(PI - m_cfg.bridge_slope); - double cospolar = std::cos(PI - m_cfg.bridge_slope); - double cosazm = std::cos(azimuth); - double sinazm = std::sin(azimuth); - - auto dir = Vec3d(cosazm * sinpolar, sinazm * sinpolar, cospolar) - .normalized(); + + normal_mode = false; + + // The min distance needed to move away from the model in XY plane. + double mind = min_dist - dist; + + // get a suitable direction for the corrector bridge. It is the + // original sourcedir's azimuth but the polar angle is saturated to the + // configured bridge slope. + auto [polar, azimuth] = dir_to_spheric(sourcedir); + polar = PI - m_cfg.bridge_slope; + auto dir = spheric_to_dir(polar, azimuth).normalized(); using namespace libnest2d::opt; StopCriteria scr; scr.stop_score = min_dist; SubplexOptimizer solver(scr); + // Search for a distance along the corrector bridge to move the endpoint + // sufficiently away form the model body. The first few optimization + // cycles should succeed here. auto result = solver.optimize_max( [this, dir, jp, gndlvl](double mv) { - Vec3d endpt = jp + SQR2 * mv * dir; + Vec3d endpt = jp + mv * dir; endpt(Z) = gndlvl; return std::sqrt(m_mesh.squared_distance(endpt)); }, - initvals(mind), bound(0.0, 2 * min_dist)); + initvals(SLOPE * mind), bound(0.0, 2 * SLOPE * min_dist)); - mind = std::get<0>(result.optimum); - endp = jp + SQR2 * mind * dir; + mind = std::get<0>(result.optimum); + endp = jp + SLOPE * mind * dir; Vec3d pgnd = {endp(X), endp(Y), gndlvl}; can_add_base = result.score > min_dist; @@ -623,7 +632,7 @@ void SupportTreeBuildsteps::create_ground_pillar(const Vec3d &jp, else { // If the new endpoint is below ground, do not make a pillar if (endp(Z) < gndlvl) - endp = endp - SQR2 * (gndlvl - endp(Z)) * dir; // back off + endp = endp - SLOPE * (gndlvl - endp(Z)) * dir; // back off else { auto hit = bridge_mesh_intersect(endp, DOWN, radius); @@ -708,10 +717,7 @@ void SupportTreeBuildsteps::filter() // (Quaternion::FromTwoVectors) and apply the rotation to the // arrow head. - double z = n(2); - double r = 1.0; // for normalized vector - double polar = std::acos(z / r); - double azimuth = std::atan2(n(1), n(0)); + auto [polar, azimuth] = dir_to_spheric(n); // skip if the tilt is not sane if(polar >= PI - m_cfg.normal_cutoff_angle) { @@ -729,9 +735,7 @@ void SupportTreeBuildsteps::filter() double pin_r = double(m_support_pts[fidx].head_front_radius); // Reassemble the now corrected normal - auto nn = Vec3d(std::cos(azimuth) * std::sin(polar), - std::sin(azimuth) * std::sin(polar), - std::cos(polar)).normalized(); + auto nn = spheric_to_dir(polar, azimuth).normalized(); // check available distance EigenMesh3D::hit_result t @@ -757,9 +761,7 @@ void SupportTreeBuildsteps::filter() auto oresult = solver.optimize_max( [this, pin_r, w, hp](double plr, double azm) { - auto dir = Vec3d(std::cos(azm) * std::sin(plr), - std::sin(azm) * std::sin(plr), - std::cos(plr)).normalized(); + auto dir = spheric_to_dir(plr, azm).normalized(); double score = pinhead_mesh_intersect( hp, dir, pin_r, m_cfg.head_back_radius_mm, w); @@ -767,17 +769,14 @@ void SupportTreeBuildsteps::filter() return score; }, initvals(polar, azimuth), // start with what we have - bound(3 * PI / 4, - PI), // Must not exceed the tilt limit + bound(3 * PI / 4, PI), // Must not exceed the tilt limit bound(-PI, PI) // azimuth can be a full search ); if(oresult.score > w) { polar = std::get<0>(oresult.optimum); azimuth = std::get<1>(oresult.optimum); - nn = Vec3d(std::cos(azimuth) * std::sin(polar), - std::sin(azimuth) * std::sin(polar), - std::cos(polar)).normalized(); + nn = spheric_to_dir(polar, azimuth).normalized(); t = EigenMesh3D::hit_result(oresult.score); } } diff --git a/src/libslic3r/SLA/SupportTreeBuildsteps.hpp b/src/libslic3r/SLA/SupportTreeBuildsteps.hpp index 3998f5a350..24e0116bda 100644 --- a/src/libslic3r/SLA/SupportTreeBuildsteps.hpp +++ b/src/libslic3r/SLA/SupportTreeBuildsteps.hpp @@ -20,6 +20,21 @@ inline Vec2d to_vec2(const Vec3d& v3) { return {v3(X), v3(Y)}; } +inline std::pair dir_to_spheric(const Vec3d &n, double norm = 1.) +{ + double z = n.z(); + double r = norm; + double polar = std::acos(z / r); + double azimuth = std::atan2(n(1), n(0)); + return {polar, azimuth}; +} + +inline Vec3d spheric_to_dir(double polar, double azimuth) +{ + return {std::cos(azimuth) * std::sin(polar), + std::sin(azimuth) * std::sin(polar), std::cos(polar)}; +} + // This function returns the position of the centroid in the input 'clust' // vector of point indices. template @@ -228,6 +243,9 @@ class SupportTreeBuildsteps { // This is a proxy function for pillar creation which will mind the gap // between the pad and the model bottom in zero elevation mode. + // jp is the starting junction point which needs to be routed down. + // sourcedir is the allowed direction of an optional bridge between the + // jp junction and the final pillar. void create_ground_pillar(const Vec3d &jp, const Vec3d &sourcedir, double radius, From 90fbbf401f9f7bac8df2c03a2075997b1ce46b3f Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Tue, 14 Jan 2020 10:32:30 +0100 Subject: [PATCH 112/336] Refactor model facing support generation. Fix for touching junction when adding aux pillars. Fix issue with overly long support bridges. --- src/libslic3r/SLA/SupportTreeBuildsteps.cpp | 325 +++++++++----------- src/libslic3r/SLA/SupportTreeBuildsteps.hpp | 32 +- 2 files changed, 164 insertions(+), 193 deletions(-) diff --git a/src/libslic3r/SLA/SupportTreeBuildsteps.cpp b/src/libslic3r/SLA/SupportTreeBuildsteps.cpp index b2570570dc..45fef58cd0 100644 --- a/src/libslic3r/SLA/SupportTreeBuildsteps.cpp +++ b/src/libslic3r/SLA/SupportTreeBuildsteps.cpp @@ -7,6 +7,14 @@ namespace Slic3r { namespace sla { +static const Vec3d DOWN = {0.0, 0.0, -1.0}; + +using libnest2d::opt::initvals; +using libnest2d::opt::bound; +using libnest2d::opt::StopCriteria; +using libnest2d::opt::GeneticOptimizer; +using libnest2d::opt::SubplexOptimizer; + SupportTreeBuildsteps::SupportTreeBuildsteps(SupportTreeBuilder & builder, const SupportableMesh &sm) : m_cfg(sm.cfg) @@ -560,8 +568,6 @@ void SupportTreeBuildsteps::create_ground_pillar(const Vec3d &jp, double radius, long head_id) { - // People were killed for this number (seriously) - static const Vec3d DOWN = {0.0, 0.0, -1.0}; const double SLOPE = 1. / std::cos(m_cfg.bridge_slope); double gndlvl = m_builder.ground_level; @@ -587,7 +593,8 @@ void SupportTreeBuildsteps::create_ground_pillar(const Vec3d &jp, normal_mode = false; // The min distance needed to move away from the model in XY plane. - double mind = min_dist - dist; + double current_d = min_dist - dist; + double current_bride_d = SLOPE * current_d; // get a suitable direction for the corrector bridge. It is the // original sourcedir's azimuth but the polar angle is saturated to the @@ -596,7 +603,6 @@ void SupportTreeBuildsteps::create_ground_pillar(const Vec3d &jp, polar = PI - m_cfg.bridge_slope; auto dir = spheric_to_dir(polar, azimuth).normalized(); - using namespace libnest2d::opt; StopCriteria scr; scr.stop_score = min_dist; SubplexOptimizer solver(scr); @@ -610,10 +616,10 @@ void SupportTreeBuildsteps::create_ground_pillar(const Vec3d &jp, endpt(Z) = gndlvl; return std::sqrt(m_mesh.squared_distance(endpt)); }, - initvals(SLOPE * mind), bound(0.0, 2 * SLOPE * min_dist)); + initvals(current_bride_d), + bound(0.0, m_cfg.max_bridge_length_mm - current_bride_d)); - mind = std::get<0>(result.optimum); - endp = jp + SLOPE * mind * dir; + endp = jp + std::get<0>(result.optimum) * dir; Vec3d pgnd = {endp(X), endp(Y), gndlvl}; can_add_base = result.score > min_dist; @@ -694,11 +700,6 @@ void SupportTreeBuildsteps::filter() // not be enough space for the pinhead. Filtering is applied for // these reasons. - using libnest2d::opt::bound; - using libnest2d::opt::initvals; - using libnest2d::opt::GeneticOptimizer; - using libnest2d::opt::StopCriteria; - ccr::SpinningMutex mutex; auto addfn = [&mutex](PtIndices &container, unsigned val) { std::lock_guard lk(mutex); @@ -836,16 +837,17 @@ void SupportTreeBuildsteps::classify() m_thr(); auto& head = m_builder.head(i); - Vec3d n(0, 0, -1); double r = head.r_back_mm; Vec3d headjp = head.junction_point(); // collision check - auto hit = bridge_mesh_intersect(headjp, n, r); + auto hit = bridge_mesh_intersect(headjp, DOWN, r); if(std::isinf(hit.distance())) ground_head_indices.emplace_back(i); else if(m_cfg.ground_facing_only) head.invalidate(); - else m_iheads_onmodel.emplace_back(std::make_pair(i, hit)); + else m_iheads_onmodel.emplace_back(i); + + m_head_to_ground_scans[i] = hit; } // We want to search for clusters of points that are far enough @@ -892,13 +894,14 @@ void SupportTreeBuildsteps::routing_to_ground() // get the current cluster centroid auto & thr = m_thr; const auto &points = m_points; - long lcid = cluster_centroid( + + long lcid = cluster_centroid( cl, [&points](size_t idx) { return points.row(long(idx)); }, [thr](const Vec3d &p1, const Vec3d &p2) { thr(); return distance(Vec2d(p1(X), p1(Y)), Vec2d(p2(X), p2(Y))); }); - + assert(lcid >= 0); unsigned hid = cl[size_t(lcid)]; // Head ID @@ -943,192 +946,138 @@ void SupportTreeBuildsteps::routing_to_ground() } } +bool SupportTreeBuildsteps::connect_to_ground(Head &head, const Vec3d &dir) +{ + auto hjp = head.junction_point(); + double r = head.r_back_mm; + double t = bridge_mesh_intersect(hjp, dir, head.r_back_mm); + double d = 0, tdown = 0; + t = std::min(t, m_cfg.max_bridge_length_mm); + + while (d < t && !std::isinf(tdown = bridge_mesh_intersect(hjp + d * dir, DOWN, r))) + d += r; + + if(!std::isinf(tdown)) return false; + + Vec3d endp = hjp + d * dir; + m_builder.add_bridge(head.id, endp); + m_builder.add_junction(endp, head.r_back_mm); + + this->create_ground_pillar(endp, dir, head.r_back_mm); + + return true; +} + +bool SupportTreeBuildsteps::connect_to_ground(Head &head) +{ + if (connect_to_ground(head, head.dir)) return true; + + // Optimize bridge direction: + // Straight path failed so we will try to search for a suitable + // direction out of the cavity. + auto [polar, azimuth] = dir_to_spheric(head.dir); + + StopCriteria stc; + stc.max_iterations = m_cfg.optimizer_max_iterations; + stc.relative_score_difference = m_cfg.optimizer_rel_score_diff; + stc.stop_score = 1e6; + GeneticOptimizer solver(stc); + solver.seed(0); // we want deterministic behavior + + double r_back = head.r_back_mm; + Vec3d hjp = head.junction_point(); + auto oresult = solver.optimize_max( + [this, hjp, r_back](double plr, double azm) { + Vec3d n = spheric_to_dir(plr, azm).normalized(); + return bridge_mesh_intersect(hjp, n, r_back); + }, + initvals(polar, azimuth), // let's start with what we have + bound(3*PI/4, PI), // Must not exceed the slope limit + bound(-PI, PI) // azimuth can be a full range search + ); + + Vec3d bridgedir = spheric_to_dir(oresult.optimum).normalized(); + return connect_to_ground(head, bridgedir); +} + +bool SupportTreeBuildsteps::connect_to_model_body(Head &head) +{ + if (head.id <= ID_UNSET) return false; + + auto it = m_head_to_ground_scans.find(unsigned(head.id)); + if (it == m_head_to_ground_scans.end()) return false; + + auto &hit = it->second; + Vec3d hjp = head.junction_point(); + double zangle = std::asin(hit.direction()(Z)); + zangle = std::max(zangle, PI/4); + double h = std::sin(zangle) * head.fullwidth(); + + // The width of the tail head that we would like to have... + h = std::min(hit.distance() - head.r_back_mm, h); + + if(h <= 0.) return false; + + Vec3d endp{hjp(X), hjp(Y), hjp(Z) - hit.distance() + h}; + auto center_hit = m_mesh.query_ray_hit(hjp, DOWN); + + double hitdiff = center_hit.distance() - hit.distance(); + Vec3d hitp = std::abs(hitdiff) < 2*head.r_back_mm? + center_hit.position() : hit.position(); + + head.transform(); + + long pillar_id = m_builder.add_pillar(head.id, endp, head.r_back_mm); + Pillar &pill = m_builder.pillar(pillar_id); + + Vec3d taildir = endp - hitp; + double dist = distance(endp, hitp) + m_cfg.head_penetration_mm; + double w = dist - 2 * head.r_pin_mm - head.r_back_mm; + + if (w < 0.) { + BOOST_LOG_TRIVIAL(error) << "Pinhead width is negative!"; + w = 0.; + } + + Head tailhead(head.r_back_mm, head.r_pin_mm, w, + m_cfg.head_penetration_mm, taildir, hitp); + + tailhead.transform(); + pill.base = tailhead.mesh; + + m_pillar_index.guarded_insert(pill.endpoint(), pill.id); + + return true; +} + void SupportTreeBuildsteps::routing_to_model() { // We need to check if there is an easy way out to the bed surface. // If it can be routed there with a bridge shorter than // min_bridge_distance. - - // First we want to index the available pillars. The best is to connect - // these points to the available pillars - - auto routedown = [this](Head& head, const Vec3d& dir, double dist) - { - head.transform(); - Vec3d endp = head.junction_point() + dist * dir; - m_builder.add_bridge(head.id, endp); - m_builder.add_junction(endp, head.r_back_mm); - - this->create_ground_pillar(endp, dir, head.r_back_mm); - }; - - std::vector modelpillars; - ccr::SpinningMutex mutex; - auto onmodelfn = - [this, routedown, &modelpillars, &mutex] - (const std::pair &el, size_t) - { + ccr::enumerate(m_iheads_onmodel.begin(), m_iheads_onmodel.end(), + [this] (const unsigned idx, size_t) { m_thr(); - unsigned idx = el.first; - EigenMesh3D::hit_result hit = el.second; auto& head = m_builder.head(idx); - Vec3d hjp = head.junction_point(); - // ///////////////////////////////////////////////////////////////// // Search nearby pillar - // ///////////////////////////////////////////////////////////////// - if(search_pillar_and_connect(head)) { head.transform(); return; } - // ///////////////////////////////////////////////////////////////// - // Try straight path - // ///////////////////////////////////////////////////////////////// - // Cannot connect to nearby pillar. We will try to search for // a route to the ground. + if(connect_to_ground(head)) { head.transform(); return; } - double t = bridge_mesh_intersect(hjp, head.dir, head.r_back_mm); - double d = 0, tdown = 0; - Vec3d dirdown(0.0, 0.0, -1.0); - - t = std::min(t, m_cfg.max_bridge_length_mm); - - while(d < t && !std::isinf(tdown = bridge_mesh_intersect( - hjp + d*head.dir, - dirdown, head.r_back_mm))) { - d += head.r_back_mm; - } - - if(std::isinf(tdown)) { // we heave found a route to the ground - routedown(head, head.dir, d); return; - } - - // ///////////////////////////////////////////////////////////////// - // Optimize bridge direction - // ///////////////////////////////////////////////////////////////// - - // Straight path failed so we will try to search for a suitable - // direction out of the cavity. - - // Get the spherical representation of the normal. its easier to - // work with. - double z = head.dir(Z); - double r = 1.0; // for normalized vector - double polar = std::acos(z / r); - double azimuth = std::atan2(head.dir(Y), head.dir(X)); - - using libnest2d::opt::bound; - using libnest2d::opt::initvals; - using libnest2d::opt::GeneticOptimizer; - using libnest2d::opt::StopCriteria; - - StopCriteria stc; - stc.max_iterations = m_cfg.optimizer_max_iterations; - stc.relative_score_difference = m_cfg.optimizer_rel_score_diff; - stc.stop_score = 1e6; - GeneticOptimizer solver(stc); - solver.seed(0); // we want deterministic behavior - - double r_back = head.r_back_mm; - - auto oresult = solver.optimize_max( - [this, hjp, r_back](double plr, double azm) - { - Vec3d n = Vec3d(std::cos(azm) * std::sin(plr), - std::sin(azm) * std::sin(plr), - std::cos(plr)).normalized(); - return bridge_mesh_intersect(hjp, n, r_back); - }, - initvals(polar, azimuth), // let's start with what we have - bound(3*PI/4, PI), // Must not exceed the slope limit - bound(-PI, PI) // azimuth can be a full range search - ); - - d = 0; t = oresult.score; - - polar = std::get<0>(oresult.optimum); - azimuth = std::get<1>(oresult.optimum); - Vec3d bridgedir = Vec3d(std::cos(azimuth) * std::sin(polar), - std::sin(azimuth) * std::sin(polar), - std::cos(polar)).normalized(); - - t = std::min(t, m_cfg.max_bridge_length_mm); - - while(d < t && !std::isinf(tdown = bridge_mesh_intersect( - hjp + d*bridgedir, - dirdown, - head.r_back_mm))) { - d += head.r_back_mm; - } - - if(std::isinf(tdown)) { // we heave found a route to the ground - routedown(head, bridgedir, d); return; - } - - // ///////////////////////////////////////////////////////////////// - // Route to model body - // ///////////////////////////////////////////////////////////////// - - double zangle = std::asin(hit.direction()(Z)); - zangle = std::max(zangle, PI/4); - double h = std::sin(zangle) * head.fullwidth(); - - // The width of the tail head that we would like to have... - h = std::min(hit.distance() - head.r_back_mm, h); - - if(h > 0) { - Vec3d endp{hjp(X), hjp(Y), hjp(Z) - hit.distance() + h}; - auto center_hit = m_mesh.query_ray_hit(hjp, dirdown); - - double hitdiff = center_hit.distance() - hit.distance(); - Vec3d hitp = std::abs(hitdiff) < 2*head.r_back_mm? - center_hit.position() : hit.position(); - - head.transform(); - - long pillar_id = m_builder.add_pillar(head.id, endp, head.r_back_mm); - Pillar &pill = m_builder.pillar(pillar_id); - - Vec3d taildir = endp - hitp; - double dist = distance(endp, hitp) + m_cfg.head_penetration_mm; - double w = dist - 2 * head.r_pin_mm - head.r_back_mm; - - if (w < 0.) { - BOOST_LOG_TRIVIAL(error) << "Pinhead width is negative!"; - w = 0.; - } - - Head tailhead(head.r_back_mm, - head.r_pin_mm, - w, - m_cfg.head_penetration_mm, - taildir, - hitp); - - tailhead.transform(); - pill.base = tailhead.mesh; - - // Experimental: add the pillar to the index for cascading - std::lock_guard lk(mutex); - modelpillars.emplace_back(unsigned(pill.id)); - return; - } + // No route to the ground, so connect to the model body as a last resort + if (connect_to_model_body(head)) { return; } // We have failed to route this head. BOOST_LOG_TRIVIAL(warning) - << "Failed to route model facing support point." - << " ID: " << idx; + << "Failed to route model facing support point. ID: " << idx; + head.invalidate(); - }; - - ccr::enumerate(m_iheads_onmodel.begin(), m_iheads_onmodel.end(), onmodelfn); - - for(auto pillid : modelpillars) { - auto& pillar = m_builder.pillar(pillid); - m_pillar_index.insert(pillar.endpoint(), pillid); - } + }); } void SupportTreeBuildsteps::interconnect_pillars() @@ -1279,7 +1228,8 @@ void SupportTreeBuildsteps::interconnect_pillars() spts[n] = s; // Check the path vertically down - auto hr = bridge_mesh_intersect(s, {0, 0, -1}, pillar().r); + Vec3d check_from = s + Vec3d{0., 0., pillar().r}; + auto hr = bridge_mesh_intersect(check_from, DOWN, pillar().r); Vec3d gndsp{s(X), s(Y), gnd}; // If the path is clear, check for pillar base collisions @@ -1359,12 +1309,11 @@ void SupportTreeBuildsteps::routing_headless() Vec3d n = m_support_nmls.row(i); // mesh outward normal Vec3d sp = sph - n * HWIDTH_MM; // stick head start point - Vec3d dir = {0, 0, -1}; Vec3d sj = sp + R * n; // stick start point // This is only for checking - double idist = bridge_mesh_intersect(sph, dir, R, true); - double realdist = ray_mesh_intersect(sj, dir); + double idist = bridge_mesh_intersect(sph, DOWN, R, true); + double realdist = ray_mesh_intersect(sj, DOWN); double dist = realdist; if (std::isinf(dist)) dist = sph(Z) - m_builder.ground_level; @@ -1377,7 +1326,7 @@ void SupportTreeBuildsteps::routing_headless() } bool use_endball = !std::isinf(realdist); - Vec3d ej = sj + (dist + HWIDTH_MM) * dir; + Vec3d ej = sj + (dist + HWIDTH_MM) * DOWN ; m_builder.add_compact_bridge(sp, ej, n, R, use_endball); } } diff --git a/src/libslic3r/SLA/SupportTreeBuildsteps.hpp b/src/libslic3r/SLA/SupportTreeBuildsteps.hpp index 24e0116bda..9533049b60 100644 --- a/src/libslic3r/SLA/SupportTreeBuildsteps.hpp +++ b/src/libslic3r/SLA/SupportTreeBuildsteps.hpp @@ -35,6 +35,17 @@ inline Vec3d spheric_to_dir(double polar, double azimuth) std::sin(azimuth) * std::sin(polar), std::cos(polar)}; } +inline Vec3d spheric_to_dir(const std::tuple &v) +{ + auto [plr, azm] = v; + return spheric_to_dir(plr, azm); +} + +inline Vec3d spheric_to_dir(const std::pair &v) +{ + return spheric_to_dir(v.first, v.second); +} + // This function returns the position of the centroid in the input 'clust' // vector of point indices. template @@ -166,10 +177,10 @@ class SupportTreeBuildsteps { using PtIndices = std::vector; PtIndices m_iheads; // support points with pinhead + PtIndices m_iheads_onmodel; PtIndices m_iheadless; // headless support points - - // supp. pts. connecting to model: point index and the ray hit data - std::vector> m_iheads_onmodel; + + std::map m_head_to_ground_scans; // normals for support points from model faces. PointSet m_support_nmls; @@ -238,9 +249,18 @@ class SupportTreeBuildsteps { // For connecting a head to a nearby pillar. bool connect_to_nearpillar(const Head& head, long nearpillar_id); - + + // Find route for a head to the ground. Inserts additional bridge from the + // head to the pillar if cannot create pillar directly. + // The optional dir parameter is the direction of the bridge which is the + // direction of the pinhead if omitted. + bool connect_to_ground(Head& head, const Vec3d &dir); + inline bool connect_to_ground(Head& head); + + bool connect_to_model_body(Head &head); + bool search_pillar_and_connect(const Head& head); - + // This is a proxy function for pillar creation which will mind the gap // between the pad and the model bottom in zero elevation mode. // jp is the starting junction point which needs to be routed down. @@ -250,6 +270,8 @@ class SupportTreeBuildsteps { const Vec3d &sourcedir, double radius, long head_id = ID_UNSET); + + public: SupportTreeBuildsteps(SupportTreeBuilder & builder, const SupportableMesh &sm); From 6205524d75e47ebb32ba999525121c3647cd151a Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Mon, 13 Jan 2020 13:57:39 +0100 Subject: [PATCH 113/336] Make support point generator deterministic. --- src/libslic3r/SLA/SupportPointGenerator.cpp | 79 ++++++++++++++++----- src/libslic3r/SLA/SupportPointGenerator.hpp | 14 +++- 2 files changed, 74 insertions(+), 19 deletions(-) diff --git a/src/libslic3r/SLA/SupportPointGenerator.cpp b/src/libslic3r/SLA/SupportPointGenerator.cpp index 66b6ea3f41..55124d4fc6 100644 --- a/src/libslic3r/SLA/SupportPointGenerator.cpp +++ b/src/libslic3r/SLA/SupportPointGenerator.cpp @@ -49,18 +49,64 @@ float SupportPointGenerator::distance_limit(float angle) const return 1./(2.4*get_required_density(angle)); }*/ -SupportPointGenerator::SupportPointGenerator(const sla::EigenMesh3D & emesh, - const std::vector &slices, - const std::vector & heights, - const Config & config, - std::function throw_on_cancel, - std::function statusfn) +class SupportPointGenerator::RandomGen { + std::mt19937 m_; +public: + + using result_type = long; + + RandomGen() + { + std::random_device rd; + m_.seed(rd()); + } + + explicit RandomGen(long seedval) { seed(seedval); } + + void seed(long s) { m_.seed(std::mt19937::result_type(s)); } + long operator() () { return long(m_()); } + long min() const { return m_.min(); } + long max() const { return m_.max(); } +}; + +SupportPointGenerator::SupportPointGenerator( + const sla::EigenMesh3D &emesh, + const std::vector &slices, + const std::vector & heights, + const Config & config, + std::function throw_on_cancel, + std::function statusfn) + : SupportPointGenerator(emesh, config, throw_on_cancel, statusfn) +{ + execute(slices, heights); +} + +SupportPointGenerator::SupportPointGenerator( + const EigenMesh3D &emesh, + const SupportPointGenerator::Config &config, + std::function throw_on_cancel, + std::function statusfn) : m_config(config) , m_emesh(emesh) , m_throw_on_cancel(throw_on_cancel) , m_statusfn(statusfn) { - process(slices, heights); +} + +void SupportPointGenerator::execute(const std::vector &slices, + const std::vector & heights) +{ + RandomGen rng; + process(slices, heights, rng); + project_onto_mesh(m_output); +} + +void SupportPointGenerator::execute(const std::vector &slices, + const std::vector & heights, + long seed) +{ + RandomGen rng(seed); + process(slices, heights, rng); project_onto_mesh(m_output); } @@ -184,7 +230,7 @@ static std::vector make_layers( return layers; } -void SupportPointGenerator::process(const std::vector& slices, const std::vector& heights) +void SupportPointGenerator::process(const std::vector& slices, const std::vector& heights, RandomGen &rng) { #ifdef SLA_SUPPORTPOINTGEN_DEBUG std::vector> islands; @@ -239,15 +285,15 @@ void SupportPointGenerator::process(const std::vector& slices, const //float force_deficit = s.support_force_deficit(m_config.tear_pressure()); if (s.islands_below.empty()) { // completely new island - needs support no doubt - uniformly_cover({ *s.polygon }, s, point_grid, true); + uniformly_cover({ *s.polygon }, s, point_grid, rng, true); } else if (! s.dangling_areas.empty()) { // Let's see if there's anything that overlaps enough to need supports: // What we now have in polygons needs support, regardless of what the forces are, so we can add them. //FIXME is it an island point or not? Vojtech thinks it is. - uniformly_cover(s.dangling_areas, s, point_grid); + uniformly_cover(s.dangling_areas, s, point_grid, rng); } else if (! s.overhangs_slopes.empty()) { //FIXME add the support force deficit as a parameter, only cover until the defficiency is covered. - uniformly_cover(s.overhangs_slopes, s, point_grid); + uniformly_cover(s.overhangs_slopes, s, point_grid, rng); } } @@ -266,7 +312,7 @@ void SupportPointGenerator::process(const std::vector& slices, const } } -std::vector sample_expolygon(const ExPolygon &expoly, float samples_per_mm2, std::mt19937 &rng) +std::vector sample_expolygon(const ExPolygon &expoly, float samples_per_mm2, SupportPointGenerator::RandomGen &rng) { // Triangulate the polygon with holes into triplets of 3D points. std::vector triangles = Slic3r::triangulate_expolygon_2f(expoly); @@ -306,7 +352,7 @@ std::vector sample_expolygon(const ExPolygon &expoly, float samples_per_m return out; } -std::vector sample_expolygon_with_boundary(const ExPolygon &expoly, float samples_per_mm2, float samples_per_mm_boundary, std::mt19937 &rng) +std::vector sample_expolygon_with_boundary(const ExPolygon &expoly, float samples_per_mm2, float samples_per_mm_boundary, SupportPointGenerator::RandomGen &rng) { std::vector out = sample_expolygon(expoly, samples_per_mm2, rng); double point_stepping_scaled = scale_(1.f) / samples_per_mm_boundary; @@ -319,7 +365,7 @@ std::vector sample_expolygon_with_boundary(const ExPolygon &expoly, float return out; } -std::vector sample_expolygon_with_boundary(const ExPolygons &expolys, float samples_per_mm2, float samples_per_mm_boundary, std::mt19937 &rng) +std::vector sample_expolygon_with_boundary(const ExPolygons &expolys, float samples_per_mm2, float samples_per_mm_boundary, SupportPointGenerator::RandomGen &rng) { std::vector out; for (const ExPolygon &expoly : expolys) @@ -442,7 +488,7 @@ static inline std::vector poisson_disk_from_samples(const std::vector raw_samples = sample_expolygon_with_boundary(islands, samples_per_mm2, 5.f / poisson_radius, rng); std::vector poisson_samples; for (size_t iter = 0; iter < 4; ++ iter) { diff --git a/src/libslic3r/SLA/SupportPointGenerator.hpp b/src/libslic3r/SLA/SupportPointGenerator.hpp index 3bbe3d7695..d7e322d066 100644 --- a/src/libslic3r/SLA/SupportPointGenerator.hpp +++ b/src/libslic3r/SLA/SupportPointGenerator.hpp @@ -29,6 +29,8 @@ public: SupportPointGenerator(const EigenMesh3D& emesh, const std::vector& slices, const std::vector& heights, const Config& config, std::function throw_on_cancel, std::function statusfn); + SupportPointGenerator(const EigenMesh3D& emesh, const Config& config, std::function throw_on_cancel, std::function statusfn); + const std::vector& output() { return m_output; } struct MyLayer; @@ -184,13 +186,21 @@ public: } }; + void execute(const std::vector &slices, + const std::vector & heights); + + void execute(const std::vector &slices, + const std::vector & heights, long seed); + + class RandomGen; + private: std::vector m_output; SupportPointGenerator::Config m_config; - void process(const std::vector& slices, const std::vector& heights); - void uniformly_cover(const ExPolygons& islands, Structure& structure, PointGrid3D &grid3d, bool is_new_island = false, bool just_one = false); + void process(const std::vector& slices, const std::vector& heights, RandomGen&); + void uniformly_cover(const ExPolygons& islands, Structure& structure, PointGrid3D &grid3d, RandomGen&, bool is_new_island = false, bool just_one = false); void project_onto_mesh(std::vector& points) const; #ifdef SLA_SUPPORTPOINTGEN_DEBUG From 256249fdaf065fd3bea1c95f277e9369e92d3862 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Mon, 13 Jan 2020 14:00:33 +0100 Subject: [PATCH 114/336] Make sla support pierce tests repeatable --- tests/sla_print/sla_test_utils.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tests/sla_print/sla_test_utils.cpp b/tests/sla_print/sla_test_utils.cpp index 3da28a50e6..124fa3cf1b 100644 --- a/tests/sla_print/sla_test_utils.cpp +++ b/tests/sla_print/sla_test_utils.cpp @@ -115,8 +115,10 @@ void test_supports(const std::string &obj_filename, // Create the support point generator sla::SupportPointGenerator::Config autogencfg; autogencfg.head_diameter = float(2 * supportcfg.head_front_radius_mm); - sla::SupportPointGenerator point_gen{emesh, out.model_slices, out.slicegrid, - autogencfg, [] {}, [](int) {}}; + sla::SupportPointGenerator point_gen{emesh, autogencfg, [] {}, [](int) {}}; + + long seed = 0; // Make the test repeatable + point_gen.execute(out.model_slices, out.slicegrid, seed); // Get the calculated support points. std::vector support_points = point_gen.output(); From 8af6890cab20e376d6bbe29ffacb46ee36afcb59 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Tue, 14 Jan 2020 10:35:52 +0100 Subject: [PATCH 115/336] Remove test restriction for on-model supports pierce test --- tests/sla_print/sla_test_utils.cpp | 5 ----- 1 file changed, 5 deletions(-) diff --git a/tests/sla_print/sla_test_utils.cpp b/tests/sla_print/sla_test_utils.cpp index 124fa3cf1b..ab1bbac0eb 100644 --- a/tests/sla_print/sla_test_utils.cpp +++ b/tests/sla_print/sla_test_utils.cpp @@ -13,11 +13,6 @@ void test_support_model_collision(const std::string &obj_filename, // the supports will not touch the model body. supportcfg.head_penetration_mm = -0.15; - // TODO: currently, the tailheads penetrating into the model body do not - // respect the penetration parameter properly. No issues were reported so - // far but we should definitely fix this. - supportcfg.ground_facing_only = true; - test_supports(obj_filename, supportcfg, hollowingcfg, drainholes, byproducts); // Slice the support mesh given the slice grid of the model. From ce49f0a294499e1e05ad356fda8dace163a5bf60 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Tue, 14 Jan 2020 10:41:42 +0100 Subject: [PATCH 116/336] Test sla support point generation determinism with seed parameter --- src/libslic3r/SLA/SupportPointGenerator.hpp | 3 +- tests/sla_print/sla_print_tests.cpp | 47 +++++++++++++++++++++ 2 files changed, 49 insertions(+), 1 deletion(-) diff --git a/src/libslic3r/SLA/SupportPointGenerator.hpp b/src/libslic3r/SLA/SupportPointGenerator.hpp index d7e322d066..37a831b344 100644 --- a/src/libslic3r/SLA/SupportPointGenerator.hpp +++ b/src/libslic3r/SLA/SupportPointGenerator.hpp @@ -31,7 +31,8 @@ public: SupportPointGenerator(const EigenMesh3D& emesh, const Config& config, std::function throw_on_cancel, std::function statusfn); - const std::vector& output() { return m_output; } + const std::vector& output() const { return m_output; } + std::vector& output() { return m_output; } struct MyLayer; diff --git a/tests/sla_print/sla_print_tests.cpp b/tests/sla_print/sla_print_tests.cpp index 4fefeb6bbd..8f69b84342 100644 --- a/tests/sla_print/sla_print_tests.cpp +++ b/tests/sla_print/sla_print_tests.cpp @@ -85,6 +85,53 @@ TEST_CASE("Pillar pairhash should be unique", "[SLASupportGeneration]") { test_pairhash(); } +TEST_CASE("Support point generator should be deterministic if seeded", + "[SLASupportGeneration], [SLAPointGen]") { + TriangleMesh mesh = load_model("A_upsidedown.obj"); + + sla::EigenMesh3D emesh{mesh}; + + sla::SupportConfig supportcfg; + sla::SupportPointGenerator::Config autogencfg; + autogencfg.head_diameter = float(2 * supportcfg.head_front_radius_mm); + sla::SupportPointGenerator point_gen{emesh, autogencfg, [] {}, [](int) {}}; + + TriangleMeshSlicer slicer{&mesh}; + + auto bb = mesh.bounding_box(); + double zmin = bb.min.z(); + double zmax = bb.max.z(); + double gnd = zmin - supportcfg.object_elevation_mm; + auto layer_h = 0.05f; + + auto slicegrid = grid(float(gnd), float(zmax), layer_h); + std::vector slices; + slicer.slice(slicegrid, CLOSING_RADIUS, &slices, []{}); + + point_gen.execute(slices, slicegrid, 0); + + auto get_chksum = [](const std::vector &pts){ + long long chksum = 0; + for (auto &pt : pts) { + auto p = scaled(pt.pos); + chksum += p.x() + p.y() + p.z(); + } + + return chksum; + }; + + long long checksum = get_chksum(point_gen.output()); + size_t ptnum = point_gen.output().size(); + REQUIRE(point_gen.output().size() > 0); + + for (int i = 0; i < 20; ++i) { + point_gen.output().clear(); + point_gen.execute(slices, slicegrid, 0); + REQUIRE(point_gen.output().size() == ptnum); + REQUIRE(checksum == get_chksum(point_gen.output())); + } +} + TEST_CASE("Flat pad geometry is valid", "[SLASupportGeneration]") { sla::PadConfig padcfg; From e6244f7bdbcbd800c8d36cefdca5c6ba159a9d45 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Tue, 14 Jan 2020 10:24:15 +0100 Subject: [PATCH 117/336] Eliminate use of uninitialized variable. --- src/libslic3r/SLA/SupportPointGenerator.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libslic3r/SLA/SupportPointGenerator.hpp b/src/libslic3r/SLA/SupportPointGenerator.hpp index 37a831b344..b8f5b607ea 100644 --- a/src/libslic3r/SLA/SupportPointGenerator.hpp +++ b/src/libslic3r/SLA/SupportPointGenerator.hpp @@ -79,7 +79,7 @@ public: ExPolygons overhangs; // Overhangs, where the surface must slope. ExPolygons overhangs_slopes; - float overhangs_area; + float overhangs_area = 0.f; bool overlaps(const Structure &rhs) const { return this->bbox.overlap(rhs.bbox) && (this->polygon->overlaps(*rhs.polygon) || rhs.polygon->overlaps(*this->polygon)); From a36c7c76ccacb0c7ec60ab383938daf4012885d4 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Wed, 15 Jan 2020 10:39:07 +0100 Subject: [PATCH 118/336] Fix scene not being centered --- sandboxes/opencsg/main.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sandboxes/opencsg/main.cpp b/sandboxes/opencsg/main.cpp index ab379c196e..a0d5c4ceb0 100644 --- a/sandboxes/opencsg/main.cpp +++ b/sandboxes/opencsg/main.cpp @@ -446,13 +446,13 @@ void MyFrame::activate_canvas_display() m_canvas->Bind(wxEVT_PAINT, [this](wxPaintEvent &) { // This is required even though dc is not used otherwise. wxPaintDC dc(this); - const wxSize csize = GetClientSize(); + const wxSize csize = m_canvas->GetClientSize(); m_canvas->get_display()->set_screen_size(csize.x, csize.y); m_canvas->get_display()->repaint(); }); - m_canvas->Bind(wxEVT_SIZE, [this](wxSizeEvent &) { - const wxSize csize = GetClientSize(); + m_canvas->Bind(wxEVT_SIZE, [this](wxSizeEvent &) { + const wxSize csize = m_canvas->GetClientSize(); m_canvas->get_display()->set_screen_size(csize.x, csize.y); m_canvas->get_display()->repaint(); }); From 3ab246df6b892c549979a801fd13e372e84cd93d Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Wed, 15 Jan 2020 12:43:58 +0100 Subject: [PATCH 119/336] Remove completely redundant code --- sandboxes/opencsg/Engine.cpp | 13 ------------- sandboxes/opencsg/Engine.hpp | 17 ----------------- sandboxes/opencsg/ShaderCSGDisplay.cpp | 13 ------------- 3 files changed, 43 deletions(-) diff --git a/sandboxes/opencsg/Engine.cpp b/sandboxes/opencsg/Engine.cpp index bd9da6540a..f110b23c5c 100644 --- a/sandboxes/opencsg/Engine.cpp +++ b/sandboxes/opencsg/Engine.cpp @@ -420,19 +420,6 @@ void CSGDisplay::on_scene_updated(const Scene &scene) mshinst.require_shared_vertices(); m_scene_cache.add_mesh(mshinst, OpenCSG::Intersection, m_csgsettings.get_convexity()); - - auto tr = Transform3f::Identity(); - tr.translate(-center); - - transform_pts(holedata.begin(), holedata.end(), tr, - [](const sla::DrainHole &dh) { - return dh.pos; - }); - - transform_pts(holedata.begin(), holedata.end(), tr, - [](const sla::DrainHole &dh) { - return dh.normal; - }); } for (const sla::DrainHole &holept : holedata) { diff --git a/sandboxes/opencsg/Engine.hpp b/sandboxes/opencsg/Engine.hpp index c078a39d86..fc76c1b313 100644 --- a/sandboxes/opencsg/Engine.hpp +++ b/sandboxes/opencsg/Engine.hpp @@ -171,23 +171,6 @@ public: // Try to enable or disable multisampling. bool enable_multisampling(bool e = true); -template::value_type> -inline std::vector transform_pts( - It from, It to, Trafo &&tr, GetPt &&point) -{ - vector ret; - ret.reserve(to - from); - for(auto it = from; it != to; ++it) { - V v = *it; - v.pos = tr * point(*it); - ret.emplace_back(std::move(v)); - } - return ret; -} - class Volume { IndexedVertexArray m_geom; Geometry::Transformation m_trafo; diff --git a/sandboxes/opencsg/ShaderCSGDisplay.cpp b/sandboxes/opencsg/ShaderCSGDisplay.cpp index 7339e408c5..8ceb234be0 100644 --- a/sandboxes/opencsg/ShaderCSGDisplay.cpp +++ b/sandboxes/opencsg/ShaderCSGDisplay.cpp @@ -53,19 +53,6 @@ void ShaderCSGDisplay::on_scene_updated(const Scene &scene) mshinst.require_shared_vertices(); add_mesh(mshinst); - - auto tr = Transform3f::Identity(); - tr.translate(-center); - - transform_pts(holedata.begin(), holedata.end(), tr, - [](const sla::DrainHole &dh) { - return dh.pos; - }); - - transform_pts(holedata.begin(), holedata.end(), tr, - [](const sla::DrainHole &dh) { - return dh.normal; - }); } for (const sla::DrainHole &holept : holedata) { From 402ae12db214d127a246c8e3e28cd0ca81e7bc1f Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Wed, 15 Jan 2020 12:54:06 +0100 Subject: [PATCH 120/336] Fix algorithm switching --- sandboxes/opencsg/main.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sandboxes/opencsg/main.cpp b/sandboxes/opencsg/main.cpp index a0d5c4ceb0..ec6c01789a 100644 --- a/sandboxes/opencsg/main.cpp +++ b/sandboxes/opencsg/main.cpp @@ -387,8 +387,8 @@ void MyFrame::read_csg_settings(const wxCmdLineParser &parser) void MyFrame::set_renderer_algorithm(const wxString &alg) { - long alg_idx = get_idx("EnricoShader", CSG_ALGS); - if (alg_idx < 0 || alg_idx >= CSG_ALGS.size()) return; + long alg_idx = get_idx(alg, CSG_ALGS); + if (alg_idx < 0 || alg_idx >= long(CSG_ALGS.size())) return; // If there is a valid display in place, save its camera. auto cam = m_canvas->get_display() ? From e6bdec4aa531e373724cb456d9ab76ff0af178b9 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Wed, 15 Jan 2020 17:44:15 +0100 Subject: [PATCH 121/336] Remove wrapper around std::mt19937 --- src/libslic3r/SLA/SupportPointGenerator.cpp | 54 +++++---------------- src/libslic3r/SLA/SupportPointGenerator.hpp | 14 +++--- tests/sla_print/sla_print_tests.cpp | 5 +- tests/sla_print/sla_test_utils.cpp | 4 +- 4 files changed, 25 insertions(+), 52 deletions(-) diff --git a/src/libslic3r/SLA/SupportPointGenerator.cpp b/src/libslic3r/SLA/SupportPointGenerator.cpp index 55124d4fc6..78c2ced356 100644 --- a/src/libslic3r/SLA/SupportPointGenerator.cpp +++ b/src/libslic3r/SLA/SupportPointGenerator.cpp @@ -49,26 +49,6 @@ float SupportPointGenerator::distance_limit(float angle) const return 1./(2.4*get_required_density(angle)); }*/ -class SupportPointGenerator::RandomGen { - std::mt19937 m_; -public: - - using result_type = long; - - RandomGen() - { - std::random_device rd; - m_.seed(rd()); - } - - explicit RandomGen(long seedval) { seed(seedval); } - - void seed(long s) { m_.seed(std::mt19937::result_type(s)); } - long operator() () { return long(m_()); } - long min() const { return m_.min(); } - long max() const { return m_.max(); } -}; - SupportPointGenerator::SupportPointGenerator( const sla::EigenMesh3D &emesh, const std::vector &slices, @@ -78,6 +58,8 @@ SupportPointGenerator::SupportPointGenerator( std::function statusfn) : SupportPointGenerator(emesh, config, throw_on_cancel, statusfn) { + std::random_device rd; + m_rng.seed(rd()); execute(slices, heights); } @@ -96,17 +78,7 @@ SupportPointGenerator::SupportPointGenerator( void SupportPointGenerator::execute(const std::vector &slices, const std::vector & heights) { - RandomGen rng; - process(slices, heights, rng); - project_onto_mesh(m_output); -} - -void SupportPointGenerator::execute(const std::vector &slices, - const std::vector & heights, - long seed) -{ - RandomGen rng(seed); - process(slices, heights, rng); + process(slices, heights); project_onto_mesh(m_output); } @@ -230,7 +202,7 @@ static std::vector make_layers( return layers; } -void SupportPointGenerator::process(const std::vector& slices, const std::vector& heights, RandomGen &rng) +void SupportPointGenerator::process(const std::vector& slices, const std::vector& heights) { #ifdef SLA_SUPPORTPOINTGEN_DEBUG std::vector> islands; @@ -285,15 +257,15 @@ void SupportPointGenerator::process(const std::vector& slices, const //float force_deficit = s.support_force_deficit(m_config.tear_pressure()); if (s.islands_below.empty()) { // completely new island - needs support no doubt - uniformly_cover({ *s.polygon }, s, point_grid, rng, true); + uniformly_cover({ *s.polygon }, s, point_grid, true); } else if (! s.dangling_areas.empty()) { // Let's see if there's anything that overlaps enough to need supports: // What we now have in polygons needs support, regardless of what the forces are, so we can add them. //FIXME is it an island point or not? Vojtech thinks it is. - uniformly_cover(s.dangling_areas, s, point_grid, rng); + uniformly_cover(s.dangling_areas, s, point_grid); } else if (! s.overhangs_slopes.empty()) { //FIXME add the support force deficit as a parameter, only cover until the defficiency is covered. - uniformly_cover(s.overhangs_slopes, s, point_grid, rng); + uniformly_cover(s.overhangs_slopes, s, point_grid); } } @@ -312,7 +284,7 @@ void SupportPointGenerator::process(const std::vector& slices, const } } -std::vector sample_expolygon(const ExPolygon &expoly, float samples_per_mm2, SupportPointGenerator::RandomGen &rng) +std::vector sample_expolygon(const ExPolygon &expoly, float samples_per_mm2, std::mt19937 &rng) { // Triangulate the polygon with holes into triplets of 3D points. std::vector triangles = Slic3r::triangulate_expolygon_2f(expoly); @@ -352,7 +324,7 @@ std::vector sample_expolygon(const ExPolygon &expoly, float samples_per_m return out; } -std::vector sample_expolygon_with_boundary(const ExPolygon &expoly, float samples_per_mm2, float samples_per_mm_boundary, SupportPointGenerator::RandomGen &rng) +std::vector sample_expolygon_with_boundary(const ExPolygon &expoly, float samples_per_mm2, float samples_per_mm_boundary, std::mt19937 &rng) { std::vector out = sample_expolygon(expoly, samples_per_mm2, rng); double point_stepping_scaled = scale_(1.f) / samples_per_mm_boundary; @@ -365,7 +337,7 @@ std::vector sample_expolygon_with_boundary(const ExPolygon &expoly, float return out; } -std::vector sample_expolygon_with_boundary(const ExPolygons &expolys, float samples_per_mm2, float samples_per_mm_boundary, SupportPointGenerator::RandomGen &rng) +std::vector sample_expolygon_with_boundary(const ExPolygons &expolys, float samples_per_mm2, float samples_per_mm_boundary, std::mt19937 &rng) { std::vector out; for (const ExPolygon &expoly : expolys) @@ -488,7 +460,7 @@ static inline std::vector poisson_disk_from_samples(const std::vector raw_samples = sample_expolygon_with_boundary(islands, samples_per_mm2, 5.f / poisson_radius, rng); + std::vector raw_samples = sample_expolygon_with_boundary(islands, samples_per_mm2, 5.f / poisson_radius, m_rng); std::vector poisson_samples; for (size_t iter = 0; iter < 4; ++ iter) { poisson_samples = poisson_disk_from_samples(raw_samples, poisson_radius, @@ -541,7 +513,7 @@ void SupportPointGenerator::uniformly_cover(const ExPolygons& islands, Structure // assert(! poisson_samples.empty()); if (poisson_samples_target < poisson_samples.size()) { - std::shuffle(poisson_samples.begin(), poisson_samples.end(), rng); + std::shuffle(poisson_samples.begin(), poisson_samples.end(), m_rng); poisson_samples.erase(poisson_samples.begin() + poisson_samples_target, poisson_samples.end()); } for (const Vec2f &pt : poisson_samples) { diff --git a/src/libslic3r/SLA/SupportPointGenerator.hpp b/src/libslic3r/SLA/SupportPointGenerator.hpp index b8f5b607ea..738fc57303 100644 --- a/src/libslic3r/SLA/SupportPointGenerator.hpp +++ b/src/libslic3r/SLA/SupportPointGenerator.hpp @@ -1,6 +1,8 @@ #ifndef SLA_SUPPORTPOINTGENERATOR_HPP #define SLA_SUPPORTPOINTGENERATOR_HPP +#include + #include #include #include @@ -190,18 +192,14 @@ public: void execute(const std::vector &slices, const std::vector & heights); - void execute(const std::vector &slices, - const std::vector & heights, long seed); - - class RandomGen; - + void seed(std::mt19937::result_type s) { m_rng.seed(s); } private: std::vector m_output; SupportPointGenerator::Config m_config; - void process(const std::vector& slices, const std::vector& heights, RandomGen&); - void uniformly_cover(const ExPolygons& islands, Structure& structure, PointGrid3D &grid3d, RandomGen&, bool is_new_island = false, bool just_one = false); + void process(const std::vector& slices, const std::vector& heights); + void uniformly_cover(const ExPolygons& islands, Structure& structure, PointGrid3D &grid3d, bool is_new_island = false, bool just_one = false); void project_onto_mesh(std::vector& points) const; #ifdef SLA_SUPPORTPOINTGEN_DEBUG @@ -212,6 +210,8 @@ private: const EigenMesh3D& m_emesh; std::function m_throw_on_cancel; std::function m_statusfn; + + std::mt19937 m_rng; }; void remove_bottom_points(std::vector &pts, double gnd_lvl, double tolerance); diff --git a/tests/sla_print/sla_print_tests.cpp b/tests/sla_print/sla_print_tests.cpp index 8f69b84342..b08c931e31 100644 --- a/tests/sla_print/sla_print_tests.cpp +++ b/tests/sla_print/sla_print_tests.cpp @@ -108,7 +108,8 @@ TEST_CASE("Support point generator should be deterministic if seeded", std::vector slices; slicer.slice(slicegrid, CLOSING_RADIUS, &slices, []{}); - point_gen.execute(slices, slicegrid, 0); + point_gen.seed(0); + point_gen.execute(slices, slicegrid); auto get_chksum = [](const std::vector &pts){ long long chksum = 0; @@ -126,7 +127,7 @@ TEST_CASE("Support point generator should be deterministic if seeded", for (int i = 0; i < 20; ++i) { point_gen.output().clear(); - point_gen.execute(slices, slicegrid, 0); + point_gen.execute(slices, slicegrid); REQUIRE(point_gen.output().size() == ptnum); REQUIRE(checksum == get_chksum(point_gen.output())); } diff --git a/tests/sla_print/sla_test_utils.cpp b/tests/sla_print/sla_test_utils.cpp index ab1bbac0eb..0804adb4f3 100644 --- a/tests/sla_print/sla_test_utils.cpp +++ b/tests/sla_print/sla_test_utils.cpp @@ -112,8 +112,8 @@ void test_supports(const std::string &obj_filename, autogencfg.head_diameter = float(2 * supportcfg.head_front_radius_mm); sla::SupportPointGenerator point_gen{emesh, autogencfg, [] {}, [](int) {}}; - long seed = 0; // Make the test repeatable - point_gen.execute(out.model_slices, out.slicegrid, seed); + point_gen.seed(0); // Make the test repeatable + point_gen.execute(out.model_slices, out.slicegrid); // Get the calculated support points. std::vector support_points = point_gen.output(); From a3f3c868eb9835b6086bb9f1aad238509ee4ebc7 Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Tue, 14 Jan 2020 14:28:22 +0100 Subject: [PATCH 122/336] Removed needless calls to instance_bounding_box --- src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp index efb1101995..61f3c10b28 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp @@ -62,18 +62,21 @@ void GLGizmoHollow::set_sla_support_data(ModelObject* model_object, const Select return; } - if (m_c->m_model_object != model_object || m_c->m_model_object_id != model_object->id()) { + bool something_changed = false; + + if (m_c->m_model_object != model_object + || m_c->m_model_object_id != model_object->id() + || m_c->m_active_instance != selection.get_instance_idx()) { m_c->m_model_object = model_object; m_c->m_print_object_idx = -1; + m_c->m_active_instance = selection.get_instance_idx(); + something_changed = true; } - m_c->m_active_instance = selection.get_instance_idx(); - - if (model_object && selection.is_from_single_instance()) + if (model_object && something_changed && selection.is_from_single_instance()) { // Cache the bb - it's needed for dealing with the clipping plane quite often // It could be done inside update_mesh but one has to account for scaling of the instance. - //FIXME calling ModelObject::instance_bounding_box() is expensive! m_c->m_active_instance_bb_radius = m_c->m_model_object->instance_bounding_box(m_c->m_active_instance).radius(); if (is_mesh_update_necessary()) { From 8c8256c6a23f159c9fb6e9f1c61c2689aa5d055e Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Tue, 14 Jan 2020 14:30:49 +0100 Subject: [PATCH 123/336] Fixed diameter/radius mismatch in gizmo UI --- src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp | 6 ++++-- src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp index 61f3c10b28..5a99949bfb 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp @@ -822,14 +822,16 @@ RENDER_AGAIN: // m_imgui->text(" "); // vertical gap ImGui::Separator(); - float diameter_upper_cap = 20.f; //static_cast(wxGetApp().preset_bundle->sla_prints.get_edited_preset().config.option("support_pillar_diameter"))->value; + float diameter_upper_cap = 5.f; if (m_new_hole_radius > diameter_upper_cap) m_new_hole_radius = diameter_upper_cap; m_imgui->text(m_desc.at("hole_diameter")); ImGui::SameLine(diameter_slider_left); ImGui::PushItemWidth(window_width - diameter_slider_left); - ImGui::SliderFloat("", &m_new_hole_radius, 0.1f, diameter_upper_cap, "%.1f"); + float diam = 2.f * m_new_hole_radius; + ImGui::SliderFloat("", &diam, 1.f, diameter_upper_cap, "%.1f"); + m_new_hole_radius = diam / 2.f; bool clicked = ImGui::IsItemClicked(); bool edited = ImGui::IsItemEdited(); bool deactivated = ImGui::IsItemDeactivatedAfterEdit(); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp index ba2935a561..b6a125972a 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp @@ -58,7 +58,7 @@ private: bool unsaved_changes() const; bool m_show_supports = true; - float m_new_hole_radius = 4.f; // Size of a new hole. + float m_new_hole_radius = 2.f; // Size of a new hole. float m_new_hole_height = 5.f; mutable std::vector m_selected; // which holes are currently selected From 6e8bdb2c862c95568b2b6f07d95e881cf66a4404 Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Tue, 14 Jan 2020 14:32:27 +0100 Subject: [PATCH 124/336] Fixed update of clipping plane when a gizmo was turned off --- src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp | 5 +---- src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp | 1 + 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp index 5a99949bfb..17154de589 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp @@ -963,10 +963,6 @@ std::string GLGizmoHollow::on_get_name() const } -//const TriangleMesh* GLGizmoHollow::mesh() const { -// return (! m_c->m_mesh ? nullptr : (m_c->m_cavity_mesh ? m_c->m_cavity_mesh.get() : m_c->m_mesh)); -//} - void GLGizmoHollow::on_set_state() { @@ -1004,6 +1000,7 @@ void GLGizmoHollow::on_set_state() //Plater::TakeSnapshot snapshot(wxGetApp().plater(), _(L("SLA gizmo turned off"))); m_parent.toggle_model_objects_visibility(true); m_clipping_plane_distance = 0.f; + update_clipping_plane(); // Release clippers and the AABB raycaster. m_c->m_object_clipper.reset(); m_c->m_supports_clipper.reset(); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp index 4e00b0f77f..9b04fd6aba 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp @@ -1082,6 +1082,7 @@ void GLGizmoSlaSupports::on_set_state() m_parent.toggle_model_objects_visibility(true); m_normal_cache.clear(); m_clipping_plane_distance = 0.f; + update_clipping_plane(); // Release clippers and the AABB raycaster. m_its = nullptr; m_c->m_object_clipper.reset(); From 902d3bb904fc4f69afb7a798f5e9b63fbd84a19a Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Tue, 14 Jan 2020 14:33:56 +0100 Subject: [PATCH 125/336] Fixed loading of hole_height when a hole is selected (hollowing gizmo) --- src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp index 17154de589..ebff04007f 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp @@ -1079,7 +1079,7 @@ void GLGizmoHollow::select_point(int i) if (i == AllPoints) { m_new_hole_radius = m_c->m_model_object->sla_drain_holes[0].radius; - m_new_hole_height = m_c->m_model_object->sla_drain_holes[0].height; + m_new_hole_height = m_c->m_model_object->sla_drain_holes[0].height - HoleStickOutLength; } } else { @@ -1088,7 +1088,7 @@ void GLGizmoHollow::select_point(int i) m_selected[i] = true; m_selection_empty = false; m_new_hole_radius = m_c->m_model_object->sla_drain_holes[i].radius; - m_new_hole_height = m_c->m_model_object->sla_drain_holes[i].height; + m_new_hole_height = m_c->m_model_object->sla_drain_holes[i].height - HoleStickOutLength; } } From 822f9ff4a6921a7b42af4689da8dc387716129e0 Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Thu, 16 Jan 2020 12:43:42 +0100 Subject: [PATCH 126/336] Fixed issues in SLA gizmos related to showing/hiding of the model/support structures --- src/slic3r/GUI/GLCanvas3D.cpp | 8 ++------ src/slic3r/GUI/GLCanvas3D.hpp | 2 +- src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp | 17 ++++++++++------- src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp | 20 ++++++++++---------- 4 files changed, 23 insertions(+), 24 deletions(-) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index ce5609ecae..6392b97c0a 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -1558,10 +1558,9 @@ int GLCanvas3D::check_volumes_outside_state() const return (int)state; } -bool GLCanvas3D::toggle_sla_auxiliaries_visibility(bool visible, const ModelObject* mo, int instance_idx) +void GLCanvas3D::toggle_sla_auxiliaries_visibility(bool visible, const ModelObject* mo, int instance_idx) { - if (m_render_sla_auxiliaries == visible) - return false; + m_render_sla_auxiliaries = visible; for (GLVolume* vol : m_volumes.volumes) { if ((mo == nullptr || m_model->objects[vol->composite_id.object_id] == mo) @@ -1569,9 +1568,6 @@ bool GLCanvas3D::toggle_sla_auxiliaries_visibility(bool visible, const ModelObje && vol->composite_id.volume_id < 0) vol->is_active = visible; } - - m_render_sla_auxiliaries = visible; - return true; } void GLCanvas3D::toggle_model_objects_visibility(bool visible, const ModelObject* mo, int instance_idx) diff --git a/src/slic3r/GUI/GLCanvas3D.hpp b/src/slic3r/GUI/GLCanvas3D.hpp index d68d5bb72f..3e8b56bd05 100644 --- a/src/slic3r/GUI/GLCanvas3D.hpp +++ b/src/slic3r/GUI/GLCanvas3D.hpp @@ -500,7 +500,7 @@ public: void reset_volumes(); int check_volumes_outside_state() const; - bool toggle_sla_auxiliaries_visibility(bool visible, const ModelObject* mo = nullptr, int instance_idx = -1); + void toggle_sla_auxiliaries_visibility(bool visible, const ModelObject* mo = nullptr, int instance_idx = -1); void toggle_model_objects_visibility(bool visible, const ModelObject* mo = nullptr, int instance_idx = -1); void update_instance_printable_state_for_object(size_t obj_idx); void update_instance_printable_state_for_objects(std::vector& object_idxs); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp index ebff04007f..a832b5e5c0 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp @@ -87,7 +87,7 @@ void GLGizmoHollow::set_sla_support_data(ModelObject* model_object, const Select if (m_state == On) { m_parent.toggle_model_objects_visibility(false); m_parent.toggle_model_objects_visibility(! m_c->m_cavity_mesh, m_c->m_model_object, m_c->m_active_instance); - m_parent.toggle_sla_auxiliaries_visibility(bool(m_c->m_cavity_mesh), m_c->m_model_object, m_c->m_active_instance); + m_parent.toggle_sla_auxiliaries_visibility(m_show_supports, m_c->m_model_object, m_c->m_active_instance); } else m_parent.toggle_model_objects_visibility(true, nullptr, -1); @@ -132,9 +132,6 @@ void GLGizmoHollow::on_render() const m_c->m_volume_with_cavity->render(color_id, print_box_detection_id, print_box_worldmatrix_id); m_parent.get_shader().stop_using(); } - // Show/hide the original object - m_parent.toggle_model_objects_visibility(! m_c->m_cavity_mesh, m_c->m_model_object, m_c->m_active_instance); - m_parent.toggle_sla_auxiliaries_visibility(bool(m_c->m_cavity_mesh), m_c->m_model_object, m_c->m_active_instance); m_z_shift = selection.get_volume(*selection.get_volume_idxs().begin())->get_sla_shift_z(); @@ -649,6 +646,9 @@ void GLGizmoHollow::update_hollowed_mesh(std::unique_ptr &&mesh) m_c->m_volume_with_cavity->finalize_geometry(true); m_c->m_volume_with_cavity->force_transparent = false; + m_parent.toggle_model_objects_visibility(false, m_c->m_model_object, m_c->m_active_instance); + m_parent.toggle_sla_auxiliaries_visibility(true, m_c->m_model_object, m_c->m_active_instance); + // Reset raycaster so it works with the new mesh: m_c->m_mesh_raycaster.reset(new MeshRaycaster(*m_c->mesh())); } @@ -908,8 +908,10 @@ RENDER_AGAIN: update_clipping_plane(true); // make sure supports are shown/hidden as appropriate - m_imgui->checkbox(m_desc["show_supports"], m_show_supports); - force_refresh = m_parent.toggle_sla_auxiliaries_visibility(m_show_supports, m_c->m_model_object, m_c->m_active_instance); + if (m_imgui->checkbox(m_desc["show_supports"], m_show_supports)) { + m_parent.toggle_sla_auxiliaries_visibility(m_show_supports, m_c->m_model_object, m_c->m_active_instance); + force_refresh = true; + } m_imgui->end(); @@ -990,7 +992,8 @@ void GLGizmoHollow::on_set_state() m_parent.toggle_model_objects_visibility(false); if (m_c->m_model_object) - m_parent.toggle_model_objects_visibility(true, m_c->m_model_object, m_c->m_active_instance); + m_parent.toggle_model_objects_visibility(! m_c->m_cavity_mesh, m_c->m_model_object, m_c->m_active_instance); + m_parent.toggle_sla_auxiliaries_visibility(m_show_supports, m_c->m_model_object, m_c->m_active_instance); // Set default head diameter from config. //const DynamicPrintConfig& cfg = wxGetApp().preset_bundle->sla_prints.get_edited_preset().config; diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp index 9b04fd6aba..45a766ccc1 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp @@ -88,7 +88,7 @@ void GLGizmoSlaSupports::set_sla_support_data(ModelObject* model_object, const S if (m_state == On) { m_parent.toggle_model_objects_visibility(false); m_parent.toggle_model_objects_visibility(! m_c->m_cavity_mesh, m_c->m_model_object, m_c->m_active_instance); - m_parent.toggle_sla_auxiliaries_visibility(bool(m_c->m_cavity_mesh), m_c->m_model_object, m_c->m_active_instance); + m_parent.toggle_sla_auxiliaries_visibility(! m_editing_mode, m_c->m_model_object, m_c->m_active_instance); } else m_parent.toggle_model_objects_visibility(true, nullptr, -1); @@ -144,8 +144,8 @@ void GLGizmoSlaSupports::on_render() const m_parent.get_shader().stop_using(); } // Show/hide the original object - m_parent.toggle_model_objects_visibility(! m_c->m_cavity_mesh, m_c->m_model_object, m_c->m_active_instance); - m_parent.toggle_sla_auxiliaries_visibility(bool(m_c->m_cavity_mesh), m_c->m_model_object, m_c->m_active_instance); + //m_parent.toggle_model_objects_visibility(! m_editing_mode && ! m_c->m_cavity_mesh, m_c->m_model_object, m_c->m_active_instance); + //m_parent.toggle_sla_auxiliaries_visibility(! m_editing_mode, m_c->m_model_object, m_c->m_active_instance); m_z_shift = selection.get_volume(*selection.get_volume_idxs().begin())->get_sla_shift_z(); @@ -967,12 +967,6 @@ RENDER_AGAIN: m_imgui->end(); - // Make sure that the supports are (not) visible as they should be. This - // is done on each refresh because the user can switch the editing mode - // before background process finishes. - force_refresh = m_parent.toggle_sla_auxiliaries_visibility( - ! m_editing_mode, m_c->m_model_object, m_c->m_active_instance); - if (remove_selected || remove_all) { force_refresh = false; m_parent.set_as_dirty(); @@ -1052,8 +1046,9 @@ void GLGizmoSlaSupports::on_set_state() reload_cache(); m_parent.toggle_model_objects_visibility(false); - if (m_c->m_model_object) + if (m_c->m_model_object && ! m_c->m_cavity_mesh) m_parent.toggle_model_objects_visibility(true, m_c->m_model_object, m_c->m_active_instance); + m_parent.toggle_sla_auxiliaries_visibility(! m_editing_mode, m_c->m_model_object, m_c->m_active_instance); // Set default head diameter from config. const DynamicPrintConfig& cfg = wxGetApp().preset_bundle->sla_prints.get_edited_preset().config; @@ -1305,6 +1300,9 @@ void GLGizmoSlaSupports::switch_to_editing_mode() for (const sla::SupportPoint& sp : m_normal_cache) m_editing_cache.emplace_back(sp); select_point(NoPoints); + + m_parent.toggle_sla_auxiliaries_visibility(false, m_c->m_model_object, m_c->m_active_instance); + m_parent.set_as_dirty(); } @@ -1313,6 +1311,8 @@ void GLGizmoSlaSupports::disable_editing_mode() if (m_editing_mode) { m_editing_mode = false; wxGetApp().plater()->leave_gizmos_stack(); + m_parent.toggle_sla_auxiliaries_visibility(true, m_c->m_model_object, m_c->m_active_instance); + m_parent.set_as_dirty(); } } From d9786f2bcddf2d79aead22354b7b8ca99d5736fd Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Thu, 16 Jan 2020 13:08:37 +0100 Subject: [PATCH 127/336] Fixed SLA gizmos picking problem - hollowed mesh was not rendered for picking --- src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp | 28 +++++++++++------- src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp | 1 + src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp | 31 ++++++++++++-------- src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp | 1 + 4 files changed, 38 insertions(+), 23 deletions(-) diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp index a832b5e5c0..d02fdd0776 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp @@ -115,6 +115,23 @@ void GLGizmoHollow::on_render() const glsafe(::glEnable(GL_BLEND)); glsafe(::glEnable(GL_DEPTH_TEST)); + m_z_shift = selection.get_volume(*selection.get_volume_idxs().begin())->get_sla_shift_z(); + + render_hollowed_mesh(); + + if (m_quadric != nullptr && selection.is_from_single_instance()) + render_points(selection, false); + + m_selection_rectangle.render(m_parent); + render_clipping_plane(selection); + + glsafe(::glDisable(GL_BLEND)); +} + + + +void GLGizmoHollow::render_hollowed_mesh() const +{ if (m_c->m_volume_with_cavity) { m_c->m_volume_with_cavity->set_sla_shift_z(m_z_shift); m_parent.get_shader().start_using(); @@ -132,16 +149,6 @@ void GLGizmoHollow::on_render() const m_c->m_volume_with_cavity->render(color_id, print_box_detection_id, print_box_worldmatrix_id); m_parent.get_shader().stop_using(); } - - m_z_shift = selection.get_volume(*selection.get_volume_idxs().begin())->get_sla_shift_z(); - - if (m_quadric != nullptr && selection.is_from_single_instance()) - render_points(selection, false); - - m_selection_rectangle.render(m_parent); - render_clipping_plane(selection); - - glsafe(::glDisable(GL_BLEND)); } @@ -241,6 +248,7 @@ void GLGizmoHollow::on_render_for_picking() const glsafe(::glEnable(GL_DEPTH_TEST)); render_points(selection, true); + render_hollowed_mesh(); } void GLGizmoHollow::render_points(const Selection& selection, bool picking) const diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp index b6a125972a..f6560c861e 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp @@ -52,6 +52,7 @@ private: void render_points(const Selection& selection, bool picking = false) const; void render_clipping_plane(const Selection& selection) const; + void render_hollowed_mesh() const; bool is_mesh_update_necessary() const; void update_mesh(); void hollow_mesh(); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp index 45a766ccc1..c6e0d9007b 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp @@ -126,6 +126,23 @@ void GLGizmoSlaSupports::on_render() const glsafe(::glEnable(GL_BLEND)); glsafe(::glEnable(GL_DEPTH_TEST)); + m_z_shift = selection.get_volume(*selection.get_volume_idxs().begin())->get_sla_shift_z(); + + render_hollowed_mesh(); + + if (m_quadric != nullptr && selection.is_from_single_instance()) + render_points(selection, false); + + m_selection_rectangle.render(m_parent); + render_clipping_plane(selection); + + glsafe(::glDisable(GL_BLEND)); +} + + + +void GLGizmoSlaSupports::render_hollowed_mesh() const +{ if (m_c->m_volume_with_cavity) { m_c->m_volume_with_cavity->set_sla_shift_z(m_z_shift); m_parent.get_shader().start_using(); @@ -143,19 +160,6 @@ void GLGizmoSlaSupports::on_render() const m_c->m_volume_with_cavity->render(color_id, print_box_detection_id, print_box_worldmatrix_id); m_parent.get_shader().stop_using(); } - // Show/hide the original object - //m_parent.toggle_model_objects_visibility(! m_editing_mode && ! m_c->m_cavity_mesh, m_c->m_model_object, m_c->m_active_instance); - //m_parent.toggle_sla_auxiliaries_visibility(! m_editing_mode, m_c->m_model_object, m_c->m_active_instance); - - m_z_shift = selection.get_volume(*selection.get_volume_idxs().begin())->get_sla_shift_z(); - - if (m_quadric != nullptr && selection.is_from_single_instance()) - render_points(selection, false); - - m_selection_rectangle.render(m_parent); - render_clipping_plane(selection); - - glsafe(::glDisable(GL_BLEND)); } @@ -256,6 +260,7 @@ void GLGizmoSlaSupports::on_render_for_picking() const glsafe(::glEnable(GL_DEPTH_TEST)); render_points(selection, true); + render_hollowed_mesh(); } void GLGizmoSlaSupports::render_points(const Selection& selection, bool picking) const diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp index 7700ad3a61..3697e7af69 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp @@ -90,6 +90,7 @@ private: //void render_selection_rectangle() const; void render_points(const Selection& selection, bool picking = false) const; void render_clipping_plane(const Selection& selection) const; + void render_hollowed_mesh() const; bool is_mesh_update_necessary() const; void update_mesh(); bool unsaved_changes() const; From 79e546816da97356fa0f4f74797048fc30aa926a Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Thu, 16 Jan 2020 14:03:43 +0100 Subject: [PATCH 128/336] Fixed unit test (sla_print_tests - random number generator seeding) --- tests/sla_print/sla_print_tests.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/sla_print/sla_print_tests.cpp b/tests/sla_print/sla_print_tests.cpp index b08c931e31..f34fb90968 100644 --- a/tests/sla_print/sla_print_tests.cpp +++ b/tests/sla_print/sla_print_tests.cpp @@ -127,6 +127,7 @@ TEST_CASE("Support point generator should be deterministic if seeded", for (int i = 0; i < 20; ++i) { point_gen.output().clear(); + point_gen.seed(0); point_gen.execute(slices, slicegrid); REQUIRE(point_gen.output().size() == ptnum); REQUIRE(checksum == get_chksum(point_gen.output())); From fada7224f17a189d5ea749633da16b81cb35a9e2 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Thu, 16 Jan 2020 13:20:17 +0100 Subject: [PATCH 129/336] MeshBooleans with CGAL only --- sandboxes/CMakeLists.txt | 2 +- sandboxes/meshboolean/CMakeLists.txt | 8 +- sandboxes/meshboolean/MeshBoolean.cpp | 131 +++++++++++------------ src/libslic3r/MeshBoolean.cpp | 143 ++++++++++++++++++++++---- src/libslic3r/MeshBoolean.hpp | 21 ++++ 5 files changed, 209 insertions(+), 96 deletions(-) diff --git a/sandboxes/CMakeLists.txt b/sandboxes/CMakeLists.txt index 181c70d48e..a2bd13bb0b 100644 --- a/sandboxes/CMakeLists.txt +++ b/sandboxes/CMakeLists.txt @@ -1,4 +1,4 @@ #add_subdirectory(slasupporttree) #add_subdirectory(openvdb) -#add_subdirectory(meshboolean) +add_subdirectory(meshboolean) add_subdirectory(opencsg) diff --git a/sandboxes/meshboolean/CMakeLists.txt b/sandboxes/meshboolean/CMakeLists.txt index 17e876573b..55fb42fd14 100644 --- a/sandboxes/meshboolean/CMakeLists.txt +++ b/sandboxes/meshboolean/CMakeLists.txt @@ -1,12 +1,6 @@ -if (SLIC3R_STATIC) - set(CGAL_Boost_USE_STATIC_LIBS ON) -endif () - -find_package(CGAL REQUIRED) - add_executable(meshboolean MeshBoolean.cpp) -target_link_libraries(meshboolean libslic3r CGAL::CGAL) +target_link_libraries(meshboolean libslic3r) if (WIN32) prusaslicer_copy_dlls(meshboolean) diff --git a/sandboxes/meshboolean/MeshBoolean.cpp b/sandboxes/meshboolean/MeshBoolean.cpp index 1aaa4d2b8b..3fd45ccffd 100644 --- a/sandboxes/meshboolean/MeshBoolean.cpp +++ b/sandboxes/meshboolean/MeshBoolean.cpp @@ -1,85 +1,76 @@ -#include -#undef PI -#include -//#undef IGL_STATIC_LIBRARY -#include - -#include #include +#include -#include +#include +#include +#include +#include +#include + +#include -#include #include namespace Slic3r { -bool its_write_obj(const Eigen::MatrixXd &V, Eigen::MatrixXi &F, const char *file) -{ - - FILE *fp = boost::nowide::fopen(file, "w"); - if (fp == nullptr) { - BOOST_LOG_TRIVIAL(error) << "stl_write_obj: Couldn't open " << file << " for writing"; - return false; - } - - for (size_t i = 0; i < V.rows(); ++ i) - fprintf(fp, "v %lf %lf %lf\n", V(i, 0), V(i, 1), V(i, 2)); - for (size_t i = 0; i < F.rows(); ++ i) - fprintf(fp, "f %d %d %d\n", F(i, 0) + 1, F(i, 1) + 1, F(i, 2) + 1); - fclose(fp); - return true; -} - -void mesh_boolean_test(const std::string &fname) -{ - using namespace Eigen; - using namespace std; -// igl::readOFF(TUTORIAL_SHARED_PATH "/cheburashka.off",VA,FA); -// igl::readOFF(TUTORIAL_SHARED_PATH "/decimated-knight.off",VB,FB); - // Plot the mesh with pseudocolors -// igl::opengl::glfw::Viewer viewer; - - // Initialize -// update(viewer); - - //igl::copyleft::cgal::mesh_boolean(VA,FA,VB,FB,boolean_type,VC,FC,J); - - - std::cout << fname.c_str() << std::endl; - TriangleMesh mesh; - - mesh.ReadSTLFile(fname.c_str()); - mesh.repair(true); - its_write_obj(mesh.its, (fname + "-imported0.obj").c_str()); - - - Eigen::MatrixXd VA,VB,VC; - Eigen::VectorXi J,I; - Eigen::MatrixXi FA,FB,FC; - igl::MeshBooleanType boolean_type(igl::MESH_BOOLEAN_TYPE_UNION); - - - typedef Eigen::Map> MapMatrixXfUnaligned; - typedef Eigen::Map> MapMatrixXiUnaligned; - - Eigen::MatrixXd V = MapMatrixXfUnaligned(mesh.its.vertices.front().data(), mesh.its.vertices.size(), 3).cast(); - Eigen::MatrixXi F = MapMatrixXiUnaligned(mesh.its.indices.front().data(), mesh.its.indices.size(), 3); - - its_write_obj(V, F, (fname + "-imported.obj").c_str()); - // Self-union to clean up - igl::copyleft::cgal::mesh_boolean(V, F, Eigen::MatrixXd(), Eigen::MatrixXi(), boolean_type, VC, FC); - - its_write_obj(VC, FC, (fname + "-fixed.obj").c_str()); -} - } // namespace Slic3r int main(const int argc, const char * argv[]) { - if (argc < 1) return -1; + using namespace Slic3r; - Slic3r::mesh_boolean_test(argv[1]); + if (argc < 1) return EXIT_FAILURE; + + DynamicPrintConfig cfg; + auto model = Model::read_from_file(argv[1], &cfg); + + if (model.objects.empty()) return EXIT_SUCCESS; + + SLAPrint print; + print.apply(model, cfg); + PrintBase::TaskParams task; + task.to_object_step = slaposHollowing; + + print.set_task(task); + print.process(); + + Benchmark bench; + + for (SLAPrintObject *po : print.objects()) { + TriangleMesh holes; + sla::DrainHoles holepts = po->transformed_drainhole_points(); + + for (auto &hole: holepts) + holes.merge(sla::to_triangle_mesh(hole.to_mesh())); + + TriangleMesh hollowed_mesh = po->transformed_mesh(); + hollowed_mesh.merge(po->hollowed_interior_mesh()); + + hollowed_mesh.require_shared_vertices(); + holes.require_shared_vertices(); + + TriangleMesh drilled_mesh_igl = hollowed_mesh; + bench.start(); + MeshBoolean::minus(drilled_mesh_igl, holes); + bench.stop(); + + std::cout << "Mesh boolean duration with IGL: " << bench.getElapsedSec() << std::endl; + + TriangleMesh drilled_mesh_cgal = hollowed_mesh; + bench.start(); + MeshBoolean::cgal::self_union(drilled_mesh_cgal); + MeshBoolean::cgal::minus(drilled_mesh_cgal, holes); + bench.stop(); + + std::cout << "Mesh boolean duration with CGAL: " << bench.getElapsedSec() << std::endl; + + std::string name("obj"), outf; + outf = name + "igl" + std::to_string(po->model_object()->id().id) + ".obj"; + drilled_mesh_igl.WriteOBJFile(outf.c_str()); + + outf = name + "cgal" + std::to_string(po->model_object()->id().id) + ".obj"; + drilled_mesh_cgal.WriteOBJFile(outf.c_str()); + } return 0; } diff --git a/src/libslic3r/MeshBoolean.cpp b/src/libslic3r/MeshBoolean.cpp index e639319a20..69db96d3fc 100644 --- a/src/libslic3r/MeshBoolean.cpp +++ b/src/libslic3r/MeshBoolean.cpp @@ -1,11 +1,15 @@ #include "MeshBoolean.hpp" +#include "libslic3r/TriangleMesh.hpp" +#undef PI // Include igl first. It defines "L" macro which then clashes with our localization #include #undef L -#include "libslic3r/TriangleMesh.hpp" - +// CGAL headers +#include +#include +#include namespace Slic3r { namespace MeshBoolean { @@ -13,27 +17,41 @@ namespace MeshBoolean { typedef Eigen::Map> MapMatrixXfUnaligned; typedef Eigen::Map> MapMatrixXiUnaligned; +typedef std::pair EigenMesh; + static TriangleMesh eigen_to_triangle_mesh(const Eigen::MatrixXd& VC, const Eigen::MatrixXi& FC) { - Pointf3s vertices; - for (size_t i=0; i facets; - for (size_t i=0; i facets(size_t(FC.rows())); + + for (Eigen::Index i = 0; i < VC.rows(); ++i) + points[size_t(i)] = VC.row(i); + + for (Eigen::Index i = 0; i < FC.rows(); ++i) + facets[size_t(i)] = FC.row(i); + + TriangleMesh out{points, facets}; out.require_shared_vertices(); return out; } +static EigenMesh triangle_mesh_to_eigen_mesh(const TriangleMesh &mesh) +{ + EigenMesh emesh; + emesh.first = MapMatrixXfUnaligned(mesh.its.vertices.front().data(), + Eigen::Index(mesh.its.vertices.size()), + 3).cast(); + + emesh.second = MapMatrixXiUnaligned(mesh.its.indices.front().data(), + Eigen::Index(mesh.its.indices.size()), + 3); + return emesh; +} + void minus(TriangleMesh& A, const TriangleMesh& B) { - Eigen::MatrixXd VA = MapMatrixXfUnaligned(A.its.vertices.front().data(), A.its.vertices.size(), 3).cast(); - Eigen::MatrixXi FA = MapMatrixXiUnaligned(A.its.indices.front().data(), A.its.indices.size(), 3); - Eigen::MatrixXd VB = MapMatrixXfUnaligned(B.its.vertices.front().data(), B.its.vertices.size(), 3).cast(); - Eigen::MatrixXi FB = MapMatrixXiUnaligned(B.its.indices.front().data(), B.its.indices.size(), 3); + auto [VA, FA] = triangle_mesh_to_eigen_mesh(A); + auto [VB, FB] = triangle_mesh_to_eigen_mesh(B); Eigen::MatrixXd VC; Eigen::MatrixXi FC; @@ -43,21 +61,110 @@ void minus(TriangleMesh& A, const TriangleMesh& B) A = eigen_to_triangle_mesh(VC, FC); } - void self_union(TriangleMesh& mesh) { - Eigen::MatrixXd V = MapMatrixXfUnaligned(mesh.its.vertices.front().data(), mesh.its.vertices.size(), 3).cast(); - Eigen::MatrixXi F = MapMatrixXiUnaligned(mesh.its.indices.front().data(), mesh.its.indices.size(), 3); + auto [V, F] = triangle_mesh_to_eigen_mesh(mesh); Eigen::MatrixXd VC; Eigen::MatrixXi FC; igl::MeshBooleanType boolean_type(igl::MESH_BOOLEAN_TYPE_UNION); igl::copyleft::cgal::mesh_boolean(V, F, Eigen::MatrixXd(), Eigen::MatrixXi(), boolean_type, VC, FC); + mesh = eigen_to_triangle_mesh(VC, FC); } +namespace cgal { +namespace CGALProc = CGAL::Polygon_mesh_processing; +namespace CGALParams = CGAL::Polygon_mesh_processing::parameters; + +using Kernel = CGAL::Exact_predicates_inexact_constructions_kernel; +using _CGALMesh = CGAL::Surface_mesh; + +struct CGALMesh { _CGALMesh m; }; + +static void triangle_mesh_to_cgal(const TriangleMesh &M, _CGALMesh &out) +{ + for (const Vec3f &v : M.its.vertices) + out.add_vertex(_CGALMesh::Point(v.x(), v.y(), v.z())); + + for (const Vec3crd &face : M.its.indices) { + auto f = face.cast(); + out.add_face(f(0), f(1), f(2)); + } +} + +static TriangleMesh cgal_to_triangle_mesh(const _CGALMesh &cgalmesh) +{ + Pointf3s points; + std::vector facets; + points.reserve(cgalmesh.num_vertices()); + facets.reserve(cgalmesh.num_faces()); + + for (auto &vi : cgalmesh.vertices()) { + auto &v = cgalmesh.point(vi); // Don't ask... + points.emplace_back(v.x(), v.y(), v.z()); + } + + for (auto &face : cgalmesh.faces()) { + auto vtc = cgalmesh.vertices_around_face(cgalmesh.halfedge(face)); + int i = 0; + Vec3crd trface; + for (auto v : vtc) trface(i++) = int(v.idx()); + facets.emplace_back(trface); + } + + TriangleMesh out{points, facets}; + out.require_shared_vertices(); + return out; +} + +std::unique_ptr triangle_mesh_to_cgal(const TriangleMesh &M) +{ + auto out = std::make_unique(); + triangle_mesh_to_cgal(M, out->m); + return out; +} + +void cgal_to_triangle_mesh(const CGALMesh &cgalmesh, TriangleMesh &out) +{ + out = cgal_to_triangle_mesh(cgalmesh.m); +} + +void minus(CGALMesh &A, CGALMesh &B) +{ + CGALProc::corefine_and_compute_difference(A.m, B.m, A.m); +} + +void self_union(CGALMesh &A) +{ + CGALProc::corefine(A.m, A.m); +} + +void minus(TriangleMesh &A, const TriangleMesh &B) +{ + CGALMesh meshA; + CGALMesh meshB; + triangle_mesh_to_cgal(A, meshA.m); + triangle_mesh_to_cgal(B, meshB.m); + + CGALMesh meshResult; + CGALProc::corefine_and_compute_difference(meshA.m, meshB.m, meshResult.m); + + A = cgal_to_triangle_mesh(meshResult.m); +} + +void self_union(TriangleMesh &m) +{ + _CGALMesh cgalmesh; + triangle_mesh_to_cgal(m, cgalmesh); + CGALProc::corefine(cgalmesh, cgalmesh); + + m = cgal_to_triangle_mesh(cgalmesh); +} + +} // namespace cgal } // namespace MeshBoolean } // namespace Slic3r diff --git a/src/libslic3r/MeshBoolean.hpp b/src/libslic3r/MeshBoolean.hpp index 783bde3f58..14e3d3b7b2 100644 --- a/src/libslic3r/MeshBoolean.hpp +++ b/src/libslic3r/MeshBoolean.hpp @@ -1,6 +1,7 @@ #ifndef libslic3r_MeshBoolean_hpp_ #define libslic3r_MeshBoolean_hpp_ +#include namespace Slic3r { @@ -11,6 +12,26 @@ namespace MeshBoolean { void minus(TriangleMesh& A, const TriangleMesh& B); void self_union(TriangleMesh& mesh); +namespace cgal { + +struct CGALMesh; + +std::unique_ptr triangle_mesh_to_cgal(const TriangleMesh &M); +void cgal_to_triangle_mesh(const CGALMesh &cgalmesh, TriangleMesh &out); + +// Do boolean mesh difference with CGAL bypassing igl. +void minus(TriangleMesh &A, const TriangleMesh &B); + +// Do self union only with CGAL. +void self_union(TriangleMesh& mesh); + +// does A = A - B +// CGAL takes non-const objects as arguments. I suppose it doesn't change B but +// there is no official garantee. +void minus(CGALMesh &A, CGALMesh &B); +void self_union(CGALMesh &A); + +} } // namespace MeshBoolean } // namespace Slic3r From a1dc7a5c41102c991bab3aed0682cef7d7a9582a Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Thu, 16 Jan 2020 14:25:01 +0100 Subject: [PATCH 130/336] Fix build issues on Windows --- CMakeLists.txt | 1 + cmake/modules/FindOpenVDB.cmake | 2 +- sandboxes/meshboolean/MeshBoolean.cpp | 2 +- sandboxes/opencsg/CMakeLists.txt | 1 + 4 files changed, 4 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 218e53add6..a3c2eca123 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -426,6 +426,7 @@ endif() find_package(OpenVDB 5.0 REQUIRED COMPONENTS openvdb) if(OpenVDB_FOUND) slic3r_remap_configs(IlmBase::Half RelWithDebInfo Release) + slic3r_remap_configs(Blosc::blosc RelWithDebInfo Release) endif() set(TOP_LEVEL_PROJECT_DIR ${PROJECT_SOURCE_DIR}) diff --git a/cmake/modules/FindOpenVDB.cmake b/cmake/modules/FindOpenVDB.cmake index 7bc44bebb5..b9d19ed1eb 100644 --- a/cmake/modules/FindOpenVDB.cmake +++ b/cmake/modules/FindOpenVDB.cmake @@ -247,7 +247,7 @@ foreach(COMPONENT ${OpenVDB_FIND_COMPONENTS}) set(OpenVDB_${COMPONENT}_LIBRARY ${OpenVDB_${COMPONENT}_LIBRARY_${_BUILD_TYPE}}) - if (NOT MSVC AND NOT OpenVDB_${COMPONENT}_LIBRARY) + if (NOT OpenVDB_${COMPONENT}_LIBRARY) set(OpenVDB_${COMPONENT}_LIBRARY ${OpenVDB_${COMPONENT}_LIBRARY_RELEASE}) endif () diff --git a/sandboxes/meshboolean/MeshBoolean.cpp b/sandboxes/meshboolean/MeshBoolean.cpp index 3fd45ccffd..d339ef5c30 100644 --- a/sandboxes/meshboolean/MeshBoolean.cpp +++ b/sandboxes/meshboolean/MeshBoolean.cpp @@ -19,7 +19,7 @@ int main(const int argc, const char * argv[]) { using namespace Slic3r; - if (argc < 1) return EXIT_FAILURE; + if (argc <= 1) return EXIT_FAILURE; DynamicPrintConfig cfg; auto model = Model::read_from_file(argv[1], &cfg); diff --git a/sandboxes/opencsg/CMakeLists.txt b/sandboxes/opencsg/CMakeLists.txt index e9a51b0f4e..ec1f4cae91 100644 --- a/sandboxes/opencsg/CMakeLists.txt +++ b/sandboxes/opencsg/CMakeLists.txt @@ -20,6 +20,7 @@ target_link_libraries(opencsg_example libslic3r) target_include_directories(opencsg_example PRIVATE ${wxWidgets_INCLUDE_DIRS}) target_compile_definitions(opencsg_example PRIVATE ${wxWidgets_DEFINITIONS}) +slic3r_remap_configs(OpenCSG::opencsg RelWithDebInfo Release) target_link_libraries(opencsg_example ${wxWidgets_LIBRARIES} OpenCSG::opencsg GLEW::GLEW From ea6844c31da7f31980cc3265e8d170dc8dd5608b Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Thu, 16 Jan 2020 15:19:46 +0100 Subject: [PATCH 131/336] Follow up for Windows build fixes --- cmake/modules/FindOpenVDB.cmake | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/cmake/modules/FindOpenVDB.cmake b/cmake/modules/FindOpenVDB.cmake index b9d19ed1eb..6d3bc06ec8 100644 --- a/cmake/modules/FindOpenVDB.cmake +++ b/cmake/modules/FindOpenVDB.cmake @@ -242,6 +242,8 @@ foreach(COMPONENT ${OpenVDB_FIND_COMPONENTS}) else() set(OpenVDB_${COMPONENT}_FOUND FALSE) endif() + + set(OpenVDB_${COMPONENT}_LIBRARY ${OpenVDB_${COMPONENT}_LIBRARY_RELEASE}) else () string(TOUPPER "${CMAKE_BUILD_TYPE}" _BUILD_TYPE) @@ -259,6 +261,7 @@ foreach(COMPONENT ${OpenVDB_FIND_COMPONENTS}) set(OpenVDB_${COMPONENT}_FOUND FALSE) endif() endif () + endforeach() if(UNIX AND OPENVDB_USE_STATIC_LIBS) @@ -522,18 +525,17 @@ foreach(COMPONENT ${OpenVDB_FIND_COMPONENTS}) IMPORTED_LINK_DEPENDENT_LIBRARIES "${_OPENVDB_HIDDEN_DEPENDENCIES}" # non visible deps INTERFACE_LINK_LIBRARIES "${_OPENVDB_VISIBLE_DEPENDENCIES}" # visible deps (headers) INTERFACE_COMPILE_FEATURES cxx_std_11 - ) - - if (_is_multi) - set_target_properties(OpenVDB::${COMPONENT} PROPERTIES + IMPORTED_LOCATION "${OpenVDB_${COMPONENT}_LIBRARY}" IMPORTED_LOCATION_RELEASE "${OpenVDB_${COMPONENT}_LIBRARY_RELEASE}" IMPORTED_LOCATION_DEBUG "${OpenVDB_${COMPONENT}_LIBRARY_DEBUG}" - ) - else () - set_target_properties(OpenVDB::${COMPONENT} PROPERTIES - IMPORTED_LOCATION "${OpenVDB_${COMPONENT}_LIBRARY}" - ) - endif () + ) + + # if (_is_multi) + # set_target_properties(OpenVDB::${COMPONENT} PROPERTIES + # IMPORTED_LOCATION_RELEASE "${OpenVDB_${COMPONENT}_LIBRARY_RELEASE}" + # IMPORTED_LOCATION_DEBUG "${OpenVDB_${COMPONENT}_LIBRARY_DEBUG}" + # ) + # endif () if (OPENVDB_USE_STATIC_LIBS) set_target_properties(OpenVDB::${COMPONENT} PROPERTIES From 70ecb634b7e6bd29cf69b791abf92f3b819a5301 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Thu, 16 Jan 2020 15:38:59 +0100 Subject: [PATCH 132/336] fix gui artifacts on Windows --- sandboxes/opencsg/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sandboxes/opencsg/main.cpp b/sandboxes/opencsg/main.cpp index ec6c01789a..adf9cc457f 100644 --- a/sandboxes/opencsg/main.cpp +++ b/sandboxes/opencsg/main.cpp @@ -445,7 +445,7 @@ void MyFrame::activate_canvas_display() m_canvas->Bind(wxEVT_PAINT, [this](wxPaintEvent &) { // This is required even though dc is not used otherwise. - wxPaintDC dc(this); + wxPaintDC dc(m_canvas.get()); const wxSize csize = m_canvas->GetClientSize(); m_canvas->get_display()->set_screen_size(csize.x, csize.y); m_canvas->get_display()->repaint(); From 49678fe418c8bbdfcd60cc0996a0e2c4f9b44033 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Fri, 17 Jan 2020 12:45:46 +0100 Subject: [PATCH 133/336] Fix FindOpenVDB on Linux --- cmake/modules/FindOpenVDB.cmake | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/cmake/modules/FindOpenVDB.cmake b/cmake/modules/FindOpenVDB.cmake index 6d3bc06ec8..3e9e5f082a 100644 --- a/cmake/modules/FindOpenVDB.cmake +++ b/cmake/modules/FindOpenVDB.cmake @@ -526,16 +526,14 @@ foreach(COMPONENT ${OpenVDB_FIND_COMPONENTS}) INTERFACE_LINK_LIBRARIES "${_OPENVDB_VISIBLE_DEPENDENCIES}" # visible deps (headers) INTERFACE_COMPILE_FEATURES cxx_std_11 IMPORTED_LOCATION "${OpenVDB_${COMPONENT}_LIBRARY}" - IMPORTED_LOCATION_RELEASE "${OpenVDB_${COMPONENT}_LIBRARY_RELEASE}" - IMPORTED_LOCATION_DEBUG "${OpenVDB_${COMPONENT}_LIBRARY_DEBUG}" ) - # if (_is_multi) - # set_target_properties(OpenVDB::${COMPONENT} PROPERTIES - # IMPORTED_LOCATION_RELEASE "${OpenVDB_${COMPONENT}_LIBRARY_RELEASE}" - # IMPORTED_LOCATION_DEBUG "${OpenVDB_${COMPONENT}_LIBRARY_DEBUG}" - # ) - # endif () + if (_is_multi) + set_target_properties(OpenVDB::${COMPONENT} PROPERTIES + IMPORTED_LOCATION_RELEASE "${OpenVDB_${COMPONENT}_LIBRARY_RELEASE}" + IMPORTED_LOCATION_DEBUG "${OpenVDB_${COMPONENT}_LIBRARY_DEBUG}" + ) + endif () if (OPENVDB_USE_STATIC_LIBS) set_target_properties(OpenVDB::${COMPONENT} PROPERTIES From d8f2c8cdab10247fe54421bc3aaf46f668ad81a3 Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Fri, 17 Jan 2020 16:01:49 +0100 Subject: [PATCH 134/336] Fixed a bug in the hole-aware raycaster --- src/libslic3r/SLA/Hollowing.cpp | 5 ++++- tests/sla_print/sla_raycast_tests.cpp | 32 +++++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/src/libslic3r/SLA/Hollowing.cpp b/src/libslic3r/SLA/Hollowing.cpp index 8dc2d30929..5ab85c1cc4 100644 --- a/src/libslic3r/SLA/Hollowing.cpp +++ b/src/libslic3r/SLA/Hollowing.cpp @@ -223,7 +223,10 @@ bool DrainHole::get_intersections(const Vec3f& s, const Vec3f& dir, // they are on the cylinder and not past it: for (int i=-1; i<=1 && found !=2; i+=2) { Vec3f isect = closest + i*dist * projected_ray.direction(); - float par = (isect-proj_origin).norm() / par_scale; + Vec3f to_isect = isect-proj_origin; + float par = to_isect.norm() / par_scale; + if (to_isect.normalized().dot(proj_dir.normalized()) < 0.f) + par *= -1.f; Vec3d hit_normal = (pos-isect).normalized().cast(); isect = ray.pointAt(par); // check that the intersection is between the base planes: diff --git a/tests/sla_print/sla_raycast_tests.cpp b/tests/sla_print/sla_raycast_tests.cpp index 4a994f2a93..74c7994723 100644 --- a/tests/sla_print/sla_raycast_tests.cpp +++ b/tests/sla_print/sla_raycast_tests.cpp @@ -8,6 +8,38 @@ using namespace Slic3r; +// First do a simple test of the hole raycaster. +TEST_CASE("Raycaster - find intersections of a line and cylinder") +{ + sla::DrainHole hole{Vec3f(0,0,0), Vec3f(0,0,1), 5, 10}; + std::array, 2> out; + Vec3f s; + Vec3f dir; + + // Start inside the hole and cast perpendicular to its axis. + s = {-1.f, 0, 5.f}; + dir = {1.f, 0, 0}; + hole.get_intersections(s, dir, out); + REQUIRE(out[0].first == Approx(-4.f)); + REQUIRE(out[1].first == Approx(6.f)); + + // Start outside and cast parallel to axis. + s = {0, 0, -1.f}; + dir = {0, 0, 1.f}; + hole.get_intersections(s, dir, out); + REQUIRE(std::abs(out[0].first - 1.f) < 0.001f); + REQUIRE(std::abs(out[1].first - 11.f) < 0.001f); + + // Start outside and cast so that entry is in base and exit on the cylinder + s = {0, -1.f, -1.f}; + dir = {0, 1.f, 1.f}; + dir.normalize(); + hole.get_intersections(s, dir, out); + REQUIRE(std::abs(out[0].first - std::sqrt(2.f)) < 0.001f); + REQUIRE(std::abs(out[1].first - std::sqrt(72.f)) < 0.001f); +} + + // Create a simple scene with a 20mm cube and a big hole in the front wall // with 5mm radius. Then shoot rays from interesting positions and see where // they land. From ce34ae471650947216c820e4f6a6caf9600f7740 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Mon, 20 Jan 2020 10:38:40 +0100 Subject: [PATCH 135/336] Try to fix libatomic linkage on raspbian --- src/libslic3r/CMakeLists.txt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/libslic3r/CMakeLists.txt b/src/libslic3r/CMakeLists.txt index 8a3817b95e..f31c1a2b9c 100644 --- a/src/libslic3r/CMakeLists.txt +++ b/src/libslic3r/CMakeLists.txt @@ -262,6 +262,12 @@ target_link_libraries(libslic3r ${CMAKE_DL_LIBS} ) + +find_library(CXX_ATOMIC_LIBRARY atomic) +if (CXX_ATOMIC_LIBRARY) + target_link_libraries(libslic3r ${CXX_ATOMIC_LIBRARY}) +endif() + if (TARGET OpenVDB::openvdb) target_link_libraries(libslic3r OpenVDB::openvdb) endif() From 6cfad6848f06bbb8926eecce46aca3cd56a5ae01 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Mon, 20 Jan 2020 11:20:18 +0100 Subject: [PATCH 136/336] Fix incorrect filename case in test_3mf --- tests/libslic3r/test_3mf.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/libslic3r/test_3mf.cpp b/tests/libslic3r/test_3mf.cpp index 5215e2ebd2..f3e30ea615 100644 --- a/tests/libslic3r/test_3mf.cpp +++ b/tests/libslic3r/test_3mf.cpp @@ -26,7 +26,7 @@ SCENARIO("Export+Import geometry to/from 3mf file cycle", "[3mf]") { GIVEN("world vertices coordinates before save") { // load a model from stl file Model src_model; - std::string src_file = std::string(TEST_DATA_DIR) + "/test_3mf/prusa.stl"; + std::string src_file = std::string(TEST_DATA_DIR) + "/test_3mf/Prusa.stl"; load_stl(src_file.c_str(), &src_model); src_model.add_default_instances(); From 87f2578ee71c9baa13dcfc09c1afb4d751cb2ed3 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Mon, 20 Jan 2020 12:50:48 +0100 Subject: [PATCH 137/336] Try to fix libatomic linkage on raspbian SPE-1073 --- src/libslic3r/CMakeLists.txt | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/libslic3r/CMakeLists.txt b/src/libslic3r/CMakeLists.txt index f31c1a2b9c..9245e5c2af 100644 --- a/src/libslic3r/CMakeLists.txt +++ b/src/libslic3r/CMakeLists.txt @@ -262,10 +262,8 @@ target_link_libraries(libslic3r ${CMAKE_DL_LIBS} ) - -find_library(CXX_ATOMIC_LIBRARY atomic) -if (CXX_ATOMIC_LIBRARY) - target_link_libraries(libslic3r ${CXX_ATOMIC_LIBRARY}) +if (NOT MSVC) + target_link_libraries(libslic3r atomic) # no cmake magic for this... endif() if (TARGET OpenVDB::openvdb) From 8d9cfa0e98078474c3305b3277d641a83977a93a Mon Sep 17 00:00:00 2001 From: David Kocik Date: Wed, 22 Jan 2020 10:03:58 +0100 Subject: [PATCH 138/336] resize of export_to_sd button --- resources/icons/export_to_sd.svg | 227 +++++++++++++++++-------------- src/slic3r/CMakeLists.txt | 3 +- 2 files changed, 126 insertions(+), 104 deletions(-) diff --git a/resources/icons/export_to_sd.svg b/resources/icons/export_to_sd.svg index c836b00a17..516cec4355 100644 --- a/resources/icons/export_to_sd.svg +++ b/resources/icons/export_to_sd.svg @@ -7,9 +7,9 @@ xmlns="http://www.w3.org/2000/svg" id="svg8" version="1.1" - viewBox="0 0 210 297" - height="297mm" - width="210mm"> + viewBox="0 0 3.7041666 3.7041667" + height="3.7041667mm" + width="3.7041667mm"> + + + + + + @@ -33,111 +47,120 @@ - - + transform="translate(-265.33929,12.851203)" + id="layer1-0"> + transform="matrix(1.31769,0,0,1.31769,-167.28747,-111.35623)" + id="layer1-3"> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + id="g4685" + transform="matrix(0.00352778,0,0,-0.00352778,105.26858,151.76571)"> + d="M 381.663,302.607 H 558.791 V 65.846 H 381.663 Z" + style="fill:#d8d8db;fill-opacity:1;fill-rule:nonzero;stroke:none" + id="path4687" /> + d="m 470.227,302.607 h 95.411 V 65.846 h -95.411 z" + style="fill:#f7f7f8;fill-opacity:1;fill-rule:nonzero;stroke:none" + id="path4689" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/slic3r/CMakeLists.txt b/src/slic3r/CMakeLists.txt index 751a1fcafe..8f38cb21b8 100644 --- a/src/slic3r/CMakeLists.txt +++ b/src/slic3r/CMakeLists.txt @@ -175,7 +175,6 @@ if (APPLE) GUI/RemovableDriveManagerMM.h GUI/Mouse3DHandlerMac.mm ) - #DK FIND_LIBRARY(DISKARBITRATION_LIBRARY DiskArbitration) endif () @@ -185,7 +184,7 @@ add_library(libslic3r_gui STATIC ${SLIC3R_GUI_SOURCES}) encoding_check(libslic3r_gui) target_link_libraries(libslic3r_gui libslic3r avrdude cereal imgui GLEW::GLEW OpenGL::GL OpenGL::GLU hidapi) -#DK + if(APPLE) target_link_libraries(libslic3r_gui ${DISKARBITRATION_LIBRARY}) endif() From cea7cbfaa09b6fb159bcb48e694271ed192b63a3 Mon Sep 17 00:00:00 2001 From: bubnikv Date: Wed, 22 Jan 2020 10:50:14 +0100 Subject: [PATCH 139/336] The print order for sequential print now corresponds to the order at the object list. Partial fix of https://github.com/prusa3d/PrusaSlicer/issues/3455 --- src/libslic3r/GCode.cpp | 51 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 49 insertions(+), 2 deletions(-) diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index 4cbab67a63..128ddca177 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -8,6 +8,7 @@ #include "GCode/WipeTower.hpp" #include "ShortestPath.hpp" #include "Utils.hpp" +#include "libslic3r.h" #include #include @@ -1086,6 +1087,52 @@ namespace DoExport { } } +// Sort the PrintObjects by their increasing Z, likely useful for avoiding colisions on Deltas during sequential prints. +static inline std::vector sort_objects_by_z(const Print &print) +{ + std::vector objects(print.objects().begin(), print.objects().end()); + std::sort(objects.begin(), objects.end(), [](const PrintObject* po1, const PrintObject* po2) { return po1->size(2) < po2->size(2); }); + return objects; +} + +// Produce a vector of PrintObjects in the order of their respective ModelObjects in print.model(). +static inline std::vector sort_objects_by_model_order(const Print &print) +{ + const Model &model = print.model(); + // Pair ModelObjects with PrintObjects, remember the order of ModelObjects in the model above. + struct ModelObjectOrder { + const ModelObject *model_object; + const PrintObject *print_object; + size_t order; + }; + // Initialize model_object_order with ModelObjects and their order. + std::vector model_object_order; + model_object_order.reserve(model.objects.size()); + { + size_t order = 0; + for (const ModelObject *model_object : model.objects) + model_object_order.emplace_back(ModelObjectOrder{ model_object, nullptr, order ++ }); + } + // Sort by pointer to ModelObject. + std::sort(model_object_order.begin(), model_object_order.end(), [](const ModelObjectOrder &lhs, const ModelObjectOrder &rhs) { return lhs.model_object < rhs.model_object; }); + // Assign PrintObject pointer to ModelObject. + for (const PrintObject *print_object : print.objects()) { + auto it = Slic3r::lower_bound_by_predicate(model_object_order.begin(), model_object_order.end(), [print_object](const ModelObjectOrder &model_object_order) { return model_object_order.model_object < print_object->model_object(); }); + // The non-printable objects (objects outside of the print volume or suppressed objects) will have no partner in the print.objects() list. + if (it != model_object_order.end() && it->model_object == print_object->model_object()) + it->print_object = print_object; + } + // Sort back to the initial order. + std::sort(model_object_order.begin(), model_object_order.end(), [](const ModelObjectOrder &lhs, const ModelObjectOrder &rhs) { return lhs.order < rhs.order; }); + // Produce the output vector of PrintObjects, sorted by the order of ModelObjects in Model. + std::vector objects; + objects.reserve(model_object_order.size()); + for (ModelObjectOrder &order : model_object_order) + if (order.print_object != nullptr) + objects.emplace_back(order.print_object); + return objects; +} + #if ENABLE_THUMBNAIL_GENERATOR void GCode::_do_export(Print& print, FILE* file, ThumbnailsGeneratorCallback thumbnail_cb) #else @@ -1318,8 +1365,8 @@ void GCode::_do_export(Print& print, FILE* file) if (print.config().complete_objects.value) { // Print objects from the smallest to the tallest to avoid collisions // when moving onto next object starting point. - std::vector objects(print.objects()); - std::sort(objects.begin(), objects.end(), [](const PrintObject* po1, const PrintObject* po2) { return po1->size(2) < po2->size(2); }); + std::vector objects = sort_objects_by_model_order(print); +// std::vector objects = sort_objects_by_z(print); size_t finished_objects = 0; for (size_t object_id = initial_print_object_id; object_id < objects.size(); ++ object_id) { const PrintObject &object = *objects[object_id]; From 29fa176d2762faf38e196715be93787a89fc5730 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Wed, 22 Jan 2020 15:00:59 +0100 Subject: [PATCH 140/336] DoubleSlider: Implemented code switch between ToolChangeCode and ColorChangeCode for MultiAsSingle mode --- src/slic3r/GUI/wxExtensions.cpp | 168 ++++++++++++++++++++------------ src/slic3r/GUI/wxExtensions.hpp | 7 +- 2 files changed, 108 insertions(+), 67 deletions(-) diff --git a/src/slic3r/GUI/wxExtensions.cpp b/src/slic3r/GUI/wxExtensions.cpp index 8f43f6c307..d4b207dc1e 100644 --- a/src/slic3r/GUI/wxExtensions.cpp +++ b/src/slic3r/GUI/wxExtensions.cpp @@ -3212,7 +3212,7 @@ void DoubleSlider::OnMotion(wxMouseEvent& event) } } -void DoubleSlider::append_change_extruder_menu_item(wxMenu* menu) +void DoubleSlider::append_change_extruder_menu_item(wxMenu* menu, bool switch_current_code/* = false*/) { const int extruders_cnt = Slic3r::GUI::wxGetApp().extruders_edited_cnt(); if (extruders_cnt > 1) @@ -3233,7 +3233,9 @@ void DoubleSlider::append_change_extruder_menu_item(wxMenu* menu) [is_active_extruder]() { return !is_active_extruder; }, Slic3r::GUI::wxGetApp().plater()); } - const wxString change_extruder_menu_name = m_mode == t_mode::MultiAsSingle ? _(L("Change extruder")) : _(L("Change extruder (N/A)")); + const wxString change_extruder_menu_name = m_mode == t_mode::MultiAsSingle ? + (switch_current_code ? _(L("Switch code to Change extruder")) : _(L("Change extruder")) ) : + _(L("Change extruder (N/A)")); wxMenuItem* change_extruder_menu_item = menu->AppendSubMenu(change_extruder_menu, change_extruder_menu_name, _(L("Use another extruder"))); change_extruder_menu_item->SetBitmap(create_scaled_bitmap(this, "change_extruder")); @@ -3244,7 +3246,7 @@ void DoubleSlider::append_change_extruder_menu_item(wxMenu* menu) } } -void DoubleSlider::append_add_color_change_menu_item(wxMenu* menu) +void DoubleSlider::append_add_color_change_menu_item(wxMenu* menu, bool switch_current_code/* = false*/) { const int extruders_cnt = Slic3r::GUI::wxGetApp().extruders_edited_cnt(); if (extruders_cnt > 1) @@ -3265,7 +3267,9 @@ void DoubleSlider::append_add_color_change_menu_item(wxMenu* menu) [is_used_extruder]() { return is_used_extruder; }, Slic3r::GUI::wxGetApp().plater()); } - const wxString menu_name = from_u8((boost::format(_utf8(L("Add color change (%1%) for:"))) % Slic3r::ColorChangeCode).str()); + const wxString menu_name = switch_current_code ? + from_u8((boost::format(_utf8(L("Switch code to Color change (%1%) for:"))) % Slic3r::ColorChangeCode).str()) : + from_u8((boost::format(_utf8(L("Add color change (%1%) for:"))) % Slic3r::ColorChangeCode).str()); wxMenuItem* add_color_change_menu_item = menu->AppendSubMenu(add_color_change_menu, menu_name, ""); add_color_change_menu_item->SetBitmap(create_scaled_bitmap(this, "colorchange_add_m")); } @@ -3427,20 +3431,13 @@ void DoubleSlider::OnRightDown(wxMouseEvent& event) if (is_point_in_rect(pos, m_rect_tick_action) && m_is_enabled_tick_manipulation) { const int tick = m_selection == ssLower ? m_lower_value : m_higher_value; - // if on this Z doesn't exist tick - auto it = m_ticks.ticks.find(TICK_CODE{ tick }); - if (it == m_ticks.ticks.end()) - { + if (m_ticks.ticks.find(TICK_CODE{ tick }) == m_ticks.ticks.end()) // if on this Z doesn't exist tick // show context menu on OnRightUp() m_show_context_menu = true; - return; - } - if (it->gcode != Slic3r::ToolChangeCode) - { + else // show "Edit" and "Delete" menu on OnRightUp() m_show_edit_menu = true; - return; - } + return; } detect_selected_slider(event.GetLogicalPosition(dc)); @@ -3489,7 +3486,7 @@ std::set DoubleSlider::get_used_extruders_for_tick(int tick) std::set used_extruders; auto it_layer_tools = std::lower_bound(tool_ordering.begin(), tool_ordering.end(), Slic3r::LayerTools(m_values[tick])); - for (; it_layer_tools != tool_ordering.end(); it_layer_tools++) + for (; it_layer_tools != tool_ordering.end(); ++it_layer_tools) { const std::vector& extruders = it_layer_tools->extruders; for (const auto& extruder : extruders) @@ -3508,7 +3505,10 @@ std::set DoubleSlider::get_used_extruders_for_tick(int tick) auto it_start = ticks.lower_bound(TICK_CODE{tick}); auto it = it_start; - if (it == ticks.begin() && it->gcode == Slic3r::ToolChangeCode) { + if (it == ticks.begin() && it->gcode == Slic3r::ToolChangeCode && + tick != it->tick ) // In case of switch of ToolChange to ColorChange, when tick exists, + // we shouldn't change color for extruder, which will be deleted + { used_extruders.emplace(it->extruder); if (tick < it->tick) used_extruders.emplace(default_initial_extruder); @@ -3516,8 +3516,7 @@ std::set DoubleSlider::get_used_extruders_for_tick(int tick) while (it != ticks.begin()) { --it; - if(it->gcode == Slic3r::ToolChangeCode) - { + if (it->gcode == Slic3r::ToolChangeCode && tick != it->tick) { used_extruders.emplace(it->extruder); break; } @@ -3526,12 +3525,9 @@ std::set DoubleSlider::get_used_extruders_for_tick(int tick) if (it == ticks.begin() && used_extruders.empty()) used_extruders.emplace(default_initial_extruder); - it = it_start; - while (it != ticks.end()) { - if(it->gcode == Slic3r::ToolChangeCode) + for (it = it_start; it != ticks.end(); ++it) + if (it->gcode == Slic3r::ToolChangeCode && tick != it->tick) used_extruders.emplace(it->extruder); - ++it; - } return used_extruders; } @@ -3574,13 +3570,20 @@ void DoubleSlider::OnRightUp(wxMouseEvent& event) std::set::iterator it = m_ticks.ticks.find(TICK_CODE{ m_selection == ssLower ? m_lower_value : m_higher_value }); const bool is_color_change = it->gcode == Slic3r::ColorChangeCode; - append_menu_item(&menu, wxID_ANY, it->gcode == Slic3r::ColorChangeCode ? _(L("Edit color")) : - it->gcode == Slic3r::PausePrintCode ? _(L("Edit pause print message")) : - _(L("Edit custom G-code")), "", - [this](wxCommandEvent&) { edit_tick(); }, "edit_uni", &menu); + if (it->gcode == Slic3r::ToolChangeCode) + append_add_color_change_menu_item(&menu, true); + else + append_menu_item(&menu, wxID_ANY, it->gcode == Slic3r::ColorChangeCode ? _(L("Edit color")) : + it->gcode == Slic3r::PausePrintCode ? _(L("Edit pause print message")) : + _(L("Edit custom G-code")), "", + [this](wxCommandEvent&) { edit_tick(); }, "edit_uni", &menu); + + if (it->gcode == Slic3r::ColorChangeCode && m_mode == t_mode::MultiAsSingle) + append_change_extruder_menu_item(&menu, true); append_menu_item(&menu, wxID_ANY, it->gcode == Slic3r::ColorChangeCode ? _(L("Delete color change")) : - it->gcode == Slic3r::PausePrintCode ? _(L("Delete pause print")) : + it->gcode == Slic3r::ToolChangeCode ? _(L("Delete tool change")) : + it->gcode == Slic3r::PausePrintCode ? _(L("Delete pause print")) : _(L("Delete custom G-code")), "", [this](wxCommandEvent&) { delete_current_tick();}, "colorchange_del_f", &menu); @@ -3645,13 +3648,23 @@ void DoubleSlider::add_code_as_tick(std::string code, int selected_extruder/* = return; const int tick = m_selection == ssLower ? m_lower_value : m_higher_value; - if (m_ticks.ticks.find(TICK_CODE{ tick }) != m_ticks.ticks.end() || // if on this Z doesn't exist tick - !check_ticks_changed_event(code)) + if ( !check_ticks_changed_event(code) ) return; const int extruder = selected_extruder > 0 ? selected_extruder : std::max(1, m_only_extruder); - - if (!m_ticks.add_tick(tick, code, extruder, m_values[tick])) + const auto it = m_ticks.ticks.find(TICK_CODE{ tick }); + + if ( it == m_ticks.ticks.end() ) { + // try to add tick + if (!m_ticks.add_tick(tick, code, extruder, m_values[tick])) + return; + } + else if (code == Slic3r::ToolChangeCode || code == Slic3r::ColorChangeCode) { + // try to switch tick code to ToolChangeCode or ColorChangeCode accordingly + if (!m_ticks.switch_code_for_tick(it, code, extruder)) + return; + } + else return; post_ticks_changed_event(code); @@ -3679,7 +3692,10 @@ void DoubleSlider::add_current_tick(bool call_from_keyboard /*= false*/) else append_add_color_change_menu_item(&menu); - wxPoint pos = wxDefaultPosition; + wxPoint pos = wxDefaultPosition; + /* Menu position will be calculated from mouse click position, but... + * if function is called from keyboard (pressing "+"), we should to calculate it + * */ if (call_from_keyboard) { int width, height; @@ -3701,17 +3717,15 @@ void DoubleSlider::delete_current_tick() { if (m_selection == ssUndef) return; + auto it = m_ticks.ticks.find(TICK_CODE{ m_selection == ssLower ? m_lower_value : m_higher_value }); + if (it == m_ticks.ticks.end() || + !check_ticks_changed_event(it->gcode)) + return; - if (it != m_ticks.ticks.end()) - { - if (!check_ticks_changed_event(it->gcode)) - return; - - const std::string code = it->gcode; - m_ticks.ticks.erase(it); - post_ticks_changed_event(code); - } + const std::string code = it->gcode; + m_ticks.ticks.erase(it); + post_ticks_changed_event(code); } void DoubleSlider::edit_tick() @@ -3719,7 +3733,7 @@ void DoubleSlider::edit_tick() const int tick = m_selection == ssLower ? m_lower_value : m_higher_value; const std::set::iterator it = m_ticks.ticks.find(TICK_CODE{ tick }); - if (it == m_ticks.ticks.end() || // if on this Z exists tick + if (it == m_ticks.ticks.end() || !check_ticks_changed_event(it->gcode)) return; @@ -3842,6 +3856,31 @@ bool DoubleSlider::check_ticks_changed_event(const std::string& gcode) return true; } + +std::string DoubleSlider::TICK_CODE_INFO::get_color_for_tick(TICK_CODE tick, const std::string& code, const int extruder) +{ + std::vector colors = Slic3r::GUI::wxGetApp().plater()->get_extruder_colors_from_plater_config(); + std::string color = colors[extruder - 1]; + + if (code == Slic3r::ColorChangeCode) + { + if (!ticks.empty()) + { + auto before_tick_it = std::lower_bound(ticks.begin(), ticks.end(), tick ); + while (before_tick_it != ticks.begin()) { + --before_tick_it; + if (before_tick_it->gcode == Slic3r::ColorChangeCode && before_tick_it->extruder == extruder) { + color = before_tick_it->color; + break; + } + } + } + + color = get_new_color(color); + } + return color; +} + bool DoubleSlider::TICK_CODE_INFO::add_tick(const int tick, std::string& code, const int extruder, double print_z) { std::string color; @@ -3864,28 +3903,10 @@ bool DoubleSlider::TICK_CODE_INFO::add_tick(const int tick, std::string& code, c } else { - std::vector colors = Slic3r::GUI::wxGetApp().plater()->get_extruder_colors_from_plater_config(); - color = colors[extruder - 1]; - - if (code == Slic3r::ColorChangeCode) - { - if (!ticks.empty()) - { - auto before_tick_it = std::lower_bound(ticks.begin(), ticks.end(), TICK_CODE{ tick }); - while (before_tick_it != ticks.begin()) { - --before_tick_it; - if (before_tick_it->gcode == Slic3r::ColorChangeCode && before_tick_it->extruder == extruder) { - color = before_tick_it->color; - break; - } - } - } - - color = get_new_color(color); - if (color.empty()) - return false; - } - } + color = get_color_for_tick(TICK_CODE{ tick }, code, extruder); + if (color.empty()) + return false; + } ticks.emplace(TICK_CODE{ tick, code, extruder, color }); return true; @@ -3937,6 +3958,23 @@ void DoubleSlider::TICK_CODE_INFO::switch_code(const std::string& code_from, con ++it; } +bool DoubleSlider::TICK_CODE_INFO::switch_code_for_tick(std::set::iterator it, const std::string& code_to, const int extruder) +{ + const std::string color = get_color_for_tick(*it, code_to, extruder); + if (color.empty()) + return false; + + TICK_CODE changed_tick = *it; + changed_tick.gcode = code_to; + changed_tick.extruder = extruder; + changed_tick.color = color; + + ticks.erase(it); + ticks.emplace(changed_tick); + + return true; +} + void DoubleSlider::TICK_CODE_INFO::erase_all_ticks_with_code(const std::string& gcode) { for (auto it{ ticks.begin() }, end{ ticks.end() }; it != end; ) { diff --git a/src/slic3r/GUI/wxExtensions.hpp b/src/slic3r/GUI/wxExtensions.hpp index 8cae495ef3..7511e8a196 100644 --- a/src/slic3r/GUI/wxExtensions.hpp +++ b/src/slic3r/GUI/wxExtensions.hpp @@ -910,8 +910,8 @@ private: void post_ticks_changed_event(const std::string& gcode = ""); bool check_ticks_changed_event(const std::string& gcode); - void append_change_extruder_menu_item(wxMenu*); - void append_add_color_change_menu_item(wxMenu*); + void append_change_extruder_menu_item (wxMenu*, bool switch_current_code = false); + void append_add_color_change_menu_item(wxMenu*, bool switch_current_code = false); bool is_osx { false }; wxFont m_font; @@ -988,6 +988,7 @@ private: bool add_tick (const int tick, std::string &code, int extruder, double print_z); bool edit_tick (std::set::iterator it, double print_z); void switch_code(const std::string& code_from, const std::string& code_to); + bool switch_code_for_tick (std::set::iterator it, const std::string& code_to, const int extruder); void erase_all_ticks_with_code (const std::string& gcode); bool has_tick_with_code (const std::string& gcode); @@ -1002,6 +1003,8 @@ private: std::string pause_print_msg = ""; bool m_suppress_plus = false; bool m_suppress_minus = false; + + std::string get_color_for_tick(TICK_CODE tick, const std::string& code, const int extruder); } m_ticks; From 62cf800db69b78f27b1b3a34782aade8f51610c0 Mon Sep 17 00:00:00 2001 From: David Kocik Date: Wed, 22 Jan 2020 17:05:26 +0100 Subject: [PATCH 141/336] adding constantness & removing unused code --- src/slic3r/GUI/RemovableDriveManager.cpp | 48 ++++++++++++------------ src/slic3r/GUI/RemovableDriveManager.hpp | 20 +++++----- 2 files changed, 34 insertions(+), 34 deletions(-) diff --git a/src/slic3r/GUI/RemovableDriveManager.cpp b/src/slic3r/GUI/RemovableDriveManager.cpp index 4ed6d36a48..e5e228ef15 100644 --- a/src/slic3r/GUI/RemovableDriveManager.cpp +++ b/src/slic3r/GUI/RemovableDriveManager.cpp @@ -27,7 +27,9 @@ namespace Slic3r { namespace GUI { #if _WIN32 +/* currently not used, left for possible future use INT_PTR WINAPI WinProcCallback(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); +*/ void RemovableDriveManager::search_for_drives() { m_current_drives.clear(); @@ -44,7 +46,7 @@ void RemovableDriveManager::search_for_drives() if (drive_type == DRIVE_REMOVABLE) { // get name of drive - std::wstring wpath = boost::nowide::widen(path);//std::wstring(path.begin(), path.end()); + std::wstring wpath = boost::nowide::widen(path); std::wstring volume_name; volume_name.resize(1024); std::wstring file_system_name; @@ -54,12 +56,6 @@ void RemovableDriveManager::search_for_drives() if(error != 0) { volume_name.erase(std::find(volume_name.begin(), volume_name.end(), '\0'), volume_name.end()); - /* - if (volume_name == L"") - { - volume_name = L"REMOVABLE DRIVE"; - } - */ if (file_system_name != L"") { ULARGE_INTEGER free_space; @@ -147,6 +143,7 @@ void RemovableDriveManager::register_window() { //creates new unvisible window that is recieving callbacks from system // structure to register + /* currently not used, left for possible future use WNDCLASSEX wndClass; wndClass.cbSize = sizeof(WNDCLASSEX); wndClass.style = CS_OWNDC | CS_HREDRAW | CS_VREDRAW; @@ -182,13 +179,15 @@ void RemovableDriveManager::register_window() } //ShowWindow(hWnd, SW_SHOWNORMAL); UpdateWindow(hWnd); + */ } - +/* currently not used, left for possible future use INT_PTR WINAPI WinProcCallback(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { // here we need to catch messeges about device removal // problem is that when ejecting usb (how is it implemented above) there is no messege dispached. Only after physical removal of the device. //uncomment register_window() in init() to register and comment update() in GUI_App.cpp (only for windows!) to stop recieving periodical updates + LRESULT lRet = 1; static HDEVNOTIFY hDeviceNotify; @@ -221,8 +220,9 @@ INT_PTR WINAPI WinProcCallback(HWND hWnd, UINT message, WPARAM wParam, LPARAM lP break; } return lRet; + } - +*/ #else void RemovableDriveManager::search_for_drives() { @@ -370,7 +370,7 @@ bool RemovableDriveManager::is_path_on_removable_drive(const std::string &path) } return false; } -std::string RemovableDriveManager::get_drive_from_path(const std::string& path) +std::string RemovableDriveManager::get_drive_from_path(const std::string& path) { std::size_t found = path.find_last_of("/"); std::string new_path = found == path.size() - 1 ? path.substr(0, found) : path; @@ -440,7 +440,7 @@ bool RemovableDriveManager::update(const long time,const bool check) return !m_current_drives.empty(); } -bool RemovableDriveManager::is_drive_mounted(const std::string &path) +bool RemovableDriveManager::is_drive_mounted(const std::string &path) const { for (auto it = m_current_drives.begin(); it != m_current_drives.end(); ++it) { @@ -451,7 +451,7 @@ bool RemovableDriveManager::is_drive_mounted(const std::string &path) } return false; } -std::string RemovableDriveManager::get_drive_path() +std::string RemovableDriveManager::get_drive_path() { if (m_current_drives.size() == 0) { @@ -462,17 +462,17 @@ std::string RemovableDriveManager::get_drive_path() return m_last_save_path; return m_current_drives.back().path; } -std::string RemovableDriveManager::get_last_save_path() +std::string RemovableDriveManager::get_last_save_path() const { if (!m_last_save_path_verified) return ""; return m_last_save_path; } -std::string RemovableDriveManager::get_last_save_name() +std::string RemovableDriveManager::get_last_save_name() const { return m_last_save_name; } -std::vector RemovableDriveManager::get_all_drives() +std::vector RemovableDriveManager::get_all_drives() const { return m_current_drives; } @@ -482,7 +482,7 @@ void RemovableDriveManager::check_and_notify() { m_drive_count_changed_callback(m_plater_ready_to_slice); } - if(m_callbacks.size() != 0 && m_drives_count > m_current_drives.size() /*&& m_last_save_path_verified */&& !is_drive_mounted(m_last_save_path)) + if(m_callbacks.size() != 0 && m_drives_count > m_current_drives.size() && !is_drive_mounted(m_last_save_path)) { for (auto it = m_callbacks.begin(); it != m_callbacks.end(); ++it) { @@ -533,7 +533,7 @@ void RemovableDriveManager::verify_last_save_path() reset_last_save_path(); } } -std::string RemovableDriveManager::get_drive_name(const std::string& path) +std::string RemovableDriveManager::get_drive_name(const std::string& path) const { if (m_current_drives.size() == 0) return ""; @@ -546,7 +546,7 @@ std::string RemovableDriveManager::get_drive_name(const std::string& path) } return ""; } -bool RemovableDriveManager::is_last_drive_removed() +bool RemovableDriveManager::is_last_drive_removed() { if(!m_last_save_path_verified) { @@ -578,27 +578,27 @@ void RemovableDriveManager::set_is_writing(const bool b) m_did_eject = false; } } -bool RemovableDriveManager::get_is_writing() +bool RemovableDriveManager::get_is_writing() const { return m_is_writing; } -bool RemovableDriveManager::get_did_eject() +bool RemovableDriveManager::get_did_eject() const { return m_did_eject; } -void RemovableDriveManager::set_did_eject(const bool b) +void RemovableDriveManager::set_did_eject(const bool b) { m_did_eject = b; } -size_t RemovableDriveManager::get_drives_count() +size_t RemovableDriveManager::get_drives_count() const { return m_current_drives.size(); } -std::string RemovableDriveManager::get_ejected_path() +std::string RemovableDriveManager::get_ejected_path() const { return m_ejected_path; } -std::string RemovableDriveManager::get_ejected_name() +std::string RemovableDriveManager::get_ejected_name() const { return m_ejected_name; } diff --git a/src/slic3r/GUI/RemovableDriveManager.hpp b/src/slic3r/GUI/RemovableDriveManager.hpp index 6bd90e98cd..032eef682b 100644 --- a/src/slic3r/GUI/RemovableDriveManager.hpp +++ b/src/slic3r/GUI/RemovableDriveManager.hpp @@ -35,14 +35,14 @@ public: void init(); //update() searches for removable devices, returns false if empty. /time = 0 is forced update, time expects wxGetLocalTime() bool update(const long time = 0,const bool check = false); - bool is_drive_mounted(const std::string &path); + bool is_drive_mounted(const std::string &path) const; void eject_drive(const std::string &path); //returns path to last drive which was used, if none was used, returns device that was enumerated last - std::string get_last_save_path(); - std::string get_last_save_name(); + std::string get_last_save_path() const; + std::string get_last_save_name() const; //returns path to last drive which was used, if none was used, returns empty string std::string get_drive_path(); - std::vector get_all_drives(); + std::vector get_all_drives() const; bool is_path_on_removable_drive(const std::string &path); // callback will notify only if device with last save path was removed void add_remove_callback(std::function callback); @@ -59,13 +59,13 @@ public: // param as update() bool is_last_drive_removed_with_update(const long time = 0); void set_is_writing(const bool b); - bool get_is_writing(); - bool get_did_eject(); + bool get_is_writing() const; + bool get_did_eject() const; void set_did_eject(const bool b); - std::string get_drive_name(const std::string& path); - size_t get_drives_count(); - std::string get_ejected_path(); - std::string get_ejected_name(); + std::string get_drive_name(const std::string& path) const; + size_t get_drives_count() const; + std::string get_ejected_path() const; + std::string get_ejected_name() const; private: RemovableDriveManager(); void search_for_drives(); From 71fa41110049a79ec1d5c3052d22647a38d01bed Mon Sep 17 00:00:00 2001 From: bubnikv Date: Thu, 23 Jan 2020 09:53:06 +0100 Subject: [PATCH 142/336] Refactored PrintObject::m_copies to PrintInstances, so that the ordering code at G-code export may work directly with pointers to PrintInstances instead of with pair of . Also the PrintInstance knows its source ModelInstance, which allows sorting of PrintInstances for sequential printing in the order they appear in Plater's object list. --- src/libslic3r/GCode.cpp | 230 +++++++++++++-------------- src/libslic3r/GCode.hpp | 4 +- src/libslic3r/GCode/PrintExtents.cpp | 4 +- src/libslic3r/GCode/ToolOrdering.cpp | 6 +- src/libslic3r/Print.cpp | 97 ++++++----- src/libslic3r/Print.hpp | 32 +++- src/libslic3r/PrintObject.cpp | 38 ++--- src/libslic3r/ShortestPath.cpp | 14 +- src/libslic3r/ShortestPath.hpp | 3 +- src/slic3r/GUI/GLCanvas3D.cpp | 7 +- 10 files changed, 226 insertions(+), 209 deletions(-) diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index 128ddca177..decadafdf3 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -165,12 +165,12 @@ Polygons AvoidCrossingPerimeters::collect_contours_all_layers(const PrintObjectP cnt = (cnt + 1) / 2; } // And collect copies of the objects. - for (const Point © : object->copies()) { + for (const PrintInstance &instance : object->instances()) { // All the layers were reduced to the 1st item of polygons_per_layer. size_t i = islands.size(); polygons_append(islands, polygons_per_layer.front()); for (; i < islands.size(); ++ i) - islands[i].translate(copy); + islands[i].translate(instance.shift); } } return islands; @@ -1088,49 +1088,38 @@ namespace DoExport { } // Sort the PrintObjects by their increasing Z, likely useful for avoiding colisions on Deltas during sequential prints. -static inline std::vector sort_objects_by_z(const Print &print) +static inline std::vector sort_object_instances_by_max_z(const Print &print) { std::vector objects(print.objects().begin(), print.objects().end()); - std::sort(objects.begin(), objects.end(), [](const PrintObject* po1, const PrintObject* po2) { return po1->size(2) < po2->size(2); }); - return objects; + std::sort(objects.begin(), objects.end(), [](const PrintObject *po1, const PrintObject *po2) { return po1->size(2) < po2->size(2); }); + std::vector instances; + instances.reserve(objects.size()); + for (const PrintObject *object : objects) + for (size_t i = 0; i < object->instances().size(); ++ i) + instances.emplace_back(&object->instances()[i]); + return instances; } // Produce a vector of PrintObjects in the order of their respective ModelObjects in print.model(). -static inline std::vector sort_objects_by_model_order(const Print &print) +static inline std::vector sort_object_instances_by_model_order(const Print &print) { - const Model &model = print.model(); - // Pair ModelObjects with PrintObjects, remember the order of ModelObjects in the model above. - struct ModelObjectOrder { - const ModelObject *model_object; - const PrintObject *print_object; - size_t order; - }; - // Initialize model_object_order with ModelObjects and their order. - std::vector model_object_order; - model_object_order.reserve(model.objects.size()); - { - size_t order = 0; - for (const ModelObject *model_object : model.objects) - model_object_order.emplace_back(ModelObjectOrder{ model_object, nullptr, order ++ }); - } - // Sort by pointer to ModelObject. - std::sort(model_object_order.begin(), model_object_order.end(), [](const ModelObjectOrder &lhs, const ModelObjectOrder &rhs) { return lhs.model_object < rhs.model_object; }); - // Assign PrintObject pointer to ModelObject. - for (const PrintObject *print_object : print.objects()) { - auto it = Slic3r::lower_bound_by_predicate(model_object_order.begin(), model_object_order.end(), [print_object](const ModelObjectOrder &model_object_order) { return model_object_order.model_object < print_object->model_object(); }); - // The non-printable objects (objects outside of the print volume or suppressed objects) will have no partner in the print.objects() list. - if (it != model_object_order.end() && it->model_object == print_object->model_object()) - it->print_object = print_object; - } - // Sort back to the initial order. - std::sort(model_object_order.begin(), model_object_order.end(), [](const ModelObjectOrder &lhs, const ModelObjectOrder &rhs) { return lhs.order < rhs.order; }); - // Produce the output vector of PrintObjects, sorted by the order of ModelObjects in Model. - std::vector objects; - objects.reserve(model_object_order.size()); - for (ModelObjectOrder &order : model_object_order) - if (order.print_object != nullptr) - objects.emplace_back(order.print_object); - return objects; + // Build up map from ModelInstance* to PrintInstance* + std::vector> model_instance_to_print_instance; + model_instance_to_print_instance.reserve(print.num_object_instances()); + for (const PrintObject *print_object : print.objects()) + for (const PrintInstance &print_instance : print_object->instances()) + model_instance_to_print_instance.emplace_back(print_instance.model_instance, &print_instance); + std::sort(model_instance_to_print_instance.begin(), model_instance_to_print_instance.end(), [](auto &l, auto &r) { return l.first < r.first; }); + + std::vector instances; + instances.reserve(model_instance_to_print_instance.size()); + for (const ModelObject *model_object : print.model().objects) + for (const ModelInstance *model_instance : model_object->instances) { + auto it = std::lower_bound(model_instance_to_print_instance.begin(), model_instance_to_print_instance.end(), std::make_pair(model_instance, nullptr), [](auto &l, auto &r) { return l.first < r.first; }); + if (it != model_instance_to_print_instance.end() && it->first == model_instance) + instances.emplace_back(it->second); + } + return instances; } #if ENABLE_THUMBNAIL_GENERATOR @@ -1164,7 +1153,7 @@ void GCode::_do_export(Print& print, FILE* file) for (auto layer : object->support_layers()) zs.push_back(layer->print_z); std::sort(zs.begin(), zs.end()); - m_layer_count += (unsigned int)(object->copies().size() * (std::unique(zs.begin(), zs.end()) - zs.begin())); + m_layer_count += (unsigned int)(object->instances().size() * (std::unique(zs.begin(), zs.end()) - zs.begin())); } } else { // Print all objects with the same print_z together. @@ -1257,13 +1246,18 @@ void GCode::_do_export(Print& print, FILE* file) ToolOrdering tool_ordering; unsigned int initial_extruder_id = (unsigned int)-1; unsigned int final_extruder_id = (unsigned int)-1; - size_t initial_print_object_id = 0; bool has_wipe_tower = false; + std::vector print_object_instances_ordering; + std::vector::const_iterator print_object_instance_sequential_active; if (print.config().complete_objects.value) { + // Order object instances for sequential print. + print_object_instances_ordering = sort_object_instances_by_model_order(print); +// print_object_instances_ordering = sort_object_instances_by_max_z(print); // Find the 1st printing object, find its tool ordering and the initial extruder ID. - for (; initial_print_object_id < print.objects().size(); ++initial_print_object_id) { - tool_ordering = ToolOrdering(*print.objects()[initial_print_object_id], initial_extruder_id); - if ((initial_extruder_id = tool_ordering.first_extruder()) != (unsigned int)-1) + print_object_instance_sequential_active = print_object_instances_ordering.begin(); + for (; print_object_instance_sequential_active != print_object_instances_ordering.end(); ++ print_object_instance_sequential_active) { + tool_ordering = ToolOrdering(*(*print_object_instance_sequential_active)->print_object, initial_extruder_id); + if ((initial_extruder_id = tool_ordering.first_extruder()) != static_cast(-1)) break; } // We don't allow switching of extruders per layer by Model::custom_gcode_per_print_z in sequential mode. @@ -1283,6 +1277,8 @@ void GCode::_do_export(Print& print, FILE* file) // In non-sequential print, the printing extruders may have been modified by the extruder switches stored in Model::custom_gcode_per_print_z. // Therefore initialize the printing extruders from there. this->set_extruders(tool_ordering.all_extruders()); + // Order object instances using a nearest neighbor search. + print_object_instances_ordering = chain_print_object_instances(print); } if (initial_extruder_id == (unsigned int)-1) { // Nothing to print! @@ -1363,72 +1359,64 @@ void GCode::_do_export(Print& print, FILE* file) // Do all objects for each layer. if (print.config().complete_objects.value) { - // Print objects from the smallest to the tallest to avoid collisions - // when moving onto next object starting point. - std::vector objects = sort_objects_by_model_order(print); -// std::vector objects = sort_objects_by_z(print); size_t finished_objects = 0; - for (size_t object_id = initial_print_object_id; object_id < objects.size(); ++ object_id) { - const PrintObject &object = *objects[object_id]; - for (const Point © : object.copies()) { - // Get optimal tool ordering to minimize tool switches of a multi-exruder print. - if (object_id != initial_print_object_id || © != object.copies().data()) { - // Don't initialize for the first object and first copy. - tool_ordering = ToolOrdering(object, final_extruder_id); - unsigned int new_extruder_id = tool_ordering.first_extruder(); - if (new_extruder_id == (unsigned int)-1) - // Skip this object. - continue; - initial_extruder_id = new_extruder_id; - final_extruder_id = tool_ordering.last_extruder(); - assert(final_extruder_id != (unsigned int)-1); - } - print.throw_if_canceled(); - this->set_origin(unscale(copy)); - if (finished_objects > 0) { - // Move to the origin position for the copy we're going to print. - // This happens before Z goes down to layer 0 again, so that no collision happens hopefully. - m_enable_cooling_markers = false; // we're not filtering these moves through CoolingBuffer - m_avoid_crossing_perimeters.use_external_mp_once = true; - _write(file, this->retract()); - _write(file, this->travel_to(Point(0, 0), erNone, "move to origin position for next object")); - m_enable_cooling_markers = true; - // Disable motion planner when traveling to first object point. - m_avoid_crossing_perimeters.disable_once = true; - // Ff we are printing the bottom layer of an object, and we have already finished - // another one, set first layer temperatures. This happens before the Z move - // is triggered, so machine has more time to reach such temperatures. - m_placeholder_parser.set("current_object_idx", int(finished_objects)); - std::string between_objects_gcode = this->placeholder_parser_process("between_objects_gcode", print.config().between_objects_gcode.value, initial_extruder_id); - // Set first layer bed and extruder temperatures, don't wait for it to reach the temperature. - this->_print_first_layer_bed_temperature(file, print, between_objects_gcode, initial_extruder_id, false); - this->_print_first_layer_extruder_temperatures(file, print, between_objects_gcode, initial_extruder_id, false); - _writeln(file, between_objects_gcode); - } - // Reset the cooling buffer internal state (the current position, feed rate, accelerations). - m_cooling_buffer->reset(); - m_cooling_buffer->set_current_extruder(initial_extruder_id); - // Pair the object layers with the support layers by z, extrude them. - std::vector layers_to_print = collect_layers_to_print(object); - for (const LayerToPrint <p : layers_to_print) { - std::vector lrs; - lrs.emplace_back(std::move(ltp)); - this->process_layer(file, print, lrs, tool_ordering.tools_for_layer(ltp.print_z()), nullptr, © - object.copies().data()); - print.throw_if_canceled(); - } -#ifdef HAS_PRESSURE_EQUALIZER - if (m_pressure_equalizer) - _write(file, m_pressure_equalizer->process("", true)); -#endif /* HAS_PRESSURE_EQUALIZER */ - ++ finished_objects; - // Flag indicating whether the nozzle temperature changes from 1st to 2nd layer were performed. - // Reset it when starting another object from 1st layer. - m_second_layer_things_done = false; + const PrintObject *prev_object = (*print_object_instance_sequential_active)->print_object; + for (; print_object_instance_sequential_active != print_object_instances_ordering.end(); ++ print_object_instance_sequential_active) { + const PrintObject &object = *(*print_object_instance_sequential_active)->print_object; + if (&object != prev_object || tool_ordering.first_extruder() != final_extruder_id) { + tool_ordering = ToolOrdering(object, final_extruder_id); + unsigned int new_extruder_id = tool_ordering.first_extruder(); + if (new_extruder_id == (unsigned int)-1) + // Skip this object. + continue; + initial_extruder_id = new_extruder_id; + final_extruder_id = tool_ordering.last_extruder(); + assert(final_extruder_id != (unsigned int)-1); } + print.throw_if_canceled(); + this->set_origin(unscale((*print_object_instance_sequential_active)->shift)); + if (finished_objects > 0) { + // Move to the origin position for the copy we're going to print. + // This happens before Z goes down to layer 0 again, so that no collision happens hopefully. + m_enable_cooling_markers = false; // we're not filtering these moves through CoolingBuffer + m_avoid_crossing_perimeters.use_external_mp_once = true; + _write(file, this->retract()); + _write(file, this->travel_to(Point(0, 0), erNone, "move to origin position for next object")); + m_enable_cooling_markers = true; + // Disable motion planner when traveling to first object point. + m_avoid_crossing_perimeters.disable_once = true; + // Ff we are printing the bottom layer of an object, and we have already finished + // another one, set first layer temperatures. This happens before the Z move + // is triggered, so machine has more time to reach such temperatures. + m_placeholder_parser.set("current_object_idx", int(finished_objects)); + std::string between_objects_gcode = this->placeholder_parser_process("between_objects_gcode", print.config().between_objects_gcode.value, initial_extruder_id); + // Set first layer bed and extruder temperatures, don't wait for it to reach the temperature. + this->_print_first_layer_bed_temperature(file, print, between_objects_gcode, initial_extruder_id, false); + this->_print_first_layer_extruder_temperatures(file, print, between_objects_gcode, initial_extruder_id, false); + _writeln(file, between_objects_gcode); + } + // Reset the cooling buffer internal state (the current position, feed rate, accelerations). + m_cooling_buffer->reset(); + m_cooling_buffer->set_current_extruder(initial_extruder_id); + // Pair the object layers with the support layers by z, extrude them. + std::vector layers_to_print = collect_layers_to_print(object); + for (const LayerToPrint <p : layers_to_print) { + std::vector lrs; + lrs.emplace_back(std::move(ltp)); + this->process_layer(file, print, lrs, tool_ordering.tools_for_layer(ltp.print_z()), nullptr, *print_object_instance_sequential_active - object.instances().data()); + print.throw_if_canceled(); + } +#ifdef HAS_PRESSURE_EQUALIZER + if (m_pressure_equalizer) + _write(file, m_pressure_equalizer->process("", true)); +#endif /* HAS_PRESSURE_EQUALIZER */ + ++ finished_objects; + // Flag indicating whether the nozzle temperature changes from 1st to 2nd layer were performed. + // Reset it when starting another object from 1st layer. + m_second_layer_things_done = false; + prev_object = &object; } } else { - // Order object instances using a nearest neighbor search. - std::vector> print_object_instances_ordering = chain_print_object_instances(print); // Sort layers by Z. // All extrusion moves with the same top layer height are extruded uninterrupted. std::vector>> layers_to_print = collect_layers_to_print(print); @@ -1730,12 +1718,12 @@ inline std::vector& object_islands_by_extruder( } std::vector GCode::sort_print_object_instances( - std::vector &objects_by_extruder, - const std::vector &layers, + std::vector &objects_by_extruder, + const std::vector &layers, // Ordering must be defined for normal (non-sequential print). - const std::vector> *ordering, + const std::vector *ordering, // For sequential print, the instance of the object to be printing has to be defined. - const size_t single_object_instance_idx) + const size_t single_object_instance_idx) { std::vector out; @@ -1762,13 +1750,13 @@ std::vector GCode::sort_print_object_instances( if (! sorted.empty()) { const Print &print = *sorted.front().first->print(); out.reserve(sorted.size()); - for (const std::pair &instance_id : *ordering) { - const PrintObject &print_object = *print.objects()[instance_id.first]; + for (const PrintInstance *instance : *ordering) { + const PrintObject &print_object = *instance->print_object; std::pair key(&print_object, nullptr); auto it = std::lower_bound(sorted.begin(), sorted.end(), key); if (it != sorted.end() && it->first == &print_object) // ObjectByExtruder for this PrintObject was found. - out.emplace_back(*it->second, it->second - objects_by_extruder.data(), print_object, instance_id.second); + out.emplace_back(*it->second, it->second - objects_by_extruder.data(), print_object, instance - print_object.instances().data()); } } } @@ -1912,16 +1900,16 @@ namespace Skirt { // and performing the extruder specific extrusions together. void GCode::process_layer( // Write into the output file. - FILE *file, - const Print &print, + FILE *file, + const Print &print, // Set of object & print layers of the same PrintObject and with the same print_z. - const std::vector &layers, - const LayerTools &layer_tools, + const std::vector &layers, + const LayerTools &layer_tools, // Pairs of PrintObject index and its instance index. - const std::vector> *ordering, + const std::vector *ordering, // If set to size_t(-1), then print all copies of all objects. // Otherwise print a single copy of a single object. - const size_t single_object_instance_idx) + const size_t single_object_instance_idx) { assert(! layers.empty()); // assert(! layer_tools.extruders.empty()); @@ -2130,7 +2118,7 @@ void GCode::process_layer( // by last extruder on this layer (could happen e.g. when a wiping object is taller than others - dontcare extruders are eradicated from layer_tools) correct_extruder_id = layer_tools.extruders.back(); } - entity_overrides = const_cast(layer_tools).wiping_extrusions().get_extruder_overrides(extrusions, correct_extruder_id, layer_to_print.object()->copies().size()); + entity_overrides = const_cast(layer_tools).wiping_extrusions().get_extruder_overrides(extrusions, correct_extruder_id, layer_to_print.object()->instances().size()); if (entity_overrides == nullptr) { printing_extruders.emplace_back(correct_extruder_id); } else { @@ -2244,7 +2232,7 @@ void GCode::process_layer( if (this->config().gcode_label_objects) gcode += std::string("; printing object ") + instance_to_print.print_object.model_object()->name + " id:" + std::to_string(instance_to_print.layer_id) + " copy " + std::to_string(instance_to_print.instance_id) + "\n"; // When starting a new object, use the external motion planner for the first travel move. - const Point &offset = instance_to_print.print_object.copies()[instance_to_print.instance_id]; + const Point &offset = instance_to_print.print_object.instances()[instance_to_print.instance_id].shift; std::pair this_object_copy(&instance_to_print.print_object, offset); if (m_last_obj_copy != this_object_copy) m_avoid_crossing_perimeters.use_external_mp_once = true; diff --git a/src/libslic3r/GCode.hpp b/src/libslic3r/GCode.hpp index 0344924a13..10463277b0 100644 --- a/src/libslic3r/GCode.hpp +++ b/src/libslic3r/GCode.hpp @@ -226,7 +226,7 @@ private: const std::vector &layers, const LayerTools &layer_tools, // Pairs of PrintObject index and its instance index. - const std::vector> *ordering, + const std::vector *ordering, // If set to size_t(-1), then print all copies of all objects. // Otherwise print a single copy of a single object. const size_t single_object_idx = size_t(-1)); @@ -300,7 +300,7 @@ private: // Object and Support layers for the current print_z, collected for a single object, or for possibly multiple objects with multiple instances. const std::vector &layers, // Ordering must be defined for normal (non-sequential print). - const std::vector> *ordering, + const std::vector *ordering, // For sequential print, the instance of the object to be printing has to be defined. const size_t single_object_instance_idx); diff --git a/src/libslic3r/GCode/PrintExtents.cpp b/src/libslic3r/GCode/PrintExtents.cpp index 1fedcf3f03..7a8271e300 100644 --- a/src/libslic3r/GCode/PrintExtents.cpp +++ b/src/libslic3r/GCode/PrintExtents.cpp @@ -121,9 +121,9 @@ BoundingBoxf get_print_object_extrusions_extents(const PrintObject &print_object if (support_layer) for (const ExtrusionEntity *extrusion_entity : support_layer->support_fills.entities) bbox_this.merge(extrusionentity_extents(extrusion_entity)); - for (const Point &offset : print_object.copies()) { + for (const PrintInstance &instance : print_object.instances()) { BoundingBoxf bbox_translated(bbox_this); - bbox_translated.translate(unscale(offset)); + bbox_translated.translate(unscale(instance.shift)); bbox.merge(bbox_translated); } } diff --git a/src/libslic3r/GCode/ToolOrdering.cpp b/src/libslic3r/GCode/ToolOrdering.cpp index 3e01e2594c..3b6bf87afd 100644 --- a/src/libslic3r/GCode/ToolOrdering.cpp +++ b/src/libslic3r/GCode/ToolOrdering.cpp @@ -491,7 +491,7 @@ void ToolOrdering::assign_custom_gcodes(const Print &print) if (custom_gcode.print_z > print_z_below + 0.5 * EPSILON) { // The custom G-code applies to the current layer. if ( tool_changes_as_color_changes || custom_gcode.gcode != ColorChangeCode || - (custom_gcode.extruder <= num_extruders && extruder_printing_above[unsigned(custom_gcode.extruder - 1)])) + (custom_gcode.extruder <= int(num_extruders) && extruder_printing_above[unsigned(custom_gcode.extruder - 1)])) // If it is color change, it will actually be useful as the exturder above will print. lt.custom_gcode = &custom_gcode; // Consume that custom G-code event. @@ -602,7 +602,7 @@ float WipingExtrusions::mark_wiping_extrusions(const Print& print, unsigned int const Layer* this_layer = object->get_layer_at_printz(lt.print_z, EPSILON); if (this_layer == nullptr) continue; - size_t num_of_copies = object->copies().size(); + size_t num_of_copies = object->instances().size(); // iterate through copies (aka PrintObject instances) first, so that we mark neighbouring infills to minimize travel moves for (unsigned int copy = 0; copy < num_of_copies; ++copy) { @@ -677,7 +677,7 @@ void WipingExtrusions::ensure_perimeters_infills_order(const Print& print) const Layer* this_layer = object->get_layer_at_printz(lt.print_z, EPSILON); if (this_layer == nullptr) continue; - size_t num_of_copies = object->copies().size(); + size_t num_of_copies = object->instances().size(); for (size_t copy = 0; copy < num_of_copies; ++copy) { // iterate through copies first, so that we mark neighbouring infills to minimize travel moves for (size_t region_id = 0; region_id < object->region_volumes.size(); ++ region_id) { diff --git a/src/libslic3r/Print.cpp b/src/libslic3r/Print.cpp index 1cb16b4de6..a41122dfae 100644 --- a/src/libslic3r/Print.cpp +++ b/src/libslic3r/Print.cpp @@ -326,7 +326,7 @@ unsigned int Print::num_object_instances() const { unsigned int instances = 0; for (const PrintObject *print_object : m_objects) - instances += (unsigned int)print_object->copies().size(); + instances += (unsigned int)print_object->instances().size(); return instances; } @@ -447,33 +447,30 @@ static inline bool transform3d_equal(const Transform3d &lhs, const Transform3d & return true; } -struct PrintInstances +struct PrintObjectTrafoAndInstances { - Transform3d trafo; - Points copies; - bool operator<(const PrintInstances &rhs) const { return transform3d_lower(this->trafo, rhs.trafo); } + Transform3d trafo; + PrintInstances instances; + bool operator<(const PrintObjectTrafoAndInstances &rhs) const { return transform3d_lower(this->trafo, rhs.trafo); } }; // Generate a list of trafos and XY offsets for instances of a ModelObject -static std::vector print_objects_from_model_object(const ModelObject &model_object) +static std::vector print_objects_from_model_object(const ModelObject &model_object) { - std::set trafos; - PrintInstances trafo; - trafo.copies.assign(1, Point()); + std::set trafos; + PrintObjectTrafoAndInstances trafo; for (ModelInstance *model_instance : model_object.instances) if (model_instance->is_printable()) { trafo.trafo = model_instance->get_matrix(); + auto shift = Point::new_scale(trafo.trafo.data()[12], trafo.trafo.data()[13]); // Set the Z axis of the transformation. - trafo.copies.front() = Point::new_scale(trafo.trafo.data()[12], trafo.trafo.data()[13]); trafo.trafo.data()[12] = 0; trafo.trafo.data()[13] = 0; - auto it = trafos.find(trafo); - if (it == trafos.end()) - trafos.emplace(trafo); - else - const_cast(*it).copies.emplace_back(trafo.copies.front()); + // Search or insert a trafo. + auto it = trafos.emplace(trafo).first; + const_cast(*it).instances.emplace_back(PrintInstance{ nullptr, model_instance, shift }); } - return std::vector(trafos.begin(), trafos.end()); + return std::vector(trafos.begin(), trafos.end()); } // Compare just the layer ranges and their layer heights, not the associated configs. @@ -891,12 +888,27 @@ Print::ApplyStatus Print::apply(const Model &model, DynamicPrintConfig new_full_ // Copy the ModelObject name, input_file and instances. The instances will be compared against PrintObject instances in the next step. model_object.name = model_object_new.name; model_object.input_file = model_object_new.input_file; - model_object.clear_instances(); - model_object.instances.reserve(model_object_new.instances.size()); - for (const ModelInstance *model_instance : model_object_new.instances) { - model_object.instances.emplace_back(new ModelInstance(*model_instance)); - model_object.instances.back()->set_model_object(&model_object); - } + // Only refresh ModelInstances if there is any change. + if (model_object.instances.size() != model_object_new.instances.size() || + ! std::equal(model_object.instances.begin(), model_object.instances.end(), model_object_new.instances.begin(), [](auto l, auto r){ return l->id() == r->id(); })) { + // G-code generator accesses model_object.instances to generate sequential print ordering matching the Plater object list. + update_apply_status(this->invalidate_step(psGCodeExport)); + model_object.clear_instances(); + model_object.instances.reserve(model_object_new.instances.size()); + for (const ModelInstance *model_instance : model_object_new.instances) { + model_object.instances.emplace_back(new ModelInstance(*model_instance)); + model_object.instances.back()->set_model_object(&model_object); + } + } else { + // Just synchronize the content of the instances. This avoids memory allocation and it does not invalidate ModelInstance pointers, + // which may be accessed by G-code export in the meanwhile to deduce sequential print order. + auto new_instance = model_object_new.instances.begin(); + for (auto old_instance = model_object.instances.begin(); old_instance != model_object.instances.end(); ++ old_instance, ++ new_instance) { + (*old_instance)->set_transformation((*new_instance)->get_transformation()); + (*old_instance)->print_volume_state = (*new_instance)->print_volume_state; + (*old_instance)->printable = (*new_instance)->printable; + } + } } } @@ -917,13 +929,12 @@ Print::ApplyStatus Print::apply(const Model &model, DynamicPrintConfig new_full_ } // Generate a list of trafos and XY offsets for instances of a ModelObject PrintObjectConfig config = PrintObject::object_config_from_model_object(m_default_object_config, *model_object, num_extruders); - std::vector new_print_instances = print_objects_from_model_object(*model_object); + std::vector new_print_instances = print_objects_from_model_object(*model_object); if (old.empty()) { // Simple case, just generate new instances. - for (const PrintInstances &print_instances : new_print_instances) { + for (PrintObjectTrafoAndInstances &print_instances : new_print_instances) { PrintObject *print_object = new PrintObject(this, model_object, false); - print_object->set_trafo(print_instances.trafo); - print_object->set_copies(print_instances.copies); + print_object->set_trafo_and_instances(print_instances.trafo, std::move(print_instances.instances)); print_object->config_apply(config); print_objects_new.emplace_back(print_object); // print_object_status.emplace(PrintObjectStatus(print_object, PrintObjectStatus::New)); @@ -936,13 +947,12 @@ Print::ApplyStatus Print::apply(const Model &model, DynamicPrintConfig new_full_ std::sort(old.begin(), old.end(), [](const PrintObjectStatus *lhs, const PrintObjectStatus *rhs){ return transform3d_lower(lhs->trafo, rhs->trafo); }); // Merge the old / new lists. auto it_old = old.begin(); - for (const PrintInstances &new_instances : new_print_instances) { + for (PrintObjectTrafoAndInstances &new_instances : new_print_instances) { for (; it_old != old.end() && transform3d_lower((*it_old)->trafo, new_instances.trafo); ++ it_old); if (it_old == old.end() || ! transform3d_equal((*it_old)->trafo, new_instances.trafo)) { // This is a new instance (or a set of instances with the same trafo). Just add it. PrintObject *print_object = new PrintObject(this, model_object, false); - print_object->set_trafo(new_instances.trafo); - print_object->set_copies(new_instances.copies); + print_object->set_trafo_and_instances(new_instances.trafo, std::move(new_instances.instances)); print_object->config_apply(config); print_objects_new.emplace_back(print_object); // print_object_status.emplace(PrintObjectStatus(print_object, PrintObjectStatus::New)); @@ -951,7 +961,7 @@ Print::ApplyStatus Print::apply(const Model &model, DynamicPrintConfig new_full_ const_cast(*it_old)->status = PrintObjectStatus::Deleted; } else { // The PrintObject already exists and the copies differ. - PrintBase::ApplyStatus status = (*it_old)->print_object->set_copies(new_instances.copies); + PrintBase::ApplyStatus status = (*it_old)->print_object->set_instances(std::move(new_instances.instances)); if (status != PrintBase::APPLY_STATUS_UNCHANGED) update_apply_status(status == PrintBase::APPLY_STATUS_INVALIDATED); print_objects_new.emplace_back((*it_old)->print_object); @@ -1159,7 +1169,7 @@ std::string Print::validate() const Polygons convex_hulls_other; for (const PrintObject *print_object : m_objects) { assert(! print_object->model_object()->instances.empty()); - assert(! print_object->copies().empty()); + assert(! print_object->instances().empty()); // Get convex hull of all meshes assigned to this print object. ModelInstance *model_instance0 = print_object->model_object()->instances.front(); Vec3d rotation = model_instance0->get_rotation(); @@ -1174,9 +1184,9 @@ std::string Print::validate() const Geometry::assemble_transform(Vec3d::Zero(), rotation, model_instance0->get_scaling_factor(), model_instance0->get_mirror())), float(scale_(0.5 * m_config.extruder_clearance_radius.value)), jtRound, float(scale_(0.1))).front(); // Now we check that no instance of convex_hull intersects any of the previously checked object instances. - for (const Point © : print_object->copies()) { + for (const PrintInstance &instance : print_object->instances()) { Polygon convex_hull = convex_hull0; - convex_hull.translate(copy); + convex_hull.translate(instance.shift); if (! intersection(convex_hulls_other, convex_hull).empty()) return L("Some objects are too close; your extruder will collide with them."); polygons_append(convex_hulls_other, convex_hull); @@ -1187,7 +1197,7 @@ std::string Print::validate() const { std::vector object_height; for (const PrintObject *object : m_objects) - object_height.insert(object_height.end(), object->copies().size(), object->size(2)); + object_height.insert(object_height.end(), object->instances().size(), object->size(2)); std::sort(object_height.begin(), object_height.end()); // Ignore the tallest *copy* (this is why we repeat height for all of them): // it will be printed as last one so its height doesn't matter. @@ -1200,7 +1210,7 @@ std::string Print::validate() const if (m_config.spiral_vase) { size_t total_copies_count = 0; for (const PrintObject *object : m_objects) - total_copies_count += object->copies().size(); + total_copies_count += object->instances().size(); // #4043 if (total_copies_count > 1 && ! m_config.complete_objects.value) return L("The Spiral Vase option can only be used when printing a single object."); @@ -1417,10 +1427,9 @@ BoundingBox Print::bounding_box() const { BoundingBox bb; for (const PrintObject *object : m_objects) - for (Point copy : object->m_copies) { - bb.merge(copy); - copy += to_2d(object->size); - bb.merge(copy); + for (const PrintInstance &instance : object->instances()) { + bb.merge(instance.shift); + bb.merge(instance.shift + to_2d(object->size)); } return bb; } @@ -1657,10 +1666,10 @@ void Print::_make_skirt() append(object_points, extrusion_entity->as_polyline().points); } // Repeat points for each object copy. - for (const Point &shift : object->m_copies) { + for (const PrintInstance &instance : object->instances()) { Points copy_points = object_points; for (Point &pt : copy_points) - pt += shift; + pt += instance.shift; append(points, copy_points); } } @@ -1778,11 +1787,11 @@ void Print::_make_brim() object_islands.push_back(expoly.contour); if (! object->support_layers().empty()) object->support_layers().front()->support_fills.polygons_covered_by_spacing(object_islands, float(SCALED_EPSILON)); - islands.reserve(islands.size() + object_islands.size() * object->m_copies.size()); - for (const Point &pt : object->m_copies) + islands.reserve(islands.size() + object_islands.size() * object->instances().size()); + for (const PrintInstance &instance : object->instances()) for (Polygon &poly : object_islands) { islands.push_back(poly); - islands.back().translate(pt); + islands.back().translate(instance.shift); } } Polygons loops; diff --git a/src/libslic3r/Print.hpp b/src/libslic3r/Print.hpp index 53a6f97b98..2d83da43de 100644 --- a/src/libslic3r/Print.hpp +++ b/src/libslic3r/Print.hpp @@ -92,6 +92,21 @@ typedef std::vector LayerPtrs; typedef std::vector SupportLayerPtrs; class BoundingBoxf3; // TODO: for temporary constructor parameter +// Single instance of a PrintObject. +// As multiple PrintObjects may be generated for a single ModelObject (their instances differ in rotation around Z), +// ModelObject's instancess will be distributed among these multiple PrintObjects. +struct PrintInstance +{ + // Parent PrintObject + PrintObject *print_object; + // Source ModelInstance of a ModelObject, for which this print_object was created. + const ModelInstance *model_instance; + // Shift of this instance towards its PrintObject + Point shift; +}; + +typedef std::vector PrintInstances; + class PrintObject : public PrintObjectBaseWithState { private: // Prevents erroneous use by other classes. @@ -111,8 +126,8 @@ public: const LayerPtrs& layers() const { return m_layers; } const SupportLayerPtrs& support_layers() const { return m_support_layers; } const Transform3d& trafo() const { return m_trafo; } - const Points& copies() const { return m_copies; } - const Point copy_center(size_t idx) const { return m_copies[idx] + m_copies_shift + Point(this->size.x() / 2, this->size.y() / 2); } + const PrintInstances& instances() const { return m_instances; } + const Point instance_center(size_t idx) const { return m_instances[idx].shift + m_copies_shift + Point(this->size.x() / 2, this->size.y() / 2); } // since the object is aligned to origin, bounding box coincides with size BoundingBox bounding_box() const { return BoundingBox(Point(0,0), to_2d(this->size)); } @@ -126,9 +141,9 @@ public: // This is the *total* layer count (including support layers) // this value is not supposed to be compared with Layer::id // since they have different semantics. - size_t total_layer_count() const { return this->layer_count() + this->support_layer_count(); } - size_t layer_count() const { return m_layers.size(); } - void clear_layers(); + size_t total_layer_count() const { return this->layer_count() + this->support_layer_count(); } + size_t layer_count() const { return m_layers.size(); } + void clear_layers(); const Layer* get_layer(int idx) const { return m_layers[idx]; } Layer* get_layer(int idx) { return m_layers[idx]; } // Get a layer exactly at print_z. @@ -177,7 +192,7 @@ public: std::vector slice_support_blockers() const { return this->slice_support_volumes(ModelVolumeType::SUPPORT_BLOCKER); } std::vector slice_support_enforcers() const { return this->slice_support_volumes(ModelVolumeType::SUPPORT_ENFORCER); } -protected: +private: // to be called from Print only. friend class Print; @@ -187,7 +202,8 @@ protected: void config_apply(const ConfigBase &other, bool ignore_nonexistent = false) { this->m_config.apply(other, ignore_nonexistent); } void config_apply_only(const ConfigBase &other, const t_config_option_keys &keys, bool ignore_nonexistent = false) { this->m_config.apply_only(other, keys, ignore_nonexistent); } void set_trafo(const Transform3d& trafo) { m_trafo = trafo; } - PrintBase::ApplyStatus set_copies(const Points &points); + PrintBase::ApplyStatus set_instances(PrintInstances &&instances); + void set_trafo_and_instances(const Transform3d& trafo, PrintInstances &&instances) { this->set_trafo(trafo); this->set_instances(std::move(instances)); } // Invalidates the step, and its depending steps in PrintObject and Print. bool invalidate_step(PrintObjectStep step); // Invalidates all PrintObject and Print steps. @@ -223,7 +239,7 @@ private: // Translation in Z + Rotation + Scaling / Mirroring. Transform3d m_trafo = Transform3d::Identity(); // Slic3r::Point objects in scaled G-code coordinates - Points m_copies; + std::vector m_instances; // scaled coordinates to add to copies (to compensate for the alignment // operated when creating the object but still preserving a coherent API // for external callers) diff --git a/src/libslic3r/PrintObject.cpp b/src/libslic3r/PrintObject.cpp index 8a59b6c3bf..adae28e4b1 100644 --- a/src/libslic3r/PrintObject.cpp +++ b/src/libslic3r/PrintObject.cpp @@ -60,32 +60,32 @@ PrintObject::PrintObject(Print* print, ModelObject* model_object, bool add_insta } if (add_instances) { - Points copies; - copies.reserve(m_model_object->instances.size()); + PrintInstances instances; + instances.reserve(m_model_object->instances.size()); for (const ModelInstance *mi : m_model_object->instances) { assert(mi->is_printable()); - const Vec3d& offset = mi->get_offset(); - copies.emplace_back(Point::new_scale(offset(0), offset(1))); + const Vec3d &offset = mi->get_offset(); + instances.emplace_back(PrintInstance{ nullptr, mi, Point::new_scale(offset(0), offset(1)) }); } - this->set_copies(copies); + this->set_instances(std::move(instances)); } } -PrintBase::ApplyStatus PrintObject::set_copies(const Points &points) +PrintBase::ApplyStatus PrintObject::set_instances(PrintInstances &&instances) { - // Order copies with a nearest-neighbor search. - std::vector copies; - copies.reserve(points.size()); - for (const Point &pt : points) - copies.emplace_back(pt + m_copies_shift); // Invalidate and set copies. PrintBase::ApplyStatus status = PrintBase::APPLY_STATUS_UNCHANGED; - if (copies != m_copies) { + bool equal_length = instances.size() == m_instances.size(); + bool equal = equal_length && std::equal(instances.begin(), instances.end(), m_instances.begin(), + [](const PrintInstance& lhs, const PrintInstance& rhs) { return lhs.model_instance == rhs.model_instance && lhs.shift == rhs.shift; }); + if (! equal) { status = PrintBase::APPLY_STATUS_CHANGED; if (m_print->invalidate_steps({ psSkirt, psBrim, psGCodeExport }) || - (copies.size() != m_copies.size() && m_print->invalidate_step(psWipeTower))) + (! equal_length && m_print->invalidate_step(psWipeTower))) status = PrintBase::APPLY_STATUS_INVALIDATED; - m_copies = copies; + m_instances = instances; + for (PrintInstance &i : m_instances) + i.print_object = this; } return status; } @@ -669,7 +669,7 @@ void PrintObject::detect_surfaces_type() m_print->throw_if_canceled(); // BOOST_LOG_TRIVIAL(trace) << "Detecting solid surfaces for region " << idx_region << " and layer " << layer->print_z; Layer *layer = m_layers[idx_layer]; - LayerRegion *layerm = layer->get_region(idx_region); + LayerRegion *layerm = layer->m_regions[idx_region]; // comparison happens against the *full* slices (considering all regions) // unless internal shells are requested Layer *upper_layer = (idx_layer + 1 < this->layer_count()) ? m_layers[idx_layer + 1] : nullptr; @@ -684,7 +684,7 @@ void PrintObject::detect_surfaces_type() Surfaces top; if (upper_layer) { Polygons upper_slices = interface_shells ? - to_polygons(upper_layer->get_region(idx_region)->slices.surfaces) : + to_polygons(upper_layer->m_regions[idx_region]->slices.surfaces) : to_polygons(upper_layer->lslices); surfaces_append(top, //FIXME implement offset2_ex working over ExPolygons, that should be a bit more efficient than calling offset_ex twice. @@ -727,7 +727,7 @@ void PrintObject::detect_surfaces_type() offset2_ex( diff( intersection(layerm_slices_surfaces, to_polygons(lower_layer->lslices)), // supported - to_polygons(lower_layer->get_region(idx_region)->slices.surfaces), + to_polygons(lower_layer->m_regions[idx_region]->slices.surfaces), true), -offset, offset), stBottom); @@ -796,7 +796,7 @@ void PrintObject::detect_surfaces_type() if (interface_shells) { // Move surfaces_new to layerm->slices.surfaces for (size_t idx_layer = 0; idx_layer < m_layers.size(); ++ idx_layer) - m_layers[idx_layer]->get_region(idx_region)->slices.surfaces = std::move(surfaces_new[idx_layer]); + m_layers[idx_layer]->m_regions[idx_region]->slices.surfaces = std::move(surfaces_new[idx_layer]); } BOOST_LOG_TRIVIAL(debug) << "Detecting solid surfaces for region " << idx_region << " - clipping in parallel - start"; @@ -806,7 +806,7 @@ void PrintObject::detect_surfaces_type() [this, idx_region, interface_shells, &surfaces_new](const tbb::blocked_range& range) { for (size_t idx_layer = range.begin(); idx_layer < range.end(); ++ idx_layer) { m_print->throw_if_canceled(); - LayerRegion *layerm = m_layers[idx_layer]->get_region(idx_region); + LayerRegion *layerm = m_layers[idx_layer]->m_regions[idx_region]; layerm->slices_to_fill_surfaces_clipped(); #ifdef SLIC3R_DEBUG_SLICE_PROCESSING layerm->export_region_fill_surfaces_to_svg_debug("1_detect_surfaces_type-final"); diff --git a/src/libslic3r/ShortestPath.cpp b/src/libslic3r/ShortestPath.cpp index e9df4c5b5c..a5d3a41ab7 100644 --- a/src/libslic3r/ShortestPath.cpp +++ b/src/libslic3r/ShortestPath.cpp @@ -1946,24 +1946,26 @@ ClipperLib::PolyNodes chain_clipper_polynodes(const Points &points, const Clippe return chain_path_items(points, items); } -std::vector> chain_print_object_instances(const Print &print) +std::vector chain_print_object_instances(const Print &print) { // Order objects using a nearest neighbor search. Points object_reference_points; std::vector> instances; for (size_t i = 0; i < print.objects().size(); ++ i) { const PrintObject &object = *print.objects()[i]; - for (size_t j = 0; j < object.copies().size(); ++ j) { - object_reference_points.emplace_back(object.copy_center(j)); + for (size_t j = 0; j < object.instances().size(); ++ j) { + object_reference_points.emplace_back(object.instance_center(j)); instances.emplace_back(i, j); } } auto segment_end_point = [&object_reference_points](size_t idx, bool /* first_point */) -> const Point& { return object_reference_points[idx]; }; std::vector> ordered = chain_segments_greedy(segment_end_point, instances.size(), nullptr); - std::vector> out; + std::vector out; out.reserve(instances.size()); - for (auto &segment_and_reversal : ordered) - out.emplace_back(instances[segment_and_reversal.first]); + for (auto &segment_and_reversal : ordered) { + const std::pair &inst = instances[segment_and_reversal.first]; + out.emplace_back(&print.objects()[inst.first]->instances()[inst.second]); + } return out; } diff --git a/src/libslic3r/ShortestPath.hpp b/src/libslic3r/ShortestPath.hpp index cd342015d7..65d8b7f239 100644 --- a/src/libslic3r/ShortestPath.hpp +++ b/src/libslic3r/ShortestPath.hpp @@ -30,7 +30,8 @@ std::vector chain_clipper_polynodes(const Points &points // Chain instances of print objects by an approximate shortest path. // Returns pairs of PrintObject idx and instance of that PrintObject. class Print; -std::vector> chain_print_object_instances(const Print &print); +struct PrintInstance; +std::vector chain_print_object_instances(const Print &print); } // namespace Slic3r diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 7cceb1a5f1..9a5cea511b 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -5251,7 +5251,7 @@ void GLCanvas3D::_load_print_object_toolpaths(const PrintObject& print_object, c struct Ctxt { - const Points *shifted_copies; + const PrintInstances *shifted_copies; std::vector layers; bool has_perimeters; bool has_infill; @@ -5384,7 +5384,7 @@ void GLCanvas3D::_load_print_object_toolpaths(const PrintObject& print_object, c ctxt.is_single_material_print = this->fff_print()->extruders().size()==1; ctxt.extruders_cnt = wxGetApp().extruders_edited_cnt(); - ctxt.shifted_copies = &print_object.copies(); + ctxt.shifted_copies = &print_object.instances(); // order layers by print_z { @@ -5473,7 +5473,8 @@ void GLCanvas3D::_load_print_object_toolpaths(const PrintObject& print_object, c vol->offsets.push_back(vol->indexed_vertex_array.quad_indices.size()); vol->offsets.push_back(vol->indexed_vertex_array.triangle_indices.size()); } - for (const Point © : *ctxt.shifted_copies) { + for (const PrintInstance &instance : *ctxt.shifted_copies) { + const Point © = instance.shift; for (const LayerRegion *layerm : layer->regions()) { if (is_selected_separate_extruder) { From 4f8f6196864770f01f33d16c0d147f61bc3cbdd1 Mon Sep 17 00:00:00 2001 From: bubnikv Date: Thu, 23 Jan 2020 10:35:03 +0100 Subject: [PATCH 143/336] Fixed Perl bindings after refactoring. --- xs/xsp/Print.xsp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/xs/xsp/Print.xsp b/xs/xsp/Print.xsp index 74c0f4b0ce..2e329bfa6c 100644 --- a/xs/xsp/Print.xsp +++ b/xs/xsp/Print.xsp @@ -48,12 +48,8 @@ _constant() Ref model_object(); Ref config() %code%{ RETVAL = &THIS->config(); %}; - Points copies(); Clone bounding_box(); - Points _shifted_copies() - %code%{ RETVAL = THIS->copies(); %}; - size_t layer_count(); Ref get_layer(int idx); From f8a5796ca5f676c8fa32629fdad6cb0a4559b4d4 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Thu, 23 Jan 2020 10:57:51 +0100 Subject: [PATCH 144/336] add mesh simplification. SPE-1072 Working but flipped normals with the interior. Testing on treefrog passed Oversampling for hollowed mesh should not be less than 3x Flip back normals after simplify and remove redundant test code. --- src/libslic3r/CMakeLists.txt | 3 + src/libslic3r/OpenVDBUtils.cpp | 12 +- src/libslic3r/SLA/Hollowing.cpp | 69 ++- src/libslic3r/SimplifyMesh.cpp | 66 +++ src/libslic3r/SimplifyMesh.hpp | 25 + src/libslic3r/SimplifyMeshImpl.hpp | 699 ++++++++++++++++++++++++++ src/libslic3r/TriangleMesh.cpp | 28 ++ src/libslic3r/TriangleMesh.hpp | 1 + tests/libslic3r/CMakeLists.txt | 1 + tests/libslic3r/test_hollowing.cpp | 4 + tests/libslic3r/test_meshsimplify.cpp | 11 + 11 files changed, 875 insertions(+), 44 deletions(-) create mode 100644 src/libslic3r/SimplifyMesh.cpp create mode 100644 src/libslic3r/SimplifyMesh.hpp create mode 100644 src/libslic3r/SimplifyMeshImpl.hpp create mode 100644 tests/libslic3r/test_meshsimplify.cpp diff --git a/src/libslic3r/CMakeLists.txt b/src/libslic3r/CMakeLists.txt index 9245e5c2af..d01c01ec2d 100644 --- a/src/libslic3r/CMakeLists.txt +++ b/src/libslic3r/CMakeLists.txt @@ -183,6 +183,9 @@ add_library(libslic3r STATIC MinAreaBoundingBox.cpp miniz_extension.hpp miniz_extension.cpp + SimplifyMesh.hpp + SimplifyMeshImpl.hpp + SimplifyMesh.cpp ${OpenVDBUtils_SOURCES} SLA/Common.hpp SLA/Common.cpp diff --git a/src/libslic3r/OpenVDBUtils.cpp b/src/libslic3r/OpenVDBUtils.cpp index c76bad96c5..c30052036e 100644 --- a/src/libslic3r/OpenVDBUtils.cpp +++ b/src/libslic3r/OpenVDBUtils.cpp @@ -84,9 +84,9 @@ openvdb::FloatGrid::Ptr mesh_to_grid(const sla::Contour3D &mesh, template sla::Contour3D _volumeToMesh(const Grid &grid, - double isovalue, - double adaptivity, - bool relaxDisorientedTriangles) + double isovalue, + double adaptivity, + bool relaxDisorientedTriangles) { openvdb::initialize(); @@ -110,9 +110,9 @@ sla::Contour3D _volumeToMesh(const Grid &grid, } TriangleMesh grid_to_mesh(const openvdb::FloatGrid &grid, - double isovalue, - double adaptivity, - bool relaxDisorientedTriangles) + double isovalue, + double adaptivity, + bool relaxDisorientedTriangles) { return to_triangle_mesh( _volumeToMesh(grid, isovalue, adaptivity, relaxDisorientedTriangles)); diff --git a/src/libslic3r/SLA/Hollowing.cpp b/src/libslic3r/SLA/Hollowing.cpp index 5ab85c1cc4..1ce0c4c679 100644 --- a/src/libslic3r/SLA/Hollowing.cpp +++ b/src/libslic3r/SLA/Hollowing.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include @@ -24,41 +25,15 @@ template> inline void _scale(S s, TriangleMesh &m) { m.scale(float(s)); } template> -inline void _scale(S s, Contour3D &m) -{ - for (auto &p : m.points) p *= s; -} +inline void _scale(S s, Contour3D &m) { for (auto &p : m.points) p *= s; } -template -remove_cvref_t _grid_to_mesh(const openvdb::FloatGrid &grid, - double isosurf, - double adapt); - -template<> -TriangleMesh _grid_to_mesh(const openvdb::FloatGrid &grid, - double isosurf, - double adapt) +static TriangleMesh _generate_interior(const TriangleMesh &mesh, + const JobController &ctl, + double min_thickness, + double voxel_scale, + double closing_dist) { - return grid_to_mesh(grid, isosurf, adapt); -} - -template<> -Contour3D _grid_to_mesh(const openvdb::FloatGrid &grid, - double isosurf, - double adapt) -{ - return grid_to_contour3d(grid, isosurf, adapt); -} - -template -remove_cvref_t _generate_interior(Mesh &&mesh, - const JobController &ctl, - double min_thickness, - double voxel_scale, - double closing_dist) -{ - using MMesh = remove_cvref_t; - MMesh imesh{std::forward(mesh)}; + TriangleMesh imesh{mesh}; _scale(voxel_scale, imesh); @@ -76,7 +51,7 @@ remove_cvref_t _generate_interior(Mesh &&mesh, if (!gridptr) { BOOST_LOG_TRIVIAL(error) << "Returned OpenVDB grid is NULL"; - return MMesh{}; + return {}; } if (ctl.stopcondition()) return {}; @@ -93,7 +68,7 @@ remove_cvref_t _generate_interior(Mesh &&mesh, double iso_surface = D; double adaptivity = 0.; - auto omesh = _grid_to_mesh(*gridptr, iso_surface, adaptivity); + auto omesh = grid_to_mesh(*gridptr, iso_surface, adaptivity); _scale(1. / voxel_scale, omesh); @@ -107,7 +82,8 @@ std::unique_ptr generate_interior(const TriangleMesh & mesh, const HollowingConfig &hc, const JobController & ctl) { - static const double MAX_OVERSAMPL = 7.; + static const double MIN_OVERSAMPL = 3.; + static const double MAX_OVERSAMPL = 8.; // I can't figure out how to increase the grid resolution through openvdb // API so the model will be scaled up before conversion and the result @@ -116,10 +92,27 @@ std::unique_ptr generate_interior(const TriangleMesh & mesh, // voxels. // // max 8x upscale, min is native voxel size - auto voxel_scale = (1.0 + MAX_OVERSAMPL * hc.quality); - return std::make_unique( + auto voxel_scale = MIN_OVERSAMPL + (MAX_OVERSAMPL - MIN_OVERSAMPL) * hc.quality; + auto meshptr = std::make_unique( _generate_interior(mesh, ctl, hc.min_thickness, voxel_scale, hc.closing_distance)); + + if (meshptr) { + + // This flips the normals to be outward facing... + meshptr->require_shared_vertices(); + indexed_triangle_set its = std::move(meshptr->its); + + Slic3r::simplify_mesh(its); + + // flip normals back... + for (stl_triangle_vertex_indices &ind : its.indices) + std::swap(ind(0), ind(2)); + + *meshptr = Slic3r::TriangleMesh{its}; + } + + return meshptr; } Contour3D DrainHole::to_mesh() const diff --git a/src/libslic3r/SimplifyMesh.cpp b/src/libslic3r/SimplifyMesh.cpp new file mode 100644 index 0000000000..d30ecfec57 --- /dev/null +++ b/src/libslic3r/SimplifyMesh.cpp @@ -0,0 +1,66 @@ +#include "SimplifyMesh.hpp" +#include "SimplifyMeshImpl.hpp" + +namespace SimplifyMesh { + +template<> struct vertex_traits { + using coord_type = float; + using compute_type = double; + + static inline float x(const stl_vertex &v) { return v.x(); } + static inline float& x(stl_vertex &v) { return v.x(); } + + static inline float y(const stl_vertex &v) { return v.y(); } + static inline float& y(stl_vertex &v) { return v.y(); } + + static inline float z(const stl_vertex &v) { return v.z(); } + static inline float& z(stl_vertex &v) { return v.z(); } +}; + +template<> struct mesh_traits { + using vertex_t = stl_vertex; + static size_t face_count(const indexed_triangle_set &m) + { + return m.indices.size(); + } + static size_t vertex_count(const indexed_triangle_set &m) + { + return m.vertices.size(); + } + static vertex_t vertex(const indexed_triangle_set &m, size_t idx) + { + return m.vertices[idx]; + } + static void vertex(indexed_triangle_set &m, size_t idx, const vertex_t &v) + { + m.vertices[idx] = v; + } + static Index3 triangle(const indexed_triangle_set &m, size_t idx) + { + std::array t; + for (size_t i = 0; i < 3; ++i) t[i] = size_t(m.indices[idx](int(i))); + return t; + } + static void triangle(indexed_triangle_set &m, size_t fidx, const Index3 &t) + { + auto &face = m.indices[fidx]; + face(0) = int(t[0]); face(1) = int(t[1]); face(2) = int(t[2]); + } + static void update(indexed_triangle_set &m, size_t vc, size_t fc) + { + m.vertices.resize(vc); + m.indices.resize(fc); + } +}; + +} // namespace SimplifyMesh + +namespace Slic3r { + +void simplify_mesh(indexed_triangle_set &m) +{ + SimplifyMesh::implementation::SimplifiableMesh sm{&m}; + sm.simplify_mesh_lossless(); +} + +} diff --git a/src/libslic3r/SimplifyMesh.hpp b/src/libslic3r/SimplifyMesh.hpp new file mode 100644 index 0000000000..fb3e73d049 --- /dev/null +++ b/src/libslic3r/SimplifyMesh.hpp @@ -0,0 +1,25 @@ +#ifndef MESHSIMPLIFY_HPP +#define MESHSIMPLIFY_HPP + +#include + +#include + +namespace Slic3r { + +void simplify_mesh(indexed_triangle_set &); + +// TODO: (but this can be done with IGL as well) +// void simplify_mesh(indexed_triangle_set &, int face_count, float agressiveness = 0.5f); + +template void simplify_mesh(TriangleMesh &m, Args &&...a) +{ + m.require_shared_vertices(); + simplify_mesh(m.its, std::forward(a)...); + m = TriangleMesh{m.its}; + m.require_shared_vertices(); +} + +} // namespace Slic3r + +#endif // MESHSIMPLIFY_H diff --git a/src/libslic3r/SimplifyMeshImpl.hpp b/src/libslic3r/SimplifyMeshImpl.hpp new file mode 100644 index 0000000000..6add08930c --- /dev/null +++ b/src/libslic3r/SimplifyMeshImpl.hpp @@ -0,0 +1,699 @@ +// /////////////////////////////////////////// +// +// Mesh Simplification Tutorial +// +// (C) by Sven Forstmann in 2014 +// +// License : MIT +// http://opensource.org/licenses/MIT +// +// https://github.com/sp4cerat/Fast-Quadric-Mesh-Simplification +// +// 5/2016: Chris Rorden created minimal version for OSX/Linux/Windows compile +// https://github.com/sp4cerat/Fast-Quadric-Mesh-Simplification/ +// +// libslic3r refactor by tamasmeszaros + +#ifndef SIMPLIFYMESHIMPL_HPP +#define SIMPLIFYMESHIMPL_HPP + +#include +#include +#include +#include + +#ifndef NDEBUG +#include +#endif + +namespace SimplifyMesh { + +using Bary = std::array; +using Index3 = std::array; + +template struct vertex_traits { + using coord_type = typename Vertex::coord_type; + using compute_type = coord_type; + + static coord_type x(const Vertex &v); + static coord_type& x(Vertex &v); + + static coord_type y(const Vertex &v); + static coord_type& y(Vertex &v); + + static coord_type z(const Vertex &v); + static coord_type& z(Vertex &v); +}; + +template struct mesh_traits { + using vertex_t = typename Mesh::vertex_t; + + static size_t face_count(const Mesh &m); + static size_t vertex_count(const Mesh &m); + static vertex_t vertex(const Mesh &m, size_t vertex_idx); + static void vertex(Mesh &m, size_t vertex_idx, const vertex_t &v); + static Index3 triangle(const Mesh &m, size_t face_idx); + static void triangle(Mesh &m, size_t face_idx, const Index3 &t); + static void update(Mesh &m, size_t vertex_count, size_t face_count); +}; + +namespace implementation { + +// A shorter C++14 style form of the enable_if metafunction +template +using enable_if_t = typename std::enable_if::type; + +// Meta predicates for floating, 'scaled coord' and generic arithmetic types +template +using FloatingOnly = enable_if_t::value, O>; + +template +using IntegerOnly = enable_if_t::value, O>; + +template +using ArithmeticOnly = enable_if_t::value, O>; + +template< class T > +struct remove_cvref { + using type = typename std::remove_cv< + typename std::remove_reference::type>::type; +}; + +template< class T > +using remove_cvref_t = typename remove_cvref::type; + +struct DOut { +#ifndef NDEBUG + std::ostream& out = std::cout; +#endif +}; + +template +inline DOut&& operator<<( DOut&& out, T&& d) { +#ifndef NDEBUG + out.out << d; +#endif + return std::move(out); +} + +inline DOut dout() { return DOut(); } + +template FloatingOnly is_approx(T val, T ref) { return std::abs(val - ref) < 1e-8; } +template IntegerOnly is_approx(T val, T ref) { val == ref; } + +template class SymetricMatrix { +public: + + explicit SymetricMatrix(ArithmeticOnly c = T()) { std::fill(m, m + N, c); } + + SymetricMatrix(T m11, T m12, T m13, T m14, + T m22, T m23, T m24, + T m33, T m34, + T m44) + { + m[0] = m11; m[1] = m12; m[2] = m13; m[3] = m14; + m[4] = m22; m[5] = m23; m[6] = m24; + m[7] = m33; m[8] = m34; + m[9] = m44; + } + + // Make plane + SymetricMatrix(T a, T b, T c, T d) + { + m[0] = a * a; m[1] = a * b; m[2] = a * c; m[3] = a * d; + m[4] = b * b; m[5] = b * c; m[6] = b * d; + m[7] = c * c; m[8] = c * d; + m[9] = d * d; + } + + T operator[](int c) const { return m[c]; } + + // Determinant + T det(int a11, int a12, int a13, + int a21, int a22, int a23, + int a31, int a32, int a33) + { + T det = m[a11] * m[a22] * m[a33] + m[a13] * m[a21] * m[a32] + + m[a12] * m[a23] * m[a31] - m[a13] * m[a22] * m[a31] - + m[a11] * m[a23] * m[a32] - m[a12] * m[a21] * m[a33]; + + return det; + } + + const SymetricMatrix operator+(const SymetricMatrix& n) const + { + return SymetricMatrix(m[0] + n[0], m[1] + n[1], m[2] + n[2], m[3]+n[3], + m[4] + n[4], m[5] + n[5], m[6] + n[6], + m[7] + n[7], m[8] + n[8], + m[9] + n[9]); + } + + SymetricMatrix& operator+=(const SymetricMatrix& n) + { + m[0]+=n[0]; m[1]+=n[1]; m[2]+=n[2]; m[3]+=n[3]; + m[4]+=n[4]; m[5]+=n[5]; m[6]+=n[6]; m[7]+=n[7]; + m[8]+=n[8]; m[9]+=n[9]; + + return *this; + } + + T m[N]; +}; + +template using TCoord = typename vertex_traits>::coord_type; +template using TCompute = typename vertex_traits>::compute_type; +template inline TCoord x(const V &v) { return vertex_traits>::x(v); } +template inline TCoord y(const V &v) { return vertex_traits>::y(v); } +template inline TCoord z(const V &v) { return vertex_traits>::z(v); } +template inline TCoord& x(V &v) { return vertex_traits>::x(v); } +template inline TCoord& y(V &v) { return vertex_traits>::y(v); } +template inline TCoord& z(V &v) { return vertex_traits>::z(v); } +template using TVertex = typename mesh_traits>::vertex_t; +template using TMeshCoord = TCoord>; + +template TCompute dot(const Vertex &v1, const Vertex &v2) +{ + return TCompute(x(v1)) * x(v2) + + TCompute(y(v1)) * y(v2) + + TCompute(z(v1)) * z(v2); +} + +template Vertex cross(const Vertex &a, const Vertex &b) +{ + return Vertex{y(a) * z(b) - z(a) * y(b), + z(a) * x(b) - x(a) * z(b), + x(a) * y(b) - y(a) * x(b)}; +} + +template TCompute lengthsq(const Vertex &v) +{ + return TCompute(x(v)) * x(v) + TCompute(y(v)) * y(v) + + TCompute(z(v)) * z(v); +} + +template void normalize(Vertex &v) +{ + double square = std::sqrt(lengthsq(v)); + x(v) /= square; y(v) /= square; z(v) /= square; +} + +using Bary = std::array; + +template +Bary barycentric(const Vertex &p, const Vertex &a, const Vertex &b, const Vertex &c) +{ + Vertex v0 = (b - a); + Vertex v1 = (c - a); + Vertex v2 = (p - a); + + double d00 = dot(v0, v0); + double d01 = dot(v0, v1); + double d11 = dot(v1, v1); + double d20 = dot(v2, v0); + double d21 = dot(v2, v1); + double denom = d00 * d11 - d01 * d01; + double v = (d11 * d20 - d01 * d21) / denom; + double w = (d00 * d21 - d01 * d20) / denom; + double u = 1.0 - v - w; + + return {u, v, w}; +} + +template class SimplifiableMesh { + Mesh *m_mesh; + + using Vertex = TVertex; + using Coord = TMeshCoord; + using HiPrecison = TCompute>; + using SymMat = SymetricMatrix; + + struct FaceInfo { + size_t idx; + double err[4] = {0.}; + bool deleted = false, dirty = false; + Vertex n; + explicit FaceInfo(size_t id): idx(id) {} + }; + + struct VertexInfo { + size_t idx; + size_t tstart = 0, tcount = 0; + bool border = false; + SymMat q; + explicit VertexInfo(size_t id): idx(id) {} + }; + + struct Ref { size_t face; size_t vertex; }; + + std::vector m_refs; + std::vector m_faceinfo; + std::vector m_vertexinfo; + + void compact_faces(); + void compact(); + + size_t mesh_vcount() const { return mesh_traits::vertex_count(*m_mesh); } + size_t mesh_facecount() const { return mesh_traits::face_count(*m_mesh); } + + size_t vcount() const { return m_vertexinfo.size(); } + + inline Vertex read_vertex(size_t vi) const + { + return mesh_traits::vertex(*m_mesh, vi); + } + + inline Vertex read_vertex(const VertexInfo &vinf) const + { + return read_vertex(vinf.idx); + } + + inline void write_vertex(size_t idx, const Vertex &v) const + { + mesh_traits::vertex(*m_mesh, idx, v); + } + + inline void write_vertex(const VertexInfo &vinf, const Vertex &v) const + { + write_vertex(vinf.idx, v); + } + + inline Index3 read_triangle(size_t fi) const + { + return mesh_traits::triangle(*m_mesh, fi); + } + + inline Index3 read_triangle(const FaceInfo &finf) const + { + return read_triangle(finf.idx); + } + + inline void write_triangle(size_t idx, const Index3 &t) + { + return mesh_traits::triangle(*m_mesh, idx, t); + } + + inline void write_triangle(const FaceInfo &finf, const Index3 &t) + { + return write_triangle(finf.idx, t); + } + + inline std::array triangle_vertices(const Index3 &f) const + { + std::array p; + for (size_t i = 0; i < 3; ++i) p[i] = read_vertex(f[i]); + return p; + } + + // Error between vertex and Quadric + static double vertex_error(const SymMat &q, const Vertex &v) + { + Coord _x = x(v) , _y = y(v), _z = z(v); + return q[0] * _x * _x + 2 * q[1] * _x * _y + 2 * q[2] * _x * _z + + 2 * q[3] * _x + q[4] * _y * _y + 2 * q[5] * _y * _z + + 2 * q[6] * _y + q[7] * _z * _z + 2 * q[8] * _z + q[9]; + } + + // Error for one edge + double calculate_error(size_t id_v1, size_t id_v2, Vertex &p_result); + + void calculate_error(FaceInfo &fi) + { + Vertex p; + Index3 t = read_triangle(fi); + for (size_t j = 0; j < 3; ++j) + fi.err[j] = calculate_error(t[j], t[(j + 1) % 3], p); + + fi.err[3] = std::min(fi.err[0], std::min(fi.err[1], fi.err[2])); + } + + void update_mesh(int iteration); + + // Update triangle connections and edge error after a edge is collapsed + void update_triangles(size_t i, VertexInfo &vi, std::vector &deleted, int &deleted_triangles); + + // Check if a triangle flips when this edge is removed + bool flipped(const Vertex &p, size_t i0, size_t i1, VertexInfo &v0, VertexInfo &v1, std::vector &deleted); + +public: + + explicit SimplifiableMesh(Mesh *m) : m_mesh{m} + { + static_assert( + std::is_arithmetic::value, + "Coordinate type of mesh has to be an arithmetic type!"); + + m_faceinfo.reserve(mesh_traits::face_count(*m)); + m_vertexinfo.reserve(mesh_traits::vertex_count(*m)); + for (size_t i = 0; i < mesh_facecount(); ++i) m_faceinfo.emplace_back(i); + for (size_t i = 0; i < mesh_vcount(); ++i) m_vertexinfo.emplace_back(i); + + } + + void simplify_mesh_lossless(); +}; + + +template void SimplifiableMesh::compact_faces() +{ + auto it = std::remove_if(m_faceinfo.begin(), m_faceinfo.end(), + [](const FaceInfo &inf) { return inf.deleted; }); + + m_faceinfo.erase(it, m_faceinfo.end()); +} + +template void SimplifiableMesh::compact() +{ + for (auto &vi : m_vertexinfo) vi.tcount = 0; + + compact_faces(); + + for (FaceInfo &fi : m_faceinfo) + for (size_t vidx : read_triangle(fi)) m_vertexinfo[vidx].tcount = 1; + + size_t dst = 0; + for (VertexInfo &vi : m_vertexinfo) { + if (vi.tcount) { + vi.tstart = dst; + write_vertex(dst++, read_vertex(vi)); + } + } + + size_t vertex_count = dst; + + dst = 0; + for (const FaceInfo &fi : m_faceinfo) { + Index3 t = read_triangle(fi); + for (size_t &idx : t) idx = m_vertexinfo[idx].tstart; + write_triangle(dst++, t); + } + + mesh_traits::update(*m_mesh, vertex_count, m_faceinfo.size()); +} + +template +double SimplifiableMesh::calculate_error(size_t id_v1, size_t id_v2, Vertex &p_result) +{ + // compute interpolated vertex + + SymMat q = m_vertexinfo[id_v1].q + m_vertexinfo[id_v2].q; + + bool border = m_vertexinfo[id_v1].border & m_vertexinfo[id_v2].border; + double error = 0; + HiPrecison det = q.det(0, 1, 2, 1, 4, 5, 2, 5, 7); + + if (!is_approx(det, HiPrecison(0)) && !border) + { + // q_delta is invertible + x(p_result) = Coord(-1) / det * q.det(1, 2, 3, 4, 5, 6, 5, 7, 8); // vx = A41/det(q_delta) + y(p_result) = Coord( 1) / det * q.det(0, 2, 3, 1, 5, 6, 2, 7, 8); // vy = A42/det(q_delta) + z(p_result) = Coord(-1) / det * q.det(0, 1, 3, 1, 4, 6, 2, 5, 8); // vz = A43/det(q_delta) + + error = vertex_error(q, p_result); + } else { + // det = 0 -> try to find best result + Vertex p1 = read_vertex(id_v1); + Vertex p2 = read_vertex(id_v2); + Vertex p3 = (p1 + p2) / 2; + double error1 = vertex_error(q, p1); + double error2 = vertex_error(q, p2); + double error3 = vertex_error(q, p3); + error = std::min(error1, std::min(error2, error3)); + + if (is_approx(error1, error)) p_result = p1; + if (is_approx(error2, error)) p_result = p2; + if (is_approx(error3, error)) p_result = p3; + } + + return error; +} + +template void SimplifiableMesh::update_mesh(int iteration) +{ + if (iteration > 0) compact_faces(); + + assert(mesh_vcount() == m_vertexinfo.size()); + + // + // Init Quadrics by Plane & Edge Errors + // + // required at the beginning ( iteration == 0 ) + // recomputing during the simplification is not required, + // but mostly improves the result for closed meshes + // + if (iteration == 0) { + + for (VertexInfo &vinf : m_vertexinfo) vinf.q = SymMat{}; + for (FaceInfo &finf : m_faceinfo) { + Index3 t = read_triangle(finf); + std::array p = triangle_vertices(t); + Vertex n = cross(Vertex(p[1] - p[0]), Vertex(p[2] - p[0])); + normalize(n); + finf.n = n; + + for (size_t fi : t) + m_vertexinfo[fi].q += SymMat(x(n), y(n), z(n), -dot(n, p[0])); + + calculate_error(finf); + } + } + + // Init Reference ID list + for (VertexInfo &vi : m_vertexinfo) { vi.tstart = 0; vi.tcount = 0; } + + for (FaceInfo &fi : m_faceinfo) + for (size_t vidx : read_triangle(fi)) + m_vertexinfo[vidx].tcount++; + + size_t tstart = 0; + for (VertexInfo &vi : m_vertexinfo) { + vi.tstart = tstart; + tstart += vi.tcount; + vi.tcount = 0; + } + + // Write References + m_refs.resize(m_faceinfo.size() * 3); + for (size_t i = 0; i < m_faceinfo.size(); ++i) { + const FaceInfo &fi = m_faceinfo[i]; + Index3 t = read_triangle(fi); + for (size_t j = 0; j < 3; ++j) { + VertexInfo &vi = m_vertexinfo[t[j]]; + + assert(vi.tstart + vi.tcount < m_refs.size()); + + Ref &ref = m_refs[vi.tstart + vi.tcount]; + ref.face = i; + ref.vertex = j; + vi.tcount++; + } + } + + // Identify boundary : vertices[].border=0,1 + if (iteration == 0) { + for (VertexInfo &vi: m_vertexinfo) vi.border = false; + + std::vector vcount, vids; + + for (VertexInfo &vi: m_vertexinfo) { + vcount.clear(); + vids.clear(); + + for(size_t j = 0; j < vi.tcount; ++j) { + assert(vi.tstart + j < m_refs.size()); + FaceInfo &fi = m_faceinfo[m_refs[vi.tstart + j].face]; + Index3 t = read_triangle(fi); + + for (size_t fid : t) { + size_t ofs=0; + while (ofs < vcount.size()) + { + if (vids[ofs] == fid) break; + ofs++; + } + if (ofs == vcount.size()) + { + vcount.emplace_back(1); + vids.emplace_back(fid); + } + else + vcount[ofs]++; + } + } + + for (size_t j = 0; j < vcount.size(); ++j) + if(vcount[j] == 1) m_vertexinfo[vids[j]].border = true; + } + } +} + +template +void SimplifiableMesh::update_triangles(size_t i0, + VertexInfo & vi, + std::vector &deleted, + int &deleted_triangles) +{ + Vertex p; + for (size_t k = 0; k < vi.tcount; ++k) { + assert(vi.tstart + k < m_refs.size()); + + Ref &r = m_refs[vi.tstart + k]; + FaceInfo &fi = m_faceinfo[r.face]; + + if (fi.deleted) continue; + + if (deleted[k]) { + fi.deleted = true; + deleted_triangles++; + continue; + } + + Index3 t = read_triangle(fi); + t[r.vertex] = i0; + write_triangle(fi, t); + + fi.dirty = true; + fi.err[0] = calculate_error(t[0], t[1], p); + fi.err[1] = calculate_error(t[1], t[2], p); + fi.err[2] = calculate_error(t[2], t[0], p); + fi.err[3] = std::min(fi.err[0], std::min(fi.err[1], fi.err[2])); + m_refs.emplace_back(r); + } +} + +template +bool SimplifiableMesh::flipped(const Vertex & p, + size_t /*i0*/, + size_t i1, + VertexInfo & v0, + VertexInfo & /*v1*/, + std::vector &deleted) +{ + for (size_t k = 0; k < v0.tcount; ++k) { + size_t ridx = v0.tstart + k; + assert(ridx < m_refs.size()); + + FaceInfo &fi = m_faceinfo[m_refs[ridx].face]; + if (fi.deleted) continue; + + Index3 t = read_triangle(fi); + int s = m_refs[ridx].vertex; + size_t id1 = t[(s+1) % 3]; + size_t id2 = t[(s+2) % 3]; + + if(id1 == i1 || id2 == i1) // delete ? + { + deleted[k] = true; + continue; + } + + Vertex d1 = read_vertex(id1) - p; + normalize(d1); + Vertex d2 = read_vertex(id2) - p; + normalize(d2); + + if (std::abs(dot(d1, d2)) > 0.999) return true; + + Vertex n = cross(d1, d2); + normalize(n); + + deleted[k] = false; + if (dot(n, fi.n) < 0.2) return true; + } + + return false; +} + +template +void SimplifiableMesh::simplify_mesh_lossless() +{ + // init + for (FaceInfo &fi : m_faceinfo) fi.deleted = false; + + // main iteration loop + int deleted_triangles=0; + std::vector deleted0, deleted1; + + for (int iteration = 0; iteration < 9999; iteration ++) { + // update mesh constantly + update_mesh(iteration); + + // clear dirty flag + for (FaceInfo &fi : m_faceinfo) fi.dirty = false; + + // + // All triangles with edges below the threshold will be removed + // + // The following numbers works well for most models. + // If it does not, try to adjust the 3 parameters + // + double threshold = std::numeric_limits::epsilon(); //1.0E-3 EPS; // Really? (tm) + + dout() << "lossless iteration " << iteration << "\n"; + + for (FaceInfo &fi : m_faceinfo) { + if (fi.err[3] > threshold || fi.deleted || fi.dirty) continue; + + for (size_t j = 0; j < 3; ++j) { + if (fi.err[j] > threshold) continue; + + Index3 t = read_triangle(fi); + size_t i0 = t[j]; + VertexInfo &v0 = m_vertexinfo[i0]; + + size_t i1 = t[(j + 1) % 3]; + VertexInfo &v1 = m_vertexinfo[i1]; + + // Border check + if(v0.border != v1.border) continue; + + // Compute vertex to collapse to + Vertex p; + calculate_error(i0, i1, p); + + deleted0.resize(v0.tcount); // normals temporarily + deleted1.resize(v1.tcount); // normals temporarily + + // don't remove if flipped + if (flipped(p, i0, i1, v0, v1, deleted0)) continue; + if (flipped(p, i1, i0, v1, v0, deleted1)) continue; + + // not flipped, so remove edge + write_vertex(v0, p); + v0.q = v1.q + v0.q; + size_t tstart = m_refs.size(); + + update_triangles(i0, v0, deleted0, deleted_triangles); + update_triangles(i0, v1, deleted1, deleted_triangles); + + assert(m_refs.size() >= tstart); + + size_t tcount = m_refs.size() - tstart; + + if(tcount <= v0.tcount) + { + // save ram + if (tcount) { + auto from = m_refs.begin() + tstart, to = from + tcount; + std::copy(from, to, m_refs.begin() + v0.tstart); + } + } + else + // append + v0.tstart = tstart; + + v0.tcount = tcount; + break; + } + } + + if (deleted_triangles <= 0) break; + deleted_triangles = 0; + } + + compact(); +} + +} // namespace implementation +} // namespace SimplifyMesh + +#endif // SIMPLIFYMESHIMPL_HPP diff --git a/src/libslic3r/TriangleMesh.cpp b/src/libslic3r/TriangleMesh.cpp index 5cd97522d9..4c6cd62cf2 100644 --- a/src/libslic3r/TriangleMesh.cpp +++ b/src/libslic3r/TriangleMesh.cpp @@ -70,6 +70,34 @@ TriangleMesh::TriangleMesh(const Pointf3s &points, const std::vector& f stl_get_size(&stl); } +TriangleMesh::TriangleMesh(const indexed_triangle_set &M) +{ + stl.stats.type = inmemory; + + // count facets and allocate memory + stl.stats.number_of_facets = uint32_t(M.indices.size()); + stl.stats.original_num_facets = int(stl.stats.number_of_facets); + stl_allocate(&stl); + + for (uint32_t i = 0; i < stl.stats.number_of_facets; ++ i) { + stl_facet facet; + facet.vertex[0] = M.vertices[size_t(M.indices[i](0))]; + facet.vertex[1] = M.vertices[size_t(M.indices[i](1))]; + facet.vertex[2] = M.vertices[size_t(M.indices[i](2))]; + facet.extra[0] = 0; + facet.extra[1] = 0; + + stl_normal normal; + stl_calculate_normal(normal, &facet); + stl_normalize_vector(normal); + facet.normal = normal; + + stl.facet_start[i] = facet; + } + + stl_get_size(&stl); +} + // #define SLIC3R_TRACE_REPAIR void TriangleMesh::repair(bool update_shared_vertices) diff --git a/src/libslic3r/TriangleMesh.hpp b/src/libslic3r/TriangleMesh.hpp index ef935455ef..1a22a93435 100644 --- a/src/libslic3r/TriangleMesh.hpp +++ b/src/libslic3r/TriangleMesh.hpp @@ -23,6 +23,7 @@ class TriangleMesh public: TriangleMesh() : repaired(false) {} TriangleMesh(const Pointf3s &points, const std::vector &facets); + explicit TriangleMesh(const indexed_triangle_set &M); void clear() { this->stl.clear(); this->its.clear(); this->repaired = false; } bool ReadSTLFile(const char* input_file) { return stl_open(&stl, input_file); } bool write_ascii(const char* output_file) { return stl_write_ascii(&this->stl, output_file, ""); } diff --git a/tests/libslic3r/CMakeLists.txt b/tests/libslic3r/CMakeLists.txt index 8ee43acc8f..adcb2722d8 100644 --- a/tests/libslic3r/CMakeLists.txt +++ b/tests/libslic3r/CMakeLists.txt @@ -11,6 +11,7 @@ add_executable(${_TEST_NAME}_tests test_placeholder_parser.cpp test_polygon.cpp test_stl.cpp + test_meshsimplify.cpp ) if (TARGET OpenVDB::openvdb) diff --git a/tests/libslic3r/test_hollowing.cpp b/tests/libslic3r/test_hollowing.cpp index 0cb1ac343c..65b87c2a23 100644 --- a/tests/libslic3r/test_hollowing.cpp +++ b/tests/libslic3r/test_hollowing.cpp @@ -9,6 +9,8 @@ #include +#include + #if defined(WIN32) || defined(_WIN32) #define PATH_SEPARATOR R"(\)" #else @@ -23,6 +25,7 @@ static Slic3r::TriangleMesh load_model(const std::string &obj_filename) return mesh; } + TEST_CASE("Negative 3D offset should produce smaller object.", "[Hollowing]") { Slic3r::TriangleMesh in_mesh = load_model("20mm_cube.obj"); @@ -40,3 +43,4 @@ TEST_CASE("Negative 3D offset should produce smaller object.", "[Hollowing]") in_mesh.require_shared_vertices(); in_mesh.WriteOBJFile("merged_out.obj"); } + diff --git a/tests/libslic3r/test_meshsimplify.cpp b/tests/libslic3r/test_meshsimplify.cpp new file mode 100644 index 0000000000..d21c3a8924 --- /dev/null +++ b/tests/libslic3r/test_meshsimplify.cpp @@ -0,0 +1,11 @@ +#include +#include + +//#include + +//TEST_CASE("Mesh simplification", "[mesh_simplify]") { +// Simplify::load_obj(TEST_DATA_DIR PATH_SEPARATOR "zaba.obj"); +// Simplify::simplify_mesh_lossless(); +// Simplify::write_obj("zaba_simplified.obj"); +//} + From 75260eea127e04de778a747dc7f5f75d8cebee63 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Thu, 23 Jan 2020 13:18:44 +0100 Subject: [PATCH 145/336] Fix latomic linking on Mac SPE-1079 --- cmake/modules/CheckAtomic.cmake | 106 ++++++++++++++++++++++++++++++++ src/libslic3r/CMakeLists.txt | 7 ++- 2 files changed, 111 insertions(+), 2 deletions(-) create mode 100644 cmake/modules/CheckAtomic.cmake diff --git a/cmake/modules/CheckAtomic.cmake b/cmake/modules/CheckAtomic.cmake new file mode 100644 index 0000000000..c045e30b22 --- /dev/null +++ b/cmake/modules/CheckAtomic.cmake @@ -0,0 +1,106 @@ +# atomic builtins are required for threading support. + +INCLUDE(CheckCXXSourceCompiles) +INCLUDE(CheckLibraryExists) + +# Sometimes linking against libatomic is required for atomic ops, if +# the platform doesn't support lock-free atomics. + +function(check_working_cxx_atomics varname) + set(OLD_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS}) + set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -std=c++11") + CHECK_CXX_SOURCE_COMPILES(" +#include +std::atomic x; +int main() { + return x; +} +" ${varname}) + set(CMAKE_REQUIRED_FLAGS ${OLD_CMAKE_REQUIRED_FLAGS}) +endfunction(check_working_cxx_atomics) + +function(check_working_cxx_atomics64 varname) + set(OLD_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS}) + set(CMAKE_REQUIRED_FLAGS "-std=c++11 ${CMAKE_REQUIRED_FLAGS}") + CHECK_CXX_SOURCE_COMPILES(" +#include +#include +std::atomic x (0); +int main() { + uint64_t i = x.load(std::memory_order_relaxed); + return 0; +} +" ${varname}) + set(CMAKE_REQUIRED_FLAGS ${OLD_CMAKE_REQUIRED_FLAGS}) +endfunction(check_working_cxx_atomics64) + + +# This isn't necessary on MSVC, so avoid command-line switch annoyance +# by only running on GCC-like hosts. +if (LLVM_COMPILER_IS_GCC_COMPATIBLE) + # First check if atomics work without the library. + check_working_cxx_atomics(HAVE_CXX_ATOMICS_WITHOUT_LIB) + # If not, check if the library exists, and atomics work with it. + if(NOT HAVE_CXX_ATOMICS_WITHOUT_LIB) + check_library_exists(atomic __atomic_fetch_add_4 "" HAVE_LIBATOMIC) + if( HAVE_LIBATOMIC ) + list(APPEND CMAKE_REQUIRED_LIBRARIES "atomic") + check_working_cxx_atomics(HAVE_CXX_ATOMICS_WITH_LIB) + if (NOT HAVE_CXX_ATOMICS_WITH_LIB) + message(FATAL_ERROR "Host compiler must support std::atomic!") + endif() + else() + message(FATAL_ERROR "Host compiler appears to require libatomic, but cannot find it.") + endif() + endif() +endif() + +# Check for 64 bit atomic operations. +if(MSVC) + set(HAVE_CXX_ATOMICS64_WITHOUT_LIB True) +else() + check_working_cxx_atomics64(HAVE_CXX_ATOMICS64_WITHOUT_LIB) +endif() + +# If not, check if the library exists, and atomics work with it. +if(NOT HAVE_CXX_ATOMICS64_WITHOUT_LIB) + check_library_exists(atomic __atomic_load_8 "" HAVE_CXX_LIBATOMICS64) + if(HAVE_CXX_LIBATOMICS64) + list(APPEND CMAKE_REQUIRED_LIBRARIES "atomic") + check_working_cxx_atomics64(HAVE_CXX_ATOMICS64_WITH_LIB) + if (NOT HAVE_CXX_ATOMICS64_WITH_LIB) + message(FATAL_ERROR "Host compiler must support 64-bit std::atomic!") + endif() + else() + message(FATAL_ERROR "Host compiler appears to require libatomic for 64-bit operations, but cannot find it.") + endif() +endif() + +## TODO: This define is only used for the legacy atomic operations in +## llvm's Atomic.h, which should be replaced. Other code simply +## assumes C++11 works. +CHECK_CXX_SOURCE_COMPILES(" +#ifdef _MSC_VER +#include +#endif +int main() { +#ifdef _MSC_VER + volatile LONG val = 1; + MemoryBarrier(); + InterlockedCompareExchange(&val, 0, 1); + InterlockedIncrement(&val); + InterlockedDecrement(&val); +#else + volatile unsigned long val = 1; + __sync_synchronize(); + __sync_val_compare_and_swap(&val, 1, 0); + __sync_add_and_fetch(&val, 1); + __sync_sub_and_fetch(&val, 1); +#endif + return 0; + } +" LLVM_HAS_ATOMICS) + +if( NOT LLVM_HAS_ATOMICS ) + message(STATUS "Warning: LLVM will be built thread-unsafe because atomic builtins are missing") +endif() \ No newline at end of file diff --git a/src/libslic3r/CMakeLists.txt b/src/libslic3r/CMakeLists.txt index d01c01ec2d..e24880ca63 100644 --- a/src/libslic3r/CMakeLists.txt +++ b/src/libslic3r/CMakeLists.txt @@ -265,8 +265,11 @@ target_link_libraries(libslic3r ${CMAKE_DL_LIBS} ) -if (NOT MSVC) - target_link_libraries(libslic3r atomic) # no cmake magic for this... +include(CheckAtomic) + +check_working_cxx_atomics(HAS_ATOMIC) +if (NOT HAS_ATOMIC) + target_link_libraries(libslic3r atomic) endif() if (TARGET OpenVDB::openvdb) From fde0803a8987bab7afd44b99d28967410141355e Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Thu, 23 Jan 2020 13:45:20 +0100 Subject: [PATCH 146/336] Upgrade GMP version (link errors similar to RPI) --- deps/GMP/GMP.cmake | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/deps/GMP/GMP.cmake b/deps/GMP/GMP.cmake index 8bcf948592..4e8228cbac 100644 --- a/deps/GMP/GMP.cmake +++ b/deps/GMP/GMP.cmake @@ -18,7 +18,8 @@ if (MSVC) else () ExternalProject_Add(dep_GMP - URL https://gmplib.org/download/gmp/gmp-6.1.2.tar.bz2 + # URL https://gmplib.org/download/gmp/gmp-6.1.2.tar.bz2 + URL https://gmplib.org/download/gmp/gmp-6.2.0.tar.lz BUILD_IN_SOURCE ON CONFIGURE_COMMAND ./configure --enable-shared=no --enable-cxx=yes --enable-static=yes "--prefix=${DESTDIR}/usr/local" --with-pic BUILD_COMMAND make -j From 3d9ac0ada19107c20c75ea6fa21336276cd2b935 Mon Sep 17 00:00:00 2001 From: bubnikv Date: Thu, 23 Jan 2020 16:04:17 +0100 Subject: [PATCH 147/336] Little optimization of the profile aliases. --- src/slic3r/GUI/Preset.cpp | 27 ++++++++++++++++++--------- src/slic3r/GUI/Preset.hpp | 9 +++++++-- src/slic3r/GUI/PresetBundle.cpp | 7 +++++++ 3 files changed, 32 insertions(+), 11 deletions(-) diff --git a/src/slic3r/GUI/Preset.cpp b/src/slic3r/GUI/Preset.cpp index 797fa28f87..081b886d1a 100644 --- a/src/slic3r/GUI/Preset.cpp +++ b/src/slic3r/GUI/Preset.cpp @@ -600,6 +600,7 @@ void PresetCollection::reset(bool delete_files) m_presets.erase(m_presets.begin() + m_num_default_presets, m_presets.end()); this->select_preset(0); } + m_map_alias_to_profile_name.clear(); m_map_system_profile_renamed.clear(); } @@ -944,15 +945,15 @@ PresetWithVendorProfile PresetCollection::get_preset_with_vendor_profile(const P const std::string& PresetCollection::get_preset_name_by_alias(const std::string& alias) const { - for (size_t i = this->m_presets.front().is_visible ? 0 : m_num_default_presets; i < this->m_presets.size(); ++i) { - const Preset& preset = this->m_presets[i]; - if (!preset.is_visible || (!preset.is_compatible && i != m_idx_selected)) - continue; - - if (preset.alias == alias) - return preset.name; - } - + for ( + // Find the 1st profile name with the alias. + auto it = Slic3r::lower_bound_by_predicate(m_map_alias_to_profile_name.begin(), m_map_alias_to_profile_name.end(), [&alias](auto &l){ return l.first < alias; }); + // Continue over all profile names with the same alias. + it != m_map_alias_to_profile_name.end() && it->first == alias; ++ it) + if (auto it_preset = this->find_preset_internal(it->second); + it_preset != m_presets.end() && it_preset->name == it->second && + it_preset->is_visible && (it_preset->is_compatible || (it_preset - m_presets.begin()) == m_idx_selected)) + return it_preset->name; return alias; } @@ -1426,6 +1427,14 @@ std::vector PresetCollection::merge_presets(PresetCollection &&othe return duplicates; } +void PresetCollection::update_map_alias_to_profile_name() +{ + m_map_alias_to_profile_name.clear(); + for (const Preset &preset : m_presets) + m_map_alias_to_profile_name.emplace_back(preset.alias, preset.name); + std::sort(m_map_alias_to_profile_name.begin(), m_map_alias_to_profile_name.end(), [](auto &l, auto &r) { return l.first < r.first; }); +} + void PresetCollection::update_map_system_profile_renamed() { m_map_system_profile_renamed.clear(); diff --git a/src/slic3r/GUI/Preset.hpp b/src/slic3r/GUI/Preset.hpp index 742d3e01d2..c859335200 100644 --- a/src/slic3r/GUI/Preset.hpp +++ b/src/slic3r/GUI/Preset.hpp @@ -166,7 +166,7 @@ public: DynamicPrintConfig config; // Alias of the preset - std::string alias = ""; + std::string alias; // List of profile names, from which this profile was renamed at some point of time. // This list is then used to match profiles by their names when loaded from .gcode, .3mf, .amf, // and to match the "inherits" field of user profiles with updated system profiles. @@ -356,7 +356,7 @@ public: // used to update preset_choice from Tab const std::deque& get_presets() const { return m_presets; } - int get_idx_selected() { return m_idx_selected; } + int get_idx_selected() { return m_idx_selected; } static const std::string& get_suffix_modified(); // Return a preset possibly with modifications. @@ -475,6 +475,9 @@ protected: // Merge one vendor's presets with the other vendor's presets, report duplicates. std::vector merge_presets(PresetCollection &&other, const VendorMap &new_vendors); + // Update m_map_alias_to_profile_name from loaded system profiles. + void update_map_alias_to_profile_name(); + // Update m_map_system_profile_renamed from loaded system profiles. void update_map_system_profile_renamed(); @@ -522,6 +525,8 @@ private: // Use deque to force the container to allocate an object per each entry, // so that the addresses of the presets don't change during resizing of the container. std::deque m_presets; + // System profiles may have aliases. Map to the full profile name. + std::vector> m_map_alias_to_profile_name; // Map from old system profile name to a current system profile name. std::map m_map_system_profile_renamed; // Initially this preset contains a copy of the selected preset. Later on, this copy may be modified by the user. diff --git a/src/slic3r/GUI/PresetBundle.cpp b/src/slic3r/GUI/PresetBundle.cpp index bb08ce2d07..7e823f9256 100644 --- a/src/slic3r/GUI/PresetBundle.cpp +++ b/src/slic3r/GUI/PresetBundle.cpp @@ -288,11 +288,18 @@ std::string PresetBundle::load_system_presets() // No config bundle loaded, reset. this->reset(false); } + this->prints .update_map_system_profile_renamed(); this->sla_prints .update_map_system_profile_renamed(); this->filaments .update_map_system_profile_renamed(); this->sla_materials.update_map_system_profile_renamed(); this->printers .update_map_system_profile_renamed(); + + this->prints .update_map_alias_to_profile_name(); + this->sla_prints .update_map_alias_to_profile_name(); + this->filaments .update_map_alias_to_profile_name(); + this->sla_materials.update_map_alias_to_profile_name(); + return errors_cummulative; } From 1ed313ab7983bed9a1911da153ce2e3e0b473d6f Mon Sep 17 00:00:00 2001 From: YuSanka Date: Thu, 23 Jan 2020 12:49:39 +0100 Subject: [PATCH 148/336] Synchronized mode of color_print data to/from 3mf/amf + Code refactoring " CustomGCode extracted to separate namespace and file --- src/libslic3r/CMakeLists.txt | 2 + src/libslic3r/CustomGCode.cpp | 72 +++++++++++++++++++++++++ src/libslic3r/CustomGCode.hpp | 81 ++++++++++++++++++++++++++++ src/libslic3r/Format/3mf.cpp | 20 +++++-- src/libslic3r/Format/AMF.cpp | 47 ++++++++++++---- src/libslic3r/GCode.cpp | 2 +- src/libslic3r/GCode/ToolOrdering.cpp | 6 +-- src/libslic3r/GCode/ToolOrdering.hpp | 2 +- src/libslic3r/Model.cpp | 41 ++------------ src/libslic3r/Model.hpp | 52 +----------------- src/libslic3r/Print.cpp | 2 +- src/slic3r/GUI/GLCanvas3D.cpp | 20 +++---- src/slic3r/GUI/GLCanvas3D.hpp | 4 +- src/slic3r/GUI/GUI_Preview.cpp | 8 +-- src/slic3r/GUI/GUI_Preview.hpp | 2 +- src/slic3r/GUI/Plater.cpp | 2 +- src/slic3r/GUI/PresetBundle.cpp | 2 +- src/slic3r/GUI/wxExtensions.cpp | 8 +-- src/slic3r/GUI/wxExtensions.hpp | 6 +-- 19 files changed, 247 insertions(+), 132 deletions(-) create mode 100644 src/libslic3r/CustomGCode.cpp create mode 100644 src/libslic3r/CustomGCode.hpp diff --git a/src/libslic3r/CMakeLists.txt b/src/libslic3r/CMakeLists.txt index c8e259caa9..1c110d7cdc 100644 --- a/src/libslic3r/CMakeLists.txt +++ b/src/libslic3r/CMakeLists.txt @@ -114,6 +114,8 @@ add_library(libslic3r STATIC Line.hpp Model.cpp Model.hpp + CustomGCode.cpp + CustomGCode.hpp Arrange.hpp Arrange.cpp MotionPlanner.cpp diff --git a/src/libslic3r/CustomGCode.cpp b/src/libslic3r/CustomGCode.cpp new file mode 100644 index 0000000000..7c505c9789 --- /dev/null +++ b/src/libslic3r/CustomGCode.cpp @@ -0,0 +1,72 @@ +#include "CustomGCode.hpp" +#include "Config.hpp" +#include "GCode/PreviewData.hpp" +#include "GCodeWriter.hpp" + +namespace Slic3r { + +namespace CustomGCode { + +// If loaded configuration has a "colorprint_heights" option (if it was imported from older Slicer), +// and if CustomGCode::Info.gcodes is empty (there is no color print data available in a new format +// then CustomGCode::Info.gcodes should be updated considering this option. +extern void update_custom_gcode_per_print_z_from_config(Info& info, DynamicPrintConfig* config) +{ + auto *colorprint_heights = config->option("colorprint_heights"); + if (colorprint_heights == nullptr) + return; + if (info.gcodes.empty() && ! colorprint_heights->values.empty()) { + // Convert the old colorprint_heighs only if there is no equivalent data in a new format. + const std::vector& colors = GCodePreviewData::ColorPrintColors(); + const auto& colorprint_values = colorprint_heights->values; + info.gcodes.clear(); + info.gcodes.reserve(colorprint_values.size()); + int i = 0; + for (auto val : colorprint_values) + info.gcodes.emplace_back(Item{ val, ColorChangeCode, 1, colors[(++i)%7] }); + + info.mode = SingleExtruder; + } + + // The "colorprint_heights" config value has been deprecated. At this point of time it has been converted + // to a new format and therefore it shall be erased. + config->erase("colorprint_heights"); +} + +// If information for custom Gcode per print Z was imported from older Slicer, mode will be undefined. +// So, we should set CustomGCode::Info.mode should be updated considering code values from items. +extern void check_mode_for_custom_gcode_per_print_z(Info& info) +{ + if (info.mode != Undef) + return; + + bool is_single_extruder = true; + for (auto item : info.gcodes) + { + if (item.gcode == ToolChangeCode) { + info.mode = MultiAsSingle; + return; + } + if (item.gcode == ColorChangeCode && item.extruder > 1) + is_single_extruder = false; + } + + info.mode = is_single_extruder ? SingleExtruder : MultiExtruder; +} + +// Return pairs of sorted by increasing print_z from custom_gcode_per_print_z. +// print_z corresponds to the first layer printed with the new extruder. +std::vector> custom_tool_changes(const Info& custom_gcode_per_print_z, size_t num_extruders) +{ + std::vector> custom_tool_changes; + for (const Item& custom_gcode : custom_gcode_per_print_z.gcodes) + if (custom_gcode.gcode == ToolChangeCode) { + // If extruder count in PrinterSettings was changed, use default (0) extruder for extruders, more than num_extruders + custom_tool_changes.emplace_back(custom_gcode.print_z, static_cast(custom_gcode.extruder > num_extruders ? 1 : custom_gcode.extruder)); + } + return custom_tool_changes; +} + +} // namespace CustomGCode + +} // namespace Slic3r diff --git a/src/libslic3r/CustomGCode.hpp b/src/libslic3r/CustomGCode.hpp new file mode 100644 index 0000000000..4f1be3f312 --- /dev/null +++ b/src/libslic3r/CustomGCode.hpp @@ -0,0 +1,81 @@ +#ifndef slic3r_CustomGCode_hpp_ +#define slic3r_CustomGCode_hpp_ + +#include +#include + +namespace Slic3r { + +class DynamicPrintConfig; + +namespace CustomGCode { + +struct Item +{ + bool operator<(const Item& rhs) const { return this->print_z < rhs.print_z; } + bool operator==(const Item& rhs) const + { + return (rhs.print_z == this->print_z ) && + (rhs.gcode == this->gcode ) && + (rhs.extruder == this->extruder ) && + (rhs.color == this->color ); + } + bool operator!=(const Item& rhs) const { return ! (*this == rhs); } + + double print_z; + std::string gcode; + int extruder; // Informative value for ColorChangeCode and ToolChangeCode + // "gcode" == ColorChangeCode => M600 will be applied for "extruder" extruder + // "gcode" == ToolChangeCode => for whole print tool will be switched to "extruder" extruder + std::string color; // if gcode is equal to PausePrintCode, + // this field is used for save a short message shown on Printer display +}; + +enum Mode +{ + Undef, + SingleExtruder, // Single extruder printer preset is selected + MultiAsSingle, // Multiple extruder printer preset is selected, but + // this mode works just for Single extruder print + // (For all print from objects settings is used just one extruder) + MultiExtruder // Multiple extruder printer preset is selected +}; + +// string anlogue of custom_code_per_height mode +static constexpr char SingleExtruderMode[] = "SingleExtruder"; +static constexpr char MultiAsSingleMode [] = "MultiAsSingle"; +static constexpr char MultiExtruderMode [] = "MultiExtruder"; + +struct Info +{ + Mode mode = Undef; + std::vector gcodes; + + bool operator==(const Info& rhs) const + { + return (rhs.mode == this->mode ) && + (rhs.gcodes == this->gcodes ); + } + bool operator!=(const Info& rhs) const { return !(*this == rhs); } +}; + +// If loaded configuration has a "colorprint_heights" option (if it was imported from older Slicer), +// and if CustomGCode::Info.gcodes is empty (there is no color print data available in a new format +// then CustomGCode::Info.gcodes should be updated considering this option. +extern void update_custom_gcode_per_print_z_from_config(Info& info, DynamicPrintConfig* config); + +// If information for custom Gcode per print Z was imported from older Slicer, mode will be undefined. +// So, we should set CustomGCode::Info.mode should be updated considering code values from items. +extern void check_mode_for_custom_gcode_per_print_z(Info& info); + +// Return pairs of sorted by increasing print_z from custom_gcode_per_print_z. +// print_z corresponds to the first layer printed with the new extruder. +std::vector> custom_tool_changes(const Info& custom_gcode_per_print_z, size_t num_extruders); + +} // namespace CustomGCode + +} // namespace Slic3r + + + +#endif /* slic3r_CustomGCode_hpp_ */ diff --git a/src/libslic3r/Format/3mf.cpp b/src/libslic3r/Format/3mf.cpp index 14177ed88d..8acab22e00 100644 --- a/src/libslic3r/Format/3mf.cpp +++ b/src/libslic3r/Format/3mf.cpp @@ -1092,6 +1092,14 @@ namespace Slic3r { for (const auto& code : code_tree) { + if (code.first == "mode") + { + pt::ptree tree = code.second; + std::string mode = tree.get(".value"); + m_model->custom_gcode_per_print_z.mode = mode == CustomGCode::SingleExtruderMode ? CustomGCode::Mode::SingleExtruder : + mode == CustomGCode::MultiAsSingleMode ? CustomGCode::Mode::MultiAsSingle : + CustomGCode::Mode::MultiExtruder; + } if (code.first != "code") continue; pt::ptree tree = code.second; @@ -1100,7 +1108,7 @@ namespace Slic3r { int extruder = tree.get (".extruder" ); std::string color = tree.get (".color" ); - m_model->custom_gcode_per_print_z.gcodes.push_back(Model::CustomGCode{print_z, gcode, extruder, color}) ; + m_model->custom_gcode_per_print_z.gcodes.push_back(CustomGCode::Item{print_z, gcode, extruder, color}) ; } } } @@ -2615,7 +2623,7 @@ bool _3MF_Exporter::_add_custom_gcode_per_print_z_file_to_archive( mz_zip_archiv pt::ptree tree; pt::ptree& main_tree = tree.add("custom_gcodes_per_print_z", ""); - for (const Model::CustomGCode& code : model.custom_gcode_per_print_z.gcodes) + for (const CustomGCode::Item& code : model.custom_gcode_per_print_z.gcodes) { pt::ptree& code_tree = main_tree.add("code", ""); // store minX and maxZ @@ -2623,7 +2631,13 @@ bool _3MF_Exporter::_add_custom_gcode_per_print_z_file_to_archive( mz_zip_archiv code_tree.put(".gcode" , code.gcode ); code_tree.put(".extruder" , code.extruder ); code_tree.put(".color" , code.color ); - } + } + + pt::ptree& mode_tree = main_tree.add("mode", ""); + // store mode of a custom_gcode_per_print_z + mode_tree.put(".value", model.custom_gcode_per_print_z.mode == CustomGCode::Mode::SingleExtruder ? CustomGCode::SingleExtruderMode : + model.custom_gcode_per_print_z.mode == CustomGCode::Mode::MultiAsSingle ? CustomGCode::MultiAsSingleMode : + CustomGCode::MultiExtruderMode); if (!tree.empty()) { diff --git a/src/libslic3r/Format/AMF.cpp b/src/libslic3r/Format/AMF.cpp index 7041956bad..ede4f403bf 100644 --- a/src/libslic3r/Format/AMF.cpp +++ b/src/libslic3r/Format/AMF.cpp @@ -13,6 +13,7 @@ #include "../Utils.hpp" #include "../I18N.hpp" #include "../Geometry.hpp" +#include "../CustomGCode.hpp" #include "AMF.hpp" @@ -156,6 +157,7 @@ struct AMFParserContext NODE_TYPE_PRINTABLE, // amf/constellation/instance/mirrorz NODE_TYPE_CUSTOM_GCODE, // amf/custom_code_per_height NODE_TYPE_GCODE_PER_HEIGHT, // amf/custom_code_per_height/code + NODE_TYPE_CUSTOM_GCODE_MODE, // amf/custom_code_per_height/mode NODE_TYPE_METADATA, // anywhere under amf/*/metadata }; @@ -308,12 +310,18 @@ void AMFParserContext::startElement(const char *name, const char **atts) else this->stop(); } - else if (strcmp(name, "code") == 0 && m_path[1] == NODE_TYPE_CUSTOM_GCODE) { - node_type_new = NODE_TYPE_GCODE_PER_HEIGHT; - m_value[0] = get_attribute(atts, "height"); - m_value[1] = get_attribute(atts, "gcode"); - m_value[2] = get_attribute(atts, "extruder"); - m_value[3] = get_attribute(atts, "color"); + else if (m_path[1] == NODE_TYPE_CUSTOM_GCODE) { + if (strcmp(name, "code") == 0) { + node_type_new = NODE_TYPE_GCODE_PER_HEIGHT; + m_value[0] = get_attribute(atts, "print_z"); + m_value[1] = get_attribute(atts, "gcode"); + m_value[2] = get_attribute(atts, "extruder"); + m_value[3] = get_attribute(atts, "color"); + } + else if (strcmp(name, "mode") == 0) { + node_type_new = NODE_TYPE_CUSTOM_GCODE_MODE; + m_value[0] = get_attribute(atts, "value"); + } } break; case 3: @@ -632,18 +640,29 @@ void AMFParserContext::endElement(const char * /* name */) break; case NODE_TYPE_GCODE_PER_HEIGHT: { - double height = double(atof(m_value[0].c_str())); + double print_z = double(atof(m_value[0].c_str())); const std::string& gcode = m_value[1]; int extruder = atoi(m_value[2].c_str()); const std::string& color = m_value[3]; - m_model.custom_gcode_per_print_z.gcodes.push_back(Model::CustomGCode{height, gcode, extruder, color}); + m_model.custom_gcode_per_print_z.gcodes.push_back(CustomGCode::Item{print_z, gcode, extruder, color}); for (std::string& val: m_value) val.clear(); break; } + case NODE_TYPE_CUSTOM_GCODE_MODE: { + const std::string& mode = m_value[0]; + + m_model.custom_gcode_per_print_z.mode = mode == CustomGCode::SingleExtruderMode ? CustomGCode::Mode::SingleExtruder : + mode == CustomGCode::MultiAsSingleMode ? CustomGCode::Mode::MultiAsSingle : + CustomGCode::Mode::MultiExtruder; + for (std::string& val: m_value) + val.clear(); + break; + } + case NODE_TYPE_METADATA: if ((m_config != nullptr) && strncmp(m_value[0].c_str(), SLIC3R_CONFIG_TYPE, strlen(SLIC3R_CONFIG_TYPE)) == 0) m_config->load_from_gcode_string(m_value[1].c_str()); @@ -1237,16 +1256,23 @@ bool store_amf(const char *path, Model *model, const DynamicPrintConfig *config) pt::ptree& main_tree = tree.add("custom_gcodes_per_height", ""); - for (const Model::CustomGCode& code : model->custom_gcode_per_print_z.gcodes) + for (const CustomGCode::Item& code : model->custom_gcode_per_print_z.gcodes) { pt::ptree& code_tree = main_tree.add("code", ""); - // store minX and maxZ + // store custom_gcode_per_print_z gcodes information code_tree.put(".print_z" , code.print_z ); code_tree.put(".gcode" , code.gcode ); code_tree.put(".extruder" , code.extruder ); code_tree.put(".color" , code.color ); } + pt::ptree& mode_tree = main_tree.add("mode", ""); + // store mode of a custom_gcode_per_print_z + mode_tree.put(".value", + model->custom_gcode_per_print_z.mode == CustomGCode::Mode::SingleExtruder ? CustomGCode::SingleExtruderMode : + model->custom_gcode_per_print_z.mode == CustomGCode::Mode::MultiAsSingle ? + CustomGCode::MultiAsSingleMode : CustomGCode::MultiExtruderMode); + if (!tree.empty()) { std::ostringstream oss; @@ -1259,6 +1285,7 @@ bool store_amf(const char *path, Model *model, const DynamicPrintConfig *config) // Post processing("beautification") of the output string boost::replace_all(out, ">\n \n <", ">\n<"); stream << out << "\n"; diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index decadafdf3..cc83461d36 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -1767,7 +1767,7 @@ namespace ProcessLayer { static std::string emit_custom_gcode_per_print_z( - const Model::CustomGCode *custom_gcode, + const CustomGCode::Item *custom_gcode, // ID of the first extruder printing this layer. unsigned int first_extruder_id, bool single_material_print) diff --git a/src/libslic3r/GCode/ToolOrdering.cpp b/src/libslic3r/GCode/ToolOrdering.cpp index 3b6bf87afd..f5ff33e412 100644 --- a/src/libslic3r/GCode/ToolOrdering.cpp +++ b/src/libslic3r/GCode/ToolOrdering.cpp @@ -133,7 +133,7 @@ ToolOrdering::ToolOrdering(const Print &print, unsigned int first_extruder, bool num_extruders > 1 && print.object_extruders().size() == 1) { // Printing a single extruder platter on a printer with more than 1 extruder (or single-extruder multi-material). // There may be custom per-layer tool changes available at the model. - per_layer_extruder_switches = custom_tool_changes(print.model(), num_extruders); + per_layer_extruder_switches = custom_tool_changes(print.model().custom_gcode_per_print_z, num_extruders); } // Collect extruders reuqired to print the layers. @@ -462,7 +462,7 @@ void ToolOrdering::assign_custom_gcodes(const Print &print) // Only valid for non-sequential print. assert(! print.config().complete_objects.value); - const Model::CustomGCodeInfo &custom_gcode_per_print_z = print.model().custom_gcode_per_print_z; + const CustomGCode::Info &custom_gcode_per_print_z = print.model().custom_gcode_per_print_z; if (custom_gcode_per_print_z.gcodes.empty()) return; @@ -483,7 +483,7 @@ void ToolOrdering::assign_custom_gcodes(const Print &print) // Custom G-codes were processed. break; // Some custom G-code is configured for this layer or a layer below. - const Model::CustomGCode &custom_gcode = *custom_gcode_it; + const CustomGCode::Item &custom_gcode = *custom_gcode_it; // print_z of the layer below the current layer. coordf_t print_z_below = 0.; if (auto it_lt_below = it_lt; ++ it_lt_below != m_layer_tools.rend()) diff --git a/src/libslic3r/GCode/ToolOrdering.hpp b/src/libslic3r/GCode/ToolOrdering.hpp index 08dd726563..de0460f1b0 100644 --- a/src/libslic3r/GCode/ToolOrdering.hpp +++ b/src/libslic3r/GCode/ToolOrdering.hpp @@ -114,7 +114,7 @@ public: size_t wipe_tower_partitions = 0; coordf_t wipe_tower_layer_height = 0.; // Custom G-code (color change, extruder switch, pause) to be performed before this layer starts to print. - const Model::CustomGCode *custom_gcode = nullptr; + const CustomGCode::Item *custom_gcode = nullptr; WipingExtrusions& wiping_extrusions() { m_wiping_extrusions.set_layer_tools_ptr(this); diff --git a/src/libslic3r/Model.cpp b/src/libslic3r/Model.cpp index d5a40e79fd..b01b2b99d5 100644 --- a/src/libslic3r/Model.cpp +++ b/src/libslic3r/Model.cpp @@ -126,7 +126,8 @@ Model Model::read_from_file(const std::string& input_file, DynamicPrintConfig* c if (add_default_instances) model.add_default_instances(); - update_custom_gcode_per_print_z_from_config(model.custom_gcode_per_print_z.gcodes, config); + CustomGCode::update_custom_gcode_per_print_z_from_config(model.custom_gcode_per_print_z, config); + CustomGCode::check_mode_for_custom_gcode_per_print_z(model.custom_gcode_per_print_z); return model; } @@ -163,7 +164,8 @@ Model Model::read_from_archive(const std::string& input_file, DynamicPrintConfig if (add_default_instances) model.add_default_instances(); - update_custom_gcode_per_print_z_from_config(model.custom_gcode_per_print_z.gcodes, config); + CustomGCode::update_custom_gcode_per_print_z_from_config(model.custom_gcode_per_print_z, config); + CustomGCode::check_mode_for_custom_gcode_per_print_z(model.custom_gcode_per_print_z); return model; } @@ -1841,19 +1843,6 @@ arrangement::ArrangePolygon ModelInstance::get_arrange_polygon() const return ret; } -// Return pairs of sorted by increasing print_z from custom_gcode_per_print_z. -// print_z corresponds to the first layer printed with the new extruder. -std::vector> custom_tool_changes(const Model &model, size_t num_extruders) -{ - std::vector> custom_tool_changes; - for (const Model::CustomGCode &custom_gcode : model.custom_gcode_per_print_z.gcodes) - if (custom_gcode.gcode == ToolChangeCode) { - // If extruder count in PrinterSettings was changed, use default (0) extruder for extruders, more than num_extruders - custom_tool_changes.emplace_back(custom_gcode.print_z, static_cast(custom_gcode.extruder > num_extruders ? 1 : custom_gcode.extruder)); - } - return custom_tool_changes; -} - // Test whether the two models contain the same number of ModelObjects with the same set of IDs // ordered in the same order. In that case it is not necessary to kill the background processing. bool model_object_list_equal(const Model &model_old, const Model &model_new) @@ -1942,28 +1931,6 @@ extern bool model_has_advanced_features(const Model &model) return false; } -extern void update_custom_gcode_per_print_z_from_config(std::vector& custom_gcode_per_print_z, DynamicPrintConfig* config) -{ - auto *colorprint_heights = config->option("colorprint_heights"); - if (colorprint_heights == nullptr) - return; - - if (custom_gcode_per_print_z.empty() && ! colorprint_heights->values.empty()) { - // Convert the old colorprint_heighs only if there is no equivalent data in a new format. - const std::vector& colors = GCodePreviewData::ColorPrintColors(); - const auto& colorprint_values = colorprint_heights->values; - custom_gcode_per_print_z.clear(); - custom_gcode_per_print_z.reserve(colorprint_values.size()); - int i = 0; - for (auto val : colorprint_values) - custom_gcode_per_print_z.emplace_back(Model::CustomGCode{ val, ColorChangeCode, 1, colors[(++i)%7] }); - } - - // The "colorprint_heights" config value has been deprecated. At this point of time it has been converted - // to a new format and therefore it shall be erased. - config->erase("colorprint_heights"); -} - #ifndef NDEBUG // Verify whether the IDs of Model / ModelObject / ModelVolume / ModelInstance / ModelMaterial are valid and unique. void check_model_ids_validity(const Model &model) diff --git a/src/libslic3r/Model.hpp b/src/libslic3r/Model.hpp index fa5d8f1556..5f5b36b475 100644 --- a/src/libslic3r/Model.hpp +++ b/src/libslic3r/Model.hpp @@ -11,6 +11,7 @@ #include "SLA/SLACommon.hpp" #include "TriangleMesh.hpp" #include "Arrange.hpp" +#include "CustomGCode.hpp" #include #include @@ -749,48 +750,7 @@ public: ModelWipeTower wipe_tower; // Extensions for color print - struct CustomGCode - { - bool operator<(const CustomGCode& rhs) const { return this->print_z < rhs.print_z; } - bool operator==(const CustomGCode& rhs) const - { - return (rhs.print_z == this->print_z ) && - (rhs.gcode == this->gcode ) && - (rhs.extruder == this->extruder ) && - (rhs.color == this->color ); - } - bool operator!=(const CustomGCode& rhs) const { return ! (*this == rhs); } - - double print_z; - std::string gcode; - int extruder; // Informative value for ColorChangeCode and ToolChangeCode - // "gcode" == ColorChangeCode => M600 will be applied for "extruder" extruder - // "gcode" == ToolChangeCode => for whole print tool will be switched to "extruder" extruder - std::string color; // if gcode is equal to PausePrintCode, - // this field is used for save a short message shown on Printer display - }; - - struct CustomGCodeInfo - { - enum MODE - { - SingleExtruder, // single extruder printer preset is selected - MultiAsSingle, // multiple extruder printer preset is selected, but - // this mode works just for Single extruder print - // (For all print from objects settings is used just one extruder) - MultiExtruder // multiple extruder printer preset is selected - } mode; - - std::vector gcodes; - - bool operator==(const CustomGCodeInfo& rhs) const - { - return (rhs.mode == this->mode ) && - (rhs.gcodes == this->gcodes ); - } - bool operator!=(const CustomGCodeInfo& rhs) const { return !(*this == rhs); } - } - custom_gcode_per_print_z; + CustomGCode::Info custom_gcode_per_print_z; // Default constructor assigns a new ID to the model. Model() { assert(this->id().valid()); } @@ -872,10 +832,6 @@ private: #undef OBJECTBASE_DERIVED_COPY_MOVE_CLONE #undef OBJECTBASE_DERIVED_PRIVATE_COPY_MOVE -// Return pairs of sorted by increasing print_z from custom_gcode_per_print_z. -// print_z corresponds to the first layer printed with the new extruder. -extern std::vector> custom_tool_changes(const Model &model, size_t num_extruders); - // Test whether the two models contain the same number of ModelObjects with the same set of IDs // ordered in the same order. In that case it is not necessary to kill the background processing. extern bool model_object_list_equal(const Model &model_old, const Model &model_new); @@ -893,10 +849,6 @@ extern bool model_volume_list_changed(const ModelObject &model_object_old, const extern bool model_has_multi_part_objects(const Model &model); // If the model has advanced features, then it cannot be processed in simple mode. extern bool model_has_advanced_features(const Model &model); -// If loaded configuration has a "colorprint_heights" option (if it was imported from older Slicer), -// and if model.custom_gcode_per_print_z is empty (there is no color print data available in a new format -// then model.custom_gcode_per_print_z should be updated considering this option. -extern void update_custom_gcode_per_print_z_from_config(std::vector& custom_gcode_per_print_z, DynamicPrintConfig* config); #ifndef NDEBUG // Verify whether the IDs of Model / ModelObject / ModelVolume / ModelInstance / ModelMaterial are valid and unique. diff --git a/src/libslic3r/Print.cpp b/src/libslic3r/Print.cpp index a41122dfae..cc0554bd5f 100644 --- a/src/libslic3r/Print.cpp +++ b/src/libslic3r/Print.cpp @@ -491,7 +491,7 @@ static bool layer_height_ranges_equal(const t_layer_config_ranges &lr1, const t_ } // Returns true if va == vb when all CustomGCode items that are not ToolChangeCode are ignored. -static bool custom_per_printz_gcodes_tool_changes_differ(const std::vector &va, const std::vector &vb) +static bool custom_per_printz_gcodes_tool_changes_differ(const std::vector &va, const std::vector &vb) { auto it_a = va.begin(); auto it_b = vb.begin(); diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 9a5cea511b..09d6eda2ef 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -892,7 +892,7 @@ void GLCanvas3D::LegendTexture::fill_color_print_legend_items( const GLCanvas3D std::vector& colors, std::vector& cp_legend_items) { - std::vector custom_gcode_per_print_z = wxGetApp().plater()->model().custom_gcode_per_print_z.gcodes; + std::vector custom_gcode_per_print_z = wxGetApp().plater()->model().custom_gcode_per_print_z.gcodes; const int extruders_cnt = wxGetApp().extruders_edited_cnt(); if (extruders_cnt == 1) @@ -2410,7 +2410,7 @@ void GLCanvas3D::load_sla_preview() } } -void GLCanvas3D::load_preview(const std::vector& str_tool_colors, const std::vector& color_print_values) +void GLCanvas3D::load_preview(const std::vector& str_tool_colors, const std::vector& color_print_values) { const Print *print = this->fff_print(); if (print == nullptr) @@ -5245,7 +5245,7 @@ void GLCanvas3D::_load_print_toolpaths() volume->indexed_vertex_array.finalize_geometry(m_initialized); } -void GLCanvas3D::_load_print_object_toolpaths(const PrintObject& print_object, const std::vector& str_tool_colors, const std::vector& color_print_values) +void GLCanvas3D::_load_print_object_toolpaths(const PrintObject& print_object, const std::vector& str_tool_colors, const std::vector& color_print_values) { std::vector tool_colors = _parse_colors(str_tool_colors); @@ -5259,7 +5259,7 @@ void GLCanvas3D::_load_print_object_toolpaths(const PrintObject& print_object, c const std::vector* tool_colors; bool is_single_material_print; int extruders_cnt; - const std::vector* color_print_values; + const std::vector* color_print_values; static const float* color_perimeters() { static float color[4] = { 1.0f, 1.0f, 0.0f, 1.f }; return color; } // yellow static const float* color_infill() { static float color[4] = { 1.0f, 0.5f, 0.5f, 1.f }; return color; } // redish @@ -5274,7 +5274,7 @@ void GLCanvas3D::_load_print_object_toolpaths(const PrintObject& print_object, c // For coloring by a color_print(M600), return a parsed color. bool color_by_color_print() const { return color_print_values!=nullptr; } const size_t color_print_color_idx_by_layer_idx(const size_t layer_idx) const { - const Model::CustomGCode value{layers[layer_idx]->print_z + EPSILON, "", 0, ""}; + const CustomGCode::Item value{layers[layer_idx]->print_z + EPSILON, "", 0, ""}; auto it = std::lower_bound(color_print_values->begin(), color_print_values->end(), value); return (it - color_print_values->begin()) % number_tools(); } @@ -5284,7 +5284,7 @@ void GLCanvas3D::_load_print_object_toolpaths(const PrintObject& print_object, c const coordf_t print_z = layers[layer_idx]->print_z; auto it = std::find_if(color_print_values->begin(), color_print_values->end(), - [print_z](const Model::CustomGCode& code) + [print_z](const CustomGCode::Item& code) { return fabs(code.print_z - print_z) < EPSILON; }); if (it != color_print_values->end()) { @@ -5305,7 +5305,7 @@ void GLCanvas3D::_load_print_object_toolpaths(const PrintObject& print_object, c } } - const Model::CustomGCode value{print_z + EPSILON, "", 0, ""}; + const CustomGCode::Item value{print_z + EPSILON, "", 0, ""}; it = std::lower_bound(color_print_values->begin(), color_print_values->end(), value); while (it != color_print_values->begin()) { @@ -5325,7 +5325,7 @@ void GLCanvas3D::_load_print_object_toolpaths(const PrintObject& print_object, c } private: - int get_m600_color_idx(std::vector::const_iterator it) const + int get_m600_color_idx(std::vector::const_iterator it) const { int shift = 0; while (it != color_print_values->begin()) { @@ -5336,7 +5336,7 @@ void GLCanvas3D::_load_print_object_toolpaths(const PrintObject& print_object, c return extruders_cnt + shift; } - int get_color_idx_for_tool_change(std::vector::const_iterator it, const int extruder) const + int get_color_idx_for_tool_change(std::vector::const_iterator it, const int extruder) const { const int current_extruder = it->extruder == 0 ? extruder : it->extruder; if (number_tools() == extruders_cnt + 1) // there is no one "M600" @@ -5352,7 +5352,7 @@ void GLCanvas3D::_load_print_object_toolpaths(const PrintObject& print_object, c return std::min(extruders_cnt - 1, std::max(current_extruder - 1, 0)); } - int get_color_idx_for_color_change(std::vector::const_iterator it, const int extruder) const + int get_color_idx_for_color_change(std::vector::const_iterator it, const int extruder) const { if (extruders_cnt == 1) return get_m600_color_idx(it); diff --git a/src/slic3r/GUI/GLCanvas3D.hpp b/src/slic3r/GUI/GLCanvas3D.hpp index d4386f7f39..9ea7568e45 100644 --- a/src/slic3r/GUI/GLCanvas3D.hpp +++ b/src/slic3r/GUI/GLCanvas3D.hpp @@ -557,7 +557,7 @@ public: void load_gcode_preview(const GCodePreviewData& preview_data, const std::vector& str_tool_colors); void load_sla_preview(); - void load_preview(const std::vector& str_tool_colors, const std::vector& color_print_values); + void load_preview(const std::vector& str_tool_colors, const std::vector& color_print_values); void bind_event_handlers(); void unbind_event_handlers(); @@ -720,7 +720,7 @@ private: // Adds a new Slic3r::GUI::3DScene::Volume to $self->volumes, // one for perimeters, one for infill and one for supports. void _load_print_object_toolpaths(const PrintObject& print_object, const std::vector& str_tool_colors, - const std::vector& color_print_values); + const std::vector& color_print_values); // Create 3D thick extrusion lines for wipe tower extrusions void _load_wipe_tower_toolpaths(const std::vector& str_tool_colors); diff --git a/src/slic3r/GUI/GUI_Preview.cpp b/src/slic3r/GUI/GUI_Preview.cpp index f7010a5037..c60547abcf 100644 --- a/src/slic3r/GUI/GUI_Preview.cpp +++ b/src/slic3r/GUI/GUI_Preview.cpp @@ -633,7 +633,7 @@ static int find_close_layer_idx(const std::vector& zs, double &z, double return -1; } -void Preview::check_slider_values(std::vector& ticks_from_model, +void Preview::check_slider_values(std::vector& ticks_from_model, const std::vector& layers_z) { // All ticks that would end up outside the slider range should be erased. @@ -641,7 +641,7 @@ void Preview::check_slider_values(std::vector& ticks_from_mo // this function is e.g. not called when the last object is deleted unsigned int old_size = ticks_from_model.size(); ticks_from_model.erase(std::remove_if(ticks_from_model.begin(), ticks_from_model.end(), - [layers_z](Model::CustomGCode val) + [layers_z](CustomGCode::Item val) { auto it = std::lower_bound(layers_z.begin(), layers_z.end(), val.print_z - DoubleSlider::epsilon()); return it == layers_z.end(); @@ -669,7 +669,7 @@ void Preview::update_double_slider(const std::vector& layers_z, bool kee // Detect and set manipulation mode for double slider update_double_slider_mode(); - Model::CustomGCodeInfo &ticks_info_from_model = wxGetApp().plater()->model().custom_gcode_per_print_z; + CustomGCode::Info &ticks_info_from_model = wxGetApp().plater()->model().custom_gcode_per_print_z; check_slider_values(ticks_info_from_model.gcodes, layers_z); m_slider->SetSliderValues(layers_z); @@ -830,7 +830,7 @@ void Preview::load_print_as_fff(bool keep_z_range) bool gcode_preview_data_valid = print->is_step_done(psGCodeExport) && ! m_gcode_preview_data->empty(); // Collect colors per extruder. std::vector colors; - std::vector color_print_values = {}; + std::vector color_print_values = {}; // set color print values, if it si selected "ColorPrint" view type if (m_gcode_preview_data->extrusion.view_type == GCodePreviewData::Extrusion::ColorPrint) { diff --git a/src/slic3r/GUI/GUI_Preview.hpp b/src/slic3r/GUI/GUI_Preview.hpp index ae93e2ff05..ef311e3072 100644 --- a/src/slic3r/GUI/GUI_Preview.hpp +++ b/src/slic3r/GUI/GUI_Preview.hpp @@ -155,7 +155,7 @@ private: // Create/Update/Reset double slider on 3dPreview void create_double_slider(); - void check_slider_values(std::vector &ticks_from_model, + void check_slider_values(std::vector &ticks_from_model, const std::vector &layers_z); void reset_double_slider(); void update_double_slider(const std::vector& layers_z, bool keep_z_range = false); diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index a86dd5ceba..8baa0657e7 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -5423,7 +5423,7 @@ std::vector Plater::get_colors_for_color_print() const std::vector colors = get_extruder_colors_from_plater_config(); colors.reserve(colors.size() + p->model.custom_gcode_per_print_z.gcodes.size()); - for (const Model::CustomGCode& code : p->model.custom_gcode_per_print_z.gcodes) + for (const CustomGCode::Item& code : p->model.custom_gcode_per_print_z.gcodes) if (code.gcode == ColorChangeCode) colors.emplace_back(code.color); diff --git a/src/slic3r/GUI/PresetBundle.cpp b/src/slic3r/GUI/PresetBundle.cpp index 7e823f9256..6c80a9eab6 100644 --- a/src/slic3r/GUI/PresetBundle.cpp +++ b/src/slic3r/GUI/PresetBundle.cpp @@ -884,7 +884,7 @@ void PresetBundle::load_config_file_config(const std::string &name_or_path, bool // 4) Load the project config values (the per extruder wipe matrix etc). this->project_config.apply_only(config, s_project_options); - update_custom_gcode_per_print_z_from_config(GUI::wxGetApp().plater()->model().custom_gcode_per_print_z.gcodes, &this->project_config); + update_custom_gcode_per_print_z_from_config(GUI::wxGetApp().plater()->model().custom_gcode_per_print_z, &this->project_config); break; } diff --git a/src/slic3r/GUI/wxExtensions.cpp b/src/slic3r/GUI/wxExtensions.cpp index d4b207dc1e..626d6f392c 100644 --- a/src/slic3r/GUI/wxExtensions.cpp +++ b/src/slic3r/GUI/wxExtensions.cpp @@ -2531,10 +2531,10 @@ double DoubleSlider::get_double_value(const SelectedSlider& selection) return m_values[selection == ssLower ? m_lower_value : m_higher_value]; } -using t_custom_code = Slic3r::Model::CustomGCode; -Slic3r::Model::CustomGCodeInfo DoubleSlider::GetTicksValues() const +using t_custom_code = Slic3r::CustomGCode::Item; +Slic3r::CustomGCode::Info DoubleSlider::GetTicksValues() const { - Slic3r::Model::CustomGCodeInfo custom_gcode_per_print_z; + Slic3r::CustomGCode::Info custom_gcode_per_print_z; std::vector& values = custom_gcode_per_print_z.gcodes; const int val_size = m_values.size(); @@ -2550,7 +2550,7 @@ Slic3r::Model::CustomGCodeInfo DoubleSlider::GetTicksValues() const return custom_gcode_per_print_z; } -void DoubleSlider::SetTicksValues(const Slic3r::Model::CustomGCodeInfo& custom_gcode_per_print_z) +void DoubleSlider::SetTicksValues(const Slic3r::CustomGCode::Info& custom_gcode_per_print_z) { if (m_values.empty()) { diff --git a/src/slic3r/GUI/wxExtensions.hpp b/src/slic3r/GUI/wxExtensions.hpp index 7511e8a196..322358ffe2 100644 --- a/src/slic3r/GUI/wxExtensions.hpp +++ b/src/slic3r/GUI/wxExtensions.hpp @@ -782,7 +782,7 @@ public: const wxString& name = wxEmptyString); ~DoubleSlider() {} - using t_mode = Slic3r::Model::CustomGCodeInfo::MODE; + using t_mode = Slic3r::CustomGCode::Mode; /* For exporting GCode in GCodeWriter is used XYZF_NUM(val) = PRECISION(val, 3) for XYZ values. * So, let use same value as a permissible error for layer height. @@ -810,8 +810,8 @@ public: void SetKoefForLabels(const double koef) { m_label_koef = koef; } void SetSliderValues(const std::vector& values) { m_values = values; } void ChangeOneLayerLock(); - Slic3r::Model::CustomGCodeInfo GetTicksValues() const; - void SetTicksValues(const Slic3r::Model::CustomGCodeInfo &custom_gcode_per_print_z); + Slic3r::CustomGCode::Info GetTicksValues() const; + void SetTicksValues(const Slic3r::CustomGCode::Info &custom_gcode_per_print_z); void EnableTickManipulation(bool enable = true) { m_is_enabled_tick_manipulation = enable; } void DisableTickManipulation() { EnableTickManipulation(false); } From 5ff8ae955be3dfcae2387fe04386ee40ec868598 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Thu, 23 Jan 2020 15:07:31 +0100 Subject: [PATCH 149/336] Implemented editing for extruder of existing ToolChangeCode tick + Code refactoring: DoubleSlider is extracted from wxExtensions --- resources/localization/list.txt | 1 + src/libslic3r/CustomGCode.hpp | 5 + src/libslic3r/GCodeWriter.cpp | 1 + src/libslic3r/GCodeWriter.hpp | 5 - src/slic3r/CMakeLists.txt | 2 + src/slic3r/GUI/DoubleSlider.cpp | 1766 +++++++++++++++++++++ src/slic3r/GUI/DoubleSlider.hpp | 337 ++++ src/slic3r/GUI/ExtruderSequenceDialog.hpp | 2 +- src/slic3r/GUI/GLCanvas3D.cpp | 3 +- src/slic3r/GUI/GUI_Preview.cpp | 6 +- src/slic3r/GUI/GUI_Preview.hpp | 7 +- src/slic3r/GUI/Plater.cpp | 1 + src/slic3r/GUI/wxExtensions.cpp | 1721 +------------------- src/slic3r/GUI/wxExtensions.hpp | 312 +--- 14 files changed, 2128 insertions(+), 2041 deletions(-) create mode 100644 src/slic3r/GUI/DoubleSlider.cpp create mode 100644 src/slic3r/GUI/DoubleSlider.hpp diff --git a/resources/localization/list.txt b/resources/localization/list.txt index 93ee2f441d..fc33097df4 100644 --- a/resources/localization/list.txt +++ b/resources/localization/list.txt @@ -46,6 +46,7 @@ src/slic3r/GUI/Tab.hpp src/slic3r/GUI/UpdateDialogs.cpp src/slic3r/GUI/WipeTowerDialog.cpp src/slic3r/GUI/wxExtensions.cpp +src/slic3r/GUI/DoubleSlider.cpp src/slic3r/GUI/ExtruderSequenceDialog.cpp src/slic3r/Utils/Duet.cpp src/slic3r/Utils/OctoPrint.cpp diff --git a/src/libslic3r/CustomGCode.hpp b/src/libslic3r/CustomGCode.hpp index 4f1be3f312..5ab4c76efc 100644 --- a/src/libslic3r/CustomGCode.hpp +++ b/src/libslic3r/CustomGCode.hpp @@ -8,6 +8,11 @@ namespace Slic3r { class DynamicPrintConfig; +// Additional Codes which can be set by user using DoubleSlider +static constexpr char ColorChangeCode[] = "M600"; +static constexpr char PausePrintCode[] = "M601"; +static constexpr char ToolChangeCode[] = "tool_change"; + namespace CustomGCode { struct Item diff --git a/src/libslic3r/GCodeWriter.cpp b/src/libslic3r/GCodeWriter.cpp index 4c53048dc9..38a1c3ebee 100644 --- a/src/libslic3r/GCodeWriter.cpp +++ b/src/libslic3r/GCodeWriter.cpp @@ -1,4 +1,5 @@ #include "GCodeWriter.hpp" +#include "CustomGCode.hpp" #include #include #include diff --git a/src/libslic3r/GCodeWriter.hpp b/src/libslic3r/GCodeWriter.hpp index abeaf00242..3a57c8bd29 100644 --- a/src/libslic3r/GCodeWriter.hpp +++ b/src/libslic3r/GCodeWriter.hpp @@ -10,11 +10,6 @@ namespace Slic3r { -// Additional Codes which can be set by user using DoubleSlider -static constexpr char ColorChangeCode[] = "M600"; -static constexpr char PausePrintCode[] = "M601"; -static constexpr char ToolChangeCode[] = "tool_change"; - class GCodeWriter { public: GCodeConfig config; diff --git a/src/slic3r/CMakeLists.txt b/src/slic3r/CMakeLists.txt index 8f38cb21b8..9e4fb84eb7 100644 --- a/src/slic3r/CMakeLists.txt +++ b/src/slic3r/CMakeLists.txt @@ -142,6 +142,8 @@ set(SLIC3R_GUI_SOURCES GUI/PrintHostDialogs.hpp GUI/Mouse3DController.cpp GUI/Mouse3DController.hpp + GUI/DoubleSlider.cpp + GUI/DoubleSlider.hpp Utils/Http.cpp Utils/Http.hpp Utils/FixModelByWin10.cpp diff --git a/src/slic3r/GUI/DoubleSlider.cpp b/src/slic3r/GUI/DoubleSlider.cpp new file mode 100644 index 0000000000..a47d6706c2 --- /dev/null +++ b/src/slic3r/GUI/DoubleSlider.cpp @@ -0,0 +1,1766 @@ +#include "wxExtensions.hpp" +#include "GUI.hpp" +#include "GUI_App.hpp" +#include "I18N.hpp" +#include "ExtruderSequenceDialog.hpp" +#include "libslic3r/Print.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +namespace Slic3r { + +using GUI::from_u8; +using GUI::into_u8; + +namespace DoubleSlider { + +wxDEFINE_EVENT(wxCUSTOMEVT_TICKSCHANGED, wxEvent); + +Control::Control( wxWindow *parent, + wxWindowID id, + int lowerValue, + int higherValue, + int minValue, + int maxValue, + const wxPoint& pos, + const wxSize& size, + long style, + const wxValidator& val, + const wxString& name) : + wxControl(parent, id, pos, size, wxWANTS_CHARS | wxBORDER_NONE), + m_lower_value(lowerValue), + m_higher_value (higherValue), + m_min_value(minValue), + m_max_value(maxValue), + m_style(style == wxSL_HORIZONTAL || style == wxSL_VERTICAL ? style: wxSL_HORIZONTAL) +{ +#ifdef __WXOSX__ + is_osx = true; +#endif //__WXOSX__ + if (!is_osx) + SetDoubleBuffered(true);// SetDoubleBuffered exists on Win and Linux/GTK, but is missing on OSX + + const float scale_factor = get_svg_scale_factor(this); + + m_bmp_thumb_higher = (style == wxSL_HORIZONTAL ? ScalableBitmap(this, "right_half_circle.png") : ScalableBitmap(this, "thumb_up")); + m_bmp_thumb_lower = (style == wxSL_HORIZONTAL ? ScalableBitmap(this, "left_half_circle.png" ) : ScalableBitmap(this, "thumb_down")); + m_thumb_size = m_bmp_thumb_lower.bmp().GetSize()*(1.0/scale_factor); + + m_bmp_add_tick_on = ScalableBitmap(this, "colorchange_add"); + m_bmp_add_tick_off = ScalableBitmap(this, "colorchange_add_f"); + m_bmp_del_tick_on = ScalableBitmap(this, "colorchange_del"); + m_bmp_del_tick_off = ScalableBitmap(this, "colorchange_del_f"); + m_tick_icon_dim = int((float)m_bmp_add_tick_on.bmp().GetSize().x / scale_factor); + + m_bmp_one_layer_lock_on = ScalableBitmap(this, "lock_closed"); + m_bmp_one_layer_lock_off = ScalableBitmap(this, "lock_closed_f"); + m_bmp_one_layer_unlock_on = ScalableBitmap(this, "lock_open"); + m_bmp_one_layer_unlock_off = ScalableBitmap(this, "lock_open_f"); + m_lock_icon_dim = int((float)m_bmp_one_layer_lock_on.bmp().GetSize().x / scale_factor); + + m_bmp_revert = ScalableBitmap(this, "undo"); + m_revert_icon_dim = int((float)m_bmp_revert.bmp().GetSize().x / scale_factor); + m_bmp_cog = ScalableBitmap(this, "cog"); + m_cog_icon_dim = int((float)m_bmp_cog.bmp().GetSize().x / scale_factor); + + m_selection = ssUndef; + m_ticks.set_pause_print_msg(_utf8(L("Place bearings in slots and resume"))); + + // slider events + this->Bind(wxEVT_PAINT, &Control::OnPaint, this); + this->Bind(wxEVT_CHAR, &Control::OnChar, this); + this->Bind(wxEVT_LEFT_DOWN, &Control::OnLeftDown, this); + this->Bind(wxEVT_MOTION, &Control::OnMotion, this); + this->Bind(wxEVT_LEFT_UP, &Control::OnLeftUp, this); + this->Bind(wxEVT_MOUSEWHEEL, &Control::OnWheel, this); + this->Bind(wxEVT_ENTER_WINDOW,&Control::OnEnterWin, this); + this->Bind(wxEVT_LEAVE_WINDOW,&Control::OnLeaveWin, this); + this->Bind(wxEVT_KEY_DOWN, &Control::OnKeyDown, this); + this->Bind(wxEVT_KEY_UP, &Control::OnKeyUp, this); + this->Bind(wxEVT_RIGHT_DOWN, &Control::OnRightDown,this); + this->Bind(wxEVT_RIGHT_UP, &Control::OnRightUp, this); + + // control's view variables + SLIDER_MARGIN = 4 + GUI::wxGetApp().em_unit(); + + DARK_ORANGE_PEN = wxPen(wxColour(237, 107, 33)); + ORANGE_PEN = wxPen(wxColour(253, 126, 66)); + LIGHT_ORANGE_PEN = wxPen(wxColour(254, 177, 139)); + + DARK_GREY_PEN = wxPen(wxColour(128, 128, 128)); + GREY_PEN = wxPen(wxColour(164, 164, 164)); + LIGHT_GREY_PEN = wxPen(wxColour(204, 204, 204)); + + m_line_pens = { &DARK_GREY_PEN, &GREY_PEN, &LIGHT_GREY_PEN }; + m_segm_pens = { &DARK_ORANGE_PEN, &ORANGE_PEN, &LIGHT_ORANGE_PEN }; + + const wxFont& font = GetFont(); + m_font = is_osx ? font.Smaller().Smaller() : font.Smaller(); +} + +void Control::msw_rescale() +{ + const wxFont& font = GUI::wxGetApp().normal_font(); + m_font = is_osx ? font.Smaller().Smaller() : font.Smaller(); + + m_bmp_thumb_higher.msw_rescale(); + m_bmp_thumb_lower .msw_rescale(); + m_thumb_size = m_bmp_thumb_lower.bmp().GetSize(); + + m_bmp_add_tick_on .msw_rescale(); + m_bmp_add_tick_off.msw_rescale(); + m_bmp_del_tick_on .msw_rescale(); + m_bmp_del_tick_off.msw_rescale(); + m_tick_icon_dim = m_bmp_add_tick_on.bmp().GetSize().x; + + m_bmp_one_layer_lock_on .msw_rescale(); + m_bmp_one_layer_lock_off .msw_rescale(); + m_bmp_one_layer_unlock_on .msw_rescale(); + m_bmp_one_layer_unlock_off.msw_rescale(); + m_lock_icon_dim = m_bmp_one_layer_lock_on.bmp().GetSize().x; + + m_bmp_revert.msw_rescale(); + m_revert_icon_dim = m_bmp_revert.bmp().GetSize().x; + m_bmp_cog.msw_rescale(); + m_cog_icon_dim = m_bmp_cog.bmp().GetSize().x; + + SLIDER_MARGIN = 4 + GUI::wxGetApp().em_unit(); + + SetMinSize(get_min_size()); + GetParent()->Layout(); +} + +int Control::GetActiveValue() const +{ + return m_selection == ssLower ? + m_lower_value : m_selection == ssHigher ? + m_higher_value : -1; +} + +wxSize Control::get_min_size() const +{ + const int min_side = GUI::wxGetApp().em_unit() * ( is_horizontal() ? (is_osx ? 8 : 6) : 10 ); + + return wxSize(min_side, min_side); +} + +wxSize Control::DoGetBestSize() const +{ + const wxSize size = wxControl::DoGetBestSize(); + if (size.x > 1 && size.y > 1) + return size; + return get_min_size(); +} + +void Control::SetLowerValue(const int lower_val) +{ + m_selection = ssLower; + m_lower_value = lower_val; + correct_lower_value(); + Refresh(); + Update(); + + wxCommandEvent e(wxEVT_SCROLL_CHANGED); + e.SetEventObject(this); + ProcessWindowEvent(e); +} + +void Control::SetHigherValue(const int higher_val) +{ + m_selection = ssHigher; + m_higher_value = higher_val; + correct_higher_value(); + Refresh(); + Update(); + + wxCommandEvent e(wxEVT_SCROLL_CHANGED); + e.SetEventObject(this); + ProcessWindowEvent(e); +} + +void Control::SetSelectionSpan(const int lower_val, const int higher_val) +{ + m_lower_value = std::max(lower_val, m_min_value); + m_higher_value = std::max(std::min(higher_val, m_max_value), m_lower_value); + if (m_lower_value < m_higher_value) + m_is_one_layer = false; + + Refresh(); + Update(); + + wxCommandEvent e(wxEVT_SCROLL_CHANGED); + e.SetEventObject(this); + ProcessWindowEvent(e); +} + +void Control::SetMaxValue(const int max_value) +{ + m_max_value = max_value; + Refresh(); + Update(); +} + +void Control::draw_scroll_line(wxDC& dc, const int lower_pos, const int higher_pos) +{ + int width; + int height; + get_size(&width, &height); + + wxCoord line_beg_x = is_horizontal() ? SLIDER_MARGIN : width*0.5 - 1; + wxCoord line_beg_y = is_horizontal() ? height*0.5 - 1 : SLIDER_MARGIN; + wxCoord line_end_x = is_horizontal() ? width - SLIDER_MARGIN + 1 : width*0.5 - 1; + wxCoord line_end_y = is_horizontal() ? height*0.5 - 1 : height - SLIDER_MARGIN + 1; + + wxCoord segm_beg_x = is_horizontal() ? lower_pos : width*0.5 - 1; + wxCoord segm_beg_y = is_horizontal() ? height*0.5 - 1 : lower_pos/*-1*/; + wxCoord segm_end_x = is_horizontal() ? higher_pos : width*0.5 - 1; + wxCoord segm_end_y = is_horizontal() ? height*0.5 - 1 : higher_pos-1; + + for (size_t id = 0; id < m_line_pens.size(); id++) + { + dc.SetPen(*m_line_pens[id]); + dc.DrawLine(line_beg_x, line_beg_y, line_end_x, line_end_y); + dc.SetPen(*m_segm_pens[id]); + dc.DrawLine(segm_beg_x, segm_beg_y, segm_end_x, segm_end_y); + if (is_horizontal()) + line_beg_y = line_end_y = segm_beg_y = segm_end_y += 1; + else + line_beg_x = line_end_x = segm_beg_x = segm_end_x += 1; + } +} + +double Control::get_scroll_step() +{ + const wxSize sz = get_size(); + const int& slider_len = m_style == wxSL_HORIZONTAL ? sz.x : sz.y; + return double(slider_len - SLIDER_MARGIN * 2) / (m_max_value - m_min_value); +} + +// get position on the slider line from entered value +wxCoord Control::get_position_from_value(const int value) +{ + const double step = get_scroll_step(); + const int val = is_horizontal() ? value : m_max_value - value; + return wxCoord(SLIDER_MARGIN + int(val*step + 0.5)); +} + +wxSize Control::get_size() +{ + int w, h; + get_size(&w, &h); + return wxSize(w, h); +} + +void Control::get_size(int *w, int *h) +{ + GetSize(w, h); + is_horizontal() ? *w -= m_lock_icon_dim : *h -= m_lock_icon_dim; +} + +double Control::get_double_value(const SelectedSlider& selection) +{ + if (m_values.empty() || m_lower_value<0) + return 0.0; + if (m_values.size() <= m_higher_value) { + correct_higher_value(); + return m_values.back(); + } + return m_values[selection == ssLower ? m_lower_value : m_higher_value]; +} + +using t_custom_code = CustomGCode::Item; +CustomGCode::Info Control::GetTicksValues() const +{ + CustomGCode::Info custom_gcode_per_print_z; + std::vector& values = custom_gcode_per_print_z.gcodes; + + const int val_size = m_values.size(); + if (!m_values.empty()) + for (const TickCode& tick : m_ticks.ticks) { + if (tick.tick > val_size) + break; + values.emplace_back(t_custom_code{m_values[tick.tick], tick.gcode, tick.extruder, tick.color}); + } + + custom_gcode_per_print_z.mode = m_force_mode_apply ? m_mode : m_ticks.mode; + + return custom_gcode_per_print_z; +} + +void Control::SetTicksValues(const CustomGCode::Info& custom_gcode_per_print_z) +{ + if (m_values.empty()) + { + m_ticks.mode = m_mode; + return; + } + + const bool was_empty = m_ticks.empty(); + + m_ticks.ticks.clear(); + const std::vector& heights = custom_gcode_per_print_z.gcodes; + for (auto h : heights) { + auto it = std::lower_bound(m_values.begin(), m_values.end(), h.print_z - epsilon()); + + if (it == m_values.end()) + continue; + + m_ticks.ticks.emplace(TickCode{int(it-m_values.begin()), h.gcode, h.extruder, h.color}); + } + + if (!was_empty && m_ticks.empty()) + // Switch to the "Feature type"/"Tool" from the very beginning of a new object slicing after deleting of the old one + post_ticks_changed_event(); + + m_ticks.mode = custom_gcode_per_print_z.mode; + + Refresh(); + Update(); +} + +void Control::get_lower_and_higher_position(int& lower_pos, int& higher_pos) +{ + const double step = get_scroll_step(); + if (is_horizontal()) { + lower_pos = SLIDER_MARGIN + int(m_lower_value*step + 0.5); + higher_pos = SLIDER_MARGIN + int(m_higher_value*step + 0.5); + } + else { + lower_pos = SLIDER_MARGIN + int((m_max_value - m_lower_value)*step + 0.5); + higher_pos = SLIDER_MARGIN + int((m_max_value - m_higher_value)*step + 0.5); + } +} + +void Control::draw_focus_rect() +{ + if (!m_is_focused) + return; + const wxSize sz = GetSize(); + wxPaintDC dc(this); + const wxPen pen = wxPen(wxColour(128, 128, 10), 1, wxPENSTYLE_DOT); + dc.SetPen(pen); + dc.SetBrush(wxBrush(wxColour(0, 0, 0), wxBRUSHSTYLE_TRANSPARENT)); + dc.DrawRectangle(1, 1, sz.x - 2, sz.y - 2); +} + +void Control::render() +{ + SetBackgroundColour(GetParent()->GetBackgroundColour()); + draw_focus_rect(); + + wxPaintDC dc(this); + dc.SetFont(m_font); + + const wxCoord lower_pos = get_position_from_value(m_lower_value); + const wxCoord higher_pos = get_position_from_value(m_higher_value); + + // draw colored band on the background of a scroll line + // and only in a case of no-empty m_values + draw_colored_band(dc); + + // draw line + draw_scroll_line(dc, lower_pos, higher_pos); + + //draw color print ticks + draw_ticks(dc); + + // draw both sliders + draw_thumbs(dc, lower_pos, higher_pos); + + //draw lock/unlock + draw_one_layer_icon(dc); + + //draw revert bitmap (if it's shown) + draw_revert_icon(dc); + + //draw cog bitmap (if it's shown) + draw_cog_icon(dc); +} + +void Control::draw_action_icon(wxDC& dc, const wxPoint pt_beg, const wxPoint pt_end) +{ + const int tick = m_selection == ssLower ? m_lower_value : m_higher_value; + + // suppress add tick on first layer + if (tick == 0) + return; + + wxBitmap* icon = m_is_action_icon_focesed ? &m_bmp_add_tick_off.bmp() : &m_bmp_add_tick_on.bmp(); + if (m_ticks.ticks.find(TickCode{tick}) != m_ticks.ticks.end()) + icon = m_is_action_icon_focesed ? &m_bmp_del_tick_off.bmp() : &m_bmp_del_tick_on.bmp(); + + wxCoord x_draw, y_draw; + is_horizontal() ? x_draw = pt_beg.x - 0.5*m_tick_icon_dim : y_draw = pt_beg.y - 0.5*m_tick_icon_dim; + if (m_selection == ssLower) + is_horizontal() ? y_draw = pt_end.y + 3 : x_draw = pt_beg.x - m_tick_icon_dim-2; + else + is_horizontal() ? y_draw = pt_beg.y - m_tick_icon_dim-2 : x_draw = pt_end.x + 3; + + dc.DrawBitmap(*icon, x_draw, y_draw); + + //update rect of the tick action icon + m_rect_tick_action = wxRect(x_draw, y_draw, m_tick_icon_dim, m_tick_icon_dim); +} + +void Control::draw_info_line_with_icon(wxDC& dc, const wxPoint& pos, const SelectedSlider selection) +{ + if (m_selection == selection) { + //draw info line + dc.SetPen(DARK_ORANGE_PEN); + const wxPoint pt_beg = is_horizontal() ? wxPoint(pos.x, pos.y - m_thumb_size.y) : wxPoint(pos.x - m_thumb_size.x, pos.y/* - 1*/); + const wxPoint pt_end = is_horizontal() ? wxPoint(pos.x, pos.y + m_thumb_size.y) : wxPoint(pos.x + m_thumb_size.x, pos.y/* - 1*/); + dc.DrawLine(pt_beg, pt_end); + + //draw action icon + if (m_is_enabled_tick_manipulation) + draw_action_icon(dc, pt_beg, pt_end); + } +} + +wxString Control::get_label(const SelectedSlider& selection) const +{ + const int value = selection == ssLower ? m_lower_value : m_higher_value; + + if (m_label_koef == 1.0 && m_values.empty()) + return wxString::Format("%d", value); + if (value >= m_values.size()) + return "ErrVal"; + + const wxString str = m_values.empty() ? + wxNumberFormatter::ToString(m_label_koef*value, 2, wxNumberFormatter::Style_None) : + wxNumberFormatter::ToString(m_values[value], 2, wxNumberFormatter::Style_None); + return wxString::Format("%s\n(%d)", str, m_values.empty() ? value : value+1); +} + +void Control::draw_thumb_text(wxDC& dc, const wxPoint& pos, const SelectedSlider& selection) const +{ + if ( selection == ssUndef || + ((m_is_one_layer || m_higher_value==m_lower_value) && selection != m_selection) ) + return; + wxCoord text_width, text_height; + const wxString label = get_label(selection); + dc.GetMultiLineTextExtent(label, &text_width, &text_height); + wxPoint text_pos; + if (selection ==ssLower) + text_pos = is_horizontal() ? wxPoint(pos.x + 1, pos.y + m_thumb_size.x) : + wxPoint(pos.x + m_thumb_size.x+1, pos.y - 0.5*text_height - 1); + else + text_pos = is_horizontal() ? wxPoint(pos.x - text_width - 1, pos.y - m_thumb_size.x - text_height) : + wxPoint(pos.x - text_width - 1 - m_thumb_size.x, pos.y - 0.5*text_height + 1); + dc.DrawText(label, text_pos); +} + +void Control::draw_thumb_item(wxDC& dc, const wxPoint& pos, const SelectedSlider& selection) +{ + wxCoord x_draw, y_draw; + if (selection == ssLower) { + if (is_horizontal()) { + x_draw = pos.x - m_thumb_size.x; + y_draw = pos.y - int(0.5*m_thumb_size.y); + } + else { + x_draw = pos.x - int(0.5*m_thumb_size.x); + y_draw = pos.y - int(0.5*m_thumb_size.y); + } + } + else{ + if (is_horizontal()) { + x_draw = pos.x; + y_draw = pos.y - int(0.5*m_thumb_size.y); + } + else { + x_draw = pos.x - int(0.5*m_thumb_size.x); + y_draw = pos.y - int(0.5*m_thumb_size.y); + } + } + dc.DrawBitmap(selection == ssLower ? m_bmp_thumb_lower.bmp() : m_bmp_thumb_higher.bmp(), x_draw, y_draw); + + // Update thumb rect + update_thumb_rect(x_draw, y_draw, selection); +} + +void Control::draw_thumb(wxDC& dc, const wxCoord& pos_coord, const SelectedSlider& selection) +{ + //calculate thumb position on slider line + int width, height; + get_size(&width, &height); + const wxPoint pos = is_horizontal() ? wxPoint(pos_coord, height*0.5) : wxPoint(0.5*width, pos_coord); + + // Draw thumb + draw_thumb_item(dc, pos, selection); + + // Draw info_line + draw_info_line_with_icon(dc, pos, selection); + + // Draw thumb text + draw_thumb_text(dc, pos, selection); +} + +void Control::draw_thumbs(wxDC& dc, const wxCoord& lower_pos, const wxCoord& higher_pos) +{ + //calculate thumb position on slider line + int width, height; + get_size(&width, &height); + const wxPoint pos_l = is_horizontal() ? wxPoint(lower_pos, height*0.5) : wxPoint(0.5*width, lower_pos); + const wxPoint pos_h = is_horizontal() ? wxPoint(higher_pos, height*0.5) : wxPoint(0.5*width, higher_pos); + + // Draw lower thumb + draw_thumb_item(dc, pos_l, ssLower); + // Draw lower info_line + draw_info_line_with_icon(dc, pos_l, ssLower); + + // Draw higher thumb + draw_thumb_item(dc, pos_h, ssHigher); + // Draw higher info_line + draw_info_line_with_icon(dc, pos_h, ssHigher); + // Draw higher thumb text + draw_thumb_text(dc, pos_h, ssHigher); + + // Draw lower thumb text + draw_thumb_text(dc, pos_l, ssLower); +} + +void Control::draw_ticks(wxDC& dc) +{ + if (!m_is_enabled_tick_manipulation) + return; + + dc.SetPen(m_is_enabled_tick_manipulation ? DARK_GREY_PEN : LIGHT_GREY_PEN ); + int height, width; + get_size(&width, &height); + const wxCoord mid = is_horizontal() ? 0.5*height : 0.5*width; + for (auto tick : m_ticks.ticks) + { + const wxCoord pos = get_position_from_value(tick.tick); + + is_horizontal() ? dc.DrawLine(pos, mid-14, pos, mid-9) : + dc.DrawLine(mid - 14, pos/* - 1*/, mid - 9, pos/* - 1*/); + is_horizontal() ? dc.DrawLine(pos, mid+14, pos, mid+9) : + dc.DrawLine(mid + 14, pos/* - 1*/, mid + 9, pos/* - 1*/); + + wxBitmap icon = wxNullBitmap; + + // Draw icon for "Pause print" or "Custom Gcode" + if (tick.gcode != ColorChangeCode && tick.gcode != ToolChangeCode) + icon = create_scaled_bitmap(this, tick.gcode == PausePrintCode ? "pause_print" : "edit_gcode"); + else + { + if ((tick.gcode == ColorChangeCode && ( + (m_ticks.mode == t_mode::SingleExtruder && m_mode == t_mode::MultiExtruder ) || + (m_ticks.mode == t_mode::MultiExtruder && m_mode == t_mode::SingleExtruder) )) || + (tick.gcode == ToolChangeCode && + (m_ticks.mode == t_mode::MultiAsSingle && m_mode != t_mode::MultiAsSingle ) )) + icon = create_scaled_bitmap(this, "error_tick"); + } + + if (!icon.IsNull()) + { + wxCoord x_draw, y_draw; + is_horizontal() ? x_draw = pos - 0.5 * m_tick_icon_dim : y_draw = pos - 0.5 * m_tick_icon_dim; + is_horizontal() ? y_draw = mid + 22 : x_draw = mid + m_thumb_size.x + 3; + + dc.DrawBitmap(icon, x_draw, y_draw); + } + } +} + +std::string Control::get_color_for_tool_change_tick(std::set::const_iterator it) const +{ + const int current_extruder = it->extruder == 0 ? std::max(m_only_extruder, 1) : it->extruder; + + auto it_n = it; + while (it_n != m_ticks.ticks.begin()) { + --it_n; + if (it_n->gcode == ColorChangeCode && it_n->extruder == current_extruder) + return it_n->color; + } + + return it->color; +} + +std::string Control::get_color_for_color_change_tick(std::set::const_iterator it) const +{ + const int def_extruder = std::max(1, m_only_extruder); + auto it_n = it; + bool is_tool_change = false; + while (it_n != m_ticks.ticks.begin()) { + --it_n; + if (it_n->gcode == ToolChangeCode) { + is_tool_change = true; + if (it_n->extruder == it->extruder) + return it->color; + break; + } + } + if (!is_tool_change && it->extruder == def_extruder) + return it->color; + + return ""; +} + +void Control::draw_colored_band(wxDC& dc) +{ + if (!m_is_enabled_tick_manipulation) + return; + + int height, width; + get_size(&width, &height); + + const wxCoord mid = is_horizontal() ? 0.5 * height : 0.5 * width; + + wxRect main_band = is_horizontal() ? + wxRect(SLIDER_MARGIN, lround(mid - 0.375 * m_thumb_size.y), + width - 2 * SLIDER_MARGIN + 1, lround(0.75 * m_thumb_size.y)) : + wxRect(lround(mid - 0.375 * m_thumb_size.x), SLIDER_MARGIN, + lround(0.75 * m_thumb_size.x), height - 2 * SLIDER_MARGIN + 1); + + auto draw_band = [](wxDC& dc, const wxColour& clr, const wxRect& band_rc) + { + dc.SetPen(clr); + dc.SetBrush(clr); + dc.DrawRectangle(band_rc); + }; + + // don't color a band for MultiExtruder mode + if (m_ticks.empty() || m_mode == t_mode::MultiExtruder) + { + draw_band(dc, GetParent()->GetBackgroundColour(), main_band); + return; + } + + const int default_color_idx = m_mode==t_mode::MultiAsSingle ? std::max(m_only_extruder - 1, 0) : 0; + draw_band(dc, wxColour(GUI::wxGetApp().plater()->get_extruder_colors_from_plater_config()[default_color_idx]), main_band); + + std::set::const_iterator tick_it = m_ticks.ticks.begin(); + + while (tick_it != m_ticks.ticks.end()) + { + if ( (m_mode == t_mode::SingleExtruder && tick_it->gcode == ColorChangeCode ) || + (m_mode == t_mode::MultiAsSingle && (tick_it->gcode == ToolChangeCode || tick_it->gcode == ColorChangeCode)) ) + { + const wxCoord pos = get_position_from_value(tick_it->tick); + is_horizontal() ? main_band.SetLeft(SLIDER_MARGIN + pos) : + main_band.SetBottom(pos - 1); + + const std::string clr_str = m_mode == t_mode::SingleExtruder ? tick_it->color : + tick_it->gcode == ToolChangeCode ? + get_color_for_tool_change_tick(tick_it) : + get_color_for_color_change_tick(tick_it); + + if (!clr_str.empty()) + draw_band(dc, wxColour(clr_str), main_band); + } + ++tick_it; + } +} + +void Control::draw_one_layer_icon(wxDC& dc) +{ + const wxBitmap& icon = m_is_one_layer ? + m_is_one_layer_icon_focesed ? m_bmp_one_layer_lock_off.bmp() : m_bmp_one_layer_lock_on.bmp() : + m_is_one_layer_icon_focesed ? m_bmp_one_layer_unlock_off.bmp() : m_bmp_one_layer_unlock_on.bmp(); + + int width, height; + get_size(&width, &height); + + wxCoord x_draw, y_draw; + is_horizontal() ? x_draw = width-2 : x_draw = 0.5*width - 0.5*m_lock_icon_dim; + is_horizontal() ? y_draw = 0.5*height - 0.5*m_lock_icon_dim : y_draw = height-2; + + dc.DrawBitmap(icon, x_draw, y_draw); + + //update rect of the lock/unlock icon + m_rect_one_layer_icon = wxRect(x_draw, y_draw, m_lock_icon_dim, m_lock_icon_dim); +} + +void Control::draw_revert_icon(wxDC& dc) +{ + if (m_ticks.empty() || !m_is_enabled_tick_manipulation) + return; + + int width, height; + get_size(&width, &height); + + wxCoord x_draw, y_draw; + is_horizontal() ? x_draw = width-2 : x_draw = 0.25*SLIDER_MARGIN; + is_horizontal() ? y_draw = 0.25*SLIDER_MARGIN: y_draw = height-2; + + dc.DrawBitmap(m_bmp_revert.bmp(), x_draw, y_draw); + + //update rect of the lock/unlock icon + m_rect_revert_icon = wxRect(x_draw, y_draw, m_revert_icon_dim, m_revert_icon_dim); +} + +void Control::draw_cog_icon(wxDC& dc) +{ + if (m_mode != t_mode::MultiExtruder) + return; + + int width, height; + get_size(&width, &height); + + wxCoord x_draw, y_draw; + is_horizontal() ? x_draw = width-2 : x_draw = width - m_cog_icon_dim - 2; + is_horizontal() ? y_draw = height - m_cog_icon_dim - 2 : y_draw = height-2; + + dc.DrawBitmap(m_bmp_cog.bmp(), x_draw, y_draw); + + //update rect of the lock/unlock icon + m_rect_cog_icon = wxRect(x_draw, y_draw, m_cog_icon_dim, m_cog_icon_dim); +} + +void Control::update_thumb_rect(const wxCoord& begin_x, const wxCoord& begin_y, const SelectedSlider& selection) +{ + const wxRect& rect = wxRect(begin_x, begin_y, m_thumb_size.x, int(m_thumb_size.y*0.5)); + if (selection == ssLower) + m_rect_lower_thumb = rect; + else + m_rect_higher_thumb = rect; +} + +int Control::get_value_from_position(const wxCoord x, const wxCoord y) +{ + const int height = get_size().y; + const double step = get_scroll_step(); + + if (is_horizontal()) + return int(double(x - SLIDER_MARGIN) / step + 0.5); + + return int(m_min_value + double(height - SLIDER_MARGIN - y) / step + 0.5); +} + +void Control::detect_selected_slider(const wxPoint& pt) +{ + m_selection = is_point_in_rect(pt, m_rect_lower_thumb) ? ssLower : + is_point_in_rect(pt, m_rect_higher_thumb) ? ssHigher : ssUndef; +} + +bool Control::is_point_in_rect(const wxPoint& pt, const wxRect& rect) +{ + return rect.GetLeft() <= pt.x && pt.x <= rect.GetRight() && + rect.GetTop() <= pt.y && pt.y <= rect.GetBottom(); +} + +int Control::is_point_near_tick(const wxPoint& pt) +{ + for (auto tick : m_ticks.ticks) { + const wxCoord pos = get_position_from_value(tick.tick); + + if (is_horizontal()) { + if (pos - 4 <= pt.x && pt.x <= pos + 4) + return tick.tick; + } + else { + if (pos - 4 <= pt.y && pt.y <= pos + 4) + return tick.tick; + } + } + return -1; +} + +void Control::ChangeOneLayerLock() +{ + m_is_one_layer = !m_is_one_layer; + m_selection == ssLower ? correct_lower_value() : correct_higher_value(); + if (!m_selection) m_selection = ssHigher; + + Refresh(); + Update(); + + wxCommandEvent e(wxEVT_SCROLL_CHANGED); + e.SetEventObject(this); + ProcessWindowEvent(e); +} + +void Control::OnLeftDown(wxMouseEvent& event) +{ + if (HasCapture()) + return; + this->CaptureMouse(); + + wxClientDC dc(this); + wxPoint pos = event.GetLogicalPosition(dc); + if (is_point_in_rect(pos, m_rect_tick_action) && m_is_enabled_tick_manipulation) + { + const auto it = m_ticks.ticks.find(TickCode{ m_selection == ssLower ? m_lower_value : m_higher_value }); + if (it == m_ticks.ticks.end()) + m_force_add_tick = true; + else + m_force_delete_tick = true; + return; + } + + m_is_left_down = true; + if (is_point_in_rect(pos, m_rect_one_layer_icon)) { + // switch on/off one layer mode + m_is_one_layer = !m_is_one_layer; + if (!m_is_one_layer) { + SetLowerValue(m_min_value); + SetHigherValue(m_max_value); + } + m_selection == ssLower ? correct_lower_value() : correct_higher_value(); + if (!m_selection) m_selection = ssHigher; + } + else if (is_point_in_rect(pos, m_rect_revert_icon) && m_is_enabled_tick_manipulation) { + // discard all color changes + SetLowerValue(m_min_value); + SetHigherValue(m_max_value); + + m_selection == ssLower ? correct_lower_value() : correct_higher_value(); + if (!m_selection) m_selection = ssHigher; + + m_ticks.ticks.clear(); + post_ticks_changed_event(); + } + else if (is_point_in_rect(pos, m_rect_cog_icon) && m_mode == t_mode::MultiExtruder) { + // show dialog for set extruder sequence + m_force_edit_extruder_sequence = true; + return; + } + else + detect_selected_slider(pos); + + if (!m_selection) { + const int tick_val = is_point_near_tick(pos); + /* Set current thumb position to the nearest tick (if it is) + * OR to a value corresponding to the mouse click + * */ + const int mouse_val = tick_val >= 0 && m_is_enabled_tick_manipulation ? tick_val : + get_value_from_position(pos.x, pos.y); + if (mouse_val >= 0) + { + // if (abs(mouse_val - m_lower_value) < abs(mouse_val - m_higher_value)) { + if ( mouse_val <= m_lower_value ) { + SetLowerValue(mouse_val); + correct_lower_value(); + m_selection = ssLower; + } + else { + SetHigherValue(mouse_val); + correct_higher_value(); + m_selection = ssHigher; + } + } + } + + Refresh(); + Update(); + event.Skip(); +} + +void Control::correct_lower_value() +{ + if (m_lower_value < m_min_value) + m_lower_value = m_min_value; + else if (m_lower_value > m_max_value) + m_lower_value = m_max_value; + + if ((m_lower_value >= m_higher_value && m_lower_value <= m_max_value) || m_is_one_layer) + m_higher_value = m_lower_value; +} + +void Control::correct_higher_value() +{ + if (m_higher_value > m_max_value) + m_higher_value = m_max_value; + else if (m_higher_value < m_min_value) + m_higher_value = m_min_value; + + if ((m_higher_value <= m_lower_value && m_higher_value >= m_min_value) || m_is_one_layer) + m_lower_value = m_higher_value; +} + +wxString Control::get_tooltip(IconFocus icon_focus) +{ + wxString tooltip(wxEmptyString); + if (m_is_one_layer_icon_focesed) + tooltip = _(L("One layer mode")); + + if (icon_focus == ifRevert) + tooltip = _(L("Discard all custom changes")); + if (icon_focus == ifCog) + tooltip = _(L("Set extruder sequence for whole print")); + else if (m_is_action_icon_focesed) + { + const int tick = m_selection == ssLower ? m_lower_value : m_higher_value; + const auto tick_code_it = m_ticks.ticks.find(TickCode{tick}); + tooltip = tick_code_it == m_ticks.ticks.end() ? (m_mode == t_mode::MultiAsSingle ? + _(L("For add change extruder use left mouse button click")) : + _(L("For add color change use left mouse button click")) ) + "\n" + + _(L("For add another code use right mouse button click")) : + tick_code_it->gcode == ColorChangeCode ? ( m_mode == t_mode::SingleExtruder ? + _(L("For Delete color change use left mouse button click\n" + "For Edit color use right mouse button click")) : + from_u8((boost::format(_utf8(L("Delete color change for Extruder %1%"))) % tick_code_it->extruder).str()) ): + tick_code_it->gcode == PausePrintCode ? + _(L("Delete pause")) : + tick_code_it->gcode == ToolChangeCode ? + from_u8((boost::format(_utf8(L("Delete extruder change to \"%1%\""))) % tick_code_it->extruder).str()) : + from_u8((boost::format(_utf8(L("For Delete \"%1%\" code use left mouse button click\n" + "For Edit \"%1%\" code use right mouse button click"))) % tick_code_it->gcode ).str()); + } + + return tooltip; +} + +void Control::OnMotion(wxMouseEvent& event) +{ + bool action = false; + + const wxClientDC dc(this); + const wxPoint pos = event.GetLogicalPosition(dc); + + m_is_one_layer_icon_focesed = is_point_in_rect(pos, m_rect_one_layer_icon); + IconFocus icon_focus = ifNone; + + if (!m_is_left_down && !m_is_one_layer) { + m_is_action_icon_focesed = is_point_in_rect(pos, m_rect_tick_action); + if (!m_ticks.empty() && is_point_in_rect(pos, m_rect_revert_icon)) + icon_focus = ifRevert; + else if (is_point_in_rect(pos, m_rect_cog_icon)) + icon_focus = ifCog; + } + else if (m_is_left_down || m_is_right_down) { + if (m_selection == ssLower) { + int current_value = m_lower_value; + m_lower_value = get_value_from_position(pos.x, pos.y); + correct_lower_value(); + action = (current_value != m_lower_value); + } + else if (m_selection == ssHigher) { + int current_value = m_higher_value; + m_higher_value = get_value_from_position(pos.x, pos.y); + correct_higher_value(); + action = (current_value != m_higher_value); + } + } + Refresh(); + Update(); + event.Skip(); + + // Set tooltips with information for each icon + this->SetToolTip(get_tooltip(icon_focus)); + + if (action) + { + wxCommandEvent e(wxEVT_SCROLL_CHANGED); + e.SetEventObject(this); + e.SetString("moving"); + ProcessWindowEvent(e); + } +} + +void Control::append_change_extruder_menu_item(wxMenu* menu, bool switch_current_code/* = false*/) +{ + const int extruders_cnt = GUI::wxGetApp().extruders_edited_cnt(); + if (extruders_cnt > 1) + { + std::array active_extruders = get_active_extruders_for_tick(m_selection == ssLower ? m_lower_value : m_higher_value); + + wxMenu* change_extruder_menu = new wxMenu(); + + for (int i = 1; i <= extruders_cnt; i++) + { + const bool is_active_extruder = i == active_extruders[0] || i == active_extruders[1]; + const wxString item_name = wxString::Format(_(L("Extruder %d")), i) + + (is_active_extruder ? " (" + _(L("active")) + ")" : ""); + + if (m_mode == t_mode::MultiAsSingle) + append_menu_item(change_extruder_menu, wxID_ANY, item_name, "", + [this, i](wxCommandEvent&) { add_code_as_tick(ToolChangeCode, i); }, "", menu, + [is_active_extruder]() { return !is_active_extruder; }, GUI::wxGetApp().plater()); + } + + const wxString change_extruder_menu_name = m_mode == t_mode::MultiAsSingle ? + (switch_current_code ? _(L("Switch code to Change extruder")) : _(L("Change extruder")) ) : + _(L("Change extruder (N/A)")); + + wxMenuItem* change_extruder_menu_item = menu->AppendSubMenu(change_extruder_menu, change_extruder_menu_name, _(L("Use another extruder"))); + change_extruder_menu_item->SetBitmap(create_scaled_bitmap(this, active_extruders[1] > 0 ? "edit_uni" : "change_extruder")); + + GUI::wxGetApp().plater()->Bind(wxEVT_UPDATE_UI, [this, change_extruder_menu_item](wxUpdateUIEvent& evt) { + enable_menu_item(evt, [this]() {return m_mode == t_mode::MultiAsSingle; }, change_extruder_menu_item, this); }, + change_extruder_menu_item->GetId()); + } +} + +void Control::append_add_color_change_menu_item(wxMenu* menu, bool switch_current_code/* = false*/) +{ + const int extruders_cnt = GUI::wxGetApp().extruders_edited_cnt(); + if (extruders_cnt > 1) + { + std::set used_extruders_for_tick = get_used_extruders_for_tick(m_selection == ssLower ? m_lower_value : m_higher_value); + + wxMenu* add_color_change_menu = new wxMenu(); + + for (int i = 1; i <= extruders_cnt; i++) + { + const bool is_used_extruder = used_extruders_for_tick.empty() ? true : // #ys_FIXME till used_extruders_for_tick doesn't filled correct for mmMultiExtruder + used_extruders_for_tick.find(i) != used_extruders_for_tick.end(); + const wxString item_name = wxString::Format(_(L("Extruder %d")), i) + + (is_used_extruder ? " (" + _(L("used")) + ")" : ""); + + append_menu_item(add_color_change_menu, wxID_ANY, item_name, "", + [this, i](wxCommandEvent&) { add_code_as_tick(ColorChangeCode, i); }, "", menu, + [is_used_extruder]() { return is_used_extruder; }, GUI::wxGetApp().plater()); + } + + const wxString menu_name = switch_current_code ? + from_u8((boost::format(_utf8(L("Switch code to Color change (%1%) for:"))) % ColorChangeCode).str()) : + from_u8((boost::format(_utf8(L("Add color change (%1%) for:"))) % ColorChangeCode).str()); + wxMenuItem* add_color_change_menu_item = menu->AppendSubMenu(add_color_change_menu, menu_name, ""); + add_color_change_menu_item->SetBitmap(create_scaled_bitmap(this, "colorchange_add_m")); + } +} + +void Control::OnLeftUp(wxMouseEvent& event) +{ + if (!HasCapture()) + return; + this->ReleaseMouse(); + m_is_left_down = false; + + if (m_force_delete_tick) + { + delete_current_tick(); + m_force_delete_tick = false; + } + else + if (m_force_add_tick) + { + add_current_tick(); + m_force_add_tick = false; + } + else + if (m_force_edit_extruder_sequence) { + edit_extruder_sequence(); + m_force_edit_extruder_sequence = false; + } + + Refresh(); + Update(); + event.Skip(); + + wxCommandEvent e(wxEVT_SCROLL_CHANGED); + e.SetEventObject(this); + ProcessWindowEvent(e); +} + +void Control::enter_window(wxMouseEvent& event, const bool enter) +{ + m_is_focused = enter; + Refresh(); + Update(); + event.Skip(); +} + +// "condition" have to be true for: +// - value increase (if wxSL_VERTICAL) +// - value decrease (if wxSL_HORIZONTAL) +void Control::move_current_thumb(const bool condition) +{ +// m_is_one_layer = wxGetKeyState(WXK_CONTROL); + int delta = condition ? -1 : 1; + if (is_horizontal()) + delta *= -1; + + if (m_selection == ssLower) { + m_lower_value -= delta; + correct_lower_value(); + } + else if (m_selection == ssHigher) { + m_higher_value -= delta; + correct_higher_value(); + } + Refresh(); + Update(); + + wxCommandEvent e(wxEVT_SCROLL_CHANGED); + e.SetEventObject(this); + ProcessWindowEvent(e); +} + +void Control::OnWheel(wxMouseEvent& event) +{ + // Set nearest to the mouse thumb as a selected, if there is not selected thumb + if (m_selection == ssUndef) + { + const wxPoint& pt = event.GetLogicalPosition(wxClientDC(this)); + + if (is_horizontal()) + m_selection = abs(pt.x - m_rect_lower_thumb.GetRight()) <= + abs(pt.x - m_rect_higher_thumb.GetLeft()) ? + ssLower : ssHigher; + else + m_selection = abs(pt.y - m_rect_lower_thumb.GetTop()) <= + abs(pt.y - m_rect_higher_thumb.GetBottom()) ? + ssLower : ssHigher; + } + + move_current_thumb(event.GetWheelRotation() > 0); +} + +void Control::OnKeyDown(wxKeyEvent &event) +{ + const int key = event.GetKeyCode(); + if (key == WXK_NUMPAD_ADD) { + // OnChar() is called immediately after OnKeyDown(), which can cause call of add_tick() twice. + // To avoid this case we should suppress second add_tick() call. + m_ticks.suppress_plus(true); + add_current_tick(true); + } + else if (key == 390 || key == WXK_DELETE || key == WXK_BACK) { + // OnChar() is called immediately after OnKeyDown(), which can cause call of delete_tick() twice. + // To avoid this case we should suppress second delete_tick() call. + m_ticks.suppress_minus(true); + delete_current_tick(); + } + else if (is_horizontal()) + { + if (key == WXK_LEFT || key == WXK_RIGHT) + move_current_thumb(key == WXK_LEFT); + else if (key == WXK_UP || key == WXK_DOWN) { + m_selection = key == WXK_UP ? ssHigher : ssLower; + Refresh(); + } + } + else { + if (key == WXK_LEFT || key == WXK_RIGHT) { + m_selection = key == WXK_LEFT ? ssHigher : ssLower; + Refresh(); + } + else if (key == WXK_UP || key == WXK_DOWN) + move_current_thumb(key == WXK_UP); + } + + event.Skip(); // !Needed to have EVT_CHAR generated as well +} + +void Control::OnKeyUp(wxKeyEvent &event) +{ + if (event.GetKeyCode() == WXK_CONTROL) + m_is_one_layer = false; + Refresh(); + Update(); + event.Skip(); +} + +void Control::OnChar(wxKeyEvent& event) +{ + const int key = event.GetKeyCode(); + if (key == '+' && !m_ticks.suppressed_plus()) { + add_current_tick(true); + m_ticks.suppress_plus(false); + } + else if (key == '-' && !m_ticks.suppressed_minus()) { + delete_current_tick(); + m_ticks.suppress_minus(false); + } +} + +void Control::OnRightDown(wxMouseEvent& event) +{ + if (HasCapture()) return; + this->CaptureMouse(); + + const wxClientDC dc(this); + + wxPoint pos = event.GetLogicalPosition(dc); + if (is_point_in_rect(pos, m_rect_tick_action) && m_is_enabled_tick_manipulation) + { + const int tick = m_selection == ssLower ? m_lower_value : m_higher_value; + if (m_ticks.ticks.find(TickCode{ tick }) == m_ticks.ticks.end()) // if on this Z doesn't exist tick + // show context menu on OnRightUp() + m_show_context_menu = true; + else + // show "Edit" and "Delete" menu on OnRightUp() + m_show_edit_menu = true; + return; + } + + detect_selected_slider(event.GetLogicalPosition(dc)); + if (!m_selection) + return; + + if (m_selection == ssLower) + m_higher_value = m_lower_value; + else + m_lower_value = m_higher_value; + + // set slider to "one layer" mode + m_is_right_down = m_is_one_layer = true; + + Refresh(); + Update(); + event.Skip(); +} + +// Get active extruders for tick. +// Means one current extruder for not existing tick OR +// 2 extruders - for existing tick (extruder before ToolChangeCode and extruder of current existing tick) +// Use those values to disable selection of active extruders +std::array Control::get_active_extruders_for_tick(int tick) const +{ + int default_initial_extruder = m_mode == t_mode::MultiAsSingle ? std::max(1, m_only_extruder) : 1; + std::array extruders = { default_initial_extruder, -1 }; + if (m_ticks.empty()) + return extruders; + + auto it = m_ticks.ticks.lower_bound(TickCode{tick}); + + if (it->tick == tick) // current tick exists + extruders[1] = it->extruder; + + while (it != m_ticks.ticks.begin()) { + --it; + if(it->gcode == ToolChangeCode) { + extruders[0] = it->extruder; + break; + } + } + + return extruders; +} + +// Get used extruders for tick. +// Means all extruders(toools) will be used during printing from current tick to the end +std::set Control::get_used_extruders_for_tick(int tick) const +{ + if (m_mode == t_mode::MultiExtruder) + { + // #ys_FIXME: get tool ordering from _correct_ place + const ToolOrdering& tool_ordering = GUI::wxGetApp().plater()->fff_print().get_tool_ordering(); + + if (tool_ordering.empty()) + return {}; + + std::set used_extruders; + + auto it_layer_tools = std::lower_bound(tool_ordering.begin(), tool_ordering.end(), LayerTools(m_values[tick])); + for (; it_layer_tools != tool_ordering.end(); ++it_layer_tools) + { + const std::vector& extruders = it_layer_tools->extruders; + for (const auto& extruder : extruders) + used_extruders.emplace(extruder+1); + } + + return used_extruders; + } + + const int default_initial_extruder = m_mode == t_mode::MultiAsSingle ? std::max(m_only_extruder, 1) : 1; + if (m_ticks.empty()) + return {default_initial_extruder}; + + std::set used_extruders; + const std::set& ticks = m_ticks.ticks; + + auto it_start = ticks.lower_bound(TickCode{tick}); + auto it = it_start; + if (it == ticks.begin() && it->gcode == ToolChangeCode && + tick != it->tick ) // In case of switch of ToolChange to ColorChange, when tick exists, + // we shouldn't change color for extruder, which will be deleted + { + used_extruders.emplace(it->extruder); + if (tick < it->tick) + used_extruders.emplace(default_initial_extruder); + } + + while (it != ticks.begin()) { + --it; + if (it->gcode == ToolChangeCode && tick != it->tick) { + used_extruders.emplace(it->extruder); + break; + } + } + + if (it == ticks.begin() && used_extruders.empty()) + used_extruders.emplace(default_initial_extruder); + + for (it = it_start; it != ticks.end(); ++it) + if (it->gcode == ToolChangeCode && tick != it->tick) + used_extruders.emplace(it->extruder); + + return used_extruders; +} + +void Control::OnRightUp(wxMouseEvent& event) +{ + if (!HasCapture()) + return; + this->ReleaseMouse(); + m_is_right_down = m_is_one_layer = false; + + if (m_show_context_menu) { + wxMenu menu; + + if (m_mode == t_mode::SingleExtruder) + append_menu_item(&menu, wxID_ANY, _(L("Add color change")) + " (M600)", "", + [this](wxCommandEvent&) { add_code_as_tick(ColorChangeCode); }, "colorchange_add_m", &menu, + [](){return true;}, this); + else + { + append_change_extruder_menu_item(&menu); + append_add_color_change_menu_item(&menu); + } + + append_menu_item(&menu, wxID_ANY, _(L("Add pause print")) + " (M601)", "", + [this](wxCommandEvent&) { add_code_as_tick(PausePrintCode); }, "pause_print", &menu, + []() {return true; }, this); + + append_menu_item(&menu, wxID_ANY, _(L("Add custom G-code")), "", + [this](wxCommandEvent&) { add_code_as_tick(""); }, "edit_gcode", &menu, + []() {return true; }, this); + + GUI::wxGetApp().plater()->PopupMenu(&menu); + + m_show_context_menu = false; + } + else if (m_show_edit_menu) { + wxMenu menu; + + std::set::iterator it = m_ticks.ticks.find(TickCode{ m_selection == ssLower ? m_lower_value : m_higher_value }); + + if (it->gcode == ToolChangeCode) { + if (m_mode == t_mode::MultiAsSingle) + append_change_extruder_menu_item(&menu); + append_add_color_change_menu_item(&menu, true); + } + else + append_menu_item(&menu, wxID_ANY, it->gcode == ColorChangeCode ? _(L("Edit color")) : + it->gcode == PausePrintCode ? _(L("Edit pause print message")) : + _(L("Edit custom G-code")), "", + [this](wxCommandEvent&) { edit_tick(); }, "edit_uni", &menu); + + if (it->gcode == ColorChangeCode && m_mode == t_mode::MultiAsSingle) + append_change_extruder_menu_item(&menu, true); + + append_menu_item(&menu, wxID_ANY, it->gcode == ColorChangeCode ? _(L("Delete color change")) : + it->gcode == ToolChangeCode ? _(L("Delete tool change")) : + it->gcode == PausePrintCode ? _(L("Delete pause print")) : + _(L("Delete custom G-code")), "", + [this](wxCommandEvent&) { delete_current_tick();}, "colorchange_del_f", &menu); + + GUI::wxGetApp().plater()->PopupMenu(&menu); + + m_show_edit_menu = false; + } + + Refresh(); + Update(); + event.Skip(); +} + +static std::string get_new_color(const std::string& color) +{ + wxColour clr(color); + if (!clr.IsOk()) + clr = wxColour(0, 0, 0); // Don't set alfa to transparence + + auto data = new wxColourData(); + data->SetChooseFull(1); + data->SetColour(clr); + + wxColourDialog dialog(nullptr, data); + dialog.CenterOnParent(); + if (dialog.ShowModal() == wxID_OK) + return dialog.GetColourData().GetColour().GetAsString(wxC2S_HTML_SYNTAX).ToStdString(); + return ""; +} + +static std::string get_custom_code(const std::string& code_in, double height) +{ + wxString msg_text = from_u8(_utf8(L("Enter custom G-code used on current layer"))) + ":"; + wxString msg_header = from_u8((boost::format(_utf8(L("Custom Gcode on current layer (%1% mm)."))) % height).str()); + + // get custom gcode + wxTextEntryDialog dlg(nullptr, msg_text, msg_header, code_in, + wxTextEntryDialogStyle | wxTE_MULTILINE); + if (dlg.ShowModal() != wxID_OK || dlg.GetValue().IsEmpty()) + return ""; + + return dlg.GetValue().ToStdString(); +} + +static std::string get_pause_print_msg(const std::string& msg_in, double height) +{ + wxString msg_text = from_u8(_utf8(L("Enter short message shown on Printer display during pause print"))) + ":"; + wxString msg_header = from_u8((boost::format(_utf8(L("Message for pause print on current layer (%1% mm)."))) % height).str()); + + // get custom gcode + wxTextEntryDialog dlg(nullptr, msg_text, msg_header, from_u8(msg_in), + wxTextEntryDialogStyle); + if (dlg.ShowModal() != wxID_OK || dlg.GetValue().IsEmpty()) + return ""; + + return into_u8(dlg.GetValue()); +} + +void Control::add_code_as_tick(std::string code, int selected_extruder/* = -1*/) +{ + if (m_selection == ssUndef) + return; + const int tick = m_selection == ssLower ? m_lower_value : m_higher_value; + + if ( !check_ticks_changed_event(code) ) + return; + + const int extruder = selected_extruder > 0 ? selected_extruder : std::max(1, m_only_extruder); + const auto it = m_ticks.ticks.find(TickCode{ tick }); + + if ( it == m_ticks.ticks.end() ) { + // try to add tick + if (!m_ticks.add_tick(tick, code, extruder, m_values[tick])) + return; + } + else if (code == ToolChangeCode || code == ColorChangeCode) { + // try to switch tick code to ToolChangeCode or ColorChangeCode accordingly + if (!m_ticks.switch_code_for_tick(it, code, extruder)) + return; + } + else + return; + + post_ticks_changed_event(code); +} + +void Control::add_current_tick(bool call_from_keyboard /*= false*/) +{ + if (m_selection == ssUndef) + return; + const int tick = m_selection == ssLower ? m_lower_value : m_higher_value; + auto it = m_ticks.ticks.find(TickCode{ tick }); + + if (it != m_ticks.ticks.end() || // this tick is already exist + !check_ticks_changed_event(m_mode == t_mode::MultiAsSingle ? ToolChangeCode : ColorChangeCode)) + return; + + if (m_mode == t_mode::SingleExtruder) + add_code_as_tick(ColorChangeCode); + else + { + wxMenu menu; + + if (m_mode == t_mode::MultiAsSingle) + append_change_extruder_menu_item(&menu); + else + append_add_color_change_menu_item(&menu); + + wxPoint pos = wxDefaultPosition; + /* Menu position will be calculated from mouse click position, but... + * if function is called from keyboard (pressing "+"), we should to calculate it + * */ + if (call_from_keyboard) + { + int width, height; + get_size(&width, &height); + + const wxCoord coord = 0.75 * (is_horizontal() ? height : width); + this->GetPosition(&width, &height); + + pos = is_horizontal() ? + wxPoint(get_position_from_value(tick), height + coord) : + wxPoint(width + coord, get_position_from_value(tick)); + } + + GUI::wxGetApp().plater()->PopupMenu(&menu, pos); + } +} + +void Control::delete_current_tick() +{ + if (m_selection == ssUndef) + return; + + auto it = m_ticks.ticks.find(TickCode{ m_selection == ssLower ? m_lower_value : m_higher_value }); + if (it == m_ticks.ticks.end() || + !check_ticks_changed_event(it->gcode)) + return; + + const std::string code = it->gcode; + m_ticks.ticks.erase(it); + post_ticks_changed_event(code); +} + +void Control::edit_tick() +{ + const int tick = m_selection == ssLower ? m_lower_value : m_higher_value; + const std::set::iterator it = m_ticks.ticks.find(TickCode{ tick }); + + if (it == m_ticks.ticks.end() || + !check_ticks_changed_event(it->gcode)) + return; + + const std::string code = it->gcode; + if (m_ticks.edit_tick(it, m_values[it->tick])) + post_ticks_changed_event(code); +} + +void Control::edit_extruder_sequence() +{ + if (!check_ticks_changed_event(ToolChangeCode)) + return; + + GUI::ExtruderSequenceDialog dlg(m_extruders_sequence); + if (dlg.ShowModal() != wxID_OK) + return; + + const ExtrudersSequence& from_dlg_val = dlg.GetValue(); + if (m_extruders_sequence == from_dlg_val) + return; + + m_extruders_sequence = from_dlg_val; + + m_ticks.erase_all_ticks_with_code(ToolChangeCode); + + int tick = 0; + double value = 0.0; + int extruder = 0; + const int extr_cnt = m_extruders_sequence.extruders.size(); + + std::vector colors = GUI::wxGetApp().plater()->get_extruder_colors_from_plater_config(); + + while (tick <= m_max_value) + { + const int cur_extruder = m_extruders_sequence.extruders[extruder]; + m_ticks.ticks.emplace(TickCode{tick, ToolChangeCode, cur_extruder + 1, colors[cur_extruder]}); + + extruder++; + if (extruder == extr_cnt) + extruder = 0; + if (m_extruders_sequence.is_mm_intervals) + { + value += m_extruders_sequence.interval_by_mm; + auto val_it = std::lower_bound(m_values.begin(), m_values.end(), value - epsilon()); + + if (val_it == m_values.end()) + break; + + tick = val_it - m_values.begin(); + } + else + tick += m_extruders_sequence.interval_by_layers; + } + + post_ticks_changed_event(ToolChangeCode); +} + +void Control::post_ticks_changed_event(const std::string& gcode /*= ""*/) +{ + m_force_mode_apply = (gcode.empty() || gcode == ColorChangeCode || gcode == ToolChangeCode); + + wxPostEvent(this->GetParent(), wxCommandEvent(wxCUSTOMEVT_TICKSCHANGED)); +} + +bool Control::check_ticks_changed_event(const std::string& gcode) +{ + if ( m_ticks.mode == m_mode || + (gcode != ColorChangeCode && gcode != ToolChangeCode) || + (m_ticks.mode == t_mode::SingleExtruder && m_mode == t_mode::MultiAsSingle) || // All ColorChanges will be applied for 1st extruder + (m_ticks.mode == t_mode::MultiExtruder && m_mode == t_mode::MultiAsSingle) ) // Just mark ColorChanges for all unused extruders + return true; + + if ((m_ticks.mode == t_mode::SingleExtruder && m_mode == t_mode::MultiExtruder ) || + (m_ticks.mode == t_mode::MultiExtruder && m_mode == t_mode::SingleExtruder) ) + { + if (!m_ticks.has_tick_with_code(ColorChangeCode)) + return true; + + wxString message = (m_ticks.mode == t_mode::SingleExtruder ? + _(L("The last color change data was saved for a single extruder printer profile.")) : + _(L("The last color change data was saved for a multiple extruder printer profile.")) + ) + "\n" + + _(L("Your current changes will cause a deletion of all saved color changes.")) + "\n\n\t" + + _(L("Are you sure you want to continue?")); + + wxMessageDialog msg(this, message, _(L("Notice")), wxYES_NO); + if (msg.ShowModal() == wxID_YES) { + m_ticks.erase_all_ticks_with_code(ColorChangeCode); + post_ticks_changed_event(ColorChangeCode); + } + return false; + } + // m_ticks_mode == t_mode::MultiAsSingle + if( m_ticks.has_tick_with_code(ToolChangeCode) ) + { + wxString message = m_mode == t_mode::SingleExtruder ? ( + _(L("The last color change data was saved for a multi extruder printing.")) + "\n\n" + + _(L("Select YES if you want to delete all saved tool changes, \n\t" + "NO if you want all tool changes switch to color changes, \n\t" + "or CANCEL for do nothing")) + "\n\n\t" + + _(L("Do you want to delete all saved tool changes?")) + ) : ( // t_mode::MultiExtruder + _(L("The last color change data was saved for a multi extruder printing with tool changes for whole print.")) + "\n\n" + + _(L("Your current changes will cause a deletion of all saved tool changes.")) + "\n\n\t" + + _(L("Are you sure you want to continue?")) ) ; + + wxMessageDialog msg(this, message, _(L("Notice")), wxYES_NO | (m_mode == t_mode::SingleExtruder ? wxCANCEL : 0)); + const int answer = msg.ShowModal(); + if (answer == wxID_YES) { + m_ticks.erase_all_ticks_with_code(ToolChangeCode); + post_ticks_changed_event(ToolChangeCode); + } + else if (m_mode == t_mode::SingleExtruder && answer == wxID_NO) { + m_ticks.switch_code(ToolChangeCode, ColorChangeCode); + post_ticks_changed_event(ColorChangeCode); + } + return false; + } + + return true; +} + + +std::string TickCodeInfo::get_color_for_tick(TickCode tick, const std::string& code, const int extruder) +{ + std::vector colors = GUI::wxGetApp().plater()->get_extruder_colors_from_plater_config(); + std::string color = colors[extruder - 1]; + + if (code == ColorChangeCode) + { + if (!ticks.empty()) + { + auto before_tick_it = std::lower_bound(ticks.begin(), ticks.end(), tick ); + while (before_tick_it != ticks.begin()) { + --before_tick_it; + if (before_tick_it->gcode == ColorChangeCode && before_tick_it->extruder == extruder) { + color = before_tick_it->color; + break; + } + } + } + + color = get_new_color(color); + } + return color; +} + +bool TickCodeInfo::add_tick(const int tick, std::string& code, const int extruder, double print_z) +{ + std::string color; + if (code.empty()) // custom Gcode + { + code = get_custom_code(custom_gcode, print_z); + if (code.empty()) + return false; + custom_gcode = code; + } + else if (code == PausePrintCode) + { + /* PausePrintCode doesn't need a color, so + * this field is used for save a short message shown on Printer display + * */ + color = get_pause_print_msg(pause_print_msg, print_z); + if (color.empty()) + return false; + pause_print_msg = color; + } + else + { + color = get_color_for_tick(TickCode{ tick }, code, extruder); + if (color.empty()) + return false; + } + + ticks.emplace(TickCode{ tick, code, extruder, color }); + return true; +} + +bool TickCodeInfo::edit_tick(std::set::iterator it, double print_z) +{ + std::string edited_value; + if (it->gcode == ColorChangeCode) + edited_value = get_new_color(it->color); + else if (it->gcode == PausePrintCode) + edited_value = get_pause_print_msg(it->color, print_z); + else + edited_value = get_custom_code(it->gcode, print_z); + + if (edited_value.empty()) + return false; + + TickCode changed_tick = *it; + if (it->gcode == ColorChangeCode || it->gcode == PausePrintCode) { + if (it->color == edited_value) + return false; + changed_tick.color = edited_value; + } + else { + if (it->gcode == edited_value) + return false; + changed_tick.gcode = edited_value; + } + + ticks.erase(it); + ticks.emplace(changed_tick); + + return true; +} + +void TickCodeInfo::switch_code(const std::string& code_from, const std::string& code_to) +{ + for (auto it{ ticks.begin() }, end{ ticks.end() }; it != end; ) + if (it->gcode == code_from) + { + TickCode tick = *it; + tick.gcode = code_to; + tick.extruder = 1; + ticks.erase(it); + it = ticks.emplace(tick).first; + } + else + ++it; +} + +bool TickCodeInfo::switch_code_for_tick(std::set::iterator it, const std::string& code_to, const int extruder) +{ + const std::string color = get_color_for_tick(*it, code_to, extruder); + if (color.empty()) + return false; + + TickCode changed_tick = *it; + changed_tick.gcode = code_to; + changed_tick.extruder = extruder; + changed_tick.color = color; + + ticks.erase(it); + ticks.emplace(changed_tick); + + return true; +} + +void TickCodeInfo::erase_all_ticks_with_code(const std::string& gcode) +{ + for (auto it{ ticks.begin() }, end{ ticks.end() }; it != end; ) { + if (it->gcode == gcode) + it = ticks.erase(it); + else + ++it; + } +} + +bool TickCodeInfo::has_tick_with_code(const std::string& gcode) +{ + for (const TickCode& tick : ticks) + if (tick.gcode == gcode) + return true; + + return false; +} + +} // DoubleSlider + +} // Slic3r + + diff --git a/src/slic3r/GUI/DoubleSlider.hpp b/src/slic3r/GUI/DoubleSlider.hpp new file mode 100644 index 0000000000..02a98ebb21 --- /dev/null +++ b/src/slic3r/GUI/DoubleSlider.hpp @@ -0,0 +1,337 @@ +#ifndef slic3r_GUI_DoubleSlider_hpp_ +#define slic3r_GUI_DoubleSlider_hpp_ + +#include "libslic3r/CustomGCode.hpp" +#include "wxExtensions.hpp" + +#include +#include +#include +#include +#include + +#include +#include + +class wxMenu; + +namespace Slic3r { + +namespace DoubleSlider { + +/* For exporting GCode in GCodeWriter is used XYZF_NUM(val) = PRECISION(val, 3) for XYZ values. + * So, let use same value as a permissible error for layer height. + */ +static double epsilon() { return 0.0011;} + +// custom message the slider sends to its parent to notify a tick-change: +wxDECLARE_EVENT(wxCUSTOMEVT_TICKSCHANGED, wxEvent); + +enum SelectedSlider { + ssUndef, + ssLower, + ssHigher +}; + +enum IconFocus { + ifNone, + ifRevert, + ifCog +}; + +using t_mode = CustomGCode::Mode; + +struct TickCode +{ + bool operator<(const TickCode& other) const { return other.tick > this->tick; } + bool operator>(const TickCode& other) const { return other.tick < this->tick; } + + int tick = 0; + std::string gcode = ColorChangeCode; + int extruder = 0; + std::string color; +}; + +class TickCodeInfo +{ + std::string custom_gcode; + std::string pause_print_msg; + bool m_suppress_plus = false; + bool m_suppress_minus = false; + + std::string get_color_for_tick(TickCode tick, const std::string& code, const int extruder); + +public: + std::set ticks {}; + t_mode mode = t_mode::SingleExtruder; + + bool empty() const { return ticks.empty(); } + void set_pause_print_msg(const std::string& message) { pause_print_msg = message; } + + bool add_tick(const int tick, std::string& code, int extruder, double print_z); + bool edit_tick(std::set::iterator it, double print_z); + void switch_code(const std::string& code_from, const std::string& code_to); + bool switch_code_for_tick(std::set::iterator it, const std::string& code_to, const int extruder); + void erase_all_ticks_with_code(const std::string& gcode); + bool has_tick_with_code(const std::string& gcode); + + void suppress_plus (bool suppress) { m_suppress_plus = suppress; } + void suppress_minus(bool suppress) { m_suppress_minus = suppress; } + bool suppressed_plus () { return m_suppress_plus; } + bool suppressed_minus() { return m_suppress_minus; } +}; + + +struct ExtrudersSequence +{ + bool is_mm_intervals = true; + double interval_by_mm = 3.0; + int interval_by_layers = 10; + std::vector extruders = { 0 }; + + bool operator==(const ExtrudersSequence& other) const + { + return (other.is_mm_intervals == this->is_mm_intervals ) && + (other.interval_by_mm == this->interval_by_mm ) && + (other.interval_by_layers == this->interval_by_layers ) && + (other.extruders == this->extruders ) ; + } + bool operator!=(const ExtrudersSequence& other) const + { + return (other.is_mm_intervals != this->is_mm_intervals ) && + (other.interval_by_mm != this->interval_by_mm ) && + (other.interval_by_layers != this->interval_by_layers ) && + (other.extruders != this->extruders ) ; + } + + void add_extruder(size_t pos) + { + extruders.insert(extruders.begin() + pos+1, size_t(0)); + } + + void delete_extruder(size_t pos) + { + if (extruders.size() == 1) + return;// last item can't be deleted + extruders.erase(extruders.begin() + pos); + } +}; + +class Control : public wxControl +{ +public: + Control( + wxWindow *parent, + wxWindowID id, + int lowerValue, + int higherValue, + int minValue, + int maxValue, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxSL_VERTICAL, + const wxValidator& val = wxDefaultValidator, + const wxString& name = wxEmptyString); + ~Control() {} + + void msw_rescale(); + + int GetMinValue() const { return m_min_value; } + int GetMaxValue() const { return m_max_value; } + double GetMinValueD() { return m_values.empty() ? 0. : m_values[m_min_value]; } + double GetMaxValueD() { return m_values.empty() ? 0. : m_values[m_max_value]; } + int GetLowerValue() const { return m_lower_value; } + int GetHigherValue() const { return m_higher_value; } + int GetActiveValue() const; + double GetLowerValueD() { return get_double_value(ssLower); } + double GetHigherValueD() { return get_double_value(ssHigher); } + wxSize DoGetBestSize() const override; + wxSize get_min_size() const ; + + // Set low and high slider position. If the span is non-empty, disable the "one layer" mode. + void SetLowerValue (const int lower_val); + void SetHigherValue(const int higher_val); + void SetSelectionSpan(const int lower_val, const int higher_val); + + void SetMaxValue(const int max_value); + void SetKoefForLabels(const double koef) { m_label_koef = koef; } + void SetSliderValues(const std::vector& values) { m_values = values; } + void ChangeOneLayerLock(); + + CustomGCode::Info GetTicksValues() const; + void SetTicksValues(const Slic3r::CustomGCode::Info &custom_gcode_per_print_z); + + void EnableTickManipulation(bool enable = true) { m_is_enabled_tick_manipulation = enable; } + void DisableTickManipulation() { EnableTickManipulation(false); } + + void SetManipulationMode(t_mode mode) { m_mode = mode; } + t_mode GetManipulationMode() const { return m_mode; } + void SetModeAndOnlyExtruder(const bool is_one_extruder_printed_model, const int only_extruder) + { + m_mode = !is_one_extruder_printed_model ? t_mode::MultiExtruder : + only_extruder < 0 ? t_mode::SingleExtruder : + t_mode::MultiAsSingle; + m_only_extruder = only_extruder; + } + + bool is_horizontal() const { return m_style == wxSL_HORIZONTAL; } + bool is_one_layer() const { return m_is_one_layer; } + bool is_lower_at_min() const { return m_lower_value == m_min_value; } + bool is_higher_at_max() const { return m_higher_value == m_max_value; } + bool is_full_span() const { return this->is_lower_at_min() && this->is_higher_at_max(); } + + void OnPaint(wxPaintEvent& ) { render();} + void OnLeftDown(wxMouseEvent& event); + void OnMotion(wxMouseEvent& event); + void OnLeftUp(wxMouseEvent& event); + void OnEnterWin(wxMouseEvent& event) { enter_window(event, true); } + void OnLeaveWin(wxMouseEvent& event) { enter_window(event, false); } + void OnWheel(wxMouseEvent& event); + void OnKeyDown(wxKeyEvent &event); + void OnKeyUp(wxKeyEvent &event); + void OnChar(wxKeyEvent &event); + void OnRightDown(wxMouseEvent& event); + void OnRightUp(wxMouseEvent& event); + + void add_code_as_tick(std::string code, int selected_extruder = -1); + // add default action for tick, when press "+" + void add_current_tick(bool call_from_keyboard = false); + // delete current tick, when press "-" + void delete_current_tick(); + void edit_tick(); + void edit_extruder_sequence(); + + ExtrudersSequence m_extruders_sequence; + +protected: + + void render(); + void draw_focus_rect(); + void draw_action_icon(wxDC& dc, const wxPoint pt_beg, const wxPoint pt_end); + void draw_scroll_line(wxDC& dc, const int lower_pos, const int higher_pos); + void draw_thumb(wxDC& dc, const wxCoord& pos_coord, const SelectedSlider& selection); + void draw_thumbs(wxDC& dc, const wxCoord& lower_pos, const wxCoord& higher_pos); + void draw_ticks(wxDC& dc); + void draw_colored_band(wxDC& dc); + void draw_one_layer_icon(wxDC& dc); + void draw_revert_icon(wxDC& dc); + void draw_cog_icon(wxDC &dc); + void draw_thumb_item(wxDC& dc, const wxPoint& pos, const SelectedSlider& selection); + void draw_info_line_with_icon(wxDC& dc, const wxPoint& pos, SelectedSlider selection); + void draw_thumb_text(wxDC& dc, const wxPoint& pos, const SelectedSlider& selection) const; + + void update_thumb_rect(const wxCoord& begin_x, const wxCoord& begin_y, const SelectedSlider& selection); + void detect_selected_slider(const wxPoint& pt); + void correct_lower_value(); + void correct_higher_value(); + void move_current_thumb(const bool condition); + void enter_window(wxMouseEvent& event, const bool enter); + +private: + + bool is_point_in_rect(const wxPoint& pt, const wxRect& rect); + int is_point_near_tick(const wxPoint& pt); + + double get_scroll_step(); + wxString get_label(const SelectedSlider& selection) const; + void get_lower_and_higher_position(int& lower_pos, int& higher_pos); + int get_value_from_position(const wxCoord x, const wxCoord y); + wxCoord get_position_from_value(const int value); + wxSize get_size(); + void get_size(int *w, int *h); + double get_double_value(const SelectedSlider& selection); + wxString get_tooltip(IconFocus icon_focus); + + std::string get_color_for_tool_change_tick(std::set::const_iterator it) const; + std::string get_color_for_color_change_tick(std::set::const_iterator it) const; + + // Get active extruders for tick. + // Means one current extruder for not existing tick OR + // 2 extruders - for existing tick (extruder before ToolChangeCode and extruder of current existing tick) + // Use those values to disable selection of active extruders + std::array get_active_extruders_for_tick(int tick) const; + + // Get used extruders for tick. + // Means all extruders(toools) will be used during printing from current tick to the end + std::set get_used_extruders_for_tick(int tick) const; + + void post_ticks_changed_event(const std::string& gcode = ""); + bool check_ticks_changed_event(const std::string& gcode); + + void append_change_extruder_menu_item (wxMenu*, bool switch_current_code = false); + void append_add_color_change_menu_item(wxMenu*, bool switch_current_code = false); + + bool is_osx { false }; + wxFont m_font; + int m_min_value; + int m_max_value; + int m_lower_value; + int m_higher_value; + ScalableBitmap m_bmp_thumb_higher; + ScalableBitmap m_bmp_thumb_lower; + ScalableBitmap m_bmp_add_tick_on; + ScalableBitmap m_bmp_add_tick_off; + ScalableBitmap m_bmp_del_tick_on; + ScalableBitmap m_bmp_del_tick_off; + ScalableBitmap m_bmp_one_layer_lock_on; + ScalableBitmap m_bmp_one_layer_lock_off; + ScalableBitmap m_bmp_one_layer_unlock_on; + ScalableBitmap m_bmp_one_layer_unlock_off; + ScalableBitmap m_bmp_revert; + ScalableBitmap m_bmp_cog; + SelectedSlider m_selection; + bool m_is_left_down = false; + bool m_is_right_down = false; + bool m_is_one_layer = false; + bool m_is_focused = false; + bool m_is_action_icon_focesed = false; + bool m_is_one_layer_icon_focesed = false; + bool m_is_enabled_tick_manipulation = true; + bool m_show_context_menu = false; + bool m_show_edit_menu = false; + bool m_force_edit_extruder_sequence = false; + bool m_force_mode_apply = true; + bool m_force_add_tick = false; + bool m_force_delete_tick = false; + t_mode m_mode = t_mode::SingleExtruder; + int m_only_extruder = -1; + + wxRect m_rect_lower_thumb; + wxRect m_rect_higher_thumb; + wxRect m_rect_tick_action; + wxRect m_rect_one_layer_icon; + wxRect m_rect_revert_icon; + wxRect m_rect_cog_icon; + wxSize m_thumb_size; + int m_tick_icon_dim; + int m_lock_icon_dim; + int m_revert_icon_dim; + int m_cog_icon_dim; + long m_style; + float m_label_koef = 1.0; + + std::vector m_values; + TickCodeInfo m_ticks; + +// control's view variables + wxCoord SLIDER_MARGIN; // margin around slider + + wxPen DARK_ORANGE_PEN; + wxPen ORANGE_PEN; + wxPen LIGHT_ORANGE_PEN; + + wxPen DARK_GREY_PEN; + wxPen GREY_PEN; + wxPen LIGHT_GREY_PEN; + + std::vector m_line_pens; + std::vector m_segm_pens; +}; + +} // DoubleSlider; + +} // Slic3r + + + +#endif // slic3r_GUI_DoubleSlider_hpp_ diff --git a/src/slic3r/GUI/ExtruderSequenceDialog.hpp b/src/slic3r/GUI/ExtruderSequenceDialog.hpp index 3efd9e3a22..97d57ef120 100644 --- a/src/slic3r/GUI/ExtruderSequenceDialog.hpp +++ b/src/slic3r/GUI/ExtruderSequenceDialog.hpp @@ -2,7 +2,7 @@ #define slic3r_GUI_ExtruderSequenceDialog_hpp_ #include "GUI_Utils.hpp" -#include "wxExtensions.hpp" +#include "DoubleSlider.hpp" class wxTextCtrl; class wxFlexGridSizer; diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 09d6eda2ef..d847b297e5 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -60,6 +60,7 @@ #include #include #include +#include "DoubleSlider.hpp" #if ENABLE_RENDER_STATISTICS #include #endif // ENABLE_RENDER_STATISTICS @@ -910,7 +911,7 @@ void GLCanvas3D::LegendTexture::fill_color_print_legend_items( const GLCanvas3D { if (custom_code.gcode != ColorChangeCode) continue; - auto lower_b = std::lower_bound(print_zs.begin(), print_zs.end(), custom_code.print_z - DoubleSlider::epsilon()); + auto lower_b = std::lower_bound(print_zs.begin(), print_zs.end(), custom_code.print_z - Slic3r::DoubleSlider::epsilon()); if (lower_b == print_zs.end()) continue; diff --git a/src/slic3r/GUI/GUI_Preview.cpp b/src/slic3r/GUI/GUI_Preview.cpp index c60547abcf..e42f8ed216 100644 --- a/src/slic3r/GUI/GUI_Preview.cpp +++ b/src/slic3r/GUI/GUI_Preview.cpp @@ -10,7 +10,7 @@ #include "GLCanvas3DManager.hpp" #include "GLCanvas3D.hpp" #include "PresetBundle.hpp" -#include "wxExtensions.hpp" +#include "DoubleSlider.hpp" #include #include @@ -584,7 +584,7 @@ void Preview::update_view_type(bool slice_completed) void Preview::create_double_slider() { - m_slider = new DoubleSlider(this, wxID_ANY, 0, 0, 0, 100); + m_slider = new DoubleSlider::Control(this, wxID_ANY, 0, 0, 0, 100); m_slider->EnableTickManipulation(wxGetApp().preset_bundle->printers.get_edited_preset().printer_technology() == ptFFF); m_double_slider_sizer->Add(m_slider, 0, wxEXPAND, 0); @@ -595,7 +595,7 @@ void Preview::create_double_slider() m_slider->Bind(wxEVT_SCROLL_CHANGED, &Preview::on_sliders_scroll_changed, this); - Bind(wxCUSTOMEVT_TICKSCHANGED, [this](wxEvent&) { + Bind(DoubleSlider::wxCUSTOMEVT_TICKSCHANGED, [this](wxEvent&) { Model& model = wxGetApp().plater()->model(); model.custom_gcode_per_print_z = m_slider->GetTicksValues(); m_schedule_background_process(); diff --git a/src/slic3r/GUI/GUI_Preview.hpp b/src/slic3r/GUI/GUI_Preview.hpp index ef311e3072..cc8f153251 100644 --- a/src/slic3r/GUI/GUI_Preview.hpp +++ b/src/slic3r/GUI/GUI_Preview.hpp @@ -15,7 +15,6 @@ class wxChoice; class wxComboCtrl; class wxBitmapComboBox; class wxCheckBox; -class DoubleSlider; namespace Slic3r { @@ -25,6 +24,10 @@ class BackgroundSlicingProcess; class GCodePreviewData; class Model; +namespace DoubleSlider { + class Control; +}; + namespace GUI { class GLCanvas3D; @@ -103,7 +106,7 @@ class Preview : public wxPanel bool m_loaded; bool m_enabled; - DoubleSlider* m_slider {nullptr}; + DoubleSlider::Control* m_slider {nullptr}; public: Preview(wxWindow* parent, Bed3D& bed, Camera& camera, GLToolbar& view_toolbar, Model* model, DynamicPrintConfig* config, diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 8baa0657e7..f5df8fc4fd 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -84,6 +84,7 @@ #include // Needs to be last because reasons :-/ #include "WipeTowerDialog.hpp" +#include "libslic3r/CustomGCode.hpp" using boost::optional; namespace fs = boost::filesystem; diff --git a/src/slic3r/GUI/wxExtensions.cpp b/src/slic3r/GUI/wxExtensions.cpp index 626d6f392c..356dd458fb 100644 --- a/src/slic3r/GUI/wxExtensions.cpp +++ b/src/slic3r/GUI/wxExtensions.cpp @@ -30,7 +30,6 @@ using Slic3r::GUI::from_u8; using Slic3r::GUI::into_u8; -wxDEFINE_EVENT(wxCUSTOMEVT_TICKSCHANGED, wxEvent); wxDEFINE_EVENT(wxCUSTOMEVT_LAST_VOLUME_IS_DELETED, wxCommandEvent); #ifndef __WXGTK__// msw_menuitem_bitmaps is used for MSW and OSX @@ -408,7 +407,7 @@ int em_unit(wxWindow* win) return Slic3r::GUI::wxGetApp().em_unit(); } -static float get_svg_scale_factor(wxWindow *win) +float get_svg_scale_factor(wxWindow *win) { #ifdef __APPLE__ // Note: win->GetContentScaleFactor() is not used anymore here because it tends to @@ -2276,1724 +2275,6 @@ bool BitmapChoiceRenderer::GetValueFromEditorCtrl(wxWindow* ctrl, wxVariant& val return true; } -// ---------------------------------------------------------------------------- -// DoubleSlider -// ---------------------------------------------------------------------------- -DoubleSlider::DoubleSlider( wxWindow *parent, - wxWindowID id, - int lowerValue, - int higherValue, - int minValue, - int maxValue, - const wxPoint& pos, - const wxSize& size, - long style, - const wxValidator& val, - const wxString& name) : - wxControl(parent, id, pos, size, wxWANTS_CHARS | wxBORDER_NONE), - m_lower_value(lowerValue), m_higher_value (higherValue), - m_min_value(minValue), m_max_value(maxValue), - m_style(style == wxSL_HORIZONTAL || style == wxSL_VERTICAL ? style: wxSL_HORIZONTAL) -{ -#ifdef __WXOSX__ - is_osx = true; -#endif //__WXOSX__ - if (!is_osx) - SetDoubleBuffered(true);// SetDoubleBuffered exists on Win and Linux/GTK, but is missing on OSX - - const float scale_factor = get_svg_scale_factor(this); - - m_bmp_thumb_higher = (style == wxSL_HORIZONTAL ? ScalableBitmap(this, "right_half_circle.png") : ScalableBitmap(this, "thumb_up")); - m_bmp_thumb_lower = (style == wxSL_HORIZONTAL ? ScalableBitmap(this, "left_half_circle.png" ) : ScalableBitmap(this, "thumb_down")); - m_thumb_size = m_bmp_thumb_lower.bmp().GetSize()*(1.0/scale_factor); - - m_bmp_add_tick_on = ScalableBitmap(this, "colorchange_add"); - m_bmp_add_tick_off = ScalableBitmap(this, "colorchange_add_f"); - m_bmp_del_tick_on = ScalableBitmap(this, "colorchange_del"); - m_bmp_del_tick_off = ScalableBitmap(this, "colorchange_del_f"); - m_tick_icon_dim = int((float)m_bmp_add_tick_on.bmp().GetSize().x / scale_factor); - - m_bmp_one_layer_lock_on = ScalableBitmap(this, "lock_closed"); - m_bmp_one_layer_lock_off = ScalableBitmap(this, "lock_closed_f"); - m_bmp_one_layer_unlock_on = ScalableBitmap(this, "lock_open"); - m_bmp_one_layer_unlock_off = ScalableBitmap(this, "lock_open_f"); - m_lock_icon_dim = int((float)m_bmp_one_layer_lock_on.bmp().GetSize().x / scale_factor); - - m_bmp_revert = ScalableBitmap(this, "undo"); - m_revert_icon_dim = int((float)m_bmp_revert.bmp().GetSize().x / scale_factor); - m_bmp_cog = ScalableBitmap(this, "cog"); - m_cog_icon_dim = int((float)m_bmp_cog.bmp().GetSize().x / scale_factor); - - m_selection = ssUndef; - m_ticks.set_pause_print_msg(_utf8(L("Place bearings in slots and resume"))); - - // slider events - Bind(wxEVT_PAINT, &DoubleSlider::OnPaint, this); - Bind(wxEVT_CHAR, &DoubleSlider::OnChar, this); - Bind(wxEVT_LEFT_DOWN, &DoubleSlider::OnLeftDown, this); - Bind(wxEVT_MOTION, &DoubleSlider::OnMotion, this); - Bind(wxEVT_LEFT_UP, &DoubleSlider::OnLeftUp, this); - Bind(wxEVT_MOUSEWHEEL, &DoubleSlider::OnWheel, this); - Bind(wxEVT_ENTER_WINDOW,&DoubleSlider::OnEnterWin, this); - Bind(wxEVT_LEAVE_WINDOW,&DoubleSlider::OnLeaveWin, this); - Bind(wxEVT_KEY_DOWN, &DoubleSlider::OnKeyDown, this); - Bind(wxEVT_KEY_UP, &DoubleSlider::OnKeyUp, this); - Bind(wxEVT_RIGHT_DOWN, &DoubleSlider::OnRightDown,this); - Bind(wxEVT_RIGHT_UP, &DoubleSlider::OnRightUp, this); - - // control's view variables - SLIDER_MARGIN = 4 + Slic3r::GUI::wxGetApp().em_unit(); - - DARK_ORANGE_PEN = wxPen(wxColour(237, 107, 33)); - ORANGE_PEN = wxPen(wxColour(253, 126, 66)); - LIGHT_ORANGE_PEN = wxPen(wxColour(254, 177, 139)); - - DARK_GREY_PEN = wxPen(wxColour(128, 128, 128)); - GREY_PEN = wxPen(wxColour(164, 164, 164)); - LIGHT_GREY_PEN = wxPen(wxColour(204, 204, 204)); - - m_line_pens = { &DARK_GREY_PEN, &GREY_PEN, &LIGHT_GREY_PEN }; - m_segm_pens = { &DARK_ORANGE_PEN, &ORANGE_PEN, &LIGHT_ORANGE_PEN }; - - const wxFont& font = GetFont(); - m_font = is_osx ? font.Smaller().Smaller() : font.Smaller(); -} - -void DoubleSlider::msw_rescale() -{ - const wxFont& font = Slic3r::GUI::wxGetApp().normal_font(); - m_font = is_osx ? font.Smaller().Smaller() : font.Smaller(); - - m_bmp_thumb_higher.msw_rescale(); - m_bmp_thumb_lower .msw_rescale(); - m_thumb_size = m_bmp_thumb_lower.bmp().GetSize(); - - m_bmp_add_tick_on .msw_rescale(); - m_bmp_add_tick_off.msw_rescale(); - m_bmp_del_tick_on .msw_rescale(); - m_bmp_del_tick_off.msw_rescale(); - m_tick_icon_dim = m_bmp_add_tick_on.bmp().GetSize().x; - - m_bmp_one_layer_lock_on .msw_rescale(); - m_bmp_one_layer_lock_off .msw_rescale(); - m_bmp_one_layer_unlock_on .msw_rescale(); - m_bmp_one_layer_unlock_off.msw_rescale(); - m_lock_icon_dim = m_bmp_one_layer_lock_on.bmp().GetSize().x; - - m_bmp_revert.msw_rescale(); - m_revert_icon_dim = m_bmp_revert.bmp().GetSize().x; - m_bmp_cog.msw_rescale(); - m_cog_icon_dim = m_bmp_cog.bmp().GetSize().x; - - SLIDER_MARGIN = 4 + Slic3r::GUI::wxGetApp().em_unit(); - - SetMinSize(get_min_size()); - GetParent()->Layout(); -} - -int DoubleSlider::GetActiveValue() const -{ - return m_selection == ssLower ? - m_lower_value : m_selection == ssHigher ? - m_higher_value : -1; -} - -wxSize DoubleSlider::get_min_size() const -{ - const int min_side = is_horizontal() ? - (is_osx ? 8 : 6) * Slic3r::GUI::wxGetApp().em_unit() : - /*(is_osx ? 10 : 8)*/10 * Slic3r::GUI::wxGetApp().em_unit(); - - return wxSize(min_side, min_side); -} - -wxSize DoubleSlider::DoGetBestSize() const -{ - const wxSize size = wxControl::DoGetBestSize(); - if (size.x > 1 && size.y > 1) - return size; - return get_min_size(); -} - -void DoubleSlider::SetLowerValue(const int lower_val) -{ - m_selection = ssLower; - m_lower_value = lower_val; - correct_lower_value(); - Refresh(); - Update(); - - wxCommandEvent e(wxEVT_SCROLL_CHANGED); - e.SetEventObject(this); - ProcessWindowEvent(e); -} - -void DoubleSlider::SetHigherValue(const int higher_val) -{ - m_selection = ssHigher; - m_higher_value = higher_val; - correct_higher_value(); - Refresh(); - Update(); - - wxCommandEvent e(wxEVT_SCROLL_CHANGED); - e.SetEventObject(this); - ProcessWindowEvent(e); -} - -void DoubleSlider::SetSelectionSpan(const int lower_val, const int higher_val) -{ - m_lower_value = std::max(lower_val, m_min_value); - m_higher_value = std::max(std::min(higher_val, m_max_value), m_lower_value); - if (m_lower_value < m_higher_value) - m_is_one_layer = false; - - Refresh(); - Update(); - - wxCommandEvent e(wxEVT_SCROLL_CHANGED); - e.SetEventObject(this); - ProcessWindowEvent(e); -} - -void DoubleSlider::SetMaxValue(const int max_value) -{ - m_max_value = max_value; - Refresh(); - Update(); -} - -void DoubleSlider::draw_scroll_line(wxDC& dc, const int lower_pos, const int higher_pos) -{ - int width; - int height; - get_size(&width, &height); - - wxCoord line_beg_x = is_horizontal() ? SLIDER_MARGIN : width*0.5 - 1; - wxCoord line_beg_y = is_horizontal() ? height*0.5 - 1 : SLIDER_MARGIN; - wxCoord line_end_x = is_horizontal() ? width - SLIDER_MARGIN + 1 : width*0.5 - 1; - wxCoord line_end_y = is_horizontal() ? height*0.5 - 1 : height - SLIDER_MARGIN + 1; - - wxCoord segm_beg_x = is_horizontal() ? lower_pos : width*0.5 - 1; - wxCoord segm_beg_y = is_horizontal() ? height*0.5 - 1 : lower_pos/*-1*/; - wxCoord segm_end_x = is_horizontal() ? higher_pos : width*0.5 - 1; - wxCoord segm_end_y = is_horizontal() ? height*0.5 - 1 : higher_pos-1; - - for (size_t id = 0; id < m_line_pens.size(); id++) - { - dc.SetPen(*m_line_pens[id]); - dc.DrawLine(line_beg_x, line_beg_y, line_end_x, line_end_y); - dc.SetPen(*m_segm_pens[id]); - dc.DrawLine(segm_beg_x, segm_beg_y, segm_end_x, segm_end_y); - if (is_horizontal()) - line_beg_y = line_end_y = segm_beg_y = segm_end_y += 1; - else - line_beg_x = line_end_x = segm_beg_x = segm_end_x += 1; - } -} - -double DoubleSlider::get_scroll_step() -{ - const wxSize sz = get_size(); - const int& slider_len = m_style == wxSL_HORIZONTAL ? sz.x : sz.y; - return double(slider_len - SLIDER_MARGIN * 2) / (m_max_value - m_min_value); -} - -// get position on the slider line from entered value -wxCoord DoubleSlider::get_position_from_value(const int value) -{ - const double step = get_scroll_step(); - const int val = is_horizontal() ? value : m_max_value - value; - return wxCoord(SLIDER_MARGIN + int(val*step + 0.5)); -} - -wxSize DoubleSlider::get_size() -{ - int w, h; - get_size(&w, &h); - return wxSize(w, h); -} - -void DoubleSlider::get_size(int *w, int *h) -{ - GetSize(w, h); - is_horizontal() ? *w -= m_lock_icon_dim : *h -= m_lock_icon_dim; -} - -double DoubleSlider::get_double_value(const SelectedSlider& selection) -{ - if (m_values.empty() || m_lower_value<0) - return 0.0; - if (m_values.size() <= m_higher_value) { - correct_higher_value(); - return m_values.back(); - } - return m_values[selection == ssLower ? m_lower_value : m_higher_value]; -} - -using t_custom_code = Slic3r::CustomGCode::Item; -Slic3r::CustomGCode::Info DoubleSlider::GetTicksValues() const -{ - Slic3r::CustomGCode::Info custom_gcode_per_print_z; - std::vector& values = custom_gcode_per_print_z.gcodes; - - const int val_size = m_values.size(); - if (!m_values.empty()) - for (const TICK_CODE& tick : m_ticks.ticks) { - if (tick.tick > val_size) - break; - values.emplace_back(t_custom_code{m_values[tick.tick], tick.gcode, tick.extruder, tick.color}); - } - - custom_gcode_per_print_z.mode = m_force_mode_apply ? m_mode : m_ticks.mode; - - return custom_gcode_per_print_z; -} - -void DoubleSlider::SetTicksValues(const Slic3r::CustomGCode::Info& custom_gcode_per_print_z) -{ - if (m_values.empty()) - { - m_ticks.mode = m_mode; - return; - } - - const bool was_empty = m_ticks.empty(); - - m_ticks.ticks.clear(); - const std::vector& heights = custom_gcode_per_print_z.gcodes; - for (auto h : heights) { - auto it = std::lower_bound(m_values.begin(), m_values.end(), h.print_z - epsilon()); - - if (it == m_values.end()) - continue; - - m_ticks.ticks.emplace(TICK_CODE{int(it-m_values.begin()), h.gcode, h.extruder, h.color}); - } - - if (!was_empty && m_ticks.empty()) - // Switch to the "Feature type"/"Tool" from the very beginning of a new object slicing after deleting of the old one - post_ticks_changed_event(); - - m_ticks.mode = custom_gcode_per_print_z.mode; - - Refresh(); - Update(); -} - -void DoubleSlider::get_lower_and_higher_position(int& lower_pos, int& higher_pos) -{ - const double step = get_scroll_step(); - if (is_horizontal()) { - lower_pos = SLIDER_MARGIN + int(m_lower_value*step + 0.5); - higher_pos = SLIDER_MARGIN + int(m_higher_value*step + 0.5); - } - else { - lower_pos = SLIDER_MARGIN + int((m_max_value - m_lower_value)*step + 0.5); - higher_pos = SLIDER_MARGIN + int((m_max_value - m_higher_value)*step + 0.5); - } -} - -void DoubleSlider::draw_focus_rect() -{ - if (!m_is_focused) - return; - const wxSize sz = GetSize(); - wxPaintDC dc(this); - const wxPen pen = wxPen(wxColour(128, 128, 10), 1, wxPENSTYLE_DOT); - dc.SetPen(pen); - dc.SetBrush(wxBrush(wxColour(0, 0, 0), wxBRUSHSTYLE_TRANSPARENT)); - dc.DrawRectangle(1, 1, sz.x - 2, sz.y - 2); -} - -void DoubleSlider::render() -{ - SetBackgroundColour(GetParent()->GetBackgroundColour()); - draw_focus_rect(); - - wxPaintDC dc(this); - dc.SetFont(m_font); - - const wxCoord lower_pos = get_position_from_value(m_lower_value); - const wxCoord higher_pos = get_position_from_value(m_higher_value); - - // draw colored band on the background of a scroll line - // and only in a case of no-empty m_values - draw_colored_band(dc); - - // draw line - draw_scroll_line(dc, lower_pos, higher_pos); - - //draw color print ticks - draw_ticks(dc); - - // draw both sliders - draw_thumbs(dc, lower_pos, higher_pos); - - //draw lock/unlock - draw_one_layer_icon(dc); - - //draw revert bitmap (if it's shown) - draw_revert_icon(dc); - - //draw cog bitmap (if it's shown) - draw_cog_icon(dc); -} - -void DoubleSlider::draw_action_icon(wxDC& dc, const wxPoint pt_beg, const wxPoint pt_end) -{ - const int tick = m_selection == ssLower ? m_lower_value : m_higher_value; - - // suppress add tick on first layer - if (tick == 0) - return; - - wxBitmap* icon = m_is_action_icon_focesed ? &m_bmp_add_tick_off.bmp() : &m_bmp_add_tick_on.bmp(); - if (m_ticks.ticks.find(TICK_CODE{tick}) != m_ticks.ticks.end()) - icon = m_is_action_icon_focesed ? &m_bmp_del_tick_off.bmp() : &m_bmp_del_tick_on.bmp(); - - wxCoord x_draw, y_draw; - is_horizontal() ? x_draw = pt_beg.x - 0.5*m_tick_icon_dim : y_draw = pt_beg.y - 0.5*m_tick_icon_dim; - if (m_selection == ssLower) - is_horizontal() ? y_draw = pt_end.y + 3 : x_draw = pt_beg.x - m_tick_icon_dim-2; - else - is_horizontal() ? y_draw = pt_beg.y - m_tick_icon_dim-2 : x_draw = pt_end.x + 3; - - dc.DrawBitmap(*icon, x_draw, y_draw); - - //update rect of the tick action icon - m_rect_tick_action = wxRect(x_draw, y_draw, m_tick_icon_dim, m_tick_icon_dim); -} - -void DoubleSlider::draw_info_line_with_icon(wxDC& dc, const wxPoint& pos, const SelectedSlider selection) -{ - if (m_selection == selection) { - //draw info line - dc.SetPen(DARK_ORANGE_PEN); - const wxPoint pt_beg = is_horizontal() ? wxPoint(pos.x, pos.y - m_thumb_size.y) : wxPoint(pos.x - m_thumb_size.x, pos.y/* - 1*/); - const wxPoint pt_end = is_horizontal() ? wxPoint(pos.x, pos.y + m_thumb_size.y) : wxPoint(pos.x + m_thumb_size.x, pos.y/* - 1*/); - dc.DrawLine(pt_beg, pt_end); - - //draw action icon - if (m_is_enabled_tick_manipulation) - draw_action_icon(dc, pt_beg, pt_end); - } -} - -wxString DoubleSlider::get_label(const SelectedSlider& selection) const -{ - const int value = selection == ssLower ? m_lower_value : m_higher_value; - - if (m_label_koef == 1.0 && m_values.empty()) - return wxString::Format("%d", value); - if (value >= m_values.size()) - return "ErrVal"; - - const wxString str = m_values.empty() ? - wxNumberFormatter::ToString(m_label_koef*value, 2, wxNumberFormatter::Style_None) : - wxNumberFormatter::ToString(m_values[value], 2, wxNumberFormatter::Style_None); - return wxString::Format("%s\n(%d)", str, m_values.empty() ? value : value+1); -} - -void DoubleSlider::draw_thumb_text(wxDC& dc, const wxPoint& pos, const SelectedSlider& selection) const -{ - if ( selection == ssUndef || - ((m_is_one_layer || m_higher_value==m_lower_value) && selection != m_selection) ) - return; - wxCoord text_width, text_height; - const wxString label = get_label(selection); - dc.GetMultiLineTextExtent(label, &text_width, &text_height); - wxPoint text_pos; - if (selection ==ssLower) - text_pos = is_horizontal() ? wxPoint(pos.x + 1, pos.y + m_thumb_size.x) : - wxPoint(pos.x + m_thumb_size.x+1, pos.y - 0.5*text_height - 1); - else - text_pos = is_horizontal() ? wxPoint(pos.x - text_width - 1, pos.y - m_thumb_size.x - text_height) : - wxPoint(pos.x - text_width - 1 - m_thumb_size.x, pos.y - 0.5*text_height + 1); - dc.DrawText(label, text_pos); -} - -void DoubleSlider::draw_thumb_item(wxDC& dc, const wxPoint& pos, const SelectedSlider& selection) -{ - wxCoord x_draw, y_draw; - if (selection == ssLower) { - if (is_horizontal()) { - x_draw = pos.x - m_thumb_size.x; - y_draw = pos.y - int(0.5*m_thumb_size.y); - } - else { - x_draw = pos.x - int(0.5*m_thumb_size.x); - y_draw = pos.y - int(0.5*m_thumb_size.y); - } - } - else{ - if (is_horizontal()) { - x_draw = pos.x; - y_draw = pos.y - int(0.5*m_thumb_size.y); - } - else { - x_draw = pos.x - int(0.5*m_thumb_size.x); - y_draw = pos.y - int(0.5*m_thumb_size.y); - } - } - dc.DrawBitmap(selection == ssLower ? m_bmp_thumb_lower.bmp() : m_bmp_thumb_higher.bmp(), x_draw, y_draw); - - // Update thumb rect - update_thumb_rect(x_draw, y_draw, selection); -} - -void DoubleSlider::draw_thumb(wxDC& dc, const wxCoord& pos_coord, const SelectedSlider& selection) -{ - //calculate thumb position on slider line - int width, height; - get_size(&width, &height); - const wxPoint pos = is_horizontal() ? wxPoint(pos_coord, height*0.5) : wxPoint(0.5*width, pos_coord); - - // Draw thumb - draw_thumb_item(dc, pos, selection); - - // Draw info_line - draw_info_line_with_icon(dc, pos, selection); - - // Draw thumb text - draw_thumb_text(dc, pos, selection); -} - -void DoubleSlider::draw_thumbs(wxDC& dc, const wxCoord& lower_pos, const wxCoord& higher_pos) -{ - //calculate thumb position on slider line - int width, height; - get_size(&width, &height); - const wxPoint pos_l = is_horizontal() ? wxPoint(lower_pos, height*0.5) : wxPoint(0.5*width, lower_pos); - const wxPoint pos_h = is_horizontal() ? wxPoint(higher_pos, height*0.5) : wxPoint(0.5*width, higher_pos); - - // Draw lower thumb - draw_thumb_item(dc, pos_l, ssLower); - // Draw lower info_line - draw_info_line_with_icon(dc, pos_l, ssLower); - - // Draw higher thumb - draw_thumb_item(dc, pos_h, ssHigher); - // Draw higher info_line - draw_info_line_with_icon(dc, pos_h, ssHigher); - // Draw higher thumb text - draw_thumb_text(dc, pos_h, ssHigher); - - // Draw lower thumb text - draw_thumb_text(dc, pos_l, ssLower); -} - -void DoubleSlider::draw_ticks(wxDC& dc) -{ - if (!m_is_enabled_tick_manipulation) - return; - - dc.SetPen(m_is_enabled_tick_manipulation ? DARK_GREY_PEN : LIGHT_GREY_PEN ); - int height, width; - get_size(&width, &height); - const wxCoord mid = is_horizontal() ? 0.5*height : 0.5*width; - for (auto tick : m_ticks.ticks) - { - const wxCoord pos = get_position_from_value(tick.tick); - - is_horizontal() ? dc.DrawLine(pos, mid-14, pos, mid-9) : - dc.DrawLine(mid - 14, pos/* - 1*/, mid - 9, pos/* - 1*/); - is_horizontal() ? dc.DrawLine(pos, mid+14, pos, mid+9) : - dc.DrawLine(mid + 14, pos/* - 1*/, mid + 9, pos/* - 1*/); - - wxBitmap icon = wxNullBitmap; - - // Draw icon for "Pause print" or "Custom Gcode" - if (tick.gcode != Slic3r::ColorChangeCode && tick.gcode != Slic3r::ToolChangeCode) - icon = create_scaled_bitmap(this, tick.gcode == Slic3r::PausePrintCode ? "pause_print" : "edit_gcode"); - else - { - if ((tick.gcode == Slic3r::ColorChangeCode && ( - (m_ticks.mode == t_mode::SingleExtruder && m_mode == t_mode::MultiExtruder ) || - (m_ticks.mode == t_mode::MultiExtruder && m_mode == t_mode::SingleExtruder) )) || - (tick.gcode == Slic3r::ToolChangeCode && - (m_ticks.mode == t_mode::MultiAsSingle && m_mode != t_mode::MultiAsSingle ) )) - icon = create_scaled_bitmap(this, "error_tick"); - } - - if (!icon.IsNull()) - { - wxCoord x_draw, y_draw; - is_horizontal() ? x_draw = pos - 0.5 * m_tick_icon_dim : y_draw = pos - 0.5 * m_tick_icon_dim; - is_horizontal() ? y_draw = mid + 22 : x_draw = mid + m_thumb_size.x + 3; - - dc.DrawBitmap(icon, x_draw, y_draw); - } - } -} - -std::string DoubleSlider::get_color_for_tool_change_tick(std::set::const_iterator it) const -{ - const int current_extruder = it->extruder == 0 ? std::max(m_only_extruder, 1) : it->extruder; - - auto it_n = it; - while (it_n != m_ticks.ticks.begin()) { - --it_n; - if (it_n->gcode == Slic3r::ColorChangeCode && it_n->extruder == current_extruder) - return it_n->color; - } - - return it->color; -} - -std::string DoubleSlider::get_color_for_color_change_tick(std::set::const_iterator it) const -{ - const int def_extruder = std::max(1, m_only_extruder); - auto it_n = it; - bool is_tool_change = false; - while (it_n != m_ticks.ticks.begin()) { - --it_n; - if (it_n->gcode == Slic3r::ToolChangeCode) { - is_tool_change = true; - if (it_n->extruder == it->extruder) - return it->color; - break; - } - } - if (!is_tool_change && it->extruder == def_extruder) - return it->color; - - return ""; -} - -void DoubleSlider::draw_colored_band(wxDC& dc) -{ - if (!m_is_enabled_tick_manipulation) - return; - - int height, width; - get_size(&width, &height); - - const wxCoord mid = is_horizontal() ? 0.5 * height : 0.5 * width; - - wxRect main_band = is_horizontal() ? - wxRect(SLIDER_MARGIN, lround(mid - 0.375 * m_thumb_size.y), - width - 2 * SLIDER_MARGIN + 1, lround(0.75 * m_thumb_size.y)) : - wxRect(lround(mid - 0.375 * m_thumb_size.x), SLIDER_MARGIN, - lround(0.75 * m_thumb_size.x), height - 2 * SLIDER_MARGIN + 1); - - auto draw_band = [](wxDC& dc, const wxColour& clr, const wxRect& band_rc) { - dc.SetPen(clr); - dc.SetBrush(clr); - dc.DrawRectangle(band_rc); - }; - - // don't color a band for MultiExtruder mode - if (m_ticks.empty() || m_mode == t_mode::MultiExtruder) - { - draw_band(dc, GetParent()->GetBackgroundColour(), main_band); - return; - } - - const int default_color_idx = m_mode==t_mode::MultiAsSingle ? std::max(m_only_extruder - 1, 0) : 0; - draw_band(dc, wxColour(Slic3r::GUI::wxGetApp().plater()->get_extruder_colors_from_plater_config()[default_color_idx]), main_band); - - std::set::const_iterator tick_it = m_ticks.ticks.begin(); - - while (tick_it != m_ticks.ticks.end()) - { - if ( (m_mode == t_mode::SingleExtruder && tick_it->gcode == Slic3r::ColorChangeCode ) || - (m_mode == t_mode::MultiAsSingle && (tick_it->gcode == Slic3r::ToolChangeCode || tick_it->gcode == Slic3r::ColorChangeCode)) ) - { - const wxCoord pos = get_position_from_value(tick_it->tick); - is_horizontal() ? main_band.SetLeft(SLIDER_MARGIN + pos) : - main_band.SetBottom(pos - 1); - - const std::string clr_str = m_mode == t_mode::SingleExtruder ? tick_it->color : - tick_it->gcode == Slic3r::ToolChangeCode ? - get_color_for_tool_change_tick(tick_it) : - get_color_for_color_change_tick(tick_it); - - if (!clr_str.empty()) - draw_band(dc, wxColour(clr_str), main_band); - } - ++tick_it; - } -} - -void DoubleSlider::draw_one_layer_icon(wxDC& dc) -{ - const wxBitmap& icon = m_is_one_layer ? - m_is_one_layer_icon_focesed ? m_bmp_one_layer_lock_off.bmp() : m_bmp_one_layer_lock_on.bmp() : - m_is_one_layer_icon_focesed ? m_bmp_one_layer_unlock_off.bmp() : m_bmp_one_layer_unlock_on.bmp(); - - int width, height; - get_size(&width, &height); - - wxCoord x_draw, y_draw; - is_horizontal() ? x_draw = width-2 : x_draw = 0.5*width - 0.5*m_lock_icon_dim; - is_horizontal() ? y_draw = 0.5*height - 0.5*m_lock_icon_dim : y_draw = height-2; - - dc.DrawBitmap(icon, x_draw, y_draw); - - //update rect of the lock/unlock icon - m_rect_one_layer_icon = wxRect(x_draw, y_draw, m_lock_icon_dim, m_lock_icon_dim); -} - -void DoubleSlider::draw_revert_icon(wxDC& dc) -{ - if (m_ticks.empty() || !m_is_enabled_tick_manipulation) - return; - - int width, height; - get_size(&width, &height); - - wxCoord x_draw, y_draw; - is_horizontal() ? x_draw = width-2 : x_draw = 0.25*SLIDER_MARGIN; - is_horizontal() ? y_draw = 0.25*SLIDER_MARGIN: y_draw = height-2; - - dc.DrawBitmap(m_bmp_revert.bmp(), x_draw, y_draw); - - //update rect of the lock/unlock icon - m_rect_revert_icon = wxRect(x_draw, y_draw, m_revert_icon_dim, m_revert_icon_dim); -} - -void DoubleSlider::draw_cog_icon(wxDC& dc) -{ - if (m_mode != t_mode::MultiExtruder) - return; - - int width, height; - get_size(&width, &height); - - wxCoord x_draw, y_draw; - is_horizontal() ? x_draw = width-2 : x_draw = width - m_cog_icon_dim - 2; - is_horizontal() ? y_draw = height - m_cog_icon_dim - 2 : y_draw = height-2; - - dc.DrawBitmap(m_bmp_cog.bmp(), x_draw, y_draw); - - //update rect of the lock/unlock icon - m_rect_cog_icon = wxRect(x_draw, y_draw, m_cog_icon_dim, m_cog_icon_dim); -} - -void DoubleSlider::update_thumb_rect(const wxCoord& begin_x, const wxCoord& begin_y, const SelectedSlider& selection) -{ - const wxRect& rect = wxRect(begin_x, begin_y, m_thumb_size.x, int(m_thumb_size.y*0.5)); - if (selection == ssLower) - m_rect_lower_thumb = rect; - else - m_rect_higher_thumb = rect; -} - -int DoubleSlider::get_value_from_position(const wxCoord x, const wxCoord y) -{ - const int height = get_size().y; - const double step = get_scroll_step(); - - if (is_horizontal()) - return int(double(x - SLIDER_MARGIN) / step + 0.5); - - return int(m_min_value + double(height - SLIDER_MARGIN - y) / step + 0.5); -} - -void DoubleSlider::detect_selected_slider(const wxPoint& pt) -{ - m_selection = is_point_in_rect(pt, m_rect_lower_thumb) ? ssLower : - is_point_in_rect(pt, m_rect_higher_thumb) ? ssHigher : ssUndef; -} - -bool DoubleSlider::is_point_in_rect(const wxPoint& pt, const wxRect& rect) -{ - return rect.GetLeft() <= pt.x && pt.x <= rect.GetRight() && - rect.GetTop() <= pt.y && pt.y <= rect.GetBottom(); -} - -int DoubleSlider::is_point_near_tick(const wxPoint& pt) -{ - for (auto tick : m_ticks.ticks) { - const wxCoord pos = get_position_from_value(tick.tick); - - if (is_horizontal()) { - if (pos - 4 <= pt.x && pt.x <= pos + 4) - return tick.tick; - } - else { - if (pos - 4 <= pt.y && pt.y <= pos + 4) - return tick.tick; - } - } - return -1; -} - -void DoubleSlider::ChangeOneLayerLock() -{ - m_is_one_layer = !m_is_one_layer; - m_selection == ssLower ? correct_lower_value() : correct_higher_value(); - if (!m_selection) m_selection = ssHigher; - - Refresh(); - Update(); - - wxCommandEvent e(wxEVT_SCROLL_CHANGED); - e.SetEventObject(this); - ProcessWindowEvent(e); -} - -void DoubleSlider::OnLeftDown(wxMouseEvent& event) -{ - if (HasCapture()) - return; - this->CaptureMouse(); - - wxClientDC dc(this); - wxPoint pos = event.GetLogicalPosition(dc); - if (is_point_in_rect(pos, m_rect_tick_action) && m_is_enabled_tick_manipulation) - { - const auto it = m_ticks.ticks.find(TICK_CODE{ m_selection == ssLower ? m_lower_value : m_higher_value }); - if (it == m_ticks.ticks.end()) - m_force_add_tick = true; - else - m_force_delete_tick = true; - return; - } - - m_is_left_down = true; - if (is_point_in_rect(pos, m_rect_one_layer_icon)) { - // switch on/off one layer mode - m_is_one_layer = !m_is_one_layer; - if (!m_is_one_layer) { - SetLowerValue(m_min_value); - SetHigherValue(m_max_value); - } - m_selection == ssLower ? correct_lower_value() : correct_higher_value(); - if (!m_selection) m_selection = ssHigher; - } - else if (is_point_in_rect(pos, m_rect_revert_icon) && m_is_enabled_tick_manipulation) { - // discard all color changes - SetLowerValue(m_min_value); - SetHigherValue(m_max_value); - - m_selection == ssLower ? correct_lower_value() : correct_higher_value(); - if (!m_selection) m_selection = ssHigher; - - m_ticks.ticks.clear(); - post_ticks_changed_event(); - } - else if (is_point_in_rect(pos, m_rect_cog_icon) && m_mode == t_mode::MultiExtruder) { - // show dialog for set extruder sequence - m_force_edit_extruder_sequence = true; - return; - } - else - detect_selected_slider(pos); - - if (!m_selection) { - const int tick_val = is_point_near_tick(pos); - /* Set current thumb position to the nearest tick (if it is) - * OR to a value corresponding to the mouse click - * */ - const int mouse_val = tick_val >= 0 && m_is_enabled_tick_manipulation ? tick_val : - get_value_from_position(pos.x, pos.y); - if (mouse_val >= 0) - { - // if (abs(mouse_val - m_lower_value) < abs(mouse_val - m_higher_value)) { - if ( mouse_val <= m_lower_value ) { - SetLowerValue(mouse_val); - correct_lower_value(); - m_selection = ssLower; - } - else { - SetHigherValue(mouse_val); - correct_higher_value(); - m_selection = ssHigher; - } - } - } - - Refresh(); - Update(); - event.Skip(); -} - -void DoubleSlider::correct_lower_value() -{ - if (m_lower_value < m_min_value) - m_lower_value = m_min_value; - else if (m_lower_value > m_max_value) - m_lower_value = m_max_value; - - if ((m_lower_value >= m_higher_value && m_lower_value <= m_max_value) || m_is_one_layer) - m_higher_value = m_lower_value; -} - -void DoubleSlider::correct_higher_value() -{ - if (m_higher_value > m_max_value) - m_higher_value = m_max_value; - else if (m_higher_value < m_min_value) - m_higher_value = m_min_value; - - if ((m_higher_value <= m_lower_value && m_higher_value >= m_min_value) || m_is_one_layer) - m_lower_value = m_higher_value; -} - -wxString DoubleSlider::get_tooltip(IconFocus icon_focus) -{ - wxString tooltip(wxEmptyString); - if (m_is_one_layer_icon_focesed) - tooltip = _(L("One layer mode")); - - if (icon_focus == ifRevert) - tooltip = _(L("Discard all custom changes")); - if (icon_focus == ifCog) - tooltip = _(L("Set extruder sequence for whole print")); - else if (m_is_action_icon_focesed) - { - const int tick = m_selection == ssLower ? m_lower_value : m_higher_value; - const auto tick_code_it = m_ticks.ticks.find(TICK_CODE{tick}); - tooltip = tick_code_it == m_ticks.ticks.end() ? (m_mode == t_mode::MultiAsSingle ? - _(L("For add change extruder use left mouse button click")) : - _(L("For add color change use left mouse button click")) ) + "\n" + - _(L("For add another code use right mouse button click")) : - tick_code_it->gcode == Slic3r::ColorChangeCode ? ( m_mode == t_mode::SingleExtruder ? - _(L("For Delete color change use left mouse button click\n" - "For Edit color use right mouse button click")) : - from_u8((boost::format(_utf8(L("Delete color change for Extruder %1%"))) % tick_code_it->extruder).str()) ): - tick_code_it->gcode == Slic3r::PausePrintCode ? - _(L("Delete pause")) : - tick_code_it->gcode == Slic3r::ToolChangeCode ? - from_u8((boost::format(_utf8(L("Delete extruder change to \"%1%\""))) % tick_code_it->extruder).str()) : - from_u8((boost::format(_utf8(L("For Delete \"%1%\" code use left mouse button click\n" - "For Edit \"%1%\" code use right mouse button click"))) % tick_code_it->gcode ).str()); - } - - return tooltip; -} - -void DoubleSlider::OnMotion(wxMouseEvent& event) -{ - bool action = false; - - const wxClientDC dc(this); - const wxPoint pos = event.GetLogicalPosition(dc); - - m_is_one_layer_icon_focesed = is_point_in_rect(pos, m_rect_one_layer_icon); - IconFocus icon_focus = ifNone; - - if (!m_is_left_down && !m_is_one_layer) { - m_is_action_icon_focesed = is_point_in_rect(pos, m_rect_tick_action); - if (!m_ticks.empty() && is_point_in_rect(pos, m_rect_revert_icon)) - icon_focus = ifRevert; - else if (is_point_in_rect(pos, m_rect_cog_icon)) - icon_focus = ifCog; - } - else if (m_is_left_down || m_is_right_down) { - if (m_selection == ssLower) { - int current_value = m_lower_value; - m_lower_value = get_value_from_position(pos.x, pos.y); - correct_lower_value(); - action = (current_value != m_lower_value); - } - else if (m_selection == ssHigher) { - int current_value = m_higher_value; - m_higher_value = get_value_from_position(pos.x, pos.y); - correct_higher_value(); - action = (current_value != m_higher_value); - } - } - Refresh(); - Update(); - event.Skip(); - - // Set tooltips with information for each icon - this->SetToolTip(get_tooltip(icon_focus)); - - if (action) - { - wxCommandEvent e(wxEVT_SCROLL_CHANGED); - e.SetEventObject(this); - e.SetString("moving"); - ProcessWindowEvent(e); - } -} - -void DoubleSlider::append_change_extruder_menu_item(wxMenu* menu, bool switch_current_code/* = false*/) -{ - const int extruders_cnt = Slic3r::GUI::wxGetApp().extruders_edited_cnt(); - if (extruders_cnt > 1) - { - const int initial_extruder = std::max(1 , get_extruder_for_tick(m_selection == ssLower ? m_lower_value : m_higher_value)); - - wxMenu* change_extruder_menu = new wxMenu(); - - for (int i = 1; i <= extruders_cnt; i++) - { - const bool is_active_extruder = i == initial_extruder; - const wxString item_name = wxString::Format(_(L("Extruder %d")), i) + - (is_active_extruder ? " (" + _(L("active")) + ")" : ""); - - if (m_mode == t_mode::MultiAsSingle) - append_menu_item(change_extruder_menu, wxID_ANY, item_name, "", - [this, i](wxCommandEvent&) { add_code_as_tick(Slic3r::ToolChangeCode, i); }, "", menu, - [is_active_extruder]() { return !is_active_extruder; }, Slic3r::GUI::wxGetApp().plater()); - } - - const wxString change_extruder_menu_name = m_mode == t_mode::MultiAsSingle ? - (switch_current_code ? _(L("Switch code to Change extruder")) : _(L("Change extruder")) ) : - _(L("Change extruder (N/A)")); - - wxMenuItem* change_extruder_menu_item = menu->AppendSubMenu(change_extruder_menu, change_extruder_menu_name, _(L("Use another extruder"))); - change_extruder_menu_item->SetBitmap(create_scaled_bitmap(this, "change_extruder")); - - Slic3r::GUI::wxGetApp().plater()->Bind(wxEVT_UPDATE_UI, [this, change_extruder_menu_item](wxUpdateUIEvent& evt) { - enable_menu_item(evt, [this]() {return m_mode == t_mode::MultiAsSingle; }, change_extruder_menu_item, this); }, - change_extruder_menu_item->GetId()); - } -} - -void DoubleSlider::append_add_color_change_menu_item(wxMenu* menu, bool switch_current_code/* = false*/) -{ - const int extruders_cnt = Slic3r::GUI::wxGetApp().extruders_edited_cnt(); - if (extruders_cnt > 1) - { - std::set used_extruders_for_tick = get_used_extruders_for_tick(m_selection == ssLower ? m_lower_value : m_higher_value); - - wxMenu* add_color_change_menu = new wxMenu(); - - for (int i = 1; i <= extruders_cnt; i++) - { - const bool is_used_extruder = used_extruders_for_tick.empty() ? true : // #ys_FIXME till used_extruders_for_tick doesn't filled correct for mmMultiExtruder - used_extruders_for_tick.find(i) != used_extruders_for_tick.end(); - const wxString item_name = wxString::Format(_(L("Extruder %d")), i) + - (is_used_extruder ? " (" + _(L("used")) + ")" : ""); - - append_menu_item(add_color_change_menu, wxID_ANY, item_name, "", - [this, i](wxCommandEvent&) { add_code_as_tick(Slic3r::ColorChangeCode, i); }, "", menu, - [is_used_extruder]() { return is_used_extruder; }, Slic3r::GUI::wxGetApp().plater()); - } - - const wxString menu_name = switch_current_code ? - from_u8((boost::format(_utf8(L("Switch code to Color change (%1%) for:"))) % Slic3r::ColorChangeCode).str()) : - from_u8((boost::format(_utf8(L("Add color change (%1%) for:"))) % Slic3r::ColorChangeCode).str()); - wxMenuItem* add_color_change_menu_item = menu->AppendSubMenu(add_color_change_menu, menu_name, ""); - add_color_change_menu_item->SetBitmap(create_scaled_bitmap(this, "colorchange_add_m")); - } -} - -void DoubleSlider::OnLeftUp(wxMouseEvent& event) -{ - if (!HasCapture()) - return; - this->ReleaseMouse(); - m_is_left_down = false; - - if (m_force_delete_tick) - { - delete_current_tick(); - m_force_delete_tick = false; - } - else - if (m_force_add_tick) - { - add_current_tick(); - m_force_add_tick = false; - } - else - if (m_force_edit_extruder_sequence) { - edit_extruder_sequence(); - m_force_edit_extruder_sequence = false; - } - - Refresh(); - Update(); - event.Skip(); - - wxCommandEvent e(wxEVT_SCROLL_CHANGED); - e.SetEventObject(this); - ProcessWindowEvent(e); -} - -void DoubleSlider::enter_window(wxMouseEvent& event, const bool enter) -{ - m_is_focused = enter; - Refresh(); - Update(); - event.Skip(); -} - -// "condition" have to be true for: -// - value increase (if wxSL_VERTICAL) -// - value decrease (if wxSL_HORIZONTAL) -void DoubleSlider::move_current_thumb(const bool condition) -{ -// m_is_one_layer = wxGetKeyState(WXK_CONTROL); - int delta = condition ? -1 : 1; - if (is_horizontal()) - delta *= -1; - - if (m_selection == ssLower) { - m_lower_value -= delta; - correct_lower_value(); - } - else if (m_selection == ssHigher) { - m_higher_value -= delta; - correct_higher_value(); - } - Refresh(); - Update(); - - wxCommandEvent e(wxEVT_SCROLL_CHANGED); - e.SetEventObject(this); - ProcessWindowEvent(e); -} - -void DoubleSlider::OnWheel(wxMouseEvent& event) -{ - // Set nearest to the mouse thumb as a selected, if there is not selected thumb - if (m_selection == ssUndef) - { - const wxPoint& pt = event.GetLogicalPosition(wxClientDC(this)); - - if (is_horizontal()) - m_selection = abs(pt.x - m_rect_lower_thumb.GetRight()) <= - abs(pt.x - m_rect_higher_thumb.GetLeft()) ? - ssLower : ssHigher; - else - m_selection = abs(pt.y - m_rect_lower_thumb.GetTop()) <= - abs(pt.y - m_rect_higher_thumb.GetBottom()) ? - ssLower : ssHigher; - } - - move_current_thumb(event.GetWheelRotation() > 0); -} - -void DoubleSlider::OnKeyDown(wxKeyEvent &event) -{ - const int key = event.GetKeyCode(); - if (key == WXK_NUMPAD_ADD) { - // OnChar() is called immediately after OnKeyDown(), which can cause call of add_tick() twice. - // To avoid this case we should suppress second add_tick() call. - m_ticks.suppress_plus(true); - add_current_tick(true); - } - else if (key == 390 || key == WXK_DELETE || key == WXK_BACK) { - // OnChar() is called immediately after OnKeyDown(), which can cause call of delete_tick() twice. - // To avoid this case we should suppress second delete_tick() call. - m_ticks.suppress_minus(true); - delete_current_tick(); - } - else if (is_horizontal()) - { - if (key == WXK_LEFT || key == WXK_RIGHT) - move_current_thumb(key == WXK_LEFT); - else if (key == WXK_UP || key == WXK_DOWN) { - m_selection = key == WXK_UP ? ssHigher : ssLower; - Refresh(); - } - } - else { - if (key == WXK_LEFT || key == WXK_RIGHT) { - m_selection = key == WXK_LEFT ? ssHigher : ssLower; - Refresh(); - } - else if (key == WXK_UP || key == WXK_DOWN) - move_current_thumb(key == WXK_UP); - } - - event.Skip(); // !Needed to have EVT_CHAR generated as well -} - -void DoubleSlider::OnKeyUp(wxKeyEvent &event) -{ - if (event.GetKeyCode() == WXK_CONTROL) - m_is_one_layer = false; - Refresh(); - Update(); - event.Skip(); -} - -void DoubleSlider::OnChar(wxKeyEvent& event) -{ - const int key = event.GetKeyCode(); - if (key == '+' && !m_ticks.suppressed_plus()) { - add_current_tick(true); - m_ticks.suppress_plus(false); - } - else if (key == '-' && !m_ticks.suppressed_minus()) { - delete_current_tick(); - m_ticks.suppress_minus(false); - } -} - -void DoubleSlider::OnRightDown(wxMouseEvent& event) -{ - if (HasCapture()) return; - this->CaptureMouse(); - - const wxClientDC dc(this); - - wxPoint pos = event.GetLogicalPosition(dc); - if (is_point_in_rect(pos, m_rect_tick_action) && m_is_enabled_tick_manipulation) - { - const int tick = m_selection == ssLower ? m_lower_value : m_higher_value; - if (m_ticks.ticks.find(TICK_CODE{ tick }) == m_ticks.ticks.end()) // if on this Z doesn't exist tick - // show context menu on OnRightUp() - m_show_context_menu = true; - else - // show "Edit" and "Delete" menu on OnRightUp() - m_show_edit_menu = true; - return; - } - - detect_selected_slider(event.GetLogicalPosition(dc)); - if (!m_selection) - return; - - if (m_selection == ssLower) - m_higher_value = m_lower_value; - else - m_lower_value = m_higher_value; - - // set slider to "one layer" mode - m_is_right_down = m_is_one_layer = true; - - Refresh(); - Update(); - event.Skip(); -} - -int DoubleSlider::get_extruder_for_tick(int tick) -{ - int default_initial_extruder = m_mode == t_mode::MultiAsSingle ? m_only_extruder : 0; - if (m_ticks.empty()) - return default_initial_extruder; - - auto it = m_ticks.ticks.lower_bound(TICK_CODE{tick}); - while (it != m_ticks.ticks.begin()) { - --it; - if(it->gcode == Slic3r::ToolChangeCode) - return it->extruder; - } - - return default_initial_extruder; -} - -std::set DoubleSlider::get_used_extruders_for_tick(int tick) -{ - if (m_mode == t_mode::MultiExtruder) - { - // #ys_FIXME: get tool ordering from _correct_ place - const Slic3r::ToolOrdering& tool_ordering = Slic3r::GUI::wxGetApp().plater()->fff_print().get_tool_ordering(); - - if (tool_ordering.empty()) - return {}; - - std::set used_extruders; - - auto it_layer_tools = std::lower_bound(tool_ordering.begin(), tool_ordering.end(), Slic3r::LayerTools(m_values[tick])); - for (; it_layer_tools != tool_ordering.end(); ++it_layer_tools) - { - const std::vector& extruders = it_layer_tools->extruders; - for (const auto& extruder : extruders) - used_extruders.emplace(extruder+1); - } - - return used_extruders; - } - - const int default_initial_extruder = m_mode == t_mode::MultiAsSingle ? std::max(m_only_extruder, 1) : 1; - if (m_ticks.empty()) - return {default_initial_extruder}; - - std::set used_extruders; - const std::set& ticks = m_ticks.ticks; - - auto it_start = ticks.lower_bound(TICK_CODE{tick}); - auto it = it_start; - if (it == ticks.begin() && it->gcode == Slic3r::ToolChangeCode && - tick != it->tick ) // In case of switch of ToolChange to ColorChange, when tick exists, - // we shouldn't change color for extruder, which will be deleted - { - used_extruders.emplace(it->extruder); - if (tick < it->tick) - used_extruders.emplace(default_initial_extruder); - } - - while (it != ticks.begin()) { - --it; - if (it->gcode == Slic3r::ToolChangeCode && tick != it->tick) { - used_extruders.emplace(it->extruder); - break; - } - } - - if (it == ticks.begin() && used_extruders.empty()) - used_extruders.emplace(default_initial_extruder); - - for (it = it_start; it != ticks.end(); ++it) - if (it->gcode == Slic3r::ToolChangeCode && tick != it->tick) - used_extruders.emplace(it->extruder); - - return used_extruders; -} - -void DoubleSlider::OnRightUp(wxMouseEvent& event) -{ - if (!HasCapture()) - return; - this->ReleaseMouse(); - m_is_right_down = m_is_one_layer = false; - - if (m_show_context_menu) { - wxMenu menu; - - if (m_mode == t_mode::SingleExtruder) - append_menu_item(&menu, wxID_ANY, _(L("Add color change")) + " (M600)", "", - [this](wxCommandEvent&) { add_code_as_tick(Slic3r::ColorChangeCode); }, "colorchange_add_m", &menu, - [](){return true;}, this); - else - { - append_change_extruder_menu_item(&menu); - append_add_color_change_menu_item(&menu); - } - - append_menu_item(&menu, wxID_ANY, _(L("Add pause print")) + " (M601)", "", - [this](wxCommandEvent&) { add_code_as_tick(Slic3r::PausePrintCode); }, "pause_print", &menu, - []() {return true; }, this); - - append_menu_item(&menu, wxID_ANY, _(L("Add custom G-code")), "", - [this](wxCommandEvent&) { add_code_as_tick(""); }, "edit_gcode", &menu, - []() {return true; }, this); - - Slic3r::GUI::wxGetApp().plater()->PopupMenu(&menu); - - m_show_context_menu = false; - } - else if (m_show_edit_menu) { - wxMenu menu; - - std::set::iterator it = m_ticks.ticks.find(TICK_CODE{ m_selection == ssLower ? m_lower_value : m_higher_value }); - const bool is_color_change = it->gcode == Slic3r::ColorChangeCode; - - if (it->gcode == Slic3r::ToolChangeCode) - append_add_color_change_menu_item(&menu, true); - else - append_menu_item(&menu, wxID_ANY, it->gcode == Slic3r::ColorChangeCode ? _(L("Edit color")) : - it->gcode == Slic3r::PausePrintCode ? _(L("Edit pause print message")) : - _(L("Edit custom G-code")), "", - [this](wxCommandEvent&) { edit_tick(); }, "edit_uni", &menu); - - if (it->gcode == Slic3r::ColorChangeCode && m_mode == t_mode::MultiAsSingle) - append_change_extruder_menu_item(&menu, true); - - append_menu_item(&menu, wxID_ANY, it->gcode == Slic3r::ColorChangeCode ? _(L("Delete color change")) : - it->gcode == Slic3r::ToolChangeCode ? _(L("Delete tool change")) : - it->gcode == Slic3r::PausePrintCode ? _(L("Delete pause print")) : - _(L("Delete custom G-code")), "", - [this](wxCommandEvent&) { delete_current_tick();}, "colorchange_del_f", &menu); - - Slic3r::GUI::wxGetApp().plater()->PopupMenu(&menu); - - m_show_edit_menu = false; - } - - Refresh(); - Update(); - event.Skip(); -} - -static std::string get_new_color(const std::string& color) -{ - wxColour clr(color); - if (!clr.IsOk()) - clr = wxColour(0, 0, 0); // Don't set alfa to transparence - - auto data = new wxColourData(); - data->SetChooseFull(1); - data->SetColour(clr); - - wxColourDialog dialog(nullptr, data); - dialog.CenterOnParent(); - if (dialog.ShowModal() == wxID_OK) - return dialog.GetColourData().GetColour().GetAsString(wxC2S_HTML_SYNTAX).ToStdString(); - return ""; -} - -static std::string get_custom_code(const std::string& code_in, double height) -{ - wxString msg_text = from_u8(_utf8(L("Enter custom G-code used on current layer"))) + ":"; - wxString msg_header = from_u8((boost::format(_utf8(L("Custom Gcode on current layer (%1% mm)."))) % height).str()); - - // get custom gcode - wxTextEntryDialog dlg(nullptr, msg_text, msg_header, code_in, - wxTextEntryDialogStyle | wxTE_MULTILINE); - if (dlg.ShowModal() != wxID_OK || dlg.GetValue().IsEmpty()) - return ""; - - return dlg.GetValue().ToStdString(); -} - -static std::string get_pause_print_msg(const std::string& msg_in, double height) -{ - wxString msg_text = from_u8(_utf8(L("Enter short message shown on Printer display during pause print"))) + ":"; - wxString msg_header = from_u8((boost::format(_utf8(L("Message for pause print on current layer (%1% mm)."))) % height).str()); - - // get custom gcode - wxTextEntryDialog dlg(nullptr, msg_text, msg_header, from_u8(msg_in), - wxTextEntryDialogStyle); - if (dlg.ShowModal() != wxID_OK || dlg.GetValue().IsEmpty()) - return ""; - - return into_u8(dlg.GetValue()); -} - -void DoubleSlider::add_code_as_tick(std::string code, int selected_extruder/* = -1*/) -{ - if (m_selection == ssUndef) - return; - const int tick = m_selection == ssLower ? m_lower_value : m_higher_value; - - if ( !check_ticks_changed_event(code) ) - return; - - const int extruder = selected_extruder > 0 ? selected_extruder : std::max(1, m_only_extruder); - const auto it = m_ticks.ticks.find(TICK_CODE{ tick }); - - if ( it == m_ticks.ticks.end() ) { - // try to add tick - if (!m_ticks.add_tick(tick, code, extruder, m_values[tick])) - return; - } - else if (code == Slic3r::ToolChangeCode || code == Slic3r::ColorChangeCode) { - // try to switch tick code to ToolChangeCode or ColorChangeCode accordingly - if (!m_ticks.switch_code_for_tick(it, code, extruder)) - return; - } - else - return; - - post_ticks_changed_event(code); -} - -void DoubleSlider::add_current_tick(bool call_from_keyboard /*= false*/) -{ - if (m_selection == ssUndef) - return; - const int tick = m_selection == ssLower ? m_lower_value : m_higher_value; - auto it = m_ticks.ticks.find(TICK_CODE{ tick }); - - if (it != m_ticks.ticks.end() || // this tick is already exist - !check_ticks_changed_event(m_mode == t_mode::MultiAsSingle ? Slic3r::ToolChangeCode : Slic3r::ColorChangeCode)) - return; - - if (m_mode == t_mode::SingleExtruder) - add_code_as_tick(Slic3r::ColorChangeCode); - else - { - wxMenu menu; - - if (m_mode == t_mode::MultiAsSingle) - append_change_extruder_menu_item(&menu); - else - append_add_color_change_menu_item(&menu); - - wxPoint pos = wxDefaultPosition; - /* Menu position will be calculated from mouse click position, but... - * if function is called from keyboard (pressing "+"), we should to calculate it - * */ - if (call_from_keyboard) - { - int width, height; - get_size(&width, &height); - - const wxCoord coord = 0.75 * (is_horizontal() ? height : width); - this->GetPosition(&width, &height); - - pos = is_horizontal() ? - wxPoint(get_position_from_value(tick), height + coord) : - wxPoint(width + coord, get_position_from_value(tick)); - } - - Slic3r::GUI::wxGetApp().plater()->PopupMenu(&menu, pos); - } -} - -void DoubleSlider::delete_current_tick() -{ - if (m_selection == ssUndef) - return; - - auto it = m_ticks.ticks.find(TICK_CODE{ m_selection == ssLower ? m_lower_value : m_higher_value }); - if (it == m_ticks.ticks.end() || - !check_ticks_changed_event(it->gcode)) - return; - - const std::string code = it->gcode; - m_ticks.ticks.erase(it); - post_ticks_changed_event(code); -} - -void DoubleSlider::edit_tick() -{ - const int tick = m_selection == ssLower ? m_lower_value : m_higher_value; - const std::set::iterator it = m_ticks.ticks.find(TICK_CODE{ tick }); - - if (it == m_ticks.ticks.end() || - !check_ticks_changed_event(it->gcode)) - return; - - const std::string code = it->gcode; - if (m_ticks.edit_tick(it, m_values[it->tick])) - post_ticks_changed_event(code); -} - -void DoubleSlider::edit_extruder_sequence() -{ - if (!check_ticks_changed_event(Slic3r::ToolChangeCode)) - return; - - Slic3r::GUI::ExtruderSequenceDialog dlg(m_extruders_sequence); - if (dlg.ShowModal() != wxID_OK) - return; - - const ExtrudersSequence& from_dlg_val = dlg.GetValue(); - if (m_extruders_sequence == from_dlg_val) - return; - - m_extruders_sequence = from_dlg_val; - - m_ticks.erase_all_ticks_with_code(Slic3r::ToolChangeCode); - - int tick = 0; - double value = 0.0; - int extruder = 0; - const int extr_cnt = m_extruders_sequence.extruders.size(); - - std::vector colors = Slic3r::GUI::wxGetApp().plater()->get_extruder_colors_from_plater_config(); - - while (tick <= m_max_value) - { - const int cur_extruder = m_extruders_sequence.extruders[extruder]; - m_ticks.ticks.emplace(TICK_CODE{tick, Slic3r::ToolChangeCode, cur_extruder + 1, colors[cur_extruder]}); - - extruder++; - if (extruder == extr_cnt) - extruder = 0; - if (m_extruders_sequence.is_mm_intervals) - { - value += m_extruders_sequence.interval_by_mm; - auto val_it = std::lower_bound(m_values.begin(), m_values.end(), value - epsilon()); - - if (val_it == m_values.end()) - break; - - tick = val_it - m_values.begin(); - } - else - tick += m_extruders_sequence.interval_by_layers; - } - - post_ticks_changed_event(Slic3r::ToolChangeCode); -} - -void DoubleSlider::post_ticks_changed_event(const std::string& gcode /*= ""*/) -{ - m_force_mode_apply = (gcode.empty() || gcode == Slic3r::ColorChangeCode || gcode == Slic3r::ToolChangeCode); - - wxPostEvent(this->GetParent(), wxCommandEvent(wxCUSTOMEVT_TICKSCHANGED)); -} - -bool DoubleSlider::check_ticks_changed_event(const std::string& gcode) -{ - if ( m_ticks.mode == m_mode || - (gcode != Slic3r::ColorChangeCode && gcode != Slic3r::ToolChangeCode) || - (m_ticks.mode == t_mode::SingleExtruder && m_mode == t_mode::MultiAsSingle) || // All ColorChanges will be applied for 1st extruder - (m_ticks.mode == t_mode::MultiExtruder && m_mode == t_mode::MultiAsSingle) ) // Just mark ColorChanges for all unused extruders - return true; - - if ((m_ticks.mode == t_mode::SingleExtruder && m_mode == t_mode::MultiExtruder ) || - (m_ticks.mode == t_mode::MultiExtruder && m_mode == t_mode::SingleExtruder) ) - { - if (!m_ticks.has_tick_with_code(Slic3r::ColorChangeCode)) - return true; - - wxString message = (m_ticks.mode == t_mode::SingleExtruder ? - _(L("The last color change data was saved for a single extruder printer profile.")) : - _(L("The last color change data was saved for a multiple extruder printer profile.")) - ) + "\n" + - _(L("Your current changes will cause a deletion of all saved color changes.")) + "\n\n\t" + - _(L("Are you sure you want to continue?")); - - wxMessageDialog msg(this, message, _(L("Notice")), wxYES_NO); - if (msg.ShowModal() == wxID_YES) { - m_ticks.erase_all_ticks_with_code(Slic3r::ColorChangeCode); - post_ticks_changed_event(Slic3r::ColorChangeCode); - } - return false; - } - // m_ticks_mode == t_mode::MultiAsSingle - if( m_ticks.has_tick_with_code(Slic3r::ToolChangeCode) ) - { - wxString message = m_mode == t_mode::SingleExtruder ? ( - _(L("The last color change data was saved for a multi extruder printing.")) + "\n\n" + - _(L("Select YES if you want to delete all saved tool changes, \n\t" - "NO if you want all tool changes switch to color changes, \n\t" - "or CANCEL for do nothing")) + "\n\n\t" + - _(L("Do you want to delete all saved tool changes?")) - ) : ( // t_mode::MultiExtruder - _(L("The last color change data was saved for a multi extruder printing with tool changes for whole print.")) + "\n\n" + - _(L("Your current changes will cause a deletion of all saved tool changes.")) + "\n\n\t" + - _(L("Are you sure you want to continue?")) ) ; - - wxMessageDialog msg(this, message, _(L("Notice")), wxYES_NO | (m_mode == t_mode::SingleExtruder ? wxCANCEL : 0)); - const int answer = msg.ShowModal(); - if (answer == wxID_YES) { - m_ticks.erase_all_ticks_with_code(Slic3r::ToolChangeCode); - post_ticks_changed_event(Slic3r::ToolChangeCode); - } - else if (m_mode == t_mode::SingleExtruder && answer == wxID_NO) { - m_ticks.switch_code(Slic3r::ToolChangeCode, Slic3r::ColorChangeCode); - post_ticks_changed_event(Slic3r::ColorChangeCode); - } - return false; - } - - return true; -} - - -std::string DoubleSlider::TICK_CODE_INFO::get_color_for_tick(TICK_CODE tick, const std::string& code, const int extruder) -{ - std::vector colors = Slic3r::GUI::wxGetApp().plater()->get_extruder_colors_from_plater_config(); - std::string color = colors[extruder - 1]; - - if (code == Slic3r::ColorChangeCode) - { - if (!ticks.empty()) - { - auto before_tick_it = std::lower_bound(ticks.begin(), ticks.end(), tick ); - while (before_tick_it != ticks.begin()) { - --before_tick_it; - if (before_tick_it->gcode == Slic3r::ColorChangeCode && before_tick_it->extruder == extruder) { - color = before_tick_it->color; - break; - } - } - } - - color = get_new_color(color); - } - return color; -} - -bool DoubleSlider::TICK_CODE_INFO::add_tick(const int tick, std::string& code, const int extruder, double print_z) -{ - std::string color; - if (code.empty()) // custom Gcode - { - code = get_custom_code(custom_gcode, print_z); - if (code.empty()) - return false; - custom_gcode = code; - } - else if (code == Slic3r::PausePrintCode) - { - /* PausePrintCode doesn't need a color, so - * this field is used for save a short message shown on Printer display - * */ - color = get_pause_print_msg(pause_print_msg, print_z); - if (color.empty()) - return false; - pause_print_msg = color; - } - else - { - color = get_color_for_tick(TICK_CODE{ tick }, code, extruder); - if (color.empty()) - return false; - } - - ticks.emplace(TICK_CODE{ tick, code, extruder, color }); - return true; -} - -bool DoubleSlider::TICK_CODE_INFO::edit_tick(std::set::iterator it, double print_z) -{ - std::string edited_value; - if (it->gcode == Slic3r::ColorChangeCode) - edited_value = get_new_color(it->color); - else if (it->gcode == Slic3r::PausePrintCode) - edited_value = get_pause_print_msg(it->color, print_z); - else - edited_value = get_custom_code(it->gcode, print_z); - - if (edited_value.empty()) - return false; - - TICK_CODE changed_tick = *it; - if (it->gcode == Slic3r::ColorChangeCode || it->gcode == Slic3r::PausePrintCode) { - if (it->color == edited_value) - return false; - changed_tick.color = edited_value; - } - else { - if (it->gcode == edited_value) - return false; - changed_tick.gcode = edited_value; - } - - ticks.erase(it); - ticks.emplace(changed_tick); - - return true; -} - -void DoubleSlider::TICK_CODE_INFO::switch_code(const std::string& code_from, const std::string& code_to) -{ - for (auto it{ ticks.begin() }, end{ ticks.end() }; it != end; ) - if (it->gcode == code_from) - { - TICK_CODE tick = *it; - tick.gcode = code_to; - tick.extruder = 1; - ticks.erase(it); - it = ticks.emplace(tick).first; - } - else - ++it; -} - -bool DoubleSlider::TICK_CODE_INFO::switch_code_for_tick(std::set::iterator it, const std::string& code_to, const int extruder) -{ - const std::string color = get_color_for_tick(*it, code_to, extruder); - if (color.empty()) - return false; - - TICK_CODE changed_tick = *it; - changed_tick.gcode = code_to; - changed_tick.extruder = extruder; - changed_tick.color = color; - - ticks.erase(it); - ticks.emplace(changed_tick); - - return true; -} - -void DoubleSlider::TICK_CODE_INFO::erase_all_ticks_with_code(const std::string& gcode) -{ - for (auto it{ ticks.begin() }, end{ ticks.end() }; it != end; ) { - if (it->gcode == gcode) - it = ticks.erase(it); - else - ++it; - } -} - -bool DoubleSlider::TICK_CODE_INFO::has_tick_with_code(const std::string& gcode) -{ - for (const TICK_CODE& tick : ticks) - if (tick.gcode == gcode) - return true; - - return false; -} - // ---------------------------------------------------------------------------- // LockButton diff --git a/src/slic3r/GUI/wxExtensions.hpp b/src/slic3r/GUI/wxExtensions.hpp index 322358ffe2..a6f8862ac4 100644 --- a/src/slic3r/GUI/wxExtensions.hpp +++ b/src/slic3r/GUI/wxExtensions.hpp @@ -5,19 +5,15 @@ #include #include #include -#include #include #include #include -#include #include #include #include #include #include -#include "libslic3r/Model.hpp" -#include "libslic3r/GCodeWriter.hpp" namespace Slic3r { enum class ModelVolumeType : int; @@ -49,12 +45,15 @@ wxMenuItem* append_menu_radio_item(wxMenu* menu, int id, const wxString& string, wxMenuItem* append_menu_check_item(wxMenu* menu, int id, const wxString& string, const wxString& description, std::function cb, wxEvtHandler* event_handler); +void enable_menu_item(wxUpdateUIEvent& evt, std::function const cb_condition, wxMenuItem* item, wxWindow* win); + class wxDialog; class wxBitmapComboBox; void edit_tooltip(wxString& tooltip); void msw_buttons_rescale(wxDialog* dlg, const int em_unit, const std::vector& btn_ids); int em_unit(wxWindow* win); +float get_svg_scale_factor(wxWindow* win); wxBitmap create_scaled_bitmap(wxWindow *win, const std::string& bmp_name, const int px_cnt = 16, const bool is_horizontal = false, const bool grayscale = false); @@ -742,311 +741,6 @@ private: }; -// ---------------------------------------------------------------------------- -// DoubleSlider -// ---------------------------------------------------------------------------- - -// custom message the slider sends to its parent to notify a tick-change: -wxDECLARE_EVENT(wxCUSTOMEVT_TICKSCHANGED, wxEvent); - -enum SelectedSlider { - ssUndef, - ssLower, - ssHigher -}; -enum TicksAction{ - taOnIcon, - taAdd, - taDel -}; - -class DoubleSlider : public wxControl -{ - enum IconFocus { - ifNone, - ifRevert, - ifCog - }; -public: - DoubleSlider( - wxWindow *parent, - wxWindowID id, - int lowerValue, - int higherValue, - int minValue, - int maxValue, - const wxPoint& pos = wxDefaultPosition, - const wxSize& size = wxDefaultSize, - long style = wxSL_VERTICAL, - const wxValidator& val = wxDefaultValidator, - const wxString& name = wxEmptyString); - ~DoubleSlider() {} - - using t_mode = Slic3r::CustomGCode::Mode; - - /* For exporting GCode in GCodeWriter is used XYZF_NUM(val) = PRECISION(val, 3) for XYZ values. - * So, let use same value as a permissible error for layer height. - */ - static double epsilon() { return 0.0011;} - - void msw_rescale(); - - int GetMinValue() const { return m_min_value; } - int GetMaxValue() const { return m_max_value; } - double GetMinValueD() { return m_values.empty() ? 0. : m_values[m_min_value]; } - double GetMaxValueD() { return m_values.empty() ? 0. : m_values[m_max_value]; } - int GetLowerValue() const { return m_lower_value; } - int GetHigherValue() const { return m_higher_value; } - int GetActiveValue() const; - wxSize get_min_size() const ; - double GetLowerValueD() { return get_double_value(ssLower); } - double GetHigherValueD() { return get_double_value(ssHigher); } - wxSize DoGetBestSize() const override; - void SetLowerValue(const int lower_val); - void SetHigherValue(const int higher_val); - // Set low and high slider position. If the span is non-empty, disable the "one layer" mode. - void SetSelectionSpan(const int lower_val, const int higher_val); - void SetMaxValue(const int max_value); - void SetKoefForLabels(const double koef) { m_label_koef = koef; } - void SetSliderValues(const std::vector& values) { m_values = values; } - void ChangeOneLayerLock(); - Slic3r::CustomGCode::Info GetTicksValues() const; - void SetTicksValues(const Slic3r::CustomGCode::Info &custom_gcode_per_print_z); - void EnableTickManipulation(bool enable = true) { m_is_enabled_tick_manipulation = enable; } - void DisableTickManipulation() { EnableTickManipulation(false); } - - void SetManipulationMode(t_mode mode) { m_mode = mode; } - t_mode GetManipulationMode() const { return m_mode; } - - void SetModeAndOnlyExtruder(const bool is_one_extruder_printed_model, const int only_extruder) - { - m_mode = !is_one_extruder_printed_model ? t_mode::MultiExtruder : - only_extruder < 0 ? t_mode::SingleExtruder : - t_mode::MultiAsSingle; - m_only_extruder = only_extruder; - } - - bool is_horizontal() const { return m_style == wxSL_HORIZONTAL; } - bool is_one_layer() const { return m_is_one_layer; } - bool is_lower_at_min() const { return m_lower_value == m_min_value; } - bool is_higher_at_max() const { return m_higher_value == m_max_value; } - bool is_full_span() const { return this->is_lower_at_min() && this->is_higher_at_max(); } - - void OnPaint(wxPaintEvent& ) { render();} - void OnLeftDown(wxMouseEvent& event); - void OnMotion(wxMouseEvent& event); - void OnLeftUp(wxMouseEvent& event); - void OnEnterWin(wxMouseEvent& event) { enter_window(event, true); } - void OnLeaveWin(wxMouseEvent& event) { enter_window(event, false); } - void OnWheel(wxMouseEvent& event); - void OnKeyDown(wxKeyEvent &event); - void OnKeyUp(wxKeyEvent &event); - void OnChar(wxKeyEvent &event); - void OnRightDown(wxMouseEvent& event); - void OnRightUp(wxMouseEvent& event); - - void add_code_as_tick(std::string code, int selected_extruder = -1); - // add default action for tick, when press "+" - void add_current_tick(bool call_from_keyboard = false); - // delete current tick, when press "-" - void delete_current_tick(); - void edit_tick(); - void edit_extruder_sequence(); - - struct TICK_CODE - { - bool operator<(const TICK_CODE& other) const { return other.tick > this->tick; } - bool operator>(const TICK_CODE& other) const { return other.tick < this->tick; } - - int tick = 0; - std::string gcode = Slic3r::ColorChangeCode; - int extruder = 0; - std::string color; - }; - -protected: - - void render(); - void draw_focus_rect(); - void draw_action_icon(wxDC& dc, const wxPoint pt_beg, const wxPoint pt_end); - void draw_scroll_line(wxDC& dc, const int lower_pos, const int higher_pos); - void draw_thumb(wxDC& dc, const wxCoord& pos_coord, const SelectedSlider& selection); - void draw_thumbs(wxDC& dc, const wxCoord& lower_pos, const wxCoord& higher_pos); - void draw_ticks(wxDC& dc); - void draw_colored_band(wxDC& dc); - void draw_one_layer_icon(wxDC& dc); - void draw_revert_icon(wxDC& dc); - void draw_cog_icon(wxDC &dc); - void draw_thumb_item(wxDC& dc, const wxPoint& pos, const SelectedSlider& selection); - void draw_info_line_with_icon(wxDC& dc, const wxPoint& pos, SelectedSlider selection); - void draw_thumb_text(wxDC& dc, const wxPoint& pos, const SelectedSlider& selection) const; - - void update_thumb_rect(const wxCoord& begin_x, const wxCoord& begin_y, const SelectedSlider& selection); - void detect_selected_slider(const wxPoint& pt); - void correct_lower_value(); - void correct_higher_value(); - void move_current_thumb(const bool condition); - void enter_window(wxMouseEvent& event, const bool enter); - -private: - - bool is_point_in_rect(const wxPoint& pt, const wxRect& rect); - int is_point_near_tick(const wxPoint& pt); - - double get_scroll_step(); - wxString get_label(const SelectedSlider& selection) const; - void get_lower_and_higher_position(int& lower_pos, int& higher_pos); - int get_value_from_position(const wxCoord x, const wxCoord y); - wxCoord get_position_from_value(const int value); - wxSize get_size(); - void get_size(int *w, int *h); - double get_double_value(const SelectedSlider& selection); - wxString get_tooltip(IconFocus icon_focus); - - std::string get_color_for_tool_change_tick(std::set::const_iterator it) const; - std::string get_color_for_color_change_tick(std::set::const_iterator it) const; - int get_extruder_for_tick(int tick); - std::set get_used_extruders_for_tick(int tick); - - void post_ticks_changed_event(const std::string& gcode = ""); - bool check_ticks_changed_event(const std::string& gcode); - void append_change_extruder_menu_item (wxMenu*, bool switch_current_code = false); - void append_add_color_change_menu_item(wxMenu*, bool switch_current_code = false); - - bool is_osx { false }; - wxFont m_font; - int m_min_value; - int m_max_value; - int m_lower_value; - int m_higher_value; - ScalableBitmap m_bmp_thumb_higher; - ScalableBitmap m_bmp_thumb_lower; - ScalableBitmap m_bmp_add_tick_on; - ScalableBitmap m_bmp_add_tick_off; - ScalableBitmap m_bmp_del_tick_on; - ScalableBitmap m_bmp_del_tick_off; - ScalableBitmap m_bmp_one_layer_lock_on; - ScalableBitmap m_bmp_one_layer_lock_off; - ScalableBitmap m_bmp_one_layer_unlock_on; - ScalableBitmap m_bmp_one_layer_unlock_off; - ScalableBitmap m_bmp_revert; - ScalableBitmap m_bmp_cog; - SelectedSlider m_selection; - bool m_is_left_down = false; - bool m_is_right_down = false; - bool m_is_one_layer = false; - bool m_is_focused = false; - bool m_is_action_icon_focesed = false; - bool m_is_one_layer_icon_focesed = false; - bool m_is_enabled_tick_manipulation = true; - bool m_show_context_menu = false; - bool m_show_edit_menu = false; - bool m_force_edit_extruder_sequence = false; - bool m_force_mode_apply = true; - bool m_force_add_tick = false; - bool m_force_delete_tick = false; - t_mode m_mode = t_mode::SingleExtruder; - int m_only_extruder = -1; - - wxRect m_rect_lower_thumb; - wxRect m_rect_higher_thumb; - wxRect m_rect_tick_action; - wxRect m_rect_one_layer_icon; - wxRect m_rect_revert_icon; - wxRect m_rect_cog_icon; - wxSize m_thumb_size; - int m_tick_icon_dim; - int m_lock_icon_dim; - int m_revert_icon_dim; - int m_cog_icon_dim; - long m_style; - float m_label_koef = 1.0; - -// control's view variables - wxCoord SLIDER_MARGIN; // margin around slider - - wxPen DARK_ORANGE_PEN; - wxPen ORANGE_PEN; - wxPen LIGHT_ORANGE_PEN; - - wxPen DARK_GREY_PEN; - wxPen GREY_PEN; - wxPen LIGHT_GREY_PEN; - - std::vector m_line_pens; - std::vector m_segm_pens; - std::vector m_values; - - struct TICK_CODE_INFO - { - std::set ticks; - t_mode mode = t_mode::SingleExtruder; - - bool empty() const { return ticks.empty(); } - void set_pause_print_msg(const std::string& message) { pause_print_msg = message; } - - bool add_tick (const int tick, std::string &code, int extruder, double print_z); - bool edit_tick (std::set::iterator it, double print_z); - void switch_code(const std::string& code_from, const std::string& code_to); - bool switch_code_for_tick (std::set::iterator it, const std::string& code_to, const int extruder); - void erase_all_ticks_with_code (const std::string& gcode); - bool has_tick_with_code (const std::string& gcode); - - void suppress_plus (bool suppress) { m_suppress_plus = suppress;} - void suppress_minus(bool suppress) { m_suppress_minus = suppress;} - bool suppressed_plus () { return m_suppress_plus ; } - bool suppressed_minus() { return m_suppress_minus; } - - private: - - std::string custom_gcode = ""; - std::string pause_print_msg = ""; - bool m_suppress_plus = false; - bool m_suppress_minus = false; - - std::string get_color_for_tick(TICK_CODE tick, const std::string& code, const int extruder); - } - m_ticks; - -public: - struct ExtrudersSequence - { - bool is_mm_intervals = true; - double interval_by_mm = 3.0; - int interval_by_layers = 10; - std::vector extruders = { 0 }; - - bool operator==(const ExtrudersSequence& other) const - { - return (other.is_mm_intervals == this->is_mm_intervals ) && - (other.interval_by_mm == this->interval_by_mm ) && - (other.interval_by_layers == this->interval_by_layers ) && - (other.extruders == this->extruders ) ; - } - bool operator!=(const ExtrudersSequence& other) const - { - return (other.is_mm_intervals != this->is_mm_intervals ) && - (other.interval_by_mm != this->interval_by_mm ) && - (other.interval_by_layers != this->interval_by_layers ) && - (other.extruders != this->extruders ) ; - } - - void add_extruder(size_t pos) - { - extruders.insert(extruders.begin() + pos+1, size_t(0)); - } - - void delete_extruder(size_t pos) - { - if (extruders.size() == 1) - return;// last item can't be deleted - extruders.erase(extruders.begin() + pos); - } - } - m_extruders_sequence; -}; - - // ---------------------------------------------------------------------------- // LockButton // ---------------------------------------------------------------------------- From 81b7f437da596e88712fb8af7fa2010241ae392c Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Thu, 23 Jan 2020 16:02:23 +0100 Subject: [PATCH 150/336] update openvdb build patch to solve latomic --- deps/openvdb-mods.patch | 653 ++++++++++++++++++++++++---------------- 1 file changed, 389 insertions(+), 264 deletions(-) diff --git a/deps/openvdb-mods.patch b/deps/openvdb-mods.patch index 023cb53087..c365a43058 100644 --- a/deps/openvdb-mods.patch +++ b/deps/openvdb-mods.patch @@ -1,24 +1,25 @@ -From dbe038fce8a15ddc9a5c83ec5156d7bc9e178015 Mon Sep 17 00:00:00 2001 +From c660786dbac9e4c284049af4da56c34a998a4b68 Mon Sep 17 00:00:00 2001 From: tamasmeszaros -Date: Wed, 16 Oct 2019 17:42:50 +0200 -Subject: [PATCH] Build fixes for PrusaSlicer integration +Date: Thu, 23 Jan 2020 16:27:21 +0100 +Subject: [PATCH] openvdb-mods -Signed-off-by: tamasmeszaros --- CMakeLists.txt | 3 - - cmake/FindBlosc.cmake | 218 --------------- + cmake/CheckAtomic.cmake | 106 ++++++ + cmake/FindBlosc.cmake | 218 ------------ cmake/FindCppUnit.cmake | 4 +- - cmake/FindIlmBase.cmake | 337 ---------------------- - cmake/FindOpenEXR.cmake | 329 ---------------------- + cmake/FindIlmBase.cmake | 337 ------------------ + cmake/FindOpenEXR.cmake | 329 ------------------ cmake/FindOpenVDB.cmake | 19 +- - cmake/FindTBB.cmake | 605 ++++++++++++++++++++-------------------- + cmake/FindTBB.cmake | 599 ++++++++++++++++---------------- openvdb/CMakeLists.txt | 13 +- openvdb/Grid.cc | 3 + openvdb/PlatformConfig.h | 9 +- - openvdb/cmd/CMakeLists.txt | 4 +- + openvdb/cmd/CMakeLists.txt | 11 +- openvdb/unittest/CMakeLists.txt | 3 +- openvdb/unittest/TestFile.cc | 2 +- - 13 files changed, 336 insertions(+), 1213 deletions(-) + 14 files changed, 446 insertions(+), 1210 deletions(-) + create mode 100644 cmake/CheckAtomic.cmake delete mode 100644 cmake/FindBlosc.cmake delete mode 100644 cmake/FindIlmBase.cmake delete mode 100644 cmake/FindOpenEXR.cmake @@ -40,6 +41,119 @@ index 580b353..6d364c1 100644 cmake/FindOpenVDB.cmake cmake/FindTBB.cmake cmake/OpenVDBGLFW3Setup.cmake +diff --git a/cmake/CheckAtomic.cmake b/cmake/CheckAtomic.cmake +new file mode 100644 +index 0000000..c045e30 +--- /dev/null ++++ b/cmake/CheckAtomic.cmake +@@ -0,0 +1,106 @@ ++# atomic builtins are required for threading support. ++ ++INCLUDE(CheckCXXSourceCompiles) ++INCLUDE(CheckLibraryExists) ++ ++# Sometimes linking against libatomic is required for atomic ops, if ++# the platform doesn't support lock-free atomics. ++ ++function(check_working_cxx_atomics varname) ++ set(OLD_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS}) ++ set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -std=c++11") ++ CHECK_CXX_SOURCE_COMPILES(" ++#include ++std::atomic x; ++int main() { ++ return x; ++} ++" ${varname}) ++ set(CMAKE_REQUIRED_FLAGS ${OLD_CMAKE_REQUIRED_FLAGS}) ++endfunction(check_working_cxx_atomics) ++ ++function(check_working_cxx_atomics64 varname) ++ set(OLD_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS}) ++ set(CMAKE_REQUIRED_FLAGS "-std=c++11 ${CMAKE_REQUIRED_FLAGS}") ++ CHECK_CXX_SOURCE_COMPILES(" ++#include ++#include ++std::atomic x (0); ++int main() { ++ uint64_t i = x.load(std::memory_order_relaxed); ++ return 0; ++} ++" ${varname}) ++ set(CMAKE_REQUIRED_FLAGS ${OLD_CMAKE_REQUIRED_FLAGS}) ++endfunction(check_working_cxx_atomics64) ++ ++ ++# This isn't necessary on MSVC, so avoid command-line switch annoyance ++# by only running on GCC-like hosts. ++if (LLVM_COMPILER_IS_GCC_COMPATIBLE) ++ # First check if atomics work without the library. ++ check_working_cxx_atomics(HAVE_CXX_ATOMICS_WITHOUT_LIB) ++ # If not, check if the library exists, and atomics work with it. ++ if(NOT HAVE_CXX_ATOMICS_WITHOUT_LIB) ++ check_library_exists(atomic __atomic_fetch_add_4 "" HAVE_LIBATOMIC) ++ if( HAVE_LIBATOMIC ) ++ list(APPEND CMAKE_REQUIRED_LIBRARIES "atomic") ++ check_working_cxx_atomics(HAVE_CXX_ATOMICS_WITH_LIB) ++ if (NOT HAVE_CXX_ATOMICS_WITH_LIB) ++ message(FATAL_ERROR "Host compiler must support std::atomic!") ++ endif() ++ else() ++ message(FATAL_ERROR "Host compiler appears to require libatomic, but cannot find it.") ++ endif() ++ endif() ++endif() ++ ++# Check for 64 bit atomic operations. ++if(MSVC) ++ set(HAVE_CXX_ATOMICS64_WITHOUT_LIB True) ++else() ++ check_working_cxx_atomics64(HAVE_CXX_ATOMICS64_WITHOUT_LIB) ++endif() ++ ++# If not, check if the library exists, and atomics work with it. ++if(NOT HAVE_CXX_ATOMICS64_WITHOUT_LIB) ++ check_library_exists(atomic __atomic_load_8 "" HAVE_CXX_LIBATOMICS64) ++ if(HAVE_CXX_LIBATOMICS64) ++ list(APPEND CMAKE_REQUIRED_LIBRARIES "atomic") ++ check_working_cxx_atomics64(HAVE_CXX_ATOMICS64_WITH_LIB) ++ if (NOT HAVE_CXX_ATOMICS64_WITH_LIB) ++ message(FATAL_ERROR "Host compiler must support 64-bit std::atomic!") ++ endif() ++ else() ++ message(FATAL_ERROR "Host compiler appears to require libatomic for 64-bit operations, but cannot find it.") ++ endif() ++endif() ++ ++## TODO: This define is only used for the legacy atomic operations in ++## llvm's Atomic.h, which should be replaced. Other code simply ++## assumes C++11 works. ++CHECK_CXX_SOURCE_COMPILES(" ++#ifdef _MSC_VER ++#include ++#endif ++int main() { ++#ifdef _MSC_VER ++ volatile LONG val = 1; ++ MemoryBarrier(); ++ InterlockedCompareExchange(&val, 0, 1); ++ InterlockedIncrement(&val); ++ InterlockedDecrement(&val); ++#else ++ volatile unsigned long val = 1; ++ __sync_synchronize(); ++ __sync_val_compare_and_swap(&val, 1, 0); ++ __sync_add_and_fetch(&val, 1); ++ __sync_sub_and_fetch(&val, 1); ++#endif ++ return 0; ++ } ++" LLVM_HAS_ATOMICS) ++ ++if( NOT LLVM_HAS_ATOMICS ) ++ message(STATUS "Warning: LLVM will be built thread-unsafe because atomic builtins are missing") ++endif() +\ No newline at end of file diff --git a/cmake/FindBlosc.cmake b/cmake/FindBlosc.cmake deleted file mode 100644 index 5aacfdd..0000000 @@ -965,7 +1079,7 @@ index 339c1a2..0000000 - message(FATAL_ERROR "Unable to find OpenEXR") -endif() diff --git a/cmake/FindOpenVDB.cmake b/cmake/FindOpenVDB.cmake -index 63a2eda..6211071 100644 +index 63a2eda..d9f6d07 100644 --- a/cmake/FindOpenVDB.cmake +++ b/cmake/FindOpenVDB.cmake @@ -244,7 +244,7 @@ set(OpenVDB_LIB_COMPONENTS "") @@ -1004,7 +1118,7 @@ index 63a2eda..6211071 100644 ) + + if (OPENVDB_USE_STATIC_LIBS) -+ set_target_properties(OpenVDB::${COMPONENT} PROPERTIES ++ set_target_properties(OpenVDB::${COMPONENT} PROPERTIES + INTERFACE_COMPILE_DEFINITIONS "OPENVDB_STATICLIB;OPENVDB_OPENEXR_STATICLIB" + ) + endif() @@ -1012,7 +1126,7 @@ index 63a2eda..6211071 100644 endforeach() diff --git a/cmake/FindTBB.cmake b/cmake/FindTBB.cmake -index bdf9c81..c6bdec9 100644 +index bdf9c81..06093a4 100644 --- a/cmake/FindTBB.cmake +++ b/cmake/FindTBB.cmake @@ -1,333 +1,332 @@ @@ -1022,35 +1136,21 @@ index bdf9c81..c6bdec9 100644 -# All rights reserved. This software is distributed under the -# Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +# Copyright (c) 2015 Justus Calvin -+# + # +-# Redistributions of source code must retain the above copyright +-# and license notice and the following restrictions and disclaimer. +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: -+# -+# The above copyright notice and this permission notice shall be included in all -+# copies or substantial portions of the Software. -+# -+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -+# SOFTWARE. -+ - # --# Redistributions of source code must retain the above copyright --# and license notice and the following restrictions and disclaimer. -+# FindTBB -+# ------- # -# * Neither the name of DreamWorks Animation nor the names of -# its contributors may be used to endorse or promote products derived -# from this software without specific prior written permission. -+# Find TBB include directories and libraries. ++# The above copyright notice and this permission notice shall be included in all ++# copies or substantial portions of the Software. # -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT @@ -1065,7 +1165,14 @@ index bdf9c81..c6bdec9 100644 -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE -# LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. -+# Usage: ++# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ++# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ++# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE ++# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER ++# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, ++# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE ++# SOFTWARE. ++ # -#[=======================================================================[.rst: - @@ -1142,19 +1249,26 @@ index bdf9c81..c6bdec9 100644 -if(POLICY CMP0057) - cmake_policy(SET CMP0057 NEW) -endif() ++# FindTBB ++# ------- ++# ++# Find TBB include directories and libraries. ++# ++# Usage: ++# +# find_package(TBB [major[.minor]] [EXACT] +# [QUIET] [REQUIRED] +# [[COMPONENTS] [components...]] -+# [OPTIONAL_COMPONENTS components...]) ++# [OPTIONAL_COMPONENTS components...]) +# -+# where the allowed components are tbbmalloc and tbb_preview. Users may modify ++# where the allowed components are tbbmalloc and tbb_preview. Users may modify +# the behavior of this module with the following variables: +# +# * TBB_ROOT_DIR - The base directory the of TBB installation. +# * TBB_INCLUDE_DIR - The directory that contains the TBB headers files. +# * TBB_LIBRARY - The directory that contains the TBB library files. -+# * TBB__LIBRARY - The path of the TBB the corresponding TBB library. -+# These libraries, if specified, override the ++# * TBB__LIBRARY - The path of the TBB the corresponding TBB library. ++# These libraries, if specified, override the +# corresponding library search results, where +# may be tbb, tbb_debug, tbbmalloc, tbbmalloc_debug, +# tbb_preview, or tbb_preview_debug. @@ -1167,7 +1281,7 @@ index bdf9c81..c6bdec9 100644 +# Users may modify the behavior of this module with the following environment +# variables: +# -+# * TBB_INSTALL_DIR ++# * TBB_INSTALL_DIR +# * TBBROOT +# * LIBRARY_PATH +# @@ -1180,15 +1294,15 @@ index bdf9c81..c6bdec9 100644 +# * TBB_VERSION - The full version string +# * TBB_VERSION_MAJOR - The major version +# * TBB_VERSION_MINOR - The minor version -+# * TBB_INTERFACE_VERSION - The interface version number defined in ++# * TBB_INTERFACE_VERSION - The interface version number defined in +# tbb/tbb_stddef.h. -+# * TBB__LIBRARY_RELEASE - The path of the TBB release version of ++# * TBB__LIBRARY_RELEASE - The path of the TBB release version of +# , where may be tbb, tbb_debug, -+# tbbmalloc, tbbmalloc_debug, tbb_preview, or ++# tbbmalloc, tbbmalloc_debug, tbb_preview, or +# tbb_preview_debug. -+# * TBB__LIBRARY_DEGUG - The path of the TBB release version of ++# * TBB__LIBRARY_DEGUG - The path of the TBB release version of +# , where may be tbb, tbb_debug, -+# tbbmalloc, tbbmalloc_debug, tbb_preview, or ++# tbbmalloc, tbbmalloc_debug, tbb_preview, or +# tbb_preview_debug. +# +# The following varibles should be used to build and link with TBB: @@ -1244,12 +1358,10 @@ index bdf9c81..c6bdec9 100644 - set(TBB_FIND_COMPONENTS ${_TBB_COMPONENT_LIST}) -endif() +include(FindPackageHandleStandardArgs) -+ -+find_package(Threads QUIET REQUIRED) -# Append TBB_ROOT or $ENV{TBB_ROOT} if set (prioritize the direct cmake var) -set(_TBB_ROOT_SEARCH_DIR "") -+if(NOT TBB_FOUND) ++find_package(Threads QUIET REQUIRED) -if(TBB_ROOT) - list(APPEND _TBB_ROOT_SEARCH_DIR ${TBB_ROOT}) @@ -1257,41 +1369,9 @@ index bdf9c81..c6bdec9 100644 - set(_ENV_TBB_ROOT $ENV{TBB_ROOT}) - if(_ENV_TBB_ROOT) - list(APPEND _TBB_ROOT_SEARCH_DIR ${_ENV_TBB_ROOT}) -+ ################################## -+ # Check the build type -+ ################################## -+ -+ if(NOT DEFINED TBB_USE_DEBUG_BUILD) -+ if(CMAKE_BUILD_TYPE MATCHES "(Debug|DEBUG|debug)") -+ set(TBB_BUILD_TYPE DEBUG) -+ else() -+ set(TBB_BUILD_TYPE RELEASE) -+ endif() -+ elseif(TBB_USE_DEBUG_BUILD) -+ set(TBB_BUILD_TYPE DEBUG) -+ else() -+ set(TBB_BUILD_TYPE RELEASE) - endif() +- endif() -endif() -+ -+ ################################## -+ # Set the TBB search directories -+ ################################## -+ -+ # Define search paths based on user input and environment variables -+ set(TBB_SEARCH_DIR ${TBB_ROOT_DIR} $ENV{TBB_INSTALL_DIR} $ENV{TBBROOT}) -+ -+ # Define the search directories based on the current platform -+ if(CMAKE_SYSTEM_NAME STREQUAL "Windows") -+ set(TBB_DEFAULT_SEARCH_DIR "C:/Program Files/Intel/TBB" -+ "C:/Program Files (x86)/Intel/TBB") -+ -+ # Set the target architecture -+ if(CMAKE_SIZEOF_VOID_P EQUAL 8) -+ set(TBB_ARCHITECTURE "intel64") -+ else() -+ set(TBB_ARCHITECTURE "ia32") -+ endif() ++if(NOT TBB_FOUND) -# Additionally try and use pkconfig to find Tbb - @@ -1339,6 +1419,57 @@ index bdf9c81..c6bdec9 100644 - - set(Tbb_VERSION ${Tbb_VERSION_MAJOR}.${Tbb_VERSION_MINOR}) -endif() ++ ################################## ++ # Check the build type ++ ################################## ++ ++ if(NOT DEFINED TBB_USE_DEBUG_BUILD) ++ if(CMAKE_BUILD_TYPE MATCHES "(Debug|DEBUG|debug)") ++ set(TBB_BUILD_TYPE DEBUG) ++ else() ++ set(TBB_BUILD_TYPE RELEASE) ++ endif() ++ elseif(TBB_USE_DEBUG_BUILD) ++ set(TBB_BUILD_TYPE DEBUG) ++ else() ++ set(TBB_BUILD_TYPE RELEASE) ++ endif() + +-# ------------------------------------------------------------------------ +-# Search for TBB lib DIR +-# ------------------------------------------------------------------------ ++ ################################## ++ # Set the TBB search directories ++ ################################## + +-set(_TBB_LIBRARYDIR_SEARCH_DIRS "") ++ # Define search paths based on user input and environment variables ++ set(TBB_SEARCH_DIR ${TBB_ROOT_DIR} $ENV{TBB_INSTALL_DIR} $ENV{TBBROOT}) + +-# Append to _TBB_LIBRARYDIR_SEARCH_DIRS in priority order ++ # Define the search directories based on the current platform ++ if(CMAKE_SYSTEM_NAME STREQUAL "Windows") ++ set(TBB_DEFAULT_SEARCH_DIR "C:/Program Files/Intel/TBB" ++ "C:/Program Files (x86)/Intel/TBB") + +-set(_TBB_LIBRARYDIR_SEARCH_DIRS "") +-list(APPEND _TBB_LIBRARYDIR_SEARCH_DIRS +- ${TBB_LIBRARYDIR} +- ${_TBB_ROOT_SEARCH_DIR} +- ${PC_Tbb_LIBRARY_DIRS} +- ${SYSTEM_LIBRARY_PATHS} +-) ++ # Set the target architecture ++ if(CMAKE_SIZEOF_VOID_P EQUAL 8) ++ set(TBB_ARCHITECTURE "intel64") ++ else() ++ set(TBB_ARCHITECTURE "ia32") ++ endif() + +-set(TBB_PATH_SUFFIXES +- lib64 +- lib +-) + # Set the TBB search library path search suffix based on the version of VC + if(WINDOWS_STORE) + set(TBB_LIB_PATH_SUFFIX "lib/${TBB_ARCHITECTURE}/vc11_ui") @@ -1352,104 +1483,16 @@ index bdf9c81..c6bdec9 100644 + set(TBB_LIB_PATH_SUFFIX "lib/${TBB_ARCHITECTURE}/vc10") + endif() --# ------------------------------------------------------------------------ --# Search for TBB lib DIR --# ------------------------------------------------------------------------ +-# platform branching + # Add the library path search suffix for the VC independent version of TBB + list(APPEND TBB_LIB_PATH_SUFFIX "lib/${TBB_ARCHITECTURE}/vc_mt") -+ -+ elseif(CMAKE_SYSTEM_NAME STREQUAL "Darwin") -+ # OS X -+ set(TBB_DEFAULT_SEARCH_DIR "/opt/intel/tbb") -+ -+ # TODO: Check to see which C++ library is being used by the compiler. -+ if(NOT ${CMAKE_SYSTEM_VERSION} VERSION_LESS 13.0) -+ # The default C++ library on OS X 10.9 and later is libc++ -+ set(TBB_LIB_PATH_SUFFIX "lib/libc++" "lib") -+ else() -+ set(TBB_LIB_PATH_SUFFIX "lib") -+ endif() -+ elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux") -+ # Linux -+ set(TBB_DEFAULT_SEARCH_DIR "/opt/intel/tbb") -+ -+ # TODO: Check compiler version to see the suffix should be /gcc4.1 or -+ # /gcc4.1. For now, assume that the compiler is more recent than -+ # gcc 4.4.x or later. -+ if(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64") -+ set(TBB_LIB_PATH_SUFFIX "lib/intel64/gcc4.4") -+ elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^i.86$") -+ set(TBB_LIB_PATH_SUFFIX "lib/ia32/gcc4.4") -+ endif() -+ endif() -+ -+ ################################## -+ # Find the TBB include dir -+ ################################## -+ -+ find_path(TBB_INCLUDE_DIRS tbb/tbb.h -+ HINTS ${TBB_INCLUDE_DIR} ${TBB_SEARCH_DIR} -+ PATHS ${TBB_DEFAULT_SEARCH_DIR} -+ PATH_SUFFIXES include) -+ -+ ################################## -+ # Set version strings -+ ################################## -+ -+ if(TBB_INCLUDE_DIRS) -+ file(READ "${TBB_INCLUDE_DIRS}/tbb/tbb_stddef.h" _tbb_version_file) -+ string(REGEX REPLACE ".*#define TBB_VERSION_MAJOR ([0-9]+).*" "\\1" -+ TBB_VERSION_MAJOR "${_tbb_version_file}") -+ string(REGEX REPLACE ".*#define TBB_VERSION_MINOR ([0-9]+).*" "\\1" -+ TBB_VERSION_MINOR "${_tbb_version_file}") -+ string(REGEX REPLACE ".*#define TBB_INTERFACE_VERSION ([0-9]+).*" "\\1" -+ TBB_INTERFACE_VERSION "${_tbb_version_file}") -+ set(TBB_VERSION "${TBB_VERSION_MAJOR}.${TBB_VERSION_MINOR}") -+ endif() - --set(_TBB_LIBRARYDIR_SEARCH_DIRS "") -+ ################################## -+ # Find TBB components -+ ################################## - --# Append to _TBB_LIBRARYDIR_SEARCH_DIRS in priority order -+ if(TBB_VERSION VERSION_LESS 4.3) -+ set(TBB_SEARCH_COMPOMPONENTS tbb_preview tbbmalloc tbb) -+ else() -+ set(TBB_SEARCH_COMPOMPONENTS tbb_preview tbbmalloc_proxy tbbmalloc tbb) -+ endif() - --set(_TBB_LIBRARYDIR_SEARCH_DIRS "") --list(APPEND _TBB_LIBRARYDIR_SEARCH_DIRS -- ${TBB_LIBRARYDIR} -- ${_TBB_ROOT_SEARCH_DIR} -- ${PC_Tbb_LIBRARY_DIRS} -- ${SYSTEM_LIBRARY_PATHS} --) -+ if(TBB_STATIC) -+ set(TBB_STATIC_SUFFIX "_static") -+ endif() - --set(TBB_PATH_SUFFIXES -- lib64 -- lib --) -+ # Find each component -+ foreach(_comp ${TBB_SEARCH_COMPOMPONENTS}) -+ if(";${TBB_FIND_COMPONENTS};tbb;" MATCHES ";${_comp};") - --# platform branching -+ unset(TBB_${_comp}_LIBRARY_DEBUG CACHE) -+ unset(TBB_${_comp}_LIBRARY_RELEASE CACHE) -if(UNIX) - list(INSERT TBB_PATH_SUFFIXES 0 lib/x86_64-linux-gnu) -endif() -+ # Search for the libraries -+ find_library(TBB_${_comp}_LIBRARY_RELEASE ${_comp}${TBB_STATIC_SUFFIX} -+ HINTS ${TBB_LIBRARY} ${TBB_SEARCH_DIR} -+ PATHS ${TBB_DEFAULT_SEARCH_DIR} ENV LIBRARY_PATH -+ PATH_SUFFIXES ${TBB_LIB_PATH_SUFFIX}) ++ elseif(CMAKE_SYSTEM_NAME STREQUAL "Darwin") ++ # OS X ++ set(TBB_DEFAULT_SEARCH_DIR "/opt/intel/tbb") -if(APPLE) - if(TBB_FOR_CLANG) @@ -1471,29 +1514,33 @@ index bdf9c81..c6bdec9 100644 - list(GET GCC_VERSION_COMPONENTS 0 GCC_MAJOR) - list(GET GCC_VERSION_COMPONENTS 1 GCC_MINOR) - list(INSERT TBB_PATH_SUFFIXES 0 lib/intel64/gcc${GCC_MAJOR}.${GCC_MINOR}) -- else() ++ # TODO: Check to see which C++ library is being used by the compiler. ++ if(NOT ${CMAKE_SYSTEM_VERSION} VERSION_LESS 13.0) ++ # The default C++ library on OS X 10.9 and later is libc++ ++ set(TBB_LIB_PATH_SUFFIX "lib/libc++" "lib") + else() - list(INSERT TBB_PATH_SUFFIXES 0 lib/intel64/gcc4.4) -- endif() -- endif() ++ set(TBB_LIB_PATH_SUFFIX "lib") ++ endif() ++ elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux") ++ # Linux ++ set(TBB_DEFAULT_SEARCH_DIR "/opt/intel/tbb") ++ ++ # TODO: Check compiler version to see the suffix should be /gcc4.1 or ++ # /gcc4.1. For now, assume that the compiler is more recent than ++ # gcc 4.4.x or later. ++ if(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64") ++ set(TBB_LIB_PATH_SUFFIX "lib/intel64/gcc4.4") ++ elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^i.86$") ++ set(TBB_LIB_PATH_SUFFIX "lib/ia32/gcc4.4") + endif() + endif() -endif() -+ find_library(TBB_${_comp}_LIBRARY_DEBUG ${_comp}${TBB_STATIC_SUFFIX}_debug -+ HINTS ${TBB_LIBRARY} ${TBB_SEARCH_DIR} -+ PATHS ${TBB_DEFAULT_SEARCH_DIR} ENV LIBRARY_PATH -+ PATH_SUFFIXES ${TBB_LIB_PATH_SUFFIX}) - +- -if(UNIX AND TBB_USE_STATIC_LIBS) - set(_TBB_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES}) - set(CMAKE_FIND_LIBRARY_SUFFIXES ".a") -endif() -+ if(TBB_${_comp}_LIBRARY_DEBUG) -+ list(APPEND TBB_LIBRARIES_DEBUG "${TBB_${_comp}_LIBRARY_DEBUG}") -+ endif() -+ if(TBB_${_comp}_LIBRARY_RELEASE) -+ list(APPEND TBB_LIBRARIES_RELEASE "${TBB_${_comp}_LIBRARY_RELEASE}") -+ endif() -+ if(TBB_${_comp}_LIBRARY_${TBB_BUILD_TYPE} AND NOT TBB_${_comp}_LIBRARY) -+ set(TBB_${_comp}_LIBRARY "${TBB_${_comp}_LIBRARY_${TBB_BUILD_TYPE}}") -+ endif() -set(Tbb_LIB_COMPONENTS "") - @@ -1516,39 +1563,44 @@ index bdf9c81..c6bdec9 100644 - # Extract the directory and apply the matched text (in brackets) - get_filename_component(Tbb_${COMPONENT}_DIR "${Tbb_${COMPONENT}_LIBRARY}" DIRECTORY) - set(Tbb_${COMPONENT}_LIBRARY "${Tbb_${COMPONENT}_DIR}/${CMAKE_MATCH_1}") -+ if(TBB_${_comp}_LIBRARY AND EXISTS "${TBB_${_comp}_LIBRARY}") -+ set(TBB_${_comp}_FOUND TRUE) -+ else() -+ set(TBB_${_comp}_FOUND FALSE) - endif() +- endif() +- endif() ++ ################################## ++ # Find the TBB include dir ++ ################################## + -+ # Mark internal variables as advanced -+ mark_as_advanced(TBB_${_comp}_LIBRARY_RELEASE) -+ mark_as_advanced(TBB_${_comp}_LIBRARY_DEBUG) -+ mark_as_advanced(TBB_${_comp}_LIBRARY) ++ find_path(TBB_INCLUDE_DIRS tbb/tbb.h ++ HINTS ${TBB_INCLUDE_DIR} ${TBB_SEARCH_DIR} ++ PATHS ${TBB_DEFAULT_SEARCH_DIR} ++ PATH_SUFFIXES include) + - endif() -- endif() -+ endforeach() ++ ################################## ++ # Set version strings ++ ################################## ++ ++ if(TBB_INCLUDE_DIRS) ++ file(READ "${TBB_INCLUDE_DIRS}/tbb/tbb_stddef.h" _tbb_version_file) ++ string(REGEX REPLACE ".*#define TBB_VERSION_MAJOR ([0-9]+).*" "\\1" ++ TBB_VERSION_MAJOR "${_tbb_version_file}") ++ string(REGEX REPLACE ".*#define TBB_VERSION_MINOR ([0-9]+).*" "\\1" ++ TBB_VERSION_MINOR "${_tbb_version_file}") ++ string(REGEX REPLACE ".*#define TBB_INTERFACE_VERSION ([0-9]+).*" "\\1" ++ TBB_INTERFACE_VERSION "${_tbb_version_file}") ++ set(TBB_VERSION "${TBB_VERSION_MAJOR}.${TBB_VERSION_MINOR}") + endif() - list(APPEND Tbb_LIB_COMPONENTS ${Tbb_${COMPONENT}_LIBRARY}) + ################################## -+ # Set compile flags and libraries ++ # Find TBB components + ################################## - if(Tbb_${COMPONENT}_LIBRARY) - set(TBB_${COMPONENT}_FOUND TRUE) -- else() ++ if(TBB_VERSION VERSION_LESS 4.3) ++ set(TBB_SEARCH_COMPOMPONENTS tbb_preview tbbmalloc tbb) + else() - set(TBB_${COMPONENT}_FOUND FALSE) -+ set(TBB_DEFINITIONS_RELEASE "") -+ set(TBB_DEFINITIONS_DEBUG "TBB_USE_DEBUG=1") -+ -+ if(TBB_LIBRARIES_${TBB_BUILD_TYPE}) -+ set(TBB_LIBRARIES "${TBB_LIBRARIES_${TBB_BUILD_TYPE}}") -+ endif() -+ -+ if(NOT MSVC AND NOT TBB_LIBRARIES) -+ set(TBB_LIBRARIES ${TBB_LIBRARIES_RELEASE}) ++ set(TBB_SEARCH_COMPOMPONENTS tbb_preview tbbmalloc_proxy tbbmalloc tbb) endif() -endforeach() @@ -1556,61 +1608,51 @@ index bdf9c81..c6bdec9 100644 - set(CMAKE_FIND_LIBRARY_SUFFIXES ${_TBB_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES}) - unset(_TBB_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES) -endif() -+ set(TBB_DEFINITIONS "") -+ if (MSVC AND TBB_STATIC) -+ set(TBB_DEFINITIONS __TBB_NO_IMPLICIT_LINKAGE) -+ endif () -+ -+ unset (TBB_STATIC_SUFFIX) -+ -+ find_package_handle_standard_args(TBB -+ REQUIRED_VARS TBB_INCLUDE_DIRS TBB_LIBRARIES -+ FAIL_MESSAGE "TBB library cannot be found. Consider set TBBROOT environment variable." -+ HANDLE_COMPONENTS -+ VERSION_VAR TBB_VERSION) -+ -+ ################################## -+ # Create targets -+ ################################## -+ -+ if(NOT CMAKE_VERSION VERSION_LESS 3.0 AND TBB_FOUND) -+ add_library(TBB::tbb UNKNOWN IMPORTED) -+ set_target_properties(TBB::tbb PROPERTIES -+ INTERFACE_COMPILE_DEFINITIONS "${TBB_DEFINITIONS}" -+ INTERFACE_LINK_LIBRARIES "Threads::Threads;${CMAKE_DL_LIBS}" -+ INTERFACE_INCLUDE_DIRECTORIES ${TBB_INCLUDE_DIRS} -+ IMPORTED_LOCATION ${TBB_LIBRARIES}) -+ if(TBB_LIBRARIES_RELEASE AND TBB_LIBRARIES_DEBUG) -+ set_target_properties(TBB::tbb PROPERTIES -+ INTERFACE_COMPILE_DEFINITIONS "${TBB_DEFINITIONS};$<$,$>:${TBB_DEFINITIONS_DEBUG}>;$<$:${TBB_DEFINITIONS_RELEASE}>" -+ IMPORTED_LOCATION_DEBUG ${TBB_LIBRARIES_DEBUG} -+ IMPORTED_LOCATION_RELWITHDEBINFO ${TBB_LIBRARIES_RELEASE} -+ IMPORTED_LOCATION_RELEASE ${TBB_LIBRARIES_RELEASE} -+ IMPORTED_LOCATION_MINSIZEREL ${TBB_LIBRARIES_RELEASE} -+ ) -+ endif() ++ if(TBB_STATIC) ++ set(TBB_STATIC_SUFFIX "_static") + endif() -# ------------------------------------------------------------------------ -# Cache and set TBB_FOUND -# ------------------------------------------------------------------------ -+ mark_as_advanced(TBB_INCLUDE_DIRS TBB_LIBRARIES) ++ # Find each component ++ foreach(_comp ${TBB_SEARCH_COMPOMPONENTS}) ++ if(";${TBB_FIND_COMPONENTS};tbb;" MATCHES ";${_comp};") + -+ unset(TBB_ARCHITECTURE) -+ unset(TBB_BUILD_TYPE) -+ unset(TBB_LIB_PATH_SUFFIX) -+ unset(TBB_DEFAULT_SEARCH_DIR) ++ unset(TBB_${_comp}_LIBRARY_DEBUG CACHE) ++ unset(TBB_${_comp}_LIBRARY_RELEASE CACHE) + -+ if(TBB_DEBUG) -+ message(STATUS " TBB_FOUND = ${TBB_FOUND}") -+ message(STATUS " TBB_INCLUDE_DIRS = ${TBB_INCLUDE_DIRS}") -+ message(STATUS " TBB_DEFINITIONS = ${TBB_DEFINITIONS}") -+ message(STATUS " TBB_LIBRARIES = ${TBB_LIBRARIES}") -+ message(STATUS " TBB_DEFINITIONS_DEBUG = ${TBB_DEFINITIONS_DEBUG}") -+ message(STATUS " TBB_LIBRARIES_DEBUG = ${TBB_LIBRARIES_DEBUG}") -+ message(STATUS " TBB_DEFINITIONS_RELEASE = ${TBB_DEFINITIONS_RELEASE}") -+ message(STATUS " TBB_LIBRARIES_RELEASE = ${TBB_LIBRARIES_RELEASE}") -+ endif() ++ # Search for the libraries ++ find_library(TBB_${_comp}_LIBRARY_RELEASE ${_comp}${TBB_STATIC_SUFFIX} ++ HINTS ${TBB_LIBRARY} ${TBB_SEARCH_DIR} ++ PATHS ${TBB_DEFAULT_SEARCH_DIR} ENV LIBRARY_PATH ++ PATH_SUFFIXES ${TBB_LIB_PATH_SUFFIX}) ++ ++ find_library(TBB_${_comp}_LIBRARY_DEBUG ${_comp}${TBB_STATIC_SUFFIX}_debug ++ HINTS ${TBB_LIBRARY} ${TBB_SEARCH_DIR} ++ PATHS ${TBB_DEFAULT_SEARCH_DIR} ENV LIBRARY_PATH ++ PATH_SUFFIXES ${TBB_LIB_PATH_SUFFIX}) ++ ++ if(TBB_${_comp}_LIBRARY_DEBUG) ++ list(APPEND TBB_LIBRARIES_DEBUG "${TBB_${_comp}_LIBRARY_DEBUG}") ++ endif() ++ if(TBB_${_comp}_LIBRARY_RELEASE) ++ list(APPEND TBB_LIBRARIES_RELEASE "${TBB_${_comp}_LIBRARY_RELEASE}") ++ endif() ++ if(TBB_${_comp}_LIBRARY_${TBB_BUILD_TYPE} AND NOT TBB_${_comp}_LIBRARY) ++ set(TBB_${_comp}_LIBRARY "${TBB_${_comp}_LIBRARY_${TBB_BUILD_TYPE}}") ++ endif() ++ ++ if(TBB_${_comp}_LIBRARY AND EXISTS "${TBB_${_comp}_LIBRARY}") ++ set(TBB_${_comp}_FOUND TRUE) ++ else() ++ set(TBB_${_comp}_FOUND FALSE) ++ endif() ++ ++ # Mark internal variables as advanced ++ mark_as_advanced(TBB_${_comp}_LIBRARY_RELEASE) ++ mark_as_advanced(TBB_${_comp}_LIBRARY_DEBUG) ++ mark_as_advanced(TBB_${_comp}_LIBRARY) -include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(TBB @@ -1646,10 +1688,79 @@ index bdf9c81..c6bdec9 100644 - INTERFACE_COMPILE_OPTIONS "${Tbb_DEFINITIONS}" - INTERFACE_INCLUDE_DIRECTORIES "${Tbb_INCLUDE_DIR}" - ) -- endif() -- endforeach() + endif() + endforeach() -elseif(TBB_FIND_REQUIRED) - message(FATAL_ERROR "Unable to find TBB") ++ ++ ################################## ++ # Set compile flags and libraries ++ ################################## ++ ++ set(TBB_DEFINITIONS_RELEASE "") ++ set(TBB_DEFINITIONS_DEBUG "TBB_USE_DEBUG=1") ++ ++ if(TBB_LIBRARIES_${TBB_BUILD_TYPE}) ++ set(TBB_LIBRARIES "${TBB_LIBRARIES_${TBB_BUILD_TYPE}}") ++ endif() ++ ++ if(NOT MSVC AND NOT TBB_LIBRARIES) ++ set(TBB_LIBRARIES ${TBB_LIBRARIES_RELEASE}) ++ endif() ++ ++ set(TBB_DEFINITIONS "") ++ if (MSVC AND TBB_STATIC) ++ set(TBB_DEFINITIONS __TBB_NO_IMPLICIT_LINKAGE) ++ endif () ++ ++ unset (TBB_STATIC_SUFFIX) ++ ++ find_package_handle_standard_args(TBB ++ REQUIRED_VARS TBB_INCLUDE_DIRS TBB_LIBRARIES ++ FAIL_MESSAGE "TBB library cannot be found. Consider set TBBROOT environment variable." ++ HANDLE_COMPONENTS ++ VERSION_VAR TBB_VERSION) ++ ++ ################################## ++ # Create targets ++ ################################## ++ ++ if(NOT CMAKE_VERSION VERSION_LESS 3.0 AND TBB_FOUND) ++ add_library(TBB::tbb UNKNOWN IMPORTED) ++ set_target_properties(TBB::tbb PROPERTIES ++ INTERFACE_COMPILE_DEFINITIONS "${TBB_DEFINITIONS}" ++ INTERFACE_LINK_LIBRARIES "Threads::Threads;${CMAKE_DL_LIBS}" ++ INTERFACE_INCLUDE_DIRECTORIES ${TBB_INCLUDE_DIRS} ++ IMPORTED_LOCATION ${TBB_LIBRARIES}) ++ if(TBB_LIBRARIES_RELEASE AND TBB_LIBRARIES_DEBUG) ++ set_target_properties(TBB::tbb PROPERTIES ++ INTERFACE_COMPILE_DEFINITIONS "${TBB_DEFINITIONS};$<$,$>:${TBB_DEFINITIONS_DEBUG}>;$<$:${TBB_DEFINITIONS_RELEASE}>" ++ IMPORTED_LOCATION_DEBUG ${TBB_LIBRARIES_DEBUG} ++ IMPORTED_LOCATION_RELWITHDEBINFO ${TBB_LIBRARIES_RELEASE} ++ IMPORTED_LOCATION_RELEASE ${TBB_LIBRARIES_RELEASE} ++ IMPORTED_LOCATION_MINSIZEREL ${TBB_LIBRARIES_RELEASE} ++ ) ++ endif() ++ endif() ++ ++ mark_as_advanced(TBB_INCLUDE_DIRS TBB_LIBRARIES) ++ ++ unset(TBB_ARCHITECTURE) ++ unset(TBB_BUILD_TYPE) ++ unset(TBB_LIB_PATH_SUFFIX) ++ unset(TBB_DEFAULT_SEARCH_DIR) ++ ++ if(TBB_DEBUG) ++ message(STATUS " TBB_FOUND = ${TBB_FOUND}") ++ message(STATUS " TBB_INCLUDE_DIRS = ${TBB_INCLUDE_DIRS}") ++ message(STATUS " TBB_DEFINITIONS = ${TBB_DEFINITIONS}") ++ message(STATUS " TBB_LIBRARIES = ${TBB_LIBRARIES}") ++ message(STATUS " TBB_DEFINITIONS_DEBUG = ${TBB_DEFINITIONS_DEBUG}") ++ message(STATUS " TBB_LIBRARIES_DEBUG = ${TBB_LIBRARIES_DEBUG}") ++ message(STATUS " TBB_DEFINITIONS_RELEASE = ${TBB_DEFINITIONS_RELEASE}") ++ message(STATUS " TBB_LIBRARIES_RELEASE = ${TBB_LIBRARIES_RELEASE}") ++ endif() ++ endif() diff --git a/openvdb/CMakeLists.txt b/openvdb/CMakeLists.txt index 89301bd..df27aae 100644 @@ -1728,7 +1839,7 @@ index 20ad9a3..c2dd1ef 100644 #endif // _WIN32 diff --git a/openvdb/cmd/CMakeLists.txt b/openvdb/cmd/CMakeLists.txt -index 57fbec0..55b3850 100644 +index 57fbec0..0379756 100644 --- a/openvdb/cmd/CMakeLists.txt +++ b/openvdb/cmd/CMakeLists.txt @@ -74,8 +74,9 @@ if(WIN32) @@ -1750,6 +1861,20 @@ index 57fbec0..55b3850 100644 ) if(OPENVDB_BUILD_CORE) list(APPEND RPATHS ${CMAKE_INSTALL_PREFIX}/lib) +@@ -116,6 +116,13 @@ if(OPENVDB_BUILD_VDB_PRINT) + ) + endif() + ++ include(CheckAtomic) ++ ++ check_working_cxx_atomics(HAS_ATOMIC) ++ if (NOT HAS_ATOMIC) ++ target_link_libraries(vdb_print atomic) ++ endif() ++ + install(TARGETS vdb_print DESTINATION bin) + endif() + diff --git a/openvdb/unittest/CMakeLists.txt b/openvdb/unittest/CMakeLists.txt index c9e0c34..7e261c0 100644 --- a/openvdb/unittest/CMakeLists.txt @@ -1779,5 +1904,5 @@ index df51830..0ab0c12 100644 /// @todo This changes the compressor setting globally. if (blosc_set_compressor(compname) < 0) continue; -- -2.16.2.windows.1 +2.17.1 From 8bf53370c18cd750f0a750d449089efa206ea4bc Mon Sep 17 00:00:00 2001 From: bubnikv Date: Thu, 23 Jan 2020 16:40:18 +0100 Subject: [PATCH 151/336] Bumped up version number 2.2.0-alpha3, so that the updated bundled profiles may require this version (2.2.0-alpha3) or newer. This change is needed for the clients to be forced to update the configurations to see the print bed, as the print bed model and image are no more hard coded, but they are referenced from the vendor specific Preset Bundle. --- resources/profiles/PrusaResearch.idx | 2 ++ resources/profiles/PrusaResearch.ini | 2 +- version.inc | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/resources/profiles/PrusaResearch.idx b/resources/profiles/PrusaResearch.idx index c451bb8bf4..e84d5dd2a6 100644 --- a/resources/profiles/PrusaResearch.idx +++ b/resources/profiles/PrusaResearch.idx @@ -1,3 +1,5 @@ +min_slic3r_version = 2.2.0-alpha3 +1.1.1-alpha3 Print bed textures are now configurable from the Preset Bundle. Requires PrusaSlicer 2.2.0-alpha3 and newer. min_slic3r_version = 2.2.0-alpha0 1.1.1-alpha2 Bumped up config version, so our in house customer will get updated profiles. 1.1.0 Filament aliases, Creality profiles and other goodies for PrusaSlicer 2.2.0-alpha0 diff --git a/resources/profiles/PrusaResearch.ini b/resources/profiles/PrusaResearch.ini index 4f5c0482ba..aa4b7cff07 100644 --- a/resources/profiles/PrusaResearch.ini +++ b/resources/profiles/PrusaResearch.ini @@ -5,7 +5,7 @@ name = Prusa Research # Configuration version of this file. Config file will only be installed, if the config_version differs. # This means, the server may force the PrusaSlicer configuration to be downgraded. -config_version = 1.1.1-alpha2 +config_version = 1.1.1-alpha3 # Where to get the updates from? config_update_url = http://files.prusa3d.com/wp-content/uploads/repository/PrusaSlicer-settings-master/live/PrusaResearch/ changelog_url = http://files.prusa3d.com/?latest=slicer-profiles&lng=%1% diff --git a/version.inc b/version.inc index dbd97b6554..997724f0bf 100644 --- a/version.inc +++ b/version.inc @@ -3,7 +3,7 @@ set(SLIC3R_APP_NAME "PrusaSlicer") set(SLIC3R_APP_KEY "PrusaSlicer") -set(SLIC3R_VERSION "2.2.0-alpha2") +set(SLIC3R_VERSION "2.2.0-alpha3") set(SLIC3R_BUILD_ID "PrusaSlicer-${SLIC3R_VERSION}+UNKNOWN") set(SLIC3R_RC_VERSION "2,2,0,0") set(SLIC3R_RC_VERSION_DOTS "2.2.0.0") From a0e6afcee871d74de2d7dacb1e798215e62646ca Mon Sep 17 00:00:00 2001 From: bubnikv Date: Thu, 23 Jan 2020 16:52:24 +0100 Subject: [PATCH 152/336] Update of PrusaSlicer.idx to force the users of PrusaSlicer 2.2.0-alpha3 and newer to update the profiles to 1.1.1-alpha3 and newer, so they will see the print bed. --- resources/profiles/PrusaResearch.idx | 3 +++ 1 file changed, 3 insertions(+) diff --git a/resources/profiles/PrusaResearch.idx b/resources/profiles/PrusaResearch.idx index e84d5dd2a6..9ac22c59d0 100644 --- a/resources/profiles/PrusaResearch.idx +++ b/resources/profiles/PrusaResearch.idx @@ -1,5 +1,8 @@ min_slic3r_version = 2.2.0-alpha3 1.1.1-alpha3 Print bed textures are now configurable from the Preset Bundle. Requires PrusaSlicer 2.2.0-alpha3 and newer. +# The following line (max_slic3r_version) forces the users of PrusaSlicer 2.2.0-alpha3 and newer to update the profiles to 1.1.1-alpha3 and newer, +# so they will see the print bed. +max_slic3r_version = 2.2.0-alpha2 min_slic3r_version = 2.2.0-alpha0 1.1.1-alpha2 Bumped up config version, so our in house customer will get updated profiles. 1.1.0 Filament aliases, Creality profiles and other goodies for PrusaSlicer 2.2.0-alpha0 From cb39f6b212eab1be2b916fb8f9125a89818b252c Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Thu, 23 Jan 2020 17:19:09 +0100 Subject: [PATCH 153/336] Use CheckAtomic differently --- deps/openvdb-mods.patch | 46 ++++++++++++++++++------------------ src/libslic3r/CMakeLists.txt | 7 ------ 2 files changed, 23 insertions(+), 30 deletions(-) diff --git a/deps/openvdb-mods.patch b/deps/openvdb-mods.patch index c365a43058..d80d0ffde1 100644 --- a/deps/openvdb-mods.patch +++ b/deps/openvdb-mods.patch @@ -1,6 +1,6 @@ -From c660786dbac9e4c284049af4da56c34a998a4b68 Mon Sep 17 00:00:00 2001 +From d359098d9989ac7dbd149611d6ac941529fb4157 Mon Sep 17 00:00:00 2001 From: tamasmeszaros -Date: Thu, 23 Jan 2020 16:27:21 +0100 +Date: Thu, 23 Jan 2020 17:17:36 +0100 Subject: [PATCH] openvdb-mods --- @@ -12,13 +12,13 @@ Subject: [PATCH] openvdb-mods cmake/FindOpenEXR.cmake | 329 ------------------ cmake/FindOpenVDB.cmake | 19 +- cmake/FindTBB.cmake | 599 ++++++++++++++++---------------- - openvdb/CMakeLists.txt | 13 +- + openvdb/CMakeLists.txt | 16 +- openvdb/Grid.cc | 3 + openvdb/PlatformConfig.h | 9 +- - openvdb/cmd/CMakeLists.txt | 11 +- + openvdb/cmd/CMakeLists.txt | 4 +- openvdb/unittest/CMakeLists.txt | 3 +- openvdb/unittest/TestFile.cc | 2 +- - 14 files changed, 446 insertions(+), 1210 deletions(-) + 14 files changed, 442 insertions(+), 1210 deletions(-) create mode 100644 cmake/CheckAtomic.cmake delete mode 100644 cmake/FindBlosc.cmake delete mode 100644 cmake/FindIlmBase.cmake @@ -1763,7 +1763,7 @@ index bdf9c81..06093a4 100644 + endif() diff --git a/openvdb/CMakeLists.txt b/openvdb/CMakeLists.txt -index 89301bd..df27aae 100644 +index 89301bd..6a3c90c 100644 --- a/openvdb/CMakeLists.txt +++ b/openvdb/CMakeLists.txt @@ -78,7 +78,7 @@ else() @@ -1775,7 +1775,21 @@ index 89301bd..df27aae 100644 message(DEPRECATION "Support for TBB versions < ${FUTURE_MINIMUM_TBB_VERSION} " "is deprecated and will be removed.") endif() -@@ -185,11 +185,6 @@ if(WIN32) +@@ -129,10 +129,13 @@ endif() + # include paths from shared installs (including houdini) may pull in the wrong + # headers + ++include (CheckAtomic) ++ + set(OPENVDB_CORE_DEPENDENT_LIBS + Boost::iostreams + Boost::system + IlmBase::Half ++ ${CMAKE_REQUIRED_LIBRARIES} + ) + + if(USE_EXR) +@@ -185,11 +188,6 @@ if(WIN32) endif() endif() @@ -1787,7 +1801,7 @@ index 89301bd..df27aae 100644 ##### Core library configuration set(OPENVDB_LIBRARY_SOURCE_FILES -@@ -374,10 +369,16 @@ set(OPENVDB_LIBRARY_UTIL_INCLUDE_FILES +@@ -374,10 +372,16 @@ set(OPENVDB_LIBRARY_UTIL_INCLUDE_FILES if(OPENVDB_CORE_SHARED) add_library(openvdb_shared SHARED ${OPENVDB_LIBRARY_SOURCE_FILES}) @@ -1839,7 +1853,7 @@ index 20ad9a3..c2dd1ef 100644 #endif // _WIN32 diff --git a/openvdb/cmd/CMakeLists.txt b/openvdb/cmd/CMakeLists.txt -index 57fbec0..0379756 100644 +index 57fbec0..55b3850 100644 --- a/openvdb/cmd/CMakeLists.txt +++ b/openvdb/cmd/CMakeLists.txt @@ -74,8 +74,9 @@ if(WIN32) @@ -1861,20 +1875,6 @@ index 57fbec0..0379756 100644 ) if(OPENVDB_BUILD_CORE) list(APPEND RPATHS ${CMAKE_INSTALL_PREFIX}/lib) -@@ -116,6 +116,13 @@ if(OPENVDB_BUILD_VDB_PRINT) - ) - endif() - -+ include(CheckAtomic) -+ -+ check_working_cxx_atomics(HAS_ATOMIC) -+ if (NOT HAS_ATOMIC) -+ target_link_libraries(vdb_print atomic) -+ endif() -+ - install(TARGETS vdb_print DESTINATION bin) - endif() - diff --git a/openvdb/unittest/CMakeLists.txt b/openvdb/unittest/CMakeLists.txt index c9e0c34..7e261c0 100644 --- a/openvdb/unittest/CMakeLists.txt diff --git a/src/libslic3r/CMakeLists.txt b/src/libslic3r/CMakeLists.txt index e24880ca63..d92bb4cac7 100644 --- a/src/libslic3r/CMakeLists.txt +++ b/src/libslic3r/CMakeLists.txt @@ -265,13 +265,6 @@ target_link_libraries(libslic3r ${CMAKE_DL_LIBS} ) -include(CheckAtomic) - -check_working_cxx_atomics(HAS_ATOMIC) -if (NOT HAS_ATOMIC) - target_link_libraries(libslic3r atomic) -endif() - if (TARGET OpenVDB::openvdb) target_link_libraries(libslic3r OpenVDB::openvdb) endif() From 9989c4858f4238fadbc1561c3a2d76d81d12e321 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Fri, 24 Jan 2020 10:12:37 +0100 Subject: [PATCH 154/336] Fix missing atomic check from FindOpenVDB It has to be re-checked and added as needed to the imported target link-line SPE-1073 --- cmake/modules/FindOpenVDB.cmake | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/cmake/modules/FindOpenVDB.cmake b/cmake/modules/FindOpenVDB.cmake index 3e9e5f082a..b56a7c3ccb 100644 --- a/cmake/modules/FindOpenVDB.cmake +++ b/cmake/modules/FindOpenVDB.cmake @@ -518,12 +518,19 @@ list(REMOVE_DUPLICATES OpenVDB_LIBRARY_DIRS) foreach(COMPONENT ${OpenVDB_FIND_COMPONENTS}) if(NOT TARGET OpenVDB::${COMPONENT}) + if (${COMPONENT} STREQUAL openvdb) + include (${CMAKE_CURRENT_LIST_DIR}/CheckAtomic.cmake) + set(_LINK_LIBS _OPENVDB_VISIBLE_DEPENDENCIES ${CMAKE_REQUIRED_LIBRARIES}) + else () + set(_LINK_LIBS _OPENVDB_VISIBLE_DEPENDENCIES) + endif () + add_library(OpenVDB::${COMPONENT} UNKNOWN IMPORTED) set_target_properties(OpenVDB::${COMPONENT} PROPERTIES INTERFACE_COMPILE_OPTIONS "${OpenVDB_DEFINITIONS}" INTERFACE_INCLUDE_DIRECTORIES "${OpenVDB_INCLUDE_DIR}" IMPORTED_LINK_DEPENDENT_LIBRARIES "${_OPENVDB_HIDDEN_DEPENDENCIES}" # non visible deps - INTERFACE_LINK_LIBRARIES "${_OPENVDB_VISIBLE_DEPENDENCIES}" # visible deps (headers) + INTERFACE_LINK_LIBRARIES "${_LINK_LIBS}" # visible deps (headers) INTERFACE_COMPILE_FEATURES cxx_std_11 IMPORTED_LOCATION "${OpenVDB_${COMPONENT}_LIBRARY}" ) From 6b0af4366540976235a91d1041f075218de1a420 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Thu, 9 Jan 2020 11:19:52 +0100 Subject: [PATCH 155/336] Use mesh boolean in the backend to drill holes. --- src/libslic3r/SLA/Hollowing.cpp | 12 ++------ src/libslic3r/SLAPrint.hpp | 9 +++++- src/libslic3r/SLAPrintSteps.cpp | 52 ++++++++++++++++----------------- src/slic3r/GUI/GLCanvas3D.cpp | 6 ++-- 4 files changed, 39 insertions(+), 40 deletions(-) diff --git a/src/libslic3r/SLA/Hollowing.cpp b/src/libslic3r/SLA/Hollowing.cpp index 1ce0c4c679..ecc42b8890 100644 --- a/src/libslic3r/SLA/Hollowing.cpp +++ b/src/libslic3r/SLA/Hollowing.cpp @@ -123,6 +123,7 @@ Contour3D DrainHole::to_mesh() const Eigen::Quaterniond q; q.setFromTwoVectors(Vec3d{0., 0., 1.}, normal.cast()); for(auto& p : hole.points) p = q * p + pos.cast(); + return hole; } @@ -251,15 +252,8 @@ void cut_drainholes(std::vector & obj_slices, std::function thr) { TriangleMesh mesh; - for (const sla::DrainHole &holept : holes) { - auto r = double(holept.radius); - auto h = double(holept.height); - sla::Contour3D hole = sla::cylinder(r, h); - Eigen::Quaterniond q; - q.setFromTwoVectors(Vec3d{0., 0., 1.}, holept.normal.cast()); - for(auto& p : hole.points) p = q * p + holept.pos.cast(); - mesh.merge(sla::to_triangle_mesh(hole)); - } + for (const sla::DrainHole &holept : holes) + mesh.merge(sla::to_triangle_mesh(holept.to_mesh())); if (mesh.empty()) return; diff --git a/src/libslic3r/SLAPrint.hpp b/src/libslic3r/SLAPrint.hpp index 1b8e18a2a3..20580772ba 100644 --- a/src/libslic3r/SLAPrint.hpp +++ b/src/libslic3r/SLAPrint.hpp @@ -80,6 +80,13 @@ public: // Ready after this->is_step_done(slaposHollowing) is true const TriangleMesh& hollowed_interior_mesh() const; + + // Get the mesh that is going to be printed with all the modifications + // like hollowing and drilled holes. + const TriangleMesh & get_mesh_to_print() const { + bool is_hollowing = m_config.hollowing_enable.getBool() && m_hollowing_data; + return is_hollowing ? m_hollowing_data->hollow_mesh_with_holes : transformed_mesh(); + } // This will return the transformed mesh which is cached const TriangleMesh& transformed_mesh() const; @@ -318,7 +325,7 @@ private: public: TriangleMesh interior; - // std::vector + mutable TriangleMesh hollow_mesh_with_holes; // caching the complete hollowed mesh }; std::unique_ptr m_hollowing_data; diff --git a/src/libslic3r/SLAPrintSteps.cpp b/src/libslic3r/SLAPrintSteps.cpp index 0ae0e66a44..e94110cf68 100644 --- a/src/libslic3r/SLAPrintSteps.cpp +++ b/src/libslic3r/SLAPrintSteps.cpp @@ -1,5 +1,5 @@ #include - +#include // Need the cylinder method for the the drainholes in hollowing step #include @@ -99,6 +99,23 @@ void SLAPrint::Steps::hollow_model(SLAPrintObject &po) if (po.m_hollowing_data->interior.empty()) BOOST_LOG_TRIVIAL(warning) << "Hollowed interior is empty!"; + + auto &hollowed_mesh = po.m_hollowing_data->hollow_mesh_with_holes; + hollowed_mesh = po.transformed_mesh(); + hollowed_mesh.merge(po.m_hollowing_data->interior); + hollowed_mesh.require_shared_vertices(); + + sla::DrainHoles drainholes = po.transformed_drainhole_points(); + + TriangleMesh holes_mesh; + + for (const sla::DrainHole &holept : drainholes) + holes_mesh.merge(sla::to_triangle_mesh(holept.to_mesh())); + + holes_mesh.require_shared_vertices(); + MeshBoolean::minus(hollowed_mesh, holes_mesh); + + hollowed_mesh.require_shared_vertices(); } // The slicing will be performed on an imaginary 1D grid which starts from @@ -111,18 +128,8 @@ void SLAPrint::Steps::hollow_model(SLAPrintObject &po) // same imaginary grid (the height vector argument to TriangleMeshSlicer). void SLAPrint::Steps::slice_model(SLAPrintObject &po) { - TriangleMesh hollowed_mesh; - - bool is_hollowing = po.m_config.hollowing_enable.getBool() && po.m_hollowing_data; - - if (is_hollowing) { - hollowed_mesh = po.transformed_mesh(); - hollowed_mesh.merge(po.m_hollowing_data->interior); - hollowed_mesh.require_shared_vertices(); - } - - const TriangleMesh &mesh = is_hollowing ? hollowed_mesh : po.transformed_mesh(); - + const TriangleMesh &mesh = po.get_mesh_to_print(); + // We need to prepare the slice index... double lhd = m_print->m_objects.front()->m_config.layer_height.getFloat(); @@ -168,8 +175,8 @@ void SLAPrint::Steps::slice_model(SLAPrintObject &po) auto &slice_grid = po.m_model_height_levels; slicer.slice(slice_grid, closing_r, &po.m_model_slices, thr); - sla::DrainHoles drainholes = po.transformed_drainhole_points(); - cut_drainholes(po.m_model_slices, slice_grid, closing_r, drainholes, thr); +// sla::DrainHoles drainholes = po.transformed_drainhole_points(); +// cut_drainholes(po.m_model_slices, slice_grid, closing_r, drainholes, thr); auto mit = slindex_it; double doffs = m_print->m_printer_config.absolute_correction.getFloat(); @@ -199,16 +206,7 @@ void SLAPrint::Steps::support_points(SLAPrintObject &po) // If supports are disabled, we can skip the model scan. if(!po.m_config.supports_enable.getBool()) return; - bool is_hollowing = po.m_config.hollowing_enable.getBool() && po.m_hollowing_data; - - TriangleMesh hollowed_mesh; - if (is_hollowing) { - hollowed_mesh = po.transformed_mesh(); - hollowed_mesh.merge(po.m_hollowing_data->interior); - hollowed_mesh.require_shared_vertices(); - } - - const TriangleMesh &mesh = is_hollowing ? hollowed_mesh : po.transformed_mesh(); + const TriangleMesh &mesh = po.get_mesh_to_print(); if (!po.m_supportdata) po.m_supportdata.reset(new SLAPrintObject::SupportData(mesh)); @@ -229,7 +227,7 @@ void SLAPrint::Steps::support_points(SLAPrintObject &po) // Tell the mesh where drain holes are. Although the points are // calculated on slices, the algorithm then raycasts the points // so they actually lie on the mesh. - po.m_supportdata->emesh.load_holes(po.transformed_drainhole_points()); +// po.m_supportdata->emesh.load_holes(po.transformed_drainhole_points()); throw_if_canceled(); sla::SupportPointGenerator::Config config; @@ -298,7 +296,7 @@ void SLAPrint::Steps::support_tree(SLAPrintObject &po) po.m_supportdata->emesh.ground_level_offset(pcfg.wall_thickness_mm); po.m_supportdata->cfg = make_support_cfg(po.m_config); - po.m_supportdata->emesh.load_holes(po.transformed_drainhole_points()); +// po.m_supportdata->emesh.load_holes(po.transformed_drainhole_points()); // scaling for the sub operations double d = objectstep_scale * OBJ_STEP_LEVELS[slaposSupportTree] / 100.0; diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 2e90a87ee6..8805dc92c8 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -6060,9 +6060,9 @@ void GLCanvas3D::_load_sla_shells() if (obj->is_step_done(slaposSliceSupports)) { unsigned int initial_volumes_count = (unsigned int)m_volumes.volumes.size(); for (const SLAPrintObject::Instance& instance : obj->instances()) { - add_volume(*obj, 0, instance, obj->transformed_mesh(), GLVolume::MODEL_COLOR[0], true); - if (! obj->hollowed_interior_mesh().empty()) - add_volume(*obj, -int(slaposHollowing), instance, obj->hollowed_interior_mesh(), GLVolume::MODEL_COLOR[0], false); + add_volume(*obj, 0, instance, obj->get_mesh_to_print(), GLVolume::MODEL_COLOR[0], true); +// if (! obj->hollowed_interior_mesh().empty()) +// add_volume(*obj, -int(slaposHollowing), instance, obj->hollowed_interior_mesh(), GLVolume::MODEL_COLOR[0], false); // Set the extruder_id and volume_id to achieve the same color as in the 3D scene when // through the update_volumes_colors_by_extruder() call. m_volumes.volumes.back()->extruder_id = obj->model_object()->volumes.front()->extruder_id(); From 022cc0871a0b8ce43d82a93e115d58f7a13990d3 Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Wed, 22 Jan 2020 17:26:13 +0100 Subject: [PATCH 156/336] Allowed to do drilling without hollowing --- src/libslic3r/SLAPrint.hpp | 3 +- src/libslic3r/SLAPrintSteps.cpp | 85 +++++++++++++++++++-------------- 2 files changed, 50 insertions(+), 38 deletions(-) diff --git a/src/libslic3r/SLAPrint.hpp b/src/libslic3r/SLAPrint.hpp index 20580772ba..771ca0bcd6 100644 --- a/src/libslic3r/SLAPrint.hpp +++ b/src/libslic3r/SLAPrint.hpp @@ -84,8 +84,7 @@ public: // Get the mesh that is going to be printed with all the modifications // like hollowing and drilled holes. const TriangleMesh & get_mesh_to_print() const { - bool is_hollowing = m_config.hollowing_enable.getBool() && m_hollowing_data; - return is_hollowing ? m_hollowing_data->hollow_mesh_with_holes : transformed_mesh(); + return m_hollowing_data ? m_hollowing_data->hollow_mesh_with_holes : transformed_mesh(); } // This will return the transformed mesh which is cached diff --git a/src/libslic3r/SLAPrintSteps.cpp b/src/libslic3r/SLAPrintSteps.cpp index e94110cf68..f781814ae6 100644 --- a/src/libslic3r/SLAPrintSteps.cpp +++ b/src/libslic3r/SLAPrintSteps.cpp @@ -38,7 +38,7 @@ const std::array OBJ_STEP_LEVELS = { std::string OBJ_STEP_LABELS(size_t idx) { switch (idx) { - case slaposHollowing: return L("Hollowing out the model"); + case slaposHollowing: return L("Hollowing and drilling holes"); case slaposObjectSlice: return L("Slicing model"); case slaposDrillHolesIfHollowed: return L("Drilling holes into hollowed model."); case slaposSupportPoints: return L("Generating support points"); @@ -79,43 +79,56 @@ SLAPrint::Steps::Steps(SLAPrint *print) void SLAPrint::Steps::hollow_model(SLAPrintObject &po) { - if (!po.m_config.hollowing_enable.getBool()) { - BOOST_LOG_TRIVIAL(info) << "Skipping hollowing step!"; - po.m_hollowing_data.reset(); - return; - } else { + po.m_hollowing_data.reset(); + if (! po.m_config.hollowing_enable.getBool()) + BOOST_LOG_TRIVIAL(info) << "Skipping hollowing step!"; + else { BOOST_LOG_TRIVIAL(info) << "Performing hollowing step!"; + + double thickness = po.m_config.hollowing_min_thickness.getFloat(); + double quality = po.m_config.hollowing_quality.getFloat(); + double closing_d = po.m_config.hollowing_closing_distance.getFloat(); + sla::HollowingConfig hlwcfg{thickness, quality, closing_d}; + auto meshptr = generate_interior(po.transformed_mesh(), hlwcfg); + + if (meshptr->empty()) + BOOST_LOG_TRIVIAL(warning) << "Hollowed interior is empty!"; + else { + po.m_hollowing_data.reset(new SLAPrintObject::HollowingData()); + po.m_hollowing_data->interior = *meshptr; + auto &hollowed_mesh = po.m_hollowing_data->hollow_mesh_with_holes; + hollowed_mesh = po.transformed_mesh(); + hollowed_mesh.merge(po.m_hollowing_data->interior); + hollowed_mesh.require_shared_vertices(); + } + } + + // Drill holes into the hollowed/original mesh. + if (po.m_model_object->sla_drain_holes.empty()) + BOOST_LOG_TRIVIAL(info) << "Drilling skipped (no holes)."; + else { + BOOST_LOG_TRIVIAL(info) << "Drilling drainage holes."; + sla::DrainHoles drainholes = po.transformed_drainhole_points(); + + TriangleMesh holes_mesh; + + for (const sla::DrainHole &holept : drainholes) + holes_mesh.merge(sla::to_triangle_mesh(holept.to_mesh())); + + holes_mesh.require_shared_vertices(); + MeshBoolean::self_union(holes_mesh); //FIXME-fix and use the cgal version + + // If there is no hollowed mesh yet, copy the original mesh. + if (! po.m_hollowing_data) { + po.m_hollowing_data.reset(new SLAPrintObject::HollowingData()); + po.m_hollowing_data->hollow_mesh_with_holes = po.transformed_mesh(); + } + + TriangleMesh &hollowed_mesh = po.m_hollowing_data->hollow_mesh_with_holes; + hollowed_mesh = po.get_mesh_to_print(); + MeshBoolean::cgal::minus(hollowed_mesh, holes_mesh); + hollowed_mesh.require_shared_vertices(); } - - if (!po.m_hollowing_data) - po.m_hollowing_data.reset(new SLAPrintObject::HollowingData()); - - double thickness = po.m_config.hollowing_min_thickness.getFloat(); - double quality = po.m_config.hollowing_quality.getFloat(); - double closing_d = po.m_config.hollowing_closing_distance.getFloat(); - sla::HollowingConfig hlwcfg{thickness, quality, closing_d}; - auto meshptr = generate_interior(po.transformed_mesh(), hlwcfg); - if (meshptr) po.m_hollowing_data->interior = *meshptr; - - if (po.m_hollowing_data->interior.empty()) - BOOST_LOG_TRIVIAL(warning) << "Hollowed interior is empty!"; - - auto &hollowed_mesh = po.m_hollowing_data->hollow_mesh_with_holes; - hollowed_mesh = po.transformed_mesh(); - hollowed_mesh.merge(po.m_hollowing_data->interior); - hollowed_mesh.require_shared_vertices(); - - sla::DrainHoles drainholes = po.transformed_drainhole_points(); - - TriangleMesh holes_mesh; - - for (const sla::DrainHole &holept : drainholes) - holes_mesh.merge(sla::to_triangle_mesh(holept.to_mesh())); - - holes_mesh.require_shared_vertices(); - MeshBoolean::minus(hollowed_mesh, holes_mesh); - - hollowed_mesh.require_shared_vertices(); } // The slicing will be performed on an imaginary 1D grid which starts from From d58ee47e4dd1e2b59210829c4d4477d2166cc9bb Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Thu, 23 Jan 2020 12:14:43 +0100 Subject: [PATCH 157/336] Fixed incorrect hole normal transformation when the object is anisotropically scaled --- src/libslic3r/SLAPrint.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/libslic3r/SLAPrint.cpp b/src/libslic3r/SLAPrint.cpp index 4d34c09c7b..6b691681d7 100644 --- a/src/libslic3r/SLAPrint.cpp +++ b/src/libslic3r/SLAPrint.cpp @@ -1182,11 +1182,18 @@ sla::DrainHoles SLAPrintObject::transformed_drainhole_points() const assert(m_model_object != nullptr); auto pts = m_model_object->sla_drain_holes; auto tr = trafo().cast(); + auto sc = m_model_object->instances.front()->get_scaling_factor().cast(); for (sla::DrainHole &hl : pts) { hl.pos = tr * hl.pos; hl.normal = tr * hl.normal - tr.translation(); + + // The normal scales as a covector (and we must also + // undo the damage already done). + hl.normal = Vec3f(hl.normal(0)/(sc(0)*sc(0)), + hl.normal(1)/(sc(1)*sc(1)), + hl.normal(2)/(sc(2)*sc(2))); } - + return pts; } From 1c0aedbbe57c86fb05baec6c830a75aa41393373 Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Thu, 23 Jan 2020 11:22:06 +0100 Subject: [PATCH 158/336] Hollowing gizmo can now trigger the backend calculation --- src/libslic3r/SLAPrint.cpp | 4 ++++ src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp | 8 ++++++-- src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp | 2 +- src/slic3r/GUI/Plater.cpp | 12 +++++++++++- src/slic3r/GUI/Plater.hpp | 3 +++ 5 files changed, 25 insertions(+), 4 deletions(-) diff --git a/src/libslic3r/SLAPrint.cpp b/src/libslic3r/SLAPrint.cpp index 6b691681d7..4c10a44fae 100644 --- a/src/libslic3r/SLAPrint.cpp +++ b/src/libslic3r/SLAPrint.cpp @@ -1119,6 +1119,10 @@ TriangleMesh SLAPrintObject::get_mesh(SLAPrintObjectStep step) const return this->support_mesh(); case slaposPad: return this->pad_mesh(); + case slaposHollowing: + if (m_hollowing_data) + return m_hollowing_data->hollow_mesh_with_holes; + [[fallthrough]]; default: return TriangleMesh(); } diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp index d02fdd0776..0422982745 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp @@ -608,10 +608,14 @@ void GLGizmoHollow::update_mesh_raycaster(std::unique_ptr &&rc) m_c->m_volume_with_cavity.reset(); } -void GLGizmoHollow::hollow_mesh() +void GLGizmoHollow::hollow_mesh(bool postpone_error_messages) { // Trigger a UI job to hollow the mesh. - wxGetApp().plater()->hollow(); + // wxGetApp().plater()->hollow(); + + wxGetApp().CallAfter([this, postpone_error_messages]() { + wxGetApp().plater()->reslice_SLA_hollowing(*m_c->m_model_object, postpone_error_messages); + }); } diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp index f6560c861e..79b0a69297 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp @@ -55,7 +55,7 @@ private: void render_hollowed_mesh() const; bool is_mesh_update_necessary() const; void update_mesh(); - void hollow_mesh(); + void hollow_mesh(bool postpone_error_messages = false); bool unsaved_changes() const; bool m_show_supports = true; diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 6d869baaa2..37ea24a16c 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -5099,6 +5099,16 @@ void Plater::reslice() } void Plater::reslice_SLA_supports(const ModelObject &object, bool postpone_error_messages) +{ + reslice_SLA_until_step(slaposPad, object, postpone_error_messages); +} + +void Plater::reslice_SLA_hollowing(const ModelObject &object, bool postpone_error_messages) +{ + reslice_SLA_until_step(slaposHollowing, object, postpone_error_messages); +} + +void Plater::reslice_SLA_until_step(SLAPrintObjectStep step, const ModelObject &object, bool postpone_error_messages) { //FIXME Don't reslice if export of G-code or sending to OctoPrint is running. // bitmask of UpdateBackgroundProcessReturnState @@ -5117,7 +5127,7 @@ void Plater::reslice_SLA_supports(const ModelObject &object, bool postpone_error // Otherwise calculate everything, but start with the provided object. if (!this->p->background_processing_enabled()) { task.single_model_instance_only = true; - task.to_object_step = slaposPad; + task.to_object_step = step; } this->p->background_process.set_task(task); // and let the background processing start. diff --git a/src/slic3r/GUI/Plater.hpp b/src/slic3r/GUI/Plater.hpp index c03813a9ca..9639a16932 100644 --- a/src/slic3r/GUI/Plater.hpp +++ b/src/slic3r/GUI/Plater.hpp @@ -26,6 +26,7 @@ class Model; class ModelObject; class Print; class SLAPrint; +enum SLAPrintObjectStep : unsigned int; namespace UndoRedo { class Stack; @@ -197,6 +198,8 @@ public: void hollow(); void reslice(); void reslice_SLA_supports(const ModelObject &object, bool postpone_error_messages = false); + void reslice_SLA_hollowing(const ModelObject &object, bool postpone_error_messages = false); + void reslice_SLA_until_step(SLAPrintObjectStep step, const ModelObject &object, bool postpone_error_messages = false); void changed_object(int obj_idx); void changed_objects(const std::vector& object_idxs); void schedule_background_process(bool schedule = true); From cb3ad0a422b17336255118a2b9e6e5b1605443d2 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Fri, 24 Jan 2020 11:35:38 +0100 Subject: [PATCH 159/336] Updated tooltips for DoubleSlider *partially related to #3543 --- src/slic3r/GUI/DoubleSlider.cpp | 91 ++++++++++++++++++++++++--------- src/slic3r/GUI/DoubleSlider.hpp | 4 +- 2 files changed, 69 insertions(+), 26 deletions(-) diff --git a/src/slic3r/GUI/DoubleSlider.cpp b/src/slic3r/GUI/DoubleSlider.cpp index a47d6706c2..695ad71788 100644 --- a/src/slic3r/GUI/DoubleSlider.cpp +++ b/src/slic3r/GUI/DoubleSlider.cpp @@ -555,15 +555,8 @@ void Control::draw_ticks(wxDC& dc) // Draw icon for "Pause print" or "Custom Gcode" if (tick.gcode != ColorChangeCode && tick.gcode != ToolChangeCode) icon = create_scaled_bitmap(this, tick.gcode == PausePrintCode ? "pause_print" : "edit_gcode"); - else - { - if ((tick.gcode == ColorChangeCode && ( - (m_ticks.mode == t_mode::SingleExtruder && m_mode == t_mode::MultiExtruder ) || - (m_ticks.mode == t_mode::MultiExtruder && m_mode == t_mode::SingleExtruder) )) || - (tick.gcode == ToolChangeCode && - (m_ticks.mode == t_mode::MultiAsSingle && m_mode != t_mode::MultiAsSingle ) )) + else if (m_ticks.is_conflict_tick(tick, m_mode)) icon = create_scaled_bitmap(this, "error_tick"); - } if (!icon.IsNull()) { @@ -753,7 +746,7 @@ bool Control::is_point_in_rect(const wxPoint& pt, const wxRect& rect) rect.GetTop() <= pt.y && pt.y <= rect.GetBottom(); } -int Control::is_point_near_tick(const wxPoint& pt) +int Control::get_tick_near_point(const wxPoint& pt) { for (auto tick : m_ticks.ticks) { const wxCoord pos = get_position_from_value(tick.tick); @@ -833,7 +826,7 @@ void Control::OnLeftDown(wxMouseEvent& event) detect_selected_slider(pos); if (!m_selection) { - const int tick_val = is_point_near_tick(pos); + const int tick_val = get_tick_near_point(pos); /* Set current thumb position to the nearest tick (if it is) * OR to a value corresponding to the mouse click * */ @@ -896,20 +889,59 @@ wxString Control::get_tooltip(IconFocus icon_focus) { const int tick = m_selection == ssLower ? m_lower_value : m_higher_value; const auto tick_code_it = m_ticks.ticks.find(TickCode{tick}); - tooltip = tick_code_it == m_ticks.ticks.end() ? (m_mode == t_mode::MultiAsSingle ? - _(L("For add change extruder use left mouse button click")) : - _(L("For add color change use left mouse button click")) ) + "\n" + - _(L("For add another code use right mouse button click")) : - tick_code_it->gcode == ColorChangeCode ? ( m_mode == t_mode::SingleExtruder ? - _(L("For Delete color change use left mouse button click\n" - "For Edit color use right mouse button click")) : - from_u8((boost::format(_utf8(L("Delete color change for Extruder %1%"))) % tick_code_it->extruder).str()) ): - tick_code_it->gcode == PausePrintCode ? - _(L("Delete pause")) : - tick_code_it->gcode == ToolChangeCode ? - from_u8((boost::format(_utf8(L("Delete extruder change to \"%1%\""))) % tick_code_it->extruder).str()) : - from_u8((boost::format(_utf8(L("For Delete \"%1%\" code use left mouse button click\n" - "For Edit \"%1%\" code use right mouse button click"))) % tick_code_it->gcode ).str()); + + /* Note: just on OSX!!! + * Right click event causes a little scrolling. + * So, as a workaround we use Ctrl+LeftMouseClick instead of RightMouseClick + * Show this information in tooltip + * */ + + if (tick_code_it == m_ticks.ticks.end()) // tick doesn't exist + { + // Show mode as a first string of tooltop + tooltip = " " + _(L("Slider(print) mode")) + ": "; + tooltip += (m_mode == t_mode::SingleExtruder ? CustomGCode::SingleExtruderMode : + m_mode == t_mode::MultiAsSingle ? CustomGCode::MultiAsSingleMode : + CustomGCode::MultiExtruderMode ); + tooltip += "\n\n"; + + // Show list of actions with new tick + tooltip += ( m_mode == t_mode::MultiAsSingle ? + _(L("For add change extruder use left mouse button click")) : + _(L("For add color change use left mouse button click")) ) + " " + + _(L("OR pres \"+\" key")) + "\n" + ( + is_osx ? + _(L("For add another code use Ctrl + Left mouse button click")) : + _(L("For add another code use right mouse button click")) ); + } + else // tick exists + { + // Show custom Gcode as a first string of tooltop + tooltip = " "; + tooltip += tick_code_it->gcode == ColorChangeCode ? ( + m_mode == t_mode::SingleExtruder ? + from_u8((boost::format(_utf8(L("Color change (\"%1%\")"))) % tick_code_it->gcode ).str()) : + from_u8((boost::format(_utf8(L("Color change (\"%1%\") for Extruder %2%"))) % + tick_code_it->gcode % tick_code_it->extruder).str()) ) : + tick_code_it->gcode == PausePrintCode ? + from_u8((boost::format(_utf8(L("Pause print (\"%1%\")"))) % tick_code_it->gcode ).str()) : + tick_code_it->gcode == ToolChangeCode ? + from_u8((boost::format(_utf8(L("Extruder(tool) is changed to Extruder \"%1%\""))) % tick_code_it->extruder ).str()) : + from_u8((boost::format(_utf8(L("\"%1%\""))) % tick_code_it->gcode ).str()) ; + + // If tick is marked as a conflict (exclamation icon), + // we should to explain why + if (m_ticks.is_conflict_tick(*tick_code_it, m_mode)) + tooltip += "\n" + _(L("Note")) + "! " + + _(L("G-code of this tick has a conflict with slider(print) mode.")) + "\n" + + _(L("Any its editing will cause a changes of DoubleSlider data.")); + + // Show list of actions with existing tick + tooltip += "\n\n" + _(L("For Delete tick use left mouse button click OR pres \"-\" key")) + "\n" + ( + is_osx ? + _(L("For Edit tick use Ctrl + Left mouse button click")) : + _(L("For Edit tick use right mouse button click")) ); + } } return tooltip; @@ -1220,7 +1252,7 @@ std::array Control::get_active_extruders_for_tick(int tick) const auto it = m_ticks.ticks.lower_bound(TickCode{tick}); - if (it->tick == tick) // current tick exists + if (it != m_ticks.ticks.end() && it->tick == tick) // current tick exists extruders[1] = it->extruder; while (it != m_ticks.ticks.begin()) { @@ -1759,6 +1791,15 @@ bool TickCodeInfo::has_tick_with_code(const std::string& gcode) return false; } +bool TickCodeInfo::is_conflict_tick(const TickCode& tick, t_mode out_mode) +{ + return (tick.gcode == ColorChangeCode && ( + (mode == t_mode::SingleExtruder && out_mode == t_mode::MultiExtruder ) || + (mode == t_mode::MultiExtruder && out_mode == t_mode::SingleExtruder) )) || + (tick.gcode == ToolChangeCode && + (mode == t_mode::MultiAsSingle && out_mode != t_mode::MultiAsSingle)); +} + } // DoubleSlider } // Slic3r diff --git a/src/slic3r/GUI/DoubleSlider.hpp b/src/slic3r/GUI/DoubleSlider.hpp index 02a98ebb21..c2c88f5982 100644 --- a/src/slic3r/GUI/DoubleSlider.hpp +++ b/src/slic3r/GUI/DoubleSlider.hpp @@ -73,7 +73,9 @@ public: void switch_code(const std::string& code_from, const std::string& code_to); bool switch_code_for_tick(std::set::iterator it, const std::string& code_to, const int extruder); void erase_all_ticks_with_code(const std::string& gcode); + bool has_tick_with_code(const std::string& gcode); + bool is_conflict_tick(const TickCode& tick, t_mode out_mode); void suppress_plus (bool suppress) { m_suppress_plus = suppress; } void suppress_minus(bool suppress) { m_suppress_minus = suppress; } @@ -230,7 +232,7 @@ protected: private: bool is_point_in_rect(const wxPoint& pt, const wxRect& rect); - int is_point_near_tick(const wxPoint& pt); + int get_tick_near_point(const wxPoint& pt); double get_scroll_step(); wxString get_label(const SelectedSlider& selection) const; From e05d38bdd0c44067f8b3e8791988ac0fd90a318b Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Fri, 24 Jan 2020 12:35:26 +0100 Subject: [PATCH 160/336] Fix the previous fix --- cmake/modules/FindOpenVDB.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/modules/FindOpenVDB.cmake b/cmake/modules/FindOpenVDB.cmake index b56a7c3ccb..48f0d6655b 100644 --- a/cmake/modules/FindOpenVDB.cmake +++ b/cmake/modules/FindOpenVDB.cmake @@ -520,7 +520,7 @@ foreach(COMPONENT ${OpenVDB_FIND_COMPONENTS}) if(NOT TARGET OpenVDB::${COMPONENT}) if (${COMPONENT} STREQUAL openvdb) include (${CMAKE_CURRENT_LIST_DIR}/CheckAtomic.cmake) - set(_LINK_LIBS _OPENVDB_VISIBLE_DEPENDENCIES ${CMAKE_REQUIRED_LIBRARIES}) + set(_LINK_LIBS ${_OPENVDB_VISIBLE_DEPENDENCIES} ${CMAKE_REQUIRED_LIBRARIES}) else () set(_LINK_LIBS _OPENVDB_VISIBLE_DEPENDENCIES) endif () From 71ebb0f2c6b78004670c24c95b831c831b454b6f Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Fri, 24 Jan 2020 12:59:26 +0100 Subject: [PATCH 161/336] Removed duplicate definition in Preset::sla_printer_options() --- src/slic3r/GUI/Preset.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/slic3r/GUI/Preset.cpp b/src/slic3r/GUI/Preset.cpp index e22675869a..d67abd13bb 100644 --- a/src/slic3r/GUI/Preset.cpp +++ b/src/slic3r/GUI/Preset.cpp @@ -550,7 +550,6 @@ const std::vector& Preset::sla_printer_options() s_opts = { "printer_technology", "bed_shape", "bed_custom_texture", "bed_custom_model", "max_print_height", - "bed_shape", "max_print_height", "display_width", "display_height", "display_pixels_x", "display_pixels_y", "display_mirror_x", "display_mirror_y", "display_orientation", From c6a2b694195a7faa5e03081ba01e388e40a0637a Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Fri, 24 Jan 2020 13:41:37 +0100 Subject: [PATCH 162/336] 32 bit MSVC workaround for CGAL --- src/libslic3r/CMakeLists.txt | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/libslic3r/CMakeLists.txt b/src/libslic3r/CMakeLists.txt index 6d5b3e5f56..0bad50abe3 100644 --- a/src/libslic3r/CMakeLists.txt +++ b/src/libslic3r/CMakeLists.txt @@ -233,12 +233,17 @@ cmake_policy(SET CMP0011 NEW) find_package(CGAL REQUIRED) cmake_policy(POP) +set(_cgal_defines "") +if (MSVC AND "${CMAKE_SIZEOF_VOID_P}" STREQUAL "4") # 32 bit MSVC workaround + set(_cgal_defines CGAL_DO_NOT_USE_MPZF) +endif () + add_library(libslic3r_cgal OBJECT MeshBoolean.cpp MeshBoolean.hpp) target_include_directories(libslic3r_cgal PRIVATE ${CMAKE_CURRENT_BINARY_DIR} $ $) -target_compile_definitions(libslic3r_cgal PRIVATE +target_compile_definitions(libslic3r_cgal PRIVATE ${_cgal_defines} $) target_compile_options(libslic3r_cgal PRIVATE $) From 7591637c89991198dfe3c7c487f279fa6216ad7a Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Fri, 24 Jan 2020 14:26:05 +0100 Subject: [PATCH 163/336] Bugfixes and refactoring for SLA backend remove duplicate code Mark conversion constructors of EigenMesh3D `explicit` Working on mesh simplification for hollowed interior Fix bug SPE-1074: crash with empty supports and disabled pad. fix regression after refactor Remove unfinished code Fix missing includes and dumb comments --- src/libslic3r/MTUtils.hpp | 90 +++--- src/libslic3r/SLA/Common.cpp | 52 ++- src/libslic3r/SLA/EigenMesh3D.hpp | 14 +- src/libslic3r/SLA/SupportTreeBuildsteps.cpp | 340 ++++++++++---------- src/libslic3r/SLA/SupportTreeBuildsteps.hpp | 16 +- src/libslic3r/SLAPrint.cpp | 2 - src/libslic3r/SLAPrint.hpp | 4 +- src/libslic3r/SLAPrintSteps.cpp | 37 ++- src/libslic3r/SimplifyMeshImpl.hpp | 3 +- 9 files changed, 299 insertions(+), 259 deletions(-) diff --git a/src/libslic3r/MTUtils.hpp b/src/libslic3r/MTUtils.hpp index 63ff6fb09d..3402d2c856 100644 --- a/src/libslic3r/MTUtils.hpp +++ b/src/libslic3r/MTUtils.hpp @@ -252,46 +252,6 @@ template struct remove_cvref template using remove_cvref_t = typename remove_cvref::type; -template using DefaultContainer = std::vector; - -/// Exactly like Matlab https://www.mathworks.com/help/matlab/ref/linspace.html -template class Container = DefaultContainer> -inline Container> linspace(const T &start, - const T &stop, - const I &n) -{ - Container> vals(n, T()); - - T stride = (stop - start) / n; - size_t i = 0; - std::generate(vals.begin(), vals.end(), [&i, start, stride] { - return start + i++ * stride; - }); - - return vals; -} - -/// A set of equidistant values starting from 'start' (inclusive), ending -/// in the closest multiple of 'stride' less than or equal to 'end' and -/// leaving 'stride' space between each value. -/// Very similar to Matlab [start:stride:end] notation. -template class Container = DefaultContainer> -inline Container> grid(const T &start, - const T &stop, - const T &stride) -{ - Container> - vals(size_t(std::ceil((stop - start) / stride)), T()); - - int i = 0; - std::generate(vals.begin(), vals.end(), [&i, start, stride] { - return start + i++ * stride; - }); - - return vals; -} - - // A shorter C++14 style form of the enable_if metafunction template using enable_if_t = typename std::enable_if::type; @@ -392,6 +352,56 @@ inline IntegerOnly> reserve_vector(I capacity) return ret; } +/// Exactly like Matlab https://www.mathworks.com/help/matlab/ref/linspace.html +template +inline std::vector linspace_vector(const ArithmeticOnly &start, + const T &stop, + const IntegerOnly &n) +{ + std::vector vals(n, T()); + + T stride = (stop - start) / n; + size_t i = 0; + std::generate(vals.begin(), vals.end(), [&i, start, stride] { + return start + i++ * stride; + }); + + return vals; +} + +template +inline std::array, N> linspace_array(const T &start, const T &stop) +{ + std::array vals = {T()}; + + T stride = (stop - start) / N; + size_t i = 0; + std::generate(vals.begin(), vals.end(), [&i, start, stride] { + return start + i++ * stride; + }); + + return vals; +} + +/// A set of equidistant values starting from 'start' (inclusive), ending +/// in the closest multiple of 'stride' less than or equal to 'end' and +/// leaving 'stride' space between each value. +/// Very similar to Matlab [start:stride:end] notation. +template +inline std::vector> grid(const T &start, + const T &stop, + const T &stride) +{ + std::vector vals(size_t(std::ceil((stop - start) / stride)), T()); + + int i = 0; + std::generate(vals.begin(), vals.end(), [&i, start, stride] { + return start + i++ * stride; + }); + + return vals; +} + } // namespace Slic3r #endif // MTUTILS_HPP diff --git a/src/libslic3r/SLA/Common.cpp b/src/libslic3r/SLA/Common.cpp index 3d31c55226..d2aac18fda 100644 --- a/src/libslic3r/SLA/Common.cpp +++ b/src/libslic3r/SLA/Common.cpp @@ -26,6 +26,7 @@ #include #include #include +#include #include #ifdef _MSC_VER #pragma warning(pop) @@ -194,17 +195,12 @@ public: #endif /* SLIC3R_SLA_NEEDS_WINDTREE */ }; -EigenMesh3D::EigenMesh3D(const TriangleMesh& tmesh): m_aabb(new AABBImpl()) { - static const double dEPS = 1e-6; - +static const constexpr double MESH_EPS = 1e-6; + +void to_eigen_mesh(const TriangleMesh &tmesh, Eigen::MatrixXd &V, Eigen::MatrixXi &F) +{ const stl_file& stl = tmesh.stl; - auto&& bb = tmesh.bounding_box(); - m_ground_level += bb.min(Z); - - Eigen::MatrixXd V; - Eigen::MatrixXi F; - V.resize(3*stl.stats.number_of_facets, 3); F.resize(stl.stats.number_of_facets, 3); for (unsigned int i = 0; i < stl.stats.number_of_facets; ++i) { @@ -217,9 +213,37 @@ EigenMesh3D::EigenMesh3D(const TriangleMesh& tmesh): m_aabb(new AABBImpl()) { F(i, 2) = int(3*i+2); } - // We will convert this to a proper 3d mesh with no duplicate points. - Eigen::VectorXi SVI, SVJ; - igl::remove_duplicate_vertices(V, F, dEPS, m_V, SVI, SVJ, m_F); + if (!tmesh.has_shared_vertices()) + { + Eigen::MatrixXd rV; + Eigen::MatrixXi rF; + // We will convert this to a proper 3d mesh with no duplicate points. + Eigen::VectorXi SVI, SVJ; + igl::remove_duplicate_vertices(V, F, MESH_EPS, rV, SVI, SVJ, rF); + V = std::move(rV); + F = std::move(rF); + } +} + +void to_triangle_mesh(const Eigen::MatrixXd &V, const Eigen::MatrixXi &F, TriangleMesh &out) +{ + Pointf3s points(size_t(V.rows())); + std::vector facets(size_t(F.rows())); + + for (Eigen::Index i = 0; i < V.rows(); ++i) + points[size_t(i)] = V.row(i); + + for (Eigen::Index i = 0; i < F.rows(); ++i) + facets[size_t(i)] = F.row(i); + + out = {points, facets}; +} + +EigenMesh3D::EigenMesh3D(const TriangleMesh& tmesh): m_aabb(new AABBImpl()) { + auto&& bb = tmesh.bounding_box(); + m_ground_level += bb.min(Z); + + to_eigen_mesh(tmesh, m_V, m_F); // Build the AABB accelaration tree m_aabb->init(m_V, m_F); @@ -262,6 +286,10 @@ EigenMesh3D &EigenMesh3D::operator=(const EigenMesh3D &other) m_aabb.reset(new AABBImpl(*other.m_aabb)); return *this; } +EigenMesh3D &EigenMesh3D::operator=(EigenMesh3D &&other) = default; + +EigenMesh3D::EigenMesh3D(EigenMesh3D &&other) = default; + EigenMesh3D::hit_result EigenMesh3D::query_ray_hit(const Vec3d &s, const Vec3d &dir) const { diff --git a/src/libslic3r/SLA/EigenMesh3D.hpp b/src/libslic3r/SLA/EigenMesh3D.hpp index 8d5b3b8dfd..e8b869bb46 100644 --- a/src/libslic3r/SLA/EigenMesh3D.hpp +++ b/src/libslic3r/SLA/EigenMesh3D.hpp @@ -12,6 +12,9 @@ namespace sla { struct Contour3D; +void to_eigen_mesh(const TriangleMesh &mesh, Eigen::MatrixXd &V, Eigen::MatrixXi &F); +void to_triangle_mesh(const Eigen::MatrixXd &V, const Eigen::MatrixXi &F, TriangleMesh &); + /// An index-triangle structure for libIGL functions. Also serves as an /// alternative (raw) input format for the SLASupportTree. // Implemented in libslic3r/SLA/Common.cpp @@ -30,11 +33,15 @@ class EigenMesh3D { public: - EigenMesh3D(const TriangleMesh&); + explicit EigenMesh3D(const TriangleMesh&); + explicit EigenMesh3D(const Contour3D &other); + EigenMesh3D(const EigenMesh3D& other); - EigenMesh3D(const Contour3D &other); EigenMesh3D& operator=(const EigenMesh3D&); + EigenMesh3D(EigenMesh3D &&other); + EigenMesh3D& operator=(EigenMesh3D &&other); + ~EigenMesh3D(); inline double ground_level() const { return m_ground_level + m_gnd_offset; } @@ -70,9 +77,6 @@ public: inline bool is_valid() const { return m_mesh != nullptr; } inline bool is_hit() const { return !std::isinf(m_t); } - // Hit_result can decay into a double as the hit distance. - inline operator double() const { return distance(); } - inline const Vec3d& normal() const { assert(is_valid()); return m_normal; diff --git a/src/libslic3r/SLA/SupportTreeBuildsteps.cpp b/src/libslic3r/SLA/SupportTreeBuildsteps.cpp index 45fef58cd0..5d60d75136 100644 --- a/src/libslic3r/SLA/SupportTreeBuildsteps.cpp +++ b/src/libslic3r/SLA/SupportTreeBuildsteps.cpp @@ -166,190 +166,182 @@ bool SupportTreeBuildsteps::execute(SupportTreeBuilder & builder, return pc == ABORT; } +// Give points on a 3D ring with given center, radius and orientation +// method based on: +// https://math.stackexchange.com/questions/73237/parametric-equation-of-a-circle-in-3d-space +template +class PointRing { + std::array m_phis; + + // Two vectors that will be perpendicular to each other and to the + // axis. Values for a(X) and a(Y) are now arbitrary, a(Z) is just a + // placeholder. + // a and b vectors are perpendicular to the ring direction and to each other. + // Together they define the plane where we have to iterate with the + // given angles in the 'm_phis' vector + Vec3d a = {0, 1, 0}, b; + double m_radius = 0.; + + static inline bool constexpr is_one(double val) + { + return std::abs(std::abs(val) - 1) < 1e-20; + } + +public: + + PointRing(const Vec3d &n) + { + m_phis = linspace_array(0., 2 * PI); + + // We have to address the case when the direction vector v (same as + // dir) is coincident with one of the world axes. In this case two of + // its components will be completely zero and one is 1.0. Our method + // becomes dangerous here due to division with zero. Instead, vector + // 'a' can be an element-wise rotated version of 'v' + if(is_one(n(X)) || is_one(n(Y)) || is_one(n(Z))) { + a = {n(Z), n(X), n(Y)}; + b = {n(Y), n(Z), n(X)}; + } + else { + a(Z) = -(n(Y)*a(Y)) / n(Z); a.normalize(); + b = a.cross(n); + } + } + + Vec3d get(size_t idx, const Vec3d src, double r) const + { + double phi = m_phis[idx]; + double sinphi = std::sin(phi); + double cosphi = std::cos(phi); + + double rpscos = r * cosphi; + double rpssin = r * sinphi; + + // Point on the sphere + return {src(X) + rpscos * a(X) + rpssin * b(X), + src(Y) + rpscos * a(Y) + rpssin * b(Y), + src(Z) + rpscos * a(Z) + rpssin * b(Z)}; + } +}; + +template +static Hit min_hit(const C &hits) +{ + auto mit = std::min_element(hits.begin(), hits.end(), + [](const Hit &h1, const Hit &h2) { + return h1.distance() < h2.distance(); + }); + + return *mit; +} + EigenMesh3D::hit_result SupportTreeBuildsteps::pinhead_mesh_intersect( const Vec3d &s, const Vec3d &dir, double r_pin, double r_back, double width) { static const size_t SAMPLES = 8; - // method based on: - // https://math.stackexchange.com/questions/73237/parametric-equation-of-a-circle-in-3d-space + // Move away slightly from the touching point to avoid raycasting on the + // inner surface of the mesh. + + const double& sd = m_cfg.safety_distance_mm; + + auto& m = m_mesh; + using HitResult = EigenMesh3D::hit_result; + + // Hit results + std::array hits; + + struct Rings { + double rpin; + double rback; + Vec3d spin; + Vec3d sback; + PointRing ring; + + Vec3d backring(size_t idx) { return ring.get(idx, sback, rback); } + Vec3d pinring(size_t idx) { return ring.get(idx, spin, rpin); } + } rings {r_pin + sd, r_back + sd, s, s + width * dir, dir}; // We will shoot multiple rays from the head pinpoint in the direction // of the pinhead robe (side) surface. The result will be the smallest // hit distance. - // Move away slightly from the touching point to avoid raycasting on the - // inner surface of the mesh. - Vec3d v = dir; // Our direction (axis) - Vec3d c = s + width * dir; - const double& sd = m_cfg.safety_distance_mm; + ccr::enumerate(hits.begin(), hits.end(), + [&m, &rings, sd](HitResult &hit, size_t i) { - // Two vectors that will be perpendicular to each other and to the - // axis. Values for a(X) and a(Y) are now arbitrary, a(Z) is just a - // placeholder. - Vec3d a(0, 1, 0), b; + // Point on the circle on the pin sphere + Vec3d ps = rings.pinring(i); + // This is the point on the circle on the back sphere + Vec3d p = rings.backring(i); + + // Point ps is not on mesh but can be inside or + // outside as well. This would cause many problems + // with ray-casting. To detect the position we will + // use the ray-casting result (which has an is_inside + // predicate). - // The portions of the circle (the head-back circle) for which we will - // shoot rays. - std::array phis; - for(size_t i = 0; i < phis.size(); ++i) phis[i] = i*2*PI/phis.size(); + Vec3d n = (p - ps).normalized(); + auto q = m.query_ray_hit(ps + sd * n, n); - auto& m = m_mesh; - using HitResult = EigenMesh3D::hit_result; + if (q.is_inside()) { // the hit is inside the model + if (q.distance() > rings.rpin) { + // If we are inside the model and the hit + // distance is bigger than our pin circle + // diameter, it probably indicates that the + // support point was already inside the + // model, or there is really no space + // around the point. We will assign a zero + // hit distance to these cases which will + // enforce the function return value to be + // an invalid ray with zero hit distance. + // (see min_element at the end) + hit = HitResult(0.0); + } else { + // re-cast the ray from the outside of the + // object. The starting point has an offset + // of 2*safety_distance because the + // original ray has also had an offset + auto q2 = m.query_ray_hit(ps + (q.distance() + 2 * sd) * n, n); + hit = q2; + } + } else + hit = q; + }); - // Hit results - std::array hits; - - // We have to address the case when the direction vector v (same as - // dir) is coincident with one of the world axes. In this case two of - // its components will be completely zero and one is 1.0. Our method - // becomes dangerous here due to division with zero. Instead, vector - // 'a' can be an element-wise rotated version of 'v' - auto chk1 = [] (double val) { - return std::abs(std::abs(val) - 1) < 1e-20; - }; - - if(chk1(v(X)) || chk1(v(Y)) || chk1(v(Z))) { - a = {v(Z), v(X), v(Y)}; - b = {v(Y), v(Z), v(X)}; - } - else { - a(Z) = -(v(Y)*a(Y)) / v(Z); a.normalize(); - b = a.cross(v); - } - - // Now a and b vectors are perpendicular to v and to each other. - // Together they define the plane where we have to iterate with the - // given angles in the 'phis' vector - ccr::enumerate( - phis.begin(), phis.end(), - [&hits, &m, sd, r_pin, r_back, s, a, b, c](double phi, size_t i) { - double sinphi = std::sin(phi); - double cosphi = std::cos(phi); - - // Let's have a safety coefficient for the radiuses. - double rpscos = (sd + r_pin) * cosphi; - double rpssin = (sd + r_pin) * sinphi; - double rpbcos = (sd + r_back) * cosphi; - double rpbsin = (sd + r_back) * sinphi; - - // Point on the circle on the pin sphere - Vec3d ps(s(X) + rpscos * a(X) + rpssin * b(X), - s(Y) + rpscos * a(Y) + rpssin * b(Y), - s(Z) + rpscos * a(Z) + rpssin * b(Z)); - - // Point ps is not on mesh but can be inside or - // outside as well. This would cause many problems - // with ray-casting. To detect the position we will - // use the ray-casting result (which has an is_inside - // predicate). - - // This is the point on the circle on the back sphere - Vec3d p(c(X) + rpbcos * a(X) + rpbsin * b(X), - c(Y) + rpbcos * a(Y) + rpbsin * b(Y), - c(Z) + rpbcos * a(Z) + rpbsin * b(Z)); - - Vec3d n = (p - ps).normalized(); - auto q = m.query_ray_hit(ps + sd * n, n); - - if (q.is_inside()) { // the hit is inside the model - if (q.distance() > r_pin + sd) { - // If we are inside the model and the hit - // distance is bigger than our pin circle - // diameter, it probably indicates that the - // support point was already inside the - // model, or there is really no space - // around the point. We will assign a zero - // hit distance to these cases which will - // enforce the function return value to be - // an invalid ray with zero hit distance. - // (see min_element at the end) - hits[i] = HitResult(0.0); - } else { - // re-cast the ray from the outside of the - // object. The starting point has an offset - // of 2*safety_distance because the - // original ray has also had an offset - auto q2 = m.query_ray_hit( - ps + (q.distance() + 2 * sd) * n, n); - hits[i] = q2; - } - } else - hits[i] = q; - }); - - auto mit = std::min_element(hits.begin(), hits.end()); - - return *mit; + return min_hit(hits); } EigenMesh3D::hit_result SupportTreeBuildsteps::bridge_mesh_intersect( - const Vec3d &s, const Vec3d &dir, double r, bool ins_check) + const Vec3d &src, const Vec3d &dir, double r, bool ins_check) { static const size_t SAMPLES = 8; + PointRing ring{dir}; - // helper vector calculations - Vec3d a(0, 1, 0), b; - const double& sd = m_cfg.safety_distance_mm; - - // INFO: for explanation of the method used here, see the previous - // method's comments. - - auto chk1 = [] (double val) { - return std::abs(std::abs(val) - 1) < 1e-20; - }; - - if(chk1(dir(X)) || chk1(dir(Y)) || chk1(dir(Z))) { - a = {dir(Z), dir(X), dir(Y)}; - b = {dir(Y), dir(Z), dir(X)}; - } - else { - a(Z) = -(dir(Y)*a(Y)) / dir(Z); a.normalize(); - b = a.cross(dir); - } - - // circle portions - std::array phis; - for(size_t i = 0; i < phis.size(); ++i) phis[i] = i*2*PI/phis.size(); - - auto& m = m_mesh; - using HitResult = EigenMesh3D::hit_result; + using Hit = EigenMesh3D::hit_result; // Hit results - std::array hits; + std::array hits; - ccr::enumerate( - phis.begin(), phis.end(), - [&m, a, b, sd, dir, r, s, ins_check, &hits] (double phi, size_t i) { - double sinphi = std::sin(phi); - double cosphi = std::cos(phi); - - // Let's have a safety coefficient for the radiuses. - double rcos = (sd + r) * cosphi; - double rsin = (sd + r) * sinphi; - - // Point on the circle on the pin sphere - Vec3d p (s(X) + rcos * a(X) + rsin * b(X), - s(Y) + rcos * a(Y) + rsin * b(Y), - s(Z) + rcos * a(Z) + rsin * b(Z)); - - auto hr = m.query_ray_hit(p + sd*dir, dir); - - if(ins_check && hr.is_inside()) { - if(hr.distance() > 2 * r + sd) hits[i] = HitResult(0.0); - else { - // re-cast the ray from the outside of the object - auto hr2 = - m.query_ray_hit(p + (hr.distance() + 2*sd)*dir, dir); - - hits[i] = hr2; - } - } else hits[i] = hr; - }); + ccr::enumerate(hits.begin(), hits.end(), + [this, r, src, ins_check, &ring, dir] (Hit &hit, size_t i) { + + const double sd = m_cfg.safety_distance_mm; + + // Point on the circle on the pin sphere + Vec3d p = ring.get(i, src, r + sd); + + auto hr = m_mesh.query_ray_hit(p + sd * dir, dir); + + if(ins_check && hr.is_inside()) { + if(hr.distance() > 2 * r + sd) hit = Hit(0.0); + else { + // re-cast the ray from the outside of the object + hit = m_mesh.query_ray_hit(p + (hr.distance() + 2 * sd) * dir, dir); + } + } else hit = hr; + }); - auto mit = std::min_element(hits.begin(), hits.end()); - - return *mit; + return min_hit(hits); } bool SupportTreeBuildsteps::interconnect(const Pillar &pillar, @@ -419,7 +411,7 @@ bool SupportTreeBuildsteps::interconnect(const Pillar &pillar, // TODO: This is a workaround to not have a faulty last bridge while(ej(Z) >= eupper(Z) /*endz*/) { - if(bridge_mesh_intersect(sj, dirv(sj, ej), pillar.r) >= bridge_distance) + if(bridge_mesh_distance(sj, dirv(sj, ej), pillar.r) >= bridge_distance) { m_builder.add_crossbridge(sj, ej, pillar.r); was_connected = true; @@ -430,7 +422,7 @@ bool SupportTreeBuildsteps::interconnect(const Pillar &pillar, Vec3d sjback(ej(X), ej(Y), sj(Z)); Vec3d ejback(sj(X), sj(Y), ej(Z)); if (sjback(Z) <= slower(Z) && ejback(Z) >= eupper(Z) && - bridge_mesh_intersect(sjback, dirv(sjback, ejback), + bridge_mesh_distance(sjback, dirv(sjback, ejback), pillar.r) >= bridge_distance) { // need to check collision for the cross stick m_builder.add_crossbridge(sjback, ejback, pillar.r); @@ -487,7 +479,7 @@ bool SupportTreeBuildsteps::connect_to_nearpillar(const Head &head, bridgestart(Z) -= zdiff; touchjp(Z) = Zdown; - double t = bridge_mesh_intersect(headjp, {0,0,-1}, r); + double t = bridge_mesh_distance(headjp, DOWN, r); // We can't insert a pillar under the source head to connect // with the nearby pillar's starting junction @@ -505,8 +497,7 @@ bool SupportTreeBuildsteps::connect_to_nearpillar(const Head &head, double minz = m_builder.ground_level + 2 * m_cfg.head_width_mm; if(bridgeend(Z) < minz) return false; - double t = bridge_mesh_intersect(bridgestart, - dirv(bridgestart, bridgeend), r); + double t = bridge_mesh_distance(bridgestart, dirv(bridgestart, bridgeend), r); // Cannot insert the bridge. (further search might not worth the hassle) if(t < distance(bridgestart, bridgeend)) return false; @@ -633,7 +624,7 @@ void SupportTreeBuildsteps::create_ground_pillar(const Vec3d &jp, }; // We have to check if the bridge is feasible. - if (bridge_mesh_intersect(jp, dir, radius) < (endp - jp).norm()) + if (bridge_mesh_distance(jp, dir, radius) < (endp - jp).norm()) abort_in_shame(); else { // If the new endpoint is below ground, do not make a pillar @@ -764,7 +755,7 @@ void SupportTreeBuildsteps::filter() { auto dir = spheric_to_dir(plr, azm).normalized(); - double score = pinhead_mesh_intersect( + double score = pinhead_mesh_distance( hp, dir, pin_r, m_cfg.head_back_radius_mm, w); return score; @@ -950,11 +941,11 @@ bool SupportTreeBuildsteps::connect_to_ground(Head &head, const Vec3d &dir) { auto hjp = head.junction_point(); double r = head.r_back_mm; - double t = bridge_mesh_intersect(hjp, dir, head.r_back_mm); + double t = bridge_mesh_distance(hjp, dir, head.r_back_mm); double d = 0, tdown = 0; t = std::min(t, m_cfg.max_bridge_length_mm); - while (d < t && !std::isinf(tdown = bridge_mesh_intersect(hjp + d * dir, DOWN, r))) + while (d < t && !std::isinf(tdown = bridge_mesh_distance(hjp + d * dir, DOWN, r))) d += r; if(!std::isinf(tdown)) return false; @@ -989,7 +980,7 @@ bool SupportTreeBuildsteps::connect_to_ground(Head &head) auto oresult = solver.optimize_max( [this, hjp, r_back](double plr, double azm) { Vec3d n = spheric_to_dir(plr, azm).normalized(); - return bridge_mesh_intersect(hjp, n, r_back); + return bridge_mesh_distance(hjp, n, r_back); }, initvals(polar, azimuth), // let's start with what we have bound(3*PI/4, PI), // Must not exceed the slope limit @@ -1259,9 +1250,8 @@ void SupportTreeBuildsteps::interconnect_pillars() m_pillar_index.insert(pp.endpoint(), unsigned(pp.id)); m_builder.add_junction(s, pillar().r); - double t = bridge_mesh_intersect(pillarsp, - dirv(pillarsp, s), - pillar().r); + double t = bridge_mesh_distance(pillarsp, dirv(pillarsp, s), + pillar().r); if (distance(pillarsp, s) < t) m_builder.add_bridge(pillarsp, s, pillar().r); @@ -1312,8 +1302,8 @@ void SupportTreeBuildsteps::routing_headless() Vec3d sj = sp + R * n; // stick start point // This is only for checking - double idist = bridge_mesh_intersect(sph, DOWN, R, true); - double realdist = ray_mesh_intersect(sj, DOWN); + double idist = bridge_mesh_distance(sph, DOWN, R, true); + double realdist = ray_mesh_intersect(sj, DOWN).distance(); double dist = realdist; if (std::isinf(dist)) dist = sph(Z) - m_builder.ground_level; diff --git a/src/libslic3r/SLA/SupportTreeBuildsteps.hpp b/src/libslic3r/SLA/SupportTreeBuildsteps.hpp index 9533049b60..cfe78fe97a 100644 --- a/src/libslic3r/SLA/SupportTreeBuildsteps.hpp +++ b/src/libslic3r/SLA/SupportTreeBuildsteps.hpp @@ -206,10 +206,10 @@ class SupportTreeBuildsteps { // When bridging heads to pillars... TODO: find a cleaner solution ccr::BlockingMutex m_bridge_mutex; - inline double ray_mesh_intersect(const Vec3d& s, - const Vec3d& dir) + inline EigenMesh3D::hit_result ray_mesh_intersect(const Vec3d& s, + const Vec3d& dir) { - return m_mesh.query_ray_hit(s, dir).distance(); + return m_mesh.query_ray_hit(s, dir); } // This function will test if a future pinhead would not collide with the @@ -229,6 +229,11 @@ class SupportTreeBuildsteps { double r_pin, double r_back, double width); + + template + inline double pinhead_mesh_distance(Args&&...args) { + return pinhead_mesh_intersect(std::forward(args)...).distance(); + } // Checking bridge (pillar and stick as well) intersection with the model. // If the function is used for headless sticks, the ins_check parameter @@ -243,6 +248,11 @@ class SupportTreeBuildsteps { const Vec3d& dir, double r, bool ins_check = false); + + template + inline double bridge_mesh_distance(Args&&...args) { + return bridge_mesh_intersect(std::forward(args)...).distance(); + } // Helper function for interconnecting two pillars with zig-zag bridges. bool interconnect(const Pillar& pillar, const Pillar& nextpillar); diff --git a/src/libslic3r/SLAPrint.cpp b/src/libslic3r/SLAPrint.cpp index 4c10a44fae..ac3652fee7 100644 --- a/src/libslic3r/SLAPrint.cpp +++ b/src/libslic3r/SLAPrint.cpp @@ -1095,8 +1095,6 @@ const ExPolygons &SliceRecord::get_slice(SliceOrigin o) const const std::vector& v = o == soModel? m_po->get_model_slices() : m_po->get_support_slices(); - if(idx >= v.size()) return EMPTY_SLICE; - return idx >= v.size() ? EMPTY_SLICE : v[idx]; } diff --git a/src/libslic3r/SLAPrint.hpp b/src/libslic3r/SLAPrint.hpp index 771ca0bcd6..ab1685ff89 100644 --- a/src/libslic3r/SLAPrint.hpp +++ b/src/libslic3r/SLAPrint.hpp @@ -138,9 +138,9 @@ public: // Returns the current layer height float layer_height() const { return m_height; } - bool is_valid() const { return ! std::isnan(m_slice_z); } + bool is_valid() const { return m_po && ! std::isnan(m_slice_z); } - const SLAPrintObject* print_obj() const { assert(m_po); return m_po; } + const SLAPrintObject* print_obj() const { return m_po; } // Methods for setting the indices into the slice vectors. void set_model_slice_idx(const SLAPrintObject &po, size_t id) { diff --git a/src/libslic3r/SLAPrintSteps.cpp b/src/libslic3r/SLAPrintSteps.cpp index f781814ae6..1ecefe2842 100644 --- a/src/libslic3r/SLAPrintSteps.cpp +++ b/src/libslic3r/SLAPrintSteps.cpp @@ -465,14 +465,16 @@ static ClipperPolygons polydiff(const ClipperPolygons &subjects, const ClipperPo } // get polygons for all instances in the object -static ClipperPolygons get_all_polygons( - const ExPolygons & input_polygons, - const std::vector &instances, - bool is_lefthanded) +static ClipperPolygons get_all_polygons(const SliceRecord& record, SliceOrigin o) { namespace sl = libnest2d::sl; + if (!record.print_obj()) return {}; + ClipperPolygons polygons; + auto &input_polygons = record.get_slice(o); + auto &instances = record.print_obj()->instances(); + bool is_lefthanded = record.print_obj()->is_left_handed(); polygons.reserve(input_polygons.size() * instances.size()); for (const ExPolygon& polygon : input_polygons) { @@ -545,6 +547,12 @@ void SLAPrint::Steps::initialize_printer_input() coord_t gndlvl = o->get_slice_index().front().print_level() - ilhs; for(const SliceRecord& slicerecord : o->get_slice_index()) { + if (!slicerecord.is_valid()) + throw std::runtime_error( + L("There are unprintable objects. Try to " + "adjust support settings to make the " + "objects printable.")); + coord_t lvlid = slicerecord.print_level() - gndlvl; // Neat trick to round the layer levels to the grid. @@ -647,22 +655,13 @@ void SLAPrint::Steps::merge_slices_and_eval_stats() { supports_polygons.reserve(c); for(const SliceRecord& record : layer.slices()) { - const SLAPrintObject *po = record.print_obj(); - const ExPolygons &modelslices = record.get_slice(soModel); - - bool is_lefth = record.print_obj()->is_left_handed(); - if (!modelslices.empty()) { - ClipperPolygons v = get_all_polygons(modelslices, po->instances(), is_lefth); - for(ClipperPolygon& p_tmp : v) model_polygons.emplace_back(std::move(p_tmp)); - } - - const ExPolygons &supportslices = record.get_slice(soSupport); - - if (!supportslices.empty()) { - ClipperPolygons v = get_all_polygons(supportslices, po->instances(), is_lefth); - for(ClipperPolygon& p_tmp : v) supports_polygons.emplace_back(std::move(p_tmp)); - } + ClipperPolygons modelslices = get_all_polygons(record, soModel); + for(ClipperPolygon& p_tmp : modelslices) model_polygons.emplace_back(std::move(p_tmp)); + + ClipperPolygons supportslices = get_all_polygons(record, soSupport); + for(ClipperPolygon& p_tmp : supportslices) supports_polygons.emplace_back(std::move(p_tmp)); + } model_polygons = polyunion(model_polygons); diff --git a/src/libslic3r/SimplifyMeshImpl.hpp b/src/libslic3r/SimplifyMeshImpl.hpp index 6add08930c..94056192ad 100644 --- a/src/libslic3r/SimplifyMeshImpl.hpp +++ b/src/libslic3r/SimplifyMeshImpl.hpp @@ -21,6 +21,7 @@ #include #include #include +#include #ifndef NDEBUG #include @@ -63,7 +64,7 @@ namespace implementation { template using enable_if_t = typename std::enable_if::type; -// Meta predicates for floating, 'scaled coord' and generic arithmetic types +// Meta predicates for floating, integer and generic arithmetic types template using FloatingOnly = enable_if_t::value, O>; From 743a03a8c25aba07f19eaa2436bbde2a30b5535b Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Thu, 23 Jan 2020 17:41:20 +0100 Subject: [PATCH 164/336] append full config to sla zipped ini SPE-1081 --- src/libslic3r/SLA/RasterWriter.cpp | 42 +++++++++++++++++++++++------- 1 file changed, 33 insertions(+), 9 deletions(-) diff --git a/src/libslic3r/SLA/RasterWriter.cpp b/src/libslic3r/SLA/RasterWriter.cpp index 238120dda0..79063d9a1b 100644 --- a/src/libslic3r/SLA/RasterWriter.cpp +++ b/src/libslic3r/SLA/RasterWriter.cpp @@ -1,3 +1,5 @@ +#include + #include #include "libslic3r/PrintConfig.hpp" @@ -89,19 +91,41 @@ std::string get_cfg_value(const DynamicPrintConfig &cfg, const std::string &key) return ret; } +void append_full_config(const DynamicPrintConfig &cfg, std::map &keys) +{ + using namespace std::literals::string_view_literals; + + // Sorted list of config keys, which shall not be stored into the G-code. Initializer list. + static constexpr auto banned_keys = { + "compatible_printers"sv, + "compatible_prints"sv, + "print_host"sv, + "printhost_apikey"sv, + "printhost_cafile"sv + }; + + assert(std::is_sorted(banned_keys.begin(), banned_keys.end())); + auto is_banned = [](const std::string &key) { + return std::binary_search(banned_keys.begin(), banned_keys.end(), key); + }; + for (const std::string &key : cfg.keys()) + if (! is_banned(key) && ! cfg.option(key)->is_nil()) + keys[key] = cfg.opt_serialize(key); +} + } // namespace void RasterWriter::set_config(const DynamicPrintConfig &cfg) { - m_config["layerHeight"] = get_cfg_value(cfg, "layer_height"); - m_config["expTime"] = get_cfg_value(cfg, "exposure_time"); - m_config["expTimeFirst"] = get_cfg_value(cfg, "initial_exposure_time"); - m_config["materialName"] = get_cfg_value(cfg, "sla_material_settings_id"); - m_config["printerModel"] = get_cfg_value(cfg, "printer_model"); - m_config["printerVariant"] = get_cfg_value(cfg, "printer_variant"); - m_config["printerProfile"] = get_cfg_value(cfg, "printer_settings_id"); - m_config["printProfile"] = get_cfg_value(cfg, "sla_print_settings_id"); - +// m_config["layerHeight"] = get_cfg_value(cfg, "layer_height"); +// m_config["expTime"] = get_cfg_value(cfg, "exposure_time"); +// m_config["expTimeFirst"] = get_cfg_value(cfg, "initial_exposure_time"); +// m_config["materialName"] = get_cfg_value(cfg, "sla_material_settings_id"); +// m_config["printerModel"] = get_cfg_value(cfg, "printer_model"); +// m_config["printerVariant"] = get_cfg_value(cfg, "printer_variant"); +// m_config["printerProfile"] = get_cfg_value(cfg, "printer_settings_id"); +// m_config["printProfile"] = get_cfg_value(cfg, "sla_print_settings_id"); + append_full_config(cfg, m_config); m_config["fileCreationTimestamp"] = Utils::utc_timestamp(); m_config["prusaSlicerVersion"] = SLIC3R_BUILD_ID; } From d937ac1ed3d71b4f59e63b5d13a4e0abea3aee69 Mon Sep 17 00:00:00 2001 From: bubnikv Date: Fri, 24 Jan 2020 15:16:28 +0100 Subject: [PATCH 165/336] Forcing a print bed update after config or config bundle is loaded. The solution is hackish, but a major refactoring would be needed to avoid multiple refreshes of the print bed, and to avoid expensive checks at Plater::on_config_change() every time a config value changes at a parameter tab. --- src/slic3r/GUI/GUI_App.cpp | 5 ++++- src/slic3r/GUI/Plater.cpp | 12 +++++++----- src/slic3r/GUI/Plater.hpp | 2 +- src/slic3r/GUI/PresetBundle.hpp | 3 +-- 4 files changed, 13 insertions(+), 9 deletions(-) diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index 9574cdb8e1..c6f5cfb47f 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -960,8 +960,11 @@ void GUI_App::load_current_presets() this->plater()->set_printer_technology(printer_technology); for (Tab *tab : tabs_list) if (tab->supports_printer_technology(printer_technology)) { - if (tab->type() == Preset::TYPE_PRINTER) + if (tab->type() == Preset::TYPE_PRINTER) { static_cast(tab)->update_pages(); + // Mark the plater to update print bed by tab->load_current_preset() from Plater::on_config_change(). + this->plater()->force_print_bed_update(); + } tab->load_current_preset(); } } diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 37ea24a16c..b6ea8cbc30 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -5376,6 +5376,13 @@ void Plater::force_filament_colors_update() this->p->schedule_background_process(); } +void Plater::force_print_bed_update() +{ + // Fill in the printer model key with something which cannot possibly be valid, so that Plater::on_config_change() will update the print bed + // once a new Printer profile config is loaded. + p->config->opt_string("printer_model", true) = "\x01\x00\x01"; +} + void Plater::on_activate() { #ifdef __linux__ @@ -5392,11 +5399,6 @@ void Plater::on_activate() this->p->show_delayed_error_message(); } -const DynamicPrintConfig* Plater::get_plater_config() const -{ - return p->config; -} - // Get vector of extruder colors considering filament color, if extruder color is undefined. std::vector Plater::get_extruder_colors_from_plater_config() const { diff --git a/src/slic3r/GUI/Plater.hpp b/src/slic3r/GUI/Plater.hpp index 9639a16932..0d50629931 100644 --- a/src/slic3r/GUI/Plater.hpp +++ b/src/slic3r/GUI/Plater.hpp @@ -227,9 +227,9 @@ public: void on_extruders_change(size_t extruders_count); void on_config_change(const DynamicPrintConfig &config); void force_filament_colors_update(); + void force_print_bed_update(); // On activating the parent window. void on_activate(); - const DynamicPrintConfig* get_plater_config() const; std::vector get_extruder_colors_from_plater_config() const; std::vector get_colors_for_color_print() const; diff --git a/src/slic3r/GUI/PresetBundle.hpp b/src/slic3r/GUI/PresetBundle.hpp index ff27d0023d..037c47c5ff 100644 --- a/src/slic3r/GUI/PresetBundle.hpp +++ b/src/slic3r/GUI/PresetBundle.hpp @@ -54,8 +54,7 @@ public: // There will be an entry for each system profile loaded, // and the system profiles will point to the VendorProfile instances owned by PresetBundle::vendors. - // std::set vendors; - VendorMap vendors; + VendorMap vendors; struct ObsoletePresets { std::vector prints; From 848fe4750fb4bca13e7789a7210a41da96caca18 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Fri, 24 Jan 2020 15:23:59 +0100 Subject: [PATCH 166/336] Add prusaslicer.ini to sl1 output zip --- src/libslic3r/SLA/RasterWriter.cpp | 40 ++++++++++++++++++------------ src/libslic3r/SLA/RasterWriter.hpp | 4 ++- 2 files changed, 27 insertions(+), 17 deletions(-) diff --git a/src/libslic3r/SLA/RasterWriter.cpp b/src/libslic3r/SLA/RasterWriter.cpp index 79063d9a1b..13aef7d8a3 100644 --- a/src/libslic3r/SLA/RasterWriter.cpp +++ b/src/libslic3r/SLA/RasterWriter.cpp @@ -14,14 +14,16 @@ namespace Slic3r { namespace sla { -std::string RasterWriter::createIniContent(const std::string& projectname) const +void RasterWriter::write_ini(const std::map &m, std::string &ini) +{ + for (auto ¶m : m) ini += param.first + " = " + param.second + "\n"; +} + +std::string RasterWriter::create_ini_content(const std::string& projectname) const { std::string out("action = print\njobDir = "); out += projectname + "\n"; - - for (auto ¶m : m_config) - out += param.first + " = " + param.second + "\n"; - + write_ini(m_config, out); return out; } @@ -55,7 +57,12 @@ void RasterWriter::save(Zipper &zipper, const std::string &prjname) zipper.add_entry("config.ini"); - zipper << createIniContent(project); + zipper << create_ini_content(project); + + zipper.add_entry("prusaslicer.ini"); + std::string prusaslicer_ini; + write_ini(m_slicer_config, prusaslicer_ini); + zipper << prusaslicer_ini; for(unsigned i = 0; i < m_layers_rst.size(); i++) { @@ -95,7 +102,7 @@ void append_full_config(const DynamicPrintConfig &cfg, std::mapis_nil()) keys[key] = cfg.opt_serialize(key); @@ -117,17 +125,17 @@ void append_full_config(const DynamicPrintConfig &cfg, std::map m_config; + std::map m_slicer_config; - std::string createIniContent(const std::string& projectname) const; + static void write_ini(const std::map &m, std::string &ini); + std::string create_ini_content(const std::string& projectname) const; public: From dced3ce783c9a3a1f626bf9497fa5d611146f3bf Mon Sep 17 00:00:00 2001 From: bubnikv Date: Fri, 24 Jan 2020 17:10:59 +0100 Subject: [PATCH 167/336] Fix of 2.2.0-A3: Sequential Printing: Wrong location after slicing #3570 This is a regression from 71fa411 --- src/libslic3r/PrintObject.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/libslic3r/PrintObject.cpp b/src/libslic3r/PrintObject.cpp index adae28e4b1..4d6df36db3 100644 --- a/src/libslic3r/PrintObject.cpp +++ b/src/libslic3r/PrintObject.cpp @@ -73,6 +73,8 @@ PrintObject::PrintObject(Print* print, ModelObject* model_object, bool add_insta PrintBase::ApplyStatus PrintObject::set_instances(PrintInstances &&instances) { + for (PrintInstance &i : instances) + i.shift += m_copies_shift; // Invalidate and set copies. PrintBase::ApplyStatus status = PrintBase::APPLY_STATUS_UNCHANGED; bool equal_length = instances.size() == m_instances.size(); @@ -83,7 +85,7 @@ PrintBase::ApplyStatus PrintObject::set_instances(PrintInstances &&instances) if (m_print->invalidate_steps({ psSkirt, psBrim, psGCodeExport }) || (! equal_length && m_print->invalidate_step(psWipeTower))) status = PrintBase::APPLY_STATUS_INVALIDATED; - m_instances = instances; + m_instances = std::move(instances); for (PrintInstance &i : m_instances) i.print_object = this; } From 9f085c133ab56294db9f7df6e9b987fb3d2b8683 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Mon, 27 Jan 2020 12:45:20 +0100 Subject: [PATCH 168/336] Try to fix cmake - openvdb on mac --- cmake/modules/FindOpenVDB.cmake | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/cmake/modules/FindOpenVDB.cmake b/cmake/modules/FindOpenVDB.cmake index 48f0d6655b..18fecf6c51 100644 --- a/cmake/modules/FindOpenVDB.cmake +++ b/cmake/modules/FindOpenVDB.cmake @@ -233,7 +233,10 @@ foreach(COMPONENT ${OpenVDB_FIND_COMPONENTS}) ) if (_is_multi) - list(APPEND OpenVDB_LIB_COMPONENTS ${OpenVDB_${COMPONENT}_LIBRARY_RELEASE} ${OpenVDB_${COMPONENT}_LIBRARY_DEBUG}) + list(APPEND OpenVDB_LIB_COMPONENTS ${OpenVDB_${COMPONENT}_LIBRARY_RELEASE}) + if (MSVC OR OpenVDB_${COMPONENT}_LIBRARY_DEBUG) + list(APPEND OpenVDB_LIB_COMPONENTS ${OpenVDB_${COMPONENT}_LIBRARY_DEBUG}) + endif () list(FIND CMAKE_CONFIGURATION_TYPES "Debug" _has_debug) @@ -538,8 +541,13 @@ foreach(COMPONENT ${OpenVDB_FIND_COMPONENTS}) if (_is_multi) set_target_properties(OpenVDB::${COMPONENT} PROPERTIES IMPORTED_LOCATION_RELEASE "${OpenVDB_${COMPONENT}_LIBRARY_RELEASE}" - IMPORTED_LOCATION_DEBUG "${OpenVDB_${COMPONENT}_LIBRARY_DEBUG}" ) + + if (MSVC OR OpenVDB_${COMPONENT}_LIBRARY_DEBUG) + set_target_properties(OpenVDB::${COMPONENT} PROPERTIES + IMPORTED_LOCATION_DEBUG "${OpenVDB_${COMPONENT}_LIBRARY_DEBUG}" + ) + endif () endif () if (OPENVDB_USE_STATIC_LIBS) From 83e8cfa206168c42f4ebb0a719b36d3daa6334c3 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Mon, 27 Jan 2020 13:39:44 +0100 Subject: [PATCH 169/336] Small refactoring into class Camera --- src/slic3r/GUI/Camera.cpp | 25 +++++++++---------------- 1 file changed, 9 insertions(+), 16 deletions(-) diff --git a/src/slic3r/GUI/Camera.cpp b/src/slic3r/GUI/Camera.cpp index c21947d585..adfaffd972 100644 --- a/src/slic3r/GUI/Camera.cpp +++ b/src/slic3r/GUI/Camera.cpp @@ -14,7 +14,9 @@ #include +#if !ENABLE_6DOF_CAMERA static const float GIMBALL_LOCK_THETA_MAX = 180.0f; +#endif // !ENABLE_6DOF_CAMERA // phi / theta angles to orient the camera. static const float VIEW_DEFAULT[2] = { 45.0f, 45.0f }; @@ -66,13 +68,10 @@ std::string Camera::get_type_as_string() const { switch (m_type) { - case Unknown: - return "unknown"; - case Perspective: - return "perspective"; + case Unknown: return "unknown"; + case Perspective: return "perspective"; default: - case Ortho: - return "orthographic"; + case Ortho: return "orthographic"; }; } @@ -88,10 +87,7 @@ void Camera::set_type(EType type) void Camera::set_type(const std::string& type) { - if (type == "1") - set_type(Perspective); - else - set_type(Ortho); + set_type((type == "1") ? Perspective : Ortho); } void Camera::select_next_type() @@ -262,12 +258,9 @@ void Camera::apply_projection(const BoundingBoxf3& box, double near_z, double fa w = 0.5 * (double)m_viewport[2]; h = 0.5 * (double)m_viewport[3]; - if (m_zoom != 0.0) - { - double inv_zoom = 1.0 / m_zoom; - w *= inv_zoom; - h *= inv_zoom; - } + double inv_zoom = get_inv_zoom(); + w *= inv_zoom; + h *= inv_zoom; switch (m_type) { From 3e5dce771fa0f6de61d50171ba7bb2c53ae58eeb Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Mon, 27 Jan 2020 13:51:44 +0100 Subject: [PATCH 170/336] Set OpenVDB_FOUND if no debug but release is there and not on MSVC --- cmake/modules/FindOpenVDB.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/modules/FindOpenVDB.cmake b/cmake/modules/FindOpenVDB.cmake index 18fecf6c51..bddc346b9f 100644 --- a/cmake/modules/FindOpenVDB.cmake +++ b/cmake/modules/FindOpenVDB.cmake @@ -240,7 +240,7 @@ foreach(COMPONENT ${OpenVDB_FIND_COMPONENTS}) list(FIND CMAKE_CONFIGURATION_TYPES "Debug" _has_debug) - if(OpenVDB_${COMPONENT}_LIBRARY_RELEASE AND (_has_debug LESS 0 OR OpenVDB_${COMPONENT}_LIBRARY_DEBUG)) + if(OpenVDB_${COMPONENT}_LIBRARY_RELEASE AND (NOT MSVC OR _has_debug LESS 0 OR OpenVDB_${COMPONENT}_LIBRARY_DEBUG)) set(OpenVDB_${COMPONENT}_FOUND TRUE) else() set(OpenVDB_${COMPONENT}_FOUND FALSE) From be8f464bf8f7e709a482c5f774f411b330aa4952 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Mon, 27 Jan 2020 14:31:41 +0100 Subject: [PATCH 171/336] Remove some gtk warnings on application start. --- src/slic3r/GUI/GUI_ObjectList.cpp | 6 +++--- src/slic3r/GUI/GUI_ObjectList.hpp | 6 ++++++ 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/slic3r/GUI/GUI_ObjectList.cpp b/src/slic3r/GUI/GUI_ObjectList.cpp index b4f20524ef..5ae2f6a79a 100644 --- a/src/slic3r/GUI/GUI_ObjectList.cpp +++ b/src/slic3r/GUI/GUI_ObjectList.cpp @@ -230,9 +230,9 @@ ObjectList::ObjectList(wxWindow* parent) : // So the postponed EnsureVisible() call is planned for an item, which may not exist at the Idle processing time, if this wxEVT_SIZE // event is succeeded by a delete of the currently active item. We are trying our luck by postponing the wxEVT_SIZE triggered EnsureVisible(), // which seems to be working as of now. - this->CallAfter([this](){ this->EnsureVisible(this->GetCurrentItem()); }); + this->CallAfter([this](){ ensure_current_item_visible(); }); #else - this->EnsureVisible(this->GetCurrentItem()); + ensure_current_item_visible(); #endif e.Skip(); })); @@ -3162,7 +3162,7 @@ void ObjectList::update_selections() select_items(sels); // Scroll selected Item in the middle of an object list - this->EnsureVisible(this->GetCurrentItem()); + ensure_current_item_visible(); } void ObjectList::update_selections_on_canvas() diff --git a/src/slic3r/GUI/GUI_ObjectList.hpp b/src/slic3r/GUI/GUI_ObjectList.hpp index a5a72ad8c5..dc0953d3bd 100644 --- a/src/slic3r/GUI/GUI_ObjectList.hpp +++ b/src/slic3r/GUI/GUI_ObjectList.hpp @@ -171,6 +171,12 @@ private: SettingsBundle m_freq_settings_sla; #endif + inline void ensure_current_item_visible() + { + if (const auto &item = this->GetCurrentItem()) + this->EnsureVisible(item); + } + public: ObjectList(wxWindow* parent); ~ObjectList(); From d8b1d074a13bfbabfc76fb4b6da695a3a9df6721 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Mon, 27 Jan 2020 12:40:12 +0100 Subject: [PATCH 172/336] Implemented upgrade_text_entry_dialog() fuction to avoid a getting an empty string from wxTextEntryDialog (disable OK button, if TextCtrl is empty) All mode conflicting or meaningless ticks are marked by "exclamation" icon and described in tooltip. --- src/slic3r/GUI/DoubleSlider.cpp | 107 +++++++++++++++++++++++++------- src/slic3r/GUI/DoubleSlider.hpp | 20 ++++-- 2 files changed, 100 insertions(+), 27 deletions(-) diff --git a/src/slic3r/GUI/DoubleSlider.cpp b/src/slic3r/GUI/DoubleSlider.cpp index 695ad71788..ebc4c12cb9 100644 --- a/src/slic3r/GUI/DoubleSlider.cpp +++ b/src/slic3r/GUI/DoubleSlider.cpp @@ -555,7 +555,7 @@ void Control::draw_ticks(wxDC& dc) // Draw icon for "Pause print" or "Custom Gcode" if (tick.gcode != ColorChangeCode && tick.gcode != ToolChangeCode) icon = create_scaled_bitmap(this, tick.gcode == PausePrintCode ? "pause_print" : "edit_gcode"); - else if (m_ticks.is_conflict_tick(tick, m_mode)) + else if (m_ticks.is_conflict_tick(tick, m_mode, m_only_extruder, m_values[tick.tick])) icon = create_scaled_bitmap(this, "error_tick"); if (!icon.IsNull()) @@ -931,10 +931,18 @@ wxString Control::get_tooltip(IconFocus icon_focus) // If tick is marked as a conflict (exclamation icon), // we should to explain why - if (m_ticks.is_conflict_tick(*tick_code_it, m_mode)) - tooltip += "\n" + _(L("Note")) + "! " + - _(L("G-code of this tick has a conflict with slider(print) mode.")) + "\n" + - _(L("Any its editing will cause a changes of DoubleSlider data.")); + ConflictType conflict = m_ticks.is_conflict_tick(*tick_code_it, m_mode, m_only_extruder, m_values[tick]); + if (conflict != ctNone) + tooltip += "\n\n" + _(L("Note")) + "! "; + if (conflict == ctModeConflict) + tooltip += _(L("G-code of this tick has a conflict with slider(print) mode.\n" + "Any its editing will cause a changes of DoubleSlider data.")); + else if (conflict == ctMeaningless) + tooltip += _(L("There is a color change for extruder that wouldn't be used till the end of printing.\n" + "This code wouldn't be processed during GCode generation.")); + else if (conflict == ctRedundant) + tooltip += _(L("There is a color change for extruder that has not been used before.\n" + "Check your choice to avoid redundant color changes.")); // Show list of actions with existing tick tooltip += "\n\n" + _(L("For Delete tick use left mouse button click OR pres \"-\" key")) + "\n" + ( @@ -1033,7 +1041,8 @@ void Control::append_add_color_change_menu_item(wxMenu* menu, bool switch_curren const int extruders_cnt = GUI::wxGetApp().extruders_edited_cnt(); if (extruders_cnt > 1) { - std::set used_extruders_for_tick = get_used_extruders_for_tick(m_selection == ssLower ? m_lower_value : m_higher_value); + int tick = m_selection == ssLower ? m_lower_value : m_higher_value; + std::set used_extruders_for_tick = m_ticks.get_used_extruders_for_tick(tick, m_only_extruder, m_values[tick]); wxMenu* add_color_change_menu = new wxMenu(); @@ -1046,7 +1055,7 @@ void Control::append_add_color_change_menu_item(wxMenu* menu, bool switch_curren append_menu_item(add_color_change_menu, wxID_ANY, item_name, "", [this, i](wxCommandEvent&) { add_code_as_tick(ColorChangeCode, i); }, "", menu, - [is_used_extruder]() { return is_used_extruder; }, GUI::wxGetApp().plater()); + []() { return true; }, GUI::wxGetApp().plater()); } const wxString menu_name = switch_current_code ? @@ -1267,10 +1276,10 @@ std::array Control::get_active_extruders_for_tick(int tick) const } // Get used extruders for tick. -// Means all extruders(toools) will be used during printing from current tick to the end -std::set Control::get_used_extruders_for_tick(int tick) const +// Means all extruders(tools) which will be used during printing from current tick to the end +std::set TickCodeInfo::get_used_extruders_for_tick(int tick, int only_extruder, double print_z) const { - if (m_mode == t_mode::MultiExtruder) + if (mode == t_mode::MultiExtruder) { // #ys_FIXME: get tool ordering from _correct_ place const ToolOrdering& tool_ordering = GUI::wxGetApp().plater()->fff_print().get_tool_ordering(); @@ -1280,7 +1289,7 @@ std::set Control::get_used_extruders_for_tick(int tick) const std::set used_extruders; - auto it_layer_tools = std::lower_bound(tool_ordering.begin(), tool_ordering.end(), LayerTools(m_values[tick])); + auto it_layer_tools = std::lower_bound(tool_ordering.begin(), tool_ordering.end(), LayerTools(print_z)); for (; it_layer_tools != tool_ordering.end(); ++it_layer_tools) { const std::vector& extruders = it_layer_tools->extruders; @@ -1291,12 +1300,11 @@ std::set Control::get_used_extruders_for_tick(int tick) const return used_extruders; } - const int default_initial_extruder = m_mode == t_mode::MultiAsSingle ? std::max(m_only_extruder, 1) : 1; - if (m_ticks.empty()) + const int default_initial_extruder = mode == t_mode::MultiAsSingle ? std::max(only_extruder, 1) : 1; + if (ticks.empty()) return {default_initial_extruder}; std::set used_extruders; - const std::set& ticks = m_ticks.ticks; auto it_start = ticks.lower_bound(TickCode{tick}); auto it = it_start; @@ -1411,6 +1419,28 @@ static std::string get_new_color(const std::string& color) return ""; } +// To avoid get an empty string from wxTextEntryDialog +// Let disable OK button, if TextCtrl is empty +static void upgrade_text_entry_dialog(wxTextEntryDialog* dlg) +{ + // detect TextCtrl and OK button + wxTextCtrl* textctrl {nullptr}; + wxWindowList& dlg_items = dlg->GetChildren(); + for (auto item : dlg_items) { + textctrl = dynamic_cast(item); + if (textctrl) + break; + } + + if (!textctrl) + return; + + wxButton* btn_OK = static_cast(dlg->FindWindowById(wxID_OK)); + btn_OK->Bind(wxEVT_UPDATE_UI, [textctrl](wxUpdateUIEvent& evt) { + evt.Enable(!textctrl->IsEmpty()); + }, btn_OK->GetId()); +} + static std::string get_custom_code(const std::string& code_in, double height) { wxString msg_text = from_u8(_utf8(L("Enter custom G-code used on current layer"))) + ":"; @@ -1419,7 +1449,9 @@ static std::string get_custom_code(const std::string& code_in, double height) // get custom gcode wxTextEntryDialog dlg(nullptr, msg_text, msg_header, code_in, wxTextEntryDialogStyle | wxTE_MULTILINE); - if (dlg.ShowModal() != wxID_OK || dlg.GetValue().IsEmpty()) + upgrade_text_entry_dialog(&dlg); + + if (dlg.ShowModal() != wxID_OK) return ""; return dlg.GetValue().ToStdString(); @@ -1433,6 +1465,8 @@ static std::string get_pause_print_msg(const std::string& msg_in, double height) // get custom gcode wxTextEntryDialog dlg(nullptr, msg_text, msg_header, from_u8(msg_in), wxTextEntryDialogStyle); + upgrade_text_entry_dialog(&dlg); + if (dlg.ShowModal() != wxID_OK || dlg.GetValue().IsEmpty()) return ""; @@ -1791,13 +1825,44 @@ bool TickCodeInfo::has_tick_with_code(const std::string& gcode) return false; } -bool TickCodeInfo::is_conflict_tick(const TickCode& tick, t_mode out_mode) +ConflictType TickCodeInfo::is_conflict_tick(const TickCode& tick, t_mode out_mode, int only_extruder, double print_z) { - return (tick.gcode == ColorChangeCode && ( - (mode == t_mode::SingleExtruder && out_mode == t_mode::MultiExtruder ) || - (mode == t_mode::MultiExtruder && out_mode == t_mode::SingleExtruder) )) || - (tick.gcode == ToolChangeCode && - (mode == t_mode::MultiAsSingle && out_mode != t_mode::MultiAsSingle)); + if ((tick.gcode == ColorChangeCode && ( + (mode == t_mode::SingleExtruder && out_mode == t_mode::MultiExtruder ) || + (mode == t_mode::MultiExtruder && out_mode == t_mode::SingleExtruder) )) || + (tick.gcode == ToolChangeCode && + (mode == t_mode::MultiAsSingle && out_mode != t_mode::MultiAsSingle)) ) + return ctModeConflict; + + // check ColorChange tick + if (tick.gcode == ColorChangeCode) + { + // We should mark a tick as a "Meaningless", + // if it has a ColorChange for unused extruder from current print to end of the print + std::set used_extruders_for_tick = get_used_extruders_for_tick(tick.tick, only_extruder, print_z); + + if (used_extruders_for_tick.find(tick.extruder) == used_extruders_for_tick.end()) + return ctMeaningless; + + // We should mark a tick as a "Redundant", + // if it has a ColorChange for extruder that has not been used before + if (mode == t_mode::MultiAsSingle && tick.extruder != std::max(only_extruder, 1) ) + { + auto it = ticks.lower_bound( tick ); + if (it == ticks.begin() && it->gcode == ToolChangeCode && tick.extruder == it->extruder) + return ctNone; + + while (it != ticks.begin()) { + --it; + if (it->gcode == ToolChangeCode && tick.extruder == it->extruder) + return ctNone; + } + + return ctRedundant; + } + } + + return ctNone; } } // DoubleSlider diff --git a/src/slic3r/GUI/DoubleSlider.hpp b/src/slic3r/GUI/DoubleSlider.hpp index c2c88f5982..064ed04640 100644 --- a/src/slic3r/GUI/DoubleSlider.hpp +++ b/src/slic3r/GUI/DoubleSlider.hpp @@ -39,6 +39,14 @@ enum IconFocus { ifCog }; +enum ConflictType +{ + ctNone, + ctModeConflict, + ctMeaningless, + ctRedundant +}; + using t_mode = CustomGCode::Mode; struct TickCode @@ -74,8 +82,12 @@ public: bool switch_code_for_tick(std::set::iterator it, const std::string& code_to, const int extruder); void erase_all_ticks_with_code(const std::string& gcode); - bool has_tick_with_code(const std::string& gcode); - bool is_conflict_tick(const TickCode& tick, t_mode out_mode); + bool has_tick_with_code(const std::string& gcode); + ConflictType is_conflict_tick(const TickCode& tick, t_mode out_mode, int only_extruder, double print_z); + + // Get used extruders for tick. + // Means all extruders(tools) which will be used during printing from current tick to the end + std::set get_used_extruders_for_tick(int tick, int only_extruder, double print_z) const; void suppress_plus (bool suppress) { m_suppress_plus = suppress; } void suppress_minus(bool suppress) { m_suppress_minus = suppress; } @@ -253,10 +265,6 @@ private: // Use those values to disable selection of active extruders std::array get_active_extruders_for_tick(int tick) const; - // Get used extruders for tick. - // Means all extruders(toools) will be used during printing from current tick to the end - std::set get_used_extruders_for_tick(int tick) const; - void post_ticks_changed_event(const std::string& gcode = ""); bool check_ticks_changed_event(const std::string& gcode); From cf7d7bd40f5a93c41e00474252d72bccbdf48872 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Mon, 27 Jan 2020 14:58:11 +0100 Subject: [PATCH 173/336] Fixed menu icons scaling under OSX --- src/slic3r/GUI/DoubleSlider.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/slic3r/GUI/DoubleSlider.cpp b/src/slic3r/GUI/DoubleSlider.cpp index ebc4c12cb9..47bdec1fb9 100644 --- a/src/slic3r/GUI/DoubleSlider.cpp +++ b/src/slic3r/GUI/DoubleSlider.cpp @@ -1381,7 +1381,7 @@ void Control::OnRightUp(wxMouseEvent& event) append_menu_item(&menu, wxID_ANY, it->gcode == ColorChangeCode ? _(L("Edit color")) : it->gcode == PausePrintCode ? _(L("Edit pause print message")) : _(L("Edit custom G-code")), "", - [this](wxCommandEvent&) { edit_tick(); }, "edit_uni", &menu); + [this](wxCommandEvent&) { edit_tick(); }, "edit_uni", &menu, []() {return true; }, this); if (it->gcode == ColorChangeCode && m_mode == t_mode::MultiAsSingle) append_change_extruder_menu_item(&menu, true); @@ -1390,7 +1390,7 @@ void Control::OnRightUp(wxMouseEvent& event) it->gcode == ToolChangeCode ? _(L("Delete tool change")) : it->gcode == PausePrintCode ? _(L("Delete pause print")) : _(L("Delete custom G-code")), "", - [this](wxCommandEvent&) { delete_current_tick();}, "colorchange_del_f", &menu); + [this](wxCommandEvent&) { delete_current_tick();}, "colorchange_del_f", &menu, []() {return true; }, this); GUI::wxGetApp().plater()->PopupMenu(&menu); From 635def1648f8435705af5826e570f35bbb9186c5 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Mon, 27 Jan 2020 16:30:09 +0100 Subject: [PATCH 174/336] Fixed an icon scaling in the ObjectList under OSX --- src/slic3r/GUI/GUI_ObjectList.cpp | 43 ++++++++++++++++--------------- src/slic3r/GUI/wxExtensions.cpp | 32 +++++++++++++---------- src/slic3r/GUI/wxExtensions.hpp | 27 +++++++++++++------ 3 files changed, 59 insertions(+), 43 deletions(-) diff --git a/src/slic3r/GUI/GUI_ObjectList.cpp b/src/slic3r/GUI/GUI_ObjectList.cpp index 5ae2f6a79a..25e1a5ee54 100644 --- a/src/slic3r/GUI/GUI_ObjectList.cpp +++ b/src/slic3r/GUI/GUI_ObjectList.cpp @@ -90,20 +90,20 @@ ObjectList::ObjectList(wxWindow* parent) : // see note in PresetBundle::load_compatible_bitmaps() // ptFFF - CATEGORY_ICON[L("Layers and Perimeters")] = create_scaled_bitmap(nullptr, "layers"); - CATEGORY_ICON[L("Infill")] = create_scaled_bitmap(nullptr, "infill"); - CATEGORY_ICON[L("Support material")] = create_scaled_bitmap(nullptr, "support"); - CATEGORY_ICON[L("Speed")] = create_scaled_bitmap(nullptr, "time"); - CATEGORY_ICON[L("Extruders")] = create_scaled_bitmap(nullptr, "funnel"); - CATEGORY_ICON[L("Extrusion Width")] = create_scaled_bitmap(nullptr, "funnel"); - CATEGORY_ICON[L("Wipe options")] = create_scaled_bitmap(nullptr, "funnel"); -// CATEGORY_ICON[L("Skirt and brim")] = create_scaled_bitmap(nullptr, "skirt+brim"); -// CATEGORY_ICON[L("Speed > Acceleration")] = create_scaled_bitmap(nullptr, "time"); - CATEGORY_ICON[L("Advanced")] = create_scaled_bitmap(nullptr, "wrench"); + CATEGORY_ICON[L("Layers and Perimeters")] = create_scaled_bitmap(this, "layers"); + CATEGORY_ICON[L("Infill")] = create_scaled_bitmap(this, "infill"); + CATEGORY_ICON[L("Support material")] = create_scaled_bitmap(this, "support"); + CATEGORY_ICON[L("Speed")] = create_scaled_bitmap(this, "time"); + CATEGORY_ICON[L("Extruders")] = create_scaled_bitmap(this, "funnel"); + CATEGORY_ICON[L("Extrusion Width")] = create_scaled_bitmap(this, "funnel"); + CATEGORY_ICON[L("Wipe options")] = create_scaled_bitmap(this, "funnel"); +// CATEGORY_ICON[L("Skirt and brim")] = create_scaled_bitmap(this, "skirt+brim"); +// CATEGORY_ICON[L("Speed > Acceleration")] = create_scaled_bitmap(this, "time"); + CATEGORY_ICON[L("Advanced")] = create_scaled_bitmap(this, "wrench"); // ptSLA - CATEGORY_ICON[L("Supports")] = create_scaled_bitmap(nullptr, "support"/*"sla_supports"*/); - CATEGORY_ICON[L("Pad")] = create_scaled_bitmap(nullptr, "pad"); - CATEGORY_ICON[L("Hollowing")] = create_scaled_bitmap(nullptr, "hollowing"); + CATEGORY_ICON[L("Supports")] = create_scaled_bitmap(this, "support"/*"sla_supports"*/); + CATEGORY_ICON[L("Pad")] = create_scaled_bitmap(this, "pad"); + CATEGORY_ICON[L("Hollowing")] = create_scaled_bitmap(this, "hollowing"); } // create control @@ -265,7 +265,7 @@ void ObjectList::create_objects_ctrl() // column ItemName(Icon+Text) of the view control: // And Icon can be consisting of several bitmaps - AppendColumn(new wxDataViewColumn(_(L("Name")), new BitmapTextRenderer(), + AppendColumn(new wxDataViewColumn(_(L("Name")), new BitmapTextRenderer(this), colName, 20*em, wxALIGN_LEFT, wxDATAVIEW_COL_RESIZABLE)); // column PrintableProperty (Icon) of the view control: @@ -559,10 +559,10 @@ void ObjectList::update_name_in_model(const wxDataViewItem& item) const void ObjectList::init_icons() { - m_bmp_solidmesh = ScalableBitmap(nullptr, ADD_VOLUME_MENU_ITEMS[int(ModelVolumeType::MODEL_PART) ].second); - m_bmp_modifiermesh = ScalableBitmap(nullptr, ADD_VOLUME_MENU_ITEMS[int(ModelVolumeType::PARAMETER_MODIFIER)].second); - m_bmp_support_enforcer = ScalableBitmap(nullptr, ADD_VOLUME_MENU_ITEMS[int(ModelVolumeType::SUPPORT_ENFORCER) ].second); - m_bmp_support_blocker = ScalableBitmap(nullptr, ADD_VOLUME_MENU_ITEMS[int(ModelVolumeType::SUPPORT_BLOCKER) ].second); + m_bmp_solidmesh = ScalableBitmap(this, ADD_VOLUME_MENU_ITEMS[int(ModelVolumeType::MODEL_PART) ].second); + m_bmp_modifiermesh = ScalableBitmap(this, ADD_VOLUME_MENU_ITEMS[int(ModelVolumeType::PARAMETER_MODIFIER)].second); + m_bmp_support_enforcer = ScalableBitmap(this, ADD_VOLUME_MENU_ITEMS[int(ModelVolumeType::SUPPORT_ENFORCER) ].second); + m_bmp_support_blocker = ScalableBitmap(this, ADD_VOLUME_MENU_ITEMS[int(ModelVolumeType::SUPPORT_BLOCKER) ].second); m_bmp_vector.reserve(4); // bitmaps for different types of parts m_bmp_vector.push_back(&m_bmp_solidmesh.bmp()); @@ -575,12 +575,12 @@ void ObjectList::init_icons() m_objects_model->SetVolumeBitmaps(m_bmp_vector); // init icon for manifold warning - m_bmp_manifold_warning = ScalableBitmap(nullptr, "exclamation"); + m_bmp_manifold_warning = ScalableBitmap(this, "exclamation"); // Set warning bitmap for the model m_objects_model->SetWarningBitmap(&m_bmp_manifold_warning.bmp()); // init bitmap for "Add Settings" context menu - m_bmp_cog = ScalableBitmap(nullptr, "cog"); + m_bmp_cog = ScalableBitmap(this, "cog"); } void ObjectList::msw_rescale_icons() @@ -1741,7 +1741,8 @@ void ObjectList::create_instance_popupmenu(wxMenu*menu) void ObjectList::create_default_popupmenu(wxMenu*menu) { wxMenu* sub_menu = append_submenu_add_generic(menu, ModelVolumeType::INVALID); - append_submenu(menu, sub_menu, wxID_ANY, _(L("Add Shape")), "", "add_part"); + append_submenu(menu, sub_menu, wxID_ANY, _(L("Add Shape")), "", "add_part", + [](){return true;}, this); } wxMenu* ObjectList::create_settings_popupmenu(wxMenu *parent_menu) diff --git a/src/slic3r/GUI/wxExtensions.cpp b/src/slic3r/GUI/wxExtensions.cpp index 356dd458fb..8e2bc1d97c 100644 --- a/src/slic3r/GUI/wxExtensions.cpp +++ b/src/slic3r/GUI/wxExtensions.cpp @@ -584,7 +584,8 @@ void ObjectDataViewModelNode::init_container() ObjectDataViewModelNode::ObjectDataViewModelNode(ObjectDataViewModelNode* parent, const ItemType type) : m_parent(parent), m_type(type), - m_extruder(wxEmptyString) + m_extruder(wxEmptyString), + m_ctrl(parent->m_ctrl) { if (type == itSettings) m_name = "Settings to modified"; @@ -599,7 +600,7 @@ ObjectDataViewModelNode::ObjectDataViewModelNode(ObjectDataViewModelNode* parent } else if (type == itLayerRoot) { - m_bmp = create_scaled_bitmap(nullptr, LAYER_ROOT_ICON); // FIXME: pass window ptr + m_bmp = create_scaled_bitmap(m_ctrl, LAYER_ROOT_ICON); // FIXME: pass window ptr m_name = _(L("Layers")); } @@ -615,7 +616,8 @@ ObjectDataViewModelNode::ObjectDataViewModelNode(ObjectDataViewModelNode* parent m_type(itLayer), m_idx(idx), m_layer_range(layer_range), - m_extruder(extruder) + m_extruder(extruder), + m_ctrl(parent->m_ctrl) { const int children_cnt = parent->GetChildCount(); if (idx < 0) @@ -628,7 +630,7 @@ ObjectDataViewModelNode::ObjectDataViewModelNode(ObjectDataViewModelNode* parent } const std::string label_range = (boost::format(" %.2f-%.2f ") % layer_range.first % layer_range.second).str(); m_name = _(L("Range")) + label_range + "(" + _(L("mm")) + ")"; - m_bmp = create_scaled_bitmap(nullptr, LAYER_ICON); // FIXME: pass window ptr + m_bmp = create_scaled_bitmap(m_ctrl, LAYER_ICON); // FIXME: pass window ptr set_action_and_extruder_icons(); init_container(); @@ -647,7 +649,7 @@ void ObjectDataViewModelNode::set_action_and_extruder_icons() { m_action_icon_name = m_type & itObject ? "advanced_plus" : m_type & (itVolume | itLayer) ? "cog" : /*m_type & itInstance*/ "set_separate_obj"; - m_action_icon = create_scaled_bitmap(nullptr, m_action_icon_name); // FIXME: pass window ptr + m_action_icon = create_scaled_bitmap(m_ctrl, m_action_icon_name); // FIXME: pass window ptr if (m_type & itInstance) return; // don't set colored bitmap for Instance @@ -662,7 +664,7 @@ void ObjectDataViewModelNode::set_printable_icon(PrintIndicator printable) { m_printable = printable; m_printable_icon = m_printable == piUndef ? m_empty_bmp : - create_scaled_bitmap(nullptr, m_printable == piPrintable ? "eye_open.png" : "eye_closed.png"); + create_scaled_bitmap(m_ctrl, m_printable == piPrintable ? "eye_open.png" : "eye_closed.png"); } void ObjectDataViewModelNode::update_settings_digest_bitmaps() @@ -707,10 +709,10 @@ bool ObjectDataViewModelNode::update_settings_digest(const std::vectorm_bmp = *m_warning_bmp; @@ -1987,10 +1989,9 @@ void ObjectDataViewModel::Rescale() node->m_bmp = GetVolumeIcon(node->m_volume_type, node->m_bmp.GetWidth() != node->m_bmp.GetHeight()); break; case itLayerRoot: - node->m_bmp = create_scaled_bitmap(nullptr, LAYER_ROOT_ICON); // FIXME: pass window ptr - break; + node->m_bmp = create_scaled_bitmap(m_ctrl, LAYER_ROOT_ICON); case itLayer: - node->m_bmp = create_scaled_bitmap(nullptr, LAYER_ICON); // FIXME: pass window ptr + node->m_bmp = create_scaled_bitmap(m_ctrl, LAYER_ICON); break; default: break; } @@ -2092,8 +2093,11 @@ bool BitmapTextRenderer::Render(wxRect rect, wxDC *dc, int state) const wxBitmap& icon = m_value.GetBitmap(); if (icon.IsOk()) { - dc->DrawBitmap(icon, rect.x, rect.y + (rect.height - icon.GetHeight()) / 2); - xoffset = icon.GetWidth() + 4; + float sf = (float)1.0 / get_svg_scale_factor(m_parent); + wxSize icon_sz = icon.GetSize() * sf; + + dc->DrawBitmap(icon, rect.x, rect.y + (rect.height - icon_sz.y) / 2); + xoffset = icon_sz.x + 4; } RenderText(m_value.GetText(), xoffset, rect, dc, state); diff --git a/src/slic3r/GUI/wxExtensions.hpp b/src/slic3r/GUI/wxExtensions.hpp index a6f8862ac4..1ee42dc292 100644 --- a/src/slic3r/GUI/wxExtensions.hpp +++ b/src/slic3r/GUI/wxExtensions.hpp @@ -228,13 +228,18 @@ class ObjectDataViewModelNode std::string m_action_icon_name = ""; Slic3r::ModelVolumeType m_volume_type; + // pointer to control (is needed to create scaled bitmaps) + wxDataViewCtrl* m_ctrl{ nullptr }; + public: - ObjectDataViewModelNode(const wxString &name, - const wxString& extruder): + ObjectDataViewModelNode(const wxString& name, + const wxString& extruder, + wxDataViewCtrl* ctrl): m_parent(NULL), m_name(name), m_type(itObject), - m_extruder(extruder) + m_extruder(extruder), + m_ctrl(ctrl) { set_action_and_extruder_icons(); init_container(); @@ -249,7 +254,8 @@ public: m_name (sub_obj_name), m_type (itVolume), m_idx (idx), - m_extruder (extruder) + m_extruder (extruder), + m_ctrl (parent->m_ctrl) { m_bmp = bmp; set_action_and_extruder_icons(); @@ -538,7 +544,8 @@ class BitmapTextRenderer : public wxDataViewCustomRenderer #endif //ENABLE_NONCUSTOM_DATA_VIEW_RENDERING { public: - BitmapTextRenderer(wxDataViewCellMode mode = + BitmapTextRenderer( wxWindow* parent, + wxDataViewCellMode mode = #ifdef __WXOSX__ wxDATAVIEW_CELL_INERT #else @@ -549,7 +556,10 @@ public: #if ENABLE_NONCUSTOM_DATA_VIEW_RENDERING ); #else - ) : wxDataViewCustomRenderer(wxT("DataViewBitmapText"), mode, align) {} + ) : + wxDataViewCustomRenderer(wxT("DataViewBitmapText"), mode, align), + m_parent(parent) + {} #endif //ENABLE_NONCUSTOM_DATA_VIEW_RENDERING bool SetValue(const wxVariant &value); @@ -577,8 +587,9 @@ public: bool WasCanceled() const { return m_was_unusable_symbol; } private: - DataViewBitmapText m_value; - bool m_was_unusable_symbol {false}; + DataViewBitmapText m_value; + bool m_was_unusable_symbol {false}; + wxWindow* m_parent {nullptr}; }; From 15cb8ec65354d7509072b9afda99c446d4bcff1f Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Tue, 28 Jan 2020 09:13:54 +0100 Subject: [PATCH 175/336] Another refactoring into class Camera --- src/slic3r/GUI/Camera.cpp | 72 +++++++++++++++++++-------------------- src/slic3r/GUI/Camera.hpp | 2 +- 2 files changed, 37 insertions(+), 37 deletions(-) diff --git a/src/slic3r/GUI/Camera.cpp b/src/slic3r/GUI/Camera.cpp index adfaffd972..db0126d659 100644 --- a/src/slic3r/GUI/Camera.cpp +++ b/src/slic3r/GUI/Camera.cpp @@ -153,17 +153,17 @@ void Camera::select_view(const std::string& direction) if (direction == "iso") set_default_orientation(); else if (direction == "left") - m_view_matrix = look_at(m_target - m_distance * Vec3d::UnitX(), m_target, Vec3d::UnitZ()); + look_at(m_target - m_distance * Vec3d::UnitX(), m_target, Vec3d::UnitZ()); else if (direction == "right") - m_view_matrix = look_at(m_target + m_distance * Vec3d::UnitX(), m_target, Vec3d::UnitZ()); + look_at(m_target + m_distance * Vec3d::UnitX(), m_target, Vec3d::UnitZ()); else if (direction == "top") - m_view_matrix = look_at(m_target + m_distance * Vec3d::UnitZ(), m_target, Vec3d::UnitY()); + look_at(m_target + m_distance * Vec3d::UnitZ(), m_target, Vec3d::UnitY()); else if (direction == "bottom") - m_view_matrix = look_at(m_target - m_distance * Vec3d::UnitZ(), m_target, -Vec3d::UnitY()); + look_at(m_target - m_distance * Vec3d::UnitZ(), m_target, -Vec3d::UnitY()); else if (direction == "front") - m_view_matrix = look_at(m_target - m_distance * Vec3d::UnitY(), m_target, Vec3d::UnitZ()); + look_at(m_target - m_distance * Vec3d::UnitY(), m_target, Vec3d::UnitZ()); else if (direction == "rear") - m_view_matrix = look_at(m_target + m_distance * Vec3d::UnitY(), m_target, Vec3d::UnitZ()); + look_at(m_target + m_distance * Vec3d::UnitY(), m_target, Vec3d::UnitZ()); } #else bool Camera::select_view(const std::string& direction) @@ -460,32 +460,33 @@ double Camera::min_zoom() const std::pair Camera::calc_tight_frustrum_zs_around(const BoundingBoxf3& box) const { std::pair ret; + auto& [near_z, far_z] = ret; while (true) { // box in eye space BoundingBoxf3 eye_box = box.transformed(m_view_matrix); - ret.first = -eye_box.max(2); - ret.second = -eye_box.min(2); + near_z = -eye_box.max(2); + far_z = -eye_box.min(2); // apply margin - ret.first -= FrustrumZMargin; - ret.second += FrustrumZMargin; + near_z -= FrustrumZMargin; + far_z += FrustrumZMargin; // ensure min size - if (ret.second - ret.first < FrustrumMinZRange) + if (far_z - near_z < FrustrumMinZRange) { - double mid_z = 0.5 * (ret.first + ret.second); + double mid_z = 0.5 * (near_z + far_z); double half_size = 0.5 * FrustrumMinZRange; - ret.first = mid_z - half_size; - ret.second = mid_z + half_size; + near_z = mid_z - half_size; + far_z = mid_z + half_size; } - if (ret.first >= FrustrumMinNearZ) + if (near_z >= FrustrumMinNearZ) break; // ensure min Near Z - set_distance(m_distance + FrustrumMinNearZ - ret.first); + set_distance(m_distance + FrustrumMinNearZ - near_z); } return ret; @@ -638,35 +639,34 @@ void Camera::set_distance(double distance) const } #if ENABLE_6DOF_CAMERA -Transform3d Camera::look_at(const Vec3d& position, const Vec3d& target, const Vec3d& up) const +void Camera::look_at(const Vec3d& position, const Vec3d& target, const Vec3d& up) { Vec3d unit_z = (position - target).normalized(); Vec3d unit_x = up.cross(unit_z).normalized(); Vec3d unit_y = unit_z.cross(unit_x).normalized(); - Transform3d matrix; + m_target = target; + Vec3d new_position = m_target + m_distance * unit_z; - matrix(0, 0) = unit_x(0); - matrix(0, 1) = unit_x(1); - matrix(0, 2) = unit_x(2); - matrix(0, 3) = -unit_x.dot(position); + m_view_matrix(0, 0) = unit_x(0); + m_view_matrix(0, 1) = unit_x(1); + m_view_matrix(0, 2) = unit_x(2); + m_view_matrix(0, 3) = -unit_x.dot(new_position); - matrix(1, 0) = unit_y(0); - matrix(1, 1) = unit_y(1); - matrix(1, 2) = unit_y(2); - matrix(1, 3) = -unit_y.dot(position); + m_view_matrix(1, 0) = unit_y(0); + m_view_matrix(1, 1) = unit_y(1); + m_view_matrix(1, 2) = unit_y(2); + m_view_matrix(1, 3) = -unit_y.dot(new_position); - matrix(2, 0) = unit_z(0); - matrix(2, 1) = unit_z(1); - matrix(2, 2) = unit_z(2); - matrix(2, 3) = -unit_z.dot(position); + m_view_matrix(2, 0) = unit_z(0); + m_view_matrix(2, 1) = unit_z(1); + m_view_matrix(2, 2) = unit_z(2); + m_view_matrix(2, 3) = -unit_z.dot(new_position); - matrix(3, 0) = 0.0; - matrix(3, 1) = 0.0; - matrix(3, 2) = 0.0; - matrix(3, 3) = 1.0; - - return matrix; + m_view_matrix(3, 0) = 0.0; + m_view_matrix(3, 1) = 0.0; + m_view_matrix(3, 2) = 0.0; + m_view_matrix(3, 3) = 1.0; } void Camera::set_default_orientation() diff --git a/src/slic3r/GUI/Camera.hpp b/src/slic3r/GUI/Camera.hpp index 2a43361089..6a2bc2bf32 100644 --- a/src/slic3r/GUI/Camera.hpp +++ b/src/slic3r/GUI/Camera.hpp @@ -159,7 +159,7 @@ private: void set_distance(double distance) const; #if ENABLE_6DOF_CAMERA - Transform3d look_at(const Vec3d& position, const Vec3d& target, const Vec3d& up) const; + void look_at(const Vec3d& position, const Vec3d& target, const Vec3d& up); void set_default_orientation(); Vec3d validate_target(const Vec3d& target) const; #endif // ENABLE_6DOF_CAMERA From 69549af9ac0b6dddaf7f35f60820730e443be17f Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Tue, 28 Jan 2020 11:11:45 +0100 Subject: [PATCH 176/336] Invalidate object bounding box after arrange --- src/libslic3r/Model.hpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/libslic3r/Model.hpp b/src/libslic3r/Model.hpp index e0859e81dd..2fbd584610 100644 --- a/src/libslic3r/Model.hpp +++ b/src/libslic3r/Model.hpp @@ -674,6 +674,7 @@ public: set_rotation(Z, rotation); set_offset(X, unscale(offs(X))); set_offset(Y, unscale(offs(Y))); + this->object->invalidate_bounding_box(); } protected: From d5b258c2672de78ce9da5f771a3aca00b13aa8ae Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Tue, 28 Jan 2020 13:15:21 +0100 Subject: [PATCH 177/336] 1st installment of object/instance labels in 3D scene --- src/libslic3r/Technologies.hpp | 2 + src/slic3r/GUI/AppConfig.cpp | 5 + src/slic3r/GUI/GLCanvas3D.cpp | 142 +++++++++++++++++++++++++++ src/slic3r/GUI/GLCanvas3D.hpp | 26 +++++ src/slic3r/GUI/GUI_Preview.cpp | 3 + src/slic3r/GUI/KBShortcutsDialog.cpp | 3 + src/slic3r/GUI/Preferences.cpp | 9 ++ 7 files changed, 190 insertions(+) diff --git a/src/libslic3r/Technologies.hpp b/src/libslic3r/Technologies.hpp index 0728dedc60..bb494343bc 100644 --- a/src/libslic3r/Technologies.hpp +++ b/src/libslic3r/Technologies.hpp @@ -62,5 +62,7 @@ // Enhance reload from disk to be able to work with 3mf/amf files saved with PrusaSlicer 2.1.0 and earlier #define ENABLE_BACKWARD_COMPATIBLE_RELOAD_FROM_DISK (1 && ENABLE_2_2_0_BETA1) +// Enable showing object/instance info with labels into the 3D scene +#define ENABLE_SHOW_SCENE_LABELS (1 && ENABLE_2_2_0_BETA1) #endif // _technologies_h_ diff --git a/src/slic3r/GUI/AppConfig.cpp b/src/slic3r/GUI/AppConfig.cpp index a410f3ad8d..925346ee7d 100644 --- a/src/slic3r/GUI/AppConfig.cpp +++ b/src/slic3r/GUI/AppConfig.cpp @@ -95,6 +95,11 @@ void AppConfig::set_defaults() set("use_free_camera", "0"); #endif // ENABLE_6DOF_CAMERA +#if ENABLE_SHOW_SCENE_LABELS + if (get("show_labels").empty()) + set("show_labels", "0"); +#endif // ENABLE_SHOW_SCENE_LABELS + // Remove legacy window positions/sizes erase("", "main_frame_maximized"); erase("", "main_frame_pos"); diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 8805dc92c8..3035097ff1 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -65,6 +65,10 @@ #include #endif // ENABLE_RENDER_STATISTICS +#if ENABLE_SHOW_SCENE_LABELS +#include +#endif // ENABLE_SHOW_SCENE_LABELS + static const float TRACKBALLSIZE = 0.8f; static const float DEFAULT_BG_DARK_COLOR[3] = { 0.478f, 0.478f, 0.478f }; @@ -1230,6 +1234,136 @@ void GLCanvas3D::LegendTexture::render(const GLCanvas3D& canvas) const } } +#if ENABLE_SHOW_SCENE_LABELS +void GLCanvas3D::Labels::show(bool show) +{ + bool shown = is_shown(); + if (shown != show) + { + wxGetApp().app_config->set("show_labels", show ? "1" : "0"); + wxGetApp().app_config->save(); + } +} + +bool GLCanvas3D::Labels::is_shown() const +{ + return wxGetApp().app_config->get("show_labels") == "1"; +} + +void GLCanvas3D::Labels::render(const GLCanvas3D& canvas) const +{ + if (!m_enabled || !is_shown()) + return; + + const Camera& camera = canvas.get_camera(); + const Model* model = canvas.get_model(); + if (model == nullptr) + return; + + Transform3d world_to_eye = camera.get_view_matrix(); + Transform3d world_to_screen = camera.get_projection_matrix() * world_to_eye; + const std::array& viewport = camera.get_viewport(); + + struct Owner + { + int obj_idx; + int inst_idx; + BoundingBoxf3 world_box; + double eye_center_z; + std::string id_str; + bool selected; + }; + + // collect world bounding boxes from volumes + std::vector owners; + const GLVolumeCollection& volumes = canvas.get_volumes(); + for (const GLVolume* volume : volumes.volumes) + { + int obj_idx = volume->object_idx(); + if ((0 <= obj_idx) && (obj_idx < (int)model->objects.size())) + { + int inst_idx = volume->instance_idx(); + std::vector::iterator it = std::find_if(owners.begin(), owners.end(), [obj_idx, inst_idx](const Owner& owner) { + return (owner.obj_idx == obj_idx) && (owner.inst_idx == inst_idx); + }); + if (it != owners.end()) + { + it->world_box.merge(volume->transformed_bounding_box()); + it->selected &= volume->selected; + } + else + { + Owner owner; + owner.obj_idx = obj_idx; + owner.inst_idx = inst_idx; + owner.world_box = volume->transformed_bounding_box(); + owner.selected = volume->selected; + owner.id_str = "object" + std::to_string(obj_idx) + "_inst##" + std::to_string(inst_idx); + owners.push_back(owner); + } + } + } + + // calculate eye bounding boxes center zs + for (Owner& owner : owners) + { + owner.eye_center_z = (world_to_eye * owner.world_box.center())(2); + } + + // sort owners by center eye zs and selection + std::sort(owners.begin(), owners.end(), [](const Owner& owner1, const Owner& owner2) { + if (!owner1.selected && owner2.selected) + return true; + else if (owner1.selected && !owner2.selected) + return false; + else + return (owner1.eye_center_z < owner2.eye_center_z); + }); + + ImGuiWrapper& imgui = *wxGetApp().imgui(); + + // render info windows + for (const Owner& owner : owners) + { + Vec3d screen_box_center = world_to_screen * owner.world_box.center(); + float x = 0.0f; + float y = 0.0f; + if (camera.get_type() == Camera::Perspective) + { + x = (0.5f + 0.001f * 0.5f * (float)screen_box_center(0)) * viewport[2]; + y = (0.5f - 0.001f * 0.5f * (float)screen_box_center(1)) * viewport[3]; + } + else + { + x = (0.5f + 0.5f * (float)screen_box_center(0)) * viewport[2]; + y = (0.5f - 0.5f * (float)screen_box_center(1)) * viewport[3]; + } + + if ((x < 0.0f) || (viewport[2] < x) || (y < 0.0f) || (viewport[3] < y)) + continue; + + ImGui::PushStyleVar(ImGuiStyleVar_WindowBorderSize, owner.selected ? 3.0f : 1.5f); + ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 0.0f); + ImGui::PushStyleColor(ImGuiCol_Border, owner.selected ? ImVec4(0.757f, 0.404f, 0.216f, 1.0f) : ImVec4(0.75f, 0.75f, 0.75f, 1.0f)); + imgui.set_next_window_pos(x, y, ImGuiCond_Always, 0.5f, 0.5f); + imgui.begin(owner.id_str, ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoMove); + ImGui::BringWindowToDisplayFront(ImGui::GetCurrentWindow()); + float win_w = ImGui::GetWindowWidth(); + std::string object_str = model->objects[owner.obj_idx]->name; + ImGui::SetCursorPosX(0.5f * (win_w - imgui.calc_text_size(object_str).x)); + ImGui::AlignTextToFramePadding(); + imgui.text(object_str); + std::string instance_str = _(L("Instance ")) + std::to_string(owner.inst_idx + 1); + ImGui::SetCursorPosX(0.5f * (win_w - imgui.calc_text_size(instance_str).x)); + ImGui::AlignTextToFramePadding(); + imgui.text(instance_str); + imgui.end(); + ImGui::PopStyleColor(); + ImGui::PopStyleVar(2); + } +} +#endif // ENABLE_SHOW_SCENE_LABELS + wxDEFINE_EVENT(EVT_GLCANVAS_SCHEDULE_BACKGROUND_PROCESS, SimpleEvent); wxDEFINE_EVENT(EVT_GLCANVAS_OBJECT_SELECT, SimpleEvent); wxDEFINE_EVENT(EVT_GLCANVAS_RIGHT_CLICK, RBtnEvent); @@ -2646,6 +2780,10 @@ void GLCanvas3D::on_char(wxKeyEvent& evt) case 'a': { post_event(SimpleEvent(EVT_GLCANVAS_ARRANGE)); break; } case 'B': case 'b': { zoom_to_bed(); break; } +#if ENABLE_SHOW_SCENE_LABELS + case 'E': + case 'e': { m_labels.show(!m_labels.is_shown()); m_dirty = true; break; } +#endif // ENABLE_SHOW_SCENE_LABELS case 'I': case 'i': { _update_camera_zoom(1.0); break; } case 'K': @@ -4732,6 +4870,10 @@ void GLCanvas3D::_render_overlays() const _render_undoredo_toolbar(); _render_view_toolbar(); +#if ENABLE_SHOW_SCENE_LABELS + m_labels.render(*this); +#endif // ENABLE_SHOW_SCENE_LABELS + if ((m_layers_editing.last_object_id >= 0) && (m_layers_editing.object_max_z() > 0.0f)) m_layers_editing.render_overlay(*this); diff --git a/src/slic3r/GUI/GLCanvas3D.hpp b/src/slic3r/GUI/GLCanvas3D.hpp index a7f272f975..2ad32a6e50 100644 --- a/src/slic3r/GUI/GLCanvas3D.hpp +++ b/src/slic3r/GUI/GLCanvas3D.hpp @@ -373,6 +373,19 @@ private: }; #endif // ENABLE_RENDER_STATISTICS +#if ENABLE_SHOW_SCENE_LABELS + class Labels + { + bool m_enabled{ false }; + + public: + void enable(bool enable) { m_enabled = enable; } + void show(bool show); + bool is_shown() const; + void render(const GLCanvas3D& canvas) const; + }; +#endif // ENABLE_SHOW_SCENE_LABELS + public: enum ECursorType : unsigned char { @@ -450,6 +463,10 @@ private: mutable int m_imgui_undo_redo_hovered_pos{ -1 }; int m_selected_extruder; +#if ENABLE_SHOW_SCENE_LABELS + Labels m_labels; +#endif // ENABLE_SHOW_SCENE_LABELS + public: GLCanvas3D(wxGLCanvas* canvas, Bed3D& bed, Camera& camera, GLToolbar& view_toolbar); ~GLCanvas3D(); @@ -465,6 +482,9 @@ public: void set_as_dirty(); unsigned int get_volumes_count() const; +#if ENABLE_SHOW_SCENE_LABELS + const GLVolumeCollection& get_volumes() const { return m_volumes; } +#endif // ENABLE_SHOW_SCENE_LABELS void reset_volumes(); int check_volumes_outside_state() const; @@ -476,6 +496,9 @@ public: void set_config(const DynamicPrintConfig* config); void set_process(BackgroundSlicingProcess* process); void set_model(Model* model); +#if ENABLE_SHOW_SCENE_LABELS + const Model* get_model() const { return m_model; } +#endif // ENABLE_SHOW_SCENE_LABELS const Selection& get_selection() const { return m_selection; } Selection& get_selection() { return m_selection; } @@ -523,6 +546,9 @@ public: void enable_main_toolbar(bool enable); void enable_undoredo_toolbar(bool enable); void enable_dynamic_background(bool enable); +#if ENABLE_SHOW_SCENE_LABELS + void enable_labels(bool enable) { m_labels.enable(enable); } +#endif // ENABLE_SHOW_SCENE_LABELS void allow_multisample(bool allow); void zoom_to_bed(); diff --git a/src/slic3r/GUI/GUI_Preview.cpp b/src/slic3r/GUI/GUI_Preview.cpp index e42f8ed216..c256413a81 100644 --- a/src/slic3r/GUI/GUI_Preview.cpp +++ b/src/slic3r/GUI/GUI_Preview.cpp @@ -65,6 +65,9 @@ bool View3D::init(wxWindow* parent, Bed3D& bed, Camera& camera, GLToolbar& view_ m_canvas->enable_selection(true); m_canvas->enable_main_toolbar(true); m_canvas->enable_undoredo_toolbar(true); +#if ENABLE_SHOW_SCENE_LABELS + m_canvas->enable_labels(true); +#endif // ENABLE_SHOW_SCENE_LABELS wxBoxSizer* main_sizer = new wxBoxSizer(wxVERTICAL); main_sizer->Add(m_canvas_widget, 1, wxALL | wxEXPAND, 0); diff --git a/src/slic3r/GUI/KBShortcutsDialog.cpp b/src/slic3r/GUI/KBShortcutsDialog.cpp index 268682b817..30f1d9ec0b 100644 --- a/src/slic3r/GUI/KBShortcutsDialog.cpp +++ b/src/slic3r/GUI/KBShortcutsDialog.cpp @@ -157,6 +157,9 @@ void KBShortcutsDialog::fill_shortcuts() plater_shortcuts.push_back(Shortcut("Z", L("Zoom to selected object"))); plater_shortcuts.push_back(Shortcut("I", L("Zoom in"))); plater_shortcuts.push_back(Shortcut("O", L("Zoom out"))); +#if ENABLE_SHOW_SCENE_LABELS + plater_shortcuts.push_back(Shortcut("E", L("Show/Hide object/instance labels"))); +#endif // ENABLE_SHOW_SCENE_LABELS plater_shortcuts.push_back(Shortcut(ctrl+"M", L("Show/Hide 3Dconnexion devices settings dialog"))); plater_shortcuts.push_back(Shortcut("ESC", L("Unselect gizmo / Clear selection"))); #if ENABLE_RENDER_PICKING_PASS diff --git a/src/slic3r/GUI/Preferences.cpp b/src/slic3r/GUI/Preferences.cpp index 4fd63fe0ed..57748d3a83 100644 --- a/src/slic3r/GUI/Preferences.cpp +++ b/src/slic3r/GUI/Preferences.cpp @@ -144,6 +144,15 @@ void PreferencesDialog::build() } }; +#if ENABLE_SHOW_SCENE_LABELS + def.label = L("Show object/instance labels in 3D scene"); + def.type = coBool; + def.tooltip = L("If enabled, shows labels containing info about objects/instances."); + def.set_default_value(new ConfigOptionBool{ app_config->get("show_labels") == "1" }); + option = Option(def, "show_labels"); + m_optgroup_gui->append_single_option_line(option); +#endif // ENABLE_SHOW_SCENE_LABELS + def.label = L("Use custom size for toolbar icons"); def.type = coBool; def.tooltip = L("If enabled, you can change size of toolbar icons manually."); From 04a58e41c437f39d95d52aef0ef161a7c76fbd87 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Tue, 28 Jan 2020 14:49:07 +0100 Subject: [PATCH 178/336] Fix cgal when used from distro package fix CMake -frounding-math propagation from CGAL. --- src/libslic3r/CMakeLists.txt | 31 +++++++++++++++++++------------ src/libslic3r/MeshBoolean.cpp | 2 +- 2 files changed, 20 insertions(+), 13 deletions(-) diff --git a/src/libslic3r/CMakeLists.txt b/src/libslic3r/CMakeLists.txt index 0bad50abe3..0f8f5b2c2f 100644 --- a/src/libslic3r/CMakeLists.txt +++ b/src/libslic3r/CMakeLists.txt @@ -238,15 +238,24 @@ if (MSVC AND "${CMAKE_SIZEOF_VOID_P}" STREQUAL "4") # 32 bit MSVC workaround set(_cgal_defines CGAL_DO_NOT_USE_MPZF) endif () -add_library(libslic3r_cgal OBJECT MeshBoolean.cpp MeshBoolean.hpp) -target_include_directories(libslic3r_cgal PRIVATE - ${CMAKE_CURRENT_BINARY_DIR} - $ - $) -target_compile_definitions(libslic3r_cgal PRIVATE ${_cgal_defines} - $) -target_compile_options(libslic3r_cgal PRIVATE - $) +add_library(libslic3r_cgal STATIC MeshBoolean.cpp MeshBoolean.hpp) +target_include_directories(libslic3r_cgal PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) + +# Reset compile options of libslic3r_cgal. Despite it being linked privately, CGAL options +# (-frounding-math) still propagate to dependent libs which is not desired. +get_target_property(_cgal_tgt CGAL::CGAL ALIASED_TARGET) +if (NOT TARGET ${_cgal_tgt}) + set (_cgal_tgt CGAL::CGAL) +endif () +get_target_property(_opts ${_cgal_tgt} INTERFACE_COMPILE_OPTIONS) +set(_opts_bad "${_opts}") +set(_opts_good "${_opts}") +list(FILTER _opts_bad INCLUDE REGEX frounding-math) +list(FILTER _opts_good EXCLUDE REGEX frounding-math) +set_target_properties(${_cgal_tgt} PROPERTIES INTERFACE_COMPILE_OPTIONS "${_opts_good}") + +target_link_libraries(libslic3r_cgal PRIVATE ${_cgal_tgt} libigl) +target_compile_options(libslic3r_cgal PRIVATE "${_opts_bad}") encoding_check(libslic3r) @@ -268,7 +277,7 @@ target_link_libraries(libslic3r qhull semver TBB::tbb - $ + libslic3r_cgal ${CMAKE_DL_LIBS} ) @@ -287,5 +296,3 @@ endif() if (SLIC3R_PCH AND NOT SLIC3R_SYNTAXONLY) add_precompiled_header(libslic3r pchheader.hpp FORCEINCLUDE) endif () - -target_sources(libslic3r PRIVATE $) diff --git a/src/libslic3r/MeshBoolean.cpp b/src/libslic3r/MeshBoolean.cpp index 69db96d3fc..025f2f97d8 100644 --- a/src/libslic3r/MeshBoolean.cpp +++ b/src/libslic3r/MeshBoolean.cpp @@ -111,7 +111,7 @@ static TriangleMesh cgal_to_triangle_mesh(const _CGALMesh &cgalmesh) auto vtc = cgalmesh.vertices_around_face(cgalmesh.halfedge(face)); int i = 0; Vec3crd trface; - for (auto v : vtc) trface(i++) = int(v.idx()); + for (auto v : vtc) trface(i++) = static_cast(v); facets.emplace_back(trface); } From 9d0d0cde21bc078dee4195e7b85c9d8ae2f844ac Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Tue, 28 Jan 2020 15:08:07 +0100 Subject: [PATCH 179/336] Fix broken build on non-linux platforms --- src/libslic3r/CMakeLists.txt | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/libslic3r/CMakeLists.txt b/src/libslic3r/CMakeLists.txt index 0f8f5b2c2f..c145eded02 100644 --- a/src/libslic3r/CMakeLists.txt +++ b/src/libslic3r/CMakeLists.txt @@ -248,14 +248,16 @@ if (NOT TARGET ${_cgal_tgt}) set (_cgal_tgt CGAL::CGAL) endif () get_target_property(_opts ${_cgal_tgt} INTERFACE_COMPILE_OPTIONS) -set(_opts_bad "${_opts}") -set(_opts_good "${_opts}") -list(FILTER _opts_bad INCLUDE REGEX frounding-math) -list(FILTER _opts_good EXCLUDE REGEX frounding-math) -set_target_properties(${_cgal_tgt} PROPERTIES INTERFACE_COMPILE_OPTIONS "${_opts_good}") +if (_opts) + set(_opts_bad "${_opts}") + set(_opts_good "${_opts}") + list(FILTER _opts_bad INCLUDE REGEX frounding-math) + list(FILTER _opts_good EXCLUDE REGEX frounding-math) + set_target_properties(${_cgal_tgt} PROPERTIES INTERFACE_COMPILE_OPTIONS "${_opts_good}") + target_compile_options(libslic3r_cgal PRIVATE "${_opts_bad}") +endif() target_link_libraries(libslic3r_cgal PRIVATE ${_cgal_tgt} libigl) -target_compile_options(libslic3r_cgal PRIVATE "${_opts_bad}") encoding_check(libslic3r) From 6988752d05fad29a6d158a5c2d20eb09875ce075 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Tue, 28 Jan 2020 15:24:23 +0100 Subject: [PATCH 180/336] Re-apply fix for Win32 --- src/libslic3r/CMakeLists.txt | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/libslic3r/CMakeLists.txt b/src/libslic3r/CMakeLists.txt index c145eded02..73b7df5bc0 100644 --- a/src/libslic3r/CMakeLists.txt +++ b/src/libslic3r/CMakeLists.txt @@ -233,11 +233,6 @@ cmake_policy(SET CMP0011 NEW) find_package(CGAL REQUIRED) cmake_policy(POP) -set(_cgal_defines "") -if (MSVC AND "${CMAKE_SIZEOF_VOID_P}" STREQUAL "4") # 32 bit MSVC workaround - set(_cgal_defines CGAL_DO_NOT_USE_MPZF) -endif () - add_library(libslic3r_cgal STATIC MeshBoolean.cpp MeshBoolean.hpp) target_include_directories(libslic3r_cgal PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) @@ -259,6 +254,10 @@ endif() target_link_libraries(libslic3r_cgal PRIVATE ${_cgal_tgt} libigl) +if (MSVC AND "${CMAKE_SIZEOF_VOID_P}" STREQUAL "4") # 32 bit MSVC workaround + target_compile_definitions(libslic3r_cgal PRIVATE CGAL_DO_NOT_USE_MPZF) +endif () + encoding_check(libslic3r) target_compile_definitions(libslic3r PUBLIC -DUSE_TBB -DTBB_USE_CAPTURED_EXCEPTION=0) From 9032dadff3d861abe141d05b6b3868c52556d43e Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Tue, 28 Jan 2020 15:57:02 +0100 Subject: [PATCH 181/336] Added extra frame renders to let labels grow to their final size --- src/slic3r/GUI/GLCanvas3D.cpp | 34 ++++++++++++++++++++++------------ src/slic3r/GUI/GLCanvas3D.hpp | 4 +++- 2 files changed, 25 insertions(+), 13 deletions(-) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 3035097ff1..b8cd6a75b7 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -1250,13 +1250,13 @@ bool GLCanvas3D::Labels::is_shown() const return wxGetApp().app_config->get("show_labels") == "1"; } -void GLCanvas3D::Labels::render(const GLCanvas3D& canvas) const +void GLCanvas3D::Labels::render() const { if (!m_enabled || !is_shown()) return; - const Camera& camera = canvas.get_camera(); - const Model* model = canvas.get_model(); + const Camera& camera = m_canvas.get_camera(); + const Model* model = m_canvas.get_model(); if (model == nullptr) return; @@ -1271,12 +1271,13 @@ void GLCanvas3D::Labels::render(const GLCanvas3D& canvas) const BoundingBoxf3 world_box; double eye_center_z; std::string id_str; + std::string instance_str; bool selected; }; // collect world bounding boxes from volumes std::vector owners; - const GLVolumeCollection& volumes = canvas.get_volumes(); + const GLVolumeCollection& volumes = m_canvas.get_volumes(); for (const GLVolume* volume : volumes.volumes) { int obj_idx = volume->object_idx(); @@ -1299,6 +1300,7 @@ void GLCanvas3D::Labels::render(const GLCanvas3D& canvas) const owner.world_box = volume->transformed_bounding_box(); owner.selected = volume->selected; owner.id_str = "object" + std::to_string(obj_idx) + "_inst##" + std::to_string(inst_idx); + owner.instance_str = _(L("Instance ")) + std::to_string(inst_idx + 1); owners.push_back(owner); } } @@ -1350,13 +1352,20 @@ void GLCanvas3D::Labels::render(const GLCanvas3D& canvas) const ImGui::BringWindowToDisplayFront(ImGui::GetCurrentWindow()); float win_w = ImGui::GetWindowWidth(); std::string object_str = model->objects[owner.obj_idx]->name; - ImGui::SetCursorPosX(0.5f * (win_w - imgui.calc_text_size(object_str).x)); + float object_str_len = imgui.calc_text_size(object_str).x; + ImGui::SetCursorPosX(0.5f * (win_w - object_str_len)); ImGui::AlignTextToFramePadding(); imgui.text(object_str); - std::string instance_str = _(L("Instance ")) + std::to_string(owner.inst_idx + 1); - ImGui::SetCursorPosX(0.5f * (win_w - imgui.calc_text_size(instance_str).x)); + float instance_str_len = imgui.calc_text_size(owner.instance_str).x; + ImGui::SetCursorPosX(0.5f * (win_w - instance_str_len)); ImGui::AlignTextToFramePadding(); - imgui.text(instance_str); + imgui.text(owner.instance_str); + + // force re-render while the windows gets to its final size (it takes several frames) + float content_w = 1 + ImGui::GetWindowContentRegionWidth(); + if ((content_w <= object_str_len) || (content_w <= instance_str_len)) + m_canvas.request_extra_frame(); + imgui.end(); ImGui::PopStyleColor(); ImGui::PopStyleVar(2); @@ -1431,6 +1440,7 @@ GLCanvas3D::GLCanvas3D(wxGLCanvas* canvas, Bed3D& bed, Camera& camera, GLToolbar , m_show_picking_texture(false) #endif // ENABLE_RENDER_PICKING_PASS , m_render_sla_auxiliaries(true) + , m_labels(*this) { if (m_canvas != nullptr) { m_timer.SetOwner(m_canvas); @@ -4870,13 +4880,13 @@ void GLCanvas3D::_render_overlays() const _render_undoredo_toolbar(); _render_view_toolbar(); -#if ENABLE_SHOW_SCENE_LABELS - m_labels.render(*this); -#endif // ENABLE_SHOW_SCENE_LABELS - if ((m_layers_editing.last_object_id >= 0) && (m_layers_editing.object_max_z() > 0.0f)) m_layers_editing.render_overlay(*this); +#if ENABLE_SHOW_SCENE_LABELS + m_labels.render(); +#endif // ENABLE_SHOW_SCENE_LABELS + glsafe(::glPopMatrix()); } diff --git a/src/slic3r/GUI/GLCanvas3D.hpp b/src/slic3r/GUI/GLCanvas3D.hpp index 2ad32a6e50..eb4aca721b 100644 --- a/src/slic3r/GUI/GLCanvas3D.hpp +++ b/src/slic3r/GUI/GLCanvas3D.hpp @@ -377,12 +377,14 @@ private: class Labels { bool m_enabled{ false }; + GLCanvas3D& m_canvas; public: + explicit Labels(GLCanvas3D& canvas) : m_canvas(canvas) {} void enable(bool enable) { m_enabled = enable; } void show(bool show); bool is_shown() const; - void render(const GLCanvas3D& canvas) const; + void render() const; }; #endif // ENABLE_SHOW_SCENE_LABELS From a38735b4ae78611fe10f3422ccfd54e690ce1a88 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Tue, 28 Jan 2020 16:15:43 +0100 Subject: [PATCH 182/336] More fix of svg icons scaling under OSX (to avoid icon's blurring) + some code cleaning from unused text --- src/slic3r/GUI/BitmapCache.cpp | 21 ++++++++++++--- src/slic3r/GUI/BitmapCache.hpp | 6 ++--- src/slic3r/GUI/wxExtensions.cpp | 46 ++++++++++----------------------- src/slic3r/GUI/wxExtensions.hpp | 8 ++---- 4 files changed, 37 insertions(+), 44 deletions(-) diff --git a/src/slic3r/GUI/BitmapCache.cpp b/src/slic3r/GUI/BitmapCache.cpp index 7322a88d1c..b80ac17263 100644 --- a/src/slic3r/GUI/BitmapCache.cpp +++ b/src/slic3r/GUI/BitmapCache.cpp @@ -49,12 +49,20 @@ static wxBitmap wxImage_to_wxBitmap_with_alpha(wxImage &&image, float scale = 1. #endif } -wxBitmap* BitmapCache::insert(const std::string &bitmap_key, size_t width, size_t height) +wxBitmap* BitmapCache::insert(const std::string &bitmap_key, size_t width, size_t height, float scale/* = 1.0f*/) { wxBitmap *bitmap = nullptr; auto it = m_map.find(bitmap_key); if (it == m_map.end()) { bitmap = new wxBitmap(width, height); +#ifdef __APPLE__ + // Contrary to intuition, the `scale` argument isn't "please scale this to such and such" + // but rather "the wxImage is sized for backing scale such and such". + // So, We need to let the Mac OS wxBitmap implementation + // know that the image may already be scaled appropriately for Retina, + // and thereby that it's not supposed to upscale it. + return bitmap->CreateScaled(width, height, scale); +#endif m_map[bitmap_key] = bitmap; } else { bitmap = it->second; @@ -95,7 +103,7 @@ wxBitmap* BitmapCache::insert(const std::string &bitmap_key, const wxBitmap &bmp return this->insert(bitmap_key, bmps, bmps + 3); } -wxBitmap* BitmapCache::insert(const std::string &bitmap_key, const wxBitmap *begin, const wxBitmap *end) +wxBitmap* BitmapCache::insert(const std::string &bitmap_key, const wxBitmap *begin, const wxBitmap *end, float scale/* = 1.0f*/) { size_t width = 0; size_t height = 0; @@ -158,6 +166,12 @@ wxBitmap* BitmapCache::insert(const std::string &bitmap_key, const wxBitmap *beg #else +#ifdef __APPLE__ + // Note, for this moment width and height are scaled, so divide them by scale to avoid one more multiplication inside CreateScaled() + width *= 1.0 / scale; + height *= 1.0 / scale; +#endif + wxBitmap *bitmap = this->insert(bitmap_key, width, height); wxMemoryDC memDC; memDC.SelectObject(*bitmap); @@ -167,7 +181,8 @@ wxBitmap* BitmapCache::insert(const std::string &bitmap_key, const wxBitmap *beg for (const wxBitmap *bmp = begin; bmp != end; ++ bmp) { if (bmp->GetWidth() > 0) memDC.DrawBitmap(*bmp, x, 0, true); - x += bmp->GetWidth(); + // we should "move" with step equal to non-scaled width + x += bmp->GetWidth()/scale; } memDC.SelectObject(wxNullBitmap); return bitmap; diff --git a/src/slic3r/GUI/BitmapCache.hpp b/src/slic3r/GUI/BitmapCache.hpp index 041e7d8920..49d45c66ac 100644 --- a/src/slic3r/GUI/BitmapCache.hpp +++ b/src/slic3r/GUI/BitmapCache.hpp @@ -23,12 +23,12 @@ public: wxBitmap* find(const std::string &name) { auto it = m_map.find(name); return (it == m_map.end()) ? nullptr : it->second; } const wxBitmap* find(const std::string &name) const { return const_cast(this)->find(name); } - wxBitmap* insert(const std::string &name, size_t width, size_t height); + wxBitmap* insert(const std::string &name, size_t width, size_t height, float scale = 1.0f); wxBitmap* insert(const std::string &name, const wxBitmap &bmp); wxBitmap* insert(const std::string &name, const wxBitmap &bmp, const wxBitmap &bmp2); wxBitmap* insert(const std::string &name, const wxBitmap &bmp, const wxBitmap &bmp2, const wxBitmap &bmp3); - wxBitmap* insert(const std::string &name, const std::vector &bmps) { return this->insert(name, &bmps.front(), &bmps.front() + bmps.size()); } - wxBitmap* insert(const std::string &name, const wxBitmap *begin, const wxBitmap *end); + wxBitmap* insert(const std::string &name, const std::vector &bmps, float scale = 1.0f) { return this->insert(name, &bmps.front(), &bmps.front() + bmps.size(), scale); } + wxBitmap* insert(const std::string &name, const wxBitmap *begin, const wxBitmap *end, float scale = 1.0f); wxBitmap* insert_raw_rgba(const std::string &bitmap_key, unsigned width, unsigned height, const unsigned char *raw_data, float scale = 1.0f, const bool grayscale = false); // Load png from resources/icons. bitmap_key is given without the .png suffix. Bitmap will be rescaled to provided height/width if nonzero. diff --git a/src/slic3r/GUI/wxExtensions.cpp b/src/slic3r/GUI/wxExtensions.cpp index 8e2bc1d97c..b710d2cd79 100644 --- a/src/slic3r/GUI/wxExtensions.cpp +++ b/src/slic3r/GUI/wxExtensions.cpp @@ -66,7 +66,7 @@ void enable_menu_item(wxUpdateUIEvent& evt, std::function const cb_condi const auto it = msw_menuitem_bitmaps.find(item->GetId()); if (it != msw_menuitem_bitmaps.end()) { - const wxBitmap& item_icon = create_scaled_bitmap(win, it->second, 16, false, !enable); + const wxBitmap& item_icon = create_scaled_bitmap(win, it->second, 16, !enable); if (item_icon.IsOk()) item->SetBitmap(item_icon); } @@ -420,41 +420,25 @@ float get_svg_scale_factor(wxWindow *win) } return win != nullptr ? max_scaling_factor : 1.0f; #else + (void)(win); return 1.0f; #endif } // If an icon has horizontal orientation (width > height) call this function with is_horizontal = true wxBitmap create_scaled_bitmap(wxWindow *win, const std::string& bmp_name_in, - const int px_cnt/* = 16*/, const bool is_horizontal /* = false*/, const bool grayscale/* = false*/) + const int px_cnt/* = 16*/, const bool grayscale/* = false*/) { static Slic3r::GUI::BitmapCache cache; -#ifdef __APPLE__ - // Note: win->GetContentScaleFactor() is not used anymore here because it tends to - // return bogus results quite often (such as 1.0 on Retina or even 0.0). - // We're using the max scaling factor across all screens because it's very likely to be good enough. + const float scale_factor = get_svg_scale_factor(win); - static float max_scaling_factor = NAN; - if (std::isnan(max_scaling_factor)) { - max_scaling_factor = Slic3r::GUI::mac_max_scaling_factor(); - } - const float scale_factor = win != nullptr ? max_scaling_factor : 1.0f; -#else - (void)(win); - const float scale_factor = 1.0f; -#endif - - unsigned int height, width = height = 0; - unsigned int& scale_base = is_horizontal ? width : height; - - scale_base = (unsigned int)(em_unit(win) * px_cnt * 0.1f + 0.5f); + unsigned int width = 0; + unsigned int height = (unsigned int)(em_unit(win) * px_cnt * 0.1f + 0.5f); std::string bmp_name = bmp_name_in; boost::replace_last(bmp_name, ".png", ""); -// std::string bmp_name = icon_name_respected_to_mode(bmp_name_in); - // Try loading an SVG first, then PNG if SVG is not found: wxBitmap *bmp = cache.load_svg(bmp_name, width, height, scale_factor, grayscale, Slic3r::GUI::wxGetApp().dark_mode()); if (bmp == nullptr) { @@ -682,7 +666,7 @@ void ObjectDataViewModelNode::update_settings_digest_bitmaps() for (auto& cat : m_opt_categories) bmps.emplace_back( categories_icon.find(cat) == categories_icon.end() ? wxNullBitmap : categories_icon.at(cat)); - bmp = m_bitmap_cache->insert(scaled_bitmap_name, bmps); + bmp = m_bitmap_cache->insert(scaled_bitmap_name, bmps, get_svg_scale_factor(m_ctrl)); } m_bmp = *bmp; @@ -2470,18 +2454,17 @@ void MenuWithSeparators::SetSecondSeparator() // ---------------------------------------------------------------------------- ScalableBitmap::ScalableBitmap( wxWindow *parent, const std::string& icon_name/* = ""*/, - const int px_cnt/* = 16*/, - const bool is_horizontal/* = false*/): + const int px_cnt/* = 16*/): m_parent(parent), m_icon_name(icon_name), - m_px_cnt(px_cnt), m_is_horizontal(is_horizontal) + m_px_cnt(px_cnt) { - m_bmp = create_scaled_bitmap(parent, icon_name, px_cnt, is_horizontal); + m_bmp = create_scaled_bitmap(parent, icon_name, px_cnt); } void ScalableBitmap::msw_rescale() { - m_bmp = create_scaled_bitmap(m_parent, m_icon_name, m_px_cnt, m_is_horizontal); + m_bmp = create_scaled_bitmap(m_parent, m_icon_name, m_px_cnt); } // ---------------------------------------------------------------------------- @@ -2522,8 +2505,7 @@ ScalableButton::ScalableButton( wxWindow * parent, long style /*= wxBU_EXACTFIT | wxNO_BORDER*/) : m_parent(parent), m_current_icon_name(bitmap.name()), - m_px_cnt(bitmap.px_cnt()), - m_is_horizontal(bitmap.is_horizontal()) + m_px_cnt(bitmap.px_cnt()) { Create(parent, id, label, wxDefaultPosition, wxDefaultSize, style); #ifdef __WXMSW__ @@ -2554,9 +2536,9 @@ int ScalableButton::GetBitmapHeight() void ScalableButton::msw_rescale() { - SetBitmap(create_scaled_bitmap(m_parent, m_current_icon_name, m_px_cnt, m_is_horizontal)); + SetBitmap(create_scaled_bitmap(m_parent, m_current_icon_name, m_px_cnt)); if (!m_disabled_icon_name.empty()) - SetBitmapDisabled(create_scaled_bitmap(m_parent, m_disabled_icon_name, m_px_cnt, m_is_horizontal)); + SetBitmapDisabled(create_scaled_bitmap(m_parent, m_disabled_icon_name, m_px_cnt)); if (m_width > 0 || m_height>0) { diff --git a/src/slic3r/GUI/wxExtensions.hpp b/src/slic3r/GUI/wxExtensions.hpp index 1ee42dc292..c3d26c8be9 100644 --- a/src/slic3r/GUI/wxExtensions.hpp +++ b/src/slic3r/GUI/wxExtensions.hpp @@ -56,7 +56,7 @@ int em_unit(wxWindow* win); float get_svg_scale_factor(wxWindow* win); wxBitmap create_scaled_bitmap(wxWindow *win, const std::string& bmp_name, - const int px_cnt = 16, const bool is_horizontal = false, const bool grayscale = false); + const int px_cnt = 16, const bool grayscale = false); std::vector get_extruder_color_icons(bool thin_icon = false); void apply_extruder_selector(wxBitmapComboBox** ctrl, @@ -729,8 +729,7 @@ public: ScalableBitmap() {}; ScalableBitmap( wxWindow *parent, const std::string& icon_name = "", - const int px_cnt = 16, - const bool is_horizontal = false); + const int px_cnt = 16); ~ScalableBitmap() {} @@ -741,14 +740,12 @@ public: const std::string& name() const{ return m_icon_name; } int px_cnt()const {return m_px_cnt;} - bool is_horizontal()const {return m_is_horizontal;} private: wxWindow* m_parent{ nullptr }; wxBitmap m_bmp = wxBitmap(); std::string m_icon_name = ""; int m_px_cnt {16}; - bool m_is_horizontal {false}; }; @@ -832,7 +829,6 @@ private: // bitmap dimensions int m_px_cnt{ 16 }; - bool m_is_horizontal{ false }; }; From cd2973fad361a8dd392ac4342c08a464f2b8fce5 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Tue, 28 Jan 2020 16:23:05 +0100 Subject: [PATCH 183/336] Typo fix for https://github.com/prusa3d/PrusaSlicer/commit/a38735b4ae78611fe10f3422ccfd54e690ce1a88 --- src/slic3r/GUI/BitmapCache.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/slic3r/GUI/BitmapCache.cpp b/src/slic3r/GUI/BitmapCache.cpp index b80ac17263..60efcc4290 100644 --- a/src/slic3r/GUI/BitmapCache.cpp +++ b/src/slic3r/GUI/BitmapCache.cpp @@ -61,7 +61,7 @@ wxBitmap* BitmapCache::insert(const std::string &bitmap_key, size_t width, size_ // So, We need to let the Mac OS wxBitmap implementation // know that the image may already be scaled appropriately for Retina, // and thereby that it's not supposed to upscale it. - return bitmap->CreateScaled(width, height, scale); + bitmap->CreateScaled(width, height, -1, scale); #endif m_map[bitmap_key] = bitmap; } else { From d45744b7bb95c8990a248dcf9d1419f3b5a42aa6 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Tue, 28 Jan 2020 16:23:05 +0100 Subject: [PATCH 184/336] Typo fix for https://github.com/prusa3d/PrusaSlicer/commit/a38735b4ae78611fe10f3422ccfd54e690ce1a88 --- src/slic3r/GUI/BitmapCache.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/slic3r/GUI/BitmapCache.cpp b/src/slic3r/GUI/BitmapCache.cpp index 60efcc4290..8d65ae90bf 100644 --- a/src/slic3r/GUI/BitmapCache.cpp +++ b/src/slic3r/GUI/BitmapCache.cpp @@ -172,7 +172,7 @@ wxBitmap* BitmapCache::insert(const std::string &bitmap_key, const wxBitmap *beg height *= 1.0 / scale; #endif - wxBitmap *bitmap = this->insert(bitmap_key, width, height); + wxBitmap *bitmap = this->insert(bitmap_key, width, height, scale); wxMemoryDC memDC; memDC.SelectObject(*bitmap); memDC.SetBackground(*wxTRANSPARENT_BRUSH); From 5ae2f8a467ccd41f0debd675ee38eee1edea6c62 Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Wed, 29 Jan 2020 10:07:10 +0100 Subject: [PATCH 185/336] Function sla_trafo made accessible from outside SLAPrint.cpp unit --- src/libslic3r/SLAPrint.cpp | 8 ++++---- src/libslic3r/SLAPrint.hpp | 3 +++ 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/libslic3r/SLAPrint.cpp b/src/libslic3r/SLAPrint.cpp index 4c10a44fae..23b4a8046e 100644 --- a/src/libslic3r/SLAPrint.cpp +++ b/src/libslic3r/SLAPrint.cpp @@ -122,10 +122,10 @@ void SLAPrint::clear() } // Transformation without rotation around Z and without a shift by X and Y. -static Transform3d sla_trafo(const SLAPrint& p, const ModelObject &model_object) +Transform3d SLAPrint::sla_trafo(const ModelObject &model_object) const { - Vec3d corr = p.relative_correction(); + Vec3d corr = this->relative_correction(); ModelInstance &model_instance = *model_object.instances.front(); Vec3d offset = model_instance.get_offset(); @@ -376,7 +376,7 @@ SLAPrint::ApplyStatus SLAPrint::apply(const Model &model, DynamicPrintConfig con bool sla_trafo_differs = model_object.instances.empty() != model_object_new.instances.empty() || (! model_object.instances.empty() && - (! sla_trafo(*this, model_object).isApprox(sla_trafo(*this, model_object_new)) || + (! sla_trafo(model_object).isApprox(sla_trafo(model_object_new)) || model_object.instances.front()->is_left_handed() != model_object_new.instances.front()->is_left_handed())); if (model_parts_differ || sla_trafo_differs) { // The very first step (the slicing step) is invalidated. One may freely remove all associated PrintObjects. @@ -453,7 +453,7 @@ SLAPrint::ApplyStatus SLAPrint::apply(const Model &model, DynamicPrintConfig con // FIXME: this invalidates the transformed mesh in SLAPrintObject // which is expensive to calculate (especially the raw_mesh() call) - print_object->set_trafo(sla_trafo(*this, model_object), model_object.instances.front()->is_left_handed()); + print_object->set_trafo(sla_trafo(model_object), model_object.instances.front()->is_left_handed()); print_object->set_instances(std::move(new_instances)); diff --git a/src/libslic3r/SLAPrint.hpp b/src/libslic3r/SLAPrint.hpp index 771ca0bcd6..871fb3de43 100644 --- a/src/libslic3r/SLAPrint.hpp +++ b/src/libslic3r/SLAPrint.hpp @@ -421,6 +421,9 @@ public: // Extracted value from the configuration objects Vec3d relative_correction() const; + // Return sla tansformation for a given model_object + Transform3d sla_trafo(const ModelObject &model_object) const; + std::string output_filename(const std::string &filename_base = std::string()) const override; const SLAPrintStatistics& print_statistics() const { return m_print_statistics; } From 76927ce3995c94b28d45b07c32926c867134453d Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Wed, 29 Jan 2020 10:07:59 +0100 Subject: [PATCH 186/336] REVERT LATER: TEMPORARILY MANGLED reload_scene FUNCTION This commit horribly cripples reload_scene function just to update volumes in scene so that Hollowing and SLASupport gizmos can be updated to the new logic It should be later reverted and the same be achieved in a better way --- src/slic3r/GUI/GLCanvas3D.cpp | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 8805dc92c8..32d359429b 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -1930,6 +1930,8 @@ void GLCanvas3D::mirror_selection(Axis axis) // 5) Out of bed collision status & message overlay (texture) void GLCanvas3D::reload_scene(bool refresh_immediately, bool force_full_scene_refresh) { + force_full_scene_refresh = true; + if ((m_canvas == nullptr) || (m_config == nullptr) || (m_model == nullptr)) return; @@ -2189,9 +2191,28 @@ void GLCanvas3D::reload_scene(bool refresh_immediately, bool force_full_scene_re } // Shift-up all volumes of the object so that it has the right elevation with respect to the print bed - for (GLVolume* volume : m_volumes.volumes) + for (GLVolume* volume : m_volumes.volumes) { if (volume->object_idx() < (int)m_model->objects.size() && m_model->objects[volume->object_idx()]->instances[volume->instance_idx()]->is_printable()) volume->set_sla_shift_z(shift_zs[volume->object_idx()]); + + // Just an experiment for now - replace the mesh with a hollowed one. + for (size_t po_idx=0; po_idxobjects().size(); ++po_idx) { + const SLAPrintObject* po = sla_print->objects()[po_idx]; + if (po_idx != volume->composite_id.object_id || volume->composite_id.volume_id < 0) + continue; + if (po->is_step_done(slaposHollowing)) { + TriangleMesh mesh = po->get_mesh(slaposHollowing); + if (mesh.empty()) + continue; + Transform3d t = sla_print->sla_trafo(*m_model->objects[volume->object_idx()]); + mesh.transform(t.inverse()); + GLIndexedVertexArray iva; + iva.load_mesh(mesh); + volume->indexed_vertex_array = iva; + volume->finalize_geometry(true); + } + } + } } if (printer_technology == ptFFF && m_config->has("nozzle_diameter")) From 46fdce116922368613ff01786fc21f0c650ef1f1 Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Tue, 28 Jan 2020 10:20:37 +0100 Subject: [PATCH 187/336] SLA gizmos can now fetch hollowed and drilled mesh from the backend --- src/slic3r/GUI/Gizmos/GLGizmoBase.cpp | 51 +++++++++++ src/slic3r/GUI/Gizmos/GLGizmoBase.hpp | 12 ++- src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp | 96 ++++++-------------- src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp | 2 - src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp | 20 ++-- 5 files changed, 99 insertions(+), 82 deletions(-) diff --git a/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp b/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp index 7dce249f28..bde54a0d21 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp @@ -4,6 +4,9 @@ #include #include "slic3r/GUI/GUI_App.hpp" +#include "slic3r/GUI/GLCanvas3D.hpp" +#include "libslic3r/SLAPrint.hpp" +#include "slic3r/GUI/MeshUtils.hpp" @@ -302,5 +305,53 @@ unsigned char picking_checksum_alpha_channel(unsigned char red, unsigned char gr return b; } + + +bool CommonGizmosData::update_from_backend(GLCanvas3D& canvas) +{ + if (! m_model_object) + return false; + + int old_po_idx = m_print_object_idx; + + // First we need a pointer to the respective SLAPrintObject. The index into objects vector is + // cached so we don't have todo it on each render. We only search for the po if needed: + if (m_print_object_idx < 0 || (int)canvas.sla_print()->objects().size() != m_print_objects_count) { + m_print_objects_count = canvas.sla_print()->objects().size(); + m_print_object_idx = -1; + for (const SLAPrintObject* po : canvas.sla_print()->objects()) { + ++m_print_object_idx; + if (po->model_object()->id() == m_model_object->id()) + break; + } + } + + if (m_print_object_idx < 0) + return old_po_idx != m_print_object_idx; + + m_mesh = nullptr; + // Load either the model_object mesh, or one provided by the backend + // This mesh does not account for the possible Z up SLA offset. + const SLAPrintObject* po = canvas.sla_print()->objects()[m_print_object_idx]; + + if (po->is_step_done(slaposHollowing)) + m_mesh = &po->get_mesh_to_print(); + else + m_mesh = &m_model_object->volumes.front()->mesh(); + + m_model_object_id = m_model_object->id(); + + if (m_mesh != m_old_mesh) { + m_mesh_raycaster.reset(new MeshRaycaster(*m_mesh)); + m_object_clipper.reset(); + m_supports_clipper.reset(); + m_old_mesh = m_mesh; + return true; + } + return false; +} + + + } // namespace GUI } // namespace Slic3r diff --git a/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp b/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp index 9479174fbd..0ff00a1697 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp @@ -31,6 +31,7 @@ static const float CONSTRAINED_COLOR[4] = { 0.5f, 0.5f, 0.5f, 1.0f }; class ImGuiWrapper; class CommonGizmosData; +class GLCanvas3D; class GLGizmoBase { @@ -189,9 +190,11 @@ class MeshClipper; class CommonGizmosData { public: const TriangleMesh* mesh() const { - return (! m_mesh ? nullptr : (m_cavity_mesh ? m_cavity_mesh.get() : m_mesh)); + return (! m_mesh ? nullptr : m_mesh); //(m_cavity_mesh ? m_cavity_mesh.get() : m_mesh)); } + bool update_from_backend(GLCanvas3D& canvas); + ModelObject* m_model_object = nullptr; @@ -200,8 +203,8 @@ public: std::unique_ptr m_object_clipper; std::unique_ptr m_supports_clipper; - std::unique_ptr m_cavity_mesh; - std::unique_ptr m_volume_with_cavity; + //std::unique_ptr m_cavity_mesh; + //std::unique_ptr m_volume_with_cavity; int m_active_instance = -1; float m_active_instance_bb_radius = 0; @@ -209,6 +212,9 @@ public: int m_print_object_idx = -1; int m_print_objects_count = -1; int m_old_timestamp = -1; + +private: + const TriangleMesh* m_old_mesh; }; } // namespace GUI diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp index 0422982745..51bc1b34f4 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp @@ -69,24 +69,24 @@ void GLGizmoHollow::set_sla_support_data(ModelObject* model_object, const Select || m_c->m_active_instance != selection.get_instance_idx()) { m_c->m_model_object = model_object; m_c->m_print_object_idx = -1; + m_c->m_mesh_raycaster.reset(); m_c->m_active_instance = selection.get_instance_idx(); something_changed = true; } - if (model_object && something_changed && selection.is_from_single_instance()) + if (model_object + && selection.is_from_single_instance() + && (m_c->update_from_backend(m_parent) || something_changed)) { // Cache the bb - it's needed for dealing with the clipping plane quite often // It could be done inside update_mesh but one has to account for scaling of the instance. m_c->m_active_instance_bb_radius = m_c->m_model_object->instance_bounding_box(m_c->m_active_instance).radius(); - if (is_mesh_update_necessary()) { - update_mesh(); - reload_cache(); - } + reload_cache(); if (m_state == On) { m_parent.toggle_model_objects_visibility(false); - m_parent.toggle_model_objects_visibility(! m_c->m_cavity_mesh, m_c->m_model_object, m_c->m_active_instance); + m_parent.toggle_model_objects_visibility(true, m_c->m_model_object, m_c->m_active_instance); m_parent.toggle_sla_auxiliaries_visibility(m_show_supports, m_c->m_model_object, m_c->m_active_instance); } else @@ -109,8 +109,8 @@ void GLGizmoHollow::on_render() const return; } - if (! m_c->m_mesh) - const_cast(this)->update_mesh(); + // !!! is it necessary? + const_cast(this)->m_c->update_from_backend(m_parent); glsafe(::glEnable(GL_BLEND)); glsafe(::glEnable(GL_DEPTH_TEST)); @@ -132,7 +132,7 @@ void GLGizmoHollow::on_render() const void GLGizmoHollow::render_hollowed_mesh() const { - if (m_c->m_volume_with_cavity) { + /*if (m_c->m_volume_with_cavity) { m_c->m_volume_with_cavity->set_sla_shift_z(m_z_shift); m_parent.get_shader().start_using(); @@ -148,14 +148,13 @@ void GLGizmoHollow::render_hollowed_mesh() const m_c->m_volume_with_cavity->set_instance_transformation(m_c->m_model_object->instances[size_t(m_c->m_active_instance)]->get_transformation()); m_c->m_volume_with_cavity->render(color_id, print_box_detection_id, print_box_worldmatrix_id); m_parent.get_shader().stop_using(); - } + }*/ } - void GLGizmoHollow::render_clipping_plane(const Selection& selection) const { - if (m_clipping_plane_distance == 0.f || m_c->mesh()->empty()) + if (m_clipping_plane_distance == 0.f) return; // Get transformation of the instance @@ -182,17 +181,9 @@ void GLGizmoHollow::render_clipping_plane(const Selection& selection) const // Next, ask the backend if supports are already calculated. If so, we are gonna cut them too. - // First we need a pointer to the respective SLAPrintObject. The index into objects vector is - // cached so we don't have todo it on each render. We only search for the po if needed: - if (m_c->m_print_object_idx < 0 || (int)m_parent.sla_print()->objects().size() != m_c->m_print_objects_count) { - m_c->m_print_objects_count = m_parent.sla_print()->objects().size(); - m_c->m_print_object_idx = -1; - for (const SLAPrintObject* po : m_parent.sla_print()->objects()) { - ++m_c->m_print_object_idx; - if (po->model_object()->id() == m_c->m_model_object->id()) - break; - } - } + if (m_c->m_print_object_idx < 0) + m_c->update_from_backend(m_parent); + if (m_c->m_print_object_idx >= 0) { const SLAPrintObject* print_object = m_parent.sla_print()->objects()[m_c->m_print_object_idx]; @@ -355,47 +346,13 @@ bool GLGizmoHollow::is_mesh_point_clipped(const Vec3d& point) const -bool GLGizmoHollow::is_mesh_update_necessary() const -{ - return ((m_state == On) && (m_c->m_model_object != nullptr) && !m_c->m_model_object->instances.empty()) - && ((m_c->m_model_object->id() != m_c->m_model_object_id) || ! m_c->m_mesh); -} - - - -void GLGizmoHollow::update_mesh() -{ - if (! m_c->m_model_object) - return; - - wxBusyCursor wait; - // this way we can use that mesh directly. - // This mesh does not account for the possible Z up SLA offset. - m_c->m_mesh = &m_c->m_model_object->volumes.front()->mesh(); - - // If this is different mesh than last time - if (m_c->m_model_object_id != m_c->m_model_object->id()) { - m_c->m_cavity_mesh.reset(); // dump the cavity - m_c->m_volume_with_cavity.reset(); - m_parent.toggle_model_objects_visibility(true, m_c->m_model_object, m_c->m_active_instance); - m_c->m_mesh_raycaster.reset(); - } - - if (! m_c->m_mesh_raycaster) - m_c->m_mesh_raycaster.reset(new MeshRaycaster(*m_c->mesh())); - - m_c->m_model_object_id = m_c->m_model_object->id(); -} - - - // Unprojects the mouse position on the mesh and saves hit point and normal of the facet into pos_and_normal // Return false if no intersection was found, true otherwise. bool GLGizmoHollow::unproject_on_mesh(const Vec2d& mouse_pos, std::pair& pos_and_normal) { // if the gizmo doesn't have the V, F structures for igl, calculate them first: - if (! m_c->m_mesh_raycaster) - update_mesh(); + // !!! is it really necessary? + m_c->update_from_backend(m_parent); const Camera& camera = m_parent.get_camera(); const Selection& selection = m_parent.get_selection(); @@ -605,7 +562,7 @@ void GLGizmoHollow::update_mesh_raycaster(std::unique_ptr &&rc) { m_c->m_mesh_raycaster = std::move(rc); m_c->m_object_clipper.reset(); - m_c->m_volume_with_cavity.reset(); + //m_c->m_volume_with_cavity.reset(); } void GLGizmoHollow::hollow_mesh(bool postpone_error_messages) @@ -622,7 +579,7 @@ void GLGizmoHollow::hollow_mesh(bool postpone_error_messages) void GLGizmoHollow::update_hollowed_mesh(std::unique_ptr &&mesh) { // Called from Plater when the UI job finishes - m_c->m_cavity_mesh = std::move(mesh); + /*m_c->m_cavity_mesh = std::move(mesh); if(m_c->m_cavity_mesh) { // First subtract the holes: @@ -668,7 +625,7 @@ void GLGizmoHollow::update_hollowed_mesh(std::unique_ptr &&mesh) if (m_clipping_plane_distance == 0.f) { m_clipping_plane_distance = 0.5f; update_clipping_plane(); - } + }*/ } std::vector> GLGizmoHollow::get_config_options(const std::vector& keys) const @@ -745,12 +702,13 @@ RENDER_AGAIN: wxGetApp().obj_list()->update_and_show_object_settings_item(); } } - m_imgui->disabled_begin(! m_enable_hollowing); ImGui::SameLine(); if (m_imgui->button(m_desc["preview"])) hollow_mesh(); + m_imgui->disabled_begin(! m_enable_hollowing); + std::vector opts_keys = {"hollowing_min_thickness", "hollowing_quality", "hollowing_closing_distance"}; auto opts = get_config_options(opts_keys); auto* offset_cfg = static_cast(opts[0].first); @@ -995,17 +953,17 @@ void GLGizmoHollow::on_set_state() if (m_state == On && m_old_state != On) { // the gizmo was just turned on //Plater::TakeSnapshot snapshot(wxGetApp().plater(), _(L("SLA gizmo turned on"))); - if (is_mesh_update_necessary()) - update_mesh(); + m_c->update_from_backend(m_parent); // we'll now reload support points: if (m_c->m_model_object) reload_cache(); m_parent.toggle_model_objects_visibility(false); - if (m_c->m_model_object) - m_parent.toggle_model_objects_visibility(! m_c->m_cavity_mesh, m_c->m_model_object, m_c->m_active_instance); - m_parent.toggle_sla_auxiliaries_visibility(m_show_supports, m_c->m_model_object, m_c->m_active_instance); + if (m_c->m_model_object) { + m_parent.toggle_model_objects_visibility(true, m_c->m_model_object, m_c->m_active_instance); + m_parent.toggle_sla_auxiliaries_visibility(m_show_supports, m_c->m_model_object, m_c->m_active_instance); + } // Set default head diameter from config. //const DynamicPrintConfig& cfg = wxGetApp().preset_bundle->sla_prints.get_edited_preset().config; @@ -1128,6 +1086,8 @@ void GLGizmoHollow::reload_cache() void GLGizmoHollow::update_clipping_plane(bool keep_normal) const { + if (! m_c->m_model_object) + return; Vec3d normal = (keep_normal && m_clipping_plane->get_normal() != Vec3d::Zero() ? m_clipping_plane->get_normal() : -m_parent.get_camera().get_dir_forward()); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp index 79b0a69297..617d0b2e6f 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp @@ -53,8 +53,6 @@ private: void render_points(const Selection& selection, bool picking = false) const; void render_clipping_plane(const Selection& selection) const; void render_hollowed_mesh() const; - bool is_mesh_update_necessary() const; - void update_mesh(); void hollow_mesh(bool postpone_error_messages = false); bool unsaved_changes() const; diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp index c6e0d9007b..f63980d938 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp @@ -63,6 +63,8 @@ bool GLGizmoSlaSupports::on_init() void GLGizmoSlaSupports::set_sla_support_data(ModelObject* model_object, const Selection& selection) { + return; + if (! model_object || selection.is_empty()) { m_c->m_model_object = nullptr; return; @@ -87,7 +89,7 @@ void GLGizmoSlaSupports::set_sla_support_data(ModelObject* model_object, const S m_c->m_active_instance_bb_radius = m_c->m_model_object->instance_bounding_box(m_c->m_active_instance).radius(); if (m_state == On) { m_parent.toggle_model_objects_visibility(false); - m_parent.toggle_model_objects_visibility(! m_c->m_cavity_mesh, m_c->m_model_object, m_c->m_active_instance); + m_parent.toggle_model_objects_visibility(/*! m_c->m_cavity_mesh*/ true, m_c->m_model_object, m_c->m_active_instance); m_parent.toggle_sla_auxiliaries_visibility(! m_editing_mode, m_c->m_model_object, m_c->m_active_instance); } else @@ -143,7 +145,7 @@ void GLGizmoSlaSupports::on_render() const void GLGizmoSlaSupports::render_hollowed_mesh() const { - if (m_c->m_volume_with_cavity) { + /*if (m_c->m_volume_with_cavity) { m_c->m_volume_with_cavity->set_sla_shift_z(m_z_shift); m_parent.get_shader().start_using(); @@ -159,7 +161,7 @@ void GLGizmoSlaSupports::render_hollowed_mesh() const m_c->m_volume_with_cavity->set_instance_transformation(m_c->m_model_object->instances[size_t(m_c->m_active_instance)]->get_transformation()); m_c->m_volume_with_cavity->render(color_id, print_box_detection_id, print_box_worldmatrix_id); m_parent.get_shader().stop_using(); - } + }*/ } @@ -359,7 +361,7 @@ void GLGizmoSlaSupports::render_points(const Selection& selection, bool picking) } // Now render the drain holes: - if (! m_c->m_cavity_mesh) { + /*if (! m_c->m_cavity_mesh) { render_color[0] = 0.7f; render_color[1] = 0.7f; render_color[2] = 0.7f; @@ -394,7 +396,7 @@ void GLGizmoSlaSupports::render_points(const Selection& selection, bool picking) glFrontFace(GL_CCW); glsafe(::glPopMatrix()); } - } + }*/ if (!picking) glsafe(::glDisable(GL_LIGHTING)); @@ -467,14 +469,14 @@ bool GLGizmoSlaSupports::unproject_on_mesh(const Vec2d& mouse_pos, std::pairm_cavity_mesh) { + /*if (! m_c->m_cavity_mesh) { for (const sla::DrainHole& hole : m_c->m_model_object->sla_drain_holes) { if (hole.is_inside(hit)) { in_hole = true; break; } } - } + }*/ if (! in_hole) { // Return both the point and the facet normal. pos_and_normal = std::make_pair(hit, normal); @@ -1051,7 +1053,7 @@ void GLGizmoSlaSupports::on_set_state() reload_cache(); m_parent.toggle_model_objects_visibility(false); - if (m_c->m_model_object && ! m_c->m_cavity_mesh) + if (m_c->m_model_object /*&& ! m_c->m_cavity_mesh*/) m_parent.toggle_model_objects_visibility(true, m_c->m_model_object, m_c->m_active_instance); m_parent.toggle_sla_auxiliaries_visibility(! m_editing_mode, m_c->m_model_object, m_c->m_active_instance); @@ -1087,7 +1089,7 @@ void GLGizmoSlaSupports::on_set_state() m_its = nullptr; m_c->m_object_clipper.reset(); m_c->m_supports_clipper.reset(); - m_c->m_mesh_raycaster.reset(); + //m_c->m_mesh_raycaster.reset(); } } m_old_state = m_state; From 3f73261fdb2653ca304210dc3e4766f46fa568e0 Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Tue, 28 Jan 2020 12:41:48 +0100 Subject: [PATCH 188/336] Fixed transformation of the hollowed mesh to be used at frontend Common gizmos data update is called from GLGizmoManager --- src/slic3r/GUI/Gizmos/GLGizmoBase.cpp | 23 +++++++++++++------- src/slic3r/GUI/Gizmos/GLGizmoBase.hpp | 1 + src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp | 6 +++-- src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp | 3 +++ src/slic3r/GUI/Gizmos/GLGizmosManager.cpp | 3 +++ 5 files changed, 26 insertions(+), 10 deletions(-) diff --git a/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp b/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp index bde54a0d21..e753157448 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp @@ -326,18 +326,24 @@ bool CommonGizmosData::update_from_backend(GLCanvas3D& canvas) } } - if (m_print_object_idx < 0) - return old_po_idx != m_print_object_idx; - m_mesh = nullptr; // Load either the model_object mesh, or one provided by the backend // This mesh does not account for the possible Z up SLA offset. - const SLAPrintObject* po = canvas.sla_print()->objects()[m_print_object_idx]; + // The backend mesh needs to be transformed and because a pointer to it is + // saved, a copy is stored as a member (FIXME) + if (m_print_object_idx >=0) { + const SLAPrintObject* po = canvas.sla_print()->objects()[m_print_object_idx]; + if (po->is_step_done(slaposHollowing)) { + m_backend_mesh_transformed = po->get_mesh_to_print(); + m_backend_mesh_transformed.transform(canvas.sla_print()->sla_trafo(*m_model_object).inverse()); + m_mesh = &m_backend_mesh_transformed; + } + } - if (po->is_step_done(slaposHollowing)) - m_mesh = &po->get_mesh_to_print(); - else + if (! m_mesh) { m_mesh = &m_model_object->volumes.front()->mesh(); + m_backend_mesh_transformed.clear(); + } m_model_object_id = m_model_object->id(); @@ -348,7 +354,8 @@ bool CommonGizmosData::update_from_backend(GLCanvas3D& canvas) m_old_mesh = m_mesh; return true; } - return false; + + return m_print_object_idx < 0 ? old_po_idx >=0 : false; } diff --git a/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp b/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp index 0ff00a1697..c5a6d36aa3 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp @@ -215,6 +215,7 @@ public: private: const TriangleMesh* m_old_mesh; + TriangleMesh m_backend_mesh_transformed; }; } // namespace GUI diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp index 51bc1b34f4..80695b4681 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp @@ -76,8 +76,10 @@ void GLGizmoHollow::set_sla_support_data(ModelObject* model_object, const Select if (model_object && selection.is_from_single_instance() - && (m_c->update_from_backend(m_parent) || something_changed)) + && (something_changed)) { + m_c->update_from_backend(m_parent); + // Cache the bb - it's needed for dealing with the clipping plane quite often // It could be done inside update_mesh but one has to account for scaling of the instance. m_c->m_active_instance_bb_radius = m_c->m_model_object->instance_bounding_box(m_c->m_active_instance).radius(); @@ -580,7 +582,7 @@ void GLGizmoHollow::update_hollowed_mesh(std::unique_ptr &&mesh) { // Called from Plater when the UI job finishes /*m_c->m_cavity_mesh = std::move(mesh); - + if(m_c->m_cavity_mesh) { // First subtract the holes: if (! m_c->m_model_object->sla_drain_holes.empty()) { diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp index f63980d938..db514c6e25 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp @@ -1246,6 +1246,9 @@ void GLGizmoSlaSupports::reload_cache() bool GLGizmoSlaSupports::has_backend_supports() const { + if (! m_c->m_model_object) + return false; + // find SlaPrintObject with this ID for (const SLAPrintObject* po : m_parent.sla_print()->objects()) { if (po->model_object()->id() == m_c->m_model_object->id()) diff --git a/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp b/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp index ccc6369e46..acb74fffc1 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp @@ -348,6 +348,9 @@ void GLGizmosManager::set_sla_support_data(ModelObject* model_object) if (!m_enabled || m_gizmos.empty()) return; + // Update common data for hollowing and sla support gizmos. + m_common_gizmos_data->update_from_backend(m_parent); + dynamic_cast(m_gizmos[SlaSupports].get())->set_sla_support_data(model_object, m_parent.get_selection()); dynamic_cast(m_gizmos[Hollow].get())->set_sla_support_data(model_object, m_parent.get_selection()); } From 17a6b696e7a4b94d49e09b8598b0343a3c2ddd40 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Wed, 29 Jan 2020 12:08:38 +0100 Subject: [PATCH 189/336] Workaround to fix SPE-1082 + refactoring of 6 dof camera --- src/slic3r/GUI/Camera.cpp | 111 ++++++++++++++++++++++++++++++++-- src/slic3r/GUI/Camera.hpp | 18 ++++-- src/slic3r/GUI/GLCanvas3D.cpp | 16 +++++ 3 files changed, 137 insertions(+), 8 deletions(-) diff --git a/src/slic3r/GUI/Camera.cpp b/src/slic3r/GUI/Camera.cpp index db0126d659..4eaa5a9e3f 100644 --- a/src/slic3r/GUI/Camera.cpp +++ b/src/slic3r/GUI/Camera.cpp @@ -240,17 +240,27 @@ void Camera::apply_view_matrix() const void Camera::apply_projection(const BoundingBoxf3& box, double near_z, double far_z) const { +#if !ENABLE_6DOF_CAMERA set_distance(DefaultDistance); +#endif // !ENABLE_6DOF_CAMERA double w = 0.0; double h = 0.0; +#if ENABLE_6DOF_CAMERA + double old_distance = m_distance; + m_frustrum_zs = calc_tight_frustrum_zs_around(box); + if (m_distance != old_distance) + // the camera has been moved re-apply view matrix + apply_view_matrix(); +#else while (true) { m_frustrum_zs = calc_tight_frustrum_zs_around(box); +#endif // !ENABLE_6DOF_CAMERA if (near_z > 0.0) - m_frustrum_zs.first = std::min(m_frustrum_zs.first, near_z); + m_frustrum_zs.first = std::max(std::min(m_frustrum_zs.first, near_z), FrustrumMinNearZ); if (far_z > 0.0) m_frustrum_zs.second = std::max(m_frustrum_zs.second, far_z); @@ -281,6 +291,7 @@ void Camera::apply_projection(const BoundingBoxf3& box, double near_z, double fa } } +#if !ENABLE_6DOF_CAMERA if (m_type == Perspective) { double fov_deg = Geometry::rad2deg(2.0 * std::atan(h / m_frustrum_zs.first)); @@ -300,6 +311,7 @@ void Camera::apply_projection(const BoundingBoxf3& box, double near_z, double fa else break; } +#endif // !ENABLE_6DOF_CAMERA glsafe(::glMatrixMode(GL_PROJECTION)); glsafe(::glLoadIdentity()); @@ -324,14 +336,22 @@ void Camera::apply_projection(const BoundingBoxf3& box, double near_z, double fa } #if ENABLE_THUMBNAIL_GENERATOR +#if ENABLE_6DOF_CAMERA +void Camera::zoom_to_box(const BoundingBoxf3& box, double margin_factor) +#else void Camera::zoom_to_box(const BoundingBoxf3& box, int canvas_w, int canvas_h, double margin_factor) +#endif // ENABLE_6DOF_CAMERA #else void Camera::zoom_to_box(const BoundingBoxf3& box, int canvas_w, int canvas_h) #endif // ENABLE_THUMBNAIL_GENERATOR { // Calculate the zoom factor needed to adjust the view around the given box. #if ENABLE_THUMBNAIL_GENERATOR +#if ENABLE_6DOF_CAMERA + double zoom = calc_zoom_to_bounding_box_factor(box, margin_factor); +#else double zoom = calc_zoom_to_bounding_box_factor(box, canvas_w, canvas_h, margin_factor); +#endif // ENABLE_6DOF_CAMERA #else double zoom = calc_zoom_to_bounding_box_factor(box, canvas_w, canvas_h); #endif // ENABLE_THUMBNAIL_GENERATOR @@ -348,10 +368,18 @@ void Camera::zoom_to_box(const BoundingBoxf3& box, int canvas_w, int canvas_h) } #if ENABLE_THUMBNAIL_GENERATOR +#if ENABLE_6DOF_CAMERA +void Camera::zoom_to_volumes(const GLVolumePtrs& volumes, double margin_factor) +#else void Camera::zoom_to_volumes(const GLVolumePtrs& volumes, int canvas_w, int canvas_h, double margin_factor) +#endif // ENABLE_6DOF_CAMERA { Vec3d center; +#if ENABLE_6DOF_CAMERA + double zoom = calc_zoom_to_volumes_factor(volumes, center, margin_factor); +#else double zoom = calc_zoom_to_volumes_factor(volumes, canvas_w, canvas_h, center, margin_factor); +#endif // ENABLE_6DOF_CAMERA if (zoom > 0.0) { m_zoom = zoom; @@ -389,6 +417,7 @@ void Camera::debug_render() const float deltaZ = farZ - nearZ; float zoom = (float)m_zoom; float fov = (float)get_fov(); + std::arrayviewport = get_viewport(); float gui_scale = (float)get_gui_scale(); ImGui::InputText("Type", type.data(), type.length(), ImGuiInputTextFlags_ReadOnly); @@ -408,6 +437,8 @@ void Camera::debug_render() const ImGui::InputFloat("Zoom", &zoom, 0.0f, 0.0f, "%.6f", ImGuiInputTextFlags_ReadOnly); ImGui::InputFloat("Fov", &fov, 0.0f, 0.0f, "%.6f", ImGuiInputTextFlags_ReadOnly); ImGui::Separator(); + ImGui::InputInt4("Viewport", viewport.data(), ImGuiInputTextFlags_ReadOnly); + ImGui::Separator(); ImGui::InputFloat("GUI scale", &gui_scale, 0.0f, 0.0f, "%.6f", ImGuiInputTextFlags_ReadOnly); imgui.end(); } @@ -427,10 +458,31 @@ void Camera::translate_world(const Vec3d& displacement) void Camera::rotate_on_sphere(double delta_azimut_rad, double delta_zenit_rad) { + // FIXME -> The following is a HACK !!! + // When the value of the zenit rotation is large enough, the following call to rotate() shows + // numerical instability introducing some scaling into m_view_matrix (verified by checking + // that the camera space unit vectors are no more unit). + // See also https://dev.prusa3d.com/browse/SPE-1082 + // We split the zenit rotation into a set of smaller rotations which are then applied. + static const double MAX_ALLOWED = Geometry::deg2rad(0.1); + unsigned int zenit_steps_count = 1 + (unsigned int)(std::abs(delta_zenit_rad) / MAX_ALLOWED); + double zenit_step = delta_zenit_rad / (double)zenit_steps_count; + Vec3d target = m_target; translate_world(-target); - m_view_matrix.rotate(Eigen::AngleAxisd(delta_zenit_rad, get_dir_right())); - m_view_matrix.rotate(Eigen::AngleAxisd(delta_azimut_rad, Vec3d::UnitZ())); + + if (zenit_step != 0.0) + { + Vec3d right = get_dir_right(); + for (unsigned int i = 0; i < zenit_steps_count; ++i) + { + m_view_matrix.rotate(Eigen::AngleAxisd(zenit_step, right)); + } + } + + if (delta_azimut_rad != 0.0) + m_view_matrix.rotate(Eigen::AngleAxisd(delta_azimut_rad, Vec3d::UnitZ())); + translate_world(target); } @@ -453,7 +505,11 @@ void Camera::rotate_local_around_pivot(const Vec3d& rotation_rad, const Vec3d& p double Camera::min_zoom() const { +#if ENABLE_6DOF_CAMERA + return 0.7 * calc_zoom_to_bounding_box_factor(m_scene_box); +#else return 0.7 * calc_zoom_to_bounding_box_factor(m_scene_box, (int)m_viewport[2], (int)m_viewport[3]); +#endif // ENABLE_6DOF_CAMERA } #endif // ENABLE_6DOF_CAMERA @@ -462,8 +518,10 @@ std::pair Camera::calc_tight_frustrum_zs_around(const BoundingBo std::pair ret; auto& [near_z, far_z] = ret; +#if !ENABLE_6DOF_CAMERA while (true) { +#endif // !ENABLE_6DOF_CAMERA // box in eye space BoundingBoxf3 eye_box = box.transformed(m_view_matrix); near_z = -eye_box.max(2); @@ -482,18 +540,39 @@ std::pair Camera::calc_tight_frustrum_zs_around(const BoundingBo far_z = mid_z + half_size; } +#if ENABLE_6DOF_CAMERA + if (near_z < FrustrumMinNearZ) + { + float delta = FrustrumMinNearZ - near_z; + set_distance(m_distance + delta); + near_z += delta; + far_z += delta; + } + else if ((near_z > 2.0 * FrustrumMinNearZ) && (m_distance > DefaultDistance)) + { + float delta = m_distance - DefaultDistance; + set_distance(DefaultDistance); + near_z -= delta; + far_z -= delta; + } +#else if (near_z >= FrustrumMinNearZ) break; - // ensure min Near Z + // ensure min near z set_distance(m_distance + FrustrumMinNearZ - near_z); } +#endif // ENABLE_6DOF_CAMERA return ret; } #if ENABLE_THUMBNAIL_GENERATOR +#if ENABLE_6DOF_CAMERA +double Camera::calc_zoom_to_bounding_box_factor(const BoundingBoxf3& box, double margin_factor) const +#else double Camera::calc_zoom_to_bounding_box_factor(const BoundingBoxf3& box, int canvas_w, int canvas_h, double margin_factor) const +#endif // ENABLE_6DOF_CAMERA #else double Camera::calc_zoom_to_bounding_box_factor(const BoundingBoxf3& box, int canvas_w, int canvas_h) const #endif // ENABLE_THUMBNAIL_GENERATOR @@ -505,8 +584,10 @@ double Camera::calc_zoom_to_bounding_box_factor(const BoundingBoxf3& box, int ca // project the box vertices on a plane perpendicular to the camera forward axis // then calculates the vertices coordinate on this plane along the camera xy axes +#if !ENABLE_6DOF_CAMERA // ensure that the view matrix is updated apply_view_matrix(); +#endif // !ENABLE_6DOF_CAMERA Vec3d right = get_dir_right(); Vec3d up = get_dir_up(); @@ -563,11 +644,19 @@ double Camera::calc_zoom_to_bounding_box_factor(const BoundingBoxf3& box, int ca dx *= margin_factor; dy *= margin_factor; +#if ENABLE_6DOF_CAMERA + return std::min((double)m_viewport[2] / dx, (double)m_viewport[3] / dy); +#else return std::min((double)canvas_w / dx, (double)canvas_h / dy); +#endif // ENABLE_6DOF_CAMERA } #if ENABLE_THUMBNAIL_GENERATOR +#if ENABLE_6DOF_CAMERA +double Camera::calc_zoom_to_volumes_factor(const GLVolumePtrs& volumes, Vec3d& center, double margin_factor) const +#else double Camera::calc_zoom_to_volumes_factor(const GLVolumePtrs& volumes, int canvas_w, int canvas_h, Vec3d& center, double margin_factor) const +#endif // ENABLE_6DOF_CAMERA { if (volumes.empty()) return -1.0; @@ -575,8 +664,10 @@ double Camera::calc_zoom_to_volumes_factor(const GLVolumePtrs& volumes, int canv // project the volumes vertices on a plane perpendicular to the camera forward axis // then calculates the vertices coordinate on this plane along the camera xy axes +#if !ENABLE_6DOF_CAMERA // ensure that the view matrix is updated apply_view_matrix(); +#endif // !ENABLE_6DOF_CAMERA Vec3d right = get_dir_right(); Vec3d up = get_dir_up(); @@ -628,14 +719,26 @@ double Camera::calc_zoom_to_volumes_factor(const GLVolumePtrs& volumes, int canv if ((dx <= 0.0) || (dy <= 0.0)) return -1.0f; +#if ENABLE_6DOF_CAMERA + return std::min((double)m_viewport[2] / dx, (double)m_viewport[3] / dy); +#else return std::min((double)canvas_w / dx, (double)canvas_h / dy); +#endif // ENABLE_6DOF_CAMERA } #endif // ENABLE_THUMBNAIL_GENERATOR void Camera::set_distance(double distance) const { +#if ENABLE_6DOF_CAMERA + if (m_distance != distance) + { + m_view_matrix.translate((distance - m_distance) * get_dir_forward()); + m_distance = distance; + } +#else m_distance = distance; apply_view_matrix(); +#endif // ENABLE_6DOF_CAMERA } #if ENABLE_6DOF_CAMERA diff --git a/src/slic3r/GUI/Camera.hpp b/src/slic3r/GUI/Camera.hpp index 6a2bc2bf32..a1c42a0c6b 100644 --- a/src/slic3r/GUI/Camera.hpp +++ b/src/slic3r/GUI/Camera.hpp @@ -48,11 +48,7 @@ private: mutable double m_gui_scale; mutable std::array m_viewport; -#if ENABLE_6DOF_CAMERA - Transform3d m_view_matrix; -#else mutable Transform3d m_view_matrix; -#endif // ENABLE_6DOF_CAMERA mutable Transform3d m_projection_matrix; mutable std::pair m_frustrum_zs; @@ -71,7 +67,11 @@ public: const Vec3d& get_target() const { return m_target; } void set_target(const Vec3d& target); +#if ENABLE_6DOF_CAMERA + double get_distance() const { return (get_position() - m_target).norm(); } +#else double get_distance() const { return m_distance; } +#endif // ENABLE_6DOF_CAMERA double get_gui_scale() const { return m_gui_scale; } #if !ENABLE_6DOF_CAMERA @@ -115,8 +115,13 @@ public: void apply_projection(const BoundingBoxf3& box, double near_z = -1.0, double far_z = -1.0) const; #if ENABLE_THUMBNAIL_GENERATOR +#if ENABLE_6DOF_CAMERA + void zoom_to_box(const BoundingBoxf3& box, double margin_factor = DefaultZoomToBoxMarginFactor); + void zoom_to_volumes(const GLVolumePtrs& volumes, double margin_factor = DefaultZoomToVolumesMarginFactor); +#else void zoom_to_box(const BoundingBoxf3& box, int canvas_w, int canvas_h, double margin_factor = DefaultZoomToBoxMarginFactor); void zoom_to_volumes(const GLVolumePtrs& volumes, int canvas_w, int canvas_h, double margin_factor = DefaultZoomToVolumesMarginFactor); +#endif // ENABLE_6DOF_CAMERA #else void zoom_to_box(const BoundingBoxf3& box, int canvas_w, int canvas_h); #endif // ENABLE_THUMBNAIL_GENERATOR @@ -151,8 +156,13 @@ private: // the camera MUST be outside of the bounding box in eye coordinate of the given box std::pair calc_tight_frustrum_zs_around(const BoundingBoxf3& box) const; #if ENABLE_THUMBNAIL_GENERATOR +#if ENABLE_6DOF_CAMERA + double calc_zoom_to_bounding_box_factor(const BoundingBoxf3& box, double margin_factor = DefaultZoomToBoxMarginFactor) const; + double calc_zoom_to_volumes_factor(const GLVolumePtrs& volumes, Vec3d& center, double margin_factor = DefaultZoomToVolumesMarginFactor) const; +#else double calc_zoom_to_bounding_box_factor(const BoundingBoxf3& box, int canvas_w, int canvas_h, double margin_factor = DefaultZoomToBoxMarginFactor) const; double calc_zoom_to_volumes_factor(const GLVolumePtrs& volumes, int canvas_w, int canvas_h, Vec3d& center, double margin_factor = DefaultZoomToVolumesMarginFactor) const; +#endif // ENABLE_6DOF_CAMERA #else double calc_zoom_to_bounding_box_factor(const BoundingBoxf3& box, int canvas_w, int canvas_h) const; #endif // ENABLE_THUMBNAIL_GENERATOR diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 8805dc92c8..957b4f71df 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -1710,11 +1710,16 @@ void GLCanvas3D::render() } const Size& cnv_size = get_canvas_size(); +#if ENABLE_6DOF_CAMERA + m_camera.apply_viewport(0, 0, (unsigned int)cnv_size.get_width(), (unsigned int)cnv_size.get_height()); +#endif // ENABLE_6DOF_CAMERA if (m_camera.requires_zoom_to_bed) { zoom_to_bed(); +#if !ENABLE_6DOF_CAMERA _resize((unsigned int)cnv_size.get_width(), (unsigned int)cnv_size.get_height()); +#endif // !ENABLE_6DOF_CAMERA m_camera.requires_zoom_to_bed = false; } @@ -3814,8 +3819,13 @@ void GLCanvas3D::_render_thumbnail_internal(ThumbnailData& thumbnail_data, bool #if ENABLE_6DOF_CAMERA camera.set_scene_box(scene_bounding_box()); #endif // ENABLE_6DOF_CAMERA +#if ENABLE_6DOF_CAMERA + camera.apply_viewport(0, 0, thumbnail_data.width, thumbnail_data.height); + camera.zoom_to_volumes(visible_volumes); +#else camera.zoom_to_volumes(visible_volumes, thumbnail_data.width, thumbnail_data.height); camera.apply_viewport(0, 0, thumbnail_data.width, thumbnail_data.height); +#endif // ENABLE_6DOF_CAMERA camera.apply_view_matrix(); double near_z = -1.0; @@ -4406,8 +4416,10 @@ void GLCanvas3D::_resize(unsigned int w, unsigned int h) // ensures that this canvas is current _set_current(); +#if !ENABLE_6DOF_CAMERA // updates camera m_camera.apply_viewport(0, 0, w, h); +#endif // !ENABLE_6DOF_CAMERA } BoundingBoxf3 GLCanvas3D::_max_bounding_box(bool include_gizmos, bool include_bed_model) const @@ -4431,8 +4443,12 @@ BoundingBoxf3 GLCanvas3D::_max_bounding_box(bool include_gizmos, bool include_be #if ENABLE_THUMBNAIL_GENERATOR void GLCanvas3D::_zoom_to_box(const BoundingBoxf3& box, double margin_factor) { +#if ENABLE_6DOF_CAMERA + m_camera.zoom_to_box(box, margin_factor); +#else const Size& cnv_size = get_canvas_size(); m_camera.zoom_to_box(box, cnv_size.get_width(), cnv_size.get_height(), margin_factor); +#endif // ENABLE_6DOF_CAMERA m_dirty = true; } #else From b41c6d7d64440e9a419441a179c3234081d3a7eb Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Wed, 29 Jan 2020 14:07:12 +0100 Subject: [PATCH 190/336] Refuse to drill a broken mesh Hole parameters defaults and limits changed a bit --- src/libslic3r/SLAPrintSteps.cpp | 11 +++++++++-- src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp | 2 +- src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp | 2 +- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/libslic3r/SLAPrintSteps.cpp b/src/libslic3r/SLAPrintSteps.cpp index f781814ae6..44ef5fe45c 100644 --- a/src/libslic3r/SLAPrintSteps.cpp +++ b/src/libslic3r/SLAPrintSteps.cpp @@ -80,6 +80,13 @@ SLAPrint::Steps::Steps(SLAPrint *print) void SLAPrint::Steps::hollow_model(SLAPrintObject &po) { po.m_hollowing_data.reset(); + bool drilling_needed = ! po.m_model_object->sla_drain_holes.empty(); + + // If the mesh is broken, stop immediately, even before hollowing. + if (drilling_needed && po.transformed_mesh().needed_repair()) + throw std::runtime_error(L("The mesh appears to be too broken " + "to drill holes into it reliably.")); + if (! po.m_config.hollowing_enable.getBool()) BOOST_LOG_TRIVIAL(info) << "Skipping hollowing step!"; else { @@ -104,7 +111,7 @@ void SLAPrint::Steps::hollow_model(SLAPrintObject &po) } // Drill holes into the hollowed/original mesh. - if (po.m_model_object->sla_drain_holes.empty()) + if (! drilling_needed) BOOST_LOG_TRIVIAL(info) << "Drilling skipped (no holes)."; else { BOOST_LOG_TRIVIAL(info) << "Drilling drainage holes."; @@ -116,7 +123,7 @@ void SLAPrint::Steps::hollow_model(SLAPrintObject &po) holes_mesh.merge(sla::to_triangle_mesh(holept.to_mesh())); holes_mesh.require_shared_vertices(); - MeshBoolean::self_union(holes_mesh); //FIXME-fix and use the cgal version + MeshBoolean::self_union(holes_mesh); // If there is no hollowed mesh yet, copy the original mesh. if (! po.m_hollowing_data) { diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp index 80695b4681..078eda4935 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp @@ -794,7 +794,7 @@ RENDER_AGAIN: // m_imgui->text(" "); // vertical gap ImGui::Separator(); - float diameter_upper_cap = 5.f; + float diameter_upper_cap = 15.; if (m_new_hole_radius > diameter_upper_cap) m_new_hole_radius = diameter_upper_cap; m_imgui->text(m_desc.at("hole_diameter")); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp index 617d0b2e6f..5745b93934 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp @@ -58,7 +58,7 @@ private: bool m_show_supports = true; float m_new_hole_radius = 2.f; // Size of a new hole. - float m_new_hole_height = 5.f; + float m_new_hole_height = 6.f; mutable std::vector m_selected; // which holes are currently selected bool m_enable_hollowing = true; From 7156ed998727a32827af938d048e0f14c06ada6e Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Wed, 29 Jan 2020 13:38:37 +0100 Subject: [PATCH 191/336] Remove redundant code --- src/libslic3r/SimplifyMeshImpl.hpp | 56 +++++++----------------------- 1 file changed, 13 insertions(+), 43 deletions(-) diff --git a/src/libslic3r/SimplifyMeshImpl.hpp b/src/libslic3r/SimplifyMeshImpl.hpp index 94056192ad..4b6b0f5cbc 100644 --- a/src/libslic3r/SimplifyMeshImpl.hpp +++ b/src/libslic3r/SimplifyMeshImpl.hpp @@ -24,6 +24,7 @@ #include #ifndef NDEBUG +#include #include #endif @@ -83,41 +84,15 @@ struct remove_cvref { template< class T > using remove_cvref_t = typename remove_cvref::type; -struct DOut { -#ifndef NDEBUG - std::ostream& out = std::cout; -#endif -}; - -template -inline DOut&& operator<<( DOut&& out, T&& d) { -#ifndef NDEBUG - out.out << d; -#endif - return std::move(out); -} - -inline DOut dout() { return DOut(); } - template FloatingOnly is_approx(T val, T ref) { return std::abs(val - ref) < 1e-8; } template IntegerOnly is_approx(T val, T ref) { val == ref; } -template class SymetricMatrix { +template class SymetricMatrix { + static const constexpr size_t N = 10; public: explicit SymetricMatrix(ArithmeticOnly c = T()) { std::fill(m, m + N, c); } - SymetricMatrix(T m11, T m12, T m13, T m14, - T m22, T m23, T m24, - T m33, T m34, - T m44) - { - m[0] = m11; m[1] = m12; m[2] = m13; m[3] = m14; - m[4] = m22; m[5] = m23; m[6] = m24; - m[7] = m33; m[8] = m34; - m[9] = m44; - } - // Make plane SymetricMatrix(T a, T b, T c, T d) { @@ -141,21 +116,16 @@ public: return det; } - const SymetricMatrix operator+(const SymetricMatrix& n) const + const SymetricMatrix& operator+=(const SymetricMatrix& n) { - return SymetricMatrix(m[0] + n[0], m[1] + n[1], m[2] + n[2], m[3]+n[3], - m[4] + n[4], m[5] + n[5], m[6] + n[6], - m[7] + n[7], m[8] + n[8], - m[9] + n[9]); + for (size_t i = 0; i < N; ++i) m[i] += n[i]; + return *this; } - SymetricMatrix& operator+=(const SymetricMatrix& n) + SymetricMatrix operator+(const SymetricMatrix& n) { - m[0]+=n[0]; m[1]+=n[1]; m[2]+=n[2]; m[3]+=n[3]; - m[4]+=n[4]; m[5]+=n[5]; m[6]+=n[6]; m[7]+=n[7]; - m[8]+=n[8]; m[9]+=n[9]; - - return *this; + SymetricMatrix self = *this; + return self += n; } T m[N]; @@ -350,10 +320,10 @@ public: } - void simplify_mesh_lossless(); + template void simplify_mesh_lossless(ProgressFn &&fn); + void simplify_mesh_lossless() { simplify_mesh_lossless([](int){}); } }; - template void SimplifiableMesh::compact_faces() { auto it = std::remove_if(m_faceinfo.begin(), m_faceinfo.end(), @@ -605,7 +575,7 @@ bool SimplifiableMesh::flipped(const Vertex & p, } template -void SimplifiableMesh::simplify_mesh_lossless() +template void SimplifiableMesh::simplify_mesh_lossless(Fn &&fn) { // init for (FaceInfo &fi : m_faceinfo) fi.deleted = false; @@ -629,7 +599,7 @@ void SimplifiableMesh::simplify_mesh_lossless() // double threshold = std::numeric_limits::epsilon(); //1.0E-3 EPS; // Really? (tm) - dout() << "lossless iteration " << iteration << "\n"; + fn(iteration); for (FaceInfo &fi : m_faceinfo) { if (fi.err[3] > threshold || fi.deleted || fi.dirty) continue; From da3cb30b7cc3106d8f0b7e0e176eac3fac32f3a2 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Wed, 29 Jan 2020 14:44:03 +0100 Subject: [PATCH 192/336] Follow-up of 17a6b696e7a4b94d49e09b8598b0343a3c2ddd40 -> Fixed build when tech ENABLE_6DOF_CAMERA is disabled --- src/slic3r/GUI/Camera.cpp | 4 ++-- src/slic3r/GUI/Camera.hpp | 3 +-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/slic3r/GUI/Camera.cpp b/src/slic3r/GUI/Camera.cpp index 4eaa5a9e3f..a4eccf050b 100644 --- a/src/slic3r/GUI/Camera.cpp +++ b/src/slic3r/GUI/Camera.cpp @@ -502,16 +502,16 @@ void Camera::rotate_local_around_pivot(const Vec3d& rotation_rad, const Vec3d& p m_view_matrix.rotate(Eigen::AngleAxisd(rotation_rad(2), get_dir_forward())); translate_world(center); } +#endif // ENABLE_6DOF_CAMERA double Camera::min_zoom() const { #if ENABLE_6DOF_CAMERA return 0.7 * calc_zoom_to_bounding_box_factor(m_scene_box); #else - return 0.7 * calc_zoom_to_bounding_box_factor(m_scene_box, (int)m_viewport[2], (int)m_viewport[3]); + return 0.7 * calc_zoom_to_bounding_box_factor(m_scene_box, m_viewport[2], m_viewport[3]); #endif // ENABLE_6DOF_CAMERA } -#endif // ENABLE_6DOF_CAMERA std::pair Camera::calc_tight_frustrum_zs_around(const BoundingBoxf3& box) const { diff --git a/src/slic3r/GUI/Camera.hpp b/src/slic3r/GUI/Camera.hpp index a1c42a0c6b..b0a646ebfe 100644 --- a/src/slic3r/GUI/Camera.hpp +++ b/src/slic3r/GUI/Camera.hpp @@ -146,10 +146,9 @@ public: // returns true if the camera z axis (forward) is pointing in the negative direction of the world z axis bool is_looking_downward() const { return get_dir_forward().dot(Vec3d::UnitZ()) < 0.0; } - +#endif // ENABLE_6DOF_CAMERA double max_zoom() const { return 100.0; } double min_zoom() const; -#endif // ENABLE_6DOF_CAMERA private: // returns tight values for nearZ and farZ plane around the given bounding box From e679bcced67fc6f480acd5b49ce7d0142215fc5d Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Wed, 29 Jan 2020 15:40:56 +0100 Subject: [PATCH 193/336] Follow-up of 17a6b696e7a4b94d49e09b8598b0343a3c2ddd40 -> Fixed missing imgui window size initialization --- src/slic3r/GUI/GLCanvas3D.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 957b4f71df..c8e86d69bc 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -1717,9 +1717,7 @@ void GLCanvas3D::render() if (m_camera.requires_zoom_to_bed) { zoom_to_bed(); -#if !ENABLE_6DOF_CAMERA _resize((unsigned int)cnv_size.get_width(), (unsigned int)cnv_size.get_height()); -#endif // !ENABLE_6DOF_CAMERA m_camera.requires_zoom_to_bed = false; } From b0aa937215ba44161b06d19b7c0db774760c7e60 Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Wed, 29 Jan 2020 15:57:49 +0100 Subject: [PATCH 194/336] Trying to improve drilling stability by handling CGAL exceptions --- src/libslic3r/MeshBoolean.cpp | 13 +++++++++++-- src/libslic3r/SLAPrintSteps.cpp | 14 ++++++++++---- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/src/libslic3r/MeshBoolean.cpp b/src/libslic3r/MeshBoolean.cpp index 69db96d3fc..734bfaca89 100644 --- a/src/libslic3r/MeshBoolean.cpp +++ b/src/libslic3r/MeshBoolean.cpp @@ -150,8 +150,17 @@ void minus(TriangleMesh &A, const TriangleMesh &B) triangle_mesh_to_cgal(B, meshB.m); CGALMesh meshResult; - CGALProc::corefine_and_compute_difference(meshA.m, meshB.m, meshResult.m); - + bool success = false; + try { + success = CGALProc::corefine_and_compute_difference(meshA.m, meshB.m, meshResult.m, + CGALParams::throw_on_self_intersection(true), CGALParams::throw_on_self_intersection(true)); + } + catch (const CGAL::Polygon_mesh_processing::Corefinement::Self_intersection_exception&) { + success = false; + } + if (! success) + throw std::runtime_error("CGAL corefine_and_compute_difference failed"); + A = cgal_to_triangle_mesh(meshResult.m); } diff --git a/src/libslic3r/SLAPrintSteps.cpp b/src/libslic3r/SLAPrintSteps.cpp index 44ef5fe45c..8c0aac6fa7 100644 --- a/src/libslic3r/SLAPrintSteps.cpp +++ b/src/libslic3r/SLAPrintSteps.cpp @@ -83,9 +83,9 @@ void SLAPrint::Steps::hollow_model(SLAPrintObject &po) bool drilling_needed = ! po.m_model_object->sla_drain_holes.empty(); // If the mesh is broken, stop immediately, even before hollowing. - if (drilling_needed && po.transformed_mesh().needed_repair()) - throw std::runtime_error(L("The mesh appears to be too broken " - "to drill holes into it reliably.")); + //if (drilling_needed && po.transformed_mesh().needed_repair()) + // throw std::runtime_error(L("The mesh appears to be too broken " + // "to drill holes into it reliably.")); if (! po.m_config.hollowing_enable.getBool()) BOOST_LOG_TRIVIAL(info) << "Skipping hollowing step!"; @@ -133,7 +133,13 @@ void SLAPrint::Steps::hollow_model(SLAPrintObject &po) TriangleMesh &hollowed_mesh = po.m_hollowing_data->hollow_mesh_with_holes; hollowed_mesh = po.get_mesh_to_print(); - MeshBoolean::cgal::minus(hollowed_mesh, holes_mesh); + try { + MeshBoolean::cgal::minus(hollowed_mesh, holes_mesh); + } + catch (const std::runtime_error& ex) { + throw std::runtime_error(L("Drilling holes into the mesh failed. " + "This is usually caused by broken model. Try to fix it first.")); + } hollowed_mesh.require_shared_vertices(); } } From c5fa400208d46f9382ba992a7796d80ae90f0609 Mon Sep 17 00:00:00 2001 From: bubnikv Date: Thu, 30 Jan 2020 12:22:22 +0100 Subject: [PATCH 195/336] Fixed regression of 71fa41110049a79ec1d5c3052d22647a38d01bed where the PrintObject bounding box was not invalidated correctly when the transformation matrices of instances changed. Also refactored PrintObject::size() for const correctness. --- src/libslic3r/GCode.cpp | 2 +- src/libslic3r/Model.cpp | 2 -- src/libslic3r/Print.cpp | 18 +++++++++++------- src/libslic3r/Print.hpp | 10 ++++++---- src/libslic3r/PrintObject.cpp | 6 +++--- 5 files changed, 21 insertions(+), 17 deletions(-) diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index cc83461d36..8519646c25 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -1091,7 +1091,7 @@ namespace DoExport { static inline std::vector sort_object_instances_by_max_z(const Print &print) { std::vector objects(print.objects().begin(), print.objects().end()); - std::sort(objects.begin(), objects.end(), [](const PrintObject *po1, const PrintObject *po2) { return po1->size(2) < po2->size(2); }); + std::sort(objects.begin(), objects.end(), [](const PrintObject *po1, const PrintObject *po2) { return po1->size()(2) < po2->size()(2); }); std::vector instances; instances.reserve(objects.size()); for (const PrintObject *object : objects) diff --git a/src/libslic3r/Model.cpp b/src/libslic3r/Model.cpp index c5c457e8f1..c51808916c 100644 --- a/src/libslic3r/Model.cpp +++ b/src/libslic3r/Model.cpp @@ -907,10 +907,8 @@ const BoundingBoxf3& ModelObject::raw_bounding_box() const const Transform3d& inst_matrix = this->instances.front()->get_transformation().get_matrix(true); for (const ModelVolume *v : this->volumes) - { if (v->is_model_part()) m_raw_bounding_box.merge(v->mesh().transformed_bounding_box(inst_matrix * v->get_matrix())); - } } return m_raw_bounding_box; } diff --git a/src/libslic3r/Print.cpp b/src/libslic3r/Print.cpp index cc0554bd5f..3131fd3d10 100644 --- a/src/libslic3r/Print.cpp +++ b/src/libslic3r/Print.cpp @@ -836,7 +836,7 @@ Print::ApplyStatus Print::apply(const Model &model, DynamicPrintConfig new_full_ // Update the ModelObject instance, possibly invalidate the linked PrintObjects. assert(it_status->status == ModelObjectStatus::Old || it_status->status == ModelObjectStatus::Moved); // Check whether a model part volume was added or removed, their transformations or order changed. - // Only volume IDs, volume types and their order are checked, configuration and other parameters are NOT checked. + // Only volume IDs, volume types, transformation matrices and their order are checked, configuration and other parameters are NOT checked. bool model_parts_differ = model_volume_list_changed(model_object, model_object_new, ModelVolumeType::MODEL_PART); bool modifiers_differ = model_volume_list_changed(model_object, model_object_new, ModelVolumeType::PARAMETER_MODIFIER); bool support_blockers_differ = model_volume_list_changed(model_object, model_object_new, ModelVolumeType::SUPPORT_BLOCKER); @@ -899,10 +899,14 @@ Print::ApplyStatus Print::apply(const Model &model, DynamicPrintConfig new_full_ model_object.instances.emplace_back(new ModelInstance(*model_instance)); model_object.instances.back()->set_model_object(&model_object); } - } else { - // Just synchronize the content of the instances. This avoids memory allocation and it does not invalidate ModelInstance pointers, - // which may be accessed by G-code export in the meanwhile to deduce sequential print order. - auto new_instance = model_object_new.instances.begin(); + } else if (! std::equal(model_object.instances.begin(), model_object.instances.end(), model_object_new.instances.begin(), + [](auto l, auto r){ return l->print_volume_state == r->print_volume_state && l->printable == r->printable && + l->get_transformation().get_matrix().isApprox(r->get_transformation().get_matrix()); })) { + // If some of the instances changed, the bounding box of the updated ModelObject is likely no more valid. + // This is safe as the ModelObject's bounding box is only accessed from this function, which is called from the main thread only. + model_object.invalidate_bounding_box(); + // Synchronize the content of instances. + auto new_instance = model_object_new.instances.begin(); for (auto old_instance = model_object.instances.begin(); old_instance != model_object.instances.end(); ++ old_instance, ++ new_instance) { (*old_instance)->set_transformation((*new_instance)->get_transformation()); (*old_instance)->print_volume_state = (*new_instance)->print_volume_state; @@ -1197,7 +1201,7 @@ std::string Print::validate() const { std::vector object_height; for (const PrintObject *object : m_objects) - object_height.insert(object_height.end(), object->instances().size(), object->size(2)); + object_height.insert(object_height.end(), object->instances().size(), object->size()(2)); std::sort(object_height.begin(), object_height.end()); // Ignore the tallest *copy* (this is why we repeat height for all of them): // it will be printed as last one so its height doesn't matter. @@ -1429,7 +1433,7 @@ BoundingBox Print::bounding_box() const for (const PrintObject *object : m_objects) for (const PrintInstance &instance : object->instances()) { bb.merge(instance.shift); - bb.merge(instance.shift + to_2d(object->size)); + bb.merge(instance.shift + to_2d(object->size())); } return bb; } diff --git a/src/libslic3r/Print.hpp b/src/libslic3r/Print.hpp index 2d83da43de..75807cddad 100644 --- a/src/libslic3r/Print.hpp +++ b/src/libslic3r/Print.hpp @@ -120,17 +120,17 @@ public: // so that next call to make_perimeters() performs a union() before computing loops bool typed_slices; - Vec3crd size; // XYZ in scaled coordinates - + // XYZ in scaled coordinates + const Vec3crd& size() const { return m_size; } const PrintObjectConfig& config() const { return m_config; } const LayerPtrs& layers() const { return m_layers; } const SupportLayerPtrs& support_layers() const { return m_support_layers; } const Transform3d& trafo() const { return m_trafo; } const PrintInstances& instances() const { return m_instances; } - const Point instance_center(size_t idx) const { return m_instances[idx].shift + m_copies_shift + Point(this->size.x() / 2, this->size.y() / 2); } + const Point instance_center(size_t idx) const { return m_instances[idx].shift + m_copies_shift + Point(this->size().x() / 2, this->size().y() / 2); } // since the object is aligned to origin, bounding box coincides with size - BoundingBox bounding_box() const { return BoundingBox(Point(0,0), to_2d(this->size)); } + BoundingBox bounding_box() const { return BoundingBox(Point(0,0), to_2d(this->size())); } // adds region_id, too, if necessary void add_region_volume(unsigned int region_id, int volume_id, const t_layer_height_range &layer_range) { @@ -235,6 +235,8 @@ private: void combine_infill(); void _generate_support_material(); + // XYZ in scaled coordinates + Vec3crd m_size; PrintObjectConfig m_config; // Translation in Z + Rotation + Scaling / Mirroring. Transform3d m_trafo = Transform3d::Identity(); diff --git a/src/libslic3r/PrintObject.cpp b/src/libslic3r/PrintObject.cpp index 4d6df36db3..5dcaf8dfbd 100644 --- a/src/libslic3r/PrintObject.cpp +++ b/src/libslic3r/PrintObject.cpp @@ -43,7 +43,7 @@ namespace Slic3r { PrintObject::PrintObject(Print* print, ModelObject* model_object, bool add_instances) : PrintObjectBaseWithState(print, model_object), typed_slices(false), - size(Vec3crd::Zero()) + m_size(Vec3crd::Zero()) { // Compute the translation to be applied to our meshes so that we work with smaller coordinates { @@ -56,7 +56,7 @@ PrintObject::PrintObject(Print* print, ModelObject* model_object, bool add_insta const BoundingBoxf3 modobj_bbox = model_object->raw_bounding_box(); m_copies_shift = Point::new_scale(modobj_bbox.min(0), modobj_bbox.min(1)); // Scale the object size and store it - this->size = (modobj_bbox.size() * (1. / SCALING_FACTOR)).cast(); + this->m_size = (modobj_bbox.size() * (1. / SCALING_FACTOR)).cast(); } if (add_instances) { @@ -1450,7 +1450,7 @@ void PrintObject::update_slicing_parameters() { if (! m_slicing_params.valid) m_slicing_params = SlicingParameters::create_from_config( - this->print()->config(), m_config, unscale(this->size(2)), this->object_extruders()); + this->print()->config(), m_config, unscale(this->size()(2)), this->object_extruders()); } SlicingParameters PrintObject::slicing_parameters(const DynamicPrintConfig& full_config, const ModelObject& model_object, float object_max_z) From d590d5cad8f0b2ea878c961c7b925683c3179bba Mon Sep 17 00:00:00 2001 From: bubnikv Date: Thu, 30 Jan 2020 13:00:26 +0100 Subject: [PATCH 196/336] Created Creality.idx bumped up the version number for Creality.ini --- resources/profiles/Creality.idx | 7 +++++++ resources/profiles/Creality.ini | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 resources/profiles/Creality.idx diff --git a/resources/profiles/Creality.idx b/resources/profiles/Creality.idx new file mode 100644 index 0000000000..d877ae7c9b --- /dev/null +++ b/resources/profiles/Creality.idx @@ -0,0 +1,7 @@ +min_slic3r_version = 2.2.0-alpha3 +0.0.2-alpha0 Print bed textures are now configurable from the Preset Bundle. Requires PrusaSlicer 2.2.0-alpha3 and newer. +# The following line (max_slic3r_version) forces the users of PrusaSlicer 2.2.0-alpha3 and newer to update the profiles to 1.1.1-alpha3 and newer, +# so they will see the print bed. +max_slic3r_version = 2.2.0-alpha2 +min_slic3r_version = 2.2.0-alpha0 +0.0.1 Initial version diff --git a/resources/profiles/Creality.ini b/resources/profiles/Creality.ini index 181bb4f4ed..4f8dbe572d 100644 --- a/resources/profiles/Creality.ini +++ b/resources/profiles/Creality.ini @@ -5,7 +5,7 @@ name = Creality # Configuration version of this file. Config file will only be installed, if the config_version differs. # This means, the server may force the PrusaSlicer configuration to be downgraded. -config_version = 0.0.1 +config_version = 0.0.2-alpha0 # Where to get the updates from? config_update_url = http://files.prusa3d.com/wp-content/uploads/repository/PrusaSlicer-settings-master/live/Creality/ # changelog_url = http://files.prusa3d.com/?latest=slicer-profiles&lng=%1% From 1278aabf3e1ac74d7bf3038a28b9a35a3ba14c82 Mon Sep 17 00:00:00 2001 From: bubnikv Date: Thu, 30 Jan 2020 13:00:51 +0100 Subject: [PATCH 197/336] Fixed some compiler warnings. --- src/libslic3r/GCode.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index 8519646c25..a53b6bd7c2 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -958,7 +958,7 @@ namespace DoExport { skirts.emplace_back(std::move(s)); } ooze_prevention.enable = true; - ooze_prevention.standby_points = offset(Slic3r::Geometry::convex_hull(skirts), scale_(3.f)).front().equally_spaced_points(scale_(10.)); + ooze_prevention.standby_points = offset(Slic3r::Geometry::convex_hull(skirts), float(scale_(3.))).front().equally_spaced_points(float(scale_(10.))); #if 0 require "Slic3r/SVG.pm"; Slic3r::SVG::output( From 08dcbd027172492f27ed2103e2cba67d65e1d446 Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Thu, 30 Jan 2020 14:12:52 +0100 Subject: [PATCH 198/336] Hollowing gizmo - most of updating now assumes that common data struct is updated properly --- src/slic3r/GUI/GLCanvas3D.cpp | 1 + src/slic3r/GUI/Gizmos/GLGizmoBase.cpp | 25 +++++++++++-- src/slic3r/GUI/Gizmos/GLGizmoBase.hpp | 4 ++- src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp | 44 ++++++----------------- src/slic3r/GUI/Gizmos/GLGizmosManager.cpp | 2 +- 5 files changed, 39 insertions(+), 37 deletions(-) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 32d359429b..c605c29280 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -2208,6 +2208,7 @@ void GLCanvas3D::reload_scene(bool refresh_immediately, bool force_full_scene_re mesh.transform(t.inverse()); GLIndexedVertexArray iva; iva.load_mesh(mesh); + volume->indexed_vertex_array.release_geometry(); volume->indexed_vertex_array = iva; volume->finalize_geometry(true); } diff --git a/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp b/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp index e753157448..0fc0cc94a8 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp @@ -307,9 +307,27 @@ unsigned char picking_checksum_alpha_channel(unsigned char red, unsigned char gr -bool CommonGizmosData::update_from_backend(GLCanvas3D& canvas) +bool CommonGizmosData::update_from_backend(GLCanvas3D& canvas, ModelObject* model_object) { - if (! m_model_object) + recent_update = false; + + if (m_model_object != model_object + || (model_object && m_model_object_id != model_object->id())) { + m_model_object = model_object; + m_print_object_idx = -1; + m_mesh_raycaster.reset(); + m_object_clipper.reset(); + m_supports_clipper.reset(); + if (m_model_object) { + m_active_instance = canvas.get_selection().get_instance_idx(); + m_active_instance_bb_radius = m_model_object->instance_bounding_box(m_active_instance).radius(); + } + + recent_update = true; + } + + + if (! m_model_object || ! canvas.get_selection().is_from_single_instance()) return false; int old_po_idx = m_print_object_idx; @@ -352,8 +370,11 @@ bool CommonGizmosData::update_from_backend(GLCanvas3D& canvas) m_object_clipper.reset(); m_supports_clipper.reset(); m_old_mesh = m_mesh; + recent_update = true; return true; } + if (! recent_update) + recent_update = m_print_object_idx < 0 && old_po_idx >= 0; return m_print_object_idx < 0 ? old_po_idx >=0 : false; } diff --git a/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp b/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp index c5a6d36aa3..85f87c8f53 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp @@ -193,7 +193,9 @@ public: return (! m_mesh ? nullptr : m_mesh); //(m_cavity_mesh ? m_cavity_mesh.get() : m_mesh)); } - bool update_from_backend(GLCanvas3D& canvas); + bool update_from_backend(GLCanvas3D& canvas, ModelObject* model_object); + + bool recent_update = false; diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp index 078eda4935..1bb18a7557 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp @@ -55,36 +55,12 @@ bool GLGizmoHollow::on_init() return true; } -void GLGizmoHollow::set_sla_support_data(ModelObject* model_object, const Selection& selection) +void GLGizmoHollow::set_sla_support_data(ModelObject*, const Selection&) { - if (! model_object || selection.is_empty()) { - m_c->m_model_object = nullptr; - return; - } + if (m_c->recent_update) { - bool something_changed = false; - - if (m_c->m_model_object != model_object - || m_c->m_model_object_id != model_object->id() - || m_c->m_active_instance != selection.get_instance_idx()) { - m_c->m_model_object = model_object; - m_c->m_print_object_idx = -1; - m_c->m_mesh_raycaster.reset(); - m_c->m_active_instance = selection.get_instance_idx(); - something_changed = true; - } - - if (model_object - && selection.is_from_single_instance() - && (something_changed)) - { - m_c->update_from_backend(m_parent); - - // Cache the bb - it's needed for dealing with the clipping plane quite often - // It could be done inside update_mesh but one has to account for scaling of the instance. - m_c->m_active_instance_bb_radius = m_c->m_model_object->instance_bounding_box(m_c->m_active_instance).radius(); - - reload_cache(); + if (m_c->m_model_object) + reload_cache(); if (m_state == On) { m_parent.toggle_model_objects_visibility(false); @@ -112,7 +88,7 @@ void GLGizmoHollow::on_render() const } // !!! is it necessary? - const_cast(this)->m_c->update_from_backend(m_parent); + //const_cast(this)->m_c->update_from_backend(m_parent, m_c->m_model_object); glsafe(::glEnable(GL_BLEND)); glsafe(::glEnable(GL_DEPTH_TEST)); @@ -183,8 +159,8 @@ void GLGizmoHollow::render_clipping_plane(const Selection& selection) const // Next, ask the backend if supports are already calculated. If so, we are gonna cut them too. - if (m_c->m_print_object_idx < 0) - m_c->update_from_backend(m_parent); + //if (m_c->m_print_object_idx < 0) + // m_c->update_from_backend(m_parent, m_c->m_model_object); if (m_c->m_print_object_idx >= 0) { const SLAPrintObject* print_object = m_parent.sla_print()->objects()[m_c->m_print_object_idx]; @@ -352,9 +328,11 @@ bool GLGizmoHollow::is_mesh_point_clipped(const Vec3d& point) const // Return false if no intersection was found, true otherwise. bool GLGizmoHollow::unproject_on_mesh(const Vec2d& mouse_pos, std::pair& pos_and_normal) { + if (! m_c->m_mesh_raycaster) + return false; // if the gizmo doesn't have the V, F structures for igl, calculate them first: // !!! is it really necessary? - m_c->update_from_backend(m_parent); + //m_c->update_from_backend(m_parent, m_c->m_model_object); const Camera& camera = m_parent.get_camera(); const Selection& selection = m_parent.get_selection(); @@ -955,7 +933,7 @@ void GLGizmoHollow::on_set_state() if (m_state == On && m_old_state != On) { // the gizmo was just turned on //Plater::TakeSnapshot snapshot(wxGetApp().plater(), _(L("SLA gizmo turned on"))); - m_c->update_from_backend(m_parent); + //m_c->update_from_backend(m_parent, m_c->m_model_object); // we'll now reload support points: if (m_c->m_model_object) diff --git a/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp b/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp index acb74fffc1..db459dd7d4 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp @@ -349,7 +349,7 @@ void GLGizmosManager::set_sla_support_data(ModelObject* model_object) return; // Update common data for hollowing and sla support gizmos. - m_common_gizmos_data->update_from_backend(m_parent); + m_common_gizmos_data->update_from_backend(m_parent, model_object); dynamic_cast(m_gizmos[SlaSupports].get())->set_sla_support_data(model_object, m_parent.get_selection()); dynamic_cast(m_gizmos[Hollow].get())->set_sla_support_data(model_object, m_parent.get_selection()); From 4f43c6d3f804fecbcf6ba09d5b25d41e3eeff5ca Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Thu, 30 Jan 2020 14:31:22 +0100 Subject: [PATCH 199/336] SlaSupports gizmo - most of updating now assumes that common data struct is updated properly --- src/slic3r/GUI/Gizmos/GLGizmoBase.cpp | 1 + src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp | 83 +++----------------- src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp | 2 - 3 files changed, 14 insertions(+), 72 deletions(-) diff --git a/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp b/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp index 0fc0cc94a8..92b9901479 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp @@ -366,6 +366,7 @@ bool CommonGizmosData::update_from_backend(GLCanvas3D& canvas, ModelObject* mode m_model_object_id = m_model_object->id(); if (m_mesh != m_old_mesh) { + wxBusyCursor wait; m_mesh_raycaster.reset(new MeshRaycaster(*m_mesh)); m_object_clipper.reset(); m_supports_clipper.reset(); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp index db514c6e25..c1c3c6d1ce 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp @@ -63,45 +63,22 @@ bool GLGizmoSlaSupports::on_init() void GLGizmoSlaSupports::set_sla_support_data(ModelObject* model_object, const Selection& selection) { - return; - - if (! model_object || selection.is_empty()) { - m_c->m_model_object = nullptr; - return; - } - - bool something_changed = false; - - if (m_c->m_model_object != model_object - || m_c->m_model_object_id != model_object->id() - || m_c->m_active_instance != selection.get_instance_idx()) { - m_c->m_model_object = model_object; - m_c->m_print_object_idx = -1; - m_c->m_active_instance = selection.get_instance_idx(); - something_changed = true; - } - - if (model_object && selection.is_from_single_instance()) - { - // Cache the bb - it's needed for dealing with the clipping plane quite often - // It could be done inside update_mesh but one has to account for scaling of the instance. - if (something_changed) { - m_c->m_active_instance_bb_radius = m_c->m_model_object->instance_bounding_box(m_c->m_active_instance).radius(); - if (m_state == On) { - m_parent.toggle_model_objects_visibility(false); - m_parent.toggle_model_objects_visibility(/*! m_c->m_cavity_mesh*/ true, m_c->m_model_object, m_c->m_active_instance); - m_parent.toggle_sla_auxiliaries_visibility(! m_editing_mode, m_c->m_model_object, m_c->m_active_instance); - } - else - m_parent.toggle_model_objects_visibility(true, nullptr, -1); + if (m_c->recent_update) { + if (m_state == On) { + m_parent.toggle_model_objects_visibility(false); + m_parent.toggle_model_objects_visibility(/*! m_c->m_cavity_mesh*/ true, m_c->m_model_object, m_c->m_active_instance); + m_parent.toggle_sla_auxiliaries_visibility(! m_editing_mode, m_c->m_model_object, m_c->m_active_instance); } + else + m_parent.toggle_model_objects_visibility(true, nullptr, -1); - if (is_mesh_update_necessary()) { - update_mesh(); + disable_editing_mode(); + if (m_c->m_model_object) reload_cache(); - } + } - // If we triggered autogeneration before, check backend and fetch results if they are there + // If we triggered autogeneration before, check backend and fetch results if they are there + if (m_c->m_model_object) { if (m_c->m_model_object->sla_points_status == sla::PointsStatus::Generating) get_data_from_backend(); } @@ -122,9 +99,6 @@ void GLGizmoSlaSupports::on_render() const return; } - if (! m_its || ! m_c->m_mesh) - const_cast(this)->update_mesh(); - glsafe(::glEnable(GL_BLEND)); glsafe(::glEnable(GL_DEPTH_TEST)); @@ -418,41 +392,12 @@ bool GLGizmoSlaSupports::is_mesh_point_clipped(const Vec3d& point) const -bool GLGizmoSlaSupports::is_mesh_update_necessary() const -{ - return ((m_state == On) && (m_c->m_model_object != nullptr) && !m_c->m_model_object->instances.empty()) - && ((m_c->m_model_object->id() != m_c->m_model_object_id) || m_its == nullptr); -} - - - -void GLGizmoSlaSupports::update_mesh() -{ - if (! m_c->m_model_object) - return; - - wxBusyCursor wait; - // this way we can use that mesh directly. - // This mesh does not account for the possible Z up SLA offset. - m_c->m_mesh = &m_c->m_model_object->volumes.front()->mesh(); - m_its = &m_c->m_mesh->its; - - // If this is different mesh than last time or if the AABB tree is uninitialized, recalculate it. - if (m_c->m_model_object_id != m_c->m_model_object->id() || ! m_c->m_mesh_raycaster) - m_c->m_mesh_raycaster.reset(new MeshRaycaster(*m_c->mesh())); - - m_c->m_model_object_id = m_c->m_model_object->id(); - disable_editing_mode(); -} - - // Unprojects the mouse position on the mesh and saves hit point and normal of the facet into pos_and_normal // Return false if no intersection was found, true otherwise. bool GLGizmoSlaSupports::unproject_on_mesh(const Vec2d& mouse_pos, std::pair& pos_and_normal) { - // if the gizmo doesn't have the V, F structures for igl, calculate them first: if (! m_c->m_mesh_raycaster) - update_mesh(); + return false; const Camera& camera = m_parent.get_camera(); const Selection& selection = m_parent.get_selection(); @@ -1045,8 +990,6 @@ void GLGizmoSlaSupports::on_set_state() if (m_state == On && m_old_state != On) { // the gizmo was just turned on Plater::TakeSnapshot snapshot(wxGetApp().plater(), _(L("SLA gizmo turned on"))); - if (is_mesh_update_necessary()) - update_mesh(); // we'll now reload support points: if (m_c->m_model_object) diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp index 3697e7af69..152979f83d 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp @@ -91,8 +91,6 @@ private: void render_points(const Selection& selection, bool picking = false) const; void render_clipping_plane(const Selection& selection) const; void render_hollowed_mesh() const; - bool is_mesh_update_necessary() const; - void update_mesh(); bool unsaved_changes() const; bool m_lock_unique_islands = false; From 570f77cbdc8e20c07e63efe64bd0fdc1c99865c4 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Thu, 30 Jan 2020 14:42:59 +0100 Subject: [PATCH 200/336] Implemented DnD for objects inside ObjectList --- src/slic3r/GUI/GUI_ObjectList.cpp | 67 ++++++++++++++++++++++--------- src/slic3r/GUI/wxExtensions.cpp | 18 +++++++-- src/slic3r/GUI/wxExtensions.hpp | 1 + 3 files changed, 63 insertions(+), 23 deletions(-) diff --git a/src/slic3r/GUI/GUI_ObjectList.cpp b/src/slic3r/GUI/GUI_ObjectList.cpp index 25e1a5ee54..babb8ed5c7 100644 --- a/src/slic3r/GUI/GUI_ObjectList.cpp +++ b/src/slic3r/GUI/GUI_ObjectList.cpp @@ -1003,14 +1003,13 @@ void ObjectList::OnBeginDrag(wxDataViewEvent &event) const bool mult_sel = multiple_selection(); if ((mult_sel && !selected_instances_of_same_object()) || - (!mult_sel && (GetSelection() != item)) || - m_objects_model->GetParent(item) == wxDataViewItem(nullptr) ) { + (!mult_sel && (GetSelection() != item)) ) { event.Veto(); return; } const ItemType& type = m_objects_model->GetItemType(item); - if (!(type & (itVolume | itInstance))) { + if (!(type & (itVolume | itObject | itInstance))) { event.Veto(); return; } @@ -1024,11 +1023,13 @@ void ObjectList::OnBeginDrag(wxDataViewEvent &event) for (auto sel : sels ) sub_obj_idxs.insert(m_objects_model->GetInstanceIdByItem(sel)); } - else + else if (type & itObject) + m_dragged_data.init(m_objects_model->GetIdByItem(item), type); + else m_dragged_data.init(m_objects_model->GetObjectIdByItem(item), - type&itVolume ? m_objects_model->GetVolumeIdByItem(item) : + type&itVolume ? m_objects_model->GetVolumeIdByItem(item) : m_objects_model->GetInstanceIdByItem(item), - type); + type); /* Under MSW or OSX, DnD moves an item to the place of another selected item * But under GTK, DnD moves an item between another two items. @@ -1049,10 +1050,20 @@ void ObjectList::OnBeginDrag(wxDataViewEvent &event) bool ObjectList::can_drop(const wxDataViewItem& item) const { - return (m_dragged_data.type() == itInstance && !item.IsOk()) || - (m_dragged_data.type() == itVolume && item.IsOk() && - m_objects_model->GetItemType(item) == itVolume && - m_dragged_data.obj_idx() == m_objects_model->GetObjectIdByItem(item)); + // move instance(s) or object on "empty place" of ObjectList + if ( (m_dragged_data.type() & (itInstance | itObject)) && !item.IsOk() ) + return true; + + // type of moved item should be the same as a "destination" item + if (!item.IsOk() || !(m_dragged_data.type() & (itVolume|itObject)) || + m_objects_model->GetItemType(item) != m_dragged_data.type() ) + return false; + + // move volumes inside one object only + if (m_dragged_data.type() & itVolume) + return m_dragged_data.obj_idx() == m_objects_model->GetObjectIdByItem(item); + + return true; } void ObjectList::OnDropPossible(wxDataViewEvent &event) @@ -1082,9 +1093,6 @@ void ObjectList::OnDrop(wxDataViewEvent &event) return; } - const int from_volume_id = m_dragged_data.sub_obj_idx(); - int to_volume_id = m_objects_model->GetVolumeIdByItem(item); - // It looks like a fixed in current version of the wxWidgets // #ifdef __WXGTK__ // /* Under GTK, DnD moves an item between another two items. @@ -1096,14 +1104,33 @@ void ObjectList::OnDrop(wxDataViewEvent &event) take_snapshot(_((m_dragged_data.type() == itVolume) ? L("Volumes in Object reordered") : L("Object reordered"))); - auto& volumes = (*m_objects)[m_dragged_data.obj_idx()]->volumes; - auto delta = to_volume_id < from_volume_id ? -1 : 1; - int cnt = 0; - for (int id = from_volume_id; cnt < abs(from_volume_id - to_volume_id); id += delta, cnt++) - std::swap(volumes[id], volumes[id + delta]); + if (m_dragged_data.type() & itVolume) + { + int from_volume_id = m_dragged_data.sub_obj_idx(); + int to_volume_id = m_objects_model->GetVolumeIdByItem(item); + int delta = to_volume_id < from_volume_id ? -1 : 1; - select_item(m_objects_model->ReorganizeChildren(from_volume_id, to_volume_id, - m_objects_model->GetParent(item))); + auto& volumes = (*m_objects)[m_dragged_data.obj_idx()]->volumes; + + int cnt = 0; + for (int id = from_volume_id; cnt < abs(from_volume_id - to_volume_id); id += delta, cnt++) + std::swap(volumes[id], volumes[id + delta]); + + select_item(m_objects_model->ReorganizeChildren(from_volume_id, to_volume_id, m_objects_model->GetParent(item))); + + } + else if (m_dragged_data.type() & itObject) + { + int from_obj_id = m_dragged_data.obj_idx(); + int to_obj_id = item.IsOk() ? m_objects_model->GetIdByItem(item) : ((int)m_objects->size()-1); + int delta = to_obj_id < from_obj_id ? -1 : 1; + + int cnt = 0; + for (int id = from_obj_id; cnt < abs(from_obj_id - to_obj_id); id += delta, cnt++) + std::swap((*m_objects)[id], (*m_objects)[id + delta]); + + select_item(m_objects_model->ReorganizeObjects(from_obj_id, to_obj_id)); + } changed_object(m_dragged_data.obj_idx()); diff --git a/src/slic3r/GUI/wxExtensions.cpp b/src/slic3r/GUI/wxExtensions.cpp index b710d2cd79..a867ca0ecf 100644 --- a/src/slic3r/GUI/wxExtensions.cpp +++ b/src/slic3r/GUI/wxExtensions.cpp @@ -1726,9 +1726,6 @@ wxDataViewItem ObjectDataViewModel::ReorganizeChildren( const int current_volume ItemDeleted(parent, wxDataViewItem(deleted_node)); node_parent->Insert(deleted_node, new_volume_id+shift); ItemAdded(parent, wxDataViewItem(deleted_node)); - const auto settings_item = GetSettingsItem(wxDataViewItem(deleted_node)); - if (settings_item) - ItemAdded(wxDataViewItem(deleted_node), settings_item); //update volume_id value for child-nodes auto children = node_parent->GetChildren(); @@ -1740,6 +1737,21 @@ wxDataViewItem ObjectDataViewModel::ReorganizeChildren( const int current_volume return wxDataViewItem(node_parent->GetNthChild(new_volume_id+shift)); } +wxDataViewItem ObjectDataViewModel::ReorganizeObjects( const int current_id, const int new_id) +{ + if (current_id == new_id) + return wxDataViewItem(nullptr); + + ObjectDataViewModelNode* deleted_node = m_objects[current_id]; + m_objects.erase(m_objects.begin() + current_id); + ItemDeleted(wxDataViewItem(nullptr), wxDataViewItem(deleted_node)); + + m_objects.emplace(m_objects.begin() + new_id, deleted_node); + ItemAdded(wxDataViewItem(nullptr), wxDataViewItem(deleted_node)); + + return wxDataViewItem(deleted_node); +} + bool ObjectDataViewModel::IsEnabled(const wxDataViewItem &item, unsigned int col) const { wxASSERT(item.IsOk()); diff --git a/src/slic3r/GUI/wxExtensions.hpp b/src/slic3r/GUI/wxExtensions.hpp index c3d26c8be9..8cd144dc52 100644 --- a/src/slic3r/GUI/wxExtensions.hpp +++ b/src/slic3r/GUI/wxExtensions.hpp @@ -481,6 +481,7 @@ public: wxDataViewItem ReorganizeChildren( const int cur_volume_id, const int new_volume_id, const wxDataViewItem &parent); + wxDataViewItem ReorganizeObjects( int current_id, int new_id); virtual bool IsEnabled(const wxDataViewItem &item, unsigned int col) const override; From a6f7fc93f411c4a773810ca5ab56ab88ec54aa18 Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Thu, 30 Jan 2020 15:25:15 +0100 Subject: [PATCH 201/336] Gizmo updates - forget everything about the loaded mesh when an object is deselected --- src/slic3r/GUI/Gizmos/GLGizmoBase.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp b/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp index 92b9901479..463c681a69 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp @@ -318,6 +318,9 @@ bool CommonGizmosData::update_from_backend(GLCanvas3D& canvas, ModelObject* mode m_mesh_raycaster.reset(); m_object_clipper.reset(); m_supports_clipper.reset(); + m_old_mesh = nullptr; + m_mesh = nullptr; + m_backend_mesh_transformed.clear(); if (m_model_object) { m_active_instance = canvas.get_selection().get_instance_idx(); m_active_instance_bb_radius = m_model_object->instance_bounding_box(m_active_instance).radius(); From 9ef65b23d8627aa5d76140bf4829afad343adf96 Mon Sep 17 00:00:00 2001 From: bubnikv Date: Thu, 30 Jan 2020 17:58:40 +0100 Subject: [PATCH 202/336] Implemented loading of hollowed SLA mesh into the scene in place of the normal mesh. WIP: The code is inefficient (it does not store the timestamp of the hollowed mesh, therefore it refreshes the hollowed mesh on each scene update) and if the hollowing gets invalidated, the original mesh is currently not being reloaded and the hollowed mesh is still visible. --- src/libslic3r/SLAPrint.cpp | 2 + src/slic3r/GUI/GLCanvas3D.cpp | 85 +++++++++++++++++------------------ 2 files changed, 42 insertions(+), 45 deletions(-) diff --git a/src/libslic3r/SLAPrint.cpp b/src/libslic3r/SLAPrint.cpp index 23b4a8046e..1935e5e319 100644 --- a/src/libslic3r/SLAPrint.cpp +++ b/src/libslic3r/SLAPrint.cpp @@ -1103,6 +1103,8 @@ const ExPolygons &SliceRecord::get_slice(SliceOrigin o) const bool SLAPrintObject::has_mesh(SLAPrintObjectStep step) const { switch (step) { + case slaposHollowing: + return m_hollowing_data && !m_hollowing_data->hollow_mesh_with_holes.empty(); case slaposSupportTree: return ! this->support_mesh().empty(); case slaposPad: diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index c605c29280..fa3a25b79d 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -1930,8 +1930,6 @@ void GLCanvas3D::mirror_selection(Axis axis) // 5) Out of bed collision status & message overlay (texture) void GLCanvas3D::reload_scene(bool refresh_immediately, bool force_full_scene_refresh) { - force_full_scene_refresh = true; - if ((m_canvas == nullptr) || (m_config == nullptr) || (m_model == nullptr)) return; @@ -1971,8 +1969,8 @@ void GLCanvas3D::reload_scene(bool refresh_immediately, bool force_full_scene_re }; // SLA steps to pull the preview meshes for. - typedef std::array SLASteps; - SLASteps sla_steps = { slaposSupportTree, slaposPad }; + typedef std::array SLASteps; + SLASteps sla_steps = { slaposHollowing, slaposSupportTree, slaposPad }; struct SLASupportState { std::array::value> step; }; @@ -2019,7 +2017,7 @@ void GLCanvas3D::reload_scene(bool refresh_immediately, bool force_full_scene_re // Consider the DONE step without a valid mesh as invalid for the purpose // of mesh visualization. state.step[istep].state = PrintStateBase::INVALID; - else + else if (sla_steps[istep] != slaposHollowing) for (const ModelInstance* model_instance : print_object->model_object()->instances) // Only the instances, which are currently printable, will have the SLA support structures kept. // The instances outside the print bed will have the GLVolumes of their support structures released. @@ -2032,7 +2030,7 @@ void GLCanvas3D::reload_scene(bool refresh_immediately, bool force_full_scene_re } std::sort(model_volume_state.begin(), model_volume_state.end(), model_volume_state_lower); std::sort(aux_volume_state.begin(), aux_volume_state.end(), model_volume_state_lower); - // Release all ModelVolume based GLVolumes not found in the current Model. + // Release all ModelVolume based GLVolumes not found in the current Model. Find the GLVolume of a hollowed mesh. for (size_t volume_id = 0; volume_id < m_volumes.volumes.size(); ++volume_id) { GLVolume* volume = m_volumes.volumes[volume_id]; ModelVolumeState key(volume); @@ -2114,6 +2112,9 @@ void GLCanvas3D::reload_scene(bool refresh_immediately, bool force_full_scene_re if (it_old_volume != deleted_volumes.end() && it_old_volume->composite_id == it->composite_id) // If a volume changed its ObjectID, but it reuses a GLVolume's CompositeID, maintain its selection. map_glvolume_old_to_new[it_old_volume->volume_idx] = m_volumes.volumes.size(); + // Note the index of the loaded volume, so that we can reload the main model GLVolume with the hollowed mesh + // later in this function. + it->volume_idx = m_volumes.volumes.size(); m_volumes.load_object_volume(&model_object, obj_idx, volume_idx, instance_idx, m_color_by, m_initialized); m_volumes.volumes.back()->geometry_id = key.geometry_id; update_object_list = true; @@ -2163,57 +2164,51 @@ void GLCanvas3D::reload_scene(bool refresh_immediately, bool force_full_scene_re int instance_idx = it - model_object->instances.begin(); for (size_t istep = 0; istep < sla_steps.size(); ++ istep) if (state.step[istep].state == PrintStateBase::DONE) { - ModelVolumeState key(state.step[istep].timestamp, instance.instance_id.id); - auto it = std::lower_bound(aux_volume_state.begin(), aux_volume_state.end(), key, model_volume_state_lower); - assert(it != aux_volume_state.end() && it->geometry_id == key.geometry_id); - if (it->new_geometry()) { - // This can be an SLA support structure that should not be rendered (in case someone used undo - // to revert to before it was generated). If that's the case, we should not generate anything. - if (model_object->sla_points_status != sla::PointsStatus::NoPoints) - instances[istep].emplace_back(std::pair(instance_idx, print_instance_idx)); - else - shift_zs[object_idx] = 0.; + if (sla_steps[istep] == slaposHollowing) { + // Check whether there is a main object mesh, which we may update with the hollowed mesh. + ModelVolumeState key(model_object->volumes.front()->id(), instance.instance_id); + auto it = std::lower_bound(model_volume_state.begin(), model_volume_state.end(), key, model_volume_state_lower); + assert(it != model_volume_state.end() && it->geometry_id == key.geometry_id); + assert(!it->new_geometry()); + GLVolume& volume = *m_volumes.volumes[it->volume_idx]; + TriangleMesh mesh = print_object->get_mesh(slaposHollowing); + if (!mesh.empty()) { + Transform3d t = sla_print->sla_trafo(*m_model->objects[volume.object_idx()]); + mesh.transform(t.inverse()); + volume.indexed_vertex_array.release_geometry(); + volume.indexed_vertex_array.load_mesh(mesh); + volume.finalize_geometry(true); + } + } else { + // Check whether there is an existing auxiliary volume to be updated, or a new auxiliary volume to be created. + ModelVolumeState key(state.step[istep].timestamp, instance.instance_id.id); + auto it = std::lower_bound(aux_volume_state.begin(), aux_volume_state.end(), key, model_volume_state_lower); + assert(it != aux_volume_state.end() && it->geometry_id == key.geometry_id); + if (it->new_geometry()) { + // This can be an SLA support structure that should not be rendered (in case someone used undo + // to revert to before it was generated). If that's the case, we should not generate anything. + if (model_object->sla_points_status != sla::PointsStatus::NoPoints) + instances[istep].emplace_back(std::pair(instance_idx, print_instance_idx)); + else + shift_zs[object_idx] = 0.; + } else { + // Recycling an old GLVolume. Update the Object/Instance indices into the current Model. + m_volumes.volumes[it->volume_idx]->composite_id = GLVolume::CompositeID(object_idx, m_volumes.volumes[it->volume_idx]->volume_idx(), instance_idx); + m_volumes.volumes[it->volume_idx]->set_instance_transformation(model_object->instances[instance_idx]->get_transformation()); + } } - else { - // Recycling an old GLVolume. Update the Object/Instance indices into the current Model. - m_volumes.volumes[it->volume_idx]->composite_id = GLVolume::CompositeID(object_idx, m_volumes.volumes[it->volume_idx]->volume_idx(), instance_idx); - m_volumes.volumes[it->volume_idx]->set_instance_transformation(model_object->instances[instance_idx]->get_transformation()); - } } } -// // stores the current volumes count -// size_t volumes_count = m_volumes.volumes.size(); - for (size_t istep = 0; istep < sla_steps.size(); ++istep) if (!instances[istep].empty()) m_volumes.load_object_auxiliary(print_object, object_idx, instances[istep], sla_steps[istep], state.step[istep].timestamp, m_initialized); } // Shift-up all volumes of the object so that it has the right elevation with respect to the print bed - for (GLVolume* volume : m_volumes.volumes) { + for (GLVolume* volume : m_volumes.volumes) if (volume->object_idx() < (int)m_model->objects.size() && m_model->objects[volume->object_idx()]->instances[volume->instance_idx()]->is_printable()) volume->set_sla_shift_z(shift_zs[volume->object_idx()]); - - // Just an experiment for now - replace the mesh with a hollowed one. - for (size_t po_idx=0; po_idxobjects().size(); ++po_idx) { - const SLAPrintObject* po = sla_print->objects()[po_idx]; - if (po_idx != volume->composite_id.object_id || volume->composite_id.volume_id < 0) - continue; - if (po->is_step_done(slaposHollowing)) { - TriangleMesh mesh = po->get_mesh(slaposHollowing); - if (mesh.empty()) - continue; - Transform3d t = sla_print->sla_trafo(*m_model->objects[volume->object_idx()]); - mesh.transform(t.inverse()); - GLIndexedVertexArray iva; - iva.load_mesh(mesh); - volume->indexed_vertex_array.release_geometry(); - volume->indexed_vertex_array = iva; - volume->finalize_geometry(true); - } - } - } } if (printer_technology == ptFFF && m_config->has("nozzle_diameter")) From 4bc4e347fb8b955ab88b1ae8e5b118f028353c07 Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Fri, 31 Jan 2020 08:54:41 +0100 Subject: [PATCH 203/336] Fixed a crash during cut (typo introduced in 645f13a) --- src/libslic3r/Model.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libslic3r/Model.cpp b/src/libslic3r/Model.cpp index c51808916c..d73d8148b0 100644 --- a/src/libslic3r/Model.cpp +++ b/src/libslic3r/Model.cpp @@ -1113,7 +1113,7 @@ ModelObjectPtrs ModelObject::cut(size_t instance, coordf_t z, bool keep_upper, b if (keep_upper) { upper->set_model(nullptr); upper->sla_support_points.clear(); - lower->sla_drain_holes.clear(); + upper->sla_drain_holes.clear(); upper->sla_points_status = sla::PointsStatus::NoPoints; upper->clear_volumes(); upper->input_file = ""; From 7f476f38b930838d8742c2907e1fad759943416d Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Thu, 30 Jan 2020 15:53:32 +0100 Subject: [PATCH 204/336] [refactor] Move remaining utility functions into sla_test_utils --- tests/sla_print/sla_print_tests.cpp | 167 ---------------------------- tests/sla_print/sla_test_utils.cpp | 100 +++++++++++++++++ tests/sla_print/sla_test_utils.hpp | 75 +++++++++++++ 3 files changed, 175 insertions(+), 167 deletions(-) diff --git a/tests/sla_print/sla_print_tests.cpp b/tests/sla_print/sla_print_tests.cpp index f34fb90968..32bca4ec0e 100644 --- a/tests/sla_print/sla_print_tests.cpp +++ b/tests/sla_print/sla_print_tests.cpp @@ -26,58 +26,6 @@ const char *const SUPPORT_TEST_MODELS[] = { } // namespace -// Test pair hash for 'nums' random number pairs. -template void test_pairhash() -{ - const constexpr size_t nums = 1000; - I A[nums] = {0}, B[nums] = {0}; - std::unordered_set CH; - std::unordered_map> ints; - - std::random_device rd; - std::mt19937 gen(rd()); - - const I Ibits = int(sizeof(I) * CHAR_BIT); - const II IIbits = int(sizeof(II) * CHAR_BIT); - - int bits = IIbits / 2 < Ibits ? Ibits / 2 : Ibits; - if (std::is_signed::value) bits -= 1; - const I Imin = 0; - const I Imax = I(std::pow(2., bits) - 1); - - std::uniform_int_distribution dis(Imin, Imax); - - for (size_t i = 0; i < nums;) { - I a = dis(gen); - if (CH.find(a) == CH.end()) { CH.insert(a); A[i] = a; ++i; } - } - - for (size_t i = 0; i < nums;) { - I b = dis(gen); - if (CH.find(b) == CH.end()) { CH.insert(b); B[i] = b; ++i; } - } - - for (size_t i = 0; i < nums; ++i) { - I a = A[i], b = B[i]; - - REQUIRE(a != b); - - II hash_ab = sla::pairhash(a, b); - II hash_ba = sla::pairhash(b, a); - REQUIRE(hash_ab == hash_ba); - - auto it = ints.find(hash_ab); - - if (it != ints.end()) { - REQUIRE(( - (it->second.first == a && it->second.second == b) || - (it->second.first == b && it->second.second == a) - )); - } else - ints[hash_ab] = std::make_pair(a, b); - } -} - TEST_CASE("Pillar pairhash should be unique", "[SLASupportGeneration]") { test_pairhash(); test_pairhash(); @@ -225,69 +173,6 @@ TEST_CASE("InitializedRasterShouldBeNONEmpty", "[SLARasterOutput]") { REQUIRE(raster.pixel_dimensions().h_mm == Approx(pixdim.h_mm)); } -using TPixel = uint8_t; -static constexpr const TPixel FullWhite = 255; -static constexpr const TPixel FullBlack = 0; - -template constexpr int arraysize(const A (&)[N]) { return N; } - -static void check_raster_transformations(sla::Raster::Orientation o, - sla::Raster::TMirroring mirroring) -{ - double disp_w = 120., disp_h = 68.; - sla::Raster::Resolution res{2560, 1440}; - sla::Raster::PixelDim pixdim{disp_w / res.width_px, disp_h / res.height_px}; - - auto bb = BoundingBox({0, 0}, {scaled(disp_w), scaled(disp_h)}); - sla::Raster::Trafo trafo{o, mirroring}; - trafo.origin_x = bb.center().x(); - trafo.origin_y = bb.center().y(); - - sla::Raster raster{res, pixdim, trafo}; - - // create box of size 32x32 pixels (not 1x1 to avoid antialiasing errors) - coord_t pw = 32 * coord_t(std::ceil(scaled(pixdim.w_mm))); - coord_t ph = 32 * coord_t(std::ceil(scaled(pixdim.h_mm))); - ExPolygon box; - box.contour.points = {{-pw, -ph}, {pw, -ph}, {pw, ph}, {-pw, ph}}; - - double tr_x = scaled(20.), tr_y = tr_x; - - box.translate(tr_x, tr_y); - ExPolygon expected_box = box; - - // Now calculate the position of the translated box according to output - // trafo. - if (o == sla::Raster::Orientation::roPortrait) expected_box.rotate(PI / 2.); - - if (mirroring[X]) - for (auto &p : expected_box.contour.points) p.x() = -p.x(); - - if (mirroring[Y]) - for (auto &p : expected_box.contour.points) p.y() = -p.y(); - - raster.draw(box); - - Point expected_coords = expected_box.contour.bounding_box().center(); - double rx = unscaled(expected_coords.x() + bb.center().x()) / pixdim.w_mm; - double ry = unscaled(expected_coords.y() + bb.center().y()) / pixdim.h_mm; - auto w = size_t(std::floor(rx)); - auto h = res.height_px - size_t(std::floor(ry)); - - REQUIRE((w < res.width_px && h < res.height_px)); - - auto px = raster.read_pixel(w, h); - - if (px != FullWhite) { - sla::PNGImage img; - std::fstream outf("out.png", std::ios::out); - - outf << img.serialize(raster); - } - - REQUIRE(px == FullWhite); -} - TEST_CASE("MirroringShouldBeCorrect", "[SLARasterOutput]") { sla::Raster::TMirroring mirrorings[] = {sla::Raster::NoMirror, sla::Raster::MirrorX, @@ -301,54 +186,6 @@ TEST_CASE("MirroringShouldBeCorrect", "[SLARasterOutput]") { check_raster_transformations(orientation, mirror); } -static ExPolygon square_with_hole(double v) -{ - ExPolygon poly; - coord_t V = scaled(v / 2.); - - poly.contour.points = {{-V, -V}, {V, -V}, {V, V}, {-V, V}}; - poly.holes.emplace_back(); - V = V / 2; - poly.holes.front().points = {{-V, V}, {V, V}, {V, -V}, {-V, -V}}; - return poly; -} - -static double pixel_area(TPixel px, const sla::Raster::PixelDim &pxdim) -{ - return (pxdim.h_mm * pxdim.w_mm) * px * 1. / (FullWhite - FullBlack); -} - -static double raster_white_area(const sla::Raster &raster) -{ - if (raster.empty()) return std::nan(""); - - auto res = raster.resolution(); - double a = 0; - - for (size_t x = 0; x < res.width_px; ++x) - for (size_t y = 0; y < res.height_px; ++y) { - auto px = raster.read_pixel(x, y); - a += pixel_area(px, raster.pixel_dimensions()); - } - - return a; -} - -static double predict_error(const ExPolygon &p, const sla::Raster::PixelDim &pd) -{ - auto lines = p.lines(); - double pix_err = pixel_area(FullWhite, pd) / 2.; - - // Worst case is when a line is parallel to the shorter axis of one pixel, - // when the line will be composed of the max number of pixels - double pix_l = std::min(pd.h_mm, pd.w_mm); - - double error = 0.; - for (auto &l : lines) - error += (unscaled(l.length()) / pix_l) * pix_err; - - return error; -} TEST_CASE("RasterizedPolygonAreaShouldMatch", "[SLARasterOutput]") { double disp_w = 120., disp_h = 68.; @@ -388,8 +225,4 @@ TEST_CASE("Triangle mesh conversions should be correct", "[SLAConversions]") std::fstream infile{"extruder_idler_quads.obj", std::ios::in}; cntr.from_obj(infile); } - - - - } diff --git a/tests/sla_print/sla_test_utils.cpp b/tests/sla_print/sla_test_utils.cpp index 0804adb4f3..44a15ff901 100644 --- a/tests/sla_print/sla_test_utils.cpp +++ b/tests/sla_print/sla_test_utils.cpp @@ -292,3 +292,103 @@ void check_validity(const TriangleMesh &input_mesh, int flags) REQUIRE(mesh.is_manifold()); } } + +void check_raster_transformations(sla::Raster::Orientation o, sla::Raster::TMirroring mirroring) +{ + double disp_w = 120., disp_h = 68.; + sla::Raster::Resolution res{2560, 1440}; + sla::Raster::PixelDim pixdim{disp_w / res.width_px, disp_h / res.height_px}; + + auto bb = BoundingBox({0, 0}, {scaled(disp_w), scaled(disp_h)}); + sla::Raster::Trafo trafo{o, mirroring}; + trafo.origin_x = bb.center().x(); + trafo.origin_y = bb.center().y(); + + sla::Raster raster{res, pixdim, trafo}; + + // create box of size 32x32 pixels (not 1x1 to avoid antialiasing errors) + coord_t pw = 32 * coord_t(std::ceil(scaled(pixdim.w_mm))); + coord_t ph = 32 * coord_t(std::ceil(scaled(pixdim.h_mm))); + ExPolygon box; + box.contour.points = {{-pw, -ph}, {pw, -ph}, {pw, ph}, {-pw, ph}}; + + double tr_x = scaled(20.), tr_y = tr_x; + + box.translate(tr_x, tr_y); + ExPolygon expected_box = box; + + // Now calculate the position of the translated box according to output + // trafo. + if (o == sla::Raster::Orientation::roPortrait) expected_box.rotate(PI / 2.); + + if (mirroring[X]) + for (auto &p : expected_box.contour.points) p.x() = -p.x(); + + if (mirroring[Y]) + for (auto &p : expected_box.contour.points) p.y() = -p.y(); + + raster.draw(box); + + Point expected_coords = expected_box.contour.bounding_box().center(); + double rx = unscaled(expected_coords.x() + bb.center().x()) / pixdim.w_mm; + double ry = unscaled(expected_coords.y() + bb.center().y()) / pixdim.h_mm; + auto w = size_t(std::floor(rx)); + auto h = res.height_px - size_t(std::floor(ry)); + + REQUIRE((w < res.width_px && h < res.height_px)); + + auto px = raster.read_pixel(w, h); + + if (px != FullWhite) { + sla::PNGImage img; + std::fstream outf("out.png", std::ios::out); + + outf << img.serialize(raster); + } + + REQUIRE(px == FullWhite); +} + +ExPolygon square_with_hole(double v) +{ + ExPolygon poly; + coord_t V = scaled(v / 2.); + + poly.contour.points = {{-V, -V}, {V, -V}, {V, V}, {-V, V}}; + poly.holes.emplace_back(); + V = V / 2; + poly.holes.front().points = {{-V, V}, {V, V}, {V, -V}, {-V, -V}}; + return poly; +} + +double raster_white_area(const sla::Raster &raster) +{ + if (raster.empty()) return std::nan(""); + + auto res = raster.resolution(); + double a = 0; + + for (size_t x = 0; x < res.width_px; ++x) + for (size_t y = 0; y < res.height_px; ++y) { + auto px = raster.read_pixel(x, y); + a += pixel_area(px, raster.pixel_dimensions()); + } + + return a; +} + +double predict_error(const ExPolygon &p, const sla::Raster::PixelDim &pd) +{ + auto lines = p.lines(); + double pix_err = pixel_area(FullWhite, pd) / 2.; + + // Worst case is when a line is parallel to the shorter axis of one pixel, + // when the line will be composed of the max number of pixels + double pix_l = std::min(pd.h_mm, pd.w_mm); + + double error = 0.; + for (auto &l : lines) + error += (unscaled(l.length()) / pix_l) * pix_err; + + return error; +} diff --git a/tests/sla_print/sla_test_utils.hpp b/tests/sla_print/sla_test_utils.hpp index dcb4934ef6..f3727bd394 100644 --- a/tests/sla_print/sla_test_utils.hpp +++ b/tests/sla_print/sla_test_utils.hpp @@ -6,6 +6,7 @@ // Debug #include +#include #include "libslic3r/libslic3r.h" #include "libslic3r/Format/OBJ.hpp" @@ -109,4 +110,78 @@ inline void test_support_model_collision( test_support_model_collision(obj_filename, input_supportcfg, hcfg, {}); } +// Test pair hash for 'nums' random number pairs. +template void test_pairhash() +{ + const constexpr size_t nums = 1000; + I A[nums] = {0}, B[nums] = {0}; + std::unordered_set CH; + std::unordered_map> ints; + + std::random_device rd; + std::mt19937 gen(rd()); + + const I Ibits = int(sizeof(I) * CHAR_BIT); + const II IIbits = int(sizeof(II) * CHAR_BIT); + + int bits = IIbits / 2 < Ibits ? Ibits / 2 : Ibits; + if (std::is_signed::value) bits -= 1; + const I Imin = 0; + const I Imax = I(std::pow(2., bits) - 1); + + std::uniform_int_distribution dis(Imin, Imax); + + for (size_t i = 0; i < nums;) { + I a = dis(gen); + if (CH.find(a) == CH.end()) { CH.insert(a); A[i] = a; ++i; } + } + + for (size_t i = 0; i < nums;) { + I b = dis(gen); + if (CH.find(b) == CH.end()) { CH.insert(b); B[i] = b; ++i; } + } + + for (size_t i = 0; i < nums; ++i) { + I a = A[i], b = B[i]; + + REQUIRE(a != b); + + II hash_ab = sla::pairhash(a, b); + II hash_ba = sla::pairhash(b, a); + REQUIRE(hash_ab == hash_ba); + + auto it = ints.find(hash_ab); + + if (it != ints.end()) { + REQUIRE(( + (it->second.first == a && it->second.second == b) || + (it->second.first == b && it->second.second == a) + )); + } else + ints[hash_ab] = std::make_pair(a, b); + } +} + +// SLA Raster test utils: + +using TPixel = uint8_t; +static constexpr const TPixel FullWhite = 255; +static constexpr const TPixel FullBlack = 0; + +template constexpr int arraysize(const A (&)[N]) { return N; } + +void check_raster_transformations(sla::Raster::Orientation o, + sla::Raster::TMirroring mirroring); + +ExPolygon square_with_hole(double v); + +inline double pixel_area(TPixel px, const sla::Raster::PixelDim &pxdim) +{ + return (pxdim.h_mm * pxdim.w_mm) * px * 1. / (FullWhite - FullBlack); +} + +double raster_white_area(const sla::Raster &raster); + +double predict_error(const ExPolygon &p, const sla::Raster::PixelDim &pd); + #endif // SLA_TEST_UTILS_HPP From 36e92b014121b05f302f29831050cd1758090315 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Fri, 31 Jan 2020 08:58:21 +0100 Subject: [PATCH 205/336] Put hole drilling into separate step --- src/libslic3r/SLAPrint.cpp | 8 +-- src/libslic3r/SLAPrint.hpp | 2 +- src/libslic3r/SLAPrintSteps.cpp | 112 ++++++++++++++++++-------------- src/libslic3r/SLAPrintSteps.hpp | 1 + 4 files changed, 68 insertions(+), 55 deletions(-) diff --git a/src/libslic3r/SLAPrint.cpp b/src/libslic3r/SLAPrint.cpp index ac3652fee7..a70b977b4c 100644 --- a/src/libslic3r/SLAPrint.cpp +++ b/src/libslic3r/SLAPrint.cpp @@ -678,7 +678,7 @@ void SLAPrint::process() // We want to first process all objects... std::vector level1_obj_steps = { - slaposHollowing, slaposObjectSlice, slaposSupportPoints, slaposSupportTree, slaposPad + slaposHollowing, slaposDrillHoles, slaposObjectSlice, slaposSupportPoints, slaposSupportTree, slaposPad }; // and then slice all supports to allow preview to be displayed ASAP @@ -984,10 +984,10 @@ bool SLAPrintObject::invalidate_step(SLAPrintObjectStep step) // propagate to dependent steps if (step == slaposHollowing) { invalidated |= this->invalidate_all_steps(); - } else if (step == slaposObjectSlice) { - invalidated |= this->invalidate_steps({ slaposDrillHolesIfHollowed, slaposSupportPoints, slaposSupportTree, slaposPad, slaposSliceSupports }); + } else if (step == slaposDrillHoles) { + invalidated |= this->invalidate_steps({ slaposObjectSlice, slaposSupportPoints, slaposSupportTree, slaposPad, slaposSliceSupports }); invalidated |= m_print->invalidate_step(slapsMergeSlicesAndEval); - } else if (step == slaposDrillHolesIfHollowed) { + } else if (step == slaposObjectSlice) { invalidated |= this->invalidate_steps({ slaposSupportPoints, slaposSupportTree, slaposPad, slaposSliceSupports }); invalidated |= m_print->invalidate_step(slapsMergeSlicesAndEval); } else if (step == slaposSupportPoints) { diff --git a/src/libslic3r/SLAPrint.hpp b/src/libslic3r/SLAPrint.hpp index ab1685ff89..4ff7837bc6 100644 --- a/src/libslic3r/SLAPrint.hpp +++ b/src/libslic3r/SLAPrint.hpp @@ -20,8 +20,8 @@ enum SLAPrintStep : unsigned int { enum SLAPrintObjectStep : unsigned int { slaposHollowing, + slaposDrillHoles, slaposObjectSlice, - slaposDrillHolesIfHollowed, slaposSupportPoints, slaposSupportTree, slaposPad, diff --git a/src/libslic3r/SLAPrintSteps.cpp b/src/libslic3r/SLAPrintSteps.cpp index 1ecefe2842..2b4a1d5188 100644 --- a/src/libslic3r/SLAPrintSteps.cpp +++ b/src/libslic3r/SLAPrintSteps.cpp @@ -26,9 +26,9 @@ namespace Slic3r { namespace { const std::array OBJ_STEP_LEVELS = { - 5, // slaposHollowing, - 20, // slaposObjectSlice, - 5, // slaposDrillHolesIfHollowed + 10, // slaposHollowing, + 10, // slaposDrillHolesIfHollowed + 10, // slaposObjectSlice, 20, // slaposSupportPoints, 10, // slaposSupportTree, 10, // slaposPad, @@ -38,9 +38,9 @@ const std::array OBJ_STEP_LEVELS = { std::string OBJ_STEP_LABELS(size_t idx) { switch (idx) { - case slaposHollowing: return L("Hollowing and drilling holes"); + case slaposHollowing: return L("Hollowing model"); + case slaposDrillHoles: return L("Drilling holes into hollowed model."); case slaposObjectSlice: return L("Slicing model"); - case slaposDrillHolesIfHollowed: return L("Drilling holes into hollowed model."); case slaposSupportPoints: return L("Generating support points"); case slaposSupportTree: return L("Generating support tree"); case slaposPad: return L("Generating pad"); @@ -80,57 +80,69 @@ SLAPrint::Steps::Steps(SLAPrint *print) void SLAPrint::Steps::hollow_model(SLAPrintObject &po) { po.m_hollowing_data.reset(); - if (! po.m_config.hollowing_enable.getBool()) - BOOST_LOG_TRIVIAL(info) << "Skipping hollowing step!"; - else { - BOOST_LOG_TRIVIAL(info) << "Performing hollowing step!"; - - double thickness = po.m_config.hollowing_min_thickness.getFloat(); - double quality = po.m_config.hollowing_quality.getFloat(); - double closing_d = po.m_config.hollowing_closing_distance.getFloat(); - sla::HollowingConfig hlwcfg{thickness, quality, closing_d}; - auto meshptr = generate_interior(po.transformed_mesh(), hlwcfg); - - if (meshptr->empty()) - BOOST_LOG_TRIVIAL(warning) << "Hollowed interior is empty!"; - else { - po.m_hollowing_data.reset(new SLAPrintObject::HollowingData()); - po.m_hollowing_data->interior = *meshptr; - auto &hollowed_mesh = po.m_hollowing_data->hollow_mesh_with_holes; - hollowed_mesh = po.transformed_mesh(); - hollowed_mesh.merge(po.m_hollowing_data->interior); - hollowed_mesh.require_shared_vertices(); - } + if (! po.m_config.hollowing_enable.getBool()) { + BOOST_LOG_TRIVIAL(info) << "Skipping hollowing step!"; + return; } + + BOOST_LOG_TRIVIAL(info) << "Performing hollowing step!"; - // Drill holes into the hollowed/original mesh. - if (po.m_model_object->sla_drain_holes.empty()) - BOOST_LOG_TRIVIAL(info) << "Drilling skipped (no holes)."; + double thickness = po.m_config.hollowing_min_thickness.getFloat(); + double quality = po.m_config.hollowing_quality.getFloat(); + double closing_d = po.m_config.hollowing_closing_distance.getFloat(); + sla::HollowingConfig hlwcfg{thickness, quality, closing_d}; + auto meshptr = generate_interior(po.transformed_mesh(), hlwcfg); + + if (meshptr->empty()) + BOOST_LOG_TRIVIAL(warning) << "Hollowed interior is empty!"; else { - BOOST_LOG_TRIVIAL(info) << "Drilling drainage holes."; - sla::DrainHoles drainholes = po.transformed_drainhole_points(); - - TriangleMesh holes_mesh; - - for (const sla::DrainHole &holept : drainholes) - holes_mesh.merge(sla::to_triangle_mesh(holept.to_mesh())); - - holes_mesh.require_shared_vertices(); - MeshBoolean::self_union(holes_mesh); //FIXME-fix and use the cgal version - - // If there is no hollowed mesh yet, copy the original mesh. - if (! po.m_hollowing_data) { - po.m_hollowing_data.reset(new SLAPrintObject::HollowingData()); - po.m_hollowing_data->hollow_mesh_with_holes = po.transformed_mesh(); - } - - TriangleMesh &hollowed_mesh = po.m_hollowing_data->hollow_mesh_with_holes; - hollowed_mesh = po.get_mesh_to_print(); - MeshBoolean::cgal::minus(hollowed_mesh, holes_mesh); + po.m_hollowing_data.reset(new SLAPrintObject::HollowingData()); + po.m_hollowing_data->interior = *meshptr; + auto &hollowed_mesh = po.m_hollowing_data->hollow_mesh_with_holes; + hollowed_mesh = po.transformed_mesh(); + hollowed_mesh.merge(po.m_hollowing_data->interior); hollowed_mesh.require_shared_vertices(); } } +void SLAPrint::Steps::drill_holes(SLAPrintObject &po) +{ + // Drill holes into the hollowed/original mesh. + if (po.m_model_object->sla_drain_holes.empty()) { + BOOST_LOG_TRIVIAL(info) << "Drilling skipped (no holes)."; + return; + } + + BOOST_LOG_TRIVIAL(info) << "Drilling drainage holes."; + sla::DrainHoles drainholes = po.transformed_drainhole_points(); + + TriangleMesh holes_mesh; + + for (const sla::DrainHole &holept : drainholes) + holes_mesh.merge(sla::to_triangle_mesh(holept.to_mesh())); + + holes_mesh.require_shared_vertices(); + MeshBoolean::cgal::self_union(holes_mesh); //FIXME-fix and use the cgal version + + // If there is no hollowed mesh yet, copy the original mesh. + if (! po.m_hollowing_data) { + po.m_hollowing_data.reset(new SLAPrintObject::HollowingData()); + po.m_hollowing_data->hollow_mesh_with_holes = po.transformed_mesh(); + } + + TriangleMesh &hollowed_mesh = po.m_hollowing_data->hollow_mesh_with_holes; + + try { + MeshBoolean::cgal::minus(hollowed_mesh, holes_mesh); + } catch (const std::runtime_error &ex) { + throw std::runtime_error(L( + "Drilling holes into the mesh failed. " + "This is usually caused by broken model. Try to fix it first.")); + } + + hollowed_mesh.require_shared_vertices(); +} + // The slicing will be performed on an imaginary 1D grid which starts from // the bottom of the bounding box created around the supported model. So // the first layer which is usually thicker will be part of the supports @@ -850,8 +862,8 @@ void SLAPrint::Steps::execute(SLAPrintObjectStep step, SLAPrintObject &obj) { switch(step) { case slaposHollowing: hollow_model(obj); break; + case slaposDrillHoles: drill_holes(obj); break; case slaposObjectSlice: slice_model(obj); break; - case slaposDrillHolesIfHollowed: break; case slaposSupportPoints: support_points(obj); break; case slaposSupportTree: support_tree(obj); break; case slaposPad: generate_pad(obj); break; diff --git a/src/libslic3r/SLAPrintSteps.hpp b/src/libslic3r/SLAPrintSteps.hpp index c62558671c..ad099e0e75 100644 --- a/src/libslic3r/SLAPrintSteps.hpp +++ b/src/libslic3r/SLAPrintSteps.hpp @@ -44,6 +44,7 @@ public: Steps(SLAPrint *print); void hollow_model(SLAPrintObject &po); + void drill_holes (SLAPrintObject &po); void slice_model(SLAPrintObject& po); void support_points(SLAPrintObject& po); void support_tree(SLAPrintObject& po); From 3a99b23ec762cd1ad9b4c5cbb4373d386bfe4b66 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Fri, 31 Jan 2020 12:15:04 +0100 Subject: [PATCH 206/336] #3580 - Added menu item 'Edit/Reload from disk' and F5 key acceleration to reload the entire plater --- src/slic3r/GUI/GLCanvas3D.cpp | 2 ++ src/slic3r/GUI/GLCanvas3D.hpp | 1 + src/slic3r/GUI/MainFrame.cpp | 5 +++++ src/slic3r/GUI/Plater.cpp | 25 +++++++++++++++++++++++++ src/slic3r/GUI/Plater.hpp | 1 + 5 files changed, 34 insertions(+) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index c8e86d69bc..2d1368af39 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -1256,6 +1256,7 @@ wxDEFINE_EVENT(EVT_GLCANVAS_REDO, SimpleEvent); wxDEFINE_EVENT(EVT_GLCANVAS_RESET_LAYER_HEIGHT_PROFILE, SimpleEvent); wxDEFINE_EVENT(EVT_GLCANVAS_ADAPTIVE_LAYER_HEIGHT_PROFILE, Event); wxDEFINE_EVENT(EVT_GLCANVAS_SMOOTH_LAYER_HEIGHT_PROFILE, HeightProfileSmoothEvent); +wxDEFINE_EVENT(EVT_GLCANVAS_RELOAD_FROM_DISK, SimpleEvent); #if ENABLE_THUMBNAIL_GENERATOR const double GLCanvas3D::DefaultCameraZoomToBoxMarginFactor = 1.25; @@ -2625,6 +2626,7 @@ void GLCanvas3D::on_char(wxKeyEvent& evt) post_event(SimpleEvent(EVT_GLTOOLBAR_DELETE)); break; case WXK_ESCAPE: { deselect_all(); break; } + case WXK_F5: { post_event(SimpleEvent(EVT_GLCANVAS_RELOAD_FROM_DISK)); break; } case '0': { select_view("iso"); break; } case '1': { select_view("top"); break; } case '2': { select_view("bottom"); break; } diff --git a/src/slic3r/GUI/GLCanvas3D.hpp b/src/slic3r/GUI/GLCanvas3D.hpp index a7f272f975..a0e7958897 100644 --- a/src/slic3r/GUI/GLCanvas3D.hpp +++ b/src/slic3r/GUI/GLCanvas3D.hpp @@ -108,6 +108,7 @@ wxDECLARE_EVENT(EVT_GLCANVAS_REDO, SimpleEvent); wxDECLARE_EVENT(EVT_GLCANVAS_RESET_LAYER_HEIGHT_PROFILE, SimpleEvent); wxDECLARE_EVENT(EVT_GLCANVAS_ADAPTIVE_LAYER_HEIGHT_PROFILE, Event); wxDECLARE_EVENT(EVT_GLCANVAS_SMOOTH_LAYER_HEIGHT_PROFILE, HeightProfileSmoothEvent); +wxDECLARE_EVENT(EVT_GLCANVAS_RELOAD_FROM_DISK, SimpleEvent); class GLCanvas3D { diff --git a/src/slic3r/GUI/MainFrame.cpp b/src/slic3r/GUI/MainFrame.cpp index d1466ef0b3..9929cf082a 100644 --- a/src/slic3r/GUI/MainFrame.cpp +++ b/src/slic3r/GUI/MainFrame.cpp @@ -578,6 +578,11 @@ void MainFrame::init_menubar() append_menu_item(editMenu, wxID_ANY, _(L("&Paste")) + sep + GUI::shortkey_ctrl_prefix() + sep_space + "V", _(L("Paste clipboard")), [this](wxCommandEvent&) { m_plater->paste_from_clipboard(); }, "paste_menu", nullptr, [this](){return m_plater->can_paste_from_clipboard(); }, this); + + editMenu->AppendSeparator(); + append_menu_item(editMenu, wxID_ANY, _(L("Re&load from disk")) + sep + "F5", + _(L("Reload the plater from disk")), [this](wxCommandEvent&) { m_plater->reload_all_from_disk(); }, + "", nullptr, [this]() {return !m_plater->model().objects.empty(); }, this); } // Window menu diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index b6ea8cbc30..c933686739 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -1875,6 +1875,7 @@ struct Plater::priv } void export_gcode(fs::path output_path, PrintHostJob upload_job); void reload_from_disk(); + void reload_all_from_disk(); void fix_through_netfabb(const int obj_idx, const int vol_idx = -1); void set_current_panel(wxPanel* panel); @@ -2075,6 +2076,7 @@ Plater::priv::priv(Plater *q, MainFrame *main_frame) view3D_canvas->Bind(EVT_GLCANVAS_RESET_LAYER_HEIGHT_PROFILE, [this](SimpleEvent&) { this->view3D->get_canvas3d()->reset_layer_height_profile(); }); view3D_canvas->Bind(EVT_GLCANVAS_ADAPTIVE_LAYER_HEIGHT_PROFILE, [this](Event& evt) { this->view3D->get_canvas3d()->adaptive_layer_height_profile(evt.data); }); view3D_canvas->Bind(EVT_GLCANVAS_SMOOTH_LAYER_HEIGHT_PROFILE, [this](HeightProfileSmoothEvent& evt) { this->view3D->get_canvas3d()->smooth_layer_height_profile(evt.data); }); + view3D_canvas->Bind(EVT_GLCANVAS_RELOAD_FROM_DISK, [this](SimpleEvent&) { if (!this->model.objects.empty()) this->reload_all_from_disk(); }); // 3DScene/Toolbar: view3D_canvas->Bind(EVT_GLTOOLBAR_ADD, &priv::on_action_add, this); @@ -3447,6 +3449,24 @@ void Plater::priv::reload_from_disk() } } +void Plater::priv::reload_all_from_disk() +{ + Plater::TakeSnapshot snapshot(q, _(L("Reload all from disk"))); + Plater::SuppressSnapshots suppress(q); + + Selection& selection = get_selection(); + Selection::IndicesList curr_idxs = selection.get_volume_idxs(); + // reload from disk uses selection + select_all(); + reload_from_disk(); + // restore previous selection + selection.clear(); + for (unsigned int idx : curr_idxs) + { + selection.add(idx, false); + } +} + void Plater::priv::fix_through_netfabb(const int obj_idx, const int vol_idx/* = -1*/) { if (obj_idx < 0) @@ -5034,6 +5054,11 @@ void Plater::reload_from_disk() p->reload_from_disk(); } +void Plater::reload_all_from_disk() +{ + p->reload_all_from_disk(); +} + bool Plater::has_toolpaths_to_export() const { return p->preview->get_canvas3d()->has_toolpaths_to_export(); diff --git a/src/slic3r/GUI/Plater.hpp b/src/slic3r/GUI/Plater.hpp index 0d50629931..82fae44f00 100644 --- a/src/slic3r/GUI/Plater.hpp +++ b/src/slic3r/GUI/Plater.hpp @@ -193,6 +193,7 @@ public: void export_amf(); void export_3mf(const boost::filesystem::path& output_path = boost::filesystem::path()); void reload_from_disk(); + void reload_all_from_disk(); bool has_toolpaths_to_export() const; void export_toolpaths_to_obj() const; void hollow(); From 378321231f7ec814e5836fe8175d83895e872601 Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Fri, 31 Jan 2020 14:50:37 +0100 Subject: [PATCH 207/336] Fix of tripping glAssert after switching to Preview on Linux/GTK2 (fix suggested and thus approved by @enricoturri1966) --- src/slic3r/GUI/GLCanvas3D.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 2d1368af39..bab04b2d12 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -1712,7 +1712,11 @@ void GLCanvas3D::render() const Size& cnv_size = get_canvas_size(); #if ENABLE_6DOF_CAMERA - m_camera.apply_viewport(0, 0, (unsigned int)cnv_size.get_width(), (unsigned int)cnv_size.get_height()); + // Probably due to different order of events on Linux/GTK2, when one switched from 3D scene + // to preview, this was called before canvas had its final size. It reported zero width + // and the viewport was set incorrectly, leading to tripping glAsserts further down + // the road (in apply_projection). That's why the minimum size is forced to 10. + m_camera.apply_viewport(0, 0, std::max(10u, (unsigned int)cnv_size.get_width()), std::max(10u, (unsigned int)cnv_size.get_height())); #endif // ENABLE_6DOF_CAMERA if (m_camera.requires_zoom_to_bed) From 1472ad9b14287496a6068654c1d2151f48cec92d Mon Sep 17 00:00:00 2001 From: YuSanka Date: Fri, 31 Jan 2020 16:50:11 +0100 Subject: [PATCH 208/336] To fix blurred icons under OSX there is implemented PresetBitmapComboBox, derived from wxBitmapComboBox, which now will be used for preset choosers on sidebar a preset tabs. + for BitmapCache class added m_scale used for correct scaling of SVG images on Retina displays + some code clearing from unused functions or function's parameters --- src/slic3r/GUI/BitmapCache.cpp | 57 +++++--- src/slic3r/GUI/BitmapCache.hpp | 22 ++-- src/slic3r/GUI/DoubleSlider.cpp | 20 ++- src/slic3r/GUI/GUI_ObjectList.cpp | 53 ++++---- src/slic3r/GUI/MainFrame.cpp | 6 +- src/slic3r/GUI/MsgDialog.cpp | 4 +- src/slic3r/GUI/Plater.cpp | 6 +- src/slic3r/GUI/Plater.hpp | 3 +- src/slic3r/GUI/Preset.cpp | 12 +- src/slic3r/GUI/Preset.hpp | 4 +- src/slic3r/GUI/PresetBundle.cpp | 40 +++--- src/slic3r/GUI/PresetBundle.hpp | 4 +- src/slic3r/GUI/Tab.cpp | 4 +- src/slic3r/GUI/Tab.hpp | 2 +- src/slic3r/GUI/UpdateDialogs.cpp | 2 +- src/slic3r/GUI/wxExtensions.cpp | 207 ++++++++++++++++++++++-------- src/slic3r/GUI/wxExtensions.hpp | 50 ++++++-- 17 files changed, 319 insertions(+), 177 deletions(-) diff --git a/src/slic3r/GUI/BitmapCache.cpp b/src/slic3r/GUI/BitmapCache.cpp index 8d65ae90bf..9668278bb3 100644 --- a/src/slic3r/GUI/BitmapCache.cpp +++ b/src/slic3r/GUI/BitmapCache.cpp @@ -1,6 +1,7 @@ #include "BitmapCache.hpp" #include "libslic3r/Utils.hpp" +#include "../Utils/MacDarkMode.hpp" #include #if ! defined(WIN32) && ! defined(__APPLE__) @@ -20,6 +21,16 @@ namespace Slic3r { namespace GUI { +BitmapCache::BitmapCache() +{ +#ifdef __APPLE__ + // Note: win->GetContentScaleFactor() is not used anymore here because it tends to + // return bogus results quite often (such as 1.0 on Retina or even 0.0). + // We're using the max scaling factor across all screens because it's very likely to be good enough. + m_scale = mac_max_scaling_factor(); +#endif +} + void BitmapCache::clear() { for (std::pair &bitmap : m_map) @@ -49,7 +60,7 @@ static wxBitmap wxImage_to_wxBitmap_with_alpha(wxImage &&image, float scale = 1. #endif } -wxBitmap* BitmapCache::insert(const std::string &bitmap_key, size_t width, size_t height, float scale/* = 1.0f*/) +wxBitmap* BitmapCache::insert(const std::string &bitmap_key, size_t width, size_t height) { wxBitmap *bitmap = nullptr; auto it = m_map.find(bitmap_key); @@ -61,7 +72,7 @@ wxBitmap* BitmapCache::insert(const std::string &bitmap_key, size_t width, size_ // So, We need to let the Mac OS wxBitmap implementation // know that the image may already be scaled appropriately for Retina, // and thereby that it's not supposed to upscale it. - bitmap->CreateScaled(width, height, -1, scale); + bitmap->CreateScaled(width, height, -1, m_scale); #endif m_map[bitmap_key] = bitmap; } else { @@ -103,13 +114,18 @@ wxBitmap* BitmapCache::insert(const std::string &bitmap_key, const wxBitmap &bmp return this->insert(bitmap_key, bmps, bmps + 3); } -wxBitmap* BitmapCache::insert(const std::string &bitmap_key, const wxBitmap *begin, const wxBitmap *end, float scale/* = 1.0f*/) +wxBitmap* BitmapCache::insert(const std::string &bitmap_key, const wxBitmap *begin, const wxBitmap *end) { size_t width = 0; size_t height = 0; for (const wxBitmap *bmp = begin; bmp != end; ++ bmp) { +#ifdef __APPLE__ + width += bmp->GetScaledWidth(); + height = std::max(height, bmp->GetScaledHeight()); +#else width += bmp->GetWidth(); height = std::max(height, bmp->GetHeight()); +#endif } #ifdef BROKEN_ALPHA @@ -166,13 +182,7 @@ wxBitmap* BitmapCache::insert(const std::string &bitmap_key, const wxBitmap *beg #else -#ifdef __APPLE__ - // Note, for this moment width and height are scaled, so divide them by scale to avoid one more multiplication inside CreateScaled() - width *= 1.0 / scale; - height *= 1.0 / scale; -#endif - - wxBitmap *bitmap = this->insert(bitmap_key, width, height, scale); + wxBitmap *bitmap = this->insert(bitmap_key, width, height); wxMemoryDC memDC; memDC.SelectObject(*bitmap); memDC.SetBackground(*wxTRANSPARENT_BRUSH); @@ -181,8 +191,12 @@ wxBitmap* BitmapCache::insert(const std::string &bitmap_key, const wxBitmap *beg for (const wxBitmap *bmp = begin; bmp != end; ++ bmp) { if (bmp->GetWidth() > 0) memDC.DrawBitmap(*bmp, x, 0, true); +#ifdef __APPLE__ // we should "move" with step equal to non-scaled width - x += bmp->GetWidth()/scale; + x += bmp->GetScaledWidth(); +#else + x += bmp->GetWidth(); +#endif } memDC.SelectObject(wxNullBitmap); return bitmap; @@ -190,7 +204,7 @@ wxBitmap* BitmapCache::insert(const std::string &bitmap_key, const wxBitmap *beg #endif } -wxBitmap* BitmapCache::insert_raw_rgba(const std::string &bitmap_key, unsigned width, unsigned height, const unsigned char *raw_data, float scale /* = 1.0f */, const bool grayscale/* = false*/) +wxBitmap* BitmapCache::insert_raw_rgba(const std::string &bitmap_key, unsigned width, unsigned height, const unsigned char *raw_data, const bool grayscale/* = false*/) { wxImage image(width, height); image.InitAlpha(); @@ -207,7 +221,7 @@ wxBitmap* BitmapCache::insert_raw_rgba(const std::string &bitmap_key, unsigned w if (grayscale) image = image.ConvertToGreyscale(m_gs, m_gs, m_gs); - return this->insert(bitmap_key, wxImage_to_wxBitmap_with_alpha(std::move(image), scale)); + return this->insert(bitmap_key, wxImage_to_wxBitmap_with_alpha(std::move(image), m_scale)); } wxBitmap* BitmapCache::load_png(const std::string &bitmap_name, unsigned width, unsigned height, @@ -242,12 +256,12 @@ wxBitmap* BitmapCache::load_png(const std::string &bitmap_name, unsigned width, } wxBitmap* BitmapCache::load_svg(const std::string &bitmap_name, unsigned target_width, unsigned target_height, - float scale /* = 1.0f */, const bool grayscale/* = false*/, const bool dark_mode/* = false*/) + const bool grayscale/* = false*/, const bool dark_mode/* = false*/) { std::string bitmap_key = bitmap_name + ( target_height !=0 ? "-h" + std::to_string(target_height) : "-w" + std::to_string(target_width)) - + (scale != 1.0f ? "-s" + std::to_string(scale) : "") + + (m_scale != 1.0f ? "-s" + std::to_string(m_scale) : "") + (grayscale ? "-gs" : ""); /* For the Dark mode of any platform, we should draw icons in respect to OS background @@ -287,7 +301,7 @@ wxBitmap* BitmapCache::load_svg(const std::string &bitmap_name, unsigned target_ if (image == nullptr) return nullptr; - target_height != 0 ? target_height *= scale : target_width *= scale; + target_height != 0 ? target_height *= m_scale : target_width *= m_scale; float svg_scale = target_height != 0 ? (float)target_height / image->height : target_width != 0 ? @@ -312,11 +326,16 @@ wxBitmap* BitmapCache::load_svg(const std::string &bitmap_name, unsigned target_ ::nsvgDeleteRasterizer(rast); ::nsvgDelete(image); - return this->insert_raw_rgba(bitmap_key, width, height, data.data(), scale, grayscale); + return this->insert_raw_rgba(bitmap_key, width, height, data.data(), grayscale); } -wxBitmap BitmapCache::mksolid(size_t width, size_t height, unsigned char r, unsigned char g, unsigned char b, unsigned char transparency) +//we make scaled solid bitmaps only for the cases, when its will be used with scaled SVG icon in one output bitmap +wxBitmap BitmapCache::mksolid(size_t width, size_t height, unsigned char r, unsigned char g, unsigned char b, unsigned char transparency, bool suppress_scaling/* = false*/) { + double scale = suppress_scaling ? 1.0f : m_scale; + width *= scale; + height *= scale; + wxImage image(width, height); image.InitAlpha(); unsigned char* imgdata = image.GetData(); @@ -327,7 +346,7 @@ wxBitmap BitmapCache::mksolid(size_t width, size_t height, unsigned char r, unsi *imgdata ++ = b; *imgalpha ++ = transparency; } - return wxImage_to_wxBitmap_with_alpha(std::move(image)); + return wxImage_to_wxBitmap_with_alpha(std::move(image), scale); } } // namespace GUI diff --git a/src/slic3r/GUI/BitmapCache.hpp b/src/slic3r/GUI/BitmapCache.hpp index 49d45c66ac..73e4a31dc3 100644 --- a/src/slic3r/GUI/BitmapCache.hpp +++ b/src/slic3r/GUI/BitmapCache.hpp @@ -16,33 +16,35 @@ namespace Slic3r { namespace GUI { class BitmapCache { public: - BitmapCache() {} + BitmapCache(); ~BitmapCache() { clear(); } void clear(); + double scale() { return m_scale; } wxBitmap* find(const std::string &name) { auto it = m_map.find(name); return (it == m_map.end()) ? nullptr : it->second; } const wxBitmap* find(const std::string &name) const { return const_cast(this)->find(name); } - wxBitmap* insert(const std::string &name, size_t width, size_t height, float scale = 1.0f); + wxBitmap* insert(const std::string &name, size_t width, size_t height); wxBitmap* insert(const std::string &name, const wxBitmap &bmp); wxBitmap* insert(const std::string &name, const wxBitmap &bmp, const wxBitmap &bmp2); wxBitmap* insert(const std::string &name, const wxBitmap &bmp, const wxBitmap &bmp2, const wxBitmap &bmp3); - wxBitmap* insert(const std::string &name, const std::vector &bmps, float scale = 1.0f) { return this->insert(name, &bmps.front(), &bmps.front() + bmps.size(), scale); } - wxBitmap* insert(const std::string &name, const wxBitmap *begin, const wxBitmap *end, float scale = 1.0f); - wxBitmap* insert_raw_rgba(const std::string &bitmap_key, unsigned width, unsigned height, const unsigned char *raw_data, float scale = 1.0f, const bool grayscale = false); + wxBitmap* insert(const std::string &name, const std::vector &bmps) { return this->insert(name, &bmps.front(), &bmps.front() + bmps.size()); } + wxBitmap* insert(const std::string &name, const wxBitmap *begin, const wxBitmap *end); + wxBitmap* insert_raw_rgba(const std::string &bitmap_key, unsigned width, unsigned height, const unsigned char *raw_data, const bool grayscale = false); // Load png from resources/icons. bitmap_key is given without the .png suffix. Bitmap will be rescaled to provided height/width if nonzero. wxBitmap* load_png(const std::string &bitmap_key, unsigned width = 0, unsigned height = 0, const bool grayscale = false); // Load svg from resources/icons. bitmap_key is given without the .svg suffix. SVG will be rasterized to provided height/width. - wxBitmap* load_svg(const std::string &bitmap_key, unsigned width = 0, unsigned height = 0, float scale = 1.0f, const bool grayscale = false, const bool dark_mode = false); + wxBitmap* load_svg(const std::string &bitmap_key, unsigned width = 0, unsigned height = 0, const bool grayscale = false, const bool dark_mode = false); - static wxBitmap mksolid(size_t width, size_t height, unsigned char r, unsigned char g, unsigned char b, unsigned char transparency); - static wxBitmap mksolid(size_t width, size_t height, const unsigned char rgb[3]) { return mksolid(width, height, rgb[0], rgb[1], rgb[2], wxALPHA_OPAQUE); } - static wxBitmap mkclear(size_t width, size_t height) { return mksolid(width, height, 0, 0, 0, wxALPHA_TRANSPARENT); } + /*static */wxBitmap mksolid(size_t width, size_t height, unsigned char r, unsigned char g, unsigned char b, unsigned char transparency, bool suppress_scaling = false); + /*static */wxBitmap mksolid(size_t width, size_t height, const unsigned char rgb[3], bool suppress_scaling = false) { return mksolid(width, height, rgb[0], rgb[1], rgb[2], wxALPHA_OPAQUE); } + /*static */wxBitmap mkclear(size_t width, size_t height) { return mksolid(width, height, 0, 0, 0, wxALPHA_TRANSPARENT); } private: std::map m_map; - double m_gs = 0.2; // value, used for image.ConvertToGreyscale(m_gs, m_gs, m_gs) + double m_gs = 0.2; // value, used for image.ConvertToGreyscale(m_gs, m_gs, m_gs) + double m_scale = 1.0; // value, used for correct scaling of SVG icons on Retina display }; } // GUI diff --git a/src/slic3r/GUI/DoubleSlider.cpp b/src/slic3r/GUI/DoubleSlider.cpp index 47bdec1fb9..4d29e13a7b 100644 --- a/src/slic3r/GUI/DoubleSlider.cpp +++ b/src/slic3r/GUI/DoubleSlider.cpp @@ -52,28 +52,26 @@ Control::Control( wxWindow *parent, if (!is_osx) SetDoubleBuffered(true);// SetDoubleBuffered exists on Win and Linux/GTK, but is missing on OSX - const float scale_factor = get_svg_scale_factor(this); - m_bmp_thumb_higher = (style == wxSL_HORIZONTAL ? ScalableBitmap(this, "right_half_circle.png") : ScalableBitmap(this, "thumb_up")); m_bmp_thumb_lower = (style == wxSL_HORIZONTAL ? ScalableBitmap(this, "left_half_circle.png" ) : ScalableBitmap(this, "thumb_down")); - m_thumb_size = m_bmp_thumb_lower.bmp().GetSize()*(1.0/scale_factor); + m_thumb_size = m_bmp_thumb_lower.GetBmpSize(); m_bmp_add_tick_on = ScalableBitmap(this, "colorchange_add"); m_bmp_add_tick_off = ScalableBitmap(this, "colorchange_add_f"); m_bmp_del_tick_on = ScalableBitmap(this, "colorchange_del"); m_bmp_del_tick_off = ScalableBitmap(this, "colorchange_del_f"); - m_tick_icon_dim = int((float)m_bmp_add_tick_on.bmp().GetSize().x / scale_factor); + m_tick_icon_dim = m_bmp_add_tick_on.GetBmpWidth(); m_bmp_one_layer_lock_on = ScalableBitmap(this, "lock_closed"); m_bmp_one_layer_lock_off = ScalableBitmap(this, "lock_closed_f"); m_bmp_one_layer_unlock_on = ScalableBitmap(this, "lock_open"); m_bmp_one_layer_unlock_off = ScalableBitmap(this, "lock_open_f"); - m_lock_icon_dim = int((float)m_bmp_one_layer_lock_on.bmp().GetSize().x / scale_factor); + m_lock_icon_dim = m_bmp_one_layer_lock_on.GetBmpWidth(); m_bmp_revert = ScalableBitmap(this, "undo"); - m_revert_icon_dim = int((float)m_bmp_revert.bmp().GetSize().x / scale_factor); + m_revert_icon_dim = m_bmp_revert.GetBmpWidth(); m_bmp_cog = ScalableBitmap(this, "cog"); - m_cog_icon_dim = int((float)m_bmp_cog.bmp().GetSize().x / scale_factor); + m_cog_icon_dim = m_bmp_cog.GetBmpWidth(); m_selection = ssUndef; m_ticks.set_pause_print_msg(_utf8(L("Place bearings in slots and resume"))); @@ -554,9 +552,9 @@ void Control::draw_ticks(wxDC& dc) // Draw icon for "Pause print" or "Custom Gcode" if (tick.gcode != ColorChangeCode && tick.gcode != ToolChangeCode) - icon = create_scaled_bitmap(this, tick.gcode == PausePrintCode ? "pause_print" : "edit_gcode"); + icon = create_scaled_bitmap(tick.gcode == PausePrintCode ? "pause_print" : "edit_gcode"); else if (m_ticks.is_conflict_tick(tick, m_mode, m_only_extruder, m_values[tick.tick])) - icon = create_scaled_bitmap(this, "error_tick"); + icon = create_scaled_bitmap("error_tick"); if (!icon.IsNull()) { @@ -1028,7 +1026,7 @@ void Control::append_change_extruder_menu_item(wxMenu* menu, bool switch_current _(L("Change extruder (N/A)")); wxMenuItem* change_extruder_menu_item = menu->AppendSubMenu(change_extruder_menu, change_extruder_menu_name, _(L("Use another extruder"))); - change_extruder_menu_item->SetBitmap(create_scaled_bitmap(this, active_extruders[1] > 0 ? "edit_uni" : "change_extruder")); + change_extruder_menu_item->SetBitmap(create_scaled_bitmap(active_extruders[1] > 0 ? "edit_uni" : "change_extruder")); GUI::wxGetApp().plater()->Bind(wxEVT_UPDATE_UI, [this, change_extruder_menu_item](wxUpdateUIEvent& evt) { enable_menu_item(evt, [this]() {return m_mode == t_mode::MultiAsSingle; }, change_extruder_menu_item, this); }, @@ -1062,7 +1060,7 @@ void Control::append_add_color_change_menu_item(wxMenu* menu, bool switch_curren from_u8((boost::format(_utf8(L("Switch code to Color change (%1%) for:"))) % ColorChangeCode).str()) : from_u8((boost::format(_utf8(L("Add color change (%1%) for:"))) % ColorChangeCode).str()); wxMenuItem* add_color_change_menu_item = menu->AppendSubMenu(add_color_change_menu, menu_name, ""); - add_color_change_menu_item->SetBitmap(create_scaled_bitmap(this, "colorchange_add_m")); + add_color_change_menu_item->SetBitmap(create_scaled_bitmap("colorchange_add_m")); } } diff --git a/src/slic3r/GUI/GUI_ObjectList.cpp b/src/slic3r/GUI/GUI_ObjectList.cpp index babb8ed5c7..33ddd475cd 100644 --- a/src/slic3r/GUI/GUI_ObjectList.cpp +++ b/src/slic3r/GUI/GUI_ObjectList.cpp @@ -90,20 +90,20 @@ ObjectList::ObjectList(wxWindow* parent) : // see note in PresetBundle::load_compatible_bitmaps() // ptFFF - CATEGORY_ICON[L("Layers and Perimeters")] = create_scaled_bitmap(this, "layers"); - CATEGORY_ICON[L("Infill")] = create_scaled_bitmap(this, "infill"); - CATEGORY_ICON[L("Support material")] = create_scaled_bitmap(this, "support"); - CATEGORY_ICON[L("Speed")] = create_scaled_bitmap(this, "time"); - CATEGORY_ICON[L("Extruders")] = create_scaled_bitmap(this, "funnel"); - CATEGORY_ICON[L("Extrusion Width")] = create_scaled_bitmap(this, "funnel"); - CATEGORY_ICON[L("Wipe options")] = create_scaled_bitmap(this, "funnel"); -// CATEGORY_ICON[L("Skirt and brim")] = create_scaled_bitmap(this, "skirt+brim"); -// CATEGORY_ICON[L("Speed > Acceleration")] = create_scaled_bitmap(this, "time"); - CATEGORY_ICON[L("Advanced")] = create_scaled_bitmap(this, "wrench"); + CATEGORY_ICON[L("Layers and Perimeters")] = create_scaled_bitmap("layers"); + CATEGORY_ICON[L("Infill")] = create_scaled_bitmap("infill"); + CATEGORY_ICON[L("Support material")] = create_scaled_bitmap("support"); + CATEGORY_ICON[L("Speed")] = create_scaled_bitmap("time"); + CATEGORY_ICON[L("Extruders")] = create_scaled_bitmap("funnel"); + CATEGORY_ICON[L("Extrusion Width")] = create_scaled_bitmap("funnel"); + CATEGORY_ICON[L("Wipe options")] = create_scaled_bitmap("funnel"); +// CATEGORY_ICON[L("Skirt and brim")] = create_scaled_bitmap("skirt+brim"); +// CATEGORY_ICON[L("Speed > Acceleration")] = create_scaled_bitmap("time"); + CATEGORY_ICON[L("Advanced")] = create_scaled_bitmap("wrench"); // ptSLA - CATEGORY_ICON[L("Supports")] = create_scaled_bitmap(this, "support"/*"sla_supports"*/); - CATEGORY_ICON[L("Pad")] = create_scaled_bitmap(this, "pad"); - CATEGORY_ICON[L("Hollowing")] = create_scaled_bitmap(this, "hollowing"); + CATEGORY_ICON[L("Supports")] = create_scaled_bitmap("support"/*"sla_supports"*/); + CATEGORY_ICON[L("Pad")] = create_scaled_bitmap("pad"); + CATEGORY_ICON[L("Hollowing")] = create_scaled_bitmap("hollowing"); } // create control @@ -607,23 +607,20 @@ void ObjectList::msw_rescale_icons() // Update CATEGORY_ICON according to new scale { - // Note: `this` isn't passed to create_scaled_bitmap() here because of bugs in the widget, - // see note in PresetBundle::load_compatible_bitmaps() - // ptFFF - CATEGORY_ICON[L("Layers and Perimeters")] = create_scaled_bitmap(nullptr, "layers"); - CATEGORY_ICON[L("Infill")] = create_scaled_bitmap(nullptr, "infill"); - CATEGORY_ICON[L("Support material")] = create_scaled_bitmap(nullptr, "support"); - CATEGORY_ICON[L("Speed")] = create_scaled_bitmap(nullptr, "time"); - CATEGORY_ICON[L("Extruders")] = create_scaled_bitmap(nullptr, "funnel"); - CATEGORY_ICON[L("Extrusion Width")] = create_scaled_bitmap(nullptr, "funnel"); - CATEGORY_ICON[L("Wipe options")] = create_scaled_bitmap(nullptr, "funnel"); -// CATEGORY_ICON[L("Skirt and brim")] = create_scaled_bitmap(nullptr, "skirt+brim"); -// CATEGORY_ICON[L("Speed > Acceleration")] = create_scaled_bitmap(nullptr, "time"); - CATEGORY_ICON[L("Advanced")] = create_scaled_bitmap(nullptr, "wrench"); + CATEGORY_ICON[L("Layers and Perimeters")] = create_scaled_bitmap("layers"); + CATEGORY_ICON[L("Infill")] = create_scaled_bitmap("infill"); + CATEGORY_ICON[L("Support material")] = create_scaled_bitmap("support"); + CATEGORY_ICON[L("Speed")] = create_scaled_bitmap("time"); + CATEGORY_ICON[L("Extruders")] = create_scaled_bitmap("funnel"); + CATEGORY_ICON[L("Extrusion Width")] = create_scaled_bitmap("funnel"); + CATEGORY_ICON[L("Wipe options")] = create_scaled_bitmap("funnel"); +// CATEGORY_ICON[L("Skirt and brim")] = create_scaled_bitmap("skirt+brim"); +// CATEGORY_ICON[L("Speed > Acceleration")] = create_scaled_bitmap("time"); + CATEGORY_ICON[L("Advanced")] = create_scaled_bitmap("wrench"); // ptSLA - CATEGORY_ICON[L("Supports")] = create_scaled_bitmap(nullptr, "support"/*"sla_supports"*/); - CATEGORY_ICON[L("Pad")] = create_scaled_bitmap(nullptr, "pad"); + CATEGORY_ICON[L("Supports")] = create_scaled_bitmap("support"/*"sla_supports"*/); + CATEGORY_ICON[L("Pad")] = create_scaled_bitmap("pad"); } } diff --git a/src/slic3r/GUI/MainFrame.cpp b/src/slic3r/GUI/MainFrame.cpp index 9929cf082a..105c6faa5f 100644 --- a/src/slic3r/GUI/MainFrame.cpp +++ b/src/slic3r/GUI/MainFrame.cpp @@ -68,7 +68,7 @@ DPIFrame(NULL, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, wxDEFAULT_FRAME_S /* Load default preset bitmaps before a tabpanel initialization, * but after filling of an em_unit value */ - wxGetApp().preset_bundle->load_default_preset_bitmaps(this); + wxGetApp().preset_bundle->load_default_preset_bitmaps(); // initialize tabpanel and menubar init_tabpanel(); @@ -345,7 +345,7 @@ void MainFrame::on_dpi_changed(const wxRect &suggested_rect) /* Load default preset bitmaps before a tabpanel initialization, * but after filling of an em_unit value */ - wxGetApp().preset_bundle->load_default_preset_bitmaps(this); + wxGetApp().preset_bundle->load_default_preset_bitmaps(); // update Plater wxGetApp().plater()->msw_rescale(); @@ -733,7 +733,7 @@ void MainFrame::update_menubar() m_changeable_menu_items[miSend] ->SetItemLabel((is_fff ? _(L("S&end G-code")) : _(L("S&end to print"))) + dots + "\tCtrl+Shift+G"); m_changeable_menu_items[miMaterialTab] ->SetItemLabel((is_fff ? _(L("&Filament Settings Tab")) : _(L("Mate&rial Settings Tab"))) + "\tCtrl+3"); - m_changeable_menu_items[miMaterialTab] ->SetBitmap(create_scaled_bitmap(this, is_fff ? "spool": "resin")); + m_changeable_menu_items[miMaterialTab] ->SetBitmap(create_scaled_bitmap(is_fff ? "spool": "resin")); } // To perform the "Quck Slice", "Quick Slice and Save As", "Repeat last Quick Slice" and "Slice to SVG". diff --git a/src/slic3r/GUI/MsgDialog.cpp b/src/slic3r/GUI/MsgDialog.cpp index d1879e4bab..d4a82a03d6 100644 --- a/src/slic3r/GUI/MsgDialog.cpp +++ b/src/slic3r/GUI/MsgDialog.cpp @@ -53,7 +53,7 @@ MsgDialog::MsgDialog(wxWindow *parent, const wxString &title, const wxString &he rightsizer->Add(btn_sizer, 0, wxALIGN_RIGHT); if (! bitmap.IsOk()) { - bitmap = create_scaled_bitmap(this, "PrusaSlicer_192px.png", 192); + bitmap = create_scaled_bitmap("PrusaSlicer_192px.png", this, 192); } logo = new wxStaticBitmap(this, wxID_ANY, wxNullBitmap); @@ -99,7 +99,7 @@ ErrorDialog::ErrorDialog(wxWindow *parent, const wxString &msg) btn_ok->SetFocus(); btn_sizer->Add(btn_ok, 0, wxRIGHT, HORIZ_SPACING); - logo->SetBitmap(create_scaled_bitmap(this, "PrusaSlicer_192px_grayscale.png", 192)); + logo->SetBitmap(create_scaled_bitmap("PrusaSlicer_192px_grayscale.png", this, 192)); SetMaxSize(wxSize(-1, CONTENT_MAX_HEIGHT*wxGetApp().em_unit())); Fit(); diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index c933686739..8afd98d11e 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -169,7 +169,7 @@ ObjectInfo::ObjectInfo(wxWindow *parent) : info_manifold_text->SetFont(wxGetApp().small_font()); info_manifold = new wxStaticText(parent, wxID_ANY, ""); info_manifold->SetFont(wxGetApp().small_font()); - manifold_warning_icon = new wxStaticBitmap(parent, wxID_ANY, create_scaled_bitmap(parent, "exclamation")); + manifold_warning_icon = new wxStaticBitmap(parent, wxID_ANY, create_scaled_bitmap("exclamation")); auto *sizer_manifold = new wxBoxSizer(wxHORIZONTAL); sizer_manifold->Add(info_manifold_text, 0); sizer_manifold->Add(manifold_warning_icon, 0, wxLEFT, 2); @@ -188,7 +188,7 @@ void ObjectInfo::show_sizer(bool show) void ObjectInfo::msw_rescale() { - manifold_warning_icon->SetBitmap(create_scaled_bitmap(nullptr, "exclamation")); + manifold_warning_icon->SetBitmap(create_scaled_bitmap("exclamation")); } enum SlicedInfoIdx @@ -258,7 +258,7 @@ void SlicedInfo::SetTextAndShow(SlicedInfoIdx idx, const wxString& text, const w } PresetComboBox::PresetComboBox(wxWindow *parent, Preset::Type preset_type) : -wxBitmapComboBox(parent, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize(15 * wxGetApp().em_unit(), -1), 0, nullptr, wxCB_READONLY), +PresetBitmapComboBox(parent, wxSize(15 * wxGetApp().em_unit(), -1)), preset_type(preset_type), last_selected(wxNOT_FOUND), m_em_unit(wxGetApp().em_unit()) diff --git a/src/slic3r/GUI/Plater.hpp b/src/slic3r/GUI/Plater.hpp index 82fae44f00..568727abf3 100644 --- a/src/slic3r/GUI/Plater.hpp +++ b/src/slic3r/GUI/Plater.hpp @@ -12,6 +12,7 @@ #include "3DScene.hpp" #include "GLTexture.hpp" +#include "wxExtensions.hpp" class wxButton; class ScalableButton; @@ -49,7 +50,7 @@ using t_optgroups = std::vector >; class Plater; enum class ActionButtonType : int; -class PresetComboBox : public wxBitmapComboBox +class PresetComboBox : public PresetBitmapComboBox { public: PresetComboBox(wxWindow *parent, Preset::Type preset_type); diff --git a/src/slic3r/GUI/Preset.cpp b/src/slic3r/GUI/Preset.cpp index d67abd13bb..98fcf3f421 100644 --- a/src/slic3r/GUI/Preset.cpp +++ b/src/slic3r/GUI/Preset.cpp @@ -873,18 +873,14 @@ bool PresetCollection::delete_preset(const std::string& name) return true; } -void PresetCollection::load_bitmap_default(wxWindow *window, const std::string &file_name) +void PresetCollection::load_bitmap_default(const std::string &file_name) { - // XXX: See note in PresetBundle::load_compatible_bitmaps() - (void)window; - *m_bitmap_main_frame = create_scaled_bitmap(nullptr, file_name); + *m_bitmap_main_frame = create_scaled_bitmap(file_name); } -void PresetCollection::load_bitmap_add(wxWindow *window, const std::string &file_name) +void PresetCollection::load_bitmap_add(const std::string &file_name) { - // XXX: See note in PresetBundle::load_compatible_bitmaps() - (void)window; - *m_bitmap_add = create_scaled_bitmap(nullptr, file_name); + *m_bitmap_add = create_scaled_bitmap(file_name); } const Preset* PresetCollection::get_selected_preset_parent() const diff --git a/src/slic3r/GUI/Preset.hpp b/src/slic3r/GUI/Preset.hpp index c859335200..83970419cc 100644 --- a/src/slic3r/GUI/Preset.hpp +++ b/src/slic3r/GUI/Preset.hpp @@ -313,10 +313,10 @@ public: bool delete_preset(const std::string& name); // Load default bitmap to be placed at the wxBitmapComboBox of a MainFrame. - void load_bitmap_default(wxWindow *window, const std::string &file_name); + void load_bitmap_default(const std::string &file_name); // Load "add new printer" bitmap to be placed at the wxBitmapComboBox of a MainFrame. - void load_bitmap_add(wxWindow *window, const std::string &file_name); + void load_bitmap_add(const std::string &file_name); // Compatible & incompatible marks, to be placed at the wxBitmapComboBox items. void set_bitmap_compatible (const wxBitmap *bmp) { m_bitmap_compatible = bmp; } diff --git a/src/slic3r/GUI/PresetBundle.cpp b/src/slic3r/GUI/PresetBundle.cpp index 6c80a9eab6..7bfbcd2e6f 100644 --- a/src/slic3r/GUI/PresetBundle.cpp +++ b/src/slic3r/GUI/PresetBundle.cpp @@ -480,19 +480,12 @@ void PresetBundle::export_selections(AppConfig &config) config.set("presets", "printer", printers.get_selected_preset_name()); } -void PresetBundle::load_compatible_bitmaps(wxWindow *window) +void PresetBundle::load_compatible_bitmaps() { - // We don't actually pass the window pointer here and instead generate - // a low DPI bitmap, because the wxBitmapComboBox and wxDataViewCtrl don't support - // high DPI bitmaps very well, they compute their dimensions wrong. - // TODO: Update this when fixed in wxWidgets - // See also PresetCollection::load_bitmap_default() and PresetCollection::load_bitmap_add() - - (void)window; - *m_bitmapCompatible = create_scaled_bitmap(nullptr, "flag_green"); - *m_bitmapIncompatible = create_scaled_bitmap(nullptr, "flag_red"); - *m_bitmapLock = create_scaled_bitmap(nullptr, "lock_closed"); - *m_bitmapLockOpen = create_scaled_bitmap(nullptr, "lock_open"); + *m_bitmapCompatible = create_scaled_bitmap("flag_green"); + *m_bitmapIncompatible = create_scaled_bitmap("flag_red"); + *m_bitmapLock = create_scaled_bitmap("lock_closed"); + *m_bitmapLockOpen = create_scaled_bitmap("lock_open"); prints .set_bitmap_compatible(m_bitmapCompatible); filaments .set_bitmap_compatible(m_bitmapCompatible); @@ -1560,7 +1553,7 @@ bool PresetBundle::parse_color(const std::string &scolor, unsigned char *rgb_out return true; } -void PresetBundle::load_default_preset_bitmaps(wxWindow *window) +void PresetBundle::load_default_preset_bitmaps() { // Clear bitmap cache, before load new scaled default preset bitmaps m_bitmapCache->clear(); @@ -1570,13 +1563,13 @@ void PresetBundle::load_default_preset_bitmaps(wxWindow *window) this->sla_materials.clear_bitmap_cache(); this->printers.clear_bitmap_cache(); - this->prints.load_bitmap_default(window, "cog"); - this->sla_prints.load_bitmap_default(window, "cog"); - this->filaments.load_bitmap_default(window, "spool.png"); - this->sla_materials.load_bitmap_default(window, "resin"); - this->printers.load_bitmap_default(window, "printer"); - this->printers.load_bitmap_add(window, "add.png"); - this->load_compatible_bitmaps(window); + this->prints.load_bitmap_default("cog"); + this->sla_prints.load_bitmap_default("cog"); + this->filaments.load_bitmap_default("spool.png"); + this->sla_materials.load_bitmap_default("resin"); + this->printers.load_bitmap_default("printer"); + this->printers.load_bitmap_add("add.png"); + this->load_compatible_bitmaps(); } void PresetBundle::update_plater_filament_ui(unsigned int idx_extruder, GUI::PresetComboBox *ui) @@ -1623,7 +1616,12 @@ void PresetBundle::update_plater_filament_ui(unsigned int idx_extruder, GUI::Pre // To avoid asserts, each added bitmap to wxBitmapCombobox should be the same size, so // set a bitmap height to m_bitmapLock->GetHeight() - const int icon_height = m_bitmapLock->GetHeight();//2 * icon_unit; //16 * scale_f + 0.5f; + // Note, under OSX we should use a ScaledHeight because of Retina scale +#ifdef __APPLE__ + const int icon_height = m_bitmapLock->GetScaledHeight(); +#else + const int icon_height = m_bitmapLock->GetHeight(); +#endif wxString tooltip = ""; diff --git a/src/slic3r/GUI/PresetBundle.hpp b/src/slic3r/GUI/PresetBundle.hpp index 037c47c5ff..bf64e0d34c 100644 --- a/src/slic3r/GUI/PresetBundle.hpp +++ b/src/slic3r/GUI/PresetBundle.hpp @@ -131,7 +131,7 @@ public: static bool parse_color(const std::string &scolor, unsigned char *rgb_out); - void load_default_preset_bitmaps(wxWindow *window); + void load_default_preset_bitmaps(); // Set the is_visible flag for printer vendors, printer models and printer variants // based on the user configuration. @@ -160,7 +160,7 @@ private: // If it is not an external config, then the config will be stored into the user profile directory. void load_config_file_config(const std::string &name_or_path, bool is_external, DynamicPrintConfig &&config); void load_config_file_config_bundle(const std::string &path, const boost::property_tree::ptree &tree); - void load_compatible_bitmaps(wxWindow *window); + void load_compatible_bitmaps(); DynamicPrintConfig full_fff_config() const; DynamicPrintConfig full_sla_config() const; diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index a34a3e0b75..72e2091670 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -114,7 +114,7 @@ void Tab::create_preset_tab() #endif //__WXOSX__ // preset chooser - m_presets_choice = new wxBitmapComboBox(panel, wxID_ANY, "", wxDefaultPosition, wxSize(35 * m_em_unit, -1), 0, 0, wxCB_READONLY); + m_presets_choice = new PresetBitmapComboBox(panel, wxSize(35 * m_em_unit, -1)); auto color = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW); @@ -1690,7 +1690,7 @@ void TabPrinter::build_printhost(ConfigOptionsGroup *optgroup) auto printhost_cafile_browse = [this, optgroup] (wxWindow* parent) { auto btn = new wxButton(parent, wxID_ANY, " " + _(L("Browse"))+" " +dots, wxDefaultPosition, wxDefaultSize, wxBU_LEFT); btn->SetFont(Slic3r::GUI::wxGetApp().normal_font()); - btn->SetBitmap(create_scaled_bitmap(this, "browse")); + btn->SetBitmap(create_scaled_bitmap("browse")); auto sizer = new wxBoxSizer(wxHORIZONTAL); sizer->Add(btn); diff --git a/src/slic3r/GUI/Tab.hpp b/src/slic3r/GUI/Tab.hpp index 4345f196ce..cfa5ae56d6 100644 --- a/src/slic3r/GUI/Tab.hpp +++ b/src/slic3r/GUI/Tab.hpp @@ -120,7 +120,7 @@ protected: Preset::Type m_type; std::string m_name; const wxString m_title; - wxBitmapComboBox* m_presets_choice; + PresetBitmapComboBox* m_presets_choice; ScalableButton* m_btn_save_preset; ScalableButton* m_btn_delete_preset; ScalableButton* m_btn_hide_incompatible_presets; diff --git a/src/slic3r/GUI/UpdateDialogs.cpp b/src/slic3r/GUI/UpdateDialogs.cpp index 00e7725ac1..d5c69be0b7 100644 --- a/src/slic3r/GUI/UpdateDialogs.cpp +++ b/src/slic3r/GUI/UpdateDialogs.cpp @@ -149,7 +149,7 @@ MsgDataIncompatible::MsgDataIncompatible(const std::unordered_mapSetBitmap(create_scaled_bitmap(this, "PrusaSlicer_192px_grayscale.png", 192)); + logo->SetBitmap(create_scaled_bitmap("PrusaSlicer_192px_grayscale.png", this, 192)); auto *text = new wxStaticText(this, wxID_ANY, wxString::Format(_(L( "This version of %s is not compatible with currently installed configuration bundles.\n" diff --git a/src/slic3r/GUI/wxExtensions.cpp b/src/slic3r/GUI/wxExtensions.cpp index a867ca0ecf..e628c705ab 100644 --- a/src/slic3r/GUI/wxExtensions.cpp +++ b/src/slic3r/GUI/wxExtensions.cpp @@ -41,7 +41,7 @@ void msw_rescale_menu(wxMenu* menu) static void run(wxMenuItem* item) { const auto it = msw_menuitem_bitmaps.find(item->GetId()); if (it != msw_menuitem_bitmaps.end()) { - const wxBitmap& item_icon = create_scaled_bitmap(nullptr, it->second); + const wxBitmap& item_icon = create_scaled_bitmap(it->second); if (item_icon.IsOk()) item->SetBitmap(item_icon); } @@ -108,7 +108,7 @@ wxMenuItem* append_menu_item(wxMenu* menu, int id, const wxString& string, const if (id == wxID_ANY) id = wxNewId(); - const wxBitmap& bmp = !icon.empty() ? create_scaled_bitmap(parent, icon) : wxNullBitmap; // FIXME: pass window ptr + const wxBitmap& bmp = !icon.empty() ? create_scaled_bitmap(icon) : wxNullBitmap; // FIXME: pass window ptr //#ifdef __WXMSW__ #ifndef __WXGTK__ if (bmp.IsOk()) @@ -126,7 +126,7 @@ wxMenuItem* append_submenu(wxMenu* menu, wxMenu* sub_menu, int id, const wxStrin wxMenuItem* item = new wxMenuItem(menu, id, string, description); if (!icon.empty()) { - item->SetBitmap(create_scaled_bitmap(parent, icon)); // FIXME: pass window ptr + item->SetBitmap(create_scaled_bitmap(icon)); // FIXME: pass window ptr //#ifdef __WXMSW__ #ifndef __WXGTK__ msw_menuitem_bitmaps[id] = icon; @@ -308,6 +308,94 @@ void wxCheckListBoxComboPopup::OnListBoxSelection(wxCommandEvent& evt) } +namespace Slic3r { +namespace GUI { + +// *** PresetBitmapComboBox *** + +/* For PresetBitmapComboBox we use bitmaps that are created from images that are already scaled appropriately for Retina + * (Contrary to the intuition, the `scale` argument for Bitmap's constructor doesn't mean + * "please scale this to such and such" but rather + * "the wxImage is already sized for backing scale such and such". ) + * Unfortunately, the constructor changes the size of wxBitmap too. + * Thus We need to use unscaled size value for bitmaps that we use + * to avoid scaled size of control items. + * For this purpose control drawing methods and + * control size calculation methods (virtual) are overridden. + **/ + +PresetBitmapComboBox::PresetBitmapComboBox(wxWindow* parent, const wxSize& size) : + wxBitmapComboBox(parent, wxID_ANY, wxEmptyString, wxDefaultPosition, size, 0, nullptr, wxCB_READONLY) +{} + +#ifdef __APPLE__ +bool PresetBitmapComboBox::OnAddBitmap(const wxBitmap& bitmap) +{ + if (bitmap.IsOk()) + { + // we should use scaled! size values of bitmap + int width = (int)bitmap.GetScaledWidth(); + int height = (int)bitmap.GetScaledHeight(); + + if (m_usedImgSize.x < 0) + { + // If size not yet determined, get it from this image. + m_usedImgSize.x = width; + m_usedImgSize.y = height; + + // Adjust control size to vertically fit the bitmap + wxWindow* ctrl = GetControl(); + ctrl->InvalidateBestSize(); + wxSize newSz = ctrl->GetBestSize(); + wxSize sz = ctrl->GetSize(); + if (newSz.y > sz.y) + ctrl->SetSize(sz.x, newSz.y); + else + DetermineIndent(); + } + + wxCHECK_MSG(width == m_usedImgSize.x && height == m_usedImgSize.y, + false, + "you can only add images of same size"); + + return true; + } + + return false; +} + +void PresetBitmapComboBox::OnDrawItem(wxDC& dc, + const wxRect& rect, + int item, + int flags) const +{ + const wxBitmap& bmp = *(wxBitmap*)m_bitmaps[item]; + if (bmp.IsOk()) + { + // we should use scaled! size values of bitmap + wxCoord w = bmp.GetScaledWidth(); + wxCoord h = bmp.GetScaledHeight(); + + const int imgSpacingLeft = 4; + + // Draw the image centered + dc.DrawBitmap(bmp, + rect.x + (m_usedImgSize.x - w) / 2 + imgSpacingLeft, + rect.y + (rect.height - h) / 2, + true); + } + + wxString text = GetString(item); + if (!text.empty()) + dc.DrawText(text, + rect.x + m_imgAreaWidth + 1, + rect.y + (rect.height - dc.GetCharHeight()) / 2); +} +#endif +} +} + + // *** wxDataViewTreeCtrlComboPopup *** const unsigned int wxDataViewTreeCtrlComboPopup::DefaultWidth = 270; @@ -407,32 +495,16 @@ int em_unit(wxWindow* win) return Slic3r::GUI::wxGetApp().em_unit(); } -float get_svg_scale_factor(wxWindow *win) -{ -#ifdef __APPLE__ - // Note: win->GetContentScaleFactor() is not used anymore here because it tends to - // return bogus results quite often (such as 1.0 on Retina or even 0.0). - // We're using the max scaling factor across all screens because it's very likely to be good enough. - - static float max_scaling_factor = NAN; - if (std::isnan(max_scaling_factor)) { - max_scaling_factor = Slic3r::GUI::mac_max_scaling_factor(); - } - return win != nullptr ? max_scaling_factor : 1.0f; -#else - (void)(win); - return 1.0f; -#endif -} - -// If an icon has horizontal orientation (width > height) call this function with is_horizontal = true -wxBitmap create_scaled_bitmap(wxWindow *win, const std::string& bmp_name_in, - const int px_cnt/* = 16*/, const bool grayscale/* = false*/) +// win is used to get a correct em_unit value +// It's important for bitmaps of dialogs. +// if win == nullptr, em_unit value of MainFrame will be used +wxBitmap create_scaled_bitmap( const std::string& bmp_name_in, + wxWindow *win/* = nullptr*/, + const int px_cnt/* = 16*/, + const bool grayscale/* = false*/) { static Slic3r::GUI::BitmapCache cache; - const float scale_factor = get_svg_scale_factor(win); - unsigned int width = 0; unsigned int height = (unsigned int)(em_unit(win) * px_cnt * 0.1f + 0.5f); @@ -440,7 +512,7 @@ wxBitmap create_scaled_bitmap(wxWindow *win, const std::string& bmp_name_in, boost::replace_last(bmp_name, ".png", ""); // Try loading an SVG first, then PNG if SVG is not found: - wxBitmap *bmp = cache.load_svg(bmp_name, width, height, scale_factor, grayscale, Slic3r::GUI::wxGetApp().dark_mode()); + wxBitmap *bmp = cache.load_svg(bmp_name, width, height, grayscale, Slic3r::GUI::wxGetApp().dark_mode()); if (bmp == nullptr) { bmp = cache.load_png(bmp_name, width, height, grayscale); } @@ -482,7 +554,8 @@ std::vector get_extruder_color_icons(bool thin_icon/* = false*/) if (bitmap == nullptr) { // Paint the color icon. Slic3r::PresetBundle::parse_color(color, rgb); - bitmap = m_bitmap_cache->insert(bitmap_key, m_bitmap_cache->mksolid(icon_width, icon_height, rgb)); + // there is no neede to scale created solid bitmap + bitmap = m_bitmap_cache->insert(bitmap_key, m_bitmap_cache->mksolid(icon_width, icon_height, rgb, true)); } bmps.emplace_back(bitmap); } @@ -568,8 +641,7 @@ void ObjectDataViewModelNode::init_container() ObjectDataViewModelNode::ObjectDataViewModelNode(ObjectDataViewModelNode* parent, const ItemType type) : m_parent(parent), m_type(type), - m_extruder(wxEmptyString), - m_ctrl(parent->m_ctrl) + m_extruder(wxEmptyString) { if (type == itSettings) m_name = "Settings to modified"; @@ -584,7 +656,7 @@ ObjectDataViewModelNode::ObjectDataViewModelNode(ObjectDataViewModelNode* parent } else if (type == itLayerRoot) { - m_bmp = create_scaled_bitmap(m_ctrl, LAYER_ROOT_ICON); // FIXME: pass window ptr + m_bmp = create_scaled_bitmap(LAYER_ROOT_ICON); // FIXME: pass window ptr m_name = _(L("Layers")); } @@ -600,8 +672,7 @@ ObjectDataViewModelNode::ObjectDataViewModelNode(ObjectDataViewModelNode* parent m_type(itLayer), m_idx(idx), m_layer_range(layer_range), - m_extruder(extruder), - m_ctrl(parent->m_ctrl) + m_extruder(extruder) { const int children_cnt = parent->GetChildCount(); if (idx < 0) @@ -614,7 +685,7 @@ ObjectDataViewModelNode::ObjectDataViewModelNode(ObjectDataViewModelNode* parent } const std::string label_range = (boost::format(" %.2f-%.2f ") % layer_range.first % layer_range.second).str(); m_name = _(L("Range")) + label_range + "(" + _(L("mm")) + ")"; - m_bmp = create_scaled_bitmap(m_ctrl, LAYER_ICON); // FIXME: pass window ptr + m_bmp = create_scaled_bitmap(LAYER_ICON); // FIXME: pass window ptr set_action_and_extruder_icons(); init_container(); @@ -633,7 +704,7 @@ void ObjectDataViewModelNode::set_action_and_extruder_icons() { m_action_icon_name = m_type & itObject ? "advanced_plus" : m_type & (itVolume | itLayer) ? "cog" : /*m_type & itInstance*/ "set_separate_obj"; - m_action_icon = create_scaled_bitmap(m_ctrl, m_action_icon_name); // FIXME: pass window ptr + m_action_icon = create_scaled_bitmap(m_action_icon_name); // FIXME: pass window ptr if (m_type & itInstance) return; // don't set colored bitmap for Instance @@ -648,7 +719,7 @@ void ObjectDataViewModelNode::set_printable_icon(PrintIndicator printable) { m_printable = printable; m_printable_icon = m_printable == piUndef ? m_empty_bmp : - create_scaled_bitmap(m_ctrl, m_printable == piPrintable ? "eye_open.png" : "eye_closed.png"); + create_scaled_bitmap(m_printable == piPrintable ? "eye_open.png" : "eye_closed.png"); } void ObjectDataViewModelNode::update_settings_digest_bitmaps() @@ -666,7 +737,7 @@ void ObjectDataViewModelNode::update_settings_digest_bitmaps() for (auto& cat : m_opt_categories) bmps.emplace_back( categories_icon.find(cat) == categories_icon.end() ? wxNullBitmap : categories_icon.at(cat)); - bmp = m_bitmap_cache->insert(scaled_bitmap_name, bmps, get_svg_scale_factor(m_ctrl)); + bmp = m_bitmap_cache->insert(scaled_bitmap_name, bmps); } m_bmp = *bmp; @@ -693,10 +764,10 @@ bool ObjectDataViewModelNode::update_settings_digest(const std::vectorm_bmp = *m_warning_bmp; @@ -1985,9 +2056,9 @@ void ObjectDataViewModel::Rescale() node->m_bmp = GetVolumeIcon(node->m_volume_type, node->m_bmp.GetWidth() != node->m_bmp.GetHeight()); break; case itLayerRoot: - node->m_bmp = create_scaled_bitmap(m_ctrl, LAYER_ROOT_ICON); + node->m_bmp = create_scaled_bitmap(LAYER_ROOT_ICON); case itLayer: - node->m_bmp = create_scaled_bitmap(m_ctrl, LAYER_ICON); + node->m_bmp = create_scaled_bitmap(LAYER_ICON); break; default: break; } @@ -2089,9 +2160,11 @@ bool BitmapTextRenderer::Render(wxRect rect, wxDC *dc, int state) const wxBitmap& icon = m_value.GetBitmap(); if (icon.IsOk()) { - float sf = (float)1.0 / get_svg_scale_factor(m_parent); - wxSize icon_sz = icon.GetSize() * sf; - +#ifdef __APPLE__ + wxSize icon_sz = icon.GetScaledSize(); +#else + wxSize icon_sz = icon.GetSize(); +#endif dc->DrawBitmap(icon, rect.x, rect.y + (rect.height - icon_sz.y) / 2); xoffset = icon_sz.x + 4; } @@ -2470,13 +2543,40 @@ ScalableBitmap::ScalableBitmap( wxWindow *parent, m_parent(parent), m_icon_name(icon_name), m_px_cnt(px_cnt) { - m_bmp = create_scaled_bitmap(parent, icon_name, px_cnt); + m_bmp = create_scaled_bitmap(icon_name, parent, px_cnt); +} + +wxSize ScalableBitmap::GetBmpSize() const +{ +#ifdef __APPLE__ + return m_bmp.GetScaledSize(); +#else + return m_bmp.GetSize(); +#endif +} + +int ScalableBitmap::GetBmpWidth() const +{ +#ifdef __APPLE__ + return m_bmp.GetScaledWidth(); +#else + return m_bmp.GetWidth(); +#endif +} + +int ScalableBitmap::GetBmpHeight() const +{ +#ifdef __APPLE__ + return m_bmp.GetScaledHeight(); +#else + return m_bmp.GetHeight(); +#endif } void ScalableBitmap::msw_rescale() { - m_bmp = create_scaled_bitmap(m_parent, m_icon_name, m_px_cnt); + m_bmp = create_scaled_bitmap(m_icon_name, m_parent, m_px_cnt); } // ---------------------------------------------------------------------------- @@ -2499,7 +2599,7 @@ ScalableButton::ScalableButton( wxWindow * parent, SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW)); #endif // __WXMSW__ - SetBitmap(create_scaled_bitmap(parent, icon_name)); + SetBitmap(create_scaled_bitmap(icon_name, parent)); if (size != wxDefaultSize) { @@ -2542,15 +2642,18 @@ void ScalableButton::SetBitmapDisabled_(const ScalableBitmap& bmp) int ScalableButton::GetBitmapHeight() { - const float scale_factor = get_svg_scale_factor(m_parent); - return int((float)GetBitmap().GetHeight() / scale_factor); +#ifdef __APPLE__ + return GetBitmap().GetScaledHeight(); +#else + return GetBitmap().GetHeight(); +#endif } void ScalableButton::msw_rescale() { - SetBitmap(create_scaled_bitmap(m_parent, m_current_icon_name, m_px_cnt)); + SetBitmap(create_scaled_bitmap(m_current_icon_name, m_parent, m_px_cnt)); if (!m_disabled_icon_name.empty()) - SetBitmapDisabled(create_scaled_bitmap(m_parent, m_disabled_icon_name, m_px_cnt)); + SetBitmapDisabled(create_scaled_bitmap(m_disabled_icon_name, m_parent, m_px_cnt)); if (m_width > 0 || m_height>0) { diff --git a/src/slic3r/GUI/wxExtensions.hpp b/src/slic3r/GUI/wxExtensions.hpp index 8cd144dc52..09afe3c0fd 100644 --- a/src/slic3r/GUI/wxExtensions.hpp +++ b/src/slic3r/GUI/wxExtensions.hpp @@ -53,9 +53,8 @@ class wxBitmapComboBox; void edit_tooltip(wxString& tooltip); void msw_buttons_rescale(wxDialog* dlg, const int em_unit, const std::vector& btn_ids); int em_unit(wxWindow* win); -float get_svg_scale_factor(wxWindow* win); -wxBitmap create_scaled_bitmap(wxWindow *win, const std::string& bmp_name, +wxBitmap create_scaled_bitmap(const std::string& bmp_name, wxWindow *win = nullptr, const int px_cnt = 16, const bool grayscale = false); std::vector get_extruder_color_icons(bool thin_icon = false); @@ -102,6 +101,37 @@ public: void OnListBoxSelection(wxCommandEvent& evt); }; +namespace Slic3r { +namespace GUI { +// *** PresetBitmapComboBox *** + +// BitmapComboBox used to presets list on Sidebar and Tabs +class PresetBitmapComboBox: public wxBitmapComboBox +{ +public: + PresetBitmapComboBox(wxWindow* parent, const wxSize& size = wxDefaultSize); + ~PresetBitmapComboBox() {} + +#ifdef __APPLE__ +protected: + /* For PresetBitmapComboBox we use bitmaps that are created from images that are already scaled appropriately for Retina + * (Contrary to the intuition, the `scale` argument for Bitmap's constructor doesn't mean + * "please scale this to such and such" but rather + * "the wxImage is already sized for backing scale such and such". ) + * Unfortunately, the constructor changes the size of wxBitmap too. + * Thus We need to use unscaled size value for bitmaps that we use + * to avoid scaled size of control items. + * For this purpose control drawing methods and + * control size calculation methods (virtual) are overridden. + **/ + virtual bool OnAddBitmap(const wxBitmap& bitmap) override; + virtual void OnDrawItem(wxDC& dc, const wxRect& rect, int item, int flags) const override; +#endif +}; + +} +} + // *** wxDataViewTreeCtrlComboBox *** @@ -228,18 +258,13 @@ class ObjectDataViewModelNode std::string m_action_icon_name = ""; Slic3r::ModelVolumeType m_volume_type; - // pointer to control (is needed to create scaled bitmaps) - wxDataViewCtrl* m_ctrl{ nullptr }; - public: ObjectDataViewModelNode(const wxString& name, - const wxString& extruder, - wxDataViewCtrl* ctrl): + const wxString& extruder): m_parent(NULL), m_name(name), m_type(itObject), - m_extruder(extruder), - m_ctrl(ctrl) + m_extruder(extruder) { set_action_and_extruder_icons(); init_container(); @@ -254,8 +279,7 @@ public: m_name (sub_obj_name), m_type (itVolume), m_idx (idx), - m_extruder (extruder), - m_ctrl (parent->m_ctrl) + m_extruder (extruder) { m_bmp = bmp; set_action_and_extruder_icons(); @@ -734,6 +758,10 @@ public: ~ScalableBitmap() {} + wxSize GetBmpSize() const; + int GetBmpWidth() const; + int GetBmpHeight() const; + void msw_rescale(); const wxBitmap& bmp() const { return m_bmp; } From be92e109857b68348b3682e53f7a16ad0a099f75 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Fri, 31 Jan 2020 21:03:17 +0100 Subject: [PATCH 209/336] Added missed include for OSX --- src/slic3r/GUI/wxExtensions.hpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/slic3r/GUI/wxExtensions.hpp b/src/slic3r/GUI/wxExtensions.hpp index 09afe3c0fd..fa04ac9c71 100644 --- a/src/slic3r/GUI/wxExtensions.hpp +++ b/src/slic3r/GUI/wxExtensions.hpp @@ -9,6 +9,7 @@ #include #include #include +#include #include #include From 438f4fd1aa9afb1c92b24a839676341eb9099c0a Mon Sep 17 00:00:00 2001 From: YuSanka Date: Sun, 2 Feb 2020 19:40:00 +0100 Subject: [PATCH 210/336] Fixed build under OSX --- src/slic3r/GUI/wxExtensions.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/slic3r/GUI/wxExtensions.cpp b/src/slic3r/GUI/wxExtensions.cpp index e628c705ab..a461f16fac 100644 --- a/src/slic3r/GUI/wxExtensions.cpp +++ b/src/slic3r/GUI/wxExtensions.cpp @@ -66,7 +66,7 @@ void enable_menu_item(wxUpdateUIEvent& evt, std::function const cb_condi const auto it = msw_menuitem_bitmaps.find(item->GetId()); if (it != msw_menuitem_bitmaps.end()) { - const wxBitmap& item_icon = create_scaled_bitmap(win, it->second, 16, !enable); + const wxBitmap& item_icon = create_scaled_bitmap(it->second, win, 16, !enable); if (item_icon.IsOk()) item->SetBitmap(item_icon); } From eb6e0c06e4217748b0a53f4ef84d575301c99dd9 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Sun, 2 Feb 2020 21:20:48 +0100 Subject: [PATCH 211/336] Mark a tick as a conflict, if it has a ToolChange to the same extruder --- src/slic3r/GUI/DoubleSlider.cpp | 24 +++++++++++++++++++++--- src/slic3r/GUI/DoubleSlider.hpp | 3 ++- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/src/slic3r/GUI/DoubleSlider.cpp b/src/slic3r/GUI/DoubleSlider.cpp index 4d29e13a7b..4a5bea9a10 100644 --- a/src/slic3r/GUI/DoubleSlider.cpp +++ b/src/slic3r/GUI/DoubleSlider.cpp @@ -935,9 +935,12 @@ wxString Control::get_tooltip(IconFocus icon_focus) if (conflict == ctModeConflict) tooltip += _(L("G-code of this tick has a conflict with slider(print) mode.\n" "Any its editing will cause a changes of DoubleSlider data.")); - else if (conflict == ctMeaningless) + else if (conflict == ctMeaninglessColorChange) tooltip += _(L("There is a color change for extruder that wouldn't be used till the end of printing.\n" "This code wouldn't be processed during GCode generation.")); + else if (conflict == ctMeaninglessToolChange) + tooltip += _(L("There is a extruder change to the same extruder.\n" + "This code wouldn't be processed during GCode generation.")); else if (conflict == ctRedundant) tooltip += _(L("There is a color change for extruder that has not been used before.\n" "Check your choice to avoid redundant color changes.")); @@ -1835,12 +1838,12 @@ ConflictType TickCodeInfo::is_conflict_tick(const TickCode& tick, t_mode out_mod // check ColorChange tick if (tick.gcode == ColorChangeCode) { - // We should mark a tick as a "Meaningless", + // We should mark a tick as a "MeaninglessColorChange", // if it has a ColorChange for unused extruder from current print to end of the print std::set used_extruders_for_tick = get_used_extruders_for_tick(tick.tick, only_extruder, print_z); if (used_extruders_for_tick.find(tick.extruder) == used_extruders_for_tick.end()) - return ctMeaningless; + return ctMeaninglessColorChange; // We should mark a tick as a "Redundant", // if it has a ColorChange for extruder that has not been used before @@ -1860,6 +1863,21 @@ ConflictType TickCodeInfo::is_conflict_tick(const TickCode& tick, t_mode out_mod } } + // check ToolChange tick + if (mode == t_mode::MultiAsSingle && tick.gcode == ToolChangeCode) + { + // We should mark a tick as a "MeaninglessToolChange", + // if it has a ToolChange to the same extruder + + auto it = ticks.find(tick); + if (it == ticks.begin()) + return tick.extruder == std::max(only_extruder, 1) ? ctMeaninglessToolChange : ctNone; + + --it; + if (it->gcode == ToolChangeCode && tick.extruder == it->extruder) + return ctMeaninglessToolChange; + } + return ctNone; } diff --git a/src/slic3r/GUI/DoubleSlider.hpp b/src/slic3r/GUI/DoubleSlider.hpp index 064ed04640..f14af621f9 100644 --- a/src/slic3r/GUI/DoubleSlider.hpp +++ b/src/slic3r/GUI/DoubleSlider.hpp @@ -43,7 +43,8 @@ enum ConflictType { ctNone, ctModeConflict, - ctMeaningless, + ctMeaninglessColorChange, + ctMeaninglessToolChange, ctRedundant }; From 3f7ebee39661676f70f8b58197234c307f82ed5f Mon Sep 17 00:00:00 2001 From: YuSanka Date: Sun, 2 Feb 2020 22:22:40 +0100 Subject: [PATCH 212/336] ObjectDataViewModel is extracted from wxExtentions to the separated file + parse_color function is moved to BitmapCache from PresetBundle --- src/slic3r/CMakeLists.txt | 2 + src/slic3r/GUI/3DScene.cpp | 6 +- src/slic3r/GUI/BitmapCache.cpp | 27 + src/slic3r/GUI/BitmapCache.hpp | 7 +- src/slic3r/GUI/GUI_ObjectList.hpp | 1 + src/slic3r/GUI/ObjectDataViewModel.cpp | 1764 +++++++++++++++++++++++ src/slic3r/GUI/ObjectDataViewModel.hpp | 516 +++++++ src/slic3r/GUI/PresetBundle.cpp | 30 +- src/slic3r/GUI/PresetBundle.hpp | 2 - src/slic3r/GUI/WipeTowerDialog.cpp | 4 +- src/slic3r/GUI/wxExtensions.cpp | 1766 +----------------------- src/slic3r/GUI/wxExtensions.hpp | 598 -------- 12 files changed, 2325 insertions(+), 2398 deletions(-) create mode 100644 src/slic3r/GUI/ObjectDataViewModel.cpp create mode 100644 src/slic3r/GUI/ObjectDataViewModel.hpp diff --git a/src/slic3r/CMakeLists.txt b/src/slic3r/CMakeLists.txt index 4e8edf7aa2..918a2c0512 100644 --- a/src/slic3r/CMakeLists.txt +++ b/src/slic3r/CMakeLists.txt @@ -147,6 +147,8 @@ set(SLIC3R_GUI_SOURCES GUI/Mouse3DController.hpp GUI/DoubleSlider.cpp GUI/DoubleSlider.hpp + GUI/ObjectDataViewModel.cpp + GUI/ObjectDataViewModel.hpp Utils/Http.cpp Utils/Http.hpp Utils/FixModelByWin10.cpp diff --git a/src/slic3r/GUI/3DScene.cpp b/src/slic3r/GUI/3DScene.cpp index f6b1719dbf..9f36ab5371 100644 --- a/src/slic3r/GUI/3DScene.cpp +++ b/src/slic3r/GUI/3DScene.cpp @@ -10,7 +10,7 @@ #include "libslic3r/SLAPrint.hpp" #include "libslic3r/Slicing.hpp" #include "libslic3r/GCode/Analyzer.hpp" -#include "slic3r/GUI/PresetBundle.hpp" +#include "slic3r/GUI/BitmapCache.hpp" #include "libslic3r/Format/STL.hpp" #include "libslic3r/Utils.hpp" @@ -792,14 +792,14 @@ void GLVolumeCollection::update_colors_by_extruder(const DynamicPrintConfig* con for (unsigned int i = 0; i < colors_count; ++i) { const std::string& txt_color = config->opt_string("extruder_colour", i); - if (PresetBundle::parse_color(txt_color, rgb)) + if (Slic3r::GUI::BitmapCache::parse_color(txt_color, rgb)) { colors[i].set(txt_color, rgb); } else { const std::string& txt_color = config->opt_string("filament_colour", i); - if (PresetBundle::parse_color(txt_color, rgb)) + if (Slic3r::GUI::BitmapCache::parse_color(txt_color, rgb)) colors[i].set(txt_color, rgb); } } diff --git a/src/slic3r/GUI/BitmapCache.cpp b/src/slic3r/GUI/BitmapCache.cpp index 9668278bb3..8627ef4cb6 100644 --- a/src/slic3r/GUI/BitmapCache.cpp +++ b/src/slic3r/GUI/BitmapCache.cpp @@ -2,6 +2,8 @@ #include "libslic3r/Utils.hpp" #include "../Utils/MacDarkMode.hpp" +#include "GUI.hpp" + #include #if ! defined(WIN32) && ! defined(__APPLE__) @@ -349,5 +351,30 @@ wxBitmap BitmapCache::mksolid(size_t width, size_t height, unsigned char r, unsi return wxImage_to_wxBitmap_with_alpha(std::move(image), scale); } + +static inline int hex_digit_to_int(const char c) +{ + return + (c >= '0' && c <= '9') ? int(c - '0') : + (c >= 'A' && c <= 'F') ? int(c - 'A') + 10 : + (c >= 'a' && c <= 'f') ? int(c - 'a') + 10 : -1; +} + +bool BitmapCache::parse_color(const std::string& scolor, unsigned char* rgb_out) +{ + rgb_out[0] = rgb_out[1] = rgb_out[2] = 0; + if (scolor.size() != 7 || scolor.front() != '#') + return false; + const char* c = scolor.data() + 1; + for (size_t i = 0; i < 3; ++i) { + int digit1 = hex_digit_to_int(*c++); + int digit2 = hex_digit_to_int(*c++); + if (digit1 == -1 || digit2 == -1) + return false; + rgb_out[i] = (unsigned char)(digit1 * 16 + digit2); + } + return true; +} + } // namespace GUI } // namespace Slic3r diff --git a/src/slic3r/GUI/BitmapCache.hpp b/src/slic3r/GUI/BitmapCache.hpp index 73e4a31dc3..255cf54958 100644 --- a/src/slic3r/GUI/BitmapCache.hpp +++ b/src/slic3r/GUI/BitmapCache.hpp @@ -6,11 +6,6 @@ #include #endif -#include "libslic3r/libslic3r.h" -#include "libslic3r/Config.hpp" - -#include "GUI.hpp" - namespace Slic3r { namespace GUI { class BitmapCache @@ -41,6 +36,8 @@ public: /*static */wxBitmap mksolid(size_t width, size_t height, const unsigned char rgb[3], bool suppress_scaling = false) { return mksolid(width, height, rgb[0], rgb[1], rgb[2], wxALPHA_OPAQUE); } /*static */wxBitmap mkclear(size_t width, size_t height) { return mksolid(width, height, 0, 0, 0, wxALPHA_TRANSPARENT); } + static bool parse_color(const std::string& scolor, unsigned char* rgb_out); + private: std::map m_map; double m_gs = 0.2; // value, used for image.ConvertToGreyscale(m_gs, m_gs, m_gs) diff --git a/src/slic3r/GUI/GUI_ObjectList.hpp b/src/slic3r/GUI/GUI_ObjectList.hpp index dc0953d3bd..fc02c706ee 100644 --- a/src/slic3r/GUI/GUI_ObjectList.hpp +++ b/src/slic3r/GUI/GUI_ObjectList.hpp @@ -10,6 +10,7 @@ #include "Event.hpp" #include "wxExtensions.hpp" +#include "ObjectDataViewModel.hpp" class wxBoxSizer; class wxBitmapComboBox; diff --git a/src/slic3r/GUI/ObjectDataViewModel.cpp b/src/slic3r/GUI/ObjectDataViewModel.cpp new file mode 100644 index 0000000000..b49b27e332 --- /dev/null +++ b/src/slic3r/GUI/ObjectDataViewModel.cpp @@ -0,0 +1,1764 @@ +#include "ObjectDataViewModel.hpp" +#include "wxExtensions.hpp" +#include "BitmapCache.hpp" +#include "GUI_App.hpp" +#include "GUI_ObjectList.hpp" +#include "I18N.hpp" + +#include +#include + + +namespace Slic3r { + +namespace GUI { + +wxDEFINE_EVENT(wxCUSTOMEVT_LAST_VOLUME_IS_DELETED, wxCommandEvent); + +static wxBitmap get_extruder_color_icon(size_t extruder_idx, bool thin_icon = false) +{ + // Create the bitmap with color bars. + std::vector bmps = get_extruder_color_icons(thin_icon); + if (bmps.empty()) + return wxNullBitmap; + + return *bmps[extruder_idx >= bmps.size() ? 0 : extruder_idx]; +} + +BitmapCache* m_bitmap_cache = nullptr; + +// ***************************************************************************** +// ---------------------------------------------------------------------------- +// ObjectDataViewModelNode +// ---------------------------------------------------------------------------- + +void ObjectDataViewModelNode::init_container() +{ +#ifdef __WXGTK__ + // it's necessary on GTK because of control have to know if this item will be container + // in another case you couldn't to add subitem for this item + // it will be produce "segmentation fault" + m_container = true; +#endif //__WXGTK__ +} + +#define LAYER_ROOT_ICON "edit_layers_all" +#define LAYER_ICON "edit_layers_some" + +ObjectDataViewModelNode::ObjectDataViewModelNode(ObjectDataViewModelNode* parent, const ItemType type) : + m_parent(parent), + m_type(type), + m_extruder(wxEmptyString) +{ + if (type == itSettings) + m_name = "Settings to modified"; + else if (type == itInstanceRoot) + m_name = _(L("Instances")); + else if (type == itInstance) + { + m_idx = parent->GetChildCount(); + m_name = wxString::Format(_(L("Instance %d")), m_idx + 1); + + set_action_and_extruder_icons(); + } + else if (type == itLayerRoot) + { + m_bmp = create_scaled_bitmap(LAYER_ROOT_ICON); // FIXME: pass window ptr + m_name = _(L("Layers")); + } + + if (type & (itInstanceRoot | itLayerRoot)) + init_container(); +} + +ObjectDataViewModelNode::ObjectDataViewModelNode(ObjectDataViewModelNode* parent, + const t_layer_height_range& layer_range, + const int idx /*= -1 */, + const wxString& extruder) : + m_parent(parent), + m_type(itLayer), + m_idx(idx), + m_layer_range(layer_range), + m_extruder(extruder) +{ + const int children_cnt = parent->GetChildCount(); + if (idx < 0) + m_idx = children_cnt; + else + { + // update indexes for another Laeyr Nodes + for (int i = m_idx; i < children_cnt; i++) + parent->GetNthChild(i)->SetIdx(i + 1); + } + const std::string label_range = (boost::format(" %.2f-%.2f ") % layer_range.first % layer_range.second).str(); + m_name = _(L("Range")) + label_range + "(" + _(L("mm")) + ")"; + m_bmp = create_scaled_bitmap(LAYER_ICON); // FIXME: pass window ptr + + set_action_and_extruder_icons(); + init_container(); +} + +#ifndef NDEBUG +bool ObjectDataViewModelNode::valid() +{ + // Verify that the object was not deleted yet. + assert(m_idx >= -1); + return m_idx >= -1; +} +#endif /* NDEBUG */ + +void ObjectDataViewModelNode::set_action_and_extruder_icons() +{ + m_action_icon_name = m_type & itObject ? "advanced_plus" : + m_type & (itVolume | itLayer) ? "cog" : /*m_type & itInstance*/ "set_separate_obj"; + m_action_icon = create_scaled_bitmap(m_action_icon_name); // FIXME: pass window ptr + + if (m_type & itInstance) + return; // don't set colored bitmap for Instance + + // set extruder bitmap + int extruder_idx = atoi(m_extruder.c_str()); + if (extruder_idx > 0) --extruder_idx; + m_extruder_bmp = get_extruder_color_icon(extruder_idx); +} + +void ObjectDataViewModelNode::set_printable_icon(PrintIndicator printable) +{ + m_printable = printable; + m_printable_icon = m_printable == piUndef ? m_empty_bmp : + create_scaled_bitmap(m_printable == piPrintable ? "eye_open.png" : "eye_closed.png"); +} + +void ObjectDataViewModelNode::update_settings_digest_bitmaps() +{ + m_bmp = m_empty_bmp; + + std::map& categories_icon = Slic3r::GUI::wxGetApp().obj_list()->CATEGORY_ICON; + + std::string scaled_bitmap_name = m_name.ToUTF8().data(); + scaled_bitmap_name += "-em" + std::to_string(Slic3r::GUI::wxGetApp().em_unit()); + + wxBitmap *bmp = m_bitmap_cache->find(scaled_bitmap_name); + if (bmp == nullptr) { + std::vector bmps; + for (auto& cat : m_opt_categories) + bmps.emplace_back( categories_icon.find(cat) == categories_icon.end() ? + wxNullBitmap : categories_icon.at(cat)); + bmp = m_bitmap_cache->insert(scaled_bitmap_name, bmps); + } + + m_bmp = *bmp; +} + +bool ObjectDataViewModelNode::update_settings_digest(const std::vector& categories) +{ + if (m_type != itSettings || m_opt_categories == categories) + return false; + + m_opt_categories = categories; + m_name = wxEmptyString; + + for (auto& cat : m_opt_categories) + m_name += _(cat) + "; "; + if (!m_name.IsEmpty()) + m_name.erase(m_name.Length()-2, 2); // Delete last "; " + + update_settings_digest_bitmaps(); + + return true; +} + +void ObjectDataViewModelNode::msw_rescale() +{ + if (!m_action_icon_name.empty()) + m_action_icon = create_scaled_bitmap(m_action_icon_name); + + if (m_printable != piUndef) + m_printable_icon = create_scaled_bitmap(m_printable == piPrintable ? "eye_open.png" : "eye_closed.png"); + + if (!m_opt_categories.empty()) + update_settings_digest_bitmaps(); +} + +bool ObjectDataViewModelNode::SetValue(const wxVariant& variant, unsigned col) +{ + switch (col) + { + case colPrint: + m_printable_icon << variant; + return true; + case colName: { + DataViewBitmapText data; + data << variant; + m_bmp = data.GetBitmap(); + m_name = data.GetText(); + return true; } + case colExtruder: { + DataViewBitmapText data; + data << variant; + m_extruder_bmp = data.GetBitmap(); + m_extruder = data.GetText() == "0" ? _(L("default")) : data.GetText(); + return true; } + case colEditing: + m_action_icon << variant; + return true; + default: + printf("MyObjectTreeModel::SetValue: wrong column"); + } + return false; +} + +void ObjectDataViewModelNode::SetIdx(const int& idx) +{ + m_idx = idx; + // update name if this node is instance + if (m_type == itInstance) + m_name = wxString::Format(_(L("Instance %d")), m_idx + 1); +} + +// ***************************************************************************** +// ---------------------------------------------------------------------------- +// ObjectDataViewModel +// ---------------------------------------------------------------------------- + +static int get_root_idx(ObjectDataViewModelNode *parent_node, const ItemType root_type) +{ + // because of istance_root and layers_root are at the end of the list, so + // start locking from the end + for (int root_idx = parent_node->GetChildCount() - 1; root_idx >= 0; root_idx--) + { + // if there is SettingsItem or VolumeItem, then RootItems don't exist in current ObjectItem + if (parent_node->GetNthChild(root_idx)->GetType() & (itSettings | itVolume)) + break; + if (parent_node->GetNthChild(root_idx)->GetType() & root_type) + return root_idx; + } + + return -1; +} + +ObjectDataViewModel::ObjectDataViewModel() +{ + m_bitmap_cache = new Slic3r::GUI::BitmapCache; +} + +ObjectDataViewModel::~ObjectDataViewModel() +{ + for (auto object : m_objects) + delete object; + delete m_bitmap_cache; + m_bitmap_cache = nullptr; +} + +wxDataViewItem ObjectDataViewModel::Add(const wxString &name, + const int extruder, + const bool has_errors/* = false*/) +{ + const wxString extruder_str = extruder == 0 ? _(L("default")) : wxString::Format("%d", extruder); + auto root = new ObjectDataViewModelNode(name, extruder_str); + // Add error icon if detected auto-repaire + if (has_errors) + root->m_bmp = *m_warning_bmp; + + m_objects.push_back(root); + // notify control + wxDataViewItem child((void*)root); + wxDataViewItem parent((void*)NULL); + + ItemAdded(parent, child); + return child; +} + +wxDataViewItem ObjectDataViewModel::AddVolumeChild( const wxDataViewItem &parent_item, + const wxString &name, + const Slic3r::ModelVolumeType volume_type, + const bool has_errors/* = false*/, + const int extruder/* = 0*/, + const bool create_frst_child/* = true*/) +{ + ObjectDataViewModelNode *root = (ObjectDataViewModelNode*)parent_item.GetID(); + if (!root) return wxDataViewItem(0); + + wxString extruder_str = extruder == 0 ? _(L("default")) : wxString::Format("%d", extruder); + + // get insertion position according to the existed Layers and/or Instances Items + int insert_position = get_root_idx(root, itLayerRoot); + if (insert_position < 0) + insert_position = get_root_idx(root, itInstanceRoot); + + const bool obj_errors = root->m_bmp.IsOk(); + + if (create_frst_child && root->m_volumes_cnt == 0) + { + const Slic3r::ModelVolumeType type = Slic3r::ModelVolumeType::MODEL_PART; + const auto node = new ObjectDataViewModelNode(root, root->m_name, GetVolumeIcon(type, obj_errors), extruder_str, 0); + node->m_volume_type = type; + + insert_position < 0 ? root->Append(node) : root->Insert(node, insert_position); + // notify control + const wxDataViewItem child((void*)node); + ItemAdded(parent_item, child); + + root->m_volumes_cnt++; + if (insert_position >= 0) insert_position++; + } + + const auto node = new ObjectDataViewModelNode(root, name, GetVolumeIcon(volume_type, has_errors), extruder_str, root->m_volumes_cnt); + insert_position < 0 ? root->Append(node) : root->Insert(node, insert_position); + + // if part with errors is added, but object wasn't marked, then mark it + if (!obj_errors && has_errors) + root->SetBitmap(*m_warning_bmp); + + // notify control + const wxDataViewItem child((void*)node); + ItemAdded(parent_item, child); + root->m_volumes_cnt++; + + node->m_volume_type = volume_type; + + return child; +} + +wxDataViewItem ObjectDataViewModel::AddSettingsChild(const wxDataViewItem &parent_item) +{ + ObjectDataViewModelNode *root = (ObjectDataViewModelNode*)parent_item.GetID(); + if (!root) return wxDataViewItem(0); + + const auto node = new ObjectDataViewModelNode(root, itSettings); + root->Insert(node, 0); + // notify control + const wxDataViewItem child((void*)node); + ItemAdded(parent_item, child); + return child; +} + +/* return values: + * true => root_node is created and added to the parent_root + * false => root node alredy exists +*/ +static bool append_root_node(ObjectDataViewModelNode *parent_node, + ObjectDataViewModelNode **root_node, + const ItemType root_type) +{ + const int inst_root_id = get_root_idx(parent_node, root_type); + + *root_node = inst_root_id < 0 ? + new ObjectDataViewModelNode(parent_node, root_type) : + parent_node->GetNthChild(inst_root_id); + + if (inst_root_id < 0) { + if ((root_type&itInstanceRoot) || + ( (root_type&itLayerRoot) && get_root_idx(parent_node, itInstanceRoot)<0) ) + parent_node->Append(*root_node); + else if (root_type&itLayerRoot) + parent_node->Insert(*root_node, static_cast(get_root_idx(parent_node, itInstanceRoot))); + return true; + } + + return false; +} + +wxDataViewItem ObjectDataViewModel::AddRoot(const wxDataViewItem &parent_item, ItemType root_type) +{ + ObjectDataViewModelNode *parent_node = (ObjectDataViewModelNode*)parent_item.GetID(); + if (!parent_node) return wxDataViewItem(0); + + // get InstanceRoot node + ObjectDataViewModelNode *root_node { nullptr }; + const bool appended = append_root_node(parent_node, &root_node, root_type); + if (!root_node) return wxDataViewItem(0); + + const wxDataViewItem root_item((void*)root_node); + + if (appended) + ItemAdded(parent_item, root_item);// notify control + return root_item; +} + +wxDataViewItem ObjectDataViewModel::AddInstanceRoot(const wxDataViewItem &parent_item) +{ + return AddRoot(parent_item, itInstanceRoot); +} + +wxDataViewItem ObjectDataViewModel::AddInstanceChild(const wxDataViewItem &parent_item, size_t num) +{ + std::vector print_indicator(num, true); + + // if InstanceRoot item isn't created for this moment + if (!GetInstanceRootItem(parent_item).IsOk()) + // use object's printable state to first instance + print_indicator[0] = IsPrintable(parent_item); + + return wxDataViewItem((void*)AddInstanceChild(parent_item, print_indicator)); +} + +wxDataViewItem ObjectDataViewModel::AddInstanceChild(const wxDataViewItem& parent_item, + const std::vector& print_indicator) +{ + const wxDataViewItem inst_root_item = AddInstanceRoot(parent_item); + if (!inst_root_item) return wxDataViewItem(0); + + ObjectDataViewModelNode* inst_root_node = (ObjectDataViewModelNode*)inst_root_item.GetID(); + + // Add instance nodes + ObjectDataViewModelNode *instance_node = nullptr; + size_t counter = 0; + while (counter < print_indicator.size()) { + instance_node = new ObjectDataViewModelNode(inst_root_node, itInstance); + + instance_node->set_printable_icon(print_indicator[counter] ? piPrintable : piUnprintable); + + inst_root_node->Append(instance_node); + // notify control + const wxDataViewItem instance_item((void*)instance_node); + ItemAdded(inst_root_item, instance_item); + ++counter; + } + + // update object_node printable property + UpdateObjectPrintable(parent_item); + + return wxDataViewItem((void*)instance_node); +} + +void ObjectDataViewModel::UpdateObjectPrintable(wxDataViewItem parent_item) +{ + const wxDataViewItem inst_root_item = GetInstanceRootItem(parent_item); + if (!inst_root_item) + return; + + ObjectDataViewModelNode* inst_root_node = (ObjectDataViewModelNode*)inst_root_item.GetID(); + + const size_t child_cnt = inst_root_node->GetChildren().Count(); + PrintIndicator obj_pi = piUnprintable; + for (size_t i=0; i < child_cnt; i++) + if (inst_root_node->GetNthChild(i)->IsPrintable() & piPrintable) { + obj_pi = piPrintable; + break; + } + // and set printable state for object_node to piUndef + ObjectDataViewModelNode* obj_node = (ObjectDataViewModelNode*)parent_item.GetID(); + obj_node->set_printable_icon(obj_pi); + ItemChanged(parent_item); +} + +// update printable property for all instances from object +void ObjectDataViewModel::UpdateInstancesPrintable(wxDataViewItem parent_item) +{ + const wxDataViewItem inst_root_item = GetInstanceRootItem(parent_item); + if (!inst_root_item) + return; + + ObjectDataViewModelNode* obj_node = (ObjectDataViewModelNode*)parent_item.GetID(); + const PrintIndicator obj_pi = obj_node->IsPrintable(); + + ObjectDataViewModelNode* inst_root_node = (ObjectDataViewModelNode*)inst_root_item.GetID(); + const size_t child_cnt = inst_root_node->GetChildren().Count(); + + for (size_t i=0; i < child_cnt; i++) + { + ObjectDataViewModelNode* inst_node = inst_root_node->GetNthChild(i); + // and set printable state for object_node to piUndef + inst_node->set_printable_icon(obj_pi); + ItemChanged(wxDataViewItem((void*)inst_node)); + } +} + +bool ObjectDataViewModel::IsPrintable(const wxDataViewItem& item) const +{ + ObjectDataViewModelNode* node = (ObjectDataViewModelNode*)item.GetID(); + if (!node) + return false; + + return node->IsPrintable() == piPrintable; +} + +wxDataViewItem ObjectDataViewModel::AddLayersRoot(const wxDataViewItem &parent_item) +{ + return AddRoot(parent_item, itLayerRoot); +} + +wxDataViewItem ObjectDataViewModel::AddLayersChild(const wxDataViewItem &parent_item, + const t_layer_height_range& layer_range, + const int extruder/* = 0*/, + const int index /* = -1*/) +{ + ObjectDataViewModelNode *parent_node = (ObjectDataViewModelNode*)parent_item.GetID(); + if (!parent_node) return wxDataViewItem(0); + + wxString extruder_str = extruder == 0 ? _(L("default")) : wxString::Format("%d", extruder); + + // get LayerRoot node + ObjectDataViewModelNode *layer_root_node; + wxDataViewItem layer_root_item; + + if (parent_node->GetType() & itLayerRoot) { + layer_root_node = parent_node; + layer_root_item = parent_item; + } + else { + const int root_idx = get_root_idx(parent_node, itLayerRoot); + if (root_idx < 0) return wxDataViewItem(0); + layer_root_node = parent_node->GetNthChild(root_idx); + layer_root_item = wxDataViewItem((void*)layer_root_node); + } + + // Add layer node + ObjectDataViewModelNode *layer_node = new ObjectDataViewModelNode(layer_root_node, layer_range, index, extruder_str); + if (index < 0) + layer_root_node->Append(layer_node); + else + layer_root_node->Insert(layer_node, index); + + // notify control + const wxDataViewItem layer_item((void*)layer_node); + ItemAdded(layer_root_item, layer_item); + + return layer_item; +} + +wxDataViewItem ObjectDataViewModel::Delete(const wxDataViewItem &item) +{ + auto ret_item = wxDataViewItem(0); + ObjectDataViewModelNode *node = (ObjectDataViewModelNode*)item.GetID(); + if (!node) // happens if item.IsOk()==false + return ret_item; + + auto node_parent = node->GetParent(); + wxDataViewItem parent(node_parent); + + // first remove the node from the parent's array of children; + // NOTE: MyObjectTreeModelNodePtrArray is only an array of _pointers_ + // thus removing the node from it doesn't result in freeing it + if (node_parent) { + if (node->m_type & (itInstanceRoot|itLayerRoot)) + { + // node can be deleted by the Delete, let's check its type while we safely can + bool is_instance_root = (node->m_type & itInstanceRoot); + + for (int i = int(node->GetChildCount() - 1); i >= (is_instance_root ? 1 : 0); i--) + Delete(wxDataViewItem(node->GetNthChild(i))); + + return parent; + } + + auto id = node_parent->GetChildren().Index(node); + auto idx = node->GetIdx(); + + + if (node->m_type & (itVolume|itLayer)) { + node_parent->m_volumes_cnt--; + DeleteSettings(item); + } + node_parent->GetChildren().Remove(node); + + if (id > 0) { + if (size_t(id) == node_parent->GetChildCount()) id--; + ret_item = wxDataViewItem(node_parent->GetChildren().Item(id)); + } + + //update idx value for remaining child-nodes + auto children = node_parent->GetChildren(); + for (size_t i = 0; i < node_parent->GetChildCount() && idx>=0; i++) + { + auto cur_idx = children[i]->GetIdx(); + if (cur_idx > idx) + children[i]->SetIdx(cur_idx-1); + } + + // if there is last instance item, delete both of it and instance root item + if (node_parent->GetChildCount() == 1 && node_parent->GetNthChild(0)->m_type == itInstance) + { + delete node; + ItemDeleted(parent, item); + + ObjectDataViewModelNode *last_instance_node = node_parent->GetNthChild(0); + PrintIndicator last_instance_printable = last_instance_node->IsPrintable(); + node_parent->GetChildren().Remove(last_instance_node); + delete last_instance_node; + ItemDeleted(parent, wxDataViewItem(last_instance_node)); + + ObjectDataViewModelNode *obj_node = node_parent->GetParent(); + obj_node->set_printable_icon(last_instance_printable); + obj_node->GetChildren().Remove(node_parent); + delete node_parent; + ret_item = wxDataViewItem(obj_node); + +#ifndef __WXGTK__ + if (obj_node->GetChildCount() == 0) + obj_node->m_container = false; +#endif //__WXGTK__ + ItemDeleted(ret_item, wxDataViewItem(node_parent)); + return ret_item; + } + + if (node->m_type & itInstance) + UpdateObjectPrintable(wxDataViewItem(node_parent->GetParent())); + + // if there was last layer item, delete this one and layers root item + if (node_parent->GetChildCount() == 0 && node_parent->m_type == itLayerRoot) + { + ObjectDataViewModelNode *obj_node = node_parent->GetParent(); + obj_node->GetChildren().Remove(node_parent); + delete node_parent; + ret_item = wxDataViewItem(obj_node); + +#ifndef __WXGTK__ + if (obj_node->GetChildCount() == 0) + obj_node->m_container = false; +#endif //__WXGTK__ + ItemDeleted(ret_item, wxDataViewItem(node_parent)); + return ret_item; + } + + // if there is last volume item after deleting, delete this last volume too + if (node_parent->GetChildCount() <= 3) // 3??? #ys_FIXME + { + int vol_cnt = 0; + int vol_idx = 0; + for (size_t i = 0; i < node_parent->GetChildCount(); ++i) { + if (node_parent->GetNthChild(i)->GetType() == itVolume) { + vol_idx = i; + vol_cnt++; + } + if (vol_cnt > 1) + break; + } + + if (vol_cnt == 1) { + delete node; + ItemDeleted(parent, item); + + ObjectDataViewModelNode *last_child_node = node_parent->GetNthChild(vol_idx); + DeleteSettings(wxDataViewItem(last_child_node)); + node_parent->GetChildren().Remove(last_child_node); + node_parent->m_volumes_cnt = 0; + delete last_child_node; + +#ifndef __WXGTK__ + if (node_parent->GetChildCount() == 0) + node_parent->m_container = false; +#endif //__WXGTK__ + ItemDeleted(parent, wxDataViewItem(last_child_node)); + + wxCommandEvent event(wxCUSTOMEVT_LAST_VOLUME_IS_DELETED); + auto it = find(m_objects.begin(), m_objects.end(), node_parent); + event.SetInt(it == m_objects.end() ? -1 : it - m_objects.begin()); + wxPostEvent(m_ctrl, event); + + ret_item = parent; + + return ret_item; + } + } + } + else + { + auto it = find(m_objects.begin(), m_objects.end(), node); + size_t id = it - m_objects.begin(); + if (it != m_objects.end()) + { + // Delete all sub-items + int i = m_objects[id]->GetChildCount() - 1; + while (i >= 0) { + Delete(wxDataViewItem(m_objects[id]->GetNthChild(i))); + i = m_objects[id]->GetChildCount() - 1; + } + m_objects.erase(it); + } + if (id > 0) { + if(id == m_objects.size()) id--; + ret_item = wxDataViewItem(m_objects[id]); + } + } + // free the node + delete node; + + // set m_containet to FALSE if parent has no child + if (node_parent) { +#ifndef __WXGTK__ + if (node_parent->GetChildCount() == 0) + node_parent->m_container = false; +#endif //__WXGTK__ + ret_item = parent; + } + + // notify control + ItemDeleted(parent, item); + return ret_item; +} + +wxDataViewItem ObjectDataViewModel::DeleteLastInstance(const wxDataViewItem &parent_item, size_t num) +{ + auto ret_item = wxDataViewItem(0); + ObjectDataViewModelNode *parent_node = (ObjectDataViewModelNode*)parent_item.GetID(); + if (!parent_node) return ret_item; + + const int inst_root_id = get_root_idx(parent_node, itInstanceRoot); + if (inst_root_id < 0) return ret_item; + + wxDataViewItemArray items; + ObjectDataViewModelNode *inst_root_node = parent_node->GetNthChild(inst_root_id); + const wxDataViewItem inst_root_item((void*)inst_root_node); + + const int inst_cnt = inst_root_node->GetChildCount(); + const bool delete_inst_root_item = inst_cnt - num < 2 ? true : false; + + PrintIndicator last_inst_printable = piUndef; + + int stop = delete_inst_root_item ? 0 : inst_cnt - num; + for (int i = inst_cnt - 1; i >= stop;--i) { + ObjectDataViewModelNode *last_instance_node = inst_root_node->GetNthChild(i); + if (i==0) last_inst_printable = last_instance_node->IsPrintable(); + inst_root_node->GetChildren().Remove(last_instance_node); + delete last_instance_node; + ItemDeleted(inst_root_item, wxDataViewItem(last_instance_node)); + } + + if (delete_inst_root_item) { + ret_item = parent_item; + parent_node->GetChildren().Remove(inst_root_node); + parent_node->set_printable_icon(last_inst_printable); + ItemDeleted(parent_item, inst_root_item); + ItemChanged(parent_item); +#ifndef __WXGTK__ + if (parent_node->GetChildCount() == 0) + parent_node->m_container = false; +#endif //__WXGTK__ + } + + // update object_node printable property + UpdateObjectPrintable(parent_item); + + return ret_item; +} + +void ObjectDataViewModel::DeleteAll() +{ + while (!m_objects.empty()) + { + auto object = m_objects.back(); +// object->RemoveAllChildren(); + Delete(wxDataViewItem(object)); + } +} + +void ObjectDataViewModel::DeleteChildren(wxDataViewItem& parent) +{ + ObjectDataViewModelNode *root = (ObjectDataViewModelNode*)parent.GetID(); + if (!root) // happens if item.IsOk()==false + return; + + // first remove the node from the parent's array of children; + // NOTE: MyObjectTreeModelNodePtrArray is only an array of _pointers_ + // thus removing the node from it doesn't result in freeing it + auto& children = root->GetChildren(); + for (int id = root->GetChildCount() - 1; id >= 0; --id) + { + auto node = children[id]; + auto item = wxDataViewItem(node); + children.RemoveAt(id); + + if (node->m_type == itVolume) + root->m_volumes_cnt--; + + // free the node + delete node; + + // notify control + ItemDeleted(parent, item); + } + + // set m_containet to FALSE if parent has no child +#ifndef __WXGTK__ + root->m_container = false; +#endif //__WXGTK__ +} + +void ObjectDataViewModel::DeleteVolumeChildren(wxDataViewItem& parent) +{ + ObjectDataViewModelNode *root = (ObjectDataViewModelNode*)parent.GetID(); + if (!root) // happens if item.IsOk()==false + return; + + // first remove the node from the parent's array of children; + // NOTE: MyObjectTreeModelNodePtrArray is only an array of _pointers_ + // thus removing the node from it doesn't result in freeing it + auto& children = root->GetChildren(); + for (int id = root->GetChildCount() - 1; id >= 0; --id) + { + auto node = children[id]; + if (node->m_type != itVolume) + continue; + + auto item = wxDataViewItem(node); + DeleteSettings(item); + children.RemoveAt(id); + + // free the node + delete node; + + // notify control + ItemDeleted(parent, item); + } + root->m_volumes_cnt = 0; + + // set m_containet to FALSE if parent has no child +#ifndef __WXGTK__ + root->m_container = false; +#endif //__WXGTK__ +} + +void ObjectDataViewModel::DeleteSettings(const wxDataViewItem& parent) +{ + ObjectDataViewModelNode *node = (ObjectDataViewModelNode*)parent.GetID(); + if (!node) return; + + // if volume has a "settings"item, than delete it before volume deleting + if (node->GetChildCount() > 0 && node->GetNthChild(0)->GetType() == itSettings) { + auto settings_node = node->GetNthChild(0); + auto settings_item = wxDataViewItem(settings_node); + node->GetChildren().RemoveAt(0); + delete settings_node; + ItemDeleted(parent, settings_item); + } +} + +wxDataViewItem ObjectDataViewModel::GetItemById(int obj_idx) +{ + if (size_t(obj_idx) >= m_objects.size()) + { + printf("Error! Out of objects range.\n"); + return wxDataViewItem(0); + } + return wxDataViewItem(m_objects[obj_idx]); +} + + +wxDataViewItem ObjectDataViewModel::GetItemByVolumeId(int obj_idx, int volume_idx) +{ + if (size_t(obj_idx) >= m_objects.size()) { + printf("Error! Out of objects range.\n"); + return wxDataViewItem(0); + } + + auto parent = m_objects[obj_idx]; + if (parent->GetChildCount() == 0 || + (parent->GetChildCount() == 1 && parent->GetNthChild(0)->GetType() & itSettings )) { + if (volume_idx == 0) + return GetItemById(obj_idx); + + printf("Error! Object has no one volume.\n"); + return wxDataViewItem(0); + } + + for (size_t i = 0; i < parent->GetChildCount(); i++) + if (parent->GetNthChild(i)->m_idx == volume_idx && parent->GetNthChild(i)->GetType() & itVolume) + return wxDataViewItem(parent->GetNthChild(i)); + + return wxDataViewItem(0); +} + +wxDataViewItem ObjectDataViewModel::GetItemById(const int obj_idx, const int sub_obj_idx, const ItemType parent_type) +{ + if (size_t(obj_idx) >= m_objects.size()) { + printf("Error! Out of objects range.\n"); + return wxDataViewItem(0); + } + + auto item = GetItemByType(wxDataViewItem(m_objects[obj_idx]), parent_type); + if (!item) + return wxDataViewItem(0); + + auto parent = (ObjectDataViewModelNode*)item.GetID(); + for (size_t i = 0; i < parent->GetChildCount(); i++) + if (parent->GetNthChild(i)->m_idx == sub_obj_idx) + return wxDataViewItem(parent->GetNthChild(i)); + + return wxDataViewItem(0); +} + +wxDataViewItem ObjectDataViewModel::GetItemByInstanceId(int obj_idx, int inst_idx) +{ + return GetItemById(obj_idx, inst_idx, itInstanceRoot); +} + +wxDataViewItem ObjectDataViewModel::GetItemByLayerId(int obj_idx, int layer_idx) +{ + return GetItemById(obj_idx, layer_idx, itLayerRoot); +} + +wxDataViewItem ObjectDataViewModel::GetItemByLayerRange(const int obj_idx, const t_layer_height_range& layer_range) +{ + if (size_t(obj_idx) >= m_objects.size()) { + printf("Error! Out of objects range.\n"); + return wxDataViewItem(0); + } + + auto item = GetItemByType(wxDataViewItem(m_objects[obj_idx]), itLayerRoot); + if (!item) + return wxDataViewItem(0); + + auto parent = (ObjectDataViewModelNode*)item.GetID(); + for (size_t i = 0; i < parent->GetChildCount(); i++) + if (parent->GetNthChild(i)->m_layer_range == layer_range) + return wxDataViewItem(parent->GetNthChild(i)); + + return wxDataViewItem(0); +} + +int ObjectDataViewModel::GetItemIdByLayerRange(const int obj_idx, const t_layer_height_range& layer_range) +{ + wxDataViewItem item = GetItemByLayerRange(obj_idx, layer_range); + if (!item) + return -1; + + return GetLayerIdByItem(item); +} + +int ObjectDataViewModel::GetIdByItem(const wxDataViewItem& item) const +{ + if(!item.IsOk()) + return -1; + + ObjectDataViewModelNode *node = (ObjectDataViewModelNode*)item.GetID(); + auto it = find(m_objects.begin(), m_objects.end(), node); + if (it == m_objects.end()) + return -1; + + return it - m_objects.begin(); +} + +int ObjectDataViewModel::GetIdByItemAndType(const wxDataViewItem& item, const ItemType type) const +{ + wxASSERT(item.IsOk()); + + ObjectDataViewModelNode *node = (ObjectDataViewModelNode*)item.GetID(); + if (!node || node->m_type != type) + return -1; + return node->GetIdx(); +} + +int ObjectDataViewModel::GetObjectIdByItem(const wxDataViewItem& item) const +{ + return GetIdByItem(GetTopParent(item)); +} + +int ObjectDataViewModel::GetVolumeIdByItem(const wxDataViewItem& item) const +{ + return GetIdByItemAndType(item, itVolume); +} + +int ObjectDataViewModel::GetInstanceIdByItem(const wxDataViewItem& item) const +{ + return GetIdByItemAndType(item, itInstance); +} + +int ObjectDataViewModel::GetLayerIdByItem(const wxDataViewItem& item) const +{ + return GetIdByItemAndType(item, itLayer); +} + +t_layer_height_range ObjectDataViewModel::GetLayerRangeByItem(const wxDataViewItem& item) const +{ + wxASSERT(item.IsOk()); + + ObjectDataViewModelNode *node = (ObjectDataViewModelNode*)item.GetID(); + if (!node || node->m_type != itLayer) + return { 0.0f, 0.0f }; + return node->GetLayerRange(); +} + +bool ObjectDataViewModel::UpdateColumValues(unsigned col) +{ + switch (col) + { + case colPrint: + case colName: + case colEditing: + return true; + case colExtruder: + { + wxDataViewItemArray items; + GetAllChildren(wxDataViewItem(nullptr), items); + + if (items.IsEmpty()) return false; + + for (auto item : items) + UpdateExtruderBitmap(item); + + return true; + } + default: + printf("MyObjectTreeModel::SetValue: wrong column"); + } + return false; +} + + +void ObjectDataViewModel::UpdateExtruderBitmap(wxDataViewItem item) +{ + wxString extruder = GetExtruder(item); + if (extruder.IsEmpty()) + return; + + // set extruder bitmap + int extruder_idx = atoi(extruder.c_str()); + if (extruder_idx > 0) --extruder_idx; + + const DataViewBitmapText extruder_val(extruder, get_extruder_color_icon(extruder_idx)); + + wxVariant value; + value << extruder_val; + + SetValue(value, item, colExtruder); +} + +void ObjectDataViewModel::GetItemInfo(const wxDataViewItem& item, ItemType& type, int& obj_idx, int& idx) +{ + wxASSERT(item.IsOk()); + type = itUndef; + + ObjectDataViewModelNode *node = (ObjectDataViewModelNode*)item.GetID(); + if (!node || + node->GetIdx() <-1 || + ( node->GetIdx() == -1 && + !(node->GetType() & (itObject | itSettings | itInstanceRoot | itLayerRoot/* | itLayer*/)) + ) + ) + return; + + idx = node->GetIdx(); + type = node->GetType(); + + ObjectDataViewModelNode *parent_node = node->GetParent(); + if (!parent_node) return; + + // get top parent (Object) node + while (parent_node->m_type != itObject) + parent_node = parent_node->GetParent(); + + auto it = find(m_objects.begin(), m_objects.end(), parent_node); + if (it != m_objects.end()) + obj_idx = it - m_objects.begin(); + else + type = itUndef; +} + +int ObjectDataViewModel::GetRowByItem(const wxDataViewItem& item) const +{ + if (m_objects.empty()) + return -1; + + int row_num = 0; + + for (size_t i = 0; i < m_objects.size(); i++) + { + row_num++; + if (item == wxDataViewItem(m_objects[i])) + return row_num; + + for (size_t j = 0; j < m_objects[i]->GetChildCount(); j++) + { + row_num++; + ObjectDataViewModelNode* cur_node = m_objects[i]->GetNthChild(j); + if (item == wxDataViewItem(cur_node)) + return row_num; + + if (cur_node->m_type == itVolume && cur_node->GetChildCount() == 1) + row_num++; + if (cur_node->m_type == itInstanceRoot) + { + row_num++; + for (size_t t = 0; t < cur_node->GetChildCount(); t++) + { + row_num++; + if (item == wxDataViewItem(cur_node->GetNthChild(t))) + return row_num; + } + } + } + } + + return -1; +} + +bool ObjectDataViewModel::InvalidItem(const wxDataViewItem& item) +{ + if (!item) + return true; + + ObjectDataViewModelNode* node = (ObjectDataViewModelNode*)item.GetID(); + if (!node || node->invalid()) + return true; + + return false; +} + +wxString ObjectDataViewModel::GetName(const wxDataViewItem &item) const +{ + ObjectDataViewModelNode *node = (ObjectDataViewModelNode*)item.GetID(); + if (!node) // happens if item.IsOk()==false + return wxEmptyString; + + return node->m_name; +} + +wxBitmap& ObjectDataViewModel::GetBitmap(const wxDataViewItem &item) const +{ + ObjectDataViewModelNode *node = (ObjectDataViewModelNode*)item.GetID(); + return node->m_bmp; +} + +wxString ObjectDataViewModel::GetExtruder(const wxDataViewItem& item) const +{ + ObjectDataViewModelNode *node = (ObjectDataViewModelNode*)item.GetID(); + if (!node) // happens if item.IsOk()==false + return wxEmptyString; + + return node->m_extruder; +} + +int ObjectDataViewModel::GetExtruderNumber(const wxDataViewItem& item) const +{ + ObjectDataViewModelNode *node = (ObjectDataViewModelNode*)item.GetID(); + if (!node) // happens if item.IsOk()==false + return 0; + + return atoi(node->m_extruder.c_str()); +} + +void ObjectDataViewModel::GetValue(wxVariant &variant, const wxDataViewItem &item, unsigned int col) const +{ + wxASSERT(item.IsOk()); + + ObjectDataViewModelNode *node = (ObjectDataViewModelNode*)item.GetID(); + switch (col) + { + case colPrint: + variant << node->m_printable_icon; + break; + case colName: + variant << DataViewBitmapText(node->m_name, node->m_bmp); + break; + case colExtruder: + variant << DataViewBitmapText(node->m_extruder, node->m_extruder_bmp); + break; + case colEditing: + variant << node->m_action_icon; + break; + default: + ; + } +} + +bool ObjectDataViewModel::SetValue(const wxVariant &variant, const wxDataViewItem &item, unsigned int col) +{ + wxASSERT(item.IsOk()); + + ObjectDataViewModelNode *node = (ObjectDataViewModelNode*)item.GetID(); + return node->SetValue(variant, col); +} + +bool ObjectDataViewModel::SetValue(const wxVariant &variant, const int item_idx, unsigned int col) +{ + if (size_t(item_idx) >= m_objects.size()) + return false; + + return m_objects[item_idx]->SetValue(variant, col); +} + +void ObjectDataViewModel::SetExtruder(const wxString& extruder, wxDataViewItem item) +{ + DataViewBitmapText extruder_val; + extruder_val.SetText(extruder); + + // set extruder bitmap + int extruder_idx = atoi(extruder.c_str()); + if (extruder_idx > 0) --extruder_idx; + extruder_val.SetBitmap(get_extruder_color_icon(extruder_idx)); + + wxVariant value; + value << extruder_val; + + SetValue(value, item, colExtruder); +} + +wxDataViewItem ObjectDataViewModel::ReorganizeChildren( const int current_volume_id, + const int new_volume_id, + const wxDataViewItem &parent) +{ + auto ret_item = wxDataViewItem(0); + if (current_volume_id == new_volume_id) + return ret_item; + wxASSERT(parent.IsOk()); + ObjectDataViewModelNode *node_parent = (ObjectDataViewModelNode*)parent.GetID(); + if (!node_parent) // happens if item.IsOk()==false + return ret_item; + + const size_t shift = node_parent->GetChildren().Item(0)->m_type == itSettings ? 1 : 0; + + ObjectDataViewModelNode *deleted_node = node_parent->GetNthChild(current_volume_id+shift); + node_parent->GetChildren().Remove(deleted_node); + ItemDeleted(parent, wxDataViewItem(deleted_node)); + node_parent->Insert(deleted_node, new_volume_id+shift); + ItemAdded(parent, wxDataViewItem(deleted_node)); + + //update volume_id value for child-nodes + auto children = node_parent->GetChildren(); + int id_frst = current_volume_id < new_volume_id ? current_volume_id : new_volume_id; + int id_last = current_volume_id > new_volume_id ? current_volume_id : new_volume_id; + for (int id = id_frst; id <= id_last; ++id) + children[id+shift]->SetIdx(id); + + return wxDataViewItem(node_parent->GetNthChild(new_volume_id+shift)); +} + +wxDataViewItem ObjectDataViewModel::ReorganizeObjects( const int current_id, const int new_id) +{ + if (current_id == new_id) + return wxDataViewItem(nullptr); + + ObjectDataViewModelNode* deleted_node = m_objects[current_id]; + m_objects.erase(m_objects.begin() + current_id); + ItemDeleted(wxDataViewItem(nullptr), wxDataViewItem(deleted_node)); + + m_objects.emplace(m_objects.begin() + new_id, deleted_node); + ItemAdded(wxDataViewItem(nullptr), wxDataViewItem(deleted_node)); + + return wxDataViewItem(deleted_node); +} + +bool ObjectDataViewModel::IsEnabled(const wxDataViewItem &item, unsigned int col) const +{ + wxASSERT(item.IsOk()); + ObjectDataViewModelNode *node = (ObjectDataViewModelNode*)item.GetID(); + + // disable extruder selection for the non "itObject|itVolume" item + return !(col == colExtruder && node->m_extruder.IsEmpty()); +} + +wxDataViewItem ObjectDataViewModel::GetParent(const wxDataViewItem &item) const +{ + // the invisible root node has no parent + if (!item.IsOk()) + return wxDataViewItem(0); + + ObjectDataViewModelNode *node = (ObjectDataViewModelNode*)item.GetID(); + assert(node != nullptr && node->valid()); + + // objects nodes has no parent too + if (node->m_type == itObject) + return wxDataViewItem(0); + + return wxDataViewItem((void*)node->GetParent()); +} + +wxDataViewItem ObjectDataViewModel::GetTopParent(const wxDataViewItem &item) const +{ + // the invisible root node has no parent + if (!item.IsOk()) + return wxDataViewItem(0); + + ObjectDataViewModelNode *node = (ObjectDataViewModelNode*)item.GetID(); + if (node->m_type == itObject) + return item; + + ObjectDataViewModelNode *parent_node = node->GetParent(); + while (parent_node->m_type != itObject) + parent_node = parent_node->GetParent(); + + return wxDataViewItem((void*)parent_node); +} + +bool ObjectDataViewModel::IsContainer(const wxDataViewItem &item) const +{ + // the invisible root node can have children + if (!item.IsOk()) + return true; + + ObjectDataViewModelNode *node = (ObjectDataViewModelNode*)item.GetID(); + return node->IsContainer(); +} + +unsigned int ObjectDataViewModel::GetChildren(const wxDataViewItem &parent, wxDataViewItemArray &array) const +{ + ObjectDataViewModelNode *node = (ObjectDataViewModelNode*)parent.GetID(); + if (!node) + { + for (auto object : m_objects) + array.Add(wxDataViewItem((void*)object)); + return m_objects.size(); + } + + if (node->GetChildCount() == 0) + { + return 0; + } + + unsigned int count = node->GetChildren().GetCount(); + for (unsigned int pos = 0; pos < count; pos++) + { + ObjectDataViewModelNode *child = node->GetChildren().Item(pos); + array.Add(wxDataViewItem((void*)child)); + } + + return count; +} + +void ObjectDataViewModel::GetAllChildren(const wxDataViewItem &parent, wxDataViewItemArray &array) const +{ + ObjectDataViewModelNode *node = (ObjectDataViewModelNode*)parent.GetID(); + if (!node) { + for (auto object : m_objects) + array.Add(wxDataViewItem((void*)object)); + } + else if (node->GetChildCount() == 0) + return; + else { + const size_t count = node->GetChildren().GetCount(); + for (size_t pos = 0; pos < count; pos++) { + ObjectDataViewModelNode *child = node->GetChildren().Item(pos); + array.Add(wxDataViewItem((void*)child)); + } + } + + wxDataViewItemArray new_array = array; + for (const auto item : new_array) + { + wxDataViewItemArray children; + GetAllChildren(item, children); + WX_APPEND_ARRAY(array, children); + } +} + +ItemType ObjectDataViewModel::GetItemType(const wxDataViewItem &item) const +{ + if (!item.IsOk()) + return itUndef; + ObjectDataViewModelNode *node = (ObjectDataViewModelNode*)item.GetID(); + return node->m_type < 0 ? itUndef : node->m_type; +} + +wxDataViewItem ObjectDataViewModel::GetItemByType(const wxDataViewItem &parent_item, ItemType type) const +{ + if (!parent_item.IsOk()) + return wxDataViewItem(0); + + ObjectDataViewModelNode *node = (ObjectDataViewModelNode*)parent_item.GetID(); + if (node->GetChildCount() == 0) + return wxDataViewItem(0); + + for (size_t i = 0; i < node->GetChildCount(); i++) { + if (node->GetNthChild(i)->m_type == type) + return wxDataViewItem((void*)node->GetNthChild(i)); + } + + return wxDataViewItem(0); +} + +wxDataViewItem ObjectDataViewModel::GetSettingsItem(const wxDataViewItem &item) const +{ + return GetItemByType(item, itSettings); +} + +wxDataViewItem ObjectDataViewModel::GetInstanceRootItem(const wxDataViewItem &item) const +{ + return GetItemByType(item, itInstanceRoot); +} + +wxDataViewItem ObjectDataViewModel::GetLayerRootItem(const wxDataViewItem &item) const +{ + return GetItemByType(item, itLayerRoot); +} + +bool ObjectDataViewModel::IsSettingsItem(const wxDataViewItem &item) const +{ + if (!item.IsOk()) + return false; + ObjectDataViewModelNode *node = (ObjectDataViewModelNode*)item.GetID(); + return node->m_type == itSettings; +} + +void ObjectDataViewModel::UpdateSettingsDigest(const wxDataViewItem &item, + const std::vector& categories) +{ + if (!item.IsOk()) return; + ObjectDataViewModelNode *node = (ObjectDataViewModelNode*)item.GetID(); + if (!node->update_settings_digest(categories)) + return; + ItemChanged(item); +} + +void ObjectDataViewModel::SetVolumeType(const wxDataViewItem &item, const Slic3r::ModelVolumeType type) +{ + if (!item.IsOk() || GetItemType(item) != itVolume) + return; + + ObjectDataViewModelNode *node = (ObjectDataViewModelNode*)item.GetID(); + node->SetBitmap(*m_volume_bmps[int(type)]); + ItemChanged(item); +} + +wxDataViewItem ObjectDataViewModel::SetPrintableState( + PrintIndicator printable, + int obj_idx, + int subobj_idx /* = -1*/, + ItemType subobj_type/* = itInstance*/) +{ + wxDataViewItem item = wxDataViewItem(0); + if (subobj_idx < 0) + item = GetItemById(obj_idx); + else + item = subobj_type&itInstance ? GetItemByInstanceId(obj_idx, subobj_idx) : + GetItemByVolumeId(obj_idx, subobj_idx); + + ObjectDataViewModelNode* node = (ObjectDataViewModelNode*)item.GetID(); + if (!node) + return wxDataViewItem(0); + node->set_printable_icon(printable); + ItemChanged(item); + + if (subobj_idx >= 0) + UpdateObjectPrintable(GetItemById(obj_idx)); + + return item; +} + +wxDataViewItem ObjectDataViewModel::SetObjectPrintableState( + PrintIndicator printable, + wxDataViewItem obj_item) +{ + ObjectDataViewModelNode* node = (ObjectDataViewModelNode*)obj_item.GetID(); + if (!node) + return wxDataViewItem(0); + node->set_printable_icon(printable); + ItemChanged(obj_item); + + UpdateInstancesPrintable(obj_item); + + return obj_item; +} + +void ObjectDataViewModel::Rescale() +{ + wxDataViewItemArray all_items; + GetAllChildren(wxDataViewItem(0), all_items); + + for (wxDataViewItem item : all_items) + { + if (!item.IsOk()) + continue; + + ObjectDataViewModelNode *node = (ObjectDataViewModelNode*)item.GetID(); + node->msw_rescale(); + + switch (node->m_type) + { + case itObject: + if (node->m_bmp.IsOk()) node->m_bmp = *m_warning_bmp; + break; + case itVolume: + node->m_bmp = GetVolumeIcon(node->m_volume_type, node->m_bmp.GetWidth() != node->m_bmp.GetHeight()); + break; + case itLayerRoot: + node->m_bmp = create_scaled_bitmap(LAYER_ROOT_ICON); + case itLayer: + node->m_bmp = create_scaled_bitmap(LAYER_ICON); + break; + default: break; + } + + ItemChanged(item); + } +} + +wxBitmap ObjectDataViewModel::GetVolumeIcon(const Slic3r::ModelVolumeType vol_type, const bool is_marked/* = false*/) +{ + if (!is_marked) + return *m_volume_bmps[static_cast(vol_type)]; + + std::string scaled_bitmap_name = "warning" + std::to_string(static_cast(vol_type)); + scaled_bitmap_name += "-em" + std::to_string(Slic3r::GUI::wxGetApp().em_unit()); + + wxBitmap *bmp = m_bitmap_cache->find(scaled_bitmap_name); + if (bmp == nullptr) { + std::vector bmps; + + bmps.emplace_back(*m_warning_bmp); + bmps.emplace_back(*m_volume_bmps[static_cast(vol_type)]); + + bmp = m_bitmap_cache->insert(scaled_bitmap_name, bmps); + } + + return *bmp; +} + +void ObjectDataViewModel::DeleteWarningIcon(const wxDataViewItem& item, const bool unmark_object/* = false*/) +{ + if (!item.IsOk()) + return; + + ObjectDataViewModelNode *node = (ObjectDataViewModelNode*)item.GetID(); + + if (!node->GetBitmap().IsOk() || !(node->GetType() & (itVolume | itObject))) + return; + + if (node->GetType() & itVolume) { + node->SetBitmap(*m_volume_bmps[static_cast(node->volume_type())]); + return; + } + + node->SetBitmap(wxNullBitmap); + if (unmark_object) + { + wxDataViewItemArray children; + GetChildren(item, children); + for (const wxDataViewItem& child : children) + DeleteWarningIcon(child); + } +} +/* +} +} +*/ +//----------------------------------------------------------------------------- +// DataViewBitmapText +//----------------------------------------------------------------------------- + +wxIMPLEMENT_DYNAMIC_CLASS(DataViewBitmapText, wxObject) + +IMPLEMENT_VARIANT_OBJECT(DataViewBitmapText) + +// --------------------------------------------------------- +// BitmapTextRenderer +// --------------------------------------------------------- + +#if ENABLE_NONCUSTOM_DATA_VIEW_RENDERING +BitmapTextRenderer::BitmapTextRenderer(wxDataViewCellMode mode /*= wxDATAVIEW_CELL_EDITABLE*/, + int align /*= wxDVR_DEFAULT_ALIGNMENT*/): +wxDataViewRenderer(wxT("PrusaDataViewBitmapText"), mode, align) +{ + SetMode(mode); + SetAlignment(align); +} +#endif // ENABLE_NONCUSTOM_DATA_VIEW_RENDERING + +bool BitmapTextRenderer::SetValue(const wxVariant &value) +{ + m_value << value; + return true; +} + +bool BitmapTextRenderer::GetValue(wxVariant& WXUNUSED(value)) const +{ + return false; +} + +#if ENABLE_NONCUSTOM_DATA_VIEW_RENDERING && wxUSE_ACCESSIBILITY +wxString BitmapTextRenderer::GetAccessibleDescription() const +{ + return m_value.GetText(); +} +#endif // wxUSE_ACCESSIBILITY && ENABLE_NONCUSTOM_DATA_VIEW_RENDERING + +bool BitmapTextRenderer::Render(wxRect rect, wxDC *dc, int state) +{ + int xoffset = 0; + + const wxBitmap& icon = m_value.GetBitmap(); + if (icon.IsOk()) + { +#ifdef __APPLE__ + wxSize icon_sz = icon.GetScaledSize(); +#else + wxSize icon_sz = icon.GetSize(); +#endif + dc->DrawBitmap(icon, rect.x, rect.y + (rect.height - icon_sz.y) / 2); + xoffset = icon_sz.x + 4; + } + + RenderText(m_value.GetText(), xoffset, rect, dc, state); + + return true; +} + +wxSize BitmapTextRenderer::GetSize() const +{ + if (!m_value.GetText().empty()) + { + wxSize size = GetTextExtent(m_value.GetText()); + + if (m_value.GetBitmap().IsOk()) + size.x += m_value.GetBitmap().GetWidth() + 4; + return size; + } + return wxSize(80, 20); +} + + +wxWindow* BitmapTextRenderer::CreateEditorCtrl(wxWindow* parent, wxRect labelRect, const wxVariant& value) +{ + wxDataViewCtrl* const dv_ctrl = GetOwner()->GetOwner(); + ObjectDataViewModel* const model = dynamic_cast(dv_ctrl->GetModel()); + + if ( !(model->GetItemType(dv_ctrl->GetSelection()) & (itVolume | itObject)) ) + return nullptr; + + DataViewBitmapText data; + data << value; + + m_was_unusable_symbol = false; + + wxPoint position = labelRect.GetPosition(); + if (data.GetBitmap().IsOk()) { + const int bmp_width = data.GetBitmap().GetWidth(); + position.x += bmp_width; + labelRect.SetWidth(labelRect.GetWidth() - bmp_width); + } + + wxTextCtrl* text_editor = new wxTextCtrl(parent, wxID_ANY, data.GetText(), + position, labelRect.GetSize(), wxTE_PROCESS_ENTER); + text_editor->SetInsertionPointEnd(); + text_editor->SelectAll(); + + return text_editor; +} + +bool BitmapTextRenderer::GetValueFromEditorCtrl(wxWindow* ctrl, wxVariant& value) +{ + wxTextCtrl* text_editor = wxDynamicCast(ctrl, wxTextCtrl); + if (!text_editor || text_editor->GetValue().IsEmpty()) + return false; + + std::string chosen_name = Slic3r::normalize_utf8_nfc(text_editor->GetValue().ToUTF8()); + const char* unusable_symbols = "<>:/\\|?*\""; + for (size_t i = 0; i < std::strlen(unusable_symbols); i++) { + if (chosen_name.find_first_of(unusable_symbols[i]) != std::string::npos) { + m_was_unusable_symbol = true; + return false; + } + } + + // The icon can't be edited so get its old value and reuse it. + wxVariant valueOld; + GetView()->GetModel()->GetValue(valueOld, m_item, colName); + + DataViewBitmapText bmpText; + bmpText << valueOld; + + // But replace the text with the value entered by user. + bmpText.SetText(text_editor->GetValue()); + + value << bmpText; + return true; +} + +// ---------------------------------------------------------------------------- +// BitmapChoiceRenderer +// ---------------------------------------------------------------------------- + +bool BitmapChoiceRenderer::SetValue(const wxVariant& value) +{ + m_value << value; + return true; +} + +bool BitmapChoiceRenderer::GetValue(wxVariant& value) const +{ + value << m_value; + return true; +} + +bool BitmapChoiceRenderer::Render(wxRect rect, wxDC* dc, int state) +{ + int xoffset = 0; + + const wxBitmap& icon = m_value.GetBitmap(); + if (icon.IsOk()) + { + dc->DrawBitmap(icon, rect.x, rect.y + (rect.height - icon.GetHeight()) / 2); + xoffset = icon.GetWidth() + 4; + } + + if (rect.height==0) + rect.height= icon.GetHeight(); + RenderText(m_value.GetText(), xoffset, rect, dc, state); + + return true; +} + +wxSize BitmapChoiceRenderer::GetSize() const +{ + wxSize sz = GetTextExtent(m_value.GetText()); + + if (m_value.GetBitmap().IsOk()) + sz.x += m_value.GetBitmap().GetWidth() + 4; + + return sz; +} + + +wxWindow* BitmapChoiceRenderer::CreateEditorCtrl(wxWindow* parent, wxRect labelRect, const wxVariant& value) +{ + wxDataViewCtrl* const dv_ctrl = GetOwner()->GetOwner(); + ObjectDataViewModel* const model = dynamic_cast(dv_ctrl->GetModel()); + + if (!(model->GetItemType(dv_ctrl->GetSelection()) & (itVolume | itLayer | itObject))) + return nullptr; + + std::vector icons = get_extruder_color_icons(); + if (icons.empty()) + return nullptr; + + DataViewBitmapText data; + data << value; + + auto c_editor = new wxBitmapComboBox(parent, wxID_ANY, wxEmptyString, + labelRect.GetTopLeft(), wxSize(labelRect.GetWidth(), -1), + 0, nullptr , wxCB_READONLY); + + int i=0; + for (wxBitmap* bmp : icons) { + if (i==0) { + c_editor->Append(_(L("default")), *bmp); + ++i; + } + + c_editor->Append(wxString::Format("%d", i), *bmp); + ++i; + } + c_editor->SetSelection(atoi(data.GetText().c_str())); + + // to avoid event propagation to other sidebar items + c_editor->Bind(wxEVT_COMBOBOX, [this](wxCommandEvent& evt) { + evt.StopPropagation(); + // FinishEditing grabs new selection and triggers config update. We better call + // it explicitly, automatic update on KILL_FOCUS didn't work on Linux. + this->FinishEditing(); + }); + + return c_editor; +} + +bool BitmapChoiceRenderer::GetValueFromEditorCtrl(wxWindow* ctrl, wxVariant& value) +{ + wxBitmapComboBox* c = (wxBitmapComboBox*)ctrl; + int selection = c->GetSelection(); + if (selection < 0) + return false; + + DataViewBitmapText bmpText; + + bmpText.SetText(c->GetString(selection)); + bmpText.SetBitmap(c->GetItemBitmap(selection)); + + value << bmpText; + return true; +} + +} // namespace GUI +} // namespace Slic3r + + diff --git a/src/slic3r/GUI/ObjectDataViewModel.hpp b/src/slic3r/GUI/ObjectDataViewModel.hpp new file mode 100644 index 0000000000..3d838cd435 --- /dev/null +++ b/src/slic3r/GUI/ObjectDataViewModel.hpp @@ -0,0 +1,516 @@ +#ifndef slic3r_GUI_ObjectDataViewModel_hpp_ +#define slic3r_GUI_ObjectDataViewModel_hpp_ + +#include + +#include + +namespace Slic3r { + +enum class ModelVolumeType : int; + +namespace GUI { + +typedef double coordf_t; +typedef std::pair t_layer_height_range; + +// ---------------------------------------------------------------------------- +// DataViewBitmapText: helper class used by BitmapTextRenderer +// ---------------------------------------------------------------------------- + +class DataViewBitmapText : public wxObject +{ +public: + DataViewBitmapText( const wxString &text = wxEmptyString, + const wxBitmap& bmp = wxNullBitmap) : + m_text(text), + m_bmp(bmp) + { } + + DataViewBitmapText(const DataViewBitmapText &other) + : wxObject(), + m_text(other.m_text), + m_bmp(other.m_bmp) + { } + + void SetText(const wxString &text) { m_text = text; } + wxString GetText() const { return m_text; } + void SetBitmap(const wxBitmap &bmp) { m_bmp = bmp; } + const wxBitmap &GetBitmap() const { return m_bmp; } + + bool IsSameAs(const DataViewBitmapText& other) const { + return m_text == other.m_text && m_bmp.IsSameAs(other.m_bmp); + } + + bool operator==(const DataViewBitmapText& other) const { + return IsSameAs(other); + } + + bool operator!=(const DataViewBitmapText& other) const { + return !IsSameAs(other); + } + +private: + wxString m_text; + wxBitmap m_bmp; + + wxDECLARE_DYNAMIC_CLASS(DataViewBitmapText); +}; +DECLARE_VARIANT_OBJECT(DataViewBitmapText) + +// ---------------------------------------------------------------------------- +// BitmapTextRenderer +// ---------------------------------------------------------------------------- +#if ENABLE_NONCUSTOM_DATA_VIEW_RENDERING +class BitmapTextRenderer : public wxDataViewRenderer +#else +class BitmapTextRenderer : public wxDataViewCustomRenderer +#endif //ENABLE_NONCUSTOM_DATA_VIEW_RENDERING +{ +public: + BitmapTextRenderer(wxWindow* parent, + wxDataViewCellMode mode = +#ifdef __WXOSX__ + wxDATAVIEW_CELL_INERT +#else + wxDATAVIEW_CELL_EDITABLE +#endif + + , int align = wxDVR_DEFAULT_ALIGNMENT +#if ENABLE_NONCUSTOM_DATA_VIEW_RENDERING + ); +#else + ) : + wxDataViewCustomRenderer(wxT("DataViewBitmapText"), mode, align), + m_parent(parent) + {} +#endif //ENABLE_NONCUSTOM_DATA_VIEW_RENDERING + + bool SetValue(const wxVariant& value); + bool GetValue(wxVariant& value) const; +#if ENABLE_NONCUSTOM_DATA_VIEW_RENDERING && wxUSE_ACCESSIBILITY + virtual wxString GetAccessibleDescription() const override; +#endif // wxUSE_ACCESSIBILITY && ENABLE_NONCUSTOM_DATA_VIEW_RENDERING + + virtual bool Render(wxRect cell, wxDC* dc, int state) override; + virtual wxSize GetSize() const override; + + bool HasEditorCtrl() const override + { +#ifdef __WXOSX__ + return false; +#else + return true; +#endif + } + wxWindow* CreateEditorCtrl(wxWindow* parent, + wxRect labelRect, + const wxVariant& value) override; + bool GetValueFromEditorCtrl(wxWindow* ctrl, + wxVariant& value) override; + bool WasCanceled() const { return m_was_unusable_symbol; } + +private: + DataViewBitmapText m_value; + bool m_was_unusable_symbol{ false }; + wxWindow* m_parent{ nullptr }; +}; + + +// ---------------------------------------------------------------------------- +// BitmapChoiceRenderer +// ---------------------------------------------------------------------------- + +class BitmapChoiceRenderer : public wxDataViewCustomRenderer +{ +public: + BitmapChoiceRenderer(wxDataViewCellMode mode = +#ifdef __WXOSX__ + wxDATAVIEW_CELL_INERT +#else + wxDATAVIEW_CELL_EDITABLE +#endif + , int align = wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL + ) : wxDataViewCustomRenderer(wxT("DataViewBitmapText"), mode, align) {} + + bool SetValue(const wxVariant& value); + bool GetValue(wxVariant& value) const; + + virtual bool Render(wxRect cell, wxDC* dc, int state) override; + virtual wxSize GetSize() const override; + + bool HasEditorCtrl() const override { return true; } + wxWindow* CreateEditorCtrl(wxWindow* parent, + wxRect labelRect, + const wxVariant& value) override; + bool GetValueFromEditorCtrl(wxWindow* ctrl, + wxVariant& value) override; + +private: + DataViewBitmapText m_value; +}; + + +// ---------------------------------------------------------------------------- +// ObjectDataViewModelNode: a node inside ObjectDataViewModel +// ---------------------------------------------------------------------------- +enum ItemType { + itUndef = 0, + itObject = 1, + itVolume = 2, + itInstanceRoot = 4, + itInstance = 8, + itSettings = 16, + itLayerRoot = 32, + itLayer = 64, +}; + +enum ColumnNumber +{ + colName = 0, // item name + colPrint , // printable property + colExtruder , // extruder selection + colEditing , // item editing +}; + +enum PrintIndicator +{ + piUndef = 0, // no print indicator + piPrintable , // printable + piUnprintable , // unprintable +}; + +class ObjectDataViewModelNode; +WX_DEFINE_ARRAY_PTR(ObjectDataViewModelNode*, MyObjectTreeModelNodePtrArray); + +class ObjectDataViewModelNode +{ + ObjectDataViewModelNode* m_parent; + MyObjectTreeModelNodePtrArray m_children; + wxBitmap m_empty_bmp; + size_t m_volumes_cnt = 0; + std::vector< std::string > m_opt_categories; + t_layer_height_range m_layer_range = { 0.0f, 0.0f }; + + wxString m_name; + wxBitmap& m_bmp = m_empty_bmp; + ItemType m_type; + int m_idx = -1; + bool m_container = false; + wxString m_extruder = "default"; + wxBitmap m_extruder_bmp; + wxBitmap m_action_icon; + PrintIndicator m_printable {piUndef}; + wxBitmap m_printable_icon; + + std::string m_action_icon_name = ""; + ModelVolumeType m_volume_type; + +public: + ObjectDataViewModelNode(const wxString& name, + const wxString& extruder): + m_parent(NULL), + m_name(name), + m_type(itObject), + m_extruder(extruder) + { + set_action_and_extruder_icons(); + init_container(); + } + + ObjectDataViewModelNode(ObjectDataViewModelNode* parent, + const wxString& sub_obj_name, + const wxBitmap& bmp, + const wxString& extruder, + const int idx = -1 ) : + m_parent (parent), + m_name (sub_obj_name), + m_type (itVolume), + m_idx (idx), + m_extruder (extruder) + { + m_bmp = bmp; + set_action_and_extruder_icons(); + init_container(); + } + + ObjectDataViewModelNode(ObjectDataViewModelNode* parent, + const t_layer_height_range& layer_range, + const int idx = -1, + const wxString& extruder = wxEmptyString ); + + ObjectDataViewModelNode(ObjectDataViewModelNode* parent, const ItemType type); + + ~ObjectDataViewModelNode() + { + // free all our children nodes + size_t count = m_children.GetCount(); + for (size_t i = 0; i < count; i++) + { + ObjectDataViewModelNode *child = m_children[i]; + delete child; + } +#ifndef NDEBUG + // Indicate that the object was deleted. + m_idx = -2; +#endif /* NDEBUG */ + } + + void init_container(); + bool IsContainer() const + { + return m_container; + } + + ObjectDataViewModelNode* GetParent() + { + assert(m_parent == nullptr || m_parent->valid()); + return m_parent; + } + MyObjectTreeModelNodePtrArray& GetChildren() + { + return m_children; + } + ObjectDataViewModelNode* GetNthChild(unsigned int n) + { + return m_children.Item(n); + } + void Insert(ObjectDataViewModelNode* child, unsigned int n) + { + if (!m_container) + m_container = true; + m_children.Insert(child, n); + } + void Append(ObjectDataViewModelNode* child) + { + if (!m_container) + m_container = true; + m_children.Add(child); + } + void RemoveAllChildren() + { + if (GetChildCount() == 0) + return; + for (int id = int(GetChildCount()) - 1; id >= 0; --id) + { + if (m_children.Item(id)->GetChildCount() > 0) + m_children[id]->RemoveAllChildren(); + auto node = m_children[id]; + m_children.RemoveAt(id); + delete node; + } + } + + size_t GetChildCount() const + { + return m_children.GetCount(); + } + + bool SetValue(const wxVariant &variant, unsigned int col); + + void SetBitmap(const wxBitmap &icon) { m_bmp = icon; } + const wxBitmap& GetBitmap() const { return m_bmp; } + const wxString& GetName() const { return m_name; } + ItemType GetType() const { return m_type; } + void SetIdx(const int& idx); + int GetIdx() const { return m_idx; } + t_layer_height_range GetLayerRange() const { return m_layer_range; } + PrintIndicator IsPrintable() const { return m_printable; } + + // use this function only for childrens + void AssignAllVal(ObjectDataViewModelNode& from_node) + { + // ! Don't overwrite other values because of equality of this values for all children -- + m_name = from_node.m_name; + m_bmp = from_node.m_bmp; + m_idx = from_node.m_idx; + m_extruder = from_node.m_extruder; + m_type = from_node.m_type; + } + + bool SwapChildrens(int frst_id, int scnd_id) { + if (GetChildCount() < 2 || + frst_id < 0 || (size_t)frst_id >= GetChildCount() || + scnd_id < 0 || (size_t)scnd_id >= GetChildCount()) + return false; + + ObjectDataViewModelNode new_scnd = *GetNthChild(frst_id); + ObjectDataViewModelNode new_frst = *GetNthChild(scnd_id); + + new_scnd.m_idx = m_children.Item(scnd_id)->m_idx; + new_frst.m_idx = m_children.Item(frst_id)->m_idx; + + m_children.Item(frst_id)->AssignAllVal(new_frst); + m_children.Item(scnd_id)->AssignAllVal(new_scnd); + return true; + } + + // Set action icons for node + void set_action_and_extruder_icons(); + // Set printable icon for node + void set_printable_icon(PrintIndicator printable); + + void update_settings_digest_bitmaps(); + bool update_settings_digest(const std::vector& categories); + int volume_type() const { return int(m_volume_type); } + void msw_rescale(); + +#ifndef NDEBUG + bool valid(); +#endif /* NDEBUG */ + bool invalid() const { return m_idx < -1; } + +private: + friend class ObjectDataViewModel; +}; + + +// ---------------------------------------------------------------------------- +// ObjectDataViewModel +// ---------------------------------------------------------------------------- + +// custom message the model sends to associated control to notify a last volume deleted from the object: +wxDECLARE_EVENT(wxCUSTOMEVT_LAST_VOLUME_IS_DELETED, wxCommandEvent); + +class ObjectDataViewModel :public wxDataViewModel +{ + std::vector m_objects; + std::vector m_volume_bmps; + wxBitmap* m_warning_bmp { nullptr }; + + wxDataViewCtrl* m_ctrl { nullptr }; + +public: + ObjectDataViewModel(); + ~ObjectDataViewModel(); + + wxDataViewItem Add( const wxString &name, + const int extruder, + const bool has_errors = false); + wxDataViewItem AddVolumeChild( const wxDataViewItem &parent_item, + const wxString &name, + const Slic3r::ModelVolumeType volume_type, + const bool has_errors = false, + const int extruder = 0, + const bool create_frst_child = true); + wxDataViewItem AddSettingsChild(const wxDataViewItem &parent_item); + wxDataViewItem AddInstanceChild(const wxDataViewItem &parent_item, size_t num); + wxDataViewItem AddInstanceChild(const wxDataViewItem &parent_item, const std::vector& print_indicator); + wxDataViewItem AddLayersRoot(const wxDataViewItem &parent_item); + wxDataViewItem AddLayersChild( const wxDataViewItem &parent_item, + const t_layer_height_range& layer_range, + const int extruder = 0, + const int index = -1); + wxDataViewItem Delete(const wxDataViewItem &item); + wxDataViewItem DeleteLastInstance(const wxDataViewItem &parent_item, size_t num); + void DeleteAll(); + void DeleteChildren(wxDataViewItem& parent); + void DeleteVolumeChildren(wxDataViewItem& parent); + void DeleteSettings(const wxDataViewItem& parent); + wxDataViewItem GetItemById(int obj_idx); + wxDataViewItem GetItemById(const int obj_idx, const int sub_obj_idx, const ItemType parent_type); + wxDataViewItem GetItemByVolumeId(int obj_idx, int volume_idx); + wxDataViewItem GetItemByInstanceId(int obj_idx, int inst_idx); + wxDataViewItem GetItemByLayerId(int obj_idx, int layer_idx); + wxDataViewItem GetItemByLayerRange(const int obj_idx, const t_layer_height_range& layer_range); + int GetItemIdByLayerRange(const int obj_idx, const t_layer_height_range& layer_range); + int GetIdByItem(const wxDataViewItem& item) const; + int GetIdByItemAndType(const wxDataViewItem& item, const ItemType type) const; + int GetObjectIdByItem(const wxDataViewItem& item) const; + int GetVolumeIdByItem(const wxDataViewItem& item) const; + int GetInstanceIdByItem(const wxDataViewItem& item) const; + int GetLayerIdByItem(const wxDataViewItem& item) const; + void GetItemInfo(const wxDataViewItem& item, ItemType& type, int& obj_idx, int& idx); + int GetRowByItem(const wxDataViewItem& item) const; + bool IsEmpty() { return m_objects.empty(); } + bool InvalidItem(const wxDataViewItem& item); + + // helper method for wxLog + + wxString GetName(const wxDataViewItem &item) const; + wxBitmap& GetBitmap(const wxDataViewItem &item) const; + wxString GetExtruder(const wxDataViewItem &item) const; + int GetExtruderNumber(const wxDataViewItem &item) const; + + // helper methods to change the model + + virtual unsigned int GetColumnCount() const override { return 3;} + virtual wxString GetColumnType(unsigned int col) const override{ return wxT("string"); } + + virtual void GetValue( wxVariant &variant, + const wxDataViewItem &item, + unsigned int col) const override; + virtual bool SetValue( const wxVariant &variant, + const wxDataViewItem &item, + unsigned int col) override; + bool SetValue( const wxVariant &variant, + const int item_idx, + unsigned int col); + + void SetExtruder(const wxString& extruder, wxDataViewItem item); + + // For parent move child from cur_volume_id place to new_volume_id + // Remaining items will moved up/down accordingly + wxDataViewItem ReorganizeChildren( const int cur_volume_id, + const int new_volume_id, + const wxDataViewItem &parent); + wxDataViewItem ReorganizeObjects( int current_id, int new_id); + + virtual bool IsEnabled(const wxDataViewItem &item, unsigned int col) const override; + + virtual wxDataViewItem GetParent(const wxDataViewItem &item) const override; + // get object item + wxDataViewItem GetTopParent(const wxDataViewItem &item) const; + virtual bool IsContainer(const wxDataViewItem &item) const override; + virtual unsigned int GetChildren(const wxDataViewItem &parent, + wxDataViewItemArray &array) const override; + void GetAllChildren(const wxDataViewItem &parent,wxDataViewItemArray &array) const; + // Is the container just a header or an item with all columns + // In our case it is an item with all columns + virtual bool HasContainerColumns(const wxDataViewItem& WXUNUSED(item)) const override { return true; } + + ItemType GetItemType(const wxDataViewItem &item) const ; + wxDataViewItem GetItemByType( const wxDataViewItem &parent_item, + ItemType type) const; + wxDataViewItem GetSettingsItem(const wxDataViewItem &item) const; + wxDataViewItem GetInstanceRootItem(const wxDataViewItem &item) const; + wxDataViewItem GetLayerRootItem(const wxDataViewItem &item) const; + bool IsSettingsItem(const wxDataViewItem &item) const; + void UpdateSettingsDigest( const wxDataViewItem &item, + const std::vector& categories); + + bool IsPrintable(const wxDataViewItem &item) const; + void UpdateObjectPrintable(wxDataViewItem parent_item); + void UpdateInstancesPrintable(wxDataViewItem parent_item); + + void SetVolumeBitmaps(const std::vector& volume_bmps) { m_volume_bmps = volume_bmps; } + void SetWarningBitmap(wxBitmap* bitmap) { m_warning_bmp = bitmap; } + void SetVolumeType(const wxDataViewItem &item, const Slic3r::ModelVolumeType type); + wxDataViewItem SetPrintableState( PrintIndicator printable, int obj_idx, + int subobj_idx = -1, + ItemType subobj_type = itInstance); + wxDataViewItem SetObjectPrintableState(PrintIndicator printable, wxDataViewItem obj_item); + + void SetAssociatedControl(wxDataViewCtrl* ctrl) { m_ctrl = ctrl; } + // Rescale bitmaps for existing Items + void Rescale(); + + wxBitmap GetVolumeIcon(const Slic3r::ModelVolumeType vol_type, + const bool is_marked = false); + void DeleteWarningIcon(const wxDataViewItem& item, const bool unmark_object = false); + t_layer_height_range GetLayerRangeByItem(const wxDataViewItem& item) const; + + bool UpdateColumValues(unsigned col); + void UpdateExtruderBitmap(wxDataViewItem item); + +private: + wxDataViewItem AddRoot(const wxDataViewItem& parent_item, const ItemType root_type); + wxDataViewItem AddInstanceRoot(const wxDataViewItem& parent_item); +}; + + +} +} + + +#endif // slic3r_GUI_ObjectDataViewModel_hpp_ diff --git a/src/slic3r/GUI/PresetBundle.cpp b/src/slic3r/GUI/PresetBundle.cpp index 7bfbcd2e6f..0c187e871e 100644 --- a/src/slic3r/GUI/PresetBundle.cpp +++ b/src/slic3r/GUI/PresetBundle.cpp @@ -1529,30 +1529,6 @@ void PresetBundle::set_filament_preset(size_t idx, const std::string &name) filament_presets[idx] = Preset::remove_suffix_modified(name); } -static inline int hex_digit_to_int(const char c) -{ - return - (c >= '0' && c <= '9') ? int(c - '0') : - (c >= 'A' && c <= 'F') ? int(c - 'A') + 10 : - (c >= 'a' && c <= 'f') ? int(c - 'a') + 10 : -1; -} - -bool PresetBundle::parse_color(const std::string &scolor, unsigned char *rgb_out) -{ - rgb_out[0] = rgb_out[1] = rgb_out[2] = 0; - if (scolor.size() != 7 || scolor.front() != '#') - return false; - const char *c = scolor.data() + 1; - for (size_t i = 0; i < 3; ++ i) { - int digit1 = hex_digit_to_int(*c ++); - int digit2 = hex_digit_to_int(*c ++); - if (digit1 == -1 || digit2 == -1) - return false; - rgb_out[i] = (unsigned char)(digit1 * 16 + digit2); - } - return true; -} - void PresetBundle::load_default_preset_bitmaps() { // Clear bitmap cache, before load new scaled default preset bitmaps @@ -1580,7 +1556,7 @@ void PresetBundle::update_plater_filament_ui(unsigned int idx_extruder, GUI::Pre unsigned char rgb[3]; std::string extruder_color = this->printers.get_edited_preset().config.opt_string("extruder_colour", idx_extruder); - if (! parse_color(extruder_color, rgb)) + if (!m_bitmapCache->parse_color(extruder_color, rgb)) // Extruder color is not defined. extruder_color.clear(); @@ -1650,10 +1626,10 @@ void PresetBundle::update_plater_filament_ui(unsigned int idx_extruder, GUI::Pre // Paint a red flag for incompatible presets. bmps.emplace_back(preset.is_compatible ? m_bitmapCache->mkclear(normal_icon_width, icon_height) : *m_bitmapIncompatible); // Paint the color bars. - parse_color(filament_rgb, rgb); + m_bitmapCache->parse_color(filament_rgb, rgb); bmps.emplace_back(m_bitmapCache->mksolid(single_bar ? wide_icon_width : normal_icon_width, icon_height, rgb)); if (! single_bar) { - parse_color(extruder_rgb, rgb); + m_bitmapCache->parse_color(extruder_rgb, rgb); bmps.emplace_back(m_bitmapCache->mksolid(thin_icon_width, icon_height, rgb)); } // Paint a lock at the system presets. diff --git a/src/slic3r/GUI/PresetBundle.hpp b/src/slic3r/GUI/PresetBundle.hpp index bf64e0d34c..b818107338 100644 --- a/src/slic3r/GUI/PresetBundle.hpp +++ b/src/slic3r/GUI/PresetBundle.hpp @@ -129,8 +129,6 @@ public: // preset if the current print or filament preset is not compatible. void update_compatible(bool select_other_if_incompatible); - static bool parse_color(const std::string &scolor, unsigned char *rgb_out); - void load_default_preset_bitmaps(); // Set the is_visible flag for printer vendors, printer models and printer variants diff --git a/src/slic3r/GUI/WipeTowerDialog.cpp b/src/slic3r/GUI/WipeTowerDialog.cpp index 5394225456..970cd85284 100644 --- a/src/slic3r/GUI/WipeTowerDialog.cpp +++ b/src/slic3r/GUI/WipeTowerDialog.cpp @@ -1,7 +1,7 @@ #include #include #include "WipeTowerDialog.hpp" -#include "PresetBundle.hpp" +#include "BitmapCache.hpp" #include "GUI.hpp" #include "I18N.hpp" #include "GUI_App.hpp" @@ -191,7 +191,7 @@ WipingPanel::WipingPanel(wxWindow* parent, const std::vector& matrix, con for (const std::string& color : extruder_colours) { unsigned char rgb[3]; - Slic3r::PresetBundle::parse_color(color, rgb); + Slic3r::GUI::BitmapCache::parse_color(color, rgb); m_colours.push_back(wxColor(rgb[0], rgb[1], rgb[2])); } diff --git a/src/slic3r/GUI/wxExtensions.cpp b/src/slic3r/GUI/wxExtensions.cpp index a461f16fac..399fcdf036 100644 --- a/src/slic3r/GUI/wxExtensions.cpp +++ b/src/slic3r/GUI/wxExtensions.cpp @@ -3,16 +3,7 @@ #include #include -#include "libslic3r/Utils.hpp" -#include "libslic3r/Model.hpp" -#include "libslic3r/Print.hpp" - #include -#include -#include -#include -#include -#include #include @@ -20,18 +11,10 @@ #include "GUI.hpp" #include "GUI_App.hpp" #include "GUI_ObjectList.hpp" -#include "libslic3r/GCode/PreviewData.hpp" #include "I18N.hpp" #include "GUI_Utils.hpp" -#include "PresetBundle.hpp" -#include "ExtruderSequenceDialog.hpp" #include "../Utils/MacDarkMode.hpp" -using Slic3r::GUI::from_u8; -using Slic3r::GUI::into_u8; - -wxDEFINE_EVENT(wxCUSTOMEVT_LAST_VOLUME_IS_DELETED, wxCommandEvent); - #ifndef __WXGTK__// msw_menuitem_bitmaps is used for MSW and OSX static std::map msw_menuitem_bitmaps; #ifdef __WXMSW__ @@ -525,10 +508,10 @@ wxBitmap create_scaled_bitmap( const std::string& bmp_name_in, return *bmp; } - -Slic3r::GUI::BitmapCache* m_bitmap_cache = nullptr; std::vector get_extruder_color_icons(bool thin_icon/* = false*/) { + static Slic3r::GUI::BitmapCache bmp_cache; + // Create the bitmap with color bars. std::vector bmps; std::vector colors = Slic3r::GUI::wxGetApp().plater()->get_extruder_colors_from_plater_config(); @@ -550,12 +533,12 @@ std::vector get_extruder_color_icons(bool thin_icon/* = false*/) { std::string bitmap_key = color + "-h" + std::to_string(icon_height) + "-w" + std::to_string(icon_width); - wxBitmap* bitmap = m_bitmap_cache->find(bitmap_key); + wxBitmap* bitmap = bmp_cache.find(bitmap_key); if (bitmap == nullptr) { // Paint the color icon. - Slic3r::PresetBundle::parse_color(color, rgb); + Slic3r::GUI::BitmapCache::parse_color(color, rgb); // there is no neede to scale created solid bitmap - bitmap = m_bitmap_cache->insert(bitmap_key, m_bitmap_cache->mksolid(icon_width, icon_height, rgb, true)); + bitmap = bmp_cache.insert(bitmap_key, bmp_cache.mksolid(icon_width, icon_height, rgb, true)); } bmps.emplace_back(bitmap); } @@ -564,16 +547,6 @@ std::vector get_extruder_color_icons(bool thin_icon/* = false*/) } -static wxBitmap get_extruder_color_icon(size_t extruder_idx, bool thin_icon = false) -{ - // Create the bitmap with color bars. - std::vector bmps = get_extruder_color_icons(thin_icon); - if (bmps.empty()) - return wxNullBitmap; - - return *bmps[extruder_idx >= bmps.size() ? 0 : extruder_idx]; -} - void apply_extruder_selector(wxBitmapComboBox** ctrl, wxWindow* parent, const std::string& first_item/* = ""*/, @@ -620,1735 +593,6 @@ void apply_extruder_selector(wxBitmapComboBox** ctrl, } -// ***************************************************************************** -// ---------------------------------------------------------------------------- -// ObjectDataViewModelNode -// ---------------------------------------------------------------------------- - -void ObjectDataViewModelNode::init_container() -{ -#ifdef __WXGTK__ - // it's necessary on GTK because of control have to know if this item will be container - // in another case you couldn't to add subitem for this item - // it will be produce "segmentation fault" - m_container = true; -#endif //__WXGTK__ -} - -#define LAYER_ROOT_ICON "edit_layers_all" -#define LAYER_ICON "edit_layers_some" - -ObjectDataViewModelNode::ObjectDataViewModelNode(ObjectDataViewModelNode* parent, const ItemType type) : - m_parent(parent), - m_type(type), - m_extruder(wxEmptyString) -{ - if (type == itSettings) - m_name = "Settings to modified"; - else if (type == itInstanceRoot) - m_name = _(L("Instances")); - else if (type == itInstance) - { - m_idx = parent->GetChildCount(); - m_name = wxString::Format(_(L("Instance %d")), m_idx + 1); - - set_action_and_extruder_icons(); - } - else if (type == itLayerRoot) - { - m_bmp = create_scaled_bitmap(LAYER_ROOT_ICON); // FIXME: pass window ptr - m_name = _(L("Layers")); - } - - if (type & (itInstanceRoot | itLayerRoot)) - init_container(); -} - -ObjectDataViewModelNode::ObjectDataViewModelNode(ObjectDataViewModelNode* parent, - const t_layer_height_range& layer_range, - const int idx /*= -1 */, - const wxString& extruder) : - m_parent(parent), - m_type(itLayer), - m_idx(idx), - m_layer_range(layer_range), - m_extruder(extruder) -{ - const int children_cnt = parent->GetChildCount(); - if (idx < 0) - m_idx = children_cnt; - else - { - // update indexes for another Laeyr Nodes - for (int i = m_idx; i < children_cnt; i++) - parent->GetNthChild(i)->SetIdx(i + 1); - } - const std::string label_range = (boost::format(" %.2f-%.2f ") % layer_range.first % layer_range.second).str(); - m_name = _(L("Range")) + label_range + "(" + _(L("mm")) + ")"; - m_bmp = create_scaled_bitmap(LAYER_ICON); // FIXME: pass window ptr - - set_action_and_extruder_icons(); - init_container(); -} - -#ifndef NDEBUG -bool ObjectDataViewModelNode::valid() -{ - // Verify that the object was not deleted yet. - assert(m_idx >= -1); - return m_idx >= -1; -} -#endif /* NDEBUG */ - -void ObjectDataViewModelNode::set_action_and_extruder_icons() -{ - m_action_icon_name = m_type & itObject ? "advanced_plus" : - m_type & (itVolume | itLayer) ? "cog" : /*m_type & itInstance*/ "set_separate_obj"; - m_action_icon = create_scaled_bitmap(m_action_icon_name); // FIXME: pass window ptr - - if (m_type & itInstance) - return; // don't set colored bitmap for Instance - - // set extruder bitmap - int extruder_idx = atoi(m_extruder.c_str()); - if (extruder_idx > 0) --extruder_idx; - m_extruder_bmp = get_extruder_color_icon(extruder_idx); -} - -void ObjectDataViewModelNode::set_printable_icon(PrintIndicator printable) -{ - m_printable = printable; - m_printable_icon = m_printable == piUndef ? m_empty_bmp : - create_scaled_bitmap(m_printable == piPrintable ? "eye_open.png" : "eye_closed.png"); -} - -void ObjectDataViewModelNode::update_settings_digest_bitmaps() -{ - m_bmp = m_empty_bmp; - - std::map& categories_icon = Slic3r::GUI::wxGetApp().obj_list()->CATEGORY_ICON; - - std::string scaled_bitmap_name = m_name.ToUTF8().data(); - scaled_bitmap_name += "-em" + std::to_string(Slic3r::GUI::wxGetApp().em_unit()); - - wxBitmap *bmp = m_bitmap_cache->find(scaled_bitmap_name); - if (bmp == nullptr) { - std::vector bmps; - for (auto& cat : m_opt_categories) - bmps.emplace_back( categories_icon.find(cat) == categories_icon.end() ? - wxNullBitmap : categories_icon.at(cat)); - bmp = m_bitmap_cache->insert(scaled_bitmap_name, bmps); - } - - m_bmp = *bmp; -} - -bool ObjectDataViewModelNode::update_settings_digest(const std::vector& categories) -{ - if (m_type != itSettings || m_opt_categories == categories) - return false; - - m_opt_categories = categories; - m_name = wxEmptyString; - - for (auto& cat : m_opt_categories) - m_name += _(cat) + "; "; - if (!m_name.IsEmpty()) - m_name.erase(m_name.Length()-2, 2); // Delete last "; " - - update_settings_digest_bitmaps(); - - return true; -} - -void ObjectDataViewModelNode::msw_rescale() -{ - if (!m_action_icon_name.empty()) - m_action_icon = create_scaled_bitmap(m_action_icon_name); - - if (m_printable != piUndef) - m_printable_icon = create_scaled_bitmap(m_printable == piPrintable ? "eye_open.png" : "eye_closed.png"); - - if (!m_opt_categories.empty()) - update_settings_digest_bitmaps(); -} - -bool ObjectDataViewModelNode::SetValue(const wxVariant& variant, unsigned col) -{ - switch (col) - { - case colPrint: - m_printable_icon << variant; - return true; - case colName: { - DataViewBitmapText data; - data << variant; - m_bmp = data.GetBitmap(); - m_name = data.GetText(); - return true; } - case colExtruder: { - DataViewBitmapText data; - data << variant; - m_extruder_bmp = data.GetBitmap(); - m_extruder = data.GetText() == "0" ? _(L("default")) : data.GetText(); - return true; } - case colEditing: - m_action_icon << variant; - return true; - default: - printf("MyObjectTreeModel::SetValue: wrong column"); - } - return false; -} - -void ObjectDataViewModelNode::SetIdx(const int& idx) -{ - m_idx = idx; - // update name if this node is instance - if (m_type == itInstance) - m_name = wxString::Format(_(L("Instance %d")), m_idx + 1); -} - -// ***************************************************************************** -// ---------------------------------------------------------------------------- -// ObjectDataViewModel -// ---------------------------------------------------------------------------- - -static int get_root_idx(ObjectDataViewModelNode *parent_node, const ItemType root_type) -{ - // because of istance_root and layers_root are at the end of the list, so - // start locking from the end - for (int root_idx = parent_node->GetChildCount() - 1; root_idx >= 0; root_idx--) - { - // if there is SettingsItem or VolumeItem, then RootItems don't exist in current ObjectItem - if (parent_node->GetNthChild(root_idx)->GetType() & (itSettings | itVolume)) - break; - if (parent_node->GetNthChild(root_idx)->GetType() & root_type) - return root_idx; - } - - return -1; -} - -ObjectDataViewModel::ObjectDataViewModel() -{ - m_bitmap_cache = new Slic3r::GUI::BitmapCache; -} - -ObjectDataViewModel::~ObjectDataViewModel() -{ - for (auto object : m_objects) - delete object; - delete m_bitmap_cache; - m_bitmap_cache = nullptr; -} - -wxDataViewItem ObjectDataViewModel::Add(const wxString &name, - const int extruder, - const bool has_errors/* = false*/) -{ - const wxString extruder_str = extruder == 0 ? _(L("default")) : wxString::Format("%d", extruder); - auto root = new ObjectDataViewModelNode(name, extruder_str); - // Add error icon if detected auto-repaire - if (has_errors) - root->m_bmp = *m_warning_bmp; - - m_objects.push_back(root); - // notify control - wxDataViewItem child((void*)root); - wxDataViewItem parent((void*)NULL); - - ItemAdded(parent, child); - return child; -} - -wxDataViewItem ObjectDataViewModel::AddVolumeChild( const wxDataViewItem &parent_item, - const wxString &name, - const Slic3r::ModelVolumeType volume_type, - const bool has_errors/* = false*/, - const int extruder/* = 0*/, - const bool create_frst_child/* = true*/) -{ - ObjectDataViewModelNode *root = (ObjectDataViewModelNode*)parent_item.GetID(); - if (!root) return wxDataViewItem(0); - - wxString extruder_str = extruder == 0 ? _(L("default")) : wxString::Format("%d", extruder); - - // get insertion position according to the existed Layers and/or Instances Items - int insert_position = get_root_idx(root, itLayerRoot); - if (insert_position < 0) - insert_position = get_root_idx(root, itInstanceRoot); - - const bool obj_errors = root->m_bmp.IsOk(); - - if (create_frst_child && root->m_volumes_cnt == 0) - { - const Slic3r::ModelVolumeType type = Slic3r::ModelVolumeType::MODEL_PART; - const auto node = new ObjectDataViewModelNode(root, root->m_name, GetVolumeIcon(type, obj_errors), extruder_str, 0); - node->m_volume_type = type; - - insert_position < 0 ? root->Append(node) : root->Insert(node, insert_position); - // notify control - const wxDataViewItem child((void*)node); - ItemAdded(parent_item, child); - - root->m_volumes_cnt++; - if (insert_position >= 0) insert_position++; - } - - const auto node = new ObjectDataViewModelNode(root, name, GetVolumeIcon(volume_type, has_errors), extruder_str, root->m_volumes_cnt); - insert_position < 0 ? root->Append(node) : root->Insert(node, insert_position); - - // if part with errors is added, but object wasn't marked, then mark it - if (!obj_errors && has_errors) - root->SetBitmap(*m_warning_bmp); - - // notify control - const wxDataViewItem child((void*)node); - ItemAdded(parent_item, child); - root->m_volumes_cnt++; - - node->m_volume_type = volume_type; - - return child; -} - -wxDataViewItem ObjectDataViewModel::AddSettingsChild(const wxDataViewItem &parent_item) -{ - ObjectDataViewModelNode *root = (ObjectDataViewModelNode*)parent_item.GetID(); - if (!root) return wxDataViewItem(0); - - const auto node = new ObjectDataViewModelNode(root, itSettings); - root->Insert(node, 0); - // notify control - const wxDataViewItem child((void*)node); - ItemAdded(parent_item, child); - return child; -} - -/* return values: - * true => root_node is created and added to the parent_root - * false => root node alredy exists -*/ -static bool append_root_node(ObjectDataViewModelNode *parent_node, - ObjectDataViewModelNode **root_node, - const ItemType root_type) -{ - const int inst_root_id = get_root_idx(parent_node, root_type); - - *root_node = inst_root_id < 0 ? - new ObjectDataViewModelNode(parent_node, root_type) : - parent_node->GetNthChild(inst_root_id); - - if (inst_root_id < 0) { - if ((root_type&itInstanceRoot) || - ( (root_type&itLayerRoot) && get_root_idx(parent_node, itInstanceRoot)<0) ) - parent_node->Append(*root_node); - else if (root_type&itLayerRoot) - parent_node->Insert(*root_node, static_cast(get_root_idx(parent_node, itInstanceRoot))); - return true; - } - - return false; -} - -wxDataViewItem ObjectDataViewModel::AddRoot(const wxDataViewItem &parent_item, ItemType root_type) -{ - ObjectDataViewModelNode *parent_node = (ObjectDataViewModelNode*)parent_item.GetID(); - if (!parent_node) return wxDataViewItem(0); - - // get InstanceRoot node - ObjectDataViewModelNode *root_node { nullptr }; - const bool appended = append_root_node(parent_node, &root_node, root_type); - if (!root_node) return wxDataViewItem(0); - - const wxDataViewItem root_item((void*)root_node); - - if (appended) - ItemAdded(parent_item, root_item);// notify control - return root_item; -} - -wxDataViewItem ObjectDataViewModel::AddInstanceRoot(const wxDataViewItem &parent_item) -{ - return AddRoot(parent_item, itInstanceRoot); -} - -wxDataViewItem ObjectDataViewModel::AddInstanceChild(const wxDataViewItem &parent_item, size_t num) -{ - std::vector print_indicator(num, true); - - // if InstanceRoot item isn't created for this moment - if (!GetInstanceRootItem(parent_item).IsOk()) - // use object's printable state to first instance - print_indicator[0] = IsPrintable(parent_item); - - return wxDataViewItem((void*)AddInstanceChild(parent_item, print_indicator)); -} - -wxDataViewItem ObjectDataViewModel::AddInstanceChild(const wxDataViewItem& parent_item, - const std::vector& print_indicator) -{ - const wxDataViewItem inst_root_item = AddInstanceRoot(parent_item); - if (!inst_root_item) return wxDataViewItem(0); - - ObjectDataViewModelNode* inst_root_node = (ObjectDataViewModelNode*)inst_root_item.GetID(); - - // Add instance nodes - ObjectDataViewModelNode *instance_node = nullptr; - size_t counter = 0; - while (counter < print_indicator.size()) { - instance_node = new ObjectDataViewModelNode(inst_root_node, itInstance); - - instance_node->set_printable_icon(print_indicator[counter] ? piPrintable : piUnprintable); - - inst_root_node->Append(instance_node); - // notify control - const wxDataViewItem instance_item((void*)instance_node); - ItemAdded(inst_root_item, instance_item); - ++counter; - } - - // update object_node printable property - UpdateObjectPrintable(parent_item); - - return wxDataViewItem((void*)instance_node); -} - -void ObjectDataViewModel::UpdateObjectPrintable(wxDataViewItem parent_item) -{ - const wxDataViewItem inst_root_item = GetInstanceRootItem(parent_item); - if (!inst_root_item) - return; - - ObjectDataViewModelNode* inst_root_node = (ObjectDataViewModelNode*)inst_root_item.GetID(); - - const size_t child_cnt = inst_root_node->GetChildren().Count(); - PrintIndicator obj_pi = piUnprintable; - for (size_t i=0; i < child_cnt; i++) - if (inst_root_node->GetNthChild(i)->IsPrintable() & piPrintable) { - obj_pi = piPrintable; - break; - } - // and set printable state for object_node to piUndef - ObjectDataViewModelNode* obj_node = (ObjectDataViewModelNode*)parent_item.GetID(); - obj_node->set_printable_icon(obj_pi); - ItemChanged(parent_item); -} - -// update printable property for all instances from object -void ObjectDataViewModel::UpdateInstancesPrintable(wxDataViewItem parent_item) -{ - const wxDataViewItem inst_root_item = GetInstanceRootItem(parent_item); - if (!inst_root_item) - return; - - ObjectDataViewModelNode* obj_node = (ObjectDataViewModelNode*)parent_item.GetID(); - const PrintIndicator obj_pi = obj_node->IsPrintable(); - - ObjectDataViewModelNode* inst_root_node = (ObjectDataViewModelNode*)inst_root_item.GetID(); - const size_t child_cnt = inst_root_node->GetChildren().Count(); - - for (size_t i=0; i < child_cnt; i++) - { - ObjectDataViewModelNode* inst_node = inst_root_node->GetNthChild(i); - // and set printable state for object_node to piUndef - inst_node->set_printable_icon(obj_pi); - ItemChanged(wxDataViewItem((void*)inst_node)); - } -} - -bool ObjectDataViewModel::IsPrintable(const wxDataViewItem& item) const -{ - ObjectDataViewModelNode* node = (ObjectDataViewModelNode*)item.GetID(); - if (!node) - return false; - - return node->IsPrintable() == piPrintable; -} - -wxDataViewItem ObjectDataViewModel::AddLayersRoot(const wxDataViewItem &parent_item) -{ - return AddRoot(parent_item, itLayerRoot); -} - -wxDataViewItem ObjectDataViewModel::AddLayersChild(const wxDataViewItem &parent_item, - const t_layer_height_range& layer_range, - const int extruder/* = 0*/, - const int index /* = -1*/) -{ - ObjectDataViewModelNode *parent_node = (ObjectDataViewModelNode*)parent_item.GetID(); - if (!parent_node) return wxDataViewItem(0); - - wxString extruder_str = extruder == 0 ? _(L("default")) : wxString::Format("%d", extruder); - - // get LayerRoot node - ObjectDataViewModelNode *layer_root_node; - wxDataViewItem layer_root_item; - - if (parent_node->GetType() & itLayerRoot) { - layer_root_node = parent_node; - layer_root_item = parent_item; - } - else { - const int root_idx = get_root_idx(parent_node, itLayerRoot); - if (root_idx < 0) return wxDataViewItem(0); - layer_root_node = parent_node->GetNthChild(root_idx); - layer_root_item = wxDataViewItem((void*)layer_root_node); - } - - // Add layer node - ObjectDataViewModelNode *layer_node = new ObjectDataViewModelNode(layer_root_node, layer_range, index, extruder_str); - if (index < 0) - layer_root_node->Append(layer_node); - else - layer_root_node->Insert(layer_node, index); - - // notify control - const wxDataViewItem layer_item((void*)layer_node); - ItemAdded(layer_root_item, layer_item); - - return layer_item; -} - -wxDataViewItem ObjectDataViewModel::Delete(const wxDataViewItem &item) -{ - auto ret_item = wxDataViewItem(0); - ObjectDataViewModelNode *node = (ObjectDataViewModelNode*)item.GetID(); - if (!node) // happens if item.IsOk()==false - return ret_item; - - auto node_parent = node->GetParent(); - wxDataViewItem parent(node_parent); - - // first remove the node from the parent's array of children; - // NOTE: MyObjectTreeModelNodePtrArray is only an array of _pointers_ - // thus removing the node from it doesn't result in freeing it - if (node_parent) { - if (node->m_type & (itInstanceRoot|itLayerRoot)) - { - // node can be deleted by the Delete, let's check its type while we safely can - bool is_instance_root = (node->m_type & itInstanceRoot); - - for (int i = int(node->GetChildCount() - 1); i >= (is_instance_root ? 1 : 0); i--) - Delete(wxDataViewItem(node->GetNthChild(i))); - - return parent; - } - - auto id = node_parent->GetChildren().Index(node); - auto idx = node->GetIdx(); - - - if (node->m_type & (itVolume|itLayer)) { - node_parent->m_volumes_cnt--; - DeleteSettings(item); - } - node_parent->GetChildren().Remove(node); - - if (id > 0) { - if (size_t(id) == node_parent->GetChildCount()) id--; - ret_item = wxDataViewItem(node_parent->GetChildren().Item(id)); - } - - //update idx value for remaining child-nodes - auto children = node_parent->GetChildren(); - for (size_t i = 0; i < node_parent->GetChildCount() && idx>=0; i++) - { - auto cur_idx = children[i]->GetIdx(); - if (cur_idx > idx) - children[i]->SetIdx(cur_idx-1); - } - - // if there is last instance item, delete both of it and instance root item - if (node_parent->GetChildCount() == 1 && node_parent->GetNthChild(0)->m_type == itInstance) - { - delete node; - ItemDeleted(parent, item); - - ObjectDataViewModelNode *last_instance_node = node_parent->GetNthChild(0); - PrintIndicator last_instance_printable = last_instance_node->IsPrintable(); - node_parent->GetChildren().Remove(last_instance_node); - delete last_instance_node; - ItemDeleted(parent, wxDataViewItem(last_instance_node)); - - ObjectDataViewModelNode *obj_node = node_parent->GetParent(); - obj_node->set_printable_icon(last_instance_printable); - obj_node->GetChildren().Remove(node_parent); - delete node_parent; - ret_item = wxDataViewItem(obj_node); - -#ifndef __WXGTK__ - if (obj_node->GetChildCount() == 0) - obj_node->m_container = false; -#endif //__WXGTK__ - ItemDeleted(ret_item, wxDataViewItem(node_parent)); - return ret_item; - } - - if (node->m_type & itInstance) - UpdateObjectPrintable(wxDataViewItem(node_parent->GetParent())); - - // if there was last layer item, delete this one and layers root item - if (node_parent->GetChildCount() == 0 && node_parent->m_type == itLayerRoot) - { - ObjectDataViewModelNode *obj_node = node_parent->GetParent(); - obj_node->GetChildren().Remove(node_parent); - delete node_parent; - ret_item = wxDataViewItem(obj_node); - -#ifndef __WXGTK__ - if (obj_node->GetChildCount() == 0) - obj_node->m_container = false; -#endif //__WXGTK__ - ItemDeleted(ret_item, wxDataViewItem(node_parent)); - return ret_item; - } - - // if there is last volume item after deleting, delete this last volume too - if (node_parent->GetChildCount() <= 3) // 3??? #ys_FIXME - { - int vol_cnt = 0; - int vol_idx = 0; - for (size_t i = 0; i < node_parent->GetChildCount(); ++i) { - if (node_parent->GetNthChild(i)->GetType() == itVolume) { - vol_idx = i; - vol_cnt++; - } - if (vol_cnt > 1) - break; - } - - if (vol_cnt == 1) { - delete node; - ItemDeleted(parent, item); - - ObjectDataViewModelNode *last_child_node = node_parent->GetNthChild(vol_idx); - DeleteSettings(wxDataViewItem(last_child_node)); - node_parent->GetChildren().Remove(last_child_node); - node_parent->m_volumes_cnt = 0; - delete last_child_node; - -#ifndef __WXGTK__ - if (node_parent->GetChildCount() == 0) - node_parent->m_container = false; -#endif //__WXGTK__ - ItemDeleted(parent, wxDataViewItem(last_child_node)); - - wxCommandEvent event(wxCUSTOMEVT_LAST_VOLUME_IS_DELETED); - auto it = find(m_objects.begin(), m_objects.end(), node_parent); - event.SetInt(it == m_objects.end() ? -1 : it - m_objects.begin()); - wxPostEvent(m_ctrl, event); - - ret_item = parent; - - return ret_item; - } - } - } - else - { - auto it = find(m_objects.begin(), m_objects.end(), node); - size_t id = it - m_objects.begin(); - if (it != m_objects.end()) - { - // Delete all sub-items - int i = m_objects[id]->GetChildCount() - 1; - while (i >= 0) { - Delete(wxDataViewItem(m_objects[id]->GetNthChild(i))); - i = m_objects[id]->GetChildCount() - 1; - } - m_objects.erase(it); - } - if (id > 0) { - if(id == m_objects.size()) id--; - ret_item = wxDataViewItem(m_objects[id]); - } - } - // free the node - delete node; - - // set m_containet to FALSE if parent has no child - if (node_parent) { -#ifndef __WXGTK__ - if (node_parent->GetChildCount() == 0) - node_parent->m_container = false; -#endif //__WXGTK__ - ret_item = parent; - } - - // notify control - ItemDeleted(parent, item); - return ret_item; -} - -wxDataViewItem ObjectDataViewModel::DeleteLastInstance(const wxDataViewItem &parent_item, size_t num) -{ - auto ret_item = wxDataViewItem(0); - ObjectDataViewModelNode *parent_node = (ObjectDataViewModelNode*)parent_item.GetID(); - if (!parent_node) return ret_item; - - const int inst_root_id = get_root_idx(parent_node, itInstanceRoot); - if (inst_root_id < 0) return ret_item; - - wxDataViewItemArray items; - ObjectDataViewModelNode *inst_root_node = parent_node->GetNthChild(inst_root_id); - const wxDataViewItem inst_root_item((void*)inst_root_node); - - const int inst_cnt = inst_root_node->GetChildCount(); - const bool delete_inst_root_item = inst_cnt - num < 2 ? true : false; - - PrintIndicator last_inst_printable = piUndef; - - int stop = delete_inst_root_item ? 0 : inst_cnt - num; - for (int i = inst_cnt - 1; i >= stop;--i) { - ObjectDataViewModelNode *last_instance_node = inst_root_node->GetNthChild(i); - if (i==0) last_inst_printable = last_instance_node->IsPrintable(); - inst_root_node->GetChildren().Remove(last_instance_node); - delete last_instance_node; - ItemDeleted(inst_root_item, wxDataViewItem(last_instance_node)); - } - - if (delete_inst_root_item) { - ret_item = parent_item; - parent_node->GetChildren().Remove(inst_root_node); - parent_node->set_printable_icon(last_inst_printable); - ItemDeleted(parent_item, inst_root_item); - ItemChanged(parent_item); -#ifndef __WXGTK__ - if (parent_node->GetChildCount() == 0) - parent_node->m_container = false; -#endif //__WXGTK__ - } - - // update object_node printable property - UpdateObjectPrintable(parent_item); - - return ret_item; -} - -void ObjectDataViewModel::DeleteAll() -{ - while (!m_objects.empty()) - { - auto object = m_objects.back(); -// object->RemoveAllChildren(); - Delete(wxDataViewItem(object)); - } -} - -void ObjectDataViewModel::DeleteChildren(wxDataViewItem& parent) -{ - ObjectDataViewModelNode *root = (ObjectDataViewModelNode*)parent.GetID(); - if (!root) // happens if item.IsOk()==false - return; - - // first remove the node from the parent's array of children; - // NOTE: MyObjectTreeModelNodePtrArray is only an array of _pointers_ - // thus removing the node from it doesn't result in freeing it - auto& children = root->GetChildren(); - for (int id = root->GetChildCount() - 1; id >= 0; --id) - { - auto node = children[id]; - auto item = wxDataViewItem(node); - children.RemoveAt(id); - - if (node->m_type == itVolume) - root->m_volumes_cnt--; - - // free the node - delete node; - - // notify control - ItemDeleted(parent, item); - } - - // set m_containet to FALSE if parent has no child -#ifndef __WXGTK__ - root->m_container = false; -#endif //__WXGTK__ -} - -void ObjectDataViewModel::DeleteVolumeChildren(wxDataViewItem& parent) -{ - ObjectDataViewModelNode *root = (ObjectDataViewModelNode*)parent.GetID(); - if (!root) // happens if item.IsOk()==false - return; - - // first remove the node from the parent's array of children; - // NOTE: MyObjectTreeModelNodePtrArray is only an array of _pointers_ - // thus removing the node from it doesn't result in freeing it - auto& children = root->GetChildren(); - for (int id = root->GetChildCount() - 1; id >= 0; --id) - { - auto node = children[id]; - if (node->m_type != itVolume) - continue; - - auto item = wxDataViewItem(node); - DeleteSettings(item); - children.RemoveAt(id); - - // free the node - delete node; - - // notify control - ItemDeleted(parent, item); - } - root->m_volumes_cnt = 0; - - // set m_containet to FALSE if parent has no child -#ifndef __WXGTK__ - root->m_container = false; -#endif //__WXGTK__ -} - -void ObjectDataViewModel::DeleteSettings(const wxDataViewItem& parent) -{ - ObjectDataViewModelNode *node = (ObjectDataViewModelNode*)parent.GetID(); - if (!node) return; - - // if volume has a "settings"item, than delete it before volume deleting - if (node->GetChildCount() > 0 && node->GetNthChild(0)->GetType() == itSettings) { - auto settings_node = node->GetNthChild(0); - auto settings_item = wxDataViewItem(settings_node); - node->GetChildren().RemoveAt(0); - delete settings_node; - ItemDeleted(parent, settings_item); - } -} - -wxDataViewItem ObjectDataViewModel::GetItemById(int obj_idx) -{ - if (size_t(obj_idx) >= m_objects.size()) - { - printf("Error! Out of objects range.\n"); - return wxDataViewItem(0); - } - return wxDataViewItem(m_objects[obj_idx]); -} - - -wxDataViewItem ObjectDataViewModel::GetItemByVolumeId(int obj_idx, int volume_idx) -{ - if (size_t(obj_idx) >= m_objects.size()) { - printf("Error! Out of objects range.\n"); - return wxDataViewItem(0); - } - - auto parent = m_objects[obj_idx]; - if (parent->GetChildCount() == 0 || - (parent->GetChildCount() == 1 && parent->GetNthChild(0)->GetType() & itSettings )) { - if (volume_idx == 0) - return GetItemById(obj_idx); - - printf("Error! Object has no one volume.\n"); - return wxDataViewItem(0); - } - - for (size_t i = 0; i < parent->GetChildCount(); i++) - if (parent->GetNthChild(i)->m_idx == volume_idx && parent->GetNthChild(i)->GetType() & itVolume) - return wxDataViewItem(parent->GetNthChild(i)); - - return wxDataViewItem(0); -} - -wxDataViewItem ObjectDataViewModel::GetItemById(const int obj_idx, const int sub_obj_idx, const ItemType parent_type) -{ - if (size_t(obj_idx) >= m_objects.size()) { - printf("Error! Out of objects range.\n"); - return wxDataViewItem(0); - } - - auto item = GetItemByType(wxDataViewItem(m_objects[obj_idx]), parent_type); - if (!item) - return wxDataViewItem(0); - - auto parent = (ObjectDataViewModelNode*)item.GetID(); - for (size_t i = 0; i < parent->GetChildCount(); i++) - if (parent->GetNthChild(i)->m_idx == sub_obj_idx) - return wxDataViewItem(parent->GetNthChild(i)); - - return wxDataViewItem(0); -} - -wxDataViewItem ObjectDataViewModel::GetItemByInstanceId(int obj_idx, int inst_idx) -{ - return GetItemById(obj_idx, inst_idx, itInstanceRoot); -} - -wxDataViewItem ObjectDataViewModel::GetItemByLayerId(int obj_idx, int layer_idx) -{ - return GetItemById(obj_idx, layer_idx, itLayerRoot); -} - -wxDataViewItem ObjectDataViewModel::GetItemByLayerRange(const int obj_idx, const t_layer_height_range& layer_range) -{ - if (size_t(obj_idx) >= m_objects.size()) { - printf("Error! Out of objects range.\n"); - return wxDataViewItem(0); - } - - auto item = GetItemByType(wxDataViewItem(m_objects[obj_idx]), itLayerRoot); - if (!item) - return wxDataViewItem(0); - - auto parent = (ObjectDataViewModelNode*)item.GetID(); - for (size_t i = 0; i < parent->GetChildCount(); i++) - if (parent->GetNthChild(i)->m_layer_range == layer_range) - return wxDataViewItem(parent->GetNthChild(i)); - - return wxDataViewItem(0); -} - -int ObjectDataViewModel::GetItemIdByLayerRange(const int obj_idx, const t_layer_height_range& layer_range) -{ - wxDataViewItem item = GetItemByLayerRange(obj_idx, layer_range); - if (!item) - return -1; - - return GetLayerIdByItem(item); -} - -int ObjectDataViewModel::GetIdByItem(const wxDataViewItem& item) const -{ - if(!item.IsOk()) - return -1; - - ObjectDataViewModelNode *node = (ObjectDataViewModelNode*)item.GetID(); - auto it = find(m_objects.begin(), m_objects.end(), node); - if (it == m_objects.end()) - return -1; - - return it - m_objects.begin(); -} - -int ObjectDataViewModel::GetIdByItemAndType(const wxDataViewItem& item, const ItemType type) const -{ - wxASSERT(item.IsOk()); - - ObjectDataViewModelNode *node = (ObjectDataViewModelNode*)item.GetID(); - if (!node || node->m_type != type) - return -1; - return node->GetIdx(); -} - -int ObjectDataViewModel::GetObjectIdByItem(const wxDataViewItem& item) const -{ - return GetIdByItem(GetTopParent(item)); -} - -int ObjectDataViewModel::GetVolumeIdByItem(const wxDataViewItem& item) const -{ - return GetIdByItemAndType(item, itVolume); -} - -int ObjectDataViewModel::GetInstanceIdByItem(const wxDataViewItem& item) const -{ - return GetIdByItemAndType(item, itInstance); -} - -int ObjectDataViewModel::GetLayerIdByItem(const wxDataViewItem& item) const -{ - return GetIdByItemAndType(item, itLayer); -} - -t_layer_height_range ObjectDataViewModel::GetLayerRangeByItem(const wxDataViewItem& item) const -{ - wxASSERT(item.IsOk()); - - ObjectDataViewModelNode *node = (ObjectDataViewModelNode*)item.GetID(); - if (!node || node->m_type != itLayer) - return { 0.0f, 0.0f }; - return node->GetLayerRange(); -} - -bool ObjectDataViewModel::UpdateColumValues(unsigned col) -{ - switch (col) - { - case colPrint: - case colName: - case colEditing: - return true; - case colExtruder: - { - wxDataViewItemArray items; - GetAllChildren(wxDataViewItem(nullptr), items); - - if (items.IsEmpty()) return false; - - for (auto item : items) - UpdateExtruderBitmap(item); - - return true; - } - default: - printf("MyObjectTreeModel::SetValue: wrong column"); - } - return false; -} - - -void ObjectDataViewModel::UpdateExtruderBitmap(wxDataViewItem item) -{ - wxString extruder = GetExtruder(item); - if (extruder.IsEmpty()) - return; - - // set extruder bitmap - int extruder_idx = atoi(extruder.c_str()); - if (extruder_idx > 0) --extruder_idx; - - const DataViewBitmapText extruder_val(extruder, get_extruder_color_icon(extruder_idx)); - - wxVariant value; - value << extruder_val; - - SetValue(value, item, colExtruder); -} - -void ObjectDataViewModel::GetItemInfo(const wxDataViewItem& item, ItemType& type, int& obj_idx, int& idx) -{ - wxASSERT(item.IsOk()); - type = itUndef; - - ObjectDataViewModelNode *node = (ObjectDataViewModelNode*)item.GetID(); - if (!node || - node->GetIdx() <-1 || - ( node->GetIdx() == -1 && - !(node->GetType() & (itObject | itSettings | itInstanceRoot | itLayerRoot/* | itLayer*/)) - ) - ) - return; - - idx = node->GetIdx(); - type = node->GetType(); - - ObjectDataViewModelNode *parent_node = node->GetParent(); - if (!parent_node) return; - - // get top parent (Object) node - while (parent_node->m_type != itObject) - parent_node = parent_node->GetParent(); - - auto it = find(m_objects.begin(), m_objects.end(), parent_node); - if (it != m_objects.end()) - obj_idx = it - m_objects.begin(); - else - type = itUndef; -} - -int ObjectDataViewModel::GetRowByItem(const wxDataViewItem& item) const -{ - if (m_objects.empty()) - return -1; - - int row_num = 0; - - for (size_t i = 0; i < m_objects.size(); i++) - { - row_num++; - if (item == wxDataViewItem(m_objects[i])) - return row_num; - - for (size_t j = 0; j < m_objects[i]->GetChildCount(); j++) - { - row_num++; - ObjectDataViewModelNode* cur_node = m_objects[i]->GetNthChild(j); - if (item == wxDataViewItem(cur_node)) - return row_num; - - if (cur_node->m_type == itVolume && cur_node->GetChildCount() == 1) - row_num++; - if (cur_node->m_type == itInstanceRoot) - { - row_num++; - for (size_t t = 0; t < cur_node->GetChildCount(); t++) - { - row_num++; - if (item == wxDataViewItem(cur_node->GetNthChild(t))) - return row_num; - } - } - } - } - - return -1; -} - -bool ObjectDataViewModel::InvalidItem(const wxDataViewItem& item) -{ - if (!item) - return true; - - ObjectDataViewModelNode* node = (ObjectDataViewModelNode*)item.GetID(); - if (!node || node->invalid()) - return true; - - return false; -} - -wxString ObjectDataViewModel::GetName(const wxDataViewItem &item) const -{ - ObjectDataViewModelNode *node = (ObjectDataViewModelNode*)item.GetID(); - if (!node) // happens if item.IsOk()==false - return wxEmptyString; - - return node->m_name; -} - -wxBitmap& ObjectDataViewModel::GetBitmap(const wxDataViewItem &item) const -{ - ObjectDataViewModelNode *node = (ObjectDataViewModelNode*)item.GetID(); - return node->m_bmp; -} - -wxString ObjectDataViewModel::GetExtruder(const wxDataViewItem& item) const -{ - ObjectDataViewModelNode *node = (ObjectDataViewModelNode*)item.GetID(); - if (!node) // happens if item.IsOk()==false - return wxEmptyString; - - return node->m_extruder; -} - -int ObjectDataViewModel::GetExtruderNumber(const wxDataViewItem& item) const -{ - ObjectDataViewModelNode *node = (ObjectDataViewModelNode*)item.GetID(); - if (!node) // happens if item.IsOk()==false - return 0; - - return atoi(node->m_extruder.c_str()); -} - -void ObjectDataViewModel::GetValue(wxVariant &variant, const wxDataViewItem &item, unsigned int col) const -{ - wxASSERT(item.IsOk()); - - ObjectDataViewModelNode *node = (ObjectDataViewModelNode*)item.GetID(); - switch (col) - { - case colPrint: - variant << node->m_printable_icon; - break; - case colName: - variant << DataViewBitmapText(node->m_name, node->m_bmp); - break; - case colExtruder: - variant << DataViewBitmapText(node->m_extruder, node->m_extruder_bmp); - break; - case colEditing: - variant << node->m_action_icon; - break; - default: - ; - } -} - -bool ObjectDataViewModel::SetValue(const wxVariant &variant, const wxDataViewItem &item, unsigned int col) -{ - wxASSERT(item.IsOk()); - - ObjectDataViewModelNode *node = (ObjectDataViewModelNode*)item.GetID(); - return node->SetValue(variant, col); -} - -bool ObjectDataViewModel::SetValue(const wxVariant &variant, const int item_idx, unsigned int col) -{ - if (size_t(item_idx) >= m_objects.size()) - return false; - - return m_objects[item_idx]->SetValue(variant, col); -} - -void ObjectDataViewModel::SetExtruder(const wxString& extruder, wxDataViewItem item) -{ - DataViewBitmapText extruder_val; - extruder_val.SetText(extruder); - - // set extruder bitmap - int extruder_idx = atoi(extruder.c_str()); - if (extruder_idx > 0) --extruder_idx; - extruder_val.SetBitmap(get_extruder_color_icon(extruder_idx)); - - wxVariant value; - value << extruder_val; - - SetValue(value, item, colExtruder); -} - -wxDataViewItem ObjectDataViewModel::ReorganizeChildren( const int current_volume_id, - const int new_volume_id, - const wxDataViewItem &parent) -{ - auto ret_item = wxDataViewItem(0); - if (current_volume_id == new_volume_id) - return ret_item; - wxASSERT(parent.IsOk()); - ObjectDataViewModelNode *node_parent = (ObjectDataViewModelNode*)parent.GetID(); - if (!node_parent) // happens if item.IsOk()==false - return ret_item; - - const size_t shift = node_parent->GetChildren().Item(0)->m_type == itSettings ? 1 : 0; - - ObjectDataViewModelNode *deleted_node = node_parent->GetNthChild(current_volume_id+shift); - node_parent->GetChildren().Remove(deleted_node); - ItemDeleted(parent, wxDataViewItem(deleted_node)); - node_parent->Insert(deleted_node, new_volume_id+shift); - ItemAdded(parent, wxDataViewItem(deleted_node)); - - //update volume_id value for child-nodes - auto children = node_parent->GetChildren(); - int id_frst = current_volume_id < new_volume_id ? current_volume_id : new_volume_id; - int id_last = current_volume_id > new_volume_id ? current_volume_id : new_volume_id; - for (int id = id_frst; id <= id_last; ++id) - children[id+shift]->SetIdx(id); - - return wxDataViewItem(node_parent->GetNthChild(new_volume_id+shift)); -} - -wxDataViewItem ObjectDataViewModel::ReorganizeObjects( const int current_id, const int new_id) -{ - if (current_id == new_id) - return wxDataViewItem(nullptr); - - ObjectDataViewModelNode* deleted_node = m_objects[current_id]; - m_objects.erase(m_objects.begin() + current_id); - ItemDeleted(wxDataViewItem(nullptr), wxDataViewItem(deleted_node)); - - m_objects.emplace(m_objects.begin() + new_id, deleted_node); - ItemAdded(wxDataViewItem(nullptr), wxDataViewItem(deleted_node)); - - return wxDataViewItem(deleted_node); -} - -bool ObjectDataViewModel::IsEnabled(const wxDataViewItem &item, unsigned int col) const -{ - wxASSERT(item.IsOk()); - ObjectDataViewModelNode *node = (ObjectDataViewModelNode*)item.GetID(); - - // disable extruder selection for the non "itObject|itVolume" item - return !(col == colExtruder && node->m_extruder.IsEmpty()); -} - -wxDataViewItem ObjectDataViewModel::GetParent(const wxDataViewItem &item) const -{ - // the invisible root node has no parent - if (!item.IsOk()) - return wxDataViewItem(0); - - ObjectDataViewModelNode *node = (ObjectDataViewModelNode*)item.GetID(); - assert(node != nullptr && node->valid()); - - // objects nodes has no parent too - if (node->m_type == itObject) - return wxDataViewItem(0); - - return wxDataViewItem((void*)node->GetParent()); -} - -wxDataViewItem ObjectDataViewModel::GetTopParent(const wxDataViewItem &item) const -{ - // the invisible root node has no parent - if (!item.IsOk()) - return wxDataViewItem(0); - - ObjectDataViewModelNode *node = (ObjectDataViewModelNode*)item.GetID(); - if (node->m_type == itObject) - return item; - - ObjectDataViewModelNode *parent_node = node->GetParent(); - while (parent_node->m_type != itObject) - parent_node = parent_node->GetParent(); - - return wxDataViewItem((void*)parent_node); -} - -bool ObjectDataViewModel::IsContainer(const wxDataViewItem &item) const -{ - // the invisible root node can have children - if (!item.IsOk()) - return true; - - ObjectDataViewModelNode *node = (ObjectDataViewModelNode*)item.GetID(); - return node->IsContainer(); -} - -unsigned int ObjectDataViewModel::GetChildren(const wxDataViewItem &parent, wxDataViewItemArray &array) const -{ - ObjectDataViewModelNode *node = (ObjectDataViewModelNode*)parent.GetID(); - if (!node) - { - for (auto object : m_objects) - array.Add(wxDataViewItem((void*)object)); - return m_objects.size(); - } - - if (node->GetChildCount() == 0) - { - return 0; - } - - unsigned int count = node->GetChildren().GetCount(); - for (unsigned int pos = 0; pos < count; pos++) - { - ObjectDataViewModelNode *child = node->GetChildren().Item(pos); - array.Add(wxDataViewItem((void*)child)); - } - - return count; -} - -void ObjectDataViewModel::GetAllChildren(const wxDataViewItem &parent, wxDataViewItemArray &array) const -{ - ObjectDataViewModelNode *node = (ObjectDataViewModelNode*)parent.GetID(); - if (!node) { - for (auto object : m_objects) - array.Add(wxDataViewItem((void*)object)); - } - else if (node->GetChildCount() == 0) - return; - else { - const size_t count = node->GetChildren().GetCount(); - for (size_t pos = 0; pos < count; pos++) { - ObjectDataViewModelNode *child = node->GetChildren().Item(pos); - array.Add(wxDataViewItem((void*)child)); - } - } - - wxDataViewItemArray new_array = array; - for (const auto item : new_array) - { - wxDataViewItemArray children; - GetAllChildren(item, children); - WX_APPEND_ARRAY(array, children); - } -} - -ItemType ObjectDataViewModel::GetItemType(const wxDataViewItem &item) const -{ - if (!item.IsOk()) - return itUndef; - ObjectDataViewModelNode *node = (ObjectDataViewModelNode*)item.GetID(); - return node->m_type < 0 ? itUndef : node->m_type; -} - -wxDataViewItem ObjectDataViewModel::GetItemByType(const wxDataViewItem &parent_item, ItemType type) const -{ - if (!parent_item.IsOk()) - return wxDataViewItem(0); - - ObjectDataViewModelNode *node = (ObjectDataViewModelNode*)parent_item.GetID(); - if (node->GetChildCount() == 0) - return wxDataViewItem(0); - - for (size_t i = 0; i < node->GetChildCount(); i++) { - if (node->GetNthChild(i)->m_type == type) - return wxDataViewItem((void*)node->GetNthChild(i)); - } - - return wxDataViewItem(0); -} - -wxDataViewItem ObjectDataViewModel::GetSettingsItem(const wxDataViewItem &item) const -{ - return GetItemByType(item, itSettings); -} - -wxDataViewItem ObjectDataViewModel::GetInstanceRootItem(const wxDataViewItem &item) const -{ - return GetItemByType(item, itInstanceRoot); -} - -wxDataViewItem ObjectDataViewModel::GetLayerRootItem(const wxDataViewItem &item) const -{ - return GetItemByType(item, itLayerRoot); -} - -bool ObjectDataViewModel::IsSettingsItem(const wxDataViewItem &item) const -{ - if (!item.IsOk()) - return false; - ObjectDataViewModelNode *node = (ObjectDataViewModelNode*)item.GetID(); - return node->m_type == itSettings; -} - -void ObjectDataViewModel::UpdateSettingsDigest(const wxDataViewItem &item, - const std::vector& categories) -{ - if (!item.IsOk()) return; - ObjectDataViewModelNode *node = (ObjectDataViewModelNode*)item.GetID(); - if (!node->update_settings_digest(categories)) - return; - ItemChanged(item); -} - -void ObjectDataViewModel::SetVolumeType(const wxDataViewItem &item, const Slic3r::ModelVolumeType type) -{ - if (!item.IsOk() || GetItemType(item) != itVolume) - return; - - ObjectDataViewModelNode *node = (ObjectDataViewModelNode*)item.GetID(); - node->SetBitmap(*m_volume_bmps[int(type)]); - ItemChanged(item); -} - -wxDataViewItem ObjectDataViewModel::SetPrintableState( - PrintIndicator printable, - int obj_idx, - int subobj_idx /* = -1*/, - ItemType subobj_type/* = itInstance*/) -{ - wxDataViewItem item = wxDataViewItem(0); - if (subobj_idx < 0) - item = GetItemById(obj_idx); - else - item = subobj_type&itInstance ? GetItemByInstanceId(obj_idx, subobj_idx) : - GetItemByVolumeId(obj_idx, subobj_idx); - - ObjectDataViewModelNode* node = (ObjectDataViewModelNode*)item.GetID(); - if (!node) - return wxDataViewItem(0); - node->set_printable_icon(printable); - ItemChanged(item); - - if (subobj_idx >= 0) - UpdateObjectPrintable(GetItemById(obj_idx)); - - return item; -} - -wxDataViewItem ObjectDataViewModel::SetObjectPrintableState( - PrintIndicator printable, - wxDataViewItem obj_item) -{ - ObjectDataViewModelNode* node = (ObjectDataViewModelNode*)obj_item.GetID(); - if (!node) - return wxDataViewItem(0); - node->set_printable_icon(printable); - ItemChanged(obj_item); - - UpdateInstancesPrintable(obj_item); - - return obj_item; -} - -void ObjectDataViewModel::Rescale() -{ - wxDataViewItemArray all_items; - GetAllChildren(wxDataViewItem(0), all_items); - - for (wxDataViewItem item : all_items) - { - if (!item.IsOk()) - continue; - - ObjectDataViewModelNode *node = (ObjectDataViewModelNode*)item.GetID(); - node->msw_rescale(); - - switch (node->m_type) - { - case itObject: - if (node->m_bmp.IsOk()) node->m_bmp = *m_warning_bmp; - break; - case itVolume: - node->m_bmp = GetVolumeIcon(node->m_volume_type, node->m_bmp.GetWidth() != node->m_bmp.GetHeight()); - break; - case itLayerRoot: - node->m_bmp = create_scaled_bitmap(LAYER_ROOT_ICON); - case itLayer: - node->m_bmp = create_scaled_bitmap(LAYER_ICON); - break; - default: break; - } - - ItemChanged(item); - } -} - -wxBitmap ObjectDataViewModel::GetVolumeIcon(const Slic3r::ModelVolumeType vol_type, const bool is_marked/* = false*/) -{ - if (!is_marked) - return *m_volume_bmps[static_cast(vol_type)]; - - std::string scaled_bitmap_name = "warning" + std::to_string(static_cast(vol_type)); - scaled_bitmap_name += "-em" + std::to_string(Slic3r::GUI::wxGetApp().em_unit()); - - wxBitmap *bmp = m_bitmap_cache->find(scaled_bitmap_name); - if (bmp == nullptr) { - std::vector bmps; - - bmps.emplace_back(*m_warning_bmp); - bmps.emplace_back(*m_volume_bmps[static_cast(vol_type)]); - - bmp = m_bitmap_cache->insert(scaled_bitmap_name, bmps); - } - - return *bmp; -} - -void ObjectDataViewModel::DeleteWarningIcon(const wxDataViewItem& item, const bool unmark_object/* = false*/) -{ - if (!item.IsOk()) - return; - - ObjectDataViewModelNode *node = (ObjectDataViewModelNode*)item.GetID(); - - if (!node->GetBitmap().IsOk() || !(node->GetType() & (itVolume | itObject))) - return; - - if (node->GetType() & itVolume) { - node->SetBitmap(*m_volume_bmps[static_cast(node->volume_type())]); - return; - } - - node->SetBitmap(wxNullBitmap); - if (unmark_object) - { - wxDataViewItemArray children; - GetChildren(item, children); - for (const wxDataViewItem& child : children) - DeleteWarningIcon(child); - } -} - -//----------------------------------------------------------------------------- -// DataViewBitmapText -//----------------------------------------------------------------------------- - -wxIMPLEMENT_DYNAMIC_CLASS(DataViewBitmapText, wxObject) - -IMPLEMENT_VARIANT_OBJECT(DataViewBitmapText) - -// --------------------------------------------------------- -// BitmapTextRenderer -// --------------------------------------------------------- - -#if ENABLE_NONCUSTOM_DATA_VIEW_RENDERING -BitmapTextRenderer::BitmapTextRenderer(wxDataViewCellMode mode /*= wxDATAVIEW_CELL_EDITABLE*/, - int align /*= wxDVR_DEFAULT_ALIGNMENT*/): -wxDataViewRenderer(wxT("PrusaDataViewBitmapText"), mode, align) -{ - SetMode(mode); - SetAlignment(align); -} -#endif // ENABLE_NONCUSTOM_DATA_VIEW_RENDERING - -bool BitmapTextRenderer::SetValue(const wxVariant &value) -{ - m_value << value; - return true; -} - -bool BitmapTextRenderer::GetValue(wxVariant& WXUNUSED(value)) const -{ - return false; -} - -#if ENABLE_NONCUSTOM_DATA_VIEW_RENDERING && wxUSE_ACCESSIBILITY -wxString BitmapTextRenderer::GetAccessibleDescription() const -{ - return m_value.GetText(); -} -#endif // wxUSE_ACCESSIBILITY && ENABLE_NONCUSTOM_DATA_VIEW_RENDERING - -bool BitmapTextRenderer::Render(wxRect rect, wxDC *dc, int state) -{ - int xoffset = 0; - - const wxBitmap& icon = m_value.GetBitmap(); - if (icon.IsOk()) - { -#ifdef __APPLE__ - wxSize icon_sz = icon.GetScaledSize(); -#else - wxSize icon_sz = icon.GetSize(); -#endif - dc->DrawBitmap(icon, rect.x, rect.y + (rect.height - icon_sz.y) / 2); - xoffset = icon_sz.x + 4; - } - - RenderText(m_value.GetText(), xoffset, rect, dc, state); - - return true; -} - -wxSize BitmapTextRenderer::GetSize() const -{ - if (!m_value.GetText().empty()) - { - wxSize size = GetTextExtent(m_value.GetText()); - - if (m_value.GetBitmap().IsOk()) - size.x += m_value.GetBitmap().GetWidth() + 4; - return size; - } - return wxSize(80, 20); -} - - -wxWindow* BitmapTextRenderer::CreateEditorCtrl(wxWindow* parent, wxRect labelRect, const wxVariant& value) -{ - wxDataViewCtrl* const dv_ctrl = GetOwner()->GetOwner(); - ObjectDataViewModel* const model = dynamic_cast(dv_ctrl->GetModel()); - - if ( !(model->GetItemType(dv_ctrl->GetSelection()) & (itVolume | itObject)) ) - return nullptr; - - DataViewBitmapText data; - data << value; - - m_was_unusable_symbol = false; - - wxPoint position = labelRect.GetPosition(); - if (data.GetBitmap().IsOk()) { - const int bmp_width = data.GetBitmap().GetWidth(); - position.x += bmp_width; - labelRect.SetWidth(labelRect.GetWidth() - bmp_width); - } - - wxTextCtrl* text_editor = new wxTextCtrl(parent, wxID_ANY, data.GetText(), - position, labelRect.GetSize(), wxTE_PROCESS_ENTER); - text_editor->SetInsertionPointEnd(); - text_editor->SelectAll(); - - return text_editor; -} - -bool BitmapTextRenderer::GetValueFromEditorCtrl(wxWindow* ctrl, wxVariant& value) -{ - wxTextCtrl* text_editor = wxDynamicCast(ctrl, wxTextCtrl); - if (!text_editor || text_editor->GetValue().IsEmpty()) - return false; - - std::string chosen_name = Slic3r::normalize_utf8_nfc(text_editor->GetValue().ToUTF8()); - const char* unusable_symbols = "<>:/\\|?*\""; - for (size_t i = 0; i < std::strlen(unusable_symbols); i++) { - if (chosen_name.find_first_of(unusable_symbols[i]) != std::string::npos) { - m_was_unusable_symbol = true; - return false; - } - } - - // The icon can't be edited so get its old value and reuse it. - wxVariant valueOld; - GetView()->GetModel()->GetValue(valueOld, m_item, colName); - - DataViewBitmapText bmpText; - bmpText << valueOld; - - // But replace the text with the value entered by user. - bmpText.SetText(text_editor->GetValue()); - - value << bmpText; - return true; -} - -// ---------------------------------------------------------------------------- -// BitmapChoiceRenderer -// ---------------------------------------------------------------------------- - -bool BitmapChoiceRenderer::SetValue(const wxVariant& value) -{ - m_value << value; - return true; -} - -bool BitmapChoiceRenderer::GetValue(wxVariant& value) const -{ - value << m_value; - return true; -} - -bool BitmapChoiceRenderer::Render(wxRect rect, wxDC* dc, int state) -{ - int xoffset = 0; - - const wxBitmap& icon = m_value.GetBitmap(); - if (icon.IsOk()) - { - dc->DrawBitmap(icon, rect.x, rect.y + (rect.height - icon.GetHeight()) / 2); - xoffset = icon.GetWidth() + 4; - } - - if (rect.height==0) - rect.height= icon.GetHeight(); - RenderText(m_value.GetText(), xoffset, rect, dc, state); - - return true; -} - -wxSize BitmapChoiceRenderer::GetSize() const -{ - wxSize sz = GetTextExtent(m_value.GetText()); - - if (m_value.GetBitmap().IsOk()) - sz.x += m_value.GetBitmap().GetWidth() + 4; - - return sz; -} - - -wxWindow* BitmapChoiceRenderer::CreateEditorCtrl(wxWindow* parent, wxRect labelRect, const wxVariant& value) -{ - wxDataViewCtrl* const dv_ctrl = GetOwner()->GetOwner(); - ObjectDataViewModel* const model = dynamic_cast(dv_ctrl->GetModel()); - - if (!(model->GetItemType(dv_ctrl->GetSelection()) & (itVolume | itLayer | itObject))) - return nullptr; - - std::vector icons = get_extruder_color_icons(); - if (icons.empty()) - return nullptr; - - DataViewBitmapText data; - data << value; - - auto c_editor = new wxBitmapComboBox(parent, wxID_ANY, wxEmptyString, - labelRect.GetTopLeft(), wxSize(labelRect.GetWidth(), -1), - 0, nullptr , wxCB_READONLY); - - int i=0; - for (wxBitmap* bmp : icons) { - if (i==0) { - c_editor->Append(_(L("default")), *bmp); - ++i; - } - - c_editor->Append(wxString::Format("%d", i), *bmp); - ++i; - } - c_editor->SetSelection(atoi(data.GetText().c_str())); - - // to avoid event propagation to other sidebar items - c_editor->Bind(wxEVT_COMBOBOX, [this](wxCommandEvent& evt) { - evt.StopPropagation(); - // FinishEditing grabs new selection and triggers config update. We better call - // it explicitly, automatic update on KILL_FOCUS didn't work on Linux. - this->FinishEditing(); - }); - - return c_editor; -} - -bool BitmapChoiceRenderer::GetValueFromEditorCtrl(wxWindow* ctrl, wxVariant& value) -{ - wxBitmapComboBox* c = (wxBitmapComboBox*)ctrl; - int selection = c->GetSelection(); - if (selection < 0) - return false; - - DataViewBitmapText bmpText; - - bmpText.SetText(c->GetString(selection)); - bmpText.SetBitmap(c->GetItemBitmap(selection)); - - value << bmpText; - return true; -} - - // ---------------------------------------------------------------------------- // LockButton // ---------------------------------------------------------------------------- diff --git a/src/slic3r/GUI/wxExtensions.hpp b/src/slic3r/GUI/wxExtensions.hpp index fa04ac9c71..55dac54332 100644 --- a/src/slic3r/GUI/wxExtensions.hpp +++ b/src/slic3r/GUI/wxExtensions.hpp @@ -4,24 +4,14 @@ #include #include #include -#include -#include #include #include #include #include -#include #include -#include #include -namespace Slic3r { - enum class ModelVolumeType : int; -}; - -typedef double coordf_t; -typedef std::pair t_layer_height_range; #ifdef __WXMSW__ void msw_rescale_menu(wxMenu* menu); @@ -49,7 +39,6 @@ wxMenuItem* append_menu_check_item(wxMenu* menu, int id, const wxString& string, void enable_menu_item(wxUpdateUIEvent& evt, std::function const cb_condition, wxMenuItem* item, wxWindow* win); class wxDialog; -class wxBitmapComboBox; void edit_tooltip(wxString& tooltip); void msw_buttons_rescale(wxDialog* dlg, const int em_unit, const std::vector& btn_ids); @@ -158,593 +147,6 @@ public: }; -// ---------------------------------------------------------------------------- -// DataViewBitmapText: helper class used by PrusaBitmapTextRenderer -// ---------------------------------------------------------------------------- - -class DataViewBitmapText : public wxObject -{ -public: - DataViewBitmapText( const wxString &text = wxEmptyString, - const wxBitmap& bmp = wxNullBitmap) : - m_text(text), - m_bmp(bmp) - { } - - DataViewBitmapText(const DataViewBitmapText &other) - : wxObject(), - m_text(other.m_text), - m_bmp(other.m_bmp) - { } - - void SetText(const wxString &text) { m_text = text; } - wxString GetText() const { return m_text; } - void SetBitmap(const wxBitmap &bmp) { m_bmp = bmp; } - const wxBitmap &GetBitmap() const { return m_bmp; } - - bool IsSameAs(const DataViewBitmapText& other) const { - return m_text == other.m_text && m_bmp.IsSameAs(other.m_bmp); - } - - bool operator==(const DataViewBitmapText& other) const { - return IsSameAs(other); - } - - bool operator!=(const DataViewBitmapText& other) const { - return !IsSameAs(other); - } - -private: - wxString m_text; - wxBitmap m_bmp; - - wxDECLARE_DYNAMIC_CLASS(DataViewBitmapText); -}; -DECLARE_VARIANT_OBJECT(DataViewBitmapText) - - -// ---------------------------------------------------------------------------- -// ObjectDataViewModelNode: a node inside ObjectDataViewModel -// ---------------------------------------------------------------------------- - -enum ItemType { - itUndef = 0, - itObject = 1, - itVolume = 2, - itInstanceRoot = 4, - itInstance = 8, - itSettings = 16, - itLayerRoot = 32, - itLayer = 64, -}; - -enum ColumnNumber -{ - colName = 0, // item name - colPrint , // printable property - colExtruder , // extruder selection - colEditing , // item editing -}; - -enum PrintIndicator -{ - piUndef = 0, // no print indicator - piPrintable , // printable - piUnprintable , // unprintable -}; - -class ObjectDataViewModelNode; -WX_DEFINE_ARRAY_PTR(ObjectDataViewModelNode*, MyObjectTreeModelNodePtrArray); - -class ObjectDataViewModelNode -{ - ObjectDataViewModelNode* m_parent; - MyObjectTreeModelNodePtrArray m_children; - wxBitmap m_empty_bmp; - size_t m_volumes_cnt = 0; - std::vector< std::string > m_opt_categories; - t_layer_height_range m_layer_range = { 0.0f, 0.0f }; - - wxString m_name; - wxBitmap& m_bmp = m_empty_bmp; - ItemType m_type; - int m_idx = -1; - bool m_container = false; - wxString m_extruder = "default"; - wxBitmap m_extruder_bmp; - wxBitmap m_action_icon; - PrintIndicator m_printable {piUndef}; - wxBitmap m_printable_icon; - - std::string m_action_icon_name = ""; - Slic3r::ModelVolumeType m_volume_type; - -public: - ObjectDataViewModelNode(const wxString& name, - const wxString& extruder): - m_parent(NULL), - m_name(name), - m_type(itObject), - m_extruder(extruder) - { - set_action_and_extruder_icons(); - init_container(); - } - - ObjectDataViewModelNode(ObjectDataViewModelNode* parent, - const wxString& sub_obj_name, - const wxBitmap& bmp, - const wxString& extruder, - const int idx = -1 ) : - m_parent (parent), - m_name (sub_obj_name), - m_type (itVolume), - m_idx (idx), - m_extruder (extruder) - { - m_bmp = bmp; - set_action_and_extruder_icons(); - init_container(); - } - - ObjectDataViewModelNode(ObjectDataViewModelNode* parent, - const t_layer_height_range& layer_range, - const int idx = -1, - const wxString& extruder = wxEmptyString ); - - ObjectDataViewModelNode(ObjectDataViewModelNode* parent, const ItemType type); - - ~ObjectDataViewModelNode() - { - // free all our children nodes - size_t count = m_children.GetCount(); - for (size_t i = 0; i < count; i++) - { - ObjectDataViewModelNode *child = m_children[i]; - delete child; - } -#ifndef NDEBUG - // Indicate that the object was deleted. - m_idx = -2; -#endif /* NDEBUG */ - } - - void init_container(); - bool IsContainer() const - { - return m_container; - } - - ObjectDataViewModelNode* GetParent() - { - assert(m_parent == nullptr || m_parent->valid()); - return m_parent; - } - MyObjectTreeModelNodePtrArray& GetChildren() - { - return m_children; - } - ObjectDataViewModelNode* GetNthChild(unsigned int n) - { - return m_children.Item(n); - } - void Insert(ObjectDataViewModelNode* child, unsigned int n) - { - if (!m_container) - m_container = true; - m_children.Insert(child, n); - } - void Append(ObjectDataViewModelNode* child) - { - if (!m_container) - m_container = true; - m_children.Add(child); - } - void RemoveAllChildren() - { - if (GetChildCount() == 0) - return; - for (int id = int(GetChildCount()) - 1; id >= 0; --id) - { - if (m_children.Item(id)->GetChildCount() > 0) - m_children[id]->RemoveAllChildren(); - auto node = m_children[id]; - m_children.RemoveAt(id); - delete node; - } - } - - size_t GetChildCount() const - { - return m_children.GetCount(); - } - - bool SetValue(const wxVariant &variant, unsigned int col); - - void SetBitmap(const wxBitmap &icon) { m_bmp = icon; } - const wxBitmap& GetBitmap() const { return m_bmp; } - const wxString& GetName() const { return m_name; } - ItemType GetType() const { return m_type; } - void SetIdx(const int& idx); - int GetIdx() const { return m_idx; } - t_layer_height_range GetLayerRange() const { return m_layer_range; } - PrintIndicator IsPrintable() const { return m_printable; } - - // use this function only for childrens - void AssignAllVal(ObjectDataViewModelNode& from_node) - { - // ! Don't overwrite other values because of equality of this values for all children -- - m_name = from_node.m_name; - m_bmp = from_node.m_bmp; - m_idx = from_node.m_idx; - m_extruder = from_node.m_extruder; - m_type = from_node.m_type; - } - - bool SwapChildrens(int frst_id, int scnd_id) { - if (GetChildCount() < 2 || - frst_id < 0 || (size_t)frst_id >= GetChildCount() || - scnd_id < 0 || (size_t)scnd_id >= GetChildCount()) - return false; - - ObjectDataViewModelNode new_scnd = *GetNthChild(frst_id); - ObjectDataViewModelNode new_frst = *GetNthChild(scnd_id); - - new_scnd.m_idx = m_children.Item(scnd_id)->m_idx; - new_frst.m_idx = m_children.Item(frst_id)->m_idx; - - m_children.Item(frst_id)->AssignAllVal(new_frst); - m_children.Item(scnd_id)->AssignAllVal(new_scnd); - return true; - } - - // Set action icons for node - void set_action_and_extruder_icons(); - // Set printable icon for node - void set_printable_icon(PrintIndicator printable); - - void update_settings_digest_bitmaps(); - bool update_settings_digest(const std::vector& categories); - int volume_type() const { return int(m_volume_type); } - void msw_rescale(); - -#ifndef NDEBUG - bool valid(); -#endif /* NDEBUG */ - bool invalid() const { return m_idx < -1; } - -private: - friend class ObjectDataViewModel; -}; - -// ---------------------------------------------------------------------------- -// ObjectDataViewModel -// ---------------------------------------------------------------------------- - -// custom message the model sends to associated control to notify a last volume deleted from the object: -wxDECLARE_EVENT(wxCUSTOMEVT_LAST_VOLUME_IS_DELETED, wxCommandEvent); - -class ObjectDataViewModel :public wxDataViewModel -{ - std::vector m_objects; - std::vector m_volume_bmps; - wxBitmap* m_warning_bmp { nullptr }; - - wxDataViewCtrl* m_ctrl { nullptr }; - -public: - ObjectDataViewModel(); - ~ObjectDataViewModel(); - - wxDataViewItem Add( const wxString &name, - const int extruder, - const bool has_errors = false); - wxDataViewItem AddVolumeChild( const wxDataViewItem &parent_item, - const wxString &name, - const Slic3r::ModelVolumeType volume_type, - const bool has_errors = false, - const int extruder = 0, - const bool create_frst_child = true); - wxDataViewItem AddSettingsChild(const wxDataViewItem &parent_item); - wxDataViewItem AddInstanceChild(const wxDataViewItem &parent_item, size_t num); - wxDataViewItem AddInstanceChild(const wxDataViewItem &parent_item, const std::vector& print_indicator); - wxDataViewItem AddLayersRoot(const wxDataViewItem &parent_item); - wxDataViewItem AddLayersChild( const wxDataViewItem &parent_item, - const t_layer_height_range& layer_range, - const int extruder = 0, - const int index = -1); - wxDataViewItem Delete(const wxDataViewItem &item); - wxDataViewItem DeleteLastInstance(const wxDataViewItem &parent_item, size_t num); - void DeleteAll(); - void DeleteChildren(wxDataViewItem& parent); - void DeleteVolumeChildren(wxDataViewItem& parent); - void DeleteSettings(const wxDataViewItem& parent); - wxDataViewItem GetItemById(int obj_idx); - wxDataViewItem GetItemById(const int obj_idx, const int sub_obj_idx, const ItemType parent_type); - wxDataViewItem GetItemByVolumeId(int obj_idx, int volume_idx); - wxDataViewItem GetItemByInstanceId(int obj_idx, int inst_idx); - wxDataViewItem GetItemByLayerId(int obj_idx, int layer_idx); - wxDataViewItem GetItemByLayerRange(const int obj_idx, const t_layer_height_range& layer_range); - int GetItemIdByLayerRange(const int obj_idx, const t_layer_height_range& layer_range); - int GetIdByItem(const wxDataViewItem& item) const; - int GetIdByItemAndType(const wxDataViewItem& item, const ItemType type) const; - int GetObjectIdByItem(const wxDataViewItem& item) const; - int GetVolumeIdByItem(const wxDataViewItem& item) const; - int GetInstanceIdByItem(const wxDataViewItem& item) const; - int GetLayerIdByItem(const wxDataViewItem& item) const; - void GetItemInfo(const wxDataViewItem& item, ItemType& type, int& obj_idx, int& idx); - int GetRowByItem(const wxDataViewItem& item) const; - bool IsEmpty() { return m_objects.empty(); } - bool InvalidItem(const wxDataViewItem& item); - - // helper method for wxLog - - wxString GetName(const wxDataViewItem &item) const; - wxBitmap& GetBitmap(const wxDataViewItem &item) const; - wxString GetExtruder(const wxDataViewItem &item) const; - int GetExtruderNumber(const wxDataViewItem &item) const; - - // helper methods to change the model - - virtual unsigned int GetColumnCount() const override { return 3;} - virtual wxString GetColumnType(unsigned int col) const override{ return wxT("string"); } - - virtual void GetValue( wxVariant &variant, - const wxDataViewItem &item, - unsigned int col) const override; - virtual bool SetValue( const wxVariant &variant, - const wxDataViewItem &item, - unsigned int col) override; - bool SetValue( const wxVariant &variant, - const int item_idx, - unsigned int col); - - void SetExtruder(const wxString& extruder, wxDataViewItem item); - - // For parent move child from cur_volume_id place to new_volume_id - // Remaining items will moved up/down accordingly - wxDataViewItem ReorganizeChildren( const int cur_volume_id, - const int new_volume_id, - const wxDataViewItem &parent); - wxDataViewItem ReorganizeObjects( int current_id, int new_id); - - virtual bool IsEnabled(const wxDataViewItem &item, unsigned int col) const override; - - virtual wxDataViewItem GetParent(const wxDataViewItem &item) const override; - // get object item - wxDataViewItem GetTopParent(const wxDataViewItem &item) const; - virtual bool IsContainer(const wxDataViewItem &item) const override; - virtual unsigned int GetChildren(const wxDataViewItem &parent, - wxDataViewItemArray &array) const override; - void GetAllChildren(const wxDataViewItem &parent,wxDataViewItemArray &array) const; - // Is the container just a header or an item with all columns - // In our case it is an item with all columns - virtual bool HasContainerColumns(const wxDataViewItem& WXUNUSED(item)) const override { return true; } - - ItemType GetItemType(const wxDataViewItem &item) const ; - wxDataViewItem GetItemByType( const wxDataViewItem &parent_item, - ItemType type) const; - wxDataViewItem GetSettingsItem(const wxDataViewItem &item) const; - wxDataViewItem GetInstanceRootItem(const wxDataViewItem &item) const; - wxDataViewItem GetLayerRootItem(const wxDataViewItem &item) const; - bool IsSettingsItem(const wxDataViewItem &item) const; - void UpdateSettingsDigest( const wxDataViewItem &item, - const std::vector& categories); - - bool IsPrintable(const wxDataViewItem &item) const; - void UpdateObjectPrintable(wxDataViewItem parent_item); - void UpdateInstancesPrintable(wxDataViewItem parent_item); - - void SetVolumeBitmaps(const std::vector& volume_bmps) { m_volume_bmps = volume_bmps; } - void SetWarningBitmap(wxBitmap* bitmap) { m_warning_bmp = bitmap; } - void SetVolumeType(const wxDataViewItem &item, const Slic3r::ModelVolumeType type); - wxDataViewItem SetPrintableState( PrintIndicator printable, int obj_idx, - int subobj_idx = -1, - ItemType subobj_type = itInstance); - wxDataViewItem SetObjectPrintableState(PrintIndicator printable, wxDataViewItem obj_item); - - void SetAssociatedControl(wxDataViewCtrl* ctrl) { m_ctrl = ctrl; } - // Rescale bitmaps for existing Items - void Rescale(); - - wxBitmap GetVolumeIcon(const Slic3r::ModelVolumeType vol_type, - const bool is_marked = false); - void DeleteWarningIcon(const wxDataViewItem& item, const bool unmark_object = false); - t_layer_height_range GetLayerRangeByItem(const wxDataViewItem& item) const; - - bool UpdateColumValues(unsigned col); - void UpdateExtruderBitmap(wxDataViewItem item); - -private: - wxDataViewItem AddRoot(const wxDataViewItem& parent_item, const ItemType root_type); - wxDataViewItem AddInstanceRoot(const wxDataViewItem& parent_item); -}; - -// ---------------------------------------------------------------------------- -// BitmapTextRenderer -// ---------------------------------------------------------------------------- -#if ENABLE_NONCUSTOM_DATA_VIEW_RENDERING -class BitmapTextRenderer : public wxDataViewRenderer -#else -class BitmapTextRenderer : public wxDataViewCustomRenderer -#endif //ENABLE_NONCUSTOM_DATA_VIEW_RENDERING -{ -public: - BitmapTextRenderer( wxWindow* parent, - wxDataViewCellMode mode = -#ifdef __WXOSX__ - wxDATAVIEW_CELL_INERT -#else - wxDATAVIEW_CELL_EDITABLE -#endif - - ,int align = wxDVR_DEFAULT_ALIGNMENT -#if ENABLE_NONCUSTOM_DATA_VIEW_RENDERING - ); -#else - ) : - wxDataViewCustomRenderer(wxT("DataViewBitmapText"), mode, align), - m_parent(parent) - {} -#endif //ENABLE_NONCUSTOM_DATA_VIEW_RENDERING - - bool SetValue(const wxVariant &value); - bool GetValue(wxVariant &value) const; -#if ENABLE_NONCUSTOM_DATA_VIEW_RENDERING && wxUSE_ACCESSIBILITY - virtual wxString GetAccessibleDescription() const override; -#endif // wxUSE_ACCESSIBILITY && ENABLE_NONCUSTOM_DATA_VIEW_RENDERING - - virtual bool Render(wxRect cell, wxDC *dc, int state); - virtual wxSize GetSize() const; - - bool HasEditorCtrl() const override - { -#ifdef __WXOSX__ - return false; -#else - return true; -#endif - } - wxWindow* CreateEditorCtrl(wxWindow* parent, - wxRect labelRect, - const wxVariant& value) override; - bool GetValueFromEditorCtrl( wxWindow* ctrl, - wxVariant& value) override; - bool WasCanceled() const { return m_was_unusable_symbol; } - -private: - DataViewBitmapText m_value; - bool m_was_unusable_symbol {false}; - wxWindow* m_parent {nullptr}; -}; - - -// ---------------------------------------------------------------------------- -// BitmapChoiceRenderer -// ---------------------------------------------------------------------------- - -class BitmapChoiceRenderer : public wxDataViewCustomRenderer -{ -public: - BitmapChoiceRenderer(wxDataViewCellMode mode = -#ifdef __WXOSX__ - wxDATAVIEW_CELL_INERT -#else - wxDATAVIEW_CELL_EDITABLE -#endif - ,int align = wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL - ) : wxDataViewCustomRenderer(wxT("DataViewBitmapText"), mode, align) {} - - bool SetValue(const wxVariant& value); - bool GetValue(wxVariant& value) const; - - virtual bool Render(wxRect cell, wxDC* dc, int state); - virtual wxSize GetSize() const; - - bool HasEditorCtrl() const override { return true; } - wxWindow* CreateEditorCtrl(wxWindow* parent, - wxRect labelRect, - const wxVariant& value) override; - bool GetValueFromEditorCtrl( wxWindow* ctrl, - wxVariant& value) override; - -private: - DataViewBitmapText m_value; -}; - - -// ---------------------------------------------------------------------------- -// MyCustomRenderer -// ---------------------------------------------------------------------------- - -class MyCustomRenderer : public wxDataViewCustomRenderer -{ -public: - // This renderer can be either activatable or editable, for demonstration - // purposes. In real programs, you should select whether the user should be - // able to activate or edit the cell and it doesn't make sense to switch - // between the two -- but this is just an example, so it doesn't stop us. - explicit MyCustomRenderer(wxDataViewCellMode mode) - : wxDataViewCustomRenderer("string", mode, wxALIGN_CENTER) - { } - - virtual bool Render(wxRect rect, wxDC *dc, int state) override/*wxOVERRIDE*/ - { - dc->SetBrush(*wxLIGHT_GREY_BRUSH); - dc->SetPen(*wxTRANSPARENT_PEN); - - rect.Deflate(2); - dc->DrawRoundedRectangle(rect, 5); - - RenderText(m_value, - 0, // no offset - wxRect(dc->GetTextExtent(m_value)).CentreIn(rect), - dc, - state); - return true; - } - - virtual bool ActivateCell(const wxRect& WXUNUSED(cell), - wxDataViewModel *WXUNUSED(model), - const wxDataViewItem &WXUNUSED(item), - unsigned int WXUNUSED(col), - const wxMouseEvent *mouseEvent) override/*wxOVERRIDE*/ - { - wxString position; - if (mouseEvent) - position = wxString::Format("via mouse at %d, %d", mouseEvent->m_x, mouseEvent->m_y); - else - position = "from keyboard"; -// wxLogMessage("MyCustomRenderer ActivateCell() %s", position); - return false; - } - - virtual wxSize GetSize() const override/*wxOVERRIDE*/ - { - return wxSize(60, 20); - } - - virtual bool SetValue(const wxVariant &value) override/*wxOVERRIDE*/ - { - m_value = value.GetString(); - return true; - } - - virtual bool GetValue(wxVariant &WXUNUSED(value)) const override/*wxOVERRIDE*/{ return true; } - - virtual bool HasEditorCtrl() const override/*wxOVERRIDE*/{ return true; } - - virtual wxWindow* - CreateEditorCtrl(wxWindow* parent, - wxRect labelRect, - const wxVariant& value) override/*wxOVERRIDE*/ - { - wxTextCtrl* text = new wxTextCtrl(parent, wxID_ANY, value, - labelRect.GetPosition(), - labelRect.GetSize(), - wxTE_PROCESS_ENTER); - text->SetInsertionPointEnd(); - - return text; - } - - virtual bool - GetValueFromEditorCtrl(wxWindow* ctrl, wxVariant& value) override/*wxOVERRIDE*/ - { - wxTextCtrl* text = wxDynamicCast(ctrl, wxTextCtrl); - if (!text) - return false; - - value = text->GetValue(); - - return true; - } - -private: - wxString m_value; -}; - - // ---------------------------------------------------------------------------- // ScalableBitmap // ---------------------------------------------------------------------------- From 5b103116c5b6215f7508746dab582b2378088fb6 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Mon, 3 Feb 2020 09:24:58 +0100 Subject: [PATCH 213/336] Added missed include under OSX --- src/slic3r/GUI/BitmapCache.hpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/slic3r/GUI/BitmapCache.hpp b/src/slic3r/GUI/BitmapCache.hpp index 255cf54958..dd3e6ffc0d 100644 --- a/src/slic3r/GUI/BitmapCache.hpp +++ b/src/slic3r/GUI/BitmapCache.hpp @@ -1,6 +1,8 @@ #ifndef SLIC3R_GUI_BITMAP_CACHE_HPP #define SLIC3R_GUI_BITMAP_CACHE_HPP +#include + #include #ifndef WX_PRECOMP #include From e50825ce05510396d2bcf510cb631ada6de47bda Mon Sep 17 00:00:00 2001 From: Slic3rPE Date: Mon, 3 Feb 2020 10:13:15 +0100 Subject: [PATCH 214/336] missing includes --- src/slic3r/GUI/GLCanvas3DManager.cpp | 1 + src/slic3r/GUI/GUI_ObjectList.hpp | 1 + 2 files changed, 2 insertions(+) diff --git a/src/slic3r/GUI/GLCanvas3DManager.cpp b/src/slic3r/GUI/GLCanvas3DManager.cpp index 3594e85a42..a5d75d6012 100644 --- a/src/slic3r/GUI/GLCanvas3DManager.cpp +++ b/src/slic3r/GUI/GLCanvas3DManager.cpp @@ -10,6 +10,7 @@ #include #include +#include #include #include diff --git a/src/slic3r/GUI/GUI_ObjectList.hpp b/src/slic3r/GUI/GUI_ObjectList.hpp index fc02c706ee..3b51c17613 100644 --- a/src/slic3r/GUI/GUI_ObjectList.hpp +++ b/src/slic3r/GUI/GUI_ObjectList.hpp @@ -3,6 +3,7 @@ #include #include +#include #include #include From 8aec5f6726ff0fcfa7eb8838c400e6338571e5ae Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Mon, 3 Feb 2020 11:06:49 +0100 Subject: [PATCH 215/336] string_printf Wformat-security hack # #3594, #3592 --- src/libslic3r/libslic3r.h | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/libslic3r/libslic3r.h b/src/libslic3r/libslic3r.h index 0454644bb9..7d9558f1e5 100644 --- a/src/libslic3r/libslic3r.h +++ b/src/libslic3r/libslic3r.h @@ -231,16 +231,17 @@ static inline bool is_approx(Number value, Number test_value) } template -std::string string_printf(const char *const fmt, Args &&...args) +std::string string_printf(const char *const _fmt, Args &&...args) { static const size_t INITIAL_LEN = 1024; std::vector buffer(INITIAL_LEN, '\0'); - int bufflen = snprintf(buffer.data(), INITIAL_LEN - 1, fmt, std::forward(args)...); + auto fmt = std::string("%s") + _fmt; + int bufflen = snprintf(buffer.data(), INITIAL_LEN - 1, fmt.c_str(), "", std::forward(args)...); if (bufflen >= int(INITIAL_LEN)) { buffer.resize(size_t(bufflen) + 1); - snprintf(buffer.data(), buffer.size(), fmt, std::forward(args)...); + snprintf(buffer.data(), buffer.size(), fmt.c_str(), "", std::forward(args)...); } return std::string(buffer.begin(), buffer.begin() + bufflen); From 992a0c3d7a91ba59ebb14cb35cbd558626e95235 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Mon, 3 Feb 2020 11:18:33 +0100 Subject: [PATCH 216/336] remove duplicate string_printf #3594, #3592 --- src/libslic3r/Utils.hpp | 2 -- src/libslic3r/utils.cpp | 18 ------------------ 2 files changed, 20 deletions(-) diff --git a/src/libslic3r/Utils.hpp b/src/libslic3r/Utils.hpp index 06c4358099..bc6aa20fc5 100644 --- a/src/libslic3r/Utils.hpp +++ b/src/libslic3r/Utils.hpp @@ -93,8 +93,6 @@ namespace PerlUtils { extern std::string path_to_parent_path(const char *src); }; -std::string string_printf(const char *format, ...); - // Standard "generated by Slic3r version xxx timestamp xxx" header string, // to be placed at the top of Slic3r generated files. std::string header_slic3r_generated(); diff --git a/src/libslic3r/utils.cpp b/src/libslic3r/utils.cpp index f91d32d288..9f0afa0614 100644 --- a/src/libslic3r/utils.cpp +++ b/src/libslic3r/utils.cpp @@ -577,24 +577,6 @@ namespace PerlUtils { std::string path_to_parent_path(const char *src) { return boost::filesystem::path(src).parent_path().string(); } }; - -std::string string_printf(const char *format, ...) -{ - va_list args1; - va_start(args1, format); - va_list args2; - va_copy(args2, args1); - - size_t needed_size = ::vsnprintf(nullptr, 0, format, args1) + 1; - va_end(args1); - - std::string res(needed_size, '\0'); - ::vsnprintf(&res.front(), res.size(), format, args2); - va_end(args2); - - return res; -} - std::string header_slic3r_generated() { return std::string("generated by " SLIC3R_APP_NAME " " SLIC3R_VERSION " on " ) + Utils::utc_timestamp(); From 6fa49f5931def8ed35b5232bc464b822c7f170c7 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Mon, 3 Feb 2020 11:44:26 +0100 Subject: [PATCH 217/336] Added sequential print order id to 3D scene labels --- src/libslic3r/GCode.cpp | 6 ++- src/libslic3r/GCode.hpp | 4 ++ src/slic3r/GUI/GLCanvas3D.cpp | 95 ++++++++++++++++++++++------------- src/slic3r/GUI/GLCanvas3D.hpp | 5 +- 4 files changed, 72 insertions(+), 38 deletions(-) diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index a53b6bd7c2..eafe66a086 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -1101,7 +1101,11 @@ static inline std::vector sort_object_instances_by_max_z(c } // Produce a vector of PrintObjects in the order of their respective ModelObjects in print.model(). -static inline std::vector sort_object_instances_by_model_order(const Print &print) +#if ENABLE_SHOW_SCENE_LABELS +std::vector sort_object_instances_by_model_order(const Print& print) +#else +static inline std::vector sort_object_instances_by_model_order(const Print& print) +#endif // ENABLE_SHOW_SCENE_LABELS { // Build up map from ModelInstance* to PrintInstance* std::vector> model_instance_to_print_instance; diff --git a/src/libslic3r/GCode.hpp b/src/libslic3r/GCode.hpp index 10463277b0..e0f16f9fd0 100644 --- a/src/libslic3r/GCode.hpp +++ b/src/libslic3r/GCode.hpp @@ -418,6 +418,10 @@ private: friend class WipeTowerIntegration; }; +#if ENABLE_SHOW_SCENE_LABELS +std::vector sort_object_instances_by_model_order(const Print& print); +#endif // ENABLE_SHOW_SCENE_LABELS + } #endif diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 2989b6dde8..2c484d5542 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -6,6 +6,9 @@ #include "polypartition.h" #include "libslic3r/ClipperUtils.hpp" #include "libslic3r/PrintConfig.hpp" +#if ENABLE_SHOW_SCENE_LABELS +#include "libslic3r/GCode.hpp" +#endif // ENABLE_SHOW_SCENE_LABELS #include "libslic3r/GCode/PreviewData.hpp" #if ENABLE_THUMBNAIL_GENERATOR #include "libslic3r/GCode/ThumbnailData.hpp" @@ -1250,7 +1253,7 @@ bool GLCanvas3D::Labels::is_shown() const return wxGetApp().app_config->get("show_labels") == "1"; } -void GLCanvas3D::Labels::render() const +void GLCanvas3D::Labels::render(const std::vector& sorted_instances) const { if (!m_enabled || !is_shown()) return; @@ -1268,47 +1271,59 @@ void GLCanvas3D::Labels::render() const { int obj_idx; int inst_idx; + size_t model_instance_id; BoundingBoxf3 world_box; double eye_center_z; - std::string id_str; - std::string instance_str; + std::string title; + std::string label; + std::string print_order; bool selected; }; - // collect world bounding boxes from volumes + // collect owners world bounding boxes and data from volumes std::vector owners; const GLVolumeCollection& volumes = m_canvas.get_volumes(); - for (const GLVolume* volume : volumes.volumes) - { + for (const GLVolume* volume : volumes.volumes) { int obj_idx = volume->object_idx(); - if ((0 <= obj_idx) && (obj_idx < (int)model->objects.size())) - { + if (0 <= obj_idx && obj_idx < (int)model->objects.size()) { int inst_idx = volume->instance_idx(); std::vector::iterator it = std::find_if(owners.begin(), owners.end(), [obj_idx, inst_idx](const Owner& owner) { return (owner.obj_idx == obj_idx) && (owner.inst_idx == inst_idx); }); - if (it != owners.end()) - { + if (it != owners.end()) { it->world_box.merge(volume->transformed_bounding_box()); it->selected &= volume->selected; - } - else - { + } else { + const ModelObject* model_object = model->objects[obj_idx]; Owner owner; owner.obj_idx = obj_idx; owner.inst_idx = inst_idx; + owner.model_instance_id = model_object->instances[inst_idx]->id().id; owner.world_box = volume->transformed_bounding_box(); + owner.title = "object" + std::to_string(obj_idx) + "_inst##" + std::to_string(inst_idx); + owner.label = model_object->name; + if (model_object->instances.size() > 1) + owner.label += " (" + std::to_string(inst_idx + 1) + ")"; owner.selected = volume->selected; - owner.id_str = "object" + std::to_string(obj_idx) + "_inst##" + std::to_string(inst_idx); - owner.instance_str = _(L("Instance ")) + std::to_string(inst_idx + 1); owners.push_back(owner); } } } + // updates print order strings + if (sorted_instances.size() > 1) { + for (int i = 0; i < sorted_instances.size(); ++i) { + size_t id = sorted_instances[i]->model_instance->id().id; + std::vector::iterator it = std::find_if(owners.begin(), owners.end(), [id](const Owner& owner) { + return owner.model_instance_id == id; + }); + if (it != owners.end()) + it->print_order = _(L("Seq.")) + "#: " + std::to_string(i + 1); + } + } + // calculate eye bounding boxes center zs - for (Owner& owner : owners) - { + for (Owner& owner : owners) { owner.eye_center_z = (world_to_eye * owner.world_box.center())(2); } @@ -1325,45 +1340,45 @@ void GLCanvas3D::Labels::render() const ImGuiWrapper& imgui = *wxGetApp().imgui(); // render info windows - for (const Owner& owner : owners) - { + for (const Owner& owner : owners) { Vec3d screen_box_center = world_to_screen * owner.world_box.center(); float x = 0.0f; float y = 0.0f; - if (camera.get_type() == Camera::Perspective) - { + if (camera.get_type() == Camera::Perspective) { x = (0.5f + 0.001f * 0.5f * (float)screen_box_center(0)) * viewport[2]; y = (0.5f - 0.001f * 0.5f * (float)screen_box_center(1)) * viewport[3]; - } - else - { + } else { x = (0.5f + 0.5f * (float)screen_box_center(0)) * viewport[2]; y = (0.5f - 0.5f * (float)screen_box_center(1)) * viewport[3]; } - if ((x < 0.0f) || (viewport[2] < x) || (y < 0.0f) || (viewport[3] < y)) + if (x < 0.0f || viewport[2] < x || y < 0.0f || viewport[3] < y) continue; ImGui::PushStyleVar(ImGuiStyleVar_WindowBorderSize, owner.selected ? 3.0f : 1.5f); ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 0.0f); ImGui::PushStyleColor(ImGuiCol_Border, owner.selected ? ImVec4(0.757f, 0.404f, 0.216f, 1.0f) : ImVec4(0.75f, 0.75f, 0.75f, 1.0f)); imgui.set_next_window_pos(x, y, ImGuiCond_Always, 0.5f, 0.5f); - imgui.begin(owner.id_str, ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoMove); + imgui.begin(owner.title, ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoMove); ImGui::BringWindowToDisplayFront(ImGui::GetCurrentWindow()); float win_w = ImGui::GetWindowWidth(); - std::string object_str = model->objects[owner.obj_idx]->name; - float object_str_len = imgui.calc_text_size(object_str).x; - ImGui::SetCursorPosX(0.5f * (win_w - object_str_len)); + float label_len = imgui.calc_text_size(owner.label).x; + ImGui::SetCursorPosX(0.5f * (win_w - label_len)); ImGui::AlignTextToFramePadding(); - imgui.text(object_str); - float instance_str_len = imgui.calc_text_size(owner.instance_str).x; - ImGui::SetCursorPosX(0.5f * (win_w - instance_str_len)); - ImGui::AlignTextToFramePadding(); - imgui.text(owner.instance_str); + imgui.text(owner.label); + + if (!owner.print_order.empty()) + { + ImGui::Separator(); + float po_len = imgui.calc_text_size(owner.print_order).x; + ImGui::SetCursorPosX(0.5f * (win_w - po_len)); + ImGui::AlignTextToFramePadding(); + imgui.text(owner.print_order); + } // force re-render while the windows gets to its final size (it takes several frames) float content_w = 1 + ImGui::GetWindowContentRegionWidth(); - if ((content_w <= object_str_len) || (content_w <= instance_str_len)) + if (content_w <= label_len) m_canvas.request_extra_frame(); imgui.end(); @@ -4904,7 +4919,15 @@ void GLCanvas3D::_render_overlays() const m_layers_editing.render_overlay(*this); #if ENABLE_SHOW_SCENE_LABELS - m_labels.render(); + const ConfigOptionBool* opt = dynamic_cast(m_config->option("complete_objects")); + bool sequential_print = (opt != nullptr) ? m_config->opt_bool("complete_objects") : false; + std::vector sorted_instances; + if (sequential_print) { + const Print* print = fff_print(); + if (print != nullptr) + sorted_instances = sort_object_instances_by_model_order(*print); + } + m_labels.render(sorted_instances); #endif // ENABLE_SHOW_SCENE_LABELS glsafe(::glPopMatrix()); diff --git a/src/slic3r/GUI/GLCanvas3D.hpp b/src/slic3r/GUI/GLCanvas3D.hpp index df9e5f152a..24675ee30c 100644 --- a/src/slic3r/GUI/GLCanvas3D.hpp +++ b/src/slic3r/GUI/GLCanvas3D.hpp @@ -40,6 +40,9 @@ class GCodePreviewData; struct ThumbnailData; #endif // ENABLE_THUMBNAIL_GENERATOR struct SlicingParameters; +#if ENABLE_SHOW_SCENE_LABELS +struct PrintInstance; +#endif // ENABLE_SHOW_SCENE_LABELS enum LayerHeightEditActionType : unsigned int; namespace GUI { @@ -385,7 +388,7 @@ private: void enable(bool enable) { m_enabled = enable; } void show(bool show); bool is_shown() const; - void render() const; + void render(const std::vector& sorted_instances) const; }; #endif // ENABLE_SHOW_SCENE_LABELS From 1ee2f16a7145093fcf98f5d2051f869e51e052d9 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Mon, 3 Feb 2020 13:24:11 +0100 Subject: [PATCH 218/336] 3D scene labels transparent to mouse click --- src/slic3r/GUI/GLCanvas3D.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 2c484d5542..0253e430c7 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -1359,7 +1359,7 @@ void GLCanvas3D::Labels::render(const std::vector& sorted_ ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 0.0f); ImGui::PushStyleColor(ImGuiCol_Border, owner.selected ? ImVec4(0.757f, 0.404f, 0.216f, 1.0f) : ImVec4(0.75f, 0.75f, 0.75f, 1.0f)); imgui.set_next_window_pos(x, y, ImGuiCond_Always, 0.5f, 0.5f); - imgui.begin(owner.title, ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoMove); + imgui.begin(owner.title, ImGuiWindowFlags_NoMouseInputs | ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoMove); ImGui::BringWindowToDisplayFront(ImGui::GetCurrentWindow()); float win_w = ImGui::GetWindowWidth(); float label_len = imgui.calc_text_size(owner.label).x; From 73f69f3387e6ea9d35360fa6e0483d7e2bc68d94 Mon Sep 17 00:00:00 2001 From: bubnikv Date: Mon, 3 Feb 2020 14:01:35 +0100 Subject: [PATCH 219/336] Speed up of libigl SelfIntersectMesh: The test for intersection of two triangles sharing a common edge has been optimized to reject non-overlaping triangles with the least amount of exact arithmetics predicates. Cherry pick of https://github.com/bubnikv/libigl/commit/d367762468ce3e663a62f155ee118fb6aa3657c4 --- .../igl/copyleft/cgal/SelfIntersectMesh.h | 49 ++++++++++--------- 1 file changed, 27 insertions(+), 22 deletions(-) diff --git a/src/libigl/igl/copyleft/cgal/SelfIntersectMesh.h b/src/libigl/igl/copyleft/cgal/SelfIntersectMesh.h index 5a70fc39e7..39a4e1a7e3 100644 --- a/src/libigl/igl/copyleft/cgal/SelfIntersectMesh.h +++ b/src/libigl/igl/copyleft/cgal/SelfIntersectMesh.h @@ -635,13 +635,30 @@ inline bool igl::copyleft::cgal::SelfIntersectMesh< { using namespace std; + auto opposite_vertex = [](const Index a0, const Index a1) { + // get opposite index of A + int a2=-1; + for(int c=0;c<3;++c) + if(c!=a0 && c!=a1) { + a2 = c; + break; + } + assert(a2 != -1); + return a2; + }; + // must be co-planar - if( - A.supporting_plane() != B.supporting_plane() && - A.supporting_plane() != B.supporting_plane().opposite()) - { + Index a2 = opposite_vertex(shared[0].first, shared[1].first); + if (! B.supporting_plane().has_on(A.vertex(a2))) return false; - } + + Index b2 = opposite_vertex(shared[0].second, shared[1].second); + + if (int(CGAL::coplanar_orientation(A.vertex(shared[0].first), A.vertex(shared[1].first), A.vertex(a2))) * + int(CGAL::coplanar_orientation(B.vertex(shared[0].second), B.vertex(shared[1].second), B.vertex(b2))) < 0) + // There is certainly no self intersection as the non-shared triangle vertices lie on opposite sides of the shared edge. + return false; + // Since A and B are non-degenerate the intersection must be a polygon // (triangle). Either // - the vertex of A (B) opposite the shared edge of lies on B (A), or @@ -650,22 +667,10 @@ inline bool igl::copyleft::cgal::SelfIntersectMesh< // Determine if the vertex opposite edge (a0,a1) in triangle A lies in // (intersects) triangle B const auto & opposite_point_inside = []( - const Triangle_3 & A, const Index a0, const Index a1, const Triangle_3 & B) + const Triangle_3 & A, const Index a2, const Triangle_3 & B) -> bool { - // get opposite index - Index a2 = -1; - for(int c = 0;c<3;c++) - { - if(c != a0 && c != a1) - { - a2 = c; - break; - } - } - assert(a2 != -1); - bool ret = CGAL::do_intersect(A.vertex(a2),B); - return ret; + return CGAL::do_intersect(A.vertex(a2),B); }; // Determine if edge opposite vertex va in triangle A intersects edge @@ -681,8 +686,8 @@ inline bool igl::copyleft::cgal::SelfIntersectMesh< }; if( - !opposite_point_inside(A,shared[0].first,shared[1].first,B) && - !opposite_point_inside(B,shared[0].second,shared[1].second,A) && + !opposite_point_inside(A,a2,B) && + !opposite_point_inside(B,b2,A) && !opposite_edges_intersect(A,shared[0].first,B,shared[1].second) && !opposite_edges_intersect(A,shared[1].first,B,shared[0].second)) { @@ -936,4 +941,4 @@ inline void igl::copyleft::cgal::SelfIntersectMesh< //process_chunk(0, candidate_triangle_pairs.size()); } -#endif +#endif \ No newline at end of file From 9d55121695126c113cb2eb4b65115320840dca39 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Mon, 3 Feb 2020 14:39:16 +0100 Subject: [PATCH 220/336] Move Gizmo -> added movements using arrow keys: Left arrow = decrease X by 1mm Right arrow = increase X by 1mm Up arrow = increase Y by 1mm Down arrow = decrease Y by 1mm --- src/slic3r/GUI/Gizmos/GLGizmosManager.cpp | 32 ++++++++++++++++++----- 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp b/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp index ccc6369e46..beca637987 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp @@ -497,7 +497,7 @@ bool GLGizmosManager::on_mouse(wxMouseEvent& evt) processed = true; } else if (evt.Dragging() && (m_parent.get_move_volume_id() != -1) && (m_current == SlaSupports || m_current == Hollow)) - // don't allow dragging objects with the Sla gizmo on + // don't allow dragging objects with the Sla gizmo on processed = true; else if (evt.Dragging() && (m_current == SlaSupports || m_current == Hollow) && gizmo_event(SLAGizmoEventType::Dragging, mouse_pos, evt.ShiftDown(), evt.AltDown(), evt.ControlDown())) { @@ -554,12 +554,9 @@ bool GLGizmosManager::on_mouse(wxMouseEvent& evt) else if (evt.LeftUp() && is_dragging()) { switch (m_current) { - case Move : m_parent.do_move(L("Gizmo-Move")); - break; - case Scale : m_parent.do_scale(L("Gizmo-Scale")); - break; - case Rotate : m_parent.do_rotate(L("Gizmo-Rotate")); - break; + case Move : m_parent.do_move(L("Gizmo-Move")); break; + case Scale : m_parent.do_scale(L("Gizmo-Scale")); break; + case Rotate : m_parent.do_rotate(L("Gizmo-Rotate")); break; default : break; } @@ -776,6 +773,27 @@ bool GLGizmosManager::on_key(wxKeyEvent& evt) processed = true; } } + else if (m_current == Move) + { + auto do_move = [this, &processed](const Vec3d& displacement) { + Selection& selection = m_parent.get_selection(); + selection.start_dragging(); + selection.translate(displacement); + wxGetApp().obj_manipul()->set_dirty(); + m_parent.do_move(L("Gizmo-Move")); + m_parent.set_as_dirty(); + processed = true; + }; + + switch (keyCode) + { + case WXK_NUMPAD_LEFT: case WXK_LEFT: { do_move(-Vec3d::UnitX()); break; } + case WXK_NUMPAD_RIGHT: case WXK_RIGHT: { do_move(Vec3d::UnitX()); break; } + case WXK_NUMPAD_UP: case WXK_UP: { do_move(Vec3d::UnitY()); break; } + case WXK_NUMPAD_DOWN: case WXK_DOWN: { do_move(-Vec3d::UnitY()); break; } + default: { break; } + } + } // if (processed) // m_parent.set_cursor(GLCanvas3D::Standard); From c09091c40703bdfae84e4bee3094bf6db23d8487 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Mon, 3 Feb 2020 14:51:25 +0100 Subject: [PATCH 221/336] Rotate Gizmo -> added rotations using arrow keys: Left arrow = 90 degrees around Z axis CCW Right arrow = 90 degrees around Z axis CW Up arrow = 45 degrees around Z axis CCW Down arrow = 45 degrees around Z axis CW --- src/slic3r/GUI/Gizmos/GLGizmosManager.cpp | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp b/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp index beca637987..d830e4f3a1 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp @@ -794,6 +794,27 @@ bool GLGizmosManager::on_key(wxKeyEvent& evt) default: { break; } } } + else if (m_current == Rotate) + { + auto do_rotate = [this, &processed](const Vec3d& rotation) { + Selection& selection = m_parent.get_selection(); + selection.start_dragging(); + selection.rotate(rotation, TransformationType(TransformationType::World_Relative_Joint)); + wxGetApp().obj_manipul()->set_dirty(); + m_parent.do_rotate(L("Gizmo-Rotate")); + m_parent.set_as_dirty(); + processed = true; + }; + + switch (keyCode) + { + case WXK_NUMPAD_LEFT: case WXK_LEFT: { do_rotate(Vec3d(0.0, 0.0, 0.5 * M_PI)); break; } + case WXK_NUMPAD_RIGHT: case WXK_RIGHT: { do_rotate(-Vec3d(0.0, 0.0, 0.5 * M_PI)); break; } + case WXK_NUMPAD_UP: case WXK_UP: { do_rotate(Vec3d(0.0, 0.0, 0.25 * M_PI)); break; } + case WXK_NUMPAD_DOWN: case WXK_DOWN: { do_rotate(-Vec3d(0.0, 0.0, 0.25 * M_PI)); break; } + default: { break; } + } + } // if (processed) // m_parent.set_cursor(GLCanvas3D::Standard); From 8453c8848238c1bb20bc7dc85cad4763203534c9 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Mon, 3 Feb 2020 15:00:49 +0100 Subject: [PATCH 222/336] Cut Gizmo -> added movements using arrow keys: Up arrow = increase Z by 1mm Down arrow = decrease Z by 1mm --- src/slic3r/GUI/Gizmos/GLGizmoCut.cpp | 4 +++- src/slic3r/GUI/Gizmos/GLGizmoCut.hpp | 4 +++- src/slic3r/GUI/Gizmos/GLGizmosManager.cpp | 16 ++++++++++++++++ 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/src/slic3r/GUI/Gizmos/GLGizmoCut.cpp b/src/slic3r/GUI/Gizmos/GLGizmoCut.cpp index e98446749f..52d710249b 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoCut.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoCut.cpp @@ -9,6 +9,8 @@ #include #include +#include + #include "slic3r/GUI/GUI_App.hpp" @@ -189,7 +191,7 @@ void GLGizmoCut::update_max_z(const Selection& selection) const void GLGizmoCut::set_cut_z(double cut_z) const { // Clamp the plane to the object's bounding box - m_cut_z = std::max(0.0, std::min(m_max_z, cut_z)); + m_cut_z = std::clamp(cut_z, 0.0, m_max_z); } void GLGizmoCut::perform_cut(const Selection& selection) diff --git a/src/slic3r/GUI/Gizmos/GLGizmoCut.hpp b/src/slic3r/GUI/Gizmos/GLGizmoCut.hpp index 6e5738a422..b6e10861fc 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoCut.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoCut.hpp @@ -25,6 +25,9 @@ class GLGizmoCut : public GLGizmoBase public: GLGizmoCut(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id); + double get_cut_z() const { return m_cut_z; } + void set_cut_z(double cut_z) const; + protected: virtual bool on_init(); virtual void on_load(cereal::BinaryInputArchive& ar) { ar(m_cut_z, m_keep_upper, m_keep_lower, m_rotate_lower); } @@ -40,7 +43,6 @@ protected: private: void update_max_z(const Selection& selection) const; - void set_cut_z(double cut_z) const; void perform_cut(const Selection& selection); double calc_projection(const Linef3& mouse_ray) const; }; diff --git a/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp b/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp index d830e4f3a1..e1b4a97e80 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp @@ -815,6 +815,22 @@ bool GLGizmosManager::on_key(wxKeyEvent& evt) default: { break; } } } + else if (m_current == Cut) + { + auto do_move = [this, &processed](double delta_z) { + GLGizmoCut* cut = dynamic_cast(get_current()); + cut->set_cut_z(delta_z + cut->get_cut_z()); + m_parent.set_as_dirty(); + processed = true; + }; + + switch (keyCode) + { + case WXK_NUMPAD_UP: case WXK_UP: { do_move(1.0); break; } + case WXK_NUMPAD_DOWN: case WXK_DOWN: { do_move(-1.0); break; } + default: { break; } + } + } // if (processed) // m_parent.set_cursor(GLCanvas3D::Standard); From f28d0ebc1871e8fc3687e897a06a3cc10c0b87cf Mon Sep 17 00:00:00 2001 From: bubnikv Date: Mon, 3 Feb 2020 12:55:38 +0100 Subject: [PATCH 223/336] Implemented reload of original mesh volume in case the SLA hollowing step is no more valid. --- src/slic3r/GUI/3DScene.hpp | 57 +++++++++++++++------------ src/slic3r/GUI/GLCanvas3D.cpp | 74 +++++++++++++++++++---------------- 2 files changed, 72 insertions(+), 59 deletions(-) diff --git a/src/slic3r/GUI/3DScene.hpp b/src/slic3r/GUI/3DScene.hpp index 5d559c246d..aed907004f 100644 --- a/src/slic3r/GUI/3DScene.hpp +++ b/src/slic3r/GUI/3DScene.hpp @@ -313,33 +313,38 @@ public: // Valid geometry_id should always be positive. std::pair geometry_id; // An ID containing the extruder ID (used to select color). - int extruder_id; - // Is this object selected? - bool selected; - // Is this object disabled from selection? - bool disabled; - // Is this object printable? - bool printable; - // Whether or not this volume is active for rendering - bool is_active; - // Whether or not to use this volume when applying zoom_to_volumes() - bool zoom_to_volumes; - // Wheter or not this volume is enabled for outside print volume detection in shader. - bool shader_outside_printer_detection_enabled; - // Wheter or not this volume is outside print volume. - bool is_outside; + int extruder_id; + + // Various boolean flags. + struct { + // Is this object selected? + bool selected : 1; + // Is this object disabled from selection? + bool disabled : 1; + // Is this object printable? + bool printable : 1; + // Whether or not this volume is active for rendering + bool is_active : 1; + // Whether or not to use this volume when applying zoom_to_volumes() + bool zoom_to_volumes : 1; + // Wheter or not this volume is enabled for outside print volume detection in shader. + bool shader_outside_printer_detection_enabled : 1; + // Wheter or not this volume is outside print volume. + bool is_outside : 1; + // Wheter or not this volume has been generated from a modifier + bool is_modifier : 1; + // Wheter or not this volume has been generated from the wipe tower + bool is_wipe_tower : 1; + // Wheter or not this volume has been generated from an extrusion path + bool is_extrusion_path : 1; + // Wheter or not to always render this volume using its own alpha + bool force_transparent : 1; + // Whether or not always use the volume's own color (not using SELECTED/HOVER/DISABLED/OUTSIDE) + bool force_native_color : 1; + }; + // Is mouse or rectangle selection over this object to select/deselect it ? - EHoverState hover; - // Wheter or not this volume has been generated from a modifier - bool is_modifier; - // Wheter or not this volume has been generated from the wipe tower - bool is_wipe_tower; - // Wheter or not this volume has been generated from an extrusion path - bool is_extrusion_path; - // Wheter or not to always render this volume using its own alpha - bool force_transparent; - // Whether or not always use the volume's own color (not using SELECTED/HOVER/DISABLED/OUTSIDE) - bool force_native_color; + EHoverState hover; // Interleaved triangles & normals with indexed triangles & quads. GLIndexedVertexArray indexed_vertex_array; diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index fa3a25b79d..e0c7a77a0d 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -2143,8 +2143,6 @@ void GLCanvas3D::reload_scene(bool refresh_immediately, bool force_full_scene_re const ModelObject *model_object = print_object->model_object(); // Find an index of the ModelObject int object_idx; - if (std::all_of(state.step.begin(), state.step.end(), [](const PrintStateBase::StateWithTimeStamp &state){ return state.state != PrintStateBase::DONE; })) - continue; // There may be new SLA volumes added to the scene for this print_object. // Find the object index of this print_object in the Model::objects list. auto it = std::find(sla_print->model().objects.begin(), sla_print->model().objects.end(), model_object); @@ -2163,39 +2161,49 @@ void GLCanvas3D::reload_scene(bool refresh_immediately, bool force_full_scene_re assert(it != model_object->instances.end()); int instance_idx = it - model_object->instances.begin(); for (size_t istep = 0; istep < sla_steps.size(); ++ istep) - if (state.step[istep].state == PrintStateBase::DONE) { - if (sla_steps[istep] == slaposHollowing) { - // Check whether there is a main object mesh, which we may update with the hollowed mesh. - ModelVolumeState key(model_object->volumes.front()->id(), instance.instance_id); - auto it = std::lower_bound(model_volume_state.begin(), model_volume_state.end(), key, model_volume_state_lower); - assert(it != model_volume_state.end() && it->geometry_id == key.geometry_id); - assert(!it->new_geometry()); - GLVolume& volume = *m_volumes.volumes[it->volume_idx]; - TriangleMesh mesh = print_object->get_mesh(slaposHollowing); - if (!mesh.empty()) { - Transform3d t = sla_print->sla_trafo(*m_model->objects[volume.object_idx()]); - mesh.transform(t.inverse()); - volume.indexed_vertex_array.release_geometry(); + if (sla_steps[istep] == slaposHollowing) { + // Hollowing is a special case, where the mesh from the backend is being loaded into the 1st volume of an instance, + // not into its own GLVolume. + // There shall always be such a GLVolume allocated. + ModelVolumeState key(model_object->volumes.front()->id(), instance.instance_id); + auto it = std::lower_bound(model_volume_state.begin(), model_volume_state.end(), key, model_volume_state_lower); + assert(it != model_volume_state.end() && it->geometry_id == key.geometry_id); + assert(!it->new_geometry()); + GLVolume &volume = *m_volumes.volumes[it->volume_idx]; + if (! volume.offsets.empty() && state.step[istep].timestamp != volume.offsets.front()) { + // The backend either produced a new hollowed mesh, or it invalidated the one that the front end has seen. + volume.indexed_vertex_array.release_geometry(); + if (state.step[istep].state == PrintStateBase::DONE) { + TriangleMesh mesh = print_object->get_mesh(slaposHollowing); + assert(! mesh.empty()); + mesh.transform(sla_print->sla_trafo(*m_model->objects[volume.object_idx()]).inverse()); volume.indexed_vertex_array.load_mesh(mesh); - volume.finalize_geometry(true); - } + } else { + // Reload the original volume. + volume.indexed_vertex_array.load_mesh(m_model->objects[volume.object_idx()]->volumes[volume.volume_idx()]->mesh()); + } + volume.finalize_geometry(true); + } + //FIXME it is an ugly hack to write the timestamp into the "offsets" field to not have to add another member variable + // to the GLVolume. We should refactor GLVolume significantly, so that the GLVolume will not contain member variables + // of various concenrs (model vs. 3D print path). + volume.offsets = { state.step[istep].timestamp }; + } else if (state.step[istep].state == PrintStateBase::DONE) { + // Check whether there is an existing auxiliary volume to be updated, or a new auxiliary volume to be created. + ModelVolumeState key(state.step[istep].timestamp, instance.instance_id.id); + auto it = std::lower_bound(aux_volume_state.begin(), aux_volume_state.end(), key, model_volume_state_lower); + assert(it != aux_volume_state.end() && it->geometry_id == key.geometry_id); + if (it->new_geometry()) { + // This can be an SLA support structure that should not be rendered (in case someone used undo + // to revert to before it was generated). If that's the case, we should not generate anything. + if (model_object->sla_points_status != sla::PointsStatus::NoPoints) + instances[istep].emplace_back(std::pair(instance_idx, print_instance_idx)); + else + shift_zs[object_idx] = 0.; } else { - // Check whether there is an existing auxiliary volume to be updated, or a new auxiliary volume to be created. - ModelVolumeState key(state.step[istep].timestamp, instance.instance_id.id); - auto it = std::lower_bound(aux_volume_state.begin(), aux_volume_state.end(), key, model_volume_state_lower); - assert(it != aux_volume_state.end() && it->geometry_id == key.geometry_id); - if (it->new_geometry()) { - // This can be an SLA support structure that should not be rendered (in case someone used undo - // to revert to before it was generated). If that's the case, we should not generate anything. - if (model_object->sla_points_status != sla::PointsStatus::NoPoints) - instances[istep].emplace_back(std::pair(instance_idx, print_instance_idx)); - else - shift_zs[object_idx] = 0.; - } else { - // Recycling an old GLVolume. Update the Object/Instance indices into the current Model. - m_volumes.volumes[it->volume_idx]->composite_id = GLVolume::CompositeID(object_idx, m_volumes.volumes[it->volume_idx]->volume_idx(), instance_idx); - m_volumes.volumes[it->volume_idx]->set_instance_transformation(model_object->instances[instance_idx]->get_transformation()); - } + // Recycling an old GLVolume. Update the Object/Instance indices into the current Model. + m_volumes.volumes[it->volume_idx]->composite_id = GLVolume::CompositeID(object_idx, m_volumes.volumes[it->volume_idx]->volume_idx(), instance_idx); + m_volumes.volumes[it->volume_idx]->set_instance_transformation(model_object->instances[instance_idx]->get_transformation()); } } } From 79da3a95e18bef9a3484737a818659191d577b98 Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Fri, 31 Jan 2020 15:54:16 +0100 Subject: [PATCH 224/336] Clipping plane is now common for Hollowing and SLA supports gizmos --- src/slic3r/GUI/Gizmos/GLGizmoBase.cpp | 2 + src/slic3r/GUI/Gizmos/GLGizmoBase.hpp | 13 +++++ src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp | 53 +++++++++++--------- src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp | 6 +-- src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp | 51 ++++++++++--------- src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp | 3 +- 6 files changed, 73 insertions(+), 55 deletions(-) diff --git a/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp b/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp index 463c681a69..653bfefb5b 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp @@ -374,6 +374,8 @@ bool CommonGizmosData::update_from_backend(GLCanvas3D& canvas, ModelObject* mode m_object_clipper.reset(); m_supports_clipper.reset(); m_old_mesh = m_mesh; + m_clipping_plane_distance = 0.f; + m_clipping_plane_distance_stash = 0.f; recent_update = true; return true; } diff --git a/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp b/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp index 85f87c8f53..5cd3d9d84c 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp @@ -32,6 +32,7 @@ static const float CONSTRAINED_COLOR[4] = { 0.5f, 0.5f, 0.5f, 1.0f }; class ImGuiWrapper; class CommonGizmosData; class GLCanvas3D; +class ClippingPlane; class GLGizmoBase { @@ -215,9 +216,21 @@ public: int m_print_objects_count = -1; int m_old_timestamp = -1; + float m_clipping_plane_distance = 0.f; + std::unique_ptr m_clipping_plane; + + void stash_clipping_plane() { + m_clipping_plane_distance_stash = m_clipping_plane_distance; + } + + void unstash_clipping_plane() { + m_clipping_plane_distance = m_clipping_plane_distance_stash; + } + private: const TriangleMesh* m_old_mesh; TriangleMesh m_backend_mesh_transformed; + float m_clipping_plane_distance_stash = 0.f; }; } // namespace GUI diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp index 1bb18a7557..3db5e1e132 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp @@ -22,7 +22,7 @@ GLGizmoHollow::GLGizmoHollow(GLCanvas3D& parent, const std::string& icon_filenam : GLGizmoBase(parent, icon_filename, sprite_id, cd) , m_quadric(nullptr) { - m_clipping_plane.reset(new ClippingPlane(Vec3d::Zero(), 0.)); + m_c->m_clipping_plane.reset(new ClippingPlane(Vec3d::Zero(), 0.)); m_quadric = ::gluNewQuadric(); if (m_quadric != nullptr) // using GLU_FILL does not work when the instance's transformation @@ -132,7 +132,7 @@ void GLGizmoHollow::render_hollowed_mesh() const void GLGizmoHollow::render_clipping_plane(const Selection& selection) const { - if (m_clipping_plane_distance == 0.f) + if (m_c->m_clipping_plane_distance == 0.f) return; // Get transformation of the instance @@ -154,7 +154,7 @@ void GLGizmoHollow::render_clipping_plane(const Selection& selection) const m_c->m_object_clipper.reset(new MeshClipper); m_c->m_object_clipper->set_mesh(*m_c->mesh()); } - m_c->m_object_clipper->set_plane(*m_clipping_plane); + m_c->m_object_clipper->set_plane(*m_c->m_clipping_plane); m_c->m_object_clipper->set_transformation(trafo); @@ -177,7 +177,7 @@ void GLGizmoHollow::render_clipping_plane(const Selection& selection) const m_c->m_supports_clipper->set_mesh(print_object->support_mesh()); m_c->m_old_timestamp = timestamp; } - m_c->m_supports_clipper->set_plane(*m_clipping_plane); + m_c->m_supports_clipper->set_plane(*m_c->m_clipping_plane); m_c->m_supports_clipper->set_transformation(supports_trafo); } else @@ -314,12 +314,12 @@ void GLGizmoHollow::render_points(const Selection& selection, bool picking) cons bool GLGizmoHollow::is_mesh_point_clipped(const Vec3d& point) const { - if (m_clipping_plane_distance == 0.f) + if (m_c->m_clipping_plane_distance == 0.f) return false; Vec3d transformed_point = m_c->m_model_object->instances[m_c->m_active_instance]->get_transformation().get_matrix() * point; transformed_point(2) += m_z_shift; - return m_clipping_plane->is_point_clipped(transformed_point); + return m_c->m_clipping_plane->is_point_clipped(transformed_point); } @@ -343,7 +343,7 @@ bool GLGizmoHollow::unproject_on_mesh(const Vec2d& mouse_pos, std::pairm_mesh_raycaster->unproject_on_mesh(mouse_pos, trafo.get_matrix(), camera, hit, normal, m_clipping_plane.get())) { + if (m_c->m_mesh_raycaster->unproject_on_mesh(mouse_pos, trafo.get_matrix(), camera, hit, normal, m_c->m_clipping_plane.get())) { // Return both the point and the facet normal. pos_and_normal = std::make_pair(hit, normal); return true; @@ -429,7 +429,7 @@ bool GLGizmoHollow::gizmo_event(SLAGizmoEventType action, const Vec2d& mouse_pos points_inside.push_back(points[idx].cast()); // Only select/deselect points that are actually visible - for (size_t idx : m_c->m_mesh_raycaster->get_unobscured_idxs(trafo, m_parent.get_camera(), points_inside, m_clipping_plane.get())) + for (size_t idx : m_c->m_mesh_raycaster->get_unobscured_idxs(trafo, m_parent.get_camera(), points_inside, m_c->m_clipping_plane.get())) { if (rectangle_status == GLSelectionRectangle::Deselect) unselect_point(points_idxs[idx]); @@ -483,13 +483,13 @@ bool GLGizmoHollow::gizmo_event(SLAGizmoEventType action, const Vec2d& mouse_pos } if (action == SLAGizmoEventType::MouseWheelUp && control_down) { - m_clipping_plane_distance = std::min(1.f, m_clipping_plane_distance + 0.01f); + m_c->m_clipping_plane_distance = std::min(1.f, m_c->m_clipping_plane_distance + 0.01f); update_clipping_plane(true); return true; } if (action == SLAGizmoEventType::MouseWheelDown && control_down) { - m_clipping_plane_distance = std::max(0.f, m_clipping_plane_distance - 0.01f); + m_c->m_clipping_plane_distance = std::max(0.f, m_c->m_clipping_plane_distance - 0.01f); update_clipping_plane(true); return true; } @@ -602,8 +602,8 @@ void GLGizmoHollow::update_hollowed_mesh(std::unique_ptr &&mesh) m_c->m_mesh_raycaster.reset(new MeshRaycaster(*m_c->mesh())); } - if (m_clipping_plane_distance == 0.f) { - m_clipping_plane_distance = 0.5f; + if (m_c->m_clipping_plane_distance == 0.f) { + m_c->m_clipping_plane_distance = 0.5f; update_clipping_plane(); }*/ } @@ -638,10 +638,10 @@ std::vector> GLGizmoHollo ClippingPlane GLGizmoHollow::get_sla_clipping_plane() const { - if (!m_c->m_model_object || m_state == Off || m_clipping_plane_distance == 0.f) + if (!m_c->m_model_object || m_state == Off || m_c->m_clipping_plane_distance == 0.f) return ClippingPlane::ClipsNothing(); else - return ClippingPlane(-m_clipping_plane->get_normal(), m_clipping_plane->get_data()[3]); + return ClippingPlane(-m_c->m_clipping_plane->get_normal(), m_c->m_clipping_plane->get_data()[3]); } @@ -842,7 +842,7 @@ RENDER_AGAIN: // Following is rendered in both editing and non-editing mode: // m_imgui->text(""); ImGui::Separator(); - if (m_clipping_plane_distance == 0.f) + if (m_c->m_clipping_plane_distance == 0.f) m_imgui->text(m_desc.at("clipping_of_view")); else { if (m_imgui->button(m_desc.at("reset_direction"))) { @@ -854,7 +854,7 @@ RENDER_AGAIN: ImGui::SameLine(clipping_slider_left); ImGui::PushItemWidth(window_width - clipping_slider_left); - if (ImGui::SliderFloat(" ", &m_clipping_plane_distance, 0.f, 1.f, "%.2f")) + if (ImGui::SliderFloat(" ", &m_c->m_clipping_plane_distance, 0.f, 1.f, "%.2f")) update_clipping_plane(true); // make sure supports are shown/hidden as appropriate @@ -934,6 +934,8 @@ void GLGizmoHollow::on_set_state() if (m_state == On && m_old_state != On) { // the gizmo was just turned on //Plater::TakeSnapshot snapshot(wxGetApp().plater(), _(L("SLA gizmo turned on"))); //m_c->update_from_backend(m_parent, m_c->m_model_object); + m_c->unstash_clipping_plane(); + update_clipping_plane(m_c->m_clipping_plane_distance != 0.f); // we'll now reload support points: if (m_c->m_model_object) @@ -952,8 +954,9 @@ void GLGizmoHollow::on_set_state() if (m_state == Off && m_old_state != Off) { // the gizmo was just turned Off //Plater::TakeSnapshot snapshot(wxGetApp().plater(), _(L("SLA gizmo turned off"))); m_parent.toggle_model_objects_visibility(true); - m_clipping_plane_distance = 0.f; - update_clipping_plane(); + m_c->stash_clipping_plane(); + m_c->m_clipping_plane_distance = 0.f; + update_clipping_plane(true); // Release clippers and the AABB raycaster. m_c->m_object_clipper.reset(); m_c->m_supports_clipper.reset(); @@ -998,8 +1001,8 @@ void GLGizmoHollow::on_stop_dragging() void GLGizmoHollow::on_load(cereal::BinaryInputArchive& ar) { - ar(m_clipping_plane_distance, - *m_clipping_plane, + ar(m_c->m_clipping_plane_distance, + *m_c->m_clipping_plane, m_c->m_model_object_id, m_new_hole_radius, m_new_hole_height, @@ -1012,8 +1015,8 @@ void GLGizmoHollow::on_load(cereal::BinaryInputArchive& ar) void GLGizmoHollow::on_save(cereal::BinaryOutputArchive& ar) const { - ar(m_clipping_plane_distance, - *m_clipping_plane, + ar(m_c->m_clipping_plane_distance, + *m_c->m_clipping_plane, m_c->m_model_object_id, m_new_hole_radius, m_new_hole_height, @@ -1068,12 +1071,12 @@ void GLGizmoHollow::update_clipping_plane(bool keep_normal) const { if (! m_c->m_model_object) return; - Vec3d normal = (keep_normal && m_clipping_plane->get_normal() != Vec3d::Zero() ? - m_clipping_plane->get_normal() : -m_parent.get_camera().get_dir_forward()); + Vec3d normal = (keep_normal && m_c->m_clipping_plane->get_normal() != Vec3d::Zero() ? + m_c->m_clipping_plane->get_normal() : -m_parent.get_camera().get_dir_forward()); const Vec3d& center = m_c->m_model_object->instances[m_c->m_active_instance]->get_offset() + Vec3d(0., 0., m_z_shift); float dist = normal.dot(center); - *m_clipping_plane = ClippingPlane(normal, (dist - (-m_c->m_active_instance_bb_radius) - m_clipping_plane_distance * 2*m_c->m_active_instance_bb_radius)); + *m_c->m_clipping_plane = ClippingPlane(normal, (dist - (-m_c->m_active_instance_bb_radius) - m_c->m_clipping_plane_distance * 2*m_c->m_active_instance_bb_radius)); m_parent.set_as_dirty(); } diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp index 5745b93934..6264304b73 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp @@ -70,13 +70,9 @@ private: float m_closing_d_stash = 2.f; Vec3f m_hole_before_drag = Vec3f::Zero(); - sla::DrainHoles m_holes_stash; - - - float m_clipping_plane_distance = 0.f; - std::unique_ptr m_clipping_plane; + //std::unique_ptr m_clipping_plane; // This map holds all translated description texts, so they can be easily referenced during layout calculations // etc. When language changes, GUI is recreated and this class constructed again, so the change takes effect. diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp index c1c3c6d1ce..879a09da2e 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp @@ -27,7 +27,7 @@ GLGizmoSlaSupports::GLGizmoSlaSupports(GLCanvas3D& parent, const std::string& ic , m_quadric(nullptr) , m_its(nullptr) { - m_clipping_plane.reset(new ClippingPlane(Vec3d::Zero(), 0.)); + m_c->m_clipping_plane.reset(new ClippingPlane(Vec3d::Zero(), 0.)); m_quadric = ::gluNewQuadric(); if (m_quadric != nullptr) // using GLU_FILL does not work when the instance's transformation @@ -142,7 +142,7 @@ void GLGizmoSlaSupports::render_hollowed_mesh() const void GLGizmoSlaSupports::render_clipping_plane(const Selection& selection) const { - if (m_clipping_plane_distance == 0.f || m_c->m_mesh->empty()) + if (m_c->m_clipping_plane_distance == 0.f || m_c->m_mesh->empty()) return; // Get transformation of the instance @@ -164,7 +164,7 @@ void GLGizmoSlaSupports::render_clipping_plane(const Selection& selection) const m_c->m_object_clipper.reset(new MeshClipper); m_c->m_object_clipper->set_mesh(*m_c->mesh()); } - m_c->m_object_clipper->set_plane(*m_clipping_plane); + m_c->m_object_clipper->set_plane(*m_c->m_clipping_plane); m_c->m_object_clipper->set_transformation(trafo); @@ -195,7 +195,7 @@ void GLGizmoSlaSupports::render_clipping_plane(const Selection& selection) const m_c->m_supports_clipper->set_mesh(print_object->support_mesh()); m_c->m_old_timestamp = timestamp; } - m_c->m_supports_clipper->set_plane(*m_clipping_plane); + m_c->m_supports_clipper->set_plane(*m_c->m_clipping_plane); m_c->m_supports_clipper->set_transformation(supports_trafo); } else @@ -382,12 +382,12 @@ void GLGizmoSlaSupports::render_points(const Selection& selection, bool picking) bool GLGizmoSlaSupports::is_mesh_point_clipped(const Vec3d& point) const { - if (m_clipping_plane_distance == 0.f) + if (m_c->m_clipping_plane_distance == 0.f) return false; Vec3d transformed_point = m_c->m_model_object->instances[m_c->m_active_instance]->get_transformation().get_matrix() * point; transformed_point(2) += m_z_shift; - return m_clipping_plane->is_point_clipped(transformed_point); + return m_c->m_clipping_plane->is_point_clipped(transformed_point); } @@ -408,7 +408,7 @@ bool GLGizmoSlaSupports::unproject_on_mesh(const Vec2d& mouse_pos, std::pairm_mesh_raycaster->unproject_on_mesh(mouse_pos, trafo.get_matrix(), camera, hit, normal, m_clipping_plane.get())) { + if (m_c->m_mesh_raycaster->unproject_on_mesh(mouse_pos, trafo.get_matrix(), camera, hit, normal, m_c->m_clipping_plane.get())) { // Check whether the hit is in a hole bool in_hole = false; // In case the hollowed and drilled mesh is available, we can allow @@ -502,7 +502,7 @@ bool GLGizmoSlaSupports::gizmo_event(SLAGizmoEventType action, const Vec2d& mous points_inside.push_back(points[idx].cast()); // Only select/deselect points that are actually visible - for (size_t idx : m_c->m_mesh_raycaster->get_unobscured_idxs(trafo, m_parent.get_camera(), points_inside, m_clipping_plane.get())) + for (size_t idx : m_c->m_mesh_raycaster->get_unobscured_idxs(trafo, m_parent.get_camera(), points_inside, m_c->m_clipping_plane.get())) { if (rectangle_status == GLSelectionRectangle::Deselect) unselect_point(points_idxs[idx]); @@ -579,13 +579,13 @@ bool GLGizmoSlaSupports::gizmo_event(SLAGizmoEventType action, const Vec2d& mous } if (action == SLAGizmoEventType::MouseWheelUp && control_down) { - m_clipping_plane_distance = std::min(1.f, m_clipping_plane_distance + 0.01f); + m_c->m_clipping_plane_distance = std::min(1.f, m_c->m_clipping_plane_distance + 0.01f); update_clipping_plane(true); return true; } if (action == SLAGizmoEventType::MouseWheelDown && control_down) { - m_clipping_plane_distance = std::max(0.f, m_clipping_plane_distance - 0.01f); + m_c->m_clipping_plane_distance = std::max(0.f, m_c->m_clipping_plane_distance - 0.01f); update_clipping_plane(true); return true; } @@ -666,10 +666,10 @@ std::vector GLGizmoSlaSupports::get_config_options(const st ClippingPlane GLGizmoSlaSupports::get_sla_clipping_plane() const { - if (!m_c->m_model_object || m_state == Off || m_clipping_plane_distance == 0.f) + if (!m_c->m_model_object || m_state == Off || m_c->m_clipping_plane_distance == 0.f) return ClippingPlane::ClipsNothing(); else - return ClippingPlane(-m_clipping_plane->get_normal(), m_clipping_plane->get_data()[3]); + return ClippingPlane(-m_c->m_clipping_plane->get_normal(), m_c->m_clipping_plane->get_data()[3]); } @@ -891,7 +891,7 @@ RENDER_AGAIN: // Following is rendered in both editing and non-editing mode: ImGui::Separator(); - if (m_clipping_plane_distance == 0.f) + if (m_c->m_clipping_plane_distance == 0.f) { ImGui::AlignTextToFramePadding(); m_imgui->text(m_desc.at("clipping_of_view")); @@ -906,7 +906,7 @@ RENDER_AGAIN: ImGui::SameLine(clipping_slider_left); ImGui::PushItemWidth(window_width - clipping_slider_left); - if (ImGui::SliderFloat(" ", &m_clipping_plane_distance, 0.f, 1.f, "%.2f")) + if (ImGui::SliderFloat(" ", &m_c->m_clipping_plane_distance, 0.f, 1.f, "%.2f")) update_clipping_plane(true); @@ -991,6 +991,10 @@ void GLGizmoSlaSupports::on_set_state() if (m_state == On && m_old_state != On) { // the gizmo was just turned on Plater::TakeSnapshot snapshot(wxGetApp().plater(), _(L("SLA gizmo turned on"))); + m_c->unstash_clipping_plane(); + update_clipping_plane(m_c->m_clipping_plane_distance != 0.f); + + // we'll now reload support points: if (m_c->m_model_object) reload_cache(); @@ -1026,8 +1030,9 @@ void GLGizmoSlaSupports::on_set_state() Plater::TakeSnapshot snapshot(wxGetApp().plater(), _(L("SLA gizmo turned off"))); m_parent.toggle_model_objects_visibility(true); m_normal_cache.clear(); - m_clipping_plane_distance = 0.f; - update_clipping_plane(); + m_c->stash_clipping_plane(); + m_c->m_clipping_plane_distance = 0.f; + update_clipping_plane(true); // Release clippers and the AABB raycaster. m_its = nullptr; m_c->m_object_clipper.reset(); @@ -1072,8 +1077,8 @@ void GLGizmoSlaSupports::on_stop_dragging() void GLGizmoSlaSupports::on_load(cereal::BinaryInputArchive& ar) { - ar(m_clipping_plane_distance, - *m_clipping_plane, + ar(m_c->m_clipping_plane_distance, + *m_c->m_clipping_plane, m_c->m_model_object_id, m_new_point_head_diameter, m_normal_cache, @@ -1086,8 +1091,8 @@ void GLGizmoSlaSupports::on_load(cereal::BinaryInputArchive& ar) void GLGizmoSlaSupports::on_save(cereal::BinaryOutputArchive& ar) const { - ar(m_clipping_plane_distance, - *m_clipping_plane, + ar(m_c->m_clipping_plane_distance, + *m_c->m_clipping_plane, m_c->m_model_object_id, m_new_point_head_diameter, m_normal_cache, @@ -1286,12 +1291,12 @@ bool GLGizmoSlaSupports::unsaved_changes() const void GLGizmoSlaSupports::update_clipping_plane(bool keep_normal) const { - Vec3d normal = (keep_normal && m_clipping_plane->get_normal() != Vec3d::Zero() ? - m_clipping_plane->get_normal() : -m_parent.get_camera().get_dir_forward()); + Vec3d normal = (keep_normal && m_c->m_clipping_plane->get_normal() != Vec3d::Zero() ? + m_c->m_clipping_plane->get_normal() : -m_parent.get_camera().get_dir_forward()); const Vec3d& center = m_c->m_model_object->instances[m_c->m_active_instance]->get_offset() + Vec3d(0., 0., m_z_shift); float dist = normal.dot(center); - *m_clipping_plane = ClippingPlane(normal, (dist - (-m_c->m_active_instance_bb_radius) - m_clipping_plane_distance * 2*m_c->m_active_instance_bb_radius)); + *m_c->m_clipping_plane = ClippingPlane(normal, (dist - (-m_c->m_active_instance_bb_radius) - m_c->m_clipping_plane_distance * 2*m_c->m_active_instance_bb_radius)); m_parent.set_as_dirty(); } diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp index 152979f83d..7ded6aadb4 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp @@ -103,8 +103,7 @@ private: mutable std::vector m_editing_cache; // a support point and whether it is currently selected std::vector m_normal_cache; // to restore after discarding changes or undo/redo - float m_clipping_plane_distance = 0.f; - std::unique_ptr m_clipping_plane; + //std::unique_ptr m_clipping_plane; // This map holds all translated description texts, so they can be easily referenced during layout calculations // etc. When language changes, GUI is recreated and this class constructed again, so the change takes effect. From d407fda43326f4a767c85b6b7a4c900fe70a4e5b Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Mon, 3 Feb 2020 14:45:26 +0100 Subject: [PATCH 225/336] Hollowing gizmo - controls layout improvements --- src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp | 30 +++++++++++++------------ 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp index 3db5e1e132..b585a8e4f2 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp @@ -40,7 +40,7 @@ bool GLGizmoHollow::on_init() { m_shortcut_key = WXK_CONTROL_H; m_desc["enable"] = _(L("Hollow this object")); - m_desc["preview"] = _(L("Preview")); + m_desc["preview"] = _(L("Preview hollowed and drilled model")); m_desc["offset"] = _(L("Offset")) + ": "; m_desc["quality"] = _(L("Quality")) + ": "; m_desc["closing_distance"] = _(L("Closing distance")) + ": "; @@ -661,18 +661,24 @@ RENDER_AGAIN: // First calculate width of all the texts that are could possibly be shown. We will decide set the dialog width based on that: const float settings_sliders_left = - std::max(std::max(m_imgui->calc_text_size(m_desc.at("offset")).x, - m_imgui->calc_text_size(m_desc.at("quality")).x), - m_imgui->calc_text_size(m_desc.at("closing_distance")).x) - + m_imgui->scaled(1.f); + std::max({m_imgui->calc_text_size(m_desc.at("offset")).x, + m_imgui->calc_text_size(m_desc.at("quality")).x, + m_imgui->calc_text_size(m_desc.at("closing_distance")).x, + m_imgui->calc_text_size(m_desc.at("hole_diameter")).x, + m_imgui->calc_text_size(m_desc.at("hole_depth")).x}) + + m_imgui->scaled(1.f); const float clipping_slider_left = std::max(m_imgui->calc_text_size(m_desc.at("clipping_of_view")).x, m_imgui->calc_text_size(m_desc.at("reset_direction")).x) + m_imgui->scaled(1.5f); - const float diameter_slider_left = m_imgui->calc_text_size(m_desc.at("hole_diameter")).x + m_imgui->scaled(1.f); + const float diameter_slider_left = settings_sliders_left; //m_imgui->calc_text_size(m_desc.at("hole_diameter")).x + m_imgui->scaled(1.f); const float minimal_slider_width = m_imgui->scaled(4.f); - //const float buttons_width_approx = m_imgui->calc_text_size(m_desc.at("apply_changes")).x + m_imgui->calc_text_size(m_desc.at("discard_changes")).x + m_imgui->scaled(1.5f); - float window_width = minimal_slider_width + std::max(std::max(settings_sliders_left, clipping_slider_left), diameter_slider_left); - window_width = std::max(std::max(window_width, /*buttons_width_approx*/0.f), 0.f); + float window_width = minimal_slider_width + std::max({settings_sliders_left, clipping_slider_left, diameter_slider_left}); + window_width = std::max(window_width, m_imgui->calc_text_size(m_desc.at("preview")).x); + + if (m_imgui->button(m_desc["preview"])) + hollow_mesh(); + + ImGui::Separator(); { auto opts = get_config_options({"hollowing_enable"}); @@ -683,10 +689,6 @@ RENDER_AGAIN: } } - ImGui::SameLine(); - if (m_imgui->button(m_desc["preview"])) - hollow_mesh(); - m_imgui->disabled_begin(! m_enable_hollowing); std::vector opts_keys = {"hollowing_min_thickness", "hollowing_quality", "hollowing_closing_distance"}; @@ -911,7 +913,7 @@ bool GLGizmoHollow::on_is_selectable() const std::string GLGizmoHollow::on_get_name() const { - return (_(L("Hollowing")) + " [H]").ToUTF8().data(); + return (_(L("Hollowing and drilling")) + " [H]").ToUTF8().data(); } From 227cc4dc3378c1350618f12f2f1b61437666f92b Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Mon, 3 Feb 2020 15:42:54 +0100 Subject: [PATCH 226/336] Fixed conflicts after merge slaposHollowing was divided into slaposHollowing and slaposDrillHoles on master This commit takes this into account on the code that was merged from lm_drilling_backend_rebased --- src/libslic3r/SLAPrint.cpp | 6 +++--- src/libslic3r/SLAPrint.hpp | 2 +- src/libslic3r/SLAPrintSteps.cpp | 4 ++-- src/slic3r/GUI/GLCanvas3D.cpp | 10 ++++------ src/slic3r/GUI/Gizmos/GLGizmoBase.cpp | 2 +- src/slic3r/GUI/Plater.cpp | 2 +- 6 files changed, 12 insertions(+), 14 deletions(-) diff --git a/src/libslic3r/SLAPrint.cpp b/src/libslic3r/SLAPrint.cpp index e98e0edc41..06c4f687b9 100644 --- a/src/libslic3r/SLAPrint.cpp +++ b/src/libslic3r/SLAPrint.cpp @@ -419,7 +419,7 @@ SLAPrint::ApplyStatus SLAPrint::apply(const Model &model, DynamicPrintConfig con if (model_object.sla_drain_holes != model_object_new.sla_drain_holes) { model_object.sla_drain_holes = model_object_new.sla_drain_holes; - update_apply_status(it_print_object_status->print_object->invalidate_step(slaposHollowing)); + update_apply_status(it_print_object_status->print_object->invalidate_step(slaposDrillHoles)); } // Copy the ModelObject name, input_file and instances. The instances will compared against PrintObject instances in the next step. @@ -1101,7 +1101,7 @@ const ExPolygons &SliceRecord::get_slice(SliceOrigin o) const bool SLAPrintObject::has_mesh(SLAPrintObjectStep step) const { switch (step) { - case slaposHollowing: + case slaposDrillHoles: return m_hollowing_data && !m_hollowing_data->hollow_mesh_with_holes.empty(); case slaposSupportTree: return ! this->support_mesh().empty(); @@ -1119,7 +1119,7 @@ TriangleMesh SLAPrintObject::get_mesh(SLAPrintObjectStep step) const return this->support_mesh(); case slaposPad: return this->pad_mesh(); - case slaposHollowing: + case slaposDrillHoles: if (m_hollowing_data) return m_hollowing_data->hollow_mesh_with_holes; [[fallthrough]]; diff --git a/src/libslic3r/SLAPrint.hpp b/src/libslic3r/SLAPrint.hpp index d2f1212776..df052a9c75 100644 --- a/src/libslic3r/SLAPrint.hpp +++ b/src/libslic3r/SLAPrint.hpp @@ -78,7 +78,7 @@ public: // Support mesh is only valid if this->is_step_done(slaposPad) is true. const TriangleMesh& pad_mesh() const; - // Ready after this->is_step_done(slaposHollowing) is true + // Ready after this->is_step_done(slaposDrillHoles) is true const TriangleMesh& hollowed_interior_mesh() const; // Get the mesh that is going to be printed with all the modifications diff --git a/src/libslic3r/SLAPrintSteps.cpp b/src/libslic3r/SLAPrintSteps.cpp index 4bb6be7b02..4e19abd587 100644 --- a/src/libslic3r/SLAPrintSteps.cpp +++ b/src/libslic3r/SLAPrintSteps.cpp @@ -27,7 +27,7 @@ namespace { const std::array OBJ_STEP_LEVELS = { 10, // slaposHollowing, - 10, // slaposDrillHolesIfHollowed + 10, // slaposDrillHoles 10, // slaposObjectSlice, 20, // slaposSupportPoints, 10, // slaposSupportTree, @@ -39,7 +39,7 @@ std::string OBJ_STEP_LABELS(size_t idx) { switch (idx) { case slaposHollowing: return L("Hollowing model"); - case slaposDrillHoles: return L("Drilling holes into hollowed model."); + case slaposDrillHoles: return L("Drilling holes into model."); case slaposObjectSlice: return L("Slicing model"); case slaposSupportPoints: return L("Generating support points"); case slaposSupportTree: return L("Generating support tree"); diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 1e90b85c5d..3d0730198b 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -1978,7 +1978,7 @@ void GLCanvas3D::reload_scene(bool refresh_immediately, bool force_full_scene_re // SLA steps to pull the preview meshes for. typedef std::array SLASteps; - SLASteps sla_steps = { slaposHollowing, slaposSupportTree, slaposPad }; + SLASteps sla_steps = { slaposDrillHoles, slaposSupportTree, slaposPad }; struct SLASupportState { std::array::value> step; }; @@ -2025,7 +2025,7 @@ void GLCanvas3D::reload_scene(bool refresh_immediately, bool force_full_scene_re // Consider the DONE step without a valid mesh as invalid for the purpose // of mesh visualization. state.step[istep].state = PrintStateBase::INVALID; - else if (sla_steps[istep] != slaposHollowing) + else if (sla_steps[istep] != slaposDrillHoles) for (const ModelInstance* model_instance : print_object->model_object()->instances) // Only the instances, which are currently printable, will have the SLA support structures kept. // The instances outside the print bed will have the GLVolumes of their support structures released. @@ -2169,7 +2169,7 @@ void GLCanvas3D::reload_scene(bool refresh_immediately, bool force_full_scene_re assert(it != model_object->instances.end()); int instance_idx = it - model_object->instances.begin(); for (size_t istep = 0; istep < sla_steps.size(); ++ istep) - if (sla_steps[istep] == slaposHollowing) { + if (sla_steps[istep] == slaposDrillHoles) { // Hollowing is a special case, where the mesh from the backend is being loaded into the 1st volume of an instance, // not into its own GLVolume. // There shall always be such a GLVolume allocated. @@ -2182,7 +2182,7 @@ void GLCanvas3D::reload_scene(bool refresh_immediately, bool force_full_scene_re // The backend either produced a new hollowed mesh, or it invalidated the one that the front end has seen. volume.indexed_vertex_array.release_geometry(); if (state.step[istep].state == PrintStateBase::DONE) { - TriangleMesh mesh = print_object->get_mesh(slaposHollowing); + TriangleMesh mesh = print_object->get_mesh(slaposDrillHoles); assert(! mesh.empty()); mesh.transform(sla_print->sla_trafo(*m_model->objects[volume.object_idx()]).inverse()); volume.indexed_vertex_array.load_mesh(mesh); @@ -6106,8 +6106,6 @@ void GLCanvas3D::_load_sla_shells() unsigned int initial_volumes_count = (unsigned int)m_volumes.volumes.size(); for (const SLAPrintObject::Instance& instance : obj->instances()) { add_volume(*obj, 0, instance, obj->get_mesh_to_print(), GLVolume::MODEL_COLOR[0], true); -// if (! obj->hollowed_interior_mesh().empty()) -// add_volume(*obj, -int(slaposHollowing), instance, obj->hollowed_interior_mesh(), GLVolume::MODEL_COLOR[0], false); // Set the extruder_id and volume_id to achieve the same color as in the 3D scene when // through the update_volumes_colors_by_extruder() call. m_volumes.volumes.back()->extruder_id = obj->model_object()->volumes.front()->extruder_id(); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp b/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp index 653bfefb5b..af022352e0 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp @@ -354,7 +354,7 @@ bool CommonGizmosData::update_from_backend(GLCanvas3D& canvas, ModelObject* mode // saved, a copy is stored as a member (FIXME) if (m_print_object_idx >=0) { const SLAPrintObject* po = canvas.sla_print()->objects()[m_print_object_idx]; - if (po->is_step_done(slaposHollowing)) { + if (po->is_step_done(slaposDrillHoles)) { m_backend_mesh_transformed = po->get_mesh_to_print(); m_backend_mesh_transformed.transform(canvas.sla_print()->sla_trafo(*m_model_object).inverse()); m_mesh = &m_backend_mesh_transformed; diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 8afd98d11e..57e0c787c9 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -5130,7 +5130,7 @@ void Plater::reslice_SLA_supports(const ModelObject &object, bool postpone_error void Plater::reslice_SLA_hollowing(const ModelObject &object, bool postpone_error_messages) { - reslice_SLA_until_step(slaposHollowing, object, postpone_error_messages); + reslice_SLA_until_step(slaposDrillHoles, object, postpone_error_messages); } void Plater::reslice_SLA_until_step(SLAPrintObjectStep step, const ModelObject &object, bool postpone_error_messages) From 03680bb01442855ed93bcbdde8305e99eb420ed1 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Mon, 3 Feb 2020 15:47:09 +0100 Subject: [PATCH 227/336] Follow-up of 3a99b23ec762cd1ad9b4c5cbb4373d386bfe4b66 -> F5 accelerator added also to objects list --- src/slic3r/GUI/GUI_ObjectList.cpp | 2 ++ src/slic3r/GUI/Plater.cpp | 5 ++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/slic3r/GUI/GUI_ObjectList.cpp b/src/slic3r/GUI/GUI_ObjectList.cpp index 33ddd475cd..d630f152f1 100644 --- a/src/slic3r/GUI/GUI_ObjectList.cpp +++ b/src/slic3r/GUI/GUI_ObjectList.cpp @@ -978,6 +978,8 @@ void ObjectList::key_event(wxKeyEvent& event) ) { remove(); } + else if (event.GetKeyCode() == WXK_F5) + wxGetApp().plater()->reload_all_from_disk(); else if (wxGetKeyState(wxKeyCode('A')) && wxGetKeyState(WXK_CONTROL/*WXK_SHIFT*/)) select_item_all_children(); else if (wxGetKeyState(wxKeyCode('C')) && wxGetKeyState(WXK_CONTROL)) diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 8afd98d11e..f0ca1aa392 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -2076,7 +2076,7 @@ Plater::priv::priv(Plater *q, MainFrame *main_frame) view3D_canvas->Bind(EVT_GLCANVAS_RESET_LAYER_HEIGHT_PROFILE, [this](SimpleEvent&) { this->view3D->get_canvas3d()->reset_layer_height_profile(); }); view3D_canvas->Bind(EVT_GLCANVAS_ADAPTIVE_LAYER_HEIGHT_PROFILE, [this](Event& evt) { this->view3D->get_canvas3d()->adaptive_layer_height_profile(evt.data); }); view3D_canvas->Bind(EVT_GLCANVAS_SMOOTH_LAYER_HEIGHT_PROFILE, [this](HeightProfileSmoothEvent& evt) { this->view3D->get_canvas3d()->smooth_layer_height_profile(evt.data); }); - view3D_canvas->Bind(EVT_GLCANVAS_RELOAD_FROM_DISK, [this](SimpleEvent&) { if (!this->model.objects.empty()) this->reload_all_from_disk(); }); + view3D_canvas->Bind(EVT_GLCANVAS_RELOAD_FROM_DISK, [this](SimpleEvent&) { this->reload_all_from_disk(); }); // 3DScene/Toolbar: view3D_canvas->Bind(EVT_GLTOOLBAR_ADD, &priv::on_action_add, this); @@ -3451,6 +3451,9 @@ void Plater::priv::reload_from_disk() void Plater::priv::reload_all_from_disk() { + if (model.objects.empty()) + return; + Plater::TakeSnapshot snapshot(q, _(L("Reload all from disk"))); Plater::SuppressSnapshots suppress(q); From 0c4797e92ed0581fddb23949dce3c0dea9c9b577 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Mon, 3 Feb 2020 11:18:33 +0100 Subject: [PATCH 228/336] use vsnprintf instead of snprintf in string_printf function Also, revert to old location: Utils.hpp and utils.cpp --- src/libslic3r/Utils.hpp | 2 ++ src/libslic3r/libslic3r.h | 17 ----------------- src/libslic3r/utils.cpp | 21 +++++++++++++++++++++ tests/libslic3r/libslic3r_tests.cpp | 2 +- 4 files changed, 24 insertions(+), 18 deletions(-) diff --git a/src/libslic3r/Utils.hpp b/src/libslic3r/Utils.hpp index bc6aa20fc5..06c4358099 100644 --- a/src/libslic3r/Utils.hpp +++ b/src/libslic3r/Utils.hpp @@ -93,6 +93,8 @@ namespace PerlUtils { extern std::string path_to_parent_path(const char *src); }; +std::string string_printf(const char *format, ...); + // Standard "generated by Slic3r version xxx timestamp xxx" header string, // to be placed at the top of Slic3r generated files. std::string header_slic3r_generated(); diff --git a/src/libslic3r/libslic3r.h b/src/libslic3r/libslic3r.h index 7d9558f1e5..d3e4992ce8 100644 --- a/src/libslic3r/libslic3r.h +++ b/src/libslic3r/libslic3r.h @@ -230,23 +230,6 @@ static inline bool is_approx(Number value, Number test_value) return std::fabs(double(value) - double(test_value)) < double(EPSILON); } -template -std::string string_printf(const char *const _fmt, Args &&...args) -{ - static const size_t INITIAL_LEN = 1024; - std::vector buffer(INITIAL_LEN, '\0'); - - auto fmt = std::string("%s") + _fmt; - int bufflen = snprintf(buffer.data(), INITIAL_LEN - 1, fmt.c_str(), "", std::forward(args)...); - - if (bufflen >= int(INITIAL_LEN)) { - buffer.resize(size_t(bufflen) + 1); - snprintf(buffer.data(), buffer.size(), fmt.c_str(), "", std::forward(args)...); - } - - return std::string(buffer.begin(), buffer.begin() + bufflen); -} - } // namespace Slic3r #endif diff --git a/src/libslic3r/utils.cpp b/src/libslic3r/utils.cpp index 9f0afa0614..f78a2b54d5 100644 --- a/src/libslic3r/utils.cpp +++ b/src/libslic3r/utils.cpp @@ -577,6 +577,27 @@ namespace PerlUtils { std::string path_to_parent_path(const char *src) { return boost::filesystem::path(src).parent_path().string(); } }; + +std::string string_printf(const char *format, ...) +{ + va_list args1; + va_start(args1, format); + va_list args2; + va_copy(args2, args1); + + static const size_t INITIAL_LEN = 1024; + std::vector buffer(INITIAL_LEN, '\0'); + + int bufflen = ::vsnprintf(buffer.data(), INITIAL_LEN - 1, format, args1); + + if (bufflen >= int(INITIAL_LEN)) { + buffer.resize(size_t(bufflen) + 1); + ::vsnprintf(buffer.data(), buffer.size(), format, args2); + } + + return std::string(buffer.begin(), buffer.begin() + bufflen); +} + std::string header_slic3r_generated() { return std::string("generated by " SLIC3R_APP_NAME " " SLIC3R_VERSION " on " ) + Utils::utc_timestamp(); diff --git a/tests/libslic3r/libslic3r_tests.cpp b/tests/libslic3r/libslic3r_tests.cpp index b9c615d90a..f4dcab42a0 100644 --- a/tests/libslic3r/libslic3r_tests.cpp +++ b/tests/libslic3r/libslic3r_tests.cpp @@ -1,6 +1,6 @@ #include -#include "libslic3r/libslic3r.h" +#include "libslic3r/Utils.hpp" namespace { From e042cab8faaeb47da363314839236071003c6083 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Mon, 3 Feb 2020 16:05:13 +0100 Subject: [PATCH 229/336] Follow-up of 8453c8848238c1bb20bc7dc85cad4763203534c9, c09091c40703bdfae84e4bee3094bf6db23d8487 and 9d55121695126c113cb2eb4b65115320840dca39 -> Use key down event in place of key up event --- src/slic3r/GUI/Gizmos/GLGizmosManager.cpp | 33 ++++++++++------------- 1 file changed, 14 insertions(+), 19 deletions(-) diff --git a/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp b/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp index ae47fcfc8e..4e4f716f49 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp @@ -776,6 +776,18 @@ bool GLGizmosManager::on_key(wxKeyEvent& evt) processed = true; } } + +// if (processed) +// m_parent.set_cursor(GLCanvas3D::Standard); + } + else if (evt.GetEventType() == wxEVT_KEY_DOWN) + { + if ((m_current == SlaSupports) && ((keyCode == WXK_SHIFT) || (keyCode == WXK_ALT)) + && dynamic_cast(get_current())->is_in_editing_mode()) + { +// m_parent.set_cursor(GLCanvas3D::Cross); + processed = true; + } else if (m_current == Move) { auto do_move = [this, &processed](const Vec3d& displacement) { @@ -784,7 +796,6 @@ bool GLGizmosManager::on_key(wxKeyEvent& evt) selection.translate(displacement); wxGetApp().obj_manipul()->set_dirty(); m_parent.do_move(L("Gizmo-Move")); - m_parent.set_as_dirty(); processed = true; }; @@ -805,16 +816,13 @@ bool GLGizmosManager::on_key(wxKeyEvent& evt) selection.rotate(rotation, TransformationType(TransformationType::World_Relative_Joint)); wxGetApp().obj_manipul()->set_dirty(); m_parent.do_rotate(L("Gizmo-Rotate")); - m_parent.set_as_dirty(); processed = true; }; switch (keyCode) { - case WXK_NUMPAD_LEFT: case WXK_LEFT: { do_rotate(Vec3d(0.0, 0.0, 0.5 * M_PI)); break; } - case WXK_NUMPAD_RIGHT: case WXK_RIGHT: { do_rotate(-Vec3d(0.0, 0.0, 0.5 * M_PI)); break; } - case WXK_NUMPAD_UP: case WXK_UP: { do_rotate(Vec3d(0.0, 0.0, 0.25 * M_PI)); break; } - case WXK_NUMPAD_DOWN: case WXK_DOWN: { do_rotate(-Vec3d(0.0, 0.0, 0.25 * M_PI)); break; } + case WXK_NUMPAD_LEFT: case WXK_LEFT: { do_rotate(Vec3d(0.0, 0.0, 0.25 * M_PI)); break; } + case WXK_NUMPAD_RIGHT: case WXK_RIGHT: { do_rotate(-Vec3d(0.0, 0.0, 0.25 * M_PI)); break; } default: { break; } } } @@ -823,7 +831,6 @@ bool GLGizmosManager::on_key(wxKeyEvent& evt) auto do_move = [this, &processed](double delta_z) { GLGizmoCut* cut = dynamic_cast(get_current()); cut->set_cut_z(delta_z + cut->get_cut_z()); - m_parent.set_as_dirty(); processed = true; }; @@ -834,18 +841,6 @@ bool GLGizmosManager::on_key(wxKeyEvent& evt) default: { break; } } } - -// if (processed) -// m_parent.set_cursor(GLCanvas3D::Standard); - } - else if (evt.GetEventType() == wxEVT_KEY_DOWN) - { - if ((m_current == SlaSupports) && ((keyCode == WXK_SHIFT) || (keyCode == WXK_ALT)) - && dynamic_cast(get_current())->is_in_editing_mode()) - { -// m_parent.set_cursor(GLCanvas3D::Cross); - processed = true; - } } if (processed) From ad3e3be3bc6a643405abc7e6cf3c90e8bd67539e Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Mon, 3 Feb 2020 17:11:24 +0100 Subject: [PATCH 230/336] optimize string_printf --- src/libslic3r/utils.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/libslic3r/utils.cpp b/src/libslic3r/utils.cpp index f78a2b54d5..c451507779 100644 --- a/src/libslic3r/utils.cpp +++ b/src/libslic3r/utils.cpp @@ -585,8 +585,8 @@ std::string string_printf(const char *format, ...) va_list args2; va_copy(args2, args1); - static const size_t INITIAL_LEN = 1024; - std::vector buffer(INITIAL_LEN, '\0'); + static const size_t INITIAL_LEN = 200; + std::string buffer(INITIAL_LEN, '\0'); int bufflen = ::vsnprintf(buffer.data(), INITIAL_LEN - 1, format, args1); @@ -595,7 +595,9 @@ std::string string_printf(const char *format, ...) ::vsnprintf(buffer.data(), buffer.size(), format, args2); } - return std::string(buffer.begin(), buffer.begin() + bufflen); + buffer.resize(bufflen); + + return buffer; } std::string header_slic3r_generated() From d0f21dda4aad7e956e50a3dfb194b45c08c177b0 Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Mon, 3 Feb 2020 17:29:15 +0100 Subject: [PATCH 231/336] Make sure that when drill holes are manipulated with, all data are invalidated properly It is needed to regenerate hollow_mesh_with_holes completely, it may contain holes that were deleted by the user in the meantime --- src/libslic3r/SLAPrint.hpp | 2 +- src/libslic3r/SLAPrintSteps.cpp | 42 +++++++++++++++++++++------------ 2 files changed, 28 insertions(+), 16 deletions(-) diff --git a/src/libslic3r/SLAPrint.hpp b/src/libslic3r/SLAPrint.hpp index df052a9c75..c9f5198db8 100644 --- a/src/libslic3r/SLAPrint.hpp +++ b/src/libslic3r/SLAPrint.hpp @@ -84,7 +84,7 @@ public: // Get the mesh that is going to be printed with all the modifications // like hollowing and drilled holes. const TriangleMesh & get_mesh_to_print() const { - return m_hollowing_data ? m_hollowing_data->hollow_mesh_with_holes : transformed_mesh(); + return (m_hollowing_data && is_step_done(slaposDrillHoles)) ? m_hollowing_data->hollow_mesh_with_holes : transformed_mesh(); } // This will return the transformed mesh which is cached diff --git a/src/libslic3r/SLAPrintSteps.cpp b/src/libslic3r/SLAPrintSteps.cpp index 4e19abd587..b7d1cfa1d8 100644 --- a/src/libslic3r/SLAPrintSteps.cpp +++ b/src/libslic3r/SLAPrintSteps.cpp @@ -99,17 +99,37 @@ void SLAPrint::Steps::hollow_model(SLAPrintObject &po) else { po.m_hollowing_data.reset(new SLAPrintObject::HollowingData()); po.m_hollowing_data->interior = *meshptr; - auto &hollowed_mesh = po.m_hollowing_data->hollow_mesh_with_holes; - hollowed_mesh = po.transformed_mesh(); - hollowed_mesh.merge(po.m_hollowing_data->interior); - hollowed_mesh.require_shared_vertices(); } } +// Drill holes into the hollowed/original mesh. void SLAPrint::Steps::drill_holes(SLAPrintObject &po) { - // Drill holes into the hollowed/original mesh. - if (po.m_model_object->sla_drain_holes.empty()) { + bool needs_drilling = ! po.m_model_object->sla_drain_holes.empty(); + bool is_hollowed = (po.m_hollowing_data && ! po.m_hollowing_data->interior.empty()); + + if (! is_hollowed && ! needs_drilling) { + // In this case we can dump any data that might have been + // generated on previous runs. + po.m_hollowing_data.reset(); + return; + } + + if (! po.m_hollowing_data) + po.m_hollowing_data.reset(new SLAPrintObject::HollowingData()); + + // Hollowing and/or drilling is active, m_hollowing_data is valid. + + // Regenerate hollowed mesh, even if it was there already. It may contain + // holes that are no longer on the frontend. + TriangleMesh &hollowed_mesh = po.m_hollowing_data->hollow_mesh_with_holes; + hollowed_mesh = po.transformed_mesh(); + if (! po.m_hollowing_data->interior.empty()) { + hollowed_mesh.merge(po.m_hollowing_data->interior); + hollowed_mesh.require_shared_vertices(); + } + + if (! needs_drilling) { BOOST_LOG_TRIVIAL(info) << "Drilling skipped (no holes)."; return; } @@ -125,17 +145,9 @@ void SLAPrint::Steps::drill_holes(SLAPrintObject &po) holes_mesh.require_shared_vertices(); MeshBoolean::cgal::self_union(holes_mesh); //FIXME-fix and use the cgal version - // If there is no hollowed mesh yet, copy the original mesh. - if (! po.m_hollowing_data) { - po.m_hollowing_data.reset(new SLAPrintObject::HollowingData()); - po.m_hollowing_data->hollow_mesh_with_holes = po.transformed_mesh(); - } - - TriangleMesh &hollowed_mesh = po.m_hollowing_data->hollow_mesh_with_holes; - try { MeshBoolean::cgal::minus(hollowed_mesh, holes_mesh); - } catch (const std::runtime_error &ex) { + } catch (const std::runtime_error&) { throw std::runtime_error(L( "Drilling holes into the mesh failed. " "This is usually caused by broken model. Try to fix it first.")); From d320a03c545de70a24d2ced024334934f5823a44 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Mon, 3 Feb 2020 21:27:53 +0100 Subject: [PATCH 232/336] DoubleSlider: Added using of default colors for color changes in SingleExtruder Mode (#3449) + added missed input parameter to the BitmapCache::mksolid() which was cause a wrong drawing of the Extruder selector under OSX --- src/slic3r/GUI/BitmapCache.hpp | 2 +- src/slic3r/GUI/DoubleSlider.cpp | 41 +++++++++++++++++++++++++-------- src/slic3r/GUI/DoubleSlider.hpp | 14 ++++++++--- src/slic3r/GUI/GUI_Preview.cpp | 7 ++++++ 4 files changed, 51 insertions(+), 13 deletions(-) diff --git a/src/slic3r/GUI/BitmapCache.hpp b/src/slic3r/GUI/BitmapCache.hpp index dd3e6ffc0d..e12beb5c72 100644 --- a/src/slic3r/GUI/BitmapCache.hpp +++ b/src/slic3r/GUI/BitmapCache.hpp @@ -35,7 +35,7 @@ public: wxBitmap* load_svg(const std::string &bitmap_key, unsigned width = 0, unsigned height = 0, const bool grayscale = false, const bool dark_mode = false); /*static */wxBitmap mksolid(size_t width, size_t height, unsigned char r, unsigned char g, unsigned char b, unsigned char transparency, bool suppress_scaling = false); - /*static */wxBitmap mksolid(size_t width, size_t height, const unsigned char rgb[3], bool suppress_scaling = false) { return mksolid(width, height, rgb[0], rgb[1], rgb[2], wxALPHA_OPAQUE); } + /*static */wxBitmap mksolid(size_t width, size_t height, const unsigned char rgb[3], bool suppress_scaling = false) { return mksolid(width, height, rgb[0], rgb[1], rgb[2], wxALPHA_OPAQUE, suppress_scaling); } /*static */wxBitmap mkclear(size_t width, size_t height) { return mksolid(width, height, 0, 0, 0, wxALPHA_TRANSPARENT); } static bool parse_color(const std::string& scolor, unsigned char* rgb_out); diff --git a/src/slic3r/GUI/DoubleSlider.cpp b/src/slic3r/GUI/DoubleSlider.cpp index 4a5bea9a10..5990984b02 100644 --- a/src/slic3r/GUI/DoubleSlider.cpp +++ b/src/slic3r/GUI/DoubleSlider.cpp @@ -1,4 +1,5 @@ #include "wxExtensions.hpp" +#include "libslic3r/GCode/PreviewData.hpp" #include "GUI.hpp" #include "GUI_App.hpp" #include "I18N.hpp" @@ -322,7 +323,8 @@ void Control::SetTicksValues(const CustomGCode::Info& custom_gcode_per_print_z) // Switch to the "Feature type"/"Tool" from the very beginning of a new object slicing after deleting of the old one post_ticks_changed_event(); - m_ticks.mode = custom_gcode_per_print_z.mode; + if (custom_gcode_per_print_z.mode) + m_ticks.mode = custom_gcode_per_print_z.mode; Refresh(); Update(); @@ -1169,6 +1171,8 @@ void Control::OnKeyDown(wxKeyEvent &event) m_ticks.suppress_minus(true); delete_current_tick(); } + else if (event.GetKeyCode() == WXK_SHIFT) + UseDefaultColors(false); else if (is_horizontal()) { if (key == WXK_LEFT || key == WXK_RIGHT) @@ -1194,6 +1198,9 @@ void Control::OnKeyUp(wxKeyEvent &event) { if (event.GetKeyCode() == WXK_CONTROL) m_is_one_layer = false; + else if (event.GetKeyCode() == WXK_SHIFT) + UseDefaultColors(true); + Refresh(); Update(); event.Skip(); @@ -1278,9 +1285,11 @@ std::array Control::get_active_extruders_for_tick(int tick) const // Get used extruders for tick. // Means all extruders(tools) which will be used during printing from current tick to the end -std::set TickCodeInfo::get_used_extruders_for_tick(int tick, int only_extruder, double print_z) const +std::set TickCodeInfo::get_used_extruders_for_tick(int tick, int only_extruder, double print_z, t_mode force_mode/* = t_mode::Undef*/) const { - if (mode == t_mode::MultiExtruder) + t_mode e_mode = !force_mode ? mode : force_mode; + + if (e_mode == t_mode::MultiExtruder) { // #ys_FIXME: get tool ordering from _correct_ place const ToolOrdering& tool_ordering = GUI::wxGetApp().plater()->fff_print().get_tool_ordering(); @@ -1301,8 +1310,8 @@ std::set TickCodeInfo::get_used_extruders_for_tick(int tick, int only_extru return used_extruders; } - const int default_initial_extruder = mode == t_mode::MultiAsSingle ? std::max(only_extruder, 1) : 1; - if (ticks.empty()) + const int default_initial_extruder = e_mode == t_mode::MultiAsSingle ? std::max(only_extruder, 1) : 1; + if (ticks.empty() || e_mode == t_mode::SingleExtruder) return {default_initial_extruder}; std::set used_extruders; @@ -1346,10 +1355,13 @@ void Control::OnRightUp(wxMouseEvent& event) if (m_show_context_menu) { wxMenu menu; - if (m_mode == t_mode::SingleExtruder) + if (m_mode == t_mode::SingleExtruder) { append_menu_item(&menu, wxID_ANY, _(L("Add color change")) + " (M600)", "", [this](wxCommandEvent&) { add_code_as_tick(ColorChangeCode); }, "colorchange_add_m", &menu, [](){return true;}, this); + + UseDefaultColors(false); + } else { append_change_extruder_menu_item(&menu); @@ -1688,9 +1700,18 @@ bool Control::check_ticks_changed_event(const std::string& gcode) return true; } - std::string TickCodeInfo::get_color_for_tick(TickCode tick, const std::string& code, const int extruder) { + if (mode == t_mode::SingleExtruder && code == ColorChangeCode && m_use_default_colors) + { + const std::vector& colors = GCodePreviewData::ColorPrintColors(); + if (ticks.empty()) + return colors[0]; + m_default_color_idx++; + + return colors[m_default_color_idx % colors.size()]; + } + std::vector colors = GUI::wxGetApp().plater()->get_extruder_colors_from_plater_config(); std::string color = colors[extruder - 1]; @@ -1740,6 +1761,9 @@ bool TickCodeInfo::add_tick(const int tick, std::string& code, const int extrude return false; } + if (mode == t_mode::SingleExtruder) + m_use_default_colors = true; + ticks.emplace(TickCode{ tick, code, extruder, color }); return true; } @@ -1840,7 +1864,7 @@ ConflictType TickCodeInfo::is_conflict_tick(const TickCode& tick, t_mode out_mod { // We should mark a tick as a "MeaninglessColorChange", // if it has a ColorChange for unused extruder from current print to end of the print - std::set used_extruders_for_tick = get_used_extruders_for_tick(tick.tick, only_extruder, print_z); + std::set used_extruders_for_tick = get_used_extruders_for_tick(tick.tick, only_extruder, print_z, out_mode); if (used_extruders_for_tick.find(tick.extruder) == used_extruders_for_tick.end()) return ctMeaninglessColorChange; @@ -1868,7 +1892,6 @@ ConflictType TickCodeInfo::is_conflict_tick(const TickCode& tick, t_mode out_mod { // We should mark a tick as a "MeaninglessToolChange", // if it has a ToolChange to the same extruder - auto it = ticks.find(tick); if (it == ticks.begin()) return tick.extruder == std::max(only_extruder, 1) ? ctMeaninglessToolChange : ctNone; diff --git a/src/slic3r/GUI/DoubleSlider.hpp b/src/slic3r/GUI/DoubleSlider.hpp index f14af621f9..01181fc2f5 100644 --- a/src/slic3r/GUI/DoubleSlider.hpp +++ b/src/slic3r/GUI/DoubleSlider.hpp @@ -67,12 +67,14 @@ class TickCodeInfo std::string pause_print_msg; bool m_suppress_plus = false; bool m_suppress_minus = false; + bool m_use_default_colors= false; + int m_default_color_idx = 0; std::string get_color_for_tick(TickCode tick, const std::string& code, const int extruder); public: - std::set ticks {}; - t_mode mode = t_mode::SingleExtruder; + std::set ticks {}; + t_mode mode = t_mode::Undef; bool empty() const { return ticks.empty(); } void set_pause_print_msg(const std::string& message) { pause_print_msg = message; } @@ -88,12 +90,13 @@ public: // Get used extruders for tick. // Means all extruders(tools) which will be used during printing from current tick to the end - std::set get_used_extruders_for_tick(int tick, int only_extruder, double print_z) const; + std::set get_used_extruders_for_tick(int tick, int only_extruder, double print_z, t_mode force_mode = t_mode::Undef) const; void suppress_plus (bool suppress) { m_suppress_plus = suppress; } void suppress_minus(bool suppress) { m_suppress_minus = suppress; } bool suppressed_plus () { return m_suppress_plus; } bool suppressed_minus() { return m_suppress_minus; } + void set_default_colors(bool default_colors_on) { m_use_default_colors = default_colors_on; } }; @@ -186,7 +189,11 @@ public: m_mode = !is_one_extruder_printed_model ? t_mode::MultiExtruder : only_extruder < 0 ? t_mode::SingleExtruder : t_mode::MultiAsSingle; + if (!m_ticks.mode) + m_ticks.mode = m_mode; m_only_extruder = only_extruder; + + UseDefaultColors(m_mode == t_mode::SingleExtruder); } bool is_horizontal() const { return m_style == wxSL_HORIZONTAL; } @@ -201,6 +208,7 @@ public: void OnLeftUp(wxMouseEvent& event); void OnEnterWin(wxMouseEvent& event) { enter_window(event, true); } void OnLeaveWin(wxMouseEvent& event) { enter_window(event, false); } + void UseDefaultColors(bool def_colors_on) { m_ticks.set_default_colors(def_colors_on); } void OnWheel(wxMouseEvent& event); void OnKeyDown(wxKeyEvent &event); void OnKeyUp(wxKeyEvent &event); diff --git a/src/slic3r/GUI/GUI_Preview.cpp b/src/slic3r/GUI/GUI_Preview.cpp index e42f8ed216..25862b72d7 100644 --- a/src/slic3r/GUI/GUI_Preview.cpp +++ b/src/slic3r/GUI/GUI_Preview.cpp @@ -591,6 +591,11 @@ void Preview::create_double_slider() // sizer, m_canvas_widget m_canvas_widget->Bind(wxEVT_KEY_DOWN, &Preview::update_double_slider_from_canvas, this); + m_canvas_widget->Bind(wxEVT_KEY_UP, [this](wxKeyEvent& event) { + if (event.GetKeyCode() == WXK_SHIFT) + m_slider->UseDefaultColors(true); + event.Skip(); + }); m_slider->Bind(wxEVT_SCROLL_CHANGED, &Preview::on_sliders_scroll_changed, this); @@ -776,6 +781,8 @@ void Preview::update_double_slider_from_canvas(wxKeyEvent& event) } else if (key == 'S') m_slider->ChangeOneLayerLock(); + else if (key == WXK_SHIFT) + m_slider->UseDefaultColors(false); else event.Skip(); } From 3371fa42daae024e15ccb31bec84f0fae1431618 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Tue, 4 Feb 2020 09:32:09 +0100 Subject: [PATCH 233/336] Follow-up of e042cab8faaeb47da363314839236071003c6083 -> Avoid polluting undo/redo stack --- src/slic3r/GUI/Gizmos/GLGizmosManager.cpp | 54 ++++++++++++++++++++++- 1 file changed, 52 insertions(+), 2 deletions(-) diff --git a/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp b/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp index 4e4f716f49..8e2923cacf 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp @@ -776,6 +776,56 @@ bool GLGizmosManager::on_key(wxKeyEvent& evt) processed = true; } } + else if (m_current == Move) + { + switch (keyCode) + { + case WXK_NUMPAD_LEFT: case WXK_LEFT: + case WXK_NUMPAD_RIGHT: case WXK_RIGHT: + case WXK_NUMPAD_UP: case WXK_UP: + case WXK_NUMPAD_DOWN: case WXK_DOWN: + { + m_parent.do_move(L("Gizmo-Move")); + stop_dragging(); + update_data(); + + wxGetApp().obj_manipul()->set_dirty(); + // Let the plater know that the dragging finished, so a delayed refresh + // of the scene with the background processing data should be performed. + m_parent.post_event(SimpleEvent(EVT_GLCANVAS_MOUSE_DRAGGING_FINISHED)); + // updates camera target constraints + m_parent.refresh_camera_scene_box(); + processed = true; + + break; + } + default: { break; } + } + } + else if (m_current == Rotate) + { + switch (keyCode) + { + case WXK_NUMPAD_LEFT: case WXK_LEFT: + case WXK_NUMPAD_RIGHT: case WXK_RIGHT: + { + m_parent.do_rotate(L("Gizmo-Rotate")); + stop_dragging(); + update_data(); + + wxGetApp().obj_manipul()->set_dirty(); + // Let the plater know that the dragging finished, so a delayed refresh + // of the scene with the background processing data should be performed. + m_parent.post_event(SimpleEvent(EVT_GLCANVAS_MOUSE_DRAGGING_FINISHED)); + // updates camera target constraints + m_parent.refresh_camera_scene_box(); + processed = true; + + break; + } + default: { break; } + } + } // if (processed) // m_parent.set_cursor(GLCanvas3D::Standard); @@ -793,9 +843,9 @@ bool GLGizmosManager::on_key(wxKeyEvent& evt) auto do_move = [this, &processed](const Vec3d& displacement) { Selection& selection = m_parent.get_selection(); selection.start_dragging(); + start_dragging(); selection.translate(displacement); wxGetApp().obj_manipul()->set_dirty(); - m_parent.do_move(L("Gizmo-Move")); processed = true; }; @@ -813,9 +863,9 @@ bool GLGizmosManager::on_key(wxKeyEvent& evt) auto do_rotate = [this, &processed](const Vec3d& rotation) { Selection& selection = m_parent.get_selection(); selection.start_dragging(); + start_dragging(); selection.rotate(rotation, TransformationType(TransformationType::World_Relative_Joint)); wxGetApp().obj_manipul()->set_dirty(); - m_parent.do_rotate(L("Gizmo-Rotate")); processed = true; }; From 648060f4ec8225425183714477e2c8eca360f7a9 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Tue, 4 Feb 2020 10:31:50 +0100 Subject: [PATCH 234/336] Smoother movements/rotations when using arrow keys --- src/slic3r/GUI/Gizmos/GLGizmosManager.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp b/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp index 8e2923cacf..b992fd7aef 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp @@ -845,7 +845,7 @@ bool GLGizmosManager::on_key(wxKeyEvent& evt) selection.start_dragging(); start_dragging(); selection.translate(displacement); - wxGetApp().obj_manipul()->set_dirty(); +// wxGetApp().obj_manipul()->set_dirty(); processed = true; }; @@ -860,19 +860,19 @@ bool GLGizmosManager::on_key(wxKeyEvent& evt) } else if (m_current == Rotate) { - auto do_rotate = [this, &processed](const Vec3d& rotation) { + auto do_rotate = [this, &processed](double angle_z_rad) { Selection& selection = m_parent.get_selection(); selection.start_dragging(); start_dragging(); - selection.rotate(rotation, TransformationType(TransformationType::World_Relative_Joint)); - wxGetApp().obj_manipul()->set_dirty(); + selection.rotate(Vec3d(0.0, 0.0, angle_z_rad), TransformationType(TransformationType::World_Relative_Joint)); +// wxGetApp().obj_manipul()->set_dirty(); processed = true; }; switch (keyCode) { - case WXK_NUMPAD_LEFT: case WXK_LEFT: { do_rotate(Vec3d(0.0, 0.0, 0.25 * M_PI)); break; } - case WXK_NUMPAD_RIGHT: case WXK_RIGHT: { do_rotate(-Vec3d(0.0, 0.0, 0.25 * M_PI)); break; } + case WXK_NUMPAD_LEFT: case WXK_LEFT: { do_rotate(0.25 * M_PI); break; } + case WXK_NUMPAD_RIGHT: case WXK_RIGHT: { do_rotate(-0.25 * M_PI); break; } default: { break; } } } From 87daba9288a8c00b08471af10cad09a09feffa89 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Tue, 4 Feb 2020 11:42:58 +0100 Subject: [PATCH 235/336] Movements and rotations by keyboard indipendent from gizmos: Left arrow = Decrease X by 1mm Right arrow = Increase X by 1mm Up arrow = Decrease Y by 1mm Down arrow = Increase Y by 1mm PgUp = Rotate 45 degrees CCW PgDown = Rotate 45 degrees CW --- src/slic3r/GUI/GLCanvas3D.cpp | 83 +++++++++++++++++++-- src/slic3r/GUI/Gizmos/GLGizmosManager.cpp | 88 ----------------------- 2 files changed, 76 insertions(+), 95 deletions(-) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 3d0730198b..e12e8c6612 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -2743,6 +2743,46 @@ void GLCanvas3D::on_key(wxKeyEvent& evt) } else if (keyCode == WXK_CONTROL) m_dirty = true; + else if (m_gizmos.is_enabled() && !m_selection.is_empty()) { + switch (keyCode) + { + case WXK_NUMPAD_LEFT: case WXK_LEFT: + case WXK_NUMPAD_RIGHT: case WXK_RIGHT: + case WXK_NUMPAD_UP: case WXK_UP: + case WXK_NUMPAD_DOWN: case WXK_DOWN: + { + do_move(L("Gizmo-Move")); + m_gizmos.update_data(); + + wxGetApp().obj_manipul()->set_dirty(); + // Let the plater know that the dragging finished, so a delayed refresh + // of the scene with the background processing data should be performed. + post_event(SimpleEvent(EVT_GLCANVAS_MOUSE_DRAGGING_FINISHED)); + // updates camera target constraints + refresh_camera_scene_box(); + m_dirty = true; + + break; + } + case WXK_NUMPAD_PAGEUP: case WXK_PAGEUP: + case WXK_NUMPAD_PAGEDOWN: case WXK_PAGEDOWN: + { + do_rotate(L("Gizmo-Rotate")); + m_gizmos.update_data(); + + wxGetApp().obj_manipul()->set_dirty(); + // Let the plater know that the dragging finished, so a delayed refresh + // of the scene with the background processing data should be performed. + post_event(SimpleEvent(EVT_GLCANVAS_MOUSE_DRAGGING_FINISHED)); + // updates camera target constraints + refresh_camera_scene_box(); + m_dirty = true; + + break; + } + default: { break; } + } + } } else if (evt.GetEventType() == wxEVT_KEY_DOWN) { m_tab_down = keyCode == WXK_TAB && !evt.HasAnyModifiers(); @@ -2764,14 +2804,43 @@ void GLCanvas3D::on_key(wxKeyEvent& evt) } else if (keyCode == WXK_CONTROL) m_dirty = true; - // DoubleSlider navigation in Preview - else if (keyCode == WXK_LEFT || - keyCode == WXK_RIGHT || - keyCode == WXK_UP || - keyCode == WXK_DOWN ) + else if (m_gizmos.is_enabled() && !m_selection.is_empty()) { - if (dynamic_cast(m_canvas->GetParent()) != nullptr) - post_event(wxKeyEvent(EVT_GLCANVAS_MOVE_DOUBLE_SLIDER, evt)); + auto do_move = [this](const Vec3d& displacement) { + m_selection.start_dragging(); + m_selection.translate(displacement); + m_dirty = true; +// wxGetApp().obj_manipul()->set_dirty(); + }; + auto do_rotate = [this](double angle_z_rad) { + m_selection.start_dragging(); + m_selection.rotate(Vec3d(0.0, 0.0, angle_z_rad), TransformationType(TransformationType::World_Relative_Joint)); + m_dirty = true; +// wxGetApp().obj_manipul()->set_dirty(); + }; + + switch (keyCode) + { + case WXK_NUMPAD_LEFT: case WXK_LEFT: { do_move(-Vec3d::UnitX()); break; } + case WXK_NUMPAD_RIGHT: case WXK_RIGHT: { do_move(Vec3d::UnitX()); break; } + case WXK_NUMPAD_UP: case WXK_UP: { do_move(Vec3d::UnitY()); break; } + case WXK_NUMPAD_DOWN: case WXK_DOWN: { do_move(-Vec3d::UnitY()); break; } + case WXK_NUMPAD_PAGEUP: case WXK_PAGEUP: { do_rotate(0.25 * M_PI); break; } + case WXK_NUMPAD_PAGEDOWN: case WXK_PAGEDOWN: { do_rotate(-0.25 * M_PI); break; } + default: { break; } + } + } + else if (!m_gizmos.is_enabled()) + { + // DoubleSlider navigation in Preview + if (keyCode == WXK_LEFT || + keyCode == WXK_RIGHT || + keyCode == WXK_UP || + keyCode == WXK_DOWN) + { + if (dynamic_cast(m_canvas->GetParent()) != nullptr) + post_event(wxKeyEvent(EVT_GLCANVAS_MOVE_DOUBLE_SLIDER, evt)); + } } } } diff --git a/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp b/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp index b992fd7aef..be0f480071 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp @@ -776,56 +776,6 @@ bool GLGizmosManager::on_key(wxKeyEvent& evt) processed = true; } } - else if (m_current == Move) - { - switch (keyCode) - { - case WXK_NUMPAD_LEFT: case WXK_LEFT: - case WXK_NUMPAD_RIGHT: case WXK_RIGHT: - case WXK_NUMPAD_UP: case WXK_UP: - case WXK_NUMPAD_DOWN: case WXK_DOWN: - { - m_parent.do_move(L("Gizmo-Move")); - stop_dragging(); - update_data(); - - wxGetApp().obj_manipul()->set_dirty(); - // Let the plater know that the dragging finished, so a delayed refresh - // of the scene with the background processing data should be performed. - m_parent.post_event(SimpleEvent(EVT_GLCANVAS_MOUSE_DRAGGING_FINISHED)); - // updates camera target constraints - m_parent.refresh_camera_scene_box(); - processed = true; - - break; - } - default: { break; } - } - } - else if (m_current == Rotate) - { - switch (keyCode) - { - case WXK_NUMPAD_LEFT: case WXK_LEFT: - case WXK_NUMPAD_RIGHT: case WXK_RIGHT: - { - m_parent.do_rotate(L("Gizmo-Rotate")); - stop_dragging(); - update_data(); - - wxGetApp().obj_manipul()->set_dirty(); - // Let the plater know that the dragging finished, so a delayed refresh - // of the scene with the background processing data should be performed. - m_parent.post_event(SimpleEvent(EVT_GLCANVAS_MOUSE_DRAGGING_FINISHED)); - // updates camera target constraints - m_parent.refresh_camera_scene_box(); - processed = true; - - break; - } - default: { break; } - } - } // if (processed) // m_parent.set_cursor(GLCanvas3D::Standard); @@ -838,44 +788,6 @@ bool GLGizmosManager::on_key(wxKeyEvent& evt) // m_parent.set_cursor(GLCanvas3D::Cross); processed = true; } - else if (m_current == Move) - { - auto do_move = [this, &processed](const Vec3d& displacement) { - Selection& selection = m_parent.get_selection(); - selection.start_dragging(); - start_dragging(); - selection.translate(displacement); -// wxGetApp().obj_manipul()->set_dirty(); - processed = true; - }; - - switch (keyCode) - { - case WXK_NUMPAD_LEFT: case WXK_LEFT: { do_move(-Vec3d::UnitX()); break; } - case WXK_NUMPAD_RIGHT: case WXK_RIGHT: { do_move(Vec3d::UnitX()); break; } - case WXK_NUMPAD_UP: case WXK_UP: { do_move(Vec3d::UnitY()); break; } - case WXK_NUMPAD_DOWN: case WXK_DOWN: { do_move(-Vec3d::UnitY()); break; } - default: { break; } - } - } - else if (m_current == Rotate) - { - auto do_rotate = [this, &processed](double angle_z_rad) { - Selection& selection = m_parent.get_selection(); - selection.start_dragging(); - start_dragging(); - selection.rotate(Vec3d(0.0, 0.0, angle_z_rad), TransformationType(TransformationType::World_Relative_Joint)); -// wxGetApp().obj_manipul()->set_dirty(); - processed = true; - }; - - switch (keyCode) - { - case WXK_NUMPAD_LEFT: case WXK_LEFT: { do_rotate(0.25 * M_PI); break; } - case WXK_NUMPAD_RIGHT: case WXK_RIGHT: { do_rotate(-0.25 * M_PI); break; } - default: { break; } - } - } else if (m_current == Cut) { auto do_move = [this, &processed](double delta_z) { From 0da4cb29b5d19890ca3e8e811e7b2734c2b697ce Mon Sep 17 00:00:00 2001 From: YuSanka Date: Tue, 4 Feb 2020 13:42:09 +0100 Subject: [PATCH 236/336] Localization improvements: added NL translation + to the list.txt added ObjectDataViewModel.cpp --- resources/localization/cs/PrusaSlicer.mo | Bin 227954 -> 227873 bytes resources/localization/de/PrusaSlicer.mo | Bin 235241 -> 235160 bytes resources/localization/ja/PrusaSlicer.mo | Bin 253225 -> 253144 bytes resources/localization/list.txt | 1 + resources/localization/nl/PrusaSlicer.mo | Bin 0 -> 221701 bytes resources/localization/nl/PrusaSlicer_nl.po | 9960 +++++++++++++++++++ resources/localization/pl/PrusaSlicer.mo | Bin 229463 -> 229382 bytes resources/localization/pt_br/PrusaSlicer.mo | Bin 217077 -> 217152 bytes 8 files changed, 9961 insertions(+) create mode 100644 resources/localization/nl/PrusaSlicer.mo create mode 100644 resources/localization/nl/PrusaSlicer_nl.po diff --git a/resources/localization/cs/PrusaSlicer.mo b/resources/localization/cs/PrusaSlicer.mo index 55963eefb797f63e72df33a30dc42442a3a9411e..f006a9fd380432d6f222b8ba8d387592af10307c 100644 GIT binary patch delta 15814 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 delta 15917 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 QDf{mGzT0=--(}MO0ghl5-v9sr diff --git a/resources/localization/de/PrusaSlicer.mo b/resources/localization/de/PrusaSlicer.mo index 300f0ab6b8943665a79fb03057a3cb5d7fa06134..475772ca1a01d811dfbd7842f48e63f46db1d1d6 100644 GIT binary patch delta 15814 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 diff --git a/resources/localization/ja/PrusaSlicer.mo b/resources/localization/ja/PrusaSlicer.mo index 50f89660dc6c2767b0b493a983f4f1e9fe3fcd78..c770e0b226a7d1ec64f4edc5f6c5e99d1346127c 100644 GIT binary patch delta 15797 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 J2%Y=${{S?+l>`6) delta 15878 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�)bFTmn72xJ z`vzWr5(@PORL_sQ{1umfhN?LGOE%KHs3SK9wJWN-^6sbx2B9Li5H%J1F)f}&)pN;} zU&rwK|6dYnIHIbV6Qjr%MV)L-oc&P^PD0(k1~un9Q3E*Z^7l{;XRhXl-z^2OBN6V1 zag?vE?t8JAv4+q5lW0Lg6@P&0;bxcLfvWflsw2-(9V=MVB2fo*y@fLYCy<|r6)=4* z-`j~b@i}~gxE}uGSwq73gb|JjysK;u~luG`?PiJ=osZ4 z+ggK5QM)8xJ3su_^xmigtzdhb%E|Ro5;V~ z$zIFZI{V?jU^d1?J&&rmz^nFFoP^WJpThCjE6(@E;Z@WL*sF_0HdsvJCkp(o_TbN0 zhkQ&o+fMyZpJH>dF79wfboaeK$=Aovu~H9Pq?fQ-h{Y<2Ots#=cZ%!7`w$_@8^wp; z`(D?6;i(C{2mO8iYX`o768!Mra1IZ!ld9!F-{Zd{@hT3o1EbUs-+PPvSk#Balc5%w zvBP|C7Y+Q2!zlkI(f0<>P>B&p`RtK=!cp$M;d`Aha+L3_Bs+Sv@6FNszwj77C@9#1 z%Q4SbTg^M1f8!67$BeVxa0eB_{BQc+A?%DBu}G31{>P=~QNR10#@fnAgT>#nwNm+Q z-%2admM`COCz@aK4|DQr8+FJd;# znCyGAu)uq^?bf|-9UV2zBKH{*1n)l1ATonKut=xOV*kIvgTZX}GyXfr_o{M3j=Ahx z^36ZC{o8rI?_H*YeNp?j$pSm!+M@P*Z&Zf{V0oOg&=&LlMRrd7iYeTef*tYkVn6(k zUE3~U|LY+5VTm>LGscj=j%w(+rGEI=W_eJHFd92!6V&xjQ62aKb%JhiobVP_Fh@#UaRoO}72n0L@iFRwFFv)79L6l<&tPvxdL2X9Y`J~owfxKv z{~NHrsFQC#>TS3Z)y@vo$+;I*@2>#~_1s%wHx@xfqz3B7mRJl2ppMuNu_*q4Ixqfo z<>^*hz9wpMwMR9ad6k_L(b$6gMAXOXDO5W_vDL0YEJZ;})cbxc*2Pt*25;eT%=x)R zU^1$Mb5T>X0e{Ayu?KEkV;`r_e_{8Pb2i69TSdIBt#!B_>U&@yYRVR1eq7`72QZWN|2Yzx^J}P({DrF6 z|H>ZBk6Lu4P!W08l^?)rm$8qp&X8gZ>1Hg_FR`OVlLkE0?}ZKs8_IqJDLQTOda zT|b9f3%5{ExSWV?2lIaN)i7ksFV1lV83!u=jq^efIk7@PoZncHty$ zsJWk`6ZfE2e~kn7nY|YEeV_ZFZL8O@EcxB2-SQ76;R}cCbNyp{i~Q#}5KA4lDW4mV z(CS={S}Yqe3b$cz{2yx7*F9nn3`T`|3|7GRF&*wgh5P`jzB{Nz_|%o>JZkk+L#?$w zsE7o^Na%qLsC~Z&b_Q61ildVUA0qeoE@c!=6nQO9ixOFEmP zI+}o0wEw4(P{n(lXHon1CaS{xC#-@-sL1q1l}|=>WIbw89dp-zM?Ih6q&-&ybt1m% z^4U*W$ID|X?fN~D)h5Z5nGCp+W%iGfhSQn{^NXrip)dQgPG3SV#veVcA*c?F#XxhFOhON=M>V+Jc^vhYy5jPobJlP!RK@vG6%|KCq?)_l z2DME)I|pK6@^2ym^_HL__Q^T+e|YgwpbC$oDmw4HhYD%tpY33&iZ#f0Lv`$9)Bv`i zI{vFGzvuEf&f6-FLEV>tT6{B|o6fWUwGGZwkQobJu%4Adb*wR}W1U<+9@W9uF%qY_ z{9058_M^7ldDJ4ji<;8Hzu3`R1Qmh*|KIHidB<$dJ0{}j*o2|+eG*1QRwz@UO!*A0 z6Ne6n?>(Y)lRl+8#3v3<7&@eSWQNwQ+Lf-C7~gXQ+0ylUj))JJm2MM1GC_Cze^K+E w!$*{Em)LX2@IgIC3{B*w<~@h>d%b7B_|om-dk(H1IqBK`h|SOLht6I5KgU{#B>(^b diff --git a/resources/localization/list.txt b/resources/localization/list.txt index fc33097df4..d632f0480a 100644 --- a/resources/localization/list.txt +++ b/resources/localization/list.txt @@ -47,6 +47,7 @@ src/slic3r/GUI/UpdateDialogs.cpp src/slic3r/GUI/WipeTowerDialog.cpp src/slic3r/GUI/wxExtensions.cpp src/slic3r/GUI/DoubleSlider.cpp +src/slic3r/GUI/ObjectDataViewModel.cpp src/slic3r/GUI/ExtruderSequenceDialog.cpp src/slic3r/Utils/Duet.cpp src/slic3r/Utils/OctoPrint.cpp diff --git a/resources/localization/nl/PrusaSlicer.mo b/resources/localization/nl/PrusaSlicer.mo new file mode 100644 index 0000000000000000000000000000000000000000..e76870c76507aa0702726ef8ea43dd9cc5333bc0 GIT binary patch literal 221701 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

*C)P7-+1ngO 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 PZsUOuKa>wYJTCtQ0p(i- literal 0 HcmV?d00001 diff --git a/resources/localization/nl/PrusaSlicer_nl.po b/resources/localization/nl/PrusaSlicer_nl.po new file mode 100644 index 0000000000..504897a1b0 --- /dev/null +++ b/resources/localization/nl/PrusaSlicer_nl.po @@ -0,0 +1,9960 @@ +msgid "" +msgstr "" +"Language: nl_NL\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Poedit 2.0.8\n" +"Project-Id-Version: \n" +"POT-Creation-Date: \n" +"PO-Revision-Date: \n" +"Last-Translator: Oleksandra Iushchenko \n" +"Language-Team: \n" + +#: src/slic3r/GUI/AboutDialog.cpp:39 src/slic3r/GUI/AboutDialog.cpp:291 +msgid "Portions copyright" +msgstr "Gedeeltelijk auteursrecht" + +#: src/slic3r/GUI/AboutDialog.cpp:127 src/slic3r/GUI/AboutDialog.cpp:256 +msgid "Copyright" +msgstr "Auteursrecht" + +#. TRN "Slic3r _is licensed under the_ License" +#: src/slic3r/GUI/AboutDialog.cpp:129 +msgid "" +"License agreements of all following programs (libraries) are part of " +"application license agreement" +msgstr "" +"Licentieovereenkomsten van alle programma's (en onderdelen) zijn deel van de " +"applicatielicentieovereenkomst" + +#: src/slic3r/GUI/AboutDialog.cpp:199 +#, c-format +msgid "About %s" +msgstr "Over %s" + +#: src/slic3r/GUI/AboutDialog.cpp:231 src/slic3r/GUI/MainFrame.cpp:63 +msgid "Version" +msgstr "Versie" + +#. TRN "Slic3r _is licensed under the_ License" +#: src/slic3r/GUI/AboutDialog.cpp:258 +msgid "is licensed under the" +msgstr "is gelicenseerd onder de" + +#: src/slic3r/GUI/AboutDialog.cpp:259 +msgid "GNU Affero General Public License, version 3" +msgstr "GNU Affero General Public License, versie 3" + +#: src/slic3r/GUI/AboutDialog.cpp:260 +msgid "" +"PrusaSlicer is based on Slic3r by Alessandro Ranellucci and the RepRap " +"community." +msgstr "" +"PrusaSlicer is gebaseerd op 'Slic3r' van Alessandro Ranellucci en de RepRap " +"community." + +#: src/slic3r/GUI/AboutDialog.cpp:261 +msgid "" +"Contributions by Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, " +"Petr Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik and " +"numerous others." +msgstr "" +"Bijdragen van Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, Petr " +"Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik, Simon " +"Tillema en vele anderen." + +#: src/slic3r/GUI/AppConfig.cpp:105 +msgid "" +"Error parsing PrusaSlicer config file, it is probably corrupted. Try to " +"manually delete the file to recover from the error. Your user profiles will " +"not be affected." +msgstr "" +"Fout in het configuratiebestand. Het is waarschijnlijk beschadigd. Probeer " +"de fout handmatig te verwijderen om het te herstellen. Dit heeft geen effect " +"op uw gebruikersprofielen." + +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:100 +msgid "" +"To except of redundant tool manipulation, \n" +"Color change(s) for unused extruder(s) was(were) deleted" +msgstr "" +"Kleurveranderingen voor ongebruikte extruders worden verwijderd,\n" +"met uitzondering van overbodige extruders." + +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:101 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3292 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3367 src/slic3r/GUI/Plater.cpp:135 +msgid "Info" +msgstr "Info" + +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:110 +msgid "" +"Copying of the temporary G-code to the output G-code failed. Maybe the SD " +"card is write locked?" +msgstr "" +"Kopiëren van de tijdelijke G-code naar de output is mislukt. Is de SD-kaart " +"geblokkeerd?" + +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:111 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:461 +msgid "Running post-processing scripts" +msgstr "Uitvoeren van nabewerkingsscripts" + +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:113 +msgid "G-code file exported to %1%" +msgstr "gcode-bestand geëxporteerd naar %1%" + +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:117 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:167 +msgid "Slicing complete" +msgstr "Slicen compleet" + +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:163 +msgid "Masked SLA file exported to %1%" +msgstr "Verborgen SLA-bestand geëxporteerd naar %1%" + +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:205 +#, c-format +msgid "" +"%s has encountered an error. It was likely caused by running out of memory. " +"If you are sure you have enough RAM on your system, this may also be a bug " +"and we would be glad if you reported it." +msgstr "" +"%s veroorzaakte een fout. Dit komt mogelijk door een geheugentekort. Als u " +"zeker weet dat u genoeg RAM heeft, kan dit ook een andere systeemfout zijn. " +"We waarderen het als u dit meldt." + +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:463 +msgid "Copying of the temporary G-code to the output G-code failed" +msgstr "Kopiëren van de tijdelijke G-code naar de output is mislukt" + +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:488 +msgid "Scheduling upload to `%1%`. See Window -> Print Host Upload Queue" +msgstr "" +"Plannen van de upload naar '%1% '. Zie Venster -> Printhost uploadwachtrij" + +#: src/slic3r/GUI/BedShapeDialog.cpp:68 src/slic3r/GUI/GUI_ObjectList.cpp:1932 +msgid "Shape" +msgstr "Vorm" + +#: src/slic3r/GUI/BedShapeDialog.cpp:75 +msgid "Rectangular" +msgstr "Rechthoekig" + +#: src/slic3r/GUI/BedShapeDialog.cpp:79 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:232 src/slic3r/GUI/Plater.cpp:154 +#: src/slic3r/GUI/Tab.cpp:2292 +msgid "Size" +msgstr "Grootte" + +#: src/slic3r/GUI/BedShapeDialog.cpp:80 +msgid "Size in X and Y of the rectangular plate." +msgstr "Breedte en diepte van rechthoekig bed." + +#: src/slic3r/GUI/BedShapeDialog.cpp:86 +msgid "Origin" +msgstr "Nulpunt" + +#: src/slic3r/GUI/BedShapeDialog.cpp:87 +msgid "" +"Distance of the 0,0 G-code coordinate from the front left corner of the " +"rectangle." +msgstr "" +"Afstand vanaf het nulpunt in de G-code tot de linkervoorhoek van de " +"rechthoek." + +#: src/slic3r/GUI/BedShapeDialog.cpp:91 +msgid "Circular" +msgstr "Rond" + +#: src/slic3r/GUI/BedShapeDialog.cpp:94 src/slic3r/GUI/ConfigWizard.cpp:218 +#: src/slic3r/GUI/ConfigWizard.cpp:926 src/slic3r/GUI/ConfigWizard.cpp:940 +#: src/slic3r/GUI/GUI_ObjectLayers.cpp:135 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:333 +#: src/slic3r/GUI/WipeTowerDialog.cpp:85 src/slic3r/GUI/wxExtensions.cpp:628 +#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:87 +#: src/libslic3r/PrintConfig.cpp:75 src/libslic3r/PrintConfig.cpp:82 +#: src/libslic3r/PrintConfig.cpp:91 src/libslic3r/PrintConfig.cpp:225 +#: src/libslic3r/PrintConfig.cpp:300 src/libslic3r/PrintConfig.cpp:308 +#: src/libslic3r/PrintConfig.cpp:358 src/libslic3r/PrintConfig.cpp:368 +#: src/libslic3r/PrintConfig.cpp:494 src/libslic3r/PrintConfig.cpp:505 +#: src/libslic3r/PrintConfig.cpp:523 src/libslic3r/PrintConfig.cpp:702 +#: src/libslic3r/PrintConfig.cpp:1228 src/libslic3r/PrintConfig.cpp:1289 +#: src/libslic3r/PrintConfig.cpp:1307 src/libslic3r/PrintConfig.cpp:1325 +#: src/libslic3r/PrintConfig.cpp:1379 src/libslic3r/PrintConfig.cpp:1389 +#: src/libslic3r/PrintConfig.cpp:1511 src/libslic3r/PrintConfig.cpp:1519 +#: src/libslic3r/PrintConfig.cpp:1560 src/libslic3r/PrintConfig.cpp:1568 +#: src/libslic3r/PrintConfig.cpp:1578 src/libslic3r/PrintConfig.cpp:1586 +#: src/libslic3r/PrintConfig.cpp:1594 src/libslic3r/PrintConfig.cpp:1677 +#: src/libslic3r/PrintConfig.cpp:1903 src/libslic3r/PrintConfig.cpp:1974 +#: src/libslic3r/PrintConfig.cpp:2008 src/libslic3r/PrintConfig.cpp:2203 +#: src/libslic3r/PrintConfig.cpp:2210 src/libslic3r/PrintConfig.cpp:2217 +#: src/libslic3r/PrintConfig.cpp:2247 src/libslic3r/PrintConfig.cpp:2257 +#: src/libslic3r/PrintConfig.cpp:2267 src/libslic3r/PrintConfig.cpp:2452 +#: src/libslic3r/PrintConfig.cpp:2591 src/libslic3r/PrintConfig.cpp:2600 +#: src/libslic3r/PrintConfig.cpp:2609 src/libslic3r/PrintConfig.cpp:2619 +#: src/libslic3r/PrintConfig.cpp:2663 src/libslic3r/PrintConfig.cpp:2673 +#: src/libslic3r/PrintConfig.cpp:2685 src/libslic3r/PrintConfig.cpp:2705 +#: src/libslic3r/PrintConfig.cpp:2715 src/libslic3r/PrintConfig.cpp:2725 +#: src/libslic3r/PrintConfig.cpp:2743 src/libslic3r/PrintConfig.cpp:2758 +#: src/libslic3r/PrintConfig.cpp:2772 src/libslic3r/PrintConfig.cpp:2783 +#: src/libslic3r/PrintConfig.cpp:2796 src/libslic3r/PrintConfig.cpp:2841 +#: src/libslic3r/PrintConfig.cpp:2851 src/libslic3r/PrintConfig.cpp:2860 +#: src/libslic3r/PrintConfig.cpp:2870 +msgid "mm" +msgstr "mm" + +#: src/slic3r/GUI/BedShapeDialog.cpp:95 src/libslic3r/PrintConfig.cpp:699 +msgid "Diameter" +msgstr "Diameter" + +#: src/slic3r/GUI/BedShapeDialog.cpp:96 +msgid "" +"Diameter of the print bed. It is assumed that origin (0,0) is located in the " +"center." +msgstr "" +"Diameter van het printbed. Aangenomen wordt dat het nulpunt in het midden " +"ligt." + +#: src/slic3r/GUI/BedShapeDialog.cpp:100 src/slic3r/GUI/GUI_Preview.cpp:248 +#: src/libslic3r/ExtrusionEntity.cpp:322 +msgid "Custom" +msgstr "Custom" + +#: src/slic3r/GUI/BedShapeDialog.cpp:104 +msgid "Load shape from STL..." +msgstr "Laad vorm van STL-bestand..." + +#: src/slic3r/GUI/BedShapeDialog.cpp:157 +msgid "Settings" +msgstr "Instellingen" + +#: src/slic3r/GUI/BedShapeDialog.cpp:174 +msgid "Texture" +msgstr "Textuur" + +#: src/slic3r/GUI/BedShapeDialog.cpp:184 src/slic3r/GUI/BedShapeDialog.cpp:263 +msgid "Load..." +msgstr "Laad..." + +#: src/slic3r/GUI/BedShapeDialog.cpp:192 src/slic3r/GUI/BedShapeDialog.cpp:271 +#: src/slic3r/GUI/Tab.cpp:3080 +msgid "Remove" +msgstr "Verwijder" + +#: src/slic3r/GUI/BedShapeDialog.cpp:225 src/slic3r/GUI/BedShapeDialog.cpp:304 +msgid "Not found: " +msgstr "Niet gevonden: " + +#: src/slic3r/GUI/BedShapeDialog.cpp:253 +msgid "Model" +msgstr "Model" + +#: src/slic3r/GUI/BedShapeDialog.cpp:489 +msgid "Choose an STL file to import bed shape from:" +msgstr "Kies een STL-bestand om te importeren als vorm van het bed:" + +#: src/slic3r/GUI/BedShapeDialog.cpp:496 src/slic3r/GUI/BedShapeDialog.cpp:545 +#: src/slic3r/GUI/BedShapeDialog.cpp:570 +msgid "Invalid file format." +msgstr "Ongeldig bestandsformaat." + +#: src/slic3r/GUI/BedShapeDialog.cpp:507 +msgid "Error! Invalid model" +msgstr "Fout! Ongeldig model" + +#: src/slic3r/GUI/BedShapeDialog.cpp:515 +msgid "The selected file contains no geometry." +msgstr "Het geselecteerde bestand bevat geen geometrie." + +#: src/slic3r/GUI/BedShapeDialog.cpp:519 +msgid "" +"The selected file contains several disjoint areas. This is not supported." +msgstr "" +"Het geselecteerde bestand bevat niet-verbonden delen. Dit wordt niet " +"ondersteund." + +#: src/slic3r/GUI/BedShapeDialog.cpp:534 +msgid "Choose a file to import bed texture from (PNG/SVG):" +msgstr "Kies een PNG- of SVG-bestand als textuur voor het bed:" + +#: src/slic3r/GUI/BedShapeDialog.cpp:559 +msgid "Choose an STL file to import bed model from:" +msgstr "Kies een STL-bestand als vorm voor het bed:" + +#: src/slic3r/GUI/BedShapeDialog.hpp:59 src/slic3r/GUI/ConfigWizard.cpp:885 +msgid "Bed Shape" +msgstr "Vorm van het bed" + +#: src/slic3r/GUI/BonjourDialog.cpp:55 +msgid "Network lookup" +msgstr "Zoeken naar netwerk" + +#: src/slic3r/GUI/BonjourDialog.cpp:72 +msgid "Address" +msgstr "Adres" + +#: src/slic3r/GUI/BonjourDialog.cpp:73 +msgid "Hostname" +msgstr "Hostnaam" + +#: src/slic3r/GUI/BonjourDialog.cpp:74 +msgid "Service name" +msgstr "Servicenaam" + +#: src/slic3r/GUI/BonjourDialog.cpp:76 +msgid "OctoPrint version" +msgstr "OctoPrint-versie" + +#: src/slic3r/GUI/BonjourDialog.cpp:218 +msgid "Searching for devices" +msgstr "Zoeken naar apparaten" + +#: src/slic3r/GUI/BonjourDialog.cpp:225 +msgid "Finished" +msgstr "Voltooid" + +#: src/slic3r/GUI/ButtonsDescription.cpp:16 +msgid "Buttons And Text Colors Description" +msgstr "Knoppen- en tekstkleurbeschrijving" + +#: src/slic3r/GUI/ButtonsDescription.cpp:36 +msgid "Value is the same as the system value" +msgstr "Waarde is gelijk aan standaardwaarde" + +#: src/slic3r/GUI/ButtonsDescription.cpp:53 +msgid "" +"Value was changed and is not equal to the system value or the last saved " +"preset" +msgstr "" +"Waarde is veranderd en is niet gelijk aan standaardwaarde of laatst " +"opgeslagen waarde" + +#: src/slic3r/GUI/ConfigManipulation.cpp:48 +msgid "" +"Zero layer height is not valid.\n" +"\n" +"The layer height will be reset to 0.01." +msgstr "" +"Een laagdikte van 0 is niet mogelijk.\n" +"\n" +"De laagdikte wordt ingesteld op 0,01." + +#: src/slic3r/GUI/ConfigManipulation.cpp:49 +#: src/slic3r/GUI/GUI_ObjectLayers.cpp:27 src/slic3r/GUI/Tab.cpp:1039 +#: src/libslic3r/PrintConfig.cpp:71 +msgid "Layer height" +msgstr "Laagdikte" + +#: src/slic3r/GUI/ConfigManipulation.cpp:60 +msgid "" +"Zero first layer height is not valid.\n" +"\n" +"The first layer height will be reset to 0.01." +msgstr "" +"Een laagdikte voor de eerste laag van 0 is niet mogelijk.\n" +"\n" +"De laagdikte voor de eerste laag wordt ingesteld op 0,01." + +#: src/slic3r/GUI/ConfigManipulation.cpp:61 src/libslic3r/PrintConfig.cpp:878 +msgid "First layer height" +msgstr "Laagdikte eerste laag" + +#: src/slic3r/GUI/ConfigManipulation.cpp:75 +#, no-c-format +msgid "" +"The Spiral Vase mode requires:\n" +"- one perimeter\n" +"- no top solid layers\n" +"- 0% fill density\n" +"- no support material\n" +"- inactive Ensure vertical shell thickness" +msgstr "" +"De spiraalmodus vereist:\n" +"- één perimeter\n" +"- geen toplagen\n" +"- vullingsdichtheid van 0%\n" +"- geen support\n" +"- instelling 'Garandeer verticale shelldikte' uit" + +#: src/slic3r/GUI/ConfigManipulation.cpp:82 +msgid "Shall I adjust those settings in order to enable Spiral Vase?" +msgstr "" +"Moeten deze instellingen aangepast worden om de spiraalmodus te activeren?" + +#: src/slic3r/GUI/ConfigManipulation.cpp:83 +msgid "Spiral Vase" +msgstr "Spiraalmodus" + +#: src/slic3r/GUI/ConfigManipulation.cpp:107 +msgid "" +"The Wipe Tower currently supports the non-soluble supports only\n" +"if they are printed with the current extruder without triggering a tool " +"change.\n" +"(both support_material_extruder and support_material_interface_extruder need " +"to be set to 0)." +msgstr "" +"Het afveegblok ondersteunt momenteel alleen niet-oplosbare materialen\n" +"als deze met de huidige extruder geprint worden zonder dat er een toolwissel " +"plaatsvindt\n" +"(zowel 'support_material_extruder' als 'support_material_interface_extruder' " +"moeten op 0 gezet worden)." + +#: src/slic3r/GUI/ConfigManipulation.cpp:111 +msgid "Shall I adjust those settings in order to enable the Wipe Tower?" +msgstr "" +"Moeten deze instellingen aangepast worden om het afveegblok te activeren?" + +#: src/slic3r/GUI/ConfigManipulation.cpp:112 +#: src/slic3r/GUI/ConfigManipulation.cpp:132 +msgid "Wipe Tower" +msgstr "Afveegblok" + +#: src/slic3r/GUI/ConfigManipulation.cpp:128 +msgid "" +"For the Wipe Tower to work with the soluble supports, the support layers\n" +"need to be synchronized with the object layers." +msgstr "" +"De supportlagen voor het afveegblok moeten gesynchroniseerd zijn met de\n" +"objectlagen om met oplosbaar support te werken." + +#: src/slic3r/GUI/ConfigManipulation.cpp:131 +msgid "Shall I synchronize support layers in order to enable the Wipe Tower?" +msgstr "" +"Moeten de supportlagen gesynchroniseerd worden om het afveegblok te " +"activeren?" + +#: src/slic3r/GUI/ConfigManipulation.cpp:151 +msgid "" +"Supports work better, if the following feature is enabled:\n" +"- Detect bridging perimeters" +msgstr "" +"Support werkt beter als de volgende instellingen aan staan:\n" +"- Detecteer brugperimeters" + +#: src/slic3r/GUI/ConfigManipulation.cpp:154 +msgid "Shall I adjust those settings for supports?" +msgstr "Moeten deze instellingen aangepast worden voor het support?" + +#: src/slic3r/GUI/ConfigManipulation.cpp:155 +msgid "Support Generator" +msgstr "Supportgenerator" + +#: src/slic3r/GUI/ConfigManipulation.cpp:200 +msgid "The %1% infill pattern is not supposed to work at 100%% density." +msgstr "Het %1% vullingspatroon werkt niet bij een dichtheid van 100%%." + +#: src/slic3r/GUI/ConfigManipulation.cpp:202 +msgid "Shall I switch to rectilinear fill pattern?" +msgstr "Moet omgeschakeld worden naar een rechtlijnig vulpatroon?" + +#: src/slic3r/GUI/ConfigManipulation.cpp:203 +#: src/slic3r/GUI/GUI_ObjectList.cpp:35 src/slic3r/GUI/GUI_ObjectList.cpp:89 +#: src/slic3r/GUI/GUI_ObjectList.cpp:609 src/slic3r/GUI/Plater.cpp:516 +#: src/slic3r/GUI/Tab.cpp:1071 src/slic3r/GUI/Tab.cpp:1072 +#: src/libslic3r/PrintConfig.cpp:182 src/libslic3r/PrintConfig.cpp:405 +#: src/libslic3r/PrintConfig.cpp:425 src/libslic3r/PrintConfig.cpp:765 +#: src/libslic3r/PrintConfig.cpp:779 src/libslic3r/PrintConfig.cpp:816 +#: src/libslic3r/PrintConfig.cpp:970 src/libslic3r/PrintConfig.cpp:980 +#: src/libslic3r/PrintConfig.cpp:998 src/libslic3r/PrintConfig.cpp:1017 +#: src/libslic3r/PrintConfig.cpp:1036 src/libslic3r/PrintConfig.cpp:1724 +#: src/libslic3r/PrintConfig.cpp:1741 +msgid "Infill" +msgstr "Vulling" + +#: src/slic3r/GUI/ConfigManipulation.cpp:304 +msgid "Head penetration should not be greater than the head width." +msgstr "De kopinsteek mag niet groter zijn dan de kopbreedte." + +#: src/slic3r/GUI/ConfigManipulation.cpp:306 +msgid "Invalid Head penetration" +msgstr "Ongeldige kopinsteek" + +#: src/slic3r/GUI/ConfigManipulation.cpp:317 +msgid "Pinhead diameter should be smaller than the pillar diameter." +msgstr "De pinkopdiameter moet kleiner zijn dan de pijlerdiameter." + +#: src/slic3r/GUI/ConfigManipulation.cpp:319 +msgid "Invalid pinhead diameter" +msgstr "Ongeldige pinkopdiameter" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:18 +msgid "Upgrade" +msgstr "Upgrade" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:20 +msgid "Downgrade" +msgstr "Downgrade" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:22 +msgid "Before roll back" +msgstr "Voor het teruggaan" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:24 +msgid "User" +msgstr "Gebruiker" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:27 +msgid "Unknown" +msgstr "Onbekend" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:43 +msgid "Active" +msgstr "Actief" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:50 +msgid "PrusaSlicer version" +msgstr "PrusaSlicer-versie" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:51 src/slic3r/GUI/Preset.cpp:1408 +msgid "print" +msgstr "print" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:52 +msgid "filaments" +msgstr "filamenten" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:53 src/slic3r/GUI/Preset.cpp:1412 +msgid "printer" +msgstr "printer" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:57 src/slic3r/GUI/Tab.cpp:961 +msgid "vendor" +msgstr "leverancier" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:57 +msgid "version" +msgstr "versie" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:58 +msgid "min PrusaSlicer version" +msgstr "minimale PrusaSlicer-versie" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:60 +msgid "max PrusaSlicer version" +msgstr "maximale PrusaSlicer-versie" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:63 +msgid "model" +msgstr "model" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:63 +msgid "variants" +msgstr "varianten" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:75 +#, c-format +msgid "Incompatible with this %s" +msgstr "Incompatibel met deze %s" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:78 +msgid "Activate" +msgstr "Activeer" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:104 +msgid "Configuration Snapshots" +msgstr "Configuratiesnapshots" + +#: src/slic3r/GUI/ConfigWizard.cpp:218 +msgid "nozzle" +msgstr "nozzle" + +#: src/slic3r/GUI/ConfigWizard.cpp:222 +msgid "Alternate nozzles:" +msgstr "Alternatieve nozzles:" + +#: src/slic3r/GUI/ConfigWizard.cpp:289 +msgid "All standard" +msgstr "Alle standaard" + +#: src/slic3r/GUI/ConfigWizard.cpp:289 +msgid "Standard" +msgstr "Standaard" + +#: src/slic3r/GUI/ConfigWizard.cpp:290 src/slic3r/GUI/ConfigWizard.cpp:545 +#: src/slic3r/GUI/Tab.cpp:3130 +msgid "All" +msgstr "Alle" + +#: src/slic3r/GUI/ConfigWizard.cpp:291 src/slic3r/GUI/ConfigWizard.cpp:546 +#: src/slic3r/GUI/Plater.cpp:488 src/slic3r/GUI/Plater.cpp:628 +#: src/libslic3r/ExtrusionEntity.cpp:309 +msgid "None" +msgstr "Geen" + +#: src/slic3r/GUI/ConfigWizard.cpp:412 +#, c-format +msgid "Welcome to the %s Configuration Assistant" +msgstr "Welkom bij de %s configuratie-assistent" + +#: src/slic3r/GUI/ConfigWizard.cpp:414 +#, c-format +msgid "Welcome to the %s Configuration Wizard" +msgstr "Welkom bij de %s configuratiewizard" + +#: src/slic3r/GUI/ConfigWizard.cpp:416 +msgid "Welcome" +msgstr "Welkom" + +#: src/slic3r/GUI/ConfigWizard.cpp:418 +#, c-format +msgid "" +"Hello, welcome to %s! This %s helps you with the initial configuration; just " +"a few settings and you will be ready to print." +msgstr "" +"Hallo, welkom bij %s! Deze %s helpt met de eerste configuratie; nog een paar " +"instellingen en de printer kan gebruikt worden." + +#: src/slic3r/GUI/ConfigWizard.cpp:423 +msgid "" +"Remove user profiles - install from scratch (a snapshot will be taken " +"beforehand)" +msgstr "" +"Verwijder alle gebruiksprofielen; installeer vanaf scratch (vooraf wordt een " +"snapshot genomen)" + +#: src/slic3r/GUI/ConfigWizard.cpp:466 +#, c-format +msgid "%s Family" +msgstr "%s serie" + +#: src/slic3r/GUI/ConfigWizard.cpp:537 +msgid "Vendor:" +msgstr "Leverancier:" + +#: src/slic3r/GUI/ConfigWizard.cpp:538 +msgid "Profile:" +msgstr "Profiel:" + +#: src/slic3r/GUI/ConfigWizard.cpp:575 src/slic3r/GUI/ConfigWizard.cpp:603 +msgid "(All)" +msgstr "(Alle)" + +#: src/slic3r/GUI/ConfigWizard.cpp:704 +msgid "Custom Printer Setup" +msgstr "Custom printersetup" + +#: src/slic3r/GUI/ConfigWizard.cpp:704 +msgid "Custom Printer" +msgstr "Custom printer" + +#: src/slic3r/GUI/ConfigWizard.cpp:706 +msgid "Define a custom printer profile" +msgstr "Definieer een custom-printerprofiel" + +#: src/slic3r/GUI/ConfigWizard.cpp:708 +msgid "Custom profile name:" +msgstr "Custom-profielnaam:" + +#: src/slic3r/GUI/ConfigWizard.cpp:732 +msgid "Automatic updates" +msgstr "Automatische updates" + +#: src/slic3r/GUI/ConfigWizard.cpp:732 +msgid "Updates" +msgstr "Updates" + +#: src/slic3r/GUI/ConfigWizard.cpp:740 src/slic3r/GUI/Preferences.cpp:69 +msgid "Check for application updates" +msgstr "Controleer op programma-updates" + +#: src/slic3r/GUI/ConfigWizard.cpp:744 +#, c-format +msgid "" +"If enabled, %s checks for new application versions online. When a new " +"version becomes available, a notification is displayed at the next " +"application startup (never during program usage). This is only a " +"notification mechanisms, no automatic installation is done." +msgstr "" +"Als dit aan staat zal %s online checken op nieuwe programmaversies. Als er " +"een nieuwe versie beschikbaar komt, zal een melding getoond worden bij de " +"volgende keer opstarten (nooit tijdens gebruik van het programma). Dit is " +"slechts een melding; er zal geen automatische installatie plaatsvinden." + +#: src/slic3r/GUI/ConfigWizard.cpp:750 src/slic3r/GUI/Preferences.cpp:77 +msgid "Update built-in Presets automatically" +msgstr "Update ingebouwde presets automatisch" + +#: src/slic3r/GUI/ConfigWizard.cpp:754 +#, c-format +msgid "" +"If enabled, %s downloads updates of built-in system presets in the " +"background.These updates are downloaded into a separate temporary location." +"When a new preset version becomes available it is offered at application " +"startup." +msgstr "" +"Als dit aan staat zal %s updates of ingebouwde systeem-presets op de " +"achtergrond downloaden. Deze updates worden gedownload naar een tijdelijke " +"locatie. Wanneer een nieuwe versie beschikbaar komt zal deze getoond worden " +"bij het opstarten." + +#: src/slic3r/GUI/ConfigWizard.cpp:757 +msgid "" +"Updates are never applied without user's consent and never overwrite user's " +"customized settings." +msgstr "" +"Updates worden nooit geïnstalleerd en overschreven zonder toestemming van de " +"gebruiker." + +#: src/slic3r/GUI/ConfigWizard.cpp:762 +msgid "" +"Additionally a backup snapshot of the whole configuration is created before " +"an update is applied." +msgstr "" +"Voor een update wordt geïnstalleerd wordt daarnaast een backup-snapshot van " +"de hele configuratie gemaakt." + +#: src/slic3r/GUI/ConfigWizard.cpp:769 +msgid "View mode" +msgstr "Weergavemodus" + +#: src/slic3r/GUI/ConfigWizard.cpp:771 +msgid "" +"PrusaSlicer's user interfaces comes in three variants:\n" +"Simple, Advanced, and Expert.\n" +"The Simple mode shows only the most frequently used settings relevant for " +"regular 3D printing. The other two offer progressively more sophisticated " +"fine-tuning, they are suitable for advanced and expert users, respectively." +msgstr "" +"De gebruikersinterfaces van PrusaSlicer kent drie varianten:\n" +"Eenvoudig, Geavanceerd en Expert.\n" +"De eenvoudige modus laat alleen de meest gebruikte instellingen zien. De " +"andere twee bieden meer geavanceerde finetuning. Ze zijn geschikt voor " +"respectievelijk gevorderde en deskundige gebruikers." + +#: src/slic3r/GUI/ConfigWizard.cpp:776 +msgid "Simple mode" +msgstr "Eenvoudige modus" + +#: src/slic3r/GUI/ConfigWizard.cpp:777 +msgid "Advanced mode" +msgstr "Geavanceerde modus" + +#: src/slic3r/GUI/ConfigWizard.cpp:778 +msgid "Expert mode" +msgstr "Expertmodus" + +#: src/slic3r/GUI/ConfigWizard.cpp:812 +msgid "Other Vendors" +msgstr "Overige leveranciers" + +#: src/slic3r/GUI/ConfigWizard.cpp:816 +#, c-format +msgid "Pick another vendor supported by %s" +msgstr "Kies een andere leverancier die ondersteunt wordt door %s" + +#: src/slic3r/GUI/ConfigWizard.cpp:847 +msgid "Firmware Type" +msgstr "Firmwaretype" + +#: src/slic3r/GUI/ConfigWizard.cpp:847 src/slic3r/GUI/Tab.cpp:1917 +msgid "Firmware" +msgstr "Firmware" + +#: src/slic3r/GUI/ConfigWizard.cpp:851 +msgid "Choose the type of firmware used by your printer." +msgstr "Kies het firmwaretype dat de printer gebruikt." + +#: src/slic3r/GUI/ConfigWizard.cpp:885 +msgid "Bed Shape and Size" +msgstr "Grootte en vorm van het bed" + +#: src/slic3r/GUI/ConfigWizard.cpp:888 +msgid "Set the shape of your printer's bed." +msgstr "Stel de vorm van het printbed in." + +#: src/slic3r/GUI/ConfigWizard.cpp:908 +msgid "Filament and Nozzle Diameters" +msgstr "Filament- en nozzlediameters" + +#: src/slic3r/GUI/ConfigWizard.cpp:908 +msgid "Print Diameters" +msgstr "Printdiameters" + +#: src/slic3r/GUI/ConfigWizard.cpp:922 +msgid "Enter the diameter of your printer's hot end nozzle." +msgstr "Voer de nozzlediameter in." + +#: src/slic3r/GUI/ConfigWizard.cpp:925 +msgid "Nozzle Diameter:" +msgstr "Nozzlediameter:" + +#: src/slic3r/GUI/ConfigWizard.cpp:935 +msgid "Enter the diameter of your filament." +msgstr "Voer de filamentdiameter in." + +#: src/slic3r/GUI/ConfigWizard.cpp:936 +msgid "" +"Good precision is required, so use a caliper and do multiple measurements " +"along the filament, then compute the average." +msgstr "" +"Nauwkeurigheid is belangrijk. Gebruik een schuifmaat en meet de diameter op " +"meerdere plekken over de gehele rol. Bereken daarna het gemiddelde." + +#: src/slic3r/GUI/ConfigWizard.cpp:939 +msgid "Filament Diameter:" +msgstr "Filamentdiameter:" + +#: src/slic3r/GUI/ConfigWizard.cpp:973 +msgid "Extruder and Bed Temperatures" +msgstr "Extruder- en bedtemperaturen" + +#: src/slic3r/GUI/ConfigWizard.cpp:973 +msgid "Temperatures" +msgstr "Temperaturen" + +#: src/slic3r/GUI/ConfigWizard.cpp:989 +msgid "Enter the temperature needed for extruding your filament." +msgstr "Voer de benodigde temperatuur in om het filament te extruderen." + +#: src/slic3r/GUI/ConfigWizard.cpp:990 +msgid "A rule of thumb is 160 to 230 °C for PLA, and 215 to 250 °C for ABS." +msgstr "Een vuistregel is 180 - 230 °C voor PLA en 220 - 260 °C voor ABS." + +#: src/slic3r/GUI/ConfigWizard.cpp:993 +msgid "Extrusion Temperature:" +msgstr "Extrusietemperatuur:" + +#: src/slic3r/GUI/ConfigWizard.cpp:994 src/slic3r/GUI/ConfigWizard.cpp:1008 +msgid "°C" +msgstr "°C" + +#: src/slic3r/GUI/ConfigWizard.cpp:1003 +msgid "" +"Enter the bed temperature needed for getting your filament to stick to your " +"heated bed." +msgstr "" +"Voer de temperatuur van het bed in om het filament goed te laten hechten aan " +"het bed." + +#: src/slic3r/GUI/ConfigWizard.cpp:1004 +msgid "" +"A rule of thumb is 60 °C for PLA and 110 °C for ABS. Leave zero if you have " +"no heated bed." +msgstr "" +"Een vuistregel is 60 °C voor PLA en 110 °C voor ABS. Stel in op 0 als de " +"printer geen verwarmd bed heeft." + +#: src/slic3r/GUI/ConfigWizard.cpp:1007 +msgid "Bed Temperature:" +msgstr "Bedtemperatuur:" + +#: src/slic3r/GUI/ConfigWizard.cpp:1426 src/slic3r/GUI/ConfigWizard.cpp:1862 +msgid "Filaments" +msgstr "Filamenten" + +#: src/slic3r/GUI/ConfigWizard.cpp:1426 src/slic3r/GUI/ConfigWizard.cpp:1864 +msgid "SLA Materials" +msgstr "SLA-materialen" + +#: src/slic3r/GUI/ConfigWizard.cpp:1480 +msgid "FFF Technology Printers" +msgstr "FDM-technologie printers" + +#: src/slic3r/GUI/ConfigWizard.cpp:1485 +msgid "SLA Technology Printers" +msgstr "SLA-technologie printers" + +#: src/slic3r/GUI/ConfigWizard.cpp:1625 +msgid "You have to select at least one filament for selected printers" +msgstr "Selecteer tenminste één filament voor de geselecteerde printer(s)" + +#: src/slic3r/GUI/ConfigWizard.cpp:1631 +msgid "You have to select at least one material for selected printers" +msgstr "Selecteer tenminste één materiaal voor de geselecteerde printer(s)" + +#: src/slic3r/GUI/ConfigWizard.cpp:1831 +msgid "Select all standard printers" +msgstr "Selecteer alle standaard printers" + +#: src/slic3r/GUI/ConfigWizard.cpp:1834 +msgid "< &Back" +msgstr "< Terug" + +#: src/slic3r/GUI/ConfigWizard.cpp:1835 +msgid "&Next >" +msgstr "Volgende >" + +#: src/slic3r/GUI/ConfigWizard.cpp:1836 +msgid "&Finish" +msgstr "Voltooien" + +#: src/slic3r/GUI/ConfigWizard.cpp:1837 src/slic3r/GUI/FirmwareDialog.cpp:151 +#: src/slic3r/GUI/ProgressStatusBar.cpp:27 +msgid "Cancel" +msgstr "Annuleren" + +#: src/slic3r/GUI/ConfigWizard.cpp:1850 +msgid "Prusa FFF Technology Printers" +msgstr "Prusa FDM-technologie printers" + +#: src/slic3r/GUI/ConfigWizard.cpp:1853 +msgid "Prusa MSLA Technology Printers" +msgstr "Prusa MSLA-technologie printers" + +#: src/slic3r/GUI/ConfigWizard.cpp:1862 +msgid "Filament Profiles Selection" +msgstr "Profielselectie voor filament" + +#: src/slic3r/GUI/ConfigWizard.cpp:1862 src/slic3r/GUI/GUI_ObjectList.cpp:3415 +msgid "Type:" +msgstr "Type:" + +#: src/slic3r/GUI/ConfigWizard.cpp:1864 +msgid "SLA Material Profiles Selection" +msgstr "Profielselectie voor SLA materialen" + +#: src/slic3r/GUI/ConfigWizard.cpp:1864 +msgid "Layer height:" +msgstr "Laagdikte:" + +#: src/slic3r/GUI/ConfigWizard.cpp:1962 +msgid "Configuration Assistant" +msgstr "Configuratie-assistent" + +#: src/slic3r/GUI/ConfigWizard.cpp:1963 +msgid "Configuration &Assistant" +msgstr "Configuratie-assistent" + +#: src/slic3r/GUI/ConfigWizard.cpp:1965 +msgid "Configuration Wizard" +msgstr "Configuratiewizard" + +#: src/slic3r/GUI/ConfigWizard.cpp:1966 +msgid "Configuration &Wizard" +msgstr "Configuratiewizard" + +#: src/slic3r/GUI/Field.cpp:131 +msgid "default value" +msgstr "standaardwaarde" + +#: src/slic3r/GUI/Field.cpp:134 +msgid "parameter name" +msgstr "parameternaam" + +#: src/slic3r/GUI/Field.cpp:145 src/slic3r/GUI/OptionsGroup.cpp:570 +msgid "N/A" +msgstr "n.v.t." + +#: src/slic3r/GUI/Field.cpp:170 +#, c-format +msgid "%s doesn't support percentage" +msgstr "%s ondersteunt geen percentage" + +#: src/slic3r/GUI/Field.cpp:190 src/slic3r/GUI/Field.cpp:221 +#: src/slic3r/GUI/GUI_ObjectLayers.cpp:376 +msgid "Invalid numeric input." +msgstr "Ongeldige numerieke invoer." + +#: src/slic3r/GUI/Field.cpp:199 +msgid "Input value is out of range" +msgstr "Ingevoerde waarde valt buiten het bereik" + +#: src/slic3r/GUI/Field.cpp:235 +#, c-format +msgid "" +"Do you mean %s%% instead of %s %s?\n" +"Select YES if you want to change this value to %s%%, \n" +"or NO if you are sure that %s %s is a correct value." +msgstr "" +"Wordt %s%% bedoeld in plaats van %s %s?\n" +"Selecteer JA als de waarden aangepast moeten worden naar %s%%\n" +"of NEE als %s %s is de juiste waarde." + +#: src/slic3r/GUI/Field.cpp:238 +msgid "Parameter validation" +msgstr "Parametervalidatie" + +#: src/slic3r/GUI/FirmwareDialog.cpp:150 +msgid "Flash!" +msgstr "Flash!" + +#: src/slic3r/GUI/FirmwareDialog.cpp:152 +msgid "Flashing in progress. Please do not disconnect the printer!" +msgstr "Flashen in uitvoering. Ontkoppel de printer niet!" + +#: src/slic3r/GUI/FirmwareDialog.cpp:199 +msgid "Flashing failed" +msgstr "Flashen mislukt" + +#: src/slic3r/GUI/FirmwareDialog.cpp:282 +msgid "Flashing succeeded!" +msgstr "Flashen succesvol!" + +#: src/slic3r/GUI/FirmwareDialog.cpp:283 +msgid "Flashing failed. Please see the avrdude log below." +msgstr "Flashen mislukt. Check het AVRDUDE-logboek hieronder." + +#: src/slic3r/GUI/FirmwareDialog.cpp:284 +msgid "Flashing cancelled." +msgstr "Flashen geannuleerd." + +#: src/slic3r/GUI/FirmwareDialog.cpp:332 +#, c-format +msgid "" +"This firmware hex file does not match the printer model.\n" +"The hex file is intended for: %s\n" +"Printer reported: %s\n" +"\n" +"Do you want to continue and flash this hex file anyway?\n" +"Please only continue if you are sure this is the right thing to do." +msgstr "" +"Dit HEX-bestand is niet geschikt voor deze printer.\n" +"Het HEX-bestand is bedoeld voor: %s\n" +"Geïdentificeerde printer: %s\n" +"\n" +"Weet u zeker dat u door wilt gaan met dit HEX-bestand?\n" +"Ga alleen door als u zeker weet dat dit juist is." + +#: src/slic3r/GUI/FirmwareDialog.cpp:419 src/slic3r/GUI/FirmwareDialog.cpp:454 +#, c-format +msgid "" +"Multiple %s devices found. Please only connect one at a time for flashing." +msgstr "" +"Meerdere %s apparaten gevonden. Verbind één printer per keer voor het " +"flashen." + +#: src/slic3r/GUI/FirmwareDialog.cpp:436 +#, c-format +msgid "" +"The %s device was not found.\n" +"If the device is connected, please press the Reset button next to the USB " +"connector ..." +msgstr "" +"Het %s apparaat is niet gevonden.\n" +"Klik op de reset-knop naast de USB-aansluiting als het apparaat is verbonden." + +#: src/slic3r/GUI/FirmwareDialog.cpp:548 +#, c-format +msgid "The %s device could not have been found" +msgstr "Het %s apparaat kon niet gevonden worden" + +#: src/slic3r/GUI/FirmwareDialog.cpp:645 +#, c-format +msgid "Error accessing port at %s: %s" +msgstr "Fout bij het openen van de poort op %s: %s" + +#: src/slic3r/GUI/FirmwareDialog.cpp:647 +#, c-format +msgid "Error: %s" +msgstr "Fout: %s" + +#: src/slic3r/GUI/FirmwareDialog.cpp:777 +msgid "Firmware flasher" +msgstr "Firmwareflasher" + +#: src/slic3r/GUI/FirmwareDialog.cpp:802 +msgid "Firmware image:" +msgstr "Firmwarebestand:" + +#: src/slic3r/GUI/FirmwareDialog.cpp:805 src/slic3r/GUI/Tab.cpp:1635 +#: src/slic3r/GUI/Tab.cpp:1691 +msgid "Browse" +msgstr "Zoek" + +#: src/slic3r/GUI/FirmwareDialog.cpp:807 +msgid "Serial port:" +msgstr "Seriële poort:" + +#: src/slic3r/GUI/FirmwareDialog.cpp:809 +msgid "Autodetected" +msgstr "Automatisch gedetecteerd" + +#: src/slic3r/GUI/FirmwareDialog.cpp:810 +msgid "Rescan" +msgstr "Opnieuw scannen" + +#: src/slic3r/GUI/FirmwareDialog.cpp:817 +msgid "Progress:" +msgstr "Voortgang:" + +#: src/slic3r/GUI/FirmwareDialog.cpp:820 +msgid "Status:" +msgstr "Status:" + +#: src/slic3r/GUI/FirmwareDialog.cpp:821 +msgid "Ready" +msgstr "Klaar" + +#: src/slic3r/GUI/FirmwareDialog.cpp:841 +msgid "Advanced: Output log" +msgstr "Geavanceerd: Output logboek" + +#: src/slic3r/GUI/FirmwareDialog.cpp:852 +#: src/slic3r/GUI/PrintHostDialogs.cpp:161 +msgid "Close" +msgstr "Sluit" + +#: src/slic3r/GUI/FirmwareDialog.cpp:902 +msgid "" +"Are you sure you want to cancel firmware flashing?\n" +"This could leave your printer in an unusable state!" +msgstr "" +"Weet u zeker dat u het firmware flashen wilt stoppen?\n" +"Dit kan er voor zorgen dat de printer onbruikbaar wordt!" + +#: src/slic3r/GUI/FirmwareDialog.cpp:903 +msgid "Confirmation" +msgstr "Bevestiging" + +#: src/slic3r/GUI/FirmwareDialog.cpp:906 +msgid "Cancelling..." +msgstr "Annuleren..." + +#: src/slic3r/GUI/GLCanvas3D.cpp:240 src/slic3r/GUI/GLCanvas3D.cpp:4365 +msgid "Variable layer height" +msgstr "Variabele laagdikte" + +#: src/slic3r/GUI/GLCanvas3D.cpp:243 +msgid "Left mouse button:" +msgstr "Linkermuisknop:" + +#: src/slic3r/GUI/GLCanvas3D.cpp:246 +msgid "Add detail" +msgstr "Voeg detail toe" + +#: src/slic3r/GUI/GLCanvas3D.cpp:249 +msgid "Right mouse button:" +msgstr "Rechtermuisknop:" + +#: src/slic3r/GUI/GLCanvas3D.cpp:252 +msgid "Remove detail" +msgstr "Verwijder detail" + +#: src/slic3r/GUI/GLCanvas3D.cpp:255 +msgid "Shift + Left mouse button:" +msgstr "Shift + linkermuisknop:" + +#: src/slic3r/GUI/GLCanvas3D.cpp:258 +msgid "Reset to base" +msgstr "Reset" + +#: src/slic3r/GUI/GLCanvas3D.cpp:261 +msgid "Shift + Right mouse button:" +msgstr "Shift + rechtermuisknop:" + +#: src/slic3r/GUI/GLCanvas3D.cpp:264 +msgid "Smoothing" +msgstr "Egaliseren" + +#: src/slic3r/GUI/GLCanvas3D.cpp:267 +msgid "Mouse wheel:" +msgstr "Scrollwieltje:" + +#: src/slic3r/GUI/GLCanvas3D.cpp:270 +msgid "Increase/decrease edit area" +msgstr "Vergroot/verklein bewerkgebied" + +#: src/slic3r/GUI/GLCanvas3D.cpp:273 +msgid "Adaptive" +msgstr "Adaptief" + +#: src/slic3r/GUI/GLCanvas3D.cpp:278 +msgid "Cusp (mm)" +msgstr "Drempelwaarde (mm)" + +#: src/slic3r/GUI/GLCanvas3D.cpp:286 +msgid "Smooth" +msgstr "Egaliseer" + +#: src/slic3r/GUI/GLCanvas3D.cpp:291 src/libslic3r/PrintConfig.cpp:500 +msgid "Radius" +msgstr "Radius" + +#: src/slic3r/GUI/GLCanvas3D.cpp:300 +msgid "Keep min" +msgstr "Behoud min" + +#: src/slic3r/GUI/GLCanvas3D.cpp:307 +msgid "Reset" +msgstr "Reset" + +#: src/slic3r/GUI/GLCanvas3D.cpp:695 +msgid "Variable layer height - Manual edit" +msgstr "Variabele laagdikte - handmatig bewerken" + +#: src/slic3r/GUI/GLCanvas3D.cpp:794 +msgid "An object outside the print area was detected" +msgstr "Er is een object buiten het printbereik gedetecteerd" + +#: src/slic3r/GUI/GLCanvas3D.cpp:795 +msgid "A toolpath outside the print area was detected" +msgstr "Er is een printbeweging buiten het printbereik gedetecteerd" + +#: src/slic3r/GUI/GLCanvas3D.cpp:796 +msgid "SLA supports outside the print area were detected" +msgstr "Er is SLA-support buiten het printbereik gedetecteerd" + +#: src/slic3r/GUI/GLCanvas3D.cpp:797 +msgid "Some objects are not visible when editing supports" +msgstr "Sommige objecten zijn niet zichtbaar als het support bewerkt wordt" + +#: src/slic3r/GUI/GLCanvas3D.cpp:799 +msgid "" +"An object outside the print area was detected\n" +"Resolve the current problem to continue slicing" +msgstr "" +"Er is een object buiten het printbereik gedetecteerd\n" +"Los dit probleem op om door te gaan met slicen" + +#: src/slic3r/GUI/GLCanvas3D.cpp:1014 src/slic3r/GUI/GLCanvas3D.cpp:1042 +msgid "Default print color" +msgstr "Standaard printkleur" + +#: src/slic3r/GUI/GLCanvas3D.cpp:1043 src/slic3r/GUI/GLCanvas3D.cpp:1052 +#: src/slic3r/GUI/GLCanvas3D.cpp:1091 +msgid "Pause print or custom G-code" +msgstr "Pauzeer de print of voer custom G-code in" + +#: src/slic3r/GUI/GLCanvas3D.cpp:1064 +#, c-format +msgid "up to %.2f mm" +msgstr "tot %.2f mm" + +#: src/slic3r/GUI/GLCanvas3D.cpp:1068 +#, c-format +msgid "above %.2f mm" +msgstr "boven %.2f mm" + +#: src/slic3r/GUI/GLCanvas3D.cpp:1072 +#, c-format +msgid "%.2f - %.2f mm" +msgstr "%.2f - %.2f mm" + +#: src/slic3r/GUI/GLCanvas3D.cpp:1086 src/slic3r/GUI/Tab.cpp:2288 +#: src/slic3r/GUI/wxExtensions.cpp:3170 src/slic3r/GUI/wxExtensions.cpp:3421 +#: src/libslic3r/GCode/PreviewData.cpp:451 +#, c-format +msgid "Extruder %d" +msgstr "Extruder %d" + +#: src/slic3r/GUI/GLCanvas3D.cpp:1099 +#, c-format +msgid "Color change for Extruder %d at %.2f mm" +msgstr "Kleurwissel voor extruder %d op %.2f mm" + +#: src/slic3r/GUI/GLCanvas3D.cpp:1673 +msgid "Variable layer height - Reset" +msgstr "Variabele laagdikte - reset" + +#: src/slic3r/GUI/GLCanvas3D.cpp:1681 +msgid "Variable layer height - Adaptive" +msgstr "Variabele laagdikte - adaptief" + +#: src/slic3r/GUI/GLCanvas3D.cpp:1689 +msgid "Variable layer height - Smooth all" +msgstr "Variable laagdikte - egaliseer alles" + +#: src/slic3r/GUI/GLCanvas3D.cpp:2026 +msgid "Mirror Object" +msgstr "Spiegel object" + +#: src/slic3r/GUI/GLCanvas3D.cpp:3297 +msgid "Move Object" +msgstr "Verplaats object" + +#: src/slic3r/GUI/GLCanvas3D.cpp:3843 +msgid "Undo History" +msgstr "Geschiedenis ongedaan maken" + +#: src/slic3r/GUI/GLCanvas3D.cpp:3843 +msgid "Redo History" +msgstr "Geschiedenis opnieuw doen" + +#: src/slic3r/GUI/GLCanvas3D.cpp:3861 +#, c-format +msgid "Undo %1$d Action" +msgid_plural "Undo %1$d Actions" +msgstr[0] "Maak %1$d actie ongedaan" +msgstr[1] "Maak %1$d acties ongedaan" + +#: src/slic3r/GUI/GLCanvas3D.cpp:3861 +#, c-format +msgid "Redo %1$d Action" +msgid_plural "Redo %1$d Actions" +msgstr[0] "Doe %1$d actie opnieuw" +msgstr[1] "Doe %1$d acties opnieuw" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4259 +msgid "Add..." +msgstr "Voeg toe..." + +#: src/slic3r/GUI/GLCanvas3D.cpp:4267 src/slic3r/GUI/GUI_ObjectList.cpp:1592 +#: src/slic3r/GUI/Plater.cpp:3712 src/slic3r/GUI/Plater.cpp:3734 +#: src/slic3r/GUI/Tab.cpp:3080 +msgid "Delete" +msgstr "Verwijder" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4276 src/slic3r/GUI/Plater.cpp:4410 +msgid "Delete all" +msgstr "Verwijder alles" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4285 src/slic3r/GUI/KBShortcutsDialog.cpp:137 +#: src/slic3r/GUI/Plater.cpp:2758 +msgid "Arrange" +msgstr "Schikken" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4285 src/slic3r/GUI/KBShortcutsDialog.cpp:138 +msgid "Arrange selection" +msgstr "Schik selectie" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4297 +msgid "Copy" +msgstr "Kopieer" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4306 +msgid "Paste" +msgstr "Plak" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4318 src/slic3r/GUI/Plater.cpp:3569 +#: src/slic3r/GUI/Plater.cpp:3581 src/slic3r/GUI/Plater.cpp:3721 +msgid "Add instance" +msgstr "Voeg instantie toe" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4329 src/slic3r/GUI/Plater.cpp:3723 +msgid "Remove instance" +msgstr "Verwijder instantie" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4342 +msgid "Split to objects" +msgstr "Verdeel in objecten" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4352 src/slic3r/GUI/GUI_ObjectList.cpp:1424 +msgid "Split to parts" +msgstr "Verdeel in onderdelen" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4416 src/slic3r/GUI/MainFrame.cpp:571 +msgid "Undo" +msgstr "Maak ongedaan" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4416 src/slic3r/GUI/GLCanvas3D.cpp:4449 +msgid "Click right mouse button to open History" +msgstr "Open de geschiedenis met de rechtermuisknop" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4433 +msgid "Next Undo action: %1%" +msgstr "Volgende ongedaan maken: %1%" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4449 src/slic3r/GUI/MainFrame.cpp:574 +msgid "Redo" +msgstr "Doe opnieuw" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4465 +msgid "Next Redo action: %1%" +msgstr "Volgende opnieuw doen: %1%" + +#: src/slic3r/GUI/GLCanvas3D.cpp:6380 +msgid "Selection-Add from rectangle" +msgstr "Selectie - Voeg toe van boxselectie" + +#: src/slic3r/GUI/GLCanvas3D.cpp:6399 +msgid "Selection-Remove from rectangle" +msgstr "Selectie - Verwijder van boxselectie" + +#: src/slic3r/GUI/GLCanvas3DManager.cpp:283 +#, c-format +msgid "" +"PrusaSlicer requires OpenGL 2.0 capable graphics driver to run correctly, \n" +"while OpenGL version %s, render %s, vendor %s was detected." +msgstr "" +"PrusaSlicer vereist een grafische driver die OpenGL 2.0 kan draaien,\n" +"terwijl OpenGL-versie %s, render %s, leverancier %s is gedetecteerd." + +#: src/slic3r/GUI/GLCanvas3DManager.cpp:286 +msgid "You may need to update your graphics card driver." +msgstr "U moet mogelijk uw grafische kaart updaten." + +#: src/slic3r/GUI/GLCanvas3DManager.cpp:289 +msgid "" +"As a workaround, you may run PrusaSlicer with a software rendered 3D " +"graphics by running prusa-slicer.exe with the --sw_renderer parameter." +msgstr "" +"Als oplossing kunt u PrusaSlicer draaien met een softwarematig 3D-" +"renderprogramma door prusa-slicer.exe uit te voeren met de --sw_renderer " +"parameter." + +#: src/slic3r/GUI/GLCanvas3DManager.cpp:291 +msgid "Unsupported OpenGL version" +msgstr "Niet-ondersteunde OpenGL-versie" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:40 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:145 src/libslic3r/PrintConfig.cpp:3329 +msgid "Cut" +msgstr "Snij door" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:150 +msgid "Keep upper part" +msgstr "Behoud bovenste deel" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:151 +msgid "Keep lower part" +msgstr "Behoud onderste deel" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:152 +msgid "Rotate lower part upwards" +msgstr "Roteer onderste deel naar boven" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:155 +msgid "Perform cut" +msgstr "Toepassen" + +#: src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp:45 +msgid "Place on face" +msgstr "Plaats op vlak" + +#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:48 +msgid "Move" +msgstr "Verplaats" + +#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:177 +msgid "Position (mm)" +msgstr "Positie (mm)" + +#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:177 +msgid "Displacement (mm)" +msgstr "Verplaatsing (mm)" + +#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:449 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:480 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:499 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:517 +#: src/libslic3r/PrintConfig.cpp:3378 +msgid "Rotate" +msgstr "Roteer" + +#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:482 +msgid "Rotation (deg)" +msgstr "Rotatie (°)" + +#: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:47 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:230 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:500 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:518 +#: src/libslic3r/PrintConfig.cpp:3393 +msgid "Scale" +msgstr "Verschaal" + +#: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:292 +msgid "Scale (%)" +msgstr "Verschaling (%)" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:48 +msgid "Head diameter" +msgstr "Kopdiameter" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:49 +msgid "Lock supports under new islands" +msgstr "Vergrendel support onder nieuwe eilanden" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:50 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1286 +msgid "Remove selected points" +msgstr "Verwijder geselecteerde punten" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:51 +msgid "Remove all points" +msgstr "Verwijdere alle punten" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:52 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1289 +msgid "Apply changes" +msgstr "Wijzigingen toepassen" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:53 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1290 +msgid "Discard changes" +msgstr "Wijzigingen afwijzen" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:54 +msgid "Minimal points distance" +msgstr "Minimale puntafstand" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:55 +#: src/libslic3r/PrintConfig.cpp:2732 +msgid "Support points density" +msgstr "Dichtheid van supportpunten" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:56 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1292 +msgid "Auto-generate points" +msgstr "Genereer automatisch punten" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:57 +msgid "Manual editing" +msgstr "Handmatig bewerken" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:58 +msgid "Clipping of view" +msgstr "Weergave samenvoegen" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:59 +msgid "Reset direction" +msgstr "Reset-richting" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:442 +msgid "Add support point" +msgstr "Voeg supportpunt toe" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:578 +msgid "Delete support point" +msgstr "Verwijder supportpunt" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:754 +msgid "Change point head diameter" +msgstr "Wijzig puntkopdiameter" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:820 +msgid "Support parameter change" +msgstr "Wijzig supportparameter" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:929 +msgid "SLA Support Points" +msgstr "SLA-supportpunten" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:950 +msgid "SLA gizmo turned on" +msgstr "SLA Gizmo aangezet" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:972 +msgid "Do you want to save your manually edited support points?" +msgstr "Wilt u handmatig aangepaste supportpunten opslaan?" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:973 +msgid "Save changes?" +msgstr "Wijzigingen opslaan?" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:985 +msgid "SLA gizmo turned off" +msgstr "SLA Gizmo uitgezet" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1022 +msgid "Move support point" +msgstr "Verplaats supportpunt" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1121 +msgid "Support points edit" +msgstr "Bewerk supportpunten" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1190 +msgid "Autogeneration will erase all manually edited points." +msgstr "" +"Automatisch genereren zal alle handmatig aangepaste punten verwijderen." + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1191 +msgid "Are you sure you want to do it?" +msgstr "Weet u zeker dat u dit wilt doen?" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1192 src/slic3r/GUI/GUI.cpp:246 +#: src/slic3r/GUI/Tab.cpp:3040 src/slic3r/GUI/WipeTowerDialog.cpp:45 +#: src/slic3r/GUI/WipeTowerDialog.cpp:366 +msgid "Warning" +msgstr "Waarschuwing" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1195 +msgid "Autogenerate support points" +msgstr "Automatisch gegenereerde supportpunten" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1249 +msgid "SLA gizmo keyboard shortcuts" +msgstr "SLA sneltoetsen" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1260 +msgid "Note: some shortcuts work in (non)editing mode only." +msgstr "Let op: sommige sneltoetsen werken alleen in bewerkmodus." + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1278 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1281 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1282 +msgid "Left click" +msgstr "Linkermuisknop" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1278 +msgid "Add point" +msgstr "Voeg punt toe" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1279 +msgid "Right click" +msgstr "Rechtermuisknop" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1279 +msgid "Remove point" +msgstr "Verwijder punt" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1280 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1283 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1284 +msgid "Drag" +msgstr "Versleep" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1280 +msgid "Move point" +msgstr "Verplaats punt" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1281 +msgid "Add point to selection" +msgstr "Voeg punt toe aan selectie" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1282 +msgid "Remove point from selection" +msgstr "Verwijder punt uit selectie" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1283 +msgid "Select by rectangle" +msgstr "Selecteer met boxselectie" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1284 +msgid "Deselect by rectangle" +msgstr "Deselecteer met boxselectie" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1285 +msgid "Select all points" +msgstr "Selecteer alle punten" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1287 +msgid "Mouse wheel" +msgstr "Scrollwieltje" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1287 +msgid "Move clipping plane" +msgstr "Verplaats snijvlak" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1288 +msgid "Reset clipping plane" +msgstr "Reset snijvlak" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1291 +msgid "Switch to editing mode" +msgstr "Schakel over naar bewerkmodus" + +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:477 +msgid "Gizmo-Place on Face" +msgstr "Plaats op vlak" + +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:550 +msgid "Gizmo-Move" +msgstr "Verplaatsen" + +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:552 +msgid "Gizmo-Scale" +msgstr "Verschalen" + +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:554 +msgid "Gizmo-Rotate" +msgstr "Roteren" + +#: src/slic3r/GUI/GUI.cpp:240 +msgid "Notice" +msgstr "Let op" + +#: src/slic3r/GUI/GUI_App.cpp:137 +#, c-format +msgid "" +"%s has encountered an error. It was likely caused by running out of memory. " +"If you are sure you have enough RAM on your system, this may also be a bug " +"and we would be glad if you reported it.\n" +"\n" +"The application will now terminate." +msgstr "" +"%s veroorzaakte een fout. Dit komt mogelijk door een geheugentekort. Als u " +"zeker weet dat u genoeg RAM-geheugen heeft, kan dit ook een andere fout " +"zijn. We waarderen het als u dit meldt.\n" +"\n" +"Het programma zal nu afsluiten." + +#: src/slic3r/GUI/GUI_App.cpp:140 +msgid "Fatal error" +msgstr "Fatale fout" + +#: src/slic3r/GUI/GUI_App.cpp:450 +msgid "Changing of an application language" +msgstr "Veranderen van de taal van het programma" + +#: src/slic3r/GUI/GUI_App.cpp:458 src/slic3r/GUI/GUI_App.cpp:467 +msgid "Recreating" +msgstr "Opnieuw aanmaken" + +#: src/slic3r/GUI/GUI_App.cpp:471 +msgid "Loading of current presets" +msgstr "Laden van huidige presets" + +#: src/slic3r/GUI/GUI_App.cpp:479 +msgid "Loading of a mode view" +msgstr "Laden van de weergavemodus" + +#: src/slic3r/GUI/GUI_App.cpp:560 +msgid "Choose one file (3MF/AMF):" +msgstr "Kies een 3MF- of AMF-bestand:" + +#: src/slic3r/GUI/GUI_App.cpp:572 +msgid "Choose one or more files (STL/OBJ/AMF/3MF/PRUSA):" +msgstr "Kies één of meer STL-, OBJ-, AMF-, 3MF-, of PRUSA-bestanden:" + +#: src/slic3r/GUI/GUI_App.cpp:634 +msgid "Select the language" +msgstr "Selecteer taal" + +#: src/slic3r/GUI/GUI_App.cpp:634 +msgid "Language" +msgstr "Taal" + +#: src/slic3r/GUI/GUI_App.cpp:802 +#, c-format +msgid "Run %s" +msgstr "Voer %s uit" + +#: src/slic3r/GUI/GUI_App.cpp:805 +msgid "&Configuration Snapshots" +msgstr "Configuratiesnapshots" + +#: src/slic3r/GUI/GUI_App.cpp:805 +msgid "Inspect / activate configuration snapshots" +msgstr "Inspecteer/activeer configuratiesnapshots" + +#: src/slic3r/GUI/GUI_App.cpp:806 +msgid "Take Configuration &Snapshot" +msgstr "Neem configuratiesnapshot" + +#: src/slic3r/GUI/GUI_App.cpp:806 +msgid "Capture a configuration snapshot" +msgstr "Neem een configuratiesnapshot op" + +#: src/slic3r/GUI/GUI_App.cpp:809 +msgid "&Preferences" +msgstr "Voorkeuren" + +#: src/slic3r/GUI/GUI_App.cpp:815 +msgid "Application preferences" +msgstr "Programmavoorkeuren" + +#: src/slic3r/GUI/GUI_App.cpp:818 src/slic3r/GUI/wxExtensions.cpp:3824 +msgid "Simple" +msgstr "Eenvoudig" + +#: src/slic3r/GUI/GUI_App.cpp:818 +msgid "Simple View Mode" +msgstr "Eenvoudige weergave" + +#: src/slic3r/GUI/GUI_App.cpp:819 src/slic3r/GUI/GUI_ObjectList.cpp:97 +#: src/slic3r/GUI/GUI_ObjectList.cpp:617 src/slic3r/GUI/Tab.cpp:1067 +#: src/slic3r/GUI/Tab.cpp:1082 src/slic3r/GUI/Tab.cpp:1181 +#: src/slic3r/GUI/Tab.cpp:1184 src/slic3r/GUI/Tab.cpp:1450 +#: src/slic3r/GUI/Tab.cpp:1937 src/slic3r/GUI/Tab.cpp:3614 +#: src/slic3r/GUI/wxExtensions.cpp:3825 src/libslic3r/PrintConfig.cpp:88 +#: src/libslic3r/PrintConfig.cpp:202 src/libslic3r/PrintConfig.cpp:365 +#: src/libslic3r/PrintConfig.cpp:1026 src/libslic3r/PrintConfig.cpp:2253 +msgid "Advanced" +msgstr "Geavanceerd" + +#: src/slic3r/GUI/GUI_App.cpp:819 +msgid "Advanced View Mode" +msgstr "Geavanceerde weergave" + +#: src/slic3r/GUI/GUI_App.cpp:820 src/slic3r/GUI/wxExtensions.cpp:3826 +msgid "Expert" +msgstr "Expert" + +#: src/slic3r/GUI/GUI_App.cpp:820 +msgid "Expert View Mode" +msgstr "Expertweergave" + +#: src/slic3r/GUI/GUI_App.cpp:825 +msgid "Mode" +msgstr "Modus" + +#: src/slic3r/GUI/GUI_App.cpp:825 +#, c-format +msgid "%s View Mode" +msgstr "%s-weergavemodus" + +#: src/slic3r/GUI/GUI_App.cpp:827 +msgid "Change Application &Language" +msgstr "Wijzig programmataal" + +#: src/slic3r/GUI/GUI_App.cpp:829 +msgid "Flash printer &firmware" +msgstr "Flash printerfirmware" + +#: src/slic3r/GUI/GUI_App.cpp:829 +msgid "Upload a firmware image into an Arduino based printer" +msgstr "Upload een firmwarebestand op een Arduino-gebaseerde printer" + +#: src/slic3r/GUI/GUI_App.cpp:841 +msgid "Taking configuration snapshot" +msgstr "Neem configuratiesnapshot" + +#: src/slic3r/GUI/GUI_App.cpp:841 +msgid "Snapshot name" +msgstr "Snapshotnaam" + +#: src/slic3r/GUI/GUI_App.cpp:884 +msgid "" +"Switching the language will trigger application restart.\n" +"You will lose content of the plater." +msgstr "" +"Het veranderen van de taal zorgt dat het programma opnieuw opstart.\n" +"U verliest de geladen inhoud zoals getoond in de modelweergave." + +#: src/slic3r/GUI/GUI_App.cpp:886 +msgid "Do you want to proceed?" +msgstr "Weet u zeker dat u door wilt gaan?" + +#: src/slic3r/GUI/GUI_App.cpp:887 +msgid "Language selection" +msgstr "Taalselectie" + +#: src/slic3r/GUI/GUI_App.cpp:910 +msgid "&Configuration" +msgstr "Configuratie" + +#: src/slic3r/GUI/GUI_App.cpp:934 +msgid "The presets on the following tabs were modified" +msgstr "De instellingen in de volgende tabs zijn aangepast" + +#: src/slic3r/GUI/GUI_App.cpp:934 src/slic3r/GUI/Tab.cpp:2902 +msgid "Discard changes and continue anyway?" +msgstr "Wijzigingen afwijzen en doorgaan?" + +#: src/slic3r/GUI/GUI_App.cpp:937 +msgid "Unsaved Presets" +msgstr "Niet-opgeslagen presets" + +#: src/slic3r/GUI/GUI_App.cpp:1083 src/slic3r/GUI/Tab.cpp:2914 +msgid "It's impossible to print multi-part object(s) with SLA technology." +msgstr "" +"Het is niet mogelijk meerdelige objecten te printen met de SLA-technologie." + +#: src/slic3r/GUI/GUI_App.cpp:1084 +msgid "Please check and fix your object list." +msgstr "Controleer en repareer de objectenlijst." + +#: src/slic3r/GUI/GUI_App.cpp:1085 src/slic3r/GUI/Plater.cpp:2317 +#: src/slic3r/GUI/Tab.cpp:2916 +msgid "Attention!" +msgstr "Attentie!" + +#: src/slic3r/GUI/GUI_App.cpp:1102 +msgid "Select a gcode file:" +msgstr "Selecteer een gcode-bestand:" + +#: src/slic3r/GUI/GUI_ObjectLayers.cpp:27 +msgid "Start at height" +msgstr "Start op hoogte" + +#: src/slic3r/GUI/GUI_ObjectLayers.cpp:27 +msgid "Stop at height" +msgstr "Stop op hoogte" + +#: src/slic3r/GUI/GUI_ObjectLayers.cpp:153 +msgid "Remove layer range" +msgstr "Verwijder laagbereik" + +#: src/slic3r/GUI/GUI_ObjectLayers.cpp:162 +msgid "Add layer range" +msgstr "Voeg laagbereik toe" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:34 src/slic3r/GUI/GUI_ObjectList.cpp:88 +#: src/slic3r/GUI/GUI_ObjectList.cpp:608 src/libslic3r/PrintConfig.cpp:72 +#: src/libslic3r/PrintConfig.cpp:165 src/libslic3r/PrintConfig.cpp:397 +#: src/libslic3r/PrintConfig.cpp:459 src/libslic3r/PrintConfig.cpp:467 +#: src/libslic3r/PrintConfig.cpp:879 src/libslic3r/PrintConfig.cpp:1064 +#: src/libslic3r/PrintConfig.cpp:1369 src/libslic3r/PrintConfig.cpp:1436 +#: src/libslic3r/PrintConfig.cpp:1617 src/libslic3r/PrintConfig.cpp:2063 +#: src/libslic3r/PrintConfig.cpp:2122 +msgid "Layers and Perimeters" +msgstr "Lagen en perimeters" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:36 src/slic3r/GUI/GUI_ObjectList.cpp:90 +#: src/slic3r/GUI/GUI_ObjectList.cpp:610 src/slic3r/GUI/GUI_Preview.cpp:245 +#: src/slic3r/GUI/Tab.cpp:1100 src/slic3r/GUI/Tab.cpp:1101 +#: src/libslic3r/ExtrusionEntity.cpp:319 src/libslic3r/PrintConfig.cpp:349 +#: src/libslic3r/PrintConfig.cpp:1497 src/libslic3r/PrintConfig.cpp:1855 +#: src/libslic3r/PrintConfig.cpp:1861 src/libslic3r/PrintConfig.cpp:1869 +#: src/libslic3r/PrintConfig.cpp:1881 src/libslic3r/PrintConfig.cpp:1891 +#: src/libslic3r/PrintConfig.cpp:1899 src/libslic3r/PrintConfig.cpp:1914 +#: src/libslic3r/PrintConfig.cpp:1935 src/libslic3r/PrintConfig.cpp:1947 +#: src/libslic3r/PrintConfig.cpp:1963 src/libslic3r/PrintConfig.cpp:1972 +#: src/libslic3r/PrintConfig.cpp:1981 src/libslic3r/PrintConfig.cpp:1992 +#: src/libslic3r/PrintConfig.cpp:2006 src/libslic3r/PrintConfig.cpp:2014 +#: src/libslic3r/PrintConfig.cpp:2015 src/libslic3r/PrintConfig.cpp:2024 +#: src/libslic3r/PrintConfig.cpp:2032 src/libslic3r/PrintConfig.cpp:2046 +msgid "Support material" +msgstr "Support" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:39 src/slic3r/GUI/GUI_ObjectList.cpp:94 +#: src/slic3r/GUI/GUI_ObjectList.cpp:614 src/libslic3r/PrintConfig.cpp:2229 +#: src/libslic3r/PrintConfig.cpp:2237 +msgid "Wipe options" +msgstr "Afveegopties" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:45 +msgid "Pad and Support" +msgstr "Basisplaat en support" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:51 +msgid "Add part" +msgstr "Voeg onderdeel toe" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:52 +msgid "Add modifier" +msgstr "Voeg modificator toe" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:53 +msgid "Add support enforcer" +msgstr "Voeg supportforcering toe" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:54 +msgid "Add support blocker" +msgstr "Voeg supportblokkering toe" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:91 src/slic3r/GUI/GUI_ObjectList.cpp:611 +#: src/slic3r/GUI/GUI_Preview.cpp:223 src/slic3r/GUI/Tab.cpp:1125 +#: src/libslic3r/PrintConfig.cpp:214 src/libslic3r/PrintConfig.cpp:447 +#: src/libslic3r/PrintConfig.cpp:908 src/libslic3r/PrintConfig.cpp:1037 +#: src/libslic3r/PrintConfig.cpp:1426 src/libslic3r/PrintConfig.cpp:1663 +#: src/libslic3r/PrintConfig.cpp:1712 src/libslic3r/PrintConfig.cpp:1764 +#: src/libslic3r/PrintConfig.cpp:2107 +msgid "Speed" +msgstr "Snelheid" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:92 src/slic3r/GUI/GUI_ObjectList.cpp:612 +#: src/slic3r/GUI/Tab.cpp:1160 src/slic3r/GUI/Tab.cpp:1808 +#: src/libslic3r/PrintConfig.cpp:477 src/libslic3r/PrintConfig.cpp:991 +#: src/libslic3r/PrintConfig.cpp:1404 src/libslic3r/PrintConfig.cpp:1733 +#: src/libslic3r/PrintConfig.cpp:1927 src/libslic3r/PrintConfig.cpp:1954 +msgid "Extruders" +msgstr "Extruders" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:93 src/slic3r/GUI/GUI_ObjectList.cpp:613 +#: src/libslic3r/PrintConfig.cpp:436 src/libslic3r/PrintConfig.cpp:544 +#: src/libslic3r/PrintConfig.cpp:866 src/libslic3r/PrintConfig.cpp:999 +#: src/libslic3r/PrintConfig.cpp:1413 src/libslic3r/PrintConfig.cpp:1753 +#: src/libslic3r/PrintConfig.cpp:1936 src/libslic3r/PrintConfig.cpp:2095 +msgid "Extrusion Width" +msgstr "Extrusiebreedte" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:99 src/slic3r/GUI/GUI_ObjectList.cpp:619 +#: src/slic3r/GUI/Plater.cpp:484 src/slic3r/GUI/Tab.cpp:3564 +#: src/slic3r/GUI/Tab.cpp:3565 src/libslic3r/PrintConfig.cpp:2582 +#: src/libslic3r/PrintConfig.cpp:2589 src/libslic3r/PrintConfig.cpp:2598 +#: src/libslic3r/PrintConfig.cpp:2607 src/libslic3r/PrintConfig.cpp:2617 +#: src/libslic3r/PrintConfig.cpp:2643 src/libslic3r/PrintConfig.cpp:2650 +#: src/libslic3r/PrintConfig.cpp:2661 src/libslic3r/PrintConfig.cpp:2671 +#: src/libslic3r/PrintConfig.cpp:2680 src/libslic3r/PrintConfig.cpp:2693 +#: src/libslic3r/PrintConfig.cpp:2703 src/libslic3r/PrintConfig.cpp:2712 +#: src/libslic3r/PrintConfig.cpp:2722 src/libslic3r/PrintConfig.cpp:2733 +#: src/libslic3r/PrintConfig.cpp:2741 +msgid "Supports" +msgstr "Support" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:100 src/slic3r/GUI/GUI_ObjectList.cpp:620 +#: src/slic3r/GUI/Plater.cpp:624 src/slic3r/GUI/Tab.cpp:3596 +#: src/slic3r/GUI/Tab.cpp:3597 src/libslic3r/PrintConfig.cpp:2749 +#: src/libslic3r/PrintConfig.cpp:2756 src/libslic3r/PrintConfig.cpp:2770 +#: src/libslic3r/PrintConfig.cpp:2781 src/libslic3r/PrintConfig.cpp:2791 +#: src/libslic3r/PrintConfig.cpp:2813 src/libslic3r/PrintConfig.cpp:2824 +#: src/libslic3r/PrintConfig.cpp:2831 src/libslic3r/PrintConfig.cpp:2838 +#: src/libslic3r/PrintConfig.cpp:2849 src/libslic3r/PrintConfig.cpp:2858 +#: src/libslic3r/PrintConfig.cpp:2867 +msgid "Pad" +msgstr "Basisplaat" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:262 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:153 +msgid "Name" +msgstr "Naam" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:270 src/slic3r/GUI/Tab.cpp:1414 +#: src/slic3r/GUI/wxExtensions.cpp:549 src/libslic3r/PrintConfig.cpp:476 +msgid "Extruder" +msgstr "Extruder" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:274 src/slic3r/GUI/GUI_ObjectList.cpp:386 +msgid "Editing" +msgstr "Bewerken" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:331 +#, c-format +msgid "Auto-repaired (%d errors):" +msgstr "Automatisch gerepareerd (%d fouten):" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:338 +msgid "degenerate facets" +msgstr "vlakken gedegenereerd" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:339 +msgid "edges fixed" +msgstr "randen vastgezet" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:340 +msgid "facets removed" +msgstr "vlakken verwijderd" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:341 +msgid "facets added" +msgstr "vlakken toegevoegd" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:342 +msgid "facets reversed" +msgstr "vlakken omgekeerd" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:343 +msgid "backwards edges" +msgstr "omgekeerde lijnen" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:351 +msgid "Right button click the icon to fix STL through Netfabb" +msgstr "" +"Rechtermuisklik op het pictogram om het STL-bestand met NetFabb te repareren" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:388 +msgid "Right button click the icon to change the object settings" +msgstr "Rechtermuisklik op het icoontje om de objectinstellingen te wijzigen" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:390 +msgid "Click the icon to change the object settings" +msgstr "Klik op het pictogram om de objectinstellingen te wijzigen" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:394 +msgid "Right button click the icon to change the object printable property" +msgstr "Rechtermuisklik op het pictogram om de printinstellingen te wijzigen" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:396 +msgid "Click the icon to change the object printable property" +msgstr "Klik op het pictogram om de printinstellingen te wijzigen" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:449 src/slic3r/GUI/GUI_ObjectList.cpp:461 +#: src/slic3r/GUI/GUI_ObjectList.cpp:907 src/slic3r/GUI/GUI_ObjectList.cpp:3822 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3832 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3867 src/slic3r/GUI/wxExtensions.cpp:734 +#: src/slic3r/GUI/wxExtensions.cpp:791 src/slic3r/GUI/wxExtensions.cpp:816 +#: src/slic3r/GUI/wxExtensions.cpp:1024 src/slic3r/GUI/wxExtensions.cpp:2240 +msgid "default" +msgstr "standaard" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:528 +msgid "Change Extruder" +msgstr "Wijzig extruder" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:543 +msgid "Rename Object" +msgstr "Hernoem object" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:543 +msgid "Rename Sub-object" +msgstr "Hernoem subobject" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1068 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3643 +msgid "Instances to Separated Objects" +msgstr "Zet instanties om in objecten" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1086 +msgid "Volumes in Object reordered" +msgstr "Volumes in object opnieuw geordend" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1086 +msgid "Object reordered" +msgstr "Object opnieuw geordend" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1141 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1460 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1466 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1723 +#, c-format +msgid "Quick Add Settings (%s)" +msgstr "Snel instellingen toevoegen (%s)" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1218 +msgid "Select showing settings" +msgstr "Selecteer getoonde instellingen" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1267 +msgid "Add Settings for Layers" +msgstr "Voeg laaginstellingen toe" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1268 +msgid "Add Settings for Sub-object" +msgstr "Voeg instellingen voor subobject toe" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1269 +msgid "Add Settings for Object" +msgstr "Voeg instellingen voor object toe" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1330 +msgid "Add Settings Bundle for Height range" +msgstr "Voeg instellingen voor hoogtebereik toe" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1331 +msgid "Add Settings Bundle for Sub-object" +msgstr "Voeg instellingen voor subobject toe" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1332 +msgid "Add Settings Bundle for Object" +msgstr "Voeg instellingen voor een object toe" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1371 +msgid "Load" +msgstr "Laad" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1376 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1404 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1407 +msgid "Box" +msgstr "Blok" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1376 +msgid "Cylinder" +msgstr "Cilinder" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1376 +msgid "Sphere" +msgstr "Bol" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1376 +msgid "Slab" +msgstr "Plaat" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1431 +msgid "Height range Modifier" +msgstr "Modificator voor hoogtebereik" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1439 +msgid "Add settings" +msgstr "Voeg instellingen toe" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1507 +msgid "Change type" +msgstr "Wijzig type" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1514 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1671 +msgid "Set as a Separated Object" +msgstr "Stel in als apart object" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1520 +msgid "Printable" +msgstr "Printbaar" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1527 +msgid "Rename" +msgstr "Hernoem" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1538 +msgid "Fix through the Netfabb" +msgstr "Repareer met NetFabb" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1548 src/slic3r/GUI/Plater.cpp:3747 +msgid "Export as STL" +msgstr "Exporteer als STL-bestand" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1555 src/slic3r/GUI/Plater.cpp:3161 +#: src/slic3r/GUI/Plater.cpp:3715 src/slic3r/GUI/Plater.cpp:3744 +msgid "Reload from disk" +msgstr "Herlaad vanaf schijf" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1555 src/slic3r/GUI/Plater.cpp:3715 +msgid "Reload the selected volumes from disk" +msgstr "Herlaad de geselecteerde volumes vanaf schijf" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1561 src/slic3r/GUI/wxExtensions.cpp:3176 +#: src/slic3r/GUI/wxExtensions.cpp:3432 +msgid "Change extruder" +msgstr "Wijzig extruder" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1580 src/slic3r/GUI/wxExtensions.cpp:3170 +#: src/slic3r/GUI/wxExtensions.cpp:3421 src/libslic3r/PrintConfig.cpp:314 +msgid "Default" +msgstr "Standaard" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1586 +msgid "Select new extruder for the object/part" +msgstr "Selecteer nieuwe extruder voor het object/onderdeel" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1598 +msgid "Scale to print volume" +msgstr "Verschaal tot printvolume" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1598 +msgid "Scale the selected object to fit the print volume" +msgstr "Verschaal het geselecteerde object tot deze in het printvolume past" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1671 +msgid "Set as a Separated Objects" +msgstr "Stel in als aparte objecten" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1678 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1924 +msgid "Add Shape" +msgstr "Voeg vorm toe" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1752 +msgid "Load Part" +msgstr "Laad onderdeel" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1791 +msgid "Error!" +msgstr "Fout!" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1866 +msgid "Add Generic Subobject" +msgstr "Voeg algemene subobjecten toe" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1895 +msgid "Generic" +msgstr "Algemeen" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2013 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2115 +msgid "Last instance of an object cannot be deleted." +msgstr "Laatste instantie van een object kan niet verwijderd worden." + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2025 +msgid "Delete Settings" +msgstr "Verwijder instellingen" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2049 +msgid "Delete All Instances from Object" +msgstr "Verwijder alle instanties van het object" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2065 +msgid "Delete Height Range" +msgstr "Verwijder hoogtebereik" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2096 +msgid "From Object List You can't delete the last solid part from object." +msgstr "Het laatste onderdeel van de objectenlijst kan niet verwijderd worden." + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2100 +msgid "Delete Subobject" +msgstr "Verwijder subobject" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2119 +msgid "Delete Instance" +msgstr "Verwijder instantie" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2143 src/slic3r/GUI/Plater.cpp:2914 +msgid "" +"The selected object couldn't be split because it contains only one part." +msgstr "" +"Het geselecteerde object kan niet opgedeeld worden omdat het maar één " +"geometrie bevat." + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2147 +msgid "Split to Parts" +msgstr "Verdeel in onderdelen" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2195 +msgid "Add Layers" +msgstr "Voeg lagen toe" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2321 +msgid "Group manipulation" +msgstr "Groep bewerken" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2333 +msgid "Object manipulation" +msgstr "Object bewerken" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2346 +msgid "Object Settings to modify" +msgstr "Objectinstellingen om te bewerken" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2350 +msgid "Part Settings to modify" +msgstr "Onderdeelinstellingen om te bewerken" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2355 +msgid "Layer range Settings to modify" +msgstr "Laagbereikinstellingen om te bewerken" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2361 +msgid "Part manipulation" +msgstr "Onderdeel bewerken" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2367 +msgid "Instance manipulation" +msgstr "Instantie bewerken" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2374 +msgid "Height ranges" +msgstr "Hoogtebereik" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2374 +msgid "Settings for height range" +msgstr "Instellingen voor hoogtebereik" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2560 +msgid "Delete Selected Item" +msgstr "Verwijder geselecteerd item" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2697 +msgid "Delete Selected" +msgstr "Verwijder selectie" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2763 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2792 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2810 +msgid "Add Height Range" +msgstr "Voeg hoogtebereik toe" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2869 +msgid "Edit Height Range" +msgstr "Bewerk hoogtebereik" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3153 +msgid "Selection-Remove from list" +msgstr "Selectie - Verwijder van lijst" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3161 +msgid "Selection-Add from list" +msgstr "Selectie - Voeg toe aan lijst" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3279 +msgid "Object or Instance" +msgstr "Object of instantie" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3280 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3413 +msgid "Part" +msgstr "Onderdeel" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3280 +msgid "Layer" +msgstr "Laag" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3282 +msgid "Unsupported selection" +msgstr "Niet-ondersteunde selectie" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3283 +#, c-format +msgid "You started your selection with %s Item." +msgstr "De selectie is gestart met item %s." + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3284 +#, c-format +msgid "In this mode you can select only other %s Items%s" +msgstr "In deze modus kunt u alleen andere %s items %s selecteren" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3287 +msgid "of a current Object" +msgstr "van het huidige object" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3408 +msgid "You can't change a type of the last solid part of the object." +msgstr "" +"U kunt het type van het laatste onderdeel van een object niet wijzigen." + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3413 +msgid "Modifier" +msgstr "Modificator" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3413 +msgid "Support Enforcer" +msgstr "Supportforcering" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3413 +msgid "Support Blocker" +msgstr "Supportblokkering" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3415 +msgid "Select type of part" +msgstr "Selecteer onderdeeltype" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3420 +msgid "Change Part Type" +msgstr "Wijzig onderdeeltype" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3665 +msgid "Enter new name" +msgstr "Voer nieuwe naam in" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3665 +msgid "Renaming" +msgstr "Hernoemen" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3681 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3788 src/slic3r/GUI/Tab.cpp:3412 +#: src/slic3r/GUI/Tab.cpp:3416 +msgid "The supplied name is not valid;" +msgstr "De ingevoerde naam is niet geldig;" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3682 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3789 src/slic3r/GUI/Tab.cpp:3413 +msgid "the following characters are not allowed:" +msgstr "de volgende karakters zijn niet toegestaan:" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3812 +msgid "Set extruder for selected items" +msgstr "Stel extruder in voor de geselecteerde items" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3813 +msgid "Select extruder number for selected objects and/or parts" +msgstr "" +"Selecteer extrudernummer voor de geselecteerde objecten en/of onderdelen" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3826 +msgid "Select extruder number:" +msgstr "Selecteer extrudernummer:" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3827 +msgid "This extruder will be set for selected items" +msgstr "Deze extruder wordt ingesteld voor de geselecteerde items" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3852 +msgid "Change Extruders" +msgstr "Wijzig extruders" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3942 src/slic3r/GUI/Selection.cpp:1473 +msgid "Set Printable" +msgstr "Stel in op printbaar" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3942 src/slic3r/GUI/Selection.cpp:1473 +msgid "Set Unprintable" +msgstr "Stel in op niet-printbaar" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:62 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:105 +msgid "World coordinates" +msgstr "Wereldcoördinaten" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:63 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:106 +msgid "Local coordinates" +msgstr "Lokale coördinaten" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:82 +msgid "Select coordinate space, in which the transformation will be performed." +msgstr "" +"Stel een coördinatenstelsel in. Hierin wordt de verandering uitgevoerd." + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:155 src/libslic3r/GCode.cpp:634 +msgid "Object name" +msgstr "Objectnaam" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:215 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:457 +msgid "Position" +msgstr "Positie" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:216 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:458 +#: src/slic3r/GUI/Mouse3DController.cpp:274 +#: src/slic3r/GUI/Mouse3DController.cpp:287 +msgid "Rotation" +msgstr "Rotatie" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:263 +#, c-format +msgid "Toggle %c axis mirroring" +msgstr "Zet %c-asspiegeling aan" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:297 +msgid "Set Mirror" +msgstr "Stel spiegeling in" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:337 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:349 +msgid "Drop to bed" +msgstr "Plaats op het bed" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:363 +msgid "Reset rotation" +msgstr "Reset rotatie" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:385 +msgid "Reset Rotation" +msgstr "Reset rotatie" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:397 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:399 +msgid "Reset scale" +msgstr "Reset verschaling" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:459 +msgid "Scale factors" +msgstr "Verschalingsfactoren" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:516 +msgid "Translate" +msgstr "Verplaats" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:578 +msgid "" +"You cannot use non-uniform scaling mode for multiple objects/parts selection" +msgstr "" +"Niet-gelijke verschaling kan niet gebruikt worden voor meerdere objecten of " +"onderdelen" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:750 +msgid "Set Position" +msgstr "Stel positie in" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:781 +msgid "Set Orientation" +msgstr "Stel oriëntatie in" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:846 +msgid "Set Scale" +msgstr "Stel verschaling in" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:875 +msgid "" +"The currently manipulated object is tilted (rotation angles are not " +"multiples of 90°).\n" +"Non-uniform scaling of tilted objects is only possible in the World " +"coordinate system,\n" +"once the rotation is embedded into the object coordinates." +msgstr "" +"Het huidige aangepaste object is gekanteld (rotatiehoeken zijn geen " +"veelvouden van 90°).\n" +"Niet-gelijke verschaling van gekantelde objecten is alleen mogelijk in het " +"wereldcoördinatensysteem\n" +"als de rotatie is ingebouwd in de objectcoördinaten." + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:878 +msgid "" +"This operation is irreversible.\n" +"Do you want to proceed?" +msgstr "" +"Deze bewerking werkt onomkeerbaar.\n" +"Weet u zeker dat u wilt doorgaan?" + +#: src/slic3r/GUI/GUI_ObjectSettings.cpp:59 +msgid "Additional Settings" +msgstr "Extra instellingen" + +#: src/slic3r/GUI/GUI_ObjectSettings.cpp:95 +msgid "Remove parameter" +msgstr "Verwijder parameter" + +#: src/slic3r/GUI/GUI_ObjectSettings.cpp:101 +#, c-format +msgid "Delete Option %s" +msgstr "Verwijder optie %s" + +#: src/slic3r/GUI/GUI_ObjectSettings.cpp:152 +#, c-format +msgid "Change Option %s" +msgstr "Wijzig optie %s" + +#: src/slic3r/GUI/GUI_Preview.cpp:217 +msgid "View" +msgstr "Weergave" + +#: src/slic3r/GUI/GUI_Preview.cpp:220 src/slic3r/GUI/GUI_Preview.cpp:577 +#: src/libslic3r/GCode/PreviewData.cpp:360 +msgid "Feature type" +msgstr "Objecttype" + +#: src/slic3r/GUI/GUI_Preview.cpp:221 src/libslic3r/PrintConfig.cpp:489 +msgid "Height" +msgstr "Hoogte" + +#: src/slic3r/GUI/GUI_Preview.cpp:222 src/libslic3r/PrintConfig.cpp:2215 +msgid "Width" +msgstr "Breedte" + +#: src/slic3r/GUI/GUI_Preview.cpp:224 src/slic3r/GUI/Tab.cpp:1437 +msgid "Fan speed" +msgstr "Ventilatorsnelheid" + +#: src/slic3r/GUI/GUI_Preview.cpp:225 +msgid "Volumetric flow rate" +msgstr "Volumetrisch debiet" + +#: src/slic3r/GUI/GUI_Preview.cpp:226 src/slic3r/GUI/GUI_Preview.cpp:334 +#: src/slic3r/GUI/GUI_Preview.cpp:523 src/slic3r/GUI/GUI_Preview.cpp:576 +#: src/slic3r/GUI/GUI_Preview.cpp:772 src/libslic3r/GCode/PreviewData.cpp:372 +msgid "Tool" +msgstr "Tool" + +#: src/slic3r/GUI/GUI_Preview.cpp:227 src/slic3r/GUI/GUI_Preview.cpp:574 +#: src/libslic3r/GCode/PreviewData.cpp:374 +msgid "Color Print" +msgstr "Kleurenprint" + +#: src/slic3r/GUI/GUI_Preview.cpp:230 +msgid "Show" +msgstr "Toon" + +#: src/slic3r/GUI/GUI_Preview.cpp:233 src/slic3r/GUI/GUI_Preview.cpp:234 +msgid "Feature types" +msgstr "Featuretypes" + +#: src/slic3r/GUI/GUI_Preview.cpp:236 src/libslic3r/ExtrusionEntity.cpp:310 +msgid "Perimeter" +msgstr "Perimeter" + +#: src/slic3r/GUI/GUI_Preview.cpp:237 src/libslic3r/ExtrusionEntity.cpp:311 +msgid "External perimeter" +msgstr "Buitenste perimeter" + +#: src/slic3r/GUI/GUI_Preview.cpp:238 src/libslic3r/ExtrusionEntity.cpp:312 +msgid "Overhang perimeter" +msgstr "Overhangende perimeter" + +#: src/slic3r/GUI/GUI_Preview.cpp:239 src/libslic3r/ExtrusionEntity.cpp:313 +msgid "Internal infill" +msgstr "Inwendige vulling" + +#: src/slic3r/GUI/GUI_Preview.cpp:240 src/libslic3r/ExtrusionEntity.cpp:314 +#: src/libslic3r/PrintConfig.cpp:1752 src/libslic3r/PrintConfig.cpp:1763 +msgid "Solid infill" +msgstr "Dichte vulling" + +#: src/slic3r/GUI/GUI_Preview.cpp:241 src/libslic3r/ExtrusionEntity.cpp:315 +#: src/libslic3r/PrintConfig.cpp:2094 src/libslic3r/PrintConfig.cpp:2106 +msgid "Top solid infill" +msgstr "Bovenste dichte vulling" + +#: src/slic3r/GUI/GUI_Preview.cpp:242 src/libslic3r/ExtrusionEntity.cpp:316 +msgid "Bridge infill" +msgstr "Brugvulling" + +#: src/slic3r/GUI/GUI_Preview.cpp:243 src/libslic3r/ExtrusionEntity.cpp:317 +#: src/libslic3r/PrintConfig.cpp:907 +msgid "Gap fill" +msgstr "Gatenvulling" + +#: src/slic3r/GUI/GUI_Preview.cpp:244 src/slic3r/GUI/Tab.cpp:1091 +#: src/libslic3r/ExtrusionEntity.cpp:318 +msgid "Skirt" +msgstr "Skirt" + +#: src/slic3r/GUI/GUI_Preview.cpp:246 src/libslic3r/ExtrusionEntity.cpp:320 +#: src/libslic3r/PrintConfig.cpp:1980 +msgid "Support material interface" +msgstr "Supportinterface" + +#: src/slic3r/GUI/GUI_Preview.cpp:247 src/slic3r/GUI/Tab.cpp:1171 +#: src/libslic3r/ExtrusionEntity.cpp:321 +msgid "Wipe tower" +msgstr "Afveegblok" + +#: src/slic3r/GUI/GUI_Preview.cpp:252 src/libslic3r/PrintConfig.cpp:2129 +msgid "Travel" +msgstr "Beweging" + +#: src/slic3r/GUI/GUI_Preview.cpp:253 +msgid "Retractions" +msgstr "Retracties" + +#: src/slic3r/GUI/GUI_Preview.cpp:254 +msgid "Unretractions" +msgstr "Deretracties" + +#: src/slic3r/GUI/GUI_Preview.cpp:255 +msgid "Shells" +msgstr "Shells" + +#: src/slic3r/GUI/GUI_Preview.cpp:256 +msgid "Legend" +msgstr "Legenda" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:14 src/slic3r/GUI/MainFrame.cpp:684 +msgid "Keyboard Shortcuts" +msgstr "Sneltoetsen" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:107 +msgid "Open project STL/OBJ/AMF/3MF with config, delete bed" +msgstr "" +"Open STL-, OBJ-, AMF- of 3MF-bestanden (met configuratie) en verwijder " +"geladen bestanden" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:108 +msgid "Import STL/OBJ/AMF/3MF without config, keep bed" +msgstr "" +"Importeer STL-, OBJ-, AMF- of 3MF-bestanden (zonder configuratie) en behoud " +"geladen bestanden" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:109 +msgid "Load Config from .ini/amf/3mf/gcode" +msgstr "Laad INI-, AMF-, 3MF- of gcode-configuratiebestand" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:110 src/slic3r/GUI/Plater.cpp:858 +#: src/slic3r/GUI/Plater.cpp:5142 src/libslic3r/PrintConfig.cpp:3280 +msgid "Export G-code" +msgstr "Exporteer gcode-bestand" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:111 +msgid "Save project (3MF)" +msgstr "Sla 3MF-project op" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:112 +msgid "Load Config from .ini/amf/3mf/gcode and merge" +msgstr "Laad INI-, AMF-, 3MF- of gcode-configuratiebestand en verenig" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:113 +msgid "(Re)slice" +msgstr "(Her)slice" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:116 +msgid "Select Plater Tab" +msgstr "Selecteer modelweergave" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:118 +msgid "Select Print Settings Tab" +msgstr "Selecteer printinstellingentab" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:119 +msgid "Select Filament Settings Tab" +msgstr "Selecteer filamentinstellingentab" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:120 +msgid "Select Printer Settings Tab" +msgstr "Selecteer printerinstellingentab" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:121 +msgid "Switch to 3D" +msgstr "Schakel over naar 3D" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:122 +msgid "Switch to Preview" +msgstr "Schakel over naar voorbeeldweergave" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:123 src/slic3r/GUI/Preferences.cpp:10 +msgid "Preferences" +msgstr "Voorkeuren" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:124 +#: src/slic3r/GUI/PrintHostDialogs.cpp:136 +msgid "Print host upload queue" +msgstr "Printhost uploadwachtrij" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:125 +msgid "Camera view" +msgstr "Weergave" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:126 +msgid "Add Instance of the selected object" +msgstr "Voeg instantie van het geselecteerde object toe" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:127 +msgid "Remove Instance of the selected object" +msgstr "Verwijder instanties van het geselecteerde object" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:128 +msgid "Show keyboard shortcuts list" +msgstr "Toon lijst met sneltoetsen" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:129 +msgid "Press to select multiple object or move multiple object with mouse" +msgstr "" +"Druk in om meerdere objecten te selecteren en verplaats de objecten met de " +"muis" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:131 +msgid "Main Shortcuts" +msgstr "Belangrijkste sneltoetsen" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:139 +msgid "Select All objects" +msgstr "Selecteer alle objecten" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:140 +msgid "Delete selected" +msgstr "Verwijder selectie" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:141 +msgid "Delete All" +msgstr "Verwijder alles" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:142 +msgid "Copy to clipboard" +msgstr "Kopieer naar klembord" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:143 +msgid "Paste from clipboard" +msgstr "Plak van klembord" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:144 +msgid "Gizmo move" +msgstr "Verplaatsen" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:145 +msgid "Gizmo scale" +msgstr "Verschalen" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:146 +msgid "Gizmo rotate" +msgstr "Roteren" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:147 +msgid "Gizmo cut" +msgstr "Snijden" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:148 +msgid "Gizmo Place face on bed" +msgstr "Plaats vlak op bed" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:149 +msgid "Gizmo SLA support points" +msgstr "SLA-supportpunten" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:150 +#, no-c-format +msgid "" +"Press to activate selection rectangle\n" +"or to snap by 5% in Gizmo scale\n" +"or to snap by 1mm in Gizmo move" +msgstr "" +"Druk in om boxselectie te activeren\n" +"of te snappen op 5% in de verschaling\n" +"of te snappen op 1mm in de verplaatsing" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:151 +msgid "" +"Press to scale selection to fit print volume\n" +"in Gizmo scale" +msgstr "Druk in om de selectie te verschalen tot printvolume" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:152 +msgid "" +"Press to activate deselection rectangle\n" +"or to scale or rotate selected objects\n" +"around their own center" +msgstr "" +"Druk in om de deselectiebox te activeren\n" +"of de selectie te schalen of roteren\n" +"rond zijn middelpunt" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:153 +msgid "Press to activate one direction scaling in Gizmo scale" +msgstr "Druk in om verschaling toepassen in één richting te activeren" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:154 +msgid "Change camera type (perspective, orthographic)" +msgstr "Wijzig weergavetype (perspectief of orthografisch)" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:155 +msgid "Zoom to Bed" +msgstr "Zoom in op bed" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:156 +msgid "Zoom to all objects in scene, if none selected" +msgstr "Zoom in op alle niet-geselecteerde objecten" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:157 +msgid "Zoom to selected object" +msgstr "Zoom in op geselecteerde objecten" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:158 +msgid "Zoom in" +msgstr "Zoom in" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:159 +msgid "Zoom out" +msgstr "Zoom uit" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:160 +msgid "Show/Hide 3Dconnexion devices settings dialog" +msgstr "Toon/verberg 3Dconnexion-apparaten instellingen-dialoogvenster" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:161 +msgid "Unselect gizmo / Clear selection" +msgstr "Selectie ongedaan maken" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:167 +msgid "Plater Shortcuts" +msgstr "Sneltoetsen voor modelweergave" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:182 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:194 +msgid "Arrow Up" +msgstr "Pijltje naar boven" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:182 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:184 +msgid "Upper Layer" +msgstr "Bovenste laag" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:183 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:195 +msgid "Arrow Down" +msgstr "Pijltje naar beneden" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:183 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:185 +msgid "Lower Layer" +msgstr "Onderste laag" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:186 +msgid "Show/Hide (L)egend" +msgstr "Toon/verberg legenda" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:188 +msgid "Preview Shortcuts" +msgstr "Toon sneltoetsen" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:194 +msgid "Move current slider thumb Up" +msgstr "Verplaats huidige schuif naar boven" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:195 +msgid "Move current slider thumb Down" +msgstr "Verplaats huidige schuif naar beneden" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:196 +msgid "Arrow Left" +msgstr "Pijltje naar links" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:196 +msgid "Set upper thumb to current slider thumb" +msgstr "Stel de bovenste schuif in op het huidige punt" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:197 +msgid "Arrow Right" +msgstr "Pijltje naar rechts" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:197 +msgid "Set lower thumb to current slider thumb" +msgstr "Stel de onderste schuif in op het huidige punt" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:198 +msgid "Add color change marker for current layer" +msgstr "Voeg kleurwisseling toe voor de huidige laag" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:199 +msgid "Delete color change marker for current layer" +msgstr "Verwijder kleurwisseling voor de huidige laag" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:201 +msgid "Layers Slider Shortcuts" +msgstr "Sneltoetsen schuifregelaar" + +#: src/slic3r/GUI/MainFrame.cpp:65 +msgid "" +" - Remember to check for updates at http://github.com/prusa3d/PrusaSlicer/" +"releases" +msgstr "" +" - Vergeet niet op updates te checken op http://github.com/prusa3d/" +"PrusaSlicer/releases" + +#: src/slic3r/GUI/MainFrame.cpp:160 +msgid "based on Slic3r" +msgstr "gebaseerd op Slic3r" + +#: src/slic3r/GUI/MainFrame.cpp:190 +msgid "Plater" +msgstr "Modelweergave" + +#: src/slic3r/GUI/MainFrame.cpp:401 +msgid "&New Project" +msgstr "Nieuw project" + +#: src/slic3r/GUI/MainFrame.cpp:401 +msgid "Start a new project" +msgstr "Start nieuw project" + +#: src/slic3r/GUI/MainFrame.cpp:404 +msgid "&Open Project" +msgstr "Open project" + +#: src/slic3r/GUI/MainFrame.cpp:404 +msgid "Open a project file" +msgstr "Open een projectbestand" + +#: src/slic3r/GUI/MainFrame.cpp:409 +msgid "Recent projects" +msgstr "Huidige projecten" + +#: src/slic3r/GUI/MainFrame.cpp:418 +msgid "The selected project is no more available" +msgstr "Het geselecteerde project is niet meer beschikbaar" + +#: src/slic3r/GUI/MainFrame.cpp:418 src/slic3r/GUI/MainFrame.cpp:761 +#: src/slic3r/GUI/PrintHostDialogs.cpp:231 +msgid "Error" +msgstr "Fout" + +#: src/slic3r/GUI/MainFrame.cpp:442 +msgid "&Save Project" +msgstr "Project opslaan" + +#: src/slic3r/GUI/MainFrame.cpp:442 +msgid "Save current project file" +msgstr "Projectbestand opslaan" + +#: src/slic3r/GUI/MainFrame.cpp:446 src/slic3r/GUI/MainFrame.cpp:448 +msgid "Save Project &as" +msgstr "Project opslaan als" + +#: src/slic3r/GUI/MainFrame.cpp:446 src/slic3r/GUI/MainFrame.cpp:448 +msgid "Save current project file as" +msgstr "Projectbestand opslaan als" + +#: src/slic3r/GUI/MainFrame.cpp:456 +msgid "Import STL/OBJ/AM&F/3MF" +msgstr "Importeer STL-, OBJ-, AMF- of 3MF-bestanden" + +#: src/slic3r/GUI/MainFrame.cpp:456 +msgid "Load a model" +msgstr "Laad een model" + +#: src/slic3r/GUI/MainFrame.cpp:460 +msgid "Import &Config" +msgstr "Importeer configuratie" + +#: src/slic3r/GUI/MainFrame.cpp:460 +msgid "Load exported configuration file" +msgstr "Laad geëxporteerd configuratiebestand" + +#: src/slic3r/GUI/MainFrame.cpp:462 +msgid "Import Config from &project" +msgstr "Importeer configuratie van project" + +#: src/slic3r/GUI/MainFrame.cpp:462 +msgid "Load configuration from project file" +msgstr "Laad configuratie van projectbestand" + +#: src/slic3r/GUI/MainFrame.cpp:465 +msgid "Import Config &Bundle" +msgstr "Importeer configuratiebundel" + +#: src/slic3r/GUI/MainFrame.cpp:465 +msgid "Load presets from a bundle" +msgstr "Laad presets van een bundel" + +#: src/slic3r/GUI/MainFrame.cpp:467 +msgid "&Import" +msgstr "Importeer" + +#: src/slic3r/GUI/MainFrame.cpp:470 src/slic3r/GUI/MainFrame.cpp:725 +msgid "Export &G-code" +msgstr "Exporteer G-code" + +#: src/slic3r/GUI/MainFrame.cpp:470 +msgid "Export current plate as G-code" +msgstr "Exporteer huidige modellen als gcode-bestand" + +#: src/slic3r/GUI/MainFrame.cpp:474 src/slic3r/GUI/MainFrame.cpp:726 +msgid "S&end G-code" +msgstr "Stuur G-code" + +#: src/slic3r/GUI/MainFrame.cpp:474 +msgid "Send to print current plate as G-code" +msgstr "Stuur huidige weergave als G-code" + +#: src/slic3r/GUI/MainFrame.cpp:479 +msgid "Export plate as &STL" +msgstr "Exporteer huidige modellen als STL-bestand" + +#: src/slic3r/GUI/MainFrame.cpp:479 +msgid "Export current plate as STL" +msgstr "Exporteer huidige modellen als STL-bestand" + +#: src/slic3r/GUI/MainFrame.cpp:482 +msgid "Export plate as STL &including supports" +msgstr "Exporteer modellen met support als STL-bestand" + +#: src/slic3r/GUI/MainFrame.cpp:482 +msgid "Export current plate as STL including supports" +msgstr "Exporteer huidige modellen met support als STL-bestand" + +#: src/slic3r/GUI/MainFrame.cpp:485 +msgid "Export plate as &AMF" +msgstr "Exporteer huidige modellen als AMF-bestand" + +#: src/slic3r/GUI/MainFrame.cpp:485 +msgid "Export current plate as AMF" +msgstr "Exporteer huidige modellen als AMF-bestand" + +#: src/slic3r/GUI/MainFrame.cpp:489 +msgid "Export &toolpaths as OBJ" +msgstr "Exporteer paden als OBJ-bestand" + +#: src/slic3r/GUI/MainFrame.cpp:489 +msgid "Export toolpaths as OBJ" +msgstr "Exporteer paden als OBJ-bestand" + +#: src/slic3r/GUI/MainFrame.cpp:493 +msgid "Export &Config" +msgstr "Exporteer configuratie" + +#: src/slic3r/GUI/MainFrame.cpp:493 +msgid "Export current configuration to file" +msgstr "Exporteer huidige configuratie naar bestand" + +#: src/slic3r/GUI/MainFrame.cpp:495 +msgid "Export Config &Bundle" +msgstr "Exporteer configuratiebundel" + +#: src/slic3r/GUI/MainFrame.cpp:495 +msgid "Export all presets to file" +msgstr "Exporteer alle presets naar bestand" + +#: src/slic3r/GUI/MainFrame.cpp:497 +msgid "&Export" +msgstr "Exporteer" + +#: src/slic3r/GUI/MainFrame.cpp:503 +msgid "Quick Slice" +msgstr "Snel slicen" + +#: src/slic3r/GUI/MainFrame.cpp:503 +msgid "Slice a file into a G-code" +msgstr "Slice naar een gcode-bestand" + +#: src/slic3r/GUI/MainFrame.cpp:509 +msgid "Quick Slice and Save As" +msgstr "Snel slicen en opslaan als" + +#: src/slic3r/GUI/MainFrame.cpp:509 +msgid "Slice a file into a G-code, save as" +msgstr "Slice naar gcode-bestand, opslaan als" + +#: src/slic3r/GUI/MainFrame.cpp:515 +msgid "Repeat Last Quick Slice" +msgstr "Herhaal laatste snelle slice" + +#: src/slic3r/GUI/MainFrame.cpp:515 +msgid "Repeat last quick slice" +msgstr "Herhaal laatste snelle slice" + +#: src/slic3r/GUI/MainFrame.cpp:523 +msgid "(Re)Slice No&w" +msgstr "(Her)slice nu" + +#: src/slic3r/GUI/MainFrame.cpp:523 +msgid "Start new slicing process" +msgstr "Start nieuw sliceproces" + +#: src/slic3r/GUI/MainFrame.cpp:527 +msgid "&Repair STL file" +msgstr "Repareer STL-bestand" + +#: src/slic3r/GUI/MainFrame.cpp:527 +msgid "Automatically repair an STL file" +msgstr "Automatisch een STL-bestand repareren" + +#: src/slic3r/GUI/MainFrame.cpp:530 +msgid "&Quit" +msgstr "Afsluiten" + +#: src/slic3r/GUI/MainFrame.cpp:530 +#, c-format +msgid "Quit %s" +msgstr "%s afsluiten" + +#: src/slic3r/GUI/MainFrame.cpp:555 +msgid "&Select all" +msgstr "Selecteer alle" + +#: src/slic3r/GUI/MainFrame.cpp:556 +msgid "Selects all objects" +msgstr "Selecteer alle objecten" + +#: src/slic3r/GUI/MainFrame.cpp:558 +msgid "D&eselect all" +msgstr "Deselecteer alles" + +#: src/slic3r/GUI/MainFrame.cpp:559 +msgid "Deselects all objects" +msgstr "Deselecteer alle objecten" + +#: src/slic3r/GUI/MainFrame.cpp:562 +msgid "&Delete selected" +msgstr "Verwijder selectie" + +#: src/slic3r/GUI/MainFrame.cpp:563 +msgid "Deletes the current selection" +msgstr "Verwijdert huidige selectie" + +#: src/slic3r/GUI/MainFrame.cpp:565 +msgid "Delete &all" +msgstr "Verwijder alles" + +#: src/slic3r/GUI/MainFrame.cpp:566 +msgid "Deletes all objects" +msgstr "Verwijdert alle objecten" + +#: src/slic3r/GUI/MainFrame.cpp:570 +msgid "&Undo" +msgstr "Maak ongedaan" + +#: src/slic3r/GUI/MainFrame.cpp:573 +msgid "&Redo" +msgstr "Doe opnieuw" + +#: src/slic3r/GUI/MainFrame.cpp:578 +msgid "&Copy" +msgstr "Kopieer" + +#: src/slic3r/GUI/MainFrame.cpp:579 +msgid "Copy selection to clipboard" +msgstr "Kopieer selectie naar klembord" + +#: src/slic3r/GUI/MainFrame.cpp:581 +msgid "&Paste" +msgstr "Plak" + +#: src/slic3r/GUI/MainFrame.cpp:582 +msgid "Paste clipboard" +msgstr "Plak van klembord" + +#: src/slic3r/GUI/MainFrame.cpp:591 +msgid "&Plater Tab" +msgstr "Modelweergavetab" + +#: src/slic3r/GUI/MainFrame.cpp:591 +msgid "Show the plater" +msgstr "Toon de modelweergave" + +#: src/slic3r/GUI/MainFrame.cpp:598 +msgid "P&rint Settings Tab" +msgstr "Printinstellingentab" + +#: src/slic3r/GUI/MainFrame.cpp:598 +msgid "Show the print settings" +msgstr "Toon de printinstellingen" + +#: src/slic3r/GUI/MainFrame.cpp:600 src/slic3r/GUI/MainFrame.cpp:728 +msgid "&Filament Settings Tab" +msgstr "Filamentinstellingentab" + +#: src/slic3r/GUI/MainFrame.cpp:600 +msgid "Show the filament settings" +msgstr "Toon de filamentinstellingentab" + +#: src/slic3r/GUI/MainFrame.cpp:603 +msgid "Print&er Settings Tab" +msgstr "Printerinstellingentab" + +#: src/slic3r/GUI/MainFrame.cpp:603 +msgid "Show the printer settings" +msgstr "Toon de printerinstellingen" + +#: src/slic3r/GUI/MainFrame.cpp:607 +msgid "3&D" +msgstr "3D" + +#: src/slic3r/GUI/MainFrame.cpp:607 +msgid "Show the 3D editing view" +msgstr "Toon de 3D-bewerkingsweergave" + +#: src/slic3r/GUI/MainFrame.cpp:610 +msgid "Pre&view" +msgstr "Voorbeeld" + +#: src/slic3r/GUI/MainFrame.cpp:610 +msgid "Show the 3D slices preview" +msgstr "Toon de 3D-weergave van de slice" + +#: src/slic3r/GUI/MainFrame.cpp:629 +msgid "Print &Host Upload Queue" +msgstr "Printhost uploadwachtrij" + +#: src/slic3r/GUI/MainFrame.cpp:629 +msgid "Display the Print Host Upload Queue window" +msgstr "Toon het venster van de printhost uploadwachtrij" + +#: src/slic3r/GUI/MainFrame.cpp:638 +msgid "Iso" +msgstr "Isometrisch" + +#: src/slic3r/GUI/MainFrame.cpp:638 +msgid "Iso View" +msgstr "Isometrisch aanzicht" + +#. TRN To be shown in the main menu View->Top +#. TRN To be shown in Print Settings "Top solid layers" +#: src/slic3r/GUI/MainFrame.cpp:642 src/libslic3r/PrintConfig.cpp:2121 +msgid "Top" +msgstr "Bovenkant" + +#: src/slic3r/GUI/MainFrame.cpp:642 +msgid "Top View" +msgstr "Bovenaanzicht" + +#. TRN To be shown in the main menu View->Bottom +#. TRN To be shown in Print Settings "Bottom solid layers" +#: src/slic3r/GUI/MainFrame.cpp:645 src/libslic3r/PrintConfig.cpp:164 +msgid "Bottom" +msgstr "Onderkant" + +#: src/slic3r/GUI/MainFrame.cpp:645 +msgid "Bottom View" +msgstr "Onderaanzicht" + +#: src/slic3r/GUI/MainFrame.cpp:647 +msgid "Front" +msgstr "Voorkant" + +#: src/slic3r/GUI/MainFrame.cpp:647 +msgid "Front View" +msgstr "Vooraanzicht" + +#: src/slic3r/GUI/MainFrame.cpp:649 src/libslic3r/PrintConfig.cpp:1627 +msgid "Rear" +msgstr "Achterkant" + +#: src/slic3r/GUI/MainFrame.cpp:649 +msgid "Rear View" +msgstr "Achteraanzicht" + +#: src/slic3r/GUI/MainFrame.cpp:651 +msgid "Left" +msgstr "Links" + +#: src/slic3r/GUI/MainFrame.cpp:651 +msgid "Left View" +msgstr "Linkerzijaanzicht" + +#: src/slic3r/GUI/MainFrame.cpp:653 +msgid "Right" +msgstr "Rechts" + +#: src/slic3r/GUI/MainFrame.cpp:653 +msgid "Right View" +msgstr "Rechterzijaanzicht" + +#: src/slic3r/GUI/MainFrame.cpp:660 +msgid "Prusa 3D &Drivers" +msgstr "Prusa 3D stuurprogramma" + +#: src/slic3r/GUI/MainFrame.cpp:660 +msgid "Open the Prusa3D drivers download page in your browser" +msgstr "Open de Prusa3D drivers-downloadpagina in uw browser" + +#: src/slic3r/GUI/MainFrame.cpp:662 +msgid "Software &Releases" +msgstr "Software-uitgaven" + +#: src/slic3r/GUI/MainFrame.cpp:662 +msgid "Open the software releases page in your browser" +msgstr "Open de software-uitgaven pagina in uw browser" + +#: src/slic3r/GUI/MainFrame.cpp:668 +#, c-format +msgid "%s &Website" +msgstr "%s-website" + +#: src/slic3r/GUI/MainFrame.cpp:669 +#, c-format +msgid "Open the %s website in your browser" +msgstr "Open de %s website in uw browser" + +#: src/slic3r/GUI/MainFrame.cpp:675 +msgid "System &Info" +msgstr "Systeeminfo" + +#: src/slic3r/GUI/MainFrame.cpp:675 +msgid "Show system information" +msgstr "Toon systeeminformatie" + +#: src/slic3r/GUI/MainFrame.cpp:677 +msgid "Show &Configuration Folder" +msgstr "Toon configuratiemap" + +#: src/slic3r/GUI/MainFrame.cpp:677 +msgid "Show user configuration folder (datadir)" +msgstr "Toon gebruikersconfiguratiemap (datadir)" + +#: src/slic3r/GUI/MainFrame.cpp:679 +msgid "Report an I&ssue" +msgstr "Rapporteer een fout" + +#: src/slic3r/GUI/MainFrame.cpp:679 +#, c-format +msgid "Report an issue on %s" +msgstr "Rapporteer een fout op %s" + +#: src/slic3r/GUI/MainFrame.cpp:681 +#, c-format +msgid "&About %s" +msgstr "Over %s" + +#: src/slic3r/GUI/MainFrame.cpp:681 +msgid "Show about dialog" +msgstr "Toon Over-dialoogvenster" + +#: src/slic3r/GUI/MainFrame.cpp:684 +msgid "Show the list of the keyboard shortcuts" +msgstr "Toon de lijst met sneltoetsen" + +#: src/slic3r/GUI/MainFrame.cpp:697 +msgid "&File" +msgstr "Bestand" + +#: src/slic3r/GUI/MainFrame.cpp:698 +msgid "&Edit" +msgstr "Bewerk" + +#: src/slic3r/GUI/MainFrame.cpp:699 +msgid "&Window" +msgstr "Venster" + +#: src/slic3r/GUI/MainFrame.cpp:700 +msgid "&View" +msgstr "Weergave" + +#: src/slic3r/GUI/MainFrame.cpp:703 +msgid "&Help" +msgstr "Help" + +#: src/slic3r/GUI/MainFrame.cpp:725 +msgid "E&xport" +msgstr "Exporteer" + +#: src/slic3r/GUI/MainFrame.cpp:726 +msgid "S&end to print" +msgstr "Stuur om te printen" + +#: src/slic3r/GUI/MainFrame.cpp:728 +msgid "Mate&rial Settings Tab" +msgstr "Materiaalinstellingentab" + +#: src/slic3r/GUI/MainFrame.cpp:749 +msgid "Choose a file to slice (STL/OBJ/AMF/3MF/PRUSA):" +msgstr "Kies een STL-, OBJ-, AMF-, 3MF- of PRUSA-bestand om te slicen:" + +#: src/slic3r/GUI/MainFrame.cpp:760 +msgid "No previously sliced file." +msgstr "Niet eerder gesliced bestand." + +#: src/slic3r/GUI/MainFrame.cpp:766 +msgid "Previously sliced file (" +msgstr "Eerder gesliced bestand (" + +#: src/slic3r/GUI/MainFrame.cpp:766 +msgid ") not found." +msgstr ") niet gevonden." + +#: src/slic3r/GUI/MainFrame.cpp:767 +msgid "File Not Found" +msgstr "Bestand niet gevonden" + +#: src/slic3r/GUI/MainFrame.cpp:802 +#, c-format +msgid "Save %s file as:" +msgstr "%s-bestand opslaan als:" + +#: src/slic3r/GUI/MainFrame.cpp:802 +msgid "SVG" +msgstr "SVG" + +#: src/slic3r/GUI/MainFrame.cpp:802 +msgid "G-code" +msgstr "G-code" + +#: src/slic3r/GUI/MainFrame.cpp:814 +msgid "Save zip file as:" +msgstr "ZIP-bestand opslaan als:" + +#: src/slic3r/GUI/MainFrame.cpp:823 src/slic3r/GUI/Plater.cpp:3058 +#: src/slic3r/GUI/Plater.cpp:4781 src/slic3r/GUI/Tab.cpp:1201 +#: src/slic3r/GUI/Tab.cpp:3615 +msgid "Slicing" +msgstr "Slicen" + +#. TRN "Processing input_file_basename" +#: src/slic3r/GUI/MainFrame.cpp:825 +#, c-format +msgid "Processing %s" +msgstr "%s verwerken" + +#: src/slic3r/GUI/MainFrame.cpp:848 +msgid " was successfully sliced." +msgstr " succesvol gesliced." + +#: src/slic3r/GUI/MainFrame.cpp:850 +msgid "Slicing Done!" +msgstr "Slicen klaar!" + +#: src/slic3r/GUI/MainFrame.cpp:865 +msgid "Select the STL file to repair:" +msgstr "Selecteer het STL-bestand om te repareren:" + +#: src/slic3r/GUI/MainFrame.cpp:875 +msgid "Save OBJ file (less prone to coordinate errors than STL) as:" +msgstr "OBJ-bestand opslaan als:" + +#: src/slic3r/GUI/MainFrame.cpp:887 +msgid "Your file was repaired." +msgstr "Het bestand is gerepareerd." + +#: src/slic3r/GUI/MainFrame.cpp:887 src/libslic3r/PrintConfig.cpp:3374 +msgid "Repair" +msgstr "Repareer" + +#: src/slic3r/GUI/MainFrame.cpp:901 +msgid "Save configuration as:" +msgstr "Configuratie opslaan als:" + +#: src/slic3r/GUI/MainFrame.cpp:920 src/slic3r/GUI/MainFrame.cpp:982 +msgid "Select configuration to load:" +msgstr "Selecteer configuratie om te laden:" + +#: src/slic3r/GUI/MainFrame.cpp:956 +msgid "Save presets bundle as:" +msgstr "Presetbundel opslaan als:" + +#: src/slic3r/GUI/MainFrame.cpp:1003 +#, c-format +msgid "%d presets successfully imported." +msgstr "%d presets succesvol geïmporteerd." + +#: src/slic3r/GUI/Mouse3DController.cpp:255 +msgid "3Dconnexion settings" +msgstr "3Dconnexion-instellingen" + +#: src/slic3r/GUI/Mouse3DController.cpp:259 +msgid "Device:" +msgstr "Apparaat:" + +#: src/slic3r/GUI/Mouse3DController.cpp:266 +msgid "Speed:" +msgstr "Snelheid:" + +#: src/slic3r/GUI/Mouse3DController.cpp:270 +#: src/slic3r/GUI/Mouse3DController.cpp:283 +msgid "Translation" +msgstr "Verplaatsing" + +#: src/slic3r/GUI/Mouse3DController.cpp:279 +msgid "Deadzone:" +msgstr "Deadzone:" + +#: src/slic3r/GUI/MsgDialog.cpp:73 +#, c-format +msgid "%s error" +msgstr "%s fout" + +#: src/slic3r/GUI/MsgDialog.cpp:74 +#, c-format +msgid "%s has encountered an error" +msgstr "%s heeft een fout veroorzaakt" + +#: src/slic3r/GUI/OptionsGroup.cpp:249 +msgctxt "Layers" +msgid "Top" +msgstr "Boven" + +#: src/slic3r/GUI/OptionsGroup.cpp:249 +msgctxt "Layers" +msgid "Bottom" +msgstr "Bodem" + +#: src/slic3r/GUI/Plater.cpp:155 +msgid "Volume" +msgstr "Volume" + +#: src/slic3r/GUI/Plater.cpp:156 +msgid "Facets" +msgstr "Vlakken" + +#: src/slic3r/GUI/Plater.cpp:157 +msgid "Materials" +msgstr "Materialen" + +#: src/slic3r/GUI/Plater.cpp:160 +msgid "Manifold" +msgstr "Gesloten model" + +#: src/slic3r/GUI/Plater.cpp:210 +msgid "Sliced Info" +msgstr "Slice info" + +#: src/slic3r/GUI/Plater.cpp:229 src/slic3r/GUI/Plater.cpp:1179 +msgid "Used Filament (m)" +msgstr "Filamentverbruik (m)" + +#: src/slic3r/GUI/Plater.cpp:230 +msgid "Used Filament (mm³)" +msgstr "Filamentverbruik (mm³)" + +#: src/slic3r/GUI/Plater.cpp:231 +msgid "Used Filament (g)" +msgstr "Filamentverbruik (g)" + +#: src/slic3r/GUI/Plater.cpp:232 +msgid "Used Material (unit)" +msgstr "Materiaalverbruik (eenheid)" + +#: src/slic3r/GUI/Plater.cpp:233 +msgid "Cost (money)" +msgstr "Kosten (€)" + +#: src/slic3r/GUI/Plater.cpp:234 src/slic3r/GUI/Plater.cpp:1166 +#: src/slic3r/GUI/Plater.cpp:1208 +msgid "Estimated printing time" +msgstr "Geschatte printtijd" + +#: src/slic3r/GUI/Plater.cpp:235 +msgid "Number of tool changes" +msgstr "Aantal toolwisselingen" + +#: src/slic3r/GUI/Plater.cpp:332 +msgid "Click to edit preset" +msgstr "Klik om de preset te wijzigen" + +#: src/slic3r/GUI/Plater.cpp:487 +msgid "Select what kind of support do you need" +msgstr "Selecteer welk type support nodig is" + +#: src/slic3r/GUI/Plater.cpp:489 src/libslic3r/PrintConfig.cpp:1890 +#: src/libslic3r/PrintConfig.cpp:2642 +msgid "Support on build plate only" +msgstr "Support alleen op het bed" + +#: src/slic3r/GUI/Plater.cpp:490 src/slic3r/GUI/Plater.cpp:613 +msgid "For support enforcers only" +msgstr "Alleen voor supportforceringen" + +#: src/slic3r/GUI/Plater.cpp:491 +msgid "Everywhere" +msgstr "Overal" + +#: src/slic3r/GUI/Plater.cpp:523 src/slic3r/GUI/Tab.cpp:1097 +msgid "Brim" +msgstr "Brim" + +#: src/slic3r/GUI/Plater.cpp:525 +msgid "" +"This flag enables the brim that will be printed around each object on the " +"first layer." +msgstr "Door dit aan te vinken zal een brim rond elke object geprint worden." + +#: src/slic3r/GUI/Plater.cpp:533 +msgid "Purging volumes" +msgstr "Afveegvolume" + +#: src/slic3r/GUI/Plater.cpp:627 +msgid "Select what kind of pad do you need" +msgstr "Selecteer welk soort basisplaat nodig is" + +#: src/slic3r/GUI/Plater.cpp:629 +msgid "Below object" +msgstr "Onder het object" + +#: src/slic3r/GUI/Plater.cpp:630 +msgid "Around object" +msgstr "Rondom het object" + +#: src/slic3r/GUI/Plater.cpp:802 +msgid "Print settings" +msgstr "Printinstellingen" + +#: src/slic3r/GUI/Plater.cpp:803 src/slic3r/GUI/Tab.cpp:1405 +#: src/slic3r/GUI/Tab.cpp:1406 +msgid "Filament" +msgstr "Filament" + +#: src/slic3r/GUI/Plater.cpp:804 +msgid "SLA print settings" +msgstr "SLA-printinstellingen" + +#: src/slic3r/GUI/Plater.cpp:805 src/slic3r/GUI/Preset.cpp:1411 +msgid "SLA material" +msgstr "SLA-materiaal" + +#: src/slic3r/GUI/Plater.cpp:806 +msgid "Printer" +msgstr "Printer" + +#: src/slic3r/GUI/Plater.cpp:856 src/slic3r/GUI/Plater.cpp:5143 +msgid "Send to printer" +msgstr "Stuur naar printer" + +#: src/slic3r/GUI/Plater.cpp:859 src/slic3r/GUI/Plater.cpp:3058 +#: src/slic3r/GUI/Plater.cpp:4784 +msgid "Slice now" +msgstr "Slice nu" + +#: src/slic3r/GUI/Plater.cpp:999 +msgid "Hold Shift to Slice & Export G-code" +msgstr "Houdt shift ingedrukt om te slicen en de G-code te exporteren" + +#: src/slic3r/GUI/Plater.cpp:1102 +#, c-format +msgid "%d (%d shells)" +msgstr "%d (%d shells)" + +#: src/slic3r/GUI/Plater.cpp:1107 +#, c-format +msgid "Auto-repaired (%d errors)" +msgstr "Automatisch gerepareerd (%d fouten)" + +#: src/slic3r/GUI/Plater.cpp:1110 +#, c-format +msgid "" +"%d degenerate facets, %d edges fixed, %d facets removed, %d facets added, %d " +"facets reversed, %d backwards edges" +msgstr "" +"%d degenereer vlakken, %d randen vastgezet, %d vlakken verwijderd, %d " +"vlakken toegevoegd, %d vlakken omgekeerd, %d randen omgekeerd" + +#: src/slic3r/GUI/Plater.cpp:1120 +msgid "Yes" +msgstr "Ja" + +#: src/slic3r/GUI/Plater.cpp:1141 +msgid "Used Material (ml)" +msgstr "Materiaalgebruik (ml)" + +#: src/slic3r/GUI/Plater.cpp:1144 +msgid "object(s)" +msgstr "object(en)" + +#: src/slic3r/GUI/Plater.cpp:1144 +msgid "supports and pad" +msgstr "support en basisplaat" + +#: src/slic3r/GUI/Plater.cpp:1181 src/slic3r/GUI/Plater.cpp:1196 +msgid "objects" +msgstr "objecten" + +#: src/slic3r/GUI/Plater.cpp:1181 src/slic3r/GUI/Plater.cpp:1196 +msgid "wipe tower" +msgstr "afveegblok" + +#: src/slic3r/GUI/Plater.cpp:1194 src/libslic3r/PrintConfig.cpp:749 +#: src/libslic3r/PrintConfig.cpp:2478 src/libslic3r/PrintConfig.cpp:2479 +msgid "Cost" +msgstr "Kosten" + +#: src/slic3r/GUI/Plater.cpp:1211 +msgid "normal mode" +msgstr "normale modus" + +#: src/slic3r/GUI/Plater.cpp:1215 src/slic3r/GUI/Plater.cpp:1224 +#: src/libslic3r/PrintConfig.cpp:572 +msgid "Color" +msgstr "Kleur" + +#: src/slic3r/GUI/Plater.cpp:1220 +msgid "stealth mode" +msgstr "stille modus" + +#: src/slic3r/GUI/Plater.cpp:1324 +msgid "Load File" +msgstr "Laad bestand" + +#: src/slic3r/GUI/Plater.cpp:1328 +msgid "Load Files" +msgstr "Laad bestanden" + +#: src/slic3r/GUI/Plater.cpp:1561 +msgid "ERROR: not enough resources to execute a new job." +msgstr "Fout: niet genoeg middelen om nieuwe job te starten." + +#: src/slic3r/GUI/Plater.cpp:2158 +msgid "New Project" +msgstr "Nieuw project" + +#: src/slic3r/GUI/Plater.cpp:2277 +msgid "Loading" +msgstr "Aan het laden" + +#: src/slic3r/GUI/Plater.cpp:2287 +#, c-format +msgid "Processing input file %s" +msgstr "Verwerken van inputbestand %s" + +#: src/slic3r/GUI/Plater.cpp:2315 +msgid "" +"You can't load SLA project if there is at least one multi-part object on the " +"bed" +msgstr "" +"U kan geen SLA-project laden als er tenminste één meerdelig object op het " +"bed is" + +#: src/slic3r/GUI/Plater.cpp:2316 src/slic3r/GUI/Tab.cpp:2915 +msgid "Please check your object list before preset changing." +msgstr "Controleer de objectenlijst voor het wijzigen van de preset." + +#: src/slic3r/GUI/Plater.cpp:2361 +msgid "" +"This file contains several objects positioned at multiple heights.\n" +"Instead of considering them as multiple objects, should I consider\n" +"this file as a single object having multiple parts?" +msgstr "" +"Dit bestand bevat meerdere objecten die op meerdere hoogten zijn " +"gepositioneerd.\n" +"Moet dit bestand beschouwd worden als een enkel object met meerdere " +"onderdelen\n" +"in plaats van als meerdere objecten?" + +#: src/slic3r/GUI/Plater.cpp:2364 src/slic3r/GUI/Plater.cpp:2417 +msgid "Multi-part object detected" +msgstr "Meerdelig object gedetecteerd" + +#: src/slic3r/GUI/Plater.cpp:2371 +msgid "" +"This file cannot be loaded in a simple mode. Do you want to switch to an " +"advanced mode?" +msgstr "" +"Dit bestand kan niet geladen worden in eenvoudige modus. Wilt u overstappen " +"op geavanceerde modus?" + +#: src/slic3r/GUI/Plater.cpp:2372 +msgid "Detected advanced data" +msgstr "Geavanceerde data gedetecteerd" + +#: src/slic3r/GUI/Plater.cpp:2394 +#, c-format +msgid "" +"You can't to add the object(s) from %s because of one or some of them " +"is(are) multi-part" +msgstr "" +"U kan geen objecten toevoegen van %s, omdat sommige daarvan meerdelig kunnen " +"zijn" + +#: src/slic3r/GUI/Plater.cpp:2414 +msgid "" +"Multiple objects were loaded for a multi-material printer.\n" +"Instead of considering them as multiple objects, should I consider\n" +"these files to represent a single object having multiple parts?" +msgstr "" +"Meerdere objecten zijn geladen voor een multi-materialprinter.\n" +"Moeten deze objecten beschouwd worden als één object\n" +"met meerdere onderdelen, of als meerdere objecten?" + +#: src/slic3r/GUI/Plater.cpp:2430 +msgid "Loaded" +msgstr "Geladen" + +#: src/slic3r/GUI/Plater.cpp:2532 +msgid "" +"Your object appears to be too large, so it was automatically scaled down to " +"fit your print bed." +msgstr "" +"Het object is te groot. Daarom is het automatisch verschaald tot de grootte " +"van het printbed." + +#: src/slic3r/GUI/Plater.cpp:2533 +msgid "Object too large?" +msgstr "Object te groot?" + +#: src/slic3r/GUI/Plater.cpp:2595 +msgid "Export STL file:" +msgstr "Exporteer STL-bestand:" + +#: src/slic3r/GUI/Plater.cpp:2602 +msgid "Export AMF file:" +msgstr "Exporteer AMF-bestand:" + +#: src/slic3r/GUI/Plater.cpp:2608 +msgid "Save file as:" +msgstr "Bestand opslaan als:" + +#: src/slic3r/GUI/Plater.cpp:2614 +msgid "Export OBJ file:" +msgstr "Exporteer OBJ-bestand:" + +#: src/slic3r/GUI/Plater.cpp:2716 +msgid "Delete Object" +msgstr "Verwijder object" + +#: src/slic3r/GUI/Plater.cpp:2727 +msgid "Reset Project" +msgstr "Reset project" + +#: src/slic3r/GUI/Plater.cpp:2765 +msgid "Optimize Rotation" +msgstr "Optimaliseer rotatie" + +#: src/slic3r/GUI/Plater.cpp:2811 +msgid "Arranging" +msgstr "Schikken" + +#: src/slic3r/GUI/Plater.cpp:2833 +msgid "Could not arrange model objects! Some geometries may be invalid." +msgstr "Kan modellen niet schikken. Sommige vormen kunnen ongeldig zijn." + +#: src/slic3r/GUI/Plater.cpp:2839 +msgid "Arranging canceled." +msgstr "Schikken geannuleerd." + +#: src/slic3r/GUI/Plater.cpp:2840 +msgid "Arranging done." +msgstr "Schikken voltooid." + +#: src/slic3r/GUI/Plater.cpp:2856 +msgid "Searching for optimal orientation" +msgstr "Zoeken naar optimale oriëntatie" + +#: src/slic3r/GUI/Plater.cpp:2889 +msgid "Orientation search canceled." +msgstr "Oriëntatie zoeken geannuleerd." + +#: src/slic3r/GUI/Plater.cpp:2890 +msgid "Orientation found." +msgstr "Oriëntatie gevonden." + +#: src/slic3r/GUI/Plater.cpp:2906 +msgid "" +"The selected object can't be split because it contains more than one volume/" +"material." +msgstr "" +"Het geselecteerde object kan niet opgedeeld worden omdat het meer dan één " +"volume bevat." + +#: src/slic3r/GUI/Plater.cpp:2917 +msgid "Split to Objects" +msgstr "Verdeel in objecten" + +#: src/slic3r/GUI/Plater.cpp:3043 +msgid "Invalid data" +msgstr "Ongeldige data" + +#: src/slic3r/GUI/Plater.cpp:3052 +msgid "Ready to slice" +msgstr "Klaar om te slicen" + +#: src/slic3r/GUI/Plater.cpp:3090 src/slic3r/GUI/PrintHostDialogs.cpp:232 +msgid "Cancelling" +msgstr "Annuleren" + +#: src/slic3r/GUI/Plater.cpp:3107 +msgid "Another export job is currently running." +msgstr "Een andere export loopt op dit moment." + +#: src/slic3r/GUI/Plater.cpp:3276 +msgid "Fix Throught NetFabb" +msgstr "Repareer met NetFabb" + +#: src/slic3r/GUI/Plater.cpp:3467 +msgid "Export failed" +msgstr "Exporteren mislukt" + +#: src/slic3r/GUI/Plater.cpp:3472 src/slic3r/GUI/PrintHostDialogs.cpp:233 +msgid "Cancelled" +msgstr "Geannuleerd" + +#: src/slic3r/GUI/Plater.cpp:3712 src/slic3r/GUI/Plater.cpp:3734 +msgid "Remove the selected object" +msgstr "Verwijder het geselecteerde object" + +#: src/slic3r/GUI/Plater.cpp:3721 +msgid "Add one more instance of the selected object" +msgstr "Voeg een instantie van het geselecteerde object toe" + +#: src/slic3r/GUI/Plater.cpp:3723 +msgid "Remove one instance of the selected object" +msgstr "Verwijder een instantie van het geselecteerde object" + +#: src/slic3r/GUI/Plater.cpp:3725 +msgid "Set number of instances" +msgstr "Stel aantal instanties in" + +#: src/slic3r/GUI/Plater.cpp:3725 +msgid "Change the number of instances of the selected object" +msgstr "Wijzig het aantal instanties van het geselecteerde object" + +#: src/slic3r/GUI/Plater.cpp:3744 +msgid "Reload the selected object from disk" +msgstr "Herlaad het geselecteerde object van de schijf" + +#: src/slic3r/GUI/Plater.cpp:3747 +msgid "Export the selected object as STL file" +msgstr "Exporteer de geselecteerde objecten als STL-bestand" + +#: src/slic3r/GUI/Plater.cpp:3772 +msgid "Along X axis" +msgstr "Over de X-as" + +#: src/slic3r/GUI/Plater.cpp:3772 +msgid "Mirror the selected object along the X axis" +msgstr "Spiegel het geselecteerde object over de X-as" + +#: src/slic3r/GUI/Plater.cpp:3774 +msgid "Along Y axis" +msgstr "Over de Y-as" + +#: src/slic3r/GUI/Plater.cpp:3774 +msgid "Mirror the selected object along the Y axis" +msgstr "Spiegel het geselecteerde object over de Y-as" + +#: src/slic3r/GUI/Plater.cpp:3776 +msgid "Along Z axis" +msgstr "Over de Z-as" + +#: src/slic3r/GUI/Plater.cpp:3776 +msgid "Mirror the selected object along the Z axis" +msgstr "Spiegel het geselecteerde object over de Z-as" + +#: src/slic3r/GUI/Plater.cpp:3779 +msgid "Mirror" +msgstr "Spiegelen" + +#: src/slic3r/GUI/Plater.cpp:3779 +msgid "Mirror the selected object" +msgstr "Spiegel het geselecteerde object" + +#: src/slic3r/GUI/Plater.cpp:3791 +msgid "To objects" +msgstr "Aan objecten" + +#: src/slic3r/GUI/Plater.cpp:3791 src/slic3r/GUI/Plater.cpp:3811 +msgid "Split the selected object into individual objects" +msgstr "Verdeel het geselecteerde object in individuele objecten" + +#: src/slic3r/GUI/Plater.cpp:3793 +msgid "To parts" +msgstr "Aan onderdelen" + +#: src/slic3r/GUI/Plater.cpp:3793 src/slic3r/GUI/Plater.cpp:3825 +msgid "Split the selected object into individual sub-parts" +msgstr "Deel het geselecteerde object op in meerdere subonderdelen" + +#: src/slic3r/GUI/Plater.cpp:3796 src/slic3r/GUI/Plater.cpp:3811 +#: src/slic3r/GUI/Plater.cpp:3825 src/libslic3r/PrintConfig.cpp:3398 +msgid "Split" +msgstr "Verdeel" + +#: src/slic3r/GUI/Plater.cpp:3796 +msgid "Split the selected object" +msgstr "Verdeel het geselecteerde object" + +#: src/slic3r/GUI/Plater.cpp:3817 +msgid "Optimize orientation" +msgstr "Optimaliseer oriëntatie" + +#: src/slic3r/GUI/Plater.cpp:3817 +msgid "Optimize the rotation of the object for better print results." +msgstr "Optimaliseer de rotatie van het object voor betere printresultaten." + +#: src/slic3r/GUI/Plater.cpp:3857 +msgid "3D editor view" +msgstr "3D bewerkingsweergave" + +#: src/slic3r/GUI/Plater.cpp:3865 src/slic3r/GUI/Tab.cpp:2358 +msgid "Preview" +msgstr "Voorbeeldweergave" + +#: src/slic3r/GUI/Plater.cpp:4144 +msgid "" +"%1% printer was active at the time the target Undo / Redo snapshot was " +"taken. Switching to %1% printer requires reloading of %1% presets." +msgstr "" +"%1% de printer was actief op het moment een 'ongedaan maken'- of 'opnieuw " +"doen'-snapshot werd genomen. Schakelen naar %1% printer vereist herladen van " +"%1% presets." + +#: src/slic3r/GUI/Plater.cpp:4319 +msgid "Load Project" +msgstr "Laad project" + +#: src/slic3r/GUI/Plater.cpp:4347 +msgid "Import Object" +msgstr "Importeer object" + +#: src/slic3r/GUI/Plater.cpp:4351 +msgid "Import Objects" +msgstr "Importeer objecten" + +#: src/slic3r/GUI/Plater.cpp:4410 +msgid "All objects will be removed, continue ?" +msgstr "Alle objecten worden verwijderd. Weet u zeker dat u wilt doorgaan?" + +#: src/slic3r/GUI/Plater.cpp:4418 +msgid "Delete Selected Objects" +msgstr "Verwijder geselecteerde objecten" + +#: src/slic3r/GUI/Plater.cpp:4426 +msgid "Increase Instances" +msgstr "Verhoog aantal instanties" + +#: src/slic3r/GUI/Plater.cpp:4461 +msgid "Decrease Instances" +msgstr "Verlaag aantal instanties" + +#: src/slic3r/GUI/Plater.cpp:4497 +#, c-format +msgid "Set numbers of copies to %d" +msgstr "Stel aantal kopieën in voor %d" + +#: src/slic3r/GUI/Plater.cpp:4527 +msgid "Cut by Plane" +msgstr "Snij met behulp van vlak" + +#: src/slic3r/GUI/Plater.cpp:4559 +msgid "Save G-code file as:" +msgstr "gcode-bestand opslaan als:" + +#: src/slic3r/GUI/Plater.cpp:4559 +msgid "Save SL1 file as:" +msgstr "SL1-bestand opslaan als:" + +#: src/slic3r/GUI/Plater.cpp:4671 +#, c-format +msgid "STL file exported to %s" +msgstr "STL-bestand geëxporteerd naar %s" + +#: src/slic3r/GUI/Plater.cpp:4687 +#, c-format +msgid "AMF file exported to %s" +msgstr "AMF-bestand geëxporteerd naar %s" + +#: src/slic3r/GUI/Plater.cpp:4690 +#, c-format +msgid "Error exporting AMF file %s" +msgstr "Fout bij het exporteren van AMF-bestand %s" + +#: src/slic3r/GUI/Plater.cpp:4722 +#, c-format +msgid "3MF file exported to %s" +msgstr "3MF-bestand geëxporteerd naar %s" + +#: src/slic3r/GUI/Plater.cpp:4727 +#, c-format +msgid "Error exporting 3MF file %s" +msgstr "Fout bij het exporteren van 3MF-bestand %s" + +#: src/slic3r/GUI/Plater.cpp:5142 +msgid "Export" +msgstr "Exporteer" + +#: src/slic3r/GUI/Plater.cpp:5143 +msgid "Send G-code" +msgstr "Stuur G-code" + +#: src/slic3r/GUI/Plater.cpp:5227 +msgid "Paste From Clipboard" +msgstr "Plak van klembord" + +#: src/slic3r/GUI/Preferences.cpp:22 src/slic3r/GUI/Tab.cpp:1766 +#: src/slic3r/GUI/Tab.cpp:2010 +msgid "General" +msgstr "Algemeen" + +#: src/slic3r/GUI/Preferences.cpp:44 +msgid "Remember output directory" +msgstr "Onthoud de outputmap" + +#: src/slic3r/GUI/Preferences.cpp:46 +msgid "" +"If this is enabled, Slic3r will prompt the last output directory instead of " +"the one containing the input files." +msgstr "" +"Als dit is ingeschakeld zal PrusaSlicer de laatst gebruikte exportmap " +"gebruiken in plaats van de importmap." + +#: src/slic3r/GUI/Preferences.cpp:52 +msgid "Auto-center parts" +msgstr "Centreer onderdelen automatisch" + +#: src/slic3r/GUI/Preferences.cpp:54 +msgid "" +"If this is enabled, Slic3r will auto-center objects around the print bed " +"center." +msgstr "" +"Als dit is ingeschakeld zal PrusaSlicer objecten rondom het midden centreren." + +#: src/slic3r/GUI/Preferences.cpp:60 +msgid "Background processing" +msgstr "Achtergrondverwerking" + +#: src/slic3r/GUI/Preferences.cpp:62 +msgid "" +"If this is enabled, Slic3r will pre-process objects as soon as they're " +"loaded in order to save time when exporting G-code." +msgstr "" +"Als dit is ingeschakeld zal PrusaSlicer objecten voorbewerken zodra deze " +"zijn geladen om tijd te besparen bij het exporteren van de G-code." + +#: src/slic3r/GUI/Preferences.cpp:71 +msgid "" +"If enabled, PrusaSlicer will check for the new versions of itself online. " +"When a new version becomes available a notification is displayed at the next " +"application startup (never during program usage). This is only a " +"notification mechanisms, no automatic installation is done." +msgstr "" +"Als dit is ingeschakeld zal PrusaSlicer zelf controleren op nieuwe versies. " +"Als een nieuwe versie beschikbaar is, wordt een melding weergegeven bij de " +"volgende keer opstarten. Dit is slechts een melding; er wordt niets " +"automatisch geïnstalleerd." + +#: src/slic3r/GUI/Preferences.cpp:79 +msgid "" +"If enabled, Slic3r downloads updates of built-in system presets in the " +"background. These updates are downloaded into a separate temporary location. " +"When a new preset version becomes available it is offered at application " +"startup." +msgstr "" +"Als dit is ingeschakeld zal PrusaSlicer updates of ingebouwde presets op de " +"achtergrond downloaden. Deze updates worden gedownload naar een tijdelijke " +"locatie. Als een nieuwe preset beschikbaar komt, zal dit gemeld worden bij " +"de eerstvolgende keer opstarten." + +#: src/slic3r/GUI/Preferences.cpp:84 +msgid "Suppress \" - default - \" presets" +msgstr "Verberg 'standaard'-presets" + +#: src/slic3r/GUI/Preferences.cpp:86 +msgid "" +"Suppress \" - default - \" presets in the Print / Filament / Printer " +"selections once there are any other valid presets available." +msgstr "" +"Verberg 'standaard'-presets in de print-, filament- en printerselecties als " +"er andere geldige presets beschikbaar zijn." + +#: src/slic3r/GUI/Preferences.cpp:92 +msgid "Show incompatible print and filament presets" +msgstr "Toon incompatibele print- en filamentpresets" + +#: src/slic3r/GUI/Preferences.cpp:94 +msgid "" +"When checked, the print and filament presets are shown in the preset editor " +"even if they are marked as incompatible with the active printer" +msgstr "" +"Als dit aan staat worden de print- en filamentpresets getoond in de presets-" +"editor, zelfs als ze als incompatibel met de actieve printer zijn gemarkeerd" + +#: src/slic3r/GUI/Preferences.cpp:101 +msgid "Use Retina resolution for the 3D scene" +msgstr "Gebruik hoge resolutie voor de 3D-scène" + +#: src/slic3r/GUI/Preferences.cpp:103 +msgid "" +"If enabled, the 3D scene will be rendered in Retina resolution. If you are " +"experiencing 3D performance problems, disabling this option may help." +msgstr "" +"Als dit is ingeschakeld zal de 3D-scène worden gerenderd in hoge resolutie. " +"Als u problemen ondervindt met de prestaties kan het uitschakelen van deze " +"optie mogelijk helpen." + +#: src/slic3r/GUI/Preferences.cpp:110 +msgid "Use perspective camera" +msgstr "Gebruik perspectiefweergave" + +#: src/slic3r/GUI/Preferences.cpp:112 +msgid "" +"If enabled, use perspective camera. If not enabled, use orthographic camera." +msgstr "" +"Als dit is ingeschakeld zal de weergave op perspectief worden gezet. Anders " +"wordt een orthografische weergave gebruikt." + +#: src/slic3r/GUI/Preferences.cpp:117 +msgid "Use custom size for toolbar icons" +msgstr "Gebruik een aangepaste grootte voor werkbalkpictogrammen" + +#: src/slic3r/GUI/Preferences.cpp:119 +msgid "If enabled, you can change size of toolbar icons manually." +msgstr "" +"Grootte van werkbalkpictogrammen handmatig instellen als dit is ingeschakeld." + +#: src/slic3r/GUI/Preferences.cpp:144 +#, c-format +msgid "You need to restart %s to make the changes effective." +msgstr "U moet %s opnieuw opstarten om wijzigingen door te voeren." + +#: src/slic3r/GUI/Preferences.cpp:192 +msgid "Icon size in a respect to the default size" +msgstr "Pictogramgrootte vergeleken met de originele grootte" + +#: src/slic3r/GUI/Preferences.cpp:207 +msgid "Select toolbar icon size in respect to the default one." +msgstr "Selecteer werkbalk-pictogramgrootte in verhouding tot de originele." + +#: src/slic3r/GUI/Preset.cpp:237 +msgid "modified" +msgstr "aangepast" + +#: src/slic3r/GUI/Preset.cpp:1034 src/slic3r/GUI/Preset.cpp:1081 +#: src/slic3r/GUI/Preset.cpp:1157 src/slic3r/GUI/Preset.cpp:1191 +#: src/slic3r/GUI/PresetBundle.cpp:1576 src/slic3r/GUI/PresetBundle.cpp:1660 +msgid "System presets" +msgstr "Systeempresets" + +#: src/slic3r/GUI/Preset.cpp:1085 src/slic3r/GUI/Preset.cpp:1195 +#: src/slic3r/GUI/PresetBundle.cpp:1665 +msgid "User presets" +msgstr "Presets van de gebruiker" + +#: src/slic3r/GUI/Preset.cpp:1116 src/slic3r/GUI/Tab.cpp:243 +msgid "Add a new printer" +msgstr "Voeg een nieuwe printer toe" + +#: src/slic3r/GUI/Preset.cpp:1118 +msgid "Add/Remove materials" +msgstr "Verwijder of voeg materialen toe" + +#: src/slic3r/GUI/Preset.cpp:1409 +msgid "filament" +msgstr "filament" + +#: src/slic3r/GUI/Preset.cpp:1410 +msgid "SLA print" +msgstr "SLA-print" + +#: src/slic3r/GUI/PresetBundle.cpp:1676 +msgid "Add/Remove filaments" +msgstr "Verwijder of voeg filamenten toe" + +#: src/slic3r/GUI/PresetHints.cpp:28 +msgid "" +"If estimated layer time is below ~%1%s, fan will run at %2%%% and print " +"speed will be reduced so that no less than %3%s are spent on that layer " +"(however, speed will never be reduced below %4%mm/s)." +msgstr "" +"Als de geschatte laagtijd onder de ~%1%s komt, zal de ventilator draaien op " +"%2%%% en de printsnelheid wordt zover gereduceerd dat niet meer dan %3%s " +"worden gebruikt op die laag (echter nooit langzamer dan %4%mm/s)." + +#: src/slic3r/GUI/PresetHints.cpp:35 +msgid "" +"If estimated layer time is greater, but still below ~%1%s, fan will run at a " +"proportionally decreasing speed between %2%%% and %3%%%." +msgstr "" +"Als de geschatte laagtijd groter is, maar nog steeds onder de ~%1%s, zal de " +"ventilator draaien op een proportioneel verlagende snelheid tussen %2%%% en " +"%3%%%." + +#: src/slic3r/GUI/PresetHints.cpp:39 +msgid "During the other layers, fan" +msgstr "Tijdens de overige lagen, ventilator" + +#: src/slic3r/GUI/PresetHints.cpp:41 +msgid "Fan" +msgstr "Ventilator" + +#: src/slic3r/GUI/PresetHints.cpp:47 +msgid "will always run at %1%%%" +msgstr "zal altijd draaien op %1%%%" + +#: src/slic3r/GUI/PresetHints.cpp:50 +msgid "except for the first %1% layers." +msgstr "behalve voor de eerste %s% lagen." + +#: src/slic3r/GUI/PresetHints.cpp:52 +msgid "except for the first layer." +msgstr "behalve voor de eerste laag." + +#: src/slic3r/GUI/PresetHints.cpp:54 +msgid "will be turned off." +msgstr "wordt uitgeschakeld." + +#: src/slic3r/GUI/PresetHints.cpp:155 +msgid "external perimeters" +msgstr "buitenperimeters" + +#: src/slic3r/GUI/PresetHints.cpp:164 +msgid "perimeters" +msgstr "perimeters" + +#: src/slic3r/GUI/PresetHints.cpp:173 +msgid "infill" +msgstr "vulling" + +#: src/slic3r/GUI/PresetHints.cpp:183 +msgid "solid infill" +msgstr "dichte vulling" + +#: src/slic3r/GUI/PresetHints.cpp:191 +msgid "top solid infill" +msgstr "bovenste dichte vulling" + +#: src/slic3r/GUI/PresetHints.cpp:202 +msgid "support" +msgstr "support" + +#: src/slic3r/GUI/PresetHints.cpp:212 +msgid "support interface" +msgstr "supportinterface" + +#: src/slic3r/GUI/PresetHints.cpp:218 +msgid "First layer volumetric" +msgstr "Eerste laag volumetrisch" + +#: src/slic3r/GUI/PresetHints.cpp:218 +msgid "Bridging volumetric" +msgstr "Volumetrische bruggen" + +#: src/slic3r/GUI/PresetHints.cpp:218 +msgid "Volumetric" +msgstr "Volumetrisch" + +#: src/slic3r/GUI/PresetHints.cpp:219 +msgid "flow rate is maximized" +msgstr "Debiet is gemaximaliseerd" + +#: src/slic3r/GUI/PresetHints.cpp:222 +msgid "by the print profile maximum" +msgstr "door het printprofiel maximaal" + +#: src/slic3r/GUI/PresetHints.cpp:223 +msgid "when printing" +msgstr "tijdens het printen" + +#: src/slic3r/GUI/PresetHints.cpp:224 +msgid "with a volumetric rate" +msgstr "met een volumetrische ratio" + +#: src/slic3r/GUI/PresetHints.cpp:228 +#, c-format +msgid "%3.2f mm³/s at filament speed %3.2f mm/s." +msgstr "%3.2f mm³/s met een filamentsnelheid van %3.2f mm/s." + +#: src/slic3r/GUI/PresetHints.cpp:246 +msgid "" +"Recommended object thin wall thickness: Not available due to invalid layer " +"height." +msgstr "" +"Aanbevolen minimale wanddikte. Niet beschikbaar in verband met ongeldige " +"laagdikte." + +#: src/slic3r/GUI/PresetHints.cpp:262 +#, c-format +msgid "Recommended object thin wall thickness for layer height %.2f and" +msgstr "Aanbevolen objecten met dunne wanden voor laagdikte %.2f en" + +#: src/slic3r/GUI/PresetHints.cpp:268 +#, c-format +msgid "%d lines: %.2f mm" +msgstr "%d lijnen: %.2f mm" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:33 +msgid "Send G-Code to printer host" +msgstr "Stuur G-code naar printerhost" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:33 +msgid "Upload to Printer Host with the following filename:" +msgstr "Upload naar printerhost met de volgende bestandsnaam:" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:35 +msgid "Start printing after upload" +msgstr "Print starten na het uploaden" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:42 +msgid "Use forward slashes ( / ) as a directory separator if needed." +msgstr "" +"Gebruik schuine streepjes ( / ) als mapscheidingstekens als dat nodig is." + +#: src/slic3r/GUI/PrintHostDialogs.cpp:149 +msgid "ID" +msgstr "ID" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:150 +msgid "Progress" +msgstr "Voortgang" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:151 +msgid "Status" +msgstr "Status" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:152 +msgid "Host" +msgstr "Host" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:153 +msgid "Filename" +msgstr "Bestandsnaam" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:154 +msgid "Error Message" +msgstr "Foutbericht" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:157 +msgid "Cancel selected" +msgstr "Annuleren geselecteerd" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:159 +msgid "Show error message" +msgstr "Toon foutbericht" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:198 +#: src/slic3r/GUI/PrintHostDialogs.cpp:229 +msgid "Enqueued" +msgstr "In de wachtrij geplaatst" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:230 +msgid "Uploading" +msgstr "Uploaden" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:234 +msgid "Completed" +msgstr "Voltooid" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:272 +msgid "Error uploading to print host:" +msgstr "Fout bij het uploaden naar de printhost:" + +#: src/slic3r/GUI/RammingChart.cpp:23 +msgid "NO RAMMING AT ALL" +msgstr "Fout: geen ramming" + +#: src/slic3r/GUI/RammingChart.cpp:76 +msgid "Time" +msgstr "Tijd" + +#: src/slic3r/GUI/RammingChart.cpp:76 src/slic3r/GUI/WipeTowerDialog.cpp:83 +#: src/libslic3r/PrintConfig.cpp:634 src/libslic3r/PrintConfig.cpp:678 +#: src/libslic3r/PrintConfig.cpp:693 src/libslic3r/PrintConfig.cpp:2385 +#: src/libslic3r/PrintConfig.cpp:2394 src/libslic3r/PrintConfig.cpp:2495 +#: src/libslic3r/PrintConfig.cpp:2503 src/libslic3r/PrintConfig.cpp:2511 +#: src/libslic3r/PrintConfig.cpp:2518 src/libslic3r/PrintConfig.cpp:2526 +#: src/libslic3r/PrintConfig.cpp:2534 +msgid "s" +msgstr "s" + +#: src/slic3r/GUI/RammingChart.cpp:81 +msgid "Volumetric speed" +msgstr "Volumetrische snelheid" + +#: src/slic3r/GUI/RammingChart.cpp:81 src/libslic3r/PrintConfig.cpp:591 +#: src/libslic3r/PrintConfig.cpp:1247 +msgid "mm³/s" +msgstr "mm³/s" + +#: src/slic3r/GUI/Selection.cpp:146 +msgid "Selection-Add" +msgstr "Selectie - Voeg toe" + +#: src/slic3r/GUI/Selection.cpp:187 +msgid "Selection-Remove" +msgstr "Selectie - Verwijder" + +#: src/slic3r/GUI/Selection.cpp:219 +msgid "Selection-Add Object" +msgstr "Selectie - Voeg object toe" + +#: src/slic3r/GUI/Selection.cpp:238 +msgid "Selection-Remove Object" +msgstr "Selectie - Verwijder object" + +#: src/slic3r/GUI/Selection.cpp:256 +msgid "Selection-Add Instance" +msgstr "Selectie - Voeg instantie toe" + +#: src/slic3r/GUI/Selection.cpp:275 +msgid "Selection-Remove Instance" +msgstr "Selectie - Verwijder instantie" + +#: src/slic3r/GUI/Selection.cpp:376 +msgid "Selection-Add All" +msgstr "Selectie - Voeg alle toe" + +#: src/slic3r/GUI/Selection.cpp:402 +msgid "Selection-Remove All" +msgstr "Selectie - Verwijder alle" + +#: src/slic3r/GUI/Selection.cpp:939 +msgid "Scale To Fit" +msgstr "Verschaal tot het past" + +#: src/slic3r/GUI/Selection.cpp:1474 +msgid "Set Printable Instance" +msgstr "Stel printbare instanties in" + +#: src/slic3r/GUI/Selection.cpp:1474 +msgid "Set Unprintable Instance" +msgstr "Stel instantie in op niet-printbaar" + +#: src/slic3r/GUI/SysInfoDialog.cpp:78 +msgid "System Information" +msgstr "Systeeminformatie" + +#: src/slic3r/GUI/SysInfoDialog.cpp:154 +msgid "Copy to Clipboard" +msgstr "Kopieer naar klembord" + +#: src/slic3r/GUI/Tab.cpp:52 src/libslic3r/PrintConfig.cpp:244 +msgid "Compatible printers" +msgstr "Compatibele printers" + +#: src/slic3r/GUI/Tab.cpp:53 +msgid "Select the printers this profile is compatible with." +msgstr "Selecteer de printers die compatibel met dit profiel zijn." + +#: src/slic3r/GUI/Tab.cpp:58 src/libslic3r/PrintConfig.cpp:259 +msgid "Compatible print profiles" +msgstr "Compatibele printprofielen" + +#: src/slic3r/GUI/Tab.cpp:59 +msgid "Select the print profiles this profile is compatible with." +msgstr "Selecteer de printprofielen die compatibel met dit profiel zijn." + +#. TRN "Save current Settings" +#: src/slic3r/GUI/Tab.cpp:135 +#, c-format +msgid "Save current %s" +msgstr "Huidige %s opslaan" + +#: src/slic3r/GUI/Tab.cpp:136 +msgid "Delete this preset" +msgstr "Verwijder preset" + +#: src/slic3r/GUI/Tab.cpp:141 +msgid "" +"Hover the cursor over buttons to find more information \n" +"or click this button." +msgstr "" +"Beweeg de cursor over de knoppen voor meer informatie\n" +"of klik op deze knop." + +#: src/slic3r/GUI/Tab.cpp:943 +msgid "This is a default preset." +msgstr "Dit is een standaard preset." + +#: src/slic3r/GUI/Tab.cpp:945 +msgid "This is a system preset." +msgstr "Dit is een systeempreset." + +#: src/slic3r/GUI/Tab.cpp:947 +msgid "Current preset is inherited from the default preset." +msgstr "Huidige preset is gebaseerd op de standaard preset." + +#: src/slic3r/GUI/Tab.cpp:950 +#, c-format +msgid "" +"Current preset is inherited from:\n" +"\t%s" +msgstr "" +"Huidige preset is gebaseerd op:\n" +"\t%s" + +#: src/slic3r/GUI/Tab.cpp:954 +msgid "It can't be deleted or modified." +msgstr "Kan niet verwijderd of aangepast worden." + +#: src/slic3r/GUI/Tab.cpp:955 +msgid "" +"Any modifications should be saved as a new preset inherited from this one." +msgstr "" +"Eventuele wijzigingen moet worden opgeslagen als een nieuwe preset die is " +"gebaseerd op de huidige." + +#: src/slic3r/GUI/Tab.cpp:956 +msgid "To do that please specify a new name for the preset." +msgstr "Geef daarvoor een nieuwe naam aan de preset." + +#: src/slic3r/GUI/Tab.cpp:960 +msgid "Additional information:" +msgstr "Additionele informatie:" + +#: src/slic3r/GUI/Tab.cpp:966 +msgid "printer model" +msgstr "printermodel" + +#: src/slic3r/GUI/Tab.cpp:974 +msgid "default print profile" +msgstr "standaard printprofiel" + +#: src/slic3r/GUI/Tab.cpp:977 +msgid "default filament profile" +msgstr "standaard filamentprofiel" + +#: src/slic3r/GUI/Tab.cpp:991 +msgid "default SLA material profile" +msgstr "standaard SLA-materiaalprofiel" + +#: src/slic3r/GUI/Tab.cpp:995 +msgid "default SLA print profile" +msgstr "standaard SLA-printprofiel" + +#: src/slic3r/GUI/Tab.cpp:1003 +msgid "full profile name" +msgstr "volledige profielnaam" + +#: src/slic3r/GUI/Tab.cpp:1004 +msgid "symbolic profile name" +msgstr "symbolische profielnaam" + +#: src/slic3r/GUI/Tab.cpp:1038 src/slic3r/GUI/Tab.cpp:3558 +msgid "Layers and perimeters" +msgstr "Lagen en perimeters" + +#: src/slic3r/GUI/Tab.cpp:1043 +msgid "Vertical shells" +msgstr "Verticale shells" + +#: src/slic3r/GUI/Tab.cpp:1054 +msgid "Horizontal shells" +msgstr "Horizontale shells" + +#: src/slic3r/GUI/Tab.cpp:1055 src/libslic3r/PrintConfig.cpp:1776 +msgid "Solid layers" +msgstr "Dichte lagen" + +#: src/slic3r/GUI/Tab.cpp:1060 +msgid "Quality (slower slicing)" +msgstr "Kwaliteit (slicen kan langer duren)" + +#: src/slic3r/GUI/Tab.cpp:1078 +msgid "Reducing printing time" +msgstr "Printtijd verkorten" + +#: src/slic3r/GUI/Tab.cpp:1090 +msgid "Skirt and brim" +msgstr "Skirt en brim" + +#: src/slic3r/GUI/Tab.cpp:1107 +msgid "Raft" +msgstr "Raft" + +#: src/slic3r/GUI/Tab.cpp:1111 +msgid "Options for support material and raft" +msgstr "Opties voor support en raft" + +#: src/slic3r/GUI/Tab.cpp:1126 +msgid "Speed for print moves" +msgstr "Snelheid voor printbewegingen" + +#: src/slic3r/GUI/Tab.cpp:1138 +msgid "Speed for non-print moves" +msgstr "Snelheid voor niet-print bewegingen" + +#: src/slic3r/GUI/Tab.cpp:1141 +msgid "Modifiers" +msgstr "Modificators" + +#: src/slic3r/GUI/Tab.cpp:1144 +msgid "Acceleration control (advanced)" +msgstr "Acceleraties (geavanceerd)" + +#: src/slic3r/GUI/Tab.cpp:1151 +msgid "Autospeed (advanced)" +msgstr "Automatische snelheid (geavanceerd)" + +#: src/slic3r/GUI/Tab.cpp:1159 +msgid "Multiple Extruders" +msgstr "Meerdere extruders" + +#: src/slic3r/GUI/Tab.cpp:1167 +msgid "Ooze prevention" +msgstr "Druippreventie" + +#: src/slic3r/GUI/Tab.cpp:1185 +msgid "Extrusion width" +msgstr "Extrusiebreedte" + +#: src/slic3r/GUI/Tab.cpp:1195 +msgid "Overlap" +msgstr "Overlapping" + +#: src/slic3r/GUI/Tab.cpp:1198 +msgid "Flow" +msgstr "Stroom" + +#: src/slic3r/GUI/Tab.cpp:1207 +msgid "Other" +msgstr "Overige" + +#: src/slic3r/GUI/Tab.cpp:1210 src/slic3r/GUI/Tab.cpp:3618 +msgid "Output options" +msgstr "Output-opties" + +#: src/slic3r/GUI/Tab.cpp:1211 +msgid "Sequential printing" +msgstr "Achtereenvolgens printen" + +#: src/slic3r/GUI/Tab.cpp:1213 +msgid "Extruder clearance (mm)" +msgstr "Extruderruimte (mm)" + +#: src/slic3r/GUI/Tab.cpp:1222 src/slic3r/GUI/Tab.cpp:3619 +msgid "Output file" +msgstr "Outputbestand" + +#: src/slic3r/GUI/Tab.cpp:1229 src/libslic3r/PrintConfig.cpp:1448 +msgid "Post-processing scripts" +msgstr "Scripts voor nabewerking" + +#: src/slic3r/GUI/Tab.cpp:1235 src/slic3r/GUI/Tab.cpp:1236 +#: src/slic3r/GUI/Tab.cpp:1517 src/slic3r/GUI/Tab.cpp:1518 +#: src/slic3r/GUI/Tab.cpp:1982 src/slic3r/GUI/Tab.cpp:1983 +#: src/slic3r/GUI/Tab.cpp:2096 src/slic3r/GUI/Tab.cpp:2097 +#: src/slic3r/GUI/Tab.cpp:3495 src/slic3r/GUI/Tab.cpp:3496 +msgid "Notes" +msgstr "Opmerkingen" + +#: src/slic3r/GUI/Tab.cpp:1242 src/slic3r/GUI/Tab.cpp:1525 +#: src/slic3r/GUI/Tab.cpp:1989 src/slic3r/GUI/Tab.cpp:2103 +#: src/slic3r/GUI/Tab.cpp:3503 src/slic3r/GUI/Tab.cpp:3624 +msgid "Dependencies" +msgstr "Afhankelijkheden" + +#: src/slic3r/GUI/Tab.cpp:1243 src/slic3r/GUI/Tab.cpp:1526 +#: src/slic3r/GUI/Tab.cpp:1990 src/slic3r/GUI/Tab.cpp:2104 +#: src/slic3r/GUI/Tab.cpp:3504 src/slic3r/GUI/Tab.cpp:3625 +msgid "Profile dependencies" +msgstr "Profielafhankelijkheden" + +#: src/slic3r/GUI/Tab.cpp:1303 src/slic3r/GUI/Tab.cpp:1358 +msgid "Filament Overrides" +msgstr "Overschrijven door filament" + +#: src/slic3r/GUI/Tab.cpp:1304 src/slic3r/GUI/Tab.cpp:1363 +#: src/slic3r/GUI/Tab.cpp:2338 +msgid "Retraction" +msgstr "Retractie" + +#: src/slic3r/GUI/Tab.cpp:1413 src/libslic3r/PrintConfig.cpp:2056 +msgid "Temperature" +msgstr "Temperatuur" + +#: src/slic3r/GUI/Tab.cpp:1419 +msgid "Bed" +msgstr "Bed" + +#: src/slic3r/GUI/Tab.cpp:1424 +msgid "Cooling" +msgstr "Koeling" + +#: src/slic3r/GUI/Tab.cpp:1425 src/libslic3r/PrintConfig.cpp:1350 +#: src/libslic3r/PrintConfig.cpp:2177 +msgid "Enable" +msgstr "Toestaan" + +#: src/slic3r/GUI/Tab.cpp:1436 +msgid "Fan settings" +msgstr "Ventilatorinstellingen" + +#: src/slic3r/GUI/Tab.cpp:1445 +msgid "Cooling thresholds" +msgstr "Koeldrempels" + +#: src/slic3r/GUI/Tab.cpp:1451 +msgid "Filament properties" +msgstr "Filamenteigenschappen" + +#: src/slic3r/GUI/Tab.cpp:1455 +msgid "Print speed override" +msgstr "Printsnelheid overschrijven" + +#: src/slic3r/GUI/Tab.cpp:1465 +msgid "Wipe tower parameters" +msgstr "Afveegblokparameters" + +#: src/slic3r/GUI/Tab.cpp:1468 +msgid "Toolchange parameters with single extruder MM printers" +msgstr "Toolwisselparameter voor multi-materialprinters met één extruder" + +#: src/slic3r/GUI/Tab.cpp:1482 +msgid "Ramming settings" +msgstr "Ramming-instellingen" + +#: src/slic3r/GUI/Tab.cpp:1504 src/slic3r/GUI/Tab.cpp:1945 +msgid "Custom G-code" +msgstr "Custom G-code" + +#: src/slic3r/GUI/Tab.cpp:1505 src/slic3r/GUI/Tab.cpp:1946 +#: src/libslic3r/PrintConfig.cpp:1802 src/libslic3r/PrintConfig.cpp:1817 +msgid "Start G-code" +msgstr "Start G-code" + +#: src/slic3r/GUI/Tab.cpp:1511 src/slic3r/GUI/Tab.cpp:1952 +#: src/libslic3r/PrintConfig.cpp:374 src/libslic3r/PrintConfig.cpp:384 +msgid "End G-code" +msgstr "Eind G-code" + +#: src/slic3r/GUI/Tab.cpp:1568 +msgid "Volumetric flow hints not available" +msgstr "Volumetrische stroom - opmerkingen niet beschikbaar" + +#: src/slic3r/GUI/Tab.cpp:1654 src/slic3r/GUI/Tab.cpp:1885 +msgid "Test" +msgstr "Test" + +#: src/slic3r/GUI/Tab.cpp:1664 +msgid "Could not get a valid Printer Host reference" +msgstr "Kan geen geldige printerhost-referentie krijgen" + +#: src/slic3r/GUI/Tab.cpp:1670 src/slic3r/GUI/Tab.cpp:1898 +msgid "Success!" +msgstr "Gelukt!" + +#: src/slic3r/GUI/Tab.cpp:1685 +msgid "" +"HTTPS CA file is optional. It is only needed if you use HTTPS with a self-" +"signed certificate." +msgstr "" +"HTTPS-CA-bestand is optioneel. Het is alleen nodig als u werkt met een zelf " +"ondertekend certificaat." + +#: src/slic3r/GUI/Tab.cpp:1698 +msgid "Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*" +msgstr "Certificaatbestanden (*.crt, *.pem)|*.crt;*.pem|Alle betanden|*.*" + +#: src/slic3r/GUI/Tab.cpp:1699 +msgid "Open CA certificate file" +msgstr "Open een CA-certificaatbestand" + +#: src/slic3r/GUI/Tab.cpp:1727 +#, c-format +msgid "" +"HTTPS CA File:\n" +" \tOn this system, %s uses HTTPS certificates from the system Certificate " +"Store or Keychain.\n" +" \tTo use a custom CA file, please import your CA file into Certificate " +"Store / Keychain." +msgstr "" +"HTTPS-CA-bestand:\n" +" \t%s gebruikt op dit systeem HTTPS-certificaten van de Certificate Store " +"of Keychain.\n" +" \tOm een aangepast CA-bestand te gebruiken moet uw CA-bestand in de " +"Certificate Store of Keychain geïmporteerd worden." + +#: src/slic3r/GUI/Tab.cpp:1767 src/slic3r/GUI/Tab.cpp:2011 +msgid "Size and coordinates" +msgstr "Grootte en coördinaten" + +#: src/slic3r/GUI/Tab.cpp:1772 src/slic3r/GUI/Tab.cpp:2016 +#: src/slic3r/GUI/Tab.cpp:3132 +msgid "Set" +msgstr "Stel in" + +#: src/slic3r/GUI/Tab.cpp:1804 +msgid "Capabilities" +msgstr "Mogelijkheden" + +#: src/slic3r/GUI/Tab.cpp:1809 +msgid "Number of extruders of the printer." +msgstr "Aantal extruders van de printer." + +#: src/slic3r/GUI/Tab.cpp:1837 +msgid "" +"Single Extruder Multi Material is selected, \n" +"and all extruders must have the same diameter.\n" +"Do you want to change the diameter for all extruders to first extruder " +"nozzle diameter value?" +msgstr "" +"Multi-material met één extruder is geselecteerd.\n" +"Alle extruders moeten daarvoor dezelfde diameter hebben.\n" +"Wilt u de diameters voor alle extruders aanpassen gelijk aan die van de " +"eerste extruder?" + +#: src/slic3r/GUI/Tab.cpp:1840 src/slic3r/GUI/Tab.cpp:2308 +#: src/libslic3r/PrintConfig.cpp:1323 +msgid "Nozzle diameter" +msgstr "Nozzlediameter" + +#: src/slic3r/GUI/Tab.cpp:1870 +msgid "USB/Serial connection" +msgstr "USB/seriële verbinding" + +#: src/slic3r/GUI/Tab.cpp:1871 src/libslic3r/PrintConfig.cpp:1656 +msgid "Serial port" +msgstr "Seriële poort" + +#: src/slic3r/GUI/Tab.cpp:1876 +msgid "Rescan serial ports" +msgstr "Seriële poorten opnieuw scannen" + +#: src/slic3r/GUI/Tab.cpp:1898 +msgid "Connection to printer works correctly." +msgstr "Verbinding met de printer werkt naar behoren." + +#: src/slic3r/GUI/Tab.cpp:1901 +msgid "Connection failed." +msgstr "Verbinding mislukt." + +#: src/slic3r/GUI/Tab.cpp:1914 src/slic3r/GUI/Tab.cpp:2091 +msgid "Print Host upload" +msgstr "Printhost upload" + +#: src/slic3r/GUI/Tab.cpp:1958 src/libslic3r/PrintConfig.cpp:143 +msgid "Before layer change G-code" +msgstr "G-code die komt vóór de laagwisseling" + +#: src/slic3r/GUI/Tab.cpp:1964 src/libslic3r/PrintConfig.cpp:1069 +msgid "After layer change G-code" +msgstr "G-code die komt na de laagwisseling" + +#: src/slic3r/GUI/Tab.cpp:1970 src/libslic3r/PrintConfig.cpp:2082 +msgid "Tool change G-code" +msgstr "Toolwisseling G-code" + +#: src/slic3r/GUI/Tab.cpp:1976 +msgid "Between objects G-code (for sequential printing)" +msgstr "G-code die komt tussen objecten (bij achtereenvolgens printen)" + +#: src/slic3r/GUI/Tab.cpp:2048 +msgid "Display" +msgstr "Scherm" + +#: src/slic3r/GUI/Tab.cpp:2063 +msgid "Tilt" +msgstr "Kanteling" + +#: src/slic3r/GUI/Tab.cpp:2064 +msgid "Tilt time" +msgstr "Kanteltijd" + +#: src/slic3r/GUI/Tab.cpp:2070 src/slic3r/GUI/Tab.cpp:3477 +msgid "Corrections" +msgstr "Correcties" + +#: src/slic3r/GUI/Tab.cpp:2085 src/slic3r/GUI/Tab.cpp:3473 +msgid "Exposure" +msgstr "Belichtingstijd" + +#: src/slic3r/GUI/Tab.cpp:2156 src/slic3r/GUI/Tab.cpp:2241 +#: src/libslic3r/PrintConfig.cpp:1119 src/libslic3r/PrintConfig.cpp:1137 +#: src/libslic3r/PrintConfig.cpp:1155 src/libslic3r/PrintConfig.cpp:1172 +#: src/libslic3r/PrintConfig.cpp:1183 src/libslic3r/PrintConfig.cpp:1194 +#: src/libslic3r/PrintConfig.cpp:1205 +msgid "Machine limits" +msgstr "Machinelimieten" + +#: src/slic3r/GUI/Tab.cpp:2170 +msgid "Values in this column are for Normal mode" +msgstr "Waarden in deze kolom zijn voor de normale modus" + +#: src/slic3r/GUI/Tab.cpp:2171 +msgid "Normal" +msgstr "Normaal" + +#: src/slic3r/GUI/Tab.cpp:2176 +msgid "Values in this column are for Stealth mode" +msgstr "Waarden in deze kolom zijn voor de stille modus" + +#: src/slic3r/GUI/Tab.cpp:2177 +msgid "Stealth" +msgstr "Stille modus" + +#: src/slic3r/GUI/Tab.cpp:2185 +msgid "Maximum feedrates" +msgstr "Maximale voedingssnelheden" + +#: src/slic3r/GUI/Tab.cpp:2190 +msgid "Maximum accelerations" +msgstr "Maximale acceleraties" + +#: src/slic3r/GUI/Tab.cpp:2197 +msgid "Jerk limits" +msgstr "Ruklimieten" + +#: src/slic3r/GUI/Tab.cpp:2202 +msgid "Minimum feedrates" +msgstr "Minimale voedingssnelheden" + +#: src/slic3r/GUI/Tab.cpp:2266 src/slic3r/GUI/Tab.cpp:2274 +msgid "Single extruder MM setup" +msgstr "Multi-materialsetup met één extruder" + +#: src/slic3r/GUI/Tab.cpp:2275 +msgid "Single extruder multimaterial parameters" +msgstr "Parameter voor multi-material met één extruder" + +#: src/slic3r/GUI/Tab.cpp:2306 +msgid "" +"This is a single extruder multimaterial printer, diameters of all extruders " +"will be set to the new value. Do you want to proceed?" +msgstr "" +"Dit is een multi-materialprinter met één extruder. De diameters van alle " +"extruders worden ingesteld op de nieuwe waarde. Weet u zeker dat u wilt " +"doorgaan?" + +#: src/slic3r/GUI/Tab.cpp:2330 +msgid "Layer height limits" +msgstr "Laagdiktelimieten" + +#: src/slic3r/GUI/Tab.cpp:2335 +msgid "Position (for multi-extruder printers)" +msgstr "Positie (voor multi-extruderprinters)" + +#: src/slic3r/GUI/Tab.cpp:2341 +msgid "Only lift Z" +msgstr "Beweeg alleen Z omhoog" + +#: src/slic3r/GUI/Tab.cpp:2354 +msgid "" +"Retraction when tool is disabled (advanced settings for multi-extruder " +"setups)" +msgstr "" +"Retractie als de tool uit staat (geavanceerde instelling voor multi-" +"extrudersetups)" + +#: src/slic3r/GUI/Tab.cpp:2362 +msgid "Reset to Filament Color" +msgstr "Reset naar filamentkleur" + +#: src/slic3r/GUI/Tab.cpp:2543 +msgid "" +"The Wipe option is not available when using the Firmware Retraction mode.\n" +"\n" +"Shall I disable it in order to enable Firmware Retraction?" +msgstr "" +"De afveegoptie is niet beschikbaar als firmwareretractie aanstaat.\n" +"\n" +"Moet deze uitgezet worden om firmwareretractie te gebruiken?" + +#: src/slic3r/GUI/Tab.cpp:2545 +msgid "Firmware Retraction" +msgstr "Firmwareretractie" + +#: src/slic3r/GUI/Tab.cpp:2875 +#, c-format +msgid "Default preset (%s)" +msgstr "Standaard preset (%s)" + +#: src/slic3r/GUI/Tab.cpp:2876 +#, c-format +msgid "Preset (%s)" +msgstr "Preset (%s)" + +#: src/slic3r/GUI/Tab.cpp:2893 +msgid "has the following unsaved changes:" +msgstr "heeft de volgende niet-opgeslagen wijzigingen:" + +#: src/slic3r/GUI/Tab.cpp:2896 +msgid "is not compatible with printer" +msgstr "is niet compatibel met printer" + +#: src/slic3r/GUI/Tab.cpp:2897 +msgid "is not compatible with print profile" +msgstr "is niet compatibel met printprofiel" + +#: src/slic3r/GUI/Tab.cpp:2899 +msgid "and it has the following unsaved changes:" +msgstr "en het heeft de volgende niet-opgeslagen wijzigingen:" + +#: src/slic3r/GUI/Tab.cpp:2903 +msgid "Unsaved Changes" +msgstr "Niet-opgeslagen wijzigingen" + +#: src/slic3r/GUI/Tab.cpp:3001 +msgctxt "PresetName" +msgid "%1% - Copy" +msgstr "%1% - Kopie" + +#: src/slic3r/GUI/Tab.cpp:3024 +msgid "The supplied name is empty. It can't be saved." +msgstr "De ingevoerde naam is leeg. Kan niet opgeslagen worden." + +#: src/slic3r/GUI/Tab.cpp:3029 +msgid "Cannot overwrite a system profile." +msgstr "Een systeemprofiel kan niet overschreven worden." + +#: src/slic3r/GUI/Tab.cpp:3033 +msgid "Cannot overwrite an external profile." +msgstr "Een extern profiel kan niet overschreven worden." + +#: src/slic3r/GUI/Tab.cpp:3038 +msgid "Preset with name \"%1%\" already exist." +msgstr "Preset met de naam '%s% bestaat al." + +#: src/slic3r/GUI/Tab.cpp:3039 +msgid "Replace?" +msgstr "Vervangen?" + +#: src/slic3r/GUI/Tab.cpp:3077 +msgid "remove" +msgstr "verwijderen" + +#: src/slic3r/GUI/Tab.cpp:3077 +msgid "delete" +msgstr "verwijderen" + +#. TRN remove/delete +#: src/slic3r/GUI/Tab.cpp:3079 +msgid "Are you sure you want to %1% the selected preset?" +msgstr "Weet u zeker dat u de geselecteerde preset %1% wilt?" + +#. TRN Remove/Delete +#: src/slic3r/GUI/Tab.cpp:3082 +msgid "%1% Preset" +msgstr "Preset %1%" + +#: src/slic3r/GUI/Tab.cpp:3208 +msgid "LOCKED LOCK" +msgstr "Vergrendeld" + +#. TRN Description for "LOCKED LOCK" +#: src/slic3r/GUI/Tab.cpp:3210 +msgid "" +"indicates that the settings are the same as the system (or default) values " +"for the current option group" +msgstr "" +"geeft aan dat de instellingen gelijk zijn aan de systeemwaarden voor de " +"huidige optiegroep" + +#: src/slic3r/GUI/Tab.cpp:3212 +msgid "UNLOCKED LOCK" +msgstr "Ontgrendeld" + +#. TRN Description for "UNLOCKED LOCK" +#: src/slic3r/GUI/Tab.cpp:3214 +msgid "" +"indicates that some settings were changed and are not equal to the system " +"(or default) values for the current option group.\n" +"Click the UNLOCKED LOCK icon to reset all settings for current option group " +"to the system (or default) values." +msgstr "" +"geeft aan dat sommige instellingen zijn veranderd en niet gelijk zijn aan de " +"standaardwaarde voor de huidige optiegroep.\n" +"Klik op het ontgrendeld-pictogram om de instelling te resetten naar de " +"systeemwaarden voor de huidige optiegroep." + +#: src/slic3r/GUI/Tab.cpp:3219 +msgid "WHITE BULLET" +msgstr "Wit bolletje" + +#. TRN Description for "WHITE BULLET" +#: src/slic3r/GUI/Tab.cpp:3221 +msgid "" +"for the left button: \tindicates a non-system (or non-default) preset,\n" +"for the right button: \tindicates that the settings hasn't been modified." +msgstr "" +"linker knop: \tgeeft een niet-systeempreset aan,\n" +"rechter knop: \tgeeft aan dat de instelling niet veranderd is." + +#: src/slic3r/GUI/Tab.cpp:3224 +msgid "BACK ARROW" +msgstr "Pijltje terug" + +#. TRN Description for "BACK ARROW" +#: src/slic3r/GUI/Tab.cpp:3226 +msgid "" +"indicates that the settings were changed and are not equal to the last saved " +"preset for the current option group.\n" +"Click the BACK ARROW icon to reset all settings for the current option group " +"to the last saved preset." +msgstr "" +"geeft aan dat de instellingen zijn veranderd en niet gelijk zijn aan de " +"laatst opgeslagen preset voor de huidige optiegroep.\n" +"Klik op het pijltje-terug-pictogram om alle instellingen te resetten naar de " +"laatst opgeslagen preset voor de huidige optiegroep." + +#: src/slic3r/GUI/Tab.cpp:3236 +msgid "" +"LOCKED LOCK icon indicates that the settings are the same as the system (or " +"default) values for the current option group" +msgstr "" +"Vergrendeld-pictogram geeft aan dat de instellingen gelijk zijn aan de " +"systeemwaarde van de huidige optiegroep" + +#: src/slic3r/GUI/Tab.cpp:3238 +msgid "" +"UNLOCKED LOCK icon indicates that some settings were changed and are not " +"equal to the system (or default) values for the current option group.\n" +"Click to reset all settings for current option group to the system (or " +"default) values." +msgstr "" +"Ontgrendeld-pictogram geeft aan dat sommige instellingen zijn veranderd en " +"niet gelijk zijn aan de systeemwaarde voor de huidige optiegroep.\n" +"Klik om alle instellingen voor de huidige optiegroep te resetten naar " +"systeemwaarden." + +#: src/slic3r/GUI/Tab.cpp:3241 +msgid "WHITE BULLET icon indicates a non system (or non default) preset." +msgstr "Het witte bolletje geeft aan dat het geen systeempreset betreft." + +#: src/slic3r/GUI/Tab.cpp:3244 +msgid "" +"WHITE BULLET icon indicates that the settings are the same as in the last " +"saved preset for the current option group." +msgstr "" +"Het witte bolletje geeft aan dat de instelling gelijk is aan de laatst " +"opgeslagen preset voor de huidige optiegroep." + +#: src/slic3r/GUI/Tab.cpp:3246 +msgid "" +"BACK ARROW icon indicates that the settings were changed and are not equal " +"to the last saved preset for the current option group.\n" +"Click to reset all settings for the current option group to the last saved " +"preset." +msgstr "" +"Het pijltje-terug-pictogram geeft aan dat de instellingen zijn gewijzigd en " +"niet gelijk zijn aan de laatst opgeslagen preset voor de huidige " +"optiegroep.\n" +"Klik om alle instellingen terug te zetten voor de huidige optiegroep naar de " +"laatst opgeslagen preset." + +#: src/slic3r/GUI/Tab.cpp:3252 +msgid "" +"LOCKED LOCK icon indicates that the value is the same as the system (or " +"default) value." +msgstr "" +"Vergrendeld-pictogram geeft aan dat de waarde gelijk is aan de systeemwaarde." + +#: src/slic3r/GUI/Tab.cpp:3253 +msgid "" +"UNLOCKED LOCK icon indicates that the value was changed and is not equal to " +"the system (or default) value.\n" +"Click to reset current value to the system (or default) value." +msgstr "" +"Ontgrendeld-pictogram geeft aan dat de waarde is veranderd en niet gelijk is " +"aan de systeemwaarde.\n" +"Klik om de huidige waarde te resetten naar de systeemwaarde." + +#: src/slic3r/GUI/Tab.cpp:3259 +msgid "" +"WHITE BULLET icon indicates that the value is the same as in the last saved " +"preset." +msgstr "" +"Het witte bolletje geeft aan dat de waarde gelijk is aan de laatst " +"opgeslagen preset." + +#: src/slic3r/GUI/Tab.cpp:3260 +msgid "" +"BACK ARROW icon indicates that the value was changed and is not equal to the " +"last saved preset.\n" +"Click to reset current value to the last saved preset." +msgstr "" +"Het pijltje-terug-pictogram geeft aan dat de waarde is veranderd en niet " +"gelijk is aan de laatst opgeslagen preset.\n" +"Klik om de waarde te resetten naar de laatst opgeslagen preset." + +#. TRN Preset +#: src/slic3r/GUI/Tab.cpp:3373 +#, c-format +msgid "Save %s as:" +msgstr "%s opslaan als:" + +#: src/slic3r/GUI/Tab.cpp:3417 +msgid "the following suffix is not allowed:" +msgstr "het volgende achtervoegsel is niet toegestaan:" + +#: src/slic3r/GUI/Tab.cpp:3421 +msgid "The supplied name is not available." +msgstr "De ingevoerde naam is niet beschikbaar." + +#: src/slic3r/GUI/Tab.cpp:3434 src/slic3r/GUI/Tab.cpp:3436 +msgid "Material" +msgstr "Materiaal" + +#: src/slic3r/GUI/Tab.cpp:3470 src/slic3r/GUI/Tab.cpp:3560 +#: src/slic3r/GUI/wxExtensions.cpp:601 +msgid "Layers" +msgstr "Lagen" + +#: src/slic3r/GUI/Tab.cpp:3568 +msgid "Support head" +msgstr "Supportkop" + +#: src/slic3r/GUI/Tab.cpp:3573 +msgid "Support pillar" +msgstr "Supportpijler" + +#: src/slic3r/GUI/Tab.cpp:3587 +msgid "Connection of the support sticks and junctions" +msgstr "Verbindingen van de supporttakken en kruisingen" + +#: src/slic3r/GUI/Tab.cpp:3592 +msgid "Automatic generation" +msgstr "Automatisch genereren" + +#: src/slic3r/GUI/Tab.hpp:327 src/slic3r/GUI/Tab.hpp:427 +msgid "Print Settings" +msgstr "Printinstellingen" + +#: src/slic3r/GUI/Tab.hpp:352 +msgid "Filament Settings" +msgstr "Filamentinstellingen" + +#: src/slic3r/GUI/Tab.hpp:388 +msgid "Printer Settings" +msgstr "Printerinstellingen" + +#: src/slic3r/GUI/Tab.hpp:412 +msgid "Material Settings" +msgstr "Materiaalinstellingen" + +#: src/slic3r/GUI/Tab.hpp:439 +msgid "Save preset" +msgstr "Preset opslaan" + +#: src/slic3r/GUI/UpdateDialogs.cpp:38 +msgid "Update available" +msgstr "Update beschikbaar" + +#: src/slic3r/GUI/UpdateDialogs.cpp:38 +#, c-format +msgid "New version of %s is available" +msgstr "Nieuwe versie van %s beschikbaar" + +#: src/slic3r/GUI/UpdateDialogs.cpp:43 +msgid "Current version:" +msgstr "Huidige versie:" + +#: src/slic3r/GUI/UpdateDialogs.cpp:45 +msgid "New version:" +msgstr "Nieuwe versie:" + +#: src/slic3r/GUI/UpdateDialogs.cpp:53 +msgid "Changelog && Download" +msgstr "Wijzigingslogboek && Download" + +#: src/slic3r/GUI/UpdateDialogs.cpp:60 src/slic3r/GUI/UpdateDialogs.cpp:125 +msgid "Open changelog page" +msgstr "Open wijzigingslogboekpagina" + +#: src/slic3r/GUI/UpdateDialogs.cpp:65 +msgid "Open download page" +msgstr "Open downloadpagina" + +#: src/slic3r/GUI/UpdateDialogs.cpp:71 +msgid "Don't notify about new releases any more" +msgstr "Geef geen meldingen over nieuwe versies meer" + +#: src/slic3r/GUI/UpdateDialogs.cpp:89 src/slic3r/GUI/UpdateDialogs.cpp:205 +msgid "Configuration update" +msgstr "Configuratie-update" + +#: src/slic3r/GUI/UpdateDialogs.cpp:89 +msgid "Configuration update is available" +msgstr "Er is een configuratie-update beschikbaar" + +#: src/slic3r/GUI/UpdateDialogs.cpp:92 +msgid "" +"Would you like to install it?\n" +"\n" +"Note that a full configuration snapshot will be created first. It can then " +"be restored at any time should there be a problem with the new version.\n" +"\n" +"Updated configuration bundles:" +msgstr "" +"Wilt u het installeren?\n" +"\n" +"Er wordt eerst een configuratiesnapshot gemaakt. Deze kan op elk moment " +"hersteld worden en zal geen probleem geven bij nieuwere versies.\n" +"\n" +"Geüpdatete configuratiebundels:" + +#: src/slic3r/GUI/UpdateDialogs.cpp:113 +msgid "Comment:" +msgstr "Opmerking:" + +#: src/slic3r/GUI/UpdateDialogs.cpp:149 +#, c-format +msgid "%s incompatibility" +msgstr "%s incompatibiliteit" + +#: src/slic3r/GUI/UpdateDialogs.cpp:150 +#, c-format +msgid "%s configuration is incompatible" +msgstr "%s configuratie is niet compatibel" + +#: src/slic3r/GUI/UpdateDialogs.cpp:155 +#, c-format +msgid "" +"This version of %s is not compatible with currently installed configuration " +"bundles.\n" +"This probably happened as a result of running an older %s after using a " +"newer one.\n" +"\n" +"You may either exit %s and try again with a newer version, or you may re-run " +"the initial configuration. Doing so will create a backup snapshot of the " +"existing configuration before installing files compatible with this %s." +msgstr "" +"Deze versie van %s is niet compatibel met de huidig geïnstalleerde " +"configuratiebundels.\n" +"Dit kan mogelijk ontstaan als resultaat van het draaien van een ouder %s na " +"het gebruik van een nieuwere.\n" +"\n" +"U kunt kiezen om %s af te sluiten en opnieuw te proberen met een nieuwere " +"versie of de startconfiguratie opnieuw te draaien. In geval van dat laatste " +"wordt een backup-snapshot gemaakt van de bestaande configuratie voor het " +"installeren van bestanden die compatibel zijn met deze %s." + +#: src/slic3r/GUI/UpdateDialogs.cpp:164 +#, c-format +msgid "This %s version: %s" +msgstr "Deze %s versie: %s" + +#: src/slic3r/GUI/UpdateDialogs.cpp:169 +msgid "Incompatible bundles:" +msgstr "Incompatibele bundels:" + +#: src/slic3r/GUI/UpdateDialogs.cpp:185 +#, c-format +msgid "Exit %s" +msgstr "%s afsluiten" + +#: src/slic3r/GUI/UpdateDialogs.cpp:188 +msgid "Re-configure" +msgstr "Herconfigureer" + +#: src/slic3r/GUI/UpdateDialogs.cpp:209 +#, c-format +msgid "" +"%s now uses an updated configuration structure.\n" +"\n" +"So called 'System presets' have been introduced, which hold the built-in " +"default settings for various printers. These System presets cannot be " +"modified, instead, users now may create their own presets inheriting " +"settings from one of the System presets.\n" +"An inheriting preset may either inherit a particular value from its parent " +"or override it with a customized value.\n" +"\n" +"Please proceed with the %s that follows to set up the new presets and to " +"choose whether to enable automatic preset updates." +msgstr "" +"%s gebruikt nu een geüpdatete configuratiestructuur.\n" +"\n" +"Presets van het systeem zijn geïntroduceerd. Deze bevatten ingebouwde " +"standaardinstellingen voor meerdere printers. Deze systemen kunnen niet " +"aangepast worden. In plaats daarvan kunt u nu uw eigen presets creëren op " +"basis van een van de preset.\n" +"Een overgenomen preset kan een bepaalde waarde van bovenliggende " +"instellingen meekrijgen, maar ook overschrijven met een aangepaste waarde.\n" +"\n" +"Ga verdere met de %s die volgt om de nieuwe presets in te stellen en om te " +"kiezen of automatische presets moeten worden ingeschakeld." + +#: src/slic3r/GUI/UpdateDialogs.cpp:225 +msgid "For more information please visit our wiki page:" +msgstr "Voor meer informatie kunt u naar onze wiki-pagina gaan:" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:15 +msgid "Ramming customization" +msgstr "Ramming aanpassen" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:41 +msgid "" +"Ramming denotes the rapid extrusion just before a tool change in a single-" +"extruder MM printer. Its purpose is to properly shape the end of the " +"unloaded filament so it does not prevent insertion of the new filament and " +"can itself be reinserted later. This phase is important and different " +"materials can require different extrusion speeds to get the good shape. For " +"this reason, the extrusion rates during ramming are adjustable.\n" +"\n" +"This is an expert-level setting, incorrect adjustment will likely lead to " +"jams, extruder wheel grinding into filament etc." +msgstr "" +"Ramming wordt gebruikt voor het snel extruderen vlak voor een toolwissel in " +"multi-materialprinters met één extruder. Het doel daarvan is om het einde " +"van het ongeladen filament goed te vormen (zodat het later weer geladen kan " +"worden) en nieuwe filament niet verhinderd wordt. Deze fase is belangrijk. " +"Verschillende materialen vereisen verschillende extrusiesnelheden voor de " +"juiste vorm. Daarom zijn de waarden tijdens de ramming aan te passen.\n" +"\n" +"Dit is een expert-level instelling. Onjuiste aanpassingen kunnen zorgen voor " +"verstoppingen en andere problemen." + +#: src/slic3r/GUI/WipeTowerDialog.cpp:83 +msgid "Total ramming time" +msgstr "Totale ramming-tijd" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:85 +msgid "Total rammed volume" +msgstr "Totaal ramming-volume" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:89 +msgid "Ramming line width" +msgstr "Lijnbreedte voor ramming" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:91 +msgid "Ramming line spacing" +msgstr "Lijnafstand voor ramming" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:142 +msgid "Wipe tower - Purging volume adjustment" +msgstr "Afveegblok - afveegvolume aanpassen" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:254 +msgid "" +"Here you can adjust required purging volume (mm³) for any given pair of " +"tools." +msgstr "" +"Hier kunt u het benodigde afveegvolume (mm³) voor elk soort tool aanpassen." + +#: src/slic3r/GUI/WipeTowerDialog.cpp:255 +msgid "Extruder changed to" +msgstr "Extruder veranderd naar" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:263 +msgid "unloaded" +msgstr "ontladen" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:264 +msgid "loaded" +msgstr "geladen" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:276 +msgid "Tool #" +msgstr "Tool #" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:285 +msgid "" +"Total purging volume is calculated by summing two values below, depending on " +"which tools are loaded/unloaded." +msgstr "" +"Totaal afveegvolume dat de som is van de twee onderstaande waarden, " +"afhankelijk van welke tools zijn geladen/ontladen." + +#: src/slic3r/GUI/WipeTowerDialog.cpp:286 +msgid "Volume to purge (mm³) when the filament is being" +msgstr "Afveegvolume (mm³) als het filament wordt gebruikt" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:300 +msgid "From" +msgstr "Van" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:365 +msgid "" +"Switching to simple settings will discard changes done in the advanced " +"mode!\n" +"\n" +"Do you want to proceed?" +msgstr "" +"Overschakelen naar eenvoudige modus zorgt dat de gewijzigde instellingen uit " +"de geavanceerde modus vervallen!\n" +"\n" +"Weet u zeker dat u wilt doorgaan?" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:377 +msgid "Show simplified settings" +msgstr "Toon eenvoudige instellingen" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:377 +msgid "Show advanced settings" +msgstr "Toon geavanceerde instellingen" + +#: src/slic3r/GUI/wxExtensions.cpp:590 +msgid "Instances" +msgstr "Instanties" + +#: src/slic3r/GUI/wxExtensions.cpp:594 src/slic3r/GUI/wxExtensions.cpp:750 +#, c-format +msgid "Instance %d" +msgstr "Instantie %d" + +#: src/slic3r/GUI/wxExtensions.cpp:628 +msgid "Range" +msgstr "Bereik" + +#: src/slic3r/GUI/wxExtensions.cpp:2325 +msgid "Place bearings in slots and resume" +msgstr "Plaats inserts en ga door" + +#: src/slic3r/GUI/wxExtensions.cpp:3075 +msgid "One layer mode" +msgstr "Een-laags-modus" + +#: src/slic3r/GUI/wxExtensions.cpp:3078 +msgid "Discard all custom changes" +msgstr "Alle aangepaste wijzigingen afwijzen" + +#: src/slic3r/GUI/wxExtensions.cpp:3080 +msgid "Set extruder sequence for whole print" +msgstr "Stel extrudervolgorde in voor de hele print" + +#: src/slic3r/GUI/wxExtensions.cpp:3086 +msgid "For add color change use left mouse button click" +msgstr "Voor het toevoegen van een kleurwissel gebruikt u de linkermuisknop" + +#: src/slic3r/GUI/wxExtensions.cpp:3087 +msgid "For add change extruder use left mouse button click" +msgstr "Voor het toevoegen van een toolwissel gebruikt u de linkermuisknop" + +#: src/slic3r/GUI/wxExtensions.cpp:3088 +msgid "For add another code use right mouse button click" +msgstr "Voor het toevoegen van een andere code gebruikt u de rechtermuisknop" + +#: src/slic3r/GUI/wxExtensions.cpp:3090 +msgid "" +"For Delete color change use left mouse button click\n" +"For Edit color use right mouse button click" +msgstr "" +"Voor het verwijderen van een kleurwissel gebruikt u de linkermuisknop\n" +"Voor het bewerken gebruikt u de rechtermuisknop" + +#: src/slic3r/GUI/wxExtensions.cpp:3092 +msgid "Delete color change for Extruder %1%" +msgstr "Kleurverandering verwijderen voor extruder %1%" + +#: src/slic3r/GUI/wxExtensions.cpp:3095 +msgid "Delete extruder change to \"%1%\"" +msgstr "Extruderwissel verwijderen naar '%1%'" + +#: src/slic3r/GUI/wxExtensions.cpp:3096 +msgid "" +"For Delete \"%1%\" code use left mouse button click\n" +"For Edit \"%1%\" code use right mouse button click" +msgstr "" +"Voor het verwijderen van de '%1%'-code gebruikt u de linkermuisknop\n" +"Voor het bewerken van de '%1%'-code gebruikt u de rechtermuisknop" + +#: src/slic3r/GUI/wxExtensions.cpp:3176 src/slic3r/GUI/wxExtensions.cpp:3432 +msgid "Use another extruder" +msgstr "Gebruik een andere extruder" + +#: src/slic3r/GUI/wxExtensions.cpp:3435 +msgid "Add color change (%1%) for:" +msgstr "Voeg kleurwissel (%1%) toe voor:" + +#: src/slic3r/GUI/wxExtensions.cpp:3441 +msgid "Add color change" +msgstr "Voeg kleurwissel toe" + +#: src/slic3r/GUI/wxExtensions.cpp:3444 +msgid "Add pause print" +msgstr "Voeg printpauze toe" + +#: src/slic3r/GUI/wxExtensions.cpp:3447 +msgid "Add custom G-code" +msgstr "Voeg custom G-code toe" + +#: src/slic3r/GUI/wxExtensions.cpp:3460 +msgid "Edit color" +msgstr "Bewerk kleur" + +#: src/slic3r/GUI/wxExtensions.cpp:3461 +msgid "Edit pause print message" +msgstr "Bewerk printpauze-bericht" + +#: src/slic3r/GUI/wxExtensions.cpp:3462 +msgid "Edit custom G-code" +msgstr "Bewerk custom G-code" + +#: src/slic3r/GUI/wxExtensions.cpp:3465 +msgid "Delete color change" +msgstr "Verwijder kleurwissel" + +#: src/slic3r/GUI/wxExtensions.cpp:3466 +msgid "Delete pause print" +msgstr "Verwijder printpauze" + +#: src/slic3r/GUI/wxExtensions.cpp:3467 +msgid "Delete custom G-code" +msgstr "Verwijder custom G-code" + +#: src/slic3r/GUI/wxExtensions.cpp:3499 +msgid "Enter custom G-code used on current layer" +msgstr "Voer custom G-code in voor de huidige laag" + +#: src/slic3r/GUI/wxExtensions.cpp:3500 +msgid "Custom Gcode on current layer (%1% mm)." +msgstr "Custom G-code op de huidige laag (%1% mm)." + +#: src/slic3r/GUI/wxExtensions.cpp:3513 +msgid "Enter short message shown on Printer display during pause print" +msgstr "" +"Voer kort bericht in dat op het printerscherm wordt getoond tijdens de " +"printpauze" + +#: src/slic3r/GUI/wxExtensions.cpp:3514 +msgid "Message for pause print on current layer (%1% mm)." +msgstr "Kort bericht voor printpauze bij huidige laag (%1% mm)." + +#: src/slic3r/GUI/wxExtensions.cpp:3774 +#, c-format +msgid "Switch to the %s mode" +msgstr "Schakel over naar de %s modus" + +#: src/slic3r/GUI/wxExtensions.cpp:3775 +#, c-format +msgid "Current mode is %s" +msgstr "Huidige modus is: %s" + +#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:23 +msgid "Set extruder sequence" +msgstr "Stel extrudervolgorde in" + +#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:39 +msgid "Set extruder change for every" +msgstr "Stel toolwissel in voor elke" + +#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:52 +#: src/libslic3r/PrintConfig.cpp:341 src/libslic3r/PrintConfig.cpp:983 +#: src/libslic3r/PrintConfig.cpp:1500 src/libslic3r/PrintConfig.cpp:1685 +#: src/libslic3r/PrintConfig.cpp:1746 src/libslic3r/PrintConfig.cpp:1919 +#: src/libslic3r/PrintConfig.cpp:1965 +msgid "layers" +msgstr "lagen" + +#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:136 +msgid "Set extruder(tool) sequence" +msgstr "Stel toolvolgorde in" + +#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:182 +msgid "Remove extruder from sequence" +msgstr "Verwijder extruder uit de reeks" + +#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:192 +msgid "Add extruder to sequence" +msgstr "Voeg extruder toe aan de reeks" + +#: src/slic3r/Utils/Duet.cpp:51 +msgid "Connection to Duet works correctly." +msgstr "Verbinding met Duet werkt naar behoren." + +#: src/slic3r/Utils/Duet.cpp:56 +msgid "Could not connect to Duet" +msgstr "Kan niet verbinden met Duet" + +#: src/slic3r/Utils/Duet.cpp:84 src/slic3r/Utils/Duet.cpp:154 +#: src/slic3r/Utils/FlashAir.cpp:115 src/slic3r/Utils/FlashAir.cpp:132 +msgid "Unknown error occured" +msgstr "Onbekende fout opgetreden" + +#: src/slic3r/Utils/Duet.cpp:148 +msgid "Wrong password" +msgstr "Verkeerd wachtwoord" + +#: src/slic3r/Utils/Duet.cpp:151 +msgid "Could not get resources to create a new connection" +msgstr "Kan geen middelen krijgen om nieuwe verbinding te maken" + +#: src/slic3r/Utils/OctoPrint.cpp:70 +#, c-format +msgid "Mismatched type of print host: %s" +msgstr "Onjuist type printhost: %s" + +#: src/slic3r/Utils/OctoPrint.cpp:85 +msgid "Connection to OctoPrint works correctly." +msgstr "Verbinding met OctoPrint werkt naar behoren." + +#: src/slic3r/Utils/OctoPrint.cpp:91 +msgid "Could not connect to OctoPrint" +msgstr "Kan niet verbinden met OctoPrint" + +#: src/slic3r/Utils/OctoPrint.cpp:91 +msgid "Note: OctoPrint version at least 1.1.0 is required." +msgstr "Let op: de minimaal vereiste versie van OctoPrint is 1.1.0." + +#: src/slic3r/Utils/OctoPrint.cpp:196 +msgid "Connection to Prusa SL1 works correctly." +msgstr "Verbinding met Prusa SL1 werkt naar behoren." + +#: src/slic3r/Utils/OctoPrint.cpp:201 +msgid "Could not connect to Prusa SLA" +msgstr "Kan niet verbinden met Prusa SLA" + +#: src/slic3r/Utils/FlashAir.cpp:60 +msgid "Upload not enabled on FlashAir card." +msgstr "Uploaden naar een FlashAir-kaart niet toegestaan." + +#: src/slic3r/Utils/FlashAir.cpp:70 +msgid "Connection to FlashAir works correctly and upload is enabled." +msgstr "Verbinding met FlashAir werkt naar behoren en uploaden is toegestaan." + +#: src/slic3r/Utils/FlashAir.cpp:75 +msgid "Could not connect to FlashAir" +msgstr "Kan niet verbinden met FlashAir" + +#: src/slic3r/Utils/FlashAir.cpp:75 +msgid "" +"Note: FlashAir with firmware 2.00.02 or newer and activated upload function " +"is required." +msgstr "" +"Let op: FlashAir met firmware 2.00.02 (of nieuwer) en een geactiveerde " +"upload zijn vereist." + +#: src/slic3r/Utils/PresetUpdater.cpp:632 +#, c-format +msgid "requires min. %s and max. %s" +msgstr "vereist minimaal %s en maximaal %s" + +#: src/slic3r/Utils/PresetUpdater.cpp:637 +#, c-format +msgid "requires min. %s" +msgstr "vereist minimaal %s" + +#: src/slic3r/Utils/PresetUpdater.cpp:639 +#, c-format +msgid "requires max. %s" +msgstr "vereist maximaal %s" + +#: src/slic3r/Utils/FixModelByWin10.cpp:219 +#: src/slic3r/Utils/FixModelByWin10.cpp:359 +msgid "Exporting source model" +msgstr "Exporteer bronmodel" + +#: src/slic3r/Utils/FixModelByWin10.cpp:235 +msgid "Failed loading the input model." +msgstr "Laden van het model mislukt." + +#: src/slic3r/Utils/FixModelByWin10.cpp:242 +msgid "Repairing model by the Netfabb service" +msgstr "Repareer model met de NetFabb-service" + +#: src/slic3r/Utils/FixModelByWin10.cpp:248 +msgid "Mesh repair failed." +msgstr "Mesh-reparatie mislukt." + +#: src/slic3r/Utils/FixModelByWin10.cpp:251 +#: src/slic3r/Utils/FixModelByWin10.cpp:378 +msgid "Loading repaired model" +msgstr "Gerepareerd model aan het laden" + +#: src/slic3r/Utils/FixModelByWin10.cpp:263 +#: src/slic3r/Utils/FixModelByWin10.cpp:270 +#: src/slic3r/Utils/FixModelByWin10.cpp:302 +msgid "Saving mesh into the 3MF container failed." +msgstr "Opslaan van mesh in 3MF-container mislukt." + +#: src/slic3r/Utils/FixModelByWin10.cpp:340 +msgid "Model fixing" +msgstr "Model repareren" + +#: src/slic3r/Utils/FixModelByWin10.cpp:341 +msgid "Exporting model..." +msgstr "Model exporteren..." + +#: src/slic3r/Utils/FixModelByWin10.cpp:368 +msgid "Export of a temporary 3mf file failed" +msgstr "Exporteren van tijdelijk 3MF-bestand mislukt" + +#: src/slic3r/Utils/FixModelByWin10.cpp:383 +msgid "Import of the repaired 3mf file failed" +msgstr "Importeren van het gerepareerde 3MF-bestand mislukt" + +#: src/slic3r/Utils/FixModelByWin10.cpp:385 +msgid "Repaired 3MF file does not contain any object" +msgstr "Gerepareerd 3MF-bestand bevat geen object" + +#: src/slic3r/Utils/FixModelByWin10.cpp:387 +msgid "Repaired 3MF file contains more than one object" +msgstr "Gerepareerd 3MF-bestand bevat meer dan 1 object" + +#: src/slic3r/Utils/FixModelByWin10.cpp:389 +msgid "Repaired 3MF file does not contain any volume" +msgstr "Gerepareerd 3MF-bestand bevat geen volume" + +#: src/slic3r/Utils/FixModelByWin10.cpp:391 +msgid "Repaired 3MF file contains more than one volume" +msgstr "Gerepareerd 3MF-bestand bevat meer dan 1 volume" + +#: src/slic3r/Utils/FixModelByWin10.cpp:400 +msgid "Model repair finished" +msgstr "Model repareren voltooid" + +#: src/slic3r/Utils/FixModelByWin10.cpp:406 +msgid "Model repair canceled" +msgstr "Model repareren geannuleerd" + +#: src/slic3r/Utils/FixModelByWin10.cpp:423 +msgid "Model repaired successfully" +msgstr "Model repareren was succesvol" + +#: src/slic3r/Utils/FixModelByWin10.cpp:423 +#: src/slic3r/Utils/FixModelByWin10.cpp:426 +msgid "Model Repair by the Netfabb service" +msgstr "Model repareren met de NetFabb-service" + +#: src/slic3r/Utils/FixModelByWin10.cpp:426 +msgid "Model repair failed:" +msgstr "Model repareren mislukt:" + +#: src/libslic3r/SLA/SLAPad.cpp:690 +msgid "Pad brim size is too small for the current configuration." +msgstr "Brimgrootte is te klein voor de huidige configuratie." + +#: src/libslic3r/Zipper.cpp:32 +msgid "undefined error" +msgstr "onbekende fout" + +#: src/libslic3r/Zipper.cpp:34 +msgid "too many files" +msgstr "te veel bestanden" + +#: src/libslic3r/Zipper.cpp:36 +msgid "file too large" +msgstr "bestand te groot" + +#: src/libslic3r/Zipper.cpp:38 +msgid "unsupported method" +msgstr "niet-ondersteunde methode" + +#: src/libslic3r/Zipper.cpp:40 +msgid "unsupported encryption" +msgstr "niet-ondersteunde encryptie" + +#: src/libslic3r/Zipper.cpp:42 +msgid "unsupported feature" +msgstr "niet-ondersteunde optie" + +#: src/libslic3r/Zipper.cpp:44 +msgid "failed finding central directory" +msgstr "centrale map niet gevonden" + +#: src/libslic3r/Zipper.cpp:46 +msgid "not a ZIP archive" +msgstr "geen ZIP-archief" + +#: src/libslic3r/Zipper.cpp:48 +msgid "invalid header or archive is corrupted" +msgstr "ongeldige koptekst of het archief is beschadigd" + +#: src/libslic3r/Zipper.cpp:50 +msgid "unsupported multidisk archive" +msgstr "niet-ondersteund multi-disk archief" + +#: src/libslic3r/Zipper.cpp:52 +msgid "decompression failed or archive is corrupted" +msgstr "decompressie mislukt of archief is beschadigd" + +#: src/libslic3r/Zipper.cpp:54 +msgid "compression failed" +msgstr "compressie mislukt" + +#: src/libslic3r/Zipper.cpp:56 +msgid "unexpected decompressed size" +msgstr "onverwachte gedecomprimeerde grootte" + +#: src/libslic3r/Zipper.cpp:58 +msgid "CRC-32 check failed" +msgstr "CRC-32 check mislukt" + +#: src/libslic3r/Zipper.cpp:60 +msgid "unsupported central directory size" +msgstr "niet-ondersteunde centrale mapgrootte" + +#: src/libslic3r/Zipper.cpp:62 +msgid "allocation failed" +msgstr "toewijzing mislukt" + +#: src/libslic3r/Zipper.cpp:64 +msgid "file open failed" +msgstr "bestand openen mislukt" + +#: src/libslic3r/Zipper.cpp:66 +msgid "file create failed" +msgstr "bestand creëren mislukt" + +#: src/libslic3r/Zipper.cpp:68 +msgid "file write failed" +msgstr "bestand schrijven mislukt" + +#: src/libslic3r/Zipper.cpp:70 +msgid "file read failed" +msgstr "bestand lezen mislukt" + +#: src/libslic3r/Zipper.cpp:72 +msgid "file close failed" +msgstr "bestand sluiten mislukt" + +#: src/libslic3r/Zipper.cpp:74 +msgid "file seek failed" +msgstr "bestand zoeken mislukt" + +#: src/libslic3r/Zipper.cpp:76 +msgid "file stat failed" +msgstr "bestandsstatus mislukt" + +#: src/libslic3r/Zipper.cpp:78 +msgid "invalid parameter" +msgstr "ongeldige parameter" + +#: src/libslic3r/Zipper.cpp:80 +msgid "invalid filename" +msgstr "ongeldige bestandsnaam" + +#: src/libslic3r/Zipper.cpp:82 +msgid "buffer too small" +msgstr "buffer te klein" + +#: src/libslic3r/Zipper.cpp:84 +msgid "internal error" +msgstr "interne fout" + +#: src/libslic3r/Zipper.cpp:86 +msgid "file not found" +msgstr "bestand niet gevonden" + +#: src/libslic3r/Zipper.cpp:88 +msgid "archive is too large" +msgstr "archief te groot" + +#: src/libslic3r/Zipper.cpp:90 +msgid "validation failed" +msgstr "validatie mislukt" + +#: src/libslic3r/Zipper.cpp:92 +msgid "write calledback failed" +msgstr "terugschrijven mislukt" + +#: src/libslic3r/Zipper.cpp:102 +msgid "Error with zip archive" +msgstr "Fout bij ZIP-archief" + +#: src/libslic3r/GCode.cpp:633 +msgid "Empty layers detected, the output would not be printable." +msgstr "Lege lagen gedetecteerd. De output is mogelijk niet-printbaar." + +#: src/libslic3r/GCode.cpp:634 +msgid "Print z" +msgstr "Print Z" + +#: src/libslic3r/GCode.cpp:635 +msgid "" +"This is usually caused by negligibly small extrusions or by a faulty model. " +"Try to repair the model or change its orientation on the bed." +msgstr "" +"Dit komt meestal voor bij verwaarloosbare extrusiehoeveelheden of door een " +"foutief model. Probeer het model te repareren of verander de oriëntatie." + +#: src/libslic3r/ExtrusionEntity.cpp:323 +msgid "Mixed" +msgstr "Gemengd" + +#: src/libslic3r/Format/3mf.cpp:1519 +msgid "" +"The selected 3mf file has been saved with a newer version of %1% and is not " +"compatible." +msgstr "" +"Het geselecteerde 3MF-bestand is opgeslagen in een nieuwere versie van %1% " +"en is niet compatibel." + +#: src/libslic3r/Format/AMF.cpp:917 +msgid "" +"The selected amf file has been saved with a newer version of %1% and is not " +"compatible." +msgstr "" +"Het geselecteerde AMF-bestand is opgeslagen in een nieuwere versie van %1% " +"en is niet compatibel." + +#: src/libslic3r/Print.cpp:1168 +msgid "All objects are outside of the print volume." +msgstr "Alle objecten bevinden zich buiten het printvolume." + +#: src/libslic3r/Print.cpp:1171 +msgid "The supplied settings will cause an empty print." +msgstr "De ingevoerde instellingen resulteren in een lege print." + +#: src/libslic3r/Print.cpp:1198 +msgid "Some objects are too close; your extruder will collide with them." +msgstr "" +"Sommige objecten staan te dicht op elkaar. De extruder zal er tegenaan " +"botsen." + +#: src/libslic3r/Print.cpp:1213 +msgid "" +"Some objects are too tall and cannot be printed without extruder collisions." +msgstr "" +"Sommige objecten zijn te groot en kunnen niet geprint worden zonder " +"botsingen." + +#: src/libslic3r/Print.cpp:1223 +msgid "The Spiral Vase option can only be used when printing a single object." +msgstr "De spiraalmodus kan alleen gebruikt worden voor enkeldelige objecten." + +#: src/libslic3r/Print.cpp:1230 +msgid "" +"The Spiral Vase option can only be used when printing single material " +"objects." +msgstr "" +"De spiraalmodus kan alleen gebruikt worden met enkel-materiaal objecten." + +#: src/libslic3r/Print.cpp:1243 +msgid "" +"The wipe tower is only supported if all extruders have the same nozzle " +"diameter and use filaments of the same diameter." +msgstr "" +"Het afveegblok wordt alleen ondersteunt als alle extruders dezelfde nozzle- " +"en filamentdiameter hebben." + +#: src/libslic3r/Print.cpp:1248 +msgid "" +"The Wipe Tower is currently only supported for the Marlin, RepRap/Sprinter " +"and Repetier G-code flavors." +msgstr "" +"Het afveegblok wordt alleen ondersteunt in Marlin, RepRap/Sprinter en " +"Repetier G-code-soorten." + +#: src/libslic3r/Print.cpp:1250 +msgid "" +"The Wipe Tower is currently only supported with the relative extruder " +"addressing (use_relative_e_distances=1)." +msgstr "" +"Het afveegblok wordt alleen ondersteunt met de relatieve extruderinstelling " +"('use_relative_e_distances' = 1)." + +#: src/libslic3r/Print.cpp:1252 +msgid "Ooze prevention is currently not supported with the wipe tower enabled." +msgstr "" +"Druippreventie wordt niet ondersteund als het afveegblok is geactiveerd." + +#: src/libslic3r/Print.cpp:1254 +msgid "" +"The Wipe Tower currently does not support volumetric E (use_volumetric_e=0)." +msgstr "" +"Het afveegblok niet ondersteunt bij volumetrische extrusiewaarden " +"('use_volumetric_e' = 0)." + +#: src/libslic3r/Print.cpp:1275 +msgid "" +"The Wipe Tower is only supported for multiple objects if they have equal " +"layer heights" +msgstr "" +"Het afveegblok wordt alleen ondersteunt voor meerdere objecten als deze een " +"gelijke laagdikte hebben" + +#: src/libslic3r/Print.cpp:1277 +msgid "" +"The Wipe Tower is only supported for multiple objects if they are printed " +"over an equal number of raft layers" +msgstr "" +"Het afveegblok wordt alleen ondersteunt voor meerdere objecten als deze op " +"een gelijk aantal raftlagen zijn geplaatst" + +#: src/libslic3r/Print.cpp:1279 +msgid "" +"The Wipe Tower is only supported for multiple objects if they are printed " +"with the same support_material_contact_distance" +msgstr "" +"Het afveegblok wordt alleen ondersteunt voor meerdere objecten als de " +"instelling 'support_material_contact_distance' gelijk staat" + +#: src/libslic3r/Print.cpp:1281 +msgid "" +"The Wipe Tower is only supported for multiple objects if they are sliced " +"equally." +msgstr "" +"Het afveegblok wordt alleen ondersteunt voor meerdere objecten als ze " +"tegelijk gesliced worden." + +#: src/libslic3r/Print.cpp:1323 +msgid "" +"The Wipe tower is only supported if all objects have the same variable layer " +"height" +msgstr "" +"Het afveegblok wordt alleen ondersteunt als alle objecten dezelfde variabele " +"laagdikte hebben" + +#: src/libslic3r/Print.cpp:1349 +msgid "" +"One or more object were assigned an extruder that the printer does not have." +msgstr "" +"Een of meer objecten staan ingesteld op een extruder die de printer niet " +"heeft." + +#: src/libslic3r/Print.cpp:1358 +msgid "%1%=%2% mm is too low to be printable at a layer height %3% mm" +msgstr "%1%=%2% mm is te weinig om te printen bij een laagdikte van %3% mm" + +#: src/libslic3r/Print.cpp:1361 +msgid "Excessive %1%=%2% mm to be printable with a nozzle diameter %3% mm" +msgstr "Te veel %1%=%2% mm om te printen met een nozzlediameter van %3% mm" + +#: src/libslic3r/Print.cpp:1372 +msgid "" +"Printing with multiple extruders of differing nozzle diameters. If support " +"is to be printed with the current extruder (support_material_extruder == 0 " +"or support_material_interface_extruder == 0), all nozzles have to be of the " +"same diameter." +msgstr "" +"Printen met meerdere extruders met verschillende nozzlediameters. Als " +"support met de huidige extruder geprint moet worden, moeten alle nozzles " +"dezelfde diameter hebben ('support_material_extruder' = 0 of " +"'support_material_interface_extruder' = 0)." + +#: src/libslic3r/Print.cpp:1380 +msgid "" +"For the Wipe Tower to work with the soluble supports, the support layers " +"need to be synchronized with the object layers." +msgstr "" +"Om het afveegblok te laten samenwerken met oplosbare support, moeten de " +"supportlagen gesynchroniseerd worden met de objectlagen." + +#: src/libslic3r/Print.cpp:1384 +msgid "" +"The Wipe Tower currently supports the non-soluble supports only if they are " +"printed with the current extruder without triggering a tool change. (both " +"support_material_extruder and support_material_interface_extruder need to be " +"set to 0)." +msgstr "" +"Het afveegblok ondersteunt alleen niet-oplosbaar support als dat geprint " +"worden met de huidige extruder zonder toolwissel (Zet zowel " +"'support_material_extruder' en 'support_material_interface_extruder' op 0)." + +#: src/libslic3r/Print.cpp:1406 +msgid "First layer height can't be greater than nozzle diameter" +msgstr "" +"Laagdikte van de eerste laag kan niet groter zijn dan de nozzlediameter" + +#: src/libslic3r/Print.cpp:1411 +msgid "Layer height can't be greater than nozzle diameter" +msgstr "Laagdikte kan niet groter zijn dan de nozzlediameter" + +#: src/libslic3r/Print.cpp:1566 +msgid "Infilling layers" +msgstr "Vullingslagen" + +#: src/libslic3r/Print.cpp:1582 +msgid "Generating skirt" +msgstr "Skirt genereren" + +#: src/libslic3r/Print.cpp:1590 +msgid "Generating brim" +msgstr "Brim genereren" + +#: src/libslic3r/Print.cpp:1614 +msgid "Exporting G-code" +msgstr "G-code exporteren" + +#: src/libslic3r/Print.cpp:1618 +msgid "Generating G-code" +msgstr "G-code genereren" + +#: src/libslic3r/SLAPrint.cpp:66 +msgid "Slicing model" +msgstr "Model slicen" + +#: src/libslic3r/SLAPrint.cpp:67 src/libslic3r/SLAPrint.cpp:905 +msgid "Generating support points" +msgstr "Supportpunten genereren" + +#: src/libslic3r/SLAPrint.cpp:68 +msgid "Generating support tree" +msgstr "Supportboom genereren" + +#: src/libslic3r/SLAPrint.cpp:69 +msgid "Generating pad" +msgstr "Basisplaat genereren" + +#: src/libslic3r/SLAPrint.cpp:70 +msgid "Slicing supports" +msgstr "Support slicen" + +#: src/libslic3r/SLAPrint.cpp:87 +msgid "Merging slices and calculating statistics" +msgstr "Slices samenvoegen en statistieken berekenen" + +#: src/libslic3r/SLAPrint.cpp:88 +msgid "Rasterizing layers" +msgstr "Lagen roosteren" + +#: src/libslic3r/SLAPrint.cpp:670 +msgid "" +"Cannot proceed without support points! Add support points or disable support " +"generation." +msgstr "" +"Kan niet doorgaan zonder supportpunten! Voeg supportpunten toe of schakel " +"supportgeneratie uit." + +#: src/libslic3r/SLAPrint.cpp:682 +msgid "" +"Elevation is too low for object. Use the \"Pad around object\" feature to " +"print the object without elevation." +msgstr "" +"Verhoging is te klein voor het object. Gebruik de 'Basisplaat rondom object'-" +"optie om het object zonder verhoging te printen." + +#: src/libslic3r/SLAPrint.cpp:688 +msgid "" +"The endings of the support pillars will be deployed on the gap between the " +"object and the pad. 'Support base safety distance' has to be greater than " +"the 'Pad object gap' parameter to avoid this." +msgstr "" +"De uiteinden van de pijlers worden ingezet op de gaten tussen het object en " +"de basisplaat. De instelling 'Veilige afstand voor supportbasis' moet groter " +"zijn dan de 'Basisplaat-objectgat'-parameter hiervoor." + +#: src/libslic3r/SLAPrint.cpp:703 +msgid "Exposition time is out of printer profile bounds." +msgstr "De belichtingstijd valt buiten de grenzen van het printerprofiel." + +#: src/libslic3r/SLAPrint.cpp:710 +msgid "Initial exposition time is out of printer profile bounds." +msgstr "Initiële belichtingstijd valt buiten de printerprofielgrenzen." + +#: src/libslic3r/SLAPrint.cpp:794 +msgid "" +"Slicing had to be stopped due to an internal error: Inconsistent slice index." +msgstr "" +"Slicen moest gestopt worden door een interne fout: inconsistente slice-index." + +#: src/libslic3r/SLAPrint.cpp:964 src/libslic3r/SLAPrint.cpp:973 +#: src/libslic3r/SLAPrint.cpp:1018 +msgid "Visualizing supports" +msgstr "Visualiseer support" + +#: src/libslic3r/SLAPrint.cpp:1009 +msgid "No pad can be generated for this model with the current configuration" +msgstr "" +"Met de huidige configuratie kan voor dit model geen basisplaat gegenereerd " +"worden" + +#: src/libslic3r/SLAPrint.cpp:1554 +msgid "Slicing done" +msgstr "Slicen voltooid" + +#: src/libslic3r/PrintBase.cpp:71 +msgid "Failed processing of the output_filename_format template." +msgstr "Verwerken van de 'output_filename_format'-template mislukt." + +#: src/libslic3r/PrintConfig.cpp:43 src/libslic3r/PrintConfig.cpp:44 +msgid "Printer technology" +msgstr "Printertechnologie" + +#: src/libslic3r/PrintConfig.cpp:51 +msgid "Bed shape" +msgstr "Bedvorm" + +#: src/libslic3r/PrintConfig.cpp:56 +msgid "Bed custom texture" +msgstr "Custom bedtextuur" + +#: src/libslic3r/PrintConfig.cpp:61 +msgid "Bed custom model" +msgstr "Custom bedmodel" + +#: src/libslic3r/PrintConfig.cpp:66 +msgid "Picture sizes to be stored into a .gcode and .sl1 files" +msgstr "Afbeeldingsgrootte om op te slaan in gcode- en SL1-bestanden" + +#: src/libslic3r/PrintConfig.cpp:73 +msgid "" +"This setting controls the height (and thus the total number) of the slices/" +"layers. Thinner layers give better accuracy but take more time to print." +msgstr "" +"Deze instelling is voor de laagdikte (en dus het totaal aantal lagen). " +"Dunnere lagen geven een betere nauwkeurigheid, maar het printen duurt langer." + +#: src/libslic3r/PrintConfig.cpp:80 +msgid "Max print height" +msgstr "Maximale printhoogte" + +#: src/libslic3r/PrintConfig.cpp:81 +msgid "" +"Set this to the maximum height that can be reached by your extruder while " +"printing." +msgstr "" +"Stel dit in als maximale hoogte die bereikt kan worden door de printer." + +#: src/libslic3r/PrintConfig.cpp:87 +msgid "Slice gap closing radius" +msgstr "Gatvulradius" + +#: src/libslic3r/PrintConfig.cpp:89 +msgid "" +"Cracks smaller than 2x gap closing radius are being filled during the " +"triangle mesh slicing. The gap closing operation may reduce the final print " +"resolution, therefore it is advisable to keep the value reasonably low." +msgstr "" +"Gaten die kleiner zijn dan tweemaal de gatvulradius worden opgevuld tijdens " +"het slicen. Het vullen kan zorgen dat de printresolutie minder wordt. Daarom " +"wordt geadviseerd de waarde laag te houden." + +#: src/libslic3r/PrintConfig.cpp:97 +msgid "Hostname, IP or URL" +msgstr "Hostnaam, IP of URL" + +#: src/libslic3r/PrintConfig.cpp:98 +msgid "" +"Slic3r can upload G-code files to a printer host. This field should contain " +"the hostname, IP address or URL of the printer host instance." +msgstr "" +"PrusaSlicer kan gcode-bestanden naar een printerhost uploaden. Dit veld moet " +"de hostnaam, IP-adres of URL van de printerhostomgeving bevatten." + +#: src/libslic3r/PrintConfig.cpp:104 +msgid "API Key / Password" +msgstr "API-key / wachtwoord" + +#: src/libslic3r/PrintConfig.cpp:105 +msgid "" +"Slic3r can upload G-code files to a printer host. This field should contain " +"the API Key or the password required for authentication." +msgstr "" +"PrusaSlicer kan gcode-bestanden naar een printerhost uploaden. Dit veld moet " +"de API-key of het wachtwoord voor authenticatie bevatten." + +#: src/libslic3r/PrintConfig.cpp:111 +msgid "HTTPS CA File" +msgstr "HTTPS-CA-bestand" + +#: src/libslic3r/PrintConfig.cpp:112 +msgid "" +"Custom CA certificate file can be specified for HTTPS OctoPrint connections, " +"in crt/pem format. If left blank, the default OS CA certificate repository " +"is used." +msgstr "" +"Aangepast CA-certificaatbestand kan gespecificeerd worden voor HTTPS-" +"OctoPrint verbindingen in CRT/PEM-formaat. Als er niets wordt ingevuld, " +"wordt de standaard OS-CA-certificaatopslaglocatie gebruikt." + +#: src/libslic3r/PrintConfig.cpp:126 +msgid "Avoid crossing perimeters" +msgstr "Vermijd kruisende perimeters" + +#: src/libslic3r/PrintConfig.cpp:127 +msgid "" +"Optimize travel moves in order to minimize the crossing of perimeters. This " +"is mostly useful with Bowden extruders which suffer from oozing. This " +"feature slows down both the print and the G-code generation." +msgstr "" +"Optimaliseer de bewegingen om kruisende perimeters te minimaliseren. Dit is " +"handig bij Bowden-extruders die gevoelig zijn voor druipen. Deze aanpassing " +"vertraagd zowel de print als de G-code-generatie." + +#: src/libslic3r/PrintConfig.cpp:134 src/libslic3r/PrintConfig.cpp:2053 +msgid "Other layers" +msgstr "Overige lagen" + +#: src/libslic3r/PrintConfig.cpp:135 +msgid "" +"Bed temperature for layers after the first one. Set this to zero to disable " +"bed temperature control commands in the output." +msgstr "" +"Bedtemperatuur voor lagen na de eerste laag. Als dit ingesteld is op 0, " +"worden bedverwarmingscommando's uitgezet." + +#: src/libslic3r/PrintConfig.cpp:137 +msgid "Bed temperature" +msgstr "Bedtemperatuur" + +#: src/libslic3r/PrintConfig.cpp:144 +msgid "" +"This custom code is inserted at every layer change, right before the Z move. " +"Note that you can use placeholder variables for all Slic3r settings as well " +"as [layer_num] and [layer_z]." +msgstr "" +"Deze custom code wordt toegevoegd bij elke laagwisseling, vlak voor de Z-" +"beweging. U kunt hier variabelen gebruiken voor alle instellingen zoals " +"'layer_num' en 'layer_z'." + +#: src/libslic3r/PrintConfig.cpp:154 +msgid "Between objects G-code" +msgstr "G-code die komt tussen objecten" + +#: src/libslic3r/PrintConfig.cpp:155 +msgid "" +"This code is inserted between objects when using sequential printing. By " +"default extruder and bed temperature are reset using non-wait command; " +"however if M104, M109, M140 or M190 are detected in this custom code, Slic3r " +"will not add temperature commands. Note that you can use placeholder " +"variables for all Slic3r settings, so you can put a \"M109 " +"S[first_layer_temperature]\" command wherever you want." +msgstr "" +"Deze code wordt ingevoegd tussen objecten bij het achtereenvolgens printen. " +"Standaard worden de extruder- en bedtemperatuur gereset met een wacht-niet-" +"commando, hoewel, als M104, M109, M140 of M190 in de custom code worden " +"gedetecteerd zal PrusaSlicer deze commando's niet meenemen. Merk op dat " +"variabelen voor alle instellingen gebruikt kunnen worden." + +#: src/libslic3r/PrintConfig.cpp:166 +msgid "Number of solid layers to generate on bottom surfaces." +msgstr "Aantal te genereren dichte lagen voor bodemvlakken." + +#: src/libslic3r/PrintConfig.cpp:167 +msgid "Bottom solid layers" +msgstr "Dichte bodemlagen" + +#: src/libslic3r/PrintConfig.cpp:172 +msgid "Bridge" +msgstr "Brug" + +#: src/libslic3r/PrintConfig.cpp:173 +msgid "" +"This is the acceleration your printer will use for bridges. Set zero to " +"disable acceleration control for bridges." +msgstr "" +"Deze acceleratie zal uw printer gebruiken voor bruggen. Als dit ingesteld is " +"op 0, wordt de acceleratie-instelling voor bruggen uitgezet." + +#: src/libslic3r/PrintConfig.cpp:175 src/libslic3r/PrintConfig.cpp:318 +#: src/libslic3r/PrintConfig.cpp:851 src/libslic3r/PrintConfig.cpp:973 +#: src/libslic3r/PrintConfig.cpp:1143 src/libslic3r/PrintConfig.cpp:1196 +#: src/libslic3r/PrintConfig.cpp:1207 src/libslic3r/PrintConfig.cpp:1398 +msgid "mm/s²" +msgstr "mm/s²" + +#: src/libslic3r/PrintConfig.cpp:181 +msgid "Bridging angle" +msgstr "Brughoek" + +#: src/libslic3r/PrintConfig.cpp:183 +msgid "" +"Bridging angle override. If left to zero, the bridging angle will be " +"calculated automatically. Otherwise the provided angle will be used for all " +"bridges. Use 180° for zero angle." +msgstr "" +"Brughoek overschrijven. Als dit ingesteld is op 0, wordt de optimale hoek " +"automatisch berekend, anders wordt de opgegeven hoek voor alle bruggen " +"gebruikt. 180° staat gelijk aan 0°." + +#: src/libslic3r/PrintConfig.cpp:186 src/libslic3r/PrintConfig.cpp:769 +#: src/libslic3r/PrintConfig.cpp:1635 src/libslic3r/PrintConfig.cpp:1645 +#: src/libslic3r/PrintConfig.cpp:1883 src/libslic3r/PrintConfig.cpp:2038 +#: src/libslic3r/PrintConfig.cpp:2224 src/libslic3r/PrintConfig.cpp:2695 +#: src/libslic3r/PrintConfig.cpp:2816 +msgid "°" +msgstr "°" + +#: src/libslic3r/PrintConfig.cpp:192 +msgid "Bridges fan speed" +msgstr "Ventilatorsnelheid voor bruggen" + +#: src/libslic3r/PrintConfig.cpp:193 +msgid "This fan speed is enforced during all bridges and overhangs." +msgstr "Deze ventilatorsnelheid wordt aangehouden bij bruggen en overhanging." + +#: src/libslic3r/PrintConfig.cpp:194 src/libslic3r/PrintConfig.cpp:781 +#: src/libslic3r/PrintConfig.cpp:1216 src/libslic3r/PrintConfig.cpp:1279 +#: src/libslic3r/PrintConfig.cpp:1527 src/libslic3r/PrintConfig.cpp:2402 +#: src/libslic3r/PrintConfig.cpp:2735 +msgid "%" +msgstr "%" + +#: src/libslic3r/PrintConfig.cpp:201 +msgid "Bridge flow ratio" +msgstr "Brugextrusieverhouding" + +#: src/libslic3r/PrintConfig.cpp:203 +msgid "" +"This factor affects the amount of plastic for bridging. You can decrease it " +"slightly to pull the extrudates and prevent sagging, although default " +"settings are usually good and you should experiment with cooling (use a fan) " +"before tweaking this." +msgstr "" +"Deze factor beïnvloedt de hoeveelheid plastic voor bruggen. Deze kan " +"verlaagd worden om het extrudaat strak te trekken en doorzakking te " +"voorkomen. Hoewel de systeemwaarden goed zijn, kan geëxperimenteerd worden " +"met de koeling voor dit aangepast wordt." + +#: src/libslic3r/PrintConfig.cpp:213 +msgid "Bridges" +msgstr "Bruggen" + +#: src/libslic3r/PrintConfig.cpp:215 +msgid "Speed for printing bridges." +msgstr "Printsnelheid voor bruggen." + +#: src/libslic3r/PrintConfig.cpp:216 src/libslic3r/PrintConfig.cpp:599 +#: src/libslic3r/PrintConfig.cpp:607 src/libslic3r/PrintConfig.cpp:616 +#: src/libslic3r/PrintConfig.cpp:624 src/libslic3r/PrintConfig.cpp:651 +#: src/libslic3r/PrintConfig.cpp:670 src/libslic3r/PrintConfig.cpp:911 +#: src/libslic3r/PrintConfig.cpp:1039 src/libslic3r/PrintConfig.cpp:1125 +#: src/libslic3r/PrintConfig.cpp:1161 src/libslic3r/PrintConfig.cpp:1174 +#: src/libslic3r/PrintConfig.cpp:1185 src/libslic3r/PrintConfig.cpp:1238 +#: src/libslic3r/PrintConfig.cpp:1297 src/libslic3r/PrintConfig.cpp:1428 +#: src/libslic3r/PrintConfig.cpp:1602 src/libslic3r/PrintConfig.cpp:1611 +#: src/libslic3r/PrintConfig.cpp:2017 src/libslic3r/PrintConfig.cpp:2131 +msgid "mm/s" +msgstr "mm/s" + +#: src/libslic3r/PrintConfig.cpp:223 +msgid "Brim width" +msgstr "Breedte van de brim" + +#: src/libslic3r/PrintConfig.cpp:224 +msgid "" +"Horizontal width of the brim that will be printed around each object on the " +"first layer." +msgstr "" +"Horizontale breedte van de brim die rond elk object op de eerste laag wordt " +"geprint." + +#: src/libslic3r/PrintConfig.cpp:231 +msgid "Clip multi-part objects" +msgstr "Meerdelige objecten samenvoegen" + +#: src/libslic3r/PrintConfig.cpp:232 +msgid "" +"When printing multi-material objects, this settings will make Slic3r to clip " +"the overlapping object parts one by the other (2nd part will be clipped by " +"the 1st, 3rd part will be clipped by the 1st and 2nd etc)." +msgstr "" +"Als meerdere multi-materialobjecten worden geprint, zorgt deze instelling " +"dat PrusaSlicer de overlappende delen met de vorige in de reeks combineert " +"(2e deel wordt gecombineerd met het 1e, 3e deel met het 1e en 2e, etc)." + +#: src/libslic3r/PrintConfig.cpp:239 +msgid "Colorprint height" +msgstr "Kleurenprinthoogte" + +#: src/libslic3r/PrintConfig.cpp:240 +msgid "Heights at which a filament change is to occur." +msgstr "Hoogte waarbij de filamentwissel plaatsvindt." + +#: src/libslic3r/PrintConfig.cpp:250 +msgid "Compatible printers condition" +msgstr "Voorwaarden compatibele printers" + +#: src/libslic3r/PrintConfig.cpp:251 +msgid "" +"A boolean expression using the configuration values of an active printer " +"profile. If this expression evaluates to true, this profile is considered " +"compatible with the active printer profile." +msgstr "" +"Een waar/niet waar aanduiding die gebruik maakt van configuratiewaarden van " +"een actief printerprofiel. Als deze aanduiding op waar staat, wordt dit " +"profiel beschouwd als compatibel met het actieve printerprofiel." + +#: src/libslic3r/PrintConfig.cpp:265 +msgid "Compatible print profiles condition" +msgstr "Voorwaarden compatibele printprofielen" + +#: src/libslic3r/PrintConfig.cpp:266 +msgid "" +"A boolean expression using the configuration values of an active print " +"profile. If this expression evaluates to true, this profile is considered " +"compatible with the active print profile." +msgstr "" +"Een waar/niet waar aanduiding die gebruik maakt van configuratiewaarden van " +"een actief printprofiel. Als deze aanduiding op waar staat, wordt dit " +"profiel beschouwd als compatibel met het actieve printprofiel." + +#: src/libslic3r/PrintConfig.cpp:283 +msgid "Complete individual objects" +msgstr "Voltooi individuele objecten" + +#: src/libslic3r/PrintConfig.cpp:284 +msgid "" +"When printing multiple objects or copies, this feature will complete each " +"object before moving onto next one (and starting it from its bottom layer). " +"This feature is useful to avoid the risk of ruined prints. Slic3r should " +"warn and prevent you from extruder collisions, but beware." +msgstr "" +"Als meerdere objecten geprint worden, zorgt deze optie dat de objecten " +"afzonderlijk voltooid worden voordat bewogen wordt naar de volgende. " +"PrusaSlicer voorkomt botsingen van de extruder tegen eerder geprinte " +"objecten en zal u daar ook voor waarschuwen, maar blijf wel alert." + +#: src/libslic3r/PrintConfig.cpp:292 +msgid "Enable auto cooling" +msgstr "Automatisch koelen toestaan" + +#: src/libslic3r/PrintConfig.cpp:293 +msgid "" +"This flag enables the automatic cooling logic that adjusts print speed and " +"fan speed according to layer printing time." +msgstr "" +"Dit vinkje zorgt dat automatisch gekoeld wordt; de print- en " +"ventilatorsnelheid worden aangepast op basis van de laagprinttijd." + +#: src/libslic3r/PrintConfig.cpp:298 +msgid "Cooling tube position" +msgstr "Koelbuispositie" + +#: src/libslic3r/PrintConfig.cpp:299 +msgid "Distance of the center-point of the cooling tube from the extruder tip." +msgstr "Afstand vanaf de nozzle tot het middelpunt van de koelbuis." + +#: src/libslic3r/PrintConfig.cpp:306 +msgid "Cooling tube length" +msgstr "Koelbuislengte" + +#: src/libslic3r/PrintConfig.cpp:307 +msgid "Length of the cooling tube to limit space for cooling moves inside it." +msgstr "" +"Lengte van de koelbuis om de ruimte voor koelbewegingen daarin te beperken." + +#: src/libslic3r/PrintConfig.cpp:315 +msgid "" +"This is the acceleration your printer will be reset to after the role-" +"specific acceleration values are used (perimeter/infill). Set zero to " +"prevent resetting acceleration at all." +msgstr "" +"Dit is de acceleratie waarop uw printer wordt ingesteld na een specifieke " +"acceleratiewaarde (perimeters/vulling). Als dit ingesteld is op 0, worden " +"geen acceleratiewaarden opnieuw ingesteld." + +#: src/libslic3r/PrintConfig.cpp:324 +msgid "Default filament profile" +msgstr "Standaard filamentprofiel" + +#: src/libslic3r/PrintConfig.cpp:325 +msgid "" +"Default filament profile associated with the current printer profile. On " +"selection of the current printer profile, this filament profile will be " +"activated." +msgstr "" +"Standaard filamentprofiel dat geassocieerd wordt met huidig printerprofiel. " +"Bij selectie van het huidige printerprofiel wordt dit filamentprofiel " +"geactiveerd." + +#: src/libslic3r/PrintConfig.cpp:331 +msgid "Default print profile" +msgstr "Standaard printprofiel" + +#: src/libslic3r/PrintConfig.cpp:332 src/libslic3r/PrintConfig.cpp:2560 +#: src/libslic3r/PrintConfig.cpp:2571 +msgid "" +"Default print profile associated with the current printer profile. On " +"selection of the current printer profile, this print profile will be " +"activated." +msgstr "" +"Standaard printprofiel dat geassocieerd wordt met huidig printerprofiel. Bij " +"selectie van het huidige printerprofiel wordt dit printprofiel geactiveerd." + +#: src/libslic3r/PrintConfig.cpp:338 +msgid "Disable fan for the first" +msgstr "Zet ventilator uit voor de eerste" + +#: src/libslic3r/PrintConfig.cpp:339 +msgid "" +"You can set this to a positive value to disable fan at all during the first " +"layers, so that it does not make adhesion worse." +msgstr "" +"U kunt dit instellen op een positieve waarde om de ventilator uit te " +"schakelen tijdens het printen van de eerste lagen voor een betere adhesie." + +#: src/libslic3r/PrintConfig.cpp:348 +msgid "Don't support bridges" +msgstr "Geen support voor bruggen" + +#: src/libslic3r/PrintConfig.cpp:350 +msgid "" +"Experimental option for preventing support material from being generated " +"under bridged areas." +msgstr "Experimentele optie om support onder brugvlakken te vermijden." + +#: src/libslic3r/PrintConfig.cpp:356 +msgid "Distance between copies" +msgstr "Ruimte tussen kopieën" + +#: src/libslic3r/PrintConfig.cpp:357 +msgid "Distance used for the auto-arrange feature of the plater." +msgstr "" +"Afstand die gebruikt wordt tussen objecten bij automatisch rangschikken." + +#: src/libslic3r/PrintConfig.cpp:364 +msgid "Elephant foot compensation" +msgstr "Squishcompensatie" + +#: src/libslic3r/PrintConfig.cpp:366 +msgid "" +"The first layer will be shrunk in the XY plane by the configured value to " +"compensate for the 1st layer squish aka an Elephant Foot effect." +msgstr "" +"De eerste laag wordt verkleind in horizontale richting met de ingestelde " +"waarde ter compensatie van het platdrukken." + +#: src/libslic3r/PrintConfig.cpp:375 +msgid "" +"This end procedure is inserted at the end of the output file. Note that you " +"can use placeholder variables for all PrusaSlicer settings." +msgstr "" +"Deze eindprocedure wordt aan het eind van het outputbestand ingevoegd. Merk " +"op dat variabelen voor alle instellingen gebruikt kunnen worden." + +#: src/libslic3r/PrintConfig.cpp:385 +msgid "" +"This end procedure is inserted at the end of the output file, before the " +"printer end gcode (and before any toolchange from this filament in case of " +"multimaterial printers). Note that you can use placeholder variables for all " +"PrusaSlicer settings. If you have multiple extruders, the gcode is processed " +"in extruder order." +msgstr "" +"Deze eindprocedure is ingevoegd aan het eind van het outputbestand, nog voor " +"de eind G-code (en voor de toolwisselingen). Merk op dat variabelen voor " +"alle instellingen gebruikt kunnen worden. Als de printer meerdere extruders " +"heeft, wordt deze G-code in de extrudervolgorde uitgevoerd." + +#: src/libslic3r/PrintConfig.cpp:396 +msgid "Ensure vertical shell thickness" +msgstr "Garandeer verticale shelldikte" + +#: src/libslic3r/PrintConfig.cpp:398 +msgid "" +"Add solid infill near sloping surfaces to guarantee the vertical shell " +"thickness (top+bottom solid layers)." +msgstr "" +"Voeg dichte vulling toe bij hellende vlakken om de verticale shelldikte te " +"garanderen." + +#: src/libslic3r/PrintConfig.cpp:404 +msgid "Top fill pattern" +msgstr "Vulpatroon voor bovenzijde" + +#: src/libslic3r/PrintConfig.cpp:406 +msgid "" +"Fill pattern for top infill. This only affects the top visible layer, and " +"not its adjacent solid shells." +msgstr "" +"Vullingspatroon voor bovenste lagen. Dit heeft alleen invloed op de bovenste " +"zichtbare laag en niet de aangrenzende horizontale dichte shells." + +#: src/libslic3r/PrintConfig.cpp:414 src/libslic3r/PrintConfig.cpp:832 +#: src/libslic3r/PrintConfig.cpp:1998 +msgid "Rectilinear" +msgstr "Rechtlijnig" + +#: src/libslic3r/PrintConfig.cpp:415 src/libslic3r/PrintConfig.cpp:838 +msgid "Concentric" +msgstr "Concentrisch" + +#: src/libslic3r/PrintConfig.cpp:416 src/libslic3r/PrintConfig.cpp:842 +msgid "Hilbert Curve" +msgstr "Hilbert-kromme" + +#: src/libslic3r/PrintConfig.cpp:417 src/libslic3r/PrintConfig.cpp:843 +msgid "Archimedean Chords" +msgstr "Archimedes-spiraal" + +#: src/libslic3r/PrintConfig.cpp:418 src/libslic3r/PrintConfig.cpp:844 +msgid "Octagram Spiral" +msgstr "Octagramspiraal" + +#: src/libslic3r/PrintConfig.cpp:424 +msgid "Bottom fill pattern" +msgstr "Vulpatroon voor onderzijde" + +#: src/libslic3r/PrintConfig.cpp:426 +msgid "" +"Fill pattern for bottom infill. This only affects the bottom external " +"visible layer, and not its adjacent solid shells." +msgstr "" +"Vulpatroon voor de bodemlaag. Dit heeft alleen invloed op de onderste " +"zichtbare laag en niet de aangrenzende horizontale dichte shells." + +#: src/libslic3r/PrintConfig.cpp:435 src/libslic3r/PrintConfig.cpp:446 +msgid "External perimeters" +msgstr "Buitenste perimeters" + +#: src/libslic3r/PrintConfig.cpp:437 +msgid "" +"Set this to a non-zero value to set a manual extrusion width for external " +"perimeters. If left zero, default extrusion width will be used if set, " +"otherwise 1.125 x nozzle diameter will be used. If expressed as percentage " +"(for example 200%), it will be computed over layer height." +msgstr "" +"Stel in op een niet-nulwaarde om te werken met manuele extrusiebreedte voor " +"de buitenste perimeters. Als die op 0 blijft staan, zal PrusaSlicer de " +"breedte instellen op 1,125x de nozzlediameter. Als dit is uitgedrukt als " +"percentage, wordt dit berekend over de laagdikte." + +#: src/libslic3r/PrintConfig.cpp:440 src/libslic3r/PrintConfig.cpp:549 +#: src/libslic3r/PrintConfig.cpp:871 src/libslic3r/PrintConfig.cpp:884 +#: src/libslic3r/PrintConfig.cpp:1004 src/libslic3r/PrintConfig.cpp:1030 +#: src/libslic3r/PrintConfig.cpp:1418 src/libslic3r/PrintConfig.cpp:1757 +#: src/libslic3r/PrintConfig.cpp:1872 src/libslic3r/PrintConfig.cpp:1940 +#: src/libslic3r/PrintConfig.cpp:2100 +msgid "mm or %" +msgstr "mm of %" + +#: src/libslic3r/PrintConfig.cpp:448 +msgid "" +"This separate setting will affect the speed of external perimeters (the " +"visible ones). If expressed as percentage (for example: 80%) it will be " +"calculated on the perimeters speed setting above. Set to zero for auto." +msgstr "" +"Deze instelling heeft effect op de snelheid van buitenste perimeters. Als " +"dit is uitgedrukt als percentage, wordt deze genomen over de snelheid van de " +"perimeters. Als dit ingesteld is op 0, wordt een automatische snelheid " +"genomen." + +#: src/libslic3r/PrintConfig.cpp:451 src/libslic3r/PrintConfig.cpp:893 +#: src/libslic3r/PrintConfig.cpp:1716 src/libslic3r/PrintConfig.cpp:1768 +#: src/libslic3r/PrintConfig.cpp:1984 src/libslic3r/PrintConfig.cpp:2113 +msgid "mm/s or %" +msgstr "mm/s of %" + +#: src/libslic3r/PrintConfig.cpp:458 +msgid "External perimeters first" +msgstr "Buitenste perimeters eerst" + +#: src/libslic3r/PrintConfig.cpp:460 +msgid "" +"Print contour perimeters from the outermost one to the innermost one instead " +"of the default inverse order." +msgstr "" +"Print de buitenste perimeters eerder dan de binnenste in plaats van andersom." + +#: src/libslic3r/PrintConfig.cpp:466 +msgid "Extra perimeters if needed" +msgstr "Extra perimeters indien nodig" + +#: src/libslic3r/PrintConfig.cpp:468 +#, no-c-format +msgid "" +"Add more perimeters when needed for avoiding gaps in sloping walls. Slic3r " +"keeps adding perimeters, until more than 70% of the loop immediately above " +"is supported." +msgstr "" +"Voeg meer perimeters toe als dat nodig is voor het voorkomen van gaten in " +"hellende wanden. PrusaSlicer blijft perimeters toevoegen tot meer dan 70% " +"van de perimeters daarboven direct is ondersteund." + +#: src/libslic3r/PrintConfig.cpp:478 +msgid "" +"The extruder to use (unless more specific extruder settings are specified). " +"This value overrides perimeter and infill extruders, but not the support " +"extruders." +msgstr "" +"De extruder die gebruikt wordt (behalve als meer specifieke " +"extruderinstellingen zijn aangegeven). Deze waarde overschrijft de " +"perimeter- en vullingsextruder, maar niet de supportextruders." + +#: src/libslic3r/PrintConfig.cpp:490 +msgid "" +"Set this to the vertical distance between your nozzle tip and (usually) the " +"X carriage rods. In other words, this is the height of the clearance " +"cylinder around your extruder, and it represents the maximum depth the " +"extruder can peek before colliding with other printed objects." +msgstr "" +"Stel dit in als verticale afstand tussen de nozzlepunt en de geleidestangen " +"van de X-as. In andere woorden; dit is de hoogte van de vrijloopcilinder " +"rond de extruder en geeft de maximale diepte weer die de extruder kan halen " +"zonder te botsen met eerder geprinte objecten." + +#: src/libslic3r/PrintConfig.cpp:501 +msgid "" +"Set this to the clearance radius around your extruder. If the extruder is " +"not centered, choose the largest value for safety. This setting is used to " +"check for collisions and to display the graphical preview in the plater." +msgstr "" +"Stel dit in als vrijloopradius rond de extruder. Kies de hoogste waarde " +"(voor de veiligheid) als de extruder niet is gecentreerd. Deze instelling " +"wordt gebruikt om te controleren op botsingen en om te tonen in de " +"modelweergave." + +#: src/libslic3r/PrintConfig.cpp:511 +msgid "Extruder Color" +msgstr "Extruderkleur" + +#: src/libslic3r/PrintConfig.cpp:512 src/libslic3r/PrintConfig.cpp:573 +msgid "This is only used in the Slic3r interface as a visual help." +msgstr "" +"Dit wordt alleen gebruikt in de PrusaSlicer-interface als een visueel " +"hulpmiddel." + +#: src/libslic3r/PrintConfig.cpp:518 +msgid "Extruder offset" +msgstr "Extruder-offset" + +#: src/libslic3r/PrintConfig.cpp:519 +msgid "" +"If your firmware doesn't handle the extruder displacement you need the G-" +"code to take it into account. This option lets you specify the displacement " +"of each extruder with respect to the first one. It expects positive " +"coordinates (they will be subtracted from the XY coordinate)." +msgstr "" +"Als uw firmware extrudercompensatie niet toestaat, kan daar rekening mee " +"gehouden worden in de G-code. Met deze optie kunt u de compensatie per " +"extruder specificeren op basis van de eerste extruder. Hiervoor zijn " +"positieve coördinaten nodig (die worden van de X- en Y-coördinaten " +"afgetrokken)." + +#: src/libslic3r/PrintConfig.cpp:528 +msgid "Extrusion axis" +msgstr "Extrusie-as" + +#: src/libslic3r/PrintConfig.cpp:529 +msgid "" +"Use this option to set the axis letter associated to your printer's extruder " +"(usually E but some printers use A)." +msgstr "" +"Gebruik deze optie om de naam van de as van de extruder in te stellen " +"(normaal gesproken E, maar soms A)." + +#: src/libslic3r/PrintConfig.cpp:534 +msgid "Extrusion multiplier" +msgstr "Extrusie vermenigvuldigingsfactor" + +#: src/libslic3r/PrintConfig.cpp:535 +msgid "" +"This factor changes the amount of flow proportionally. You may need to tweak " +"this setting to get nice surface finish and correct single wall widths. " +"Usual values are between 0.9 and 1.1. If you think you need to change this " +"more, check filament diameter and your firmware E steps." +msgstr "" +"Deze factor verandert het debiet proportioneel. U kunt deze fijnstellen om " +"een mooi oppervlak en dunne wanden te krijgen. Waarden liggen normaal tussen " +"0.9 en 1.1. Check eventueel de filamentdiameter en de extruderstappen (uit " +"de firmware) als u denkt dat dit aangepast moet worden." + +#: src/libslic3r/PrintConfig.cpp:543 +msgid "Default extrusion width" +msgstr "Standaard extrusiebreedte" + +#: src/libslic3r/PrintConfig.cpp:545 +msgid "" +"Set this to a non-zero value to allow a manual extrusion width. If left to " +"zero, Slic3r derives extrusion widths from the nozzle diameter (see the " +"tooltips for perimeter extrusion width, infill extrusion width etc). If " +"expressed as percentage (for example: 230%), it will be computed over layer " +"height." +msgstr "" +"Stel in op een niet-nulwaarde om te werken met manuele extrusiebreedte. Als " +"die op 0 blijft staan, zal PrusaSlicer de extrusiebreedte aanpassen op basis " +"van de nozzlediameter. Als dit is uitgedrukt als percentage, wordt dit " +"berekend over de laagdikte." + +#: src/libslic3r/PrintConfig.cpp:555 +msgid "Keep fan always on" +msgstr "Laat ventilator altijd aan" + +#: src/libslic3r/PrintConfig.cpp:556 +msgid "" +"If this is enabled, fan will never be disabled and will be kept running at " +"least at its minimum speed. Useful for PLA, harmful for ABS." +msgstr "" +"Als dit is ingeschakeld zal de ventilator nooit uitgezet worden, maar " +"tenminste de ingestelde minimale snelheid aanhouden." + +#: src/libslic3r/PrintConfig.cpp:561 +msgid "Enable fan if layer print time is below" +msgstr "Schakel de ventilator in bij een printtijd korter dan" + +#: src/libslic3r/PrintConfig.cpp:562 +msgid "" +"If layer print time is estimated below this number of seconds, fan will be " +"enabled and its speed will be calculated by interpolating the minimum and " +"maximum speeds." +msgstr "" +"Als de printtijd voor een laag onder dit aantal seconden komt, zal de " +"ventilator aangezet worden en wordt de snelheid berekend door te " +"interpoleren tussen de minimale en maximale snelheid." + +#: src/libslic3r/PrintConfig.cpp:564 src/libslic3r/PrintConfig.cpp:1703 +msgid "approximate seconds" +msgstr "geschat aantal seconden" + +#: src/libslic3r/PrintConfig.cpp:578 +msgid "Filament notes" +msgstr "Filamentopmerkingen" + +#: src/libslic3r/PrintConfig.cpp:579 +msgid "You can put your notes regarding the filament here." +msgstr "Hier kunt u opmerkingen over het filament plaatsen." + +#: src/libslic3r/PrintConfig.cpp:587 src/libslic3r/PrintConfig.cpp:1244 +msgid "Max volumetric speed" +msgstr "Maximale volumetrische snelheid" + +#: src/libslic3r/PrintConfig.cpp:588 +msgid "" +"Maximum volumetric speed allowed for this filament. Limits the maximum " +"volumetric speed of a print to the minimum of print and filament volumetric " +"speed. Set to zero for no limit." +msgstr "" +"Maximale volumetrische snelheid is toegestaan voor dit filament. Dit beperkt " +"de maximale volumetrische snelheid van een print tot het minimum van de " +"maximale volumetrische snelheid van de print en het filament. Als dit " +"ingesteld is op 0, geldt er geen limiet." + +#: src/libslic3r/PrintConfig.cpp:597 +msgid "Loading speed" +msgstr "Laadsnelheid" + +#: src/libslic3r/PrintConfig.cpp:598 +msgid "Speed used for loading the filament on the wipe tower." +msgstr "Snelheid die gebruikt wordt voor het afveegblok." + +#: src/libslic3r/PrintConfig.cpp:605 +msgid "Loading speed at the start" +msgstr "Laadsnelheid aan het begin" + +#: src/libslic3r/PrintConfig.cpp:606 +msgid "Speed used at the very beginning of loading phase." +msgstr "Snelheid die gebruikt wordt aan het begin van de laadfase." + +#: src/libslic3r/PrintConfig.cpp:613 +msgid "Unloading speed" +msgstr "Ontlaadsnelheid" + +#: src/libslic3r/PrintConfig.cpp:614 +msgid "" +"Speed used for unloading the filament on the wipe tower (does not affect " +"initial part of unloading just after ramming)." +msgstr "" +"Snelheid die gebruikt wordt voor het ontladen van het afveegblok (heeft geen " +"effect op het initiële onderdeel van het ontladen direct na de ramming)." + +#: src/libslic3r/PrintConfig.cpp:622 +msgid "Unloading speed at the start" +msgstr "Ontlaadsnelheid in het begin" + +#: src/libslic3r/PrintConfig.cpp:623 +msgid "" +"Speed used for unloading the tip of the filament immediately after ramming." +msgstr "" +"Snelheid die gebruikt wordt voor het ontladen van het filament direct na de " +"ramming." + +#: src/libslic3r/PrintConfig.cpp:630 +msgid "Delay after unloading" +msgstr "Vertraging na het ontladen" + +#: src/libslic3r/PrintConfig.cpp:631 +msgid "" +"Time to wait after the filament is unloaded. May help to get reliable " +"toolchanges with flexible materials that may need more time to shrink to " +"original dimensions." +msgstr "" +"Wachttijd voor het ontladen van het filament. Dit kan helpen om betrouwbare " +"toolwisselingen te krijgen met flexibele materialen die meer tijd nodig " +"hebben om te krimpen naar de originele afmetingen." + +#: src/libslic3r/PrintConfig.cpp:640 +msgid "Number of cooling moves" +msgstr "Aantal koelbewegingen" + +#: src/libslic3r/PrintConfig.cpp:641 +msgid "" +"Filament is cooled by being moved back and forth in the cooling tubes. " +"Specify desired number of these moves." +msgstr "" +"Het filament wordt gekoeld tijdens het terug en voorwaarts bewegen in de " +"koelbuis. Specificeer het benodigd aantal bewegingen." + +#: src/libslic3r/PrintConfig.cpp:649 +msgid "Speed of the first cooling move" +msgstr "Snelheid voor de eerste koelbeweging" + +#: src/libslic3r/PrintConfig.cpp:650 +msgid "Cooling moves are gradually accelerating beginning at this speed." +msgstr "" +"Koelbewegingen worden gelijkmatig versneld, beginnend vanaf deze snelheid." + +#: src/libslic3r/PrintConfig.cpp:657 +msgid "Minimal purge on wipe tower" +msgstr "Minimale afstand op afveegblok" + +#: src/libslic3r/PrintConfig.cpp:658 +msgid "" +"After a tool change, the exact position of the newly loaded filament inside " +"the nozzle may not be known, and the filament pressure is likely not yet " +"stable. Before purging the print head into an infill or a sacrificial " +"object, Slic3r will always prime this amount of material into the wipe tower " +"to produce successive infill or sacrificial object extrusions reliably." +msgstr "" +"Na een toolwissel is de exacte locatie van het geladen filament onbekend en " +"zal de druk op het filament niet stabiel zijn. Voor het afvegen van de " +"printkop in de vulling zal PrusaSlicer eerst deze hoeveelheid materiaal " +"afvegen aan het afveegblok om vervolgens de vulling of overige objecten goed " +"te kunnen printen." + +#: src/libslic3r/PrintConfig.cpp:662 +msgid "mm³" +msgstr "mm³" + +#: src/libslic3r/PrintConfig.cpp:668 +msgid "Speed of the last cooling move" +msgstr "Snelheid voor de laatste koelbeweging" + +#: src/libslic3r/PrintConfig.cpp:669 +msgid "Cooling moves are gradually accelerating towards this speed." +msgstr "Koelbewegingen versnellen gelijkmatig tot aan deze snelheid." + +#: src/libslic3r/PrintConfig.cpp:676 +msgid "Filament load time" +msgstr "Laadtijd van het filament" + +#: src/libslic3r/PrintConfig.cpp:677 +msgid "" +"Time for the printer firmware (or the Multi Material Unit 2.0) to load a new " +"filament during a tool change (when executing the T code). This time is " +"added to the total print time by the G-code time estimator." +msgstr "" +"Tijd voor de printerfirmware (of de MMU 2.0) om nieuw filament te laden " +"tijdens een toolwissel (tijdens het uitvoeren van de T-code). Deze tijd " +"wordt toegevoegd aan de totale printtijd in de tijdsschatting." + +#: src/libslic3r/PrintConfig.cpp:684 +msgid "Ramming parameters" +msgstr "Rammingparameters" + +#: src/libslic3r/PrintConfig.cpp:685 +msgid "" +"This string is edited by RammingDialog and contains ramming specific " +"parameters." +msgstr "" +"Deze frase is bewerkt door het Rammingdialoog en bevat parameters voor de " +"ramming." + +#: src/libslic3r/PrintConfig.cpp:691 +msgid "Filament unload time" +msgstr "Ontlaadtijd voor filament" + +#: src/libslic3r/PrintConfig.cpp:692 +msgid "" +"Time for the printer firmware (or the Multi Material Unit 2.0) to unload a " +"filament during a tool change (when executing the T code). This time is " +"added to the total print time by the G-code time estimator." +msgstr "" +"Tijd voor de printerfirmware (of de MMU 2.0) om filament te ontladen tijdens " +"een toolwissel (tijdens het uitvoeren van de T-code). Deze tijd wordt " +"toegevoegd aan de totale printtijd in de tijdsschatting." + +#: src/libslic3r/PrintConfig.cpp:700 +msgid "" +"Enter your filament diameter here. Good precision is required, so use a " +"caliper and do multiple measurements along the filament, then compute the " +"average." +msgstr "" +"Stel hier de filamentdiameter in. De juiste precisie is benodigd. Gebruik " +"daarom een schuifmaat en doe meerdere metingen over het hele filament. " +"Bereken vervolgens het gemiddelde." + +#: src/libslic3r/PrintConfig.cpp:707 src/libslic3r/PrintConfig.cpp:2471 +#: src/libslic3r/PrintConfig.cpp:2472 +msgid "Density" +msgstr "Dichtheid" + +#: src/libslic3r/PrintConfig.cpp:708 +msgid "" +"Enter your filament density here. This is only for statistical information. " +"A decent way is to weigh a known length of filament and compute the ratio of " +"the length to volume. Better is to calculate the volume directly through " +"displacement." +msgstr "" +"Stel hier de dichtheid van het filament in. Dit is slechts voor de " +"statistieken. Formule voor dichtheid: dichtheid[g/cm³] = massa[g] / " +"volume[cm³]. Formule voor volume: volume[cm³] = 1000 * (diameter[mm])² * π / " +"4 * lengte[mm]. Bepaal het gewicht door te wegen en het volume door te meten." + +#: src/libslic3r/PrintConfig.cpp:711 +msgid "g/cm³" +msgstr "g/cm³" + +#: src/libslic3r/PrintConfig.cpp:716 +msgid "Filament type" +msgstr "Filamenttype" + +#: src/libslic3r/PrintConfig.cpp:717 +msgid "The filament material type for use in custom G-codes." +msgstr "Het filamenttype voor het gebruik van de custom G-codes." + +#: src/libslic3r/PrintConfig.cpp:743 +msgid "Soluble material" +msgstr "Oplosbaar materiaal" + +#: src/libslic3r/PrintConfig.cpp:744 +msgid "Soluble material is most likely used for a soluble support." +msgstr "Oplosbaar materiaal wordt vaak gebruikt voor oplosbaar support." + +#: src/libslic3r/PrintConfig.cpp:750 +msgid "" +"Enter your filament cost per kg here. This is only for statistical " +"information." +msgstr "" +"Voer hier de filamentkosten per kilogram in. Dit is alleen voor statistische " +"informatie." + +#: src/libslic3r/PrintConfig.cpp:751 +msgid "money/kg" +msgstr "€/kg" + +#: src/libslic3r/PrintConfig.cpp:760 src/libslic3r/PrintConfig.cpp:2555 +msgid "(Unknown)" +msgstr "(Onbekend)" + +#: src/libslic3r/PrintConfig.cpp:764 +msgid "Fill angle" +msgstr "Vullingshoek" + +#: src/libslic3r/PrintConfig.cpp:766 +msgid "" +"Default base angle for infill orientation. Cross-hatching will be applied to " +"this. Bridges will be infilled using the best direction Slic3r can detect, " +"so this setting does not affect them." +msgstr "" +"Standaard basishoek voor de vullingsrichting. Hier wordt kruislings overheen " +"geprint. Bruggen worden geprint met de optimale richting. Deze instelling " +"zal die richting niet beïnvloeden." + +#: src/libslic3r/PrintConfig.cpp:778 +msgid "Fill density" +msgstr "Vullingsdichtheid" + +#: src/libslic3r/PrintConfig.cpp:780 +msgid "Density of internal infill, expressed in the range 0% - 100%." +msgstr "" +"Dichtheid van inwendige vulling, uitgedrukt in een percentage (0 - 100%)" + +#: src/libslic3r/PrintConfig.cpp:815 +msgid "Fill pattern" +msgstr "Vullingspatroon" + +#: src/libslic3r/PrintConfig.cpp:817 +msgid "Fill pattern for general low-density infill." +msgstr "Vulpatroon voor algemene lagere-dichtheidsvulling." + +#: src/libslic3r/PrintConfig.cpp:833 +msgid "Grid" +msgstr "Raster" + +#: src/libslic3r/PrintConfig.cpp:834 +msgid "Triangles" +msgstr "Driehoeken" + +#: src/libslic3r/PrintConfig.cpp:835 +msgid "Stars" +msgstr "Sterren" + +#: src/libslic3r/PrintConfig.cpp:836 +msgid "Cubic" +msgstr "Kubisch" + +#: src/libslic3r/PrintConfig.cpp:837 +msgid "Line" +msgstr "Lijnen" + +#: src/libslic3r/PrintConfig.cpp:839 src/libslic3r/PrintConfig.cpp:2000 +msgid "Honeycomb" +msgstr "Honingraat" + +#: src/libslic3r/PrintConfig.cpp:840 +msgid "3D Honeycomb" +msgstr "3D-honingraat" + +#: src/libslic3r/PrintConfig.cpp:841 +msgid "Gyroid" +msgstr "Gyroïde" + +#: src/libslic3r/PrintConfig.cpp:848 src/libslic3r/PrintConfig.cpp:857 +#: src/libslic3r/PrintConfig.cpp:865 src/libslic3r/PrintConfig.cpp:899 +msgid "First layer" +msgstr "Eerste laag" + +#: src/libslic3r/PrintConfig.cpp:849 +msgid "" +"This is the acceleration your printer will use for first layer. Set zero to " +"disable acceleration control for first layer." +msgstr "" +"Deze acceleratie zal uw printer gebruiken voor de eerste laag. Als dit " +"ingesteld is op 0, wordt de standaard acceleratie gebruikt." + +#: src/libslic3r/PrintConfig.cpp:858 +msgid "" +"Heated build plate temperature for the first layer. Set this to zero to " +"disable bed temperature control commands in the output." +msgstr "" +"Temperatuur van het verwarmd bed voor de eerste laag. Als dit ingesteld is " +"op 0, worden bedtemperatuur-commando's weggelaten in de output." + +#: src/libslic3r/PrintConfig.cpp:867 +msgid "" +"Set this to a non-zero value to set a manual extrusion width for first " +"layer. You can use this to force fatter extrudates for better adhesion. If " +"expressed as percentage (for example 120%) it will be computed over first " +"layer height. If set to zero, it will use the default extrusion width." +msgstr "" +"Stel in op een niet-nulwaarde om te werken met manuele extrusiebreedte voor " +"de eerste laag. Dit kan gebruikt worden om dikkere lagen voor een betere " +"hechting aan het bed te gebruiken. Als dit is uitgedrukt als percentage, " +"wordt dit berekend over de laagdikte van de eerste laag. Als dit is " +"ingesteld op 0, wordt de standaard extrusiebreedte gebruikt." + +#: src/libslic3r/PrintConfig.cpp:880 +msgid "" +"When printing with very low layer heights, you might still want to print a " +"thicker bottom layer to improve adhesion and tolerance for non perfect build " +"plates. This can be expressed as an absolute value or as a percentage (for " +"example: 150%) over the default layer height." +msgstr "" +"Als geprint wordt met hele kleine laagdiktes, moet de eerste laag iets " +"dikker geprint worden voor een betere bedhechting en tolerantie voor " +"imperfecte printplatformen. Dit kan uitgedrukt worden als een absolute " +"waarde of als percentage (bijvoorbeeld 150%) over de standaard laaghoogte." + +#: src/libslic3r/PrintConfig.cpp:889 +msgid "First layer speed" +msgstr "Snelheid eerste laag" + +#: src/libslic3r/PrintConfig.cpp:890 +msgid "" +"If expressed as absolute value in mm/s, this speed will be applied to all " +"the print moves of the first layer, regardless of their type. If expressed " +"as a percentage (for example: 40%) it will scale the default speeds." +msgstr "" +"Als dit uitgedrukt wordt als absolute waarde (in mm/s), zal deze snelheid " +"toegepast worden bij alle printbewegingen van de eerste laag, onafhankelijk " +"van het type. Als dit is uitgedrukt als percentage, wordt dit berekend over " +"de standaardsnelheid." + +#: src/libslic3r/PrintConfig.cpp:900 +msgid "" +"Extruder temperature for first layer. If you want to control temperature " +"manually during print, set this to zero to disable temperature control " +"commands in the output file." +msgstr "" +"Printtemperatuur voor de eerste laag. Als dit ingesteld is op 0, worden " +"extrudertemperatuur-commando's weggelaten in de output." + +#: src/libslic3r/PrintConfig.cpp:909 +msgid "" +"Speed for filling small gaps using short zigzag moves. Keep this reasonably " +"low to avoid too much shaking and resonance issues. Set zero to disable gaps " +"filling." +msgstr "" +"Printsnelheid voor het gatvullen waarbij zigzag-bewegingen worden gebruikt. " +"Houdt dit laag om schudden te voorkomen (wat resulteert in " +"resonantieproblemen). Als dit is ingesteld op 0, worden gaten niet gevuld." + +#: src/libslic3r/PrintConfig.cpp:917 +msgid "Verbose G-code" +msgstr "Opmerkingen in G-code" + +#: src/libslic3r/PrintConfig.cpp:918 +msgid "" +"Enable this to get a commented G-code file, with each line explained by a " +"descriptive text. If you print from SD card, the additional weight of the " +"file could make your firmware slow down." +msgstr "" +"Sta dit toe om een G-code met opmerkingen te genereren. Bij elke lijn wordt " +"een opmerking geplaatst. Als u print vanaf een SD-kaart, kan de extra " +"grootte van het bestand de firmware vertragen." + +#: src/libslic3r/PrintConfig.cpp:925 +msgid "G-code flavor" +msgstr "G-code-variant" + +#: src/libslic3r/PrintConfig.cpp:926 +msgid "" +"Some G/M-code commands, including temperature control and others, are not " +"universal. Set this option to your printer's firmware to get a compatible " +"output. The \"No extrusion\" flavor prevents PrusaSlicer from exporting any " +"extrusion value at all." +msgstr "" +"Sommige G- en M-commando's zijn niet universeel. Stel deze optie in om een " +"compatibele uitvoer te krijgen voor uw printer. De 'Geen extrusie'-" +"instelling kan gebruikt worden om te printen zonder materiaal te extruderen." + +#: src/libslic3r/PrintConfig.cpp:949 +msgid "No extrusion" +msgstr "Geen extrusie" + +#: src/libslic3r/PrintConfig.cpp:954 +msgid "Label objects" +msgstr "Label objecten" + +#: src/libslic3r/PrintConfig.cpp:955 +msgid "" +"Enable this to add comments into the G-Code labeling print moves with what " +"object they belong to, which is useful for the Octoprint CancelObject " +"plugin. This settings is NOT compatible with Single Extruder Multi Material " +"setup and Wipe into Object / Wipe into Infill." +msgstr "" +"Schakel dit in om opmerkingen in de G-code toe te voegen voor bewegingen die " +"behoren tot een object. Dit is handig voor de OctoPrint CancelObject-plugin. " +"Deze instelling is NIET compatibel met een multi-materialsetup met één " +"extruder en 'Afvegen in object' en 'Afvegen in vulling'." + +#: src/libslic3r/PrintConfig.cpp:962 +msgid "High extruder current on filament swap" +msgstr "Hoge stroomsterkte bij extruder voor filamentwissel" + +#: src/libslic3r/PrintConfig.cpp:963 +msgid "" +"It may be beneficial to increase the extruder motor current during the " +"filament exchange sequence to allow for rapid ramming feed rates and to " +"overcome resistance when loading a filament with an ugly shaped tip." +msgstr "" +"Het kan nuttig zijn om de stroomsterkte van de extrudermotor te verhogen " +"tijdens het uitvoeren van de filamentwisseling om snelle ramming mogelijk te " +"maken en om weerstand te overwinnen tijdens het laden van filament met een " +"misvormde kop." + +#: src/libslic3r/PrintConfig.cpp:971 +msgid "" +"This is the acceleration your printer will use for infill. Set zero to " +"disable acceleration control for infill." +msgstr "" +"Deze acceleratie zal uw printer gebruiken voor de vulling. Als dit is " +"ingesteld op 0, wordt de acceleratiecontrole uitgeschakeld." + +#: src/libslic3r/PrintConfig.cpp:979 +msgid "Combine infill every" +msgstr "Combineer vulling elke" + +#: src/libslic3r/PrintConfig.cpp:981 +msgid "" +"This feature allows to combine infill and speed up your print by extruding " +"thicker infill layers while preserving thin perimeters, thus accuracy." +msgstr "" +"Deze optie staat vullingslagen combineren toe voor een snellere print door " +"de vullingslagen stapsgewijs dikker te maken, terwijl de laagdikte van " +"perimeters behouden wordt." + +#: src/libslic3r/PrintConfig.cpp:984 +msgid "Combine infill every n layers" +msgstr "Combineer vulling elke n lagen" + +#: src/libslic3r/PrintConfig.cpp:990 +msgid "Infill extruder" +msgstr "Vullingsextruder" + +#: src/libslic3r/PrintConfig.cpp:992 +msgid "The extruder to use when printing infill." +msgstr "De extruder die gebruikt wordt voor het printen van de vulling." + +#: src/libslic3r/PrintConfig.cpp:1000 +msgid "" +"Set this to a non-zero value to set a manual extrusion width for infill. If " +"left zero, default extrusion width will be used if set, otherwise 1.125 x " +"nozzle diameter will be used. You may want to use fatter extrudates to speed " +"up the infill and make your parts stronger. If expressed as percentage (for " +"example 90%) it will be computed over layer height." +msgstr "" +"Stel dit in op een niet-nulwaarde om handmatige extrusiebreedte in te " +"stellen. Als die op 0 blijft staan, zal PrusaSlicer de breedte instellen op " +"1,125x de nozzlediameter. Mogelijk wilt u de vulling wat sneller laten " +"printen en het onderdeel sterker maken met deze optie. Als dit is uitgedrukt " +"als percentage, wordt dit berekend over de laagdikte." + +#: src/libslic3r/PrintConfig.cpp:1010 +msgid "Infill before perimeters" +msgstr "Vulling vóór perimeters" + +#: src/libslic3r/PrintConfig.cpp:1011 +msgid "" +"This option will switch the print order of perimeters and infill, making the " +"latter first." +msgstr "" +"Deze optie verandert de printvolgorde van perimeters en vulling; de " +"laatstgenoemde eerst." + +#: src/libslic3r/PrintConfig.cpp:1016 +msgid "Only infill where needed" +msgstr "Alleen vulling waar nodig" + +#: src/libslic3r/PrintConfig.cpp:1018 +msgid "" +"This option will limit infill to the areas actually needed for supporting " +"ceilings (it will act as internal support material). If enabled, slows down " +"the G-code generation due to the multiple checks involved." +msgstr "" +"Deze optie beperkt de vulling tot gebieden waar dit nodig is voor " +"ondersteuning van bovenvlakken (het fungeert als inwendig support). Let op: " +"deze optie vertraagt de G-code-generatie." + +#: src/libslic3r/PrintConfig.cpp:1025 +msgid "Infill/perimeters overlap" +msgstr "Overlapping van vulling/perimeters" + +#: src/libslic3r/PrintConfig.cpp:1027 +msgid "" +"This setting applies an additional overlap between infill and perimeters for " +"better bonding. Theoretically this shouldn't be needed, but backlash might " +"cause gaps. If expressed as percentage (example: 15%) it is calculated over " +"perimeter extrusion width." +msgstr "" +"Deze instelling zorgt voor een extra overlapping tussen vulling en " +"perimeters voor een betere hechting. Theoretisch gezien is dit niet nodig, " +"maar terugslag kan zorgen voor gaten. Als dit is uitgedrukt als percentage, " +"wordt dit berekend over de extrusiebreedte van de perimeters." + +#: src/libslic3r/PrintConfig.cpp:1038 +msgid "Speed for printing the internal fill. Set to zero for auto." +msgstr "" +"Printsnelheid voor vulling. Als dit ingesteld is op 0, wordt de snelheid " +"automatisch berekend." + +#: src/libslic3r/PrintConfig.cpp:1046 +msgid "Inherits profile" +msgstr "Afgeleid profiel" + +#: src/libslic3r/PrintConfig.cpp:1047 +msgid "Name of the profile, from which this profile inherits." +msgstr "Profielnaam waar profiel op is gebaseerd." + +#: src/libslic3r/PrintConfig.cpp:1060 +msgid "Interface shells" +msgstr "Interfaceshells" + +#: src/libslic3r/PrintConfig.cpp:1061 +msgid "" +"Force the generation of solid shells between adjacent materials/volumes. " +"Useful for multi-extruder prints with translucent materials or manual " +"soluble support material." +msgstr "" +"Forceer de generatie van dichte shells tussen aangrenzende materialen/" +"volumes. Dit is handig voor multi-extruderprints met transparante materialen " +"of handmatig oplosbaar support." + +#: src/libslic3r/PrintConfig.cpp:1070 +msgid "" +"This custom code is inserted at every layer change, right after the Z move " +"and before the extruder moves to the first layer point. Note that you can " +"use placeholder variables for all Slic3r settings as well as [layer_num] and " +"[layer_z]." +msgstr "" +"Deze custom code wordt ingevoegd bij elke laagwisseling, direct na de Z-" +"beweging en voor de extruder naar het volgende punt beweegt. Hier kunt u " +"variabelen gebruiken voor alle instellingen zoals 'layer_num' en 'layer_z'." + +#: src/libslic3r/PrintConfig.cpp:1081 +msgid "Supports remaining times" +msgstr "Ondersteunt resterende tijd" + +#: src/libslic3r/PrintConfig.cpp:1082 +msgid "" +"Emit M73 P[percent printed] R[remaining time in minutes] at 1 minute " +"intervals into the G-code to let the firmware show accurate remaining time. " +"As of now only the Prusa i3 MK3 firmware recognizes M73. Also the i3 MK3 " +"firmware supports M73 Qxx Sxx for the silent mode." +msgstr "" +"Zet M73 P[geprint percentage] R[resterende tijd in minuten] na elke minuut " +"in de G-code om de firmware de exacte resterende tijd te laten weten. Vanaf " +"nu herkent de Prusa i3 MK3 de M73-commando's. Ook ondersteunt de i3 MK3 " +"firmware M73 Qxx Sxx voor de stille modus." + +#: src/libslic3r/PrintConfig.cpp:1090 +msgid "Supports stealth mode" +msgstr "Ondersteunt stille modus" + +#: src/libslic3r/PrintConfig.cpp:1091 +msgid "The firmware supports stealth mode" +msgstr "De firmware ondersteunt stille modus" + +#: src/libslic3r/PrintConfig.cpp:1115 +msgid "Maximum feedrate X" +msgstr "Maximale voedingssnelheid van de X-as" + +#: src/libslic3r/PrintConfig.cpp:1116 +msgid "Maximum feedrate Y" +msgstr "Maximale voedingssnelheid van de Y-as" + +#: src/libslic3r/PrintConfig.cpp:1117 +msgid "Maximum feedrate Z" +msgstr "Maximale voedingssnelheid van de Z-as" + +#: src/libslic3r/PrintConfig.cpp:1118 +msgid "Maximum feedrate E" +msgstr "Maximale extrusievoedingssnelheid" + +#: src/libslic3r/PrintConfig.cpp:1121 +msgid "Maximum feedrate of the X axis" +msgstr "Maximale voedingssnelheid van de X-as" + +#: src/libslic3r/PrintConfig.cpp:1122 +msgid "Maximum feedrate of the Y axis" +msgstr "Maximale voedingssnelheid van de Y-as" + +#: src/libslic3r/PrintConfig.cpp:1123 +msgid "Maximum feedrate of the Z axis" +msgstr "Maximale voedingssnelheid van de Z-as" + +#: src/libslic3r/PrintConfig.cpp:1124 +msgid "Maximum feedrate of the E axis" +msgstr "Maximale extrusievoedingssnelheid" + +#: src/libslic3r/PrintConfig.cpp:1133 +msgid "Maximum acceleration X" +msgstr "Maximale acceleratie X" + +#: src/libslic3r/PrintConfig.cpp:1134 +msgid "Maximum acceleration Y" +msgstr "Maximale acceleratie Y" + +#: src/libslic3r/PrintConfig.cpp:1135 +msgid "Maximum acceleration Z" +msgstr "Maximale acceleratie Z" + +#: src/libslic3r/PrintConfig.cpp:1136 +msgid "Maximum acceleration E" +msgstr "Maximale acceleratie E" + +#: src/libslic3r/PrintConfig.cpp:1139 +msgid "Maximum acceleration of the X axis" +msgstr "Maximale acceleratie van de X-as" + +#: src/libslic3r/PrintConfig.cpp:1140 +msgid "Maximum acceleration of the Y axis" +msgstr "Maximale acceleratie van de Y-as" + +#: src/libslic3r/PrintConfig.cpp:1141 +msgid "Maximum acceleration of the Z axis" +msgstr "Maximale acceleratie van de Z-as" + +#: src/libslic3r/PrintConfig.cpp:1142 +msgid "Maximum acceleration of the E axis" +msgstr "Maximale extrusie-acceleratie" + +#: src/libslic3r/PrintConfig.cpp:1151 +msgid "Maximum jerk X" +msgstr "Maximale ruk X" + +#: src/libslic3r/PrintConfig.cpp:1152 +msgid "Maximum jerk Y" +msgstr "Maximale ruk Y" + +#: src/libslic3r/PrintConfig.cpp:1153 +msgid "Maximum jerk Z" +msgstr "Maximale ruk Z" + +#: src/libslic3r/PrintConfig.cpp:1154 +msgid "Maximum jerk E" +msgstr "Maximale ruk E" + +#: src/libslic3r/PrintConfig.cpp:1157 +msgid "Maximum jerk of the X axis" +msgstr "Maximale ruk van de X-as" + +#: src/libslic3r/PrintConfig.cpp:1158 +msgid "Maximum jerk of the Y axis" +msgstr "Maximale ruk van de Y-as" + +#: src/libslic3r/PrintConfig.cpp:1159 +msgid "Maximum jerk of the Z axis" +msgstr "Maximale ruk van de Z-as" + +#: src/libslic3r/PrintConfig.cpp:1160 +msgid "Maximum jerk of the E axis" +msgstr "Maximale extrusie-ruk" + +#: src/libslic3r/PrintConfig.cpp:1171 +msgid "Minimum feedrate when extruding" +msgstr "Minimale voedingssnelheid tijdens extruderen" + +#: src/libslic3r/PrintConfig.cpp:1173 +msgid "Minimum feedrate when extruding (M205 S)" +msgstr "Minimale voedingssnelheid tijdens extruderen (M205 S)" + +#: src/libslic3r/PrintConfig.cpp:1182 +msgid "Minimum travel feedrate" +msgstr "Minimale voedingssnelheid voor bewegingen" + +#: src/libslic3r/PrintConfig.cpp:1184 +msgid "Minimum travel feedrate (M205 T)" +msgstr "Minimale voedingssnelheid voor bewegingen (M205 T)" + +#: src/libslic3r/PrintConfig.cpp:1193 +msgid "Maximum acceleration when extruding" +msgstr "Maximale acceleratie tijdens extruderen" + +#: src/libslic3r/PrintConfig.cpp:1195 +msgid "Maximum acceleration when extruding (M204 S)" +msgstr "Maximale acceleratie tijdens extruderen (M204 S)" + +#: src/libslic3r/PrintConfig.cpp:1204 +msgid "Maximum acceleration when retracting" +msgstr "Maximale acceleratie tijdens retracten" + +#: src/libslic3r/PrintConfig.cpp:1206 +msgid "Maximum acceleration when retracting (M204 T)" +msgstr "Maximale acceleratie tijdens retracten (M204 T)" + +#: src/libslic3r/PrintConfig.cpp:1214 src/libslic3r/PrintConfig.cpp:1223 +msgid "Max" +msgstr "Max" + +#: src/libslic3r/PrintConfig.cpp:1215 +msgid "This setting represents the maximum speed of your fan." +msgstr "Deze instelling gaat over de maximale snelheid van uw ventilator." + +#: src/libslic3r/PrintConfig.cpp:1224 +#, no-c-format +msgid "" +"This is the highest printable layer height for this extruder, used to cap " +"the variable layer height and support layer height. Maximum recommended " +"layer height is 75% of the extrusion width to achieve reasonable inter-layer " +"adhesion. If set to 0, layer height is limited to 75% of the nozzle diameter." +msgstr "" +"Dit is de hoogst printbare laagdikte voor deze extruder en wordt gebruikt " +"voor de variabele laagdikte en supportlaagdikte. De maximaal aanbevolen " +"laagdikte is 75% van de extrusiebreedte om nog een redelijke laaghechting te " +"krijgen. Als dit ingesteld is op 0, wordt de waarde op 75% van de " +"nozzlediameter genomen." + +#: src/libslic3r/PrintConfig.cpp:1234 +msgid "Max print speed" +msgstr "Maximale printsnelheid" + +#: src/libslic3r/PrintConfig.cpp:1235 +msgid "" +"When setting other speed settings to 0 Slic3r will autocalculate the optimal " +"speed in order to keep constant extruder pressure. This experimental setting " +"is used to set the highest print speed you want to allow." +msgstr "" +"Als de alle snelheidsinstellingen op 0 staan, berekent PrusaSlicer " +"automatisch de optimale snelheid voor een constante extrusiedruk. Deze " +"experimentele instelling wordt gebruikt voor de hoogste printsnelheid die u " +"toestaat." + +#: src/libslic3r/PrintConfig.cpp:1245 +msgid "" +"This experimental setting is used to set the maximum volumetric speed your " +"extruder supports." +msgstr "" +"Deze experimentele instelling wordt gebruikt voor de maximale volumetrische " +"snelheid van de extruder." + +#: src/libslic3r/PrintConfig.cpp:1254 +msgid "Max volumetric slope positive" +msgstr "Maximale volumetrische stijging" + +#: src/libslic3r/PrintConfig.cpp:1255 src/libslic3r/PrintConfig.cpp:1266 +msgid "" +"This experimental setting is used to limit the speed of change in extrusion " +"rate. A value of 1.8 mm³/s² ensures, that a change from the extrusion rate " +"of 1.8 mm³/s (0.45mm extrusion width, 0.2mm extrusion height, feedrate 20 mm/" +"s) to 5.4 mm³/s (feedrate 60 mm/s) will take at least 2 seconds." +msgstr "" +"Deze experimentele instelling wordt gebruikt om de snelheidsveranderingen te " +"limiteren. Een waarde van 1.8mm³/s² zorgt voor een extrusieratio van 1.8mm³/" +"s (0,45mm extrusiebreedte, 0,2mm laagdikte, 20mm/s voedingssnelheid) tot " +"5.4mm³/s (60mm/s voedingssnelheid). Dit duurt ten minste 2sec." + +#: src/libslic3r/PrintConfig.cpp:1259 src/libslic3r/PrintConfig.cpp:1270 +msgid "mm³/s²" +msgstr "mm³/s²" + +#: src/libslic3r/PrintConfig.cpp:1265 +msgid "Max volumetric slope negative" +msgstr "Maximale volumetrische daling" + +#: src/libslic3r/PrintConfig.cpp:1277 src/libslic3r/PrintConfig.cpp:1286 +msgid "Min" +msgstr "Min" + +#: src/libslic3r/PrintConfig.cpp:1278 +msgid "This setting represents the minimum PWM your fan needs to work." +msgstr "" +"Deze instelling geeft de minimale snelheid van uw ventilator aan waarbij de " +"ventilator draait." + +#: src/libslic3r/PrintConfig.cpp:1287 +msgid "" +"This is the lowest printable layer height for this extruder and limits the " +"resolution for variable layer height. Typical values are between 0.05 mm and " +"0.1 mm." +msgstr "" +"Dit is de kleinst printbare laagdikte voor deze extruder en limiteert de " +"resolutie voor variabele laagdikte. Typische waarden zijn tussen 0,05 en 0,1 " +"mm." + +#: src/libslic3r/PrintConfig.cpp:1295 +msgid "Min print speed" +msgstr "Minimale printsnelheid" + +#: src/libslic3r/PrintConfig.cpp:1296 +msgid "Slic3r will not scale speed down below this speed." +msgstr "" +"PrusaSlicer zal de printsnelheid niet verlagen tot onder deze snelheid." + +#: src/libslic3r/PrintConfig.cpp:1303 +msgid "Minimal filament extrusion length" +msgstr "Minimale extrusielengte" + +#: src/libslic3r/PrintConfig.cpp:1304 +msgid "" +"Generate no less than the number of skirt loops required to consume the " +"specified amount of filament on the bottom layer. For multi-extruder " +"machines, this minimum applies to each extruder." +msgstr "" +"Genereer meer dan dit aantal skirtlijnen dat nodig is om de aangegeven " +"hoeveelheid filament op de eerste laag te verbruiken. Voor multi-" +"extruderprinters is dit het minimum voor elke extruder." + +#: src/libslic3r/PrintConfig.cpp:1313 +msgid "Configuration notes" +msgstr "Configuratie-opmerkingen" + +#: src/libslic3r/PrintConfig.cpp:1314 +msgid "" +"You can put here your personal notes. This text will be added to the G-code " +"header comments." +msgstr "" +"Hier kunt u eigen opmerkingen plaatsen. Deze tekst wordt bovenin de G-code " +"toegevoegd." + +#: src/libslic3r/PrintConfig.cpp:1324 +msgid "" +"This is the diameter of your extruder nozzle (for example: 0.5, 0.35 etc.)" +msgstr "Dit is de diameter van uw extruder-nozzle (bijvoorbeeld 0.4)" + +#: src/libslic3r/PrintConfig.cpp:1329 +msgid "Host Type" +msgstr "Hosttype" + +#: src/libslic3r/PrintConfig.cpp:1330 +msgid "" +"Slic3r can upload G-code files to a printer host. This field must contain " +"the kind of the host." +msgstr "" +"PrusaSlicer kan gcode-bestanden uploaden naar een printerhost. Dit veld moet " +"het type host bevatten." + +#: src/libslic3r/PrintConfig.cpp:1343 +msgid "Only retract when crossing perimeters" +msgstr "Alleen retracten bij kruisende perimeters" + +#: src/libslic3r/PrintConfig.cpp:1344 +msgid "" +"Disables retraction when the travel path does not exceed the upper layer's " +"perimeters (and thus any ooze will be probably invisible)." +msgstr "" +"Schakelt retracten uit als de bewegingsroute de perimeters van de bovenste " +"laag niet overschrijdt (en maakt eventueel druipen dus onzichtbaar)." + +#: src/libslic3r/PrintConfig.cpp:1351 +msgid "" +"This option will drop the temperature of the inactive extruders to prevent " +"oozing. It will enable a tall skirt automatically and move extruders outside " +"such skirt when changing temperatures." +msgstr "" +"Deze optie verlaagt de temperatuur van de inactieve extruders om druipen te " +"voorkomen. Het staat een smalle skirt automatisch toe en beweegt extruders " +"buiten zo'n skirt als de temperatuur verandert." + +#: src/libslic3r/PrintConfig.cpp:1358 +msgid "Output filename format" +msgstr "Formaat van bestandsnaam" + +#: src/libslic3r/PrintConfig.cpp:1359 +msgid "" +"You can use all configuration options as variables inside this template. For " +"example: [layer_height], [fill_density] etc. You can also use [timestamp], " +"[year], [month], [day], [hour], [minute], [second], [version], " +"[input_filename], [input_filename_base]." +msgstr "" +"U kunt alle instellingen gebruiken in deze template. U kunt hier ook andere " +"variabelen gebruiken, zoals 'layer_height', 'fill_density', 'timestamp', " +"'year', 'month', 'day', 'hour', 'minute', 'second', 'version', " +"'input_filename', 'input_filename_base', etc." + +#: src/libslic3r/PrintConfig.cpp:1368 +msgid "Detect bridging perimeters" +msgstr "Detecteer brugperimeters" + +#: src/libslic3r/PrintConfig.cpp:1370 +msgid "" +"Experimental option to adjust flow for overhangs (bridge flow will be used), " +"to apply bridge speed to them and enable fan." +msgstr "" +"Experimentele optie om het debiet voor overhanging aan te passen. Het debiet " +"voor bruggen wordt aangehouden, evenals de printsnelheid en de koeling." + +#: src/libslic3r/PrintConfig.cpp:1376 +msgid "Filament parking position" +msgstr "Filament parkeerpositie" + +#: src/libslic3r/PrintConfig.cpp:1377 +msgid "" +"Distance of the extruder tip from the position where the filament is parked " +"when unloaded. This should match the value in printer firmware." +msgstr "" +"Afstand van de nozzlepunt tot de positie waar het filament wordt geparkeerd " +"wanneer dat niet geladen is. Deze moet overeenkomen met de waarde in de " +"firmware." + +#: src/libslic3r/PrintConfig.cpp:1385 +msgid "Extra loading distance" +msgstr "Extra laadafstand" + +#: src/libslic3r/PrintConfig.cpp:1386 +msgid "" +"When set to zero, the distance the filament is moved from parking position " +"during load is exactly the same as it was moved back during unload. When " +"positive, it is loaded further, if negative, the loading move is shorter " +"than unloading." +msgstr "" +"Als dit ingesteld is op 0, zal de afstand die het filament tijdens het laden " +"uit de parkeerpositie even groot zijn als wanneer het filament " +"teruggetrokken wordt. Als de waarde positief is, zal het verder geladen " +"worden. Als het negatief is, is de laadafstand dus korter." + +#: src/libslic3r/PrintConfig.cpp:1394 src/libslic3r/PrintConfig.cpp:1412 +#: src/libslic3r/PrintConfig.cpp:1425 src/libslic3r/PrintConfig.cpp:1435 +msgid "Perimeters" +msgstr "Perimeters" + +#: src/libslic3r/PrintConfig.cpp:1395 +msgid "" +"This is the acceleration your printer will use for perimeters. A high value " +"like 9000 usually gives good results if your hardware is up to the job. Set " +"zero to disable acceleration control for perimeters." +msgstr "" +"Deze acceleratie zal uw printer gebruiken voor perimeters. Als dit ingesteld " +"is op 0, worden acceleratie-instellingen voor perimeters uitgezet." + +#: src/libslic3r/PrintConfig.cpp:1403 +msgid "Perimeter extruder" +msgstr "Perimeterextruder" + +#: src/libslic3r/PrintConfig.cpp:1405 +msgid "" +"The extruder to use when printing perimeters and brim. First extruder is 1." +msgstr "" +"De extruder die gebruikt wordt voor het printen van perimeters en de brim." + +#: src/libslic3r/PrintConfig.cpp:1414 +msgid "" +"Set this to a non-zero value to set a manual extrusion width for perimeters. " +"You may want to use thinner extrudates to get more accurate surfaces. If " +"left zero, default extrusion width will be used if set, otherwise 1.125 x " +"nozzle diameter will be used. If expressed as percentage (for example 200%) " +"it will be computed over layer height." +msgstr "" +"Stel in op een niet-nulwaarde om te werken met manuele extrusiebreedte voor " +"de perimeters. Dit kan gebruikt worden voor nauwkeurigere details. Als dit " +"op 0 blijft staan, zal PrusaSlicer de breedte instellen op 1,125x de " +"nozzlediameter. Als dit is uitgedrukt als percentage, wordt dit berekend " +"over de laagdikte." + +#: src/libslic3r/PrintConfig.cpp:1427 +msgid "" +"Speed for perimeters (contours, aka vertical shells). Set to zero for auto." +msgstr "" +"Snelheid voor de perimeters (contouren, ook wel bekend als verticale " +"shells). Als dit ingesteld is op 0, wordt de snelheid automatisch " +"gedetecteerd." + +#: src/libslic3r/PrintConfig.cpp:1437 +msgid "" +"This option sets the number of perimeters to generate for each layer. Note " +"that Slic3r may increase this number automatically when it detects sloping " +"surfaces which benefit from a higher number of perimeters if the Extra " +"Perimeters option is enabled." +msgstr "" +"Instelling voor het te genereren aantal perimeters per laag. PrusaSlicer kan " +"dit aantal verhogen als het schuine vlakken detecteert die gebruik maken van " +"een hoger aantal perimeters als de optie voor extra perimeters is " +"ingeschakeld." + +#: src/libslic3r/PrintConfig.cpp:1441 +msgid "(minimum)" +msgstr "(minimum)" + +#: src/libslic3r/PrintConfig.cpp:1449 +msgid "" +"If you want to process the output G-code through custom scripts, just list " +"their absolute paths here. Separate multiple scripts with a semicolon. " +"Scripts will be passed the absolute path to the G-code file as the first " +"argument, and they can access the Slic3r config settings by reading " +"environment variables." +msgstr "" +"Als u de output-G-code via custom scripts wilt verwerken, hoeft u alleen de " +"paden hier te plaatsen. Scheid meerdere scripts met een puntkomma. Scripts " +"krijgen als eerste argument het pad naar het gcode-bestand. Ze hebben ook " +"toegang tot de configuratie-instellingen door het lezen van variabelen." + +#: src/libslic3r/PrintConfig.cpp:1461 +msgid "Printer type" +msgstr "Printertype" + +#: src/libslic3r/PrintConfig.cpp:1462 +msgid "Type of the printer." +msgstr "Type van de printer." + +#: src/libslic3r/PrintConfig.cpp:1467 +msgid "Printer notes" +msgstr "Printeropmerkingen" + +#: src/libslic3r/PrintConfig.cpp:1468 +msgid "You can put your notes regarding the printer here." +msgstr "Hier kunnen opmerkingen over de printer geplaatst worden." + +#: src/libslic3r/PrintConfig.cpp:1476 +msgid "Printer vendor" +msgstr "Printerleverancier" + +#: src/libslic3r/PrintConfig.cpp:1477 +msgid "Name of the printer vendor." +msgstr "Naam van de printerleverancier." + +#: src/libslic3r/PrintConfig.cpp:1482 +msgid "Printer variant" +msgstr "Printervariant" + +#: src/libslic3r/PrintConfig.cpp:1483 +msgid "" +"Name of the printer variant. For example, the printer variants may be " +"differentiated by a nozzle diameter." +msgstr "" +"Naam van de printervariant. De nozzlediameter kan bijvoorbeeld afwijken voor " +"verschillende varianten." + +#: src/libslic3r/PrintConfig.cpp:1496 +msgid "Raft layers" +msgstr "Raftlagen" + +#: src/libslic3r/PrintConfig.cpp:1498 +msgid "" +"The object will be raised by this number of layers, and support material " +"will be generated under it." +msgstr "" +"Het object wordt verhoogd met dit aantal lagen. Support wordt onder het " +"object gegenereerd." + +#: src/libslic3r/PrintConfig.cpp:1506 +msgid "Resolution" +msgstr "Resolutie" + +#: src/libslic3r/PrintConfig.cpp:1507 +msgid "" +"Minimum detail resolution, used to simplify the input file for speeding up " +"the slicing job and reducing memory usage. High-resolution models often " +"carry more detail than printers can render. Set to zero to disable any " +"simplification and use full resolution from input." +msgstr "" +"Minimale resolutie van details. Dit wordt gebruikt om het geïmporteerde " +"bestand sneller te slicen, evenals de grootte van de G-code. Modellen met " +"een hoge resolutie vragen meer van een printer dan mogelijk. Als dit " +"ingesteld is op 0, wordt simplificatie uitgeschakeld." + +#: src/libslic3r/PrintConfig.cpp:1517 +msgid "Minimum travel after retraction" +msgstr "Minimale beweging na retracten" + +#: src/libslic3r/PrintConfig.cpp:1518 +msgid "" +"Retraction is not triggered when travel moves are shorter than this length." +msgstr "" +"Retracten is niet geactiveerd als bewegingen korter zijn dan de hier " +"ingevoerde lengte." + +#: src/libslic3r/PrintConfig.cpp:1524 +msgid "Retract amount before wipe" +msgstr "Retracthoeveelheid voor het afvegen" + +#: src/libslic3r/PrintConfig.cpp:1525 +msgid "" +"With bowden extruders, it may be wise to do some amount of quick retract " +"before doing the wipe movement." +msgstr "" +"Met Bowden-extruders is het verstandig om een aantal maal snel te retracten " +"voor het afvegen." + +#: src/libslic3r/PrintConfig.cpp:1532 +msgid "Retract on layer change" +msgstr "Retracten bij laagwisselingen" + +#: src/libslic3r/PrintConfig.cpp:1533 +msgid "This flag enforces a retraction whenever a Z move is done." +msgstr "Dit vinkje geeft aan of wordt teruggetrokken bij een Z-beweging." + +#: src/libslic3r/PrintConfig.cpp:1538 src/libslic3r/PrintConfig.cpp:1546 +msgid "Length" +msgstr "Lengte" + +#: src/libslic3r/PrintConfig.cpp:1539 +msgid "Retraction Length" +msgstr "Retractielengte" + +#: src/libslic3r/PrintConfig.cpp:1540 +msgid "" +"When retraction is triggered, filament is pulled back by the specified " +"amount (the length is measured on raw filament, before it enters the " +"extruder)." +msgstr "" +"Als retracten is geactiveerd, wordt filament teruggetrokken op de ingestelde " +"waarde (filamentlengte voor het de extruder in gaat)." + +#: src/libslic3r/PrintConfig.cpp:1542 src/libslic3r/PrintConfig.cpp:1551 +msgid "mm (zero to disable)" +msgstr "mm (stel in op 0 om uit te schakelen)" + +#: src/libslic3r/PrintConfig.cpp:1547 +msgid "Retraction Length (Toolchange)" +msgstr "Retractielengte (toolwissel)" + +#: src/libslic3r/PrintConfig.cpp:1548 +msgid "" +"When retraction is triggered before changing tool, filament is pulled back " +"by the specified amount (the length is measured on raw filament, before it " +"enters the extruder)." +msgstr "" +"Als retracten is geactiveerd voor toolwisseling wordt filament " +"teruggetrokken op de ingestelde waarde (filamentlengte voor het de extruder " +"in gaat)." + +#: src/libslic3r/PrintConfig.cpp:1556 +msgid "Lift Z" +msgstr "Beweeg Z omhoog" + +#: src/libslic3r/PrintConfig.cpp:1557 +msgid "" +"If you set this to a positive value, Z is quickly raised every time a " +"retraction is triggered. When using multiple extruders, only the setting for " +"the first extruder will be considered." +msgstr "" +"Als u dit instelt op een positieve waarde, beweegt de nozzle telkens " +"enigszins omhoog bij het retracten. Als meerdere extruders worden gebruikt, " +"wordt alleen de instelling van de eerste extruder aangehouden." + +#: src/libslic3r/PrintConfig.cpp:1564 +msgid "Above Z" +msgstr "Boven Z" + +#: src/libslic3r/PrintConfig.cpp:1565 +msgid "Only lift Z above" +msgstr "Beweeg Z alleen omhoog boven" + +#: src/libslic3r/PrintConfig.cpp:1566 +msgid "" +"If you set this to a positive value, Z lift will only take place above the " +"specified absolute Z. You can tune this setting for skipping lift on the " +"first layers." +msgstr "" +"Als dit ingesteld is op een positieve waarde, zal de nozzle alleen boven de " +"ingestelde waarde omhoog bewegen voor het retracten. Deze kan aangepast " +"worden om warping te voorkomen bij de eerste lagen." + +#: src/libslic3r/PrintConfig.cpp:1573 +msgid "Below Z" +msgstr "Onder Z" + +#: src/libslic3r/PrintConfig.cpp:1574 +msgid "Only lift Z below" +msgstr "Beweeg Z alleen omhoog onder" + +#: src/libslic3r/PrintConfig.cpp:1575 +msgid "" +"If you set this to a positive value, Z lift will only take place below the " +"specified absolute Z. You can tune this setting for limiting lift to the " +"first layers." +msgstr "" +"Als dit ingesteld is op een positieve waarde, zal de nozzle alleen onder de " +"ingestelde waarde omhoog bewegen bij het retracten." + +#: src/libslic3r/PrintConfig.cpp:1583 src/libslic3r/PrintConfig.cpp:1591 +msgid "Extra length on restart" +msgstr "Extra lengte bij een herstart" + +#: src/libslic3r/PrintConfig.cpp:1584 +msgid "" +"When the retraction is compensated after the travel move, the extruder will " +"push this additional amount of filament. This setting is rarely needed." +msgstr "" +"Als retracten wordt gecompenseerd na een beweging, wordt deze extra " +"hoeveelheid filament geëxtrudeerd. Deze instelling is zelden van toepassing." + +#: src/libslic3r/PrintConfig.cpp:1592 +msgid "" +"When the retraction is compensated after changing tool, the extruder will " +"push this additional amount of filament." +msgstr "" +"Als retracten wordt gecompenseerd na een toolwisseling, wordt deze extra " +"hoeveelheid filament geëxtrudeerd." + +#: src/libslic3r/PrintConfig.cpp:1599 src/libslic3r/PrintConfig.cpp:1600 +msgid "Retraction Speed" +msgstr "Retractiesnelheid" + +#: src/libslic3r/PrintConfig.cpp:1601 +msgid "The speed for retractions (it only applies to the extruder motor)." +msgstr "De snelheid voor retracties (geldt alleen voor de extrudermotor)." + +#: src/libslic3r/PrintConfig.cpp:1607 src/libslic3r/PrintConfig.cpp:1608 +msgid "Deretraction Speed" +msgstr "Deretractiesnelheid" + +#: src/libslic3r/PrintConfig.cpp:1609 +msgid "" +"The speed for loading of a filament into extruder after retraction (it only " +"applies to the extruder motor). If left to zero, the retraction speed is " +"used." +msgstr "" +"De laadsnelheid van filament in de extruder na het retracten (geldt alleen " +"voor de extrudermotor). Als dit ingesteld is op 0, wordt de " +"retractiesnelheid gebruikt." + +#: src/libslic3r/PrintConfig.cpp:1616 +msgid "Seam position" +msgstr "Naadpositie" + +#: src/libslic3r/PrintConfig.cpp:1618 +msgid "Position of perimeters starting points." +msgstr "Startpuntpositie van perimeters." + +#: src/libslic3r/PrintConfig.cpp:1624 +msgid "Random" +msgstr "Willekeurig" + +#: src/libslic3r/PrintConfig.cpp:1625 +msgid "Nearest" +msgstr "Dichstbijzijnd" + +#: src/libslic3r/PrintConfig.cpp:1626 +msgid "Aligned" +msgstr "Uitgelijnd" + +#: src/libslic3r/PrintConfig.cpp:1634 +msgid "Direction" +msgstr "Richting" + +#: src/libslic3r/PrintConfig.cpp:1636 +msgid "Preferred direction of the seam" +msgstr "Richtingsvoorkeur voor de naad" + +#: src/libslic3r/PrintConfig.cpp:1637 +msgid "Seam preferred direction" +msgstr "Richtingsvoorkeur voor de naad" + +#: src/libslic3r/PrintConfig.cpp:1644 +msgid "Jitter" +msgstr "Jitter" + +#: src/libslic3r/PrintConfig.cpp:1646 +msgid "Seam preferred direction jitter" +msgstr "Voorkeursrichting voor de naad - jitter" + +#: src/libslic3r/PrintConfig.cpp:1647 +msgid "Preferred direction of the seam - jitter" +msgstr "Voorkeursrichting voor de naad - jitter" + +#: src/libslic3r/PrintConfig.cpp:1657 +msgid "USB/serial port for printer connection." +msgstr "USB/seriële poort voor verbinding met de printer." + +#: src/libslic3r/PrintConfig.cpp:1664 +msgid "Serial port speed" +msgstr "Snelheid van de seriële poort" + +#: src/libslic3r/PrintConfig.cpp:1665 +msgid "Speed (baud) of USB/serial port for printer connection." +msgstr "" +"Snelheid (baud) van de USB/seriële poort voor de verbinding met de printer." + +#: src/libslic3r/PrintConfig.cpp:1674 +msgid "Distance from object" +msgstr "Afstand vanaf het object" + +#: src/libslic3r/PrintConfig.cpp:1675 +msgid "" +"Distance between skirt and object(s). Set this to zero to attach the skirt " +"to the object(s) and get a brim for better adhesion." +msgstr "" +"Afstand tussen skirt en object. Als dit ingesteld is op 0, wordt de skirt " +"aan het object vastgemaakt; het fungeert dan als brim." + +#: src/libslic3r/PrintConfig.cpp:1682 +msgid "Skirt height" +msgstr "Skirthoogte" + +#: src/libslic3r/PrintConfig.cpp:1683 +msgid "" +"Height of skirt expressed in layers. Set this to a tall value to use skirt " +"as a shield against drafts." +msgstr "" +"Hoogte van de skirt uitgedrukt in het aantal lagen. Stel in op een hoge " +"waarde om te gebruiken als afscherming tegen tocht." + +#: src/libslic3r/PrintConfig.cpp:1690 +msgid "Loops (minimum)" +msgstr "Rondjes (minimaal)" + +#: src/libslic3r/PrintConfig.cpp:1691 +msgid "Skirt Loops" +msgstr "Rondjes voor de skirt" + +#: src/libslic3r/PrintConfig.cpp:1692 +msgid "" +"Number of loops for the skirt. If the Minimum Extrusion Length option is " +"set, the number of loops might be greater than the one configured here. Set " +"this to zero to disable skirt completely." +msgstr "" +"Het aantal rondjes van de skirt. Als de 'minimale extrusielengte'-optie is " +"ingesteld kan dit aantal rondjes groter zijn dan hier is ingesteld. Als dit " +"ingesteld is op 0, wordt de skirt uitgeschakeld." + +#: src/libslic3r/PrintConfig.cpp:1700 +msgid "Slow down if layer print time is below" +msgstr "Vertraag bij een kortere laagprinttijd dan" + +#: src/libslic3r/PrintConfig.cpp:1701 +msgid "" +"If layer print time is estimated below this number of seconds, print moves " +"speed will be scaled down to extend duration to this value." +msgstr "" +"Als de laagprinttijd wordt berekend onder dit aantal seconden, wordt de " +"printsnelheid verlaagd om de laagprinttijd te verlengen." + +#: src/libslic3r/PrintConfig.cpp:1711 +msgid "Small perimeters" +msgstr "Smalle perimeters" + +#: src/libslic3r/PrintConfig.cpp:1713 +msgid "" +"This separate setting will affect the speed of perimeters having radius <= " +"6.5mm (usually holes). If expressed as percentage (for example: 80%) it will " +"be calculated on the perimeters speed setting above. Set to zero for auto." +msgstr "" +"Deze instelling heeft effect op de snelheid van perimeters met een radius <= " +"6.5mm. Als dit is uitgedrukt als percentage, wordt deze genomen over de " +"snelheid van de perimeters. Als dit ingesteld is op 0, wordt een " +"automatische snelheid genomen." + +#: src/libslic3r/PrintConfig.cpp:1723 +msgid "Solid infill threshold area" +msgstr "Dichte vulling bij oppervlak" + +#: src/libslic3r/PrintConfig.cpp:1725 +msgid "" +"Force solid infill for regions having a smaller area than the specified " +"threshold." +msgstr "" +"Forceer dichte vulling voor delen met een kleiner doorsnee-oppervlak dan de " +"hier ingestelde waarde." + +#: src/libslic3r/PrintConfig.cpp:1726 +msgid "mm²" +msgstr "mm²" + +#: src/libslic3r/PrintConfig.cpp:1732 +msgid "Solid infill extruder" +msgstr "Extruder voor dichte vulling" + +#: src/libslic3r/PrintConfig.cpp:1734 +msgid "The extruder to use when printing solid infill." +msgstr "De extruder die gebruikt wordt voor het printen van dichte vullingen." + +#: src/libslic3r/PrintConfig.cpp:1740 +msgid "Solid infill every" +msgstr "Dichte vulling elke" + +#: src/libslic3r/PrintConfig.cpp:1742 +msgid "" +"This feature allows to force a solid layer every given number of layers. " +"Zero to disable. You can set this to any value (for example 9999); Slic3r " +"will automatically choose the maximum possible number of layers to combine " +"according to nozzle diameter and layer height." +msgstr "" +"Deze optie staat het genereren van een dichte laag tussen het ingestelde " +"aantal lagen toe. Stel in op 0 om dit uit te schakelen. Stel dit in op een " +"waarde; PrusaSlicer zal dan automatisch het maximaal aantal lagen kiezen om " +"te combineren op basis van de nozzlediameter en de laagdikte." + +#: src/libslic3r/PrintConfig.cpp:1754 +msgid "" +"Set this to a non-zero value to set a manual extrusion width for infill for " +"solid surfaces. If left zero, default extrusion width will be used if set, " +"otherwise 1.125 x nozzle diameter will be used. If expressed as percentage " +"(for example 90%) it will be computed over layer height." +msgstr "" +"Stel in op een niet-nulwaarde om te werken met manuele extrusiebreedte voor " +"de vulling van dichte lagen. Als die op 0 blijft staan, zal PrusaSlicer de " +"breedte instellen op 1,125x de nozzlediameter. Als dit is uitgedrukt als " +"percentage, wordt dit berekend over de laagdikte." + +#: src/libslic3r/PrintConfig.cpp:1765 +msgid "" +"Speed for printing solid regions (top/bottom/internal horizontal shells). " +"This can be expressed as a percentage (for example: 80%) over the default " +"infill speed above. Set to zero for auto." +msgstr "" +"Printsnelheid voor dichte delen. Als dit is uitgedrukt als percentage, wordt " +"dit berekend over de standaard vullingssnelheid. Als dit ingesteld is op 0, " +"worden automatische waarden genomen." + +#: src/libslic3r/PrintConfig.cpp:1777 +msgid "Number of solid layers to generate on top and bottom surfaces." +msgstr "Aantal te genereren dichte lagen voor boven- en ondervlakken." + +#: src/libslic3r/PrintConfig.cpp:1783 +msgid "Spiral vase" +msgstr "Spiraalmodus" + +#: src/libslic3r/PrintConfig.cpp:1784 +msgid "" +"This feature will raise Z gradually while printing a single-walled object in " +"order to remove any visible seam. This option requires a single perimeter, " +"no infill, no top solid layers and no support material. You can still set " +"any number of bottom solid layers as well as skirt/brim loops. It won't work " +"when printing more than an object." +msgstr "" +"Deze optie zorgt dat Z stapsgewijs omhoog gaat als een object met een enkele " +"perimeter geprint wordt om een naadlijn te voorkomen. Voor deze optie is een " +"enkele perimeter nodig; vulling, bovenlagen en support zijn niet mogelijk. " +"Bodemlagen zijn wel mogelijk, evenals een skirt en brim. Werkt niet bij het " +"printen van meerdere objecten tegelijk." + +#: src/libslic3r/PrintConfig.cpp:1792 +msgid "Temperature variation" +msgstr "Temperatuurverschil" + +#: src/libslic3r/PrintConfig.cpp:1793 +msgid "" +"Temperature difference to be applied when an extruder is not active. Enables " +"a full-height \"sacrificial\" skirt on which the nozzles are periodically " +"wiped." +msgstr "" +"Temperatuurverschil dat wordt toegepast als een extruder niet actief is. Dit " +"genereert een afveegblok waarop de nozzle wordt schoongeveegd." + +#: src/libslic3r/PrintConfig.cpp:1803 +msgid "" +"This start procedure is inserted at the beginning, after bed has reached the " +"target temperature and extruder just started heating, and before extruder " +"has finished heating. If PrusaSlicer detects M104 or M190 in your custom " +"codes, such commands will not be prepended automatically so you're free to " +"customize the order of heating commands and other custom actions. Note that " +"you can use placeholder variables for all PrusaSlicer settings, so you can " +"put a \"M109 S[first_layer_temperature]\" command wherever you want." +msgstr "" +"Deze startprocedure wordt aan het begin ingevoegd, nadat het bed de gewenste " +"temperatuur heeft bereikt, de extruder is begonnen met verwarmen en de " +"extruder klaar is met verwarmen. Als PrusaSlicer M104 of M190 detecteert in " +"uw custom codes, zullen dergelijke commando's niet automatisch worden " +"voorbereid, zodat u vrij bent om de volgorde van de verwarmingscommando's en " +"andere aangepaste acties aan te passen. Merk op dat u voor alle PrusaSlicer-" +"instellingen variabelen kunt gebruiken." + +#: src/libslic3r/PrintConfig.cpp:1818 +msgid "" +"This start procedure is inserted at the beginning, after any printer start " +"gcode (and after any toolchange to this filament in case of multi-material " +"printers). This is used to override settings for a specific filament. If " +"PrusaSlicer detects M104, M109, M140 or M190 in your custom codes, such " +"commands will not be prepended automatically so you're free to customize the " +"order of heating commands and other custom actions. Note that you can use " +"placeholder variables for all PrusaSlicer settings, so you can put a \"M109 " +"S[first_layer_temperature]\" command wherever you want. If you have multiple " +"extruders, the gcode is processed in extruder order." +msgstr "" +"Deze startprocedure wordt aan het begin ingevoegd, na een eventuele " +"printerstart G-code (en na een eventuele toolwissel op dit filament in het " +"geval van multi-materialprinters). Dit wordt gebruikt om de instellingen " +"voor een specifieke filament te overschrijven. Als PrusaSlicer M104, M109, " +"M140 of M190 detecteert in de custom codes, zullen dergelijke commando's " +"niet automatisch worden voorgeprogrammeerd, zodat u vrij bent om de volgorde " +"van de verwarmingscommando's en andere aangepaste acties aan te passen. Merk " +"op dat u variabelen kunt gebruiken voor alle PrusaSlicer-instellingen. Als u " +"meerdere extruders hebt, wordt de G-code in de volgorde van de extruders " +"verwerkt." + +#: src/libslic3r/PrintConfig.cpp:1834 +msgid "Single Extruder Multi Material" +msgstr "Multi-material met één extruder" + +#: src/libslic3r/PrintConfig.cpp:1835 +msgid "The printer multiplexes filaments into a single hot end." +msgstr "De printer mengt filament in een enkele extruder." + +#: src/libslic3r/PrintConfig.cpp:1840 +msgid "Prime all printing extruders" +msgstr "Veeg alle printextruders af" + +#: src/libslic3r/PrintConfig.cpp:1841 +msgid "" +"If enabled, all printing extruders will be primed at the front edge of the " +"print bed at the start of the print." +msgstr "" +"Alle extruders worden afgeveegd aan de voorzijde van het printbed aan het " +"begin van de print als dit aanstaat." + +#: src/libslic3r/PrintConfig.cpp:1846 +msgid "No sparse layers (EXPERIMENTAL)" +msgstr "Geen smalle lagen (experimenteel)" + +#: src/libslic3r/PrintConfig.cpp:1847 +msgid "" +"If enabled, the wipe tower will not be printed on layers with no " +"toolchanges. On layers with a toolchange, extruder will travel downward to " +"print the wipe tower. User is responsible for ensuring there is no collision " +"with the print." +msgstr "" +"Het afveegblok wordt niet geprint bij lagen zonder toolwisselingen als dit " +"is ingeschakeld. Op lagen met een toolwissel zal de extruder neerwaarts " +"bewegen naar het afveegblok. De gebruiker is verantwoordelijk voor eventuele " +"botsingen met de print." + +#: src/libslic3r/PrintConfig.cpp:1854 +msgid "Generate support material" +msgstr "Genereer support" + +#: src/libslic3r/PrintConfig.cpp:1856 +msgid "Enable support material generation." +msgstr "Sta de generatie van support toe." + +#: src/libslic3r/PrintConfig.cpp:1860 +msgid "Auto generated supports" +msgstr "Automatisch gegenereerd support" + +#: src/libslic3r/PrintConfig.cpp:1862 +msgid "" +"If checked, supports will be generated automatically based on the overhang " +"threshold value. If unchecked, supports will be generated inside the " +"\"Support Enforcer\" volumes only." +msgstr "" +"Support wordt automatisch gegenereerd als dit aan staat. Als dit niet " +"aanstaat zal support alleen bij supportforceringen gegenereerd worden." + +#: src/libslic3r/PrintConfig.cpp:1868 +msgid "XY separation between an object and its support" +msgstr "Horizontale ruimte tussen object en support" + +#: src/libslic3r/PrintConfig.cpp:1870 +msgid "" +"XY separation between an object and its support. If expressed as percentage " +"(for example 50%), it will be calculated over external perimeter width." +msgstr "" +"Horizontale ruimte tussen object en support. Als dit is uitgedrukt als " +"percentage, wordt deze berekend over de breedte van de buitenste perimeter." + +#: src/libslic3r/PrintConfig.cpp:1880 +msgid "Pattern angle" +msgstr "Patroonhoek" + +#: src/libslic3r/PrintConfig.cpp:1882 +msgid "" +"Use this setting to rotate the support material pattern on the horizontal " +"plane." +msgstr "Gebruik deze instelling om het patroon van het support te draaien." + +#: src/libslic3r/PrintConfig.cpp:1892 src/libslic3r/PrintConfig.cpp:2644 +msgid "" +"Only create support if it lies on a build plate. Don't create support on a " +"print." +msgstr "" +"Genereer alleen support als dit op het bed geplaatst wordt, dus niet op de " +"print zelf." + +#: src/libslic3r/PrintConfig.cpp:1898 +msgid "Contact Z distance" +msgstr "Contact Z-afstand" + +#: src/libslic3r/PrintConfig.cpp:1900 +msgid "" +"The vertical distance between object and support material interface. Setting " +"this to 0 will also prevent Slic3r from using bridge flow and speed for the " +"first object layer." +msgstr "" +"De afstand tussen objecten en het support. Stel in op 0 om te voorkomen dat " +"PrusaSlicer bruginstellingen gebruikt voor de eerste laag boven het " +"supportdak." + +#: src/libslic3r/PrintConfig.cpp:1907 +msgid "0 (soluble)" +msgstr "0 (oplosbaar)" + +#: src/libslic3r/PrintConfig.cpp:1908 +msgid "0.2 (detachable)" +msgstr "0.2 (losbreekbaar)" + +#: src/libslic3r/PrintConfig.cpp:1913 +msgid "Enforce support for the first" +msgstr "Forceer support voor de eerste" + +#: src/libslic3r/PrintConfig.cpp:1915 +msgid "" +"Generate support material for the specified number of layers counting from " +"bottom, regardless of whether normal support material is enabled or not and " +"regardless of any angle threshold. This is useful for getting more adhesion " +"of objects having a very thin or poor footprint on the build plate." +msgstr "" +"Genereer support voor het ingevoerde aantal lagen, tellend vanaf de bodem, " +"ongeacht de plekken waar standaard support al dan niet is toegestaan, " +"waarbij de ingesteld hoek wordt aangehouden. Dit is handig om meer hechting " +"op het bed te verkrijgen bij objecten met een klein contactoppervlak." + +#: src/libslic3r/PrintConfig.cpp:1920 +msgid "Enforce support for the first n layers" +msgstr "Forceer support voor de eerste n lagen" + +#: src/libslic3r/PrintConfig.cpp:1926 +msgid "Support material/raft/skirt extruder" +msgstr "Extruder voor support/raft/skirt" + +#: src/libslic3r/PrintConfig.cpp:1928 +msgid "" +"The extruder to use when printing support material, raft and skirt (1+, 0 to " +"use the current extruder to minimize tool changes)." +msgstr "" +"De extruder die gebruikt wordt voor support, raft en skirt (stel in op 1 of " +"op 0 om de huidige extruder te gebruiken)." + +#: src/libslic3r/PrintConfig.cpp:1937 +msgid "" +"Set this to a non-zero value to set a manual extrusion width for support " +"material. If left zero, default extrusion width will be used if set, " +"otherwise nozzle diameter will be used. If expressed as percentage (for " +"example 90%) it will be computed over layer height." +msgstr "" +"Stel in op een niet-nulwaarde om te werken met manuele extrusiebreedte voor " +"het support. Als die op 0 blijft staan, zal PrusaSlicer de breedte instellen " +"zelf bepalen op basis van de nozzlediameter. Als dit is uitgedrukt als " +"percentage, wordt dit berekend over de laagdikte." + +#: src/libslic3r/PrintConfig.cpp:1946 +msgid "Interface loops" +msgstr "Interface rondjes" + +#: src/libslic3r/PrintConfig.cpp:1948 +msgid "" +"Cover the top contact layer of the supports with loops. Disabled by default." +msgstr "" +"Bedek de bovenste interfacelagen van het support met rondjes. Staat " +"standaard uit." + +#: src/libslic3r/PrintConfig.cpp:1953 +msgid "Support material/raft interface extruder" +msgstr "Extruder voor supportdak en de bovenlaag van de raft" + +#: src/libslic3r/PrintConfig.cpp:1955 +msgid "" +"The extruder to use when printing support material interface (1+, 0 to use " +"the current extruder to minimize tool changes). This affects raft too." +msgstr "" +"De extruder die gebruikt wordt voor de supportinterface (stel in op hoger " +"dan 1 of op 0 om de huidige extruder te gebruiken voor minder " +"toolwisselingen). Dit heeft ook effect op de raft." + +#: src/libslic3r/PrintConfig.cpp:1962 +msgid "Interface layers" +msgstr "Supportinterface-lagen" + +#: src/libslic3r/PrintConfig.cpp:1964 +msgid "" +"Number of interface layers to insert between the object(s) and support " +"material." +msgstr "Aantal interface-lagen tussen het support en het object." + +#: src/libslic3r/PrintConfig.cpp:1971 +msgid "Interface pattern spacing" +msgstr "Tussenafstand voor interface" + +#: src/libslic3r/PrintConfig.cpp:1973 +msgid "Spacing between interface lines. Set zero to get a solid interface." +msgstr "" +"Ruimte tussen lijnen van supportinterface. Als dit ingesteld is op 0, wordt " +"een dicht supportinterface gegenereerd." + +#: src/libslic3r/PrintConfig.cpp:1982 +msgid "" +"Speed for printing support material interface layers. If expressed as " +"percentage (for example 50%) it will be calculated over support material " +"speed." +msgstr "" +"Printsnelheid van supportinterface-lagen. Als dit is uitgedrukt als " +"percentage, wordt dit berekend over de snelheid van het support." + +#: src/libslic3r/PrintConfig.cpp:1991 +msgid "Pattern" +msgstr "Patroon" + +#: src/libslic3r/PrintConfig.cpp:1993 +msgid "Pattern used to generate support material." +msgstr "Patroon dat gebruikt wordt voor het support." + +#: src/libslic3r/PrintConfig.cpp:1999 +msgid "Rectilinear grid" +msgstr "Rechtlijnig raster" + +#: src/libslic3r/PrintConfig.cpp:2005 +msgid "Pattern spacing" +msgstr "Tussenafstand van het patroon" + +#: src/libslic3r/PrintConfig.cpp:2007 +msgid "Spacing between support material lines." +msgstr "Afstand tussen supportlijnen." + +#: src/libslic3r/PrintConfig.cpp:2016 +msgid "Speed for printing support material." +msgstr "Printsnelheid van support." + +#: src/libslic3r/PrintConfig.cpp:2023 +msgid "Synchronize with object layers" +msgstr "Synchroniseer met objectlagen" + +#: src/libslic3r/PrintConfig.cpp:2025 +msgid "" +"Synchronize support layers with the object print layers. This is useful with " +"multi-material printers, where the extruder switch is expensive." +msgstr "" +"Synchroniseer de supportlagen met de objectlagen. Dit is handig voor multi-" +"materialprinters waar een toolwissel duur is." + +#: src/libslic3r/PrintConfig.cpp:2031 +msgid "Overhang threshold" +msgstr "Maximale overhanghoek" + +#: src/libslic3r/PrintConfig.cpp:2033 +msgid "" +"Support material will not be generated for overhangs whose slope angle (90° " +"= vertical) is above the given threshold. In other words, this value " +"represent the most horizontal slope (measured from the horizontal plane) " +"that you can print without support material. Set to zero for automatic " +"detection (recommended)." +msgstr "" +"Support wordt niet gegenereerd als de overhanghoek boven de gegeven waarde " +"ligt. In andere woorden; deze waarde geeft de hoek met het bed aan die " +"geprint moet worden met support. Als dit ingesteld is op 0, wordt dit " +"automatisch gedetecteerd (aanbevolen)." + +#: src/libslic3r/PrintConfig.cpp:2045 +msgid "With sheath around the support" +msgstr "Met schild rond het support" + +#: src/libslic3r/PrintConfig.cpp:2047 +msgid "" +"Add a sheath (a single perimeter line) around the base support. This makes " +"the support more reliable, but also more difficult to remove." +msgstr "" +"Voeg een schild (één perimeterlijn) rondom het support toe. Dit maakt het " +"support betrouwbaarder maar ook moeilijker te verwijderen." + +#: src/libslic3r/PrintConfig.cpp:2054 +msgid "" +"Extruder temperature for layers after the first one. Set this to zero to " +"disable temperature control commands in the output." +msgstr "" +"Extrudertemperatuur voor lager direct na de eerste laag. Als dit ingesteld " +"is op 0, voorkomt dit een verschil in de output." + +#: src/libslic3r/PrintConfig.cpp:2062 +msgid "Detect thin walls" +msgstr "Detecteer dunne wanden" + +#: src/libslic3r/PrintConfig.cpp:2064 +msgid "" +"Detect single-width walls (parts where two extrusions don't fit and we need " +"to collapse them into a single trace)." +msgstr "" +"Detecteer éénlijnige wanden (delen waar 2 extrusielijnen niet passen en dit " +"geprint moet worden met 1 lijn)." + +#: src/libslic3r/PrintConfig.cpp:2070 +msgid "Threads" +msgstr "Meerdere processen" + +#: src/libslic3r/PrintConfig.cpp:2071 +msgid "" +"Threads are used to parallelize long-running tasks. Optimal threads number " +"is slightly above the number of available cores/processors." +msgstr "" +"Meerdere processen worden gebruikt om langdurige commando's parallel te " +"draaien. Het optimaal aantal processen is vlak boven het aanwezige aantal " +"kernen/processoren." + +#: src/libslic3r/PrintConfig.cpp:2083 +msgid "" +"This custom code is inserted before every toolchange. Placeholder variables " +"for all PrusaSlicer settings as well as {previous_extruder} and " +"{next_extruder} can be used. When a tool-changing command which changes to " +"the correct extruder is included (such as T{next_extruder}), PrusaSlicer " +"will emit no other such command. It is therefore possible to script custom " +"behaviour both before and after the toolchange." +msgstr "" +"Deze custom code wordt ingevoegd voor elke toolwissel. Zowel variabelen van " +"alle PrusaSlicer-instellingen als 'previous_extruder' en 'next_extruder' " +"kunnen gebruikt worden. Als een toolwissel-commando (bijvoorbeeld " +"'T[next_extruder]') is ingevoegd, zal PrusaSlicer niet nog een dergelijk " +"commando invoegen. Het is daarom mogelijk om voor én na de toolwissel een " +"custom script te draaien." + +#: src/libslic3r/PrintConfig.cpp:2096 +msgid "" +"Set this to a non-zero value to set a manual extrusion width for infill for " +"top surfaces. You may want to use thinner extrudates to fill all narrow " +"regions and get a smoother finish. If left zero, default extrusion width " +"will be used if set, otherwise nozzle diameter will be used. If expressed as " +"percentage (for example 90%) it will be computed over layer height." +msgstr "" +"Stel in op een niet-nulwaarde om te werken met manuele extrusiebreedte voor " +"de vulling van bovenvlakken. Dit kan gebruikt worden voor een dunner " +"extrudaat in smalle gebieden voor een gladdere afwerking. Als dit is " +"uitgedrukt als percentage, wordt dit berekend over de laagdikte." + +#: src/libslic3r/PrintConfig.cpp:2108 +msgid "" +"Speed for printing top solid layers (it only applies to the uppermost " +"external layers and not to their internal solid layers). You may want to " +"slow down this to get a nicer surface finish. This can be expressed as a " +"percentage (for example: 80%) over the solid infill speed above. Set to zero " +"for auto." +msgstr "" +"Printsnelheid voor dichte toplagen (alleen de buitenste zichtbare laag). Als " +"deze waarde lager wordt gezet, resulteert dit in een gladder oppervlak. Als " +"dit is uitgedrukt als percentage, wordt dit berekend over de " +"vullingssnelheid. Als dit ingesteld is op 0, wordt een automatische snelheid " +"genomen." + +#: src/libslic3r/PrintConfig.cpp:2123 +msgid "Number of solid layers to generate on top surfaces." +msgstr "Aantal te genereren dichte lagen voor bovenvlakken." + +#: src/libslic3r/PrintConfig.cpp:2124 +msgid "Top solid layers" +msgstr "Bovenste dichte vulling" + +#: src/libslic3r/PrintConfig.cpp:2130 +msgid "Speed for travel moves (jumps between distant extrusion points)." +msgstr "Bewegingssnelheid als niet geëxtrudeerd wordt." + +#: src/libslic3r/PrintConfig.cpp:2138 +msgid "Use firmware retraction" +msgstr "Gebruik de firmware-retractie" + +#: src/libslic3r/PrintConfig.cpp:2139 +msgid "" +"This experimental setting uses G10 and G11 commands to have the firmware " +"handle the retraction. This is only supported in recent Marlin." +msgstr "" +"Deze experimentele instelling gebruikt G10 en G11 commando's voor het " +"retracten in de firmware. Dit wordt alleen ondersteunt bij de recente Marlin-" +"variant." + +#: src/libslic3r/PrintConfig.cpp:2145 +msgid "Use relative E distances" +msgstr "Gebruik relatieve E-waarden" + +#: src/libslic3r/PrintConfig.cpp:2146 +msgid "" +"If your firmware requires relative E values, check this, otherwise leave it " +"unchecked. Most firmwares use absolute values." +msgstr "" +"Als uw firmware relatieve extrusiewaarden nodig heeft, vink dit dan aan. " +"Laat het ander uit staan. De meeste firmware gebruiken absolute waarden." + +#: src/libslic3r/PrintConfig.cpp:2152 +msgid "Use volumetric E" +msgstr "Gebruik volumetrische E-waarden" + +#: src/libslic3r/PrintConfig.cpp:2153 +msgid "" +"This experimental setting uses outputs the E values in cubic millimeters " +"instead of linear millimeters. If your firmware doesn't already know " +"filament diameter(s), you can put commands like 'M200 D[filament_diameter_0] " +"T0' in your start G-code in order to turn volumetric mode on and use the " +"filament diameter associated to the filament selected in Slic3r. This is " +"only supported in recent Marlin." +msgstr "" +"Deze experimentele instelling gebruikt E-waarden in kubieke millimeters in " +"plaats van lineaire millimeters. Als uw firmware nog niet weet wat de " +"filamentdiameter is, kunt u een commando zoals 'M200 D[filament_diameter_0] " +"T0' in de start G-code invoegen om de volumetrische modus te gebruiken. Deze " +"variabele gebruikt de filamentdiameter zoals ingevoerd bij de " +"filamentinstellingen. Dit wordt alleen ondersteund in de recente Marlin-" +"variant." + +#: src/libslic3r/PrintConfig.cpp:2163 +msgid "Enable variable layer height feature" +msgstr "Sta variabele laagdikte toe" + +#: src/libslic3r/PrintConfig.cpp:2164 +msgid "" +"Some printers or printer setups may have difficulties printing with a " +"variable layer height. Enabled by default." +msgstr "" +"Sommige printers of printersetups kunnen niet printen met een variabele " +"laagdikte. Staat standaard aan." + +#: src/libslic3r/PrintConfig.cpp:2170 +msgid "Wipe while retracting" +msgstr "Veeg af bij het retracten" + +#: src/libslic3r/PrintConfig.cpp:2171 +msgid "" +"This flag will move the nozzle while retracting to minimize the possible " +"blob on leaky extruders." +msgstr "" +"Als u dit aanvinkt beweegt de nozzle tijdens het retracten om een blob of " +"lekkende extruders tegen te gaan." + +#: src/libslic3r/PrintConfig.cpp:2178 +msgid "" +"Multi material printers may need to prime or purge extruders on tool " +"changes. Extrude the excess material into the wipe tower." +msgstr "" +"Multi-materialprinters moeten afvegen bij toolwisselingen. Extrudeer het " +"overtollige materiaal op het afveegblok." + +#: src/libslic3r/PrintConfig.cpp:2184 +msgid "Purging volumes - load/unload volumes" +msgstr "Afveegvolume - laad/ontlaad volumes" + +#: src/libslic3r/PrintConfig.cpp:2185 +msgid "" +"This vector saves required volumes to change from/to each tool used on the " +"wipe tower. These values are used to simplify creation of the full purging " +"volumes below." +msgstr "" +"Deze vector bespaart de benodigde volumes om van/naar elke extruder dat op " +"het afveegblok wordt gebruikt te wisselen. Deze waarden worden gebruikt om " +"het creëren van de onderstaande volledige reinigingsvolumes te " +"vereenvoudigen." + +#: src/libslic3r/PrintConfig.cpp:2191 +msgid "Purging volumes - matrix" +msgstr "Afveegvolume - matrix" + +#: src/libslic3r/PrintConfig.cpp:2192 +msgid "" +"This matrix describes volumes (in cubic milimetres) required to purge the " +"new filament on the wipe tower for any given pair of tools." +msgstr "" +"Deze matrix beschrijft volume (in mm³) dat is vereist om nieuw filament af " +"te vegen aan het afveegblok voor elk paar van extruders." + +#: src/libslic3r/PrintConfig.cpp:2201 +msgid "Position X" +msgstr "X-positie" + +#: src/libslic3r/PrintConfig.cpp:2202 +msgid "X coordinate of the left front corner of a wipe tower" +msgstr "X-coördinaat van de linkervoorhoek van het afveegblok" + +#: src/libslic3r/PrintConfig.cpp:2208 +msgid "Position Y" +msgstr "Y-positie" + +#: src/libslic3r/PrintConfig.cpp:2209 +msgid "Y coordinate of the left front corner of a wipe tower" +msgstr "Y-coördinaat van de linkervoorhoek van het afveegblok" + +#: src/libslic3r/PrintConfig.cpp:2216 +msgid "Width of a wipe tower" +msgstr "Breedte van het afveegblok" + +#: src/libslic3r/PrintConfig.cpp:2222 +msgid "Wipe tower rotation angle" +msgstr "Rotatie van het afveegblok" + +#: src/libslic3r/PrintConfig.cpp:2223 +msgid "Wipe tower rotation angle with respect to x-axis." +msgstr "Rotatie van het afveegblok ten opzichte van de X-as." + +#: src/libslic3r/PrintConfig.cpp:2230 +msgid "Wipe into this object's infill" +msgstr "Afvegen in de vulling van het object" + +#: src/libslic3r/PrintConfig.cpp:2231 +msgid "" +"Purging after toolchange will done inside this object's infills. This lowers " +"the amount of waste but may result in longer print time due to additional " +"travel moves." +msgstr "" +"Het afvegen na de toolwissel wordt gedaan in de vulling van het object. Dit " +"reduceert de hoeveelheid afval, maar kan leiden tot een langere printtijd." + +#: src/libslic3r/PrintConfig.cpp:2238 +msgid "Wipe into this object" +msgstr "Afvegen in dit object" + +#: src/libslic3r/PrintConfig.cpp:2239 +msgid "" +"Object will be used to purge the nozzle after a toolchange to save material " +"that would otherwise end up in the wipe tower and decrease print time. " +"Colours of the objects will be mixed as a result." +msgstr "" +"Het object wordt gebruikt om de nozzle af te vegen bij een toolwissel om " +"materiaal dat anders in het afveegblok gebruikt wordt te besparen. Kleuren " +"kunnen dan gemengd worden." + +#: src/libslic3r/PrintConfig.cpp:2245 +msgid "Maximal bridging distance" +msgstr "Maximale brugafstand" + +#: src/libslic3r/PrintConfig.cpp:2246 +msgid "Maximal distance between supports on sparse infill sections." +msgstr "Maximale afstand tussen support op dunne vullingsdelen." + +#: src/libslic3r/PrintConfig.cpp:2252 +msgid "XY Size Compensation" +msgstr "Compensatie voor X- en Y-grootte" + +#: src/libslic3r/PrintConfig.cpp:2254 +msgid "" +"The object will be grown/shrunk in the XY plane by the configured value " +"(negative = inwards, positive = outwards). This might be useful for fine-" +"tuning hole sizes." +msgstr "" +"Het object wordt in horizontale richting verbreed/versmald in de ingestelde " +"waarde (negatief = naar binnen, positief = naar buiten). Dit kan handig zijn " +"voor het verfijnen van gaten." + +#: src/libslic3r/PrintConfig.cpp:2262 +msgid "Z offset" +msgstr "Z-hoogte" + +#: src/libslic3r/PrintConfig.cpp:2263 +msgid "" +"This value will be added (or subtracted) from all the Z coordinates in the " +"output G-code. It is used to compensate for bad Z endstop position: for " +"example, if your endstop zero actually leaves the nozzle 0.3mm far from the " +"print bed, set this to -0.3 (or fix your endstop)." +msgstr "" +"Deze waarde wordt toegevoegd (of afgetrokken) van alle Z-coördinaten in de G-" +"code. Het wordt gebruikt voor een slechte Z-eindstop positie. Als de Z-" +"eindstop bijvoorbeeld een waarde gebruikt die 0.3mm van het printbed is, kan " +"dit ingesteld worden op -0.3mm." + +#: src/libslic3r/PrintConfig.cpp:2330 +msgid "Display width" +msgstr "Schermbreedte" + +#: src/libslic3r/PrintConfig.cpp:2331 +msgid "Width of the display" +msgstr "Breedte van het scherm" + +#: src/libslic3r/PrintConfig.cpp:2336 +msgid "Display height" +msgstr "Schermhoogte" + +#: src/libslic3r/PrintConfig.cpp:2337 +msgid "Height of the display" +msgstr "Hoogte van het scherm" + +#: src/libslic3r/PrintConfig.cpp:2342 +msgid "Number of pixels in" +msgstr "Aantal pixels" + +#: src/libslic3r/PrintConfig.cpp:2344 +msgid "Number of pixels in X" +msgstr "Aantal pixels in de breedte" + +#: src/libslic3r/PrintConfig.cpp:2350 +msgid "Number of pixels in Y" +msgstr "Aantal pixels in de hoogte" + +#: src/libslic3r/PrintConfig.cpp:2355 +msgid "Display horizontal mirroring" +msgstr "Scherm horizontaal spiegelen" + +#: src/libslic3r/PrintConfig.cpp:2356 +msgid "Mirror horizontally" +msgstr "Spiegel horizontaal" + +#: src/libslic3r/PrintConfig.cpp:2357 +msgid "Enable horizontal mirroring of output images" +msgstr "Horizontaal spiegelen" + +#: src/libslic3r/PrintConfig.cpp:2362 +msgid "Display vertical mirroring" +msgstr "Scherm verticaal spiegelen" + +#: src/libslic3r/PrintConfig.cpp:2363 +msgid "Mirror vertically" +msgstr "Verticaal spiegelen" + +#: src/libslic3r/PrintConfig.cpp:2364 +msgid "Enable vertical mirroring of output images" +msgstr "Verticaal spiegelen" + +#: src/libslic3r/PrintConfig.cpp:2369 +msgid "Display orientation" +msgstr "Schermoriëntatie" + +#: src/libslic3r/PrintConfig.cpp:2370 +msgid "" +"Set the actual LCD display orientation inside the SLA printer. Portrait mode " +"will flip the meaning of display width and height parameters and the output " +"images will be rotated by 90 degrees." +msgstr "" +"Stel de werkelijke oriëntatie van het LCD-scherm van de SLA-printer in. " +"Staande modus zal de breedte- en hoogteparameters omwisselen en de output " +"wordt 90 graden gedraaid." + +#: src/libslic3r/PrintConfig.cpp:2376 +msgid "Landscape" +msgstr "Liggend" + +#: src/libslic3r/PrintConfig.cpp:2377 +msgid "Portrait" +msgstr "Staand" + +#: src/libslic3r/PrintConfig.cpp:2382 +msgid "Fast" +msgstr "Snel" + +#: src/libslic3r/PrintConfig.cpp:2383 +msgid "Fast tilt" +msgstr "Snelle kanteling" + +#: src/libslic3r/PrintConfig.cpp:2384 +msgid "Time of the fast tilt" +msgstr "Tijd van de snelle kanteling" + +#: src/libslic3r/PrintConfig.cpp:2391 +msgid "Slow" +msgstr "Langzaam" + +#: src/libslic3r/PrintConfig.cpp:2392 +msgid "Slow tilt" +msgstr "Langzaam kantelen" + +#: src/libslic3r/PrintConfig.cpp:2393 +msgid "Time of the slow tilt" +msgstr "Tijd van de langzame kanteling" + +#: src/libslic3r/PrintConfig.cpp:2400 +msgid "Area fill" +msgstr "Vulgebied" + +#: src/libslic3r/PrintConfig.cpp:2401 +msgid "" +"The percentage of the bed area. \n" +"If the print area exceeds the specified value, \n" +"then a slow tilt will be used, otherwise - a fast tilt" +msgstr "" +"Percentage van het printbed. \n" +"Als het printgebied buiten een specifieke waarde valt \n" +"wordt een korte kanteling gebruikt, anders een snelle kanteling" + +#: src/libslic3r/PrintConfig.cpp:2408 src/libslic3r/PrintConfig.cpp:2409 +#: src/libslic3r/PrintConfig.cpp:2410 +msgid "Printer scaling correction" +msgstr "Verschalingscorrectie voor printer" + +#: src/libslic3r/PrintConfig.cpp:2416 src/libslic3r/PrintConfig.cpp:2417 +msgid "Printer absolute correction" +msgstr "Absolute correctie voor printer" + +#: src/libslic3r/PrintConfig.cpp:2418 +msgid "" +"Will inflate or deflate the sliced 2D polygons according to the sign of the " +"correction." +msgstr "" +"Zal de geslicede veelhoeken uitrekken of laten krimpen, afhankelijk van de " +"correctiewaarde." + +#: src/libslic3r/PrintConfig.cpp:2424 src/libslic3r/PrintConfig.cpp:2425 +msgid "Printer gamma correction" +msgstr "Gammacorrectie voor printer" + +#: src/libslic3r/PrintConfig.cpp:2426 +msgid "" +"This will apply a gamma correction to the rasterized 2D polygons. A gamma " +"value of zero means thresholding with the threshold in the middle. This " +"behaviour eliminates antialiasing without losing holes in polygons." +msgstr "" +"Dit zorgt voor een gammacorrectie voor de veelhoeken. Een gammawaarde van 0 " +"betekent een waarde die in het midden ligt. Dit gedrag elimineert anti-" +"aliasing zonder dat gaten in de veelhoeken verloren gaan." + +#: src/libslic3r/PrintConfig.cpp:2438 src/libslic3r/PrintConfig.cpp:2439 +msgid "SLA material type" +msgstr "SLA-materiaaltype" + +#: src/libslic3r/PrintConfig.cpp:2450 src/libslic3r/PrintConfig.cpp:2451 +msgid "Initial layer height" +msgstr "Laagdikte eerste laag" + +#: src/libslic3r/PrintConfig.cpp:2457 src/libslic3r/PrintConfig.cpp:2458 +msgid "Bottle volume" +msgstr "Flesinhoud (volume)" + +#: src/libslic3r/PrintConfig.cpp:2459 +msgid "ml" +msgstr "ml" + +#: src/libslic3r/PrintConfig.cpp:2464 src/libslic3r/PrintConfig.cpp:2465 +msgid "Bottle weight" +msgstr "Flesinhoud (gewicht)" + +#: src/libslic3r/PrintConfig.cpp:2466 +msgid "kg" +msgstr "kg" + +#: src/libslic3r/PrintConfig.cpp:2473 +msgid "g/ml" +msgstr "g/ml" + +#: src/libslic3r/PrintConfig.cpp:2480 +msgid "money/bottle" +msgstr "€/fles" + +#: src/libslic3r/PrintConfig.cpp:2485 +msgid "Faded layers" +msgstr "Transitielagen" + +#: src/libslic3r/PrintConfig.cpp:2486 +msgid "" +"Number of the layers needed for the exposure time fade from initial exposure " +"time to the exposure time" +msgstr "" +"Aantal lagen waarin de initiële belichtingstijd stapsgewijs wordt " +"teruggebracht naar de standaard belichtingstijd" + +#: src/libslic3r/PrintConfig.cpp:2493 src/libslic3r/PrintConfig.cpp:2494 +msgid "Minimum exposure time" +msgstr "Minimale belichtingstijd" + +#: src/libslic3r/PrintConfig.cpp:2501 src/libslic3r/PrintConfig.cpp:2502 +msgid "Maximum exposure time" +msgstr "Maximale belichtingstijd" + +#: src/libslic3r/PrintConfig.cpp:2509 src/libslic3r/PrintConfig.cpp:2510 +msgid "Exposure time" +msgstr "Belichtingstijd" + +#: src/libslic3r/PrintConfig.cpp:2516 src/libslic3r/PrintConfig.cpp:2517 +msgid "Minimum initial exposure time" +msgstr "Minimale initiële belichtingstijd" + +#: src/libslic3r/PrintConfig.cpp:2524 src/libslic3r/PrintConfig.cpp:2525 +msgid "Maximum initial exposure time" +msgstr "Maximale initiële belichtingstijd" + +#: src/libslic3r/PrintConfig.cpp:2532 src/libslic3r/PrintConfig.cpp:2533 +msgid "Initial exposure time" +msgstr "Initiële belichtingstijd" + +#: src/libslic3r/PrintConfig.cpp:2539 src/libslic3r/PrintConfig.cpp:2540 +msgid "Correction for expansion" +msgstr "Vergrotingscorrectie" + +#: src/libslic3r/PrintConfig.cpp:2546 +msgid "SLA print material notes" +msgstr "SLA-printmateriaal opmerkingen" + +#: src/libslic3r/PrintConfig.cpp:2547 +msgid "You can put your notes regarding the SLA print material here." +msgstr "U kunt hier opmerkingen plaatsen wat betreft het SLA-materiaal." + +#: src/libslic3r/PrintConfig.cpp:2559 src/libslic3r/PrintConfig.cpp:2570 +msgid "Default SLA material profile" +msgstr "Standaard SLA-materiaalprofiel" + +#: src/libslic3r/PrintConfig.cpp:2581 +msgid "Generate supports" +msgstr "Genereer support" + +#: src/libslic3r/PrintConfig.cpp:2583 +msgid "Generate supports for the models" +msgstr "Genereer support voor de modellen" + +#: src/libslic3r/PrintConfig.cpp:2588 +msgid "Support head front diameter" +msgstr "Supportkopdiameter" + +#: src/libslic3r/PrintConfig.cpp:2590 +msgid "Diameter of the pointing side of the head" +msgstr "Diameter van de puntige zijde van de kop" + +#: src/libslic3r/PrintConfig.cpp:2597 +msgid "Support head penetration" +msgstr "Supportkopinsteek" + +#: src/libslic3r/PrintConfig.cpp:2599 +msgid "How much the pinhead has to penetrate the model surface" +msgstr "Hoe ver de supportkop in het model moet steken" + +#: src/libslic3r/PrintConfig.cpp:2606 +msgid "Support head width" +msgstr "Supportkopbreedte" + +#: src/libslic3r/PrintConfig.cpp:2608 +msgid "Width from the back sphere center to the front sphere center" +msgstr "Centerafstand van de achterste tot de voorste bol" + +#: src/libslic3r/PrintConfig.cpp:2616 +msgid "Support pillar diameter" +msgstr "Supportpijler - diameter" + +#: src/libslic3r/PrintConfig.cpp:2618 +msgid "Diameter in mm of the support pillars" +msgstr "Diameter van de supportpijlers (in mm)" + +#: src/libslic3r/PrintConfig.cpp:2626 +msgid "Support pillar connection mode" +msgstr "Supportpijler - verbindingsmodus" + +#: src/libslic3r/PrintConfig.cpp:2627 +msgid "" +"Controls the bridge type between two neighboring pillars. Can be zig-zag, " +"cross (double zig-zag) or dynamic which will automatically switch between " +"the first two depending on the distance of the two pillars." +msgstr "" +"Geeft het type brug tussen twee aangrenzende pijlers aan. Dit kan zigzag, " +"kruisend (dubbele zigzag) of dynamisch zijn. Dynamisch houdt in dat wordt " +"geschakeld tussen de eerste twee, afhankelijk van de pijlerafstand." + +#: src/libslic3r/PrintConfig.cpp:2635 +msgid "Zig-Zag" +msgstr "Zigzag" + +#: src/libslic3r/PrintConfig.cpp:2636 +msgid "Cross" +msgstr "Kruisend" + +#: src/libslic3r/PrintConfig.cpp:2637 +msgid "Dynamic" +msgstr "Dynamisch" + +#: src/libslic3r/PrintConfig.cpp:2649 +msgid "Pillar widening factor" +msgstr "Pijlervergrotingsfactor" + +#: src/libslic3r/PrintConfig.cpp:2651 +msgid "" +"Merging bridges or pillars into another pillars can increase the radius. " +"Zero means no increase, one means full increase." +msgstr "" +"Bruggen of pijlers samenvoegen met andere pijlers kan de radius vergroten. 0 " +"betekent geen vergroting, 1 betekent volle vergroting." + +#: src/libslic3r/PrintConfig.cpp:2660 +msgid "Support base diameter" +msgstr "Supportbasis - diameter" + +#: src/libslic3r/PrintConfig.cpp:2662 +msgid "Diameter in mm of the pillar base" +msgstr "Diameter van de pijlerbasis (in mm)" + +#: src/libslic3r/PrintConfig.cpp:2670 +msgid "Support base height" +msgstr "Supportbasis - hoogte" + +#: src/libslic3r/PrintConfig.cpp:2672 +msgid "The height of the pillar base cone" +msgstr "Hoogte van de pijlerbasiskegel" + +#: src/libslic3r/PrintConfig.cpp:2679 +msgid "Support base safety distance" +msgstr "Supportbasis - veilige afstand" + +#: src/libslic3r/PrintConfig.cpp:2682 +msgid "" +"The minimum distance of the pillar base from the model in mm. Makes sense in " +"zero elevation mode where a gap according to this parameter is inserted " +"between the model and the pad." +msgstr "" +"Minimale afstand tussen pijlerbasis en model (in mm). Dit is handig bij de " +"modus zonder verhoging waar een gat volgens deze parameter wordt ingevoegd " +"tussen het model en de basisplaat." + +#: src/libslic3r/PrintConfig.cpp:2692 +msgid "Critical angle" +msgstr "Kritische hoek" + +#: src/libslic3r/PrintConfig.cpp:2694 +msgid "The default angle for connecting support sticks and junctions." +msgstr "De standaardhoek voor de verbinding van supporttakken en kruisingen." + +#: src/libslic3r/PrintConfig.cpp:2702 +msgid "Max bridge length" +msgstr "Maximale bruglengte" + +#: src/libslic3r/PrintConfig.cpp:2704 +msgid "The max length of a bridge" +msgstr "Maximale bruglengte" + +#: src/libslic3r/PrintConfig.cpp:2711 +msgid "Max pillar linking distance" +msgstr "Maximale pijler-verbindafstand" + +#: src/libslic3r/PrintConfig.cpp:2713 +msgid "" +"The max distance of two pillars to get linked with each other. A zero value " +"will prohibit pillar cascading." +msgstr "" +"Maximale verbindingsafstand van twee pijlers. Een waarde van 0 schakelt aan " +"elkaar verbonden pijlers uit." + +#: src/libslic3r/PrintConfig.cpp:2721 +msgid "Object elevation" +msgstr "Objectverhoging" + +#: src/libslic3r/PrintConfig.cpp:2723 +msgid "" +"How much the supports should lift up the supported object. If \"Pad around " +"object\" is enabled, this value is ignored." +msgstr "" +"Hoe veel het support omhoog moet bewegen op het ondersteunde object. Als " +"'Basisplaat rondom object' is ingeschakeld wordt deze waarde genegeerd." + +#: src/libslic3r/PrintConfig.cpp:2734 +msgid "This is a relative measure of support points density." +msgstr "Relatieve waarde van de dichtheid van supportpunten." + +#: src/libslic3r/PrintConfig.cpp:2740 +msgid "Minimal distance of the support points" +msgstr "Minimale supportpuntafstand" + +#: src/libslic3r/PrintConfig.cpp:2742 +msgid "No support points will be placed closer than this threshold." +msgstr "Minimale afstand tussen supportpunten." + +#: src/libslic3r/PrintConfig.cpp:2748 +msgid "Use pad" +msgstr "Gebruik basisplaat" + +#: src/libslic3r/PrintConfig.cpp:2750 +msgid "Add a pad underneath the supported model" +msgstr "Voeg een basisplaat toe onder het model met support" + +#: src/libslic3r/PrintConfig.cpp:2755 +msgid "Pad wall thickness" +msgstr "Basisplaat - wanddikte" + +#: src/libslic3r/PrintConfig.cpp:2757 +msgid "The thickness of the pad and its optional cavity walls." +msgstr "Dikte van de basisplaat en optionele wanden." + +#: src/libslic3r/PrintConfig.cpp:2765 +msgid "Pad wall height" +msgstr "Basisplaat - wandhoogte" + +#: src/libslic3r/PrintConfig.cpp:2766 +msgid "" +"Defines the pad cavity depth. Set to zero to disable the cavity. Be careful " +"when enabling this feature, as some resins may produce an extreme suction " +"effect inside the cavity, which makes peeling the print off the vat foil " +"difficult." +msgstr "" +"Geeft de basisplaat-wandhoogte aan. Als dit ingesteld is op 0, wordt dit " +"uitgeschakeld. Wees voorzichtig met het aanzetten van deze optie, omdat " +"sommige resins een sterk zuigeffect in de holte produceren, wat het afpellen " +"van de print van het folie lastig kan maken." + +#: src/libslic3r/PrintConfig.cpp:2779 +msgid "Pad brim size" +msgstr "Basisplaat - expansie" + +#: src/libslic3r/PrintConfig.cpp:2780 +msgid "How far should the pad extend around the contained geometry" +msgstr "Hoe ver de basisplaat moet uitsteken buiten de geometrie" + +#: src/libslic3r/PrintConfig.cpp:2790 +msgid "Max merge distance" +msgstr "Maximale combineerafstand" + +#: src/libslic3r/PrintConfig.cpp:2792 +msgid "" +"Some objects can get along with a few smaller pads instead of a single big " +"one. This parameter defines how far the center of two smaller pads should " +"be. If theyare closer, they will get merged into one pad." +msgstr "" +"Sommige objecten werken beter met een aantal kleinere basisplaten in plaats " +"van één grote. Deze parameter bepaalt hoe ver de tussenafstand van de " +"kleinere basisplaten mogen zijn." + +#: src/libslic3r/PrintConfig.cpp:2812 +msgid "Pad wall slope" +msgstr "Basisplaat - zijhoek" + +#: src/libslic3r/PrintConfig.cpp:2814 +msgid "" +"The slope of the pad wall relative to the bed plane. 90 degrees means " +"straight walls." +msgstr "" +"Hoek van de basisplaatzijde ten opzichte van het bed. 90 graden betekent een " +"rechte zijkant." + +#: src/libslic3r/PrintConfig.cpp:2823 +msgid "Pad around object" +msgstr "Basisplaat rondom object" + +#: src/libslic3r/PrintConfig.cpp:2825 +msgid "Create pad around object and ignore the support elevation" +msgstr "Genereer basisplaat rondom object en schakel objectverhoging uit" + +#: src/libslic3r/PrintConfig.cpp:2830 +msgid "Pad around object everywhere" +msgstr "Overal basisplaat rondom object" + +#: src/libslic3r/PrintConfig.cpp:2832 +msgid "Force pad around object everywhere" +msgstr "Forceer basisplaat overal rondom het object" + +#: src/libslic3r/PrintConfig.cpp:2837 +msgid "Pad object gap" +msgstr "Basisplaat - gat" + +#: src/libslic3r/PrintConfig.cpp:2839 +msgid "" +"The gap between the object bottom and the generated pad in zero elevation " +"mode." +msgstr "" +"Het gat tussen de onderkant van het object en de gegenereerde basisplaat in " +"de modus zonder verhoging." + +#: src/libslic3r/PrintConfig.cpp:2848 +msgid "Pad object connector stride" +msgstr "Basisplaat - verbindingstakafstand" + +#: src/libslic3r/PrintConfig.cpp:2850 +msgid "" +"Distance between two connector sticks which connect the object and the " +"generated pad." +msgstr "" +"Afstand tussen twee verbindingstakken die het object verbinden aan de " +"basisplaat." + +#: src/libslic3r/PrintConfig.cpp:2857 +msgid "Pad object connector width" +msgstr "Basisplaat - verbindingstakbreedte" + +#: src/libslic3r/PrintConfig.cpp:2859 +msgid "" +"Width of the connector sticks which connect the object and the generated pad." +msgstr "" +"Breedte van de verbindingstakken die het object en de basisplaat met elkaar " +"verbinden." + +#: src/libslic3r/PrintConfig.cpp:2866 +msgid "Pad object connector penetration" +msgstr "Basisplaat - Verbindingstakinsteek" + +#: src/libslic3r/PrintConfig.cpp:2869 +msgid "How much should the tiny connectors penetrate into the model body." +msgstr "Hoe ver de verbindingstakken in het model steken." + +#: src/libslic3r/PrintConfig.cpp:3247 +msgid "Export OBJ" +msgstr "Exporteer OBJ" + +#: src/libslic3r/PrintConfig.cpp:3248 +msgid "Export the model(s) as OBJ." +msgstr "Exporteer de modellen als OBJ-bestand." + +#: src/libslic3r/PrintConfig.cpp:3259 +msgid "Export SLA" +msgstr "Exporteer SLA" + +#: src/libslic3r/PrintConfig.cpp:3260 +msgid "Slice the model and export SLA printing layers as PNG." +msgstr "Slice het model en exporteer SLA-printlagen als PNG-bestanden." + +#: src/libslic3r/PrintConfig.cpp:3265 +msgid "Export 3MF" +msgstr "Exporteer 3MF" + +#: src/libslic3r/PrintConfig.cpp:3266 +msgid "Export the model(s) as 3MF." +msgstr "Exporteer de modellen als 3MF-bestanden." + +#: src/libslic3r/PrintConfig.cpp:3270 +msgid "Export AMF" +msgstr "Exporteer AMF" + +#: src/libslic3r/PrintConfig.cpp:3271 +msgid "Export the model(s) as AMF." +msgstr "Exporteer de modellen als AMF-bestanden." + +#: src/libslic3r/PrintConfig.cpp:3275 +msgid "Export STL" +msgstr "Exporteer STL" + +#: src/libslic3r/PrintConfig.cpp:3276 +msgid "Export the model(s) as STL." +msgstr "Exporteer de modellen als STL-bestand." + +#: src/libslic3r/PrintConfig.cpp:3281 +msgid "Slice the model and export toolpaths as G-code." +msgstr "Slice het model en exporteer de bewegingen als gcode-bestand." + +#: src/libslic3r/PrintConfig.cpp:3286 +msgid "Slice" +msgstr "Slice" + +#: src/libslic3r/PrintConfig.cpp:3287 +msgid "" +"Slice the model as FFF or SLA based on the printer_technology configuration " +"value." +msgstr "" +"Slice het model als FDM of SLA, gebaseerd op de 'printer_technology'-" +"configuratiewaarde." + +#: src/libslic3r/PrintConfig.cpp:3292 +msgid "Help" +msgstr "Help" + +#: src/libslic3r/PrintConfig.cpp:3293 +msgid "Show this help." +msgstr "Toon deze hulp zien." + +#: src/libslic3r/PrintConfig.cpp:3298 +msgid "Help (FFF options)" +msgstr "Help (FDM-opties)" + +#: src/libslic3r/PrintConfig.cpp:3299 +msgid "Show the full list of print/G-code configuration options." +msgstr "Toon de volledige lijst van print- of G-code-configuratie-opties." + +#: src/libslic3r/PrintConfig.cpp:3303 +msgid "Help (SLA options)" +msgstr "Help (SLA opties)" + +#: src/libslic3r/PrintConfig.cpp:3304 +msgid "Show the full list of SLA print configuration options." +msgstr "Toon de volledige lijst van SLA-printconfiguratie-opties." + +#: src/libslic3r/PrintConfig.cpp:3308 +msgid "Output Model Info" +msgstr "Output model-info" + +#: src/libslic3r/PrintConfig.cpp:3309 +msgid "Write information about the model to the console." +msgstr "Schrijf informatie over het model naar de console." + +#: src/libslic3r/PrintConfig.cpp:3313 +msgid "Save config file" +msgstr "Sla configuratiebestand op" + +#: src/libslic3r/PrintConfig.cpp:3314 +msgid "Save configuration to the specified file." +msgstr "Sla configuratie op in aangegeven bestand." + +#: src/libslic3r/PrintConfig.cpp:3324 +msgid "Align XY" +msgstr "XY uitlijnen" + +#: src/libslic3r/PrintConfig.cpp:3325 +msgid "Align the model to the given point." +msgstr "Lijn de modellen uit op het gegeven punt." + +#: src/libslic3r/PrintConfig.cpp:3330 +msgid "Cut model at the given Z." +msgstr "Snijdt model op de ingestelde hoogte." + +#: src/libslic3r/PrintConfig.cpp:3351 +msgid "Center" +msgstr "Centreer" + +#: src/libslic3r/PrintConfig.cpp:3352 +msgid "Center the print around the given center." +msgstr "Centreer de print op het middelpunt." + +#: src/libslic3r/PrintConfig.cpp:3356 +msgid "Don't arrange" +msgstr "Niet schikken" + +#: src/libslic3r/PrintConfig.cpp:3357 +msgid "" +"Do not rearrange the given models before merging and keep their original XY " +"coordinates." +msgstr "" +"Herschik de modellen niet voor het samenvoegen en behoudt de originele X- en " +"Y-coördinaten." + +#: src/libslic3r/PrintConfig.cpp:3360 +msgid "Duplicate" +msgstr "Dupliceer" + +#: src/libslic3r/PrintConfig.cpp:3361 +msgid "Multiply copies by this factor." +msgstr "Meerdere kopieën van dit aantal." + +#: src/libslic3r/PrintConfig.cpp:3365 +msgid "Duplicate by grid" +msgstr "Dupliceer in raster" + +#: src/libslic3r/PrintConfig.cpp:3366 +msgid "Multiply copies by creating a grid." +msgstr "Meerdere kopieën in raster." + +#: src/libslic3r/PrintConfig.cpp:3369 +msgid "Merge" +msgstr "Samenvoegen" + +#: src/libslic3r/PrintConfig.cpp:3370 +msgid "" +"Arrange the supplied models in a plate and merge them in a single model in " +"order to perform actions once." +msgstr "" +"Schik de toegevoegde modellen en combineer ze tot één model om eenmalig " +"acties uit te voeren." + +#: src/libslic3r/PrintConfig.cpp:3375 +msgid "" +"Try to repair any non-manifold meshes (this option is implicitly added " +"whenever we need to slice the model to perform the requested action)." +msgstr "" +"Probeer alle niet-gesloten meshes te repareren (deze optie is impliciet " +"toegevoegd om, wanneer dat nodig is, onmogelijke modellen toch te slicen)." + +#: src/libslic3r/PrintConfig.cpp:3379 +msgid "Rotation angle around the Z axis in degrees." +msgstr "Rotatiehoek rond de Z-as in graden." + +#: src/libslic3r/PrintConfig.cpp:3383 +msgid "Rotate around X" +msgstr "Draai over de X-as" + +#: src/libslic3r/PrintConfig.cpp:3384 +msgid "Rotation angle around the X axis in degrees." +msgstr "Rotatiehoek rond de X-as in graden." + +#: src/libslic3r/PrintConfig.cpp:3388 +msgid "Rotate around Y" +msgstr "Draai over de Y-as" + +#: src/libslic3r/PrintConfig.cpp:3389 +msgid "Rotation angle around the Y axis in degrees." +msgstr "Rotatiehoek rond de Y-as in graden." + +#: src/libslic3r/PrintConfig.cpp:3394 +msgid "Scaling factor or percentage." +msgstr "Schalingsfactor of percentage." + +#: src/libslic3r/PrintConfig.cpp:3399 +msgid "" +"Detect unconnected parts in the given model(s) and split them into separate " +"objects." +msgstr "" +"Detecteer niet-verbonden onderdelen in het model en deel ze op in " +"verschillende objecten." + +#: src/libslic3r/PrintConfig.cpp:3402 +msgid "Scale to Fit" +msgstr "Verschaal naar passing" + +#: src/libslic3r/PrintConfig.cpp:3403 +msgid "Scale to fit the given volume." +msgstr "Verschaal naar passing in het gegeven volume." + +#: src/libslic3r/PrintConfig.cpp:3412 +msgid "Ignore non-existent config files" +msgstr "Negeer niet-bestaande configuratiebestanden" + +#: src/libslic3r/PrintConfig.cpp:3413 +msgid "Do not fail if a file supplied to --load does not exist." +msgstr "Geef geen fout als een bestand om te laden niet bestaat." + +#: src/libslic3r/PrintConfig.cpp:3416 +msgid "Load config file" +msgstr "Laad configuratiebestand" + +#: src/libslic3r/PrintConfig.cpp:3417 +msgid "" +"Load configuration from the specified file. It can be used more than once to " +"load options from multiple files." +msgstr "" +"Laad configuratie uit een specifiek bestand. Dit kan meerdere keren gebruikt " +"worden om instellingen uit meerdere bestanden te laden." + +#: src/libslic3r/PrintConfig.cpp:3420 +msgid "Output File" +msgstr "Outputbestand" + +#: src/libslic3r/PrintConfig.cpp:3421 +msgid "" +"The file where the output will be written (if not specified, it will be " +"based on the input file)." +msgstr "" +"Het bestand waaroverheen wordt geschreven (als dit niet aangegeven is, wort " +"dit gebaseerd op het inputbestand)." + +#: src/libslic3r/PrintConfig.cpp:3431 +msgid "Data directory" +msgstr "Bestandslocatie voor de data" + +#: src/libslic3r/PrintConfig.cpp:3432 +msgid "" +"Load and store settings at the given directory. This is useful for " +"maintaining different profiles or including configurations from a network " +"storage." +msgstr "" +"Laad fabrieksinstellingen en sla op. Dit is handig voor het onderhouden van " +"verschillende profielen of het opnemen van configuraties van een " +"netwerkopslag." + +#: src/libslic3r/PrintConfig.cpp:3435 +msgid "Logging level" +msgstr "Logboekniveau" + +#: src/libslic3r/PrintConfig.cpp:3436 +msgid "" +"Messages with severity lower or eqal to the loglevel will be printed out. 0:" +"trace, 1:debug, 2:info, 3:warning, 4:error, 5:fatal" +msgstr "" +"Berichten die lager of gelijk zijn aan het logboekniveau worden geprint. 0:" +"traceer, 1:foutopsporing, 2:info, 3:waarschuwing, 4:fout, 5:fatale fout" + +#: src/libslic3r/PrintConfig.cpp:3441 +msgid "Render with a software renderer" +msgstr "Render met software-renderer" + +#: src/libslic3r/PrintConfig.cpp:3442 +msgid "" +"Render with a software renderer. The bundled MESA software renderer is " +"loaded instead of the default OpenGL driver." +msgstr "" +"Render met software-renderer. De meegeleverde MESA-software-renderer is " +"geladen in plaats van het standaard OpenGL stuurprogramma." + +#: src/libslic3r/PrintObject.cpp:106 +msgid "Processing triangulated mesh" +msgstr "Mesh aan het verwerken" + +#: src/libslic3r/PrintObject.cpp:150 +msgid "Generating perimeters" +msgstr "Perimeters genereren" + +#: src/libslic3r/PrintObject.cpp:260 +msgid "Preparing infill" +msgstr "Vulling voorbereiden" + +#: src/libslic3r/PrintObject.cpp:400 +msgid "Generating support material" +msgstr "Support genereren" + +#: src/libslic3r/GCode/PreviewData.cpp:362 +msgid "Height (mm)" +msgstr "Hoogte (mm)" + +#: src/libslic3r/GCode/PreviewData.cpp:364 +msgid "Width (mm)" +msgstr "Breedte (mm)" + +#: src/libslic3r/GCode/PreviewData.cpp:366 +msgid "Speed (mm/s)" +msgstr "Snelheid (mm/s)" + +#: src/libslic3r/GCode/PreviewData.cpp:368 +msgid "Fan Speed (%)" +msgstr "Ventilatorsnelheid (%)" + +#: src/libslic3r/GCode/PreviewData.cpp:370 +msgid "Volumetric flow rate (mm³/s)" +msgstr "Volumetrisch debiet (mm³/s)" diff --git a/resources/localization/pl/PrusaSlicer.mo b/resources/localization/pl/PrusaSlicer.mo index dd6f77378ac490fbad9afcca8c3170bb65390eed..89565631ed11c642c1db4f26a4ca3edf449d3eee 100644 GIT binary patch delta 15806 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 X96r2yzhOfw%}B`z*qM^yyE^m#<~aJ{ delta 15909 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 diff --git a/resources/localization/pt_br/PrusaSlicer.mo b/resources/localization/pt_br/PrusaSlicer.mo index a2f3e9789d18d81a6d15de4544a644d9d280221c..0c01dd31a21a8e1f7eededa68511d1dfbb584668 100644 GIT binary patch delta 15054 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 Date: Tue, 4 Feb 2020 14:42:26 +0100 Subject: [PATCH 237/336] Added item menu 'Edit/Show labels' and removed labels activation from preferences dialog --- src/slic3r/GUI/AppConfig.cpp | 5 ----- src/slic3r/GUI/GLCanvas3D.cpp | 15 --------------- src/slic3r/GUI/GLCanvas3D.hpp | 10 ++++++++-- src/slic3r/GUI/MainFrame.cpp | 10 ++++++++-- src/slic3r/GUI/Plater.cpp | 10 ++++++++++ src/slic3r/GUI/Plater.hpp | 5 +++++ src/slic3r/GUI/Preferences.cpp | 9 --------- src/slic3r/GUI/wxExtensions.cpp | 10 +++++++++- src/slic3r/GUI/wxExtensions.hpp | 4 +++- 9 files changed, 43 insertions(+), 35 deletions(-) diff --git a/src/slic3r/GUI/AppConfig.cpp b/src/slic3r/GUI/AppConfig.cpp index 925346ee7d..a410f3ad8d 100644 --- a/src/slic3r/GUI/AppConfig.cpp +++ b/src/slic3r/GUI/AppConfig.cpp @@ -95,11 +95,6 @@ void AppConfig::set_defaults() set("use_free_camera", "0"); #endif // ENABLE_6DOF_CAMERA -#if ENABLE_SHOW_SCENE_LABELS - if (get("show_labels").empty()) - set("show_labels", "0"); -#endif // ENABLE_SHOW_SCENE_LABELS - // Remove legacy window positions/sizes erase("", "main_frame_maximized"); erase("", "main_frame_pos"); diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 26ab4f4359..449b7fbb80 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -1238,21 +1238,6 @@ void GLCanvas3D::LegendTexture::render(const GLCanvas3D& canvas) const } #if ENABLE_SHOW_SCENE_LABELS -void GLCanvas3D::Labels::show(bool show) -{ - bool shown = is_shown(); - if (shown != show) - { - wxGetApp().app_config->set("show_labels", show ? "1" : "0"); - wxGetApp().app_config->save(); - } -} - -bool GLCanvas3D::Labels::is_shown() const -{ - return wxGetApp().app_config->get("show_labels") == "1"; -} - void GLCanvas3D::Labels::render(const std::vector& sorted_instances) const { if (!m_enabled || !is_shown()) diff --git a/src/slic3r/GUI/GLCanvas3D.hpp b/src/slic3r/GUI/GLCanvas3D.hpp index 24675ee30c..ae26d6f52f 100644 --- a/src/slic3r/GUI/GLCanvas3D.hpp +++ b/src/slic3r/GUI/GLCanvas3D.hpp @@ -381,13 +381,14 @@ private: class Labels { bool m_enabled{ false }; + bool m_shown{ false }; GLCanvas3D& m_canvas; public: explicit Labels(GLCanvas3D& canvas) : m_canvas(canvas) {} void enable(bool enable) { m_enabled = enable; } - void show(bool show); - bool is_shown() const; + void show(bool show) { m_shown = m_enabled ? show : false; } + bool is_shown() const { return m_shown; } void render(const std::vector& sorted_instances) const; }; #endif // ENABLE_SHOW_SCENE_LABELS @@ -676,6 +677,11 @@ public: void mouse_up_cleanup(); +#if ENABLE_SHOW_SCENE_LABELS + bool are_labels_shown() const { return m_labels.is_shown(); } + void show_labels(bool show) { m_labels.show(show); } +#endif // ENABLE_SHOW_SCENE_LABELS + private: bool _is_shown_on_screen() const; diff --git a/src/slic3r/GUI/MainFrame.cpp b/src/slic3r/GUI/MainFrame.cpp index 105c6faa5f..b05155ef2e 100644 --- a/src/slic3r/GUI/MainFrame.cpp +++ b/src/slic3r/GUI/MainFrame.cpp @@ -550,10 +550,10 @@ void MainFrame::init_menubar() wxString hotkey_delete = "Del"; #endif append_menu_item(editMenu, wxID_ANY, _(L("&Select all")) + sep + GUI::shortkey_ctrl_prefix() + sep_space + "A", - _(L("Selects all objects")), [this](wxCommandEvent&) { if (m_plater != nullptr) m_plater->select_all(); }, + _(L("Selects all objects")), [this](wxCommandEvent&) { m_plater->select_all(); }, "", nullptr, [this](){return can_select(); }, this); append_menu_item(editMenu, wxID_ANY, _(L("D&eselect all")) + sep + "Esc", - _(L("Deselects all objects")), [this](wxCommandEvent&) { if (m_plater != nullptr) m_plater->deselect_all(); }, + _(L("Deselects all objects")), [this](wxCommandEvent&) { m_plater->deselect_all(); }, "", nullptr, [this](){return can_deselect(); }, this); editMenu->AppendSeparator(); append_menu_item(editMenu, wxID_ANY, _(L("&Delete selected")) + sep + hotkey_delete, @@ -659,6 +659,12 @@ void MainFrame::init_menubar() "", nullptr, [this](){return can_change_view(); }, this); append_menu_item(viewMenu, wxID_ANY, _(L("Right")) + sep + "&6", _(L("Right View")), [this](wxCommandEvent&) { select_view("right"); }, "", nullptr, [this](){return can_change_view(); }, this); +#if ENABLE_SHOW_SCENE_LABELS + viewMenu->AppendSeparator(); + append_menu_check_item(viewMenu, wxID_ANY, _(L("Show &labels")) + sep + "E", _(L("Show object/instance labels in 3D scene")), + [this](wxCommandEvent&) { m_plater->show_view3D_labels(!m_plater->are_view3D_labels_shown()); }, this, + [this]() { return m_plater->is_view3D_shown(); }, [this]() { return m_plater->are_view3D_labels_shown(); }, this); +#endif // ENABLE_SHOW_SCENE_LABELS } // Help menu diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index bbb7db74dd..2ff099a98d 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -1784,6 +1784,11 @@ struct Plater::priv bool is_preview_loaded() const { return preview->is_loaded(); } bool is_view3D_shown() const { return current_panel == view3D; } +#if ENABLE_SHOW_SCENE_LABELS + bool are_view3D_labels_shown() const { return (current_panel == view3D) && view3D->get_canvas3d()->are_labels_shown(); } + void show_view3D_labels(bool show) { if (current_panel == view3D) view3D->get_canvas3d()->show_labels(show); } +#endif // ENABLE_SHOW_SCENE_LABELS + void set_current_canvas_as_dirty(); #if ENABLE_BACKWARD_COMPATIBLE_RELOAD_FROM_DISK GLCanvas3D* get_current_canvas3D(); @@ -4672,6 +4677,11 @@ bool Plater::is_preview_shown() const { return p->is_preview_shown(); } bool Plater::is_preview_loaded() const { return p->is_preview_loaded(); } bool Plater::is_view3D_shown() const { return p->is_view3D_shown(); } +#if ENABLE_SHOW_SCENE_LABELS +bool Plater::are_view3D_labels_shown() const { return p->are_view3D_labels_shown(); } +void Plater::show_view3D_labels(bool show) { p->show_view3D_labels(show); } +#endif // ENABLE_SHOW_SCENE_LABELS + void Plater::select_all() { p->select_all(); } void Plater::deselect_all() { p->deselect_all(); } diff --git a/src/slic3r/GUI/Plater.hpp b/src/slic3r/GUI/Plater.hpp index 568727abf3..bd562d17e7 100644 --- a/src/slic3r/GUI/Plater.hpp +++ b/src/slic3r/GUI/Plater.hpp @@ -170,6 +170,11 @@ public: bool is_preview_loaded() const; bool is_view3D_shown() const; +#if ENABLE_SHOW_SCENE_LABELS + bool are_view3D_labels_shown() const; + void show_view3D_labels(bool show); +#endif // ENABLE_SHOW_SCENE_LABELS + // Called after the Preferences dialog is closed and the program settings are saved. // Update the UI based on the current preferences. void update_ui_from_settings(); diff --git a/src/slic3r/GUI/Preferences.cpp b/src/slic3r/GUI/Preferences.cpp index 57748d3a83..4fd63fe0ed 100644 --- a/src/slic3r/GUI/Preferences.cpp +++ b/src/slic3r/GUI/Preferences.cpp @@ -144,15 +144,6 @@ void PreferencesDialog::build() } }; -#if ENABLE_SHOW_SCENE_LABELS - def.label = L("Show object/instance labels in 3D scene"); - def.type = coBool; - def.tooltip = L("If enabled, shows labels containing info about objects/instances."); - def.set_default_value(new ConfigOptionBool{ app_config->get("show_labels") == "1" }); - option = Option(def, "show_labels"); - m_optgroup_gui->append_single_option_line(option); -#endif // ENABLE_SHOW_SCENE_LABELS - def.label = L("Use custom size for toolbar icons"); def.type = coBool; def.tooltip = L("If enabled, you can change size of toolbar icons manually."); diff --git a/src/slic3r/GUI/wxExtensions.cpp b/src/slic3r/GUI/wxExtensions.cpp index 399fcdf036..f814c11dfb 100644 --- a/src/slic3r/GUI/wxExtensions.cpp +++ b/src/slic3r/GUI/wxExtensions.cpp @@ -146,7 +146,8 @@ wxMenuItem* append_menu_radio_item(wxMenu* menu, int id, const wxString& string, } wxMenuItem* append_menu_check_item(wxMenu* menu, int id, const wxString& string, const wxString& description, - std::function cb, wxEvtHandler* event_handler) + std::function cb, wxEvtHandler* event_handler, + std::function const enable_condition, std::function const check_condition, wxWindow* parent) { if (id == wxID_ANY) id = wxNewId(); @@ -160,6 +161,13 @@ wxMenuItem* append_menu_check_item(wxMenu* menu, int id, const wxString& string, #endif // __WXMSW__ menu->Bind(wxEVT_MENU, cb, id); + if (parent) + parent->Bind(wxEVT_UPDATE_UI, [enable_condition, check_condition](wxUpdateUIEvent& evt) + { + evt.Enable(enable_condition()); + evt.Check(check_condition()); + }, id); + return item; } diff --git a/src/slic3r/GUI/wxExtensions.hpp b/src/slic3r/GUI/wxExtensions.hpp index 55dac54332..d4679f757c 100644 --- a/src/slic3r/GUI/wxExtensions.hpp +++ b/src/slic3r/GUI/wxExtensions.hpp @@ -34,7 +34,9 @@ wxMenuItem* append_menu_radio_item(wxMenu* menu, int id, const wxString& string, std::function cb, wxEvtHandler* event_handler); wxMenuItem* append_menu_check_item(wxMenu* menu, int id, const wxString& string, const wxString& description, - std::function cb, wxEvtHandler* event_handler); + std::function cb, wxEvtHandler* event_handler, + std::function const enable_condition = []() { return true; }, + std::function const check_condition = []() { return true; }, wxWindow* parent = nullptr); void enable_menu_item(wxUpdateUIEvent& evt, std::function const cb_condition, wxMenuItem* item, wxWindow* win); From 49c5822be4ea6ee31ddae0294966673bfce0f894 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Tue, 4 Feb 2020 14:53:17 +0100 Subject: [PATCH 238/336] Show tooltip for all hovered ticks, not just for a selected one --- src/slic3r/GUI/DoubleSlider.cpp | 163 +++++++++++++++++--------------- src/slic3r/GUI/DoubleSlider.hpp | 14 ++- 2 files changed, 98 insertions(+), 79 deletions(-) diff --git a/src/slic3r/GUI/DoubleSlider.cpp b/src/slic3r/GUI/DoubleSlider.cpp index 5990984b02..59c7de8ea4 100644 --- a/src/slic3r/GUI/DoubleSlider.cpp +++ b/src/slic3r/GUI/DoubleSlider.cpp @@ -875,87 +875,90 @@ void Control::correct_higher_value() m_lower_value = m_higher_value; } -wxString Control::get_tooltip(IconFocus icon_focus) +wxString Control::get_tooltip(FocusItem focused_item, int tick/*=-1*/) { - wxString tooltip(wxEmptyString); - if (m_is_one_layer_icon_focesed) - tooltip = _(L("One layer mode")); + if (focused_item == fiNone) + return ""; + if (focused_item == fiOneLayerIcon) + return _(L("One layer mode")); + if (focused_item == fiRevertIcon) + return _(L("Discard all custom changes")); + if (focused_item == fiCogIcon) + return _(L("Set extruder sequence for whole print")); + if (focused_item == fiColorBand) + return m_mode != t_mode::SingleExtruder ? "" : + _(L("For edit current color use Right(Double) mouse click on colored band")); - if (icon_focus == ifRevert) - tooltip = _(L("Discard all custom changes")); - if (icon_focus == ifCog) - tooltip = _(L("Set extruder sequence for whole print")); - else if (m_is_action_icon_focesed) + wxString tooltip; + const auto tick_code_it = m_ticks.ticks.find(TickCode{tick}); + + if (tick_code_it == m_ticks.ticks.end() && focused_item == fiActionIcon) // tick doesn't exist { - const int tick = m_selection == ssLower ? m_lower_value : m_higher_value; - const auto tick_code_it = m_ticks.ticks.find(TickCode{tick}); + // Show mode as a first string of tooltop + tooltip = " " + _(L("Slider(print) mode")) + ": "; + tooltip += (m_mode == t_mode::SingleExtruder ? CustomGCode::SingleExtruderMode : + m_mode == t_mode::MultiAsSingle ? CustomGCode::MultiAsSingleMode : + CustomGCode::MultiExtruderMode ); + tooltip += "\n\n"; /* Note: just on OSX!!! - * Right click event causes a little scrolling. + * Right click event causes a little scrolling. * So, as a workaround we use Ctrl+LeftMouseClick instead of RightMouseClick * Show this information in tooltip * */ - if (tick_code_it == m_ticks.ticks.end()) // tick doesn't exist - { - // Show mode as a first string of tooltop - tooltip = " " + _(L("Slider(print) mode")) + ": "; - tooltip += (m_mode == t_mode::SingleExtruder ? CustomGCode::SingleExtruderMode : - m_mode == t_mode::MultiAsSingle ? CustomGCode::MultiAsSingleMode : - CustomGCode::MultiExtruderMode ); - tooltip += "\n\n"; - - // Show list of actions with new tick - tooltip += ( m_mode == t_mode::MultiAsSingle ? - _(L("For add change extruder use left mouse button click")) : - _(L("For add color change use left mouse button click")) ) + " " + - _(L("OR pres \"+\" key")) + "\n" + ( - is_osx ? - _(L("For add another code use Ctrl + Left mouse button click")) : - _(L("For add another code use right mouse button click")) ); - } - else // tick exists - { - // Show custom Gcode as a first string of tooltop - tooltip = " "; - tooltip += tick_code_it->gcode == ColorChangeCode ? ( - m_mode == t_mode::SingleExtruder ? - from_u8((boost::format(_utf8(L("Color change (\"%1%\")"))) % tick_code_it->gcode ).str()) : - from_u8((boost::format(_utf8(L("Color change (\"%1%\") for Extruder %2%"))) % - tick_code_it->gcode % tick_code_it->extruder).str()) ) : - tick_code_it->gcode == PausePrintCode ? - from_u8((boost::format(_utf8(L("Pause print (\"%1%\")"))) % tick_code_it->gcode ).str()) : - tick_code_it->gcode == ToolChangeCode ? - from_u8((boost::format(_utf8(L("Extruder(tool) is changed to Extruder \"%1%\""))) % tick_code_it->extruder ).str()) : - from_u8((boost::format(_utf8(L("\"%1%\""))) % tick_code_it->gcode ).str()) ; - - // If tick is marked as a conflict (exclamation icon), - // we should to explain why - ConflictType conflict = m_ticks.is_conflict_tick(*tick_code_it, m_mode, m_only_extruder, m_values[tick]); - if (conflict != ctNone) - tooltip += "\n\n" + _(L("Note")) + "! "; - if (conflict == ctModeConflict) - tooltip += _(L("G-code of this tick has a conflict with slider(print) mode.\n" - "Any its editing will cause a changes of DoubleSlider data.")); - else if (conflict == ctMeaninglessColorChange) - tooltip += _(L("There is a color change for extruder that wouldn't be used till the end of printing.\n" - "This code wouldn't be processed during GCode generation.")); - else if (conflict == ctMeaninglessToolChange) - tooltip += _(L("There is a extruder change to the same extruder.\n" - "This code wouldn't be processed during GCode generation.")); - else if (conflict == ctRedundant) - tooltip += _(L("There is a color change for extruder that has not been used before.\n" - "Check your choice to avoid redundant color changes.")); - - // Show list of actions with existing tick - tooltip += "\n\n" + _(L("For Delete tick use left mouse button click OR pres \"-\" key")) + "\n" + ( - is_osx ? - _(L("For Edit tick use Ctrl + Left mouse button click")) : - _(L("For Edit tick use right mouse button click")) ); - } + // Show list of actions with new tick + tooltip += ( m_mode == t_mode::MultiAsSingle ? + _(L("For add change extruder use left mouse button click")) : + _(L("For add color change use left mouse button click")) ) + " " + + _(L("OR pres \"+\" key")) + "\n" + ( + is_osx ? + _(L("For add another code use Ctrl + Left mouse button click")) : + _(L("For add another code use right mouse button click")) ); } + if (tick_code_it != m_ticks.ticks.end()) // tick exists + { + // Show custom Gcode as a first string of tooltop + tooltip = " "; + tooltip += tick_code_it->gcode == ColorChangeCode ? ( + m_mode == t_mode::SingleExtruder ? + from_u8((boost::format(_utf8(L("Color change (\"%1%\")"))) % tick_code_it->gcode ).str()) : + from_u8((boost::format(_utf8(L("Color change (\"%1%\") for Extruder %2%"))) % + tick_code_it->gcode % tick_code_it->extruder).str()) ) : + tick_code_it->gcode == PausePrintCode ? + from_u8((boost::format(_utf8(L("Pause print (\"%1%\")"))) % tick_code_it->gcode ).str()) : + tick_code_it->gcode == ToolChangeCode ? + from_u8((boost::format(_utf8(L("Extruder(tool) is changed to Extruder \"%1%\""))) % tick_code_it->extruder ).str()) : + from_u8((boost::format(_utf8(L("\"%1%\""))) % tick_code_it->gcode ).str()) ; + + // If tick is marked as a conflict (exclamation icon), + // we should to explain why + ConflictType conflict = m_ticks.is_conflict_tick(*tick_code_it, m_mode, m_only_extruder, m_values[tick]); + if (conflict != ctNone) + tooltip += "\n\n" + _(L("Note")) + "! "; + if (conflict == ctModeConflict) + tooltip += _(L("G-code of this tick has a conflict with slider(print) mode.\n" + "Any its editing will cause a changes of DoubleSlider data.")); + else if (conflict == ctMeaninglessColorChange) + tooltip += _(L("There is a color change for extruder that wouldn't be used till the end of printing.\n" + "This code wouldn't be processed during GCode generation.")); + else if (conflict == ctMeaninglessToolChange) + tooltip += _(L("There is a extruder change to the same extruder.\n" + "This code wouldn't be processed during GCode generation.")); + else if (conflict == ctRedundant) + tooltip += _(L("There is a color change for extruder that has not been used before.\n" + "Check your choice to avoid redundant color changes.")); + + // Show list of actions with existing tick + if (focused_item == fiActionIcon) + tooltip += "\n\n" + _(L("For Delete tick use left mouse button click OR pres \"-\" key")) + "\n" + ( + is_osx ? + _(L("For Edit tick use Ctrl + Left mouse button click")) : + _(L("For Edit tick use right mouse button click")) ); + } return tooltip; + } void Control::OnMotion(wxMouseEvent& event) @@ -966,14 +969,26 @@ void Control::OnMotion(wxMouseEvent& event) const wxPoint pos = event.GetLogicalPosition(dc); m_is_one_layer_icon_focesed = is_point_in_rect(pos, m_rect_one_layer_icon); - IconFocus icon_focus = ifNone; + + FocusItem focused_item = fiNone; + int tick = -1; if (!m_is_left_down && !m_is_one_layer) { m_is_action_icon_focesed = is_point_in_rect(pos, m_rect_tick_action); - if (!m_ticks.empty() && is_point_in_rect(pos, m_rect_revert_icon)) - icon_focus = ifRevert; + if (m_is_one_layer_icon_focesed) + focused_item = fiOneLayerIcon; + else if (m_is_action_icon_focesed) { + focused_item = fiActionIcon; + tick = m_selection == ssLower ? m_lower_value : m_higher_value; + } + else if (!m_ticks.empty() && is_point_in_rect(pos, m_rect_revert_icon)) + focused_item = fiRevertIcon; else if (is_point_in_rect(pos, m_rect_cog_icon)) - icon_focus = ifCog; + focused_item = fiCogIcon; + else { + focused_item = fiTick; + tick = get_tick_near_point(pos); + } } else if (m_is_left_down || m_is_right_down) { if (m_selection == ssLower) { @@ -994,7 +1009,7 @@ void Control::OnMotion(wxMouseEvent& event) event.Skip(); // Set tooltips with information for each icon - this->SetToolTip(get_tooltip(icon_focus)); + this->SetToolTip(get_tooltip(focused_item, tick)); if (action) { diff --git a/src/slic3r/GUI/DoubleSlider.hpp b/src/slic3r/GUI/DoubleSlider.hpp index 01181fc2f5..00f64a6f6e 100644 --- a/src/slic3r/GUI/DoubleSlider.hpp +++ b/src/slic3r/GUI/DoubleSlider.hpp @@ -33,10 +33,14 @@ enum SelectedSlider { ssHigher }; -enum IconFocus { - ifNone, - ifRevert, - ifCog +enum FocusItem { + fiNone, + fiRevertIcon, + fiOneLayerIcon, + fiCogIcon, + fiColorBand, + fiActionIcon, + fiTick }; enum ConflictType @@ -263,7 +267,7 @@ private: wxSize get_size(); void get_size(int *w, int *h); double get_double_value(const SelectedSlider& selection); - wxString get_tooltip(IconFocus icon_focus); + wxString get_tooltip(FocusItem focused_item, int tick = -1); std::string get_color_for_tool_change_tick(std::set::const_iterator it) const; std::string get_color_for_color_change_tick(std::set::const_iterator it) const; From 58b5e75a9c1ea3ae28b1c1f767e0024cfb9bdf6b Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Tue, 4 Feb 2020 12:18:57 +0100 Subject: [PATCH 239/336] SlaSupports gizmo - show holes position even when user did not Preview the drilled mesh --- src/slic3r/GUI/Gizmos/GLGizmoBase.cpp | 2 ++ src/slic3r/GUI/Gizmos/GLGizmoBase.hpp | 3 +++ src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp | 8 ++++---- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp b/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp index af022352e0..c237198a98 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp @@ -358,12 +358,14 @@ bool CommonGizmosData::update_from_backend(GLCanvas3D& canvas, ModelObject* mode m_backend_mesh_transformed = po->get_mesh_to_print(); m_backend_mesh_transformed.transform(canvas.sla_print()->sla_trafo(*m_model_object).inverse()); m_mesh = &m_backend_mesh_transformed; + m_has_drilled_mesh = true; } } if (! m_mesh) { m_mesh = &m_model_object->volumes.front()->mesh(); m_backend_mesh_transformed.clear(); + m_has_drilled_mesh = false; } m_model_object_id = m_model_object->id(); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp b/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp index 5cd3d9d84c..f3941b0a10 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp @@ -227,10 +227,13 @@ public: m_clipping_plane_distance = m_clipping_plane_distance_stash; } + bool has_drilled_mesh() const { return m_has_drilled_mesh; } + private: const TriangleMesh* m_old_mesh; TriangleMesh m_backend_mesh_transformed; float m_clipping_plane_distance_stash = 0.f; + bool m_has_drilled_mesh = false; }; } // namespace GUI diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp index 879a09da2e..fd9b116a96 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp @@ -335,7 +335,7 @@ void GLGizmoSlaSupports::render_points(const Selection& selection, bool picking) } // Now render the drain holes: - /*if (! m_c->m_cavity_mesh) { + if (! m_c->has_drilled_mesh()) { render_color[0] = 0.7f; render_color[1] = 0.7f; render_color[2] = 0.7f; @@ -370,7 +370,7 @@ void GLGizmoSlaSupports::render_points(const Selection& selection, bool picking) glFrontFace(GL_CCW); glsafe(::glPopMatrix()); } - }*/ + } if (!picking) glsafe(::glDisable(GL_LIGHTING)); @@ -414,14 +414,14 @@ bool GLGizmoSlaSupports::unproject_on_mesh(const Vec2d& mouse_pos, std::pairm_cavity_mesh) { + if (! m_c->has_drilled_mesh()) { for (const sla::DrainHole& hole : m_c->m_model_object->sla_drain_holes) { if (hole.is_inside(hit)) { in_hole = true; break; } } - }*/ + } if (! in_hole) { // Return both the point and the facet normal. pos_and_normal = std::make_pair(hit, normal); From 808cf2e38a5b8aeb9af4a09c80a80dd7563ce0fd Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Tue, 4 Feb 2020 13:02:58 +0100 Subject: [PATCH 240/336] Hollowing: merge meshes of holes with igl (intersecting holes) --- src/libslic3r/SLAPrintSteps.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libslic3r/SLAPrintSteps.cpp b/src/libslic3r/SLAPrintSteps.cpp index b7d1cfa1d8..7810a351f7 100644 --- a/src/libslic3r/SLAPrintSteps.cpp +++ b/src/libslic3r/SLAPrintSteps.cpp @@ -143,7 +143,7 @@ void SLAPrint::Steps::drill_holes(SLAPrintObject &po) holes_mesh.merge(sla::to_triangle_mesh(holept.to_mesh())); holes_mesh.require_shared_vertices(); - MeshBoolean::cgal::self_union(holes_mesh); //FIXME-fix and use the cgal version + MeshBoolean::self_union(holes_mesh); try { MeshBoolean::cgal::minus(hollowed_mesh, holes_mesh); From 0e3ebb3e0777407f28e9559c538238024439c682 Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Tue, 4 Feb 2020 13:03:28 +0100 Subject: [PATCH 241/336] Hollowing gizmo: Invalidate drilled mesh in case a hole is manipulated This way the holes cannot be placed on its own walls Downside is that AABB trees have to be recalculated --- src/slic3r/GUI/GLCanvas3D.cpp | 1 + src/slic3r/GUI/GLCanvas3D.hpp | 1 + src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp | 15 +++++++++++++++ src/slic3r/GUI/Plater.cpp | 1 + 4 files changed, 18 insertions(+) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index e12e8c6612..0741c47cf5 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -1241,6 +1241,7 @@ wxDEFINE_EVENT(EVT_GLCANVAS_INCREASE_INSTANCES, Event); wxDEFINE_EVENT(EVT_GLCANVAS_INSTANCE_MOVED, SimpleEvent); wxDEFINE_EVENT(EVT_GLCANVAS_INSTANCE_ROTATED, SimpleEvent); wxDEFINE_EVENT(EVT_GLCANVAS_INSTANCE_SCALED, SimpleEvent); +wxDEFINE_EVENT(EVT_GLCANVAS_FORCE_UPDATE, SimpleEvent); wxDEFINE_EVENT(EVT_GLCANVAS_WIPETOWER_MOVED, Vec3dEvent); wxDEFINE_EVENT(EVT_GLCANVAS_WIPETOWER_ROTATED, Vec3dEvent); wxDEFINE_EVENT(EVT_GLCANVAS_ENABLE_ACTION_BUTTONS, Event); diff --git a/src/slic3r/GUI/GLCanvas3D.hpp b/src/slic3r/GUI/GLCanvas3D.hpp index a0e7958897..39dd2d744f 100644 --- a/src/slic3r/GUI/GLCanvas3D.hpp +++ b/src/slic3r/GUI/GLCanvas3D.hpp @@ -91,6 +91,7 @@ wxDECLARE_EVENT(EVT_GLCANVAS_SELECT_ALL, SimpleEvent); wxDECLARE_EVENT(EVT_GLCANVAS_QUESTION_MARK, SimpleEvent); wxDECLARE_EVENT(EVT_GLCANVAS_INCREASE_INSTANCES, Event); // data: +1 => increase, -1 => decrease wxDECLARE_EVENT(EVT_GLCANVAS_INSTANCE_MOVED, SimpleEvent); +wxDECLARE_EVENT(EVT_GLCANVAS_FORCE_UPDATE, SimpleEvent); wxDECLARE_EVENT(EVT_GLCANVAS_WIPETOWER_MOVED, Vec3dEvent); wxDECLARE_EVENT(EVT_GLCANVAS_INSTANCE_ROTATED, SimpleEvent); wxDECLARE_EVENT(EVT_GLCANVAS_INSTANCE_SCALED, SimpleEvent); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp index b585a8e4f2..e3b18792e9 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp @@ -330,6 +330,7 @@ bool GLGizmoHollow::unproject_on_mesh(const Vec2d& mouse_pos, std::pairm_mesh_raycaster) return false; + // if the gizmo doesn't have the V, F structures for igl, calculate them first: // !!! is it really necessary? //m_c->update_from_backend(m_parent, m_c->m_model_object); @@ -344,6 +345,18 @@ bool GLGizmoHollow::unproject_on_mesh(const Vec2d& mouse_pos, std::pairm_mesh_raycaster->unproject_on_mesh(mouse_pos, trafo.get_matrix(), camera, hit, normal, m_c->m_clipping_plane.get())) { + + // User is about to manipulate a hole. If the gizmo currently shows drilled mesh, + // invalidate slaposDrillHoles so it returns to normal. To do this, hackishly + // add a hole, force SLAPrint::apply call that will invalidate the step because + // of it and then remove the hole again. + if (m_c->has_drilled_mesh()) { + m_c->m_model_object->sla_drain_holes.push_back(sla::DrainHole()); + m_parent.post_event(SimpleEvent(EVT_GLCANVAS_FORCE_UPDATE)); + wxGetApp().CallAfter([this] { m_c->m_model_object->sla_drain_holes.pop_back();}); + return false; + } + // Return both the point and the facet normal. pos_and_normal = std::make_pair(hit, normal); return true; @@ -513,6 +526,8 @@ void GLGizmoHollow::delete_selected_points() } } + m_parent.post_event(SimpleEvent(EVT_GLCANVAS_FORCE_UPDATE)); + select_point(NoPoints); } diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index bbb7db74dd..7f615b7f67 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -2062,6 +2062,7 @@ Plater::priv::priv(Plater *q, MainFrame *main_frame) view3D_canvas->Bind(EVT_GLCANVAS_INCREASE_INSTANCES, [this](Event &evt) { if (evt.data == 1) this->q->increase_instances(); else if (this->can_decrease_instances()) this->q->decrease_instances(); }); view3D_canvas->Bind(EVT_GLCANVAS_INSTANCE_MOVED, [this](SimpleEvent&) { update(); }); + view3D_canvas->Bind(EVT_GLCANVAS_FORCE_UPDATE, [this](SimpleEvent&) { update(); }); view3D_canvas->Bind(EVT_GLCANVAS_WIPETOWER_MOVED, &priv::on_wipetower_moved, this); view3D_canvas->Bind(EVT_GLCANVAS_WIPETOWER_ROTATED, &priv::on_wipetower_rotated, this); view3D_canvas->Bind(EVT_GLCANVAS_INSTANCE_ROTATED, [this](SimpleEvent&) { update(); }); From 617912ecc1c380707fbfe5f9349af64d32b196d9 Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Tue, 4 Feb 2020 15:01:23 +0100 Subject: [PATCH 242/336] Fixed a crash on deleting object with SLA gizmo active Rephrased text informing about hidden objects in both SLA gizmos --- src/slic3r/GUI/GLCanvas3D.cpp | 2 +- src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 0741c47cf5..16fe7696cc 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -683,7 +683,7 @@ void GLCanvas3D::WarningTexture::activate(WarningTexture::Warning warning, bool case ObjectOutside : text = L("An object outside the print area was detected"); break; case ToolpathOutside : text = L("A toolpath outside the print area was detected"); break; case SlaSupportsOutside : text = L("SLA supports outside the print area were detected"); break; - case SomethingNotShown : text = L("Some objects are not visible when editing supports"); break; + case SomethingNotShown : text = L("Some objects are not visible"); break; case ObjectClashed: { text = L("An object outside the print area was detected\n" "Resolve the current problem to continue slicing"); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp index fd9b116a96..5130b7a9a1 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp @@ -1291,6 +1291,8 @@ bool GLGizmoSlaSupports::unsaved_changes() const void GLGizmoSlaSupports::update_clipping_plane(bool keep_normal) const { + if (! m_c->m_model_object) + return; Vec3d normal = (keep_normal && m_c->m_clipping_plane->get_normal() != Vec3d::Zero() ? m_c->m_clipping_plane->get_normal() : -m_parent.get_camera().get_dir_forward()); From 65b9ef6636dbee66aeced9b4d0c7f6288e532bfd Mon Sep 17 00:00:00 2001 From: David Kocik Date: Tue, 4 Feb 2020 15:24:35 +0100 Subject: [PATCH 243/336] configuration updater forced update dialog check for updates button check address when downloading bundles --- src/slic3r/Config/Version.cpp | 4 ++ src/slic3r/Config/Version.hpp | 1 + src/slic3r/GUI/GUI_App.cpp | 66 +++++++++++++--------- src/slic3r/GUI/GUI_App.hpp | 1 + src/slic3r/GUI/Plater.cpp | 7 +++ src/slic3r/GUI/Plater.hpp | 2 + src/slic3r/GUI/UpdateDialogs.cpp | 90 +++++++++++++++++++++++++++++- src/slic3r/GUI/UpdateDialogs.hpp | 38 +++++++++++++ src/slic3r/Utils/PresetUpdater.cpp | 87 ++++++++++++++++++++++++----- 9 files changed, 257 insertions(+), 39 deletions(-) diff --git a/src/slic3r/Config/Version.cpp b/src/slic3r/Config/Version.cpp index 2104a6eeab..2d036e9f35 100644 --- a/src/slic3r/Config/Version.cpp +++ b/src/slic3r/Config/Version.cpp @@ -66,6 +66,10 @@ bool Version::is_current_slic3r_supported() const return this->is_slic3r_supported(Slic3r::SEMVER); } +bool Version::is_current_slic3r_downgrade() const +{ + return Slic3r::SEMVER < min_slic3r_version; +} #if 0 //TODO: This test should be moved to a unit test, once we have C++ unit tests in place. static int version_test() diff --git a/src/slic3r/Config/Version.hpp b/src/slic3r/Config/Version.hpp index e5f1a2e214..881b856ff1 100644 --- a/src/slic3r/Config/Version.hpp +++ b/src/slic3r/Config/Version.hpp @@ -29,6 +29,7 @@ struct Version bool is_slic3r_supported(const Semver &slicer_version) const; bool is_current_slic3r_supported() const; + bool is_current_slic3r_downgrade() const; }; // Index of vendor specific config bundle versions and Slic3r compatibilities. diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index c6f5cfb47f..3a097d9abe 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -278,34 +278,23 @@ bool GUI_App::on_init_inner() RemovableDriveManager::get_instance().update(wxGetLocalTime(), true); #endif - // Preset updating & Configwizard are done after the above initializations, - // and after MainFrame is created & shown. - // The extra CallAfter() is needed because of Mac, where this is the only way - // to popup a modal dialog on start without screwing combo boxes. - // This is ugly but I honestly found no better way to do it. - // Neither wxShowEvent nor wxWindowCreateEvent work reliably. + // Preset updating & Configwizard are done after the above initializations, + // and after MainFrame is created & shown. + // The extra CallAfter() is needed because of Mac, where this is the only way + // to popup a modal dialog on start without screwing combo boxes. + // This is ugly but I honestly found no better way to do it. + // Neither wxShowEvent nor wxWindowCreateEvent work reliably. + static bool once = true; if (once) { once = false; + check_updates(false); - PresetUpdater::UpdateResult updater_result; - try { - updater_result = preset_updater->config_update(app_config->orig_version()); - if (updater_result == PresetUpdater::R_INCOMPAT_EXIT) { - mainframe->Close(); - } else if (updater_result == PresetUpdater::R_INCOMPAT_CONFIGURED) { - app_conf_exists = true; - } - } catch (const std::exception &ex) { - show_error(nullptr, from_u8(ex.what())); - } - - CallAfter([this] { - config_wizard_startup(); - preset_updater->slic3r_update_notify(); - preset_updater->sync(preset_bundle); - }); - + CallAfter([this] { + config_wizard_startup(); + preset_updater->slic3r_update_notify(); + preset_updater->sync(preset_bundle); + }); } }); @@ -810,7 +799,7 @@ void GUI_App::add_config_menu(wxMenuBar *menu) local_menu->Append(config_id_base + ConfigMenuWizard, config_wizard_name + dots, config_wizard_tooltip); local_menu->Append(config_id_base + ConfigMenuSnapshots, _(L("&Configuration Snapshots")) + dots, _(L("Inspect / activate configuration snapshots"))); local_menu->Append(config_id_base + ConfigMenuTakeSnapshot, _(L("Take Configuration &Snapshot")), _(L("Capture a configuration snapshot"))); - // local_menu->Append(config_id_base + ConfigMenuUpdate, _(L("Check for updates")), _(L("Check for configuration updates"))); + local_menu->Append(config_id_base + ConfigMenuUpdate, _(L("Check for updates")), _(L("Check for configuration updates"))); local_menu->AppendSeparator(); local_menu->Append(config_id_base + ConfigMenuPreferences, _(L("&Preferences")) + dots + #ifdef __APPLE__ @@ -841,6 +830,9 @@ void GUI_App::add_config_menu(wxMenuBar *menu) case ConfigMenuWizard: run_wizard(ConfigWizard::RR_USER); break; + case ConfigMenuUpdate: + check_updates(true); + break; case ConfigMenuTakeSnapshot: // Take a configuration snapshot. if (check_unsaved_changes()) { @@ -1230,6 +1222,30 @@ bool GUI_App::config_wizard_startup() return false; } +void GUI_App::check_updates(const bool verbose) +{ + + PresetUpdater::UpdateResult updater_result; + try { + updater_result = preset_updater->config_update(app_config->orig_version()); + if (updater_result == PresetUpdater::R_INCOMPAT_EXIT) { + mainframe->Close(); + } + else if (updater_result == PresetUpdater::R_INCOMPAT_CONFIGURED) { + app_conf_exists = true; + } + else if(verbose && updater_result == PresetUpdater::R_NOOP) + { + MsgNoUpdates dlg; + dlg.ShowModal(); + } + } + catch (const std::exception & ex) { + show_error(nullptr, from_u8(ex.what())); + } + + +} // static method accepting a wxWindow object as first parameter // void warning_catcher{ // my($self, $message_dialog) = @_; diff --git a/src/slic3r/GUI/GUI_App.hpp b/src/slic3r/GUI/GUI_App.hpp index 250d8122a8..10b09b1da7 100644 --- a/src/slic3r/GUI/GUI_App.hpp +++ b/src/slic3r/GUI/GUI_App.hpp @@ -200,6 +200,7 @@ private: bool select_language(); bool config_wizard_startup(); + void check_updates(const bool verbose); #ifdef __WXMSW__ void associate_3mf_files(); diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 7f615b7f67..1b69decfc2 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -5375,6 +5375,13 @@ void Plater::on_config_change(const DynamicPrintConfig &config) this->p->schedule_background_process(); } +void Plater::set_bed_shape() const +{ + p->set_bed_shape(p->config->option("bed_shape")->values, + p->config->option("bed_custom_texture")->value, + p->config->option("bed_custom_model")->value); +} + void Plater::force_filament_colors_update() { bool update_scheduled = false; diff --git a/src/slic3r/GUI/Plater.hpp b/src/slic3r/GUI/Plater.hpp index 568727abf3..e9d71b2994 100644 --- a/src/slic3r/GUI/Plater.hpp +++ b/src/slic3r/GUI/Plater.hpp @@ -284,6 +284,8 @@ public: const Mouse3DController& get_mouse3d_controller() const; Mouse3DController& get_mouse3d_controller(); + void set_bed_shape() const; + // ROII wrapper for suppressing the Undo / Redo snapshot to be taken. class SuppressSnapshots { diff --git a/src/slic3r/GUI/UpdateDialogs.cpp b/src/slic3r/GUI/UpdateDialogs.cpp index d5c69be0b7..b152ed135f 100644 --- a/src/slic3r/GUI/UpdateDialogs.cpp +++ b/src/slic3r/GUI/UpdateDialogs.cpp @@ -142,6 +142,71 @@ MsgUpdateConfig::MsgUpdateConfig(const std::vector &updates) : MsgUpdateConfig::~MsgUpdateConfig() {} +//MsgUpdateForced + +MsgUpdateForced::MsgUpdateForced(const std::vector& updates) : + MsgDialog(nullptr, wxString::Format(_(L("%s incompatibility")), SLIC3R_APP_NAME), _(L("Configuration update is necessary to install")), wxID_NONE) +{ + auto* text = new wxStaticText(this, wxID_ANY, wxString::Format(_(L( + "%s will now start updates. Otherwise it won't be able to start.\n\n" + "Note that a full configuration snapshot will be created first. It can then be restored at any time " + "should there be a problem with the new version.\n\n" + "Updated configuration bundles:" + )), SLIC3R_APP_NAME)); + + logo->SetBitmap(create_scaled_bitmap("PrusaSlicer_192px_grayscale.png", this, 192)); + + text->Wrap(CONTENT_WIDTH * wxGetApp().em_unit()); + content_sizer->Add(text); + content_sizer->AddSpacer(VERT_SPACING); + + const auto lang_code = wxGetApp().current_language_code_safe().ToStdString(); + + auto* versions = new wxBoxSizer(wxVERTICAL); + for (const auto& update : updates) { + auto* flex = new wxFlexGridSizer(2, 0, VERT_SPACING); + + auto* text_vendor = new wxStaticText(this, wxID_ANY, update.vendor); + text_vendor->SetFont(boldfont); + flex->Add(text_vendor); + flex->Add(new wxStaticText(this, wxID_ANY, update.version.to_string())); + + if (!update.comment.empty()) { + flex->Add(new wxStaticText(this, wxID_ANY, _(L("Comment:"))), 0, wxALIGN_RIGHT); + auto* update_comment = new wxStaticText(this, wxID_ANY, from_u8(update.comment)); + update_comment->Wrap(CONTENT_WIDTH * wxGetApp().em_unit()); + flex->Add(update_comment); + } + + versions->Add(flex); + + if (!update.changelog_url.empty() && update.version.prerelease() == nullptr) { + auto* line = new wxBoxSizer(wxHORIZONTAL); + auto changelog_url = (boost::format(update.changelog_url) % lang_code).str(); + line->AddSpacer(3 * VERT_SPACING); + line->Add(new wxHyperlinkCtrl(this, wxID_ANY, _(L("Open changelog page")), changelog_url)); + versions->Add(line); + } + } + + content_sizer->Add(versions); + content_sizer->AddSpacer(2 * VERT_SPACING); + + auto* btn_exit = new wxButton(this, wxID_EXIT, wxString::Format(_(L("Exit %s")), SLIC3R_APP_NAME)); + btn_sizer->Add(btn_exit); + btn_sizer->AddSpacer(HORIZ_SPACING); + auto* btn_ok = new wxButton(this, wxID_OK); + btn_sizer->Add(btn_ok); + btn_ok->SetFocus(); + + auto exiter = [this](const wxCommandEvent& evt) { this->EndModal(evt.GetId()); }; + btn_exit->Bind(wxEVT_BUTTON, exiter); + btn_ok->Bind(wxEVT_BUTTON, exiter); + + Fit(); +} + +MsgUpdateForced::~MsgUpdateForced() {} // MsgDataIncompatible @@ -157,7 +222,7 @@ MsgDataIncompatible::MsgDataIncompatible(const std::unordered_mapWrap(CONTENT_WIDTH * wxGetApp().em_unit()); content_sizer->Add(text); @@ -236,5 +301,28 @@ MsgDataLegacy::MsgDataLegacy() : MsgDataLegacy::~MsgDataLegacy() {} +// MsgNoUpdate + +MsgNoUpdates::MsgNoUpdates() : + MsgDialog(nullptr, _(L("Configuration updates")), _(L("No updates aviable"))) +{ + + auto* text = new wxStaticText(this, wxID_ANY, wxString::Format( + _(L( + "%s has no configuration updates aviable." + )), + SLIC3R_APP_NAME, ConfigWizard::name() + )); + text->Wrap(CONTENT_WIDTH * wxGetApp().em_unit()); + content_sizer->Add(text); + content_sizer->AddSpacer(VERT_SPACING); + + logo->SetBitmap(create_scaled_bitmap("PrusaSlicer_192px_grayscale.png", this, 192)); + + Fit(); +} + +MsgNoUpdates::~MsgNoUpdates() {} + } } diff --git a/src/slic3r/GUI/UpdateDialogs.hpp b/src/slic3r/GUI/UpdateDialogs.hpp index a916e0145e..6d355065a1 100644 --- a/src/slic3r/GUI/UpdateDialogs.hpp +++ b/src/slic3r/GUI/UpdateDialogs.hpp @@ -62,6 +62,33 @@ public: ~MsgUpdateConfig(); }; +// Informs about currently installed bundles not being compatible with the running Slic3r. Asks about action. +class MsgUpdateForced : public MsgDialog +{ +public: + struct Update + { + std::string vendor; + Semver version; + std::string comment; + std::string changelog_url; + + Update(std::string vendor, Semver version, std::string comment, std::string changelog_url) + : vendor(std::move(vendor)) + , version(std::move(version)) + , comment(std::move(comment)) + , changelog_url(std::move(changelog_url)) + {} + }; + + MsgUpdateForced(const std::vector& updates); + MsgUpdateForced(MsgUpdateForced&&) = delete; + MsgUpdateForced(const MsgUpdateForced&) = delete; + MsgUpdateForced& operator=(MsgUpdateForced&&) = delete; + MsgUpdateForced& operator=(const MsgUpdateForced&) = delete; + ~MsgUpdateForced(); +}; + // Informs about currently installed bundles not being compatible with the running Slic3r. Asks about action. class MsgDataIncompatible : public MsgDialog { @@ -87,6 +114,17 @@ public: ~MsgDataLegacy(); }; +// Informs about absence of bundles requiring update. +class MsgNoUpdates : public MsgDialog +{ +public: + MsgNoUpdates(); + MsgNoUpdates(MsgNoUpdates&&) = delete; + MsgNoUpdates(const MsgNoUpdates&) = delete; + MsgNoUpdates& operator=(MsgNoUpdates&&) = delete; + MsgNoUpdates& operator=(const MsgNoUpdates&) = delete; + ~MsgNoUpdates(); +}; } } diff --git a/src/slic3r/Utils/PresetUpdater.cpp b/src/slic3r/Utils/PresetUpdater.cpp index 55e3a5a738..ecdc12b507 100644 --- a/src/slic3r/Utils/PresetUpdater.cpp +++ b/src/slic3r/Utils/PresetUpdater.cpp @@ -73,13 +73,16 @@ struct Update std::string vendor; std::string changelog_url; + bool forced_update; + Update() {} - Update(fs::path &&source, fs::path &&target, const Version &version, std::string vendor, std::string changelog_url) + Update(fs::path &&source, fs::path &&target, const Version &version, std::string vendor, std::string changelog_url, bool forced = false) : source(std::move(source)) , target(std::move(target)) , version(version) , vendor(std::move(vendor)) , changelog_url(std::move(changelog_url)) + , forced_update(forced) {} void install() const @@ -297,6 +300,12 @@ void PresetUpdater::priv::sync_config(const VendorMap vendors) const auto idx_url = vendor.config_update_url + "/" + INDEX_FILENAME; const std::string idx_path = (cache_path / (vendor.id + ".idx")).string(); const std::string idx_path_temp = idx_path + "-update"; + //check if idx_url is leading to our site + if(idx_url.substr(0, 54) != "http://files.prusa3d.com/wp-content/uploads/repository") + { + BOOST_LOG_TRIVIAL(warning) << "unsafe url path for vendor: " << vendor.name; + continue; + } if (!get_file(idx_url, idx_path_temp)) { continue; } if (cancel) { return; } @@ -418,11 +427,16 @@ Updates PresetUpdater::priv::get_config_updates(const Semver &old_slic3r_version continue; } - if (ver_current_found && !ver_current->is_current_slic3r_supported()) { - // "Reconfigure" situation. - BOOST_LOG_TRIVIAL(warning) << "Current Slic3r incompatible with installed bundle: " << bundle_path.string(); - updates.incompats.emplace_back(std::move(bundle_path), *ver_current, vp.name); - continue; + bool current_not_supported = false; //if slcr is incompatible but situation is not downgrade, we do forced updated and this bool is information to do it + + if (ver_current_found && !ver_current->is_current_slic3r_supported()){ + if(ver_current->is_current_slic3r_downgrade()) { + // "Reconfigure" situation. + BOOST_LOG_TRIVIAL(warning) << "Current Slic3r incompatible with installed bundle: " << bundle_path.string(); + updates.incompats.emplace_back(std::move(bundle_path), *ver_current, vp.name); + continue; + } + current_not_supported = true; } if (recommended->config_version < vp.config_version) { @@ -462,7 +476,7 @@ Updates PresetUpdater::priv::get_config_updates(const Semver &old_slic3r_version if (new_vp.config_version == recommended->config_version) { // The config bundle from the cache directory matches the recommended version of the index from the cache directory. // This is the newest known recommended config. Use it. - new_update = Update(std::move(path_in_cache), std::move(bundle_path), *recommended, vp.name, vp.changelog_url); + new_update = Update(std::move(path_in_cache), std::move(bundle_path), *recommended, vp.name, vp.changelog_url, current_not_supported); // and install the config index from the cache into vendor's directory. bundle_path_idx_to_install = idx.path(); found = true; @@ -492,7 +506,7 @@ Updates PresetUpdater::priv::get_config_updates(const Semver &old_slic3r_version } recommended = rsrc_idx.recommended(); if (recommended != rsrc_idx.end() && recommended->config_version == rsrc_vp.config_version && recommended->config_version > vp.config_version) { - new_update = Update(std::move(path_in_rsrc), std::move(bundle_path), *recommended, vp.name, vp.changelog_url); + new_update = Update(std::move(path_in_rsrc), std::move(bundle_path), *recommended, vp.name, vp.changelog_url, current_not_supported); bundle_path_idx_to_install = path_idx_in_rsrc; found = true; } else { @@ -513,11 +527,11 @@ Updates PresetUpdater::priv::get_config_updates(const Semver &old_slic3r_version // Find a recommended config bundle version for the slic3r version last executed. This makes sure that a config bundle update will not be missed // when upgrading an application. On the other side, the user will be bugged every time he will switch between slic3r versions. const auto existing_recommended = existing_idx.recommended(old_slic3r_version); - if (existing_recommended != existing_idx.end() && recommended->config_version == existing_recommended->config_version) { + /*if (existing_recommended != existing_idx.end() && recommended->config_version == existing_recommended->config_version) { // The user has already seen (and presumably rejected) this update BOOST_LOG_TRIVIAL(info) << boost::format("Downloaded index for `%1%` is the same as installed one, not offering an update.") % idx.vendor(); continue; - } + }*/ } catch (const std::exception &err) { BOOST_LOG_TRIVIAL(error) << boost::format("Cannot load the installed index at `%1%`: %2%") % bundle_path_idx % err.what(); } @@ -554,14 +568,17 @@ void PresetUpdater::priv::perform_updates(Updates &&updates, bool snapshot) cons BOOST_LOG_TRIVIAL(info) << "Taking a snapshot..."; SnapshotDB::singleton().take_snapshot(*GUI::wxGetApp().app_config, Snapshot::SNAPSHOT_DOWNGRADE); } - + BOOST_LOG_TRIVIAL(info) << boost::format("Deleting %1% incompatible bundles") % updates.incompats.size(); for (auto &incompat : updates.incompats) { BOOST_LOG_TRIVIAL(info) << '\t' << incompat; incompat.remove(); } + + } else if (updates.updates.size() > 0) { + if (snapshot) { BOOST_LOG_TRIVIAL(info) << "Taking a snapshot..."; SnapshotDB::singleton().take_snapshot(*GUI::wxGetApp().app_config, Snapshot::SNAPSHOT_UPGRADE); @@ -688,6 +705,7 @@ PresetUpdater::UpdateResult PresetUpdater::config_update(const Semver &old_slic3 ); } else if (min_slic3r != Semver::zero()) { restrictions = wxString::Format(_(L("requires min. %s")), min_slic3r.to_string()); + BOOST_LOG_TRIVIAL(debug) << "Bundle is not downgrade, user will now have to do whole wizard. This should not happen."; } else { restrictions = wxString::Format(_(L("requires max. %s")), max_slic3r.to_string()); } @@ -704,16 +722,59 @@ PresetUpdater::UpdateResult PresetUpdater::config_update(const Semver &old_slic3 // (snapshot is taken beforehand) p->perform_updates(std::move(updates)); - if (! GUI::wxGetApp().run_wizard(GUI::ConfigWizard::RR_DATA_INCOMPAT)) { + if (!GUI::wxGetApp().run_wizard(GUI::ConfigWizard::RR_DATA_INCOMPAT)) { return R_INCOMPAT_EXIT; } return R_INCOMPAT_CONFIGURED; - } else { + } + else { BOOST_LOG_TRIVIAL(info) << "User wants to exit Slic3r, bye..."; return R_INCOMPAT_EXIT; } + } else if (updates.updates.size() > 0) { + + bool incompatible_version = false; + for (const auto& update : updates.updates) { + incompatible_version = (update.forced_update ? true : incompatible_version); + //td::cout << update.forced_update << std::endl; + //BOOST_LOG_TRIVIAL(info) << boost::format("Update requires higher version."); + } + + //forced update + if(incompatible_version) + { + BOOST_LOG_TRIVIAL(info) << boost::format("Update of %1% bundles available. At least one requires higher version of Slicer.") % updates.updates.size(); + + std::vector updates_msg; + for (const auto& update : updates.updates) { + std::string changelog_url = update.version.config_version.prerelease() == nullptr ? update.changelog_url : std::string(); + updates_msg.emplace_back(update.vendor, update.version.config_version, update.version.comment, std::move(changelog_url)); + } + + GUI::MsgUpdateForced dlg(updates_msg); + + const auto res = dlg.ShowModal(); + if (res == wxID_OK) { + BOOST_LOG_TRIVIAL(info) << "User wants to update..."; + + p->perform_updates(std::move(updates)); + + // Reload global configuration + auto* app_config = GUI::wxGetApp().app_config; + GUI::wxGetApp().preset_bundle->load_presets(*app_config); + GUI::wxGetApp().load_current_presets(); + GUI::wxGetApp().plater()->set_bed_shape(); + return R_UPDATE_INSTALLED; + } + else { + BOOST_LOG_TRIVIAL(info) << "User wants to exit Slic3r, bye..."; + return R_INCOMPAT_EXIT; + } + } + + // regular update BOOST_LOG_TRIVIAL(info) << boost::format("Update of %1% bundles available. Asking for confirmation ...") % updates.updates.size(); std::vector updates_msg; From 059bdb4711e6ca392c707b70ab6d450a96bb85c9 Mon Sep 17 00:00:00 2001 From: bubnikv Date: Tue, 4 Feb 2020 14:43:58 +0100 Subject: [PATCH 244/336] Implemented handling of complex ConfigOptionFloatOrPercent chains by the PlaceholderParser. Namely, all the options with the "ratio_over" reference are now handled correctly by the PlaceholderParser with the exception of the "first_layer_extrusion_width", which overrides speed of extrusions by their respective extrusion type. Also the various extrusion widths (extrusion_width, first_layer_extrusion_width, external_perimeter_extrusion_width etc.) produce the same numbers as if ran through the back-end, with the assumption of not overriding layer height by the variable layer height editing tool or layer height modifiers. --- src/PrusaSlicer.cpp | 2 +- src/libslic3r/Config.cpp | 6 ++ src/libslic3r/Config.hpp | 67 +++++++++++---- src/libslic3r/Flow.cpp | 95 ++++++++++++++++++++- src/libslic3r/Flow.hpp | 10 +++ src/libslic3r/PlaceholderParser.cpp | 72 ++++++++++------ src/libslic3r/Print.cpp | 19 +---- src/libslic3r/Print.hpp | 1 - src/libslic3r/PrintConfig.cpp | 3 +- src/libslic3r/PrintConfig.hpp | 27 +----- tests/libslic3r/test_placeholder_parser.cpp | 23 ++++- 11 files changed, 236 insertions(+), 89 deletions(-) diff --git a/src/PrusaSlicer.cpp b/src/PrusaSlicer.cpp index 28aadc0458..7662288d35 100644 --- a/src/PrusaSlicer.cpp +++ b/src/PrusaSlicer.cpp @@ -591,7 +591,7 @@ bool CLI::setup(int argc, char **argv) // Initialize with defaults. for (const t_optiondef_map *options : { &cli_actions_config_def.options, &cli_transform_config_def.options, &cli_misc_config_def.options }) for (const std::pair &optdef : *options) - m_config.optptr(optdef.first, true); + m_config.option(optdef.first, true); set_data_dir(m_config.opt_string("datadir")); diff --git a/src/libslic3r/Config.cpp b/src/libslic3r/Config.cpp index bcd0172780..6806f4f540 100644 --- a/src/libslic3r/Config.cpp +++ b/src/libslic3r/Config.cpp @@ -757,6 +757,12 @@ ConfigOption* DynamicConfig::optptr(const t_config_option_key &opt_key, bool cre return opt; } +const ConfigOption* DynamicConfig::optptr(const t_config_option_key &opt_key) const +{ + auto it = options.find(opt_key); + return (it == options.end()) ? nullptr : it->second.get(); +} + void DynamicConfig::read_cli(const std::vector &tokens, t_config_option_keys* extra, t_config_option_keys* keys) { std::vector args; diff --git a/src/libslic3r/Config.hpp b/src/libslic3r/Config.hpp index 9b04ae0269..1258cc3f13 100644 --- a/src/libslic3r/Config.hpp +++ b/src/libslic3r/Config.hpp @@ -1494,8 +1494,49 @@ protected: ConfigOptionDef* add_nullable(const t_config_option_key &opt_key, ConfigOptionType type); }; +// A pure interface to resolving ConfigOptions. +// This pure interface is useful as a base of ConfigBase, also it may be overriden to combine +// various config sources. +class ConfigOptionResolver +{ +public: + ConfigOptionResolver() {} + virtual ~ConfigOptionResolver() {} + + // Find a ConfigOption instance for a given name. + virtual const ConfigOption* optptr(const t_config_option_key &opt_key) const = 0; + + bool has(const t_config_option_key &opt_key) const { return this->optptr(opt_key) != nullptr; } + + const ConfigOption* option(const t_config_option_key &opt_key) const { return this->optptr(opt_key); } + + template + const TYPE* option(const t_config_option_key& opt_key) const + { + const ConfigOption* opt = this->optptr(opt_key); + return (opt == nullptr || opt->type() != TYPE::static_type()) ? nullptr : static_cast(opt); + } + + const ConfigOption* option_throw(const t_config_option_key& opt_key) const + { + const ConfigOption* opt = this->optptr(opt_key); + if (opt == nullptr) + throw UnknownOptionException(opt_key); + return opt; + } + + template + const TYPE* option_throw(const t_config_option_key& opt_key) const + { + const ConfigOption* opt = this->option_throw(opt_key); + if (opt->type() != TYPE::static_type()) + throw BadOptionTypeException("Conversion to a wrong type"); + return static_cast(opt); + } +}; + // An abstract configuration store. -class ConfigBase +class ConfigBase : public ConfigOptionResolver { public: // Definition of configuration values for the purpose of GUI presentation, editing, value mapping and config file handling. @@ -1503,7 +1544,7 @@ public: // but it carries the defaults of the configuration values. ConfigBase() {} - virtual ~ConfigBase() {} + ~ConfigBase() override {} // Virtual overridables: public: @@ -1513,6 +1554,7 @@ public: virtual ConfigOption* optptr(const t_config_option_key &opt_key, bool create = false) = 0; // Collect names of all configuration values maintained by this configuration store. virtual t_config_option_keys keys() const = 0; + protected: // Verify whether the opt_key has not been obsoleted or renamed. // Both opt_key and value may be modified by handle_legacy(). @@ -1521,12 +1563,10 @@ protected: virtual void handle_legacy(t_config_option_key &/*opt_key*/, std::string &/*value*/) const {} public: + using ConfigOptionResolver::option; + using ConfigOptionResolver::option_throw; + // Non-virtual methods: - bool has(const t_config_option_key &opt_key) const { return this->option(opt_key) != nullptr; } - - const ConfigOption* option(const t_config_option_key &opt_key) const - { return const_cast(this)->option(opt_key, false); } - ConfigOption* option(const t_config_option_key &opt_key, bool create = false) { return this->optptr(opt_key, create); } @@ -1537,10 +1577,6 @@ public: return (opt == nullptr || opt->type() != TYPE::static_type()) ? nullptr : static_cast(opt); } - template - const TYPE* option(const t_config_option_key &opt_key) const - { return const_cast(this)->option(opt_key, false); } - ConfigOption* option_throw(const t_config_option_key &opt_key, bool create = false) { ConfigOption *opt = this->optptr(opt_key, create); @@ -1549,9 +1585,6 @@ public: return opt; } - const ConfigOption* option_throw(const t_config_option_key &opt_key) const - { return const_cast(this)->option_throw(opt_key, false); } - template TYPE* option_throw(const t_config_option_key &opt_key, bool create = false) { @@ -1561,10 +1594,6 @@ public: return static_cast(opt); } - template - const TYPE* option_throw(const t_config_option_key &opt_key) const - { return const_cast(this)->option_throw(opt_key, false); } - // Apply all keys of other ConfigBase defined by this->def() to this ConfigBase. // An UnknownOptionException is thrown in case some option keys of other are not defined by this->def(), // or this ConfigBase is of a StaticConfig type and it does not support some of the keys, and ignore_nonexistent is not set. @@ -1735,6 +1764,8 @@ public: { return dynamic_cast(this->option(opt_key, create)); } template const T* opt(const t_config_option_key &opt_key) const { return dynamic_cast(this->option(opt_key)); } + // Overrides ConfigResolver::optptr(). + const ConfigOption* optptr(const t_config_option_key &opt_key) const override; // Overrides ConfigBase::optptr(). Find ando/or create a ConfigOption instance for a given name. ConfigOption* optptr(const t_config_option_key &opt_key, bool create = false) override; // Overrides ConfigBase::keys(). Collect names of all configuration values maintained by this configuration store. diff --git a/src/libslic3r/Flow.cpp b/src/libslic3r/Flow.cpp index 2c5c64fe73..9ac91c51d4 100644 --- a/src/libslic3r/Flow.cpp +++ b/src/libslic3r/Flow.cpp @@ -1,12 +1,17 @@ #include "Flow.hpp" +#include "I18N.hpp" #include "Print.hpp" #include #include + +// Mark string for localization and translate. +#define L(s) Slic3r::I18N::translate(s) + namespace Slic3r { // This static method returns a sane extrusion width default. -static inline float auto_extrusion_width(FlowRole role, float nozzle_diameter, float height) +float Flow::auto_extrusion_width(FlowRole role, float nozzle_diameter) { switch (role) { case frSupportMaterial: @@ -22,6 +27,92 @@ static inline float auto_extrusion_width(FlowRole role, float nozzle_diameter, f } } +// Used by the Flow::extrusion_width() funtion to provide hints to the user on default extrusion width values, +// and to provide reasonable values to the PlaceholderParser. +static inline FlowRole opt_key_to_flow_role(const std::string &opt_key) +{ + if (opt_key == "perimeter_extrusion_width" || + // or all the defaults: + opt_key == "extrusion_width" || opt_key == "first_layer_extrusion_width") + return frPerimeter; + else if (opt_key == "external_perimeter_extrusion_width") + return frExternalPerimeter; + else if (opt_key == "infill_extrusion_width") + return frInfill; + else if (opt_key == "solid_infill_extrusion_width") + return frSolidInfill; + else if (opt_key == "top_infill_extrusion_width") + return frTopSolidInfill; + else if (opt_key == "support_material_extrusion_width") + return frSupportMaterial; + else + throw std::runtime_error("opt_key_to_flow_role: invalid argument"); +}; + +static inline void throw_on_missing_variable(const std::string &opt_key, const char *dependent_opt_key) +{ + throw std::runtime_error((boost::format(L("Cannot calculate extrusion width for %1%: Variable \"%2%\" not accessible.")) % opt_key % dependent_opt_key).str()); +} + +// Used to provide hints to the user on default extrusion width values, and to provide reasonable values to the PlaceholderParser. +double Flow::extrusion_width(const std::string& opt_key, const ConfigOptionFloatOrPercent* opt, const ConfigOptionResolver& config, const unsigned int first_printing_extruder) +{ + assert(opt != nullptr); + + bool first_layer = boost::starts_with(opt_key, "first_layer_"); + +#if 0 +// This is the logic used for skit / brim, but not for the rest of the 1st layer. + if (opt->value == 0. && first_layer) { + // The "first_layer_extrusion_width" was set to zero, try a substitute. + opt = config.option("perimeter_extrusion_width"); + if (opt == nullptr) + throw_on_missing_variable(opt_key, "perimeter_extrusion_width"); + } +#endif + + if (opt->value == 0.) { + // The role specific extrusion width value was set to zero, try the role non-specific extrusion width. + opt = config.option("extrusion_width"); + if (opt == nullptr) + throw_on_missing_variable(opt_key, "extrusion_width"); + // Use the "layer_height" instead of "first_layer_height". + first_layer = false; + } + + if (opt->percent) { + auto opt_key_layer_height = first_layer ? "first_layer_height" : "layer_height"; + auto opt_layer_height = config.option(opt_key_layer_height); + if (opt_layer_height == nullptr) + throw_on_missing_variable(opt_key, opt_key_layer_height); + double layer_height = opt_layer_height->getFloat(); + if (first_layer && static_cast(opt_layer_height)->percent) { + // first_layer_height depends on layer_height. + opt_layer_height = config.option("layer_height"); + if (opt_layer_height == nullptr) + throw_on_missing_variable(opt_key, "layer_height"); + layer_height *= 0.01 * opt_layer_height->getFloat(); + } + return opt->get_abs_value(layer_height); + } + + if (opt->value == 0.) { + // If user left option to 0, calculate a sane default width. + auto opt_nozzle_diameters = config.option("nozzle_diameter"); + if (opt_nozzle_diameters == nullptr) + throw_on_missing_variable(opt_key, "nozzle_diameter"); + return auto_extrusion_width(opt_key_to_flow_role(opt_key), float(opt_nozzle_diameters->get_at(first_printing_extruder))); + } + + return opt->value; +} + +// Used to provide hints to the user on default extrusion width values, and to provide reasonable values to the PlaceholderParser. +double Flow::extrusion_width(const std::string& opt_key, const ConfigOptionResolver &config, const unsigned int first_printing_extruder) +{ + return extrusion_width(opt_key, config.option(opt_key), config, first_printing_extruder); +} + // This constructor builds a Flow object from an extrusion width config setting // and other context properties. Flow Flow::new_from_config_width(FlowRole role, const ConfigOptionFloatOrPercent &width, float nozzle_diameter, float height, float bridge_flow_ratio) @@ -39,7 +130,7 @@ Flow Flow::new_from_config_width(FlowRole role, const ConfigOptionFloatOrPercent sqrt(bridge_flow_ratio) * nozzle_diameter; } else if (! width.percent && width.value == 0.) { // If user left option to 0, calculate a sane default width. - w = auto_extrusion_width(role, nozzle_diameter, height); + w = auto_extrusion_width(role, nozzle_diameter); } else { // If user set a manual value, use it. w = float(width.get_abs_value(height)); diff --git a/src/libslic3r/Flow.hpp b/src/libslic3r/Flow.hpp index 51cc4da9d4..aad189775f 100644 --- a/src/libslic3r/Flow.hpp +++ b/src/libslic3r/Flow.hpp @@ -64,6 +64,16 @@ public: // This method is used exclusively to calculate new flow of 100% infill, where the extrusion width was allowed to scale // to fit a region with integer number of lines. static Flow new_from_spacing(float spacing, float nozzle_diameter, float height, bool bridge); + + // Sane extrusion width defautl based on nozzle diameter. + // The defaults were derived from manual Prusa MK3 profiles. + static float auto_extrusion_width(FlowRole role, float nozzle_diameter); + + // Extrusion width from full config, taking into account the defaults (when set to zero) and ratios (percentages). + // Precise value depends on layer index (1st layer vs. other layers vs. variable layer height), + // on active extruder etc. Therefore the value calculated by this function shall be used as a hint only. + static double extrusion_width(const std::string &opt_key, const ConfigOptionFloatOrPercent *opt, const ConfigOptionResolver &config, const unsigned int first_printing_extruder = 0); + static double extrusion_width(const std::string &opt_key, const ConfigOptionResolver &config, const unsigned int first_printing_extruder = 0); }; extern Flow support_material_flow(const PrintObject *object, float layer_height = 0.f); diff --git a/src/libslic3r/PlaceholderParser.cpp b/src/libslic3r/PlaceholderParser.cpp index db3134ded5..527d82b4cb 100644 --- a/src/libslic3r/PlaceholderParser.cpp +++ b/src/libslic3r/PlaceholderParser.cpp @@ -1,4 +1,5 @@ #include "PlaceholderParser.hpp" +#include "Flow.hpp" #include #include #include @@ -99,11 +100,7 @@ static inline bool opts_equal(const DynamicConfig &config_old, const DynamicConf const ConfigOption *opt_old = config_old.option(opt_key); const ConfigOption *opt_new = config_new.option(opt_key); assert(opt_new != nullptr); - if (opt_old == nullptr) - return false; - return (opt_new->type() == coFloatOrPercent) ? - dynamic_cast(opt_old)->value == config_new.get_abs_value(opt_key) : - *opt_new == *opt_old; + return opt_old != nullptr && *opt_new == *opt_old; } std::vector PlaceholderParser::config_diff(const DynamicPrintConfig &rhs) @@ -126,14 +123,7 @@ bool PlaceholderParser::apply_config(const DynamicPrintConfig &rhs) bool modified = false; for (const t_config_option_key &opt_key : rhs.keys()) { if (! opts_equal(m_config, rhs, opt_key)) { - // Store a copy of the config option. - // Convert FloatOrPercent values to floats first. - //FIXME there are some ratio_over chains, which end with empty ratio_with. - // For example, XXX_extrusion_width parameters are not handled by get_abs_value correctly. - const ConfigOption *opt_rhs = rhs.option(opt_key); - this->set(opt_key, (opt_rhs->type() == coFloatOrPercent) ? - new ConfigOptionFloat(rhs.get_abs_value(opt_key)) : - opt_rhs->clone()); + this->set(opt_key, rhs.option(opt_key)->clone()); modified = true; } } @@ -142,16 +132,8 @@ bool PlaceholderParser::apply_config(const DynamicPrintConfig &rhs) void PlaceholderParser::apply_only(const DynamicPrintConfig &rhs, const std::vector &keys) { - for (const t_config_option_key &opt_key : keys) { - // Store a copy of the config option. - // Convert FloatOrPercent values to floats first. - //FIXME there are some ratio_over chains, which end with empty ratio_with. - // For example, XXX_extrusion_width parameters are not handled by get_abs_value correctly. - const ConfigOption *opt_rhs = rhs.option(opt_key); - this->set(opt_key, (opt_rhs->type() == coFloatOrPercent) ? - new ConfigOptionFloat(rhs.get_abs_value(opt_key)) : - opt_rhs->clone()); - } + for (const t_config_option_key &opt_key : keys) + this->set(opt_key, rhs.option(opt_key)->clone()); } void PlaceholderParser::apply_config(DynamicPrintConfig &&rhs) @@ -635,7 +617,7 @@ namespace client return os; } - struct MyContext { + struct MyContext : public ConfigOptionResolver { const DynamicConfig *external_config = nullptr; const DynamicConfig *config = nullptr; const DynamicConfig *config_override = nullptr; @@ -650,7 +632,7 @@ namespace client static void evaluate_full_macro(const MyContext *ctx, bool &result) { result = ! ctx->just_boolean_expression; } - const ConfigOption* resolve_symbol(const std::string &opt_key) const + const ConfigOption* optptr(const t_config_option_key &opt_key) const override { const ConfigOption *opt = nullptr; if (config_override != nullptr) @@ -662,6 +644,8 @@ namespace client return opt; } + const ConfigOption* resolve_symbol(const std::string &opt_key) const { return this->optptr(opt_key); } + template static void legacy_variable_expansion( const MyContext *ctx, @@ -758,7 +742,43 @@ namespace client case coPoint: output.set_s(opt.opt->serialize()); break; case coBool: output.set_b(opt.opt->getBool()); break; case coFloatOrPercent: - ctx->throw_exception("FloatOrPercent variables are not supported", opt.it_range); + { + std::string opt_key(opt.it_range.begin(), opt.it_range.end()); + if (boost::ends_with(opt_key, "extrusion_width")) { + // Extrusion width supports defaults and a complex graph of dependencies. + output.set_d(Flow::extrusion_width(opt_key, *ctx, static_cast(ctx->current_extruder_id))); + } else if (! static_cast(opt.opt)->percent) { + // Not a percent, just return the value. + output.set_d(opt.opt->getFloat()); + } else { + // Resolve dependencies using the "ratio_over" link to a parent value. + const ConfigOptionDef *opt_def = print_config_def.get(opt_key); + assert(opt_def != nullptr); + double v = opt.opt->getFloat() * 0.01; // percent to ratio + for (;;) { + const ConfigOption *opt_parent = opt_def->ratio_over.empty() ? nullptr : ctx->resolve_symbol(opt_def->ratio_over); + if (opt_parent == nullptr) + ctx->throw_exception("FloatOrPercent variable failed to resolve the \"ratio_over\" dependencies", opt.it_range); + if (boost::ends_with(opt_def->ratio_over, "extrusion_width")) { + // Extrusion width supports defaults and a complex graph of dependencies. + assert(opt_parent->type() == coFloatOrPercent); + v *= Flow::extrusion_width(opt_def->ratio_over, static_cast(opt_parent), *ctx, static_cast(ctx->current_extruder_id)); + break; + } + if (opt_parent->type() == coFloat || opt_parent->type() == coFloatOrPercent) { + v *= opt_parent->getFloat(); + if (opt_parent->type() == coFloat || ! static_cast(opt_parent)->percent) + break; + v *= 0.01; // percent to ratio + } + // Continue one level up in the "ratio_over" hierarchy. + opt_def = print_config_def.get(opt_def->ratio_over); + assert(opt_def != nullptr); + } + output.set_d(v); + } + break; + } default: ctx->throw_exception("Unknown scalar variable type", opt.it_range); } diff --git a/src/libslic3r/Print.cpp b/src/libslic3r/Print.cpp index 3131fd3d10..2e6d5f8af5 100644 --- a/src/libslic3r/Print.cpp +++ b/src/libslic3r/Print.cpp @@ -24,8 +24,7 @@ #include #include -//! macro used to mark string used at localization, -//! return same string +// Mark string for localization and translate. #define L(s) Slic3r::I18N::translate(s) namespace Slic3r { @@ -527,7 +526,6 @@ void Print::config_diffs( const DynamicPrintConfig &new_full_config, t_config_option_keys &print_diff, t_config_option_keys &object_diff, t_config_option_keys ®ion_diff, t_config_option_keys &full_config_diff, - DynamicPrintConfig &placeholder_parser_overrides, DynamicPrintConfig &filament_overrides) const { // Collect changes to print config, account for overrides of extruder retract values by filament presets. @@ -563,19 +561,11 @@ void Print::config_diffs( object_diff = m_default_object_config.diff(new_full_config); region_diff = m_default_region_config.diff(new_full_config); // Prepare for storing of the full print config into new_full_config to be exported into the G-code and to be used by the PlaceholderParser. - // As the PlaceholderParser does not interpret the FloatOrPercent values itself, these values are stored into the PlaceholderParser converted to floats. for (const t_config_option_key &opt_key : new_full_config.keys()) { const ConfigOption *opt_old = m_full_print_config.option(opt_key); const ConfigOption *opt_new = new_full_config.option(opt_key); if (opt_old == nullptr || *opt_new != *opt_old) full_config_diff.emplace_back(opt_key); - if (opt_new->type() == coFloatOrPercent) { - // The m_placeholder_parser is never modified by the background processing, GCode.cpp/hpp makes a copy. - const ConfigOption *opt_old_pp = this->placeholder_parser().config().option(opt_key); - double new_value = new_full_config.get_abs_value(opt_key); - if (opt_old_pp == nullptr || static_cast(opt_old_pp)->value != new_value) - placeholder_parser_overrides.set_key_value(opt_key, new ConfigOptionFloat(new_value)); - } } } @@ -593,8 +583,8 @@ Print::ApplyStatus Print::apply(const Model &model, DynamicPrintConfig new_full_ // Find modified keys of the various configs. Resolve overrides extruder retract values by filament profiles. t_config_option_keys print_diff, object_diff, region_diff, full_config_diff; - DynamicPrintConfig placeholder_parser_overrides, filament_overrides; - this->config_diffs(new_full_config, print_diff, object_diff, region_diff, full_config_diff, placeholder_parser_overrides, filament_overrides); + DynamicPrintConfig filament_overrides; + this->config_diffs(new_full_config, print_diff, object_diff, region_diff, full_config_diff, filament_overrides); // Do not use the ApplyStatus as we will use the max function when updating apply_status. unsigned int apply_status = APPLY_STATUS_UNCHANGED; @@ -614,9 +604,8 @@ Print::ApplyStatus Print::apply(const Model &model, DynamicPrintConfig new_full_ // which should be stopped if print_diff is not empty. size_t num_extruders = m_config.nozzle_diameter.size(); bool num_extruders_changed = false; - if (! full_config_diff.empty() || ! placeholder_parser_overrides.empty()) { + if (! full_config_diff.empty()) { update_apply_status(this->invalidate_step(psGCodeExport)); - m_placeholder_parser.apply_config(std::move(placeholder_parser_overrides)); // Set the profile aliases for the PrintBase::output_filename() m_placeholder_parser.set("print_preset", new_full_config.option("print_settings_id")->clone()); m_placeholder_parser.set("filament_preset", new_full_config.option("filament_settings_id")->clone()); diff --git a/src/libslic3r/Print.hpp b/src/libslic3r/Print.hpp index 75807cddad..1386b798e7 100644 --- a/src/libslic3r/Print.hpp +++ b/src/libslic3r/Print.hpp @@ -435,7 +435,6 @@ private: const DynamicPrintConfig &new_full_config, t_config_option_keys &print_diff, t_config_option_keys &object_diff, t_config_option_keys ®ion_diff, t_config_option_keys &full_config_diff, - DynamicPrintConfig &placeholder_parser_overrides, DynamicPrintConfig &filament_overrides) const; bool invalidate_state_by_config_options(const std::vector &opt_keys); diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index 47a72b829c..ebb05772fd 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -718,8 +718,9 @@ void PrintConfigDef::init_fff_params() def->gui_type = "f_enum_open"; def->gui_flags = "show_value"; def->enum_values.push_back("PLA"); - def->enum_values.push_back("ABS"); def->enum_values.push_back("PET"); + def->enum_values.push_back("ABS"); + def->enum_values.push_back("ASA"); def->enum_values.push_back("FLEX"); def->enum_values.push_back("HIPS"); def->enum_values.push_back("EDGE"); diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index 8d14969c9b..5130d3b05b 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -46,12 +46,6 @@ enum SeamPosition { spRandom, spNearest, spAligned, spRear }; -/* -enum FilamentType { - ftPLA, ftABS, ftPET, ftHIPS, ftFLEX, ftSCAFF, ftEDGE, ftNGEN, ftPVA -}; -*/ - enum SLAMaterial { slamTough, slamFlex, @@ -149,24 +143,6 @@ template<> inline const t_config_enum_values& ConfigOptionEnum::ge return keys_map; } -/* -template<> inline const t_config_enum_values& ConfigOptionEnum::get_enum_values() { - static t_config_enum_values keys_map; - if (keys_map.empty()) { - keys_map["PLA"] = ftPLA; - keys_map["ABS"] = ftABS; - keys_map["PET"] = ftPET; - keys_map["HIPS"] = ftHIPS; - keys_map["FLEX"] = ftFLEX; - keys_map["SCAFF"] = ftSCAFF; - keys_map["EDGE"] = ftEDGE; - keys_map["NGEN"] = ftNGEN; - keys_map["PVA"] = ftPVA; - } - return keys_map; -} -*/ - template<> inline const t_config_enum_values& ConfigOptionEnum::get_enum_values() { static const t_config_enum_values keys_map = { { "landscape", sladoLandscape}, @@ -354,6 +330,9 @@ protected: #define STATIC_PRINT_CONFIG_CACHE_BASE(CLASS_NAME) \ public: \ /* Overrides ConfigBase::optptr(). Find ando/or create a ConfigOption instance for a given name. */ \ + const ConfigOption* optptr(const t_config_option_key &opt_key) const override \ + { return s_cache_##CLASS_NAME.optptr(opt_key, this); } \ + /* Overrides ConfigBase::optptr(). Find ando/or create a ConfigOption instance for a given name. */ \ ConfigOption* optptr(const t_config_option_key &opt_key, bool create = false) override \ { return s_cache_##CLASS_NAME.optptr(opt_key, this); } \ /* Overrides ConfigBase::keys(). Collect names of all configuration values maintained by this configuration store. */ \ diff --git a/tests/libslic3r/test_placeholder_parser.cpp b/tests/libslic3r/test_placeholder_parser.cpp index 4d8217c167..e632dc7057 100644 --- a/tests/libslic3r/test_placeholder_parser.cpp +++ b/tests/libslic3r/test_placeholder_parser.cpp @@ -14,7 +14,15 @@ SCENARIO("Placeholder parser scripting", "[PlaceholderParser]") { { "nozzle_diameter", "0.6;0.6;0.6;0.6" }, { "temperature", "357;359;363;378" } }); - parser.apply_config(config); + // To test the "first_layer_extrusion_width" over "first_layer_heigth" over "layer_height" chain. + config.option("first_layer_height")->value = 150.; + config.option("first_layer_height")->percent = true; + // To let the PlaceholderParser throw when referencing first_layer_speed if it is set to percent, as the PlaceholderParser does not know + // a percent to what. + config.option("first_layer_speed")->value = 50.; + config.option("first_layer_speed")->percent = true; + + parser.apply_config(config); parser.set("foo", 0); parser.set("bar", 2); parser.set("num_extruders", 4); @@ -41,6 +49,19 @@ SCENARIO("Placeholder parser scripting", "[PlaceholderParser]") { SECTION("math: int(13.4)") { REQUIRE(parser.process("{int(13.4)}") == "13"); } SECTION("math: int(-13.4)") { REQUIRE(parser.process("{int(-13.4)}") == "-13"); } + // Test the "coFloatOrPercent" and "xxx_extrusion_width" substitutions. + // first_layer_extrusion_width ratio_over first_layer_heigth ratio_over layer_height + SECTION("perimeter_extrusion_width") { REQUIRE(std::stod(parser.process("{perimeter_extrusion_width}")) == Approx(0.67500001192092896)); } + SECTION("first_layer_extrusion_width") { REQUIRE(std::stod(parser.process("{first_layer_extrusion_width}")) == Approx(0.9)); } + SECTION("support_material_xy_spacing") { REQUIRE(std::stod(parser.process("{support_material_xy_spacing}")) == Approx(0.3375)); } + // external_perimeter_speed over perimeter_speed + SECTION("external_perimeter_speed") { REQUIRE(std::stod(parser.process("{external_perimeter_speed}")) == Approx(30.)); } + // infill_overlap over perimeter_extrusion_width + SECTION("infill_overlap") { REQUIRE(std::stod(parser.process("{infill_overlap}")) == Approx(0.16875)); } + // If first_layer_speed is set to percent, then it is applied over respective extrusion types by overriding their respective speeds. + // The PlaceholderParser has no way to know which extrusion type the caller has in mind, therefore it throws. + SECTION("first_layer_speed") { REQUIRE_THROWS(parser.process("{first_layer_speed}")); } + // Test the boolean expression parser. auto boolean_expression = [&parser](const std::string& templ) { return parser.evaluate_boolean_expression(templ, parser.config()); }; From 450e21d4571decdb26637e7dd9ef45f368f658c7 Mon Sep 17 00:00:00 2001 From: bubnikv Date: Tue, 4 Feb 2020 16:10:39 +0100 Subject: [PATCH 245/336] Replaced unsafe use of dx_url.substr(0, 54) with boost::starts_with --- src/slic3r/Utils/PresetUpdater.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/slic3r/Utils/PresetUpdater.cpp b/src/slic3r/Utils/PresetUpdater.cpp index ecdc12b507..3172a06820 100644 --- a/src/slic3r/Utils/PresetUpdater.cpp +++ b/src/slic3r/Utils/PresetUpdater.cpp @@ -301,9 +301,9 @@ void PresetUpdater::priv::sync_config(const VendorMap vendors) const std::string idx_path = (cache_path / (vendor.id + ".idx")).string(); const std::string idx_path_temp = idx_path + "-update"; //check if idx_url is leading to our site - if(idx_url.substr(0, 54) != "http://files.prusa3d.com/wp-content/uploads/repository") + if (! boost::starts_with(idx_url, "http://files.prusa3d.com/wp-content/uploads/repository/")) { - BOOST_LOG_TRIVIAL(warning) << "unsafe url path for vendor: " << vendor.name; + BOOST_LOG_TRIVIAL(warning) << "unsafe url path for vendor \"" << vendor.name << "\" rejected: " << idx_url; continue; } if (!get_file(idx_url, idx_path_temp)) { continue; } From de4c2fc2e0f6d501f660217586f9adf0b7fd4587 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Tue, 4 Feb 2020 17:44:06 +0100 Subject: [PATCH 246/336] DoubleSlider: SingleExtruder mode: Implemented editing of color from colored band, using RightMouseClick on it. And added corresponding tooltip --- src/slic3r/GUI/DoubleSlider.cpp | 70 +++++++++++++++++++++++++++------ src/slic3r/GUI/DoubleSlider.hpp | 6 ++- 2 files changed, 62 insertions(+), 14 deletions(-) diff --git a/src/slic3r/GUI/DoubleSlider.cpp b/src/slic3r/GUI/DoubleSlider.cpp index 59c7de8ea4..75f9b20680 100644 --- a/src/slic3r/GUI/DoubleSlider.cpp +++ b/src/slic3r/GUI/DoubleSlider.cpp @@ -603,21 +603,24 @@ std::string Control::get_color_for_color_change_tick(std::set::const_i return ""; } -void Control::draw_colored_band(wxDC& dc) +wxRect Control::get_colored_band_rect() { - if (!m_is_enabled_tick_manipulation) - return; - int height, width; get_size(&width, &height); const wxCoord mid = is_horizontal() ? 0.5 * height : 0.5 * width; - wxRect main_band = is_horizontal() ? - wxRect(SLIDER_MARGIN, lround(mid - 0.375 * m_thumb_size.y), - width - 2 * SLIDER_MARGIN + 1, lround(0.75 * m_thumb_size.y)) : - wxRect(lround(mid - 0.375 * m_thumb_size.x), SLIDER_MARGIN, - lround(0.75 * m_thumb_size.x), height - 2 * SLIDER_MARGIN + 1); + return is_horizontal() ? + wxRect(SLIDER_MARGIN, lround(mid - 0.375 * m_thumb_size.y), + width - 2 * SLIDER_MARGIN + 1, lround(0.75 * m_thumb_size.y)) : + wxRect(lround(mid - 0.375 * m_thumb_size.x), SLIDER_MARGIN, + lround(0.75 * m_thumb_size.x), height - 2 * SLIDER_MARGIN + 1); +} + +void Control::draw_colored_band(wxDC& dc) +{ + if (!m_is_enabled_tick_manipulation) + return; auto draw_band = [](wxDC& dc, const wxColour& clr, const wxRect& band_rc) { @@ -626,6 +629,8 @@ void Control::draw_colored_band(wxDC& dc) dc.DrawRectangle(band_rc); }; + wxRect main_band = get_colored_band_rect(); + // don't color a band for MultiExtruder mode if (m_ticks.empty() || m_mode == t_mode::MultiExtruder) { @@ -887,7 +892,7 @@ wxString Control::get_tooltip(FocusItem focused_item, int tick/*=-1*/) return _(L("Set extruder sequence for whole print")); if (focused_item == fiColorBand) return m_mode != t_mode::SingleExtruder ? "" : - _(L("For edit current color use Right(Double) mouse click on colored band")); + _(L("For edit current color use right mouse button click on colored band")); wxString tooltip; const auto tick_code_it = m_ticks.ticks.find(TickCode{tick}); @@ -961,6 +966,23 @@ wxString Control::get_tooltip(FocusItem focused_item, int tick/*=-1*/) } +int Control::get_edited_tick_for_position(const wxPoint pos, const std::string& gcode /*= ColorChangeCode*/) +{ + if (m_ticks.empty()) + return -1; + + int tick = get_value_from_position(pos); + auto it = std::lower_bound(m_ticks.ticks.begin(), m_ticks.ticks.end(), TickCode{ tick }); + + while (it != m_ticks.ticks.begin()) { + --it; + if (it->gcode == gcode) + return it->tick; + } + + return -1; +} + void Control::OnMotion(wxMouseEvent& event) { bool action = false; @@ -985,6 +1007,9 @@ void Control::OnMotion(wxMouseEvent& event) focused_item = fiRevertIcon; else if (is_point_in_rect(pos, m_rect_cog_icon)) focused_item = fiCogIcon; + else if (m_mode == t_mode::SingleExtruder && is_point_in_rect(pos, get_colored_band_rect()) && + get_edited_tick_for_position(pos) >= 0 ) + focused_item = fiColorBand; else { focused_item = fiTick; tick = get_tick_near_point(pos); @@ -1242,7 +1267,7 @@ void Control::OnRightDown(wxMouseEvent& event) const wxClientDC dc(this); wxPoint pos = event.GetLogicalPosition(dc); - if (is_point_in_rect(pos, m_rect_tick_action) && m_is_enabled_tick_manipulation) + if (m_is_enabled_tick_manipulation && is_point_in_rect(pos, m_rect_tick_action)) { const int tick = m_selection == ssLower ? m_lower_value : m_higher_value; if (m_ticks.ticks.find(TickCode{ tick }) == m_ticks.ticks.end()) // if on this Z doesn't exist tick @@ -1254,6 +1279,13 @@ void Control::OnRightDown(wxMouseEvent& event) return; } + if (m_is_enabled_tick_manipulation && m_mode == t_mode::SingleExtruder && + is_point_in_rect(pos, get_colored_band_rect())) + { + m_force_color_edit = true; + return; + } + detect_selected_slider(event.GetLogicalPosition(dc)); if (!m_selection) return; @@ -1424,6 +1456,17 @@ void Control::OnRightUp(wxMouseEvent& event) m_show_edit_menu = false; } + else if (m_force_color_edit) + { + const wxClientDC dc(this); + wxPoint pos = event.GetLogicalPosition(dc); + + int edited_tick = get_edited_tick_for_position(pos); + if (edited_tick >= 0) + edit_tick(edited_tick); + + m_force_color_edit = false; + } Refresh(); Update(); @@ -1587,9 +1630,10 @@ void Control::delete_current_tick() post_ticks_changed_event(code); } -void Control::edit_tick() +void Control::edit_tick(int tick/* = -1*/) { - const int tick = m_selection == ssLower ? m_lower_value : m_higher_value; + if (tick < 0) + tick = m_selection == ssLower ? m_lower_value : m_higher_value; const std::set::iterator it = m_ticks.ticks.find(TickCode{ tick }); if (it == m_ticks.ticks.end() || diff --git a/src/slic3r/GUI/DoubleSlider.hpp b/src/slic3r/GUI/DoubleSlider.hpp index 00f64a6f6e..86c0251313 100644 --- a/src/slic3r/GUI/DoubleSlider.hpp +++ b/src/slic3r/GUI/DoubleSlider.hpp @@ -225,7 +225,7 @@ public: void add_current_tick(bool call_from_keyboard = false); // delete current tick, when press "-" void delete_current_tick(); - void edit_tick(); + void edit_tick(int tick = -1); void edit_extruder_sequence(); ExtrudersSequence m_extruders_sequence; @@ -263,14 +263,17 @@ private: wxString get_label(const SelectedSlider& selection) const; void get_lower_and_higher_position(int& lower_pos, int& higher_pos); int get_value_from_position(const wxCoord x, const wxCoord y); + int get_value_from_position(const wxPoint pos) { return get_value_from_position(pos.x, pos.y); } wxCoord get_position_from_value(const int value); wxSize get_size(); void get_size(int *w, int *h); double get_double_value(const SelectedSlider& selection); wxString get_tooltip(FocusItem focused_item, int tick = -1); + int get_edited_tick_for_position(wxPoint pos, const std::string& gcode = ColorChangeCode); std::string get_color_for_tool_change_tick(std::set::const_iterator it) const; std::string get_color_for_color_change_tick(std::set::const_iterator it) const; + wxRect get_colored_band_rect(); // Get active extruders for tick. // Means one current extruder for not existing tick OR @@ -316,6 +319,7 @@ private: bool m_force_mode_apply = true; bool m_force_add_tick = false; bool m_force_delete_tick = false; + bool m_force_color_edit = false; t_mode m_mode = t_mode::SingleExtruder; int m_only_extruder = -1; From bca3e864551368c8c09b1361dc8aaa9cdb03e09b Mon Sep 17 00:00:00 2001 From: bubnikv Date: Tue, 4 Feb 2020 17:46:23 +0100 Subject: [PATCH 247/336] Fixed invalidation of FDM back end if a custom per layer extruder change is added or removed. --- src/libslic3r/Print.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libslic3r/Print.cpp b/src/libslic3r/Print.cpp index 2e6d5f8af5..3f8fd9b40c 100644 --- a/src/libslic3r/Print.cpp +++ b/src/libslic3r/Print.cpp @@ -494,7 +494,7 @@ static bool custom_per_printz_gcodes_tool_changes_differ(const std::vectorgcode != ToolChangeCode) { // Skip any CustomGCode items, which are not tool changes. ++ it_a; From 799a10d0ec08a659c1463d04d3adb46502d8cbac Mon Sep 17 00:00:00 2001 From: YuSanka Date: Tue, 4 Feb 2020 21:59:55 +0100 Subject: [PATCH 248/336] Added missed tooltip text + fixed conflict's controlling for ToolChange tick --- src/slic3r/GUI/DoubleSlider.cpp | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/slic3r/GUI/DoubleSlider.cpp b/src/slic3r/GUI/DoubleSlider.cpp index 75f9b20680..ff5a565453 100644 --- a/src/slic3r/GUI/DoubleSlider.cpp +++ b/src/slic3r/GUI/DoubleSlider.cpp @@ -915,10 +915,14 @@ wxString Control::get_tooltip(FocusItem focused_item, int tick/*=-1*/) // Show list of actions with new tick tooltip += ( m_mode == t_mode::MultiAsSingle ? _(L("For add change extruder use left mouse button click")) : + m_mode == t_mode::SingleExtruder ? + _(L("For add color change use left mouse button click " + "if you want to use colors from default color list, " + "or Shift + left mouse button click if you want to select a color")) : _(L("For add color change use left mouse button click")) ) + " " + _(L("OR pres \"+\" key")) + "\n" + ( is_osx ? - _(L("For add another code use Ctrl + Left mouse button click")) : + _(L("For add another code use Ctrl + left mouse button click")) : _(L("For add another code use right mouse button click")) ); } @@ -1955,9 +1959,11 @@ ConflictType TickCodeInfo::is_conflict_tick(const TickCode& tick, t_mode out_mod if (it == ticks.begin()) return tick.extruder == std::max(only_extruder, 1) ? ctMeaninglessToolChange : ctNone; - --it; - if (it->gcode == ToolChangeCode && tick.extruder == it->extruder) - return ctMeaninglessToolChange; + while (it != ticks.begin()) { + --it; + if (it->gcode == ToolChangeCode) + return tick.extruder == it->extruder ? ctMeaninglessToolChange : ctNone; + } } return ctNone; From a66dcf58f7c11fb358fb7f6d140c586a5202b981 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Wed, 5 Feb 2020 09:57:22 +0100 Subject: [PATCH 249/336] Fix for failing build without PCH --- src/libslic3r/Flow.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/libslic3r/Flow.cpp b/src/libslic3r/Flow.cpp index 9ac91c51d4..b367be0226 100644 --- a/src/libslic3r/Flow.cpp +++ b/src/libslic3r/Flow.cpp @@ -4,6 +4,7 @@ #include #include +#include // Mark string for localization and translate. #define L(s) Slic3r::I18N::translate(s) From 930432e6a3ec24dd740ad74c4b99e8f019d2f235 Mon Sep 17 00:00:00 2001 From: David Kocik Date: Wed, 5 Feb 2020 11:38:45 +0100 Subject: [PATCH 250/336] updating preset bundle bug fix: if forced update - does not check snapshots --- src/slic3r/Utils/PresetUpdater.cpp | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/slic3r/Utils/PresetUpdater.cpp b/src/slic3r/Utils/PresetUpdater.cpp index 3172a06820..4e33e9d6bc 100644 --- a/src/slic3r/Utils/PresetUpdater.cpp +++ b/src/slic3r/Utils/PresetUpdater.cpp @@ -538,13 +538,16 @@ Updates PresetUpdater::priv::get_config_updates(const Semver &old_slic3r_version } // Check if the update is already present in a snapshot - const auto recommended_snap = SnapshotDB::singleton().snapshot_with_vendor_preset(vp.name, recommended->config_version); - if (recommended_snap != SnapshotDB::singleton().end()) { - BOOST_LOG_TRIVIAL(info) << boost::format("Bundle update %1% %2% already found in snapshot %3%, skipping...") - % vp.name - % recommended->config_version.to_string() - % recommended_snap->id; - continue; + if(!current_not_supported) + { + const auto recommended_snap = SnapshotDB::singleton().snapshot_with_vendor_preset(vp.name, recommended->config_version); + if (recommended_snap != SnapshotDB::singleton().end()) { + BOOST_LOG_TRIVIAL(info) << boost::format("Bundle update %1% %2% already found in snapshot %3%, skipping...") + % vp.name + % recommended->config_version.to_string() + % recommended_snap->id; + continue; + } } updates.updates.emplace_back(std::move(new_update)); From fce9f7747221641be57b1a676a8d6fe72dabf816 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Wed, 5 Feb 2020 13:14:50 +0100 Subject: [PATCH 251/336] Translations with arrow keys with modifiers: Shift -> slower translations Ctrl -> translations in camera space --- src/slic3r/GUI/GLCanvas3D.cpp | 155 ++++++++++++++++++++++++++++------ 1 file changed, 127 insertions(+), 28 deletions(-) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 16fe7696cc..2a4cf1849d 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -2702,8 +2702,127 @@ void GLCanvas3D::on_char(wxKeyEvent& evt) } } +class TranslationProcessor +{ + using UpAction = std::function; + using DownAction = std::function; + + UpAction m_up_action{ nullptr }; + DownAction m_down_action{ nullptr }; + + bool m_running{ false }; + Vec3d m_direction{ Vec3d::UnitX() }; + +public: + TranslationProcessor(UpAction up_action, DownAction down_action) + : m_up_action(up_action), m_down_action(down_action) + { + } + + void process(wxKeyEvent& evt) + { + const int keyCode = evt.GetKeyCode(); + wxEventType type = evt.GetEventType(); + if (type == wxEVT_KEY_UP) { + switch (keyCode) + { + case WXK_NUMPAD_LEFT: case WXK_LEFT: + case WXK_NUMPAD_RIGHT: case WXK_RIGHT: + case WXK_NUMPAD_UP: case WXK_UP: + case WXK_NUMPAD_DOWN: case WXK_DOWN: + { + m_running = false; + m_up_action(); + break; + } + default: { break; } + } + } + else if (type == wxEVT_KEY_DOWN) { + bool apply = false; + + switch (keyCode) + { + case WXK_SHIFT: + { + if (m_running) + apply = true; + + break; + } + case WXK_NUMPAD_LEFT: + case WXK_LEFT: + { + m_direction = -Vec3d::UnitX(); + apply = true; + break; + } + case WXK_NUMPAD_RIGHT: + case WXK_RIGHT: + { + m_direction = Vec3d::UnitX(); + apply = true; + break; + } + case WXK_NUMPAD_UP: + case WXK_UP: + { + m_direction = Vec3d::UnitY(); + apply = true; + break; + } + case WXK_NUMPAD_DOWN: + case WXK_DOWN: + { + m_direction = -Vec3d::UnitY(); + apply = true; + break; + } + default: { break; } + } + + if (apply) { + m_running = true; + m_down_action(m_direction, evt.ShiftDown(), evt.CmdDown()); + } + } + } +}; + void GLCanvas3D::on_key(wxKeyEvent& evt) { + static TranslationProcessor translationProcessor( + [this]() { + do_move(L("Gizmo-Move")); + m_gizmos.update_data(); + + wxGetApp().obj_manipul()->set_dirty(); + // Let the plater know that the dragging finished, so a delayed refresh + // of the scene with the background processing data should be performed. + post_event(SimpleEvent(EVT_GLCANVAS_MOUSE_DRAGGING_FINISHED)); + // updates camera target constraints + refresh_camera_scene_box(); + m_dirty = true; + }, + [this](const Vec3d& direction, bool slow, bool camera_space) { + m_selection.start_dragging(); + double multiplier = slow ? 1.0 : 10.0; + + Vec3d displacement; + if (camera_space) + { + Eigen::Matrix inv_view_3x3 = m_camera.get_view_matrix().inverse().matrix().block(0, 0, 3, 3); + displacement = multiplier * (inv_view_3x3 * direction); + displacement(2) = 0.0; + } + else + displacement = multiplier * direction; + + m_selection.translate(displacement); + m_dirty = true; + } + ); + const int keyCode = evt.GetKeyCode(); auto imgui = wxGetApp().imgui(); @@ -2722,6 +2841,8 @@ void GLCanvas3D::on_key(wxKeyEvent& evt) } else if (keyCode == WXK_SHIFT) { + translationProcessor.process(evt); + if (m_picking_enabled && m_rectangle_selection.is_dragging()) { _update_selection_from_hover(); @@ -2745,26 +2866,10 @@ void GLCanvas3D::on_key(wxKeyEvent& evt) else if (keyCode == WXK_CONTROL) m_dirty = true; else if (m_gizmos.is_enabled() && !m_selection.is_empty()) { + translationProcessor.process(evt); + switch (keyCode) { - case WXK_NUMPAD_LEFT: case WXK_LEFT: - case WXK_NUMPAD_RIGHT: case WXK_RIGHT: - case WXK_NUMPAD_UP: case WXK_UP: - case WXK_NUMPAD_DOWN: case WXK_DOWN: - { - do_move(L("Gizmo-Move")); - m_gizmos.update_data(); - - wxGetApp().obj_manipul()->set_dirty(); - // Let the plater know that the dragging finished, so a delayed refresh - // of the scene with the background processing data should be performed. - post_event(SimpleEvent(EVT_GLCANVAS_MOUSE_DRAGGING_FINISHED)); - // updates camera target constraints - refresh_camera_scene_box(); - m_dirty = true; - - break; - } case WXK_NUMPAD_PAGEUP: case WXK_PAGEUP: case WXK_NUMPAD_PAGEDOWN: case WXK_PAGEDOWN: { @@ -2789,6 +2894,8 @@ void GLCanvas3D::on_key(wxKeyEvent& evt) m_tab_down = keyCode == WXK_TAB && !evt.HasAnyModifiers(); if (keyCode == WXK_SHIFT) { + translationProcessor.process(evt); + if (m_picking_enabled && (m_gizmos.get_current_type() != GLGizmosManager::SlaSupports)) { m_mouse.ignore_left_up = false; @@ -2807,12 +2914,6 @@ void GLCanvas3D::on_key(wxKeyEvent& evt) m_dirty = true; else if (m_gizmos.is_enabled() && !m_selection.is_empty()) { - auto do_move = [this](const Vec3d& displacement) { - m_selection.start_dragging(); - m_selection.translate(displacement); - m_dirty = true; -// wxGetApp().obj_manipul()->set_dirty(); - }; auto do_rotate = [this](double angle_z_rad) { m_selection.start_dragging(); m_selection.rotate(Vec3d(0.0, 0.0, angle_z_rad), TransformationType(TransformationType::World_Relative_Joint)); @@ -2820,12 +2921,10 @@ void GLCanvas3D::on_key(wxKeyEvent& evt) // wxGetApp().obj_manipul()->set_dirty(); }; + translationProcessor.process(evt); + switch (keyCode) { - case WXK_NUMPAD_LEFT: case WXK_LEFT: { do_move(-Vec3d::UnitX()); break; } - case WXK_NUMPAD_RIGHT: case WXK_RIGHT: { do_move(Vec3d::UnitX()); break; } - case WXK_NUMPAD_UP: case WXK_UP: { do_move(Vec3d::UnitY()); break; } - case WXK_NUMPAD_DOWN: case WXK_DOWN: { do_move(-Vec3d::UnitY()); break; } case WXK_NUMPAD_PAGEUP: case WXK_PAGEUP: { do_rotate(0.25 * M_PI); break; } case WXK_NUMPAD_PAGEDOWN: case WXK_PAGEDOWN: { do_rotate(-0.25 * M_PI); break; } default: { break; } From 5c972ce9ab387dc9b644d5b0c01d6317d80ab1bc Mon Sep 17 00:00:00 2001 From: David Kocik Date: Wed, 5 Feb 2020 13:57:15 +0100 Subject: [PATCH 252/336] config wizard bugfix: changed order of creating pages --- src/slic3r/GUI/ConfigWizard.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/slic3r/GUI/ConfigWizard.cpp b/src/slic3r/GUI/ConfigWizard.cpp index 880d1127bb..9edc3ac398 100644 --- a/src/slic3r/GUI/ConfigWizard.cpp +++ b/src/slic3r/GUI/ConfigWizard.cpp @@ -2001,6 +2001,10 @@ ConfigWizard::ConfigWizard(wxWindow *parent) p->page_msla = new PagePrinters(this, _(L("Prusa MSLA Technology Printers")), "Prusa MSLA", *vendor_prusa, 0, T_SLA); p->add_page(p->page_msla); + // Pages for 3rd party vendors + p->create_3rdparty_pages(); // Needs to be done _before_ creating PageVendors + p->add_page(p->page_vendors = new PageVendors(this)); + p->any_sla_selected = p->check_sla_selected(); p->any_fff_selected = p->check_fff_selected(); @@ -2022,10 +2026,6 @@ ConfigWizard::ConfigWizard(wxWindow *parent) p->add_page(p->page_diams = new PageDiameters(this)); p->add_page(p->page_temps = new PageTemperatures(this)); - // Pages for 3rd party vendors - p->create_3rdparty_pages(); // Needs to be done _before_ creating PageVendors - p->add_page(p->page_vendors = new PageVendors(this)); - p->load_pages(); p->index->go_to(size_t{0}); From b0588abdd2e47d1e47a9715d3c2e3319cf7490db Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Wed, 5 Feb 2020 14:21:06 +0100 Subject: [PATCH 253/336] Invalidate background process when HollowingGizmo modifies settings Also, assertion fail in debug mode for m_selection --- src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp index e3b18792e9..11a78fd607 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp @@ -352,8 +352,9 @@ bool GLGizmoHollow::unproject_on_mesh(const Vec2d& mouse_pos, std::pairhas_drilled_mesh()) { m_c->m_model_object->sla_drain_holes.push_back(sla::DrainHole()); + m_selected.push_back(false); m_parent.post_event(SimpleEvent(EVT_GLCANVAS_FORCE_UPDATE)); - wxGetApp().CallAfter([this] { m_c->m_model_object->sla_drain_holes.pop_back();}); + wxGetApp().CallAfter([this] { m_c->m_model_object->sla_drain_holes.pop_back(); m_selected.pop_back(); }); return false; } @@ -667,6 +668,7 @@ void GLGizmoHollow::on_render_input_window(float x, float y, float bottom_limit) bool first_run = true; // This is a hack to redraw the button when all points are removed, // so it is not delayed until the background process finishes. + RENDER_AGAIN: const float approx_height = m_imgui->scaled(20.0f); y = std::min(y, bottom_limit - approx_height); @@ -692,6 +694,8 @@ RENDER_AGAIN: if (m_imgui->button(m_desc["preview"])) hollow_mesh(); + + bool config_changed = false; ImGui::Separator(); @@ -701,6 +705,7 @@ RENDER_AGAIN: if (m_imgui->checkbox(m_desc["enable"], m_enable_hollowing)) { m_c->m_model_object->config.opt("hollowing_enable", true)->value = m_enable_hollowing; wxGetApp().obj_list()->update_and_show_object_settings_item(); + config_changed = true; } } @@ -776,8 +781,10 @@ RENDER_AGAIN: m_c->m_model_object->config.opt("hollowing_min_thickness", true)->value = offset; m_c->m_model_object->config.opt("hollowing_quality", true)->value = quality; m_c->m_model_object->config.opt("hollowing_closing_distance", true)->value = closing_d; - if (slider_released) + if (slider_released) { wxGetApp().obj_list()->update_and_show_object_settings_item(); + config_changed = true; + } } m_imgui->disabled_end(); @@ -902,6 +909,9 @@ RENDER_AGAIN: if (force_refresh) m_parent.set_as_dirty(); + + if (config_changed) + m_parent.post_event(SimpleEvent(EVT_GLCANVAS_FORCE_UPDATE)); } bool GLGizmoHollow::on_is_activable() const From a04c72b0c9f0e1fc2c14506761a3463b98c34f39 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Wed, 5 Feb 2020 15:27:11 +0100 Subject: [PATCH 254/336] Fixed unneded auto-extra frame render --- src/slic3r/GUI/GLCanvas3D.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 449b7fbb80..3b38403fdf 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -1363,7 +1363,7 @@ void GLCanvas3D::Labels::render(const std::vector& sorted_ // force re-render while the windows gets to its final size (it takes several frames) float content_w = 1 + ImGui::GetWindowContentRegionWidth(); - if (content_w <= label_len) + if (content_w < label_len) m_canvas.request_extra_frame(); imgui.end(); From 495a71ed00a295847edaec879d8cc7006a810636 Mon Sep 17 00:00:00 2001 From: bubnikv Date: Wed, 5 Feb 2020 16:53:26 +0100 Subject: [PATCH 255/336] Implemented top_solid_min_thickness / bottom_solid_min_thickness. The two new config keys define a minimum vertical shell thickness. The top shell thickness is calculated as a maximum of sum over top_solid_layers * layer heights and top_solid_min_thickness, the bottom shell thickness is calculated as a maximum of sum over bottom_solid_layers * layer heights and bottom_solid_min_thickness. The results of the formula above are shown at the Print parameter page below the two new values to hint the user about the interaction of the old versus new config values. top_solid_min_thickness has no meaning if top_solid_layers is zero, bottom_solid_min_thickness has no meaning if bottom_solid_layers is zero. --- src/libslic3r/CustomGCode.hpp | 2 +- src/libslic3r/Layer.hpp | 1 + src/libslic3r/PrintConfig.cpp | 30 +++++++ src/libslic3r/PrintConfig.hpp | 4 + src/libslic3r/PrintObject.cpp | 117 +++++++++++++++++--------- src/libslic3r/Slicing.cpp | 17 ++++ src/libslic3r/Slicing.hpp | 13 ++- src/slic3r/GUI/ConfigManipulation.cpp | 15 ++-- src/slic3r/GUI/Plater.cpp | 2 +- src/slic3r/GUI/Preset.cpp | 3 +- src/slic3r/GUI/PresetHints.cpp | 69 ++++++++++++++- src/slic3r/GUI/PresetHints.hpp | 5 ++ src/slic3r/GUI/Tab.cpp | 14 +++ src/slic3r/GUI/Tab.hpp | 6 +- 14 files changed, 246 insertions(+), 52 deletions(-) diff --git a/src/libslic3r/CustomGCode.hpp b/src/libslic3r/CustomGCode.hpp index 5ab4c76efc..e54599ca64 100644 --- a/src/libslic3r/CustomGCode.hpp +++ b/src/libslic3r/CustomGCode.hpp @@ -42,7 +42,7 @@ enum Mode SingleExtruder, // Single extruder printer preset is selected MultiAsSingle, // Multiple extruder printer preset is selected, but // this mode works just for Single extruder print - // (For all print from objects settings is used just one extruder) + // (The same extruder is assigned to all ModelObjects and ModelVolumes). MultiExtruder // Multiple extruder printer preset is selected }; diff --git a/src/libslic3r/Layer.hpp b/src/libslic3r/Layer.hpp index b7725d11da..d66aa8f013 100644 --- a/src/libslic3r/Layer.hpp +++ b/src/libslic3r/Layer.hpp @@ -105,6 +105,7 @@ public: coordf_t slice_z; // Z used for slicing in unscaled coordinates coordf_t print_z; // Z used for printing in unscaled coordinates coordf_t height; // layer height in unscaled coordinates + coordf_t bottom_z() const { return this->print_z - this->height; } // Collection of expolygons generated by slicing the possibly multiple meshes of the source geometry // (with possibly differing extruder ID and slicing parameters) and merged. diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index ebb05772fd..b3b686f03a 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -168,6 +168,17 @@ void PrintConfigDef::init_fff_params() def->min = 0; def->set_default_value(new ConfigOptionInt(3)); + def = this->add("bottom_solid_min_thickness", coFloat); + //TRN To be shown in Print Settings "Top solid layers" + def->label = L("Bottom"); + def->category = L("Layers and Perimeters"); + def->tooltip = L("The number of bottom solid layers is increased above bottom_solid_layers if necessary to satisfy " + "minimum thickness of bottom shell."); + def->full_label = L("Minimum bottom shell thickness"); + def->sidetext = L("mm"); + def->min = 0; + def->set_default_value(new ConfigOptionFloat(0.)); + def = this->add("bridge_acceleration", coFloat); def->label = L("Bridge"); def->tooltip = L("This is the acceleration your printer will use for bridges. " @@ -1782,6 +1793,13 @@ void PrintConfigDef::init_fff_params() def->shortcut.push_back("bottom_solid_layers"); def->min = 0; + def = this->add("solid_min_thickness", coFloat); + def->label = L("Minimum thickness of a top / bottom shell"); + def->tooltip = L("Minimum thickness of a top / bottom shell"); + def->shortcut.push_back("top_solid_min_thickness"); + def->shortcut.push_back("bottom_solid_min_thickness"); + def->min = 0; + def = this->add("spiral_vase", coBool); def->label = L("Spiral vase"); def->tooltip = L("This feature will raise Z gradually while printing a single-walled object " @@ -2128,6 +2146,18 @@ void PrintConfigDef::init_fff_params() def->min = 0; def->set_default_value(new ConfigOptionInt(3)); + def = this->add("top_solid_min_thickness", coFloat); + //TRN To be shown in Print Settings "Top solid layers" + def->label = L("Top"); + def->category = L("Layers and Perimeters"); + def->tooltip = L("The number of top solid layers is increased above top_solid_layers if necessary to satisfy " + "minimum thickness of top shell." + " This is useful to prevent pillowing effect when printing with variable layer height."); + def->full_label = L("Minimum top shell thickness"); + def->sidetext = L("mm"); + def->min = 0; + def->set_default_value(new ConfigOptionFloat(0.)); + def = this->add("travel_speed", coFloat); def->label = L("Travel"); def->tooltip = L("Speed for travel moves (jumps between distant extrusion points)."); diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index 5130d3b05b..c854feafc8 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -466,6 +466,7 @@ class PrintRegionConfig : public StaticPrintConfig public: ConfigOptionFloat bridge_angle; ConfigOptionInt bottom_solid_layers; + ConfigOptionFloat bottom_solid_min_thickness; ConfigOptionFloat bridge_flow_ratio; ConfigOptionFloat bridge_speed; ConfigOptionBool ensure_vertical_shell_thickness; @@ -501,6 +502,7 @@ public: ConfigOptionBool thin_walls; ConfigOptionFloatOrPercent top_infill_extrusion_width; ConfigOptionInt top_solid_layers; + ConfigOptionFloat top_solid_min_thickness; ConfigOptionFloatOrPercent top_solid_infill_speed; ConfigOptionBool wipe_into_infill; @@ -509,6 +511,7 @@ protected: { OPT_PTR(bridge_angle); OPT_PTR(bottom_solid_layers); + OPT_PTR(bottom_solid_min_thickness); OPT_PTR(bridge_flow_ratio); OPT_PTR(bridge_speed); OPT_PTR(ensure_vertical_shell_thickness); @@ -542,6 +545,7 @@ protected: OPT_PTR(top_infill_extrusion_width); OPT_PTR(top_solid_infill_speed); OPT_PTR(top_solid_layers); + OPT_PTR(top_solid_min_thickness); OPT_PTR(wipe_into_infill); } }; diff --git a/src/libslic3r/PrintObject.cpp b/src/libslic3r/PrintObject.cpp index 5dcaf8dfbd..2ff3613090 100644 --- a/src/libslic3r/PrintObject.cpp +++ b/src/libslic3r/PrintObject.cpp @@ -507,7 +507,9 @@ bool PrintObject::invalidate_state_by_config_options(const std::vectorslicing_parameters().min_layer_height; + // Does this region possibly produce more than 1 top or bottom layer? + auto has_extra_layers_fn = [min_layer_height](const PrintRegionConfig &config) { + auto num_extra_layers = [min_layer_height](int num_solid_layers, coordf_t min_shell_thickness) { + if (num_solid_layers == 0) + return 0; + int n = num_solid_layers - 1; + int n2 = int(ceil(min_shell_thickness / min_layer_height)); + return std::max(n, n2 - 1); + }; + return num_extra_layers(config.top_solid_layers, config.top_solid_min_thickness) + + num_extra_layers(config.bottom_solid_layers, config.bottom_solid_min_thickness) > 0; + }; std::vector cache_top_botom_regions(m_layers.size(), DiscoverVerticalShellsCacheEntry()); bool top_bottom_surfaces_all_regions = this->region_volumes.size() > 1 && ! m_config.interface_shells.value; if (top_bottom_surfaces_all_regions) { @@ -921,11 +936,11 @@ void PrintObject::discover_vertical_shells() // is calculated over all materials. // Is the "ensure vertical wall thickness" applicable to any region? bool has_extra_layers = false; - for (size_t idx_region = 0; idx_region < this->region_volumes.size(); ++ idx_region) { - const PrintRegion ®ion = *m_print->get_region(idx_region); - if (region.config().ensure_vertical_shell_thickness.value && - (region.config().top_solid_layers.value > 1 || region.config().bottom_solid_layers.value > 1)) { + for (size_t idx_region = 0; idx_region < this->region_volumes.size(); ++idx_region) { + const PrintRegionConfig &config = m_print->get_region(idx_region)->config(); + if (config.ensure_vertical_shell_thickness.value && has_extra_layers_fn(config)) { has_extra_layers = true; + break; } } if (! has_extra_layers) @@ -1006,9 +1021,7 @@ void PrintObject::discover_vertical_shells() if (! region.config().ensure_vertical_shell_thickness.value) // This region will be handled by discover_horizontal_shells(). continue; - int n_extra_top_layers = std::max(0, region.config().top_solid_layers.value - 1); - int n_extra_bottom_layers = std::max(0, region.config().bottom_solid_layers.value - 1); - if (n_extra_top_layers + n_extra_bottom_layers == 0) + if (! has_extra_layers_fn(region.config())) // Zero or 1 layer, there is no additional vertical wall thickness enforced. continue; @@ -1049,7 +1062,7 @@ void PrintObject::discover_vertical_shells() BOOST_LOG_TRIVIAL(debug) << "Discovering vertical shells for region " << idx_region << " in parallel - start : ensure vertical wall thickness"; tbb::parallel_for( tbb::blocked_range(0, m_layers.size(), grain_size), - [this, idx_region, n_extra_top_layers, n_extra_bottom_layers, &cache_top_botom_regions] + [this, idx_region, &cache_top_botom_regions] (const tbb::blocked_range& range) { // printf("discover_vertical_shells from %d to %d\n", range.begin(), range.end()); for (size_t idx_layer = range.begin(); idx_layer < range.end(); ++ idx_layer) { @@ -1060,8 +1073,9 @@ void PrintObject::discover_vertical_shells() ++ debug_idx; #endif /* SLIC3R_DEBUG_SLICE_PROCESSING */ - Layer *layer = m_layers[idx_layer]; - LayerRegion *layerm = layer->m_regions[idx_region]; + Layer *layer = m_layers[idx_layer]; + LayerRegion *layerm = layer->m_regions[idx_region]; + const PrintRegionConfig ®ion_config = layerm->region()->config(); #ifdef SLIC3R_DEBUG_SLICE_PROCESSING layerm->export_region_slices_to_svg_debug("4_discover_vertical_shells-initial"); @@ -1101,30 +1115,47 @@ void PrintObject::discover_vertical_shells() } } #endif /* SLIC3R_DEBUG_SLICE_PROCESSING */ - // Reset the top / bottom inflated regions caches of entries, which are out of the moving window. - bool hole_first = true; - for (int n = (int)idx_layer - n_extra_bottom_layers; n <= (int)idx_layer + n_extra_top_layers; ++ n) - if (n >= 0 && n < (int)m_layers.size()) { - const DiscoverVerticalShellsCacheEntry &cache = cache_top_botom_regions[n]; - if (hole_first) { - hole_first = false; - polygons_append(holes, cache.holes); - } - else if (! holes.empty()) { - holes = intersection(holes, cache.holes); - } - size_t n_shell_old = shell.size(); - if (n > int(idx_layer)) - // Collect top surfaces. - polygons_append(shell, cache.top_surfaces); - else if (n < int(idx_layer)) - // Collect bottom and bottom bridge surfaces. - polygons_append(shell, cache.bottom_surfaces); - // Running the union_ using the Clipper library piece by piece is cheaper - // than running the union_ all at once. - if (n_shell_old < shell.size()) - shell = union_(shell, false); - } + polygons_append(holes, cache_top_botom_regions[idx_layer].holes); + { + // Gather top regions projected to this layer. + coordf_t print_z = layer->print_z; + int n_top_layers = region_config.top_solid_layers.value; + for (int i = int(idx_layer) + 1; + i < int(m_layers.size()) && + (i < int(idx_layer) + n_top_layers || + m_layers[i]->print_z - print_z < region_config.top_solid_min_thickness - EPSILON); + ++ i) { + const DiscoverVerticalShellsCacheEntry &cache = cache_top_botom_regions[i]; + if (! holes.empty()) + holes = intersection(holes, cache.holes); + if (! cache.top_surfaces.empty()) { + polygons_append(shell, cache.top_surfaces); + // Running the union_ using the Clipper library piece by piece is cheaper + // than running the union_ all at once. + shell = union_(shell, false); + } + } + } + { + // Gather bottom regions projected to this layer. + coordf_t bottom_z = layer->bottom_z(); + int n_bottom_layers = region_config.bottom_solid_layers.value; + for (int i = int(idx_layer) - 1; + i >= 0 && + (i > int(idx_layer) - n_bottom_layers || + bottom_z - m_layers[i]->bottom_z() < region_config.bottom_solid_min_thickness - EPSILON); + -- i) { + const DiscoverVerticalShellsCacheEntry &cache = cache_top_botom_regions[i]; + if (! holes.empty()) + holes = intersection(holes, cache.holes); + if (! cache.bottom_surfaces.empty()) { + polygons_append(shell, cache.bottom_surfaces); + // Running the union_ using the Clipper library piece by piece is cheaper + // than running the union_ all at once. + shell = union_(shell, false); + } + } + } #ifdef SLIC3R_DEBUG_SLICE_PROCESSING { Slic3r::SVG svg(debug_out_path("discover_vertical_shells-perimeters-before-union-%d.svg", debug_idx), get_extents(shell)); @@ -2280,7 +2311,8 @@ void PrintObject::discover_horizontal_shells() for (size_t region_id = 0; region_id < this->region_volumes.size(); ++ region_id) { for (size_t i = 0; i < m_layers.size(); ++ i) { m_print->throw_if_canceled(); - LayerRegion *layerm = m_layers[i]->regions()[region_id]; + Layer *layer = m_layers[i]; + LayerRegion *layerm = layer->regions()[region_id]; const PrintRegionConfig ®ion_config = layerm->region()->config(); if (region_config.solid_infill_every_layers.value > 0 && region_config.fill_density.value > 0 && (i % region_config.solid_infill_every_layers) == 0) { @@ -2295,6 +2327,8 @@ void PrintObject::discover_horizontal_shells() if (region_config.ensure_vertical_shell_thickness.value) continue; + coordf_t print_z = layer->print_z; + coordf_t bottom_z = layer->bottom_z(); for (size_t idx_surface_type = 0; idx_surface_type < 3; ++ idx_surface_type) { m_print->throw_if_canceled(); SurfaceType type = (idx_surface_type == 0) ? stTop : (idx_surface_type == 1) ? stBottom : stBottomBridge; @@ -2323,10 +2357,15 @@ void PrintObject::discover_horizontal_shells() continue; // Slic3r::debugf "Layer %d has %s surfaces\n", $i, ($type == stTop) ? 'top' : 'bottom'; - size_t solid_layers = (type == stTop) ? region_config.top_solid_layers.value : region_config.bottom_solid_layers.value; - for (int n = (type == stTop) ? i-1 : i+1; std::abs(n - (int)i) < solid_layers; (type == stTop) ? -- n : ++ n) { - if (n < 0 || n >= int(m_layers.size())) - continue; + // Scatter top / bottom regions to other layers. Scattering process is inherently serial, it is difficult to parallelize without locking. + for (int n = (type == stTop) ? int(i) - 1 : int(i) + 1; + (type == stTop) ? + (n >= 0 && (int(i) - n < region_config.top_solid_layers.value || + print_z - m_layers[n]->print_z < region_config.top_solid_min_thickness.value - EPSILON)) : + (n < int(m_layers.size()) && (n - int(i) < region_config.bottom_solid_layers.value || + m_layers[n]->bottom_z() - bottom_z < region_config.bottom_solid_min_thickness.value - EPSILON)); + (type == stTop) ? -- n : ++ n) + { // Slic3r::debugf " looking for neighbors on layer %d...\n", $n; // Reference to the lower layer of a TOP surface, or an upper layer of a BOTTOM surface. LayerRegion *neighbor_layerm = m_layers[n]->regions()[region_id]; diff --git a/src/libslic3r/Slicing.cpp b/src/libslic3r/Slicing.cpp index 2a32ba5ef4..82d2d19890 100644 --- a/src/libslic3r/Slicing.cpp +++ b/src/libslic3r/Slicing.cpp @@ -41,6 +41,23 @@ inline coordf_t max_layer_height_from_nozzle(const PrintConfig &print_config, in return std::max(min_layer_height, (max_layer_height == 0.) ? (0.75 * nozzle_dmr) : max_layer_height); } +// Minimum layer height for the variable layer height algorithm. +coordf_t Slicing::min_layer_height_from_nozzle(const DynamicPrintConfig &print_config, int idx_nozzle) +{ + coordf_t min_layer_height = print_config.opt_float("min_layer_height", idx_nozzle - 1); + return (min_layer_height == 0.) ? MIN_LAYER_HEIGHT_DEFAULT : std::max(MIN_LAYER_HEIGHT, min_layer_height); +} + +// Maximum layer height for the variable layer height algorithm, 3/4 of a nozzle dimaeter by default, +// it should not be smaller than the minimum layer height. +coordf_t Slicing::max_layer_height_from_nozzle(const DynamicPrintConfig &print_config, int idx_nozzle) +{ + coordf_t min_layer_height = min_layer_height_from_nozzle(print_config, idx_nozzle); + coordf_t max_layer_height = print_config.opt_float("max_layer_height", idx_nozzle - 1); + coordf_t nozzle_dmr = print_config.opt_float("nozzle_diameter", idx_nozzle - 1); + return std::max(min_layer_height, (max_layer_height == 0.) ? (0.75 * nozzle_dmr) : max_layer_height); +} + SlicingParameters SlicingParameters::create_from_config( const PrintConfig &print_config, const PrintObjectConfig &object_config, diff --git a/src/libslic3r/Slicing.hpp b/src/libslic3r/Slicing.hpp index 036344b224..95cf6891b2 100644 --- a/src/libslic3r/Slicing.hpp +++ b/src/libslic3r/Slicing.hpp @@ -99,7 +99,6 @@ struct SlicingParameters }; static_assert(IsTriviallyCopyable::value, "SlicingParameters class is not POD (and it should be - see constructor)."); - // The two slicing parameters lead to the same layering as long as the variable layer thickness is not in action. inline bool equal_layering(const SlicingParameters &sp1, const SlicingParameters &sp2) { @@ -183,7 +182,17 @@ extern int generate_layer_height_texture( const std::vector &layers, void *data, int rows, int cols, bool level_of_detail_2nd_level); -}; // namespace Slic3r +namespace Slicing { + // Minimum layer height for the variable layer height algorithm. Nozzle index is 1 based. + coordf_t min_layer_height_from_nozzle(const DynamicPrintConfig &print_config, int idx_nozzle); + + // Maximum layer height for the variable layer height algorithm, 3/4 of a nozzle dimaeter by default, + // it should not be smaller than the minimum layer height. + // Nozzle index is 1 based. + coordf_t max_layer_height_from_nozzle(const DynamicPrintConfig &print_config, int idx_nozzle); +} // namespace Slicing + +} // namespace Slic3r namespace cereal { diff --git a/src/slic3r/GUI/ConfigManipulation.cpp b/src/slic3r/GUI/ConfigManipulation.cpp index 966f347618..a8773d7361 100644 --- a/src/slic3r/GUI/ConfigManipulation.cpp +++ b/src/slic3r/GUI/ConfigManipulation.cpp @@ -233,22 +233,27 @@ void ConfigManipulation::toggle_print_fff_options(DynamicPrintConfig* config) "solid_infill_every_layers", "solid_infill_below_area", "infill_extruder" }) toggle_field(el, have_infill); - bool have_solid_infill = config->opt_int("top_solid_layers") > 0 || config->opt_int("bottom_solid_layers") > 0; + bool has_spiral_vase = config->opt_bool("spiral_vase"); + bool has_top_solid_infill = config->opt_int("top_solid_layers") > 0; + bool has_bottom_solid_infill = config->opt_int("bottom_solid_layers") > 0; + bool has_solid_infill = has_top_solid_infill || has_bottom_solid_infill; // solid_infill_extruder uses the same logic as in Print::extruders() for (auto el : { "top_fill_pattern", "bottom_fill_pattern", "infill_first", "solid_infill_extruder", "solid_infill_extrusion_width", "solid_infill_speed" }) - toggle_field(el, have_solid_infill); + toggle_field(el, has_solid_infill); for (auto el : { "fill_angle", "bridge_angle", "infill_extrusion_width", "infill_speed", "bridge_speed" }) - toggle_field(el, have_infill || have_solid_infill); + toggle_field(el, have_infill || has_solid_infill); + + toggle_field("top_solid_min_thickness", ! has_spiral_vase && has_top_solid_infill); + toggle_field("bottom_solid_min_thickness", ! has_spiral_vase && has_bottom_solid_infill); // Gap fill is newly allowed in between perimeter lines even for empty infill (see GH #1476). toggle_field("gap_fill_speed", have_perimeters); - bool have_top_solid_infill = config->opt_int("top_solid_layers") > 0; for (auto el : { "top_infill_extrusion_width", "top_solid_infill_speed" }) - toggle_field(el, have_top_solid_infill); + toggle_field(el, has_top_solid_infill); bool have_default_acceleration = config->opt_float("default_acceleration") > 0; for (auto el : { "perimeter_acceleration", "infill_acceleration", diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 1b69decfc2..aadfdd0dd6 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -1980,7 +1980,7 @@ Plater::priv::priv(Plater *q, MainFrame *main_frame) "extruder_colour", "filament_colour", "max_print_height", "printer_model", "printer_technology", // These values are necessary to construct SlicingParameters by the Canvas3D variable layer height editor. "layer_height", "first_layer_height", "min_layer_height", "max_layer_height", - "brim_width", "perimeters", "perimeter_extruder", "fill_density", "infill_extruder", "top_solid_layers", "bottom_solid_layers", "solid_infill_extruder", + "brim_width", "perimeters", "perimeter_extruder", "fill_density", "infill_extruder", "top_solid_layers", "support_material", "support_material_extruder", "support_material_interface_extruder", "support_material_contact_distance", "raft_layers" })) , sidebar(new Sidebar(q)) diff --git a/src/slic3r/GUI/Preset.cpp b/src/slic3r/GUI/Preset.cpp index 98fcf3f421..00e004f758 100644 --- a/src/slic3r/GUI/Preset.cpp +++ b/src/slic3r/GUI/Preset.cpp @@ -386,7 +386,8 @@ void Preset::set_visible_from_appconfig(const AppConfig &app_config) const std::vector& Preset::print_options() { static std::vector s_opts { - "layer_height", "first_layer_height", "perimeters", "spiral_vase", "slice_closing_radius", "top_solid_layers", "bottom_solid_layers", + "layer_height", "first_layer_height", "perimeters", "spiral_vase", "slice_closing_radius", + "top_solid_layers", "top_solid_min_thickness", "bottom_solid_layers", "bottom_solid_min_thickness", "extra_perimeters", "ensure_vertical_shell_thickness", "avoid_crossing_perimeters", "thin_walls", "overhangs", "seam_position", "external_perimeters_first", "fill_density", "fill_pattern", "top_fill_pattern", "bottom_fill_pattern", "infill_every_layers", "infill_only_where_needed", "solid_infill_every_layers", "fill_angle", "bridge_angle", diff --git a/src/slic3r/GUI/PresetHints.cpp b/src/slic3r/GUI/PresetHints.cpp index f6281d7af4..71db6d35b2 100644 --- a/src/slic3r/GUI/PresetHints.cpp +++ b/src/slic3r/GUI/PresetHints.cpp @@ -1,6 +1,7 @@ #include #include "libslic3r/Flow.hpp" +#include "libslic3r/Slicing.hpp" #include "libslic3r/libslic3r.h" #include "PresetBundle.hpp" @@ -242,7 +243,7 @@ std::string PresetHints::recommended_thin_wall_thickness(const PresetBundle &pre float nozzle_diameter = float(printer_config.opt_float("nozzle_diameter", 0)); std::string out; - if (layer_height <= 0.f){ + if (layer_height <= 0.f) { out += _utf8(L("Recommended object thin wall thickness: Not available due to invalid layer height.")); return out; } @@ -272,4 +273,70 @@ std::string PresetHints::recommended_thin_wall_thickness(const PresetBundle &pre return out; } + +// Produce a textual explanation of the combined effects of the top/bottom_solid_layers +// versus top/bottom_min_shell_thickness. Which of the two values wins depends +// on the active layer height. +std::string PresetHints::top_bottom_shell_thickness_explanation(const PresetBundle &preset_bundle) +{ + const DynamicPrintConfig &print_config = preset_bundle.prints .get_edited_preset().config; + const DynamicPrintConfig &printer_config = preset_bundle.printers .get_edited_preset().config; + + std::string out; + + int top_solid_layers = print_config.opt_int("top_solid_layers"); + int bottom_solid_layers = print_config.opt_int("bottom_solid_layers"); + bool has_top_layers = top_solid_layers > 0; + bool has_bottom_layers = bottom_solid_layers > 0; + bool has_shell = has_top_layers && has_bottom_layers; + double top_solid_min_thickness = print_config.opt_float("top_solid_min_thickness"); + double bottom_solid_min_thickness = print_config.opt_float("bottom_solid_min_thickness"); + double layer_height = print_config.opt_float("layer_height"); + bool variable_layer_height = printer_config.opt_bool("variable_layer_height"); + //FIXME the following lines take into account the 1st extruder only. + double min_layer_height = (has_shell && variable_layer_height) ? Slicing::min_layer_height_from_nozzle(printer_config, 1) : layer_height; + double max_layer_height = (has_shell && variable_layer_height) ? Slicing::max_layer_height_from_nozzle(printer_config, 1) : layer_height; + + if (layer_height <= 0.f) { + out += _utf8(L("Top / bottom shell thickness hint: Not available due to invalid layer height.")); + return out; + } + + if (has_top_layers) { + double top_shell_thickness = top_solid_layers * layer_height; + if (top_shell_thickness < top_solid_min_thickness) { + // top_solid_min_shell_thickness triggers even in case of normal layer height. Round the top_shell_thickness up + // to an integer multiply of layer_height. + double n = ceil(top_solid_min_thickness / layer_height); + top_shell_thickness = n * layer_height; + } + double top_shell_thickness_minimum = std::max(top_solid_min_thickness, top_solid_layers * min_layer_height); + out += (boost::format(_utf8(L("Top shell is %1% mm thick for layer height %2% mm."))) % top_shell_thickness % layer_height).str(); + if (variable_layer_height && top_shell_thickness_minimum < top_shell_thickness) { + out += " "; + out += (boost::format(_utf8(L("Minimum top shell thickness is %1% mm."))) % top_shell_thickness_minimum).str(); + } + } + + if (has_bottom_layers) { + double bottom_shell_thickness = bottom_solid_layers * layer_height; + if (bottom_shell_thickness < bottom_solid_min_thickness) { + // bottom_solid_min_shell_thickness triggers even in case of normal layer height. Round the bottom_shell_thickness up + // to an integer multiply of layer_height. + double n = ceil(bottom_solid_min_thickness / layer_height); + bottom_shell_thickness = n * layer_height; + } + double bottom_shell_thickness_minimum = std::max(bottom_solid_min_thickness, bottom_solid_layers * min_layer_height); + if (! out.empty()) + out += "\n"; + out += (boost::format(_utf8(L("Bottom shell is %1% mm thick for layer height %2% mm."))) % bottom_shell_thickness % layer_height).str(); + if (variable_layer_height && bottom_shell_thickness_minimum < bottom_shell_thickness) { + out += " "; + out += (boost::format(_utf8(L("Minimum bottom shell thickness is %1% mm."))) % bottom_shell_thickness_minimum).str(); + } + } + + return out; +} + }; // namespace Slic3r diff --git a/src/slic3r/GUI/PresetHints.hpp b/src/slic3r/GUI/PresetHints.hpp index 39bf0b100b..be049c2c87 100644 --- a/src/slic3r/GUI/PresetHints.hpp +++ b/src/slic3r/GUI/PresetHints.hpp @@ -23,6 +23,11 @@ public: // Produce a textual description of a recommended thin wall thickness // from the provided number of perimeters and the external / internal perimeter width. static std::string recommended_thin_wall_thickness(const PresetBundle &preset_bundle); + + // Produce a textual explanation of the combined effects of the top/bottom_solid_layers + // versus top/bottom_min_shell_thickness. Which of the two values wins depends + // on the active layer height. + static std::string top_bottom_shell_thickness_explanation(const PresetBundle &preset_bundle); }; } // namespace Slic3r diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index 72e2091670..5a41f12a5a 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -1056,6 +1056,16 @@ void TabPrint::build() line.append_option(optgroup->get_option("top_solid_layers")); line.append_option(optgroup->get_option("bottom_solid_layers")); optgroup->append_line(line); + line = { _(L("Minimum shell thickness")), "" }; + line.append_option(optgroup->get_option("top_solid_min_thickness")); + line.append_option(optgroup->get_option("bottom_solid_min_thickness")); + optgroup->append_line(line); + line = { "", "" }; + line.full_width = 1; + line.widget = [this](wxWindow* parent) { + return description_line_widget(parent, &m_top_bottom_shell_thickness_explanation); + }; + optgroup->append_line(line); optgroup = page->new_optgroup(_(L("Quality (slower slicing)"))); optgroup->append_single_option_line("extra_perimeters"); @@ -1277,6 +1287,8 @@ void TabPrint::update() m_recommended_thin_wall_thickness_description_line->SetText( from_u8(PresetHints::recommended_thin_wall_thickness(*m_preset_bundle))); + m_top_bottom_shell_thickness_explanation->SetText( + from_u8(PresetHints::top_bottom_shell_thickness_explanation(*m_preset_bundle))); Layout(); // Thaw(); @@ -1295,6 +1307,8 @@ void TabPrint::OnActivate() { m_recommended_thin_wall_thickness_description_line->SetText( from_u8(PresetHints::recommended_thin_wall_thickness(*m_preset_bundle))); + m_top_bottom_shell_thickness_explanation->SetText( + from_u8(PresetHints::top_bottom_shell_thickness_explanation(*m_preset_bundle))); Tab::OnActivate(); } diff --git a/src/slic3r/GUI/Tab.hpp b/src/slic3r/GUI/Tab.hpp index cfa5ae56d6..c88a74e53f 100644 --- a/src/slic3r/GUI/Tab.hpp +++ b/src/slic3r/GUI/Tab.hpp @@ -327,8 +327,9 @@ public: Tab(parent, _(L("Print Settings")), Slic3r::Preset::TYPE_PRINT) {} ~TabPrint() {} - ogStaticText* m_recommended_thin_wall_thickness_description_line; - bool m_support_material_overhangs_queried = false; + ogStaticText* m_recommended_thin_wall_thickness_description_line = nullptr; + ogStaticText* m_top_bottom_shell_thickness_explanation = nullptr; + bool m_support_material_overhangs_queried = false; void build() override; void reload_config() override; @@ -336,6 +337,7 @@ public: void OnActivate() override; bool supports_printer_technology(const PrinterTechnology tech) override { return tech == ptFFF; } }; + class TabFilament : public Tab { ogStaticText* m_volumetric_speed_description_line; From bd76c345f22d8232fd8e524fbc35bda295d32424 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Wed, 5 Feb 2020 17:39:56 +0100 Subject: [PATCH 256/336] Handle CGAL exceptions and add tests for mesh boolean operations Add conversion to exact predicates exact construction kernel format for consecutive booleans (experiments) --- sandboxes/meshboolean/MeshBoolean.cpp | 68 +++----- src/libslic3r/MeshBoolean.cpp | 224 ++++++++++++++++++-------- src/libslic3r/MeshBoolean.hpp | 34 ++-- src/libslic3r/SLAPrintSteps.cpp | 6 +- tests/libslic3r/CMakeLists.txt | 1 + tests/libslic3r/test_meshboolean.cpp | 26 +++ 6 files changed, 231 insertions(+), 128 deletions(-) create mode 100644 tests/libslic3r/test_meshboolean.cpp diff --git a/sandboxes/meshboolean/MeshBoolean.cpp b/sandboxes/meshboolean/MeshBoolean.cpp index d339ef5c30..392d907074 100644 --- a/sandboxes/meshboolean/MeshBoolean.cpp +++ b/sandboxes/meshboolean/MeshBoolean.cpp @@ -11,66 +11,34 @@ #include -namespace Slic3r { - -} // namespace Slic3r - int main(const int argc, const char * argv[]) { using namespace Slic3r; - if (argc <= 1) return EXIT_FAILURE; + if (argc <= 1) { + std::cout << "Usage: meshboolean " << std::endl; + return EXIT_FAILURE; + } - DynamicPrintConfig cfg; - auto model = Model::read_from_file(argv[1], &cfg); - if (model.objects.empty()) return EXIT_SUCCESS; + TriangleMesh input; - SLAPrint print; - print.apply(model, cfg); - PrintBase::TaskParams task; - task.to_object_step = slaposHollowing; - - print.set_task(task); - print.process(); + input.ReadSTLFile(argv[1]); + input.repair(); Benchmark bench; - for (SLAPrintObject *po : print.objects()) { - TriangleMesh holes; - sla::DrainHoles holepts = po->transformed_drainhole_points(); - - for (auto &hole: holepts) - holes.merge(sla::to_triangle_mesh(hole.to_mesh())); - - TriangleMesh hollowed_mesh = po->transformed_mesh(); - hollowed_mesh.merge(po->hollowed_interior_mesh()); - - hollowed_mesh.require_shared_vertices(); - holes.require_shared_vertices(); - - TriangleMesh drilled_mesh_igl = hollowed_mesh; - bench.start(); - MeshBoolean::minus(drilled_mesh_igl, holes); - bench.stop(); - - std::cout << "Mesh boolean duration with IGL: " << bench.getElapsedSec() << std::endl; - - TriangleMesh drilled_mesh_cgal = hollowed_mesh; - bench.start(); - MeshBoolean::cgal::self_union(drilled_mesh_cgal); - MeshBoolean::cgal::minus(drilled_mesh_cgal, holes); - bench.stop(); - - std::cout << "Mesh boolean duration with CGAL: " << bench.getElapsedSec() << std::endl; - - std::string name("obj"), outf; - outf = name + "igl" + std::to_string(po->model_object()->id().id) + ".obj"; - drilled_mesh_igl.WriteOBJFile(outf.c_str()); - - outf = name + "cgal" + std::to_string(po->model_object()->id().id) + ".obj"; - drilled_mesh_cgal.WriteOBJFile(outf.c_str()); - } + bench.start(); + bool fckd = MeshBoolean::cgal::does_self_intersect(input); + bench.stop(); + + std::cout << "Self intersect test: " << fckd << " duration: " << bench.getElapsedSec() << std::endl; + + bench.start(); + MeshBoolean::self_union(input); + bench.stop(); + + std::cout << "Self union duration: " << bench.getElapsedSec() << std::endl; return 0; } diff --git a/src/libslic3r/MeshBoolean.cpp b/src/libslic3r/MeshBoolean.cpp index 1c848eb5f8..6db1493ecc 100644 --- a/src/libslic3r/MeshBoolean.cpp +++ b/src/libslic3r/MeshBoolean.cpp @@ -10,17 +10,24 @@ #include #include #include +#include +#include +#include +#include +#include +#include +#include namespace Slic3r { namespace MeshBoolean { -typedef Eigen::Map> MapMatrixXfUnaligned; -typedef Eigen::Map> MapMatrixXiUnaligned; +using MapMatrixXfUnaligned = Eigen::Map>; +using MapMatrixXiUnaligned = Eigen::Map>; -typedef std::pair EigenMesh; - -static TriangleMesh eigen_to_triangle_mesh(const Eigen::MatrixXd& VC, const Eigen::MatrixXi& FC) +TriangleMesh eigen_to_triangle_mesh(const EigenMesh &emesh) { + auto &VC = emesh.first; auto &FC = emesh.second; + Pointf3s points(size_t(VC.rows())); std::vector facets(size_t(FC.rows())); @@ -35,7 +42,7 @@ static TriangleMesh eigen_to_triangle_mesh(const Eigen::MatrixXd& VC, const Eige return out; } -static EigenMesh triangle_mesh_to_eigen_mesh(const TriangleMesh &mesh) +EigenMesh triangle_mesh_to_eigen(const TriangleMesh &mesh) { EigenMesh emesh; emesh.first = MapMatrixXfUnaligned(mesh.its.vertices.front().data(), @@ -48,70 +55,116 @@ static EigenMesh triangle_mesh_to_eigen_mesh(const TriangleMesh &mesh) return emesh; } -void minus(TriangleMesh& A, const TriangleMesh& B) +void minus(EigenMesh &A, const EigenMesh &B) { - auto [VA, FA] = triangle_mesh_to_eigen_mesh(A); - auto [VB, FB] = triangle_mesh_to_eigen_mesh(B); - + auto &[VA, FA] = A; + auto &[VB, FB] = B; + Eigen::MatrixXd VC; Eigen::MatrixXi FC; igl::MeshBooleanType boolean_type(igl::MESH_BOOLEAN_TYPE_MINUS); igl::copyleft::cgal::mesh_boolean(VA, FA, VB, FB, boolean_type, VC, FC); - - A = eigen_to_triangle_mesh(VC, FC); + + VA = std::move(VC); FA = std::move(FC); } -void self_union(TriangleMesh& mesh) +void minus(TriangleMesh& A, const TriangleMesh& B) { - auto [V, F] = triangle_mesh_to_eigen_mesh(mesh); + EigenMesh eA = triangle_mesh_to_eigen(A); + minus(eA, triangle_mesh_to_eigen(B)); + A = eigen_to_triangle_mesh(eA); +} - Eigen::MatrixXd VC; - Eigen::MatrixXi FC; +void self_union(EigenMesh &A) +{ + EigenMesh result; + auto &[V, F] = A; + auto &[VC, FC] = result; igl::MeshBooleanType boolean_type(igl::MESH_BOOLEAN_TYPE_UNION); igl::copyleft::cgal::mesh_boolean(V, F, Eigen::MatrixXd(), Eigen::MatrixXi(), boolean_type, VC, FC); - mesh = eigen_to_triangle_mesh(VC, FC); + A = std::move(result); +} + +void self_union(TriangleMesh& mesh) +{ + auto eM = triangle_mesh_to_eigen(mesh); + self_union(eM); + mesh = eigen_to_triangle_mesh(eM); } namespace cgal { -namespace CGALProc = CGAL::Polygon_mesh_processing; -namespace CGALParams = CGAL::Polygon_mesh_processing::parameters; +namespace CGALProc = CGAL::Polygon_mesh_processing; +namespace CGALParams = CGAL::Polygon_mesh_processing::parameters; -using Kernel = CGAL::Exact_predicates_inexact_constructions_kernel; -using _CGALMesh = CGAL::Surface_mesh; +using EpecKernel = CGAL::Exact_predicates_exact_constructions_kernel; +using EpicKernel = CGAL::Exact_predicates_inexact_constructions_kernel; +using _EpicMesh = CGAL::Surface_mesh; +using _EpecMesh = CGAL::Surface_mesh; -struct CGALMesh { _CGALMesh m; }; +struct CGALMesh { _EpicMesh m; }; -static void triangle_mesh_to_cgal(const TriangleMesh &M, _CGALMesh &out) +// ///////////////////////////////////////////////////////////////////////////// +// Converions from and to CGAL mesh +// ///////////////////////////////////////////////////////////////////////////// + +template void triangle_mesh_to_cgal(const TriangleMesh &M, _Mesh &out) { - for (const Vec3f &v : M.its.vertices) - out.add_vertex(_CGALMesh::Point(v.x(), v.y(), v.z())); - - for (const Vec3crd &face : M.its.indices) { - auto f = face.cast(); - out.add_face(f(0), f(1), f(2)); + using Index3 = std::array; + std::vector points; + std::vector indices; + points.reserve(M.its.vertices.size()); + indices.reserve(M.its.indices.size()); + for (auto &v : M.its.vertices) points.emplace_back(v.x(), v.y(), v.z()); + for (auto &_f : M.its.indices) { + auto f = _f.cast(); + indices.emplace_back(Index3{f(0), f(1), f(2)}); } + + CGALProc::orient_polygon_soup(points, indices); + CGALProc::polygon_soup_to_polygon_mesh(points, indices, out); + + // Number the faces because 'orient_to_bound_a_volume' needs a face <--> index map + unsigned index = 0; + for (auto face : out.faces()) face = CGAL::SM_Face_index(index++); + + if(CGAL::is_closed(out)) + CGALProc::orient_to_bound_a_volume(out); + else + std::runtime_error("Mesh not watertight"); } -static TriangleMesh cgal_to_triangle_mesh(const _CGALMesh &cgalmesh) +inline Vec3d to_vec3d(const _EpicMesh::Point &v) +{ + return {v.x(), v.y(), v.z()}; +} + +inline Vec3d to_vec3d(const _EpecMesh::Point &v) +{ + CGAL::Cartesian_converter cvt; + auto iv = cvt(v); + return {iv.x(), iv.y(), iv.z()}; +} + +template TriangleMesh cgal_to_triangle_mesh(const _Mesh &cgalmesh) { Pointf3s points; std::vector facets; points.reserve(cgalmesh.num_vertices()); facets.reserve(cgalmesh.num_faces()); - + for (auto &vi : cgalmesh.vertices()) { auto &v = cgalmesh.point(vi); // Don't ask... - points.emplace_back(v.x(), v.y(), v.z()); + points.emplace_back(to_vec3d(v)); } - + for (auto &face : cgalmesh.faces()) { auto vtc = cgalmesh.vertices_around_face(cgalmesh.halfedge(face)); int i = 0; Vec3crd trface; - for (auto v : vtc) trface(i++) = static_cast(v); + for (auto v : vtc) trface(i++) = static_cast(v); facets.emplace_back(trface); } @@ -120,59 +173,100 @@ static TriangleMesh cgal_to_triangle_mesh(const _CGALMesh &cgalmesh) return out; } -std::unique_ptr triangle_mesh_to_cgal(const TriangleMesh &M) +std::unique_ptr triangle_mesh_to_cgal(const TriangleMesh &M) { - auto out = std::make_unique(); + std::unique_ptr out(new CGALMesh{}); triangle_mesh_to_cgal(M, out->m); return out; } -void cgal_to_triangle_mesh(const CGALMesh &cgalmesh, TriangleMesh &out) +TriangleMesh cgal_to_triangle_mesh(const CGALMesh &cgalmesh) { - out = cgal_to_triangle_mesh(cgalmesh.m); + return cgal_to_triangle_mesh(cgalmesh.m); } -void minus(CGALMesh &A, CGALMesh &B) +// ///////////////////////////////////////////////////////////////////////////// +// Boolean operations for CGAL meshes +// ///////////////////////////////////////////////////////////////////////////// + +static bool _cgal_diff(CGALMesh &A, CGALMesh &B, CGALMesh &R) { - CGALProc::corefine_and_compute_difference(A.m, B.m, A.m); + const auto &p = CGALParams::throw_on_self_intersection(true); + return CGALProc::corefine_and_compute_difference(A.m, B.m, R.m, p, p); } -void self_union(CGALMesh &A) +static bool _cgal_union(CGALMesh &A, CGALMesh &B, CGALMesh &R) { - CGALProc::corefine(A.m, A.m); + const auto &p = CGALParams::throw_on_self_intersection(true); + return CGALProc::corefine_and_compute_union(A.m, B.m, R.m, p, p); } -void minus(TriangleMesh &A, const TriangleMesh &B) -{ +static bool _cgal_intersection(CGALMesh &A, CGALMesh &B, CGALMesh &R) +{ + const auto &p = CGALParams::throw_on_self_intersection(true); + return CGALProc::corefine_and_compute_intersection(A.m, B.m, R.m, p, p); +} + +template void _cgal_do(Op &&op, CGALMesh &A, CGALMesh &B) +{ + bool success = false; + try { + CGALMesh result; + success = op(A, B, result); + A = std::move(result); // In-place operation does not work + } catch (...) { + success = false; + } + + if (! success) + throw std::runtime_error("CGAL mesh boolean operation failed."); +} + +void minus(CGALMesh &A, CGALMesh &B) { _cgal_do(_cgal_diff, A, B); } +void plus(CGALMesh &A, CGALMesh &B) { _cgal_do(_cgal_union, A, B); } +void intersect(CGALMesh &A, CGALMesh &B) { _cgal_do(_cgal_intersection, A, B); } +bool does_self_intersect(const CGALMesh &mesh) { return CGALProc::does_self_intersect(mesh.m); } + +// ///////////////////////////////////////////////////////////////////////////// +// Now the public functions for TriangleMesh input: +// ///////////////////////////////////////////////////////////////////////////// + +template void _mesh_boolean_do(Op &&op, TriangleMesh &A, const TriangleMesh &B) +{ CGALMesh meshA; CGALMesh meshB; triangle_mesh_to_cgal(A, meshA.m); triangle_mesh_to_cgal(B, meshB.m); - CGALMesh meshResult; - bool success = false; - try { - success = CGALProc::corefine_and_compute_difference(meshA.m, meshB.m, meshResult.m, - CGALParams::throw_on_self_intersection(true), CGALParams::throw_on_self_intersection(true)); - } - catch (const CGAL::Polygon_mesh_processing::Corefinement::Self_intersection_exception&) { - success = false; - } - if (! success) - throw std::runtime_error("CGAL corefine_and_compute_difference failed"); - - A = cgal_to_triangle_mesh(meshResult.m); -} - -void self_union(TriangleMesh &m) -{ - _CGALMesh cgalmesh; - triangle_mesh_to_cgal(m, cgalmesh); - CGALProc::corefine(cgalmesh, cgalmesh); + _cgal_do(op, meshA, meshB); - m = cgal_to_triangle_mesh(cgalmesh); + A = cgal_to_triangle_mesh(meshA.m); } +void minus(TriangleMesh &A, const TriangleMesh &B) +{ + _mesh_boolean_do(_cgal_diff, A, B); +} + +void plus(TriangleMesh &A, const TriangleMesh &B) +{ + _mesh_boolean_do(_cgal_union, A, B); +} + +void intersect(TriangleMesh &A, const TriangleMesh &B) +{ + _mesh_boolean_do(_cgal_intersection, A, B); +} + +bool does_self_intersect(const TriangleMesh &mesh) +{ + CGALMesh cgalm; + triangle_mesh_to_cgal(mesh, cgalm.m); + return CGALProc::does_self_intersect(cgalm.m); +} + +void CGALMeshDeleter::operator()(CGALMesh *ptr) { delete ptr; } + } // namespace cgal } // namespace MeshBoolean diff --git a/src/libslic3r/MeshBoolean.hpp b/src/libslic3r/MeshBoolean.hpp index 14e3d3b7b2..5298906b46 100644 --- a/src/libslic3r/MeshBoolean.hpp +++ b/src/libslic3r/MeshBoolean.hpp @@ -2,13 +2,23 @@ #define libslic3r_MeshBoolean_hpp_ #include +#include + +#include +#include namespace Slic3r { -class TriangleMesh; - namespace MeshBoolean { +using EigenMesh = std::pair; + +TriangleMesh eigen_to_triangle_mesh(const EigenMesh &emesh); +EigenMesh triangle_mesh_to_eigen(const TriangleMesh &mesh); + +void minus(EigenMesh &A, const EigenMesh &B); +void self_union(EigenMesh &A); + void minus(TriangleMesh& A, const TriangleMesh& B); void self_union(TriangleMesh& mesh); @@ -16,20 +26,22 @@ namespace cgal { struct CGALMesh; -std::unique_ptr triangle_mesh_to_cgal(const TriangleMesh &M); -void cgal_to_triangle_mesh(const CGALMesh &cgalmesh, TriangleMesh &out); +struct CGALMeshDeleter { void operator()(CGALMesh *ptr); }; + +std::unique_ptr triangle_mesh_to_cgal(const TriangleMesh &M); +TriangleMesh cgal_to_triangle_mesh(const CGALMesh &cgalmesh); // Do boolean mesh difference with CGAL bypassing igl. void minus(TriangleMesh &A, const TriangleMesh &B); +void plus(TriangleMesh &A, const TriangleMesh &B); +void intersect(TriangleMesh &A, const TriangleMesh &B); -// Do self union only with CGAL. -void self_union(TriangleMesh& mesh); - -// does A = A - B -// CGAL takes non-const objects as arguments. I suppose it doesn't change B but -// there is no official garantee. void minus(CGALMesh &A, CGALMesh &B); -void self_union(CGALMesh &A); +void plus(CGALMesh &A, CGALMesh &B); +void intersect(CGALMesh &A, CGALMesh &B); + +bool does_self_intersect(const TriangleMesh &mesh); +bool does_self_intersect(const CGALMesh &mesh); } diff --git a/src/libslic3r/SLAPrintSteps.cpp b/src/libslic3r/SLAPrintSteps.cpp index 7810a351f7..0c293c7fb6 100644 --- a/src/libslic3r/SLAPrintSteps.cpp +++ b/src/libslic3r/SLAPrintSteps.cpp @@ -143,11 +143,13 @@ void SLAPrint::Steps::drill_holes(SLAPrintObject &po) holes_mesh.merge(sla::to_triangle_mesh(holept.to_mesh())); holes_mesh.require_shared_vertices(); - MeshBoolean::self_union(holes_mesh); + if (!holes_mesh.is_manifold() || MeshBoolean::cgal::does_self_intersect(holes_mesh)) { + MeshBoolean::self_union(holes_mesh); + } try { MeshBoolean::cgal::minus(hollowed_mesh, holes_mesh); - } catch (const std::runtime_error&) { + } catch (const std::runtime_error &) { throw std::runtime_error(L( "Drilling holes into the mesh failed. " "This is usually caused by broken model. Try to fix it first.")); diff --git a/tests/libslic3r/CMakeLists.txt b/tests/libslic3r/CMakeLists.txt index adcb2722d8..97d9b0bc7f 100644 --- a/tests/libslic3r/CMakeLists.txt +++ b/tests/libslic3r/CMakeLists.txt @@ -12,6 +12,7 @@ add_executable(${_TEST_NAME}_tests test_polygon.cpp test_stl.cpp test_meshsimplify.cpp + test_meshboolean.cpp ) if (TARGET OpenVDB::openvdb) diff --git a/tests/libslic3r/test_meshboolean.cpp b/tests/libslic3r/test_meshboolean.cpp new file mode 100644 index 0000000000..97d03ac238 --- /dev/null +++ b/tests/libslic3r/test_meshboolean.cpp @@ -0,0 +1,26 @@ +#include +#include + +#include +#include +#include + +using namespace Slic3r; + +TEST_CASE("CGAL and TriangleMesh conversions", "[MeshBoolean]") { + TriangleMesh sphere = make_sphere(1.); + + auto cgalmesh_ptr = MeshBoolean::cgal::triangle_mesh_to_cgal(sphere); + + REQUIRE(cgalmesh_ptr); + REQUIRE(! MeshBoolean::cgal::does_self_intersect(*cgalmesh_ptr)); + + TriangleMesh M = MeshBoolean::cgal::cgal_to_triangle_mesh(*cgalmesh_ptr); + + REQUIRE(M.its.vertices.size() == sphere.its.vertices.size()); + REQUIRE(M.its.indices.size() == sphere.its.indices.size()); + + REQUIRE(M.volume() == Approx(sphere.volume())); + + REQUIRE(! MeshBoolean::cgal::does_self_intersect(M)); +} From 2d86e3cc4d5c28275af33d106b8eaffefbad4cf2 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Wed, 5 Feb 2020 18:22:17 +0100 Subject: [PATCH 257/336] fix failing test due to missing cgal dlls --- tests/libslic3r/CMakeLists.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/libslic3r/CMakeLists.txt b/tests/libslic3r/CMakeLists.txt index 97d9b0bc7f..d8dac3c10b 100644 --- a/tests/libslic3r/CMakeLists.txt +++ b/tests/libslic3r/CMakeLists.txt @@ -22,5 +22,9 @@ endif() target_link_libraries(${_TEST_NAME}_tests test_common libslic3r) set_property(TARGET ${_TEST_NAME}_tests PROPERTY FOLDER "tests") +if (WIN32) + prusaslicer_copy_dlls(${_TEST_NAME}_tests) +endif() + # catch_discover_tests(${_TEST_NAME}_tests TEST_PREFIX "${_TEST_NAME}: ") add_test(${_TEST_NAME}_tests ${_TEST_NAME}_tests ${CATCH_EXTRA_ARGS}) From 0d5ced60a2faef8d11657cb6a54bad0f4adf5344 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Wed, 5 Feb 2020 22:55:18 +0100 Subject: [PATCH 258/336] DoubleSlider: Implemented "Jump to print Z" functionality on Cog icon click OR using "Shift+G" + One more big code refactoring --- src/slic3r/GUI/DoubleSlider.cpp | 458 ++++++++++++++++++-------------- src/slic3r/GUI/DoubleSlider.hpp | 49 ++-- 2 files changed, 290 insertions(+), 217 deletions(-) diff --git a/src/slic3r/GUI/DoubleSlider.cpp b/src/slic3r/GUI/DoubleSlider.cpp index ff5a565453..a17ba2fe56 100644 --- a/src/slic3r/GUI/DoubleSlider.cpp +++ b/src/slic3r/GUI/DoubleSlider.cpp @@ -19,6 +19,7 @@ #include #include +#include "Field.hpp" namespace Slic3r { @@ -293,7 +294,8 @@ CustomGCode::Info Control::GetTicksValues() const values.emplace_back(t_custom_code{m_values[tick.tick], tick.gcode, tick.extruder, tick.color}); } - custom_gcode_per_print_z.mode = m_force_mode_apply ? m_mode : m_ticks.mode; + if (m_force_mode_apply) + custom_gcode_per_print_z.mode = m_mode; return custom_gcode_per_print_z; } @@ -330,6 +332,18 @@ void Control::SetTicksValues(const CustomGCode::Info& custom_gcode_per_print_z) Update(); } +void Control::SetModeAndOnlyExtruder(const bool is_one_extruder_printed_model, const int only_extruder) +{ + m_mode = !is_one_extruder_printed_model ? t_mode::MultiExtruder : + only_extruder < 0 ? t_mode::SingleExtruder : + t_mode::MultiAsSingle; + if (!m_ticks.mode) + m_ticks.mode = m_mode; + m_only_extruder = only_extruder; + + UseDefaultColors(m_mode == t_mode::SingleExtruder); +} + void Control::get_lower_and_higher_position(int& lower_pos, int& higher_pos) { const double step = get_scroll_step(); @@ -397,9 +411,9 @@ void Control::draw_action_icon(wxDC& dc, const wxPoint pt_beg, const wxPoint pt_ if (tick == 0) return; - wxBitmap* icon = m_is_action_icon_focesed ? &m_bmp_add_tick_off.bmp() : &m_bmp_add_tick_on.bmp(); + wxBitmap* icon = m_focus == fiActionIcon ? &m_bmp_add_tick_off.bmp() : &m_bmp_add_tick_on.bmp(); if (m_ticks.ticks.find(TickCode{tick}) != m_ticks.ticks.end()) - icon = m_is_action_icon_focesed ? &m_bmp_del_tick_off.bmp() : &m_bmp_del_tick_on.bmp(); + icon = m_focus == fiActionIcon ? &m_bmp_del_tick_off.bmp() : &m_bmp_del_tick_on.bmp(); wxCoord x_draw, y_draw; is_horizontal() ? x_draw = pt_beg.x - 0.5*m_tick_icon_dim : y_draw = pt_beg.y - 0.5*m_tick_icon_dim; @@ -667,8 +681,8 @@ void Control::draw_colored_band(wxDC& dc) void Control::draw_one_layer_icon(wxDC& dc) { const wxBitmap& icon = m_is_one_layer ? - m_is_one_layer_icon_focesed ? m_bmp_one_layer_lock_off.bmp() : m_bmp_one_layer_lock_on.bmp() : - m_is_one_layer_icon_focesed ? m_bmp_one_layer_unlock_off.bmp() : m_bmp_one_layer_unlock_on.bmp(); + m_focus == fiOneLayerIcon ? m_bmp_one_layer_lock_off.bmp() : m_bmp_one_layer_lock_on.bmp() : + m_focus == fiOneLayerIcon ? m_bmp_one_layer_unlock_off.bmp() : m_bmp_one_layer_unlock_on.bmp(); int width, height; get_size(&width, &height); @@ -703,9 +717,6 @@ void Control::draw_revert_icon(wxDC& dc) void Control::draw_cog_icon(wxDC& dc) { - if (m_mode != t_mode::MultiExtruder) - return; - int width, height; get_size(&width, &height); @@ -788,73 +799,25 @@ void Control::OnLeftDown(wxMouseEvent& event) return; this->CaptureMouse(); - wxClientDC dc(this); - wxPoint pos = event.GetLogicalPosition(dc); - if (is_point_in_rect(pos, m_rect_tick_action) && m_is_enabled_tick_manipulation) - { - const auto it = m_ticks.ticks.find(TickCode{ m_selection == ssLower ? m_lower_value : m_higher_value }); - if (it == m_ticks.ticks.end()) - m_force_add_tick = true; - else - m_force_delete_tick = true; - return; - } - m_is_left_down = true; - if (is_point_in_rect(pos, m_rect_one_layer_icon)) { - // switch on/off one layer mode - m_is_one_layer = !m_is_one_layer; - if (!m_is_one_layer) { - SetLowerValue(m_min_value); - SetHigherValue(m_max_value); - } - m_selection == ssLower ? correct_lower_value() : correct_higher_value(); - if (!m_selection) m_selection = ssHigher; - } - else if (is_point_in_rect(pos, m_rect_revert_icon) && m_is_enabled_tick_manipulation) { - // discard all color changes - SetLowerValue(m_min_value); - SetHigherValue(m_max_value); - - m_selection == ssLower ? correct_lower_value() : correct_higher_value(); - if (!m_selection) m_selection = ssHigher; - - m_ticks.ticks.clear(); - post_ticks_changed_event(); - } - else if (is_point_in_rect(pos, m_rect_cog_icon) && m_mode == t_mode::MultiExtruder) { - // show dialog for set extruder sequence - m_force_edit_extruder_sequence = true; - return; - } - else - detect_selected_slider(pos); - - if (!m_selection) { - const int tick_val = get_tick_near_point(pos); - /* Set current thumb position to the nearest tick (if it is) - * OR to a value corresponding to the mouse click - * */ - const int mouse_val = tick_val >= 0 && m_is_enabled_tick_manipulation ? tick_val : - get_value_from_position(pos.x, pos.y); - if (mouse_val >= 0) - { - // if (abs(mouse_val - m_lower_value) < abs(mouse_val - m_higher_value)) { - if ( mouse_val <= m_lower_value ) { - SetLowerValue(mouse_val); - correct_lower_value(); - m_selection = ssLower; - } - else { - SetHigherValue(mouse_val); - correct_higher_value(); - m_selection = ssHigher; - } + m_mouse = maNone; + + wxPoint pos = event.GetLogicalPosition(wxClientDC(this)); + + if (is_point_in_rect(pos, m_rect_one_layer_icon)) + m_mouse = maOneLayerIconClick; + else if (is_point_in_rect(pos, m_rect_cog_icon)) + m_mouse = maCogIconClick; + else if (m_is_enabled_tick_manipulation) + { + if (is_point_in_rect(pos, m_rect_tick_action)) { + auto it = m_ticks.ticks.find(TickCode{ m_selection == ssLower ? m_lower_value : m_higher_value }); + m_mouse = it == m_ticks.ticks.end() ? maAddTick : maDeleteTick; } + else if (is_point_in_rect(pos, m_rect_revert_icon)) + m_mouse = maRevertIconClick; } - Refresh(); - Update(); event.Skip(); } @@ -880,24 +843,27 @@ void Control::correct_higher_value() m_lower_value = m_higher_value; } -wxString Control::get_tooltip(FocusItem focused_item, int tick/*=-1*/) +wxString Control::get_tooltip(int tick/*=-1*/) { - if (focused_item == fiNone) + if (m_focus == fiNone) return ""; - if (focused_item == fiOneLayerIcon) + if (m_focus == fiOneLayerIcon) return _(L("One layer mode")); - if (focused_item == fiRevertIcon) + if (m_focus == fiRevertIcon) return _(L("Discard all custom changes")); - if (focused_item == fiCogIcon) - return _(L("Set extruder sequence for whole print")); - if (focused_item == fiColorBand) + if (m_focus == fiCogIcon) + return m_mode == t_mode::MultiAsSingle ? + _(L("For jump to print Z use left mouse button click OR (Shift+G)")) + "\n" + + _(L("For set extruder sequence for whole print use right mouse button click")) : + _(L("Jump to print Z")) + " (Shift+G)"; + if (m_focus == fiColorBand) return m_mode != t_mode::SingleExtruder ? "" : _(L("For edit current color use right mouse button click on colored band")); wxString tooltip; const auto tick_code_it = m_ticks.ticks.find(TickCode{tick}); - if (tick_code_it == m_ticks.ticks.end() && focused_item == fiActionIcon) // tick doesn't exist + if (tick_code_it == m_ticks.ticks.end() && m_focus == fiActionIcon) // tick doesn't exist { // Show mode as a first string of tooltop tooltip = " " + _(L("Slider(print) mode")) + ": "; @@ -960,7 +926,7 @@ wxString Control::get_tooltip(FocusItem focused_item, int tick/*=-1*/) "Check your choice to avoid redundant color changes.")); // Show list of actions with existing tick - if (focused_item == fiActionIcon) + if (m_focus == fiActionIcon) tooltip += "\n\n" + _(L("For Delete tick use left mouse button click OR pres \"-\" key")) + "\n" + ( is_osx ? _(L("For Edit tick use Ctrl + Left mouse button click")) : @@ -991,31 +957,26 @@ void Control::OnMotion(wxMouseEvent& event) { bool action = false; - const wxClientDC dc(this); - const wxPoint pos = event.GetLogicalPosition(dc); - - m_is_one_layer_icon_focesed = is_point_in_rect(pos, m_rect_one_layer_icon); - - FocusItem focused_item = fiNone; + const wxPoint pos = event.GetLogicalPosition(wxClientDC(this)); int tick = -1; - if (!m_is_left_down && !m_is_one_layer) { - m_is_action_icon_focesed = is_point_in_rect(pos, m_rect_tick_action); - if (m_is_one_layer_icon_focesed) - focused_item = fiOneLayerIcon; - else if (m_is_action_icon_focesed) { - focused_item = fiActionIcon; + if (!m_is_left_down && !m_is_one_layer) + { + if (is_point_in_rect(pos, m_rect_one_layer_icon)) + m_focus = fiOneLayerIcon; + else if (is_point_in_rect(pos, m_rect_tick_action)) { + m_focus = fiActionIcon; tick = m_selection == ssLower ? m_lower_value : m_higher_value; } else if (!m_ticks.empty() && is_point_in_rect(pos, m_rect_revert_icon)) - focused_item = fiRevertIcon; + m_focus = fiRevertIcon; else if (is_point_in_rect(pos, m_rect_cog_icon)) - focused_item = fiCogIcon; + m_focus = fiCogIcon; else if (m_mode == t_mode::SingleExtruder && is_point_in_rect(pos, get_colored_band_rect()) && get_edited_tick_for_position(pos) >= 0 ) - focused_item = fiColorBand; + m_focus = fiColorBand; else { - focused_item = fiTick; + m_focus = fiTick; tick = get_tick_near_point(pos); } } @@ -1038,7 +999,7 @@ void Control::OnMotion(wxMouseEvent& event) event.Skip(); // Set tooltips with information for each icon - this->SetToolTip(get_tooltip(focused_item, tick)); + this->SetToolTip(get_tooltip(tick)); if (action) { @@ -1120,21 +1081,27 @@ void Control::OnLeftUp(wxMouseEvent& event) this->ReleaseMouse(); m_is_left_down = false; - if (m_force_delete_tick) - { + switch (m_mouse) { + case maNone : + move_current_thumb_to_pos(event.GetLogicalPosition(wxClientDC(this))); + break; + case maDeleteTick : delete_current_tick(); - m_force_delete_tick = false; - } - else - if (m_force_add_tick) - { + break; + case maAddTick : add_current_tick(); - m_force_add_tick = false; - } - else - if (m_force_edit_extruder_sequence) { - edit_extruder_sequence(); - m_force_edit_extruder_sequence = false; + break; + case maCogIconClick : + jump_to_print_z(); + break; + case maOneLayerIconClick: + switch_one_layer_mode(); + break; + case maRevertIconClick: + discard_all_thicks(); + break; + default : + break; } Refresh(); @@ -1261,6 +1228,8 @@ void Control::OnChar(wxKeyEvent& event) delete_current_tick(); m_ticks.suppress_minus(false); } + if (key == 'G') + jump_to_print_z(); } void Control::OnRightDown(wxMouseEvent& event) @@ -1268,29 +1237,25 @@ void Control::OnRightDown(wxMouseEvent& event) if (HasCapture()) return; this->CaptureMouse(); - const wxClientDC dc(this); + const wxPoint pos = event.GetLogicalPosition(wxClientDC(this)); - wxPoint pos = event.GetLogicalPosition(dc); - if (m_is_enabled_tick_manipulation && is_point_in_rect(pos, m_rect_tick_action)) - { - const int tick = m_selection == ssLower ? m_lower_value : m_higher_value; - if (m_ticks.ticks.find(TickCode{ tick }) == m_ticks.ticks.end()) // if on this Z doesn't exist tick - // show context menu on OnRightUp() - m_show_context_menu = true; - else - // show "Edit" and "Delete" menu on OnRightUp() - m_show_edit_menu = true; - return; + m_mouse = maNone; + if (m_is_enabled_tick_manipulation) { + if (is_point_in_rect(pos, m_rect_tick_action)) + { + const int tick = m_selection == ssLower ? m_lower_value : m_higher_value; + m_mouse = m_ticks.ticks.find(TickCode{ tick }) == m_ticks.ticks.end() ? + maAddMenu : maEditMenu; + } + else if (m_mode == t_mode::SingleExtruder && is_point_in_rect(pos, get_colored_band_rect())) + m_mouse = maForceColorEdit; + else if (m_mode == t_mode::MultiAsSingle && is_point_in_rect(pos, m_rect_cog_icon)) + m_mouse = maCogIconMenu; } - - if (m_is_enabled_tick_manipulation && m_mode == t_mode::SingleExtruder && - is_point_in_rect(pos, get_colored_band_rect())) - { - m_force_color_edit = true; + if (m_mouse != maNone) return; - } - detect_selected_slider(event.GetLogicalPosition(dc)); + detect_selected_slider(pos); if (!m_selection) return; @@ -1396,6 +1361,60 @@ std::set TickCodeInfo::get_used_extruders_for_tick(int tick, int only_extru return used_extruders; } +void Control::get_add_menu(wxMenu* menu) +{ + if (m_mode == t_mode::SingleExtruder) { + append_menu_item(menu, wxID_ANY, _(L("Add color change")) + " (M600)", "", + [this](wxCommandEvent&) { add_code_as_tick(ColorChangeCode); }, "colorchange_add_m", menu); + + UseDefaultColors(false); + } + else { + append_change_extruder_menu_item(menu); + append_add_color_change_menu_item(menu); + } + + append_menu_item(menu, wxID_ANY, _(L("Add pause print")) + " (M601)", "", + [this](wxCommandEvent&) { add_code_as_tick(PausePrintCode); }, "pause_print", menu); + + append_menu_item(menu, wxID_ANY, _(L("Add custom G-code")), "", + [this](wxCommandEvent&) { add_code_as_tick(""); }, "edit_gcode", menu); +} + +void Control::get_edit_menu(wxMenu* menu) +{ + std::set::iterator it = m_ticks.ticks.find(TickCode{ m_selection == ssLower ? m_lower_value : m_higher_value }); + + if (it->gcode == ToolChangeCode) { + if (m_mode == t_mode::MultiAsSingle) + append_change_extruder_menu_item(menu); + append_add_color_change_menu_item(menu, true); + } + else + append_menu_item( menu, wxID_ANY, it->gcode == ColorChangeCode ? _(L("Edit color")) : + it->gcode == PausePrintCode ? _(L("Edit pause print message")) : + _(L("Edit custom G-code")), "", + [this](wxCommandEvent&) { edit_tick(); }, "edit_uni", menu); + + if (it->gcode == ColorChangeCode && m_mode == t_mode::MultiAsSingle) + append_change_extruder_menu_item(menu, true); + + append_menu_item( menu, wxID_ANY, it->gcode == ColorChangeCode ? _(L("Delete color change")) : + it->gcode == ToolChangeCode ? _(L("Delete tool change")) : + it->gcode == PausePrintCode ? _(L("Delete pause print")) : + _(L("Delete custom G-code")), "", + [this](wxCommandEvent&) { delete_current_tick();}, "colorchange_del_f", menu); +} + +void Control::get_cog_icon_menu(wxMenu* menu) +{ + append_menu_item(menu, wxID_ANY, _(L("Jump to print Z")) + " (Shift+G)", "", + [this](wxCommandEvent&) { jump_to_print_z(); }, "", menu); + + append_menu_item(menu, wxID_ANY, _(L("Set extruder sequence for whole print")), "", + [this](wxCommandEvent&) { edit_extruder_sequence(); }, "", menu); +} + void Control::OnRightUp(wxMouseEvent& event) { if (!HasCapture()) @@ -1403,73 +1422,25 @@ void Control::OnRightUp(wxMouseEvent& event) this->ReleaseMouse(); m_is_right_down = m_is_one_layer = false; - if (m_show_context_menu) { - wxMenu menu; - - if (m_mode == t_mode::SingleExtruder) { - append_menu_item(&menu, wxID_ANY, _(L("Add color change")) + " (M600)", "", - [this](wxCommandEvent&) { add_code_as_tick(ColorChangeCode); }, "colorchange_add_m", &menu, - [](){return true;}, this); - - UseDefaultColors(false); - } - else - { - append_change_extruder_menu_item(&menu); - append_add_color_change_menu_item(&menu); - } - - append_menu_item(&menu, wxID_ANY, _(L("Add pause print")) + " (M601)", "", - [this](wxCommandEvent&) { add_code_as_tick(PausePrintCode); }, "pause_print", &menu, - []() {return true; }, this); - - append_menu_item(&menu, wxID_ANY, _(L("Add custom G-code")), "", - [this](wxCommandEvent&) { add_code_as_tick(""); }, "edit_gcode", &menu, - []() {return true; }, this); - - GUI::wxGetApp().plater()->PopupMenu(&menu); - - m_show_context_menu = false; - } - else if (m_show_edit_menu) { - wxMenu menu; - - std::set::iterator it = m_ticks.ticks.find(TickCode{ m_selection == ssLower ? m_lower_value : m_higher_value }); - - if (it->gcode == ToolChangeCode) { - if (m_mode == t_mode::MultiAsSingle) - append_change_extruder_menu_item(&menu); - append_add_color_change_menu_item(&menu, true); - } - else - append_menu_item(&menu, wxID_ANY, it->gcode == ColorChangeCode ? _(L("Edit color")) : - it->gcode == PausePrintCode ? _(L("Edit pause print message")) : - _(L("Edit custom G-code")), "", - [this](wxCommandEvent&) { edit_tick(); }, "edit_uni", &menu, []() {return true; }, this); - - if (it->gcode == ColorChangeCode && m_mode == t_mode::MultiAsSingle) - append_change_extruder_menu_item(&menu, true); - - append_menu_item(&menu, wxID_ANY, it->gcode == ColorChangeCode ? _(L("Delete color change")) : - it->gcode == ToolChangeCode ? _(L("Delete tool change")) : - it->gcode == PausePrintCode ? _(L("Delete pause print")) : - _(L("Delete custom G-code")), "", - [this](wxCommandEvent&) { delete_current_tick();}, "colorchange_del_f", &menu, []() {return true; }, this); - - GUI::wxGetApp().plater()->PopupMenu(&menu); - - m_show_edit_menu = false; - } - else if (m_force_color_edit) + if (m_mouse == maForceColorEdit) { - const wxClientDC dc(this); - wxPoint pos = event.GetLogicalPosition(dc); - + wxPoint pos = event.GetLogicalPosition(wxClientDC(this)); int edited_tick = get_edited_tick_for_position(pos); if (edited_tick >= 0) edit_tick(edited_tick); + } + else + { + wxMenu menu; - m_force_color_edit = false; + if (m_mouse == maAddMenu) + get_add_menu(&menu); + else if (m_mouse == maEditMenu) + get_edit_menu(&menu); + else if (m_mouse == maCogIconMenu) + get_cog_icon_menu(&menu); + + GUI::wxGetApp().plater()->PopupMenu(&menu); } Refresh(); @@ -1494,9 +1465,11 @@ static std::string get_new_color(const std::string& color) return ""; } -// To avoid get an empty string from wxTextEntryDialog -// Let disable OK button, if TextCtrl is empty -static void upgrade_text_entry_dialog(wxTextEntryDialog* dlg) +/* To avoid get an empty string from wxTextEntryDialog + * Let disable OK button, if TextCtrl is empty + * OR input value is our of range (min..max), when min a nd max are positive + * */ +static void upgrade_text_entry_dialog(wxTextEntryDialog* dlg, double min = -1.0, double max = -1.0) { // detect TextCtrl and OK button wxTextCtrl* textctrl {nullptr}; @@ -1511,8 +1484,19 @@ static void upgrade_text_entry_dialog(wxTextEntryDialog* dlg) return; wxButton* btn_OK = static_cast(dlg->FindWindowById(wxID_OK)); - btn_OK->Bind(wxEVT_UPDATE_UI, [textctrl](wxUpdateUIEvent& evt) { - evt.Enable(!textctrl->IsEmpty()); + btn_OK->Bind(wxEVT_UPDATE_UI, [textctrl, min, max](wxUpdateUIEvent& evt) + { + bool disable = textctrl->IsEmpty(); + if (!disable && min >= 0.0 && max >= 0.0) + { + double value = -1.0; + if (!textctrl->GetValue().ToCDouble(&value)) // input value couldn't be converted to double + disable = true; + else + disable = value < min || value > max; // is input value is out of valid range ? + } + + evt.Enable(!disable); }, btn_OK->GetId()); } @@ -1548,6 +1532,23 @@ static std::string get_pause_print_msg(const std::string& msg_in, double height) return into_u8(dlg.GetValue()); } +static double get_print_z_to_jump(double active_print_z, double min_z, double max_z) +{ + wxString msg_text = _(L("Enter print z value to jump to")) + " :"; + wxString msg_header = _(L("Jump to print z")); + wxString msg_in = GUI::double_to_string(active_print_z); + + // get custom gcode + wxTextEntryDialog dlg(nullptr, msg_text, msg_header, msg_in, wxTextEntryDialogStyle); + upgrade_text_entry_dialog(&dlg, min_z, max_z); + + if (dlg.ShowModal() != wxID_OK || dlg.GetValue().IsEmpty()) + return -1.0; + + double value = -1.0; + return dlg.GetValue().ToCDouble(&value) ? value : -1.0; +} + void Control::add_code_as_tick(std::string code, int selected_extruder/* = -1*/) { if (m_selection == ssUndef) @@ -1649,6 +1650,55 @@ void Control::edit_tick(int tick/* = -1*/) post_ticks_changed_event(code); } +// switch on/off one layer mode +void Control::switch_one_layer_mode() +{ + m_is_one_layer = !m_is_one_layer; + if (!m_is_one_layer) { + SetLowerValue(m_min_value); + SetHigherValue(m_max_value); + } + m_selection == ssLower ? correct_lower_value() : correct_higher_value(); + if (!m_selection) m_selection = ssHigher; +} + +// discard all custom changes on DoubleSlider +void Control::discard_all_thicks() +{ + SetLowerValue(m_min_value); + SetHigherValue(m_max_value); + + m_selection == ssLower ? correct_lower_value() : correct_higher_value(); + if (!m_selection) m_selection = ssHigher; + + m_ticks.ticks.clear(); + post_ticks_changed_event(); + +} + +// Set current thumb position to the nearest tick (if it is) +// OR to a value corresponding to the mouse click (pos) +void Control::move_current_thumb_to_pos(wxPoint pos) +{ + const int tick_val = get_tick_near_point(pos); + const int mouse_val = tick_val >= 0 && m_is_enabled_tick_manipulation ? tick_val : + get_value_from_position(pos); + if (mouse_val >= 0) + { + // if (abs(mouse_val - m_lower_value) < abs(mouse_val - m_higher_value)) { + if (mouse_val <= m_lower_value) { + SetLowerValue(mouse_val); + correct_lower_value(); + m_selection = ssLower; + } + else { + SetHigherValue(mouse_val); + correct_higher_value(); + m_selection = ssHigher; + } + } +} + void Control::edit_extruder_sequence() { if (!check_ticks_changed_event(ToolChangeCode)) @@ -1698,6 +1748,22 @@ void Control::edit_extruder_sequence() post_ticks_changed_event(ToolChangeCode); } +void Control::jump_to_print_z() +{ + double print_z = get_print_z_to_jump(m_values[m_selection == ssLower ? m_lower_value : m_higher_value], + m_values[m_min_value], m_values[m_max_value]); + if (print_z < 0) + return; + + auto it = std::lower_bound(m_values.begin(), m_values.end(), print_z - epsilon()); + int tick_value = it - m_values.begin(); + + if (m_selection == ssLower) + SetLowerValue(tick_value); + else + SetHigherValue(tick_value); +} + void Control::post_ticks_changed_event(const std::string& gcode /*= ""*/) { m_force_mode_apply = (gcode.empty() || gcode == ColorChangeCode || gcode == ToolChangeCode); diff --git a/src/slic3r/GUI/DoubleSlider.hpp b/src/slic3r/GUI/DoubleSlider.hpp index 86c0251313..78c568eb42 100644 --- a/src/slic3r/GUI/DoubleSlider.hpp +++ b/src/slic3r/GUI/DoubleSlider.hpp @@ -33,7 +33,7 @@ enum SelectedSlider { ssHigher }; -enum FocusItem { +enum FocusedItem { fiNone, fiRevertIcon, fiOneLayerIcon, @@ -52,6 +52,20 @@ enum ConflictType ctRedundant }; +enum MouseAction +{ + maNone, + maAddMenu, // show "Add" context menu for NOTexist active tick + maEditMenu, // show "Edit" context menu for exist active tick + maCogIconMenu, // show context for "cog" icon + maForceColorEdit, // force color editing from colored band + maAddTick, // force tick adding + maDeleteTick, // force tick deleting + maCogIconClick, // LeftMouseClick on "cog" icon + maOneLayerIconClick, // LeftMouseClick on "one_layer" icon + maRevertIconClick, // LeftMouseClick on "revert" icon +}; + using t_mode = CustomGCode::Mode; struct TickCode @@ -188,17 +202,7 @@ public: void SetManipulationMode(t_mode mode) { m_mode = mode; } t_mode GetManipulationMode() const { return m_mode; } - void SetModeAndOnlyExtruder(const bool is_one_extruder_printed_model, const int only_extruder) - { - m_mode = !is_one_extruder_printed_model ? t_mode::MultiExtruder : - only_extruder < 0 ? t_mode::SingleExtruder : - t_mode::MultiAsSingle; - if (!m_ticks.mode) - m_ticks.mode = m_mode; - m_only_extruder = only_extruder; - - UseDefaultColors(m_mode == t_mode::SingleExtruder); - } + void SetModeAndOnlyExtruder(const bool is_one_extruder_printed_model, const int only_extruder); bool is_horizontal() const { return m_style == wxSL_HORIZONTAL; } bool is_one_layer() const { return m_is_one_layer; } @@ -226,7 +230,14 @@ public: // delete current tick, when press "-" void delete_current_tick(); void edit_tick(int tick = -1); + void switch_one_layer_mode(); + void discard_all_thicks(); + void move_current_thumb_to_pos(wxPoint pos); void edit_extruder_sequence(); + void jump_to_print_z(); + void get_add_menu(wxMenu *menu); + void get_edit_menu(wxMenu *menu); + void get_cog_icon_menu(wxMenu *menu); ExtrudersSequence m_extruders_sequence; @@ -268,7 +279,7 @@ private: wxSize get_size(); void get_size(int *w, int *h); double get_double_value(const SelectedSlider& selection); - wxString get_tooltip(FocusItem focused_item, int tick = -1); + wxString get_tooltip(int tick = -1); int get_edited_tick_for_position(wxPoint pos, const std::string& gcode = ColorChangeCode); std::string get_color_for_tool_change_tick(std::set::const_iterator it) const; @@ -310,19 +321,15 @@ private: bool m_is_right_down = false; bool m_is_one_layer = false; bool m_is_focused = false; - bool m_is_action_icon_focesed = false; - bool m_is_one_layer_icon_focesed = false; bool m_is_enabled_tick_manipulation = true; - bool m_show_context_menu = false; - bool m_show_edit_menu = false; - bool m_force_edit_extruder_sequence = false; bool m_force_mode_apply = true; - bool m_force_add_tick = false; - bool m_force_delete_tick = false; - bool m_force_color_edit = false; + t_mode m_mode = t_mode::SingleExtruder; int m_only_extruder = -1; + MouseAction m_mouse = maNone; + FocusedItem m_focus = fiNone; + wxRect m_rect_lower_thumb; wxRect m_rect_higher_thumb; wxRect m_rect_tick_action; From b31244cc3599cac076b5d1e4a3e6ae8d1d709c5d Mon Sep 17 00:00:00 2001 From: Slic3rPE Date: Wed, 5 Feb 2020 16:04:05 +0100 Subject: [PATCH 259/336] linux/osx bug fix checking file path --- src/slic3r/GUI/RemovableDriveManager.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/slic3r/GUI/RemovableDriveManager.cpp b/src/slic3r/GUI/RemovableDriveManager.cpp index e5e228ef15..aa7a3d6a31 100644 --- a/src/slic3r/GUI/RemovableDriveManager.cpp +++ b/src/slic3r/GUI/RemovableDriveManager.cpp @@ -374,6 +374,11 @@ std::string RemovableDriveManager::get_drive_from_path(const std::string& path) { std::size_t found = path.find_last_of("/"); std::string new_path = found == path.size() - 1 ? path.substr(0, found) : path; + + // trim the filename + found = new_path.find_last_of("/"); + new_path = new_path.substr(0, found); + //check if same filesystem for (auto it = m_current_drives.begin(); it != m_current_drives.end(); ++it) { From 34588f365d8814f3eab4df22ce2f3222d9fca385 Mon Sep 17 00:00:00 2001 From: bubnikv Date: Thu, 6 Feb 2020 10:17:02 +0100 Subject: [PATCH 260/336] For the builds with a label assigned (no commit after the label), show just the label in the application title. For Win32, add the " 32 bit" indicator, so that we may see clearly if somebody is running a 32bit build on 64bit windows by a mistake. --- src/slic3r/GUI/MainFrame.cpp | 19 ++++++++++++++++--- src/slic3r/GUI/MainFrame.hpp | 2 +- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/src/slic3r/GUI/MainFrame.cpp b/src/slic3r/GUI/MainFrame.cpp index b05155ef2e..b730dc8238 100644 --- a/src/slic3r/GUI/MainFrame.cpp +++ b/src/slic3r/GUI/MainFrame.cpp @@ -145,8 +145,6 @@ DPIFrame(NULL, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, wxDEFAULT_FRAME_S update_ui_from_settings(); // FIXME (?) } -MainFrame::~MainFrame() = default; - void MainFrame::update_title() { wxString title = wxEmptyString; @@ -158,7 +156,22 @@ void MainFrame::update_title() if (!project.empty()) title += (project + " - "); } - title += (wxString(SLIC3R_BUILD_ID) + " " + _(L("based on Slic3r"))); + + std::string build_id = SLIC3R_BUILD_ID; + size_t idx_plus = build_id.find('+'); + if (idx_plus != build_id.npos) { + // Parse what is behind the '+'. If there is a number, then it is a build number after the label, and full build ID is shown. + int commit_after_label; + if (! boost::starts_with(build_id.data() + idx_plus + 1, "UNKNOWN") && sscanf(build_id.data() + idx_plus + 1, "%d-", &commit_after_label) == 0) { + // It is a release build. + build_id.erase(build_id.begin() + idx_plus, build_id.end()); +#if defined(_WIN32) && ! defined(_WIN64) + // People are using 32bit slicer on a 64bit machine by mistake. Make it explicit. + build_id += " 32 bit" +#endif + } + } + title += (wxString(build_id) + " " + _(L("based on Slic3r"))); SetTitle(title); } diff --git a/src/slic3r/GUI/MainFrame.hpp b/src/slic3r/GUI/MainFrame.hpp index 3d4818eaf5..a6d0749ab6 100644 --- a/src/slic3r/GUI/MainFrame.hpp +++ b/src/slic3r/GUI/MainFrame.hpp @@ -96,7 +96,7 @@ protected: public: MainFrame(); - ~MainFrame(); + ~MainFrame() = default; Plater* plater() { return m_plater; } From bfea105c2e5999cabad6dbae6473c3663f2ee7a1 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Thu, 6 Feb 2020 10:39:42 +0100 Subject: [PATCH 261/336] Fixed mmissing #if ENABLE_SHOW_SCENE_LABELS --- src/slic3r/GUI/GLCanvas3D.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index c2875a93fa..a88dbec497 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -1442,7 +1442,9 @@ GLCanvas3D::GLCanvas3D(wxGLCanvas* canvas, Bed3D& bed, Camera& camera, GLToolbar , m_show_picking_texture(false) #endif // ENABLE_RENDER_PICKING_PASS , m_render_sla_auxiliaries(true) +#if ENABLE_SHOW_SCENE_LABELS , m_labels(*this) +#endif // ENABLE_SHOW_SCENE_LABELS { if (m_canvas != nullptr) { m_timer.SetOwner(m_canvas); From adf60d593164901b1e3706a8f5b0ad640cc6139d Mon Sep 17 00:00:00 2001 From: bubnikv Date: Thu, 6 Feb 2020 11:00:27 +0100 Subject: [PATCH 262/336] Fix of the new top / bottom shell thickness hint. --- src/slic3r/GUI/PresetHints.cpp | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/slic3r/GUI/PresetHints.cpp b/src/slic3r/GUI/PresetHints.cpp index 71db6d35b2..cd3554bc40 100644 --- a/src/slic3r/GUI/PresetHints.cpp +++ b/src/slic3r/GUI/PresetHints.cpp @@ -288,14 +288,13 @@ std::string PresetHints::top_bottom_shell_thickness_explanation(const PresetBund int bottom_solid_layers = print_config.opt_int("bottom_solid_layers"); bool has_top_layers = top_solid_layers > 0; bool has_bottom_layers = bottom_solid_layers > 0; - bool has_shell = has_top_layers && has_bottom_layers; double top_solid_min_thickness = print_config.opt_float("top_solid_min_thickness"); double bottom_solid_min_thickness = print_config.opt_float("bottom_solid_min_thickness"); double layer_height = print_config.opt_float("layer_height"); bool variable_layer_height = printer_config.opt_bool("variable_layer_height"); //FIXME the following lines take into account the 1st extruder only. - double min_layer_height = (has_shell && variable_layer_height) ? Slicing::min_layer_height_from_nozzle(printer_config, 1) : layer_height; - double max_layer_height = (has_shell && variable_layer_height) ? Slicing::max_layer_height_from_nozzle(printer_config, 1) : layer_height; + double min_layer_height = variable_layer_height ? Slicing::min_layer_height_from_nozzle(printer_config, 1) : layer_height; + double max_layer_height = variable_layer_height ? Slicing::max_layer_height_from_nozzle(printer_config, 1) : layer_height; if (layer_height <= 0.f) { out += _utf8(L("Top / bottom shell thickness hint: Not available due to invalid layer height.")); @@ -316,7 +315,10 @@ std::string PresetHints::top_bottom_shell_thickness_explanation(const PresetBund out += " "; out += (boost::format(_utf8(L("Minimum top shell thickness is %1% mm."))) % top_shell_thickness_minimum).str(); } - } + } else + out += _utf8(L("Top is open.")); + + out += "\n"; if (has_bottom_layers) { double bottom_shell_thickness = bottom_solid_layers * layer_height; @@ -327,14 +329,13 @@ std::string PresetHints::top_bottom_shell_thickness_explanation(const PresetBund bottom_shell_thickness = n * layer_height; } double bottom_shell_thickness_minimum = std::max(bottom_solid_min_thickness, bottom_solid_layers * min_layer_height); - if (! out.empty()) - out += "\n"; out += (boost::format(_utf8(L("Bottom shell is %1% mm thick for layer height %2% mm."))) % bottom_shell_thickness % layer_height).str(); if (variable_layer_height && bottom_shell_thickness_minimum < bottom_shell_thickness) { out += " "; out += (boost::format(_utf8(L("Minimum bottom shell thickness is %1% mm."))) % bottom_shell_thickness_minimum).str(); } - } + } else + out += _utf8(L("Bottom is open.")); return out; } From e21c5b24189d9b2056ebd7495b197b2d63619fa7 Mon Sep 17 00:00:00 2001 From: David Kocik Date: Thu, 6 Feb 2020 11:32:45 +0100 Subject: [PATCH 263/336] formating of forced update dialog --- src/slic3r/GUI/UpdateDialogs.cpp | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/src/slic3r/GUI/UpdateDialogs.cpp b/src/slic3r/GUI/UpdateDialogs.cpp index b152ed135f..3581a55b12 100644 --- a/src/slic3r/GUI/UpdateDialogs.cpp +++ b/src/slic3r/GUI/UpdateDialogs.cpp @@ -162,24 +162,20 @@ MsgUpdateForced::MsgUpdateForced(const std::vector& updates) : const auto lang_code = wxGetApp().current_language_code_safe().ToStdString(); - auto* versions = new wxBoxSizer(wxVERTICAL); + auto* versions = new wxFlexGridSizer(2, 0, VERT_SPACING); for (const auto& update : updates) { - auto* flex = new wxFlexGridSizer(2, 0, VERT_SPACING); - auto* text_vendor = new wxStaticText(this, wxID_ANY, update.vendor); text_vendor->SetFont(boldfont); - flex->Add(text_vendor); - flex->Add(new wxStaticText(this, wxID_ANY, update.version.to_string())); + versions->Add(text_vendor); + versions->Add(new wxStaticText(this, wxID_ANY, update.version.to_string())); if (!update.comment.empty()) { - flex->Add(new wxStaticText(this, wxID_ANY, _(L("Comment:"))), 0, wxALIGN_RIGHT); + versions->Add(new wxStaticText(this, wxID_ANY, _(L("Comment:")))/*, 0, wxALIGN_RIGHT*/);//uncoment if align to right (might not look good if 1 vedor name is longer than other names) auto* update_comment = new wxStaticText(this, wxID_ANY, from_u8(update.comment)); update_comment->Wrap(CONTENT_WIDTH * wxGetApp().em_unit()); - flex->Add(update_comment); + versions->Add(update_comment); } - versions->Add(flex); - if (!update.changelog_url.empty() && update.version.prerelease() == nullptr) { auto* line = new wxBoxSizer(wxHORIZONTAL); auto changelog_url = (boost::format(update.changelog_url) % lang_code).str(); From 2e039d3955a5f8d47abdd46e9a0c505b1f477dd6 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Thu, 6 Feb 2020 11:59:02 +0100 Subject: [PATCH 264/336] Fix dll copying --- CMakeLists.txt | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index bc0c808695..878f2373ed 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -440,16 +440,25 @@ function(prusaslicer_copy_dlls target) set(_bits 32) endif () - get_target_property(_out_dir ${target} BINARY_DIR) + get_property(_is_multi GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) + get_target_property(_alt_out_dir ${target} RUNTIME_OUTPUT_DIRECTORY) + + if (_alt_out_dir) + set (_out_dir "${_alt_out_dir}") + elseif (_is_multi) + set (_out_dir "$/$") + else () + set (_out_dir "$") + endif () # This has to be a separate target due to the windows command line lenght limits add_custom_command(TARGET ${target} POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy ${TOP_LEVEL_PROJECT_DIR}/deps/GMP/gmp/lib/win${_bits}/libgmp-10.dll ${_out_dir}/ + COMMAND ${CMAKE_COMMAND} -E copy ${TOP_LEVEL_PROJECT_DIR}/deps/GMP/gmp/lib/win${_bits}/libgmp-10.dll ${_out_dir} COMMENT "Copy gmp runtime to build tree" VERBATIM) add_custom_command(TARGET ${target} POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy ${TOP_LEVEL_PROJECT_DIR}/deps/MPFR/mpfr/lib/win${_bits}/libmpfr-4.dll ${_out_dir}/ + COMMAND ${CMAKE_COMMAND} -E copy ${TOP_LEVEL_PROJECT_DIR}/deps/MPFR/mpfr/lib/win${_bits}/libmpfr-4.dll ${_out_dir} COMMENT "Copy mpfr runtime to build tree" VERBATIM) From 3981e25f7511a4792db9748f58513227208a5c38 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Thu, 6 Feb 2020 12:06:39 +0100 Subject: [PATCH 265/336] Fixed labels auto-sizing --- src/slic3r/GUI/GLCanvas3D.cpp | 3 +-- src/slic3r/GUI/GUI_ObjectList.cpp | 2 ++ 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index a88dbec497..4096e99c43 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -1362,8 +1362,7 @@ void GLCanvas3D::Labels::render(const std::vector& sorted_ } // force re-render while the windows gets to its final size (it takes several frames) - float content_w = 1 + ImGui::GetWindowContentRegionWidth(); - if (content_w < label_len) + if (ImGui::GetWindowContentRegionWidth() + 2.0f * ImGui::GetStyle().WindowPadding.x != ImGui::CalcWindowExpectedSize(ImGui::GetCurrentWindow()).x) m_canvas.request_extra_frame(); imgui.end(); diff --git a/src/slic3r/GUI/GUI_ObjectList.cpp b/src/slic3r/GUI/GUI_ObjectList.cpp index d630f152f1..c07d50a0e2 100644 --- a/src/slic3r/GUI/GUI_ObjectList.cpp +++ b/src/slic3r/GUI/GUI_ObjectList.cpp @@ -3905,6 +3905,8 @@ void ObjectList::OnEditingDone(wxDataViewEvent &event) // Here the last active column is forgotten, so when leaving the editing mode, the next mouse click will not enter the editing mode of the newly selected column. m_last_selected_column = -1; #endif //__WXMSW__ + + wxGetApp().plater()->set_current_canvas_as_dirty(); } void ObjectList::show_multi_selection_menu() From fb235cb6756f5dd122cea32b336e35dd70ea4238 Mon Sep 17 00:00:00 2001 From: bubnikv Date: Thu, 6 Feb 2020 14:03:18 +0100 Subject: [PATCH 266/336] Color change - handling Color Change data stored for different printer configuration: ss -> sm : Just apply the color changes of the original ss project at the active extruder. ss -> mm : There are no tool changes stored. Ignore color changes, they are invalid because they are extruder non-specific. sm -> ss : Apply tool changes as color changes (tool changes remember the target color), apply original color changes. sm -> mm : Ignore both color changes and tool changes. mm -> ss/sm : Ignore both color changes and tool changes. --- src/libslic3r/GCode.cpp | 24 ++++++++++++++-------- src/libslic3r/GCode/ToolOrdering.cpp | 30 +++++++++++++++++++++------- src/libslic3r/Print.cpp | 6 +++++- src/slic3r/GUI/GLCanvas3D.cpp | 2 +- 4 files changed, 45 insertions(+), 17 deletions(-) diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index eafe66a086..8e47615405 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -1774,7 +1774,7 @@ namespace ProcessLayer const CustomGCode::Item *custom_gcode, // ID of the first extruder printing this layer. unsigned int first_extruder_id, - bool single_material_print) + bool single_extruder_printer) { std::string gcode; @@ -1782,31 +1782,39 @@ namespace ProcessLayer // Extruder switches are processed by LayerTools, they should be filtered out. assert(custom_gcode->gcode != ToolChangeCode); - const std::string &custom_code = custom_gcode->gcode; + const std::string &custom_code = custom_gcode->gcode; + bool color_change = custom_code == ColorChangeCode; + bool tool_change = custom_code == ToolChangeCode; + // Tool Change is applied as Color Change for a single extruder printer only. + assert(! tool_change || single_extruder_printer); + std::string pause_print_msg; int m600_extruder_before_layer = -1; - if (custom_code == ColorChangeCode && custom_gcode->extruder > 0) + if (color_change && custom_gcode->extruder > 0) m600_extruder_before_layer = custom_gcode->extruder - 1; else if (custom_code == PausePrintCode) pause_print_msg = custom_gcode->color; - // we should add or not colorprint_change in respect to nozzle_diameter count instead of really used extruders count - if (custom_code == ColorChangeCode) // color change + // we should add or not colorprint_change in respect to nozzle_diameter count instead of really used extruders count + if (color_change || tool_change) { + // Color Change or Tool Change as Color Change. // add tag for analyzer gcode += "; " + GCodeAnalyzer::Color_Change_Tag + ",T" + std::to_string(m600_extruder_before_layer) + "\n"; // add tag for time estimator gcode += "; " + GCodeTimeEstimator::Color_Change_Tag + "\n"; - if (!single_material_print && m600_extruder_before_layer >= 0 && first_extruder_id != m600_extruder_before_layer + if (!single_extruder_printer && m600_extruder_before_layer >= 0 && first_extruder_id != m600_extruder_before_layer // && !MMU1 ) { //! FIXME_in_fw show message during print pause gcode += "M601\n"; // pause print gcode += "M117 Change filament for Extruder " + std::to_string(m600_extruder_before_layer) + "\n"; } - else - gcode += custom_code + "\n"; + else { + gcode += ColorChangeCode; + gcode += "\n"; + } } else { diff --git a/src/libslic3r/GCode/ToolOrdering.cpp b/src/libslic3r/GCode/ToolOrdering.cpp index f5ff33e412..db7c58a9ce 100644 --- a/src/libslic3r/GCode/ToolOrdering.cpp +++ b/src/libslic3r/GCode/ToolOrdering.cpp @@ -130,7 +130,8 @@ ToolOrdering::ToolOrdering(const Print &print, unsigned int first_extruder, bool // Do it only if all the objects were configured to be printed with a single extruder. std::vector> per_layer_extruder_switches; if (auto num_extruders = unsigned(print.config().nozzle_diameter.size()); - num_extruders > 1 && print.object_extruders().size() == 1) { + num_extruders > 1 && print.object_extruders().size() == 1 && // the current Print's configuration is CustomGCode::MultiAsSingle + print.model().custom_gcode_per_print_z.mode == CustomGCode::MultiAsSingle) { // Printing a single extruder platter on a printer with more than 1 extruder (or single-extruder multi-material). // There may be custom per-layer tool changes available at the model. per_layer_extruder_switches = custom_tool_changes(print.model().custom_gcode_per_print_z, num_extruders); @@ -466,11 +467,19 @@ void ToolOrdering::assign_custom_gcodes(const Print &print) if (custom_gcode_per_print_z.gcodes.empty()) return; - unsigned int num_extruders = *std::max_element(m_all_printing_extruders.begin(), m_all_printing_extruders.end()) + 1; - std::vector extruder_printing_above(num_extruders, false); - auto custom_gcode_it = custom_gcode_per_print_z.gcodes.rbegin(); + auto num_extruders = unsigned(print.config().nozzle_diameter.size()); + CustomGCode::Mode mode = + (num_extruders == 1) ? CustomGCode::SingleExtruder : + print.object_extruders().size() == 1 ? CustomGCode::MultiAsSingle : CustomGCode::MultiExtruder; + CustomGCode::Mode model_mode = print.model().custom_gcode_per_print_z.mode; + std::vector extruder_printing_above(num_extruders, false); + auto custom_gcode_it = custom_gcode_per_print_z.gcodes.rbegin(); + // Tool changes and color changes will be ignored, if the model's tool/color changes were entered in mm mode and the print is in non mm mode + // or vice versa. + bool ignore_tool_and_color_changes = (mode == CustomGCode::MultiExtruder) != (model_mode == CustomGCode::MultiExtruder); // If printing on a single extruder machine, make the tool changes trigger color change (M600) events. - bool tool_changes_as_color_changes = num_extruders == 1; + bool tool_changes_as_color_changes = mode == CustomGCode::SingleExtruder && model_mode == CustomGCode::MultiAsSingle; + // From the last layer to the first one: for (auto it_lt = m_layer_tools.rbegin(); it_lt != m_layer_tools.rend(); ++ it_lt) { LayerTools < = *it_lt; @@ -490,9 +499,16 @@ void ToolOrdering::assign_custom_gcodes(const Print &print) print_z_below = it_lt_below->print_z; if (custom_gcode.print_z > print_z_below + 0.5 * EPSILON) { // The custom G-code applies to the current layer. - if ( tool_changes_as_color_changes || custom_gcode.gcode != ColorChangeCode || - (custom_gcode.extruder <= int(num_extruders) && extruder_printing_above[unsigned(custom_gcode.extruder - 1)])) + bool color_change = custom_gcode.gcode == ColorChangeCode; + bool tool_change = custom_gcode.gcode == ToolChangeCode; + bool pause_or_custom_gcode = ! color_change && ! tool_change; + bool apply_color_change = ! ignore_tool_and_color_changes && // If it is color change, it will actually be useful as the exturder above will print. + (color_change ? + mode == CustomGCode::SingleExtruder || + (custom_gcode.extruder <= int(num_extruders) && extruder_printing_above[unsigned(custom_gcode.extruder - 1)]) : + tool_change && tool_changes_as_color_changes); + if (pause_or_custom_gcode || apply_color_change) lt.custom_gcode = &custom_gcode; // Consume that custom G-code event. ++ custom_gcode_it; diff --git a/src/libslic3r/Print.cpp b/src/libslic3r/Print.cpp index 3f8fd9b40c..6f61657a52 100644 --- a/src/libslic3r/Print.cpp +++ b/src/libslic3r/Print.cpp @@ -709,7 +709,11 @@ Print::ApplyStatus Print::apply(const Model &model, DynamicPrintConfig new_full_ model_object_status.emplace(model_object->id(), ModelObjectStatus::New); } else { if (m_model.custom_gcode_per_print_z != model.custom_gcode_per_print_z) { - update_apply_status(custom_per_printz_gcodes_tool_changes_differ(m_model.custom_gcode_per_print_z.gcodes, model.custom_gcode_per_print_z.gcodes) ? + update_apply_status(num_extruders_changed || + // Tool change G-codes are applied as color changes for a single extruder printer, no need to invalidate tool ordering. + //FIXME The tool ordering may be invalidated unnecessarily if the custom_gcode_per_print_z.mode is not applicable + // to the active print / model state, and then it is reset, so it is being applicable, but empty, thus the effect is the same. + (num_extruders > 1 && custom_per_printz_gcodes_tool_changes_differ(m_model.custom_gcode_per_print_z.gcodes, model.custom_gcode_per_print_z.gcodes)) ? // The Tool Ordering and the Wipe Tower are no more valid. this->invalidate_steps({ psWipeTower, psGCodeExport }) : // There is no change in Tool Changes stored in custom_gcode_per_print_z, therefore there is no need to update Tool Ordering. diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 4096e99c43..fd6b96f06b 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -5100,7 +5100,7 @@ void GLCanvas3D::_render_overlays() const #if ENABLE_SHOW_SCENE_LABELS const ConfigOptionBool* opt = dynamic_cast(m_config->option("complete_objects")); - bool sequential_print = (opt != nullptr) ? m_config->opt_bool("complete_objects") : false; + bool sequential_print = opt != nullptr && opt->value; std::vector sorted_instances; if (sequential_print) { const Print* print = fff_print(); From f902fc3445bd84957253de803884fbb99fc36383 Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Thu, 6 Feb 2020 14:23:03 +0100 Subject: [PATCH 267/336] Don't forget to copy drain holes when an object is copied --- src/slic3r/GUI/Selection.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/slic3r/GUI/Selection.cpp b/src/slic3r/GUI/Selection.cpp index 224f5007de..a4f5a4126d 100644 --- a/src/slic3r/GUI/Selection.cpp +++ b/src/slic3r/GUI/Selection.cpp @@ -1328,6 +1328,7 @@ void Selection::copy_to_clipboard() static_cast(dst_object->config) = static_cast(src_object->config); dst_object->sla_support_points = src_object->sla_support_points; dst_object->sla_points_status = src_object->sla_points_status; + dst_object->sla_drain_holes = src_object->sla_drain_holes; dst_object->layer_config_ranges = src_object->layer_config_ranges; // #ys_FIXME_experiment dst_object->layer_height_profile = src_object->layer_height_profile; dst_object->origin_translation = src_object->origin_translation; From 3c23917e9e4fbc6a088b1f73d530c568019cd079 Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Thu, 6 Feb 2020 14:46:02 +0100 Subject: [PATCH 268/336] SLA gizmos: make sure that the clipping plane is properly reset to zero when the shown meshes are exchanged --- src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp | 2 +- src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp | 2 +- src/slic3r/GUI/Gizmos/GLGizmosManager.cpp | 19 +++++++++++++++---- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp index 6264304b73..c0e518e4d0 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp @@ -43,6 +43,7 @@ public: void update_hollowed_mesh(std::unique_ptr &&mesh); bool is_selection_rectangle_dragging() const { return m_selection_rectangle.is_dragging(); } + void update_clipping_plane(bool keep_normal = false) const; private: bool on_init() override; @@ -96,7 +97,6 @@ private: void select_point(int i); void unselect_point(int i); void reload_cache(); - void update_clipping_plane(bool keep_normal = false) const; protected: void on_set_state() override; diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp index 7ded6aadb4..a2da5e506a 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp @@ -80,6 +80,7 @@ public: bool is_selection_rectangle_dragging() const { return m_selection_rectangle.is_dragging(); } bool has_backend_supports() const; void reslice_SLA_supports(bool postpone_error_messages = false) const; + void update_clipping_plane(bool keep_normal = false) const; private: bool on_init() override; @@ -139,7 +140,6 @@ private: void switch_to_editing_mode(); void disable_editing_mode(); void reset_clipping_plane_normal() const; - void update_clipping_plane(bool keep_normal = false) const; protected: void on_set_state() override; diff --git a/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp b/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp index be0f480071..613e151927 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp @@ -348,11 +348,22 @@ void GLGizmosManager::set_sla_support_data(ModelObject* model_object) if (!m_enabled || m_gizmos.empty()) return; - // Update common data for hollowing and sla support gizmos. - m_common_gizmos_data->update_from_backend(m_parent, model_object); + auto* gizmo_supports = dynamic_cast(m_gizmos[SlaSupports].get()); + auto* gizmo_hollow = dynamic_cast(m_gizmos[Hollow].get()); - dynamic_cast(m_gizmos[SlaSupports].get())->set_sla_support_data(model_object, m_parent.get_selection()); - dynamic_cast(m_gizmos[Hollow].get())->set_sla_support_data(model_object, m_parent.get_selection()); + + // Update common data for hollowing and sla support gizmos. + if (m_common_gizmos_data->update_from_backend(m_parent, model_object)) { + // FIXME: this is a hack to make that the clipping plane is + // updated when the update set its position to zero. The clipping + // plane itself should be common, including the update_function. + // Then update_from_backend could do it itself. + gizmo_supports->update_clipping_plane(); + gizmo_hollow->update_clipping_plane(); + } + + gizmo_supports->set_sla_support_data(model_object, m_parent.get_selection()); + gizmo_hollow->set_sla_support_data(model_object, m_parent.get_selection()); } // Returns true if the gizmo used the event to do something, false otherwise. From c6ca180142fcc1ff3b87e31444f7c99f41e61495 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Thu, 6 Feb 2020 15:19:53 +0100 Subject: [PATCH 269/336] Use frontend data to update labels --- src/slic3r/GUI/GLCanvas3D.cpp | 13 +++++++------ src/slic3r/GUI/GLCanvas3D.hpp | 5 +---- src/slic3r/GUI/GUI_ObjectList.cpp | 2 ++ 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 4096e99c43..2e1a6f0825 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -1238,7 +1238,7 @@ void GLCanvas3D::LegendTexture::render(const GLCanvas3D& canvas) const } #if ENABLE_SHOW_SCENE_LABELS -void GLCanvas3D::Labels::render(const std::vector& sorted_instances) const +void GLCanvas3D::Labels::render(const std::vector& sorted_instances) const { if (!m_enabled || !is_shown()) return; @@ -1298,7 +1298,7 @@ void GLCanvas3D::Labels::render(const std::vector& sorted_ // updates print order strings if (sorted_instances.size() > 1) { for (int i = 0; i < sorted_instances.size(); ++i) { - size_t id = sorted_instances[i]->model_instance->id().id; + size_t id = sorted_instances[i]->id().id; std::vector::iterator it = std::find_if(owners.begin(), owners.end(), [id](const Owner& owner) { return owner.model_instance_id == id; }); @@ -5101,11 +5101,12 @@ void GLCanvas3D::_render_overlays() const #if ENABLE_SHOW_SCENE_LABELS const ConfigOptionBool* opt = dynamic_cast(m_config->option("complete_objects")); bool sequential_print = (opt != nullptr) ? m_config->opt_bool("complete_objects") : false; - std::vector sorted_instances; + std::vector sorted_instances; if (sequential_print) { - const Print* print = fff_print(); - if (print != nullptr) - sorted_instances = sort_object_instances_by_model_order(*print); + for (ModelObject* model_object : m_model->objects) + for (ModelInstance* model_instance : model_object->instances) { + sorted_instances.push_back(model_instance); + } } m_labels.render(sorted_instances); #endif // ENABLE_SHOW_SCENE_LABELS diff --git a/src/slic3r/GUI/GLCanvas3D.hpp b/src/slic3r/GUI/GLCanvas3D.hpp index 71523a433c..21f3f012c1 100644 --- a/src/slic3r/GUI/GLCanvas3D.hpp +++ b/src/slic3r/GUI/GLCanvas3D.hpp @@ -40,9 +40,6 @@ class GCodePreviewData; struct ThumbnailData; #endif // ENABLE_THUMBNAIL_GENERATOR struct SlicingParameters; -#if ENABLE_SHOW_SCENE_LABELS -struct PrintInstance; -#endif // ENABLE_SHOW_SCENE_LABELS enum LayerHeightEditActionType : unsigned int; namespace GUI { @@ -390,7 +387,7 @@ private: void enable(bool enable) { m_enabled = enable; } void show(bool show) { m_shown = m_enabled ? show : false; } bool is_shown() const { return m_shown; } - void render(const std::vector& sorted_instances) const; + void render(const std::vector& sorted_instances) const; }; #endif // ENABLE_SHOW_SCENE_LABELS diff --git a/src/slic3r/GUI/GUI_ObjectList.cpp b/src/slic3r/GUI/GUI_ObjectList.cpp index c07d50a0e2..f4c2c7093a 100644 --- a/src/slic3r/GUI/GUI_ObjectList.cpp +++ b/src/slic3r/GUI/GUI_ObjectList.cpp @@ -1134,6 +1134,8 @@ void ObjectList::OnDrop(wxDataViewEvent &event) changed_object(m_dragged_data.obj_idx()); m_dragged_data.clear(); + + wxGetApp().plater()->set_current_canvas_as_dirty(); } From 665bc9e960a1375ab9bc5f8265bf987e26f7b615 Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Thu, 6 Feb 2020 17:53:03 +0100 Subject: [PATCH 270/336] Hollowing: allow to place drain holes on the inner surface of a hollowed cavity Drain holes are not allowed to be placed on its own inner surface. This was recently (0e3ebb3) done by forcing invalidation of the slaposDrillHoles, which also invalidates and therefore hides the drilled mesh. However, that also hides the hollowed mesh and it is not possible to place holes inside the cavity. This change does not dump the drilled mesh, but checks that no raycast hit ends up in a hole. --- src/libslic3r/SLA/Hollowing.cpp | 2 +- src/libslic3r/SLA/Hollowing.hpp | 5 +++ src/slic3r/GUI/Gizmos/GLGizmoBase.cpp | 2 +- src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp | 37 ++++++++++++-------- src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp | 1 + src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp | 9 ++++- 6 files changed, 38 insertions(+), 18 deletions(-) diff --git a/src/libslic3r/SLA/Hollowing.cpp b/src/libslic3r/SLA/Hollowing.cpp index ecc42b8890..2a9662e85d 100644 --- a/src/libslic3r/SLA/Hollowing.cpp +++ b/src/libslic3r/SLA/Hollowing.cpp @@ -119,7 +119,7 @@ Contour3D DrainHole::to_mesh() const { auto r = double(radius); auto h = double(height); - sla::Contour3D hole = sla::cylinder(r, h); + sla::Contour3D hole = sla::cylinder(r, h, steps); Eigen::Quaterniond q; q.setFromTwoVectors(Vec3d{0., 0., 1.}, normal.cast()); for(auto& p : hole.points) p = q * p + pos.cast(); diff --git a/src/libslic3r/SLA/Hollowing.hpp b/src/libslic3r/SLA/Hollowing.hpp index b3375ed1ae..cc7d310eae 100644 --- a/src/libslic3r/SLA/Hollowing.hpp +++ b/src/libslic3r/SLA/Hollowing.hpp @@ -34,6 +34,9 @@ struct DrainHole DrainHole(Vec3f p, Vec3f n, float r, float h) : pos(p), normal(n), radius(r), height(h) {} + + DrainHole(const DrainHole& rhs) : + DrainHole(rhs.pos, rhs.normal, rhs.radius, rhs.height) {} bool operator==(const DrainHole &sp) const; @@ -50,6 +53,8 @@ struct DrainHole { ar(pos, normal, radius, height); } + + static constexpr size_t steps = 32; }; using DrainHoles = std::vector; diff --git a/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp b/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp index c237198a98..daf7e1fd1d 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp @@ -384,7 +384,7 @@ bool CommonGizmosData::update_from_backend(GLCanvas3D& canvas, ModelObject* mode if (! recent_update) recent_update = m_print_object_idx < 0 && old_po_idx >= 0; - return m_print_object_idx < 0 ? old_po_idx >=0 : false; + return recent_update; } diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp index 11a78fd607..87a4960ee1 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp @@ -12,7 +12,6 @@ #include "slic3r/GUI/PresetBundle.hpp" #include "libslic3r/SLAPrint.hpp" #include "libslic3r/TriangleMesh.hpp" -#include "libslic3r/MeshBoolean.hpp" namespace Slic3r { @@ -59,8 +58,11 @@ void GLGizmoHollow::set_sla_support_data(ModelObject*, const Selection&) { if (m_c->recent_update) { - if (m_c->m_model_object) + if (m_c->m_model_object) { reload_cache(); + if (m_c->has_drilled_mesh()) + m_holes_in_drilled_mesh = m_c->m_model_object->sla_drain_holes; + } if (m_state == On) { m_parent.toggle_model_objects_visibility(false); @@ -344,18 +346,25 @@ bool GLGizmoHollow::unproject_on_mesh(const Vec2d& mouse_pos, std::pairm_mesh_raycaster->unproject_on_mesh(mouse_pos, trafo.get_matrix(), camera, hit, normal, m_c->m_clipping_plane.get())) { - - // User is about to manipulate a hole. If the gizmo currently shows drilled mesh, - // invalidate slaposDrillHoles so it returns to normal. To do this, hackishly - // add a hole, force SLAPrint::apply call that will invalidate the step because - // of it and then remove the hole again. + if (m_c->m_mesh_raycaster->unproject_on_mesh( + mouse_pos, + trafo.get_matrix(), + camera, + hit, + normal, + m_c->m_clipping_plane_distance != 0.f ? m_c->m_clipping_plane.get() : nullptr)) + { if (m_c->has_drilled_mesh()) { - m_c->m_model_object->sla_drain_holes.push_back(sla::DrainHole()); - m_selected.push_back(false); - m_parent.post_event(SimpleEvent(EVT_GLCANVAS_FORCE_UPDATE)); - wxGetApp().CallAfter([this] { m_c->m_model_object->sla_drain_holes.pop_back(); m_selected.pop_back(); }); - return false; + // in this case the raycaster sees the hollowed and drilled mesh. + // if the point lies on the surface created by the hole, we want + // to ignore it. + for (const sla::DrainHole& hole : m_holes_in_drilled_mesh) { + sla::DrainHole outer(hole); + outer.radius *= 1.001f; + outer.height *= 1.001f; + if (outer.is_inside(hit)) + return false; + } } // Return both the point and the facet normal. @@ -527,8 +536,6 @@ void GLGizmoHollow::delete_selected_points() } } - m_parent.post_event(SimpleEvent(EVT_GLCANVAS_FORCE_UPDATE)); - select_point(NoPoints); } diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp index c0e518e4d0..2daf28b2af 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp @@ -70,6 +70,7 @@ private: float m_quality_stash = 0.5f; float m_closing_d_stash = 2.f; Vec3f m_hole_before_drag = Vec3f::Zero(); + sla::DrainHoles m_holes_in_drilled_mesh; sla::DrainHoles m_holes_stash; diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp index 5130b7a9a1..05f33ae52c 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp @@ -408,7 +408,14 @@ bool GLGizmoSlaSupports::unproject_on_mesh(const Vec2d& mouse_pos, std::pairm_mesh_raycaster->unproject_on_mesh(mouse_pos, trafo.get_matrix(), camera, hit, normal, m_c->m_clipping_plane.get())) { + if (m_c->m_mesh_raycaster->unproject_on_mesh( + mouse_pos, + trafo.get_matrix(), + camera, + hit, + normal, + m_c->m_clipping_plane_distance != 0.f ? m_c->m_clipping_plane.get() : nullptr)) + { // Check whether the hit is in a hole bool in_hole = false; // In case the hollowed and drilled mesh is available, we can allow From 5474738dc6504f3fdbefe0cd7e72ad649dfe7977 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Thu, 6 Feb 2020 18:51:52 +0100 Subject: [PATCH 271/336] DoubleSlider: Implemented tick hovering + Linux: fixed empty menu showing --- src/slic3r/GUI/DoubleSlider.cpp | 190 +++++++++++++++++++++++--------- src/slic3r/GUI/DoubleSlider.hpp | 11 +- 2 files changed, 143 insertions(+), 58 deletions(-) diff --git a/src/slic3r/GUI/DoubleSlider.cpp b/src/slic3r/GUI/DoubleSlider.cpp index a17ba2fe56..e3932e5c8f 100644 --- a/src/slic3r/GUI/DoubleSlider.cpp +++ b/src/slic3r/GUI/DoubleSlider.cpp @@ -401,6 +401,9 @@ void Control::render() //draw cog bitmap (if it's shown) draw_cog_icon(dc); + + //draw mouse position + draw_tick_on_mouse_position(dc); } void Control::draw_action_icon(wxDC& dc, const wxPoint pt_beg, const wxPoint pt_end) @@ -443,9 +446,68 @@ void Control::draw_info_line_with_icon(wxDC& dc, const wxPoint& pos, const Selec } } -wxString Control::get_label(const SelectedSlider& selection) const +void Control::draw_tick_on_mouse_position(wxDC& dc) { - const int value = selection == ssLower ? m_lower_value : m_higher_value; + if (!m_is_focused || m_moving_pos == wxDefaultPosition) + return; + + //calculate thumb position on slider line + int width, height; + get_size(&width, &height); + + int tick = get_tick_near_point(m_moving_pos); + if (tick == m_higher_value || tick == m_lower_value) + return ; + + auto draw_ticks = [this](wxDC& dc, wxPoint pos, int margin=0 ) + { + wxPoint pt_beg = is_horizontal() ? wxPoint(pos.x+margin, pos.y - m_thumb_size.y) : wxPoint(pos.x - m_thumb_size.x , pos.y+margin); + wxPoint pt_end = is_horizontal() ? wxPoint(pos.x+margin, pos.y + m_thumb_size.y) : wxPoint(pos.x - 0.5 * m_thumb_size.x + 1, pos.y+margin); + dc.DrawLine(pt_beg, pt_end); + + pt_beg = is_horizontal() ? wxPoint(pos.x + margin, pos.y - m_thumb_size.y) : wxPoint(pos.x + 0.5 * m_thumb_size.x, pos.y+margin); + pt_end = is_horizontal() ? wxPoint(pos.x + margin, pos.y + m_thumb_size.y) : wxPoint(pos.x + m_thumb_size.x + 1, pos.y+margin); + dc.DrawLine(pt_beg, pt_end); + }; + + auto draw_touch = [this](wxDC& dc, wxPoint pos, int margin, bool right_side ) + { + int mult = right_side ? 1 : -1; + wxPoint pt_beg = is_horizontal() ? wxPoint(pos.x - margin, pos.y + mult * m_thumb_size.y) : wxPoint(pos.x + mult * m_thumb_size.x, pos.y - margin); + wxPoint pt_end = is_horizontal() ? wxPoint(pos.x + margin, pos.y + mult * m_thumb_size.y) : wxPoint(pos.x + mult * m_thumb_size.x, pos.y + margin); + dc.DrawLine(pt_beg, pt_end); + }; + + if (tick > 0) // this tick exists and should be marked as a focused + { + wxCoord new_pos = get_position_from_value(tick); + const wxPoint pos = is_horizontal() ? wxPoint(new_pos, height * 0.5) : wxPoint(0.5 * width, new_pos); + + dc.SetPen(DARK_ORANGE_PEN); + + draw_ticks(dc, pos, -2); + draw_ticks(dc, pos, 2 ); + draw_touch(dc, pos, 2, true); + draw_touch(dc, pos, 2, false); + + return; + } + + tick = get_value_from_position(m_moving_pos); + if (tick >= m_max_value || tick <= m_min_value || tick == m_higher_value || tick == m_lower_value) + return; + + wxCoord new_pos = get_position_from_value(tick); + const wxPoint pos = is_horizontal() ? wxPoint(new_pos, height * 0.5) : wxPoint(0.5 * width, new_pos); + + //draw info line + dc.SetPen(LIGHT_GREY_PEN); + draw_ticks(dc, pos); +} + +wxString Control::get_label(int tick) const +{ + const int value = tick; if (m_label_koef == 1.0 && m_values.empty()) return wxString::Format("%d", value); @@ -458,22 +520,24 @@ wxString Control::get_label(const SelectedSlider& selection) const return wxString::Format("%s\n(%d)", str, m_values.empty() ? value : value+1); } -void Control::draw_thumb_text(wxDC& dc, const wxPoint& pos, const SelectedSlider& selection) const +void Control::draw_tick_text(wxDC& dc, const wxPoint& pos, int tick, bool right_side/*=true*/) const { - if ( selection == ssUndef || - ((m_is_one_layer || m_higher_value==m_lower_value) && selection != m_selection) ) - return; wxCoord text_width, text_height; - const wxString label = get_label(selection); + const wxString label = get_label(tick); dc.GetMultiLineTextExtent(label, &text_width, &text_height); wxPoint text_pos; - if (selection ==ssLower) + if (right_side) text_pos = is_horizontal() ? wxPoint(pos.x + 1, pos.y + m_thumb_size.x) : - wxPoint(pos.x + m_thumb_size.x+1, pos.y - 0.5*text_height - 1); + wxPoint(pos.x + m_thumb_size.x+1, pos.y - 0.5*text_height - 1); else text_pos = is_horizontal() ? wxPoint(pos.x - text_width - 1, pos.y - m_thumb_size.x - text_height) : - wxPoint(pos.x - text_width - 1 - m_thumb_size.x, pos.y - 0.5*text_height + 1); - dc.DrawText(label, text_pos); + wxPoint(pos.x - text_width - 1 - m_thumb_size.x, pos.y - 0.5*text_height + 1); + dc.DrawText(label, text_pos); +} + +void Control::draw_thumb_text(wxDC& dc, const wxPoint& pos, const SelectedSlider& selection) const +{ + draw_tick_text(dc, pos, selection == ssLower ? m_lower_value : m_higher_value, selection == ssLower); } void Control::draw_thumb_item(wxDC& dc, const wxPoint& pos, const SelectedSlider& selection) @@ -564,16 +628,24 @@ void Control::draw_ticks(wxDC& dc) is_horizontal() ? dc.DrawLine(pos, mid+14, pos, mid+9) : dc.DrawLine(mid + 14, pos/* - 1*/, mid + 9, pos/* - 1*/); - wxBitmap icon = wxNullBitmap; + // if current tick if focused, we should to use a specific "focused" icon + bool focused_tick = m_moving_pos != wxDefaultPosition && tick.tick == get_tick_near_point(m_moving_pos); - // Draw icon for "Pause print" or "Custom Gcode" - if (tick.gcode != ColorChangeCode && tick.gcode != ToolChangeCode) - icon = create_scaled_bitmap(tick.gcode == PausePrintCode ? "pause_print" : "edit_gcode"); - else if (m_ticks.is_conflict_tick(tick, m_mode, m_only_extruder, m_values[tick.tick])) - icon = create_scaled_bitmap("error_tick"); + // get icon name if it is + std::string icon_name; + if (tick.gcode == ColorChangeCode || tick.gcode == ToolChangeCode) { + if (m_ticks.is_conflict_tick(tick, m_mode, m_only_extruder, m_values[tick.tick])) + icon_name = focused_tick ? "error_tick_f" : "error_tick"; + } + else if (tick.gcode == PausePrintCode) + icon_name = focused_tick ? "pause_print_f" : "pause_print"; + else + icon_name = focused_tick ? "edit_gcode_f" : "edit_gcode"; - if (!icon.IsNull()) + // Draw icon for "Pause print", "Custom Gcode" or conflict tick + if (!icon_name.empty()) { + wxBitmap icon = create_scaled_bitmap(icon_name); wxCoord x_draw, y_draw; is_horizontal() ? x_draw = pos - 0.5 * m_tick_icon_dim : y_draw = pos - 0.5 * m_tick_icon_dim; is_horizontal() ? y_draw = mid + 22 : x_draw = mid + m_thumb_size.x + 3; @@ -979,6 +1051,7 @@ void Control::OnMotion(wxMouseEvent& event) m_focus = fiTick; tick = get_tick_near_point(pos); } + m_moving_pos = pos; } else if (m_is_left_down || m_is_right_down) { if (m_selection == ssLower) { @@ -993,6 +1066,7 @@ void Control::OnMotion(wxMouseEvent& event) correct_higher_value(); action = (current_value != m_higher_value); } + m_moving_pos = wxDefaultPosition; } Refresh(); Update(); @@ -1361,58 +1435,70 @@ std::set TickCodeInfo::get_used_extruders_for_tick(int tick, int only_extru return used_extruders; } -void Control::get_add_menu(wxMenu* menu) +void Control::show_add_context_menu() { + wxMenu menu; + if (m_mode == t_mode::SingleExtruder) { - append_menu_item(menu, wxID_ANY, _(L("Add color change")) + " (M600)", "", - [this](wxCommandEvent&) { add_code_as_tick(ColorChangeCode); }, "colorchange_add_m", menu); + append_menu_item(&menu, wxID_ANY, _(L("Add color change")) + " (M600)", "", + [this](wxCommandEvent&) { add_code_as_tick(ColorChangeCode); }, "colorchange_add_m", &menu); UseDefaultColors(false); } else { - append_change_extruder_menu_item(menu); - append_add_color_change_menu_item(menu); + append_change_extruder_menu_item(&menu); + append_add_color_change_menu_item(&menu); } - append_menu_item(menu, wxID_ANY, _(L("Add pause print")) + " (M601)", "", - [this](wxCommandEvent&) { add_code_as_tick(PausePrintCode); }, "pause_print", menu); + append_menu_item(&menu, wxID_ANY, _(L("Add pause print")) + " (M601)", "", + [this](wxCommandEvent&) { add_code_as_tick(PausePrintCode); }, "pause_print", &menu); - append_menu_item(menu, wxID_ANY, _(L("Add custom G-code")), "", - [this](wxCommandEvent&) { add_code_as_tick(""); }, "edit_gcode", menu); + append_menu_item(&menu, wxID_ANY, _(L("Add custom G-code")), "", + [this](wxCommandEvent&) { add_code_as_tick(""); }, "edit_gcode", &menu); + + GUI::wxGetApp().plater()->PopupMenu(&menu); } -void Control::get_edit_menu(wxMenu* menu) +void Control::show_edit_context_menu() { + wxMenu menu; + std::set::iterator it = m_ticks.ticks.find(TickCode{ m_selection == ssLower ? m_lower_value : m_higher_value }); if (it->gcode == ToolChangeCode) { if (m_mode == t_mode::MultiAsSingle) - append_change_extruder_menu_item(menu); - append_add_color_change_menu_item(menu, true); + append_change_extruder_menu_item(&menu); + append_add_color_change_menu_item(&menu, true); } else - append_menu_item( menu, wxID_ANY, it->gcode == ColorChangeCode ? _(L("Edit color")) : + append_menu_item(&menu, wxID_ANY, it->gcode == ColorChangeCode ? _(L("Edit color")) : it->gcode == PausePrintCode ? _(L("Edit pause print message")) : _(L("Edit custom G-code")), "", - [this](wxCommandEvent&) { edit_tick(); }, "edit_uni", menu); + [this](wxCommandEvent&) { edit_tick(); }, "edit_uni", &menu); if (it->gcode == ColorChangeCode && m_mode == t_mode::MultiAsSingle) - append_change_extruder_menu_item(menu, true); + append_change_extruder_menu_item(&menu, true); - append_menu_item( menu, wxID_ANY, it->gcode == ColorChangeCode ? _(L("Delete color change")) : + append_menu_item(&menu, wxID_ANY, it->gcode == ColorChangeCode ? _(L("Delete color change")) : it->gcode == ToolChangeCode ? _(L("Delete tool change")) : it->gcode == PausePrintCode ? _(L("Delete pause print")) : _(L("Delete custom G-code")), "", - [this](wxCommandEvent&) { delete_current_tick();}, "colorchange_del_f", menu); + [this](wxCommandEvent&) { delete_current_tick();}, "colorchange_del_f", &menu); + + GUI::wxGetApp().plater()->PopupMenu(&menu); } -void Control::get_cog_icon_menu(wxMenu* menu) +void Control::show_cog_icon_context_menu() { - append_menu_item(menu, wxID_ANY, _(L("Jump to print Z")) + " (Shift+G)", "", - [this](wxCommandEvent&) { jump_to_print_z(); }, "", menu); + wxMenu menu; - append_menu_item(menu, wxID_ANY, _(L("Set extruder sequence for whole print")), "", - [this](wxCommandEvent&) { edit_extruder_sequence(); }, "", menu); + append_menu_item(&menu, wxID_ANY, _(L("Jump to print Z")) + " (Shift+G)", "", + [this](wxCommandEvent&) { jump_to_print_z(); }, "", &menu); + + append_menu_item(&menu, wxID_ANY, _(L("Set extruder sequence for whole print")), "", + [this](wxCommandEvent&) { edit_extruder_sequence(); }, "", &menu); + + GUI::wxGetApp().plater()->PopupMenu(&menu); } void Control::OnRightUp(wxMouseEvent& event) @@ -1429,19 +1515,12 @@ void Control::OnRightUp(wxMouseEvent& event) if (edited_tick >= 0) edit_tick(edited_tick); } - else - { - wxMenu menu; - - if (m_mouse == maAddMenu) - get_add_menu(&menu); - else if (m_mouse == maEditMenu) - get_edit_menu(&menu); - else if (m_mouse == maCogIconMenu) - get_cog_icon_menu(&menu); - - GUI::wxGetApp().plater()->PopupMenu(&menu); - } + else if (m_mouse == maAddMenu) + show_add_context_menu(); + else if (m_mouse == maEditMenu) + show_edit_context_menu(); + else if (m_mouse == maCogIconMenu) + show_cog_icon_context_menu(); Refresh(); Update(); @@ -1726,7 +1805,10 @@ void Control::edit_extruder_sequence() while (tick <= m_max_value) { const int cur_extruder = m_extruders_sequence.extruders[extruder]; - m_ticks.ticks.emplace(TickCode{tick, ToolChangeCode, cur_extruder + 1, colors[cur_extruder]}); + + bool meaningless_tick = value == 0.0 && cur_extruder == extruder; + if (!meaningless_tick) + m_ticks.ticks.emplace(TickCode{tick, ToolChangeCode, cur_extruder + 1, colors[cur_extruder]}); extruder++; if (extruder == extr_cnt) diff --git a/src/slic3r/GUI/DoubleSlider.hpp b/src/slic3r/GUI/DoubleSlider.hpp index 78c568eb42..c6c85fe0e1 100644 --- a/src/slic3r/GUI/DoubleSlider.hpp +++ b/src/slic3r/GUI/DoubleSlider.hpp @@ -235,9 +235,9 @@ public: void move_current_thumb_to_pos(wxPoint pos); void edit_extruder_sequence(); void jump_to_print_z(); - void get_add_menu(wxMenu *menu); - void get_edit_menu(wxMenu *menu); - void get_cog_icon_menu(wxMenu *menu); + void show_add_context_menu(); + void show_edit_context_menu(); + void show_cog_icon_context_menu(); ExtrudersSequence m_extruders_sequence; @@ -256,6 +256,8 @@ protected: void draw_cog_icon(wxDC &dc); void draw_thumb_item(wxDC& dc, const wxPoint& pos, const SelectedSlider& selection); void draw_info_line_with_icon(wxDC& dc, const wxPoint& pos, SelectedSlider selection); + void draw_tick_on_mouse_position(wxDC &dc); + void draw_tick_text(wxDC& dc, const wxPoint& pos, int tick, bool right_side = true) const; void draw_thumb_text(wxDC& dc, const wxPoint& pos, const SelectedSlider& selection) const; void update_thumb_rect(const wxCoord& begin_x, const wxCoord& begin_y, const SelectedSlider& selection); @@ -271,7 +273,7 @@ private: int get_tick_near_point(const wxPoint& pt); double get_scroll_step(); - wxString get_label(const SelectedSlider& selection) const; + wxString get_label(int tick) const; void get_lower_and_higher_position(int& lower_pos, int& higher_pos); int get_value_from_position(const wxCoord x, const wxCoord y); int get_value_from_position(const wxPoint pos) { return get_value_from_position(pos.x, pos.y); } @@ -329,6 +331,7 @@ private: MouseAction m_mouse = maNone; FocusedItem m_focus = fiNone; + wxPoint m_moving_pos = wxDefaultPosition; wxRect m_rect_lower_thumb; wxRect m_rect_higher_thumb; From 455f36119aae14a6a50ed2743b4bb1bb997c8682 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Thu, 6 Feb 2020 20:37:12 +0100 Subject: [PATCH 272/336] Localization: Updated PrusaSlicer.pot and list.txt + added missed icons --- resources/icons/edit_gcode_f.svg | 15 + resources/icons/error_tick_f.svg | 12 + resources/icons/pause_print_f.svg | 18 + resources/localization/PrusaSlicer.pot | 4812 +++++++++++++----------- resources/localization/list.txt | 21 +- src/libslic3r/PrintConfig.cpp | 2 +- 6 files changed, 2730 insertions(+), 2150 deletions(-) create mode 100644 resources/icons/edit_gcode_f.svg create mode 100644 resources/icons/error_tick_f.svg create mode 100644 resources/icons/pause_print_f.svg diff --git a/resources/icons/edit_gcode_f.svg b/resources/icons/edit_gcode_f.svg new file mode 100644 index 0000000000..980060d9bb --- /dev/null +++ b/resources/icons/edit_gcode_f.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + diff --git a/resources/icons/error_tick_f.svg b/resources/icons/error_tick_f.svg new file mode 100644 index 0000000000..adf876e3c6 --- /dev/null +++ b/resources/icons/error_tick_f.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/resources/icons/pause_print_f.svg b/resources/icons/pause_print_f.svg new file mode 100644 index 0000000000..ee1c734708 --- /dev/null +++ b/resources/icons/pause_print_f.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + diff --git a/resources/localization/PrusaSlicer.pot b/resources/localization/PrusaSlicer.pot index 77539a7a35..e79f4b61bb 100644 --- a/resources/localization/PrusaSlicer.pot +++ b/resources/localization/PrusaSlicer.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-12-06 13:53+0100\n" +"POT-Creation-Date: 2020-02-06 20:24+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -38,7 +38,7 @@ msgstr "" msgid "About %s" msgstr "" -#: src/slic3r/GUI/AboutDialog.cpp:231 src/slic3r/GUI/MainFrame.cpp:63 +#: src/slic3r/GUI/AboutDialog.cpp:231 src/slic3r/GUI/MainFrame.cpp:64 msgid "Version" msgstr "" @@ -64,50 +64,38 @@ msgid "" "numerous others." msgstr "" -#: src/slic3r/GUI/AppConfig.cpp:105 +#: src/slic3r/GUI/AppConfig.cpp:118 msgid "" "Error parsing PrusaSlicer config file, it is probably corrupted. Try to " "manually delete the file to recover from the error. Your user profiles will " "not be affected." msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:100 -msgid "" -"To except of redundant tool manipulation, \n" -"Color change(s) for unused extruder(s) was(were) deleted" -msgstr "" - -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:101 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3292 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3367 src/slic3r/GUI/Plater.cpp:135 -msgid "Info" -msgstr "" - -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:110 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:118 msgid "" "Copying of the temporary G-code to the output G-code failed. Maybe the SD " "card is write locked?" msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:111 -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:461 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:120 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:470 msgid "Running post-processing scripts" msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:113 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:122 msgid "G-code file exported to %1%" msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:117 -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:167 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:126 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:176 msgid "Slicing complete" msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:163 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:172 msgid "Masked SLA file exported to %1%" msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:205 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:214 #, possible-c-format msgid "" "%s has encountered an error. It was likely caused by running out of memory. " @@ -115,158 +103,160 @@ msgid "" "and we would be glad if you reported it." msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:463 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:472 msgid "Copying of the temporary G-code to the output G-code failed" msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:488 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:497 msgid "Scheduling upload to `%1%`. See Window -> Print Host Upload Queue" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:68 src/slic3r/GUI/GUI_ObjectList.cpp:1932 +#: src/slic3r/GUI/BedShapeDialog.cpp:66 src/slic3r/GUI/GUI_ObjectList.cpp:2038 msgid "Shape" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:75 +#: src/slic3r/GUI/BedShapeDialog.cpp:73 msgid "Rectangular" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:79 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:232 src/slic3r/GUI/Plater.cpp:154 -#: src/slic3r/GUI/Tab.cpp:2292 +#: src/slic3r/GUI/BedShapeDialog.cpp:77 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:232 src/slic3r/GUI/Plater.cpp:162 +#: src/slic3r/GUI/Tab.cpp:2306 msgid "Size" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:80 +#: src/slic3r/GUI/BedShapeDialog.cpp:78 msgid "Size in X and Y of the rectangular plate." msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:86 +#: src/slic3r/GUI/BedShapeDialog.cpp:84 msgid "Origin" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:87 +#: src/slic3r/GUI/BedShapeDialog.cpp:85 msgid "" "Distance of the 0,0 G-code coordinate from the front left corner of the " "rectangle." msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:91 +#: src/slic3r/GUI/BedShapeDialog.cpp:89 msgid "Circular" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:94 src/slic3r/GUI/ConfigWizard.cpp:218 -#: src/slic3r/GUI/ConfigWizard.cpp:926 src/slic3r/GUI/ConfigWizard.cpp:940 +#: src/slic3r/GUI/BedShapeDialog.cpp:92 src/slic3r/GUI/ConfigWizard.cpp:218 +#: src/slic3r/GUI/ConfigWizard.cpp:971 src/slic3r/GUI/ConfigWizard.cpp:985 +#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:87 #: src/slic3r/GUI/GUI_ObjectLayers.cpp:135 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:333 -#: src/slic3r/GUI/WipeTowerDialog.cpp:85 src/slic3r/GUI/wxExtensions.cpp:628 -#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:87 -#: src/libslic3r/PrintConfig.cpp:75 src/libslic3r/PrintConfig.cpp:82 -#: src/libslic3r/PrintConfig.cpp:91 src/libslic3r/PrintConfig.cpp:225 -#: src/libslic3r/PrintConfig.cpp:300 src/libslic3r/PrintConfig.cpp:308 -#: src/libslic3r/PrintConfig.cpp:358 src/libslic3r/PrintConfig.cpp:368 -#: src/libslic3r/PrintConfig.cpp:494 src/libslic3r/PrintConfig.cpp:505 -#: src/libslic3r/PrintConfig.cpp:523 src/libslic3r/PrintConfig.cpp:702 -#: src/libslic3r/PrintConfig.cpp:1228 src/libslic3r/PrintConfig.cpp:1289 -#: src/libslic3r/PrintConfig.cpp:1307 src/libslic3r/PrintConfig.cpp:1325 -#: src/libslic3r/PrintConfig.cpp:1379 src/libslic3r/PrintConfig.cpp:1389 -#: src/libslic3r/PrintConfig.cpp:1511 src/libslic3r/PrintConfig.cpp:1519 -#: src/libslic3r/PrintConfig.cpp:1560 src/libslic3r/PrintConfig.cpp:1568 -#: src/libslic3r/PrintConfig.cpp:1578 src/libslic3r/PrintConfig.cpp:1586 -#: src/libslic3r/PrintConfig.cpp:1594 src/libslic3r/PrintConfig.cpp:1677 -#: src/libslic3r/PrintConfig.cpp:1903 src/libslic3r/PrintConfig.cpp:1974 -#: src/libslic3r/PrintConfig.cpp:2008 src/libslic3r/PrintConfig.cpp:2203 -#: src/libslic3r/PrintConfig.cpp:2210 src/libslic3r/PrintConfig.cpp:2217 -#: src/libslic3r/PrintConfig.cpp:2247 src/libslic3r/PrintConfig.cpp:2257 -#: src/libslic3r/PrintConfig.cpp:2267 src/libslic3r/PrintConfig.cpp:2452 -#: src/libslic3r/PrintConfig.cpp:2591 src/libslic3r/PrintConfig.cpp:2600 -#: src/libslic3r/PrintConfig.cpp:2609 src/libslic3r/PrintConfig.cpp:2619 -#: src/libslic3r/PrintConfig.cpp:2663 src/libslic3r/PrintConfig.cpp:2673 -#: src/libslic3r/PrintConfig.cpp:2685 src/libslic3r/PrintConfig.cpp:2705 -#: src/libslic3r/PrintConfig.cpp:2715 src/libslic3r/PrintConfig.cpp:2725 -#: src/libslic3r/PrintConfig.cpp:2743 src/libslic3r/PrintConfig.cpp:2758 -#: src/libslic3r/PrintConfig.cpp:2772 src/libslic3r/PrintConfig.cpp:2783 -#: src/libslic3r/PrintConfig.cpp:2796 src/libslic3r/PrintConfig.cpp:2841 -#: src/libslic3r/PrintConfig.cpp:2851 src/libslic3r/PrintConfig.cpp:2860 -#: src/libslic3r/PrintConfig.cpp:2870 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:94 +#: src/slic3r/GUI/WipeTowerDialog.cpp:85 src/libslic3r/PrintConfig.cpp:75 +#: src/libslic3r/PrintConfig.cpp:82 src/libslic3r/PrintConfig.cpp:91 +#: src/libslic3r/PrintConfig.cpp:178 src/libslic3r/PrintConfig.cpp:236 +#: src/libslic3r/PrintConfig.cpp:311 src/libslic3r/PrintConfig.cpp:319 +#: src/libslic3r/PrintConfig.cpp:369 src/libslic3r/PrintConfig.cpp:379 +#: src/libslic3r/PrintConfig.cpp:505 src/libslic3r/PrintConfig.cpp:516 +#: src/libslic3r/PrintConfig.cpp:534 src/libslic3r/PrintConfig.cpp:713 +#: src/libslic3r/PrintConfig.cpp:1240 src/libslic3r/PrintConfig.cpp:1301 +#: src/libslic3r/PrintConfig.cpp:1319 src/libslic3r/PrintConfig.cpp:1337 +#: src/libslic3r/PrintConfig.cpp:1393 src/libslic3r/PrintConfig.cpp:1403 +#: src/libslic3r/PrintConfig.cpp:1525 src/libslic3r/PrintConfig.cpp:1533 +#: src/libslic3r/PrintConfig.cpp:1574 src/libslic3r/PrintConfig.cpp:1582 +#: src/libslic3r/PrintConfig.cpp:1592 src/libslic3r/PrintConfig.cpp:1600 +#: src/libslic3r/PrintConfig.cpp:1608 src/libslic3r/PrintConfig.cpp:1691 +#: src/libslic3r/PrintConfig.cpp:1924 src/libslic3r/PrintConfig.cpp:1995 +#: src/libslic3r/PrintConfig.cpp:2029 src/libslic3r/PrintConfig.cpp:2157 +#: src/libslic3r/PrintConfig.cpp:2236 src/libslic3r/PrintConfig.cpp:2243 +#: src/libslic3r/PrintConfig.cpp:2250 src/libslic3r/PrintConfig.cpp:2280 +#: src/libslic3r/PrintConfig.cpp:2290 src/libslic3r/PrintConfig.cpp:2300 +#: src/libslic3r/PrintConfig.cpp:2485 src/libslic3r/PrintConfig.cpp:2624 +#: src/libslic3r/PrintConfig.cpp:2633 src/libslic3r/PrintConfig.cpp:2642 +#: src/libslic3r/PrintConfig.cpp:2652 src/libslic3r/PrintConfig.cpp:2696 +#: src/libslic3r/PrintConfig.cpp:2706 src/libslic3r/PrintConfig.cpp:2718 +#: src/libslic3r/PrintConfig.cpp:2738 src/libslic3r/PrintConfig.cpp:2748 +#: src/libslic3r/PrintConfig.cpp:2758 src/libslic3r/PrintConfig.cpp:2776 +#: src/libslic3r/PrintConfig.cpp:2791 src/libslic3r/PrintConfig.cpp:2805 +#: src/libslic3r/PrintConfig.cpp:2816 src/libslic3r/PrintConfig.cpp:2829 +#: src/libslic3r/PrintConfig.cpp:2874 src/libslic3r/PrintConfig.cpp:2884 +#: src/libslic3r/PrintConfig.cpp:2893 src/libslic3r/PrintConfig.cpp:2903 +#: src/libslic3r/PrintConfig.cpp:2919 msgid "mm" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:95 src/libslic3r/PrintConfig.cpp:699 +#: src/slic3r/GUI/BedShapeDialog.cpp:93 src/libslic3r/PrintConfig.cpp:710 msgid "Diameter" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:96 +#: src/slic3r/GUI/BedShapeDialog.cpp:94 msgid "" "Diameter of the print bed. It is assumed that origin (0,0) is located in the " "center." msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:100 src/slic3r/GUI/GUI_Preview.cpp:248 +#: src/slic3r/GUI/BedShapeDialog.cpp:98 src/slic3r/GUI/GUI_Preview.cpp:251 #: src/libslic3r/ExtrusionEntity.cpp:322 msgid "Custom" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:104 +#: src/slic3r/GUI/BedShapeDialog.cpp:102 msgid "Load shape from STL..." msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:157 +#: src/slic3r/GUI/BedShapeDialog.cpp:155 msgid "Settings" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:174 +#: src/slic3r/GUI/BedShapeDialog.cpp:172 msgid "Texture" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:184 src/slic3r/GUI/BedShapeDialog.cpp:263 +#: src/slic3r/GUI/BedShapeDialog.cpp:182 src/slic3r/GUI/BedShapeDialog.cpp:261 msgid "Load..." msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:192 src/slic3r/GUI/BedShapeDialog.cpp:271 -#: src/slic3r/GUI/Tab.cpp:3080 +#: src/slic3r/GUI/BedShapeDialog.cpp:190 src/slic3r/GUI/BedShapeDialog.cpp:269 +#: src/slic3r/GUI/Tab.cpp:3094 msgid "Remove" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:225 src/slic3r/GUI/BedShapeDialog.cpp:304 +#: src/slic3r/GUI/BedShapeDialog.cpp:223 src/slic3r/GUI/BedShapeDialog.cpp:302 msgid "Not found: " msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:253 +#: src/slic3r/GUI/BedShapeDialog.cpp:251 msgid "Model" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:489 +#: src/slic3r/GUI/BedShapeDialog.cpp:487 msgid "Choose an STL file to import bed shape from:" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:496 src/slic3r/GUI/BedShapeDialog.cpp:545 -#: src/slic3r/GUI/BedShapeDialog.cpp:570 +#: src/slic3r/GUI/BedShapeDialog.cpp:494 src/slic3r/GUI/BedShapeDialog.cpp:543 +#: src/slic3r/GUI/BedShapeDialog.cpp:566 msgid "Invalid file format." msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:507 +#: src/slic3r/GUI/BedShapeDialog.cpp:505 msgid "Error! Invalid model" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:515 +#: src/slic3r/GUI/BedShapeDialog.cpp:513 msgid "The selected file contains no geometry." msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:519 +#: src/slic3r/GUI/BedShapeDialog.cpp:517 msgid "" "The selected file contains several disjoint areas. This is not supported." msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:534 +#: src/slic3r/GUI/BedShapeDialog.cpp:532 msgid "Choose a file to import bed texture from (PNG/SVG):" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:559 +#: src/slic3r/GUI/BedShapeDialog.cpp:555 msgid "Choose an STL file to import bed model from:" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.hpp:59 src/slic3r/GUI/ConfigWizard.cpp:885 +#: src/slic3r/GUI/BedShapeDialog.hpp:59 src/slic3r/GUI/ConfigWizard.cpp:930 msgid "Bed Shape" msgstr "" @@ -332,7 +322,7 @@ msgid "" "The first layer height will be reset to 0.01." msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:61 src/libslic3r/PrintConfig.cpp:878 +#: src/slic3r/GUI/ConfigManipulation.cpp:61 src/libslic3r/PrintConfig.cpp:890 msgid "First layer height" msgstr "" @@ -406,32 +396,32 @@ msgid "Shall I switch to rectilinear fill pattern?" msgstr "" #: src/slic3r/GUI/ConfigManipulation.cpp:203 -#: src/slic3r/GUI/GUI_ObjectList.cpp:35 src/slic3r/GUI/GUI_ObjectList.cpp:89 -#: src/slic3r/GUI/GUI_ObjectList.cpp:609 src/slic3r/GUI/Plater.cpp:516 -#: src/slic3r/GUI/Tab.cpp:1071 src/slic3r/GUI/Tab.cpp:1072 -#: src/libslic3r/PrintConfig.cpp:182 src/libslic3r/PrintConfig.cpp:405 -#: src/libslic3r/PrintConfig.cpp:425 src/libslic3r/PrintConfig.cpp:765 -#: src/libslic3r/PrintConfig.cpp:779 src/libslic3r/PrintConfig.cpp:816 -#: src/libslic3r/PrintConfig.cpp:970 src/libslic3r/PrintConfig.cpp:980 -#: src/libslic3r/PrintConfig.cpp:998 src/libslic3r/PrintConfig.cpp:1017 -#: src/libslic3r/PrintConfig.cpp:1036 src/libslic3r/PrintConfig.cpp:1724 -#: src/libslic3r/PrintConfig.cpp:1741 +#: src/slic3r/GUI/GUI_ObjectList.cpp:35 src/slic3r/GUI/GUI_ObjectList.cpp:94 +#: src/slic3r/GUI/GUI_ObjectList.cpp:612 src/slic3r/GUI/Plater.cpp:524 +#: src/slic3r/GUI/Tab.cpp:1081 src/slic3r/GUI/Tab.cpp:1082 +#: src/libslic3r/PrintConfig.cpp:193 src/libslic3r/PrintConfig.cpp:416 +#: src/libslic3r/PrintConfig.cpp:436 src/libslic3r/PrintConfig.cpp:777 +#: src/libslic3r/PrintConfig.cpp:791 src/libslic3r/PrintConfig.cpp:828 +#: src/libslic3r/PrintConfig.cpp:982 src/libslic3r/PrintConfig.cpp:992 +#: src/libslic3r/PrintConfig.cpp:1010 src/libslic3r/PrintConfig.cpp:1029 +#: src/libslic3r/PrintConfig.cpp:1048 src/libslic3r/PrintConfig.cpp:1738 +#: src/libslic3r/PrintConfig.cpp:1755 msgid "Infill" msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:304 +#: src/slic3r/GUI/ConfigManipulation.cpp:309 msgid "Head penetration should not be greater than the head width." msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:306 +#: src/slic3r/GUI/ConfigManipulation.cpp:311 msgid "Invalid Head penetration" msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:317 +#: src/slic3r/GUI/ConfigManipulation.cpp:322 msgid "Pinhead diameter should be smaller than the pillar diameter." msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:319 +#: src/slic3r/GUI/ConfigManipulation.cpp:324 msgid "Invalid pinhead diameter" msgstr "" @@ -463,7 +453,7 @@ msgstr "" msgid "PrusaSlicer version" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:51 src/slic3r/GUI/Preset.cpp:1408 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:51 src/slic3r/GUI/Preset.cpp:1452 msgid "print" msgstr "" @@ -471,7 +461,7 @@ msgstr "" msgid "filaments" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:53 src/slic3r/GUI/Preset.cpp:1412 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:53 src/slic3r/GUI/Preset.cpp:1456 msgid "printer" msgstr "" @@ -528,90 +518,90 @@ msgstr "" msgid "Standard" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:290 src/slic3r/GUI/ConfigWizard.cpp:545 -#: src/slic3r/GUI/Tab.cpp:3130 +#: src/slic3r/GUI/ConfigWizard.cpp:290 src/slic3r/GUI/ConfigWizard.cpp:573 +#: src/slic3r/GUI/Tab.cpp:3144 msgid "All" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:291 src/slic3r/GUI/ConfigWizard.cpp:546 -#: src/slic3r/GUI/Plater.cpp:488 src/slic3r/GUI/Plater.cpp:628 +#: src/slic3r/GUI/ConfigWizard.cpp:291 src/slic3r/GUI/ConfigWizard.cpp:574 +#: src/slic3r/GUI/Plater.cpp:496 src/slic3r/GUI/Plater.cpp:636 #: src/libslic3r/ExtrusionEntity.cpp:309 msgid "None" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:412 +#: src/slic3r/GUI/ConfigWizard.cpp:427 #, possible-c-format msgid "Welcome to the %s Configuration Assistant" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:414 +#: src/slic3r/GUI/ConfigWizard.cpp:429 #, possible-c-format msgid "Welcome to the %s Configuration Wizard" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:416 +#: src/slic3r/GUI/ConfigWizard.cpp:431 msgid "Welcome" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:418 +#: src/slic3r/GUI/ConfigWizard.cpp:433 #, possible-c-format msgid "" "Hello, welcome to %s! This %s helps you with the initial configuration; just " "a few settings and you will be ready to print." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:423 +#: src/slic3r/GUI/ConfigWizard.cpp:438 msgid "" "Remove user profiles - install from scratch (a snapshot will be taken " "beforehand)" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:466 +#: src/slic3r/GUI/ConfigWizard.cpp:481 #, possible-c-format msgid "%s Family" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:537 +#: src/slic3r/GUI/ConfigWizard.cpp:565 msgid "Vendor:" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:538 +#: src/slic3r/GUI/ConfigWizard.cpp:566 msgid "Profile:" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:575 src/slic3r/GUI/ConfigWizard.cpp:603 +#: src/slic3r/GUI/ConfigWizard.cpp:603 src/slic3r/GUI/ConfigWizard.cpp:631 msgid "(All)" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:704 +#: src/slic3r/GUI/ConfigWizard.cpp:732 msgid "Custom Printer Setup" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:704 +#: src/slic3r/GUI/ConfigWizard.cpp:732 msgid "Custom Printer" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:706 +#: src/slic3r/GUI/ConfigWizard.cpp:734 msgid "Define a custom printer profile" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:708 +#: src/slic3r/GUI/ConfigWizard.cpp:736 msgid "Custom profile name:" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:732 +#: src/slic3r/GUI/ConfigWizard.cpp:760 msgid "Automatic updates" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:732 +#: src/slic3r/GUI/ConfigWizard.cpp:760 msgid "Updates" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:740 src/slic3r/GUI/Preferences.cpp:69 +#: src/slic3r/GUI/ConfigWizard.cpp:768 src/slic3r/GUI/Preferences.cpp:64 msgid "Check for application updates" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:744 +#: src/slic3r/GUI/ConfigWizard.cpp:772 #, possible-c-format msgid "" "If enabled, %s checks for new application versions online. When a new " @@ -620,11 +610,11 @@ msgid "" "notification mechanisms, no automatic installation is done." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:750 src/slic3r/GUI/Preferences.cpp:77 +#: src/slic3r/GUI/ConfigWizard.cpp:778 src/slic3r/GUI/Preferences.cpp:82 msgid "Update built-in Presets automatically" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:754 +#: src/slic3r/GUI/ConfigWizard.cpp:782 #, possible-c-format msgid "" "If enabled, %s downloads updates of built-in system presets in the " @@ -633,23 +623,45 @@ msgid "" "startup." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:757 +#: src/slic3r/GUI/ConfigWizard.cpp:785 msgid "" "Updates are never applied without user's consent and never overwrite user's " "customized settings." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:762 +#: src/slic3r/GUI/ConfigWizard.cpp:790 msgid "" "Additionally a backup snapshot of the whole configuration is created before " "an update is applied." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:769 +#: src/slic3r/GUI/ConfigWizard.cpp:798 src/slic3r/GUI/GUI_ObjectList.cpp:1655 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1658 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3932 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3935 src/slic3r/GUI/Plater.cpp:3211 +#: src/slic3r/GUI/Plater.cpp:3946 src/slic3r/GUI/Plater.cpp:3949 +#: src/slic3r/GUI/Plater.cpp:3980 src/slic3r/GUI/Plater.cpp:3983 +msgid "Reload from disk" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:801 +msgid "" +"Export full pathnames of models and parts sources into 3mf and amf files" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:805 +msgid "" +"If enabled, allows the Reload from disk command to automatically find and " +"load the files when invoked.\n" +"If not enabled, the Reload from disk command will ask to select each file " +"using an open file dialog." +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:814 msgid "View mode" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:771 +#: src/slic3r/GUI/ConfigWizard.cpp:816 msgid "" "PrusaSlicer's user interfaces comes in three variants:\n" "Simple, Advanced, and Expert.\n" @@ -658,202 +670,513 @@ msgid "" "fine-tuning, they are suitable for advanced and expert users, respectively." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:776 +#: src/slic3r/GUI/ConfigWizard.cpp:821 msgid "Simple mode" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:777 +#: src/slic3r/GUI/ConfigWizard.cpp:822 msgid "Advanced mode" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:778 +#: src/slic3r/GUI/ConfigWizard.cpp:823 msgid "Expert mode" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:812 +#: src/slic3r/GUI/ConfigWizard.cpp:857 msgid "Other Vendors" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:816 +#: src/slic3r/GUI/ConfigWizard.cpp:861 #, possible-c-format msgid "Pick another vendor supported by %s" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:847 +#: src/slic3r/GUI/ConfigWizard.cpp:892 msgid "Firmware Type" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:847 src/slic3r/GUI/Tab.cpp:1917 +#: src/slic3r/GUI/ConfigWizard.cpp:892 src/slic3r/GUI/Tab.cpp:1931 msgid "Firmware" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:851 +#: src/slic3r/GUI/ConfigWizard.cpp:896 msgid "Choose the type of firmware used by your printer." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:885 +#: src/slic3r/GUI/ConfigWizard.cpp:930 msgid "Bed Shape and Size" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:888 +#: src/slic3r/GUI/ConfigWizard.cpp:933 msgid "Set the shape of your printer's bed." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:908 +#: src/slic3r/GUI/ConfigWizard.cpp:953 msgid "Filament and Nozzle Diameters" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:908 +#: src/slic3r/GUI/ConfigWizard.cpp:953 msgid "Print Diameters" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:922 +#: src/slic3r/GUI/ConfigWizard.cpp:967 msgid "Enter the diameter of your printer's hot end nozzle." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:925 +#: src/slic3r/GUI/ConfigWizard.cpp:970 msgid "Nozzle Diameter:" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:935 +#: src/slic3r/GUI/ConfigWizard.cpp:980 msgid "Enter the diameter of your filament." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:936 +#: src/slic3r/GUI/ConfigWizard.cpp:981 msgid "" "Good precision is required, so use a caliper and do multiple measurements " "along the filament, then compute the average." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:939 +#: src/slic3r/GUI/ConfigWizard.cpp:984 msgid "Filament Diameter:" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:973 +#: src/slic3r/GUI/ConfigWizard.cpp:1018 msgid "Extruder and Bed Temperatures" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:973 +#: src/slic3r/GUI/ConfigWizard.cpp:1018 msgid "Temperatures" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:989 +#: src/slic3r/GUI/ConfigWizard.cpp:1034 msgid "Enter the temperature needed for extruding your filament." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:990 +#: src/slic3r/GUI/ConfigWizard.cpp:1035 msgid "A rule of thumb is 160 to 230 °C for PLA, and 215 to 250 °C for ABS." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:993 +#: src/slic3r/GUI/ConfigWizard.cpp:1038 msgid "Extrusion Temperature:" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:994 src/slic3r/GUI/ConfigWizard.cpp:1008 +#: src/slic3r/GUI/ConfigWizard.cpp:1039 src/slic3r/GUI/ConfigWizard.cpp:1053 msgid "°C" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1003 +#: src/slic3r/GUI/ConfigWizard.cpp:1048 msgid "" "Enter the bed temperature needed for getting your filament to stick to your " "heated bed." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1004 +#: src/slic3r/GUI/ConfigWizard.cpp:1049 msgid "" "A rule of thumb is 60 °C for PLA and 110 °C for ABS. Leave zero if you have " "no heated bed." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1007 +#: src/slic3r/GUI/ConfigWizard.cpp:1052 msgid "Bed Temperature:" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1426 src/slic3r/GUI/ConfigWizard.cpp:1862 +#: src/slic3r/GUI/ConfigWizard.cpp:1474 src/slic3r/GUI/ConfigWizard.cpp:2014 msgid "Filaments" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1426 src/slic3r/GUI/ConfigWizard.cpp:1864 +#: src/slic3r/GUI/ConfigWizard.cpp:1474 src/slic3r/GUI/ConfigWizard.cpp:2016 msgid "SLA Materials" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1480 +#: src/slic3r/GUI/ConfigWizard.cpp:1528 msgid "FFF Technology Printers" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1485 +#: src/slic3r/GUI/ConfigWizard.cpp:1533 msgid "SLA Technology Printers" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1625 +#: src/slic3r/GUI/ConfigWizard.cpp:1751 src/slic3r/GUI/DoubleSlider.cpp:1877 +#: src/slic3r/GUI/DoubleSlider.cpp:1898 src/slic3r/GUI/GUI.cpp:240 +msgid "Notice" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1760 msgid "You have to select at least one filament for selected printers" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1631 +#: src/slic3r/GUI/ConfigWizard.cpp:1761 +msgid "Do you want to automatic select default filaments?" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1771 msgid "You have to select at least one material for selected printers" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1831 +#: src/slic3r/GUI/ConfigWizard.cpp:1772 +msgid "Do you want to automatic select default materials?" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1979 msgid "Select all standard printers" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1834 +#: src/slic3r/GUI/ConfigWizard.cpp:1982 msgid "< &Back" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1835 +#: src/slic3r/GUI/ConfigWizard.cpp:1983 msgid "&Next >" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1836 +#: src/slic3r/GUI/ConfigWizard.cpp:1984 msgid "&Finish" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1837 src/slic3r/GUI/FirmwareDialog.cpp:151 -#: src/slic3r/GUI/ProgressStatusBar.cpp:27 +#: src/slic3r/GUI/ConfigWizard.cpp:1985 src/slic3r/GUI/FirmwareDialog.cpp:151 +#: src/slic3r/GUI/ProgressStatusBar.cpp:26 msgid "Cancel" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1850 +#: src/slic3r/GUI/ConfigWizard.cpp:1998 msgid "Prusa FFF Technology Printers" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1853 +#: src/slic3r/GUI/ConfigWizard.cpp:2001 msgid "Prusa MSLA Technology Printers" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1862 +#: src/slic3r/GUI/ConfigWizard.cpp:2014 msgid "Filament Profiles Selection" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1862 src/slic3r/GUI/GUI_ObjectList.cpp:3415 +#: src/slic3r/GUI/ConfigWizard.cpp:2014 src/slic3r/GUI/GUI_ObjectList.cpp:3528 msgid "Type:" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1864 +#: src/slic3r/GUI/ConfigWizard.cpp:2016 msgid "SLA Material Profiles Selection" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1864 +#: src/slic3r/GUI/ConfigWizard.cpp:2016 msgid "Layer height:" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1962 +#: src/slic3r/GUI/ConfigWizard.cpp:2112 msgid "Configuration Assistant" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1963 +#: src/slic3r/GUI/ConfigWizard.cpp:2113 msgid "Configuration &Assistant" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1965 +#: src/slic3r/GUI/ConfigWizard.cpp:2115 msgid "Configuration Wizard" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1966 +#: src/slic3r/GUI/ConfigWizard.cpp:2116 msgid "Configuration &Wizard" msgstr "" +#: src/slic3r/GUI/DoubleSlider.cpp:79 +msgid "Place bearings in slots and resume" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:923 +msgid "One layer mode" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:925 +msgid "Discard all custom changes" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:928 +msgid "For jump to print Z use left mouse button click OR (Shift+G)" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:929 +msgid "For set extruder sequence for whole print use right mouse button click" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:930 src/slic3r/GUI/DoubleSlider.cpp:1495 +msgid "Jump to print Z" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:933 +msgid "For edit current color use right mouse button click on colored band" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:941 +msgid "Slider(print) mode" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:955 +msgid "For add change extruder use left mouse button click" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:957 +msgid "" +"For add color change use left mouse button click if you want to use colors " +"from default color list, or Shift + left mouse button click if you want to " +"select a color" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:960 +msgid "For add color change use left mouse button click" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:961 +msgid "OR pres \"+\" key" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:963 +msgid "For add another code use Ctrl + left mouse button click" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:964 +msgid "For add another code use right mouse button click" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:973 +msgid "Color change (\"%1%\")" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:974 +msgid "Color change (\"%1%\") for Extruder %2%" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:977 +msgid "Pause print (\"%1%\")" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:979 +msgid "Extruder(tool) is changed to Extruder \"%1%\"" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:980 +msgid "\"%1%\"" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:986 +msgid "Note" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:988 +msgid "" +"G-code of this tick has a conflict with slider(print) mode.\n" +"Any its editing will cause a changes of DoubleSlider data." +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:991 +msgid "" +"There is a color change for extruder that wouldn't be used till the end of " +"printing.\n" +"This code wouldn't be processed during GCode generation." +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:994 +msgid "" +"There is a extruder change to the same extruder.\n" +"This code wouldn't be processed during GCode generation." +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:997 +msgid "" +"There is a color change for extruder that has not been used before.\n" +"Check your choice to avoid redundant color changes." +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:1002 +msgid "For Delete tick use left mouse button click OR pres \"-\" key" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:1004 +msgid "For Edit tick use Ctrl + Left mouse button click" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:1005 +msgid "For Edit tick use right mouse button click" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:1099 src/slic3r/GUI/DoubleSlider.cpp:1135 +#: src/slic3r/GUI/GLCanvas3D.cpp:982 src/slic3r/GUI/Tab.cpp:2302 +#: src/libslic3r/GCode/PreviewData.cpp:445 +#, possible-c-format +msgid "Extruder %d" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:1100 +msgid "active" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:1109 +msgid "Switch code to Change extruder" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:1109 src/slic3r/GUI/GUI_ObjectList.cpp:1666 +msgid "Change extruder" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:1110 +msgid "Change extruder (N/A)" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:1112 +msgid "Use another extruder" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:1136 +msgid "used" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:1144 +msgid "Switch code to Color change (%1%) for:" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:1145 +msgid "Add color change (%1%) for:" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:1443 +msgid "Add color change" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:1453 +msgid "Add pause print" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:1456 +msgid "Add custom G-code" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:1474 +msgid "Edit color" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:1475 +msgid "Edit pause print message" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:1476 +msgid "Edit custom G-code" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:1482 +msgid "Delete color change" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:1483 +msgid "Delete tool change" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:1484 +msgid "Delete pause print" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:1485 +msgid "Delete custom G-code" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:1498 +msgid "Set extruder sequence for whole print" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:1584 +msgid "Enter custom G-code used on current layer" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:1585 +msgid "Custom Gcode on current layer (%1% mm)." +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:1600 +msgid "Enter short message shown on Printer display during pause print" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:1601 +msgid "Message for pause print on current layer (%1% mm)." +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:1616 +msgid "Enter print z value to jump to" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:1617 +msgid "Jump to print z" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:1871 +msgid "" +"The last color change data was saved for a single extruder printer profile." +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:1872 +msgid "" +"The last color change data was saved for a multiple extruder printer profile." +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:1874 +msgid "Your current changes will cause a deletion of all saved color changes." +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:1875 src/slic3r/GUI/DoubleSlider.cpp:1896 +msgid "Are you sure you want to continue?" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:1888 +msgid "The last color change data was saved for a multi extruder printing." +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:1889 +msgid "" +"Select YES if you want to delete all saved tool changes, \n" +"\tNO if you want all tool changes switch to color changes, \n" +"\tor CANCEL for do nothing" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:1892 +msgid "Do you want to delete all saved tool changes?" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:1894 +msgid "" +"The last color change data was saved for a multi extruder printing with tool " +"changes for whole print." +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:1895 +msgid "Your current changes will cause a deletion of all saved tool changes." +msgstr "" + +#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:23 +msgid "Set extruder sequence" +msgstr "" + +#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:39 +msgid "Set extruder change for every" +msgstr "" + +#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:52 +#: src/libslic3r/PrintConfig.cpp:352 src/libslic3r/PrintConfig.cpp:995 +#: src/libslic3r/PrintConfig.cpp:1514 src/libslic3r/PrintConfig.cpp:1699 +#: src/libslic3r/PrintConfig.cpp:1760 src/libslic3r/PrintConfig.cpp:1940 +#: src/libslic3r/PrintConfig.cpp:1986 +msgid "layers" +msgstr "" + +#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:136 +msgid "Set extruder(tool) sequence" +msgstr "" + +#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:182 +msgid "Remove extruder from sequence" +msgstr "" + +#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:192 +msgid "Add extruder to sequence" +msgstr "" + #: src/slic3r/GUI/Field.cpp:131 msgid "default value" msgstr "" @@ -964,8 +1287,8 @@ msgstr "" msgid "Firmware image:" msgstr "" -#: src/slic3r/GUI/FirmwareDialog.cpp:805 src/slic3r/GUI/Tab.cpp:1635 -#: src/slic3r/GUI/Tab.cpp:1691 +#: src/slic3r/GUI/FirmwareDialog.cpp:805 src/slic3r/GUI/Tab.cpp:1649 +#: src/slic3r/GUI/Tab.cpp:1705 msgid "Browse" msgstr "" @@ -998,6 +1321,7 @@ msgid "Advanced: Output log" msgstr "" #: src/slic3r/GUI/FirmwareDialog.cpp:852 +#: src/slic3r/GUI/Mouse3DController.cpp:387 #: src/slic3r/GUI/PrintHostDialogs.cpp:161 msgid "Close" msgstr "" @@ -1016,293 +1340,304 @@ msgstr "" msgid "Cancelling..." msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:240 src/slic3r/GUI/GLCanvas3D.cpp:4365 +#: src/slic3r/GUI/GLCanvas3D.cpp:239 src/slic3r/GUI/GLCanvas3D.cpp:4622 msgid "Variable layer height" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:243 +#: src/slic3r/GUI/GLCanvas3D.cpp:242 msgid "Left mouse button:" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:246 +#: src/slic3r/GUI/GLCanvas3D.cpp:245 msgid "Add detail" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:249 +#: src/slic3r/GUI/GLCanvas3D.cpp:248 msgid "Right mouse button:" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:252 +#: src/slic3r/GUI/GLCanvas3D.cpp:251 msgid "Remove detail" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:255 +#: src/slic3r/GUI/GLCanvas3D.cpp:254 msgid "Shift + Left mouse button:" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:258 +#: src/slic3r/GUI/GLCanvas3D.cpp:257 msgid "Reset to base" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:261 +#: src/slic3r/GUI/GLCanvas3D.cpp:260 msgid "Shift + Right mouse button:" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:264 +#: src/slic3r/GUI/GLCanvas3D.cpp:263 msgid "Smoothing" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:267 +#: src/slic3r/GUI/GLCanvas3D.cpp:266 msgid "Mouse wheel:" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:270 +#: src/slic3r/GUI/GLCanvas3D.cpp:269 msgid "Increase/decrease edit area" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:273 +#: src/slic3r/GUI/GLCanvas3D.cpp:272 msgid "Adaptive" msgstr "" #: src/slic3r/GUI/GLCanvas3D.cpp:278 -msgid "Cusp (mm)" +msgid "Quality / Speed" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:286 +#: src/slic3r/GUI/GLCanvas3D.cpp:282 +msgid "Higher print quality versus higher print speed." +msgstr "" + +#: src/slic3r/GUI/GLCanvas3D.cpp:293 msgid "Smooth" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:291 src/libslic3r/PrintConfig.cpp:500 +#: src/slic3r/GUI/GLCanvas3D.cpp:299 src/libslic3r/PrintConfig.cpp:511 msgid "Radius" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:300 +#: src/slic3r/GUI/GLCanvas3D.cpp:309 msgid "Keep min" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:307 +#: src/slic3r/GUI/GLCanvas3D.cpp:318 msgid "Reset" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:695 +#: src/slic3r/GUI/GLCanvas3D.cpp:604 msgid "Variable layer height - Manual edit" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:794 +#: src/slic3r/GUI/GLCanvas3D.cpp:690 msgid "An object outside the print area was detected" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:795 +#: src/slic3r/GUI/GLCanvas3D.cpp:691 msgid "A toolpath outside the print area was detected" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:796 +#: src/slic3r/GUI/GLCanvas3D.cpp:692 msgid "SLA supports outside the print area were detected" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:797 -msgid "Some objects are not visible when editing supports" +#: src/slic3r/GUI/GLCanvas3D.cpp:693 +msgid "Some objects are not visible" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:799 +#: src/slic3r/GUI/GLCanvas3D.cpp:695 msgid "" "An object outside the print area was detected\n" "Resolve the current problem to continue slicing" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:1014 src/slic3r/GUI/GLCanvas3D.cpp:1042 +#: src/slic3r/GUI/GLCanvas3D.cpp:909 src/slic3r/GUI/GLCanvas3D.cpp:938 msgid "Default print color" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:1043 src/slic3r/GUI/GLCanvas3D.cpp:1052 -#: src/slic3r/GUI/GLCanvas3D.cpp:1091 +#: src/slic3r/GUI/GLCanvas3D.cpp:939 src/slic3r/GUI/GLCanvas3D.cpp:948 +#: src/slic3r/GUI/GLCanvas3D.cpp:987 msgid "Pause print or custom G-code" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:1064 +#: src/slic3r/GUI/GLCanvas3D.cpp:960 #, possible-c-format msgid "up to %.2f mm" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:1068 +#: src/slic3r/GUI/GLCanvas3D.cpp:964 #, possible-c-format msgid "above %.2f mm" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:1072 +#: src/slic3r/GUI/GLCanvas3D.cpp:968 #, possible-c-format msgid "%.2f - %.2f mm" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:1086 src/slic3r/GUI/Tab.cpp:2288 -#: src/slic3r/GUI/wxExtensions.cpp:3170 src/slic3r/GUI/wxExtensions.cpp:3421 -#: src/libslic3r/GCode/PreviewData.cpp:451 -#, possible-c-format -msgid "Extruder %d" -msgstr "" - -#: src/slic3r/GUI/GLCanvas3D.cpp:1099 +#: src/slic3r/GUI/GLCanvas3D.cpp:995 #, possible-c-format msgid "Color change for Extruder %d at %.2f mm" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:1673 +#: src/slic3r/GUI/GLCanvas3D.cpp:1306 +msgid "Seq." +msgstr "" + +#: src/slic3r/GUI/GLCanvas3D.cpp:1705 msgid "Variable layer height - Reset" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:1681 +#: src/slic3r/GUI/GLCanvas3D.cpp:1713 msgid "Variable layer height - Adaptive" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:1689 +#: src/slic3r/GUI/GLCanvas3D.cpp:1721 msgid "Variable layer height - Smooth all" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:2026 +#: src/slic3r/GUI/GLCanvas3D.cpp:2075 msgid "Mirror Object" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3297 +#: src/slic3r/GUI/GLCanvas3D.cpp:2945 +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:571 +msgid "Gizmo-Move" +msgstr "" + +#: src/slic3r/GUI/GLCanvas3D.cpp:3025 +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:573 +msgid "Gizmo-Rotate" +msgstr "" + +#: src/slic3r/GUI/GLCanvas3D.cpp:3538 msgid "Move Object" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3843 +#: src/slic3r/GUI/GLCanvas3D.cpp:4085 msgid "Undo History" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3843 +#: src/slic3r/GUI/GLCanvas3D.cpp:4085 msgid "Redo History" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3861 +#: src/slic3r/GUI/GLCanvas3D.cpp:4103 #, possible-c-format msgid "Undo %1$d Action" msgid_plural "Undo %1$d Actions" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3861 +#: src/slic3r/GUI/GLCanvas3D.cpp:4103 #, possible-c-format msgid "Redo %1$d Action" msgid_plural "Redo %1$d Actions" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4259 +#: src/slic3r/GUI/GLCanvas3D.cpp:4516 msgid "Add..." msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4267 src/slic3r/GUI/GUI_ObjectList.cpp:1592 -#: src/slic3r/GUI/Plater.cpp:3712 src/slic3r/GUI/Plater.cpp:3734 -#: src/slic3r/GUI/Tab.cpp:3080 +#: src/slic3r/GUI/GLCanvas3D.cpp:4524 src/slic3r/GUI/GUI_ObjectList.cpp:1697 +#: src/slic3r/GUI/Plater.cpp:3942 src/slic3r/GUI/Plater.cpp:3969 +#: src/slic3r/GUI/Tab.cpp:3094 msgid "Delete" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4276 src/slic3r/GUI/Plater.cpp:4410 +#: src/slic3r/GUI/GLCanvas3D.cpp:4533 src/slic3r/GUI/Plater.cpp:4693 msgid "Delete all" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4285 src/slic3r/GUI/KBShortcutsDialog.cpp:137 -#: src/slic3r/GUI/Plater.cpp:2758 +#: src/slic3r/GUI/GLCanvas3D.cpp:4542 src/slic3r/GUI/KBShortcutsDialog.cpp:137 +#: src/slic3r/GUI/Plater.cpp:2740 msgid "Arrange" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4285 src/slic3r/GUI/KBShortcutsDialog.cpp:138 +#: src/slic3r/GUI/GLCanvas3D.cpp:4542 src/slic3r/GUI/KBShortcutsDialog.cpp:138 msgid "Arrange selection" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4297 +#: src/slic3r/GUI/GLCanvas3D.cpp:4554 msgid "Copy" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4306 +#: src/slic3r/GUI/GLCanvas3D.cpp:4563 msgid "Paste" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4318 src/slic3r/GUI/Plater.cpp:3569 -#: src/slic3r/GUI/Plater.cpp:3581 src/slic3r/GUI/Plater.cpp:3721 +#: src/slic3r/GUI/GLCanvas3D.cpp:4575 src/slic3r/GUI/Plater.cpp:3799 +#: src/slic3r/GUI/Plater.cpp:3811 src/slic3r/GUI/Plater.cpp:3956 msgid "Add instance" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4329 src/slic3r/GUI/Plater.cpp:3723 +#: src/slic3r/GUI/GLCanvas3D.cpp:4586 src/slic3r/GUI/Plater.cpp:3958 msgid "Remove instance" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4342 +#: src/slic3r/GUI/GLCanvas3D.cpp:4599 msgid "Split to objects" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4352 src/slic3r/GUI/GUI_ObjectList.cpp:1424 +#: src/slic3r/GUI/GLCanvas3D.cpp:4609 src/slic3r/GUI/GUI_ObjectList.cpp:1485 msgid "Split to parts" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4416 src/slic3r/GUI/MainFrame.cpp:571 +#: src/slic3r/GUI/GLCanvas3D.cpp:4673 src/slic3r/GUI/MainFrame.cpp:581 msgid "Undo" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4416 src/slic3r/GUI/GLCanvas3D.cpp:4449 +#: src/slic3r/GUI/GLCanvas3D.cpp:4673 src/slic3r/GUI/GLCanvas3D.cpp:4706 msgid "Click right mouse button to open History" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4433 +#: src/slic3r/GUI/GLCanvas3D.cpp:4690 msgid "Next Undo action: %1%" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4449 src/slic3r/GUI/MainFrame.cpp:574 +#: src/slic3r/GUI/GLCanvas3D.cpp:4706 src/slic3r/GUI/MainFrame.cpp:584 msgid "Redo" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4465 +#: src/slic3r/GUI/GLCanvas3D.cpp:4722 msgid "Next Redo action: %1%" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:6380 +#: src/slic3r/GUI/GLCanvas3D.cpp:6659 msgid "Selection-Add from rectangle" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:6399 +#: src/slic3r/GUI/GLCanvas3D.cpp:6678 msgid "Selection-Remove from rectangle" msgstr "" -#: src/slic3r/GUI/GLCanvas3DManager.cpp:283 +#: src/slic3r/GUI/GLCanvas3DManager.cpp:284 #, possible-c-format msgid "" "PrusaSlicer requires OpenGL 2.0 capable graphics driver to run correctly, \n" "while OpenGL version %s, render %s, vendor %s was detected." msgstr "" -#: src/slic3r/GUI/GLCanvas3DManager.cpp:286 +#: src/slic3r/GUI/GLCanvas3DManager.cpp:287 msgid "You may need to update your graphics card driver." msgstr "" -#: src/slic3r/GUI/GLCanvas3DManager.cpp:289 +#: src/slic3r/GUI/GLCanvas3DManager.cpp:290 msgid "" "As a workaround, you may run PrusaSlicer with a software rendered 3D " "graphics by running prusa-slicer.exe with the --sw_renderer parameter." msgstr "" -#: src/slic3r/GUI/GLCanvas3DManager.cpp:291 +#: src/slic3r/GUI/GLCanvas3DManager.cpp:292 msgid "Unsupported OpenGL version" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:40 -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:145 src/libslic3r/PrintConfig.cpp:3329 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:42 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:144 src/libslic3r/PrintConfig.cpp:3397 msgid "Cut" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:150 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:168 msgid "Keep upper part" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:151 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:169 msgid "Keep lower part" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:152 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:170 msgid "Rotate lower part upwards" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:155 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:175 msgid "Perform cut" msgstr "" @@ -1310,42 +1645,100 @@ msgstr "" msgid "Place on face" msgstr "" +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:41 +msgid "Hollow this object" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:42 +msgid "Preview hollowed and drilled model" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:43 +msgid "Offset" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:44 +msgid "Quality" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:45 +msgid "Closing distance" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:46 +msgid "Hole diameter" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:47 +msgid "Hole depth" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:48 +msgid "Remove selected holes" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:49 +msgid "Remove all holes" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:50 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:58 +msgid "Clipping of view" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:51 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:59 +msgid "Reset direction" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:52 +msgid "Show supports" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:413 +msgid "Add drainage hole" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:530 +msgid "Delete drainage hole" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:786 +msgid "Hollowing parameter change" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:858 +msgid "Change drainage hole diameter" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:948 +msgid "Hollowing and drilling" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:1027 +msgid "Move drainage hole" +msgstr "" + #: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:48 msgid "Move" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:177 -msgid "Position (mm)" -msgstr "" - -#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:177 -msgid "Displacement (mm)" -msgstr "" - #: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:449 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:480 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:499 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:517 -#: src/libslic3r/PrintConfig.cpp:3378 +#: src/libslic3r/PrintConfig.cpp:3446 msgid "Rotate" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:482 -msgid "Rotation (deg)" -msgstr "" - #: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:47 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:230 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:500 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:518 -#: src/libslic3r/PrintConfig.cpp:3393 +#: src/libslic3r/PrintConfig.cpp:3461 msgid "Scale" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:292 -msgid "Scale (%)" -msgstr "" - #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:48 msgid "Head diameter" msgstr "" @@ -1355,7 +1748,7 @@ msgid "Lock supports under new islands" msgstr "" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:50 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1286 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1350 msgid "Remove selected points" msgstr "" @@ -1364,12 +1757,12 @@ msgid "Remove all points" msgstr "" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:52 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1289 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1353 msgid "Apply changes" msgstr "" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:53 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1290 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1354 msgid "Discard changes" msgstr "" @@ -1378,12 +1771,12 @@ msgid "Minimal points distance" msgstr "" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:55 -#: src/libslic3r/PrintConfig.cpp:2732 +#: src/libslic3r/PrintConfig.cpp:2765 msgid "Support points density" msgstr "" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:56 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1292 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1356 msgid "Auto-generate points" msgstr "" @@ -1391,169 +1784,149 @@ msgstr "" msgid "Manual editing" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:58 -msgid "Clipping of view" -msgstr "" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:59 -msgid "Reset direction" -msgstr "" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:442 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:479 msgid "Add support point" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:578 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:615 msgid "Delete support point" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:754 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:804 msgid "Change point head diameter" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:820 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:872 msgid "Support parameter change" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:929 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:978 msgid "SLA Support Points" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:950 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:999 msgid "SLA gizmo turned on" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:972 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1024 msgid "Do you want to save your manually edited support points?" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:973 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1025 msgid "Save changes?" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:985 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1037 msgid "SLA gizmo turned off" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1022 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1076 msgid "Move support point" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1121 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1175 msgid "Support points edit" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1190 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1247 msgid "Autogeneration will erase all manually edited points." msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1191 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1248 msgid "Are you sure you want to do it?" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1192 src/slic3r/GUI/GUI.cpp:246 -#: src/slic3r/GUI/Tab.cpp:3040 src/slic3r/GUI/WipeTowerDialog.cpp:45 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1249 src/slic3r/GUI/GUI.cpp:246 +#: src/slic3r/GUI/Tab.cpp:3054 src/slic3r/GUI/WipeTowerDialog.cpp:45 #: src/slic3r/GUI/WipeTowerDialog.cpp:366 msgid "Warning" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1195 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1252 msgid "Autogenerate support points" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1249 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1313 msgid "SLA gizmo keyboard shortcuts" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1260 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1324 msgid "Note: some shortcuts work in (non)editing mode only." msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1278 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1281 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1282 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1342 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1345 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1346 msgid "Left click" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1278 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1342 msgid "Add point" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1279 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1343 msgid "Right click" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1279 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1343 msgid "Remove point" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1280 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1283 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1284 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1344 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1347 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1348 msgid "Drag" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1280 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1344 msgid "Move point" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1281 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1345 msgid "Add point to selection" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1282 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1346 msgid "Remove point from selection" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1283 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1347 msgid "Select by rectangle" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1284 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1348 msgid "Deselect by rectangle" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1285 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1349 msgid "Select all points" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1287 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1351 msgid "Mouse wheel" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1287 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1351 msgid "Move clipping plane" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1288 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1352 msgid "Reset clipping plane" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1291 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1355 msgid "Switch to editing mode" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:477 +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:498 msgid "Gizmo-Place on Face" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:550 -msgid "Gizmo-Move" -msgstr "" - -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:552 +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:572 msgid "Gizmo-Scale" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:554 -msgid "Gizmo-Rotate" -msgstr "" - -#: src/slic3r/GUI/GUI.cpp:240 -msgid "Notice" -msgstr "" - -#: src/slic3r/GUI/GUI_App.cpp:137 +#: src/slic3r/GUI/GUI_App.cpp:138 #, possible-c-format msgid "" "%s has encountered an error. It was likely caused by running out of memory. " @@ -1563,175 +1936,183 @@ msgid "" "The application will now terminate." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:140 +#: src/slic3r/GUI/GUI_App.cpp:141 msgid "Fatal error" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:450 +#: src/slic3r/GUI/GUI_App.cpp:442 msgid "Changing of an application language" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:458 src/slic3r/GUI/GUI_App.cpp:467 +#: src/slic3r/GUI/GUI_App.cpp:450 src/slic3r/GUI/GUI_App.cpp:459 msgid "Recreating" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:471 +#: src/slic3r/GUI/GUI_App.cpp:466 msgid "Loading of current presets" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:479 +#: src/slic3r/GUI/GUI_App.cpp:474 msgid "Loading of a mode view" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:560 +#: src/slic3r/GUI/GUI_App.cpp:555 msgid "Choose one file (3MF/AMF):" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:572 +#: src/slic3r/GUI/GUI_App.cpp:567 msgid "Choose one or more files (STL/OBJ/AMF/3MF/PRUSA):" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:634 +#: src/slic3r/GUI/GUI_App.cpp:629 msgid "Select the language" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:634 +#: src/slic3r/GUI/GUI_App.cpp:629 msgid "Language" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:802 +#: src/slic3r/GUI/GUI_App.cpp:797 #, possible-c-format msgid "Run %s" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:805 +#: src/slic3r/GUI/GUI_App.cpp:800 msgid "&Configuration Snapshots" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:805 +#: src/slic3r/GUI/GUI_App.cpp:800 msgid "Inspect / activate configuration snapshots" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:806 +#: src/slic3r/GUI/GUI_App.cpp:801 msgid "Take Configuration &Snapshot" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:806 +#: src/slic3r/GUI/GUI_App.cpp:801 msgid "Capture a configuration snapshot" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:809 +#: src/slic3r/GUI/GUI_App.cpp:802 +msgid "Check for updates" +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:802 +msgid "Check for configuration updates" +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:804 msgid "&Preferences" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:815 +#: src/slic3r/GUI/GUI_App.cpp:810 msgid "Application preferences" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:818 src/slic3r/GUI/wxExtensions.cpp:3824 +#: src/slic3r/GUI/GUI_App.cpp:813 src/slic3r/GUI/wxExtensions.cpp:730 msgid "Simple" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:818 +#: src/slic3r/GUI/GUI_App.cpp:813 msgid "Simple View Mode" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:819 src/slic3r/GUI/GUI_ObjectList.cpp:97 -#: src/slic3r/GUI/GUI_ObjectList.cpp:617 src/slic3r/GUI/Tab.cpp:1067 -#: src/slic3r/GUI/Tab.cpp:1082 src/slic3r/GUI/Tab.cpp:1181 -#: src/slic3r/GUI/Tab.cpp:1184 src/slic3r/GUI/Tab.cpp:1450 -#: src/slic3r/GUI/Tab.cpp:1937 src/slic3r/GUI/Tab.cpp:3614 -#: src/slic3r/GUI/wxExtensions.cpp:3825 src/libslic3r/PrintConfig.cpp:88 -#: src/libslic3r/PrintConfig.cpp:202 src/libslic3r/PrintConfig.cpp:365 -#: src/libslic3r/PrintConfig.cpp:1026 src/libslic3r/PrintConfig.cpp:2253 +#: src/slic3r/GUI/GUI_App.cpp:814 src/slic3r/GUI/GUI_ObjectList.cpp:102 +#: src/slic3r/GUI/GUI_ObjectList.cpp:620 src/slic3r/GUI/Tab.cpp:1077 +#: src/slic3r/GUI/Tab.cpp:1092 src/slic3r/GUI/Tab.cpp:1191 +#: src/slic3r/GUI/Tab.cpp:1194 src/slic3r/GUI/Tab.cpp:1464 +#: src/slic3r/GUI/Tab.cpp:1951 src/slic3r/GUI/Tab.cpp:3633 +#: src/slic3r/GUI/wxExtensions.cpp:731 src/libslic3r/PrintConfig.cpp:88 +#: src/libslic3r/PrintConfig.cpp:213 src/libslic3r/PrintConfig.cpp:376 +#: src/libslic3r/PrintConfig.cpp:1038 src/libslic3r/PrintConfig.cpp:2286 msgid "Advanced" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:819 +#: src/slic3r/GUI/GUI_App.cpp:814 msgid "Advanced View Mode" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:820 src/slic3r/GUI/wxExtensions.cpp:3826 +#: src/slic3r/GUI/GUI_App.cpp:815 src/slic3r/GUI/wxExtensions.cpp:732 msgid "Expert" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:820 +#: src/slic3r/GUI/GUI_App.cpp:815 msgid "Expert View Mode" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:825 +#: src/slic3r/GUI/GUI_App.cpp:820 msgid "Mode" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:825 +#: src/slic3r/GUI/GUI_App.cpp:820 #, possible-c-format msgid "%s View Mode" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:827 +#: src/slic3r/GUI/GUI_App.cpp:822 msgid "Change Application &Language" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:829 +#: src/slic3r/GUI/GUI_App.cpp:824 msgid "Flash printer &firmware" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:829 +#: src/slic3r/GUI/GUI_App.cpp:824 msgid "Upload a firmware image into an Arduino based printer" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:841 +#: src/slic3r/GUI/GUI_App.cpp:839 msgid "Taking configuration snapshot" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:841 +#: src/slic3r/GUI/GUI_App.cpp:839 msgid "Snapshot name" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:884 +#: src/slic3r/GUI/GUI_App.cpp:882 msgid "" "Switching the language will trigger application restart.\n" "You will lose content of the plater." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:886 +#: src/slic3r/GUI/GUI_App.cpp:884 msgid "Do you want to proceed?" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:887 +#: src/slic3r/GUI/GUI_App.cpp:885 msgid "Language selection" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:910 +#: src/slic3r/GUI/GUI_App.cpp:908 msgid "&Configuration" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:934 +#: src/slic3r/GUI/GUI_App.cpp:932 msgid "The presets on the following tabs were modified" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:934 src/slic3r/GUI/Tab.cpp:2902 +#: src/slic3r/GUI/GUI_App.cpp:932 src/slic3r/GUI/Tab.cpp:2916 msgid "Discard changes and continue anyway?" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:937 +#: src/slic3r/GUI/GUI_App.cpp:935 msgid "Unsaved Presets" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1083 src/slic3r/GUI/Tab.cpp:2914 +#: src/slic3r/GUI/GUI_App.cpp:1084 src/slic3r/GUI/Tab.cpp:2928 msgid "It's impossible to print multi-part object(s) with SLA technology." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1084 +#: src/slic3r/GUI/GUI_App.cpp:1085 msgid "Please check and fix your object list." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1085 src/slic3r/GUI/Plater.cpp:2317 -#: src/slic3r/GUI/Tab.cpp:2916 +#: src/slic3r/GUI/GUI_App.cpp:1086 src/slic3r/GUI/Plater.cpp:2299 +#: src/slic3r/GUI/Tab.cpp:2930 msgid "Attention!" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1102 +#: src/slic3r/GUI/GUI_App.cpp:1103 msgid "Select a gcode file:" msgstr "" @@ -1751,37 +2132,38 @@ msgstr "" msgid "Add layer range" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:34 src/slic3r/GUI/GUI_ObjectList.cpp:88 -#: src/slic3r/GUI/GUI_ObjectList.cpp:608 src/libslic3r/PrintConfig.cpp:72 -#: src/libslic3r/PrintConfig.cpp:165 src/libslic3r/PrintConfig.cpp:397 -#: src/libslic3r/PrintConfig.cpp:459 src/libslic3r/PrintConfig.cpp:467 -#: src/libslic3r/PrintConfig.cpp:879 src/libslic3r/PrintConfig.cpp:1064 -#: src/libslic3r/PrintConfig.cpp:1369 src/libslic3r/PrintConfig.cpp:1436 -#: src/libslic3r/PrintConfig.cpp:1617 src/libslic3r/PrintConfig.cpp:2063 -#: src/libslic3r/PrintConfig.cpp:2122 +#: src/slic3r/GUI/GUI_ObjectList.cpp:34 src/slic3r/GUI/GUI_ObjectList.cpp:93 +#: src/slic3r/GUI/GUI_ObjectList.cpp:611 src/libslic3r/PrintConfig.cpp:72 +#: src/libslic3r/PrintConfig.cpp:165 src/libslic3r/PrintConfig.cpp:174 +#: src/libslic3r/PrintConfig.cpp:408 src/libslic3r/PrintConfig.cpp:470 +#: src/libslic3r/PrintConfig.cpp:478 src/libslic3r/PrintConfig.cpp:891 +#: src/libslic3r/PrintConfig.cpp:1076 src/libslic3r/PrintConfig.cpp:1383 +#: src/libslic3r/PrintConfig.cpp:1450 src/libslic3r/PrintConfig.cpp:1631 +#: src/libslic3r/PrintConfig.cpp:2084 src/libslic3r/PrintConfig.cpp:2143 +#: src/libslic3r/PrintConfig.cpp:2152 msgid "Layers and Perimeters" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:36 src/slic3r/GUI/GUI_ObjectList.cpp:90 -#: src/slic3r/GUI/GUI_ObjectList.cpp:610 src/slic3r/GUI/GUI_Preview.cpp:245 -#: src/slic3r/GUI/Tab.cpp:1100 src/slic3r/GUI/Tab.cpp:1101 -#: src/libslic3r/ExtrusionEntity.cpp:319 src/libslic3r/PrintConfig.cpp:349 -#: src/libslic3r/PrintConfig.cpp:1497 src/libslic3r/PrintConfig.cpp:1855 -#: src/libslic3r/PrintConfig.cpp:1861 src/libslic3r/PrintConfig.cpp:1869 -#: src/libslic3r/PrintConfig.cpp:1881 src/libslic3r/PrintConfig.cpp:1891 -#: src/libslic3r/PrintConfig.cpp:1899 src/libslic3r/PrintConfig.cpp:1914 -#: src/libslic3r/PrintConfig.cpp:1935 src/libslic3r/PrintConfig.cpp:1947 -#: src/libslic3r/PrintConfig.cpp:1963 src/libslic3r/PrintConfig.cpp:1972 -#: src/libslic3r/PrintConfig.cpp:1981 src/libslic3r/PrintConfig.cpp:1992 -#: src/libslic3r/PrintConfig.cpp:2006 src/libslic3r/PrintConfig.cpp:2014 -#: src/libslic3r/PrintConfig.cpp:2015 src/libslic3r/PrintConfig.cpp:2024 -#: src/libslic3r/PrintConfig.cpp:2032 src/libslic3r/PrintConfig.cpp:2046 +#: src/slic3r/GUI/GUI_ObjectList.cpp:36 src/slic3r/GUI/GUI_ObjectList.cpp:95 +#: src/slic3r/GUI/GUI_ObjectList.cpp:613 src/slic3r/GUI/GUI_Preview.cpp:248 +#: src/slic3r/GUI/Tab.cpp:1110 src/slic3r/GUI/Tab.cpp:1111 +#: src/libslic3r/ExtrusionEntity.cpp:319 src/libslic3r/PrintConfig.cpp:360 +#: src/libslic3r/PrintConfig.cpp:1511 src/libslic3r/PrintConfig.cpp:1876 +#: src/libslic3r/PrintConfig.cpp:1882 src/libslic3r/PrintConfig.cpp:1890 +#: src/libslic3r/PrintConfig.cpp:1902 src/libslic3r/PrintConfig.cpp:1912 +#: src/libslic3r/PrintConfig.cpp:1920 src/libslic3r/PrintConfig.cpp:1935 +#: src/libslic3r/PrintConfig.cpp:1956 src/libslic3r/PrintConfig.cpp:1968 +#: src/libslic3r/PrintConfig.cpp:1984 src/libslic3r/PrintConfig.cpp:1993 +#: src/libslic3r/PrintConfig.cpp:2002 src/libslic3r/PrintConfig.cpp:2013 +#: src/libslic3r/PrintConfig.cpp:2027 src/libslic3r/PrintConfig.cpp:2035 +#: src/libslic3r/PrintConfig.cpp:2036 src/libslic3r/PrintConfig.cpp:2045 +#: src/libslic3r/PrintConfig.cpp:2053 src/libslic3r/PrintConfig.cpp:2067 msgid "Support material" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:39 src/slic3r/GUI/GUI_ObjectList.cpp:94 -#: src/slic3r/GUI/GUI_ObjectList.cpp:614 src/libslic3r/PrintConfig.cpp:2229 -#: src/libslic3r/PrintConfig.cpp:2237 +#: src/slic3r/GUI/GUI_ObjectList.cpp:39 src/slic3r/GUI/GUI_ObjectList.cpp:99 +#: src/slic3r/GUI/GUI_ObjectList.cpp:617 src/libslic3r/PrintConfig.cpp:2262 +#: src/libslic3r/PrintConfig.cpp:2270 msgid "Wipe options" msgstr "" @@ -1805,505 +2187,515 @@ msgstr "" msgid "Add support blocker" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:91 src/slic3r/GUI/GUI_ObjectList.cpp:611 -#: src/slic3r/GUI/GUI_Preview.cpp:223 src/slic3r/GUI/Tab.cpp:1125 -#: src/libslic3r/PrintConfig.cpp:214 src/libslic3r/PrintConfig.cpp:447 -#: src/libslic3r/PrintConfig.cpp:908 src/libslic3r/PrintConfig.cpp:1037 -#: src/libslic3r/PrintConfig.cpp:1426 src/libslic3r/PrintConfig.cpp:1663 -#: src/libslic3r/PrintConfig.cpp:1712 src/libslic3r/PrintConfig.cpp:1764 -#: src/libslic3r/PrintConfig.cpp:2107 +#: src/slic3r/GUI/GUI_ObjectList.cpp:96 src/slic3r/GUI/GUI_ObjectList.cpp:614 +#: src/slic3r/GUI/GUI_Preview.cpp:226 src/slic3r/GUI/Tab.cpp:1135 +#: src/libslic3r/PrintConfig.cpp:225 src/libslic3r/PrintConfig.cpp:458 +#: src/libslic3r/PrintConfig.cpp:920 src/libslic3r/PrintConfig.cpp:1049 +#: src/libslic3r/PrintConfig.cpp:1440 src/libslic3r/PrintConfig.cpp:1677 +#: src/libslic3r/PrintConfig.cpp:1726 src/libslic3r/PrintConfig.cpp:1778 +#: src/libslic3r/PrintConfig.cpp:2128 msgid "Speed" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:92 src/slic3r/GUI/GUI_ObjectList.cpp:612 -#: src/slic3r/GUI/Tab.cpp:1160 src/slic3r/GUI/Tab.cpp:1808 -#: src/libslic3r/PrintConfig.cpp:477 src/libslic3r/PrintConfig.cpp:991 -#: src/libslic3r/PrintConfig.cpp:1404 src/libslic3r/PrintConfig.cpp:1733 -#: src/libslic3r/PrintConfig.cpp:1927 src/libslic3r/PrintConfig.cpp:1954 +#: src/slic3r/GUI/GUI_ObjectList.cpp:97 src/slic3r/GUI/GUI_ObjectList.cpp:615 +#: src/slic3r/GUI/Tab.cpp:1170 src/slic3r/GUI/Tab.cpp:1822 +#: src/libslic3r/PrintConfig.cpp:488 src/libslic3r/PrintConfig.cpp:1003 +#: src/libslic3r/PrintConfig.cpp:1418 src/libslic3r/PrintConfig.cpp:1747 +#: src/libslic3r/PrintConfig.cpp:1948 src/libslic3r/PrintConfig.cpp:1975 msgid "Extruders" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:93 src/slic3r/GUI/GUI_ObjectList.cpp:613 -#: src/libslic3r/PrintConfig.cpp:436 src/libslic3r/PrintConfig.cpp:544 -#: src/libslic3r/PrintConfig.cpp:866 src/libslic3r/PrintConfig.cpp:999 -#: src/libslic3r/PrintConfig.cpp:1413 src/libslic3r/PrintConfig.cpp:1753 -#: src/libslic3r/PrintConfig.cpp:1936 src/libslic3r/PrintConfig.cpp:2095 +#: src/slic3r/GUI/GUI_ObjectList.cpp:98 src/slic3r/GUI/GUI_ObjectList.cpp:616 +#: src/libslic3r/PrintConfig.cpp:447 src/libslic3r/PrintConfig.cpp:555 +#: src/libslic3r/PrintConfig.cpp:878 src/libslic3r/PrintConfig.cpp:1011 +#: src/libslic3r/PrintConfig.cpp:1427 src/libslic3r/PrintConfig.cpp:1767 +#: src/libslic3r/PrintConfig.cpp:1957 src/libslic3r/PrintConfig.cpp:2116 msgid "Extrusion Width" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:99 src/slic3r/GUI/GUI_ObjectList.cpp:619 -#: src/slic3r/GUI/Plater.cpp:484 src/slic3r/GUI/Tab.cpp:3564 -#: src/slic3r/GUI/Tab.cpp:3565 src/libslic3r/PrintConfig.cpp:2582 -#: src/libslic3r/PrintConfig.cpp:2589 src/libslic3r/PrintConfig.cpp:2598 -#: src/libslic3r/PrintConfig.cpp:2607 src/libslic3r/PrintConfig.cpp:2617 -#: src/libslic3r/PrintConfig.cpp:2643 src/libslic3r/PrintConfig.cpp:2650 -#: src/libslic3r/PrintConfig.cpp:2661 src/libslic3r/PrintConfig.cpp:2671 -#: src/libslic3r/PrintConfig.cpp:2680 src/libslic3r/PrintConfig.cpp:2693 -#: src/libslic3r/PrintConfig.cpp:2703 src/libslic3r/PrintConfig.cpp:2712 -#: src/libslic3r/PrintConfig.cpp:2722 src/libslic3r/PrintConfig.cpp:2733 -#: src/libslic3r/PrintConfig.cpp:2741 +#: src/slic3r/GUI/GUI_ObjectList.cpp:104 src/slic3r/GUI/GUI_ObjectList.cpp:622 +#: src/slic3r/GUI/Plater.cpp:492 src/slic3r/GUI/Tab.cpp:3576 +#: src/slic3r/GUI/Tab.cpp:3577 src/libslic3r/PrintConfig.cpp:2615 +#: src/libslic3r/PrintConfig.cpp:2622 src/libslic3r/PrintConfig.cpp:2631 +#: src/libslic3r/PrintConfig.cpp:2640 src/libslic3r/PrintConfig.cpp:2650 +#: src/libslic3r/PrintConfig.cpp:2676 src/libslic3r/PrintConfig.cpp:2683 +#: src/libslic3r/PrintConfig.cpp:2694 src/libslic3r/PrintConfig.cpp:2704 +#: src/libslic3r/PrintConfig.cpp:2713 src/libslic3r/PrintConfig.cpp:2726 +#: src/libslic3r/PrintConfig.cpp:2736 src/libslic3r/PrintConfig.cpp:2745 +#: src/libslic3r/PrintConfig.cpp:2755 src/libslic3r/PrintConfig.cpp:2766 +#: src/libslic3r/PrintConfig.cpp:2774 msgid "Supports" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:100 src/slic3r/GUI/GUI_ObjectList.cpp:620 -#: src/slic3r/GUI/Plater.cpp:624 src/slic3r/GUI/Tab.cpp:3596 -#: src/slic3r/GUI/Tab.cpp:3597 src/libslic3r/PrintConfig.cpp:2749 -#: src/libslic3r/PrintConfig.cpp:2756 src/libslic3r/PrintConfig.cpp:2770 -#: src/libslic3r/PrintConfig.cpp:2781 src/libslic3r/PrintConfig.cpp:2791 -#: src/libslic3r/PrintConfig.cpp:2813 src/libslic3r/PrintConfig.cpp:2824 -#: src/libslic3r/PrintConfig.cpp:2831 src/libslic3r/PrintConfig.cpp:2838 -#: src/libslic3r/PrintConfig.cpp:2849 src/libslic3r/PrintConfig.cpp:2858 -#: src/libslic3r/PrintConfig.cpp:2867 +#: src/slic3r/GUI/GUI_ObjectList.cpp:105 src/slic3r/GUI/GUI_ObjectList.cpp:623 +#: src/slic3r/GUI/Plater.cpp:632 src/slic3r/GUI/Tab.cpp:3608 +#: src/slic3r/GUI/Tab.cpp:3609 src/libslic3r/PrintConfig.cpp:2782 +#: src/libslic3r/PrintConfig.cpp:2789 src/libslic3r/PrintConfig.cpp:2803 +#: src/libslic3r/PrintConfig.cpp:2814 src/libslic3r/PrintConfig.cpp:2824 +#: src/libslic3r/PrintConfig.cpp:2846 src/libslic3r/PrintConfig.cpp:2857 +#: src/libslic3r/PrintConfig.cpp:2864 src/libslic3r/PrintConfig.cpp:2871 +#: src/libslic3r/PrintConfig.cpp:2882 src/libslic3r/PrintConfig.cpp:2891 +#: src/libslic3r/PrintConfig.cpp:2900 msgid "Pad" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:262 +#: src/slic3r/GUI/GUI_ObjectList.cpp:106 src/slic3r/GUI/Tab.cpp:3626 +#: src/slic3r/GUI/Tab.cpp:3627 src/libslic3r/SLA/Hollowing.cpp:46 +#: src/libslic3r/SLA/Hollowing.cpp:58 src/libslic3r/SLA/Hollowing.cpp:67 +#: src/libslic3r/SLA/Hollowing.cpp:76 src/libslic3r/PrintConfig.cpp:2910 +#: src/libslic3r/PrintConfig.cpp:2917 src/libslic3r/PrintConfig.cpp:2927 +#: src/libslic3r/PrintConfig.cpp:2936 +msgid "Hollowing" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:268 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:153 msgid "Name" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:270 src/slic3r/GUI/Tab.cpp:1414 -#: src/slic3r/GUI/wxExtensions.cpp:549 src/libslic3r/PrintConfig.cpp:476 +#: src/slic3r/GUI/GUI_ObjectList.cpp:276 src/slic3r/GUI/Tab.cpp:1428 +#: src/slic3r/GUI/wxExtensions.cpp:589 src/libslic3r/PrintConfig.cpp:487 msgid "Extruder" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:274 src/slic3r/GUI/GUI_ObjectList.cpp:386 +#: src/slic3r/GUI/GUI_ObjectList.cpp:280 src/slic3r/GUI/GUI_ObjectList.cpp:392 msgid "Editing" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:331 +#: src/slic3r/GUI/GUI_ObjectList.cpp:337 #, possible-c-format msgid "Auto-repaired (%d errors):" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:338 +#: src/slic3r/GUI/GUI_ObjectList.cpp:344 msgid "degenerate facets" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:339 +#: src/slic3r/GUI/GUI_ObjectList.cpp:345 msgid "edges fixed" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:340 +#: src/slic3r/GUI/GUI_ObjectList.cpp:346 msgid "facets removed" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:341 +#: src/slic3r/GUI/GUI_ObjectList.cpp:347 msgid "facets added" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:342 +#: src/slic3r/GUI/GUI_ObjectList.cpp:348 msgid "facets reversed" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:343 +#: src/slic3r/GUI/GUI_ObjectList.cpp:349 msgid "backwards edges" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:351 +#: src/slic3r/GUI/GUI_ObjectList.cpp:357 msgid "Right button click the icon to fix STL through Netfabb" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:388 +#: src/slic3r/GUI/GUI_ObjectList.cpp:394 msgid "Right button click the icon to change the object settings" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:390 +#: src/slic3r/GUI/GUI_ObjectList.cpp:396 msgid "Click the icon to change the object settings" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:394 +#: src/slic3r/GUI/GUI_ObjectList.cpp:400 msgid "Right button click the icon to change the object printable property" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:396 +#: src/slic3r/GUI/GUI_ObjectList.cpp:402 msgid "Click the icon to change the object printable property" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:449 src/slic3r/GUI/GUI_ObjectList.cpp:461 -#: src/slic3r/GUI/GUI_ObjectList.cpp:907 src/slic3r/GUI/GUI_ObjectList.cpp:3822 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3832 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3867 src/slic3r/GUI/wxExtensions.cpp:734 -#: src/slic3r/GUI/wxExtensions.cpp:791 src/slic3r/GUI/wxExtensions.cpp:816 -#: src/slic3r/GUI/wxExtensions.cpp:1024 src/slic3r/GUI/wxExtensions.cpp:2240 +#: src/slic3r/GUI/GUI_ObjectList.cpp:455 src/slic3r/GUI/GUI_ObjectList.cpp:467 +#: src/slic3r/GUI/GUI_ObjectList.cpp:915 src/slic3r/GUI/GUI_ObjectList.cpp:3947 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3957 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3992 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:200 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:257 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:282 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:490 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:1725 msgid "default" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:528 +#: src/slic3r/GUI/GUI_ObjectList.cpp:534 msgid "Change Extruder" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:543 +#: src/slic3r/GUI/GUI_ObjectList.cpp:549 msgid "Rename Object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:543 +#: src/slic3r/GUI/GUI_ObjectList.cpp:549 msgid "Rename Sub-object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1068 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3643 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1089 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3756 msgid "Instances to Separated Objects" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1086 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1104 msgid "Volumes in Object reordered" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1086 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1104 msgid "Object reordered" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1141 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1460 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1466 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1723 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1180 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1528 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1534 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1828 #, possible-c-format msgid "Quick Add Settings (%s)" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1218 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1263 msgid "Select showing settings" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1267 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1312 msgid "Add Settings for Layers" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1268 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1313 msgid "Add Settings for Sub-object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1269 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1314 msgid "Add Settings for Object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1330 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1384 msgid "Add Settings Bundle for Height range" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1331 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1385 msgid "Add Settings Bundle for Sub-object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1332 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1386 msgid "Add Settings Bundle for Object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1371 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1425 msgid "Load" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1376 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1404 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1407 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1430 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1462 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1466 msgid "Box" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1376 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1430 msgid "Cylinder" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1376 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1430 msgid "Sphere" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1376 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1430 msgid "Slab" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1431 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1498 msgid "Height range Modifier" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1439 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1507 msgid "Add settings" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1507 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1582 msgid "Change type" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1514 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1671 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1589 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1601 msgid "Set as a Separated Object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1520 -msgid "Printable" -msgstr "" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1527 -msgid "Rename" -msgstr "" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1538 -msgid "Fix through the Netfabb" -msgstr "" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1548 src/slic3r/GUI/Plater.cpp:3747 -msgid "Export as STL" -msgstr "" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1555 src/slic3r/GUI/Plater.cpp:3161 -#: src/slic3r/GUI/Plater.cpp:3715 src/slic3r/GUI/Plater.cpp:3744 -msgid "Reload from disk" -msgstr "" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1555 src/slic3r/GUI/Plater.cpp:3715 -msgid "Reload the selected volumes from disk" -msgstr "" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1561 src/slic3r/GUI/wxExtensions.cpp:3176 -#: src/slic3r/GUI/wxExtensions.cpp:3432 -msgid "Change extruder" -msgstr "" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1580 src/slic3r/GUI/wxExtensions.cpp:3170 -#: src/slic3r/GUI/wxExtensions.cpp:3421 src/libslic3r/PrintConfig.cpp:314 -msgid "Default" -msgstr "" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1586 -msgid "Select new extruder for the object/part" -msgstr "" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1598 -msgid "Scale to print volume" -msgstr "" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1598 -msgid "Scale the selected object to fit the print volume" -msgstr "" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1671 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1601 msgid "Set as a Separated Objects" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1678 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1924 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1611 +msgid "Printable" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1626 +msgid "Rename" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1637 +msgid "Fix through the Netfabb" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1647 src/slic3r/GUI/Plater.cpp:3987 +msgid "Export as STL" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1655 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1658 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3932 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3935 src/slic3r/GUI/Plater.cpp:3946 +#: src/slic3r/GUI/Plater.cpp:3949 +msgid "Reload the selected volumes from disk" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1685 src/libslic3r/PrintConfig.cpp:325 +msgid "Default" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1691 +msgid "Select new extruder for the object/part" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1703 +msgid "Scale to print volume" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1703 +msgid "Scale the selected object to fit the print volume" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1772 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2030 msgid "Add Shape" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1752 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1858 msgid "Load Part" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1791 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1897 msgid "Error!" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1866 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1972 msgid "Add Generic Subobject" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1895 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2001 msgid "Generic" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2013 -#: src/slic3r/GUI/GUI_ObjectList.cpp:2115 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2119 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2221 msgid "Last instance of an object cannot be deleted." msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2025 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2131 msgid "Delete Settings" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2049 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2155 msgid "Delete All Instances from Object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2065 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2171 msgid "Delete Height Range" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2096 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2202 msgid "From Object List You can't delete the last solid part from object." msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2100 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2206 msgid "Delete Subobject" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2119 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2225 msgid "Delete Instance" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2143 src/slic3r/GUI/Plater.cpp:2914 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2249 src/slic3r/GUI/Plater.cpp:2964 msgid "" "The selected object couldn't be split because it contains only one part." msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2147 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2253 msgid "Split to Parts" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2195 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2305 msgid "Add Layers" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2321 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2431 msgid "Group manipulation" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2333 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2443 msgid "Object manipulation" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2346 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2456 msgid "Object Settings to modify" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2350 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2460 msgid "Part Settings to modify" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2355 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2465 msgid "Layer range Settings to modify" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2361 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2471 msgid "Part manipulation" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2367 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2477 msgid "Instance manipulation" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2374 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2484 msgid "Height ranges" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2374 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2484 msgid "Settings for height range" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2560 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2670 msgid "Delete Selected Item" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2697 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2807 msgid "Delete Selected" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2763 -#: src/slic3r/GUI/GUI_ObjectList.cpp:2792 -#: src/slic3r/GUI/GUI_ObjectList.cpp:2810 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2873 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2902 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2920 msgid "Add Height Range" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2869 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2980 msgid "Edit Height Range" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3153 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3266 msgid "Selection-Remove from list" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3161 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3274 msgid "Selection-Add from list" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3279 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3392 msgid "Object or Instance" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3280 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3413 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3393 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3526 msgid "Part" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3280 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3393 msgid "Layer" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3282 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3395 msgid "Unsupported selection" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3283 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3396 #, possible-c-format msgid "You started your selection with %s Item." msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3284 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3397 #, possible-c-format msgid "In this mode you can select only other %s Items%s" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3287 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3400 msgid "of a current Object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3408 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3405 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3480 src/slic3r/GUI/Plater.cpp:143 +msgid "Info" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3521 msgid "You can't change a type of the last solid part of the object." msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3413 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3526 msgid "Modifier" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3413 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3526 msgid "Support Enforcer" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3413 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3526 msgid "Support Blocker" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3415 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3528 msgid "Select type of part" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3420 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3533 msgid "Change Part Type" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3665 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3778 msgid "Enter new name" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3665 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3778 msgid "Renaming" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3681 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3788 src/slic3r/GUI/Tab.cpp:3412 -#: src/slic3r/GUI/Tab.cpp:3416 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3794 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3901 src/slic3r/GUI/Tab.cpp:3426 +#: src/slic3r/GUI/Tab.cpp:3430 msgid "The supplied name is not valid;" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3682 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3789 src/slic3r/GUI/Tab.cpp:3413 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3795 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3902 src/slic3r/GUI/Tab.cpp:3427 msgid "the following characters are not allowed:" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3812 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3927 msgid "Set extruder for selected items" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3813 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3928 msgid "Select extruder number for selected objects and/or parts" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3826 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3951 msgid "Select extruder number:" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3827 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3952 msgid "This extruder will be set for selected items" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3852 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3977 msgid "Change Extruders" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3942 src/slic3r/GUI/Selection.cpp:1473 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4074 src/slic3r/GUI/Selection.cpp:1474 msgid "Set Printable" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3942 src/slic3r/GUI/Selection.cpp:1473 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4074 src/slic3r/GUI/Selection.cpp:1474 msgid "Set Unprintable" msgstr "" @@ -2321,7 +2713,7 @@ msgstr "" msgid "Select coordinate space, in which the transformation will be performed." msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:155 src/libslic3r/GCode.cpp:634 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:155 src/libslic3r/GCode.cpp:638 msgid "Object name" msgstr "" @@ -2332,8 +2724,8 @@ msgstr "" #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:216 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:458 -#: src/slic3r/GUI/Mouse3DController.cpp:274 -#: src/slic3r/GUI/Mouse3DController.cpp:287 +#: src/slic3r/GUI/Mouse3DController.cpp:321 +#: src/slic3r/GUI/Mouse3DController.cpp:344 msgid "Rotation" msgstr "" @@ -2422,121 +2814,125 @@ msgstr "" msgid "Change Option %s" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:217 +#: src/slic3r/GUI/GUI_Preview.cpp:220 msgid "View" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:220 src/slic3r/GUI/GUI_Preview.cpp:577 -#: src/libslic3r/GCode/PreviewData.cpp:360 +#: src/slic3r/GUI/GUI_Preview.cpp:223 src/slic3r/GUI/GUI_Preview.cpp:577 +#: src/libslic3r/GCode/PreviewData.cpp:345 msgid "Feature type" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:221 src/libslic3r/PrintConfig.cpp:489 +#: src/slic3r/GUI/GUI_Preview.cpp:224 src/libslic3r/PrintConfig.cpp:500 msgid "Height" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:222 src/libslic3r/PrintConfig.cpp:2215 +#: src/slic3r/GUI/GUI_Preview.cpp:225 src/libslic3r/PrintConfig.cpp:2248 msgid "Width" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:224 src/slic3r/GUI/Tab.cpp:1437 +#: src/slic3r/GUI/GUI_Preview.cpp:227 src/slic3r/GUI/Tab.cpp:1451 msgid "Fan speed" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:225 +#: src/slic3r/GUI/GUI_Preview.cpp:228 msgid "Volumetric flow rate" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:226 src/slic3r/GUI/GUI_Preview.cpp:334 -#: src/slic3r/GUI/GUI_Preview.cpp:523 src/slic3r/GUI/GUI_Preview.cpp:576 -#: src/slic3r/GUI/GUI_Preview.cpp:772 src/libslic3r/GCode/PreviewData.cpp:372 +#: src/slic3r/GUI/GUI_Preview.cpp:229 src/slic3r/GUI/GUI_Preview.cpp:337 +#: src/slic3r/GUI/GUI_Preview.cpp:521 src/slic3r/GUI/GUI_Preview.cpp:576 +#: src/slic3r/GUI/GUI_Preview.cpp:831 src/libslic3r/GCode/PreviewData.cpp:357 msgid "Tool" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:227 src/slic3r/GUI/GUI_Preview.cpp:574 -#: src/libslic3r/GCode/PreviewData.cpp:374 +#: src/slic3r/GUI/GUI_Preview.cpp:230 src/slic3r/GUI/GUI_Preview.cpp:574 +#: src/libslic3r/GCode/PreviewData.cpp:359 msgid "Color Print" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:230 +#: src/slic3r/GUI/GUI_Preview.cpp:233 msgid "Show" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:233 src/slic3r/GUI/GUI_Preview.cpp:234 +#: src/slic3r/GUI/GUI_Preview.cpp:236 src/slic3r/GUI/GUI_Preview.cpp:237 msgid "Feature types" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:236 src/libslic3r/ExtrusionEntity.cpp:310 +#: src/slic3r/GUI/GUI_Preview.cpp:239 src/libslic3r/ExtrusionEntity.cpp:310 msgid "Perimeter" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:237 src/libslic3r/ExtrusionEntity.cpp:311 +#: src/slic3r/GUI/GUI_Preview.cpp:240 src/libslic3r/ExtrusionEntity.cpp:311 msgid "External perimeter" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:238 src/libslic3r/ExtrusionEntity.cpp:312 +#: src/slic3r/GUI/GUI_Preview.cpp:241 src/libslic3r/ExtrusionEntity.cpp:312 msgid "Overhang perimeter" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:239 src/libslic3r/ExtrusionEntity.cpp:313 +#: src/slic3r/GUI/GUI_Preview.cpp:242 src/libslic3r/ExtrusionEntity.cpp:313 msgid "Internal infill" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:240 src/libslic3r/ExtrusionEntity.cpp:314 -#: src/libslic3r/PrintConfig.cpp:1752 src/libslic3r/PrintConfig.cpp:1763 +#: src/slic3r/GUI/GUI_Preview.cpp:243 src/libslic3r/ExtrusionEntity.cpp:314 +#: src/libslic3r/PrintConfig.cpp:1766 src/libslic3r/PrintConfig.cpp:1777 msgid "Solid infill" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:241 src/libslic3r/ExtrusionEntity.cpp:315 -#: src/libslic3r/PrintConfig.cpp:2094 src/libslic3r/PrintConfig.cpp:2106 +#: src/slic3r/GUI/GUI_Preview.cpp:244 src/libslic3r/ExtrusionEntity.cpp:315 +#: src/libslic3r/PrintConfig.cpp:2115 src/libslic3r/PrintConfig.cpp:2127 msgid "Top solid infill" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:242 src/libslic3r/ExtrusionEntity.cpp:316 +#: src/slic3r/GUI/GUI_Preview.cpp:245 src/libslic3r/ExtrusionEntity.cpp:316 msgid "Bridge infill" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:243 src/libslic3r/ExtrusionEntity.cpp:317 -#: src/libslic3r/PrintConfig.cpp:907 +#: src/slic3r/GUI/GUI_Preview.cpp:246 src/libslic3r/ExtrusionEntity.cpp:317 +#: src/libslic3r/PrintConfig.cpp:919 msgid "Gap fill" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:244 src/slic3r/GUI/Tab.cpp:1091 +#: src/slic3r/GUI/GUI_Preview.cpp:247 src/slic3r/GUI/Tab.cpp:1101 #: src/libslic3r/ExtrusionEntity.cpp:318 msgid "Skirt" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:246 src/libslic3r/ExtrusionEntity.cpp:320 -#: src/libslic3r/PrintConfig.cpp:1980 +#: src/slic3r/GUI/GUI_Preview.cpp:249 src/libslic3r/ExtrusionEntity.cpp:320 +#: src/libslic3r/PrintConfig.cpp:2001 msgid "Support material interface" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:247 src/slic3r/GUI/Tab.cpp:1171 +#: src/slic3r/GUI/GUI_Preview.cpp:250 src/slic3r/GUI/Tab.cpp:1181 #: src/libslic3r/ExtrusionEntity.cpp:321 msgid "Wipe tower" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:252 src/libslic3r/PrintConfig.cpp:2129 +#: src/slic3r/GUI/GUI_Preview.cpp:255 src/libslic3r/PrintConfig.cpp:2162 msgid "Travel" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:253 +#: src/slic3r/GUI/GUI_Preview.cpp:256 msgid "Retractions" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:254 +#: src/slic3r/GUI/GUI_Preview.cpp:257 msgid "Unretractions" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:255 +#: src/slic3r/GUI/GUI_Preview.cpp:258 msgid "Shells" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:256 +#: src/slic3r/GUI/GUI_Preview.cpp:259 msgid "Legend" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:14 src/slic3r/GUI/MainFrame.cpp:684 +#: src/slic3r/GUI/Job.hpp:123 +msgid "ERROR: not enough resources to execute a new job." +msgstr "" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:14 src/slic3r/GUI/MainFrame.cpp:710 msgid "Keyboard Shortcuts" msgstr "" @@ -2552,8 +2948,8 @@ msgstr "" msgid "Load Config from .ini/amf/3mf/gcode" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:110 src/slic3r/GUI/Plater.cpp:858 -#: src/slic3r/GUI/Plater.cpp:5142 src/libslic3r/PrintConfig.cpp:3280 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:110 src/slic3r/GUI/Plater.cpp:888 +#: src/slic3r/GUI/Plater.cpp:5544 src/libslic3r/PrintConfig.cpp:3348 msgid "Export G-code" msgstr "" @@ -2719,670 +3115,699 @@ msgstr "" msgid "Zoom out" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:160 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:161 +msgid "Show/Hide object/instance labels" +msgstr "" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:163 msgid "Show/Hide 3Dconnexion devices settings dialog" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:161 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:164 msgid "Unselect gizmo / Clear selection" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:167 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:170 msgid "Plater Shortcuts" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:182 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:194 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:185 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:197 msgid "Arrow Up" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:182 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:184 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:185 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:187 msgid "Upper Layer" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:183 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:195 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:186 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:198 msgid "Arrow Down" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:183 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:185 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:186 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:188 msgid "Lower Layer" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:186 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:189 msgid "Show/Hide (L)egend" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:188 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:191 msgid "Preview Shortcuts" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:194 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:197 msgid "Move current slider thumb Up" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:195 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:198 msgid "Move current slider thumb Down" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:196 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:199 msgid "Arrow Left" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:196 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:199 msgid "Set upper thumb to current slider thumb" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:197 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:200 msgid "Arrow Right" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:197 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:200 msgid "Set lower thumb to current slider thumb" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:198 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:201 msgid "Add color change marker for current layer" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:199 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:202 msgid "Delete color change marker for current layer" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:201 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:204 msgid "Layers Slider Shortcuts" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:65 +#: src/slic3r/GUI/MainFrame.cpp:66 msgid "" " - Remember to check for updates at http://github.com/prusa3d/PrusaSlicer/" "releases" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:160 +#: src/slic3r/GUI/MainFrame.cpp:174 msgid "based on Slic3r" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:190 +#: src/slic3r/GUI/MainFrame.cpp:204 msgid "Plater" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:401 +#: src/slic3r/GUI/MainFrame.cpp:405 msgid "&New Project" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:401 +#: src/slic3r/GUI/MainFrame.cpp:405 msgid "Start a new project" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:404 +#: src/slic3r/GUI/MainFrame.cpp:408 msgid "&Open Project" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:404 +#: src/slic3r/GUI/MainFrame.cpp:408 msgid "Open a project file" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:409 +#: src/slic3r/GUI/MainFrame.cpp:413 msgid "Recent projects" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:418 +#: src/slic3r/GUI/MainFrame.cpp:422 msgid "The selected project is no more available" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:418 src/slic3r/GUI/MainFrame.cpp:761 +#: src/slic3r/GUI/MainFrame.cpp:422 src/slic3r/GUI/MainFrame.cpp:787 #: src/slic3r/GUI/PrintHostDialogs.cpp:231 msgid "Error" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:442 +#: src/slic3r/GUI/MainFrame.cpp:446 msgid "&Save Project" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:442 +#: src/slic3r/GUI/MainFrame.cpp:446 msgid "Save current project file" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:446 src/slic3r/GUI/MainFrame.cpp:448 +#: src/slic3r/GUI/MainFrame.cpp:450 src/slic3r/GUI/MainFrame.cpp:452 msgid "Save Project &as" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:446 src/slic3r/GUI/MainFrame.cpp:448 +#: src/slic3r/GUI/MainFrame.cpp:450 src/slic3r/GUI/MainFrame.cpp:452 msgid "Save current project file as" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:456 +#: src/slic3r/GUI/MainFrame.cpp:460 msgid "Import STL/OBJ/AM&F/3MF" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:456 +#: src/slic3r/GUI/MainFrame.cpp:460 msgid "Load a model" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:460 +#: src/slic3r/GUI/MainFrame.cpp:464 msgid "Import &Config" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:460 +#: src/slic3r/GUI/MainFrame.cpp:464 msgid "Load exported configuration file" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:462 +#: src/slic3r/GUI/MainFrame.cpp:467 msgid "Import Config from &project" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:462 +#: src/slic3r/GUI/MainFrame.cpp:467 msgid "Load configuration from project file" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:465 +#: src/slic3r/GUI/MainFrame.cpp:471 msgid "Import Config &Bundle" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:465 +#: src/slic3r/GUI/MainFrame.cpp:471 msgid "Load presets from a bundle" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:467 +#: src/slic3r/GUI/MainFrame.cpp:474 msgid "&Import" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:470 src/slic3r/GUI/MainFrame.cpp:725 +#: src/slic3r/GUI/MainFrame.cpp:477 src/slic3r/GUI/MainFrame.cpp:751 msgid "Export &G-code" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:470 +#: src/slic3r/GUI/MainFrame.cpp:477 msgid "Export current plate as G-code" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:474 src/slic3r/GUI/MainFrame.cpp:726 +#: src/slic3r/GUI/MainFrame.cpp:481 src/slic3r/GUI/MainFrame.cpp:752 msgid "S&end G-code" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:474 +#: src/slic3r/GUI/MainFrame.cpp:481 msgid "Send to print current plate as G-code" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:479 +#: src/slic3r/GUI/MainFrame.cpp:486 msgid "Export plate as &STL" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:479 +#: src/slic3r/GUI/MainFrame.cpp:486 msgid "Export current plate as STL" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:482 +#: src/slic3r/GUI/MainFrame.cpp:489 msgid "Export plate as STL &including supports" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:482 +#: src/slic3r/GUI/MainFrame.cpp:489 msgid "Export current plate as STL including supports" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:485 +#: src/slic3r/GUI/MainFrame.cpp:492 msgid "Export plate as &AMF" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:485 +#: src/slic3r/GUI/MainFrame.cpp:492 msgid "Export current plate as AMF" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:489 +#: src/slic3r/GUI/MainFrame.cpp:496 msgid "Export &toolpaths as OBJ" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:489 +#: src/slic3r/GUI/MainFrame.cpp:496 msgid "Export toolpaths as OBJ" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:493 +#: src/slic3r/GUI/MainFrame.cpp:500 msgid "Export &Config" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:493 +#: src/slic3r/GUI/MainFrame.cpp:500 msgid "Export current configuration to file" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:495 +#: src/slic3r/GUI/MainFrame.cpp:503 msgid "Export Config &Bundle" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:495 +#: src/slic3r/GUI/MainFrame.cpp:503 msgid "Export all presets to file" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:497 +#: src/slic3r/GUI/MainFrame.cpp:506 msgid "&Export" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:503 +#: src/slic3r/GUI/MainFrame.cpp:512 msgid "Quick Slice" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:503 +#: src/slic3r/GUI/MainFrame.cpp:512 msgid "Slice a file into a G-code" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:509 +#: src/slic3r/GUI/MainFrame.cpp:518 msgid "Quick Slice and Save As" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:509 +#: src/slic3r/GUI/MainFrame.cpp:518 msgid "Slice a file into a G-code, save as" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:515 +#: src/slic3r/GUI/MainFrame.cpp:524 msgid "Repeat Last Quick Slice" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:515 +#: src/slic3r/GUI/MainFrame.cpp:524 msgid "Repeat last quick slice" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:523 +#: src/slic3r/GUI/MainFrame.cpp:532 msgid "(Re)Slice No&w" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:523 +#: src/slic3r/GUI/MainFrame.cpp:532 msgid "Start new slicing process" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:527 +#: src/slic3r/GUI/MainFrame.cpp:536 msgid "&Repair STL file" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:527 +#: src/slic3r/GUI/MainFrame.cpp:536 msgid "Automatically repair an STL file" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:530 +#: src/slic3r/GUI/MainFrame.cpp:540 msgid "&Quit" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:530 +#: src/slic3r/GUI/MainFrame.cpp:540 #, possible-c-format msgid "Quit %s" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:555 +#: src/slic3r/GUI/MainFrame.cpp:565 msgid "&Select all" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:556 +#: src/slic3r/GUI/MainFrame.cpp:566 msgid "Selects all objects" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:558 +#: src/slic3r/GUI/MainFrame.cpp:568 msgid "D&eselect all" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:559 +#: src/slic3r/GUI/MainFrame.cpp:569 msgid "Deselects all objects" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:562 +#: src/slic3r/GUI/MainFrame.cpp:572 msgid "&Delete selected" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:563 +#: src/slic3r/GUI/MainFrame.cpp:573 msgid "Deletes the current selection" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:565 +#: src/slic3r/GUI/MainFrame.cpp:575 msgid "Delete &all" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:566 +#: src/slic3r/GUI/MainFrame.cpp:576 msgid "Deletes all objects" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:570 +#: src/slic3r/GUI/MainFrame.cpp:580 msgid "&Undo" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:573 +#: src/slic3r/GUI/MainFrame.cpp:583 msgid "&Redo" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:578 +#: src/slic3r/GUI/MainFrame.cpp:588 msgid "&Copy" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:579 +#: src/slic3r/GUI/MainFrame.cpp:589 msgid "Copy selection to clipboard" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:581 +#: src/slic3r/GUI/MainFrame.cpp:591 msgid "&Paste" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:582 +#: src/slic3r/GUI/MainFrame.cpp:592 msgid "Paste clipboard" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:591 +#: src/slic3r/GUI/MainFrame.cpp:596 +msgid "Re&load from disk" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:597 +msgid "Reload the plater from disk" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:606 msgid "&Plater Tab" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:591 +#: src/slic3r/GUI/MainFrame.cpp:606 msgid "Show the plater" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:598 +#: src/slic3r/GUI/MainFrame.cpp:614 msgid "P&rint Settings Tab" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:598 +#: src/slic3r/GUI/MainFrame.cpp:614 msgid "Show the print settings" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:600 src/slic3r/GUI/MainFrame.cpp:728 +#: src/slic3r/GUI/MainFrame.cpp:617 src/slic3r/GUI/MainFrame.cpp:754 msgid "&Filament Settings Tab" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:600 +#: src/slic3r/GUI/MainFrame.cpp:617 msgid "Show the filament settings" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:603 +#: src/slic3r/GUI/MainFrame.cpp:621 msgid "Print&er Settings Tab" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:603 +#: src/slic3r/GUI/MainFrame.cpp:621 msgid "Show the printer settings" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:607 +#: src/slic3r/GUI/MainFrame.cpp:626 msgid "3&D" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:607 +#: src/slic3r/GUI/MainFrame.cpp:626 msgid "Show the 3D editing view" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:610 +#: src/slic3r/GUI/MainFrame.cpp:629 msgid "Pre&view" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:610 +#: src/slic3r/GUI/MainFrame.cpp:629 msgid "Show the 3D slices preview" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:629 +#: src/slic3r/GUI/MainFrame.cpp:648 msgid "Print &Host Upload Queue" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:629 +#: src/slic3r/GUI/MainFrame.cpp:648 msgid "Display the Print Host Upload Queue window" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:638 +#: src/slic3r/GUI/MainFrame.cpp:658 msgid "Iso" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:638 +#: src/slic3r/GUI/MainFrame.cpp:658 msgid "Iso View" msgstr "" #. TRN To be shown in the main menu View->Top #. TRN To be shown in Print Settings "Top solid layers" -#: src/slic3r/GUI/MainFrame.cpp:642 src/libslic3r/PrintConfig.cpp:2121 +#: src/slic3r/GUI/MainFrame.cpp:662 src/libslic3r/PrintConfig.cpp:2142 +#: src/libslic3r/PrintConfig.cpp:2151 msgid "Top" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:642 +#: src/slic3r/GUI/MainFrame.cpp:662 msgid "Top View" msgstr "" #. TRN To be shown in the main menu View->Bottom #. TRN To be shown in Print Settings "Bottom solid layers" -#: src/slic3r/GUI/MainFrame.cpp:645 src/libslic3r/PrintConfig.cpp:164 +#. TRN To be shown in Print Settings "Top solid layers" +#: src/slic3r/GUI/MainFrame.cpp:665 src/libslic3r/PrintConfig.cpp:164 +#: src/libslic3r/PrintConfig.cpp:173 msgid "Bottom" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:645 +#: src/slic3r/GUI/MainFrame.cpp:665 msgid "Bottom View" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:647 +#: src/slic3r/GUI/MainFrame.cpp:667 msgid "Front" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:647 +#: src/slic3r/GUI/MainFrame.cpp:667 msgid "Front View" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:649 src/libslic3r/PrintConfig.cpp:1627 +#: src/slic3r/GUI/MainFrame.cpp:669 src/libslic3r/PrintConfig.cpp:1641 msgid "Rear" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:649 +#: src/slic3r/GUI/MainFrame.cpp:669 msgid "Rear View" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:651 +#: src/slic3r/GUI/MainFrame.cpp:671 msgid "Left" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:651 +#: src/slic3r/GUI/MainFrame.cpp:671 msgid "Left View" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:653 +#: src/slic3r/GUI/MainFrame.cpp:673 msgid "Right" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:653 +#: src/slic3r/GUI/MainFrame.cpp:673 msgid "Right View" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:660 +#: src/slic3r/GUI/MainFrame.cpp:677 +msgid "Show &labels" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:677 +msgid "Show object/instance labels in 3D scene" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:686 msgid "Prusa 3D &Drivers" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:660 +#: src/slic3r/GUI/MainFrame.cpp:686 msgid "Open the Prusa3D drivers download page in your browser" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:662 +#: src/slic3r/GUI/MainFrame.cpp:688 msgid "Software &Releases" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:662 +#: src/slic3r/GUI/MainFrame.cpp:688 msgid "Open the software releases page in your browser" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:668 +#: src/slic3r/GUI/MainFrame.cpp:694 #, possible-c-format msgid "%s &Website" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:669 +#: src/slic3r/GUI/MainFrame.cpp:695 #, possible-c-format msgid "Open the %s website in your browser" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:675 +#: src/slic3r/GUI/MainFrame.cpp:701 msgid "System &Info" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:675 +#: src/slic3r/GUI/MainFrame.cpp:701 msgid "Show system information" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:677 +#: src/slic3r/GUI/MainFrame.cpp:703 msgid "Show &Configuration Folder" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:677 +#: src/slic3r/GUI/MainFrame.cpp:703 msgid "Show user configuration folder (datadir)" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:679 +#: src/slic3r/GUI/MainFrame.cpp:705 msgid "Report an I&ssue" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:679 +#: src/slic3r/GUI/MainFrame.cpp:705 #, possible-c-format msgid "Report an issue on %s" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:681 +#: src/slic3r/GUI/MainFrame.cpp:707 #, possible-c-format msgid "&About %s" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:681 +#: src/slic3r/GUI/MainFrame.cpp:707 msgid "Show about dialog" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:684 +#: src/slic3r/GUI/MainFrame.cpp:710 msgid "Show the list of the keyboard shortcuts" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:697 +#: src/slic3r/GUI/MainFrame.cpp:723 msgid "&File" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:698 +#: src/slic3r/GUI/MainFrame.cpp:724 msgid "&Edit" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:699 +#: src/slic3r/GUI/MainFrame.cpp:725 msgid "&Window" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:700 +#: src/slic3r/GUI/MainFrame.cpp:726 msgid "&View" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:703 +#: src/slic3r/GUI/MainFrame.cpp:729 msgid "&Help" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:725 +#: src/slic3r/GUI/MainFrame.cpp:751 msgid "E&xport" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:726 +#: src/slic3r/GUI/MainFrame.cpp:752 msgid "S&end to print" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:728 +#: src/slic3r/GUI/MainFrame.cpp:754 msgid "Mate&rial Settings Tab" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:749 +#: src/slic3r/GUI/MainFrame.cpp:775 msgid "Choose a file to slice (STL/OBJ/AMF/3MF/PRUSA):" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:760 +#: src/slic3r/GUI/MainFrame.cpp:786 msgid "No previously sliced file." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:766 +#: src/slic3r/GUI/MainFrame.cpp:792 msgid "Previously sliced file (" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:766 +#: src/slic3r/GUI/MainFrame.cpp:792 msgid ") not found." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:767 +#: src/slic3r/GUI/MainFrame.cpp:793 msgid "File Not Found" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:802 +#: src/slic3r/GUI/MainFrame.cpp:828 #, possible-c-format msgid "Save %s file as:" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:802 +#: src/slic3r/GUI/MainFrame.cpp:828 msgid "SVG" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:802 +#: src/slic3r/GUI/MainFrame.cpp:828 msgid "G-code" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:814 +#: src/slic3r/GUI/MainFrame.cpp:840 msgid "Save zip file as:" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:823 src/slic3r/GUI/Plater.cpp:3058 -#: src/slic3r/GUI/Plater.cpp:4781 src/slic3r/GUI/Tab.cpp:1201 -#: src/slic3r/GUI/Tab.cpp:3615 +#: src/slic3r/GUI/MainFrame.cpp:849 src/slic3r/GUI/Plater.cpp:3107 +#: src/slic3r/GUI/Plater.cpp:5126 src/slic3r/GUI/Tab.cpp:1211 +#: src/slic3r/GUI/Tab.cpp:3634 msgid "Slicing" msgstr "" #. TRN "Processing input_file_basename" -#: src/slic3r/GUI/MainFrame.cpp:825 +#: src/slic3r/GUI/MainFrame.cpp:851 #, possible-c-format msgid "Processing %s" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:848 +#: src/slic3r/GUI/MainFrame.cpp:874 msgid " was successfully sliced." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:850 +#: src/slic3r/GUI/MainFrame.cpp:876 msgid "Slicing Done!" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:865 +#: src/slic3r/GUI/MainFrame.cpp:891 msgid "Select the STL file to repair:" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:875 +#: src/slic3r/GUI/MainFrame.cpp:901 msgid "Save OBJ file (less prone to coordinate errors than STL) as:" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:887 +#: src/slic3r/GUI/MainFrame.cpp:913 msgid "Your file was repaired." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:887 src/libslic3r/PrintConfig.cpp:3374 +#: src/slic3r/GUI/MainFrame.cpp:913 src/libslic3r/PrintConfig.cpp:3442 msgid "Repair" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:901 +#: src/slic3r/GUI/MainFrame.cpp:927 msgid "Save configuration as:" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:920 src/slic3r/GUI/MainFrame.cpp:982 +#: src/slic3r/GUI/MainFrame.cpp:946 src/slic3r/GUI/MainFrame.cpp:1008 msgid "Select configuration to load:" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:956 +#: src/slic3r/GUI/MainFrame.cpp:982 msgid "Save presets bundle as:" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1003 +#: src/slic3r/GUI/MainFrame.cpp:1029 #, possible-c-format msgid "%d presets successfully imported." msgstr "" -#: src/slic3r/GUI/Mouse3DController.cpp:255 +#: src/slic3r/GUI/Mouse3DController.cpp:291 msgid "3Dconnexion settings" msgstr "" -#: src/slic3r/GUI/Mouse3DController.cpp:259 +#: src/slic3r/GUI/Mouse3DController.cpp:306 msgid "Device:" msgstr "" -#: src/slic3r/GUI/Mouse3DController.cpp:266 +#: src/slic3r/GUI/Mouse3DController.cpp:313 msgid "Speed:" msgstr "" -#: src/slic3r/GUI/Mouse3DController.cpp:270 -#: src/slic3r/GUI/Mouse3DController.cpp:283 +#: src/slic3r/GUI/Mouse3DController.cpp:317 +#: src/slic3r/GUI/Mouse3DController.cpp:337 +#: src/slic3r/GUI/Mouse3DController.cpp:339 msgid "Translation" msgstr "" -#: src/slic3r/GUI/Mouse3DController.cpp:279 +#: src/slic3r/GUI/Mouse3DController.cpp:326 +#: src/slic3r/GUI/Mouse3DController.cpp:337 +msgid "Zoom" +msgstr "" + +#: src/slic3r/GUI/Mouse3DController.cpp:332 msgid "Deadzone:" msgstr "" @@ -3396,6 +3821,25 @@ msgstr "" msgid "%s has encountered an error" msgstr "" +#: src/slic3r/GUI/ObjectDataViewModel.cpp:56 +msgid "Instances" +msgstr "" + +#: src/slic3r/GUI/ObjectDataViewModel.cpp:60 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:216 +#, possible-c-format +msgid "Instance %d" +msgstr "" + +#: src/slic3r/GUI/ObjectDataViewModel.cpp:67 src/slic3r/GUI/Tab.cpp:3482 +#: src/slic3r/GUI/Tab.cpp:3572 +msgid "Layers" +msgstr "" + +#: src/slic3r/GUI/ObjectDataViewModel.cpp:94 +msgid "Range" +msgstr "" + #: src/slic3r/GUI/OptionsGroup.cpp:249 msgctxt "Layers" msgid "Top" @@ -3406,597 +3850,648 @@ msgctxt "Layers" msgid "Bottom" msgstr "" -#: src/slic3r/GUI/Plater.cpp:155 +#: src/slic3r/GUI/Plater.cpp:163 msgid "Volume" msgstr "" -#: src/slic3r/GUI/Plater.cpp:156 +#: src/slic3r/GUI/Plater.cpp:164 msgid "Facets" msgstr "" -#: src/slic3r/GUI/Plater.cpp:157 +#: src/slic3r/GUI/Plater.cpp:165 msgid "Materials" msgstr "" -#: src/slic3r/GUI/Plater.cpp:160 +#: src/slic3r/GUI/Plater.cpp:168 msgid "Manifold" msgstr "" -#: src/slic3r/GUI/Plater.cpp:210 +#: src/slic3r/GUI/Plater.cpp:218 msgid "Sliced Info" msgstr "" -#: src/slic3r/GUI/Plater.cpp:229 src/slic3r/GUI/Plater.cpp:1179 +#: src/slic3r/GUI/Plater.cpp:237 src/slic3r/GUI/Plater.cpp:1226 msgid "Used Filament (m)" msgstr "" -#: src/slic3r/GUI/Plater.cpp:230 +#: src/slic3r/GUI/Plater.cpp:238 msgid "Used Filament (mm³)" msgstr "" -#: src/slic3r/GUI/Plater.cpp:231 +#: src/slic3r/GUI/Plater.cpp:239 msgid "Used Filament (g)" msgstr "" -#: src/slic3r/GUI/Plater.cpp:232 +#: src/slic3r/GUI/Plater.cpp:240 msgid "Used Material (unit)" msgstr "" -#: src/slic3r/GUI/Plater.cpp:233 +#: src/slic3r/GUI/Plater.cpp:241 msgid "Cost (money)" msgstr "" -#: src/slic3r/GUI/Plater.cpp:234 src/slic3r/GUI/Plater.cpp:1166 -#: src/slic3r/GUI/Plater.cpp:1208 +#: src/slic3r/GUI/Plater.cpp:242 src/slic3r/GUI/Plater.cpp:1213 +#: src/slic3r/GUI/Plater.cpp:1255 msgid "Estimated printing time" msgstr "" -#: src/slic3r/GUI/Plater.cpp:235 +#: src/slic3r/GUI/Plater.cpp:243 msgid "Number of tool changes" msgstr "" -#: src/slic3r/GUI/Plater.cpp:332 +#: src/slic3r/GUI/Plater.cpp:340 msgid "Click to edit preset" msgstr "" -#: src/slic3r/GUI/Plater.cpp:487 +#: src/slic3r/GUI/Plater.cpp:495 msgid "Select what kind of support do you need" msgstr "" -#: src/slic3r/GUI/Plater.cpp:489 src/libslic3r/PrintConfig.cpp:1890 -#: src/libslic3r/PrintConfig.cpp:2642 +#: src/slic3r/GUI/Plater.cpp:497 src/libslic3r/PrintConfig.cpp:1911 +#: src/libslic3r/PrintConfig.cpp:2675 msgid "Support on build plate only" msgstr "" -#: src/slic3r/GUI/Plater.cpp:490 src/slic3r/GUI/Plater.cpp:613 +#: src/slic3r/GUI/Plater.cpp:498 src/slic3r/GUI/Plater.cpp:621 msgid "For support enforcers only" msgstr "" -#: src/slic3r/GUI/Plater.cpp:491 +#: src/slic3r/GUI/Plater.cpp:499 msgid "Everywhere" msgstr "" -#: src/slic3r/GUI/Plater.cpp:523 src/slic3r/GUI/Tab.cpp:1097 +#: src/slic3r/GUI/Plater.cpp:531 src/slic3r/GUI/Tab.cpp:1107 msgid "Brim" msgstr "" -#: src/slic3r/GUI/Plater.cpp:525 +#: src/slic3r/GUI/Plater.cpp:533 msgid "" "This flag enables the brim that will be printed around each object on the " "first layer." msgstr "" -#: src/slic3r/GUI/Plater.cpp:533 +#: src/slic3r/GUI/Plater.cpp:541 msgid "Purging volumes" msgstr "" -#: src/slic3r/GUI/Plater.cpp:627 +#: src/slic3r/GUI/Plater.cpp:635 msgid "Select what kind of pad do you need" msgstr "" -#: src/slic3r/GUI/Plater.cpp:629 +#: src/slic3r/GUI/Plater.cpp:637 msgid "Below object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:630 +#: src/slic3r/GUI/Plater.cpp:638 msgid "Around object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:802 +#: src/slic3r/GUI/Plater.cpp:812 msgid "Print settings" msgstr "" -#: src/slic3r/GUI/Plater.cpp:803 src/slic3r/GUI/Tab.cpp:1405 -#: src/slic3r/GUI/Tab.cpp:1406 +#: src/slic3r/GUI/Plater.cpp:813 src/slic3r/GUI/Tab.cpp:1419 +#: src/slic3r/GUI/Tab.cpp:1420 msgid "Filament" msgstr "" -#: src/slic3r/GUI/Plater.cpp:804 +#: src/slic3r/GUI/Plater.cpp:814 msgid "SLA print settings" msgstr "" -#: src/slic3r/GUI/Plater.cpp:805 src/slic3r/GUI/Preset.cpp:1411 +#: src/slic3r/GUI/Plater.cpp:815 src/slic3r/GUI/Preset.cpp:1455 msgid "SLA material" msgstr "" -#: src/slic3r/GUI/Plater.cpp:806 +#: src/slic3r/GUI/Plater.cpp:816 msgid "Printer" msgstr "" -#: src/slic3r/GUI/Plater.cpp:856 src/slic3r/GUI/Plater.cpp:5143 +#: src/slic3r/GUI/Plater.cpp:875 src/slic3r/GUI/Plater.cpp:5545 msgid "Send to printer" msgstr "" -#: src/slic3r/GUI/Plater.cpp:859 src/slic3r/GUI/Plater.cpp:3058 -#: src/slic3r/GUI/Plater.cpp:4784 +#: src/slic3r/GUI/Plater.cpp:876 +msgid "Remove device" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:877 +msgid "Export to SD card/ USB thumb drive" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:889 src/slic3r/GUI/Plater.cpp:3107 +#: src/slic3r/GUI/Plater.cpp:5129 msgid "Slice now" msgstr "" -#: src/slic3r/GUI/Plater.cpp:999 +#: src/slic3r/GUI/Plater.cpp:1039 msgid "Hold Shift to Slice & Export G-code" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1102 +#: src/slic3r/GUI/Plater.cpp:1149 #, possible-c-format msgid "%d (%d shells)" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1107 +#: src/slic3r/GUI/Plater.cpp:1154 #, possible-c-format msgid "Auto-repaired (%d errors)" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1110 +#: src/slic3r/GUI/Plater.cpp:1157 #, possible-c-format msgid "" "%d degenerate facets, %d edges fixed, %d facets removed, %d facets added, %d " "facets reversed, %d backwards edges" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1120 +#: src/slic3r/GUI/Plater.cpp:1167 msgid "Yes" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1141 +#: src/slic3r/GUI/Plater.cpp:1188 msgid "Used Material (ml)" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1144 +#: src/slic3r/GUI/Plater.cpp:1191 msgid "object(s)" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1144 +#: src/slic3r/GUI/Plater.cpp:1191 msgid "supports and pad" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1181 src/slic3r/GUI/Plater.cpp:1196 +#: src/slic3r/GUI/Plater.cpp:1228 src/slic3r/GUI/Plater.cpp:1243 msgid "objects" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1181 src/slic3r/GUI/Plater.cpp:1196 +#: src/slic3r/GUI/Plater.cpp:1228 src/slic3r/GUI/Plater.cpp:1243 msgid "wipe tower" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1194 src/libslic3r/PrintConfig.cpp:749 -#: src/libslic3r/PrintConfig.cpp:2478 src/libslic3r/PrintConfig.cpp:2479 +#: src/slic3r/GUI/Plater.cpp:1241 src/libslic3r/PrintConfig.cpp:761 +#: src/libslic3r/PrintConfig.cpp:2511 src/libslic3r/PrintConfig.cpp:2512 msgid "Cost" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1211 +#: src/slic3r/GUI/Plater.cpp:1258 msgid "normal mode" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1215 src/slic3r/GUI/Plater.cpp:1224 -#: src/libslic3r/PrintConfig.cpp:572 +#: src/slic3r/GUI/Plater.cpp:1262 src/slic3r/GUI/Plater.cpp:1271 +#: src/libslic3r/PrintConfig.cpp:583 msgid "Color" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1220 +#: src/slic3r/GUI/Plater.cpp:1267 msgid "stealth mode" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1324 +#: src/slic3r/GUI/Plater.cpp:1375 msgid "Load File" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1328 +#: src/slic3r/GUI/Plater.cpp:1379 msgid "Load Files" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1561 -msgid "ERROR: not enough resources to execute a new job." -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:2158 +#: src/slic3r/GUI/Plater.cpp:2137 msgid "New Project" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2277 +#: src/slic3r/GUI/Plater.cpp:2259 msgid "Loading" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2287 +#: src/slic3r/GUI/Plater.cpp:2269 #, possible-c-format msgid "Processing input file %s" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2315 -msgid "" -"You cannot load SLA project with a multi-part object on the bed" +#: src/slic3r/GUI/Plater.cpp:2297 +msgid "You cannot load SLA project with a multi-part object on the bed" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2316 src/slic3r/GUI/Tab.cpp:2915 +#: src/slic3r/GUI/Plater.cpp:2298 src/slic3r/GUI/Tab.cpp:2929 msgid "Please check your object list before preset changing." msgstr "" -#: src/slic3r/GUI/Plater.cpp:2361 +#: src/slic3r/GUI/Plater.cpp:2343 msgid "" "This file contains several objects positioned at multiple heights.\n" "Instead of considering them as multiple objects, should I consider\n" "this file as a single object having multiple parts?" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2364 src/slic3r/GUI/Plater.cpp:2417 +#: src/slic3r/GUI/Plater.cpp:2346 src/slic3r/GUI/Plater.cpp:2399 msgid "Multi-part object detected" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2371 +#: src/slic3r/GUI/Plater.cpp:2353 msgid "" "This file cannot be loaded in a simple mode. Do you want to switch to an " "advanced mode?" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2372 +#: src/slic3r/GUI/Plater.cpp:2354 msgid "Detected advanced data" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2394 +#: src/slic3r/GUI/Plater.cpp:2376 #, possible-c-format msgid "" "You can't to add the object(s) from %s because of one or some of them " "is(are) multi-part" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2414 +#: src/slic3r/GUI/Plater.cpp:2396 msgid "" "Multiple objects were loaded for a multi-material printer.\n" "Instead of considering them as multiple objects, should I consider\n" "these files to represent a single object having multiple parts?" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2430 +#: src/slic3r/GUI/Plater.cpp:2412 msgid "Loaded" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2532 +#: src/slic3r/GUI/Plater.cpp:2514 msgid "" "Your object appears to be too large, so it was automatically scaled down to " "fit your print bed." msgstr "" -#: src/slic3r/GUI/Plater.cpp:2533 +#: src/slic3r/GUI/Plater.cpp:2515 msgid "Object too large?" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2595 +#: src/slic3r/GUI/Plater.cpp:2577 msgid "Export STL file:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2602 +#: src/slic3r/GUI/Plater.cpp:2584 msgid "Export AMF file:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2608 +#: src/slic3r/GUI/Plater.cpp:2590 msgid "Save file as:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2614 +#: src/slic3r/GUI/Plater.cpp:2596 msgid "Export OBJ file:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2716 +#: src/slic3r/GUI/Plater.cpp:2698 msgid "Delete Object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2727 +#: src/slic3r/GUI/Plater.cpp:2709 msgid "Reset Project" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2765 +#: src/slic3r/GUI/Plater.cpp:2746 +msgid "Hollow" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:2753 msgid "Optimize Rotation" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2811 +#: src/slic3r/GUI/Plater.cpp:2799 msgid "Arranging" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2833 +#: src/slic3r/GUI/Plater.cpp:2821 msgid "Could not arrange model objects! Some geometries may be invalid." msgstr "" -#: src/slic3r/GUI/Plater.cpp:2839 +#: src/slic3r/GUI/Plater.cpp:2827 msgid "Arranging canceled." msgstr "" -#: src/slic3r/GUI/Plater.cpp:2840 +#: src/slic3r/GUI/Plater.cpp:2828 msgid "Arranging done." msgstr "" -#: src/slic3r/GUI/Plater.cpp:2856 +#: src/slic3r/GUI/Plater.cpp:2844 msgid "Searching for optimal orientation" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2889 +#: src/slic3r/GUI/Plater.cpp:2877 msgid "Orientation search canceled." msgstr "" -#: src/slic3r/GUI/Plater.cpp:2890 +#: src/slic3r/GUI/Plater.cpp:2878 msgid "Orientation found." msgstr "" -#: src/slic3r/GUI/Plater.cpp:2906 +#: src/slic3r/GUI/Plater.cpp:2908 +msgid "Indexing hollowed object" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:2912 +msgid "Hollowing cancelled." +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:2913 +msgid "Hollowing done." +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:2915 +msgid "Hollowing failed." +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:2956 msgid "" "The selected object can't be split because it contains more than one volume/" "material." msgstr "" -#: src/slic3r/GUI/Plater.cpp:2917 +#: src/slic3r/GUI/Plater.cpp:2967 msgid "Split to Objects" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3043 +#: src/slic3r/GUI/Plater.cpp:3092 msgid "Invalid data" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3052 +#: src/slic3r/GUI/Plater.cpp:3101 msgid "Ready to slice" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3090 src/slic3r/GUI/PrintHostDialogs.cpp:232 +#: src/slic3r/GUI/Plater.cpp:3139 src/slic3r/GUI/PrintHostDialogs.cpp:232 msgid "Cancelling" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3107 +#: src/slic3r/GUI/Plater.cpp:3156 msgid "Another export job is currently running." msgstr "" -#: src/slic3r/GUI/Plater.cpp:3276 +#: src/slic3r/GUI/Plater.cpp:3274 +msgid "Please select the file to reload" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:3309 +msgid "It is not allowed to change the file to reload" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:3309 +msgid "Do you want to retry" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:3330 +msgid "Reload from: " +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:3438 +msgid "Unable to reload:" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:3443 +msgid "Error during reload" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:3463 +msgid "Reload all from disk" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:3484 msgid "Fix Throught NetFabb" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3467 +#: src/slic3r/GUI/Plater.cpp:3675 msgid "Export failed" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3472 src/slic3r/GUI/PrintHostDialogs.cpp:233 +#: src/slic3r/GUI/Plater.cpp:3680 src/slic3r/GUI/PrintHostDialogs.cpp:233 msgid "Cancelled" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3712 src/slic3r/GUI/Plater.cpp:3734 +#: src/slic3r/GUI/Plater.cpp:3942 src/slic3r/GUI/Plater.cpp:3969 msgid "Remove the selected object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3721 +#: src/slic3r/GUI/Plater.cpp:3956 msgid "Add one more instance of the selected object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3723 +#: src/slic3r/GUI/Plater.cpp:3958 msgid "Remove one instance of the selected object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3725 +#: src/slic3r/GUI/Plater.cpp:3960 msgid "Set number of instances" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3725 +#: src/slic3r/GUI/Plater.cpp:3960 msgid "Change the number of instances of the selected object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3744 +#: src/slic3r/GUI/Plater.cpp:3980 src/slic3r/GUI/Plater.cpp:3983 msgid "Reload the selected object from disk" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3747 +#: src/slic3r/GUI/Plater.cpp:3987 msgid "Export the selected object as STL file" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3772 +#: src/slic3r/GUI/Plater.cpp:4016 msgid "Along X axis" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3772 +#: src/slic3r/GUI/Plater.cpp:4016 msgid "Mirror the selected object along the X axis" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3774 +#: src/slic3r/GUI/Plater.cpp:4018 msgid "Along Y axis" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3774 +#: src/slic3r/GUI/Plater.cpp:4018 msgid "Mirror the selected object along the Y axis" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3776 +#: src/slic3r/GUI/Plater.cpp:4020 msgid "Along Z axis" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3776 +#: src/slic3r/GUI/Plater.cpp:4020 msgid "Mirror the selected object along the Z axis" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3779 +#: src/slic3r/GUI/Plater.cpp:4023 msgid "Mirror" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3779 +#: src/slic3r/GUI/Plater.cpp:4023 msgid "Mirror the selected object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3791 +#: src/slic3r/GUI/Plater.cpp:4035 msgid "To objects" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3791 src/slic3r/GUI/Plater.cpp:3811 +#: src/slic3r/GUI/Plater.cpp:4035 src/slic3r/GUI/Plater.cpp:4055 msgid "Split the selected object into individual objects" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3793 +#: src/slic3r/GUI/Plater.cpp:4037 msgid "To parts" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3793 src/slic3r/GUI/Plater.cpp:3825 +#: src/slic3r/GUI/Plater.cpp:4037 src/slic3r/GUI/Plater.cpp:4069 msgid "Split the selected object into individual sub-parts" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3796 src/slic3r/GUI/Plater.cpp:3811 -#: src/slic3r/GUI/Plater.cpp:3825 src/libslic3r/PrintConfig.cpp:3398 +#: src/slic3r/GUI/Plater.cpp:4040 src/slic3r/GUI/Plater.cpp:4055 +#: src/slic3r/GUI/Plater.cpp:4069 src/libslic3r/PrintConfig.cpp:3466 msgid "Split" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3796 +#: src/slic3r/GUI/Plater.cpp:4040 msgid "Split the selected object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3817 +#: src/slic3r/GUI/Plater.cpp:4061 msgid "Optimize orientation" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3817 +#: src/slic3r/GUI/Plater.cpp:4061 msgid "Optimize the rotation of the object for better print results." msgstr "" -#: src/slic3r/GUI/Plater.cpp:3857 +#: src/slic3r/GUI/Plater.cpp:4120 msgid "3D editor view" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3865 src/slic3r/GUI/Tab.cpp:2358 +#: src/slic3r/GUI/Plater.cpp:4128 src/slic3r/GUI/Tab.cpp:2372 msgid "Preview" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4144 +#: src/slic3r/GUI/Plater.cpp:4422 msgid "" "%1% printer was active at the time the target Undo / Redo snapshot was " "taken. Switching to %1% printer requires reloading of %1% presets." msgstr "" -#: src/slic3r/GUI/Plater.cpp:4319 +#: src/slic3r/GUI/Plater.cpp:4597 msgid "Load Project" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4347 +#: src/slic3r/GUI/Plater.cpp:4625 msgid "Import Object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4351 +#: src/slic3r/GUI/Plater.cpp:4629 msgid "Import Objects" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4410 -msgid "All objects will be removed, continue ?" +#: src/slic3r/GUI/Plater.cpp:4693 +msgid "All objects will be removed, continue?" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4418 +#: src/slic3r/GUI/Plater.cpp:4701 msgid "Delete Selected Objects" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4426 +#: src/slic3r/GUI/Plater.cpp:4709 msgid "Increase Instances" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4461 +#: src/slic3r/GUI/Plater.cpp:4744 msgid "Decrease Instances" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4497 +#: src/slic3r/GUI/Plater.cpp:4780 #, possible-c-format msgid "Set numbers of copies to %d" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4527 +#: src/slic3r/GUI/Plater.cpp:4810 msgid "Cut by Plane" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4559 +#: src/slic3r/GUI/Plater.cpp:4863 msgid "Save G-code file as:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4559 +#: src/slic3r/GUI/Plater.cpp:4863 msgid "Save SL1 file as:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4671 +#: src/slic3r/GUI/Plater.cpp:4990 #, possible-c-format msgid "STL file exported to %s" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4687 +#: src/slic3r/GUI/Plater.cpp:5011 #, possible-c-format msgid "AMF file exported to %s" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4690 +#: src/slic3r/GUI/Plater.cpp:5014 #, possible-c-format msgid "Error exporting AMF file %s" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4722 +#: src/slic3r/GUI/Plater.cpp:5057 #, possible-c-format msgid "3MF file exported to %s" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4727 +#: src/slic3r/GUI/Plater.cpp:5062 #, possible-c-format msgid "Error exporting 3MF file %s" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5142 +#: src/slic3r/GUI/Plater.cpp:5544 msgid "Export" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5143 +#: src/slic3r/GUI/Plater.cpp:5545 msgid "Send G-code" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5227 +#: src/slic3r/GUI/Plater.cpp:5629 msgid "Paste From Clipboard" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:22 src/slic3r/GUI/Tab.cpp:1766 -#: src/slic3r/GUI/Tab.cpp:2010 +#: src/slic3r/GUI/Preferences.cpp:22 src/slic3r/GUI/Tab.cpp:1780 +#: src/slic3r/GUI/Tab.cpp:2024 msgid "General" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:44 +#: src/slic3r/GUI/Preferences.cpp:39 msgid "Remember output directory" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:46 +#: src/slic3r/GUI/Preferences.cpp:41 msgid "" "If this is enabled, Slic3r will prompt the last output directory instead of " "the one containing the input files." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:52 +#: src/slic3r/GUI/Preferences.cpp:47 msgid "Auto-center parts" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:54 +#: src/slic3r/GUI/Preferences.cpp:49 msgid "" "If this is enabled, Slic3r will auto-center objects around the print bed " "center." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:60 +#: src/slic3r/GUI/Preferences.cpp:55 msgid "Background processing" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:62 +#: src/slic3r/GUI/Preferences.cpp:57 msgid "" "If this is enabled, Slic3r will pre-process objects as soon as they're " "loaded in order to save time when exporting G-code." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:71 +#: src/slic3r/GUI/Preferences.cpp:66 msgid "" "If enabled, PrusaSlicer will check for the new versions of itself online. " "When a new version becomes available a notification is displayed at the next " @@ -4004,7 +4499,17 @@ msgid "" "notification mechanisms, no automatic installation is done." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:79 +#: src/slic3r/GUI/Preferences.cpp:73 +msgid "Export sources full pathnames to 3mf and amf" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:75 +msgid "" +"If enabled, allows the Reload from disk command to automatically find and " +"load the files when invoked." +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:84 msgid "" "If enabled, Slic3r downloads updates of built-in system presets in the " "background. These updates are downloaded into a separate temporary location. " @@ -4012,215 +4517,260 @@ msgid "" "startup." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:84 +#: src/slic3r/GUI/Preferences.cpp:89 msgid "Suppress \" - default - \" presets" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:86 +#: src/slic3r/GUI/Preferences.cpp:91 msgid "" "Suppress \" - default - \" presets in the Print / Filament / Printer " "selections once there are any other valid presets available." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:92 +#: src/slic3r/GUI/Preferences.cpp:97 msgid "Show incompatible print and filament presets" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:94 +#: src/slic3r/GUI/Preferences.cpp:99 msgid "" "When checked, the print and filament presets are shown in the preset editor " "even if they are marked as incompatible with the active printer" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:101 +#: src/slic3r/GUI/Preferences.cpp:106 msgid "Use Retina resolution for the 3D scene" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:103 +#: src/slic3r/GUI/Preferences.cpp:108 msgid "" "If enabled, the 3D scene will be rendered in Retina resolution. If you are " "experiencing 3D performance problems, disabling this option may help." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:110 +#: src/slic3r/GUI/Preferences.cpp:115 +msgid "Camera" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:121 msgid "Use perspective camera" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:112 +#: src/slic3r/GUI/Preferences.cpp:123 msgid "" "If enabled, use perspective camera. If not enabled, use orthographic camera." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:117 +#: src/slic3r/GUI/Preferences.cpp:129 +msgid "Use free camera" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:131 +msgid "If enabled, use free camera. If not enabled, use constrained camera." +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:137 +msgid "GUI" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:147 msgid "Use custom size for toolbar icons" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:119 +#: src/slic3r/GUI/Preferences.cpp:149 msgid "If enabled, you can change size of toolbar icons manually." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:144 +#: src/slic3r/GUI/Preferences.cpp:176 #, possible-c-format msgid "You need to restart %s to make the changes effective." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:192 +#: src/slic3r/GUI/Preferences.cpp:226 msgid "Icon size in a respect to the default size" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:207 +#: src/slic3r/GUI/Preferences.cpp:241 msgid "Select toolbar icon size in respect to the default one." msgstr "" -#: src/slic3r/GUI/Preset.cpp:237 +#: src/slic3r/GUI/Preset.cpp:247 msgid "modified" msgstr "" -#: src/slic3r/GUI/Preset.cpp:1034 src/slic3r/GUI/Preset.cpp:1081 -#: src/slic3r/GUI/Preset.cpp:1157 src/slic3r/GUI/Preset.cpp:1191 -#: src/slic3r/GUI/PresetBundle.cpp:1576 src/slic3r/GUI/PresetBundle.cpp:1660 +#: src/slic3r/GUI/Preset.cpp:1059 src/slic3r/GUI/Preset.cpp:1106 +#: src/slic3r/GUI/Preset.cpp:1182 src/slic3r/GUI/Preset.cpp:1216 +#: src/slic3r/GUI/PresetBundle.cpp:1576 src/slic3r/GUI/PresetBundle.cpp:1665 msgid "System presets" msgstr "" -#: src/slic3r/GUI/Preset.cpp:1085 src/slic3r/GUI/Preset.cpp:1195 -#: src/slic3r/GUI/PresetBundle.cpp:1665 +#: src/slic3r/GUI/Preset.cpp:1110 src/slic3r/GUI/Preset.cpp:1220 +#: src/slic3r/GUI/PresetBundle.cpp:1670 msgid "User presets" msgstr "" -#: src/slic3r/GUI/Preset.cpp:1116 src/slic3r/GUI/Tab.cpp:243 +#: src/slic3r/GUI/Preset.cpp:1141 src/slic3r/GUI/Tab.cpp:243 msgid "Add a new printer" msgstr "" -#: src/slic3r/GUI/Preset.cpp:1118 +#: src/slic3r/GUI/Preset.cpp:1143 msgid "Add/Remove materials" msgstr "" -#: src/slic3r/GUI/Preset.cpp:1409 +#: src/slic3r/GUI/Preset.cpp:1453 msgid "filament" msgstr "" -#: src/slic3r/GUI/Preset.cpp:1410 +#: src/slic3r/GUI/Preset.cpp:1454 msgid "SLA print" msgstr "" -#: src/slic3r/GUI/PresetBundle.cpp:1676 +#: src/slic3r/GUI/PresetBundle.cpp:1681 msgid "Add/Remove filaments" msgstr "" -#: src/slic3r/GUI/PresetHints.cpp:28 +#: src/slic3r/GUI/PresetHints.cpp:29 msgid "" "If estimated layer time is below ~%1%s, fan will run at %2%%% and print " "speed will be reduced so that no less than %3%s are spent on that layer " "(however, speed will never be reduced below %4%mm/s)." msgstr "" -#: src/slic3r/GUI/PresetHints.cpp:35 +#: src/slic3r/GUI/PresetHints.cpp:36 msgid "" "If estimated layer time is greater, but still below ~%1%s, fan will run at a " "proportionally decreasing speed between %2%%% and %3%%%." msgstr "" -#: src/slic3r/GUI/PresetHints.cpp:39 +#: src/slic3r/GUI/PresetHints.cpp:40 msgid "During the other layers, fan" msgstr "" -#: src/slic3r/GUI/PresetHints.cpp:41 +#: src/slic3r/GUI/PresetHints.cpp:42 msgid "Fan" msgstr "" -#: src/slic3r/GUI/PresetHints.cpp:47 +#: src/slic3r/GUI/PresetHints.cpp:48 msgid "will always run at %1%%%" msgstr "" -#: src/slic3r/GUI/PresetHints.cpp:50 +#: src/slic3r/GUI/PresetHints.cpp:51 msgid "except for the first %1% layers." msgstr "" -#: src/slic3r/GUI/PresetHints.cpp:52 +#: src/slic3r/GUI/PresetHints.cpp:53 msgid "except for the first layer." msgstr "" -#: src/slic3r/GUI/PresetHints.cpp:54 +#: src/slic3r/GUI/PresetHints.cpp:55 msgid "will be turned off." msgstr "" -#: src/slic3r/GUI/PresetHints.cpp:155 +#: src/slic3r/GUI/PresetHints.cpp:156 msgid "external perimeters" msgstr "" -#: src/slic3r/GUI/PresetHints.cpp:164 +#: src/slic3r/GUI/PresetHints.cpp:165 msgid "perimeters" msgstr "" -#: src/slic3r/GUI/PresetHints.cpp:173 +#: src/slic3r/GUI/PresetHints.cpp:174 msgid "infill" msgstr "" -#: src/slic3r/GUI/PresetHints.cpp:183 +#: src/slic3r/GUI/PresetHints.cpp:184 msgid "solid infill" msgstr "" -#: src/slic3r/GUI/PresetHints.cpp:191 +#: src/slic3r/GUI/PresetHints.cpp:192 msgid "top solid infill" msgstr "" -#: src/slic3r/GUI/PresetHints.cpp:202 +#: src/slic3r/GUI/PresetHints.cpp:203 msgid "support" msgstr "" -#: src/slic3r/GUI/PresetHints.cpp:212 +#: src/slic3r/GUI/PresetHints.cpp:213 msgid "support interface" msgstr "" -#: src/slic3r/GUI/PresetHints.cpp:218 +#: src/slic3r/GUI/PresetHints.cpp:219 msgid "First layer volumetric" msgstr "" -#: src/slic3r/GUI/PresetHints.cpp:218 +#: src/slic3r/GUI/PresetHints.cpp:219 msgid "Bridging volumetric" msgstr "" -#: src/slic3r/GUI/PresetHints.cpp:218 +#: src/slic3r/GUI/PresetHints.cpp:219 msgid "Volumetric" msgstr "" -#: src/slic3r/GUI/PresetHints.cpp:219 +#: src/slic3r/GUI/PresetHints.cpp:220 msgid "flow rate is maximized" msgstr "" -#: src/slic3r/GUI/PresetHints.cpp:222 +#: src/slic3r/GUI/PresetHints.cpp:223 msgid "by the print profile maximum" msgstr "" -#: src/slic3r/GUI/PresetHints.cpp:223 +#: src/slic3r/GUI/PresetHints.cpp:224 msgid "when printing" msgstr "" -#: src/slic3r/GUI/PresetHints.cpp:224 +#: src/slic3r/GUI/PresetHints.cpp:225 msgid "with a volumetric rate" msgstr "" -#: src/slic3r/GUI/PresetHints.cpp:228 +#: src/slic3r/GUI/PresetHints.cpp:229 #, possible-c-format msgid "%3.2f mm³/s at filament speed %3.2f mm/s." msgstr "" -#: src/slic3r/GUI/PresetHints.cpp:246 +#: src/slic3r/GUI/PresetHints.cpp:247 msgid "" "Recommended object thin wall thickness: Not available due to invalid layer " "height." msgstr "" -#: src/slic3r/GUI/PresetHints.cpp:262 +#: src/slic3r/GUI/PresetHints.cpp:263 #, possible-c-format msgid "Recommended object thin wall thickness for layer height %.2f and" msgstr "" -#: src/slic3r/GUI/PresetHints.cpp:268 +#: src/slic3r/GUI/PresetHints.cpp:269 #, possible-c-format msgid "%d lines: %.2f mm" msgstr "" +#: src/slic3r/GUI/PresetHints.cpp:300 +msgid "" +"Top / bottom shell thickness hint: Not available due to invalid layer height." +msgstr "" + +#: src/slic3r/GUI/PresetHints.cpp:313 +msgid "Top shell is %1% mm thick for layer height %2% mm." +msgstr "" + +#: src/slic3r/GUI/PresetHints.cpp:316 +msgid "Minimum top shell thickness is %1% mm." +msgstr "" + +#: src/slic3r/GUI/PresetHints.cpp:319 +msgid "Top is open." +msgstr "" + +#: src/slic3r/GUI/PresetHints.cpp:332 +msgid "Bottom shell is %1% mm thick for layer height %2% mm." +msgstr "" + +#: src/slic3r/GUI/PresetHints.cpp:335 +msgid "Minimum bottom shell thickness is %1% mm." +msgstr "" + +#: src/slic3r/GUI/PresetHints.cpp:338 +msgid "Bottom is open." +msgstr "" + #: src/slic3r/GUI/PrintHostDialogs.cpp:33 msgid "Send G-Code to printer host" msgstr "" @@ -4295,12 +4845,12 @@ msgid "Time" msgstr "" #: src/slic3r/GUI/RammingChart.cpp:76 src/slic3r/GUI/WipeTowerDialog.cpp:83 -#: src/libslic3r/PrintConfig.cpp:634 src/libslic3r/PrintConfig.cpp:678 -#: src/libslic3r/PrintConfig.cpp:693 src/libslic3r/PrintConfig.cpp:2385 -#: src/libslic3r/PrintConfig.cpp:2394 src/libslic3r/PrintConfig.cpp:2495 -#: src/libslic3r/PrintConfig.cpp:2503 src/libslic3r/PrintConfig.cpp:2511 -#: src/libslic3r/PrintConfig.cpp:2518 src/libslic3r/PrintConfig.cpp:2526 -#: src/libslic3r/PrintConfig.cpp:2534 +#: src/libslic3r/PrintConfig.cpp:645 src/libslic3r/PrintConfig.cpp:689 +#: src/libslic3r/PrintConfig.cpp:704 src/libslic3r/PrintConfig.cpp:2418 +#: src/libslic3r/PrintConfig.cpp:2427 src/libslic3r/PrintConfig.cpp:2528 +#: src/libslic3r/PrintConfig.cpp:2536 src/libslic3r/PrintConfig.cpp:2544 +#: src/libslic3r/PrintConfig.cpp:2551 src/libslic3r/PrintConfig.cpp:2559 +#: src/libslic3r/PrintConfig.cpp:2567 msgid "s" msgstr "" @@ -4308,8 +4858,8 @@ msgstr "" msgid "Volumetric speed" msgstr "" -#: src/slic3r/GUI/RammingChart.cpp:81 src/libslic3r/PrintConfig.cpp:591 -#: src/libslic3r/PrintConfig.cpp:1247 +#: src/slic3r/GUI/RammingChart.cpp:81 src/libslic3r/PrintConfig.cpp:602 +#: src/libslic3r/PrintConfig.cpp:1259 msgid "mm³/s" msgstr "" @@ -4349,11 +4899,11 @@ msgstr "" msgid "Scale To Fit" msgstr "" -#: src/slic3r/GUI/Selection.cpp:1474 +#: src/slic3r/GUI/Selection.cpp:1475 msgid "Set Printable Instance" msgstr "" -#: src/slic3r/GUI/Selection.cpp:1474 +#: src/slic3r/GUI/Selection.cpp:1475 msgid "Set Unprintable Instance" msgstr "" @@ -4365,7 +4915,7 @@ msgstr "" msgid "Copy to Clipboard" msgstr "" -#: src/slic3r/GUI/Tab.cpp:52 src/libslic3r/PrintConfig.cpp:244 +#: src/slic3r/GUI/Tab.cpp:52 src/libslic3r/PrintConfig.cpp:255 msgid "Compatible printers" msgstr "" @@ -4373,7 +4923,7 @@ msgstr "" msgid "Select the printers this profile is compatible with." msgstr "" -#: src/slic3r/GUI/Tab.cpp:58 src/libslic3r/PrintConfig.cpp:259 +#: src/slic3r/GUI/Tab.cpp:58 src/libslic3r/PrintConfig.cpp:270 msgid "Compatible print profiles" msgstr "" @@ -4461,7 +5011,7 @@ msgstr "" msgid "symbolic profile name" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1038 src/slic3r/GUI/Tab.cpp:3558 +#: src/slic3r/GUI/Tab.cpp:1038 src/slic3r/GUI/Tab.cpp:3570 msgid "Layers and perimeters" msgstr "" @@ -4473,213 +5023,217 @@ msgstr "" msgid "Horizontal shells" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1055 src/libslic3r/PrintConfig.cpp:1776 +#: src/slic3r/GUI/Tab.cpp:1055 src/libslic3r/PrintConfig.cpp:1790 msgid "Solid layers" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1060 +#: src/slic3r/GUI/Tab.cpp:1059 +msgid "Minimum shell thickness" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:1070 msgid "Quality (slower slicing)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1078 +#: src/slic3r/GUI/Tab.cpp:1088 msgid "Reducing printing time" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1090 +#: src/slic3r/GUI/Tab.cpp:1100 msgid "Skirt and brim" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1107 +#: src/slic3r/GUI/Tab.cpp:1117 msgid "Raft" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1111 +#: src/slic3r/GUI/Tab.cpp:1121 msgid "Options for support material and raft" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1126 +#: src/slic3r/GUI/Tab.cpp:1136 msgid "Speed for print moves" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1138 +#: src/slic3r/GUI/Tab.cpp:1148 msgid "Speed for non-print moves" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1141 +#: src/slic3r/GUI/Tab.cpp:1151 msgid "Modifiers" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1144 +#: src/slic3r/GUI/Tab.cpp:1154 msgid "Acceleration control (advanced)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1151 +#: src/slic3r/GUI/Tab.cpp:1161 msgid "Autospeed (advanced)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1159 +#: src/slic3r/GUI/Tab.cpp:1169 msgid "Multiple Extruders" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1167 +#: src/slic3r/GUI/Tab.cpp:1177 msgid "Ooze prevention" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1185 +#: src/slic3r/GUI/Tab.cpp:1195 msgid "Extrusion width" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1195 +#: src/slic3r/GUI/Tab.cpp:1205 msgid "Overlap" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1198 +#: src/slic3r/GUI/Tab.cpp:1208 msgid "Flow" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1207 +#: src/slic3r/GUI/Tab.cpp:1217 msgid "Other" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1210 src/slic3r/GUI/Tab.cpp:3618 +#: src/slic3r/GUI/Tab.cpp:1220 src/slic3r/GUI/Tab.cpp:3637 msgid "Output options" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1211 +#: src/slic3r/GUI/Tab.cpp:1221 msgid "Sequential printing" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1213 +#: src/slic3r/GUI/Tab.cpp:1223 msgid "Extruder clearance (mm)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1222 src/slic3r/GUI/Tab.cpp:3619 +#: src/slic3r/GUI/Tab.cpp:1232 src/slic3r/GUI/Tab.cpp:3638 msgid "Output file" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1229 src/libslic3r/PrintConfig.cpp:1448 +#: src/slic3r/GUI/Tab.cpp:1239 src/libslic3r/PrintConfig.cpp:1462 msgid "Post-processing scripts" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1235 src/slic3r/GUI/Tab.cpp:1236 -#: src/slic3r/GUI/Tab.cpp:1517 src/slic3r/GUI/Tab.cpp:1518 -#: src/slic3r/GUI/Tab.cpp:1982 src/slic3r/GUI/Tab.cpp:1983 -#: src/slic3r/GUI/Tab.cpp:2096 src/slic3r/GUI/Tab.cpp:2097 -#: src/slic3r/GUI/Tab.cpp:3495 src/slic3r/GUI/Tab.cpp:3496 +#: src/slic3r/GUI/Tab.cpp:1245 src/slic3r/GUI/Tab.cpp:1246 +#: src/slic3r/GUI/Tab.cpp:1531 src/slic3r/GUI/Tab.cpp:1532 +#: src/slic3r/GUI/Tab.cpp:1996 src/slic3r/GUI/Tab.cpp:1997 +#: src/slic3r/GUI/Tab.cpp:2110 src/slic3r/GUI/Tab.cpp:2111 +#: src/slic3r/GUI/Tab.cpp:3507 src/slic3r/GUI/Tab.cpp:3508 msgid "Notes" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1242 src/slic3r/GUI/Tab.cpp:1525 -#: src/slic3r/GUI/Tab.cpp:1989 src/slic3r/GUI/Tab.cpp:2103 -#: src/slic3r/GUI/Tab.cpp:3503 src/slic3r/GUI/Tab.cpp:3624 +#: src/slic3r/GUI/Tab.cpp:1252 src/slic3r/GUI/Tab.cpp:1539 +#: src/slic3r/GUI/Tab.cpp:2003 src/slic3r/GUI/Tab.cpp:2117 +#: src/slic3r/GUI/Tab.cpp:3515 src/slic3r/GUI/Tab.cpp:3643 msgid "Dependencies" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1243 src/slic3r/GUI/Tab.cpp:1526 -#: src/slic3r/GUI/Tab.cpp:1990 src/slic3r/GUI/Tab.cpp:2104 -#: src/slic3r/GUI/Tab.cpp:3504 src/slic3r/GUI/Tab.cpp:3625 +#: src/slic3r/GUI/Tab.cpp:1253 src/slic3r/GUI/Tab.cpp:1540 +#: src/slic3r/GUI/Tab.cpp:2004 src/slic3r/GUI/Tab.cpp:2118 +#: src/slic3r/GUI/Tab.cpp:3516 src/slic3r/GUI/Tab.cpp:3644 msgid "Profile dependencies" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1303 src/slic3r/GUI/Tab.cpp:1358 +#: src/slic3r/GUI/Tab.cpp:1317 src/slic3r/GUI/Tab.cpp:1372 msgid "Filament Overrides" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1304 src/slic3r/GUI/Tab.cpp:1363 -#: src/slic3r/GUI/Tab.cpp:2338 +#: src/slic3r/GUI/Tab.cpp:1318 src/slic3r/GUI/Tab.cpp:1377 +#: src/slic3r/GUI/Tab.cpp:2352 msgid "Retraction" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1413 src/libslic3r/PrintConfig.cpp:2056 +#: src/slic3r/GUI/Tab.cpp:1427 src/libslic3r/PrintConfig.cpp:2077 msgid "Temperature" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1419 +#: src/slic3r/GUI/Tab.cpp:1433 msgid "Bed" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1424 +#: src/slic3r/GUI/Tab.cpp:1438 msgid "Cooling" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1425 src/libslic3r/PrintConfig.cpp:1350 -#: src/libslic3r/PrintConfig.cpp:2177 +#: src/slic3r/GUI/Tab.cpp:1439 src/libslic3r/PrintConfig.cpp:1364 +#: src/libslic3r/PrintConfig.cpp:2210 msgid "Enable" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1436 +#: src/slic3r/GUI/Tab.cpp:1450 msgid "Fan settings" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1445 +#: src/slic3r/GUI/Tab.cpp:1459 msgid "Cooling thresholds" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1451 +#: src/slic3r/GUI/Tab.cpp:1465 msgid "Filament properties" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1455 +#: src/slic3r/GUI/Tab.cpp:1469 msgid "Print speed override" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1465 +#: src/slic3r/GUI/Tab.cpp:1479 msgid "Wipe tower parameters" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1468 +#: src/slic3r/GUI/Tab.cpp:1482 msgid "Toolchange parameters with single extruder MM printers" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1482 +#: src/slic3r/GUI/Tab.cpp:1496 msgid "Ramming settings" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1504 src/slic3r/GUI/Tab.cpp:1945 +#: src/slic3r/GUI/Tab.cpp:1518 src/slic3r/GUI/Tab.cpp:1959 msgid "Custom G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1505 src/slic3r/GUI/Tab.cpp:1946 -#: src/libslic3r/PrintConfig.cpp:1802 src/libslic3r/PrintConfig.cpp:1817 +#: src/slic3r/GUI/Tab.cpp:1519 src/slic3r/GUI/Tab.cpp:1960 +#: src/libslic3r/PrintConfig.cpp:1823 src/libslic3r/PrintConfig.cpp:1838 msgid "Start G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1511 src/slic3r/GUI/Tab.cpp:1952 -#: src/libslic3r/PrintConfig.cpp:374 src/libslic3r/PrintConfig.cpp:384 +#: src/slic3r/GUI/Tab.cpp:1525 src/slic3r/GUI/Tab.cpp:1966 +#: src/libslic3r/PrintConfig.cpp:385 src/libslic3r/PrintConfig.cpp:395 msgid "End G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1568 +#: src/slic3r/GUI/Tab.cpp:1582 msgid "Volumetric flow hints not available" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1654 src/slic3r/GUI/Tab.cpp:1885 +#: src/slic3r/GUI/Tab.cpp:1668 src/slic3r/GUI/Tab.cpp:1899 msgid "Test" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1664 +#: src/slic3r/GUI/Tab.cpp:1678 msgid "Could not get a valid Printer Host reference" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1670 src/slic3r/GUI/Tab.cpp:1898 +#: src/slic3r/GUI/Tab.cpp:1684 src/slic3r/GUI/Tab.cpp:1912 msgid "Success!" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1685 +#: src/slic3r/GUI/Tab.cpp:1699 msgid "" "HTTPS CA file is optional. It is only needed if you use HTTPS with a self-" "signed certificate." msgstr "" -#: src/slic3r/GUI/Tab.cpp:1698 +#: src/slic3r/GUI/Tab.cpp:1712 msgid "Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1699 +#: src/slic3r/GUI/Tab.cpp:1713 msgid "Open CA certificate file" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1727 +#: src/slic3r/GUI/Tab.cpp:1741 #, possible-c-format msgid "" "HTTPS CA File:\n" @@ -4689,24 +5243,24 @@ msgid "" "Store / Keychain." msgstr "" -#: src/slic3r/GUI/Tab.cpp:1767 src/slic3r/GUI/Tab.cpp:2011 +#: src/slic3r/GUI/Tab.cpp:1781 src/slic3r/GUI/Tab.cpp:2025 msgid "Size and coordinates" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1772 src/slic3r/GUI/Tab.cpp:2016 -#: src/slic3r/GUI/Tab.cpp:3132 +#: src/slic3r/GUI/Tab.cpp:1786 src/slic3r/GUI/Tab.cpp:2030 +#: src/slic3r/GUI/Tab.cpp:3146 msgid "Set" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1804 +#: src/slic3r/GUI/Tab.cpp:1818 msgid "Capabilities" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1809 +#: src/slic3r/GUI/Tab.cpp:1823 msgid "Number of extruders of the printer." msgstr "" -#: src/slic3r/GUI/Tab.cpp:1837 +#: src/slic3r/GUI/Tab.cpp:1851 msgid "" "Single Extruder Multi Material is selected, \n" "and all extruders must have the same diameter.\n" @@ -4714,248 +5268,248 @@ msgid "" "nozzle diameter value?" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1840 src/slic3r/GUI/Tab.cpp:2308 -#: src/libslic3r/PrintConfig.cpp:1323 +#: src/slic3r/GUI/Tab.cpp:1854 src/slic3r/GUI/Tab.cpp:2322 +#: src/libslic3r/PrintConfig.cpp:1335 msgid "Nozzle diameter" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1870 +#: src/slic3r/GUI/Tab.cpp:1884 msgid "USB/Serial connection" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1871 src/libslic3r/PrintConfig.cpp:1656 +#: src/slic3r/GUI/Tab.cpp:1885 src/libslic3r/PrintConfig.cpp:1670 msgid "Serial port" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1876 +#: src/slic3r/GUI/Tab.cpp:1890 msgid "Rescan serial ports" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1898 +#: src/slic3r/GUI/Tab.cpp:1912 msgid "Connection to printer works correctly." msgstr "" -#: src/slic3r/GUI/Tab.cpp:1901 +#: src/slic3r/GUI/Tab.cpp:1915 msgid "Connection failed." msgstr "" -#: src/slic3r/GUI/Tab.cpp:1914 src/slic3r/GUI/Tab.cpp:2091 +#: src/slic3r/GUI/Tab.cpp:1928 src/slic3r/GUI/Tab.cpp:2105 msgid "Print Host upload" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1958 src/libslic3r/PrintConfig.cpp:143 +#: src/slic3r/GUI/Tab.cpp:1972 src/libslic3r/PrintConfig.cpp:143 msgid "Before layer change G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1964 src/libslic3r/PrintConfig.cpp:1069 +#: src/slic3r/GUI/Tab.cpp:1978 src/libslic3r/PrintConfig.cpp:1081 msgid "After layer change G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1970 src/libslic3r/PrintConfig.cpp:2082 +#: src/slic3r/GUI/Tab.cpp:1984 src/libslic3r/PrintConfig.cpp:2103 msgid "Tool change G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1976 +#: src/slic3r/GUI/Tab.cpp:1990 msgid "Between objects G-code (for sequential printing)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2048 +#: src/slic3r/GUI/Tab.cpp:2062 msgid "Display" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2063 +#: src/slic3r/GUI/Tab.cpp:2077 msgid "Tilt" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2064 +#: src/slic3r/GUI/Tab.cpp:2078 msgid "Tilt time" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2070 src/slic3r/GUI/Tab.cpp:3477 +#: src/slic3r/GUI/Tab.cpp:2084 src/slic3r/GUI/Tab.cpp:3489 msgid "Corrections" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2085 src/slic3r/GUI/Tab.cpp:3473 +#: src/slic3r/GUI/Tab.cpp:2099 src/slic3r/GUI/Tab.cpp:3485 msgid "Exposure" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2156 src/slic3r/GUI/Tab.cpp:2241 -#: src/libslic3r/PrintConfig.cpp:1119 src/libslic3r/PrintConfig.cpp:1137 -#: src/libslic3r/PrintConfig.cpp:1155 src/libslic3r/PrintConfig.cpp:1172 -#: src/libslic3r/PrintConfig.cpp:1183 src/libslic3r/PrintConfig.cpp:1194 -#: src/libslic3r/PrintConfig.cpp:1205 +#: src/slic3r/GUI/Tab.cpp:2170 src/slic3r/GUI/Tab.cpp:2255 +#: src/libslic3r/PrintConfig.cpp:1131 src/libslic3r/PrintConfig.cpp:1149 +#: src/libslic3r/PrintConfig.cpp:1167 src/libslic3r/PrintConfig.cpp:1184 +#: src/libslic3r/PrintConfig.cpp:1195 src/libslic3r/PrintConfig.cpp:1206 +#: src/libslic3r/PrintConfig.cpp:1217 msgid "Machine limits" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2170 +#: src/slic3r/GUI/Tab.cpp:2184 msgid "Values in this column are for Normal mode" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2171 +#: src/slic3r/GUI/Tab.cpp:2185 msgid "Normal" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2176 +#: src/slic3r/GUI/Tab.cpp:2190 msgid "Values in this column are for Stealth mode" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2177 +#: src/slic3r/GUI/Tab.cpp:2191 msgid "Stealth" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2185 +#: src/slic3r/GUI/Tab.cpp:2199 msgid "Maximum feedrates" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2190 +#: src/slic3r/GUI/Tab.cpp:2204 msgid "Maximum accelerations" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2197 +#: src/slic3r/GUI/Tab.cpp:2211 msgid "Jerk limits" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2202 +#: src/slic3r/GUI/Tab.cpp:2216 msgid "Minimum feedrates" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2266 src/slic3r/GUI/Tab.cpp:2274 +#: src/slic3r/GUI/Tab.cpp:2280 src/slic3r/GUI/Tab.cpp:2288 msgid "Single extruder MM setup" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2275 +#: src/slic3r/GUI/Tab.cpp:2289 msgid "Single extruder multimaterial parameters" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2306 +#: src/slic3r/GUI/Tab.cpp:2320 msgid "" "This is a single extruder multimaterial printer, diameters of all extruders " "will be set to the new value. Do you want to proceed?" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2330 +#: src/slic3r/GUI/Tab.cpp:2344 msgid "Layer height limits" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2335 +#: src/slic3r/GUI/Tab.cpp:2349 msgid "Position (for multi-extruder printers)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2341 +#: src/slic3r/GUI/Tab.cpp:2355 msgid "Only lift Z" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2354 +#: src/slic3r/GUI/Tab.cpp:2368 msgid "" "Retraction when tool is disabled (advanced settings for multi-extruder " "setups)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2362 +#: src/slic3r/GUI/Tab.cpp:2376 msgid "Reset to Filament Color" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2543 +#: src/slic3r/GUI/Tab.cpp:2557 msgid "" "The Wipe option is not available when using the Firmware Retraction mode.\n" "\n" "Shall I disable it in order to enable Firmware Retraction?" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2545 +#: src/slic3r/GUI/Tab.cpp:2559 msgid "Firmware Retraction" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2875 +#: src/slic3r/GUI/Tab.cpp:2889 #, possible-c-format msgid "Default preset (%s)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2876 +#: src/slic3r/GUI/Tab.cpp:2890 #, possible-c-format msgid "Preset (%s)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2893 +#: src/slic3r/GUI/Tab.cpp:2907 msgid "has the following unsaved changes:" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2896 +#: src/slic3r/GUI/Tab.cpp:2910 msgid "is not compatible with printer" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2897 +#: src/slic3r/GUI/Tab.cpp:2911 msgid "is not compatible with print profile" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2899 +#: src/slic3r/GUI/Tab.cpp:2913 msgid "and it has the following unsaved changes:" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2903 +#: src/slic3r/GUI/Tab.cpp:2917 msgid "Unsaved Changes" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3001 +#: src/slic3r/GUI/Tab.cpp:3015 msgctxt "PresetName" msgid "%1% - Copy" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3024 +#: src/slic3r/GUI/Tab.cpp:3038 msgid "The supplied name is empty. It can't be saved." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3029 +#: src/slic3r/GUI/Tab.cpp:3043 msgid "Cannot overwrite a system profile." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3033 +#: src/slic3r/GUI/Tab.cpp:3047 msgid "Cannot overwrite an external profile." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3038 +#: src/slic3r/GUI/Tab.cpp:3052 msgid "Preset with name \"%1%\" already exists." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3039 +#: src/slic3r/GUI/Tab.cpp:3053 msgid "Replace?" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3077 +#: src/slic3r/GUI/Tab.cpp:3091 msgid "remove" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3077 +#: src/slic3r/GUI/Tab.cpp:3091 msgid "delete" msgstr "" #. TRN remove/delete -#: src/slic3r/GUI/Tab.cpp:3079 +#: src/slic3r/GUI/Tab.cpp:3093 msgid "Are you sure you want to %1% the selected preset?" msgstr "" #. TRN Remove/Delete -#: src/slic3r/GUI/Tab.cpp:3082 +#: src/slic3r/GUI/Tab.cpp:3096 msgid "%1% Preset" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3208 +#: src/slic3r/GUI/Tab.cpp:3222 msgid "LOCKED LOCK" msgstr "" #. TRN Description for "LOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:3210 +#: src/slic3r/GUI/Tab.cpp:3224 msgid "" "indicates that the settings are the same as the system (or default) values " "for the current option group" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3212 +#: src/slic3r/GUI/Tab.cpp:3226 msgid "UNLOCKED LOCK" msgstr "" #. TRN Description for "UNLOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:3214 +#: src/slic3r/GUI/Tab.cpp:3228 msgid "" "indicates that some settings were changed and are not equal to the system " "(or default) values for the current option group.\n" @@ -4963,23 +5517,23 @@ msgid "" "to the system (or default) values." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3219 +#: src/slic3r/GUI/Tab.cpp:3233 msgid "WHITE BULLET" msgstr "" #. TRN Description for "WHITE BULLET" -#: src/slic3r/GUI/Tab.cpp:3221 +#: src/slic3r/GUI/Tab.cpp:3235 msgid "" "for the left button: \tindicates a non-system (or non-default) preset,\n" "for the right button: \tindicates that the settings hasn't been modified." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3224 +#: src/slic3r/GUI/Tab.cpp:3238 msgid "BACK ARROW" msgstr "" #. TRN Description for "BACK ARROW" -#: src/slic3r/GUI/Tab.cpp:3226 +#: src/slic3r/GUI/Tab.cpp:3240 msgid "" "indicates that the settings were changed and are not equal to the last saved " "preset for the current option group.\n" @@ -4987,13 +5541,13 @@ msgid "" "to the last saved preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3236 +#: src/slic3r/GUI/Tab.cpp:3250 msgid "" "LOCKED LOCK icon indicates that the settings are the same as the system (or " "default) values for the current option group" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3238 +#: src/slic3r/GUI/Tab.cpp:3252 msgid "" "UNLOCKED LOCK icon indicates that some settings were changed and are not " "equal to the system (or default) values for the current option group.\n" @@ -5001,17 +5555,17 @@ msgid "" "default) values." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3241 +#: src/slic3r/GUI/Tab.cpp:3255 msgid "WHITE BULLET icon indicates a non system (or non default) preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3244 +#: src/slic3r/GUI/Tab.cpp:3258 msgid "" "WHITE BULLET icon indicates that the settings are the same as in the last " "saved preset for the current option group." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3246 +#: src/slic3r/GUI/Tab.cpp:3260 msgid "" "BACK ARROW icon indicates that the settings were changed and are not equal " "to the last saved preset for the current option group.\n" @@ -5019,26 +5573,26 @@ msgid "" "preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3252 +#: src/slic3r/GUI/Tab.cpp:3266 msgid "" "LOCKED LOCK icon indicates that the value is the same as the system (or " "default) value." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3253 +#: src/slic3r/GUI/Tab.cpp:3267 msgid "" "UNLOCKED LOCK icon indicates that the value was changed and is not equal to " "the system (or default) value.\n" "Click to reset current value to the system (or default) value." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3259 +#: src/slic3r/GUI/Tab.cpp:3273 msgid "" "WHITE BULLET icon indicates that the value is the same as in the last saved " "preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3260 +#: src/slic3r/GUI/Tab.cpp:3274 msgid "" "BACK ARROW icon indicates that the value was changed and is not equal to the " "last saved preset.\n" @@ -5046,61 +5600,56 @@ msgid "" msgstr "" #. TRN Preset -#: src/slic3r/GUI/Tab.cpp:3373 +#: src/slic3r/GUI/Tab.cpp:3387 #, possible-c-format msgid "Save %s as:" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3417 +#: src/slic3r/GUI/Tab.cpp:3431 msgid "the following suffix is not allowed:" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3421 +#: src/slic3r/GUI/Tab.cpp:3435 msgid "The supplied name is not available." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3434 src/slic3r/GUI/Tab.cpp:3436 +#: src/slic3r/GUI/Tab.cpp:3448 src/slic3r/GUI/Tab.cpp:3450 msgid "Material" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3470 src/slic3r/GUI/Tab.cpp:3560 -#: src/slic3r/GUI/wxExtensions.cpp:601 -msgid "Layers" -msgstr "" - -#: src/slic3r/GUI/Tab.cpp:3568 +#: src/slic3r/GUI/Tab.cpp:3580 msgid "Support head" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3573 +#: src/slic3r/GUI/Tab.cpp:3585 msgid "Support pillar" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3587 +#: src/slic3r/GUI/Tab.cpp:3599 msgid "Connection of the support sticks and junctions" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3592 +#: src/slic3r/GUI/Tab.cpp:3604 msgid "Automatic generation" msgstr "" -#: src/slic3r/GUI/Tab.hpp:327 src/slic3r/GUI/Tab.hpp:427 +#: src/slic3r/GUI/Tab.hpp:327 src/slic3r/GUI/Tab.hpp:429 msgid "Print Settings" msgstr "" -#: src/slic3r/GUI/Tab.hpp:352 +#: src/slic3r/GUI/Tab.hpp:354 msgid "Filament Settings" msgstr "" -#: src/slic3r/GUI/Tab.hpp:388 +#: src/slic3r/GUI/Tab.hpp:390 msgid "Printer Settings" msgstr "" -#: src/slic3r/GUI/Tab.hpp:412 +#: src/slic3r/GUI/Tab.hpp:414 msgid "Material Settings" msgstr "" -#: src/slic3r/GUI/Tab.hpp:439 +#: src/slic3r/GUI/Tab.hpp:441 msgid "Save preset" msgstr "" @@ -5126,6 +5675,7 @@ msgid "Changelog && Download" msgstr "" #: src/slic3r/GUI/UpdateDialogs.cpp:60 src/slic3r/GUI/UpdateDialogs.cpp:125 +#: src/slic3r/GUI/UpdateDialogs.cpp:183 msgid "Open changelog page" msgstr "" @@ -5137,7 +5687,7 @@ msgstr "" msgid "Don't notify about new releases any more" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:89 src/slic3r/GUI/UpdateDialogs.cpp:205 +#: src/slic3r/GUI/UpdateDialogs.cpp:89 src/slic3r/GUI/UpdateDialogs.cpp:266 msgid "Configuration update" msgstr "" @@ -5155,21 +5705,41 @@ msgid "" "Updated configuration bundles:" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:113 +#: src/slic3r/GUI/UpdateDialogs.cpp:113 src/slic3r/GUI/UpdateDialogs.cpp:173 msgid "Comment:" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:149 +#: src/slic3r/GUI/UpdateDialogs.cpp:148 src/slic3r/GUI/UpdateDialogs.cpp:210 #, possible-c-format msgid "%s incompatibility" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:150 +#: src/slic3r/GUI/UpdateDialogs.cpp:148 +msgid "Configuration update is necessary to install" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:151 +#, possible-c-format +msgid "" +"%s will now start updates. Otherwise it won't be able to start.\n" +"\n" +"Note that a full configuration snapshot will be created first. It can then " +"be restored at any time should there be a problem with the new version.\n" +"\n" +"Updated configuration bundles:" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:191 src/slic3r/GUI/UpdateDialogs.cpp:246 +#, possible-c-format +msgid "Exit %s" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:211 #, possible-c-format msgid "%s configuration is incompatible" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:155 +#: src/slic3r/GUI/UpdateDialogs.cpp:216 #, possible-c-format msgid "" "This version of %s is not compatible with currently installed configuration " @@ -5182,25 +5752,20 @@ msgid "" "existing configuration before installing files compatible with this %s." msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:164 +#: src/slic3r/GUI/UpdateDialogs.cpp:225 #, possible-c-format msgid "This %s version: %s" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:169 +#: src/slic3r/GUI/UpdateDialogs.cpp:230 msgid "Incompatible bundles:" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:185 -#, possible-c-format -msgid "Exit %s" -msgstr "" - -#: src/slic3r/GUI/UpdateDialogs.cpp:188 +#: src/slic3r/GUI/UpdateDialogs.cpp:249 msgid "Re-configure" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:209 +#: src/slic3r/GUI/UpdateDialogs.cpp:270 #, possible-c-format msgid "" "%s now uses an updated configuration structure.\n" @@ -5216,10 +5781,23 @@ msgid "" "choose whether to enable automatic preset updates." msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:225 +#: src/slic3r/GUI/UpdateDialogs.cpp:286 msgid "For more information please visit our wiki page:" msgstr "" +#: src/slic3r/GUI/UpdateDialogs.cpp:303 +msgid "Configuration updates" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:303 +msgid "No updates aviable" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:308 +#, possible-c-format +msgid "%s has no configuration updates aviable." +msgstr "" + #: src/slic3r/GUI/WipeTowerDialog.cpp:15 msgid "Ramming customization" msgstr "" @@ -5309,242 +5887,53 @@ msgstr "" msgid "Show advanced settings" msgstr "" -#: src/slic3r/GUI/wxExtensions.cpp:590 -msgid "Instances" -msgstr "" - -#: src/slic3r/GUI/wxExtensions.cpp:594 src/slic3r/GUI/wxExtensions.cpp:750 -#, possible-c-format -msgid "Instance %d" -msgstr "" - -#: src/slic3r/GUI/wxExtensions.cpp:628 -msgid "Range" -msgstr "" - -#: src/slic3r/GUI/wxExtensions.cpp:2325 -msgid "Place bearings in slots and resume" -msgstr "" - -#: src/slic3r/GUI/wxExtensions.cpp:3075 -msgid "One layer mode" -msgstr "" - -#: src/slic3r/GUI/wxExtensions.cpp:3078 -msgid "Discard all custom changes" -msgstr "" - -#: src/slic3r/GUI/wxExtensions.cpp:3080 -msgid "Set extruder sequence for whole print" -msgstr "" - -#: src/slic3r/GUI/wxExtensions.cpp:3086 -msgid "For add color change use left mouse button click" -msgstr "" - -#: src/slic3r/GUI/wxExtensions.cpp:3087 -msgid "For add change extruder use left mouse button click" -msgstr "" - -#: src/slic3r/GUI/wxExtensions.cpp:3088 -msgid "For add another code use right mouse button click" -msgstr "" - -#: src/slic3r/GUI/wxExtensions.cpp:3090 -msgid "" -"For Delete color change use left mouse button click\n" -"For Edit color use right mouse button click" -msgstr "" - -#: src/slic3r/GUI/wxExtensions.cpp:3092 -msgid "Delete color change for Extruder %1%" -msgstr "" - -#: src/slic3r/GUI/wxExtensions.cpp:3095 -msgid "Delete extruder change to \"%1%\"" -msgstr "" - -#: src/slic3r/GUI/wxExtensions.cpp:3096 -msgid "" -"For Delete \"%1%\" code use left mouse button click\n" -"For Edit \"%1%\" code use right mouse button click" -msgstr "" - -#: src/slic3r/GUI/wxExtensions.cpp:3176 src/slic3r/GUI/wxExtensions.cpp:3432 -msgid "Use another extruder" -msgstr "" - -#: src/slic3r/GUI/wxExtensions.cpp:3435 -msgid "Add color change (%1%) for:" -msgstr "" - -#: src/slic3r/GUI/wxExtensions.cpp:3441 -msgid "Add color change" -msgstr "" - -#: src/slic3r/GUI/wxExtensions.cpp:3444 -msgid "Add pause print" -msgstr "" - -#: src/slic3r/GUI/wxExtensions.cpp:3447 -msgid "Add custom G-code" -msgstr "" - -#: src/slic3r/GUI/wxExtensions.cpp:3460 -msgid "Edit color" -msgstr "" - -#: src/slic3r/GUI/wxExtensions.cpp:3461 -msgid "Edit pause print message" -msgstr "" - -#: src/slic3r/GUI/wxExtensions.cpp:3462 -msgid "Edit custom G-code" -msgstr "" - -#: src/slic3r/GUI/wxExtensions.cpp:3465 -msgid "Delete color change" -msgstr "" - -#: src/slic3r/GUI/wxExtensions.cpp:3466 -msgid "Delete pause print" -msgstr "" - -#: src/slic3r/GUI/wxExtensions.cpp:3467 -msgid "Delete custom G-code" -msgstr "" - -#: src/slic3r/GUI/wxExtensions.cpp:3499 -msgid "Enter custom G-code used on current layer" -msgstr "" - -#: src/slic3r/GUI/wxExtensions.cpp:3500 -msgid "Custom Gcode on current layer (%1% mm)." -msgstr "" - -#: src/slic3r/GUI/wxExtensions.cpp:3513 -msgid "Enter short message shown on Printer display during pause print" -msgstr "" - -#: src/slic3r/GUI/wxExtensions.cpp:3514 -msgid "Message for pause print on current layer (%1% mm)." -msgstr "" - -#: src/slic3r/GUI/wxExtensions.cpp:3774 +#: src/slic3r/GUI/wxExtensions.cpp:680 #, possible-c-format msgid "Switch to the %s mode" msgstr "" -#: src/slic3r/GUI/wxExtensions.cpp:3775 +#: src/slic3r/GUI/wxExtensions.cpp:681 #, possible-c-format msgid "Current mode is %s" msgstr "" -#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:23 -msgid "Set extruder sequence" -msgstr "" - -#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:39 -msgid "Set extruder change for every" -msgstr "" - -#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:52 -#: src/libslic3r/PrintConfig.cpp:341 src/libslic3r/PrintConfig.cpp:983 -#: src/libslic3r/PrintConfig.cpp:1500 src/libslic3r/PrintConfig.cpp:1685 -#: src/libslic3r/PrintConfig.cpp:1746 src/libslic3r/PrintConfig.cpp:1919 -#: src/libslic3r/PrintConfig.cpp:1965 -msgid "layers" -msgstr "" - -#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:136 -msgid "Set extruder(tool) sequence" -msgstr "" - -#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:182 -msgid "Remove extruder from sequence" -msgstr "" - -#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:192 -msgid "Add extruder to sequence" -msgstr "" - -#: src/slic3r/Utils/Duet.cpp:51 -msgid "Connection to Duet works correctly." -msgstr "" - -#: src/slic3r/Utils/Duet.cpp:56 -msgid "Could not connect to Duet" -msgstr "" - -#: src/slic3r/Utils/Duet.cpp:84 src/slic3r/Utils/Duet.cpp:154 -#: src/slic3r/Utils/FlashAir.cpp:115 src/slic3r/Utils/FlashAir.cpp:132 -msgid "Unknown error occured" -msgstr "" - -#: src/slic3r/Utils/Duet.cpp:148 -msgid "Wrong password" -msgstr "" - -#: src/slic3r/Utils/Duet.cpp:151 -msgid "Could not get resources to create a new connection" -msgstr "" - -#: src/slic3r/Utils/OctoPrint.cpp:70 +#: src/slic3r/Utils/AstroBox.cpp:68 src/slic3r/Utils/OctoPrint.cpp:68 #, possible-c-format msgid "Mismatched type of print host: %s" msgstr "" -#: src/slic3r/Utils/OctoPrint.cpp:85 -msgid "Connection to OctoPrint works correctly." +#: src/slic3r/Utils/AstroBox.cpp:83 +msgid "Connection to AstroBox works correctly." msgstr "" -#: src/slic3r/Utils/OctoPrint.cpp:91 -msgid "Could not connect to OctoPrint" +#: src/slic3r/Utils/AstroBox.cpp:89 +msgid "Could not connect to AstroBox" msgstr "" -#: src/slic3r/Utils/OctoPrint.cpp:91 -msgid "Note: OctoPrint version at least 1.1.0 is required." +#: src/slic3r/Utils/AstroBox.cpp:89 +msgid "Note: AstroBox version at least 1.1.0 is required." msgstr "" -#: src/slic3r/Utils/OctoPrint.cpp:196 -msgid "Connection to Prusa SL1 works correctly." +#: src/slic3r/Utils/Duet.cpp:49 +msgid "Connection to Duet works correctly." msgstr "" -#: src/slic3r/Utils/OctoPrint.cpp:201 -msgid "Could not connect to Prusa SLA" +#: src/slic3r/Utils/Duet.cpp:54 +msgid "Could not connect to Duet" msgstr "" -#: src/slic3r/Utils/FlashAir.cpp:60 -msgid "Upload not enabled on FlashAir card." +#: src/slic3r/Utils/Duet.cpp:82 src/slic3r/Utils/Duet.cpp:137 +#: src/slic3r/Utils/FlashAir.cpp:119 src/slic3r/Utils/FlashAir.cpp:140 +#: src/slic3r/Utils/FlashAir.cpp:156 +msgid "Unknown error occured" msgstr "" -#: src/slic3r/Utils/FlashAir.cpp:70 -msgid "Connection to FlashAir works correctly and upload is enabled." +#: src/slic3r/Utils/Duet.cpp:131 +msgid "Wrong password" msgstr "" -#: src/slic3r/Utils/FlashAir.cpp:75 -msgid "Could not connect to FlashAir" -msgstr "" - -#: src/slic3r/Utils/FlashAir.cpp:75 -msgid "" -"Note: FlashAir with firmware 2.00.02 or newer and activated upload function " -"is required." -msgstr "" - -#: src/slic3r/Utils/PresetUpdater.cpp:632 -#, possible-c-format -msgid "requires min. %s and max. %s" -msgstr "" - -#: src/slic3r/Utils/PresetUpdater.cpp:637 -#, possible-c-format -msgid "requires min. %s" -msgstr "" - -#: src/slic3r/Utils/PresetUpdater.cpp:639 -#, possible-c-format -msgid "requires max. %s" +#: src/slic3r/Utils/Duet.cpp:134 +msgid "Could not get resources to create a new connection" msgstr "" #: src/slic3r/Utils/FixModelByWin10.cpp:219 @@ -5565,7 +5954,7 @@ msgid "Mesh repair failed." msgstr "" #: src/slic3r/Utils/FixModelByWin10.cpp:251 -#: src/slic3r/Utils/FixModelByWin10.cpp:378 +#: src/slic3r/Utils/FixModelByWin10.cpp:385 msgid "Loading repaired model" msgstr "" @@ -5583,52 +5972,106 @@ msgstr "" msgid "Exporting model..." msgstr "" -#: src/slic3r/Utils/FixModelByWin10.cpp:368 +#: src/slic3r/Utils/FixModelByWin10.cpp:369 +#: src/slic3r/Utils/FixModelByWin10.cpp:374 msgid "Export of a temporary 3mf file failed" msgstr "" -#: src/slic3r/Utils/FixModelByWin10.cpp:383 +#: src/slic3r/Utils/FixModelByWin10.cpp:390 msgid "Import of the repaired 3mf file failed" msgstr "" -#: src/slic3r/Utils/FixModelByWin10.cpp:385 +#: src/slic3r/Utils/FixModelByWin10.cpp:392 msgid "Repaired 3MF file does not contain any object" msgstr "" -#: src/slic3r/Utils/FixModelByWin10.cpp:387 +#: src/slic3r/Utils/FixModelByWin10.cpp:394 msgid "Repaired 3MF file contains more than one object" msgstr "" -#: src/slic3r/Utils/FixModelByWin10.cpp:389 +#: src/slic3r/Utils/FixModelByWin10.cpp:396 msgid "Repaired 3MF file does not contain any volume" msgstr "" -#: src/slic3r/Utils/FixModelByWin10.cpp:391 +#: src/slic3r/Utils/FixModelByWin10.cpp:398 msgid "Repaired 3MF file contains more than one volume" msgstr "" -#: src/slic3r/Utils/FixModelByWin10.cpp:400 +#: src/slic3r/Utils/FixModelByWin10.cpp:407 msgid "Model repair finished" msgstr "" -#: src/slic3r/Utils/FixModelByWin10.cpp:406 +#: src/slic3r/Utils/FixModelByWin10.cpp:413 msgid "Model repair canceled" msgstr "" -#: src/slic3r/Utils/FixModelByWin10.cpp:423 +#: src/slic3r/Utils/FixModelByWin10.cpp:430 msgid "Model repaired successfully" msgstr "" -#: src/slic3r/Utils/FixModelByWin10.cpp:423 -#: src/slic3r/Utils/FixModelByWin10.cpp:426 +#: src/slic3r/Utils/FixModelByWin10.cpp:430 +#: src/slic3r/Utils/FixModelByWin10.cpp:433 msgid "Model Repair by the Netfabb service" msgstr "" -#: src/slic3r/Utils/FixModelByWin10.cpp:426 +#: src/slic3r/Utils/FixModelByWin10.cpp:433 msgid "Model repair failed:" msgstr "" -#: src/libslic3r/SLA/SLAPad.cpp:690 +#: src/slic3r/Utils/FlashAir.cpp:58 +msgid "Upload not enabled on FlashAir card." +msgstr "" + +#: src/slic3r/Utils/FlashAir.cpp:68 +msgid "Connection to FlashAir works correctly and upload is enabled." +msgstr "" + +#: src/slic3r/Utils/FlashAir.cpp:73 +msgid "Could not connect to FlashAir" +msgstr "" + +#: src/slic3r/Utils/FlashAir.cpp:73 +msgid "" +"Note: FlashAir with firmware 2.00.02 or newer and activated upload function " +"is required." +msgstr "" + +#: src/slic3r/Utils/OctoPrint.cpp:83 +msgid "Connection to OctoPrint works correctly." +msgstr "" + +#: src/slic3r/Utils/OctoPrint.cpp:89 +msgid "Could not connect to OctoPrint" +msgstr "" + +#: src/slic3r/Utils/OctoPrint.cpp:89 +msgid "Note: OctoPrint version at least 1.1.0 is required." +msgstr "" + +#: src/slic3r/Utils/OctoPrint.cpp:176 +msgid "Connection to Prusa SL1 works correctly." +msgstr "" + +#: src/slic3r/Utils/OctoPrint.cpp:181 +msgid "Could not connect to Prusa SLA" +msgstr "" + +#: src/slic3r/Utils/PresetUpdater.cpp:705 +#, possible-c-format +msgid "requires min. %s and max. %s" +msgstr "" + +#: src/slic3r/Utils/PresetUpdater.cpp:710 +#, possible-c-format +msgid "requires min. %s" +msgstr "" + +#: src/slic3r/Utils/PresetUpdater.cpp:713 +#, possible-c-format +msgid "requires max. %s" +msgstr "" + +#: src/libslic3r/SLA/Pad.cpp:691 msgid "Pad brim size is too small for the current configuration." msgstr "" @@ -5760,15 +6203,15 @@ msgstr "" msgid "Error with zip archive" msgstr "" -#: src/libslic3r/GCode.cpp:633 +#: src/libslic3r/GCode.cpp:637 msgid "Empty layers detected, the output would not be printable." msgstr "" -#: src/libslic3r/GCode.cpp:634 +#: src/libslic3r/GCode.cpp:638 msgid "Print z" msgstr "" -#: src/libslic3r/GCode.cpp:635 +#: src/libslic3r/GCode.cpp:639 msgid "" "This is usually caused by negligibly small extrusions or by a faulty model. " "Try to repair the model or change its orientation on the bed." @@ -5778,116 +6221,127 @@ msgstr "" msgid "Mixed" msgstr "" -#: src/libslic3r/Format/3mf.cpp:1519 +#: src/libslic3r/Flow.cpp:55 +msgid "" +"Cannot calculate extrusion width for %1%: Variable \"%2%\" not accessible." +msgstr "" + +#: src/libslic3r/Format/3mf.cpp:1630 msgid "" "The selected 3mf file has been saved with a newer version of %1% and is not " "compatible." msgstr "" -#: src/libslic3r/Format/AMF.cpp:917 +#: src/libslic3r/Format/AMF.cpp:934 msgid "" "The selected amf file has been saved with a newer version of %1% and is not " "compatible." msgstr "" -#: src/libslic3r/Print.cpp:1168 +#: src/libslic3r/Print.cpp:1158 msgid "All objects are outside of the print volume." msgstr "" -#: src/libslic3r/Print.cpp:1171 +#: src/libslic3r/Print.cpp:1161 msgid "The supplied settings will cause an empty print." msgstr "" -#: src/libslic3r/Print.cpp:1198 +#: src/libslic3r/Print.cpp:1188 msgid "Some objects are too close; your extruder will collide with them." msgstr "" -#: src/libslic3r/Print.cpp:1213 +#: src/libslic3r/Print.cpp:1203 msgid "" "Some objects are too tall and cannot be printed without extruder collisions." msgstr "" -#: src/libslic3r/Print.cpp:1223 +#: src/libslic3r/Print.cpp:1213 msgid "The Spiral Vase option can only be used when printing a single object." msgstr "" -#: src/libslic3r/Print.cpp:1230 +#: src/libslic3r/Print.cpp:1220 msgid "" "The Spiral Vase option can only be used when printing single material " "objects." msgstr "" -#: src/libslic3r/Print.cpp:1243 +#: src/libslic3r/Print.cpp:1233 msgid "" "The wipe tower is only supported if all extruders have the same nozzle " "diameter and use filaments of the same diameter." msgstr "" -#: src/libslic3r/Print.cpp:1248 +#: src/libslic3r/Print.cpp:1238 msgid "" "The Wipe Tower is currently only supported for the Marlin, RepRap/Sprinter " "and Repetier G-code flavors." msgstr "" -#: src/libslic3r/Print.cpp:1250 +#: src/libslic3r/Print.cpp:1240 msgid "" "The Wipe Tower is currently only supported with the relative extruder " "addressing (use_relative_e_distances=1)." msgstr "" -#: src/libslic3r/Print.cpp:1252 +#: src/libslic3r/Print.cpp:1242 msgid "Ooze prevention is currently not supported with the wipe tower enabled." msgstr "" -#: src/libslic3r/Print.cpp:1254 +#: src/libslic3r/Print.cpp:1244 msgid "" "The Wipe Tower currently does not support volumetric E (use_volumetric_e=0)." msgstr "" -#: src/libslic3r/Print.cpp:1275 +#: src/libslic3r/Print.cpp:1246 +msgid "" +"The Wipe Tower is currently not supported for multimaterial sequential " +"prints." +msgstr "" + +#: src/libslic3r/Print.cpp:1267 msgid "" "The Wipe Tower is only supported for multiple objects if they have equal " "layer heights" msgstr "" -#: src/libslic3r/Print.cpp:1277 +#: src/libslic3r/Print.cpp:1269 msgid "" "The Wipe Tower is only supported for multiple objects if they are printed " "over an equal number of raft layers" msgstr "" -#: src/libslic3r/Print.cpp:1279 +#: src/libslic3r/Print.cpp:1271 msgid "" "The Wipe Tower is only supported for multiple objects if they are printed " "with the same support_material_contact_distance" msgstr "" -#: src/libslic3r/Print.cpp:1281 +#: src/libslic3r/Print.cpp:1273 msgid "" "The Wipe Tower is only supported for multiple objects if they are sliced " "equally." msgstr "" -#: src/libslic3r/Print.cpp:1323 +#: src/libslic3r/Print.cpp:1315 msgid "" "The Wipe tower is only supported if all objects have the same variable layer " "height" msgstr "" -#: src/libslic3r/Print.cpp:1349 +#: src/libslic3r/Print.cpp:1341 msgid "" "One or more object were assigned an extruder that the printer does not have." msgstr "" -#: src/libslic3r/Print.cpp:1358 +#: src/libslic3r/Print.cpp:1350 msgid "%1%=%2% mm is too low to be printable at a layer height %3% mm" msgstr "" -#: src/libslic3r/Print.cpp:1361 +#: src/libslic3r/Print.cpp:1353 msgid "Excessive %1%=%2% mm to be printable with a nozzle diameter %3% mm" msgstr "" -#: src/libslic3r/Print.cpp:1372 +#: src/libslic3r/Print.cpp:1364 msgid "" "Printing with multiple extruders of differing nozzle diameters. If support " "is to be printed with the current extruder (support_material_extruder == 0 " @@ -5895,13 +6349,13 @@ msgid "" "same diameter." msgstr "" -#: src/libslic3r/Print.cpp:1380 +#: src/libslic3r/Print.cpp:1372 msgid "" "For the Wipe Tower to work with the soluble supports, the support layers " "need to be synchronized with the object layers." msgstr "" -#: src/libslic3r/Print.cpp:1384 +#: src/libslic3r/Print.cpp:1376 msgid "" "The Wipe Tower currently supports the non-soluble supports only if they are " "printed with the current extruder without triggering a tool change. (both " @@ -5909,105 +6363,125 @@ msgid "" "set to 0)." msgstr "" -#: src/libslic3r/Print.cpp:1406 +#: src/libslic3r/Print.cpp:1398 msgid "First layer height can't be greater than nozzle diameter" msgstr "" -#: src/libslic3r/Print.cpp:1411 +#: src/libslic3r/Print.cpp:1403 msgid "Layer height can't be greater than nozzle diameter" msgstr "" -#: src/libslic3r/Print.cpp:1566 +#: src/libslic3r/Print.cpp:1557 msgid "Infilling layers" msgstr "" -#: src/libslic3r/Print.cpp:1582 +#: src/libslic3r/Print.cpp:1577 msgid "Generating skirt" msgstr "" -#: src/libslic3r/Print.cpp:1590 +#: src/libslic3r/Print.cpp:1585 msgid "Generating brim" msgstr "" -#: src/libslic3r/Print.cpp:1614 +#: src/libslic3r/Print.cpp:1609 msgid "Exporting G-code" msgstr "" -#: src/libslic3r/Print.cpp:1618 +#: src/libslic3r/Print.cpp:1613 msgid "Generating G-code" msgstr "" -#: src/libslic3r/SLAPrint.cpp:66 -msgid "Slicing model" -msgstr "" - -#: src/libslic3r/SLAPrint.cpp:67 src/libslic3r/SLAPrint.cpp:905 -msgid "Generating support points" -msgstr "" - -#: src/libslic3r/SLAPrint.cpp:68 -msgid "Generating support tree" -msgstr "" - -#: src/libslic3r/SLAPrint.cpp:69 -msgid "Generating pad" -msgstr "" - -#: src/libslic3r/SLAPrint.cpp:70 -msgid "Slicing supports" -msgstr "" - -#: src/libslic3r/SLAPrint.cpp:87 -msgid "Merging slices and calculating statistics" -msgstr "" - -#: src/libslic3r/SLAPrint.cpp:88 -msgid "Rasterizing layers" -msgstr "" - -#: src/libslic3r/SLAPrint.cpp:670 +#: src/libslic3r/SLAPrint.cpp:613 msgid "" "Cannot proceed without support points! Add support points or disable support " "generation." msgstr "" -#: src/libslic3r/SLAPrint.cpp:682 +#: src/libslic3r/SLAPrint.cpp:625 msgid "" "Elevation is too low for object. Use the \"Pad around object\" feature to " "print the object without elevation." msgstr "" -#: src/libslic3r/SLAPrint.cpp:688 +#: src/libslic3r/SLAPrint.cpp:631 msgid "" "The endings of the support pillars will be deployed on the gap between the " "object and the pad. 'Support base safety distance' has to be greater than " "the 'Pad object gap' parameter to avoid this." msgstr "" -#: src/libslic3r/SLAPrint.cpp:703 +#: src/libslic3r/SLAPrint.cpp:646 msgid "Exposition time is out of printer profile bounds." msgstr "" -#: src/libslic3r/SLAPrint.cpp:710 +#: src/libslic3r/SLAPrint.cpp:653 msgid "Initial exposition time is out of printer profile bounds." msgstr "" -#: src/libslic3r/SLAPrint.cpp:794 +#: src/libslic3r/SLAPrint.cpp:760 +msgid "Slicing done" +msgstr "" + +#: src/libslic3r/SLAPrintSteps.cpp:41 +msgid "Hollowing model" +msgstr "" + +#: src/libslic3r/SLAPrintSteps.cpp:42 +msgid "Drilling holes into model." +msgstr "" + +#: src/libslic3r/SLAPrintSteps.cpp:43 +msgid "Slicing model" +msgstr "" + +#: src/libslic3r/SLAPrintSteps.cpp:44 src/libslic3r/SLAPrintSteps.cpp:308 +msgid "Generating support points" +msgstr "" + +#: src/libslic3r/SLAPrintSteps.cpp:45 +msgid "Generating support tree" +msgstr "" + +#: src/libslic3r/SLAPrintSteps.cpp:46 +msgid "Generating pad" +msgstr "" + +#: src/libslic3r/SLAPrintSteps.cpp:47 +msgid "Slicing supports" +msgstr "" + +#: src/libslic3r/SLAPrintSteps.cpp:62 +msgid "Merging slices and calculating statistics" +msgstr "" + +#: src/libslic3r/SLAPrintSteps.cpp:63 +msgid "Rasterizing layers" +msgstr "" + +#: src/libslic3r/SLAPrintSteps.cpp:154 +msgid "" +"Drilling holes into the mesh failed. This is usually caused by broken model. " +"Try to fix it first." +msgstr "" + +#: src/libslic3r/SLAPrintSteps.cpp:202 msgid "" "Slicing had to be stopped due to an internal error: Inconsistent slice index." msgstr "" -#: src/libslic3r/SLAPrint.cpp:964 src/libslic3r/SLAPrint.cpp:973 -#: src/libslic3r/SLAPrint.cpp:1018 +#: src/libslic3r/SLAPrintSteps.cpp:365 src/libslic3r/SLAPrintSteps.cpp:374 +#: src/libslic3r/SLAPrintSteps.cpp:413 msgid "Visualizing supports" msgstr "" -#: src/libslic3r/SLAPrint.cpp:1009 +#: src/libslic3r/SLAPrintSteps.cpp:405 msgid "No pad can be generated for this model with the current configuration" msgstr "" -#: src/libslic3r/SLAPrint.cpp:1554 -msgid "Slicing done" +#: src/libslic3r/SLAPrintSteps.cpp:579 +msgid "" +"There are unprintable objects. Try to adjust support settings to make the " +"objects printable." msgstr "" #: src/libslic3r/PrintBase.cpp:71 @@ -6103,7 +6577,7 @@ msgid "" "feature slows down both the print and the G-code generation." msgstr "" -#: src/libslic3r/PrintConfig.cpp:134 src/libslic3r/PrintConfig.cpp:2053 +#: src/libslic3r/PrintConfig.cpp:134 src/libslic3r/PrintConfig.cpp:2074 msgid "Other layers" msgstr "" @@ -6146,62 +6620,72 @@ msgstr "" msgid "Bottom solid layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:172 +#: src/libslic3r/PrintConfig.cpp:175 +msgid "" +"The number of bottom solid layers is increased above bottom_solid_layers if " +"necessary to satisfy minimum thickness of bottom shell." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:177 +msgid "Minimum bottom shell thickness" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:183 msgid "Bridge" msgstr "" -#: src/libslic3r/PrintConfig.cpp:173 +#: src/libslic3r/PrintConfig.cpp:184 msgid "" "This is the acceleration your printer will use for bridges. Set zero to " "disable acceleration control for bridges." msgstr "" -#: src/libslic3r/PrintConfig.cpp:175 src/libslic3r/PrintConfig.cpp:318 -#: src/libslic3r/PrintConfig.cpp:851 src/libslic3r/PrintConfig.cpp:973 -#: src/libslic3r/PrintConfig.cpp:1143 src/libslic3r/PrintConfig.cpp:1196 -#: src/libslic3r/PrintConfig.cpp:1207 src/libslic3r/PrintConfig.cpp:1398 +#: src/libslic3r/PrintConfig.cpp:186 src/libslic3r/PrintConfig.cpp:329 +#: src/libslic3r/PrintConfig.cpp:863 src/libslic3r/PrintConfig.cpp:985 +#: src/libslic3r/PrintConfig.cpp:1155 src/libslic3r/PrintConfig.cpp:1208 +#: src/libslic3r/PrintConfig.cpp:1219 src/libslic3r/PrintConfig.cpp:1412 msgid "mm/s²" msgstr "" -#: src/libslic3r/PrintConfig.cpp:181 +#: src/libslic3r/PrintConfig.cpp:192 msgid "Bridging angle" msgstr "" -#: src/libslic3r/PrintConfig.cpp:183 +#: src/libslic3r/PrintConfig.cpp:194 msgid "" "Bridging angle override. If left to zero, the bridging angle will be " "calculated automatically. Otherwise the provided angle will be used for all " "bridges. Use 180° for zero angle." msgstr "" -#: src/libslic3r/PrintConfig.cpp:186 src/libslic3r/PrintConfig.cpp:769 -#: src/libslic3r/PrintConfig.cpp:1635 src/libslic3r/PrintConfig.cpp:1645 -#: src/libslic3r/PrintConfig.cpp:1883 src/libslic3r/PrintConfig.cpp:2038 -#: src/libslic3r/PrintConfig.cpp:2224 src/libslic3r/PrintConfig.cpp:2695 -#: src/libslic3r/PrintConfig.cpp:2816 +#: src/libslic3r/PrintConfig.cpp:197 src/libslic3r/PrintConfig.cpp:781 +#: src/libslic3r/PrintConfig.cpp:1649 src/libslic3r/PrintConfig.cpp:1659 +#: src/libslic3r/PrintConfig.cpp:1904 src/libslic3r/PrintConfig.cpp:2059 +#: src/libslic3r/PrintConfig.cpp:2257 src/libslic3r/PrintConfig.cpp:2728 +#: src/libslic3r/PrintConfig.cpp:2849 msgid "°" msgstr "" -#: src/libslic3r/PrintConfig.cpp:192 +#: src/libslic3r/PrintConfig.cpp:203 msgid "Bridges fan speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:193 +#: src/libslic3r/PrintConfig.cpp:204 msgid "This fan speed is enforced during all bridges and overhangs." msgstr "" -#: src/libslic3r/PrintConfig.cpp:194 src/libslic3r/PrintConfig.cpp:781 -#: src/libslic3r/PrintConfig.cpp:1216 src/libslic3r/PrintConfig.cpp:1279 -#: src/libslic3r/PrintConfig.cpp:1527 src/libslic3r/PrintConfig.cpp:2402 -#: src/libslic3r/PrintConfig.cpp:2735 +#: src/libslic3r/PrintConfig.cpp:205 src/libslic3r/PrintConfig.cpp:793 +#: src/libslic3r/PrintConfig.cpp:1228 src/libslic3r/PrintConfig.cpp:1291 +#: src/libslic3r/PrintConfig.cpp:1541 src/libslic3r/PrintConfig.cpp:2435 +#: src/libslic3r/PrintConfig.cpp:2768 msgid "%" msgstr "" -#: src/libslic3r/PrintConfig.cpp:201 +#: src/libslic3r/PrintConfig.cpp:212 msgid "Bridge flow ratio" msgstr "" -#: src/libslic3r/PrintConfig.cpp:203 +#: src/libslic3r/PrintConfig.cpp:214 msgid "" "This factor affects the amount of plastic for bridging. You can decrease it " "slightly to pull the extrudates and prevent sagging, although default " @@ -6209,83 +6693,83 @@ msgid "" "before tweaking this." msgstr "" -#: src/libslic3r/PrintConfig.cpp:213 +#: src/libslic3r/PrintConfig.cpp:224 msgid "Bridges" msgstr "" -#: src/libslic3r/PrintConfig.cpp:215 +#: src/libslic3r/PrintConfig.cpp:226 msgid "Speed for printing bridges." msgstr "" -#: src/libslic3r/PrintConfig.cpp:216 src/libslic3r/PrintConfig.cpp:599 -#: src/libslic3r/PrintConfig.cpp:607 src/libslic3r/PrintConfig.cpp:616 -#: src/libslic3r/PrintConfig.cpp:624 src/libslic3r/PrintConfig.cpp:651 -#: src/libslic3r/PrintConfig.cpp:670 src/libslic3r/PrintConfig.cpp:911 -#: src/libslic3r/PrintConfig.cpp:1039 src/libslic3r/PrintConfig.cpp:1125 -#: src/libslic3r/PrintConfig.cpp:1161 src/libslic3r/PrintConfig.cpp:1174 -#: src/libslic3r/PrintConfig.cpp:1185 src/libslic3r/PrintConfig.cpp:1238 -#: src/libslic3r/PrintConfig.cpp:1297 src/libslic3r/PrintConfig.cpp:1428 -#: src/libslic3r/PrintConfig.cpp:1602 src/libslic3r/PrintConfig.cpp:1611 -#: src/libslic3r/PrintConfig.cpp:2017 src/libslic3r/PrintConfig.cpp:2131 +#: src/libslic3r/PrintConfig.cpp:227 src/libslic3r/PrintConfig.cpp:610 +#: src/libslic3r/PrintConfig.cpp:618 src/libslic3r/PrintConfig.cpp:627 +#: src/libslic3r/PrintConfig.cpp:635 src/libslic3r/PrintConfig.cpp:662 +#: src/libslic3r/PrintConfig.cpp:681 src/libslic3r/PrintConfig.cpp:923 +#: src/libslic3r/PrintConfig.cpp:1051 src/libslic3r/PrintConfig.cpp:1137 +#: src/libslic3r/PrintConfig.cpp:1173 src/libslic3r/PrintConfig.cpp:1186 +#: src/libslic3r/PrintConfig.cpp:1197 src/libslic3r/PrintConfig.cpp:1250 +#: src/libslic3r/PrintConfig.cpp:1309 src/libslic3r/PrintConfig.cpp:1442 +#: src/libslic3r/PrintConfig.cpp:1616 src/libslic3r/PrintConfig.cpp:1625 +#: src/libslic3r/PrintConfig.cpp:2038 src/libslic3r/PrintConfig.cpp:2164 msgid "mm/s" msgstr "" -#: src/libslic3r/PrintConfig.cpp:223 +#: src/libslic3r/PrintConfig.cpp:234 msgid "Brim width" msgstr "" -#: src/libslic3r/PrintConfig.cpp:224 +#: src/libslic3r/PrintConfig.cpp:235 msgid "" "Horizontal width of the brim that will be printed around each object on the " "first layer." msgstr "" -#: src/libslic3r/PrintConfig.cpp:231 +#: src/libslic3r/PrintConfig.cpp:242 msgid "Clip multi-part objects" msgstr "" -#: src/libslic3r/PrintConfig.cpp:232 +#: src/libslic3r/PrintConfig.cpp:243 msgid "" "When printing multi-material objects, this settings will make Slic3r to clip " "the overlapping object parts one by the other (2nd part will be clipped by " "the 1st, 3rd part will be clipped by the 1st and 2nd etc)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:239 +#: src/libslic3r/PrintConfig.cpp:250 msgid "Colorprint height" msgstr "" -#: src/libslic3r/PrintConfig.cpp:240 +#: src/libslic3r/PrintConfig.cpp:251 msgid "Heights at which a filament change is to occur." msgstr "" -#: src/libslic3r/PrintConfig.cpp:250 +#: src/libslic3r/PrintConfig.cpp:261 msgid "Compatible printers condition" msgstr "" -#: src/libslic3r/PrintConfig.cpp:251 +#: src/libslic3r/PrintConfig.cpp:262 msgid "" "A boolean expression using the configuration values of an active printer " "profile. If this expression evaluates to true, this profile is considered " "compatible with the active printer profile." msgstr "" -#: src/libslic3r/PrintConfig.cpp:265 +#: src/libslic3r/PrintConfig.cpp:276 msgid "Compatible print profiles condition" msgstr "" -#: src/libslic3r/PrintConfig.cpp:266 +#: src/libslic3r/PrintConfig.cpp:277 msgid "" "A boolean expression using the configuration values of an active print " "profile. If this expression evaluates to true, this profile is considered " "compatible with the active print profile." msgstr "" -#: src/libslic3r/PrintConfig.cpp:283 +#: src/libslic3r/PrintConfig.cpp:294 msgid "Complete individual objects" msgstr "" -#: src/libslic3r/PrintConfig.cpp:284 +#: src/libslic3r/PrintConfig.cpp:295 msgid "" "When printing multiple objects or copies, this feature will complete each " "object before moving onto next one (and starting it from its bottom layer). " @@ -6293,107 +6777,107 @@ msgid "" "warn and prevent you from extruder collisions, but beware." msgstr "" -#: src/libslic3r/PrintConfig.cpp:292 +#: src/libslic3r/PrintConfig.cpp:303 msgid "Enable auto cooling" msgstr "" -#: src/libslic3r/PrintConfig.cpp:293 +#: src/libslic3r/PrintConfig.cpp:304 msgid "" "This flag enables the automatic cooling logic that adjusts print speed and " "fan speed according to layer printing time." msgstr "" -#: src/libslic3r/PrintConfig.cpp:298 +#: src/libslic3r/PrintConfig.cpp:309 msgid "Cooling tube position" msgstr "" -#: src/libslic3r/PrintConfig.cpp:299 +#: src/libslic3r/PrintConfig.cpp:310 msgid "Distance of the center-point of the cooling tube from the extruder tip." msgstr "" -#: src/libslic3r/PrintConfig.cpp:306 +#: src/libslic3r/PrintConfig.cpp:317 msgid "Cooling tube length" msgstr "" -#: src/libslic3r/PrintConfig.cpp:307 +#: src/libslic3r/PrintConfig.cpp:318 msgid "Length of the cooling tube to limit space for cooling moves inside it." msgstr "" -#: src/libslic3r/PrintConfig.cpp:315 +#: src/libslic3r/PrintConfig.cpp:326 msgid "" "This is the acceleration your printer will be reset to after the role-" "specific acceleration values are used (perimeter/infill). Set zero to " "prevent resetting acceleration at all." msgstr "" -#: src/libslic3r/PrintConfig.cpp:324 +#: src/libslic3r/PrintConfig.cpp:335 msgid "Default filament profile" msgstr "" -#: src/libslic3r/PrintConfig.cpp:325 +#: src/libslic3r/PrintConfig.cpp:336 msgid "" "Default filament profile associated with the current printer profile. On " "selection of the current printer profile, this filament profile will be " "activated." msgstr "" -#: src/libslic3r/PrintConfig.cpp:331 +#: src/libslic3r/PrintConfig.cpp:342 msgid "Default print profile" msgstr "" -#: src/libslic3r/PrintConfig.cpp:332 src/libslic3r/PrintConfig.cpp:2560 -#: src/libslic3r/PrintConfig.cpp:2571 +#: src/libslic3r/PrintConfig.cpp:343 src/libslic3r/PrintConfig.cpp:2593 +#: src/libslic3r/PrintConfig.cpp:2604 msgid "" "Default print profile associated with the current printer profile. On " "selection of the current printer profile, this print profile will be " "activated." msgstr "" -#: src/libslic3r/PrintConfig.cpp:338 +#: src/libslic3r/PrintConfig.cpp:349 msgid "Disable fan for the first" msgstr "" -#: src/libslic3r/PrintConfig.cpp:339 +#: src/libslic3r/PrintConfig.cpp:350 msgid "" "You can set this to a positive value to disable fan at all during the first " "layers, so that it does not make adhesion worse." msgstr "" -#: src/libslic3r/PrintConfig.cpp:348 +#: src/libslic3r/PrintConfig.cpp:359 msgid "Don't support bridges" msgstr "" -#: src/libslic3r/PrintConfig.cpp:350 +#: src/libslic3r/PrintConfig.cpp:361 msgid "" "Experimental option for preventing support material from being generated " "under bridged areas." msgstr "" -#: src/libslic3r/PrintConfig.cpp:356 +#: src/libslic3r/PrintConfig.cpp:367 msgid "Distance between copies" msgstr "" -#: src/libslic3r/PrintConfig.cpp:357 +#: src/libslic3r/PrintConfig.cpp:368 msgid "Distance used for the auto-arrange feature of the plater." msgstr "" -#: src/libslic3r/PrintConfig.cpp:364 +#: src/libslic3r/PrintConfig.cpp:375 msgid "Elephant foot compensation" msgstr "" -#: src/libslic3r/PrintConfig.cpp:366 +#: src/libslic3r/PrintConfig.cpp:377 msgid "" "The first layer will be shrunk in the XY plane by the configured value to " "compensate for the 1st layer squish aka an Elephant Foot effect." msgstr "" -#: src/libslic3r/PrintConfig.cpp:375 +#: src/libslic3r/PrintConfig.cpp:386 msgid "" "This end procedure is inserted at the end of the output file. Note that you " "can use placeholder variables for all PrusaSlicer settings." msgstr "" -#: src/libslic3r/PrintConfig.cpp:385 +#: src/libslic3r/PrintConfig.cpp:396 msgid "" "This end procedure is inserted at the end of the output file, before the " "printer end gcode (and before any toolchange from this filament in case of " @@ -6402,62 +6886,62 @@ msgid "" "in extruder order." msgstr "" -#: src/libslic3r/PrintConfig.cpp:396 +#: src/libslic3r/PrintConfig.cpp:407 msgid "Ensure vertical shell thickness" msgstr "" -#: src/libslic3r/PrintConfig.cpp:398 +#: src/libslic3r/PrintConfig.cpp:409 msgid "" "Add solid infill near sloping surfaces to guarantee the vertical shell " "thickness (top+bottom solid layers)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:404 +#: src/libslic3r/PrintConfig.cpp:415 msgid "Top fill pattern" msgstr "" -#: src/libslic3r/PrintConfig.cpp:406 +#: src/libslic3r/PrintConfig.cpp:417 msgid "" "Fill pattern for top infill. This only affects the top visible layer, and " "not its adjacent solid shells." msgstr "" -#: src/libslic3r/PrintConfig.cpp:414 src/libslic3r/PrintConfig.cpp:832 -#: src/libslic3r/PrintConfig.cpp:1998 +#: src/libslic3r/PrintConfig.cpp:425 src/libslic3r/PrintConfig.cpp:844 +#: src/libslic3r/PrintConfig.cpp:2019 msgid "Rectilinear" msgstr "" -#: src/libslic3r/PrintConfig.cpp:415 src/libslic3r/PrintConfig.cpp:838 +#: src/libslic3r/PrintConfig.cpp:426 src/libslic3r/PrintConfig.cpp:850 msgid "Concentric" msgstr "" -#: src/libslic3r/PrintConfig.cpp:416 src/libslic3r/PrintConfig.cpp:842 +#: src/libslic3r/PrintConfig.cpp:427 src/libslic3r/PrintConfig.cpp:854 msgid "Hilbert Curve" msgstr "" -#: src/libslic3r/PrintConfig.cpp:417 src/libslic3r/PrintConfig.cpp:843 +#: src/libslic3r/PrintConfig.cpp:428 src/libslic3r/PrintConfig.cpp:855 msgid "Archimedean Chords" msgstr "" -#: src/libslic3r/PrintConfig.cpp:418 src/libslic3r/PrintConfig.cpp:844 +#: src/libslic3r/PrintConfig.cpp:429 src/libslic3r/PrintConfig.cpp:856 msgid "Octagram Spiral" msgstr "" -#: src/libslic3r/PrintConfig.cpp:424 +#: src/libslic3r/PrintConfig.cpp:435 msgid "Bottom fill pattern" msgstr "" -#: src/libslic3r/PrintConfig.cpp:426 +#: src/libslic3r/PrintConfig.cpp:437 msgid "" "Fill pattern for bottom infill. This only affects the bottom external " "visible layer, and not its adjacent solid shells." msgstr "" -#: src/libslic3r/PrintConfig.cpp:435 src/libslic3r/PrintConfig.cpp:446 +#: src/libslic3r/PrintConfig.cpp:446 src/libslic3r/PrintConfig.cpp:457 msgid "External perimeters" msgstr "" -#: src/libslic3r/PrintConfig.cpp:437 +#: src/libslic3r/PrintConfig.cpp:448 msgid "" "Set this to a non-zero value to set a manual extrusion width for external " "perimeters. If left zero, default extrusion width will be used if set, " @@ -6465,43 +6949,43 @@ msgid "" "(for example 200%), it will be computed over layer height." msgstr "" -#: src/libslic3r/PrintConfig.cpp:440 src/libslic3r/PrintConfig.cpp:549 -#: src/libslic3r/PrintConfig.cpp:871 src/libslic3r/PrintConfig.cpp:884 -#: src/libslic3r/PrintConfig.cpp:1004 src/libslic3r/PrintConfig.cpp:1030 -#: src/libslic3r/PrintConfig.cpp:1418 src/libslic3r/PrintConfig.cpp:1757 -#: src/libslic3r/PrintConfig.cpp:1872 src/libslic3r/PrintConfig.cpp:1940 -#: src/libslic3r/PrintConfig.cpp:2100 +#: src/libslic3r/PrintConfig.cpp:451 src/libslic3r/PrintConfig.cpp:560 +#: src/libslic3r/PrintConfig.cpp:883 src/libslic3r/PrintConfig.cpp:896 +#: src/libslic3r/PrintConfig.cpp:1016 src/libslic3r/PrintConfig.cpp:1042 +#: src/libslic3r/PrintConfig.cpp:1432 src/libslic3r/PrintConfig.cpp:1771 +#: src/libslic3r/PrintConfig.cpp:1893 src/libslic3r/PrintConfig.cpp:1961 +#: src/libslic3r/PrintConfig.cpp:2121 msgid "mm or %" msgstr "" -#: src/libslic3r/PrintConfig.cpp:448 +#: src/libslic3r/PrintConfig.cpp:459 msgid "" "This separate setting will affect the speed of external perimeters (the " "visible ones). If expressed as percentage (for example: 80%) it will be " "calculated on the perimeters speed setting above. Set to zero for auto." msgstr "" -#: src/libslic3r/PrintConfig.cpp:451 src/libslic3r/PrintConfig.cpp:893 -#: src/libslic3r/PrintConfig.cpp:1716 src/libslic3r/PrintConfig.cpp:1768 -#: src/libslic3r/PrintConfig.cpp:1984 src/libslic3r/PrintConfig.cpp:2113 +#: src/libslic3r/PrintConfig.cpp:462 src/libslic3r/PrintConfig.cpp:905 +#: src/libslic3r/PrintConfig.cpp:1730 src/libslic3r/PrintConfig.cpp:1782 +#: src/libslic3r/PrintConfig.cpp:2005 src/libslic3r/PrintConfig.cpp:2134 msgid "mm/s or %" msgstr "" -#: src/libslic3r/PrintConfig.cpp:458 +#: src/libslic3r/PrintConfig.cpp:469 msgid "External perimeters first" msgstr "" -#: src/libslic3r/PrintConfig.cpp:460 +#: src/libslic3r/PrintConfig.cpp:471 msgid "" "Print contour perimeters from the outermost one to the innermost one instead " "of the default inverse order." msgstr "" -#: src/libslic3r/PrintConfig.cpp:466 +#: src/libslic3r/PrintConfig.cpp:477 msgid "Extra perimeters if needed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:468 +#: src/libslic3r/PrintConfig.cpp:479 #, no-c-format msgid "" "Add more perimeters when needed for avoiding gaps in sloping walls. Slic3r " @@ -6509,14 +6993,14 @@ msgid "" "is supported." msgstr "" -#: src/libslic3r/PrintConfig.cpp:478 +#: src/libslic3r/PrintConfig.cpp:489 msgid "" "The extruder to use (unless more specific extruder settings are specified). " "This value overrides perimeter and infill extruders, but not the support " "extruders." msgstr "" -#: src/libslic3r/PrintConfig.cpp:490 +#: src/libslic3r/PrintConfig.cpp:501 msgid "" "Set this to the vertical distance between your nozzle tip and (usually) the " "X carriage rods. In other words, this is the height of the clearance " @@ -6524,26 +7008,26 @@ msgid "" "extruder can peek before colliding with other printed objects." msgstr "" -#: src/libslic3r/PrintConfig.cpp:501 +#: src/libslic3r/PrintConfig.cpp:512 msgid "" "Set this to the clearance radius around your extruder. If the extruder is " "not centered, choose the largest value for safety. This setting is used to " "check for collisions and to display the graphical preview in the plater." msgstr "" -#: src/libslic3r/PrintConfig.cpp:511 +#: src/libslic3r/PrintConfig.cpp:522 msgid "Extruder Color" msgstr "" -#: src/libslic3r/PrintConfig.cpp:512 src/libslic3r/PrintConfig.cpp:573 +#: src/libslic3r/PrintConfig.cpp:523 src/libslic3r/PrintConfig.cpp:584 msgid "This is only used in the Slic3r interface as a visual help." msgstr "" -#: src/libslic3r/PrintConfig.cpp:518 +#: src/libslic3r/PrintConfig.cpp:529 msgid "Extruder offset" msgstr "" -#: src/libslic3r/PrintConfig.cpp:519 +#: src/libslic3r/PrintConfig.cpp:530 msgid "" "If your firmware doesn't handle the extruder displacement you need the G-" "code to take it into account. This option lets you specify the displacement " @@ -6551,21 +7035,21 @@ msgid "" "coordinates (they will be subtracted from the XY coordinate)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:528 +#: src/libslic3r/PrintConfig.cpp:539 msgid "Extrusion axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:529 +#: src/libslic3r/PrintConfig.cpp:540 msgid "" "Use this option to set the axis letter associated to your printer's extruder " "(usually E but some printers use A)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:534 +#: src/libslic3r/PrintConfig.cpp:545 msgid "Extrusion multiplier" msgstr "" -#: src/libslic3r/PrintConfig.cpp:535 +#: src/libslic3r/PrintConfig.cpp:546 msgid "" "This factor changes the amount of flow proportionally. You may need to tweak " "this setting to get nice surface finish and correct single wall widths. " @@ -6573,11 +7057,11 @@ msgid "" "more, check filament diameter and your firmware E steps." msgstr "" -#: src/libslic3r/PrintConfig.cpp:543 +#: src/libslic3r/PrintConfig.cpp:554 msgid "Default extrusion width" msgstr "" -#: src/libslic3r/PrintConfig.cpp:545 +#: src/libslic3r/PrintConfig.cpp:556 msgid "" "Set this to a non-zero value to allow a manual extrusion width. If left to " "zero, Slic3r derives extrusion widths from the nozzle diameter (see the " @@ -6586,119 +7070,119 @@ msgid "" "height." msgstr "" -#: src/libslic3r/PrintConfig.cpp:555 +#: src/libslic3r/PrintConfig.cpp:566 msgid "Keep fan always on" msgstr "" -#: src/libslic3r/PrintConfig.cpp:556 +#: src/libslic3r/PrintConfig.cpp:567 msgid "" "If this is enabled, fan will never be disabled and will be kept running at " "least at its minimum speed. Useful for PLA, harmful for ABS." msgstr "" -#: src/libslic3r/PrintConfig.cpp:561 +#: src/libslic3r/PrintConfig.cpp:572 msgid "Enable fan if layer print time is below" msgstr "" -#: src/libslic3r/PrintConfig.cpp:562 +#: src/libslic3r/PrintConfig.cpp:573 msgid "" "If layer print time is estimated below this number of seconds, fan will be " "enabled and its speed will be calculated by interpolating the minimum and " "maximum speeds." msgstr "" -#: src/libslic3r/PrintConfig.cpp:564 src/libslic3r/PrintConfig.cpp:1703 +#: src/libslic3r/PrintConfig.cpp:575 src/libslic3r/PrintConfig.cpp:1717 msgid "approximate seconds" msgstr "" -#: src/libslic3r/PrintConfig.cpp:578 +#: src/libslic3r/PrintConfig.cpp:589 msgid "Filament notes" msgstr "" -#: src/libslic3r/PrintConfig.cpp:579 +#: src/libslic3r/PrintConfig.cpp:590 msgid "You can put your notes regarding the filament here." msgstr "" -#: src/libslic3r/PrintConfig.cpp:587 src/libslic3r/PrintConfig.cpp:1244 +#: src/libslic3r/PrintConfig.cpp:598 src/libslic3r/PrintConfig.cpp:1256 msgid "Max volumetric speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:588 +#: src/libslic3r/PrintConfig.cpp:599 msgid "" "Maximum volumetric speed allowed for this filament. Limits the maximum " "volumetric speed of a print to the minimum of print and filament volumetric " "speed. Set to zero for no limit." msgstr "" -#: src/libslic3r/PrintConfig.cpp:597 +#: src/libslic3r/PrintConfig.cpp:608 msgid "Loading speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:598 +#: src/libslic3r/PrintConfig.cpp:609 msgid "Speed used for loading the filament on the wipe tower." msgstr "" -#: src/libslic3r/PrintConfig.cpp:605 +#: src/libslic3r/PrintConfig.cpp:616 msgid "Loading speed at the start" msgstr "" -#: src/libslic3r/PrintConfig.cpp:606 +#: src/libslic3r/PrintConfig.cpp:617 msgid "Speed used at the very beginning of loading phase." msgstr "" -#: src/libslic3r/PrintConfig.cpp:613 +#: src/libslic3r/PrintConfig.cpp:624 msgid "Unloading speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:614 +#: src/libslic3r/PrintConfig.cpp:625 msgid "" "Speed used for unloading the filament on the wipe tower (does not affect " "initial part of unloading just after ramming)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:622 +#: src/libslic3r/PrintConfig.cpp:633 msgid "Unloading speed at the start" msgstr "" -#: src/libslic3r/PrintConfig.cpp:623 +#: src/libslic3r/PrintConfig.cpp:634 msgid "" "Speed used for unloading the tip of the filament immediately after ramming." msgstr "" -#: src/libslic3r/PrintConfig.cpp:630 +#: src/libslic3r/PrintConfig.cpp:641 msgid "Delay after unloading" msgstr "" -#: src/libslic3r/PrintConfig.cpp:631 +#: src/libslic3r/PrintConfig.cpp:642 msgid "" "Time to wait after the filament is unloaded. May help to get reliable " "toolchanges with flexible materials that may need more time to shrink to " "original dimensions." msgstr "" -#: src/libslic3r/PrintConfig.cpp:640 +#: src/libslic3r/PrintConfig.cpp:651 msgid "Number of cooling moves" msgstr "" -#: src/libslic3r/PrintConfig.cpp:641 +#: src/libslic3r/PrintConfig.cpp:652 msgid "" "Filament is cooled by being moved back and forth in the cooling tubes. " "Specify desired number of these moves." msgstr "" -#: src/libslic3r/PrintConfig.cpp:649 +#: src/libslic3r/PrintConfig.cpp:660 msgid "Speed of the first cooling move" msgstr "" -#: src/libslic3r/PrintConfig.cpp:650 +#: src/libslic3r/PrintConfig.cpp:661 msgid "Cooling moves are gradually accelerating beginning at this speed." msgstr "" -#: src/libslic3r/PrintConfig.cpp:657 +#: src/libslic3r/PrintConfig.cpp:668 msgid "Minimal purge on wipe tower" msgstr "" -#: src/libslic3r/PrintConfig.cpp:658 +#: src/libslic3r/PrintConfig.cpp:669 msgid "" "After a tool change, the exact position of the newly loaded filament inside " "the nozzle may not be known, and the filament pressure is likely not yet " @@ -6707,63 +7191,63 @@ msgid "" "to produce successive infill or sacrificial object extrusions reliably." msgstr "" -#: src/libslic3r/PrintConfig.cpp:662 +#: src/libslic3r/PrintConfig.cpp:673 msgid "mm³" msgstr "" -#: src/libslic3r/PrintConfig.cpp:668 +#: src/libslic3r/PrintConfig.cpp:679 msgid "Speed of the last cooling move" msgstr "" -#: src/libslic3r/PrintConfig.cpp:669 +#: src/libslic3r/PrintConfig.cpp:680 msgid "Cooling moves are gradually accelerating towards this speed." msgstr "" -#: src/libslic3r/PrintConfig.cpp:676 +#: src/libslic3r/PrintConfig.cpp:687 msgid "Filament load time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:677 +#: src/libslic3r/PrintConfig.cpp:688 msgid "" "Time for the printer firmware (or the Multi Material Unit 2.0) to load a new " "filament during a tool change (when executing the T code). This time is " "added to the total print time by the G-code time estimator." msgstr "" -#: src/libslic3r/PrintConfig.cpp:684 +#: src/libslic3r/PrintConfig.cpp:695 msgid "Ramming parameters" msgstr "" -#: src/libslic3r/PrintConfig.cpp:685 +#: src/libslic3r/PrintConfig.cpp:696 msgid "" "This string is edited by RammingDialog and contains ramming specific " "parameters." msgstr "" -#: src/libslic3r/PrintConfig.cpp:691 +#: src/libslic3r/PrintConfig.cpp:702 msgid "Filament unload time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:692 +#: src/libslic3r/PrintConfig.cpp:703 msgid "" "Time for the printer firmware (or the Multi Material Unit 2.0) to unload a " "filament during a tool change (when executing the T code). This time is " "added to the total print time by the G-code time estimator." msgstr "" -#: src/libslic3r/PrintConfig.cpp:700 +#: src/libslic3r/PrintConfig.cpp:711 msgid "" "Enter your filament diameter here. Good precision is required, so use a " "caliper and do multiple measurements along the filament, then compute the " "average." msgstr "" -#: src/libslic3r/PrintConfig.cpp:707 src/libslic3r/PrintConfig.cpp:2471 -#: src/libslic3r/PrintConfig.cpp:2472 +#: src/libslic3r/PrintConfig.cpp:718 src/libslic3r/PrintConfig.cpp:2504 +#: src/libslic3r/PrintConfig.cpp:2505 msgid "Density" msgstr "" -#: src/libslic3r/PrintConfig.cpp:708 +#: src/libslic3r/PrintConfig.cpp:719 msgid "" "Enter your filament density here. This is only for statistical information. " "A decent way is to weigh a known length of filament and compute the ratio of " @@ -6771,117 +7255,117 @@ msgid "" "displacement." msgstr "" -#: src/libslic3r/PrintConfig.cpp:711 +#: src/libslic3r/PrintConfig.cpp:722 msgid "g/cm³" msgstr "" -#: src/libslic3r/PrintConfig.cpp:716 +#: src/libslic3r/PrintConfig.cpp:727 msgid "Filament type" msgstr "" -#: src/libslic3r/PrintConfig.cpp:717 +#: src/libslic3r/PrintConfig.cpp:728 msgid "The filament material type for use in custom G-codes." msgstr "" -#: src/libslic3r/PrintConfig.cpp:743 +#: src/libslic3r/PrintConfig.cpp:755 msgid "Soluble material" msgstr "" -#: src/libslic3r/PrintConfig.cpp:744 +#: src/libslic3r/PrintConfig.cpp:756 msgid "Soluble material is most likely used for a soluble support." msgstr "" -#: src/libslic3r/PrintConfig.cpp:750 +#: src/libslic3r/PrintConfig.cpp:762 msgid "" "Enter your filament cost per kg here. This is only for statistical " "information." msgstr "" -#: src/libslic3r/PrintConfig.cpp:751 +#: src/libslic3r/PrintConfig.cpp:763 msgid "money/kg" msgstr "" -#: src/libslic3r/PrintConfig.cpp:760 src/libslic3r/PrintConfig.cpp:2555 +#: src/libslic3r/PrintConfig.cpp:772 src/libslic3r/PrintConfig.cpp:2588 msgid "(Unknown)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:764 +#: src/libslic3r/PrintConfig.cpp:776 msgid "Fill angle" msgstr "" -#: src/libslic3r/PrintConfig.cpp:766 +#: src/libslic3r/PrintConfig.cpp:778 msgid "" "Default base angle for infill orientation. Cross-hatching will be applied to " "this. Bridges will be infilled using the best direction Slic3r can detect, " "so this setting does not affect them." msgstr "" -#: src/libslic3r/PrintConfig.cpp:778 +#: src/libslic3r/PrintConfig.cpp:790 msgid "Fill density" msgstr "" -#: src/libslic3r/PrintConfig.cpp:780 +#: src/libslic3r/PrintConfig.cpp:792 msgid "Density of internal infill, expressed in the range 0% - 100%." msgstr "" -#: src/libslic3r/PrintConfig.cpp:815 +#: src/libslic3r/PrintConfig.cpp:827 msgid "Fill pattern" msgstr "" -#: src/libslic3r/PrintConfig.cpp:817 +#: src/libslic3r/PrintConfig.cpp:829 msgid "Fill pattern for general low-density infill." msgstr "" -#: src/libslic3r/PrintConfig.cpp:833 +#: src/libslic3r/PrintConfig.cpp:845 msgid "Grid" msgstr "" -#: src/libslic3r/PrintConfig.cpp:834 +#: src/libslic3r/PrintConfig.cpp:846 msgid "Triangles" msgstr "" -#: src/libslic3r/PrintConfig.cpp:835 +#: src/libslic3r/PrintConfig.cpp:847 msgid "Stars" msgstr "" -#: src/libslic3r/PrintConfig.cpp:836 +#: src/libslic3r/PrintConfig.cpp:848 msgid "Cubic" msgstr "" -#: src/libslic3r/PrintConfig.cpp:837 +#: src/libslic3r/PrintConfig.cpp:849 msgid "Line" msgstr "" -#: src/libslic3r/PrintConfig.cpp:839 src/libslic3r/PrintConfig.cpp:2000 +#: src/libslic3r/PrintConfig.cpp:851 src/libslic3r/PrintConfig.cpp:2021 msgid "Honeycomb" msgstr "" -#: src/libslic3r/PrintConfig.cpp:840 +#: src/libslic3r/PrintConfig.cpp:852 msgid "3D Honeycomb" msgstr "" -#: src/libslic3r/PrintConfig.cpp:841 +#: src/libslic3r/PrintConfig.cpp:853 msgid "Gyroid" msgstr "" -#: src/libslic3r/PrintConfig.cpp:848 src/libslic3r/PrintConfig.cpp:857 -#: src/libslic3r/PrintConfig.cpp:865 src/libslic3r/PrintConfig.cpp:899 +#: src/libslic3r/PrintConfig.cpp:860 src/libslic3r/PrintConfig.cpp:869 +#: src/libslic3r/PrintConfig.cpp:877 src/libslic3r/PrintConfig.cpp:911 msgid "First layer" msgstr "" -#: src/libslic3r/PrintConfig.cpp:849 +#: src/libslic3r/PrintConfig.cpp:861 msgid "" "This is the acceleration your printer will use for first layer. Set zero to " "disable acceleration control for first layer." msgstr "" -#: src/libslic3r/PrintConfig.cpp:858 +#: src/libslic3r/PrintConfig.cpp:870 msgid "" "Heated build plate temperature for the first layer. Set this to zero to " "disable bed temperature control commands in the output." msgstr "" -#: src/libslic3r/PrintConfig.cpp:867 +#: src/libslic3r/PrintConfig.cpp:879 msgid "" "Set this to a non-zero value to set a manual extrusion width for first " "layer. You can use this to force fatter extrudates for better adhesion. If " @@ -6889,7 +7373,7 @@ msgid "" "layer height. If set to zero, it will use the default extrusion width." msgstr "" -#: src/libslic3r/PrintConfig.cpp:880 +#: src/libslic3r/PrintConfig.cpp:892 msgid "" "When printing with very low layer heights, you might still want to print a " "thicker bottom layer to improve adhesion and tolerance for non perfect build " @@ -6897,47 +7381,47 @@ msgid "" "example: 150%) over the default layer height." msgstr "" -#: src/libslic3r/PrintConfig.cpp:889 +#: src/libslic3r/PrintConfig.cpp:901 msgid "First layer speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:890 +#: src/libslic3r/PrintConfig.cpp:902 msgid "" "If expressed as absolute value in mm/s, this speed will be applied to all " "the print moves of the first layer, regardless of their type. If expressed " "as a percentage (for example: 40%) it will scale the default speeds." msgstr "" -#: src/libslic3r/PrintConfig.cpp:900 +#: src/libslic3r/PrintConfig.cpp:912 msgid "" "Extruder temperature for first layer. If you want to control temperature " "manually during print, set this to zero to disable temperature control " "commands in the output file." msgstr "" -#: src/libslic3r/PrintConfig.cpp:909 +#: src/libslic3r/PrintConfig.cpp:921 msgid "" "Speed for filling small gaps using short zigzag moves. Keep this reasonably " "low to avoid too much shaking and resonance issues. Set zero to disable gaps " "filling." msgstr "" -#: src/libslic3r/PrintConfig.cpp:917 +#: src/libslic3r/PrintConfig.cpp:929 msgid "Verbose G-code" msgstr "" -#: src/libslic3r/PrintConfig.cpp:918 +#: src/libslic3r/PrintConfig.cpp:930 msgid "" "Enable this to get a commented G-code file, with each line explained by a " "descriptive text. If you print from SD card, the additional weight of the " "file could make your firmware slow down." msgstr "" -#: src/libslic3r/PrintConfig.cpp:925 +#: src/libslic3r/PrintConfig.cpp:937 msgid "G-code flavor" msgstr "" -#: src/libslic3r/PrintConfig.cpp:926 +#: src/libslic3r/PrintConfig.cpp:938 msgid "" "Some G/M-code commands, including temperature control and others, are not " "universal. Set this option to your printer's firmware to get a compatible " @@ -6945,15 +7429,15 @@ msgid "" "extrusion value at all." msgstr "" -#: src/libslic3r/PrintConfig.cpp:949 +#: src/libslic3r/PrintConfig.cpp:961 msgid "No extrusion" msgstr "" -#: src/libslic3r/PrintConfig.cpp:954 +#: src/libslic3r/PrintConfig.cpp:966 msgid "Label objects" msgstr "" -#: src/libslic3r/PrintConfig.cpp:955 +#: src/libslic3r/PrintConfig.cpp:967 msgid "" "Enable this to add comments into the G-Code labeling print moves with what " "object they belong to, which is useful for the Octoprint CancelObject " @@ -6961,46 +7445,46 @@ msgid "" "setup and Wipe into Object / Wipe into Infill." msgstr "" -#: src/libslic3r/PrintConfig.cpp:962 +#: src/libslic3r/PrintConfig.cpp:974 msgid "High extruder current on filament swap" msgstr "" -#: src/libslic3r/PrintConfig.cpp:963 +#: src/libslic3r/PrintConfig.cpp:975 msgid "" "It may be beneficial to increase the extruder motor current during the " "filament exchange sequence to allow for rapid ramming feed rates and to " "overcome resistance when loading a filament with an ugly shaped tip." msgstr "" -#: src/libslic3r/PrintConfig.cpp:971 +#: src/libslic3r/PrintConfig.cpp:983 msgid "" "This is the acceleration your printer will use for infill. Set zero to " "disable acceleration control for infill." msgstr "" -#: src/libslic3r/PrintConfig.cpp:979 +#: src/libslic3r/PrintConfig.cpp:991 msgid "Combine infill every" msgstr "" -#: src/libslic3r/PrintConfig.cpp:981 +#: src/libslic3r/PrintConfig.cpp:993 msgid "" "This feature allows to combine infill and speed up your print by extruding " "thicker infill layers while preserving thin perimeters, thus accuracy." msgstr "" -#: src/libslic3r/PrintConfig.cpp:984 +#: src/libslic3r/PrintConfig.cpp:996 msgid "Combine infill every n layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:990 +#: src/libslic3r/PrintConfig.cpp:1002 msgid "Infill extruder" msgstr "" -#: src/libslic3r/PrintConfig.cpp:992 +#: src/libslic3r/PrintConfig.cpp:1004 msgid "The extruder to use when printing infill." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1000 +#: src/libslic3r/PrintConfig.cpp:1012 msgid "" "Set this to a non-zero value to set a manual extrusion width for infill. If " "left zero, default extrusion width will be used if set, otherwise 1.125 x " @@ -7009,32 +7493,32 @@ msgid "" "example 90%) it will be computed over layer height." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1010 +#: src/libslic3r/PrintConfig.cpp:1022 msgid "Infill before perimeters" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1011 +#: src/libslic3r/PrintConfig.cpp:1023 msgid "" "This option will switch the print order of perimeters and infill, making the " "latter first." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1016 +#: src/libslic3r/PrintConfig.cpp:1028 msgid "Only infill where needed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1018 +#: src/libslic3r/PrintConfig.cpp:1030 msgid "" "This option will limit infill to the areas actually needed for supporting " "ceilings (it will act as internal support material). If enabled, slows down " "the G-code generation due to the multiple checks involved." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1025 +#: src/libslic3r/PrintConfig.cpp:1037 msgid "Infill/perimeters overlap" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1027 +#: src/libslic3r/PrintConfig.cpp:1039 msgid "" "This setting applies an additional overlap between infill and perimeters for " "better bonding. Theoretically this shouldn't be needed, but backlash might " @@ -7042,30 +7526,30 @@ msgid "" "perimeter extrusion width." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1038 +#: src/libslic3r/PrintConfig.cpp:1050 msgid "Speed for printing the internal fill. Set to zero for auto." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1046 +#: src/libslic3r/PrintConfig.cpp:1058 msgid "Inherits profile" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1047 +#: src/libslic3r/PrintConfig.cpp:1059 msgid "Name of the profile, from which this profile inherits." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1060 +#: src/libslic3r/PrintConfig.cpp:1072 msgid "Interface shells" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1061 +#: src/libslic3r/PrintConfig.cpp:1073 msgid "" "Force the generation of solid shells between adjacent materials/volumes. " "Useful for multi-extruder prints with translucent materials or manual " "soluble support material." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1070 +#: src/libslic3r/PrintConfig.cpp:1082 msgid "" "This custom code is inserted at every layer change, right after the Z move " "and before the extruder moves to the first layer point. Note that you can " @@ -7073,11 +7557,11 @@ msgid "" "[layer_z]." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1081 +#: src/libslic3r/PrintConfig.cpp:1093 msgid "Supports remaining times" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1082 +#: src/libslic3r/PrintConfig.cpp:1094 msgid "" "Emit M73 P[percent printed] R[remaining time in minutes] at 1 minute " "intervals into the G-code to let the firmware show accurate remaining time. " @@ -7085,151 +7569,151 @@ msgid "" "firmware supports M73 Qxx Sxx for the silent mode." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1090 +#: src/libslic3r/PrintConfig.cpp:1102 msgid "Supports stealth mode" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1091 +#: src/libslic3r/PrintConfig.cpp:1103 msgid "The firmware supports stealth mode" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1115 +#: src/libslic3r/PrintConfig.cpp:1127 msgid "Maximum feedrate X" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1116 +#: src/libslic3r/PrintConfig.cpp:1128 msgid "Maximum feedrate Y" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1117 +#: src/libslic3r/PrintConfig.cpp:1129 msgid "Maximum feedrate Z" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1118 +#: src/libslic3r/PrintConfig.cpp:1130 msgid "Maximum feedrate E" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1121 +#: src/libslic3r/PrintConfig.cpp:1133 msgid "Maximum feedrate of the X axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1122 +#: src/libslic3r/PrintConfig.cpp:1134 msgid "Maximum feedrate of the Y axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1123 +#: src/libslic3r/PrintConfig.cpp:1135 msgid "Maximum feedrate of the Z axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1124 +#: src/libslic3r/PrintConfig.cpp:1136 msgid "Maximum feedrate of the E axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1133 +#: src/libslic3r/PrintConfig.cpp:1145 msgid "Maximum acceleration X" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1134 +#: src/libslic3r/PrintConfig.cpp:1146 msgid "Maximum acceleration Y" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1135 +#: src/libslic3r/PrintConfig.cpp:1147 msgid "Maximum acceleration Z" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1136 +#: src/libslic3r/PrintConfig.cpp:1148 msgid "Maximum acceleration E" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1139 +#: src/libslic3r/PrintConfig.cpp:1151 msgid "Maximum acceleration of the X axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1140 +#: src/libslic3r/PrintConfig.cpp:1152 msgid "Maximum acceleration of the Y axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1141 +#: src/libslic3r/PrintConfig.cpp:1153 msgid "Maximum acceleration of the Z axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1142 +#: src/libslic3r/PrintConfig.cpp:1154 msgid "Maximum acceleration of the E axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1151 +#: src/libslic3r/PrintConfig.cpp:1163 msgid "Maximum jerk X" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1152 +#: src/libslic3r/PrintConfig.cpp:1164 msgid "Maximum jerk Y" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1153 +#: src/libslic3r/PrintConfig.cpp:1165 msgid "Maximum jerk Z" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1154 +#: src/libslic3r/PrintConfig.cpp:1166 msgid "Maximum jerk E" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1157 +#: src/libslic3r/PrintConfig.cpp:1169 msgid "Maximum jerk of the X axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1158 +#: src/libslic3r/PrintConfig.cpp:1170 msgid "Maximum jerk of the Y axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1159 +#: src/libslic3r/PrintConfig.cpp:1171 msgid "Maximum jerk of the Z axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1160 +#: src/libslic3r/PrintConfig.cpp:1172 msgid "Maximum jerk of the E axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1171 +#: src/libslic3r/PrintConfig.cpp:1183 msgid "Minimum feedrate when extruding" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1173 +#: src/libslic3r/PrintConfig.cpp:1185 msgid "Minimum feedrate when extruding (M205 S)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1182 +#: src/libslic3r/PrintConfig.cpp:1194 msgid "Minimum travel feedrate" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1184 +#: src/libslic3r/PrintConfig.cpp:1196 msgid "Minimum travel feedrate (M205 T)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1193 +#: src/libslic3r/PrintConfig.cpp:1205 msgid "Maximum acceleration when extruding" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1195 +#: src/libslic3r/PrintConfig.cpp:1207 msgid "Maximum acceleration when extruding (M204 S)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1204 +#: src/libslic3r/PrintConfig.cpp:1216 msgid "Maximum acceleration when retracting" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1206 +#: src/libslic3r/PrintConfig.cpp:1218 msgid "Maximum acceleration when retracting (M204 T)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1214 src/libslic3r/PrintConfig.cpp:1223 +#: src/libslic3r/PrintConfig.cpp:1226 src/libslic3r/PrintConfig.cpp:1235 msgid "Max" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1215 +#: src/libslic3r/PrintConfig.cpp:1227 msgid "This setting represents the maximum speed of your fan." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1224 +#: src/libslic3r/PrintConfig.cpp:1236 #, no-c-format msgid "" "This is the highest printable layer height for this extruder, used to cap " @@ -7238,28 +7722,28 @@ msgid "" "adhesion. If set to 0, layer height is limited to 75% of the nozzle diameter." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1234 +#: src/libslic3r/PrintConfig.cpp:1246 msgid "Max print speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1235 +#: src/libslic3r/PrintConfig.cpp:1247 msgid "" "When setting other speed settings to 0 Slic3r will autocalculate the optimal " "speed in order to keep constant extruder pressure. This experimental setting " "is used to set the highest print speed you want to allow." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1245 +#: src/libslic3r/PrintConfig.cpp:1257 msgid "" "This experimental setting is used to set the maximum volumetric speed your " "extruder supports." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1254 +#: src/libslic3r/PrintConfig.cpp:1266 msgid "Max volumetric slope positive" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1255 src/libslic3r/PrintConfig.cpp:1266 +#: src/libslic3r/PrintConfig.cpp:1267 src/libslic3r/PrintConfig.cpp:1278 msgid "" "This experimental setting is used to limit the speed of change in extrusion " "rate. A value of 1.8 mm³/s² ensures, that a change from the extrusion rate " @@ -7267,95 +7751,95 @@ msgid "" "s) to 5.4 mm³/s (feedrate 60 mm/s) will take at least 2 seconds." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1259 src/libslic3r/PrintConfig.cpp:1270 +#: src/libslic3r/PrintConfig.cpp:1271 src/libslic3r/PrintConfig.cpp:1282 msgid "mm³/s²" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1265 +#: src/libslic3r/PrintConfig.cpp:1277 msgid "Max volumetric slope negative" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1277 src/libslic3r/PrintConfig.cpp:1286 +#: src/libslic3r/PrintConfig.cpp:1289 src/libslic3r/PrintConfig.cpp:1298 msgid "Min" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1278 +#: src/libslic3r/PrintConfig.cpp:1290 msgid "This setting represents the minimum PWM your fan needs to work." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1287 +#: src/libslic3r/PrintConfig.cpp:1299 msgid "" "This is the lowest printable layer height for this extruder and limits the " "resolution for variable layer height. Typical values are between 0.05 mm and " "0.1 mm." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1295 +#: src/libslic3r/PrintConfig.cpp:1307 msgid "Min print speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1296 +#: src/libslic3r/PrintConfig.cpp:1308 msgid "Slic3r will not scale speed down below this speed." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1303 +#: src/libslic3r/PrintConfig.cpp:1315 msgid "Minimal filament extrusion length" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1304 +#: src/libslic3r/PrintConfig.cpp:1316 msgid "" "Generate no less than the number of skirt loops required to consume the " "specified amount of filament on the bottom layer. For multi-extruder " "machines, this minimum applies to each extruder." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1313 +#: src/libslic3r/PrintConfig.cpp:1325 msgid "Configuration notes" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1314 +#: src/libslic3r/PrintConfig.cpp:1326 msgid "" "You can put here your personal notes. This text will be added to the G-code " "header comments." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1324 +#: src/libslic3r/PrintConfig.cpp:1336 msgid "" "This is the diameter of your extruder nozzle (for example: 0.5, 0.35 etc.)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1329 +#: src/libslic3r/PrintConfig.cpp:1341 msgid "Host Type" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1330 +#: src/libslic3r/PrintConfig.cpp:1342 msgid "" "Slic3r can upload G-code files to a printer host. This field must contain " "the kind of the host." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1343 +#: src/libslic3r/PrintConfig.cpp:1357 msgid "Only retract when crossing perimeters" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1344 +#: src/libslic3r/PrintConfig.cpp:1358 msgid "" "Disables retraction when the travel path does not exceed the upper layer's " "perimeters (and thus any ooze will be probably invisible)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1351 +#: src/libslic3r/PrintConfig.cpp:1365 msgid "" "This option will drop the temperature of the inactive extruders to prevent " "oozing. It will enable a tall skirt automatically and move extruders outside " "such skirt when changing temperatures." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1358 +#: src/libslic3r/PrintConfig.cpp:1372 msgid "Output filename format" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1359 +#: src/libslic3r/PrintConfig.cpp:1373 msgid "" "You can use all configuration options as variables inside this template. For " "example: [layer_height], [fill_density] etc. You can also use [timestamp], " @@ -7363,31 +7847,31 @@ msgid "" "[input_filename], [input_filename_base]." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1368 +#: src/libslic3r/PrintConfig.cpp:1382 msgid "Detect bridging perimeters" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1370 +#: src/libslic3r/PrintConfig.cpp:1384 msgid "" "Experimental option to adjust flow for overhangs (bridge flow will be used), " "to apply bridge speed to them and enable fan." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1376 +#: src/libslic3r/PrintConfig.cpp:1390 msgid "Filament parking position" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1377 +#: src/libslic3r/PrintConfig.cpp:1391 msgid "" "Distance of the extruder tip from the position where the filament is parked " "when unloaded. This should match the value in printer firmware." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1385 +#: src/libslic3r/PrintConfig.cpp:1399 msgid "Extra loading distance" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1386 +#: src/libslic3r/PrintConfig.cpp:1400 msgid "" "When set to zero, the distance the filament is moved from parking position " "during load is exactly the same as it was moved back during unload. When " @@ -7395,28 +7879,28 @@ msgid "" "than unloading." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1394 src/libslic3r/PrintConfig.cpp:1412 -#: src/libslic3r/PrintConfig.cpp:1425 src/libslic3r/PrintConfig.cpp:1435 +#: src/libslic3r/PrintConfig.cpp:1408 src/libslic3r/PrintConfig.cpp:1426 +#: src/libslic3r/PrintConfig.cpp:1439 src/libslic3r/PrintConfig.cpp:1449 msgid "Perimeters" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1395 +#: src/libslic3r/PrintConfig.cpp:1409 msgid "" "This is the acceleration your printer will use for perimeters. A high value " "like 9000 usually gives good results if your hardware is up to the job. Set " "zero to disable acceleration control for perimeters." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1403 +#: src/libslic3r/PrintConfig.cpp:1417 msgid "Perimeter extruder" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1405 +#: src/libslic3r/PrintConfig.cpp:1419 msgid "" "The extruder to use when printing perimeters and brim. First extruder is 1." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1414 +#: src/libslic3r/PrintConfig.cpp:1428 msgid "" "Set this to a non-zero value to set a manual extrusion width for perimeters. " "You may want to use thinner extrudates to get more accurate surfaces. If " @@ -7425,12 +7909,12 @@ msgid "" "it will be computed over layer height." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1427 +#: src/libslic3r/PrintConfig.cpp:1441 msgid "" "Speed for perimeters (contours, aka vertical shells). Set to zero for auto." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1437 +#: src/libslic3r/PrintConfig.cpp:1451 msgid "" "This option sets the number of perimeters to generate for each layer. Note " "that Slic3r may increase this number automatically when it detects sloping " @@ -7438,11 +7922,11 @@ msgid "" "Perimeters option is enabled." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1441 +#: src/libslic3r/PrintConfig.cpp:1455 msgid "(minimum)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1449 +#: src/libslic3r/PrintConfig.cpp:1463 msgid "" "If you want to process the output G-code through custom scripts, just list " "their absolute paths here. Separate multiple scripts with a semicolon. " @@ -7451,55 +7935,55 @@ msgid "" "environment variables." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1461 +#: src/libslic3r/PrintConfig.cpp:1475 msgid "Printer type" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1462 +#: src/libslic3r/PrintConfig.cpp:1476 msgid "Type of the printer." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1467 +#: src/libslic3r/PrintConfig.cpp:1481 msgid "Printer notes" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1468 +#: src/libslic3r/PrintConfig.cpp:1482 msgid "You can put your notes regarding the printer here." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1476 +#: src/libslic3r/PrintConfig.cpp:1490 msgid "Printer vendor" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1477 +#: src/libslic3r/PrintConfig.cpp:1491 msgid "Name of the printer vendor." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1482 +#: src/libslic3r/PrintConfig.cpp:1496 msgid "Printer variant" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1483 +#: src/libslic3r/PrintConfig.cpp:1497 msgid "" "Name of the printer variant. For example, the printer variants may be " "differentiated by a nozzle diameter." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1496 +#: src/libslic3r/PrintConfig.cpp:1510 msgid "Raft layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1498 +#: src/libslic3r/PrintConfig.cpp:1512 msgid "" "The object will be raised by this number of layers, and support material " "will be generated under it." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1506 +#: src/libslic3r/PrintConfig.cpp:1520 msgid "Resolution" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1507 +#: src/libslic3r/PrintConfig.cpp:1521 msgid "" "Minimum detail resolution, used to simplify the input file for speeding up " "the slicing job and reducing memory usage. High-resolution models often " @@ -7507,278 +7991,278 @@ msgid "" "simplification and use full resolution from input." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1517 +#: src/libslic3r/PrintConfig.cpp:1531 msgid "Minimum travel after retraction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1518 +#: src/libslic3r/PrintConfig.cpp:1532 msgid "" "Retraction is not triggered when travel moves are shorter than this length." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1524 +#: src/libslic3r/PrintConfig.cpp:1538 msgid "Retract amount before wipe" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1525 +#: src/libslic3r/PrintConfig.cpp:1539 msgid "" "With bowden extruders, it may be wise to do some amount of quick retract " "before doing the wipe movement." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1532 +#: src/libslic3r/PrintConfig.cpp:1546 msgid "Retract on layer change" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1533 +#: src/libslic3r/PrintConfig.cpp:1547 msgid "This flag enforces a retraction whenever a Z move is done." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1538 src/libslic3r/PrintConfig.cpp:1546 +#: src/libslic3r/PrintConfig.cpp:1552 src/libslic3r/PrintConfig.cpp:1560 msgid "Length" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1539 +#: src/libslic3r/PrintConfig.cpp:1553 msgid "Retraction Length" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1540 +#: src/libslic3r/PrintConfig.cpp:1554 msgid "" "When retraction is triggered, filament is pulled back by the specified " "amount (the length is measured on raw filament, before it enters the " "extruder)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1542 src/libslic3r/PrintConfig.cpp:1551 +#: src/libslic3r/PrintConfig.cpp:1556 src/libslic3r/PrintConfig.cpp:1565 msgid "mm (zero to disable)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1547 +#: src/libslic3r/PrintConfig.cpp:1561 msgid "Retraction Length (Toolchange)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1548 +#: src/libslic3r/PrintConfig.cpp:1562 msgid "" "When retraction is triggered before changing tool, filament is pulled back " "by the specified amount (the length is measured on raw filament, before it " "enters the extruder)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1556 +#: src/libslic3r/PrintConfig.cpp:1570 msgid "Lift Z" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1557 +#: src/libslic3r/PrintConfig.cpp:1571 msgid "" "If you set this to a positive value, Z is quickly raised every time a " "retraction is triggered. When using multiple extruders, only the setting for " "the first extruder will be considered." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1564 +#: src/libslic3r/PrintConfig.cpp:1578 msgid "Above Z" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1565 +#: src/libslic3r/PrintConfig.cpp:1579 msgid "Only lift Z above" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1566 +#: src/libslic3r/PrintConfig.cpp:1580 msgid "" "If you set this to a positive value, Z lift will only take place above the " "specified absolute Z. You can tune this setting for skipping lift on the " "first layers." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1573 +#: src/libslic3r/PrintConfig.cpp:1587 msgid "Below Z" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1574 +#: src/libslic3r/PrintConfig.cpp:1588 msgid "Only lift Z below" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1575 +#: src/libslic3r/PrintConfig.cpp:1589 msgid "" "If you set this to a positive value, Z lift will only take place below the " "specified absolute Z. You can tune this setting for limiting lift to the " "first layers." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1583 src/libslic3r/PrintConfig.cpp:1591 +#: src/libslic3r/PrintConfig.cpp:1597 src/libslic3r/PrintConfig.cpp:1605 msgid "Extra length on restart" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1584 +#: src/libslic3r/PrintConfig.cpp:1598 msgid "" "When the retraction is compensated after the travel move, the extruder will " "push this additional amount of filament. This setting is rarely needed." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1592 +#: src/libslic3r/PrintConfig.cpp:1606 msgid "" "When the retraction is compensated after changing tool, the extruder will " "push this additional amount of filament." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1599 src/libslic3r/PrintConfig.cpp:1600 +#: src/libslic3r/PrintConfig.cpp:1613 src/libslic3r/PrintConfig.cpp:1614 msgid "Retraction Speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1601 +#: src/libslic3r/PrintConfig.cpp:1615 msgid "The speed for retractions (it only applies to the extruder motor)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1607 src/libslic3r/PrintConfig.cpp:1608 +#: src/libslic3r/PrintConfig.cpp:1621 src/libslic3r/PrintConfig.cpp:1622 msgid "Deretraction Speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1609 +#: src/libslic3r/PrintConfig.cpp:1623 msgid "" "The speed for loading of a filament into extruder after retraction (it only " "applies to the extruder motor). If left to zero, the retraction speed is " "used." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1616 +#: src/libslic3r/PrintConfig.cpp:1630 msgid "Seam position" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1618 +#: src/libslic3r/PrintConfig.cpp:1632 msgid "Position of perimeters starting points." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1624 +#: src/libslic3r/PrintConfig.cpp:1638 msgid "Random" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1625 +#: src/libslic3r/PrintConfig.cpp:1639 msgid "Nearest" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1626 +#: src/libslic3r/PrintConfig.cpp:1640 msgid "Aligned" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1634 +#: src/libslic3r/PrintConfig.cpp:1648 msgid "Direction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1636 +#: src/libslic3r/PrintConfig.cpp:1650 msgid "Preferred direction of the seam" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1637 +#: src/libslic3r/PrintConfig.cpp:1651 msgid "Seam preferred direction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1644 +#: src/libslic3r/PrintConfig.cpp:1658 msgid "Jitter" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1646 +#: src/libslic3r/PrintConfig.cpp:1660 msgid "Seam preferred direction jitter" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1647 +#: src/libslic3r/PrintConfig.cpp:1661 msgid "Preferred direction of the seam - jitter" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1657 +#: src/libslic3r/PrintConfig.cpp:1671 msgid "USB/serial port for printer connection." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1664 +#: src/libslic3r/PrintConfig.cpp:1678 msgid "Serial port speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1665 +#: src/libslic3r/PrintConfig.cpp:1679 msgid "Speed (baud) of USB/serial port for printer connection." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1674 +#: src/libslic3r/PrintConfig.cpp:1688 msgid "Distance from object" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1675 +#: src/libslic3r/PrintConfig.cpp:1689 msgid "" "Distance between skirt and object(s). Set this to zero to attach the skirt " "to the object(s) and get a brim for better adhesion." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1682 +#: src/libslic3r/PrintConfig.cpp:1696 msgid "Skirt height" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1683 +#: src/libslic3r/PrintConfig.cpp:1697 msgid "" "Height of skirt expressed in layers. Set this to a tall value to use skirt " "as a shield against drafts." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1690 +#: src/libslic3r/PrintConfig.cpp:1704 msgid "Loops (minimum)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1691 +#: src/libslic3r/PrintConfig.cpp:1705 msgid "Skirt Loops" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1692 +#: src/libslic3r/PrintConfig.cpp:1706 msgid "" "Number of loops for the skirt. If the Minimum Extrusion Length option is " "set, the number of loops might be greater than the one configured here. Set " "this to zero to disable skirt completely." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1700 +#: src/libslic3r/PrintConfig.cpp:1714 msgid "Slow down if layer print time is below" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1701 +#: src/libslic3r/PrintConfig.cpp:1715 msgid "" "If layer print time is estimated below this number of seconds, print moves " "speed will be scaled down to extend duration to this value." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1711 +#: src/libslic3r/PrintConfig.cpp:1725 msgid "Small perimeters" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1713 +#: src/libslic3r/PrintConfig.cpp:1727 msgid "" "This separate setting will affect the speed of perimeters having radius <= " "6.5mm (usually holes). If expressed as percentage (for example: 80%) it will " "be calculated on the perimeters speed setting above. Set to zero for auto." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1723 +#: src/libslic3r/PrintConfig.cpp:1737 msgid "Solid infill threshold area" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1725 +#: src/libslic3r/PrintConfig.cpp:1739 msgid "" "Force solid infill for regions having a smaller area than the specified " "threshold." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1726 +#: src/libslic3r/PrintConfig.cpp:1740 msgid "mm²" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1732 +#: src/libslic3r/PrintConfig.cpp:1746 msgid "Solid infill extruder" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1734 +#: src/libslic3r/PrintConfig.cpp:1748 msgid "The extruder to use when printing solid infill." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1740 +#: src/libslic3r/PrintConfig.cpp:1754 msgid "Solid infill every" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1742 +#: src/libslic3r/PrintConfig.cpp:1756 msgid "" "This feature allows to force a solid layer every given number of layers. " "Zero to disable. You can set this to any value (for example 9999); Slic3r " @@ -7786,7 +8270,7 @@ msgid "" "according to nozzle diameter and layer height." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1754 +#: src/libslic3r/PrintConfig.cpp:1768 msgid "" "Set this to a non-zero value to set a manual extrusion width for infill for " "solid surfaces. If left zero, default extrusion width will be used if set, " @@ -7794,22 +8278,26 @@ msgid "" "(for example 90%) it will be computed over layer height." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1765 +#: src/libslic3r/PrintConfig.cpp:1779 msgid "" "Speed for printing solid regions (top/bottom/internal horizontal shells). " "This can be expressed as a percentage (for example: 80%) over the default " "infill speed above. Set to zero for auto." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1777 +#: src/libslic3r/PrintConfig.cpp:1791 msgid "Number of solid layers to generate on top and bottom surfaces." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1783 +#: src/libslic3r/PrintConfig.cpp:1797 src/libslic3r/PrintConfig.cpp:1798 +msgid "Minimum thickness of a top / bottom shell" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:1804 msgid "Spiral vase" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1784 +#: src/libslic3r/PrintConfig.cpp:1805 msgid "" "This feature will raise Z gradually while printing a single-walled object in " "order to remove any visible seam. This option requires a single perimeter, " @@ -7818,18 +8306,18 @@ msgid "" "when printing more than an object." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1792 +#: src/libslic3r/PrintConfig.cpp:1813 msgid "Temperature variation" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1793 +#: src/libslic3r/PrintConfig.cpp:1814 msgid "" "Temperature difference to be applied when an extruder is not active. Enables " "a full-height \"sacrificial\" skirt on which the nozzles are periodically " "wiped." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1803 +#: src/libslic3r/PrintConfig.cpp:1824 msgid "" "This start procedure is inserted at the beginning, after bed has reached the " "target temperature and extruder just started heating, and before extruder " @@ -7840,7 +8328,7 @@ msgid "" "put a \"M109 S[first_layer_temperature]\" command wherever you want." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1818 +#: src/libslic3r/PrintConfig.cpp:1839 msgid "" "This start procedure is inserted at the beginning, after any printer start " "gcode (and after any toolchange to this filament in case of multi-material " @@ -7853,29 +8341,29 @@ msgid "" "extruders, the gcode is processed in extruder order." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1834 +#: src/libslic3r/PrintConfig.cpp:1855 msgid "Single Extruder Multi Material" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1835 +#: src/libslic3r/PrintConfig.cpp:1856 msgid "The printer multiplexes filaments into a single hot end." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1840 +#: src/libslic3r/PrintConfig.cpp:1861 msgid "Prime all printing extruders" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1841 +#: src/libslic3r/PrintConfig.cpp:1862 msgid "" "If enabled, all printing extruders will be primed at the front edge of the " "print bed at the start of the print." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1846 +#: src/libslic3r/PrintConfig.cpp:1867 msgid "No sparse layers (EXPERIMENTAL)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1847 +#: src/libslic3r/PrintConfig.cpp:1868 msgid "" "If enabled, the wipe tower will not be printed on layers with no " "toolchanges. On layers with a toolchange, extruder will travel downward to " @@ -7883,75 +8371,75 @@ msgid "" "with the print." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1854 +#: src/libslic3r/PrintConfig.cpp:1875 msgid "Generate support material" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1856 +#: src/libslic3r/PrintConfig.cpp:1877 msgid "Enable support material generation." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1860 +#: src/libslic3r/PrintConfig.cpp:1881 msgid "Auto generated supports" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1862 +#: src/libslic3r/PrintConfig.cpp:1883 msgid "" "If checked, supports will be generated automatically based on the overhang " "threshold value. If unchecked, supports will be generated inside the " "\"Support Enforcer\" volumes only." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1868 +#: src/libslic3r/PrintConfig.cpp:1889 msgid "XY separation between an object and its support" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1870 +#: src/libslic3r/PrintConfig.cpp:1891 msgid "" "XY separation between an object and its support. If expressed as percentage " "(for example 50%), it will be calculated over external perimeter width." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1880 +#: src/libslic3r/PrintConfig.cpp:1901 msgid "Pattern angle" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1882 +#: src/libslic3r/PrintConfig.cpp:1903 msgid "" "Use this setting to rotate the support material pattern on the horizontal " "plane." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1892 src/libslic3r/PrintConfig.cpp:2644 +#: src/libslic3r/PrintConfig.cpp:1913 src/libslic3r/PrintConfig.cpp:2677 msgid "" "Only create support if it lies on a build plate. Don't create support on a " "print." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1898 +#: src/libslic3r/PrintConfig.cpp:1919 msgid "Contact Z distance" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1900 +#: src/libslic3r/PrintConfig.cpp:1921 msgid "" "The vertical distance between object and support material interface. Setting " "this to 0 will also prevent Slic3r from using bridge flow and speed for the " "first object layer." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1907 +#: src/libslic3r/PrintConfig.cpp:1928 msgid "0 (soluble)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1908 +#: src/libslic3r/PrintConfig.cpp:1929 msgid "0.2 (detachable)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1913 +#: src/libslic3r/PrintConfig.cpp:1934 msgid "Enforce support for the first" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1915 +#: src/libslic3r/PrintConfig.cpp:1936 msgid "" "Generate support material for the specified number of layers counting from " "bottom, regardless of whether normal support material is enabled or not and " @@ -7959,21 +8447,21 @@ msgid "" "of objects having a very thin or poor footprint on the build plate." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1920 +#: src/libslic3r/PrintConfig.cpp:1941 msgid "Enforce support for the first n layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1926 +#: src/libslic3r/PrintConfig.cpp:1947 msgid "Support material/raft/skirt extruder" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1928 +#: src/libslic3r/PrintConfig.cpp:1949 msgid "" "The extruder to use when printing support material, raft and skirt (1+, 0 to " "use the current extruder to minimize tool changes)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1937 +#: src/libslic3r/PrintConfig.cpp:1958 msgid "" "Set this to a non-zero value to set a manual extrusion width for support " "material. If left zero, default extrusion width will be used if set, " @@ -7981,89 +8469,89 @@ msgid "" "example 90%) it will be computed over layer height." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1946 +#: src/libslic3r/PrintConfig.cpp:1967 msgid "Interface loops" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1948 +#: src/libslic3r/PrintConfig.cpp:1969 msgid "" "Cover the top contact layer of the supports with loops. Disabled by default." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1953 +#: src/libslic3r/PrintConfig.cpp:1974 msgid "Support material/raft interface extruder" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1955 +#: src/libslic3r/PrintConfig.cpp:1976 msgid "" "The extruder to use when printing support material interface (1+, 0 to use " "the current extruder to minimize tool changes). This affects raft too." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1962 +#: src/libslic3r/PrintConfig.cpp:1983 msgid "Interface layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1964 +#: src/libslic3r/PrintConfig.cpp:1985 msgid "" "Number of interface layers to insert between the object(s) and support " "material." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1971 +#: src/libslic3r/PrintConfig.cpp:1992 msgid "Interface pattern spacing" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1973 +#: src/libslic3r/PrintConfig.cpp:1994 msgid "Spacing between interface lines. Set zero to get a solid interface." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1982 +#: src/libslic3r/PrintConfig.cpp:2003 msgid "" "Speed for printing support material interface layers. If expressed as " "percentage (for example 50%) it will be calculated over support material " "speed." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1991 +#: src/libslic3r/PrintConfig.cpp:2012 msgid "Pattern" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1993 +#: src/libslic3r/PrintConfig.cpp:2014 msgid "Pattern used to generate support material." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1999 +#: src/libslic3r/PrintConfig.cpp:2020 msgid "Rectilinear grid" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2005 +#: src/libslic3r/PrintConfig.cpp:2026 msgid "Pattern spacing" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2007 +#: src/libslic3r/PrintConfig.cpp:2028 msgid "Spacing between support material lines." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2016 +#: src/libslic3r/PrintConfig.cpp:2037 msgid "Speed for printing support material." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2023 +#: src/libslic3r/PrintConfig.cpp:2044 msgid "Synchronize with object layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2025 +#: src/libslic3r/PrintConfig.cpp:2046 msgid "" "Synchronize support layers with the object print layers. This is useful with " "multi-material printers, where the extruder switch is expensive." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2031 +#: src/libslic3r/PrintConfig.cpp:2052 msgid "Overhang threshold" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2033 +#: src/libslic3r/PrintConfig.cpp:2054 msgid "" "Support material will not be generated for overhangs whose slope angle (90° " "= vertical) is above the given threshold. In other words, this value " @@ -8072,43 +8560,43 @@ msgid "" "detection (recommended)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2045 +#: src/libslic3r/PrintConfig.cpp:2066 msgid "With sheath around the support" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2047 +#: src/libslic3r/PrintConfig.cpp:2068 msgid "" "Add a sheath (a single perimeter line) around the base support. This makes " "the support more reliable, but also more difficult to remove." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2054 +#: src/libslic3r/PrintConfig.cpp:2075 msgid "" "Extruder temperature for layers after the first one. Set this to zero to " "disable temperature control commands in the output." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2062 +#: src/libslic3r/PrintConfig.cpp:2083 msgid "Detect thin walls" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2064 +#: src/libslic3r/PrintConfig.cpp:2085 msgid "" "Detect single-width walls (parts where two extrusions don't fit and we need " "to collapse them into a single trace)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2070 +#: src/libslic3r/PrintConfig.cpp:2091 msgid "Threads" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2071 +#: src/libslic3r/PrintConfig.cpp:2092 msgid "" "Threads are used to parallelize long-running tasks. Optimal threads number " "is slightly above the number of available cores/processors." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2083 +#: src/libslic3r/PrintConfig.cpp:2104 msgid "" "This custom code is inserted before every toolchange. Placeholder variables " "for all PrusaSlicer settings as well as {previous_extruder} and " @@ -8118,7 +8606,7 @@ msgid "" "behaviour both before and after the toolchange." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2096 +#: src/libslic3r/PrintConfig.cpp:2117 msgid "" "Set this to a non-zero value to set a manual extrusion width for infill for " "top surfaces. You may want to use thinner extrudates to fill all narrow " @@ -8127,7 +8615,7 @@ msgid "" "percentage (for example 90%) it will be computed over layer height." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2108 +#: src/libslic3r/PrintConfig.cpp:2129 msgid "" "Speed for printing top solid layers (it only applies to the uppermost " "external layers and not to their internal solid layers). You may want to " @@ -8136,43 +8624,54 @@ msgid "" "for auto." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2123 +#: src/libslic3r/PrintConfig.cpp:2144 msgid "Number of solid layers to generate on top surfaces." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2124 +#: src/libslic3r/PrintConfig.cpp:2145 msgid "Top solid layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2130 +#: src/libslic3r/PrintConfig.cpp:2153 +msgid "" +"The number of top solid layers is increased above top_solid_layers if " +"necessary to satisfy minimum thickness of top shell. This is useful to " +"prevent pillowing effect when printing with variable layer height." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2156 +msgid "Minimum top shell thickness" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2163 msgid "Speed for travel moves (jumps between distant extrusion points)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2138 +#: src/libslic3r/PrintConfig.cpp:2171 msgid "Use firmware retraction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2139 +#: src/libslic3r/PrintConfig.cpp:2172 msgid "" "This experimental setting uses G10 and G11 commands to have the firmware " "handle the retraction. This is only supported in recent Marlin." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2145 +#: src/libslic3r/PrintConfig.cpp:2178 msgid "Use relative E distances" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2146 +#: src/libslic3r/PrintConfig.cpp:2179 msgid "" "If your firmware requires relative E values, check this, otherwise leave it " "unchecked. Most firmwares use absolute values." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2152 +#: src/libslic3r/PrintConfig.cpp:2185 msgid "Use volumetric E" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2153 +#: src/libslic3r/PrintConfig.cpp:2186 msgid "" "This experimental setting uses outputs the E values in cubic millimeters " "instead of linear millimeters. If your firmware doesn't already know " @@ -8182,127 +8681,127 @@ msgid "" "only supported in recent Marlin." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2163 +#: src/libslic3r/PrintConfig.cpp:2196 msgid "Enable variable layer height feature" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2164 +#: src/libslic3r/PrintConfig.cpp:2197 msgid "" "Some printers or printer setups may have difficulties printing with a " "variable layer height. Enabled by default." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2170 +#: src/libslic3r/PrintConfig.cpp:2203 msgid "Wipe while retracting" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2171 +#: src/libslic3r/PrintConfig.cpp:2204 msgid "" "This flag will move the nozzle while retracting to minimize the possible " "blob on leaky extruders." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2178 +#: src/libslic3r/PrintConfig.cpp:2211 msgid "" "Multi material printers may need to prime or purge extruders on tool " "changes. Extrude the excess material into the wipe tower." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2184 +#: src/libslic3r/PrintConfig.cpp:2217 msgid "Purging volumes - load/unload volumes" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2185 +#: src/libslic3r/PrintConfig.cpp:2218 msgid "" "This vector saves required volumes to change from/to each tool used on the " "wipe tower. These values are used to simplify creation of the full purging " "volumes below." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2191 +#: src/libslic3r/PrintConfig.cpp:2224 msgid "Purging volumes - matrix" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2192 +#: src/libslic3r/PrintConfig.cpp:2225 msgid "" "This matrix describes volumes (in cubic milimetres) required to purge the " "new filament on the wipe tower for any given pair of tools." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2201 +#: src/libslic3r/PrintConfig.cpp:2234 msgid "Position X" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2202 +#: src/libslic3r/PrintConfig.cpp:2235 msgid "X coordinate of the left front corner of a wipe tower" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2208 +#: src/libslic3r/PrintConfig.cpp:2241 msgid "Position Y" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2209 +#: src/libslic3r/PrintConfig.cpp:2242 msgid "Y coordinate of the left front corner of a wipe tower" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2216 +#: src/libslic3r/PrintConfig.cpp:2249 msgid "Width of a wipe tower" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2222 +#: src/libslic3r/PrintConfig.cpp:2255 msgid "Wipe tower rotation angle" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2223 +#: src/libslic3r/PrintConfig.cpp:2256 msgid "Wipe tower rotation angle with respect to x-axis." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2230 +#: src/libslic3r/PrintConfig.cpp:2263 msgid "Wipe into this object's infill" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2231 +#: src/libslic3r/PrintConfig.cpp:2264 msgid "" "Purging after toolchange will done inside this object's infills. This lowers " "the amount of waste but may result in longer print time due to additional " "travel moves." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2238 +#: src/libslic3r/PrintConfig.cpp:2271 msgid "Wipe into this object" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2239 +#: src/libslic3r/PrintConfig.cpp:2272 msgid "" "Object will be used to purge the nozzle after a toolchange to save material " "that would otherwise end up in the wipe tower and decrease print time. " "Colours of the objects will be mixed as a result." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2245 +#: src/libslic3r/PrintConfig.cpp:2278 msgid "Maximal bridging distance" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2246 +#: src/libslic3r/PrintConfig.cpp:2279 msgid "Maximal distance between supports on sparse infill sections." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2252 +#: src/libslic3r/PrintConfig.cpp:2285 msgid "XY Size Compensation" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2254 +#: src/libslic3r/PrintConfig.cpp:2287 msgid "" "The object will be grown/shrunk in the XY plane by the configured value " "(negative = inwards, positive = outwards). This might be useful for fine-" "tuning hole sizes." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2262 +#: src/libslic3r/PrintConfig.cpp:2295 msgid "Z offset" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2263 +#: src/libslic3r/PrintConfig.cpp:2296 msgid "" "This value will be added (or subtracted) from all the Z coordinates in the " "output G-code. It is used to compensate for bad Z endstop position: for " @@ -8310,389 +8809,389 @@ msgid "" "print bed, set this to -0.3 (or fix your endstop)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2330 +#: src/libslic3r/PrintConfig.cpp:2363 msgid "Display width" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2331 +#: src/libslic3r/PrintConfig.cpp:2364 msgid "Width of the display" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2336 +#: src/libslic3r/PrintConfig.cpp:2369 msgid "Display height" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2337 +#: src/libslic3r/PrintConfig.cpp:2370 msgid "Height of the display" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2342 +#: src/libslic3r/PrintConfig.cpp:2375 msgid "Number of pixels in" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2344 +#: src/libslic3r/PrintConfig.cpp:2377 msgid "Number of pixels in X" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2350 +#: src/libslic3r/PrintConfig.cpp:2383 msgid "Number of pixels in Y" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2355 +#: src/libslic3r/PrintConfig.cpp:2388 msgid "Display horizontal mirroring" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2356 +#: src/libslic3r/PrintConfig.cpp:2389 msgid "Mirror horizontally" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2357 +#: src/libslic3r/PrintConfig.cpp:2390 msgid "Enable horizontal mirroring of output images" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2362 +#: src/libslic3r/PrintConfig.cpp:2395 msgid "Display vertical mirroring" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2363 +#: src/libslic3r/PrintConfig.cpp:2396 msgid "Mirror vertically" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2364 +#: src/libslic3r/PrintConfig.cpp:2397 msgid "Enable vertical mirroring of output images" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2369 +#: src/libslic3r/PrintConfig.cpp:2402 msgid "Display orientation" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2370 +#: src/libslic3r/PrintConfig.cpp:2403 msgid "" "Set the actual LCD display orientation inside the SLA printer. Portrait mode " "will flip the meaning of display width and height parameters and the output " "images will be rotated by 90 degrees." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2376 +#: src/libslic3r/PrintConfig.cpp:2409 msgid "Landscape" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2377 +#: src/libslic3r/PrintConfig.cpp:2410 msgid "Portrait" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2382 +#: src/libslic3r/PrintConfig.cpp:2415 msgid "Fast" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2383 +#: src/libslic3r/PrintConfig.cpp:2416 msgid "Fast tilt" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2384 +#: src/libslic3r/PrintConfig.cpp:2417 msgid "Time of the fast tilt" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2391 +#: src/libslic3r/PrintConfig.cpp:2424 msgid "Slow" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2392 +#: src/libslic3r/PrintConfig.cpp:2425 msgid "Slow tilt" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2393 +#: src/libslic3r/PrintConfig.cpp:2426 msgid "Time of the slow tilt" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2400 +#: src/libslic3r/PrintConfig.cpp:2433 msgid "Area fill" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2401 +#: src/libslic3r/PrintConfig.cpp:2434 msgid "" "The percentage of the bed area. \n" "If the print area exceeds the specified value, \n" "then a slow tilt will be used, otherwise - a fast tilt" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2408 src/libslic3r/PrintConfig.cpp:2409 -#: src/libslic3r/PrintConfig.cpp:2410 +#: src/libslic3r/PrintConfig.cpp:2441 src/libslic3r/PrintConfig.cpp:2442 +#: src/libslic3r/PrintConfig.cpp:2443 msgid "Printer scaling correction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2416 src/libslic3r/PrintConfig.cpp:2417 +#: src/libslic3r/PrintConfig.cpp:2449 src/libslic3r/PrintConfig.cpp:2450 msgid "Printer absolute correction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2418 +#: src/libslic3r/PrintConfig.cpp:2451 msgid "" "Will inflate or deflate the sliced 2D polygons according to the sign of the " "correction." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2424 src/libslic3r/PrintConfig.cpp:2425 +#: src/libslic3r/PrintConfig.cpp:2457 src/libslic3r/PrintConfig.cpp:2458 msgid "Printer gamma correction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2426 +#: src/libslic3r/PrintConfig.cpp:2459 msgid "" "This will apply a gamma correction to the rasterized 2D polygons. A gamma " "value of zero means thresholding with the threshold in the middle. This " "behaviour eliminates antialiasing without losing holes in polygons." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2438 src/libslic3r/PrintConfig.cpp:2439 +#: src/libslic3r/PrintConfig.cpp:2471 src/libslic3r/PrintConfig.cpp:2472 msgid "SLA material type" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2450 src/libslic3r/PrintConfig.cpp:2451 +#: src/libslic3r/PrintConfig.cpp:2483 src/libslic3r/PrintConfig.cpp:2484 msgid "Initial layer height" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2457 src/libslic3r/PrintConfig.cpp:2458 +#: src/libslic3r/PrintConfig.cpp:2490 src/libslic3r/PrintConfig.cpp:2491 msgid "Bottle volume" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2459 +#: src/libslic3r/PrintConfig.cpp:2492 msgid "ml" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2464 src/libslic3r/PrintConfig.cpp:2465 +#: src/libslic3r/PrintConfig.cpp:2497 src/libslic3r/PrintConfig.cpp:2498 msgid "Bottle weight" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2466 +#: src/libslic3r/PrintConfig.cpp:2499 msgid "kg" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2473 +#: src/libslic3r/PrintConfig.cpp:2506 msgid "g/ml" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2480 +#: src/libslic3r/PrintConfig.cpp:2513 msgid "money/bottle" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2485 +#: src/libslic3r/PrintConfig.cpp:2518 msgid "Faded layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2486 +#: src/libslic3r/PrintConfig.cpp:2519 msgid "" "Number of the layers needed for the exposure time fade from initial exposure " "time to the exposure time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2493 src/libslic3r/PrintConfig.cpp:2494 +#: src/libslic3r/PrintConfig.cpp:2526 src/libslic3r/PrintConfig.cpp:2527 msgid "Minimum exposure time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2501 src/libslic3r/PrintConfig.cpp:2502 +#: src/libslic3r/PrintConfig.cpp:2534 src/libslic3r/PrintConfig.cpp:2535 msgid "Maximum exposure time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2509 src/libslic3r/PrintConfig.cpp:2510 +#: src/libslic3r/PrintConfig.cpp:2542 src/libslic3r/PrintConfig.cpp:2543 msgid "Exposure time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2516 src/libslic3r/PrintConfig.cpp:2517 +#: src/libslic3r/PrintConfig.cpp:2549 src/libslic3r/PrintConfig.cpp:2550 msgid "Minimum initial exposure time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2524 src/libslic3r/PrintConfig.cpp:2525 +#: src/libslic3r/PrintConfig.cpp:2557 src/libslic3r/PrintConfig.cpp:2558 msgid "Maximum initial exposure time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2532 src/libslic3r/PrintConfig.cpp:2533 +#: src/libslic3r/PrintConfig.cpp:2565 src/libslic3r/PrintConfig.cpp:2566 msgid "Initial exposure time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2539 src/libslic3r/PrintConfig.cpp:2540 +#: src/libslic3r/PrintConfig.cpp:2572 src/libslic3r/PrintConfig.cpp:2573 msgid "Correction for expansion" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2546 +#: src/libslic3r/PrintConfig.cpp:2579 msgid "SLA print material notes" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2547 +#: src/libslic3r/PrintConfig.cpp:2580 msgid "You can put your notes regarding the SLA print material here." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2559 src/libslic3r/PrintConfig.cpp:2570 +#: src/libslic3r/PrintConfig.cpp:2592 src/libslic3r/PrintConfig.cpp:2603 msgid "Default SLA material profile" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2581 +#: src/libslic3r/PrintConfig.cpp:2614 msgid "Generate supports" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2583 +#: src/libslic3r/PrintConfig.cpp:2616 msgid "Generate supports for the models" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2588 +#: src/libslic3r/PrintConfig.cpp:2621 msgid "Support head front diameter" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2590 +#: src/libslic3r/PrintConfig.cpp:2623 msgid "Diameter of the pointing side of the head" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2597 +#: src/libslic3r/PrintConfig.cpp:2630 msgid "Support head penetration" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2599 +#: src/libslic3r/PrintConfig.cpp:2632 msgid "How much the pinhead has to penetrate the model surface" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2606 +#: src/libslic3r/PrintConfig.cpp:2639 msgid "Support head width" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2608 +#: src/libslic3r/PrintConfig.cpp:2641 msgid "Width from the back sphere center to the front sphere center" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2616 +#: src/libslic3r/PrintConfig.cpp:2649 msgid "Support pillar diameter" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2618 +#: src/libslic3r/PrintConfig.cpp:2651 msgid "Diameter in mm of the support pillars" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2626 +#: src/libslic3r/PrintConfig.cpp:2659 msgid "Support pillar connection mode" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2627 +#: src/libslic3r/PrintConfig.cpp:2660 msgid "" "Controls the bridge type between two neighboring pillars. Can be zig-zag, " "cross (double zig-zag) or dynamic which will automatically switch between " "the first two depending on the distance of the two pillars." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2635 +#: src/libslic3r/PrintConfig.cpp:2668 msgid "Zig-Zag" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2636 +#: src/libslic3r/PrintConfig.cpp:2669 msgid "Cross" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2637 +#: src/libslic3r/PrintConfig.cpp:2670 msgid "Dynamic" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2649 +#: src/libslic3r/PrintConfig.cpp:2682 msgid "Pillar widening factor" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2651 +#: src/libslic3r/PrintConfig.cpp:2684 msgid "" "Merging bridges or pillars into another pillars can increase the radius. " "Zero means no increase, one means full increase." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2660 +#: src/libslic3r/PrintConfig.cpp:2693 msgid "Support base diameter" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2662 +#: src/libslic3r/PrintConfig.cpp:2695 msgid "Diameter in mm of the pillar base" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2670 +#: src/libslic3r/PrintConfig.cpp:2703 msgid "Support base height" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2672 +#: src/libslic3r/PrintConfig.cpp:2705 msgid "The height of the pillar base cone" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2679 +#: src/libslic3r/PrintConfig.cpp:2712 msgid "Support base safety distance" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2682 +#: src/libslic3r/PrintConfig.cpp:2715 msgid "" "The minimum distance of the pillar base from the model in mm. Makes sense in " "zero elevation mode where a gap according to this parameter is inserted " "between the model and the pad." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2692 +#: src/libslic3r/PrintConfig.cpp:2725 msgid "Critical angle" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2694 +#: src/libslic3r/PrintConfig.cpp:2727 msgid "The default angle for connecting support sticks and junctions." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2702 +#: src/libslic3r/PrintConfig.cpp:2735 msgid "Max bridge length" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2704 +#: src/libslic3r/PrintConfig.cpp:2737 msgid "The max length of a bridge" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2711 +#: src/libslic3r/PrintConfig.cpp:2744 msgid "Max pillar linking distance" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2713 +#: src/libslic3r/PrintConfig.cpp:2746 msgid "" "The max distance of two pillars to get linked with each other. A zero value " "will prohibit pillar cascading." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2721 +#: src/libslic3r/PrintConfig.cpp:2754 msgid "Object elevation" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2723 +#: src/libslic3r/PrintConfig.cpp:2756 msgid "" "How much the supports should lift up the supported object. If \"Pad around " "object\" is enabled, this value is ignored." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2734 +#: src/libslic3r/PrintConfig.cpp:2767 msgid "This is a relative measure of support points density." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2740 +#: src/libslic3r/PrintConfig.cpp:2773 msgid "Minimal distance of the support points" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2742 +#: src/libslic3r/PrintConfig.cpp:2775 msgid "No support points will be placed closer than this threshold." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2748 +#: src/libslic3r/PrintConfig.cpp:2781 msgid "Use pad" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2750 +#: src/libslic3r/PrintConfig.cpp:2783 msgid "Add a pad underneath the supported model" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2755 +#: src/libslic3r/PrintConfig.cpp:2788 msgid "Pad wall thickness" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2757 +#: src/libslic3r/PrintConfig.cpp:2790 msgid "The thickness of the pad and its optional cavity walls." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2765 +#: src/libslic3r/PrintConfig.cpp:2798 msgid "Pad wall height" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2766 +#: src/libslic3r/PrintConfig.cpp:2799 msgid "" "Defines the pad cavity depth. Set to zero to disable the cavity. Be careful " "when enabling this feature, as some resins may produce an extreme suction " @@ -8700,373 +9199,404 @@ msgid "" "difficult." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2779 +#: src/libslic3r/PrintConfig.cpp:2812 msgid "Pad brim size" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2780 +#: src/libslic3r/PrintConfig.cpp:2813 msgid "How far should the pad extend around the contained geometry" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2790 +#: src/libslic3r/PrintConfig.cpp:2823 msgid "Max merge distance" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2792 +#: src/libslic3r/PrintConfig.cpp:2825 msgid "" "Some objects can get along with a few smaller pads instead of a single big " "one. This parameter defines how far the center of two smaller pads should " "be. If theyare closer, they will get merged into one pad." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2812 +#: src/libslic3r/PrintConfig.cpp:2845 msgid "Pad wall slope" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2814 +#: src/libslic3r/PrintConfig.cpp:2847 msgid "" "The slope of the pad wall relative to the bed plane. 90 degrees means " "straight walls." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2823 +#: src/libslic3r/PrintConfig.cpp:2856 msgid "Pad around object" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2825 +#: src/libslic3r/PrintConfig.cpp:2858 msgid "Create pad around object and ignore the support elevation" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2830 +#: src/libslic3r/PrintConfig.cpp:2863 msgid "Pad around object everywhere" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2832 +#: src/libslic3r/PrintConfig.cpp:2865 msgid "Force pad around object everywhere" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2837 +#: src/libslic3r/PrintConfig.cpp:2870 msgid "Pad object gap" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2839 +#: src/libslic3r/PrintConfig.cpp:2872 msgid "" "The gap between the object bottom and the generated pad in zero elevation " "mode." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2848 +#: src/libslic3r/PrintConfig.cpp:2881 msgid "Pad object connector stride" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2850 +#: src/libslic3r/PrintConfig.cpp:2883 msgid "" "Distance between two connector sticks which connect the object and the " "generated pad." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2857 +#: src/libslic3r/PrintConfig.cpp:2890 msgid "Pad object connector width" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2859 +#: src/libslic3r/PrintConfig.cpp:2892 msgid "" "Width of the connector sticks which connect the object and the generated pad." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2866 +#: src/libslic3r/PrintConfig.cpp:2899 msgid "Pad object connector penetration" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2869 +#: src/libslic3r/PrintConfig.cpp:2902 msgid "How much should the tiny connectors penetrate into the model body." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3247 +#: src/libslic3r/PrintConfig.cpp:2909 +msgid "Enable hollowing" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2911 +msgid "Hollow out a model to have an empty interior" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2916 +msgid "Hollowing thickness" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2918 +msgid "Minimum wall thickness of a hollowed model." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2926 +msgid "Hollowing accuracy" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2928 +msgid "" +"Performance vs accuracy of calculation. Lower values may produce unwanted " +"artifacts." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2935 +msgid "Hollowing closing distance" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3315 msgid "Export OBJ" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3248 +#: src/libslic3r/PrintConfig.cpp:3316 msgid "Export the model(s) as OBJ." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3259 +#: src/libslic3r/PrintConfig.cpp:3327 msgid "Export SLA" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3260 +#: src/libslic3r/PrintConfig.cpp:3328 msgid "Slice the model and export SLA printing layers as PNG." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3265 +#: src/libslic3r/PrintConfig.cpp:3333 msgid "Export 3MF" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3266 +#: src/libslic3r/PrintConfig.cpp:3334 msgid "Export the model(s) as 3MF." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3270 +#: src/libslic3r/PrintConfig.cpp:3338 msgid "Export AMF" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3271 +#: src/libslic3r/PrintConfig.cpp:3339 msgid "Export the model(s) as AMF." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3275 +#: src/libslic3r/PrintConfig.cpp:3343 msgid "Export STL" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3276 +#: src/libslic3r/PrintConfig.cpp:3344 msgid "Export the model(s) as STL." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3281 +#: src/libslic3r/PrintConfig.cpp:3349 msgid "Slice the model and export toolpaths as G-code." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3286 +#: src/libslic3r/PrintConfig.cpp:3354 msgid "Slice" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3287 +#: src/libslic3r/PrintConfig.cpp:3355 msgid "" "Slice the model as FFF or SLA based on the printer_technology configuration " "value." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3292 +#: src/libslic3r/PrintConfig.cpp:3360 msgid "Help" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3293 +#: src/libslic3r/PrintConfig.cpp:3361 msgid "Show this help." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3298 +#: src/libslic3r/PrintConfig.cpp:3366 msgid "Help (FFF options)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3299 +#: src/libslic3r/PrintConfig.cpp:3367 msgid "Show the full list of print/G-code configuration options." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3303 +#: src/libslic3r/PrintConfig.cpp:3371 msgid "Help (SLA options)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3304 +#: src/libslic3r/PrintConfig.cpp:3372 msgid "Show the full list of SLA print configuration options." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3308 +#: src/libslic3r/PrintConfig.cpp:3376 msgid "Output Model Info" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3309 +#: src/libslic3r/PrintConfig.cpp:3377 msgid "Write information about the model to the console." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3313 +#: src/libslic3r/PrintConfig.cpp:3381 msgid "Save config file" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3314 +#: src/libslic3r/PrintConfig.cpp:3382 msgid "Save configuration to the specified file." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3324 +#: src/libslic3r/PrintConfig.cpp:3392 msgid "Align XY" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3325 +#: src/libslic3r/PrintConfig.cpp:3393 msgid "Align the model to the given point." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3330 +#: src/libslic3r/PrintConfig.cpp:3398 msgid "Cut model at the given Z." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3351 +#: src/libslic3r/PrintConfig.cpp:3419 msgid "Center" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3352 +#: src/libslic3r/PrintConfig.cpp:3420 msgid "Center the print around the given center." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3356 +#: src/libslic3r/PrintConfig.cpp:3424 msgid "Don't arrange" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3357 +#: src/libslic3r/PrintConfig.cpp:3425 msgid "" "Do not rearrange the given models before merging and keep their original XY " "coordinates." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3360 +#: src/libslic3r/PrintConfig.cpp:3428 msgid "Duplicate" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3361 +#: src/libslic3r/PrintConfig.cpp:3429 msgid "Multiply copies by this factor." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3365 +#: src/libslic3r/PrintConfig.cpp:3433 msgid "Duplicate by grid" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3366 +#: src/libslic3r/PrintConfig.cpp:3434 msgid "Multiply copies by creating a grid." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3369 +#: src/libslic3r/PrintConfig.cpp:3437 msgid "Merge" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3370 +#: src/libslic3r/PrintConfig.cpp:3438 msgid "" "Arrange the supplied models in a plate and merge them in a single model in " "order to perform actions once." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3375 +#: src/libslic3r/PrintConfig.cpp:3443 msgid "" "Try to repair any non-manifold meshes (this option is implicitly added " "whenever we need to slice the model to perform the requested action)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3379 +#: src/libslic3r/PrintConfig.cpp:3447 msgid "Rotation angle around the Z axis in degrees." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3383 +#: src/libslic3r/PrintConfig.cpp:3451 msgid "Rotate around X" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3384 +#: src/libslic3r/PrintConfig.cpp:3452 msgid "Rotation angle around the X axis in degrees." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3388 +#: src/libslic3r/PrintConfig.cpp:3456 msgid "Rotate around Y" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3389 +#: src/libslic3r/PrintConfig.cpp:3457 msgid "Rotation angle around the Y axis in degrees." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3394 +#: src/libslic3r/PrintConfig.cpp:3462 msgid "Scaling factor or percentage." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3399 +#: src/libslic3r/PrintConfig.cpp:3467 msgid "" "Detect unconnected parts in the given model(s) and split them into separate " "objects." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3402 +#: src/libslic3r/PrintConfig.cpp:3470 msgid "Scale to Fit" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3403 +#: src/libslic3r/PrintConfig.cpp:3471 msgid "Scale to fit the given volume." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3412 +#: src/libslic3r/PrintConfig.cpp:3480 msgid "Ignore non-existent config files" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3413 +#: src/libslic3r/PrintConfig.cpp:3481 msgid "Do not fail if a file supplied to --load does not exist." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3416 +#: src/libslic3r/PrintConfig.cpp:3484 msgid "Load config file" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3417 +#: src/libslic3r/PrintConfig.cpp:3485 msgid "" "Load configuration from the specified file. It can be used more than once to " "load options from multiple files." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3420 +#: src/libslic3r/PrintConfig.cpp:3488 msgid "Output File" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3421 +#: src/libslic3r/PrintConfig.cpp:3489 msgid "" "The file where the output will be written (if not specified, it will be " "based on the input file)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3431 +#: src/libslic3r/PrintConfig.cpp:3499 msgid "Data directory" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3432 +#: src/libslic3r/PrintConfig.cpp:3500 msgid "" "Load and store settings at the given directory. This is useful for " "maintaining different profiles or including configurations from a network " "storage." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3435 +#: src/libslic3r/PrintConfig.cpp:3503 msgid "Logging level" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3436 +#: src/libslic3r/PrintConfig.cpp:3504 msgid "" -"Messages with severity lower or eqal to the loglevel will be printed out. 0:" -"trace, 1:debug, 2:info, 3:warning, 4:error, 5:fatal" +"Sets logging sensitivity. 0:fatal, 1:error, 2:warning, 3:info, 4:debug, 5:" +"trace\n" +"For example. loglevel=2 logs fatal, error and warning level messages." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3441 +#: src/libslic3r/PrintConfig.cpp:3510 msgid "Render with a software renderer" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3442 +#: src/libslic3r/PrintConfig.cpp:3511 msgid "" "Render with a software renderer. The bundled MESA software renderer is " "loaded instead of the default OpenGL driver." msgstr "" -#: src/libslic3r/PrintObject.cpp:106 +#: src/libslic3r/PrintObject.cpp:108 msgid "Processing triangulated mesh" msgstr "" -#: src/libslic3r/PrintObject.cpp:150 +#: src/libslic3r/PrintObject.cpp:152 msgid "Generating perimeters" msgstr "" -#: src/libslic3r/PrintObject.cpp:260 +#: src/libslic3r/PrintObject.cpp:255 msgid "Preparing infill" msgstr "" -#: src/libslic3r/PrintObject.cpp:400 +#: src/libslic3r/PrintObject.cpp:395 msgid "Generating support material" msgstr "" -#: src/libslic3r/GCode/PreviewData.cpp:362 +#: src/libslic3r/GCode/PreviewData.cpp:347 msgid "Height (mm)" msgstr "" -#: src/libslic3r/GCode/PreviewData.cpp:364 +#: src/libslic3r/GCode/PreviewData.cpp:349 msgid "Width (mm)" msgstr "" -#: src/libslic3r/GCode/PreviewData.cpp:366 +#: src/libslic3r/GCode/PreviewData.cpp:351 msgid "Speed (mm/s)" msgstr "" -#: src/libslic3r/GCode/PreviewData.cpp:368 +#: src/libslic3r/GCode/PreviewData.cpp:353 msgid "Fan Speed (%)" msgstr "" -#: src/libslic3r/GCode/PreviewData.cpp:370 +#: src/libslic3r/GCode/PreviewData.cpp:355 msgid "Volumetric flow rate (mm³/s)" msgstr "" diff --git a/resources/localization/list.txt b/resources/localization/list.txt index d632f0480a..3c2a956385 100644 --- a/resources/localization/list.txt +++ b/resources/localization/list.txt @@ -8,12 +8,15 @@ src/slic3r/GUI/ButtonsDescription.cpp src/slic3r/GUI/ConfigManipulation.cpp src/slic3r/GUI/ConfigSnapshotDialog.cpp src/slic3r/GUI/ConfigWizard.cpp +src/slic3r/GUI/DoubleSlider.cpp +src/slic3r/GUI/ExtruderSequenceDialog.cpp src/slic3r/GUI/Field.cpp src/slic3r/GUI/FirmwareDialog.cpp src/slic3r/GUI/GLCanvas3D.cpp src/slic3r/GUI/GLCanvas3DManager.cpp src/slic3r/GUI/Gizmos/GLGizmoCut.cpp src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp +src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp src/slic3r/GUI/Gizmos/GLGizmoMove.cpp src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp src/slic3r/GUI/Gizmos/GLGizmoScale.cpp @@ -26,10 +29,12 @@ src/slic3r/GUI/GUI_ObjectList.cpp src/slic3r/GUI/GUI_ObjectManipulation.cpp src/slic3r/GUI/GUI_ObjectSettings.cpp src/slic3r/GUI/GUI_Preview.cpp +src/slic3r/GUI/Job.hpp src/slic3r/GUI/KBShortcutsDialog.cpp src/slic3r/GUI/MainFrame.cpp src/slic3r/GUI/Mouse3DController.cpp src/slic3r/GUI/MsgDialog.cpp +src/slic3r/GUI/ObjectDataViewModel.cpp src/slic3r/GUI/OptionsGroup.cpp src/slic3r/GUI/Plater.cpp src/slic3r/GUI/Preferences.cpp @@ -46,23 +51,23 @@ src/slic3r/GUI/Tab.hpp src/slic3r/GUI/UpdateDialogs.cpp src/slic3r/GUI/WipeTowerDialog.cpp src/slic3r/GUI/wxExtensions.cpp -src/slic3r/GUI/DoubleSlider.cpp -src/slic3r/GUI/ObjectDataViewModel.cpp -src/slic3r/GUI/ExtruderSequenceDialog.cpp -src/slic3r/Utils/Duet.cpp -src/slic3r/Utils/OctoPrint.cpp -src/slic3r/Utils/FlashAir.cpp src/slic3r/Utils/AstroBox.cpp -src/slic3r/Utils/PresetUpdater.cpp +src/slic3r/Utils/Duet.cpp src/slic3r/Utils/FixModelByWin10.cpp -src/libslic3r/SLA/SLAPad.cpp +src/slic3r/Utils/FlashAir.cpp +src/slic3r/Utils/OctoPrint.cpp +src/slic3r/Utils/PresetUpdater.cpp +src/libslic3r/SLA/Pad.cpp +src/libslic3r/SLA/Hollowing.cpp src/libslic3r/Zipper.cpp src/libslic3r/GCode.cpp src/libslic3r/ExtrusionEntity.cpp +src/libslic3r/Flow.cpp src/libslic3r/Format/3mf.cpp src/libslic3r/Format/AMF.cpp src/libslic3r/Print.cpp src/libslic3r/SLAPrint.cpp +src/libslic3r/SLAPrintSteps.cpp src/libslic3r/PrintBase.cpp src/libslic3r/PrintConfig.cpp src/libslic3r/PrintObject.cpp diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index b3b686f03a..37602b2315 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -2934,7 +2934,7 @@ void PrintConfigDef::init_sla_params() def = this->add("hollowing_closing_distance", coFloat); def->label = L("Hollowing closing distance"); def->category = L("Hollowing"); - def->tooltip = L(""); + def->tooltip = "";//L(""); def->min = 0; def->max = 10; def->mode = comExpert; From a1c0a29af21b34d06baec2f07e023ee0fb81b66a Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Fri, 7 Feb 2020 09:49:48 +0100 Subject: [PATCH 273/336] ENABLE_BACKWARD_COMPATIBLE_RELOAD_FROM_DISK - Fixed inconsistencies for splitted and cutted objects --- src/libslic3r/Model.cpp | 4 ++-- src/slic3r/GUI/GUI_ObjectList.cpp | 14 ++++---------- src/slic3r/GUI/Plater.cpp | 25 +++++++------------------ src/slic3r/GUI/Plater.hpp | 2 -- 4 files changed, 13 insertions(+), 32 deletions(-) diff --git a/src/libslic3r/Model.cpp b/src/libslic3r/Model.cpp index d73d8148b0..b3a18f26bb 100644 --- a/src/libslic3r/Model.cpp +++ b/src/libslic3r/Model.cpp @@ -1116,7 +1116,7 @@ ModelObjectPtrs ModelObject::cut(size_t instance, coordf_t z, bool keep_upper, b upper->sla_drain_holes.clear(); upper->sla_points_status = sla::PointsStatus::NoPoints; upper->clear_volumes(); - upper->input_file = ""; + upper->input_file.clear(); } if (keep_lower) { @@ -1125,7 +1125,7 @@ ModelObjectPtrs ModelObject::cut(size_t instance, coordf_t z, bool keep_upper, b lower->sla_drain_holes.clear(); lower->sla_points_status = sla::PointsStatus::NoPoints; lower->clear_volumes(); - lower->input_file = ""; + lower->input_file.clear(); } // Because transformations are going to be applied to meshes directly, diff --git a/src/slic3r/GUI/GUI_ObjectList.cpp b/src/slic3r/GUI/GUI_ObjectList.cpp index f4c2c7093a..6e5c601d3e 100644 --- a/src/slic3r/GUI/GUI_ObjectList.cpp +++ b/src/slic3r/GUI/GUI_ObjectList.cpp @@ -1651,14 +1651,9 @@ void ObjectList::append_menu_item_export_stl(wxMenu* menu) const void ObjectList::append_menu_item_reload_from_disk(wxMenu* menu) const { -#if ENABLE_BACKWARD_COMPATIBLE_RELOAD_FROM_DISK - append_menu_item(menu, wxID_ANY, _(L("Reload from disk")), _(L("Reload the selected volumes from disk")), - [this](wxCommandEvent&) { wxGetApp().plater()->reload_from_disk(); }, "", menu); -#else append_menu_item(menu, wxID_ANY, _(L("Reload from disk")), _(L("Reload the selected volumes from disk")), [this](wxCommandEvent&) { wxGetApp().plater()->reload_from_disk(); }, "", menu, []() { return wxGetApp().plater()->can_reload_from_disk(); }, wxGetApp().plater()); -#endif // ENABLE_BACKWARD_COMPATIBLE_RELOAD_FROM_DISK } void ObjectList::append_menu_item_change_extruder(wxMenu* menu) const @@ -2275,6 +2270,10 @@ void ObjectList::split() add_settings_item(vol_item, &volume->config); } +#if ENABLE_BACKWARD_COMPATIBLE_RELOAD_FROM_DISK + model_object->input_file.clear(); +#endif // ENABLE_BACKWARD_COMPATIBLE_RELOAD_FROM_DISK + if (parent == item) Expand(parent); @@ -3928,15 +3927,10 @@ void ObjectList::show_multi_selection_menu() _(L("Select extruder number for selected objects and/or parts")), [this](wxCommandEvent&) { extruder_selection(); }, "", menu); -#if ENABLE_BACKWARD_COMPATIBLE_RELOAD_FROM_DISK - append_menu_item(menu, wxID_ANY, _(L("Reload from disk")), _(L("Reload the selected volumes from disk")), - [this](wxCommandEvent&) { wxGetApp().plater()->reload_from_disk(); }, "", menu); -#else append_menu_item(menu, wxID_ANY, _(L("Reload from disk")), _(L("Reload the selected volumes from disk")), [this](wxCommandEvent&) { wxGetApp().plater()->reload_from_disk(); }, "", menu, []() { return wxGetApp().plater()->can_reload_from_disk(); }, wxGetApp().plater()); -#endif // ENABLE_BACKWARD_COMPATIBLE_RELOAD_FROM_DISK wxGetApp().plater()->PopupMenu(menu); } diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 8438e4bff0..9daa28bb28 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -1923,9 +1923,7 @@ struct Plater::priv bool can_fix_through_netfabb() const; bool can_set_instance_to_object() const; bool can_mirror() const; -#if !ENABLE_BACKWARD_COMPATIBLE_RELOAD_FROM_DISK bool can_reload_from_disk() const; -#endif // !ENABLE_BACKWARD_COMPATIBLE_RELOAD_FROM_DISK #if ENABLE_THUMBNAIL_GENERATOR void generate_thumbnail(ThumbnailData& data, unsigned int w, unsigned int h, bool printable_only, bool parts_only, bool show_bed, bool transparent_background); @@ -3259,7 +3257,7 @@ void Plater::priv::reload_from_disk() missing_input_paths.push_back(volume->source.input_file); } #if ENABLE_BACKWARD_COMPATIBLE_RELOAD_FROM_DISK - else if (!volume->name.empty()) + else if (!object->input_file.empty() && !volume->name.empty()) missing_input_paths.push_back(volume->name); #endif // ENABLE_BACKWARD_COMPATIBLE_RELOAD_FROM_DISK } @@ -3942,13 +3940,8 @@ bool Plater::priv::init_common_menu(wxMenu* menu, const bool is_part/* = false*/ append_menu_item(menu, wxID_ANY, _(L("Delete")) + "\tDel", _(L("Remove the selected object")), [this](wxCommandEvent&) { q->remove_selected(); }, "delete", nullptr, [this]() { return can_delete(); }, q); -#if ENABLE_BACKWARD_COMPATIBLE_RELOAD_FROM_DISK - append_menu_item(menu, wxID_ANY, _(L("Reload from disk")), _(L("Reload the selected volumes from disk")), - [this](wxCommandEvent&) { q->reload_from_disk(); }, "", menu); -#else append_menu_item(menu, wxID_ANY, _(L("Reload from disk")), _(L("Reload the selected volumes from disk")), [this](wxCommandEvent&) { q->reload_from_disk(); }, "", menu, [this]() { return can_reload_from_disk(); }, q); -#endif // ENABLE_BACKWARD_COMPATIBLE_RELOAD_FROM_DISK sidebar->obj_list()->append_menu_item_export_stl(menu); } @@ -3976,13 +3969,8 @@ bool Plater::priv::init_common_menu(wxMenu* menu, const bool is_part/* = false*/ wxMenuItem* menu_item_printable = sidebar->obj_list()->append_menu_item_printable(menu, q); menu->AppendSeparator(); -#if ENABLE_BACKWARD_COMPATIBLE_RELOAD_FROM_DISK - append_menu_item(menu, wxID_ANY, _(L("Reload from disk")), _(L("Reload the selected object from disk")), - [this](wxCommandEvent&) { reload_from_disk(); }, "", nullptr); -#else append_menu_item(menu, wxID_ANY, _(L("Reload from disk")), _(L("Reload the selected object from disk")), [this](wxCommandEvent&) { reload_from_disk(); }, "", nullptr, [this]() { return can_reload_from_disk(); }, q); -#endif // ENABLE_BACKWARD_COMPATIBLE_RELOAD_FROM_DISK append_menu_item(menu, wxID_ANY, _(L("Export as STL")) + dots, _(L("Export the selected object as STL file")), [this](wxCommandEvent&) { q->export_stl(false, true); }, "", nullptr, @@ -4162,7 +4150,6 @@ bool Plater::priv::can_mirror() const return get_selection().is_from_single_instance(); } -#if !ENABLE_BACKWARD_COMPATIBLE_RELOAD_FROM_DISK bool Plater::priv::can_reload_from_disk() const { // struct to hold selected ModelVolumes by their indices @@ -4199,16 +4186,20 @@ bool Plater::priv::can_reload_from_disk() const std::vector paths; for (const SelectedVolume& v : selected_volumes) { - const ModelVolume* volume = model.objects[v.object_idx]->volumes[v.volume_idx]; + const ModelObject* object = model.objects[v.object_idx]; + const ModelVolume* volume = object->volumes[v.volume_idx]; if (!volume->source.input_file.empty()) paths.push_back(volume->source.input_file); +#if ENABLE_BACKWARD_COMPATIBLE_RELOAD_FROM_DISK + else if (!object->input_file.empty() && !volume->name.empty()) + paths.push_back(volume->name); +#endif // ENABLE_BACKWARD_COMPATIBLE_RELOAD_FROM_DISK } std::sort(paths.begin(), paths.end()); paths.erase(std::unique(paths.begin(), paths.end()), paths.end()); return !paths.empty(); } -#endif // !ENABLE_BACKWARD_COMPATIBLE_RELOAD_FROM_DISK void Plater::priv::set_bed_shape(const Pointfs& shape, const std::string& custom_texture, const std::string& custom_model) { @@ -5709,9 +5700,7 @@ bool Plater::can_copy_to_clipboard() const bool Plater::can_undo() const { return p->undo_redo_stack().has_undo_snapshot(); } bool Plater::can_redo() const { return p->undo_redo_stack().has_redo_snapshot(); } -#if !ENABLE_BACKWARD_COMPATIBLE_RELOAD_FROM_DISK bool Plater::can_reload_from_disk() const { return p->can_reload_from_disk(); } -#endif // !ENABLE_BACKWARD_COMPATIBLE_RELOAD_FROM_DISK const UndoRedo::Stack& Plater::undo_redo_stack_main() const { return p->undo_redo_stack_main(); } void Plater::enter_gizmos_stack() { p->enter_gizmos_stack(); } void Plater::leave_gizmos_stack() { p->leave_gizmos_stack(); } diff --git a/src/slic3r/GUI/Plater.hpp b/src/slic3r/GUI/Plater.hpp index 3b5e9a3e34..3c1dde0f3f 100644 --- a/src/slic3r/GUI/Plater.hpp +++ b/src/slic3r/GUI/Plater.hpp @@ -277,9 +277,7 @@ public: bool can_copy_to_clipboard() const; bool can_undo() const; bool can_redo() const; -#if !ENABLE_BACKWARD_COMPATIBLE_RELOAD_FROM_DISK bool can_reload_from_disk() const; -#endif // !ENABLE_BACKWARD_COMPATIBLE_RELOAD_FROM_DISK void msw_rescale(); From 2fb1acd74b530c9b1cfd77ff5fd29896960b8189 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Fri, 7 Feb 2020 11:07:22 +0100 Subject: [PATCH 274/336] Add check for cereal library in CMake Fixes #3547, replaces #3613 --- CMakeLists.txt | 3 +-- cmake/modules/Findcereal.cmake | 26 ++++++++++++++++++++++++++ 2 files changed, 27 insertions(+), 2 deletions(-) create mode 100644 cmake/modules/Findcereal.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 878f2373ed..e4e686645f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -392,8 +392,7 @@ if (NOT GLEW_FOUND) endif () # Find the Cereal serialization library -add_library(cereal INTERFACE) -target_include_directories(cereal INTERFACE include) +find_package(cereal REQUIRED) # l10n set(L10N_DIR "${SLIC3R_RESOURCES_DIR}/localization") diff --git a/cmake/modules/Findcereal.cmake b/cmake/modules/Findcereal.cmake new file mode 100644 index 0000000000..b4829757e0 --- /dev/null +++ b/cmake/modules/Findcereal.cmake @@ -0,0 +1,26 @@ +set(_q "") +if(${CMAKE_FIND_PACKAGE_NAME}_FIND_QUIETLY) + set(_q QUIET) + set(_quietly TRUE) +endif() +find_package(${CMAKE_FIND_PACKAGE_NAME} ${${CMAKE_FIND_PACKAGE_NAME}_FIND_VERSION} CONFIG ${_q}) + +if (NOT ${CMAKE_FIND_PACKAGE_NAME}_FOUND) + # Fall-back solution to find the Cereal serialization library header file + include(CheckIncludeFileCXX) + add_library(cereal INTERFACE) + target_include_directories(cereal INTERFACE include) + + if (_quietly) + set(CMAKE_REQUIRED_QUIET ON) + endif() + CHECK_INCLUDE_FILE_CXX("cereal/cereal.hpp" HAVE_CEREAL_H) + + if (NOT HAVE_CEREAL_H) + if (${CMAKE_FIND_PACKAGE_NAME}_FIND_REQUIRED) + message(FATAL_ERROR "Cereal library not found. Please install the dependency.") + elseif(NOT _quietly) + message(WARNING "Cereal library not found.") + endif() + endif () +endif() From 15343847bc54060bfcb8be8ee7d66c2c09536cc4 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Fri, 7 Feb 2020 11:15:01 +0100 Subject: [PATCH 275/336] Fix build on Win --- src/slic3r/GUI/MainFrame.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/slic3r/GUI/MainFrame.cpp b/src/slic3r/GUI/MainFrame.cpp index b730dc8238..bab831b20a 100644 --- a/src/slic3r/GUI/MainFrame.cpp +++ b/src/slic3r/GUI/MainFrame.cpp @@ -167,7 +167,7 @@ void MainFrame::update_title() build_id.erase(build_id.begin() + idx_plus, build_id.end()); #if defined(_WIN32) && ! defined(_WIN64) // People are using 32bit slicer on a 64bit machine by mistake. Make it explicit. - build_id += " 32 bit" + build_id += " 32 bit"; #endif } } From e66632a595f5591e87c5f6c4cb6ec82bb12b0574 Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Fri, 7 Feb 2020 14:03:55 +0100 Subject: [PATCH 276/336] Hollowing parameters should be labeled the same in the gizmo and in presets --- src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp | 41 ++++++++++++++----------- 1 file changed, 23 insertions(+), 18 deletions(-) diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp index 87a4960ee1..4590386922 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp @@ -676,6 +676,29 @@ void GLGizmoHollow::on_render_input_window(float x, float y, float bottom_limit) bool first_run = true; // This is a hack to redraw the button when all points are removed, // so it is not delayed until the background process finishes. + + std::vector opts_keys = {"hollowing_min_thickness", "hollowing_quality", "hollowing_closing_distance"}; + auto opts = get_config_options(opts_keys); + auto* offset_cfg = static_cast(opts[0].first); + float offset = offset_cfg->value; + double offset_min = opts[0].second->min; + double offset_max = opts[0].second->max; + + auto* quality_cfg = static_cast(opts[1].first); + float quality = quality_cfg->value; + double quality_min = opts[1].second->min; + double quality_max = opts[1].second->max; + + auto* closing_d_cfg = static_cast(opts[2].first); + float closing_d = closing_d_cfg->value; + double closing_d_min = opts[2].second->min; + double closing_d_max = opts[2].second->max; + + m_desc["offset"] = _(opts[0].second->label).ToUTF8() + wxString(":"); + m_desc["quality"] = _(opts[1].second->label).ToUTF8() + wxString(":"); + m_desc["closing_distance"] = _(opts[2].second->label).ToUTF8() + wxString(":"); + + RENDER_AGAIN: const float approx_height = m_imgui->scaled(20.0f); y = std::min(y, bottom_limit - approx_height); @@ -718,24 +741,6 @@ RENDER_AGAIN: m_imgui->disabled_begin(! m_enable_hollowing); - std::vector opts_keys = {"hollowing_min_thickness", "hollowing_quality", "hollowing_closing_distance"}; - auto opts = get_config_options(opts_keys); - auto* offset_cfg = static_cast(opts[0].first); - float offset = offset_cfg->value; - double offset_min = opts[0].second->min; - double offset_max = opts[0].second->max; - - auto* quality_cfg = static_cast(opts[1].first); - float quality = quality_cfg->value; - double quality_min = opts[1].second->min; - double quality_max = opts[1].second->max; - - auto* closing_d_cfg = static_cast(opts[2].first); - float closing_d = closing_d_cfg->value; - double closing_d_min = opts[2].second->min; - double closing_d_max = opts[2].second->max; - - m_imgui->text(m_desc.at("offset")); ImGui::SameLine(settings_sliders_left); ImGui::PushItemWidth(window_width - settings_sliders_left); From b8c898bf40fc1429aa5af39bb444e9456f28f8a1 Mon Sep 17 00:00:00 2001 From: bubnikv Date: Fri, 7 Feb 2020 14:10:18 +0100 Subject: [PATCH 277/336] Fixed a bug in validation of the FDM Print to check for extruder collisions against already printed objects: Rotation of an object was not being taken into account. Fixes #2450 PrusaSlicer 2.0 Sequential printing vs rotate object Fixes #3585 Always Sequential Printing Error (Regardless of setting, placement or object size) Fixed some collisions in sequential print just after arrangement by making the validation using a slightly lower extruder radius value than the arrangement. Refactored PrintObject coordinate system so that the PrintObject's coordinate system is always centered in respect to its ModelObject's geometries. This refactoring may improve path planning a bit and it may lower the requirements on bits representing Clipper coordinates by 1 bit. --- src/libslic3r/GCode.cpp | 7 +- src/libslic3r/Print.cpp | 118 +++++++++++++++++++------------- src/libslic3r/Print.hpp | 44 ++++++------ src/libslic3r/PrintObject.cpp | 70 +++++++++---------- src/libslic3r/SLAPrintSteps.cpp | 4 +- src/libslic3r/ShortestPath.cpp | 3 +- src/slic3r/GUI/GLCanvas3D.cpp | 2 +- xs/xsp/Print.xsp | 3 - 8 files changed, 135 insertions(+), 116 deletions(-) diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index 8e47615405..665f42d67c 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -1091,7 +1091,7 @@ namespace DoExport { static inline std::vector sort_object_instances_by_max_z(const Print &print) { std::vector objects(print.objects().begin(), print.objects().end()); - std::sort(objects.begin(), objects.end(), [](const PrintObject *po1, const PrintObject *po2) { return po1->size()(2) < po2->size()(2); }); + std::sort(objects.begin(), objects.end(), [](const PrintObject *po1, const PrintObject *po2) { return po1->height() < po2->height(); }); std::vector instances; instances.reserve(objects.size()); for (const PrintObject *object : objects) @@ -2616,8 +2616,9 @@ std::string GCode::extrude_loop(ExtrusionLoop loop, std::string description, dou } } else if (seam_position == spRear) { - last_pos = m_layer->object()->bounding_box().center(); - last_pos(1) += coord_t(3. * m_layer->object()->bounding_box().radius()); + // Object is centered around (0,0) in its current coordinate system. + last_pos.x() = 0; + last_pos.y() += coord_t(3. * m_layer->object()->bounding_box().radius()); last_pos_weight = 5.f; } diff --git a/src/libslic3r/Print.cpp b/src/libslic3r/Print.cpp index 6f61657a52..c869ad2984 100644 --- a/src/libslic3r/Print.cpp +++ b/src/libslic3r/Print.cpp @@ -462,7 +462,7 @@ static std::vector print_objects_from_model_object if (model_instance->is_printable()) { trafo.trafo = model_instance->get_matrix(); auto shift = Point::new_scale(trafo.trafo.data()[12], trafo.trafo.data()[13]); - // Set the Z axis of the transformation. + // Reset the XY axes of the transformation. trafo.trafo.data()[12] = 0; trafo.trafo.data()[13] = 0; // Search or insert a trafo. @@ -930,8 +930,7 @@ Print::ApplyStatus Print::apply(const Model &model, DynamicPrintConfig new_full_ if (old.empty()) { // Simple case, just generate new instances. for (PrintObjectTrafoAndInstances &print_instances : new_print_instances) { - PrintObject *print_object = new PrintObject(this, model_object, false); - print_object->set_trafo_and_instances(print_instances.trafo, std::move(print_instances.instances)); + PrintObject *print_object = new PrintObject(this, model_object, print_instances.trafo, std::move(print_instances.instances)); print_object->config_apply(config); print_objects_new.emplace_back(print_object); // print_object_status.emplace(PrintObjectStatus(print_object, PrintObjectStatus::New)); @@ -948,8 +947,7 @@ Print::ApplyStatus Print::apply(const Model &model, DynamicPrintConfig new_full_ for (; it_old != old.end() && transform3d_lower((*it_old)->trafo, new_instances.trafo); ++ it_old); if (it_old == old.end() || ! transform3d_equal((*it_old)->trafo, new_instances.trafo)) { // This is a new instance (or a set of instances with the same trafo). Just add it. - PrintObject *print_object = new PrintObject(this, model_object, false); - print_object->set_trafo_and_instances(new_instances.trafo, std::move(new_instances.instances)); + PrintObject *print_object = new PrintObject(this, model_object, new_instances.trafo, std::move(new_instances.instances)); print_object->config_apply(config); print_objects_new.emplace_back(print_object); // print_object_status.emplace(PrintObjectStatus(print_object, PrintObjectStatus::New)); @@ -1151,6 +1149,62 @@ bool Print::has_skirt() const || this->has_infinite_skirt(); } +static inline bool sequential_print_horizontal_clearance_valid(const Print &print) +{ + Polygons convex_hulls_other; + std::map map_model_object_to_convex_hull; + for (const PrintObject *print_object : print.objects()) { + assert(! print_object->model_object()->instances.empty()); + assert(! print_object->instances().empty()); + ObjectID model_object_id = print_object->model_object()->id(); + auto it_convex_hull = map_model_object_to_convex_hull.find(model_object_id); + // Get convex hull of all printable volumes assigned to this print object. + ModelInstance *model_instance0 = print_object->model_object()->instances.front(); + if (it_convex_hull == map_model_object_to_convex_hull.end()) { + // Calculate the convex hull of a printable object. + // Grow convex hull with the clearance margin. + // FIXME: Arrangement has different parameters for offsetting (jtMiter, limit 2) + // which causes that the warning will be showed after arrangement with the + // appropriate object distance. Even if I set this to jtMiter the warning still shows up. + it_convex_hull = map_model_object_to_convex_hull.emplace_hint(it_convex_hull, model_object_id, + offset(print_object->model_object()->convex_hull_2d( + Geometry::assemble_transform(Vec3d::Zero(), model_instance0->get_rotation(), model_instance0->get_scaling_factor(), model_instance0->get_mirror())), + // Shrink the extruder_clearance_radius a tiny bit, so that if the object arrangement algorithm placed the objects + // exactly by satisfying the extruder_clearance_radius, this test will not trigger collision. + float(scale_(0.5 * print.config().extruder_clearance_radius.value - EPSILON)), + jtRound, float(scale_(0.1))).front()); + } + // Make a copy, so it may be rotated for instances. + Polygon convex_hull0 = it_convex_hull->second; + double z_diff = Geometry::rotation_diff_z(model_instance0->get_rotation(), print_object->instances().front().model_instance->get_rotation()); + if (std::abs(z_diff) > EPSILON) + convex_hull0.rotate(z_diff); + // Now we check that no instance of convex_hull intersects any of the previously checked object instances. + for (const PrintInstance &instance : print_object->instances()) { + Polygon convex_hull = convex_hull0; + // instance.shift is a position of a centered object, while model object may not be centered. + // Conver the shift from the PrintObject's coordinates into ModelObject's coordinates by removing the centering offset. + convex_hull.translate(instance.shift - print_object->center_offset()); + if (! intersection(convex_hulls_other, convex_hull).empty()) + return false; + polygons_append(convex_hulls_other, convex_hull); + } + } + return true; +} + +static inline bool sequential_print_vertical_clearance_valid(const Print &print) +{ + std::vector print_instances_ordered = sort_object_instances_by_model_order(print); + // Ignore the last instance printed. + print_instances_ordered.pop_back(); + // Find the other highest instance. + auto it = std::max_element(print_instances_ordered.begin(), print_instances_ordered.end(), [](auto l, auto r) { + return l->print_object->height() < r->print_object->height(); + }); + return it == print_instances_ordered.end() || (*it)->print_object->height() < scale_(print.config().extruder_clearance_height.value); +} + // Precondition: Print::validate() requires the Print::apply() to be called its invocation. std::string Print::validate() const { @@ -1161,48 +1215,11 @@ std::string Print::validate() const return L("The supplied settings will cause an empty print."); if (m_config.complete_objects) { - // Check horizontal clearance. - { - Polygons convex_hulls_other; - for (const PrintObject *print_object : m_objects) { - assert(! print_object->model_object()->instances.empty()); - assert(! print_object->instances().empty()); - // Get convex hull of all meshes assigned to this print object. - ModelInstance *model_instance0 = print_object->model_object()->instances.front(); - Vec3d rotation = model_instance0->get_rotation(); - rotation.z() = 0.; - // Calculate the convex hull of a printable object centered around X=0,Y=0. - // Grow convex hull with the clearance margin. - // FIXME: Arrangement has different parameters for offsetting (jtMiter, limit 2) - // which causes that the warning will be showed after arrangement with the - // appropriate object distance. Even if I set this to jtMiter the warning still shows up. - Polygon convex_hull0 = offset( - print_object->model_object()->convex_hull_2d( - Geometry::assemble_transform(Vec3d::Zero(), rotation, model_instance0->get_scaling_factor(), model_instance0->get_mirror())), - float(scale_(0.5 * m_config.extruder_clearance_radius.value)), jtRound, float(scale_(0.1))).front(); - // Now we check that no instance of convex_hull intersects any of the previously checked object instances. - for (const PrintInstance &instance : print_object->instances()) { - Polygon convex_hull = convex_hull0; - convex_hull.translate(instance.shift); - if (! intersection(convex_hulls_other, convex_hull).empty()) - return L("Some objects are too close; your extruder will collide with them."); - polygons_append(convex_hulls_other, convex_hull); - } - } - } - // Check vertical clearance. - { - std::vector object_height; - for (const PrintObject *object : m_objects) - object_height.insert(object_height.end(), object->instances().size(), object->size()(2)); - std::sort(object_height.begin(), object_height.end()); - // Ignore the tallest *copy* (this is why we repeat height for all of them): - // it will be printed as last one so its height doesn't matter. - object_height.pop_back(); - if (! object_height.empty() && object_height.back() > scale_(m_config.extruder_clearance_height.value)) - return L("Some objects are too tall and cannot be printed without extruder collisions."); - } - } // end if (m_config.complete_objects) + if (! sequential_print_horizontal_clearance_valid(*this)) + return L("Some objects are too close; your extruder will collide with them."); + if (! sequential_print_vertical_clearance_valid(*this)) + return L("Some objects are too tall and cannot be printed without extruder collisions."); + } if (m_config.spiral_vase) { size_t total_copies_count = 0; @@ -1418,6 +1435,7 @@ std::string Print::validate() const return std::string(); } +#if 0 // the bounding box of objects placed in copies position // (without taking skirt/brim/support material into account) BoundingBox Print::bounding_box() const @@ -1425,8 +1443,9 @@ BoundingBox Print::bounding_box() const BoundingBox bb; for (const PrintObject *object : m_objects) for (const PrintInstance &instance : object->instances()) { - bb.merge(instance.shift); - bb.merge(instance.shift + to_2d(object->size())); + BoundingBox bb2(object->bounding_box()); + bb.merge(bb2.min + instance.shift); + bb.merge(bb2.max + instance.shift); } return bb; } @@ -1471,6 +1490,7 @@ BoundingBox Print::total_bounding_box() const return bb; } +#endif double Print::skirt_first_layer_height() const { diff --git a/src/libslic3r/Print.hpp b/src/libslic3r/Print.hpp index 1386b798e7..359d162f3a 100644 --- a/src/libslic3r/Print.hpp +++ b/src/libslic3r/Print.hpp @@ -84,7 +84,7 @@ private: PrintRegion(Print* print) : m_refcnt(0), m_print(print) {} PrintRegion(Print* print, const PrintRegionConfig &config) : m_refcnt(0), m_print(print), m_config(config) {} - ~PrintRegion() {} + ~PrintRegion() = default; }; @@ -101,7 +101,7 @@ struct PrintInstance PrintObject *print_object; // Source ModelInstance of a ModelObject, for which this print_object was created. const ModelInstance *model_instance; - // Shift of this instance towards its PrintObject + // Shift of this instance's center into the world coordinates. Point shift; }; @@ -116,21 +116,22 @@ public: // vector of (layer height ranges and vectors of volume ids), indexed by region_id std::vector>> region_volumes; - // this is set to true when LayerRegion->slices is split in top/internal/bottom - // so that next call to make_perimeters() performs a union() before computing loops - bool typed_slices; - - // XYZ in scaled coordinates - const Vec3crd& size() const { return m_size; } + // Size of an object: XYZ in scaled coordinates. The size might not be quite snug in XY plane. + const Vec3crd& size() const { return m_size; } const PrintObjectConfig& config() const { return m_config; } const LayerPtrs& layers() const { return m_layers; } const SupportLayerPtrs& support_layers() const { return m_support_layers; } const Transform3d& trafo() const { return m_trafo; } const PrintInstances& instances() const { return m_instances; } - const Point instance_center(size_t idx) const { return m_instances[idx].shift + m_copies_shift + Point(this->size().x() / 2, this->size().y() / 2); } - // since the object is aligned to origin, bounding box coincides with size - BoundingBox bounding_box() const { return BoundingBox(Point(0,0), to_2d(this->size())); } + // Bounding box is used to align the object infill patterns, and to calculate attractor for the rear seam. + // The bounding box may not be quite snug. + BoundingBox bounding_box() const { return BoundingBox(Point(- m_size.x() / 2, - m_size.y() / 2), Point(m_size.x() / 2, m_size.y() / 2)); } + // Height is used for slicing, for sorting the objects by height for sequential printing and for checking vertical clearence in sequential print mode. + // The height is snug. + coord_t height() const { return m_size.z(); } + // Centering offset of the sliced mesh from the scaled and rotated mesh of the model. + const Point& center_offset() const { return m_center_offset; } // adds region_id, too, if necessary void add_region_volume(unsigned int region_id, int volume_id, const t_layer_height_range &layer_range) { @@ -196,14 +197,12 @@ private: // to be called from Print only. friend class Print; - PrintObject(Print* print, ModelObject* model_object, bool add_instances = true); - ~PrintObject() {} + PrintObject(Print* print, ModelObject* model_object, const Transform3d& trafo, PrintInstances&& instances); + ~PrintObject() = default; void config_apply(const ConfigBase &other, bool ignore_nonexistent = false) { this->m_config.apply(other, ignore_nonexistent); } void config_apply_only(const ConfigBase &other, const t_config_option_keys &keys, bool ignore_nonexistent = false) { this->m_config.apply_only(other, keys, ignore_nonexistent); } - void set_trafo(const Transform3d& trafo) { m_trafo = trafo; } PrintBase::ApplyStatus set_instances(PrintInstances &&instances); - void set_trafo_and_instances(const Transform3d& trafo, PrintInstances &&instances) { this->set_trafo(trafo); this->set_instances(std::move(instances)); } // Invalidates the step, and its depending steps in PrintObject and Print. bool invalidate_step(PrintObjectStep step); // Invalidates all PrintObject and Print steps. @@ -242,15 +241,18 @@ private: Transform3d m_trafo = Transform3d::Identity(); // Slic3r::Point objects in scaled G-code coordinates std::vector m_instances; - // scaled coordinates to add to copies (to compensate for the alignment - // operated when creating the object but still preserving a coherent API - // for external callers) - Point m_copies_shift; + // The mesh is being centered before thrown to Clipper, so that the Clipper's fixed coordinates require less bits. + // This is the adjustment of the the Object's coordinate system towards PrintObject's coordinate system. + Point m_center_offset; SlicingParameters m_slicing_params; LayerPtrs m_layers; SupportLayerPtrs m_support_layers; + // this is set to true when LayerRegion->slices is split in top/internal/bottom + // so that next call to make_perimeters() performs a union() before computing loops + bool m_typed_slices = false; + std::vector slice_region(size_t region_id, const std::vector &z) const; std::vector slice_modifiers(size_t region_id, const std::vector &z) const; std::vector slice_volumes(const std::vector &z, const std::vector &volumes) const; @@ -343,7 +345,7 @@ private: // Prevents erroneous use by other classes. typedef PrintBaseWithState Inherited; public: - Print() {} + Print() = default; virtual ~Print() { this->clear(); } PrinterTechnology technology() const noexcept { return ptFFF; } @@ -379,8 +381,6 @@ public: // Returns an empty string if valid, otherwise returns an error message. std::string validate() const override; - BoundingBox bounding_box() const; - BoundingBox total_bounding_box() const; double skirt_first_layer_height() const; Flow brim_flow() const; Flow skirt_flow() const; diff --git a/src/libslic3r/PrintObject.cpp b/src/libslic3r/PrintObject.cpp index 2ff3613090..5d0faa19d1 100644 --- a/src/libslic3r/PrintObject.cpp +++ b/src/libslic3r/PrintObject.cpp @@ -40,41 +40,41 @@ namespace Slic3r { -PrintObject::PrintObject(Print* print, ModelObject* model_object, bool add_instances) : +// Constructor is called from the main thread, therefore all Model / ModelObject / ModelIntance data are valid. +PrintObject::PrintObject(Print* print, ModelObject* model_object, const Transform3d& trafo, PrintInstances&& instances) : PrintObjectBaseWithState(print, model_object), - typed_slices(false), - m_size(Vec3crd::Zero()) + m_trafo(trafo) { - // Compute the translation to be applied to our meshes so that we work with smaller coordinates - { - // Translate meshes so that our toolpath generation algorithms work with smaller - // XY coordinates; this translation is an optimization and not strictly required. - // A cloned mesh will be aligned to 0 before slicing in slice_region() since we - // don't assume it's already aligned and we don't alter the original position in model. - // We store the XY translation so that we can place copies correctly in the output G-code - // (copies are expressed in G-code coordinates and this translation is not publicly exposed). - const BoundingBoxf3 modobj_bbox = model_object->raw_bounding_box(); - m_copies_shift = Point::new_scale(modobj_bbox.min(0), modobj_bbox.min(1)); - // Scale the object size and store it - this->m_size = (modobj_bbox.size() * (1. / SCALING_FACTOR)).cast(); - } - - if (add_instances) { - PrintInstances instances; - instances.reserve(m_model_object->instances.size()); - for (const ModelInstance *mi : m_model_object->instances) { - assert(mi->is_printable()); - const Vec3d &offset = mi->get_offset(); - instances.emplace_back(PrintInstance{ nullptr, mi, Point::new_scale(offset(0), offset(1)) }); - } - this->set_instances(std::move(instances)); - } + // Compute centering offet to be applied to our meshes so that we work with smaller coordinates + // requiring less bits to represent Clipper coordinates. + + // Snug bounding box of a rotated and scaled object by the 1st instantion, without the instance translation applied. + // All the instances share the transformation matrix with the exception of translation in XY and rotation by Z, + // therefore a bounding box from 1st instance of a ModelObject is good enough for calculating the object center, + // snug height and an approximate bounding box in XY. + BoundingBoxf3 bbox = model_object->raw_bounding_box(); + Vec3d bbox_center = bbox.center(); + // We may need to rotate the bbox / bbox_center from the original instance to the current instance. + double z_diff = Geometry::rotation_diff_z(model_object->instances.front()->get_rotation(), instances.front().model_instance->get_rotation()); + if (std::abs(z_diff) > EPSILON) { + auto z_rot = Eigen::AngleAxisd(z_diff, Vec3d::UnitZ()); + bbox = bbox.transformed(Transform3d(z_rot)); + bbox_center = (z_rot * bbox_center).eval(); + } + + // Center of the transformed mesh (without translation). + m_center_offset = Point::new_scale(bbox_center.x(), bbox_center.y()); + // Size of the transformed mesh. This bounding may not be snug in XY plane, but it is snug in Z. + m_size = (bbox.size() * (1. / SCALING_FACTOR)).cast(); + + this->set_instances(std::move(instances)); } PrintBase::ApplyStatus PrintObject::set_instances(PrintInstances &&instances) { for (PrintInstance &i : instances) - i.shift += m_copies_shift; + // Add the center offset, which will be subtracted from the mesh when slicing. + i.shift += m_center_offset; // Invalidate and set copies. PrintBase::ApplyStatus status = PrintBase::APPLY_STATUS_UNCHANGED; bool equal_length = instances.size() == m_instances.size(); @@ -153,12 +153,12 @@ void PrintObject::make_perimeters() BOOST_LOG_TRIVIAL(info) << "Generating perimeters..." << log_memory_info(); // merge slices if they were split into types - if (this->typed_slices) { + if (m_typed_slices) { for (Layer *layer : m_layers) { layer->merge_slices(); m_print->throw_if_canceled(); } - this->typed_slices = false; + m_typed_slices = false; } // compare each layer to the one below, and mark those slices needing @@ -822,7 +822,7 @@ void PrintObject::detect_surfaces_type() } // for each this->print->region_count // Mark the object to have the region slices classified (typed, which also means they are split based on whether they are supported, bridging, top layers etc.) - this->typed_slices = true; + m_typed_slices = true; } void PrintObject::process_external_surfaces() @@ -1481,7 +1481,7 @@ void PrintObject::update_slicing_parameters() { if (! m_slicing_params.valid) m_slicing_params = SlicingParameters::create_from_config( - this->print()->config(), m_config, unscale(this->size()(2)), this->object_extruders()); + this->print()->config(), m_config, unscale(this->height()), this->object_extruders()); } SlicingParameters PrintObject::slicing_parameters(const DynamicPrintConfig& full_config, const ModelObject& model_object, float object_max_z) @@ -1568,7 +1568,7 @@ void PrintObject::_slice(const std::vector &layer_height_profile) { BOOST_LOG_TRIVIAL(info) << "Slicing objects..." << log_memory_info(); - this->typed_slices = false; + m_typed_slices = false; #ifdef SLIC3R_PROFILE // Disable parallelization so the Shiny profiler works @@ -2030,7 +2030,7 @@ std::vector PrintObject::slice_volumes(const std::vector &z, if (mesh.stl.stats.number_of_facets > 0) { mesh.transform(m_trafo, true); // apply XY shift - mesh.translate(- unscale(m_copies_shift(0)), - unscale(m_copies_shift(1)), 0); + mesh.translate(- unscale(m_center_offset.x()), - unscale(m_center_offset.y()), 0); // perform actual slicing const Print *print = this->print(); auto callback = TriangleMeshSlicer::throw_on_cancel_callback_type([print](){print->throw_if_canceled();}); @@ -2060,7 +2060,7 @@ std::vector PrintObject::slice_volume(const std::vector &z, c if (mesh.stl.stats.number_of_facets > 0) { mesh.transform(m_trafo, true); // apply XY shift - mesh.translate(- unscale(m_copies_shift(0)), - unscale(m_copies_shift(1)), 0); + mesh.translate(- unscale(m_center_offset.x()), - unscale(m_center_offset.y()), 0); // perform actual slicing TriangleMeshSlicer mslicer; const Print *print = this->print(); diff --git a/src/libslic3r/SLAPrintSteps.cpp b/src/libslic3r/SLAPrintSteps.cpp index 0c293c7fb6..ccbb00ae82 100644 --- a/src/libslic3r/SLAPrintSteps.cpp +++ b/src/libslic3r/SLAPrintSteps.cpp @@ -544,8 +544,8 @@ static ClipperPolygons get_all_polygons(const SliceRecord& record, SliceOrigin o } sl::rotate(poly, double(instances[i].rotation)); - sl::translate(poly, ClipperPoint{instances[i].shift(X), - instances[i].shift(Y)}); + sl::translate(poly, ClipperPoint{instances[i].shift.x(), + instances[i].shift.y()}); polygons.emplace_back(std::move(poly)); } diff --git a/src/libslic3r/ShortestPath.cpp b/src/libslic3r/ShortestPath.cpp index a5d3a41ab7..0aa897fd77 100644 --- a/src/libslic3r/ShortestPath.cpp +++ b/src/libslic3r/ShortestPath.cpp @@ -1954,7 +1954,8 @@ std::vector chain_print_object_instances(const Print &prin for (size_t i = 0; i < print.objects().size(); ++ i) { const PrintObject &object = *print.objects()[i]; for (size_t j = 0; j < object.instances().size(); ++ j) { - object_reference_points.emplace_back(object.instance_center(j)); + // Sliced PrintObjects are centered, object.instances()[j].shift is the center of the PrintObject in G-code coordinates. + object_reference_points.emplace_back(object.instances()[j].shift); instances.emplace_back(i, j); } } diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 37af4c8979..7c0db32c07 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -6425,7 +6425,7 @@ void GLCanvas3D::_load_sla_shells() v.indexed_vertex_array.finalize_geometry(this->m_initialized); v.shader_outside_printer_detection_enabled = outside_printer_detection_enabled; v.composite_id.volume_id = volume_id; - v.set_instance_offset(unscale(instance.shift(0), instance.shift(1), 0)); + v.set_instance_offset(unscale(instance.shift.x(), instance.shift.y(), 0)); v.set_instance_rotation(Vec3d(0.0, 0.0, (double)instance.rotation)); v.set_instance_mirror(X, object.is_left_handed() ? -1. : 1.); v.set_convex_hull(mesh.convex_hull_3d()); diff --git a/xs/xsp/Print.xsp b/xs/xsp/Print.xsp index 2e329bfa6c..0952513ca3 100644 --- a/xs/xsp/Print.xsp +++ b/xs/xsp/Print.xsp @@ -148,9 +148,6 @@ _constant() croak("Configuration is not valid: %s\n", err.c_str()); RETVAL = 1; %}; - Clone bounding_box(); - Clone total_bounding_box(); - Clone size() %code%{ RETVAL = THIS->bounding_box().size(); %}; void set_callback_event(int evt) %code%{ %}; From 10ade4192cbf3ed810a991d3bbb774e3c1a2a3b7 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Fri, 7 Feb 2020 14:15:09 +0100 Subject: [PATCH 278/336] Added separate icon for the SLA printer presets DoubleSlider: + fixed bug with un-hidden tooltip when OneLayerLock is on + MultiAsSingle mode : Show context menu on Cog icon after L/RButtonClick --- resources/icons/sla_printer.svg | 14 +++++++++ resources/icons/white/sla_printer.svg | 14 +++++++++ src/slic3r/GUI/DoubleSlider.cpp | 11 +++++-- src/slic3r/GUI/OptionsGroup.cpp | 2 +- src/slic3r/GUI/Preset.cpp | 43 +++++++++++++++++++-------- src/slic3r/GUI/PresetBundle.cpp | 18 ++++++++++- 6 files changed, 86 insertions(+), 16 deletions(-) create mode 100644 resources/icons/sla_printer.svg create mode 100644 resources/icons/white/sla_printer.svg diff --git a/resources/icons/sla_printer.svg b/resources/icons/sla_printer.svg new file mode 100644 index 0000000000..ab63083e30 --- /dev/null +++ b/resources/icons/sla_printer.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + diff --git a/resources/icons/white/sla_printer.svg b/resources/icons/white/sla_printer.svg new file mode 100644 index 0000000000..3d47e7da62 --- /dev/null +++ b/resources/icons/white/sla_printer.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + diff --git a/src/slic3r/GUI/DoubleSlider.cpp b/src/slic3r/GUI/DoubleSlider.cpp index e3932e5c8f..03b15589d1 100644 --- a/src/slic3r/GUI/DoubleSlider.cpp +++ b/src/slic3r/GUI/DoubleSlider.cpp @@ -1032,7 +1032,11 @@ void Control::OnMotion(wxMouseEvent& event) const wxPoint pos = event.GetLogicalPosition(wxClientDC(this)); int tick = -1; - if (!m_is_left_down && !m_is_one_layer) + /* Note: Checking "!m_is_one_layer" is commented now because of + * it looks like unnecessary and cause a tooltip "One layer" showing when OneLayerLock is on + * #ysFIXME : Delete it after testing + * */ + if (!m_is_left_down/* && !m_is_one_layer*/) { if (is_point_in_rect(pos, m_rect_one_layer_icon)) m_focus = fiOneLayerIcon; @@ -1166,7 +1170,10 @@ void Control::OnLeftUp(wxMouseEvent& event) add_current_tick(); break; case maCogIconClick : - jump_to_print_z(); + if (m_mode == t_mode::MultiAsSingle) + show_cog_icon_context_menu(); + else + jump_to_print_z(); break; case maOneLayerIconClick: switch_one_layer_mode(); diff --git a/src/slic3r/GUI/OptionsGroup.cpp b/src/slic3r/GUI/OptionsGroup.cpp index 8b6f5bc304..366df43463 100644 --- a/src/slic3r/GUI/OptionsGroup.cpp +++ b/src/slic3r/GUI/OptionsGroup.cpp @@ -703,7 +703,7 @@ Field* ConfigOptionsGroup::get_fieldc(const t_config_option_key& opt_key, int op void ogStaticText::SetText(const wxString& value, bool wrap/* = true*/) { SetLabel(value); - if (wrap) Wrap(40 * wxGetApp().em_unit()); + if (wrap) Wrap(60 * wxGetApp().em_unit()); GetParent()->Layout(); } diff --git a/src/slic3r/GUI/Preset.cpp b/src/slic3r/GUI/Preset.cpp index 00e004f758..6f379aa393 100644 --- a/src/slic3r/GUI/Preset.cpp +++ b/src/slic3r/GUI/Preset.cpp @@ -1061,7 +1061,15 @@ void PresetCollection::update_plater_ui(GUI::PresetComboBox *ui) const Preset &preset = this->m_presets[i]; if (! preset.is_visible || (! preset.is_compatible && i != m_idx_selected)) continue; + std::string bitmap_key = ""; + // !!! Temporary solution, till refactoring: create and use "sla_printer" icon instead of m_bitmap_main_frame + wxBitmap main_bmp = m_bitmap_main_frame ? *m_bitmap_main_frame : wxNullBitmap; + if (m_type == Preset::TYPE_PRINTER && preset.printer_technology()==ptSLA ) { + bitmap_key = "sla_printer"; + main_bmp = create_scaled_bitmap("sla_printer"); + } + // If the filament preset is not compatible and there is a "red flag" icon loaded, show it left // to the filament color image. if (wide_icons) @@ -1076,7 +1084,7 @@ void PresetCollection::update_plater_ui(GUI::PresetComboBox *ui) bmps.emplace_back(preset.is_compatible ? m_bitmap_cache->mkclear(icon_width, icon_height) : *m_bitmap_incompatible); // Paint the color bars. bmps.emplace_back(m_bitmap_cache->mkclear(thin_space_icon_width, icon_height)); - bmps.emplace_back(*m_bitmap_main_frame); + bmps.emplace_back(main_bmp); // Paint a lock at the system presets. bmps.emplace_back(m_bitmap_cache->mkclear(wide_space_icon_width, icon_height)); bmps.emplace_back((preset.is_system || preset.is_default) ? *m_bitmap_lock : m_bitmap_cache->mkclear(icon_width, icon_height)); @@ -1086,7 +1094,7 @@ void PresetCollection::update_plater_ui(GUI::PresetComboBox *ui) const std::string name = preset.alias.empty() ? preset.name : preset.alias; if (preset.is_default || preset.is_system) { ui->Append(wxString::FromUTF8((/*preset.*/name + (preset.is_dirty ? g_suffix_modified : "")).c_str()), - (bmp == 0) ? (m_bitmap_main_frame ? *m_bitmap_main_frame : wxNullBitmap) : *bmp); + (bmp == 0) ? main_bmp : *bmp); if (i == m_idx_selected || // just in case: mark selected_preset_item as a first added element selected_preset_item == INT_MAX) { @@ -1116,13 +1124,13 @@ void PresetCollection::update_plater_ui(GUI::PresetComboBox *ui) selected_preset_item = ui->GetCount() - 1; } } - if (m_type == Preset::TYPE_PRINTER) { + if (m_type == Preset::TYPE_PRINTER || m_type == Preset::TYPE_SLA_MATERIAL) { std::string bitmap_key = ""; // If the filament preset is not compatible and there is a "red flag" icon loaded, show it left // to the filament color image. if (wide_icons) bitmap_key += "wide,"; - bitmap_key += "add_printer"; + bitmap_key += "edit_preset_list"; wxBitmap *bmp = m_bitmap_cache->find(bitmap_key); if (bmp == nullptr) { // Create the bitmap with color bars. @@ -1135,12 +1143,14 @@ void PresetCollection::update_plater_ui(GUI::PresetComboBox *ui) bmps.emplace_back(*m_bitmap_main_frame); // Paint a lock at the system presets. bmps.emplace_back(m_bitmap_cache->mkclear(wide_space_icon_width, icon_height)); - bmps.emplace_back(m_bitmap_add ? *m_bitmap_add : wxNullBitmap); +// bmps.emplace_back(m_bitmap_add ? *m_bitmap_add : wxNullBitmap); + bmps.emplace_back(create_scaled_bitmap("edit_uni")); bmp = m_bitmap_cache->insert(bitmap_key, bmps); } - ui->set_label_marker(ui->Append(PresetCollection::separator(L("Add a new printer")), *bmp), GUI::PresetComboBox::LABEL_ITEM_WIZARD_PRINTERS); - } else if (m_type == Preset::TYPE_SLA_MATERIAL) { - ui->set_label_marker(ui->Append(PresetCollection::separator(L("Add/Remove materials")), wxNullBitmap), GUI::PresetComboBox::LABEL_ITEM_WIZARD_MATERIALS); + if (m_type == Preset::TYPE_SLA_MATERIAL) + ui->set_label_marker(ui->Append(PresetCollection::separator(L("Add/Remove materials")), *bmp), GUI::PresetComboBox::LABEL_ITEM_WIZARD_MATERIALS); + else + ui->set_label_marker(ui->Append(PresetCollection::separator(L("Add/Remove printers")), *bmp), GUI::PresetComboBox::LABEL_ITEM_WIZARD_PRINTERS); } /* But, if selected_preset_item is still equal to INT_MAX, it means that @@ -1185,6 +1195,14 @@ size_t PresetCollection::update_tab_ui(wxBitmapComboBox *ui, bool show_incompati if (! preset.is_visible || (! show_incompatible && ! preset.is_compatible && i != m_idx_selected)) continue; std::string bitmap_key = "tab"; + + // !!! Temporary solution, till refactoring: create and use "sla_printer" icon instead of m_bitmap_main_frame + wxBitmap main_bmp = m_bitmap_main_frame ? *m_bitmap_main_frame : wxNullBitmap; + if (m_type == Preset::TYPE_PRINTER && preset.printer_technology() == ptSLA) { + bitmap_key = "sla_printer"; + main_bmp = create_scaled_bitmap("sla_printer"); + } + bitmap_key += preset.is_compatible ? ",cmpt" : ",ncmpt"; bitmap_key += (preset.is_system || preset.is_default) ? ",syst" : ",nsyst"; wxBitmap *bmp = m_bitmap_cache->find(bitmap_key); @@ -1192,7 +1210,7 @@ size_t PresetCollection::update_tab_ui(wxBitmapComboBox *ui, bool show_incompati // Create the bitmap with color bars. std::vector bmps; const wxBitmap* tmp_bmp = preset.is_compatible ? m_bitmap_compatible : m_bitmap_incompatible; - bmps.emplace_back((tmp_bmp == 0) ? (m_bitmap_main_frame ? *m_bitmap_main_frame : wxNullBitmap) : *tmp_bmp); + bmps.emplace_back((tmp_bmp == 0) ? main_bmp : *tmp_bmp); // Paint a lock at the system presets. bmps.emplace_back((preset.is_system || preset.is_default) ? *m_bitmap_lock : m_bitmap_cache->mkclear(icon_width, icon_height)); bmp = m_bitmap_cache->insert(bitmap_key, bmps); @@ -1200,7 +1218,7 @@ size_t PresetCollection::update_tab_ui(wxBitmapComboBox *ui, bool show_incompati if (preset.is_default || preset.is_system) { ui->Append(wxString::FromUTF8((preset.name + (preset.is_dirty ? g_suffix_modified : "")).c_str()), - (bmp == 0) ? (m_bitmap_main_frame ? *m_bitmap_main_frame : wxNullBitmap) : *bmp); + (bmp == 0) ? main_bmp : *bmp); if (i == m_idx_selected || // just in case: mark selected_preset_item as a first added element selected_preset_item == INT_MAX) @@ -1227,12 +1245,13 @@ size_t PresetCollection::update_tab_ui(wxBitmapComboBox *ui, bool show_incompati } } if (m_type == Preset::TYPE_PRINTER) { - wxBitmap *bmp = m_bitmap_cache->find("add_printer_tab"); + wxBitmap *bmp = m_bitmap_cache->find("edit_printer_list"); if (bmp == nullptr) { // Create the bitmap with color bars. std::vector bmps; bmps.emplace_back(*m_bitmap_main_frame); - bmps.emplace_back(m_bitmap_add ? *m_bitmap_add : wxNullBitmap); +// bmps.emplace_back(m_bitmap_add ? *m_bitmap_add : wxNullBitmap); + bmps.emplace_back(create_scaled_bitmap("edit_uni")); bmp = m_bitmap_cache->insert("add_printer_tab", bmps); } ui->Append(PresetCollection::separator("Add a new printer"), *bmp); diff --git a/src/slic3r/GUI/PresetBundle.cpp b/src/slic3r/GUI/PresetBundle.cpp index 0c187e871e..ebfe6e40eb 100644 --- a/src/slic3r/GUI/PresetBundle.cpp +++ b/src/slic3r/GUI/PresetBundle.cpp @@ -1678,7 +1678,23 @@ void PresetBundle::update_plater_filament_ui(unsigned int idx_extruder, GUI::Pre } } - ui->set_label_marker(ui->Append(PresetCollection::separator(L("Add/Remove filaments")), wxNullBitmap), GUI::PresetComboBox::LABEL_ITEM_WIZARD_FILAMENTS); + std::string bitmap_key = ""; + if (wide_icons) + bitmap_key += "wide,"; + bitmap_key += "edit_preset_list"; + wxBitmap* bmp = m_bitmapCache->find(bitmap_key); + if (bmp == nullptr) { + // Create the bitmap with color bars. + std::vector bmps; + if (wide_icons) + // Paint a red flag for incompatible presets. + bmps.emplace_back(m_bitmapCache->mkclear(normal_icon_width, icon_height)); + // Paint the color bars + a lock at the system presets. + bmps.emplace_back(m_bitmapCache->mkclear(wide_icon_width+space_icon_width, icon_height)); + bmps.emplace_back(create_scaled_bitmap("edit_uni")); + bmp = m_bitmapCache->insert(bitmap_key, bmps); + } + ui->set_label_marker(ui->Append(PresetCollection::separator(L("Add/Remove filaments")), *bmp), GUI::PresetComboBox::LABEL_ITEM_WIZARD_FILAMENTS); /* But, if selected_preset_item is still equal to INT_MAX, it means that * there is no presets added to the list. From 808e45f5b31b4e6cf5454034f8c66d031178d8f2 Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Fri, 7 Feb 2020 14:14:35 +0100 Subject: [PATCH 279/336] Force backend update when hollowing gizmo is closed Otherwise, moving holes will not invalidate the drilled mesh One cannot do it immediately though, because that would also hide the hollowed mesh --- src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp index 4590386922..a84fc00c21 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp @@ -992,6 +992,7 @@ void GLGizmoHollow::on_set_state() } if (m_state == Off && m_old_state != Off) { // the gizmo was just turned Off //Plater::TakeSnapshot snapshot(wxGetApp().plater(), _(L("SLA gizmo turned off"))); + m_parent.post_event(SimpleEvent(EVT_GLCANVAS_FORCE_UPDATE)); m_parent.toggle_model_objects_visibility(true); m_c->stash_clipping_plane(); m_c->m_clipping_plane_distance = 0.f; From 348bf390124a74dc5e86adcd99cc2f96f9ee1f11 Mon Sep 17 00:00:00 2001 From: bubnikv Date: Fri, 7 Feb 2020 14:43:05 +0100 Subject: [PATCH 280/336] Fix of the previous commit: Fixed sequential print unit tests. --- src/libslic3r/Print.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libslic3r/Print.cpp b/src/libslic3r/Print.cpp index c869ad2984..3bac404d3d 100644 --- a/src/libslic3r/Print.cpp +++ b/src/libslic3r/Print.cpp @@ -1202,7 +1202,7 @@ static inline bool sequential_print_vertical_clearance_valid(const Print &print) auto it = std::max_element(print_instances_ordered.begin(), print_instances_ordered.end(), [](auto l, auto r) { return l->print_object->height() < r->print_object->height(); }); - return it == print_instances_ordered.end() || (*it)->print_object->height() < scale_(print.config().extruder_clearance_height.value); + return it == print_instances_ordered.end() || (*it)->print_object->height() <= scale_(print.config().extruder_clearance_height.value); } // Precondition: Print::validate() requires the Print::apply() to be called its invocation. From a6f1c41b943c35e32c5a48165389f0c5f46b5dc8 Mon Sep 17 00:00:00 2001 From: David Kocik Date: Fri, 7 Feb 2020 15:13:20 +0100 Subject: [PATCH 281/336] eject button text correction --- src/slic3r/GUI/Plater.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 9daa28bb28..7e206bba20 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -874,7 +874,7 @@ Sidebar::Sidebar(Plater *parent) init_scalable_btn(&p->btn_send_gcode , "export_gcode", _(L("Send to printer"))); init_scalable_btn(&p->btn_remove_device, "cross" , _(L("Remove device"))); - init_scalable_btn(&p->btn_export_gcode_removable, "export_to_sd", _(L("Export to SD card/ USB thumb drive"))); + init_scalable_btn(&p->btn_export_gcode_removable, "export_to_sd", _(L("Export to SD card / Flash drive"))); // regular buttons "Slice now" and "Export G-code" From f512892f6bc068e98478f7902c84716c3b4fbd3e Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Fri, 7 Feb 2020 15:59:33 +0100 Subject: [PATCH 282/336] Report failing union on holes instead of faulty input mesh. --- src/libslic3r/SLAPrintSteps.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/libslic3r/SLAPrintSteps.cpp b/src/libslic3r/SLAPrintSteps.cpp index ccbb00ae82..2d98c82c28 100644 --- a/src/libslic3r/SLAPrintSteps.cpp +++ b/src/libslic3r/SLAPrintSteps.cpp @@ -145,6 +145,9 @@ void SLAPrint::Steps::drill_holes(SLAPrintObject &po) holes_mesh.require_shared_vertices(); if (!holes_mesh.is_manifold() || MeshBoolean::cgal::does_self_intersect(holes_mesh)) { MeshBoolean::self_union(holes_mesh); + + if (MeshBoolean::cgal::does_self_intersect(holes_mesh)) + throw std::runtime_error(L("Too much overlapping holes.")); } try { From eb4b24e13652f38b1def020753f5b28ee0840e1e Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Fri, 7 Feb 2020 16:33:04 +0100 Subject: [PATCH 283/336] Hollowing: randomize hole mesh translations before unification. To prevent self intersections in the output mesh. --- src/libslic3r/MeshBoolean.cpp | 3 +++ src/libslic3r/MeshBoolean.hpp | 1 - src/libslic3r/SLAPrintSteps.cpp | 35 ++++++++++++++++++--------------- src/libslic3r/SLAPrintSteps.hpp | 3 +++ 4 files changed, 25 insertions(+), 17 deletions(-) diff --git a/src/libslic3r/MeshBoolean.cpp b/src/libslic3r/MeshBoolean.cpp index 6db1493ecc..6c5418fd4e 100644 --- a/src/libslic3r/MeshBoolean.cpp +++ b/src/libslic3r/MeshBoolean.cpp @@ -113,6 +113,9 @@ struct CGALMesh { _EpicMesh m; }; template void triangle_mesh_to_cgal(const TriangleMesh &M, _Mesh &out) { using Index3 = std::array; + + if (M.empty()) return; + std::vector points; std::vector indices; points.reserve(M.its.vertices.size()); diff --git a/src/libslic3r/MeshBoolean.hpp b/src/libslic3r/MeshBoolean.hpp index 5298906b46..ce17a13286 100644 --- a/src/libslic3r/MeshBoolean.hpp +++ b/src/libslic3r/MeshBoolean.hpp @@ -25,7 +25,6 @@ void self_union(TriangleMesh& mesh); namespace cgal { struct CGALMesh; - struct CGALMeshDeleter { void operator()(CGALMesh *ptr); }; std::unique_ptr triangle_mesh_to_cgal(const TriangleMesh &M); diff --git a/src/libslic3r/SLAPrintSteps.cpp b/src/libslic3r/SLAPrintSteps.cpp index 2d98c82c28..07d9a7a444 100644 --- a/src/libslic3r/SLAPrintSteps.cpp +++ b/src/libslic3r/SLAPrintSteps.cpp @@ -49,7 +49,7 @@ std::string OBJ_STEP_LABELS(size_t idx) } assert(false); return "Out of bounds!"; -}; +} const std::array PRINT_STEP_LEVELS = { 10, // slapsMergeSlicesAndEval @@ -64,12 +64,13 @@ std::string PRINT_STEP_LABELS(size_t idx) default:; } assert(false); return "Out of bounds!"; -}; +} } SLAPrint::Steps::Steps(SLAPrint *print) : m_print{print} + , m_rng{std::random_device{}()} , objcount{m_print->m_objects.size()} , ilhd{m_print->m_material_config.initial_layer_height.getFloat()} , ilh{float(ilhd)} @@ -137,28 +138,30 @@ void SLAPrint::Steps::drill_holes(SLAPrintObject &po) BOOST_LOG_TRIVIAL(info) << "Drilling drainage holes."; sla::DrainHoles drainholes = po.transformed_drainhole_points(); - TriangleMesh holes_mesh; - - for (const sla::DrainHole &holept : drainholes) - holes_mesh.merge(sla::to_triangle_mesh(holept.to_mesh())); - - holes_mesh.require_shared_vertices(); - if (!holes_mesh.is_manifold() || MeshBoolean::cgal::does_self_intersect(holes_mesh)) { - MeshBoolean::self_union(holes_mesh); - - if (MeshBoolean::cgal::does_self_intersect(holes_mesh)) - throw std::runtime_error(L("Too much overlapping holes.")); + std::uniform_real_distribution dist(1., float(EPSILON)); + auto holes_mesh_cgal = MeshBoolean::cgal::triangle_mesh_to_cgal({}); + for (const sla::DrainHole &holept : drainholes) { + auto &&m = sla::to_triangle_mesh(holept.to_mesh()); + float t = dist(m_rng); + m.translate(t, t, t); + m.require_shared_vertices(); + auto cgal_m = MeshBoolean::cgal::triangle_mesh_to_cgal(m); + MeshBoolean::cgal::plus(*holes_mesh_cgal, *cgal_m); } + if (MeshBoolean::cgal::does_self_intersect(*holes_mesh_cgal)) + throw std::runtime_error(L("Too much overlapping holes.")); + + auto hollowed_mesh_cgal = MeshBoolean::cgal::triangle_mesh_to_cgal(hollowed_mesh); + try { - MeshBoolean::cgal::minus(hollowed_mesh, holes_mesh); + MeshBoolean::cgal::minus(*hollowed_mesh_cgal, *holes_mesh_cgal); + hollowed_mesh = MeshBoolean::cgal::cgal_to_triangle_mesh(*hollowed_mesh_cgal); } catch (const std::runtime_error &) { throw std::runtime_error(L( "Drilling holes into the mesh failed. " "This is usually caused by broken model. Try to fix it first.")); } - - hollowed_mesh.require_shared_vertices(); } // The slicing will be performed on an imaginary 1D grid which starts from diff --git a/src/libslic3r/SLAPrintSteps.hpp b/src/libslic3r/SLAPrintSteps.hpp index ad099e0e75..0418072cf8 100644 --- a/src/libslic3r/SLAPrintSteps.hpp +++ b/src/libslic3r/SLAPrintSteps.hpp @@ -1,6 +1,8 @@ #ifndef SLAPRINTSTEPS_HPP #define SLAPRINTSTEPS_HPP +#include + #include #include @@ -12,6 +14,7 @@ class SLAPrint::Steps { private: SLAPrint *m_print = nullptr; + std::mt19937 m_rng; public: // where the per object operations start and end From 2a9a1fddb2013f70affece1245dcf7d4158cd022 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Fri, 7 Feb 2020 16:56:59 +0100 Subject: [PATCH 284/336] DoubleSlider: Fixed Extruder sequence bug --- src/slic3r/GUI/DoubleSlider.cpp | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/src/slic3r/GUI/DoubleSlider.cpp b/src/slic3r/GUI/DoubleSlider.cpp index 03b15589d1..1165f901e7 100644 --- a/src/slic3r/GUI/DoubleSlider.cpp +++ b/src/slic3r/GUI/DoubleSlider.cpp @@ -1793,12 +1793,7 @@ void Control::edit_extruder_sequence() GUI::ExtruderSequenceDialog dlg(m_extruders_sequence); if (dlg.ShowModal() != wxID_OK) return; - - const ExtrudersSequence& from_dlg_val = dlg.GetValue(); - if (m_extruders_sequence == from_dlg_val) - return; - - m_extruders_sequence = from_dlg_val; + m_extruders_sequence = dlg.GetValue(); m_ticks.erase_all_ticks_with_code(ToolChangeCode); @@ -1813,7 +1808,7 @@ void Control::edit_extruder_sequence() { const int cur_extruder = m_extruders_sequence.extruders[extruder]; - bool meaningless_tick = value == 0.0 && cur_extruder == extruder; + bool meaningless_tick = tick == 0.0 && cur_extruder == extruder; if (!meaningless_tick) m_ticks.ticks.emplace(TickCode{tick, ToolChangeCode, cur_extruder + 1, colors[cur_extruder]}); From 8cda986ffbb88479c7a5c44f6c2aeb0778e4a94d Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Fri, 7 Feb 2020 16:59:34 +0100 Subject: [PATCH 285/336] Follow-up for hole point randomization --- src/libslic3r/SLAPrintSteps.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/libslic3r/SLAPrintSteps.cpp b/src/libslic3r/SLAPrintSteps.cpp index 07d9a7a444..3fb99afbfe 100644 --- a/src/libslic3r/SLAPrintSteps.cpp +++ b/src/libslic3r/SLAPrintSteps.cpp @@ -138,12 +138,13 @@ void SLAPrint::Steps::drill_holes(SLAPrintObject &po) BOOST_LOG_TRIVIAL(info) << "Drilling drainage holes."; sla::DrainHoles drainholes = po.transformed_drainhole_points(); - std::uniform_real_distribution dist(1., float(EPSILON)); + std::uniform_real_distribution dist(0., float(EPSILON)); auto holes_mesh_cgal = MeshBoolean::cgal::triangle_mesh_to_cgal({}); - for (const sla::DrainHole &holept : drainholes) { - auto &&m = sla::to_triangle_mesh(holept.to_mesh()); - float t = dist(m_rng); - m.translate(t, t, t); + for (sla::DrainHole holept : drainholes) { + holept.normal += Vec3f{dist(m_rng), dist(m_rng), dist(m_rng)}; + holept.normal.normalize(); + holept.pos += Vec3f{dist(m_rng), dist(m_rng), dist(m_rng)}; + TriangleMesh m = sla::to_triangle_mesh(holept.to_mesh()); m.require_shared_vertices(); auto cgal_m = MeshBoolean::cgal::triangle_mesh_to_cgal(m); MeshBoolean::cgal::plus(*holes_mesh_cgal, *cgal_m); From 9c8dcf3faef951a768899e2e75131fdc6a422c38 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Fri, 7 Feb 2020 18:49:39 +0100 Subject: [PATCH 286/336] Updated mode icons --- resources/icons/mode_advanced.svg | 13 +++++++++++++ resources/icons/mode_expert.svg | 13 +++++++++++++ resources/icons/mode_simple.svg | 13 +++++++++++++ src/slic3r/GUI/Tab.cpp | 6 +++--- src/slic3r/GUI/wxExtensions.cpp | 6 +++--- 5 files changed, 45 insertions(+), 6 deletions(-) create mode 100644 resources/icons/mode_advanced.svg create mode 100644 resources/icons/mode_expert.svg create mode 100644 resources/icons/mode_simple.svg diff --git a/resources/icons/mode_advanced.svg b/resources/icons/mode_advanced.svg new file mode 100644 index 0000000000..79f68f5b9d --- /dev/null +++ b/resources/icons/mode_advanced.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + diff --git a/resources/icons/mode_expert.svg b/resources/icons/mode_expert.svg new file mode 100644 index 0000000000..aaa6d0e4da --- /dev/null +++ b/resources/icons/mode_expert.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + diff --git a/resources/icons/mode_simple.svg b/resources/icons/mode_simple.svg new file mode 100644 index 0000000000..b94b7112cd --- /dev/null +++ b/resources/icons/mode_simple.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index 5a41f12a5a..5f17955d41 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -257,9 +257,9 @@ void Tab::create_preset_tab() // Fill cache for mode bitmaps m_mode_bitmap_cache.reserve(3); - m_mode_bitmap_cache.push_back(ScalableBitmap(this, "mode_simple_.png")); - m_mode_bitmap_cache.push_back(ScalableBitmap(this, "mode_advanced_.png")); - m_mode_bitmap_cache.push_back(ScalableBitmap(this, "mode_expert_.png")); + m_mode_bitmap_cache.push_back(ScalableBitmap(this, "mode_simple")); + m_mode_bitmap_cache.push_back(ScalableBitmap(this, "mode_advanced")); + m_mode_bitmap_cache.push_back(ScalableBitmap(this, "mode_expert")); // Initialize the DynamicPrintConfig by default keys/values. build(); diff --git a/src/slic3r/GUI/wxExtensions.cpp b/src/slic3r/GUI/wxExtensions.cpp index f814c11dfb..7e9ec86f98 100644 --- a/src/slic3r/GUI/wxExtensions.cpp +++ b/src/slic3r/GUI/wxExtensions.cpp @@ -727,9 +727,9 @@ ModeSizer::ModeSizer(wxWindow *parent, int hgap/* = 0*/) : SetFlexibleDirection(wxHORIZONTAL); std::vector < std::pair < wxString, std::string >> buttons = { - {_(L("Simple")), "mode_simple_sq.png"}, - {_(L("Advanced")), "mode_advanced_sq.png"}, - {_(L("Expert")), "mode_expert_sq.png"} + {_(L("Simple")), "mode_simple"}, + {_(L("Advanced")), "mode_advanced"}, + {_(L("Expert")), "mode_expert"}, }; auto modebtnfn = [](wxCommandEvent &event, int mode_id) { From 6dd79d4923464ce8e8041ab03a570624aa9e06d6 Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Sat, 8 Feb 2020 11:42:45 +0100 Subject: [PATCH 287/336] Added a missing include Suggested in #3621 --- src/slic3r/GUI/BitmapCache.hpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/slic3r/GUI/BitmapCache.hpp b/src/slic3r/GUI/BitmapCache.hpp index e12beb5c72..3f29c2fd62 100644 --- a/src/slic3r/GUI/BitmapCache.hpp +++ b/src/slic3r/GUI/BitmapCache.hpp @@ -2,6 +2,7 @@ #define SLIC3R_GUI_BITMAP_CACHE_HPP #include +#include #include #ifndef WX_PRECOMP From 79ce691d58ec14ced18e9ade05d9cad012e096b8 Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Sat, 8 Feb 2020 17:17:51 +0100 Subject: [PATCH 288/336] Don't calculate the AABB tree in FDM mode --- src/slic3r/GUI/Gizmos/GLGizmosManager.cpp | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp b/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp index 613e151927..79ac6a00da 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp @@ -353,13 +353,15 @@ void GLGizmosManager::set_sla_support_data(ModelObject* model_object) // Update common data for hollowing and sla support gizmos. - if (m_common_gizmos_data->update_from_backend(m_parent, model_object)) { - // FIXME: this is a hack to make that the clipping plane is - // updated when the update set its position to zero. The clipping - // plane itself should be common, including the update_function. - // Then update_from_backend could do it itself. - gizmo_supports->update_clipping_plane(); - gizmo_hollow->update_clipping_plane(); + if (wxGetApp().preset_bundle->printers.get_edited_preset().printer_technology() == ptSLA) { + if (m_common_gizmos_data->update_from_backend(m_parent, model_object)) { + // FIXME: this is a hack to make that the clipping plane is + // updated when the update set its position to zero. The clipping + // plane itself should be common, including the update_function. + // Then update_from_backend could do it itself. + gizmo_supports->update_clipping_plane(); + gizmo_hollow->update_clipping_plane(); + } } gizmo_supports->set_sla_support_data(model_object, m_parent.get_selection()); From 4e11552da980f07216f1720f67f539703ed90ed1 Mon Sep 17 00:00:00 2001 From: bubnikv Date: Sat, 8 Feb 2020 21:36:29 +0100 Subject: [PATCH 289/336] Spiral vase improvements and bugfixes. Fixes Connecting / expanding Bottom Layers to Vase Perimeter #253 Fixes Slicing error in vase mode #452 Fixes Slicing Issue (Vase Mode, 0.6mm dmr nozzle) #1887 Fixes Top fill pattern isn't used in spiral vase mode #2533 Fixes Cisar's vase doesn't slice correctly, creates artefacts #3595 When the model is sliced, all the contours are newly oriented counter-clockwise (even holes), merged and then only the largest area contour is retained. In perimeter generator, if the largest contour splits into multiple perimeters, newly only the largest area perimeter is retained in spiral vase mode. These two changes solve #3595 and similar. The infill is newly calculated only for the bottom solid layers if the spiral vase mode is active (removes various unwanted infill along the vase walls), and the last bottom solid layer is switched to a top solid pattern (solves #2533). The thin walls are newly enforced to be disabled in spiral vase mode, and the "ensure vertical shell wall" is enforced in spiral vase mode to extend the bottom of the vase to the vase hull (fixes #253). --- src/libslic3r/ExPolygon.cpp | 19 ++++++ src/libslic3r/ExPolygon.hpp | 1 + src/libslic3r/GCode/SpiralVase.cpp | 8 +-- src/libslic3r/GCode/SpiralVase.hpp | 17 +++--- src/libslic3r/LayerRegion.cpp | 6 +- src/libslic3r/PerimeterGenerator.cpp | 4 ++ src/libslic3r/Print.hpp | 9 +-- src/libslic3r/PrintObject.cpp | 86 +++++++++++++++++---------- src/libslic3r/SLA/Hollowing.cpp | 2 +- src/libslic3r/SLA/Pad.cpp | 2 +- src/libslic3r/SLA/SupportTree.cpp | 4 +- src/libslic3r/SLAPrintSteps.cpp | 2 +- src/libslic3r/TriangleMesh.cpp | 46 +++++++++++--- src/libslic3r/TriangleMesh.hpp | 18 ++++-- src/slic3r/GUI/ConfigManipulation.cpp | 16 +++-- src/slic3r/GUI/MeshUtils.cpp | 2 +- 16 files changed, 171 insertions(+), 71 deletions(-) diff --git a/src/libslic3r/ExPolygon.cpp b/src/libslic3r/ExPolygon.cpp index f9c470450c..4a89660447 100644 --- a/src/libslic3r/ExPolygon.cpp +++ b/src/libslic3r/ExPolygon.cpp @@ -657,4 +657,23 @@ bool remove_sticks(ExPolygon &poly) return remove_sticks(poly.contour) || remove_sticks(poly.holes); } +void keep_largest_contour_only(ExPolygons &polygons) +{ + if (polygons.size() > 1) { + double max_area = 0.; + ExPolygon* max_area_polygon = nullptr; + for (ExPolygon& p : polygons) { + double a = p.contour.area(); + if (a > max_area) { + max_area = a; + max_area_polygon = &p; + } + } + assert(max_area_polygon != nullptr); + ExPolygon p(std::move(*max_area_polygon)); + polygons.clear(); + polygons.emplace_back(std::move(p)); + } +} + } // namespace Slic3r diff --git a/src/libslic3r/ExPolygon.hpp b/src/libslic3r/ExPolygon.hpp index 7c0dfcce5b..4aad3603fc 100644 --- a/src/libslic3r/ExPolygon.hpp +++ b/src/libslic3r/ExPolygon.hpp @@ -327,6 +327,7 @@ extern BoundingBox get_extents_rotated(const ExPolygons &polygons, double angle) extern std::vector get_extents_vector(const ExPolygons &polygons); extern bool remove_sticks(ExPolygon &poly); +extern void keep_largest_contour_only(ExPolygons &polygons); extern std::list expoly_to_polypartition_input(const ExPolygons &expp); extern std::list expoly_to_polypartition_input(const ExPolygon &ex); diff --git a/src/libslic3r/GCode/SpiralVase.cpp b/src/libslic3r/GCode/SpiralVase.cpp index a4ae42b318..a3c190069e 100644 --- a/src/libslic3r/GCode/SpiralVase.cpp +++ b/src/libslic3r/GCode/SpiralVase.cpp @@ -16,8 +16,8 @@ std::string SpiralVase::process_layer(const std::string &gcode) // If we're not going to modify G-code, just feed it to the reader // in order to update positions. - if (!this->enable) { - this->_reader.parse_buffer(gcode); + if (! this->enable) { + m_reader.parse_buffer(gcode); return gcode; } @@ -29,7 +29,7 @@ std::string SpiralVase::process_layer(const std::string &gcode) { //FIXME Performance warning: This copies the GCodeConfig of the reader. - GCodeReader r = this->_reader; // clone + GCodeReader r = m_reader; // clone r.parse_buffer(gcode, [&total_layer_length, &layer_height, &z, &set_z] (GCodeReader &reader, const GCodeReader::GCodeLine &line) { if (line.cmd_is("G1")) { @@ -50,7 +50,7 @@ std::string SpiralVase::process_layer(const std::string &gcode) z -= layer_height; std::string new_gcode; - this->_reader.parse_buffer(gcode, [&new_gcode, &z, &layer_height, &total_layer_length] + m_reader.parse_buffer(gcode, [&new_gcode, &z, &layer_height, &total_layer_length] (GCodeReader &reader, GCodeReader::GCodeLine line) { if (line.cmd_is("G1")) { if (line.has_z()) { diff --git a/src/libslic3r/GCode/SpiralVase.hpp b/src/libslic3r/GCode/SpiralVase.hpp index e35ca640c3..496c1425c5 100644 --- a/src/libslic3r/GCode/SpiralVase.hpp +++ b/src/libslic3r/GCode/SpiralVase.hpp @@ -7,20 +7,19 @@ namespace Slic3r { class SpiralVase { - public: - bool enable; +public: + bool enable = false; - SpiralVase(const PrintConfig &config) - : enable(false), _config(&config) + SpiralVase(const PrintConfig &config) : m_config(&config) { - this->_reader.z() = (float)this->_config->z_offset; - this->_reader.apply_config(*this->_config); + m_reader.z() = (float)m_config->z_offset; + m_reader.apply_config(*m_config); }; std::string process_layer(const std::string &gcode); - private: - const PrintConfig* _config; - GCodeReader _reader; +private: + const PrintConfig *m_config; + GCodeReader m_reader; }; } diff --git a/src/libslic3r/LayerRegion.cpp b/src/libslic3r/LayerRegion.cpp index f4f0d6a5de..67a1acb09e 100644 --- a/src/libslic3r/LayerRegion.cpp +++ b/src/libslic3r/LayerRegion.cpp @@ -362,8 +362,10 @@ void LayerRegion::prepare_fill_surfaces() alter fill_surfaces boundaries on which our idempotency relies since that's the only meaningful information returned by psPerimeters. */ + bool spiral_vase = this->layer()->object()->print()->config().spiral_vase; + // if no solid layers are requested, turn top/bottom surfaces to internal - if (this->region()->config().top_solid_layers == 0) { + if (! spiral_vase && this->region()->config().top_solid_layers == 0) { for (Surface &surface : this->fill_surfaces.surfaces) if (surface.is_top()) surface.surface_type = this->layer()->object()->config().infill_only_where_needed ? stInternalVoid : stInternal; @@ -375,7 +377,7 @@ void LayerRegion::prepare_fill_surfaces() } // turn too small internal regions into solid regions according to the user setting - if (this->region()->config().fill_density.value > 0) { + if (! spiral_vase && this->region()->config().fill_density.value > 0) { // scaling an area requires two calls! double min_area = scale_(scale_(this->region()->config().solid_infill_below_area.value)); for (Surface &surface : this->fill_surfaces.surfaces) diff --git a/src/libslic3r/PerimeterGenerator.cpp b/src/libslic3r/PerimeterGenerator.cpp index 450fff3515..3cd91dafe4 100644 --- a/src/libslic3r/PerimeterGenerator.cpp +++ b/src/libslic3r/PerimeterGenerator.cpp @@ -312,6 +312,10 @@ void PerimeterGenerator::process() for (ExPolygon &ex : expp) ex.medial_axis(ext_perimeter_width + ext_perimeter_spacing2, min_width, &thin_walls); } + if (print_config->spiral_vase && offsets.size() > 1) { + // Remove all but the largest area polygon. + keep_largest_contour_only(offsets); + } } else { //FIXME Is this offset correct if the line width of the inner perimeters differs // from the line width of the infill? diff --git a/src/libslic3r/Print.hpp b/src/libslic3r/Print.hpp index 359d162f3a..7b326472e4 100644 --- a/src/libslic3r/Print.hpp +++ b/src/libslic3r/Print.hpp @@ -24,6 +24,7 @@ class PrintObject; class ModelObject; class GCode; class GCodePreviewData; +enum class SlicingMode : uint32_t; // Print step IDs for keeping track of the print state. enum PrintStep { @@ -253,11 +254,11 @@ private: // so that next call to make_perimeters() performs a union() before computing loops bool m_typed_slices = false; - std::vector slice_region(size_t region_id, const std::vector &z) const; + std::vector slice_region(size_t region_id, const std::vector &z, SlicingMode mode) const; std::vector slice_modifiers(size_t region_id, const std::vector &z) const; - std::vector slice_volumes(const std::vector &z, const std::vector &volumes) const; - std::vector slice_volume(const std::vector &z, const ModelVolume &volume) const; - std::vector slice_volume(const std::vector &z, const std::vector &ranges, const ModelVolume &volume) const; + std::vector slice_volumes(const std::vector &z, SlicingMode mode, const std::vector &volumes) const; + std::vector slice_volume(const std::vector &z, SlicingMode mode, const ModelVolume &volume) const; + std::vector slice_volume(const std::vector &z, const std::vector &ranges, SlicingMode mode, const ModelVolume &volume) const; }; struct WipeTowerData diff --git a/src/libslic3r/PrintObject.cpp b/src/libslic3r/PrintObject.cpp index 5d0faa19d1..04277f9318 100644 --- a/src/libslic3r/PrintObject.cpp +++ b/src/libslic3r/PrintObject.cpp @@ -463,10 +463,10 @@ bool PrintObject::invalidate_state_by_config_options(const std::vector 0; } +static const PrintRegion* first_printing_region(const PrintObject &print_object) +{ + for (size_t idx_region = 0; idx_region < print_object.region_volumes.size(); ++ idx_region) + if (!print_object.region_volumes.empty()) + return print_object.print()->regions()[idx_region]; + return nullptr; +} + // This function analyzes slices of a region (SurfaceCollection slices). // Each region slice (instance of Surface) is analyzed, whether it is supported or whether it is the top surface. // Initially all slices are of type stInternal. @@ -642,7 +650,9 @@ void PrintObject::detect_surfaces_type() // are completely hidden inside a collective body of intersecting parts. // This is useful if one of the parts is to be dissolved, or if it is transparent and the internal shells // should be visible. - bool interface_shells = m_config.interface_shells.value; + bool spiral_vase = this->print()->config().spiral_vase.value; + bool interface_shells = ! spiral_vase && m_config.interface_shells.value; + size_t num_layers = spiral_vase ? first_printing_region(*this)->config().bottom_solid_layers : m_layers.size(); for (size_t idx_region = 0; idx_region < this->region_volumes.size(); ++ idx_region) { BOOST_LOG_TRIVIAL(debug) << "Detecting solid surfaces for region " << idx_region << " in parallel - start"; @@ -655,10 +665,15 @@ void PrintObject::detect_surfaces_type() // Cache the result of the following parallel_loop. std::vector surfaces_new; if (interface_shells) - surfaces_new.assign(m_layers.size(), Surfaces()); + surfaces_new.assign(num_layers, Surfaces()); tbb::parallel_for( - tbb::blocked_range(0, m_layers.size()), + tbb::blocked_range(0, + spiral_vase ? + // In spiral vase mode, reserve the last layer for the top surface if more than 1 layer is planned for the vase bottom. + ((num_layers > 1) ? num_layers - 1 : num_layers) : + // In non-spiral vase mode, go over all layers. + m_layers.size()), [this, idx_region, interface_shells, &surfaces_new](const tbb::blocked_range& range) { // If we have raft layers, consider bottom layer as a bridge just like any other bottom surface lying on the void. SurfaceType surface_type_bottom_1st = @@ -799,10 +814,17 @@ void PrintObject::detect_surfaces_type() if (interface_shells) { // Move surfaces_new to layerm->slices.surfaces - for (size_t idx_layer = 0; idx_layer < m_layers.size(); ++ idx_layer) + for (size_t idx_layer = 0; idx_layer < num_layers; ++ idx_layer) m_layers[idx_layer]->m_regions[idx_region]->slices.surfaces = std::move(surfaces_new[idx_layer]); } + if (spiral_vase && num_layers > 1) { + // Turn the last bottom layer infill to a top infill, so it will be extruded with a proper pattern. + Surfaces &surfaces = m_layers[num_layers - 1]->m_regions[idx_region]->slices.surfaces; + for (Surface &surface : surfaces) + surface.surface_type = stTop; + } + BOOST_LOG_TRIVIAL(debug) << "Detecting solid surfaces for region " << idx_region << " - clipping in parallel - start"; // Fill in layerm->fill_surfaces by trimming the layerm->slices by the cummulative layerm->fill_surfaces. tbb::parallel_for( @@ -916,6 +938,8 @@ void PrintObject::discover_vertical_shells() Polygons bottom_surfaces; Polygons holes; }; + bool spiral_vase = this->print()->config().spiral_vase.value; + size_t num_layers = spiral_vase ? first_printing_region(*this)->config().bottom_solid_layers : m_layers.size(); coordf_t min_layer_height = this->slicing_parameters().min_layer_height; // Does this region possibly produce more than 1 top or bottom layer? auto has_extra_layers_fn = [min_layer_height](const PrintRegionConfig &config) { @@ -929,7 +953,7 @@ void PrintObject::discover_vertical_shells() return num_extra_layers(config.top_solid_layers, config.top_solid_min_thickness) + num_extra_layers(config.bottom_solid_layers, config.bottom_solid_min_thickness) > 0; }; - std::vector cache_top_botom_regions(m_layers.size(), DiscoverVerticalShellsCacheEntry()); + std::vector cache_top_botom_regions(num_layers, DiscoverVerticalShellsCacheEntry()); bool top_bottom_surfaces_all_regions = this->region_volumes.size() > 1 && ! m_config.interface_shells.value; if (top_bottom_surfaces_all_regions) { // This is a multi-material print and interface_shells are disabled, meaning that the vertical shell thickness @@ -948,9 +972,9 @@ void PrintObject::discover_vertical_shells() return; BOOST_LOG_TRIVIAL(debug) << "Discovering vertical shells in parallel - start : cache top / bottom"; //FIXME Improve the heuristics for a grain size. - size_t grain_size = std::max(m_layers.size() / 16, size_t(1)); + size_t grain_size = std::max(num_layers / 16, size_t(1)); tbb::parallel_for( - tbb::blocked_range(0, m_layers.size(), grain_size), + tbb::blocked_range(0, num_layers, grain_size), [this, &cache_top_botom_regions](const tbb::blocked_range& range) { const SurfaceType surfaces_bottom[2] = { stBottom, stBottomBridge }; const size_t num_regions = this->region_volumes.size(); @@ -999,8 +1023,8 @@ void PrintObject::discover_vertical_shells() polygons_append(cache.holes, offset(offset_ex(layer.lslices, 0.3f * perimeter_min_spacing), - perimeter_offset - 0.3f * perimeter_min_spacing)); #ifdef SLIC3R_DEBUG_SLICE_PROCESSING { - Slic3r::SVG svg(debug_out_path("discover_vertical_shells-extra-holes-%d.svg", debug_idx), get_extents(layer.slices)); - svg.draw(layer.slices, "blue"); + Slic3r::SVG svg(debug_out_path("discover_vertical_shells-extra-holes-%d.svg", debug_idx), get_extents(layer.lslices)); + svg.draw(layer.lslices, "blue"); svg.draw(union_ex(cache.holes), "red"); svg.draw_outline(union_ex(cache.holes), "black", "blue", scale_(0.05)); svg.Close(); @@ -1026,14 +1050,14 @@ void PrintObject::discover_vertical_shells() continue; //FIXME Improve the heuristics for a grain size. - size_t grain_size = std::max(m_layers.size() / 16, size_t(1)); + size_t grain_size = std::max(num_layers / 16, size_t(1)); if (! top_bottom_surfaces_all_regions) { // This is either a single material print, or a multi-material print and interface_shells are enabled, meaning that the vertical shell thickness // is calculated over a single material. BOOST_LOG_TRIVIAL(debug) << "Discovering vertical shells for region " << idx_region << " in parallel - start : cache top / bottom"; tbb::parallel_for( - tbb::blocked_range(0, m_layers.size(), grain_size), + tbb::blocked_range(0, num_layers, grain_size), [this, idx_region, &cache_top_botom_regions](const tbb::blocked_range& range) { const SurfaceType surfaces_bottom[2] = { stBottom, stBottomBridge }; for (size_t idx_layer = range.begin(); idx_layer < range.end(); ++ idx_layer) { @@ -1061,7 +1085,7 @@ void PrintObject::discover_vertical_shells() BOOST_LOG_TRIVIAL(debug) << "Discovering vertical shells for region " << idx_region << " in parallel - start : ensure vertical wall thickness"; tbb::parallel_for( - tbb::blocked_range(0, m_layers.size(), grain_size), + tbb::blocked_range(0, num_layers, grain_size), [this, idx_region, &cache_top_botom_regions] (const tbb::blocked_range& range) { // printf("discover_vertical_shells from %d to %d\n", range.begin(), range.end()); @@ -1635,13 +1659,14 @@ void PrintObject::_slice(const std::vector &layer_height_profile) // Slice all non-modifier volumes. bool clipped = false; bool upscaled = false; + auto slicing_mode = this->print()->config().spiral_vase ? SlicingMode::PositiveLargestContour : SlicingMode::Regular; if (! has_z_ranges && (! m_config.clip_multipart_objects.value || all_volumes_single_region >= 0)) { // Cheap path: Slice regions without mutual clipping. // The cheap path is possible if no clipping is allowed or if slicing volumes of just a single region. for (size_t region_id = 0; region_id < this->region_volumes.size(); ++ region_id) { BOOST_LOG_TRIVIAL(debug) << "Slicing objects - region " << region_id; // slicing in parallel - std::vector expolygons_by_layer = this->slice_region(region_id, slice_zs); + std::vector expolygons_by_layer = this->slice_region(region_id, slice_zs, slicing_mode); m_print->throw_if_canceled(); BOOST_LOG_TRIVIAL(debug) << "Slicing objects - append slices " << region_id << " start"; for (size_t layer_id = 0; layer_id < expolygons_by_layer.size(); ++ layer_id) @@ -1679,7 +1704,7 @@ void PrintObject::_slice(const std::vector &layer_height_profile) else ranges.emplace_back(volumes_and_ranges[j].first); // slicing in parallel - sliced_volumes.emplace_back(volume_id, (int)region_id, this->slice_volume(slice_zs, ranges, *model_volume)); + sliced_volumes.emplace_back(volume_id, (int)region_id, this->slice_volume(slice_zs, ranges, slicing_mode, *model_volume)); i = j; } else ++ i; @@ -1888,7 +1913,7 @@ end: } // To be used only if there are no layer span specific configurations applied, which would lead to z ranges being generated for this region. -std::vector PrintObject::slice_region(size_t region_id, const std::vector &z) const +std::vector PrintObject::slice_region(size_t region_id, const std::vector &z, SlicingMode mode) const { std::vector volumes; if (region_id < this->region_volumes.size()) { @@ -1898,7 +1923,7 @@ std::vector PrintObject::slice_region(size_t region_id, const std::v volumes.emplace_back(volume); } } - return this->slice_volumes(z, volumes); + return this->slice_volumes(z, mode, volumes); } // Z ranges are not applicable to modifier meshes, therefore a sinle volume will be found in volume_and_range at most once. @@ -1948,7 +1973,7 @@ std::vector PrintObject::slice_modifiers(size_t region_id, const std if (volume->is_modifier()) volumes.emplace_back(volume); } - out = this->slice_volumes(slice_zs, volumes); + out = this->slice_volumes(slice_zs, SlicingMode::Regular, volumes); } else { // Some modifier in this region was split to layer spans. std::vector merge; @@ -1966,7 +1991,7 @@ std::vector PrintObject::slice_modifiers(size_t region_id, const std for (; j < volumes_and_ranges.size() && volume_id == volumes_and_ranges[j].second; ++ j) ranges.emplace_back(volumes_and_ranges[j].first); // slicing in parallel - std::vector this_slices = this->slice_volume(slice_zs, ranges, *model_volume); + std::vector this_slices = this->slice_volume(slice_zs, ranges, SlicingMode::Regular, *model_volume); if (out.empty()) { out = std::move(this_slices); merge.assign(out.size(), false); @@ -2005,10 +2030,10 @@ std::vector PrintObject::slice_support_volumes(const ModelVolumeType zs.reserve(this->layers().size()); for (const Layer *l : this->layers()) zs.emplace_back((float)l->slice_z); - return this->slice_volumes(zs, volumes); + return this->slice_volumes(zs, SlicingMode::Regular, volumes); } -std::vector PrintObject::slice_volumes(const std::vector &z, const std::vector &volumes) const +std::vector PrintObject::slice_volumes(const std::vector &z, SlicingMode mode, const std::vector &volumes) const { std::vector layers; if (! volumes.empty()) { @@ -2038,14 +2063,14 @@ std::vector PrintObject::slice_volumes(const std::vector &z, mesh.require_shared_vertices(); TriangleMeshSlicer mslicer; mslicer.init(&mesh, callback); - mslicer.slice(z, float(m_config.slice_closing_radius.value), &layers, callback); + mslicer.slice(z, mode, float(m_config.slice_closing_radius.value), &layers, callback); m_print->throw_if_canceled(); } } return layers; } -std::vector PrintObject::slice_volume(const std::vector &z, const ModelVolume &volume) const +std::vector PrintObject::slice_volume(const std::vector &z, SlicingMode mode, const ModelVolume &volume) const { std::vector layers; if (! z.empty()) { @@ -2068,7 +2093,7 @@ std::vector PrintObject::slice_volume(const std::vector &z, c // TriangleMeshSlicer needs the shared vertices. mesh.require_shared_vertices(); mslicer.init(&mesh, callback); - mslicer.slice(z, float(m_config.slice_closing_radius.value), &layers, callback); + mslicer.slice(z, mode, float(m_config.slice_closing_radius.value), &layers, callback); m_print->throw_if_canceled(); } } @@ -2076,13 +2101,13 @@ std::vector PrintObject::slice_volume(const std::vector &z, c } // Filter the zs not inside the ranges. The ranges are closed at the botton and open at the top, they are sorted lexicographically and non overlapping. -std::vector PrintObject::slice_volume(const std::vector &z, const std::vector &ranges, const ModelVolume &volume) const +std::vector PrintObject::slice_volume(const std::vector &z, const std::vector &ranges, SlicingMode mode, const ModelVolume &volume) const { std::vector out; if (! z.empty() && ! ranges.empty()) { if (ranges.size() == 1 && z.front() >= ranges.front().first && z.back() < ranges.front().second) { // All layers fit into a single range. - out = this->slice_volume(z, volume); + out = this->slice_volume(z, mode, volume); } else { std::vector z_filtered; std::vector> n_filtered; @@ -2098,7 +2123,7 @@ std::vector PrintObject::slice_volume(const std::vector &z, c n_filtered.emplace_back(std::make_pair(first, i)); } if (! n_filtered.empty()) { - std::vector layers = this->slice_volume(z_filtered, volume); + std::vector layers = this->slice_volume(z_filtered, mode, volume); out.assign(z.size(), ExPolygons()); i = 0; for (const std::pair &span : n_filtered) @@ -2453,7 +2478,8 @@ void PrintObject::discover_horizontal_shells() // is grown, and that little space is an internal solid shell so // it triggers this too_narrow logic.) internal)); - solid = new_internal_solid; + // see https://github.com/prusa3d/PrusaSlicer/pull/3426 + // solid = new_internal_solid; } } diff --git a/src/libslic3r/SLA/Hollowing.cpp b/src/libslic3r/SLA/Hollowing.cpp index 2a9662e85d..c4a616d93a 100644 --- a/src/libslic3r/SLA/Hollowing.cpp +++ b/src/libslic3r/SLA/Hollowing.cpp @@ -262,7 +262,7 @@ void cut_drainholes(std::vector & obj_slices, TriangleMeshSlicer slicer(&mesh); std::vector hole_slices; - slicer.slice(slicegrid, closing_radius, &hole_slices, thr); + slicer.slice(slicegrid, SlicingMode::Regular, closing_radius, &hole_slices, thr); if (obj_slices.size() != hole_slices.size()) BOOST_LOG_TRIVIAL(warning) diff --git a/src/libslic3r/SLA/Pad.cpp b/src/libslic3r/SLA/Pad.cpp index 742f0db1bd..cf17867583 100644 --- a/src/libslic3r/SLA/Pad.cpp +++ b/src/libslic3r/SLA/Pad.cpp @@ -638,7 +638,7 @@ void pad_blueprint(const TriangleMesh & mesh, TriangleMeshSlicer slicer(&mesh); auto out = reserve_vector(heights.size()); - slicer.slice(heights, 0.f, &out, thrfn); + slicer.slice(heights, SlicingMode::Regular, 0.f, &out, thrfn); size_t count = 0; for(auto& o : out) count += o.size(); diff --git a/src/libslic3r/SLA/SupportTree.cpp b/src/libslic3r/SLA/SupportTree.cpp index 3024883edd..5ee35f9e0a 100644 --- a/src/libslic3r/SLA/SupportTree.cpp +++ b/src/libslic3r/SLA/SupportTree.cpp @@ -61,7 +61,7 @@ std::vector SupportTree::slice( slices.emplace_back(); TriangleMeshSlicer sup_slicer(&sup_mesh); - sup_slicer.slice(grid, cr, &slices.back(), ctl().cancelfn); + sup_slicer.slice(grid, SlicingMode::Regular, cr, &slices.back(), ctl().cancelfn); } if (!pad_mesh.empty()) { @@ -75,7 +75,7 @@ std::vector SupportTree::slice( std::copy(grid.begin(), maxzit, std::back_inserter(padgrid)); TriangleMeshSlicer pad_slicer(&pad_mesh); - pad_slicer.slice(padgrid, cr, &slices.back(), ctl().cancelfn); + pad_slicer.slice(padgrid, SlicingMode::Regular, cr, &slices.back(), ctl().cancelfn); } size_t len = grid.size(); diff --git a/src/libslic3r/SLAPrintSteps.cpp b/src/libslic3r/SLAPrintSteps.cpp index 3fb99afbfe..ff170d917a 100644 --- a/src/libslic3r/SLAPrintSteps.cpp +++ b/src/libslic3r/SLAPrintSteps.cpp @@ -220,7 +220,7 @@ void SLAPrint::Steps::slice_model(SLAPrintObject &po) float closing_r = float(po.config().slice_closing_radius.value); auto thr = [this]() { m_print->throw_if_canceled(); }; auto &slice_grid = po.m_model_height_levels; - slicer.slice(slice_grid, closing_r, &po.m_model_slices, thr); + slicer.slice(slice_grid, SlicingMode::Regular, closing_r, &po.m_model_slices, thr); // sla::DrainHoles drainholes = po.transformed_drainhole_points(); // cut_drainholes(po.m_model_slices, slice_grid, closing_r, drainholes, thr); diff --git a/src/libslic3r/TriangleMesh.cpp b/src/libslic3r/TriangleMesh.cpp index 4c6cd62cf2..ee5e96f3d8 100644 --- a/src/libslic3r/TriangleMesh.cpp +++ b/src/libslic3r/TriangleMesh.cpp @@ -627,7 +627,7 @@ std::vector TriangleMesh::slice(const std::vector &z) std::vector z_f(z.begin(), z.end()); TriangleMeshSlicer mslicer(this); std::vector layers; - mslicer.slice(z_f, 0.0004f, &layers, [](){}); + mslicer.slice(z_f, SlicingMode::Regular, 0.0004f, &layers, [](){}); return layers; } @@ -776,7 +776,7 @@ void TriangleMeshSlicer::set_up_direction(const Vec3f& up) -void TriangleMeshSlicer::slice(const std::vector &z, std::vector* layers, throw_on_cancel_callback_type throw_on_cancel) const +void TriangleMeshSlicer::slice(const std::vector &z, SlicingMode mode, std::vector* layers, throw_on_cancel_callback_type throw_on_cancel) const { BOOST_LOG_TRIVIAL(debug) << "TriangleMeshSlicer::slice"; @@ -831,11 +831,38 @@ void TriangleMeshSlicer::slice(const std::vector &z, std::vectorresize(z.size()); tbb::parallel_for( tbb::blocked_range(0, z.size()), - [&lines, &layers, throw_on_cancel, this](const tbb::blocked_range& range) { + [&lines, &layers, mode, throw_on_cancel, this](const tbb::blocked_range& range) { for (size_t line_idx = range.begin(); line_idx < range.end(); ++ line_idx) { if ((line_idx & 0x0ffff) == 0) throw_on_cancel(); - this->make_loops(lines[line_idx], &(*layers)[line_idx]); + + Polygons &polygons = (*layers)[line_idx]; + this->make_loops(lines[line_idx], &polygons); + + if (! polygons.empty()) { + if (mode == SlicingMode::Positive) { + // Reorient all loops to be CCW. + for (Polygon& p : polygons) + p.make_counter_clockwise(); + } else if (mode == SlicingMode::PositiveLargestContour) { + // Keep just the largest polygon, make it CCW. + double max_area = 0.; + Polygon* max_area_polygon = nullptr; + for (Polygon& p : polygons) { + double a = p.area(); + if (std::abs(a) > std::abs(max_area)) { + max_area = a; + max_area_polygon = &p; + } + } + assert(max_area_polygon != nullptr); + if (max_area < 0.) + max_area_polygon->reverse(); + Polygon p(std::move(*max_area_polygon)); + polygons.clear(); + polygons.emplace_back(std::move(p)); + } + } } } ); @@ -913,22 +940,25 @@ void TriangleMeshSlicer::_slice_do(size_t facet_idx, std::vector &z, const float closing_radius, std::vector* layers, throw_on_cancel_callback_type throw_on_cancel) const +void TriangleMeshSlicer::slice(const std::vector &z, SlicingMode mode, const float closing_radius, std::vector* layers, throw_on_cancel_callback_type throw_on_cancel) const { std::vector layers_p; - this->slice(z, &layers_p, throw_on_cancel); + this->slice(z, (mode == SlicingMode::PositiveLargestContour) ? SlicingMode::Positive : mode, &layers_p, throw_on_cancel); BOOST_LOG_TRIVIAL(debug) << "TriangleMeshSlicer::make_expolygons in parallel - start"; layers->resize(z.size()); tbb::parallel_for( tbb::blocked_range(0, z.size()), - [&layers_p, closing_radius, layers, throw_on_cancel, this](const tbb::blocked_range& range) { + [&layers_p, mode, closing_radius, layers, throw_on_cancel, this](const tbb::blocked_range& range) { for (size_t layer_id = range.begin(); layer_id < range.end(); ++ layer_id) { #ifdef SLIC3R_TRIANGLEMESH_DEBUG printf("Layer " PRINTF_ZU " (slice_z = %.2f):\n", layer_id, z[layer_id]); #endif throw_on_cancel(); - this->make_expolygons(layers_p[layer_id], closing_radius, &(*layers)[layer_id]); + ExPolygons &expolygons = (*layers)[layer_id]; + this->make_expolygons(layers_p[layer_id], closing_radius, &expolygons); + if (mode == SlicingMode::PositiveLargestContour) + keep_largest_contour_only(expolygons); } }); BOOST_LOG_TRIVIAL(debug) << "TriangleMeshSlicer::make_expolygons in parallel - end"; diff --git a/src/libslic3r/TriangleMesh.hpp b/src/libslic3r/TriangleMesh.hpp index 1a22a93435..bd872a975a 100644 --- a/src/libslic3r/TriangleMesh.hpp +++ b/src/libslic3r/TriangleMesh.hpp @@ -162,6 +162,16 @@ public: typedef std::vector IntersectionLines; typedef std::vector IntersectionLinePtrs; +enum class SlicingMode : uint32_t { + // Regular slicing, maintain all contours and their orientation. + Regular, + // Maintain all contours, orient all contours CCW, therefore all holes are being closed. + Positive, + // Orient all contours CCW and keep only the contour with the largest area. + // This mode is useful for slicing complex objects in vase mode. + PositiveLargestContour, +}; + class TriangleMeshSlicer { public: @@ -169,8 +179,8 @@ public: TriangleMeshSlicer() : mesh(nullptr) {} TriangleMeshSlicer(const TriangleMesh* mesh) { this->init(mesh, [](){}); } void init(const TriangleMesh *mesh, throw_on_cancel_callback_type throw_on_cancel); - void slice(const std::vector &z, std::vector* layers, throw_on_cancel_callback_type throw_on_cancel) const; - void slice(const std::vector &z, const float closing_radius, std::vector* layers, throw_on_cancel_callback_type throw_on_cancel) const; + void slice(const std::vector &z, SlicingMode mode, std::vector* layers, throw_on_cancel_callback_type throw_on_cancel) const; + void slice(const std::vector &z, SlicingMode mode, const float closing_radius, std::vector* layers, throw_on_cancel_callback_type throw_on_cancel) const; enum FacetSliceType { NoSlice = 0, Slicing = 1, @@ -207,7 +217,7 @@ inline void slice_mesh( { if (mesh.empty()) return; TriangleMeshSlicer slicer(&mesh); - slicer.slice(z, &layers, thr); + slicer.slice(z, SlicingMode::Regular, &layers, thr); } inline void slice_mesh( @@ -219,7 +229,7 @@ inline void slice_mesh( { if (mesh.empty()) return; TriangleMeshSlicer slicer(&mesh); - slicer.slice(z, closing_radius, &layers, thr); + slicer.slice(z, SlicingMode::Regular, closing_radius, &layers, thr); } TriangleMesh make_cube(double x, double y, double z); diff --git a/src/slic3r/GUI/ConfigManipulation.cpp b/src/slic3r/GUI/ConfigManipulation.cpp index a8773d7361..0d38ee5660 100644 --- a/src/slic3r/GUI/ConfigManipulation.cpp +++ b/src/slic3r/GUI/ConfigManipulation.cpp @@ -70,14 +70,21 @@ void ConfigManipulation::update_print_fff_config(DynamicPrintConfig* config, con double fill_density = config->option("fill_density")->value; if (config->opt_bool("spiral_vase") && - !(config->opt_int("perimeters") == 1 && config->opt_int("top_solid_layers") == 0 && - fill_density == 0)) { + ! (config->opt_int("perimeters") == 1 && + config->opt_int("top_solid_layers") == 0 && + fill_density == 0 && + ! config->opt_bool("support_material") && + config->opt_int("support_material_enforce_layers") == 0 && + config->opt_bool("ensure_vertical_shell_thickness") && + ! config->opt_bool("thin_walls"))) + { wxString msg_text = _(L("The Spiral Vase mode requires:\n" "- one perimeter\n" "- no top solid layers\n" "- 0% fill density\n" "- no support material\n" - "- inactive Ensure vertical shell thickness")); + "- Ensure vertical shell thickness enabled\n" + "- Detect thin walls disabled")); if (is_global_config) msg_text += "\n\n" + _(L("Shall I adjust those settings in order to enable Spiral Vase?")); wxMessageDialog dialog(nullptr, msg_text, _(L("Spiral Vase")), @@ -90,7 +97,8 @@ void ConfigManipulation::update_print_fff_config(DynamicPrintConfig* config, con new_conf.set_key_value("fill_density", new ConfigOptionPercent(0)); new_conf.set_key_value("support_material", new ConfigOptionBool(false)); new_conf.set_key_value("support_material_enforce_layers", new ConfigOptionInt(0)); - new_conf.set_key_value("ensure_vertical_shell_thickness", new ConfigOptionBool(false)); + new_conf.set_key_value("ensure_vertical_shell_thickness", new ConfigOptionBool(true)); + new_conf.set_key_value("thin_walls", new ConfigOptionBool(false)); fill_density = 0; } else { diff --git a/src/slic3r/GUI/MeshUtils.cpp b/src/slic3r/GUI/MeshUtils.cpp index 3bf99f73c6..37b6efd87e 100644 --- a/src/slic3r/GUI/MeshUtils.cpp +++ b/src/slic3r/GUI/MeshUtils.cpp @@ -74,7 +74,7 @@ void MeshClipper::recalculate_triangles() // Now do the cutting std::vector list_of_expolys; m_tms->set_up_direction(up); - m_tms->slice(std::vector{height_mesh}, 0.f, &list_of_expolys, [](){}); + m_tms->slice(std::vector{height_mesh}, SlicingMode::Regular, 0.f, &list_of_expolys, [](){}); m_triangles2d = triangulate_expolygons_2f(list_of_expolys[0], m_trafo.get_matrix().matrix().determinant() < 0.); // Rotate the cut into world coords: From 76433da64c24c5aa73ac247bf963fef9c313dadf Mon Sep 17 00:00:00 2001 From: bubnikv Date: Sat, 8 Feb 2020 22:11:44 +0100 Subject: [PATCH 290/336] Printer profiles were updated by @rtyr --- resources/profiles/Creality.idx | 1 + resources/profiles/Creality.ini | 6 +- resources/profiles/PrusaResearch.idx | 1 + resources/profiles/PrusaResearch.ini | 149 +++++++++++++++++++-------- 4 files changed, 113 insertions(+), 44 deletions(-) diff --git a/resources/profiles/Creality.idx b/resources/profiles/Creality.idx index d877ae7c9b..9ac64e8cf1 100644 --- a/resources/profiles/Creality.idx +++ b/resources/profiles/Creality.idx @@ -1,4 +1,5 @@ min_slic3r_version = 2.2.0-alpha3 +0.0.2-alpha1 Extended list of default filaments to be installed 0.0.2-alpha0 Print bed textures are now configurable from the Preset Bundle. Requires PrusaSlicer 2.2.0-alpha3 and newer. # The following line (max_slic3r_version) forces the users of PrusaSlicer 2.2.0-alpha3 and newer to update the profiles to 1.1.1-alpha3 and newer, # so they will see the print bed. diff --git a/resources/profiles/Creality.ini b/resources/profiles/Creality.ini index 4f8dbe572d..ddb0437758 100644 --- a/resources/profiles/Creality.ini +++ b/resources/profiles/Creality.ini @@ -5,7 +5,7 @@ name = Creality # Configuration version of this file. Config file will only be installed, if the config_version differs. # This means, the server may force the PrusaSlicer configuration to be downgraded. -config_version = 0.0.2-alpha0 +config_version = 0.0.2-alpha1 # Where to get the updates from? config_update_url = http://files.prusa3d.com/wp-content/uploads/repository/PrusaSlicer-settings-master/live/Creality/ # changelog_url = http://files.prusa3d.com/?latest=slicer-profiles&lng=%1% @@ -20,7 +20,7 @@ variants = 0.4 technology = FFF bed_model = ender3_bed.stl bed_texture = ender3.svg -default_materials = Creality PLA @ENDER3; Prusament PLA @ENDER3 +default_materials = Generic PLA @ENDER3; Generic PETG @ENDER3; Generic ABS @ENDER3; Prusament PLA @ENDER3; Prusament PETG @ENDER3 # All presets starting with asterisk, for example *common*, are intermediate and they will # not make it into the user interface. @@ -422,4 +422,4 @@ retract_before_wipe = 70% default_print_profile = 0.20mm NORMAL default_filament_profile = Creality PLA start_gcode = G90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 ; home all\nG1 Z2 F240\nG1 X2 Y10 F3000\nG1 Z0.28 F240\nG92 E0.0\nG1 Y190 E15.0 F1500.0 ; intro line\nG1 X2.3 F5000\nG1 Y10 E30 F1200.0 ; intro line\nG92 E0.0 -end_gcode = M104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+10, max_print_height)} F600{endif} ; Move print head up\nG1 X0 Y200 F3000 ; present print\nM84 X Y E ; disable motors \ No newline at end of file +end_gcode = M104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+10, max_print_height)} F600{endif} ; Move print head up\nG1 X0 Y200 F3000 ; present print\nM84 X Y E ; disable motors diff --git a/resources/profiles/PrusaResearch.idx b/resources/profiles/PrusaResearch.idx index 9ac22c59d0..d063303d92 100644 --- a/resources/profiles/PrusaResearch.idx +++ b/resources/profiles/PrusaResearch.idx @@ -1,4 +1,5 @@ min_slic3r_version = 2.2.0-alpha3 +1.1.1-alpha4 Extended list of default filaments to be installed, top/bottom_solid_min_thickness defined, infill_acceleration changed etc 1.1.1-alpha3 Print bed textures are now configurable from the Preset Bundle. Requires PrusaSlicer 2.2.0-alpha3 and newer. # The following line (max_slic3r_version) forces the users of PrusaSlicer 2.2.0-alpha3 and newer to update the profiles to 1.1.1-alpha3 and newer, # so they will see the print bed. diff --git a/resources/profiles/PrusaResearch.ini b/resources/profiles/PrusaResearch.ini index aa4b7cff07..cc791097d2 100644 --- a/resources/profiles/PrusaResearch.ini +++ b/resources/profiles/PrusaResearch.ini @@ -5,7 +5,7 @@ name = Prusa Research # Configuration version of this file. Config file will only be installed, if the config_version differs. # This means, the server may force the PrusaSlicer configuration to be downgraded. -config_version = 1.1.1-alpha3 +config_version = 1.1.1-alpha4 # Where to get the updates from? config_update_url = http://files.prusa3d.com/wp-content/uploads/repository/PrusaSlicer-settings-master/live/PrusaResearch/ changelog_url = http://files.prusa3d.com/?latest=slicer-profiles&lng=%1% @@ -24,7 +24,7 @@ technology = FFF family = MINI bed_model = mini_bed.stl bed_texture = mini.svg -default_materials = Prusament PLA; Prusament PETG @MINI +default_materials = Generic PLA; Generic ABS @MINI; Generic PETG @MINI; Prusament PLA; Prusament PETG @MINI; Prusament ASA @MINI [printer_model:MK3S] name = Original Prusa i3 MK3S @@ -33,7 +33,7 @@ technology = FFF family = MK3 bed_model = mk3_bed.stl bed_texture = mk3.svg -default_materials = Prusament PLA; Prusament PETG +default_materials = Generic PLA; Generic ABS; Generic PETG; Prusament PLA; Prusament PETG; Prusament ASA [printer_model:MK3] name = Original Prusa i3 MK3 @@ -42,7 +42,7 @@ technology = FFF family = MK3 bed_model = mk3_bed.stl bed_texture = mk3.svg -default_materials = Prusament PLA; Prusament PETG +default_materials = Generic PLA; Generic ABS; Generic PETG; Prusament PLA; Prusament PETG; Prusament ASA [printer_model:MK3SMMU2S] name = Original Prusa i3 MK3S MMU2S @@ -51,7 +51,7 @@ technology = FFF family = MK3 bed_model = mk3_bed.stl bed_texture = mk3.svg -default_materials = Prusament PLA @MMU2; Prusament PETG @MMU2 +default_materials = Generic PLA; Generic ABS; Generic PETG; Prusament PLA @MMU2; Prusament PETG @MMU2; Prusament ASA @MMU2; Verbatim BVOH @MMU2 [printer_model:MK3MMU2] name = Original Prusa i3 MK3 MMU2 @@ -60,7 +60,7 @@ technology = FFF family = MK3 bed_model = mk3_bed.stl bed_texture = mk3.svg -default_materials = Prusament PLA @MMU2; Prusament PETG @MMU2 +default_materials = Generic PLA; Generic ABS; Generic PETG; Prusament PLA @MMU2; Prusament PETG @MMU2; Prusament ASA @MMU2; Verbatim BVOH @MMU2 [printer_model:MK2.5S] name = Original Prusa i3 MK2.5S @@ -69,7 +69,7 @@ technology = FFF family = MK2.5 bed_model = mk3_bed.stl bed_texture = mk3.svg -default_materials = Prusament PLA; Prusament PETG +default_materials = Generic PLA; Generic ABS; Generic PETG; Prusament PLA; Prusament PETG; Prusament ASA [printer_model:MK2.5] name = Original Prusa i3 MK2.5 @@ -78,7 +78,7 @@ technology = FFF family = MK2.5 bed_model = mk3_bed.stl bed_texture = mk3.svg -default_materials = Prusament PLA; Prusament PETG +default_materials = Generic PLA; Generic ABS; Generic PETG; Prusament PLA; Prusament PETG; Prusament ASA [printer_model:MK2.5SMMU2S] name = Original Prusa i3 MK2.5S MMU2S @@ -87,7 +87,7 @@ technology = FFF family = MK2.5 bed_model = mk3_bed.stl bed_texture = mk3.svg -default_materials = Prusament PLA @MMU2; Prusament PETG @MMU2 +default_materials = Generic PLA; Generic ABS; Generic PETG; Prusament PLA @MMU2; Prusament PETG @MMU2; Prusament ASA @MMU2; Verbatim BVOH @MMU2 [printer_model:MK2.5MMU2] name = Original Prusa i3 MK2.5 MMU2 @@ -96,7 +96,7 @@ technology = FFF family = MK2.5 bed_model = mk3_bed.stl bed_texture = mk3.svg -default_materials = Prusament PLA @MMU2; Prusament PETG @MMU2 +default_materials = Generic PLA; Generic ABS; Generic PETG; Prusament PLA @MMU2; Prusament PETG @MMU2; Prusament ASA @MMU2; Verbatim BVOH @MMU2 [printer_model:MK2S] name = Original Prusa i3 MK2S @@ -105,7 +105,7 @@ technology = FFF family = MK2 bed_model = mk2_bed.stl bed_texture = mk2.svg -default_materials = Prusament PLA; Prusament PETG +default_materials = Generic PLA; Generic ABS; Generic PETG; Prusament PLA; Prusament PETG; Prusament ASA [printer_model:MK2SMM] name = Original Prusa i3 MK2S MMU1 @@ -114,7 +114,7 @@ technology = FFF family = MK2 bed_model = mk2_bed.stl bed_texture = mk2.svg -default_materials = Prusament PLA; Prusament PETG @MMU1 +default_materials = Generic PLA; Generic ABS; Generic PETG @MMU1; Prusament PLA; Prusament PETG @MMU1; Prusament ASA [printer_model:SL1] name = Original Prusa SL1 @@ -123,7 +123,7 @@ technology = SLA family = SL1 bed_model = sl1_bed.stl bed_texture = sl1.svg -default_materials = Prusa Transparent Tough @0.05 +default_materials = Prusa Orange Tough @0.05 # All presets starting with asterisk, for example *common*, are intermediate and they will # not make it into the user interface. @@ -226,6 +226,8 @@ wipe_tower_width = 60 wipe_tower_x = 170 wipe_tower_y = 140 xy_size_compensation = 0 +top_solid_min_thickness = 0.6 +bottom_solid_min_thickness = 0.5 [print:*MK3*] fill_pattern = grid @@ -359,9 +361,9 @@ output_filename_format = {input_filename_base}_{nozzle_diameter[0]}n_{layer_heig external_perimeter_extrusion_width = 0.65 extrusion_width = 0.65 first_layer_extrusion_width = 0.65 -infill_extrusion_width = 0.7 +infill_extrusion_width = 0.65 perimeter_extrusion_width = 0.65 -solid_infill_extrusion_width = 0.7 +solid_infill_extrusion_width = 0.65 top_infill_extrusion_width = 0.6 support_material_extrusion_width = 0.55 bridge_flow_ratio = 0.95 @@ -555,7 +557,7 @@ inherits = *0.10mm*; *MK3* bridge_speed = 30 compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and nozzle_diameter[0]==0.4 and ! single_extruder_multi_material external_perimeter_speed = 25 -infill_acceleration = 1250 +infill_acceleration = 1000 infill_speed = 80 max_print_speed = 200 perimeter_speed = 45 @@ -655,7 +657,7 @@ inherits = *0.15mm*; *MK3* bridge_speed = 30 compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and nozzle_diameter[0]==0.4 external_perimeter_speed = 25 -infill_acceleration = 1250 +infill_acceleration = 1000 infill_speed = 80 max_print_speed = 200 perimeter_speed = 45 @@ -670,7 +672,7 @@ inherits = *0.15mm*; *MK3* bridge_speed = 30 compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and nozzle_diameter[0]==0.4 external_perimeter_speed = 35 -infill_acceleration = 1250 +infill_acceleration = 1000 infill_speed = 200 max_print_speed = 200 perimeter_speed = 60 @@ -735,7 +737,7 @@ inherits = *0.15mm*; *0.6nozzleMK3*; *MK306* # alias = 0.15mm DETAIL compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and nozzle_diameter[0]==0.6 external_perimeter_speed = 35 -infill_acceleration = 1250 +infill_acceleration = 1000 infill_speed = 70 max_print_speed = 100 perimeter_speed = 45 @@ -780,7 +782,7 @@ inherits = *0.20mm*; *MK3* bridge_speed = 30 compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and nozzle_diameter[0]==0.4 external_perimeter_speed = 25 -infill_acceleration = 1250 +infill_acceleration = 1000 infill_speed = 80 max_print_speed = 200 perimeter_speed = 45 @@ -795,7 +797,7 @@ inherits = *0.20mm*; *MK3* bridge_speed = 30 compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and nozzle_diameter[0]==0.4 external_perimeter_speed = 35 -infill_acceleration = 1250 +infill_acceleration = 1000 infill_speed = 200 max_print_speed = 200 perimeter_speed = 60 @@ -860,7 +862,7 @@ inherits = *0.20mm*; *0.6nozzleMK3*; *MK306* # alias = 0.20mm DETAIL compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and nozzle_diameter[0]==0.6 external_perimeter_speed = 35 -infill_acceleration = 1250 +infill_acceleration = 1000 infill_speed = 70 max_print_speed = 100 perimeter_speed = 45 @@ -905,7 +907,7 @@ inherits = *0.30mm*; *0.6nozzleMK3*; *MK306* # alias = 0.30mm QUALITY compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and nozzle_diameter[0]==0.6 external_perimeter_speed = 35 -infill_acceleration = 1250 +infill_acceleration = 1000 infill_speed = 70 max_print_speed = 100 perimeter_speed = 45 @@ -942,7 +944,7 @@ bottom_solid_layers = 3 bridge_speed = 30 compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and nozzle_diameter[0]==0.4 external_perimeter_speed = 35 -infill_acceleration = 1250 +infill_acceleration = 1000 infill_speed = 85 max_print_speed = 200 perimeter_speed = 50 @@ -1027,7 +1029,7 @@ inherits = *0.35mm*; *0.6nozzleMK3*; *MK306* # alias = 0.35mm SPEED compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and nozzle_diameter[0]==0.6 external_perimeter_speed = 35 -infill_acceleration = 1250 +infill_acceleration = 1000 infill_speed = 70 max_print_speed = 100 perimeter_speed = 45 @@ -1035,6 +1037,8 @@ solid_infill_speed = 70 top_solid_infill_speed = 45 external_perimeter_extrusion_width = 0.68 perimeter_extrusion_width = 0.68 +infill_extrusion_width = 0.68 +solid_infill_extrusion_width = 0.68 # XXXXXXXXXXXXXXXXXXXX # XXX--- 0.40mm ---XXX @@ -1063,7 +1067,7 @@ inherits = *0.40mm*; *0.6nozzleMK3*; *MK306* # alias = 0.40mm DRAFT compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and nozzle_diameter[0]==0.6 external_perimeter_speed = 35 -infill_acceleration = 1250 +infill_acceleration = 1000 infill_speed = 70 max_print_speed = 100 perimeter_speed = 45 @@ -1185,6 +1189,7 @@ top_infill_extrusion_width = 0.4 small_perimeter_speed = 15 perimeter_extrusion_width = 0.4 external_perimeter_extrusion_width = 0.4 +support_material_xy_spacing = 60% [print:0.07mm ULTRADETAIL @MINI] inherits = *0.07mm*; *MINI* @@ -1196,6 +1201,7 @@ top_infill_extrusion_width = 0.4 small_perimeter_speed = 15 perimeter_extrusion_width = 0.4 external_perimeter_extrusion_width = 0.4 +support_material_xy_spacing = 60% [print:0.10mm DETAIL @MINI] inherits = *0.10mm*; *MINI* @@ -1212,6 +1218,7 @@ fill_pattern = gyroid fill_density = 15% perimeters = 3 bridge_acceleration = 1000 +support_material_xy_spacing = 60% [print:0.15mm QUALITY @MINI] inherits = *0.15mm*; *MINI* @@ -1226,6 +1233,7 @@ top_solid_infill_speed = 40 fill_pattern = gyroid fill_density = 15% bridge_flow_ratio = 0.85 +support_material_xy_spacing = 60% [print:0.15mm SPEED @MINI] inherits = *0.15mm*; *MINI* @@ -1238,6 +1246,7 @@ infill_speed = 140 solid_infill_speed = 140 top_solid_infill_speed = 40 bridge_flow_ratio = 0.85 +support_material_xy_spacing = 60% [print:0.20mm QUALITY @MINI] inherits = *0.20mm*; *MINI* @@ -1251,6 +1260,7 @@ solid_infill_speed = 80 top_solid_infill_speed = 40 fill_pattern = gyroid fill_density = 15% +support_material_xy_spacing = 60% [print:0.20mm SPEED @MINI] inherits = *0.20mm*; *MINI* @@ -1263,6 +1273,7 @@ infill_speed = 140 max_print_speed = 150 solid_infill_speed = 140 top_solid_infill_speed = 40 +support_material_xy_spacing = 60% [print:0.25mm DRAFT @MINI] inherits = *0.25mm*; *MINI* @@ -1279,6 +1290,7 @@ first_layer_extrusion_width = 0.42 infill_extrusion_width = 0.45 solid_infill_extrusion_width = 0.45 top_infill_extrusion_width = 0.4 +support_material_xy_spacing = 60% # 0.25mm nozzle @@ -1551,7 +1563,7 @@ bridge_fan_speed = 80 compatible_printers_condition = nozzle_diameter[0]>0.35 and printer_model!="MK2SMM" and printer_model!="MINI" and num_extruders==1 && ! (printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and single_extruder_multi_material) cooling = 0 disable_fan_first_layers = 3 -extrusion_multiplier = 1.2 +extrusion_multiplier = 1.15 fan_always_on = 0 fan_below_layer_time = 100 filament_colour = #008000 @@ -1626,7 +1638,7 @@ filament_density = 1.24 inherits = *PLA* filament_vendor = ColorFabb compatible_printers_condition = nozzle_diameter[0]>0.35 and ! (printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material) -extrusion_multiplier = 1.2 +extrusion_multiplier = 1.1 filament_cost = 58.30 filament_density = 1.15 filament_colour = #dfc287 @@ -1634,12 +1646,13 @@ filament_max_volumetric_speed = 9 first_layer_temperature = 200 start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/}0{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}0{else}10{endif}; Filament gcode" temperature = 200 +filament_retract_lift = 0.2 [filament:ColorFabb corkFill] inherits = *PLA* filament_vendor = ColorFabb compatible_printers_condition = nozzle_diameter[0]>0.35 and ! (printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material) -extrusion_multiplier = 1.2 +extrusion_multiplier = 1.1 filament_cost = 58.30 filament_density = 1.18 filament_colour = #634d33 @@ -1647,6 +1660,7 @@ filament_max_volumetric_speed = 6 first_layer_temperature = 220 start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/}0{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}0{else}10{endif}; Filament gcode" temperature = 220 +filament_retract_lift = 0.2 [filament:ColorFabb XT] inherits = *PET* @@ -1788,7 +1802,7 @@ temperature = 275 inherits = *PLA* filament_vendor = Fillamentum compatible_printers_condition = nozzle_diameter[0]>0.35 and ! (printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material) -extrusion_multiplier = 1.2 +extrusion_multiplier = 1.1 filament_cost = 68 filament_density = 1.15 filament_colour = #804040 @@ -1796,6 +1810,21 @@ filament_max_volumetric_speed = 10 first_layer_temperature = 190 start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/}0{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}0{else}10{endif}; Filament gcode" temperature = 190 +filament_retract_lift = 0.2 + +[filament:Smartfil Wood] +inherits = *PLA* +filament_vendor = Smart Materials 3D +compatible_printers_condition = nozzle_diameter[0]>0.35 and ! (printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material) +extrusion_multiplier = 1.1 +filament_cost = 68 +filament_density = 1.58 +filament_colour = #804040 +filament_max_volumetric_speed = 9 +first_layer_temperature = 220 +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/}0{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}0{else}10{endif}; Filament gcode" +temperature = 220 +filament_retract_lift = 0.2 [filament:Generic ABS] inherits = *ABS* @@ -1855,7 +1884,7 @@ inherits = *FLEX* filament_vendor = SainSmart fan_always_on = 1 filament_max_volumetric_speed = 2.5 -extrusion_multiplier = 1.15 +extrusion_multiplier = 1.1 first_layer_temperature = 230 first_layer_bed_temperature = 50 temperature = 230 @@ -1881,7 +1910,7 @@ inherits = *FLEX* filament_vendor = Filatech fan_always_on = 1 filament_max_volumetric_speed = 2.5 -extrusion_multiplier = 1.15 +extrusion_multiplier = 1.1 first_layer_temperature = 230 first_layer_bed_temperature = 50 temperature = 230 @@ -1914,6 +1943,7 @@ first_layer_bed_temperature = 100 first_layer_temperature = 270 temperature = 270 bridge_fan_speed = 0 +filament_max_volumetric_speed = 8 [filament:PrimaSelect PVA+] inherits = *PLA* @@ -2009,6 +2039,25 @@ min_fan_speed = 20 start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/}0{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}0{else}10{endif}; Filament gcode" temperature = 220 +[filament:Generic HIPS] +inherits = *ABS* +filament_vendor = Generic +filament_cost = 27.3 +filament_density = 1.04 +bridge_fan_speed = 50 +cooling = 1 +extrusion_multiplier = 1 +fan_always_on = 1 +fan_below_layer_time = 10 +filament_colour = #FFFFD7 +filament_soluble = 1 +filament_type = HIPS +first_layer_temperature = 230 +max_fan_speed = 20 +min_fan_speed = 20 +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/}0{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}0{else}10{endif}; Filament gcode" +temperature = 230 + [filament:Prusa PETG] inherits = *PET* filament_vendor = Made for Prusa @@ -2753,6 +2802,7 @@ filament_density = 1.07 inherits = Polymaker PC-Max; *ABSMINI* # alias = Polymaker PC-Max filament_type = PC +filament_max_volumetric_speed = 7 bed_temperature = 100 filament_colour = #3A80CA first_layer_bed_temperature = 100 @@ -2777,7 +2827,7 @@ filament_cost = 27.3 filament_density = 1.04 bridge_fan_speed = 50 cooling = 1 -extrusion_multiplier = 0.9 +extrusion_multiplier = 1 fan_always_on = 1 fan_below_layer_time = 10 filament_colour = #FFFFD7 @@ -2963,6 +3013,13 @@ initial_exposure_time = 30 material_type = Tough material_vendor = 3DM +[sla_material:3DM-TOUGH Clear 0.025] +inherits = *common 0.025* +exposure_time = 9 +initial_exposure_time = 30 +material_type = Tough +material_vendor = 3DM + [sla_material:BlueCast Phrozen Wax @0.025] inherits = *common 0.025* exposure_time = 15 @@ -3323,6 +3380,13 @@ initial_exposure_time = 30 material_type = Tough material_vendor = 3DM +[sla_material:3DM-TOUGH Clear 0.05] +inherits = *common 0.05* +exposure_time = 15 +initial_exposure_time = 30 +material_type = Tough +material_vendor = 3DM + [sla_material:FTD Ash Grey @0.05] inherits = *common 0.05* exposure_time = 9 @@ -3835,18 +3899,21 @@ min_layer_height = 0.1 inherits = Original Prusa i3 MK2S printer_model = MK2.5 remaining_times = 1 +machine_max_jerk_e = 4.5 start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0 [printer:Original Prusa i3 MK2.5 0.25 nozzle] inherits = Original Prusa i3 MK2S 0.25 nozzle printer_model = MK2.5 remaining_times = 1 +machine_max_jerk_e = 4.5 start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0 [printer:Original Prusa i3 MK2.5 0.6 nozzle] inherits = Original Prusa i3 MK2S 0.6 nozzle printer_model = MK2.5 remaining_times = 1 +machine_max_jerk_e = 4.5 start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0 [printer:Original Prusa i3 MK2.5 MMU2 Single] @@ -3867,7 +3934,7 @@ machine_max_feedrate_e = 120 machine_max_feedrate_x = 500 machine_max_feedrate_y = 500 machine_max_feedrate_z = 12 -machine_max_jerk_e = 2.5 +machine_max_jerk_e = 4.5 machine_max_jerk_x = 10 machine_max_jerk_y = 10 machine_max_jerk_z = 0.2 @@ -3904,7 +3971,7 @@ machine_max_feedrate_e = 120 machine_max_feedrate_x = 500 machine_max_feedrate_y = 500 machine_max_feedrate_z = 12 -machine_max_jerk_e = 2.5 +machine_max_jerk_e = 4.5 machine_max_jerk_x = 10 machine_max_jerk_y = 10 machine_max_jerk_z = 0.2 @@ -3954,7 +4021,7 @@ machine_max_feedrate_e = 120 machine_max_feedrate_x = 500 machine_max_feedrate_y = 500 machine_max_feedrate_z = 12 -machine_max_jerk_e = 2.5 +machine_max_jerk_e = 4.5 machine_max_jerk_x = 10 machine_max_jerk_y = 10 machine_max_jerk_z = 0.2 @@ -4003,7 +4070,7 @@ machine_max_feedrate_e = 120 machine_max_feedrate_x = 500 machine_max_feedrate_y = 500 machine_max_feedrate_z = 12 -machine_max_jerk_e = 2.5 +machine_max_jerk_e = 4.5 machine_max_jerk_x = 10 machine_max_jerk_y = 10 machine_max_jerk_z = 0.2 @@ -4053,7 +4120,7 @@ machine_max_feedrate_e = 120,120 machine_max_feedrate_x = 200,100 machine_max_feedrate_y = 200,100 machine_max_feedrate_z = 12,12 -machine_max_jerk_e = 1.5,1.5 +machine_max_jerk_e = 4.5,4.5 machine_max_jerk_x = 8,8 machine_max_jerk_y = 8,8 machine_max_jerk_z = 0.4,0.4 @@ -4261,7 +4328,7 @@ retract_lift_below = 179 retract_layer_change = 0 silent_mode = 0 remaining_times = 1 -start_gcode = G90 ; use absolute coordinates\nM83 ; extruder relative mode\nM92 E317 ; set steps/unit for extruder\nM104 S170 ; set extruder temp for bed leveling\nM140 S[first_layer_bed_temperature] ; set bed temp\nM109 R170 ; wait for bed leveling temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nG28 ; home all without mesh bed level\nG29 ; mesh bed leveling \nM104 S[first_layer_temperature] ; set extruder temp\nG92 E0.0\nG1 Y-2.0 X179 F2400\nG1 Z3 F720\nM109 S[first_layer_temperature] ; wait for extruder temp\n\n; intro line\nG1 X170 F1000\nG1 Z0.2 F720\nG1 X110.0 E8.0 F900\nG1 X40.0 E10.0 F700\nG92 E0.0\n\nM221 S95 ; set flow +start_gcode = G90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S170 ; set extruder temp for bed leveling\nM140 S[first_layer_bed_temperature] ; set bed temp\nM109 R170 ; wait for bed leveling temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nG28 ; home all without mesh bed level\nG29 ; mesh bed leveling \nM104 S[first_layer_temperature] ; set extruder temp\nG92 E0.0\nG1 Y-2.0 X179 F2400\nG1 Z3 F720\nM109 S[first_layer_temperature] ; wait for extruder temp\n\n; intro line\nG1 X170 F1000\nG1 Z0.2 F720\nG1 X110.0 E8.0 F900\nG1 X40.0 E10.0 F700\nG92 E0.0\n\nM221 S95 ; set flow end_gcode = G1 E-1 F2100 ; retract\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+5, max_print_height)}{endif} F720 ; Move print head up\nG1 X178 Y180 F4200 ; park print head\nG4 ; wait\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\nM221 S100 ; reset flow\nM84 ; disable motors printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_PRUSA3D\nPRINTER_MODEL_MINI\n extruder_colour = @@ -4280,7 +4347,7 @@ deretract_speed = 40 wipe = 1 retract_before_wipe = 70% retract_before_travel = 1 -start_gcode = G90 ; use absolute coordinates\nM83 ; extruder relative mode\nM92 E317 ; set steps/unit for extruder\nM104 S170 ; set extruder temp for bed leveling\nM140 S[first_layer_bed_temperature] ; set bed temp\nM109 R170 ; wait for bed leveling temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nG28 ; home all without mesh bed level\nG29 ; mesh bed leveling \nM104 S[first_layer_temperature] ; set extruder temp\nG92 E0.0\nG1 Y-2.0 X179 F2400\nG1 Z3 F720\nM109 S[first_layer_temperature] ; wait for extruder temp\n\n; intro line\nG1 X170 F1000\nG1 Z0.2 F720\nG1 X110.0 E8.0 F600\nG1 X40.0 E10.0 F400\nG92 E0.0\n\nM221 S95 ; set flow +start_gcode = G90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S170 ; set extruder temp for bed leveling\nM140 S[first_layer_bed_temperature] ; set bed temp\nM109 R170 ; wait for bed leveling temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nG28 ; home all without mesh bed level\nG29 ; mesh bed leveling \nM104 S[first_layer_temperature] ; set extruder temp\nG92 E0.0\nG1 Y-2.0 X179 F2400\nG1 Z3 F720\nM109 S[first_layer_temperature] ; wait for extruder temp\n\n; intro line\nG1 X170 F1000\nG1 Z0.2 F720\nG1 X110.0 E8.0 F600\nG1 X40.0 E10.0 F400\nG92 E0.0\n\nM221 S95 ; set flow [printer:Original Prusa MINI 0.6 nozzle] inherits = Original Prusa MINI @@ -4295,7 +4362,7 @@ retract_speed = 70 deretract_speed = 40 wipe = 1 retract_before_wipe = 70% -retract_before_travel = 1 +retract_before_travel = 1.5 [printer:Original Prusa SL1] printer_technology = SLA From e7d2fcf0be7a524eb8bf40dd2964539534934e96 Mon Sep 17 00:00:00 2001 From: bubnikv Date: Sun, 9 Feb 2020 09:43:15 +0100 Subject: [PATCH 291/336] Fixed unit tests broken with the previous commit (Spiral Vase fix). Fixed a crash in the previous commit. --- src/libslic3r/PrintObject.cpp | 4 +-- t/gcode.t | 36 ++++++++++--------- t/shells.t | 56 +++++++++++++++-------------- tests/sla_print/sla_print_tests.cpp | 2 +- tests/sla_print/sla_test_utils.cpp | 2 +- xs/xsp/TriangleMesh.xsp | 2 +- 6 files changed, 53 insertions(+), 49 deletions(-) diff --git a/src/libslic3r/PrintObject.cpp b/src/libslic3r/PrintObject.cpp index 04277f9318..60ee24e807 100644 --- a/src/libslic3r/PrintObject.cpp +++ b/src/libslic3r/PrintObject.cpp @@ -829,7 +829,7 @@ void PrintObject::detect_surfaces_type() // Fill in layerm->fill_surfaces by trimming the layerm->slices by the cummulative layerm->fill_surfaces. tbb::parallel_for( tbb::blocked_range(0, m_layers.size()), - [this, idx_region, interface_shells, &surfaces_new](const tbb::blocked_range& range) { + [this, idx_region, interface_shells](const tbb::blocked_range& range) { for (size_t idx_layer = range.begin(); idx_layer < range.end(); ++ idx_layer) { m_print->throw_if_canceled(); LayerRegion *layerm = m_layers[idx_layer]->m_regions[idx_region]; @@ -1145,7 +1145,7 @@ void PrintObject::discover_vertical_shells() coordf_t print_z = layer->print_z; int n_top_layers = region_config.top_solid_layers.value; for (int i = int(idx_layer) + 1; - i < int(m_layers.size()) && + i < int(cache_top_botom_regions.size()) && (i < int(idx_layer) + n_top_layers || m_layers[i]->print_z - print_z < region_config.top_solid_min_thickness - EPSILON); ++ i) { diff --git a/t/gcode.t b/t/gcode.t index 126c621b7e..a43b5049ce 100644 --- a/t/gcode.t +++ b/t/gcode.t @@ -1,4 +1,4 @@ -use Test::More tests => 25; +use Test::More tests => 24; use strict; use warnings; @@ -199,22 +199,24 @@ use Slic3r::Test; like $gcode, qr/START:20mm_cube/, '[input_filename] is also available in custom G-code'; } -{ - my $config = Slic3r::Config::new_from_defaults; - $config->set('spiral_vase', 1); - my $print = Slic3r::Test::init_print('cube_with_hole', config => $config); - - my $spiral = 0; - Slic3r::GCode::Reader->new->parse(Slic3r::Test::gcode($print), sub { - my ($self, $cmd, $args, $info) = @_; - - if ($cmd eq 'G1' && exists $args->{E} && exists $args->{Z}) { - $spiral = 1; - } - }); - - ok !$spiral, 'spiral vase is correctly disabled on layers with multiple loops'; -} +# The current Spiral Vase slicing code removes the holes and all but the largest contours from each slice, +# therefore the following test is no more valid. +#{ +# my $config = Slic3r::Config::new_from_defaults; +# $config->set('spiral_vase', 1); +# my $print = Slic3r::Test::init_print('cube_with_hole', config => $config); +# +# my $spiral = 0; +# Slic3r::GCode::Reader->new->parse(Slic3r::Test::gcode($print), sub { +# my ($self, $cmd, $args, $info) = @_; +# +# if ($cmd eq 'G1' && exists $args->{E} && exists $args->{Z}) { +# $spiral = 1; +# } +# }); +# +# ok !$spiral, 'spiral vase is correctly disabled on layers with multiple loops'; +#} { diff --git a/t/shells.t b/t/shells.t index dc38ff4aa3..c401315908 100644 --- a/t/shells.t +++ b/t/shells.t @@ -1,4 +1,4 @@ -use Test::More tests => 21; +use Test::More tests => 20; use strict; use warnings; @@ -293,31 +293,33 @@ use Slic3r::Test; ok !$horizontal_extrusions, 'no horizontal extrusions'; } -{ - my $config = Slic3r::Config::new_from_defaults; - $config->set('perimeters', 1); - $config->set('fill_density', 0); - $config->set('top_solid_layers', 0); - $config->set('spiral_vase', 1); - $config->set('bottom_solid_layers', 0); - $config->set('skirts', 0); - $config->set('first_layer_height', '100%'); - $config->set('start_gcode', ''); - - my $print = Slic3r::Test::init_print('two_hollow_squares', config => $config); - my $diagonal_moves = 0; - Slic3r::GCode::Reader->new->parse(Slic3r::Test::gcode($print), sub { - my ($self, $cmd, $args, $info) = @_; - - if ($cmd eq 'G1') { - if ($info->{extruding} && $info->{dist_XY} > 0) { - if ($info->{dist_Z} > 0) { - $diagonal_moves++; - } - } - } - }); - is $diagonal_moves, 0, 'no spiral moves on two-island object'; -} +# The current Spiral Vase slicing code removes the holes and all but the largest contours from each slice, +# therefore the following test is no more valid. +#{ +# my $config = Slic3r::Config::new_from_defaults; +# $config->set('perimeters', 1); +# $config->set('fill_density', 0); +# $config->set('top_solid_layers', 0); +# $config->set('spiral_vase', 1); +# $config->set('bottom_solid_layers', 0); +# $config->set('skirts', 0); +# $config->set('first_layer_height', '100%'); +# $config->set('start_gcode', ''); +# +# my $print = Slic3r::Test::init_print('two_hollow_squares', config => $config); +# my $diagonal_moves = 0; +# Slic3r::GCode::Reader->new->parse(Slic3r::Test::gcode($print), sub { +# my ($self, $cmd, $args, $info) = @_; +# +# if ($cmd eq 'G1') { +# if ($info->{extruding} && $info->{dist_XY} > 0) { +# if ($info->{dist_Z} > 0) { +# $diagonal_moves++; +# } +# } +# } +# }); +# is $diagonal_moves, 0, 'no spiral moves on two-island object'; +#} __END__ diff --git a/tests/sla_print/sla_print_tests.cpp b/tests/sla_print/sla_print_tests.cpp index 32bca4ec0e..10f5742d34 100644 --- a/tests/sla_print/sla_print_tests.cpp +++ b/tests/sla_print/sla_print_tests.cpp @@ -54,7 +54,7 @@ TEST_CASE("Support point generator should be deterministic if seeded", auto slicegrid = grid(float(gnd), float(zmax), layer_h); std::vector slices; - slicer.slice(slicegrid, CLOSING_RADIUS, &slices, []{}); + slicer.slice(slicegrid, SlicingMode::Regular, CLOSING_RADIUS, &slices, []{}); point_gen.seed(0); point_gen.execute(slices, slicegrid); diff --git a/tests/sla_print/sla_test_utils.cpp b/tests/sla_print/sla_test_utils.cpp index 44a15ff901..a844b2eaed 100644 --- a/tests/sla_print/sla_test_utils.cpp +++ b/tests/sla_print/sla_test_utils.cpp @@ -98,7 +98,7 @@ void test_supports(const std::string &obj_filename, auto layer_h = 0.05f; out.slicegrid = grid(float(gnd), float(zmax), layer_h); - slicer.slice(out.slicegrid , CLOSING_RADIUS, &out.model_slices, []{}); + slicer.slice(out.slicegrid, SlicingMode::Regular, CLOSING_RADIUS, &out.model_slices, []{}); sla::cut_drainholes(out.model_slices, out.slicegrid, CLOSING_RADIUS, drainholes, []{}); // Create the special index-triangle mesh with spatial indexing which diff --git a/xs/xsp/TriangleMesh.xsp b/xs/xsp/TriangleMesh.xsp index f3153665cb..230f8b2a54 100644 --- a/xs/xsp/TriangleMesh.xsp +++ b/xs/xsp/TriangleMesh.xsp @@ -182,7 +182,7 @@ TriangleMesh::slice(z) std::vector layers; TriangleMeshSlicer mslicer(THIS); - mslicer.slice(z_f, 0.049f, &layers, [](){}); + mslicer.slice(z_f, SlicingMode::Regular, 0.049f, &layers, [](){}); AV* layers_av = newAV(); size_t len = layers.size(); From 9ae0311434196c4e7186a2191b86411d706cfb08 Mon Sep 17 00:00:00 2001 From: bubnikv Date: Sun, 9 Feb 2020 11:01:15 +0100 Subject: [PATCH 292/336] bumped up the version number. --- version.inc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.inc b/version.inc index 997724f0bf..997d44ab28 100644 --- a/version.inc +++ b/version.inc @@ -3,7 +3,7 @@ set(SLIC3R_APP_NAME "PrusaSlicer") set(SLIC3R_APP_KEY "PrusaSlicer") -set(SLIC3R_VERSION "2.2.0-alpha3") +set(SLIC3R_VERSION "2.2.0-alpha4") set(SLIC3R_BUILD_ID "PrusaSlicer-${SLIC3R_VERSION}+UNKNOWN") set(SLIC3R_RC_VERSION "2,2,0,0") set(SLIC3R_RC_VERSION_DOTS "2.2.0.0") From 5eb1e7e886b34a78c98a90563b27f029de5eedad Mon Sep 17 00:00:00 2001 From: bubnikv Date: Sun, 9 Feb 2020 13:56:42 +0100 Subject: [PATCH 293/336] Fixed a bug in the update of the backend when the Spiral Vase option is enabled / disabled. Spiral Vase forces different kind of slicing than the normal model: In Spiral Vase mode, holes are closed and only the largest area contour is kept at each layer. Therefore toggling the Spiral Vase on / off requires complete reslicing. This commit moves the update to the correct location. --- src/libslic3r/Print.cpp | 7 +++++-- src/libslic3r/PrintObject.cpp | 3 +-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/libslic3r/Print.cpp b/src/libslic3r/Print.cpp index 3bac404d3d..8baf424277 100644 --- a/src/libslic3r/Print.cpp +++ b/src/libslic3r/Print.cpp @@ -173,7 +173,11 @@ bool Print::invalidate_state_by_config_options(const std::vector Date: Sun, 9 Feb 2020 22:13:38 +0900 Subject: [PATCH 294/336] Add files via upload --- resources/localization/ko_KR/PrusaSlicer.mo | Bin 215950 -> 247944 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/resources/localization/ko_KR/PrusaSlicer.mo b/resources/localization/ko_KR/PrusaSlicer.mo index 6d14034618b5057384e1e8dc2a51708295744647..1bd998e9ef228b4c9b696ba421aeb0ba1f5a088a 100644 GIT binary patch delta 75237 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�BNg$7Ock3s!;Wh&RXFi%Q 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℘e7>HLufJ*xiyzPO zA?E9E@^?GR1L~BuLEJ!}%1{ZnNM>Dm&M~T<(3COaHdd$H`zjJd96^(em=tP)lFX#t zAP{75D_HH14?Wucbx(?%|0KdvTxjrZpd&FwC)%TUg~ea(u=;LIvnNkG9|3*>9*JbK zV6A!5xvK#Z+W7xDH1qg-{BlJ6Ro;g{ug9XaJSu}Th%O>l63wH?!r0`7RLIEq;k!QQ z*>(F#Ug&crQIlG+L%V+rgQOZ#fOUTLQJ~DALFQvUvTQmpLMX+dqs!aNwaBH$uHGjP zoc{zaZT~FBD00apCg&nTRnp+vazKne!$*s;nf3%6wLj4Sp>KqDA4c+3(m@8pN$L>I z=wxwS19mTDlKAL-{3Hi9iQ1zPpxDVO{}2`BHd-23{i50*4aH$IVgul8 zi>0K&d6IIm;)E714y#1S2SkD6cZqaZBWtIkr^@@H;lefYizAsx_qP!GkrX))BZAOQ z4X)iAT!#g#se-{Rag%XPTCEsA)Y`EB4x)s*I@bqoQh!Jzlq>`J*0Ew8C?}zvmt~`H z?B3JTUb2QEjTrHLw5o20B<+oKzJbhvpYTE4>=fo-G4VqPpFmCs^8QI!Gla(U5RkH! zqV!WJv}2#~PP1Z6D$NaaSfRbYra=~9n?Gw2mHMJM#IwX5#k@04T;Q`P5=wOTF>bO_ ziReIWJWk4FOoJPibMD{HAfi}@cjURR7@Xy1)`4Ah_~d5Fc)$iccp6HSa&Gz^CyEbR zU*Y1UcOxCis%)dJh&D)a(6qo?q}!t(bJ7YT(28#p-w5&1SAeDD`PY4PJ{*dR5TTe9 zK8jKY&tyD9N<8^}FIZDbU%69+^K*PTqEC&aiHSYz6GdaTy@SXdXipY*f5y8eJy>G_n#quc(j*2w^v(a#PZMiNO8xfI4(nr9P<|{+Q2YB|C~S3 zS<1eqfAGvm)Xn_MKX?X{7-GSTe6YFqNB*)MA2&Q|y6yJMxSyz~V*fD_dHoTR z4rl1J5-kNbwmjNs=pd8)nghyLiWSKjAmO$axtx0ul_E=BegYr!DTrzT9-&;_MF$~J zY7so9ET%pMs865BP@Ci>$;B~}#@wG^pWP*f#^#qj?Dn|7X=W{4x_H00eXzK;m;I3S z4N-?A``AkxkF>TBwJJgaAMgSfuoQif4gEzaH)|8A2GaD{Rf#Aka)xC|_R(FVEaDO0 z^suLh=aTG$x`32QwTs-I_U0J;B0La9=L&I2vi){tNS;czueO^L`r9WZh`J$mXSzHY zAUk#2|4{-@MvuBEZIGbkW{N?d0oLJS)mvu&fRw~BBvy@E;S}K~l z&K_Z3*HfPqw-#C)9$`P!zwJ>lEtAZ7BkfOfN@0;@9|^wbk9lq9DaYReh8rLGi2kRV z$&W^?kCM&@Za&~e@(kx|1iws0Ut_}xw&02Vh(*AauB5oQ{=X{nrDC)h|@H>|ZG`iPqm-iw0-@I57qiYI&9lQZOj z5#3Cx__~JReVZYotUfRZQIJ-Gza?VsA8l`CNt96{_l^#S;`{P-N5#rXJjHBGx6igm zW#xAn_CF;=Li83B)YQ{=3Z!=_J#7W>MQFS|v!j}szz2V$hCjYPSb2c5W)xCT2c+o_ zfWW)de>6h8dok~4W=ydE!JY&m72duXOhukXOvrq1njn>FIiYqU-Un_3du|Mp?T^pT4oU0x~kVgSTM3T)A&xcV>#L0apBm=o%t ze9WK6h&b3d4}0xFo+R$Q++OC_U#&{PZRsOqgkn5S*a1r0w()m$$^;5U=1QXa%VvGk zCV|42i2buEmLIF3roi%yv%suOOcboiuCU`Tq1`#zzB@sNgv`EE?C&r>E>(ParTts+ z_m_DRPV9W0Yrlq#)G>CVFU}*>KtVwB9;}S~861QD4$iD;_Put#a)tQoO#AeN*5)0- z4I*`x-QO9X6&u-zGMf*~viD=+w^!M390aLH`6LZd9%Ix%&6L^phgfHAE*};z%&|ZH Fe*wX5wM+m2 delta 46590 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%0AL)}0x4|BeLR=|@xt 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%0D((Y0I=h2(|1vWD1XQHIteUxj!H5O36 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 IxA^P-0_>$kFaQ7m From 519a982fe971910b89f459229873f7bb8cac4b63 Mon Sep 17 00:00:00 2001 From: bubnikv Date: Sun, 9 Feb 2020 18:34:06 +0100 Subject: [PATCH 295/336] Fix of #3632: Crash if a thin wall object is not printable, therefore no extrusion is generated. Now the situation is detected and an exception is thrown. --- src/libslic3r/Print.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/libslic3r/Print.cpp b/src/libslic3r/Print.cpp index 8baf424277..d5a1fa178d 100644 --- a/src/libslic3r/Print.cpp +++ b/src/libslic3r/Print.cpp @@ -1591,6 +1591,8 @@ void Print::process() } else if (! this->config().complete_objects.value) { // Initialize the tool ordering, so it could be used by the G-code preview slider for planning tool changes and filament switches. m_tool_ordering = ToolOrdering(*this, -1, false); + if (m_tool_ordering.empty() || m_tool_ordering.last_extruder() == unsigned(-1)) + throw std::runtime_error("The print is empty. The model is not printable with current print settings."); } this->set_done(psWipeTower); } From 53bfb6bed32f79c5f29b5ce1491e74f9c322e7f1 Mon Sep 17 00:00:00 2001 From: bubnikv Date: Mon, 10 Feb 2020 08:24:39 +0100 Subject: [PATCH 296/336] Hot fix of Object disappears when wipe to object turned on #3637 which is a regression of an optimization 3e0690b37bff4af00015a3b393c39a129ab0d1cc With the optimization disabled, the G-code generator will not be slower than PrusaSlicer 2.1.1. I am leaving the code there to mark for further optimization opportunities. --- src/libslic3r/GCode.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index 665f42d67c..c4c81ff25a 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -2123,7 +2123,12 @@ void GCode::process_layer( // Let's recover vector of extruder overrides: const WipingExtrusions::ExtruderPerCopy *entity_overrides = nullptr; - if (is_anything_overridden) { + // see GH issue #3637: Object disappears when wipe to object turned on + //FIXME Vojtec With the optimization disabled, the G-code generator will not be slower + // than PrusaSlicer 2.1.1. I am leaving the code there to mark for further optimization opportunities. + //if (is_anything_overridden) + if (true) + { printing_extruders.clear(); if (! layer_tools.has_extruder(correct_extruder_id)) { // this entity is not overridden, but its extruder is not in layer_tools - we'll print it From 38d09972482bd9a4f54d8e071314d15c079d0e9b Mon Sep 17 00:00:00 2001 From: lee hakmin Date: Mon, 10 Feb 2020 19:48:37 +0900 Subject: [PATCH 297/336] Add files via upload --- resources/localization/ko_KR/PrusaSlicer.po | 9085 ++++++++++++------- 1 file changed, 5848 insertions(+), 3237 deletions(-) diff --git a/resources/localization/ko_KR/PrusaSlicer.po b/resources/localization/ko_KR/PrusaSlicer.po index 37713d8dfe..7513716a8a 100644 --- a/resources/localization/ko_KR/PrusaSlicer.po +++ b/resources/localization/ko_KR/PrusaSlicer.po @@ -1,223 +1,282 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-08-06 09:54+0200\n" -"PO-Revision-Date: 2019-10-24 23:57+0900\n" +"PO-Revision-Date: 2020-02-09 22:11+0900\n" "Last-Translator: lee hak-min \n" "Language-Team: ulsanether\n" "Language: ko_KR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.2.4\n" +"X-Generator: Poedit 2.3\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Crowdin-Project: slic3rkorean\n" "X-Crowdin-Language: ko\n" "X-Crowdin-File: ko_KR.po\n" -#: src/slic3r/GUI/AboutDialog.cpp:39 src/slic3r/GUI/AboutDialog.cpp:289 +#: src/slic3r/GUI/AboutDialog.cpp:39 src/slic3r/GUI/AboutDialog.cpp:291 msgid "Portions copyright" msgstr "다른 저작권" -#: src/slic3r/GUI/AboutDialog.cpp:125 src/slic3r/GUI/AboutDialog.cpp:254 +#: src/slic3r/GUI/AboutDialog.cpp:127 src/slic3r/GUI/AboutDialog.cpp:256 msgid "Copyright" msgstr "저작권" #. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:127 -msgid "License agreements of all following programs (libraries) are part of application license agreement" -msgstr "다음의 모든 프로그램 (라이브러리)의 라이센스 계약은 응용 프로그램 라이센스 계약의 일부입니다" +#: src/slic3r/GUI/AboutDialog.cpp:129 +msgid "" +"License agreements of all following programs (libraries) are part of " +"application license agreement" +msgstr "" +"다음의 모든 프로그램 (라이브러리)의 라이센스 계약은 응용 프로그램 라이센스 계" +"약의 일부입니다" -#: src/slic3r/GUI/AboutDialog.cpp:197 +#: src/slic3r/GUI/AboutDialog.cpp:199 #, c-format msgid "About %s" msgstr "%s에 대하여" -#: src/slic3r/GUI/AboutDialog.cpp:229 src/slic3r/GUI/MainFrame.cpp:60 +#: src/slic3r/GUI/AboutDialog.cpp:231 src/slic3r/GUI/MainFrame.cpp:64 msgid "Version" msgstr "버전" #. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:256 +#: src/slic3r/GUI/AboutDialog.cpp:258 msgid "is licensed under the" msgstr "라이선스는" -#: src/slic3r/GUI/AboutDialog.cpp:257 +#: src/slic3r/GUI/AboutDialog.cpp:259 msgid "GNU Affero General Public License, version 3" msgstr "GNU Affero 일반 공중 사용 허가서, 버전 3" -#: src/slic3r/GUI/AboutDialog.cpp:258 -msgid "PrusaSlicer is based on Slic3r by Alessandro Ranellucci and the RepRap community." -msgstr "프루사슬라이서는 알레산드로 라넬루치와 RepRap 커뮤니티 Slic3r를 기반으로합니다." +#: src/slic3r/GUI/AboutDialog.cpp:260 +msgid "" +"PrusaSlicer is based on Slic3r by Alessandro Ranellucci and the RepRap " +"community." +msgstr "" +"프루사슬라이서는 알레산드로 라넬루치와 RepRap 커뮤니티 Slic3r를 기반으로합니" +"다." -#: src/slic3r/GUI/AboutDialog.cpp:259 -msgid "Contributions by Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, Petr Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik and numerous others." -msgstr "Contributions by Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, Petr Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik and numerous others. 한국어 번역 울산에테르." +#: src/slic3r/GUI/AboutDialog.cpp:261 +msgid "" +"Contributions by Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, " +"Petr Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik and " +"numerous others." +msgstr "" +"Contributions by Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, " +"Petr Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik and " +"numerous others. 한국어 번역 울산에테르, 밤송이직박구리" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:92 -msgid "Copying of the temporary G-code to the output G-code failed. Maybe the SD card is write locked?" -msgstr "임시 G-코드를 출력할 SD카드에 복사하는 데 실패했습니다. SD카드의 락을 확인 하시오." +#: src/slic3r/GUI/AppConfig.cpp:118 +msgid "" +"Error parsing PrusaSlicer config file, it is probably corrupted. Try to " +"manually delete the file to recover from the error. Your user profiles will " +"not be affected." +msgstr "" +"PrusaSlicer 구성 파일을 구문 분석하는 오류, 아마 손상된 것입니다. 파일을 수동" +"으로 삭제하여 오류에 복구해 보십시오. 사용자 프로필은 영향을 받지 않습니다." -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:93 -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:406 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:118 +msgid "" +"Copying of the temporary G-code to the output G-code failed. Maybe the SD " +"card is write locked?" +msgstr "" +"임시 G-code를 출력할 SD카드에 복사하는 데 실패했습니다. SD카드의 락을 확인 하" +"시오." + +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:120 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:470 msgid "Running post-processing scripts" msgstr "포스트 프로세싱 스크립트" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:95 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:122 msgid "G-code file exported to %1%" msgstr "%1%로 내보낸 G 코드 파일" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:99 -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:117 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:126 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:176 msgid "Slicing complete" msgstr "슬라이스 완료" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:113 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:172 msgid "Masked SLA file exported to %1%" msgstr "마스크 된 SLA 파일을 %1%로 내보냅니" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:408 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:214 +#, c-format +msgid "" +"%s has encountered an error. It was likely caused by running out of memory. " +"If you are sure you have enough RAM on your system, this may also be a bug " +"and we would be glad if you reported it." +msgstr "" +"%s에서 오류가 발생했습니다. 메모리 부족으로 인해 발생했을 수 있습니다. 시스템" +"에 충분한 RAM이 있다고 확신하는 경우 버그가 될 수 있으며 보고해 주길 바랍니" +"다." + +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:472 msgid "Copying of the temporary G-code to the output G-code failed" msgstr "임시 G 코드를 출력 G 코드에 복사 하지 못했습니다" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:417 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:497 msgid "Scheduling upload to `%1%`. See Window -> Print Host Upload Queue" -msgstr "`%1%`. 로 업로드를 예약 합니다. 창-> 인쇄 호스트 업로드 대기열을 참조 하십시오" +msgstr "" +"`%1%`. 로 업로드를 예약 합니다. 창-> 인쇄 호스트 업로드 대기열을 참조 하십시" +"오" -#: src/slic3r/GUI/BedShapeDialog.cpp:65 +#: src/slic3r/GUI/BedShapeDialog.cpp:66 src/slic3r/GUI/GUI_ObjectList.cpp:2038 msgid "Shape" msgstr "모양" -#: src/slic3r/GUI/BedShapeDialog.cpp:72 +#: src/slic3r/GUI/BedShapeDialog.cpp:73 msgid "Rectangular" msgstr "직사각형" -#: src/slic3r/GUI/BedShapeDialog.cpp:76 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:391 src/slic3r/GUI/Plater.cpp:145 -#: src/slic3r/GUI/Tab.cpp:2469 +#: src/slic3r/GUI/BedShapeDialog.cpp:77 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:232 src/slic3r/GUI/Plater.cpp:162 +#: src/slic3r/GUI/Tab.cpp:2306 msgid "Size" msgstr "사이즈" -#: src/slic3r/GUI/BedShapeDialog.cpp:77 +#: src/slic3r/GUI/BedShapeDialog.cpp:78 msgid "Size in X and Y of the rectangular plate." msgstr "사각 플레이트 X 및 Y 크기." -#: src/slic3r/GUI/BedShapeDialog.cpp:83 +#: src/slic3r/GUI/BedShapeDialog.cpp:84 msgid "Origin" msgstr "원점" -#: src/slic3r/GUI/BedShapeDialog.cpp:84 -msgid "Distance of the 0,0 G-code coordinate from the front left corner of the rectangle." -msgstr "사각 전면 왼쪽 모서리에서 원저(0, 0) G-코드 좌표 거리입니다." +#: src/slic3r/GUI/BedShapeDialog.cpp:85 +msgid "" +"Distance of the 0,0 G-code coordinate from the front left corner of the " +"rectangle." +msgstr "사각 전면 왼쪽 모서리에서 원저(0, 0) G-code 좌표 거리입니다." -#: src/slic3r/GUI/BedShapeDialog.cpp:88 +#: src/slic3r/GUI/BedShapeDialog.cpp:89 msgid "Circular" msgstr "원형" -#: src/slic3r/GUI/BedShapeDialog.cpp:91 src/slic3r/GUI/ConfigWizard.cpp:118 -#: src/slic3r/GUI/ConfigWizard.cpp:571 src/slic3r/GUI/ConfigWizard.cpp:585 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:388 -#: src/slic3r/GUI/WipeTowerDialog.cpp:84 src/slic3r/GUI/wxExtensions.cpp:486 -#: src/libslic3r/PrintConfig.cpp:70 src/libslic3r/PrintConfig.cpp:77 -#: src/libslic3r/PrintConfig.cpp:86 src/libslic3r/PrintConfig.cpp:220 -#: src/libslic3r/PrintConfig.cpp:295 src/libslic3r/PrintConfig.cpp:303 -#: src/libslic3r/PrintConfig.cpp:353 src/libslic3r/PrintConfig.cpp:363 -#: src/libslic3r/PrintConfig.cpp:488 src/libslic3r/PrintConfig.cpp:499 -#: src/libslic3r/PrintConfig.cpp:517 src/libslic3r/PrintConfig.cpp:695 -#: src/libslic3r/PrintConfig.cpp:1215 src/libslic3r/PrintConfig.cpp:1276 -#: src/libslic3r/PrintConfig.cpp:1294 src/libslic3r/PrintConfig.cpp:1312 -#: src/libslic3r/PrintConfig.cpp:1364 src/libslic3r/PrintConfig.cpp:1374 -#: src/libslic3r/PrintConfig.cpp:1495 src/libslic3r/PrintConfig.cpp:1503 -#: src/libslic3r/PrintConfig.cpp:1544 src/libslic3r/PrintConfig.cpp:1552 -#: src/libslic3r/PrintConfig.cpp:1562 src/libslic3r/PrintConfig.cpp:1570 -#: src/libslic3r/PrintConfig.cpp:1578 src/libslic3r/PrintConfig.cpp:1661 -#: src/libslic3r/PrintConfig.cpp:1878 src/libslic3r/PrintConfig.cpp:1948 -#: src/libslic3r/PrintConfig.cpp:1982 src/libslic3r/PrintConfig.cpp:2176 -#: src/libslic3r/PrintConfig.cpp:2183 src/libslic3r/PrintConfig.cpp:2190 -#: src/libslic3r/PrintConfig.cpp:2220 src/libslic3r/PrintConfig.cpp:2230 -#: src/libslic3r/PrintConfig.cpp:2240 src/libslic3r/PrintConfig.cpp:2403 -#: src/libslic3r/PrintConfig.cpp:2478 src/libslic3r/PrintConfig.cpp:2487 -#: src/libslic3r/PrintConfig.cpp:2496 src/libslic3r/PrintConfig.cpp:2506 -#: src/libslic3r/PrintConfig.cpp:2550 src/libslic3r/PrintConfig.cpp:2560 -#: src/libslic3r/PrintConfig.cpp:2572 src/libslic3r/PrintConfig.cpp:2592 -#: src/libslic3r/PrintConfig.cpp:2602 src/libslic3r/PrintConfig.cpp:2613 -#: src/libslic3r/PrintConfig.cpp:2631 src/libslic3r/PrintConfig.cpp:2646 -#: src/libslic3r/PrintConfig.cpp:2660 src/libslic3r/PrintConfig.cpp:2673 -#: src/libslic3r/PrintConfig.cpp:2683 src/libslic3r/PrintConfig.cpp:2704 -#: src/libslic3r/PrintConfig.cpp:2715 src/libslic3r/PrintConfig.cpp:2725 -#: src/libslic3r/PrintConfig.cpp:2735 +#: src/slic3r/GUI/BedShapeDialog.cpp:92 src/slic3r/GUI/ConfigWizard.cpp:218 +#: src/slic3r/GUI/ConfigWizard.cpp:971 src/slic3r/GUI/ConfigWizard.cpp:985 +#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:87 +#: src/slic3r/GUI/GUI_ObjectLayers.cpp:135 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:333 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:94 +#: src/slic3r/GUI/WipeTowerDialog.cpp:85 src/libslic3r/PrintConfig.cpp:75 +#: src/libslic3r/PrintConfig.cpp:82 src/libslic3r/PrintConfig.cpp:91 +#: src/libslic3r/PrintConfig.cpp:178 src/libslic3r/PrintConfig.cpp:236 +#: src/libslic3r/PrintConfig.cpp:311 src/libslic3r/PrintConfig.cpp:319 +#: src/libslic3r/PrintConfig.cpp:369 src/libslic3r/PrintConfig.cpp:379 +#: src/libslic3r/PrintConfig.cpp:505 src/libslic3r/PrintConfig.cpp:516 +#: src/libslic3r/PrintConfig.cpp:534 src/libslic3r/PrintConfig.cpp:713 +#: src/libslic3r/PrintConfig.cpp:1240 src/libslic3r/PrintConfig.cpp:1301 +#: src/libslic3r/PrintConfig.cpp:1319 src/libslic3r/PrintConfig.cpp:1337 +#: src/libslic3r/PrintConfig.cpp:1393 src/libslic3r/PrintConfig.cpp:1403 +#: src/libslic3r/PrintConfig.cpp:1525 src/libslic3r/PrintConfig.cpp:1533 +#: src/libslic3r/PrintConfig.cpp:1574 src/libslic3r/PrintConfig.cpp:1582 +#: src/libslic3r/PrintConfig.cpp:1592 src/libslic3r/PrintConfig.cpp:1600 +#: src/libslic3r/PrintConfig.cpp:1608 src/libslic3r/PrintConfig.cpp:1691 +#: src/libslic3r/PrintConfig.cpp:1924 src/libslic3r/PrintConfig.cpp:1995 +#: src/libslic3r/PrintConfig.cpp:2029 src/libslic3r/PrintConfig.cpp:2157 +#: src/libslic3r/PrintConfig.cpp:2236 src/libslic3r/PrintConfig.cpp:2243 +#: src/libslic3r/PrintConfig.cpp:2250 src/libslic3r/PrintConfig.cpp:2280 +#: src/libslic3r/PrintConfig.cpp:2290 src/libslic3r/PrintConfig.cpp:2300 +#: src/libslic3r/PrintConfig.cpp:2485 src/libslic3r/PrintConfig.cpp:2624 +#: src/libslic3r/PrintConfig.cpp:2633 src/libslic3r/PrintConfig.cpp:2642 +#: src/libslic3r/PrintConfig.cpp:2652 src/libslic3r/PrintConfig.cpp:2696 +#: src/libslic3r/PrintConfig.cpp:2706 src/libslic3r/PrintConfig.cpp:2718 +#: src/libslic3r/PrintConfig.cpp:2738 src/libslic3r/PrintConfig.cpp:2748 +#: src/libslic3r/PrintConfig.cpp:2758 src/libslic3r/PrintConfig.cpp:2776 +#: src/libslic3r/PrintConfig.cpp:2791 src/libslic3r/PrintConfig.cpp:2805 +#: src/libslic3r/PrintConfig.cpp:2816 src/libslic3r/PrintConfig.cpp:2829 +#: src/libslic3r/PrintConfig.cpp:2874 src/libslic3r/PrintConfig.cpp:2884 +#: src/libslic3r/PrintConfig.cpp:2893 src/libslic3r/PrintConfig.cpp:2903 +#: src/libslic3r/PrintConfig.cpp:2919 msgid "mm" msgstr "mm" -#: src/slic3r/GUI/BedShapeDialog.cpp:92 src/libslic3r/PrintConfig.cpp:692 +#: src/slic3r/GUI/BedShapeDialog.cpp:93 src/libslic3r/PrintConfig.cpp:710 msgid "Diameter" msgstr "노즐 직경" -#: src/slic3r/GUI/BedShapeDialog.cpp:93 -msgid "Diameter of the print bed. It is assumed that origin (0,0) is located in the center." -msgstr "인쇄 침대의 직경. 원점 (0,0) 은 중심에 있다고 가정합니다." +#: src/slic3r/GUI/BedShapeDialog.cpp:94 +msgid "" +"Diameter of the print bed. It is assumed that origin (0,0) is located in the " +"center." +msgstr "인쇄 배드의 직경. 원점 (0,0) 은 중재봉선에 있다고 가정합니다." -#: src/slic3r/GUI/BedShapeDialog.cpp:97 src/slic3r/GUI/GUI_Preview.cpp:246 -#: src/libslic3r/GCode/PreviewData.cpp:175 +#: src/slic3r/GUI/BedShapeDialog.cpp:98 src/slic3r/GUI/GUI_Preview.cpp:251 +#: src/libslic3r/ExtrusionEntity.cpp:322 msgid "Custom" msgstr "사용자 정의" -#: src/slic3r/GUI/BedShapeDialog.cpp:101 +#: src/slic3r/GUI/BedShapeDialog.cpp:102 msgid "Load shape from STL..." msgstr "STL파일 로드." -#: src/slic3r/GUI/BedShapeDialog.cpp:154 +#: src/slic3r/GUI/BedShapeDialog.cpp:155 msgid "Settings" msgstr "설정" -#: src/slic3r/GUI/BedShapeDialog.cpp:171 +#: src/slic3r/GUI/BedShapeDialog.cpp:172 msgid "Texture" msgstr "질감" -#: src/slic3r/GUI/BedShapeDialog.cpp:181 src/slic3r/GUI/BedShapeDialog.cpp:249 +#: src/slic3r/GUI/BedShapeDialog.cpp:182 src/slic3r/GUI/BedShapeDialog.cpp:261 msgid "Load..." msgstr "불러오기..." -#: src/slic3r/GUI/BedShapeDialog.cpp:189 src/slic3r/GUI/BedShapeDialog.cpp:257 -#: src/slic3r/GUI/Tab.cpp:3204 +#: src/slic3r/GUI/BedShapeDialog.cpp:190 src/slic3r/GUI/BedShapeDialog.cpp:269 +#: src/slic3r/GUI/Tab.cpp:3094 msgid "Remove" msgstr "제거" -#: src/slic3r/GUI/BedShapeDialog.cpp:239 +#: src/slic3r/GUI/BedShapeDialog.cpp:223 src/slic3r/GUI/BedShapeDialog.cpp:302 +msgid "Not found: " +msgstr "찾을 수 없음:" + +#: src/slic3r/GUI/BedShapeDialog.cpp:251 msgid "Model" msgstr "모델" -#: src/slic3r/GUI/BedShapeDialog.cpp:464 +#: src/slic3r/GUI/BedShapeDialog.cpp:487 msgid "Choose an STL file to import bed shape from:" -msgstr "다음 에서 침대 모양을 가져올 STL 파일을 선택합니다." +msgstr "가져올 베드 모양을(STL 파일) 선택합니다:" -#: src/slic3r/GUI/BedShapeDialog.cpp:471 src/slic3r/GUI/BedShapeDialog.cpp:520 -#: src/slic3r/GUI/BedShapeDialog.cpp:543 +#: src/slic3r/GUI/BedShapeDialog.cpp:494 src/slic3r/GUI/BedShapeDialog.cpp:543 +#: src/slic3r/GUI/BedShapeDialog.cpp:566 msgid "Invalid file format." msgstr "잘못된 파일 형식." -#: src/slic3r/GUI/BedShapeDialog.cpp:482 +#: src/slic3r/GUI/BedShapeDialog.cpp:505 msgid "Error! Invalid model" msgstr "오류! 잘못된 모델" -#: src/slic3r/GUI/BedShapeDialog.cpp:490 +#: src/slic3r/GUI/BedShapeDialog.cpp:513 msgid "The selected file contains no geometry." msgstr "선택한 파일에 없는 형상이 있습니다." -#: src/slic3r/GUI/BedShapeDialog.cpp:494 -msgid "The selected file contains several disjoint areas. This is not supported." -msgstr "선택한 파일은 여러개의 분리 된 영역을 포함 되어 있어 지원 되지 않습니다." - -#: src/slic3r/GUI/BedShapeDialog.cpp:509 -msgid "Choose a file to import bed texture from (PNG/SVG):" -msgstr "(PNG /SVG)에서 침대 텍스처를 가져올 파일을 선택합니다." +#: src/slic3r/GUI/BedShapeDialog.cpp:517 +msgid "" +"The selected file contains several disjoint areas. This is not supported." +msgstr "" +"선택한 파일은 여러개의 분리 된 영역을 포함 되어 있어 지원 되지 않습니다." #: src/slic3r/GUI/BedShapeDialog.cpp:532 -msgid "Choose an STL file to import bed model from:" -msgstr "다음에서 침대 모델을 가져올 STL 파일을 선택합니다." +msgid "Choose a file to import bed texture from (PNG/SVG):" +msgstr "(PNG /SVG)에서 배드 텍스처를 가져올 파일을 선택합니다." -#: src/slic3r/GUI/BedShapeDialog.hpp:59 src/slic3r/GUI/ConfigWizard.cpp:530 +#: src/slic3r/GUI/BedShapeDialog.cpp:555 +msgid "Choose an STL file to import bed model from:" +msgstr "다음에서 베드 모델을 가져올 STL 파일을 선택합니다:" + +#: src/slic3r/GUI/BedShapeDialog.hpp:59 src/slic3r/GUI/ConfigWizard.cpp:930 msgid "Bed Shape" msgstr "배드 모양" @@ -258,9 +317,154 @@ msgid "Value is the same as the system value" msgstr "이 값은 시스템 값과 같습니다" #: src/slic3r/GUI/ButtonsDescription.cpp:53 -msgid "Value was changed and is not equal to the system value or the last saved preset" +msgid "" +"Value was changed and is not equal to the system value or the last saved " +"preset" msgstr "값이 변경 되었고, 시스템 값 또는 마지막으로 저장된 설정값과 다릅니다." +#: src/slic3r/GUI/ConfigManipulation.cpp:48 +msgid "" +"Zero layer height is not valid.\n" +"\n" +"The layer height will be reset to 0.01." +msgstr "" +"바닥 레이어 높이가 잘못되었습니다.\n" +"\n" +"레이어 높이가 0.01로 재설정됩니다." + +#: src/slic3r/GUI/ConfigManipulation.cpp:49 +#: src/slic3r/GUI/GUI_ObjectLayers.cpp:27 src/slic3r/GUI/Tab.cpp:1039 +#: src/libslic3r/PrintConfig.cpp:71 +msgid "Layer height" +msgstr "레이어 높이" + +#: src/slic3r/GUI/ConfigManipulation.cpp:60 +msgid "" +"Zero first layer height is not valid.\n" +"\n" +"The first layer height will be reset to 0.01." +msgstr "" +"첫 번째 레이어 높이가 0이면 유효하지 않습니다.\n" +"\n" +"첫 번째 레이어 높이는 0.01로 재설정됩니다." + +#: src/slic3r/GUI/ConfigManipulation.cpp:61 src/libslic3r/PrintConfig.cpp:890 +msgid "First layer height" +msgstr "첫 레이어 높이" + +#: src/slic3r/GUI/ConfigManipulation.cpp:75 +#, no-c-format +msgid "" +"The Spiral Vase mode requires:\n" +"- one perimeter\n" +"- no top solid layers\n" +"- 0% fill density\n" +"- no support material\n" +"- inactive Ensure vertical shell thickness" +msgstr "" +"나선형 꽃병 모드는 다음을 필요로 합니다.\n" +"- 하나의 둘레\n" +"- 상단 솔리드 레이어 없음\n" +"- 0% 충진 밀도\n" +"- 서포트가 필요 없음\n" +"- 비활성 수직 쉘 두께 보장" + +#: src/slic3r/GUI/ConfigManipulation.cpp:82 +msgid "Shall I adjust those settings in order to enable Spiral Vase?" +msgstr "나선형 꽃병을 활성화하기 위해 이러한 설정을 조정해야 합니까?" + +#: src/slic3r/GUI/ConfigManipulation.cpp:83 +msgid "Spiral Vase" +msgstr "스파이럴 바이스" + +#: src/slic3r/GUI/ConfigManipulation.cpp:107 +msgid "" +"The Wipe Tower currently supports the non-soluble supports only\n" +"if they are printed with the current extruder without triggering a tool " +"change.\n" +"(both support_material_extruder and support_material_interface_extruder need " +"to be set to 0)." +msgstr "" +"와이프 타워는 현재 비수용성 지원만 지원합니다.\n" +"공구 교환을 트리거하지 않고 현재 압출기로 인쇄된 경우\n" +"(support_material_extruder support_material_interface_extruder 모두 0으로 설" +"정해야 합니다)." + +#: src/slic3r/GUI/ConfigManipulation.cpp:111 +msgid "Shall I adjust those settings in order to enable the Wipe Tower?" +msgstr "와이프 타워를 활성화하기 위해 이러한 설정을 조정해야 합니까?" + +#: src/slic3r/GUI/ConfigManipulation.cpp:112 +#: src/slic3r/GUI/ConfigManipulation.cpp:132 +msgid "Wipe Tower" +msgstr "와이프 타워(Wipe Tower)" + +#: src/slic3r/GUI/ConfigManipulation.cpp:128 +msgid "" +"For the Wipe Tower to work with the soluble supports, the support layers\n" +"need to be synchronized with the object layers." +msgstr "" +"와이프 타워가 가용성 지지체와 함께 작동 하려면 서포트 레이어를 객체(object) " +"레이어와 동기화 해야 합니다." + +#: src/slic3r/GUI/ConfigManipulation.cpp:131 +msgid "Shall I synchronize support layers in order to enable the Wipe Tower?" +msgstr "와이프 타워를 활성화하기 위해 지원 레이어를 동기화해야 합니까?" + +#: src/slic3r/GUI/ConfigManipulation.cpp:151 +msgid "" +"Supports work better, if the following feature is enabled:\n" +"- Detect bridging perimeters" +msgstr "" +"다음 기능이 활성화된 경우 더 나은 작업을 지원합니다.\n" +"- 브리징 경계를 감지" + +#: src/slic3r/GUI/ConfigManipulation.cpp:154 +msgid "Shall I adjust those settings for supports?" +msgstr "지원에 대한 설정을 조정해야 합니까?" + +#: src/slic3r/GUI/ConfigManipulation.cpp:155 +msgid "Support Generator" +msgstr "서포트 생성" + +#: src/slic3r/GUI/ConfigManipulation.cpp:200 +msgid "The %1% infill pattern is not supposed to work at 100%% density." +msgstr "%1% 채우기 패턴은 100% 밀도로 작동하도록 되어 있지 않습니다." + +#: src/slic3r/GUI/ConfigManipulation.cpp:202 +msgid "Shall I switch to rectilinear fill pattern?" +msgstr "직선 채우기 패턴으로 전환해야 합니까?" + +#: src/slic3r/GUI/ConfigManipulation.cpp:203 +#: src/slic3r/GUI/GUI_ObjectList.cpp:35 src/slic3r/GUI/GUI_ObjectList.cpp:94 +#: src/slic3r/GUI/GUI_ObjectList.cpp:612 src/slic3r/GUI/Plater.cpp:524 +#: src/slic3r/GUI/Tab.cpp:1081 src/slic3r/GUI/Tab.cpp:1082 +#: src/libslic3r/PrintConfig.cpp:193 src/libslic3r/PrintConfig.cpp:416 +#: src/libslic3r/PrintConfig.cpp:436 src/libslic3r/PrintConfig.cpp:777 +#: src/libslic3r/PrintConfig.cpp:791 src/libslic3r/PrintConfig.cpp:828 +#: src/libslic3r/PrintConfig.cpp:982 src/libslic3r/PrintConfig.cpp:992 +#: src/libslic3r/PrintConfig.cpp:1010 src/libslic3r/PrintConfig.cpp:1029 +#: src/libslic3r/PrintConfig.cpp:1048 src/libslic3r/PrintConfig.cpp:1738 +#: src/libslic3r/PrintConfig.cpp:1755 +msgid "Infill" +msgstr "인필(채움)" + +#: src/slic3r/GUI/ConfigManipulation.cpp:309 +msgid "Head penetration should not be greater than the head width." +msgstr "헤드 관통은 헤드 폭 보다 크지 않아야 합니다." + +#: src/slic3r/GUI/ConfigManipulation.cpp:311 +msgid "Invalid Head penetration" +msgstr "잘못된 헤드 관통" + +#: src/slic3r/GUI/ConfigManipulation.cpp:322 +msgid "Pinhead diameter should be smaller than the pillar diameter." +msgstr "핀헤드 지름은 기둥 지름 보다 작아야 합니다." + +#: src/slic3r/GUI/ConfigManipulation.cpp:324 +msgid "Invalid pinhead diameter" +msgstr "잘못된 핀 헤드 지름" + #: src/slic3r/GUI/ConfigSnapshotDialog.cpp:18 msgid "Upgrade" msgstr "업그레이드" @@ -281,331 +485,807 @@ msgstr "사용자" msgid "Unknown" msgstr "알 수 없음" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:39 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:43 msgid "Active" msgstr "활동중" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:45 -msgid "slic3r version" -msgstr "slic3r 버전" +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:50 +msgid "PrusaSlicer version" +msgstr "Prusa슬라이서 버전" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:46 src/slic3r/GUI/Preset.cpp:1307 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:51 src/slic3r/GUI/Preset.cpp:1452 msgid "print" msgstr "출력" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:47 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:52 msgid "filaments" msgstr "필라멘트" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:48 src/slic3r/GUI/Preset.cpp:1311 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:53 src/slic3r/GUI/Preset.cpp:1456 msgid "printer" msgstr "프린터" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:52 src/slic3r/GUI/Tab.cpp:939 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:57 src/slic3r/GUI/Tab.cpp:961 msgid "vendor" msgstr "제조 회사" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:52 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:57 msgid "version" msgstr "버전" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:53 -msgid "min slic3r version" +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:58 +msgid "min PrusaSlicer version" msgstr "이전 slic3r 버전" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:55 -msgid "max slic3r version" +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:60 +msgid "max PrusaSlicer version" msgstr "최신 slic3r 버전" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:58 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:63 msgid "model" msgstr "모델" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:58 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:63 msgid "variants" msgstr "변종" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:70 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:75 #, c-format msgid "Incompatible with this %s" msgstr "%s 과 호환되지 않습니다" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:73 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:78 msgid "Activate" msgstr "활성화" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:99 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:104 msgid "Configuration Snapshots" msgstr "구성 스냅숏" -#: src/slic3r/GUI/ConfigWizard.cpp:118 +#: src/slic3r/GUI/ConfigWizard.cpp:218 msgid "nozzle" msgstr "노즐" -#: src/slic3r/GUI/ConfigWizard.cpp:122 +#: src/slic3r/GUI/ConfigWizard.cpp:222 msgid "Alternate nozzles:" msgstr "대체 노즐:" -#: src/slic3r/GUI/ConfigWizard.cpp:188 +#: src/slic3r/GUI/ConfigWizard.cpp:289 msgid "All standard" msgstr "모두 표준설정" -#: src/slic3r/GUI/ConfigWizard.cpp:189 src/slic3r/GUI/Tab.cpp:3254 +#: src/slic3r/GUI/ConfigWizard.cpp:289 +msgid "Standard" +msgstr "표준" + +#: src/slic3r/GUI/ConfigWizard.cpp:290 src/slic3r/GUI/ConfigWizard.cpp:573 +#: src/slic3r/GUI/Tab.cpp:3144 msgid "All" msgstr "모두 선택" -#: src/slic3r/GUI/ConfigWizard.cpp:190 src/slic3r/GUI/Plater.cpp:470 -#: src/libslic3r/GCode/PreviewData.cpp:162 +#: src/slic3r/GUI/ConfigWizard.cpp:291 src/slic3r/GUI/ConfigWizard.cpp:574 +#: src/slic3r/GUI/Plater.cpp:496 src/slic3r/GUI/Plater.cpp:636 +#: src/libslic3r/ExtrusionEntity.cpp:309 msgid "None" msgstr "없음" -#: src/slic3r/GUI/ConfigWizard.cpp:296 +#: src/slic3r/GUI/ConfigWizard.cpp:427 #, c-format msgid "Welcome to the %s Configuration Assistant" msgstr "%s 구성 도우미에 오신 것을 환영 합니다" -#: src/slic3r/GUI/ConfigWizard.cpp:298 +#: src/slic3r/GUI/ConfigWizard.cpp:429 #, c-format msgid "Welcome to the %s Configuration Wizard" -msgstr "%s에 오신것을 환영 합니다." +msgstr "%s 구성 마법사에 오신 것을 환영 합니다" -#: src/slic3r/GUI/ConfigWizard.cpp:300 +#: src/slic3r/GUI/ConfigWizard.cpp:431 msgid "Welcome" msgstr "환영합니다" -#: src/slic3r/GUI/ConfigWizard.cpp:304 src/slic3r/GUI/GUI_App.cpp:747 +#: src/slic3r/GUI/ConfigWizard.cpp:433 #, c-format -msgid "Run %s" -msgstr "%s 실행" +msgid "" +"Hello, welcome to %s! This %s helps you with the initial configuration; just " +"a few settings and you will be ready to print." +msgstr "" +"안녕하세요 ,%s에 오신 것을 환영 합니다! 이 %s는 초기 구성에 도움이 됩니다. " +"몇 가지 설정만으로 인쇄 준비가 될 것입니다." -#: src/slic3r/GUI/ConfigWizard.cpp:306 -#, c-format -msgid "Hello, welcome to %s! This %s helps you with the initial configuration; just a few settings and you will be ready to print." -msgstr "안녕하세요 ,%s에 오신 것을 환영 합니다! 이 %s는 초기 구성에 도움이 됩니다. 몇 가지 설정만으로 인쇄 준비가 될 것입니다." - -#: src/slic3r/GUI/ConfigWizard.cpp:311 -msgid "Remove user profiles - install from scratch (a snapshot will be taken beforehand)" +#: src/slic3r/GUI/ConfigWizard.cpp:438 +msgid "" +"Remove user profiles - install from scratch (a snapshot will be taken " +"beforehand)" msgstr "사용자 프로필 제거 - 처음부터 설치 (스냅숏 값은 먼저 저장 됩니다.)" -#: src/slic3r/GUI/ConfigWizard.cpp:342 +#: src/slic3r/GUI/ConfigWizard.cpp:481 #, c-format msgid "%s Family" msgstr "%s의 가족들" -#: src/slic3r/GUI/ConfigWizard.cpp:379 +#: src/slic3r/GUI/ConfigWizard.cpp:565 +msgid "Vendor:" +msgstr "벤더:" + +#: src/slic3r/GUI/ConfigWizard.cpp:566 +msgid "Profile:" +msgstr "프로필:" + +#: src/slic3r/GUI/ConfigWizard.cpp:603 src/slic3r/GUI/ConfigWizard.cpp:631 +msgid "(All)" +msgstr "(모두)" + +#: src/slic3r/GUI/ConfigWizard.cpp:732 msgid "Custom Printer Setup" msgstr "사용자 지정 프린터 설정" -#: src/slic3r/GUI/ConfigWizard.cpp:379 +#: src/slic3r/GUI/ConfigWizard.cpp:732 msgid "Custom Printer" msgstr "사용자 정의 프린터" -#: src/slic3r/GUI/ConfigWizard.cpp:381 +#: src/slic3r/GUI/ConfigWizard.cpp:734 msgid "Define a custom printer profile" msgstr "사용자 정의 프린터 프로필" -#: src/slic3r/GUI/ConfigWizard.cpp:383 +#: src/slic3r/GUI/ConfigWizard.cpp:736 msgid "Custom profile name:" msgstr "사용자 정의 프로필 명칭:" -#: src/slic3r/GUI/ConfigWizard.cpp:407 +#: src/slic3r/GUI/ConfigWizard.cpp:760 msgid "Automatic updates" msgstr "자동 업데이트" -#: src/slic3r/GUI/ConfigWizard.cpp:407 +#: src/slic3r/GUI/ConfigWizard.cpp:760 msgid "Updates" msgstr "업데이트" -#: src/slic3r/GUI/ConfigWizard.cpp:415 src/slic3r/GUI/Preferences.cpp:69 +#: src/slic3r/GUI/ConfigWizard.cpp:768 src/slic3r/GUI/Preferences.cpp:64 msgid "Check for application updates" msgstr "프로그램 업데이트 확인" -#: src/slic3r/GUI/ConfigWizard.cpp:419 +#: src/slic3r/GUI/ConfigWizard.cpp:772 #, c-format -msgid "If enabled, %s checks for new application versions online. When a new version becomes available, a notification is displayed at the next application startup (never during program usage). This is only a notification mechanisms, no automatic installation is done." -msgstr "활성화 된 경우 %s은 온라인의 새 버전을 확인합니다. 새 버전을 사용할 수 있게 되면, 다음 응용 프로그램 시작시 알림이 표시됩니다 (프로그램 사용 중에는 절대로 사용하지 마십시오).이것은 단순한 알림 일뿐 자동으로 설치가 되지 않습니다." +msgid "" +"If enabled, %s checks for new application versions online. When a new " +"version becomes available, a notification is displayed at the next " +"application startup (never during program usage). This is only a " +"notification mechanisms, no automatic installation is done." +msgstr "" +"활성화 된 경우 %s은 온라인의 새 버전을 확인합니다. 새 버전을 사용할 수 있게 " +"되면, 다음 응용 프로그램 시작시 알림이 표시됩니다 (프로그램 사용 중에는 절대" +"로 사용하지 마십시오).이것은 단순한 알림 일뿐 자동으로 설치가 되지 않습니다." -#: src/slic3r/GUI/ConfigWizard.cpp:425 src/slic3r/GUI/Preferences.cpp:77 +#: src/slic3r/GUI/ConfigWizard.cpp:778 src/slic3r/GUI/Preferences.cpp:82 msgid "Update built-in Presets automatically" msgstr "기존의 설정 자동 업데이트" -#: src/slic3r/GUI/ConfigWizard.cpp:429 +#: src/slic3r/GUI/ConfigWizard.cpp:782 #, c-format -msgid "If enabled, %s downloads updates of built-in system presets in the background.These updates are downloaded into a separate temporary location.When a new preset version becomes available it is offered at application startup." -msgstr "활성화 된 경우 %s은 백그라운드에서, 시스템 사전 설정을 다운로드합니다. 이러한 업데이트는 별도의 임시 위치에 다운로드됩니다. 새로운 사전 설정 버전을 사용할 수 있게되면 응용 프로그램 시작시 제공됩니다." +msgid "" +"If enabled, %s downloads updates of built-in system presets in the " +"background.These updates are downloaded into a separate temporary location." +"When a new preset version becomes available it is offered at application " +"startup." +msgstr "" +"활성화 된 경우 %s은 백그라운드에서, 시스템 사전 설정을 다운로드합니다. 이러" +"한 업데이트는 별도의 임시 위치에 다운로드됩니다. 새로운 사전 설정 버전을 사용" +"할 수 있게되면 응용 프로그램 시작시 제공됩니다." -#: src/slic3r/GUI/ConfigWizard.cpp:432 -msgid "Updates are never applied without user's consent and never overwrite user's customized settings." -msgstr "업데이트는 사용자의 동의를 받아야 하고, 지정된 이전 설정을 덮어 쓰지 않습니다." +#: src/slic3r/GUI/ConfigWizard.cpp:785 +msgid "" +"Updates are never applied without user's consent and never overwrite user's " +"customized settings." +msgstr "" +"업데이트는 사용자의 동의를 받아야 하고, 지정된 이전 설정을 덮어 쓰지 않습니" +"다." -#: src/slic3r/GUI/ConfigWizard.cpp:437 -msgid "Additionally a backup snapshot of the whole configuration is created before an update is applied." -msgstr "또한 업데이트가 적용되기 전에 전체 구성의 백업 구성(스냅샷)이 생성됩니다." +#: src/slic3r/GUI/ConfigWizard.cpp:790 +msgid "" +"Additionally a backup snapshot of the whole configuration is created before " +"an update is applied." +msgstr "" +"또한 업데이트가 적용되기 전에 전체 구성의 백업 구성(스냅샷)이 생성됩니다." -#: src/slic3r/GUI/ConfigWizard.cpp:444 +#: src/slic3r/GUI/ConfigWizard.cpp:798 src/slic3r/GUI/GUI_ObjectList.cpp:1655 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1658 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3932 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3935 src/slic3r/GUI/Plater.cpp:3211 +#: src/slic3r/GUI/Plater.cpp:3946 src/slic3r/GUI/Plater.cpp:3949 +#: src/slic3r/GUI/Plater.cpp:3980 src/slic3r/GUI/Plater.cpp:3983 +msgid "Reload from disk" +msgstr "디스크에서 다시 불러오기" + +#: src/slic3r/GUI/ConfigWizard.cpp:801 +msgid "" +"Export full pathnames of models and parts sources into 3mf and amf files" +msgstr "모델 및 부품 소스의 전체 경로 이름을 3mf 및 amf 파일로 내보내기" + +#: src/slic3r/GUI/ConfigWizard.cpp:805 +msgid "" +"If enabled, allows the Reload from disk command to automatically find and " +"load the files when invoked.\n" +"If not enabled, the Reload from disk command will ask to select each file " +"using an open file dialog." +msgstr "" +"활성화된 경우 디스크에서 다시 로드 명령을 사용하여 호출될 때 파일을 자동으로 " +"찾고 로드할 수 있습니다.\n" +"활성화되지 않으면 디스크에서 다시 로드 명령에서 열린 파일 대화 상자를 사용하" +"여 각 파일을 선택하라는 요청이 표시됩니다." + +#: src/slic3r/GUI/ConfigWizard.cpp:814 +msgid "View mode" +msgstr "방법 보기" + +#: src/slic3r/GUI/ConfigWizard.cpp:816 +msgid "" +"PrusaSlicer's user interfaces comes in three variants:\n" +"Simple, Advanced, and Expert.\n" +"The Simple mode shows only the most frequently used settings relevant for " +"regular 3D printing. The other two offer progressively more sophisticated " +"fine-tuning, they are suitable for advanced and expert users, respectively." +msgstr "" +"PrusaSlicer의 사용자 인터페이스는 세 가지 변형으로 제공됩니다.\n" +"간단하고 고급, 전문가.\n" +"단순 모드는 일반 3D 인쇄와 관련된 가장 자주 사용되는 설정만 표시합니다. 다른 " +"두 가지는 점진적으로 더 정교한 미세 조정을 제공하며, 각각 고급 및 전문가 사용" +"자에게 적합합니다." + +#: src/slic3r/GUI/ConfigWizard.cpp:821 +msgid "Simple mode" +msgstr "단순 모드" + +#: src/slic3r/GUI/ConfigWizard.cpp:822 +msgid "Advanced mode" +msgstr "고급 모드" + +#: src/slic3r/GUI/ConfigWizard.cpp:823 +msgid "Expert mode" +msgstr "전문가 모드" + +#: src/slic3r/GUI/ConfigWizard.cpp:857 msgid "Other Vendors" msgstr "다른 공급 업체" -#: src/slic3r/GUI/ConfigWizard.cpp:446 +#: src/slic3r/GUI/ConfigWizard.cpp:861 #, c-format -msgid "Pick another vendor supported by %s:" +msgid "Pick another vendor supported by %s" msgstr "%s가 지원하는 다른 공급 업체를 선택하십시오:" -#: src/slic3r/GUI/ConfigWizard.cpp:492 +#: src/slic3r/GUI/ConfigWizard.cpp:892 msgid "Firmware Type" msgstr "펌웨어 종류" -#: src/slic3r/GUI/ConfigWizard.cpp:492 src/slic3r/GUI/Tab.cpp:2100 +#: src/slic3r/GUI/ConfigWizard.cpp:892 src/slic3r/GUI/Tab.cpp:1931 msgid "Firmware" msgstr "펌웨어" -#: src/slic3r/GUI/ConfigWizard.cpp:496 +#: src/slic3r/GUI/ConfigWizard.cpp:896 msgid "Choose the type of firmware used by your printer." msgstr "프린터에 업로드 할 펌웨어를 선택하세요." -#: src/slic3r/GUI/ConfigWizard.cpp:530 +#: src/slic3r/GUI/ConfigWizard.cpp:930 msgid "Bed Shape and Size" msgstr "배드 모양과 크기" -#: src/slic3r/GUI/ConfigWizard.cpp:533 +#: src/slic3r/GUI/ConfigWizard.cpp:933 msgid "Set the shape of your printer's bed." msgstr "프린터 배드모양을 설정하세요." -#: src/slic3r/GUI/ConfigWizard.cpp:553 +#: src/slic3r/GUI/ConfigWizard.cpp:953 msgid "Filament and Nozzle Diameters" msgstr "필라멘트와 노즐 크기" -#: src/slic3r/GUI/ConfigWizard.cpp:553 +#: src/slic3r/GUI/ConfigWizard.cpp:953 msgid "Print Diameters" msgstr "인쇄 직경" -#: src/slic3r/GUI/ConfigWizard.cpp:567 +#: src/slic3r/GUI/ConfigWizard.cpp:967 msgid "Enter the diameter of your printer's hot end nozzle." msgstr "핫 엔드 노즐 직경을 입력하십시오." -#: src/slic3r/GUI/ConfigWizard.cpp:570 +#: src/slic3r/GUI/ConfigWizard.cpp:970 msgid "Nozzle Diameter:" msgstr "노즐 직경:" -#: src/slic3r/GUI/ConfigWizard.cpp:580 +#: src/slic3r/GUI/ConfigWizard.cpp:980 msgid "Enter the diameter of your filament." msgstr "필라멘트의 직경을 입력하십시오." -#: src/slic3r/GUI/ConfigWizard.cpp:581 -msgid "Good precision is required, so use a caliper and do multiple measurements along the filament, then compute the average." -msgstr "정밀도가 필요하므로 캘리퍼를 사용하여 필라멘트를 따라 여러 번 측정 한 다음 평균을 계산하십시오." +#: src/slic3r/GUI/ConfigWizard.cpp:981 +msgid "" +"Good precision is required, so use a caliper and do multiple measurements " +"along the filament, then compute the average." +msgstr "" +"정밀도가 필요하므로 캘리퍼를 사용하여 필라멘트를 따라 여러 번 측정 한 다음 평" +"균을 계산하십시오." -#: src/slic3r/GUI/ConfigWizard.cpp:584 +#: src/slic3r/GUI/ConfigWizard.cpp:984 msgid "Filament Diameter:" msgstr "필라멘트 직경:" -#: src/slic3r/GUI/ConfigWizard.cpp:618 +#: src/slic3r/GUI/ConfigWizard.cpp:1018 msgid "Extruder and Bed Temperatures" msgstr "익스트루더와 배드 온도" -#: src/slic3r/GUI/ConfigWizard.cpp:618 +#: src/slic3r/GUI/ConfigWizard.cpp:1018 msgid "Temperatures" msgstr "온도" -#: src/slic3r/GUI/ConfigWizard.cpp:634 +#: src/slic3r/GUI/ConfigWizard.cpp:1034 msgid "Enter the temperature needed for extruding your filament." msgstr "필라멘트 압출에 필요한 온도를 입력하십시오." -#: src/slic3r/GUI/ConfigWizard.cpp:635 +#: src/slic3r/GUI/ConfigWizard.cpp:1035 msgid "A rule of thumb is 160 to 230 °C for PLA, and 215 to 250 °C for ABS." msgstr "보통 PLA의 경우 160 ~ 230 ° C, ABS의 경우 215 ~ 250 ° C입니다." -#: src/slic3r/GUI/ConfigWizard.cpp:638 +#: src/slic3r/GUI/ConfigWizard.cpp:1038 msgid "Extrusion Temperature:" msgstr "출력 온도 :" -#: src/slic3r/GUI/ConfigWizard.cpp:639 src/slic3r/GUI/ConfigWizard.cpp:653 +#: src/slic3r/GUI/ConfigWizard.cpp:1039 src/slic3r/GUI/ConfigWizard.cpp:1053 msgid "°C" msgstr "°C" -#: src/slic3r/GUI/ConfigWizard.cpp:648 -msgid "Enter the bed temperature needed for getting your filament to stick to your heated bed." +#: src/slic3r/GUI/ConfigWizard.cpp:1048 +msgid "" +"Enter the bed temperature needed for getting your filament to stick to your " +"heated bed." msgstr "필라멘트가 핫배드에 접착하는데 필요한 온도를 입력하십시오." -#: src/slic3r/GUI/ConfigWizard.cpp:649 -msgid "A rule of thumb is 60 °C for PLA and 110 °C for ABS. Leave zero if you have no heated bed." -msgstr "보통은 PLA의 경우 60 ° C이고 ABS의 경우 110 ° C입니다. 핫배드가 없는 경우에는 0으로 두십시오." +#: src/slic3r/GUI/ConfigWizard.cpp:1049 +msgid "" +"A rule of thumb is 60 °C for PLA and 110 °C for ABS. Leave zero if you have " +"no heated bed." +msgstr "" +"보통은 PLA의 경우 60 ° C이고 ABS의 경우 110 ° C입니다. 핫배드가 없는 경우에" +"는 0으로 두십시오." -#: src/slic3r/GUI/ConfigWizard.cpp:652 +#: src/slic3r/GUI/ConfigWizard.cpp:1052 msgid "Bed Temperature:" msgstr "배드 온도 :" -#: src/slic3r/GUI/ConfigWizard.cpp:1115 +#: src/slic3r/GUI/ConfigWizard.cpp:1474 src/slic3r/GUI/ConfigWizard.cpp:2014 +msgid "Filaments" +msgstr "필라멘트" + +#: src/slic3r/GUI/ConfigWizard.cpp:1474 src/slic3r/GUI/ConfigWizard.cpp:2016 +msgid "SLA Materials" +msgstr "SLA 재료" + +#: src/slic3r/GUI/ConfigWizard.cpp:1528 +msgid "FFF Technology Printers" +msgstr "FFF 기술 프린터" + +#: src/slic3r/GUI/ConfigWizard.cpp:1533 +msgid "SLA Technology Printers" +msgstr "SLA 기술 프린터" + +#: src/slic3r/GUI/ConfigWizard.cpp:1751 src/slic3r/GUI/DoubleSlider.cpp:1877 +#: src/slic3r/GUI/DoubleSlider.cpp:1898 src/slic3r/GUI/GUI.cpp:240 +msgid "Notice" +msgstr "공지" + +#: src/slic3r/GUI/ConfigWizard.cpp:1760 +msgid "You have to select at least one filament for selected printers" +msgstr "선택한 프린터에 대해 필라멘트를 하나 이상 선택해야 합니다." + +#: src/slic3r/GUI/ConfigWizard.cpp:1761 +msgid "Do you want to automatic select default filaments?" +msgstr "기본 필라멘트를 자동으로 선택하시겠습니까?" + +#: src/slic3r/GUI/ConfigWizard.cpp:1771 +msgid "You have to select at least one material for selected printers" +msgstr "선택한 프린터에 대해 하나 이상의 재질을 선택해야 합니다." + +#: src/slic3r/GUI/ConfigWizard.cpp:1772 +msgid "Do you want to automatic select default materials?" +msgstr "기본 재질을 자동으로 선택하시겠습니까?" + +#: src/slic3r/GUI/ConfigWizard.cpp:1979 msgid "Select all standard printers" msgstr "이 프로파일과 호환 가능한 프린터를 선택하세요" -#: src/slic3r/GUI/ConfigWizard.cpp:1118 +#: src/slic3r/GUI/ConfigWizard.cpp:1982 msgid "< &Back" msgstr "< &뒤로" -#: src/slic3r/GUI/ConfigWizard.cpp:1119 +#: src/slic3r/GUI/ConfigWizard.cpp:1983 msgid "&Next >" msgstr "&다음 >" -#: src/slic3r/GUI/ConfigWizard.cpp:1120 +#: src/slic3r/GUI/ConfigWizard.cpp:1984 msgid "&Finish" msgstr "&완료" -#: src/slic3r/GUI/ConfigWizard.cpp:1121 src/slic3r/GUI/FirmwareDialog.cpp:151 -#: src/slic3r/GUI/ProgressStatusBar.cpp:27 +#: src/slic3r/GUI/ConfigWizard.cpp:1985 src/slic3r/GUI/FirmwareDialog.cpp:151 +#: src/slic3r/GUI/ProgressStatusBar.cpp:26 msgid "Cancel" msgstr "취소" -#: src/slic3r/GUI/ConfigWizard.cpp:1135 +#: src/slic3r/GUI/ConfigWizard.cpp:1998 msgid "Prusa FFF Technology Printers" msgstr "Prusa FFF 방식 프린터" -#: src/slic3r/GUI/ConfigWizard.cpp:1138 +#: src/slic3r/GUI/ConfigWizard.cpp:2001 msgid "Prusa MSLA Technology Printers" msgstr "Prusa MSLA 방식 프린터" -#: src/slic3r/GUI/ConfigWizard.cpp:1207 +#: src/slic3r/GUI/ConfigWizard.cpp:2014 +msgid "Filament Profiles Selection" +msgstr "필라멘트 프로파일 선택" + +#: src/slic3r/GUI/ConfigWizard.cpp:2014 src/slic3r/GUI/GUI_ObjectList.cpp:3528 +msgid "Type:" +msgstr "형식:" + +#: src/slic3r/GUI/ConfigWizard.cpp:2016 +msgid "SLA Material Profiles Selection" +msgstr "SLA 재질 프로파일 선택" + +#: src/slic3r/GUI/ConfigWizard.cpp:2016 +msgid "Layer height:" +msgstr "레이어 높이:" + +#: src/slic3r/GUI/ConfigWizard.cpp:2112 msgid "Configuration Assistant" msgstr "구성 도우미" -#: src/slic3r/GUI/ConfigWizard.cpp:1208 +#: src/slic3r/GUI/ConfigWizard.cpp:2113 msgid "Configuration &Assistant" msgstr "구성 & 도우미" -#: src/slic3r/GUI/ConfigWizard.cpp:1210 +#: src/slic3r/GUI/ConfigWizard.cpp:2115 msgid "Configuration Wizard" msgstr "구성 마법사" -#: src/slic3r/GUI/ConfigWizard.cpp:1211 +#: src/slic3r/GUI/ConfigWizard.cpp:2116 msgid "Configuration &Wizard" msgstr "구성 & 마법사" -#: src/slic3r/GUI/Field.cpp:125 +#: src/slic3r/GUI/DoubleSlider.cpp:79 +msgid "Place bearings in slots and resume" +msgstr "슬롯에 베어링을 배치하고 다시 시작" + +#: src/slic3r/GUI/DoubleSlider.cpp:923 +msgid "One layer mode" +msgstr "하나의 레이어 모드" + +#: src/slic3r/GUI/DoubleSlider.cpp:925 +msgid "Discard all custom changes" +msgstr "모든 사용자 지정 변경 내용 삭제" + +#: src/slic3r/GUI/DoubleSlider.cpp:928 +msgid "For jump to print Z use left mouse button click OR (Shift+G)" +msgstr "Z를 인쇄하는 점프를 위해 왼쪽 마우스 버튼을 클릭 (Shift +G)" + +#: src/slic3r/GUI/DoubleSlider.cpp:929 +msgid "For set extruder sequence for whole print use right mouse button click" +msgstr "전체 인쇄 용 돌출부 시퀀스 설정용 마우스 버튼 클릭" + +#: src/slic3r/GUI/DoubleSlider.cpp:930 src/slic3r/GUI/DoubleSlider.cpp:1495 +msgid "Jump to print Z" +msgstr "Z 인쇄로 이동" + +#: src/slic3r/GUI/DoubleSlider.cpp:933 +msgid "For edit current color use right mouse button click on colored band" +msgstr "현재 색상 사용 오른쪽 마우스 버튼을 편집하려면 컬러 밴드를 클릭" + +#: src/slic3r/GUI/DoubleSlider.cpp:941 +msgid "Slider(print) mode" +msgstr "슬라이더(인쇄) 모드" + +#: src/slic3r/GUI/DoubleSlider.cpp:955 +msgid "For add change extruder use left mouse button click" +msgstr "추가 변경 압출기 사용 왼쪽 마우스 단추 단추를 클릭" + +#: src/slic3r/GUI/DoubleSlider.cpp:957 +msgid "" +"For add color change use left mouse button click if you want to use colors " +"from default color list, or Shift + left mouse button click if you want to " +"select a color" +msgstr "" +"색상 변경 추가하려면 기본 색상 목록에서 색상을 사용하려는 경우 왼쪽 마우스 버" +"튼을 클릭하거나 색상을 선택하려면 Shift + 왼쪽 마우스 버튼을 클릭하십시오." + +#: src/slic3r/GUI/DoubleSlider.cpp:960 +msgid "For add color change use left mouse button click" +msgstr "색상 변경 추가하려면 왼쪽 마우스 버튼을 클릭하십시오." + +#: src/slic3r/GUI/DoubleSlider.cpp:961 +msgid "OR pres \"+\" key" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:963 +msgid "For add another code use Ctrl + left mouse button click" +msgstr "다른 코드를 추가하려면 Ctrl + 왼쪽 마우스 버튼을 클릭" + +#: src/slic3r/GUI/DoubleSlider.cpp:964 +msgid "For add another code use right mouse button click" +msgstr "다른 코드를 추가하려면 오른쪽 마우스 버튼을 클릭하십시오." + +#: src/slic3r/GUI/DoubleSlider.cpp:973 +msgid "Color change (\"%1%\")" +msgstr "색상 변경(\"%1%\")" + +#: src/slic3r/GUI/DoubleSlider.cpp:974 +msgid "Color change (\"%1%\") for Extruder %2%" +msgstr "압출기 %2%의 색상 변경(\"%1%\")" + +#: src/slic3r/GUI/DoubleSlider.cpp:977 +msgid "Pause print (\"%1%\")" +msgstr "일시 중지 인쇄(\"%1%\")" + +#: src/slic3r/GUI/DoubleSlider.cpp:979 +msgid "Extruder(tool) is changed to Extruder \"%1%\"" +msgstr "압출기(도구)가 압출기 \"%1%\"로 변경됩니다." + +#: src/slic3r/GUI/DoubleSlider.cpp:980 +msgid "\"%1%\"" +msgstr "\"%1%\"" + +#: src/slic3r/GUI/DoubleSlider.cpp:986 +msgid "Note" +msgstr "메모" + +#: src/slic3r/GUI/DoubleSlider.cpp:988 +msgid "" +"G-code of this tick has a conflict with slider(print) mode.\n" +"Any its editing will cause a changes of DoubleSlider data." +msgstr "" +"이 틱의 G 코드는 슬라이더(인쇄) 모드와 충돌합니다.\n" +"편집하면 두개의 슬라이더 데이터가 변경됩니다." + +#: src/slic3r/GUI/DoubleSlider.cpp:991 +msgid "" +"There is a color change for extruder that wouldn't be used till the end of " +"printing.\n" +"This code wouldn't be processed during GCode generation." +msgstr "" +"인쇄가 끝날 때까지 사용되지 않는 압출기의 색상 변경이 있습니다.\n" +"이 코드는 GCode 생성 중에 처리되지 않습니다." + +#: src/slic3r/GUI/DoubleSlider.cpp:994 +msgid "" +"There is a extruder change to the same extruder.\n" +"This code wouldn't be processed during GCode generation." +msgstr "" +"동일한 압출기로 돌출기 변경이 있습니다.\n" +"이 코드는 GCode 생성 중에 처리되지 않습니다." + +#: src/slic3r/GUI/DoubleSlider.cpp:997 +msgid "" +"There is a color change for extruder that has not been used before.\n" +"Check your choice to avoid redundant color changes." +msgstr "" +"이전에 사용되지 않은 압출기의 색상 변경이 있습니다.\n" +"중복 색상 변경을 방지하려면 선택 사항을 확인하십시오." + +#: src/slic3r/GUI/DoubleSlider.cpp:1002 +msgid "For Delete tick use left mouse button click OR pres \"-\" key" +msgstr "삭제 진드기 사용 왼쪽 마우스 버튼 클릭 또는 \"-\" 키를 pres" + +#: src/slic3r/GUI/DoubleSlider.cpp:1004 +msgid "For Edit tick use Ctrl + Left mouse button click" +msgstr "편집 진드기 사용 Ctrl + 왼쪽 마우스 버튼을 클릭" + +#: src/slic3r/GUI/DoubleSlider.cpp:1005 +msgid "For Edit tick use right mouse button click" +msgstr "편집 사용 오른쪽 마우스 버튼을 클릭" + +#: src/slic3r/GUI/DoubleSlider.cpp:1099 src/slic3r/GUI/DoubleSlider.cpp:1135 +#: src/slic3r/GUI/GLCanvas3D.cpp:982 src/slic3r/GUI/Tab.cpp:2302 +#: src/libslic3r/GCode/PreviewData.cpp:445 +#, c-format +msgid "Extruder %d" +msgstr "익스트루더 %d" + +#: src/slic3r/GUI/DoubleSlider.cpp:1100 +msgid "active" +msgstr "활성" + +#: src/slic3r/GUI/DoubleSlider.cpp:1109 +msgid "Switch code to Change extruder" +msgstr "코드 전환- 압출기 변경" + +#: src/slic3r/GUI/DoubleSlider.cpp:1109 src/slic3r/GUI/GUI_ObjectList.cpp:1666 +msgid "Change extruder" +msgstr "압출기(익스트루더) 변경" + +#: src/slic3r/GUI/DoubleSlider.cpp:1110 +msgid "Change extruder (N/A)" +msgstr "돌출자 변경(N/A)" + +#: src/slic3r/GUI/DoubleSlider.cpp:1112 +msgid "Use another extruder" +msgstr "다른 압출기 사용" + +#: src/slic3r/GUI/DoubleSlider.cpp:1136 +msgid "used" +msgstr "사용됨" + +#: src/slic3r/GUI/DoubleSlider.cpp:1144 +msgid "Switch code to Color change (%1%) for:" +msgstr "코드 에서 색상 변경(%1%) 에 대 한:" + +#: src/slic3r/GUI/DoubleSlider.cpp:1145 +msgid "Add color change (%1%) for:" +msgstr "색상 변경 추가(%1%) 에 대 한:" + +#: src/slic3r/GUI/DoubleSlider.cpp:1443 +msgid "Add color change" +msgstr "색상 변경 추가" + +#: src/slic3r/GUI/DoubleSlider.cpp:1453 +msgid "Add pause print" +msgstr "일시 정지 인쇄 추가" + +#: src/slic3r/GUI/DoubleSlider.cpp:1456 +msgid "Add custom G-code" +msgstr "사용자 지정 G 코드 추가" + +#: src/slic3r/GUI/DoubleSlider.cpp:1474 +msgid "Edit color" +msgstr "색상 편집" + +#: src/slic3r/GUI/DoubleSlider.cpp:1475 +msgid "Edit pause print message" +msgstr "일시 정지 인쇄 메시지 편집" + +#: src/slic3r/GUI/DoubleSlider.cpp:1476 +msgid "Edit custom G-code" +msgstr "사용자 지정 G 코드 편집" + +#: src/slic3r/GUI/DoubleSlider.cpp:1482 +msgid "Delete color change" +msgstr "색상 변경 삭제" + +#: src/slic3r/GUI/DoubleSlider.cpp:1483 +msgid "Delete tool change" +msgstr "도구 변경 삭제" + +#: src/slic3r/GUI/DoubleSlider.cpp:1484 +msgid "Delete pause print" +msgstr "일시 정지 인쇄 삭제" + +#: src/slic3r/GUI/DoubleSlider.cpp:1485 +msgid "Delete custom G-code" +msgstr "사용자 지정 G 코드 삭제" + +#: src/slic3r/GUI/DoubleSlider.cpp:1498 +msgid "Set extruder sequence for whole print" +msgstr "전체 인쇄를 위한 압출기 시퀀스 설정" + +#: src/slic3r/GUI/DoubleSlider.cpp:1584 +msgid "Enter custom G-code used on current layer" +msgstr "현재 레이어에 사용되는 사용자 지정 G 코드를 입력합니다." + +#: src/slic3r/GUI/DoubleSlider.cpp:1585 +msgid "Custom Gcode on current layer (%1% mm)." +msgstr "현재 레이어에 사용자 지정 Gcode(%1% mm)." + +#: src/slic3r/GUI/DoubleSlider.cpp:1600 +msgid "Enter short message shown on Printer display during pause print" +msgstr "" +"일시 정지시 인쇄 중에 프린터 디스플레이에 표시된 짧은 메시지를 입력합니다." + +#: src/slic3r/GUI/DoubleSlider.cpp:1601 +msgid "Message for pause print on current layer (%1% mm)." +msgstr "현재 레이어에서 일시 중지 인쇄를 위한 메시지(%1% mm)." + +#: src/slic3r/GUI/DoubleSlider.cpp:1616 +msgid "Enter print z value to jump to" +msgstr "인쇄 z 값을 입력하여" + +#: src/slic3r/GUI/DoubleSlider.cpp:1617 +msgid "Jump to print z" +msgstr "Z 인쇄로 이동" + +#: src/slic3r/GUI/DoubleSlider.cpp:1871 +msgid "" +"The last color change data was saved for a single extruder printer profile." +msgstr "" +"단일 압출기 프린터 프로파일에 대해 마지막 색상 변경 데이터가 저장되었습니다." + +#: src/slic3r/GUI/DoubleSlider.cpp:1872 +msgid "" +"The last color change data was saved for a multiple extruder printer profile." +msgstr "" +"여러 압출기 프린터 프로파일에 대해 마지막 색상 변경 데이터가 저장되었습니다." + +#: src/slic3r/GUI/DoubleSlider.cpp:1874 +msgid "Your current changes will cause a deletion of all saved color changes." +msgstr "현재 변경으로 인해 저장된 모든 색상 변경 내용이 삭제됩니다." + +#: src/slic3r/GUI/DoubleSlider.cpp:1875 src/slic3r/GUI/DoubleSlider.cpp:1896 +msgid "Are you sure you want to continue?" +msgstr "정말 계속하기를 원하십니까?" + +#: src/slic3r/GUI/DoubleSlider.cpp:1888 +msgid "The last color change data was saved for a multi extruder printing." +msgstr "다중 압출기 인쇄를 위해 마지막 색상 변경 데이터가 저장되었습니다." + +#: src/slic3r/GUI/DoubleSlider.cpp:1889 +msgid "" +"Select YES if you want to delete all saved tool changes, \n" +"\tNO if you want all tool changes switch to color changes, \n" +"\tor CANCEL for do nothing" +msgstr "" +"저장된 도구 변경 내용을 모두 삭제하려면 YES를 선택합니다. \n" +"\t아니오 모든 도구 변경 이 색상 변경으로 전환하려면 \n" +"\t또는 아무것도 하지 않는 취소" + +#: src/slic3r/GUI/DoubleSlider.cpp:1892 +msgid "Do you want to delete all saved tool changes?" +msgstr "저장된 도구 변경 내용을 모두 삭제하시겠습니까?" + +#: src/slic3r/GUI/DoubleSlider.cpp:1894 +msgid "" +"The last color change data was saved for a multi extruder printing with tool " +"changes for whole print." +msgstr "" +"마지막 색상 변경 데이터는 전체 인쇄에 대한 도구 변경이 있는 다중 압출기 인쇄" +"를 위해 저장되었습니다." + +#: src/slic3r/GUI/DoubleSlider.cpp:1895 +msgid "Your current changes will cause a deletion of all saved tool changes." +msgstr "현재 변경 으로 인해 저장된 모든 도구 변경 내용이 삭제됩니다." + +#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:23 +msgid "Set extruder sequence" +msgstr "압출기 시퀀스 설정" + +#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:39 +msgid "Set extruder change for every" +msgstr "모든 압출기 변경 설정" + +#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:52 +#: src/libslic3r/PrintConfig.cpp:352 src/libslic3r/PrintConfig.cpp:995 +#: src/libslic3r/PrintConfig.cpp:1514 src/libslic3r/PrintConfig.cpp:1699 +#: src/libslic3r/PrintConfig.cpp:1760 src/libslic3r/PrintConfig.cpp:1940 +#: src/libslic3r/PrintConfig.cpp:1986 +msgid "layers" +msgstr "레이어" + +#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:136 +msgid "Set extruder(tool) sequence" +msgstr "돌출기(도구) 시퀀스 설정" + +#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:182 +msgid "Remove extruder from sequence" +msgstr "시퀀스에서 압출기 제거" + +#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:192 +msgid "Add extruder to sequence" +msgstr "시퀀스에 압출기 추가" + +#: src/slic3r/GUI/Field.cpp:131 msgid "default value" msgstr "기본값" -#: src/slic3r/GUI/Field.cpp:128 +#: src/slic3r/GUI/Field.cpp:134 msgid "parameter name" msgstr "매개 변수 명칭" -#: src/slic3r/GUI/Field.cpp:139 +#: src/slic3r/GUI/Field.cpp:145 src/slic3r/GUI/OptionsGroup.cpp:570 msgid "N/A" msgstr "N/A" -#: src/slic3r/GUI/Field.cpp:158 +#: src/slic3r/GUI/Field.cpp:170 #, c-format msgid "%s doesn't support percentage" msgstr "%s 이(가) 백분율을 지원하지 않음" -#: src/slic3r/GUI/Field.cpp:174 src/slic3r/GUI/Field.cpp:197 +#: src/slic3r/GUI/Field.cpp:190 src/slic3r/GUI/Field.cpp:221 +#: src/slic3r/GUI/GUI_ObjectLayers.cpp:376 msgid "Invalid numeric input." msgstr "숫자 입력이 잘못 되었습니다." -#: src/slic3r/GUI/Field.cpp:179 +#: src/slic3r/GUI/Field.cpp:199 msgid "Input value is out of range" msgstr "입력 값이 범위를 벗어났습니다." -#: src/slic3r/GUI/Field.cpp:206 +#: src/slic3r/GUI/Field.cpp:235 #, c-format msgid "" "Do you mean %s%% instead of %s %s?\n" @@ -614,9 +1294,9 @@ msgid "" msgstr "" "%s %s 대신 %s%%을 하려고 합니까?\n" "이 값을 %s%%, 로 변경하려면 YES를 선택하십시오. \n" -"또는 %s %s 이(가) 올바른 값인지 확인하는 경우 NO를 선택하세요. " +"또는 %s %s 이(가) 올바른 값인지 확인하는 경우 NO를 선택하세요." -#: src/slic3r/GUI/Field.cpp:209 +#: src/slic3r/GUI/Field.cpp:238 msgid "Parameter validation" msgstr "매개 변수 유효성 검사" @@ -663,14 +1343,16 @@ msgstr "" #: src/slic3r/GUI/FirmwareDialog.cpp:419 src/slic3r/GUI/FirmwareDialog.cpp:454 #, c-format -msgid "Multiple %s devices found. Please only connect one at a time for flashing." +msgid "" +"Multiple %s devices found. Please only connect one at a time for flashing." msgstr "여러 %s 장치를 찾았습니다. 깜박이면 한 번에 하나씩만 연결하십시오." #: src/slic3r/GUI/FirmwareDialog.cpp:436 #, c-format msgid "" "The %s device was not found.\n" -"If the device is connected, please press the Reset button next to the USB connector ..." +"If the device is connected, please press the Reset button next to the USB " +"connector ..." msgstr "" "%s 장치를 찾을 수 없습니다.\n" "장치가 연결되어 있는 경우 USB 커넥터 옆에 있는 리셋 버튼을 누르십시오..." @@ -698,8 +1380,8 @@ msgstr "펌웨어 업로드" msgid "Firmware image:" msgstr "펌웨어 이미지:" -#: src/slic3r/GUI/FirmwareDialog.cpp:805 src/slic3r/GUI/Tab.cpp:1824 -#: src/slic3r/GUI/Tab.cpp:1880 +#: src/slic3r/GUI/FirmwareDialog.cpp:805 src/slic3r/GUI/Tab.cpp:1649 +#: src/slic3r/GUI/Tab.cpp:1705 msgid "Browse" msgstr "검색" @@ -732,11 +1414,12 @@ msgid "Advanced: Output log" msgstr "고급: 출력 로그" #: src/slic3r/GUI/FirmwareDialog.cpp:852 +#: src/slic3r/GUI/Mouse3DController.cpp:387 #: src/slic3r/GUI/PrintHostDialogs.cpp:161 msgid "Close" msgstr "닫기" -#: src/slic3r/GUI/FirmwareDialog.cpp:903 +#: src/slic3r/GUI/FirmwareDialog.cpp:902 msgid "" "Are you sure you want to cancel firmware flashing?\n" "This could leave your printer in an unusable state!" @@ -744,35 +1427,107 @@ msgstr "" "새펌웨어 적용을 취소하시겠습니까?\n" "프린터가 사용할 수 없는 상태가 될 수 있습니다!" -#: src/slic3r/GUI/FirmwareDialog.cpp:904 +#: src/slic3r/GUI/FirmwareDialog.cpp:903 msgid "Confirmation" msgstr "확인" -#: src/slic3r/GUI/FirmwareDialog.cpp:907 +#: src/slic3r/GUI/FirmwareDialog.cpp:906 msgid "Cancelling..." msgstr "취소 중...." -#: src/slic3r/GUI/GLCanvas3D.cpp:526 -msgid "Layers heights" -msgstr "레이어 높이" +#: src/slic3r/GUI/GLCanvas3D.cpp:239 src/slic3r/GUI/GLCanvas3D.cpp:4622 +msgid "Variable layer height" +msgstr "가변 레이어 높이" -#: src/slic3r/GUI/GLCanvas3D.cpp:623 +#: src/slic3r/GUI/GLCanvas3D.cpp:242 +msgid "Left mouse button:" +msgstr "왼쪽 마우스 단추:" + +#: src/slic3r/GUI/GLCanvas3D.cpp:245 +msgid "Add detail" +msgstr "디테일 추가" + +#: src/slic3r/GUI/GLCanvas3D.cpp:248 +msgid "Right mouse button:" +msgstr "오른쪽 마우스 버튼:" + +#: src/slic3r/GUI/GLCanvas3D.cpp:251 +msgid "Remove detail" +msgstr "디테일 제거" + +#: src/slic3r/GUI/GLCanvas3D.cpp:254 +msgid "Shift + Left mouse button:" +msgstr "시프트 + 왼쪽 마우스 버튼:" + +#: src/slic3r/GUI/GLCanvas3D.cpp:257 +msgid "Reset to base" +msgstr "기본으로 재설정" + +#: src/slic3r/GUI/GLCanvas3D.cpp:260 +msgid "Shift + Right mouse button:" +msgstr "시프트 + 오른쪽 마우스 버튼:" + +#: src/slic3r/GUI/GLCanvas3D.cpp:263 +msgid "Smoothing" +msgstr "부드럽게" + +#: src/slic3r/GUI/GLCanvas3D.cpp:266 +msgid "Mouse wheel:" +msgstr "마우스 휠: " + +#: src/slic3r/GUI/GLCanvas3D.cpp:269 +msgid "Increase/decrease edit area" +msgstr "편집 영역 증가/감소" + +#: src/slic3r/GUI/GLCanvas3D.cpp:272 +msgid "Adaptive" +msgstr "어뎁티브" + +#: src/slic3r/GUI/GLCanvas3D.cpp:278 +msgid "Quality / Speed" +msgstr "품질 / 속도" + +#: src/slic3r/GUI/GLCanvas3D.cpp:282 +msgid "Higher print quality versus higher print speed." +msgstr "인쇄 품질이 높고 인쇄 속도가 빨라질 수 있습니다." + +#: src/slic3r/GUI/GLCanvas3D.cpp:293 +msgid "Smooth" +msgstr "부드럽게" + +#: src/slic3r/GUI/GLCanvas3D.cpp:299 src/libslic3r/PrintConfig.cpp:511 +msgid "Radius" +msgstr " 반지름" + +#: src/slic3r/GUI/GLCanvas3D.cpp:309 +msgid "Keep min" +msgstr "최소 유지" + +#: src/slic3r/GUI/GLCanvas3D.cpp:318 +msgid "Reset" +msgstr "초기화" + +#: src/slic3r/GUI/GLCanvas3D.cpp:604 +msgid "Variable layer height - Manual edit" +msgstr "가변 레이어 높이 - 수동 편집" + +#: src/slic3r/GUI/GLCanvas3D.cpp:690 msgid "An object outside the print area was detected" msgstr "인쇄 영역 밖에 있는 객체(object)가 감지 되었습니다" -#: src/slic3r/GUI/GLCanvas3D.cpp:624 +#: src/slic3r/GUI/GLCanvas3D.cpp:691 msgid "A toolpath outside the print area was detected" msgstr "인쇄 영역 밖에 있는 공구 경로가 감지 되었습니다" -#: src/slic3r/GUI/GLCanvas3D.cpp:625 +#: src/slic3r/GUI/GLCanvas3D.cpp:692 msgid "SLA supports outside the print area were detected" -msgstr "인쇄 영역 밖에 서포트가 감지되었습니다." +msgstr "인쇄 영역 외부의 SLA 서포트가 감지 됨" -#: src/slic3r/GUI/GLCanvas3D.cpp:626 -msgid "Some objects are not visible when editing supports" -msgstr "서포트 편집시 일부 객체(object)가 표시 되지 않습니다." +#: src/slic3r/GUI/GLCanvas3D.cpp:693 +msgid "Some objects are not visible" +msgstr "일부 개체가 표시되지 않습니다" -#: src/slic3r/GUI/GLCanvas3D.cpp:628 +#: src/slic3r/GUI/GLCanvas3D.cpp:695 msgid "" "An object outside the print area was detected\n" "Resolve the current problem to continue slicing" @@ -780,56 +1535,693 @@ msgstr "" "인쇄 영역 밖에 있는 객체(object)가 감지 되었습니다.\n" "현재 문제를 해결하고 슬라이싱을 계속 합니다" -#: src/slic3r/GUI/GLCanvas3D.cpp:1711 +#: src/slic3r/GUI/GLCanvas3D.cpp:909 src/slic3r/GUI/GLCanvas3D.cpp:938 +msgid "Default print color" +msgstr "기본 인쇄 색상" + +#: src/slic3r/GUI/GLCanvas3D.cpp:939 src/slic3r/GUI/GLCanvas3D.cpp:948 +#: src/slic3r/GUI/GLCanvas3D.cpp:987 +msgid "Pause print or custom G-code" +msgstr "인쇄 또는 사용자 지정 G-코드 일시 중지" + +#: src/slic3r/GUI/GLCanvas3D.cpp:960 +#, c-format +msgid "up to %.2f mm" +msgstr "최대%.2f mm" + +#: src/slic3r/GUI/GLCanvas3D.cpp:964 +#, c-format +msgid "above %.2f mm" +msgstr "above %.2f mm" + +#: src/slic3r/GUI/GLCanvas3D.cpp:968 +#, c-format +msgid "%.2f - %.2f mm" +msgstr "%.2f - %.2f mm" + +#: src/slic3r/GUI/GLCanvas3D.cpp:995 +#, c-format +msgid "Color change for Extruder %d at %.2f mm" +msgstr "압출기 %d의 색상 변화 %.2f mm" + +#: src/slic3r/GUI/GLCanvas3D.cpp:1306 +msgid "Seq." +msgstr "순서" + +#: src/slic3r/GUI/GLCanvas3D.cpp:1705 +msgid "Variable layer height - Reset" +msgstr "가변 레이어 높이 - 재설정" + +#: src/slic3r/GUI/GLCanvas3D.cpp:1713 +msgid "Variable layer height - Adaptive" +msgstr "가변 레이어 높이 - 어뎁티브" + +#: src/slic3r/GUI/GLCanvas3D.cpp:1721 +msgid "Variable layer height - Smooth all" +msgstr "가변 레이어 높이 - 모두 부드럽게" + +#: src/slic3r/GUI/GLCanvas3D.cpp:2075 msgid "Mirror Object" msgstr "객체(object) 반전" -#: src/slic3r/GUI/GLCanvas3D.cpp:2872 +#: src/slic3r/GUI/GLCanvas3D.cpp:2945 +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:571 +msgid "Gizmo-Move" +msgstr "개체(Gizmo) 이동" + +#: src/slic3r/GUI/GLCanvas3D.cpp:3025 +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:573 +msgid "Gizmo-Rotate" +msgstr "개체(Gizmo) 회전" + +#: src/slic3r/GUI/GLCanvas3D.cpp:3538 msgid "Move Object" msgstr "객체(object) 이동" -#: src/slic3r/GUI/GLCanvas3D.cpp:3389 src/slic3r/GUI/GLCanvas3D.cpp:3609 -#: src/slic3r/GUI/MainFrame.cpp:559 -msgid "Undo" -msgstr "되돌리기" +#: src/slic3r/GUI/GLCanvas3D.cpp:4085 +msgid "Undo History" +msgstr "실행취소 기록" -#: src/slic3r/GUI/GLCanvas3D.cpp:3389 src/slic3r/GUI/GLCanvas3D.cpp:3639 -#: src/slic3r/GUI/MainFrame.cpp:562 -msgid "Redo" -msgstr "다시실행" +#: src/slic3r/GUI/GLCanvas3D.cpp:4085 +msgid "Redo History" +msgstr "다시 실행 히스토리" -#: src/slic3r/GUI/GLCanvas3D.cpp:3395 +#: src/slic3r/GUI/GLCanvas3D.cpp:4103 #, c-format -msgid "%s Stack" -msgstr "%s 스택" +msgid "Undo %1$d Action" +msgid_plural "Undo %1$d Actions" +msgstr[0] "실행 취소 %1$d 작업" -#: src/slic3r/GUI/GLCanvas3D.cpp:3413 +#: src/slic3r/GUI/GLCanvas3D.cpp:4103 #, c-format -msgid "%s %d Action" -msgstr "%s %d 액션" +msgid "Redo %1$d Action" +msgid_plural "Redo %1$d Actions" +msgstr[0] "작업 %1$d 다시 실행" -#: src/slic3r/GUI/GLCanvas3D.cpp:3460 +#: src/slic3r/GUI/GLCanvas3D.cpp:4516 msgid "Add..." msgstr "추가..." -#: src/slic3r/GUI/GLCanvas3D.cpp:3468 src/slic3r/GUI/GUI_ObjectList.cpp:1434 -#: src/slic3r/GUI/Plater.cpp:3467 src/slic3r/GUI/Plater.cpp:3486 -#: src/slic3r/GUI/Tab.cpp:3204 +#: src/slic3r/GUI/GLCanvas3D.cpp:4524 src/slic3r/GUI/GUI_ObjectList.cpp:1697 +#: src/slic3r/GUI/Plater.cpp:3942 src/slic3r/GUI/Plater.cpp:3969 +#: src/slic3r/GUI/Tab.cpp:3094 msgid "Delete" msgstr "지우기 " -#: src/slic3r/GUI/GLCanvas3D.cpp:3477 src/slic3r/GUI/Plater.cpp:4075 +#: src/slic3r/GUI/GLCanvas3D.cpp:4533 src/slic3r/GUI/Plater.cpp:4693 msgid "Delete all" msgstr "전부 지우기" -#: src/slic3r/GUI/GLCanvas3D.cpp:3486 src/slic3r/GUI/KBShortcutsDialog.cpp:134 -#: src/slic3r/GUI/Plater.cpp:2636 +#: src/slic3r/GUI/GLCanvas3D.cpp:4542 src/slic3r/GUI/KBShortcutsDialog.cpp:137 +#: src/slic3r/GUI/Plater.cpp:2740 msgid "Arrange" msgstr "정렬" -#: src/slic3r/GUI/GLCanvas3D.cpp:3677 src/slic3r/GUI/GUI_ObjectList.cpp:2203 -msgid "Height ranges" -msgstr "높이 범위" +#: src/slic3r/GUI/GLCanvas3D.cpp:4542 src/slic3r/GUI/KBShortcutsDialog.cpp:138 +msgid "Arrange selection" +msgstr "선택 정렬" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4554 +msgid "Copy" +msgstr "복사" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4563 +msgid "Paste" +msgstr "붙여넣기" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4575 src/slic3r/GUI/Plater.cpp:3799 +#: src/slic3r/GUI/Plater.cpp:3811 src/slic3r/GUI/Plater.cpp:3956 +msgid "Add instance" +msgstr "복제본 추가" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4586 src/slic3r/GUI/Plater.cpp:3958 +msgid "Remove instance" +msgstr "복제본 제거" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4599 +msgid "Split to objects" +msgstr "객체(object)별 분할" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4609 src/slic3r/GUI/GUI_ObjectList.cpp:1485 +msgid "Split to parts" +msgstr "부품(Part)별 분할" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4673 src/slic3r/GUI/MainFrame.cpp:581 +msgid "Undo" +msgstr "되돌리기" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4673 src/slic3r/GUI/GLCanvas3D.cpp:4706 +msgid "Click right mouse button to open History" +msgstr "마우스 오른쪽 버튼을 클릭하여 기록을 엽니다." + +#: src/slic3r/GUI/GLCanvas3D.cpp:4690 +msgid "Next Undo action: %1%" +msgstr "다음 작업 실행 취소 : %1%" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4706 src/slic3r/GUI/MainFrame.cpp:584 +msgid "Redo" +msgstr "다시실행" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4722 +msgid "Next Redo action: %1%" +msgstr "다음 작업 다시 실행: %1%" + +#: src/slic3r/GUI/GLCanvas3D.cpp:6659 +msgid "Selection-Add from rectangle" +msgstr "선택-사각형에서 추가" + +#: src/slic3r/GUI/GLCanvas3D.cpp:6678 +msgid "Selection-Remove from rectangle" +msgstr "선택- 사각형에서 제거" + +#: src/slic3r/GUI/GLCanvas3DManager.cpp:284 +#, c-format +msgid "" +"PrusaSlicer requires OpenGL 2.0 capable graphics driver to run correctly, \n" +"while OpenGL version %s, render %s, vendor %s was detected." +msgstr "" +"PrusaSlicer 제대로 실행하려면 OpenGL 2.0 가능한 그래픽 드라이버가 필요합니" +"다. \n" +"OpenGL 버전 %s, 렌더링 %s 동안, 공급 업체 %s가 감지되었습니다." + +#: src/slic3r/GUI/GLCanvas3DManager.cpp:287 +msgid "You may need to update your graphics card driver." +msgstr "그래픽 카드 드라이버를 업데이트해야 할 수 있습니다." + +#: src/slic3r/GUI/GLCanvas3DManager.cpp:290 +msgid "" +"As a workaround, you may run PrusaSlicer with a software rendered 3D " +"graphics by running prusa-slicer.exe with the --sw_renderer parameter." +msgstr "" +"해결 방법으로 prusaSlicer를 \"sw_renderer 매개 변수\"로 prusa-slicer.exe를 실" +"행하여 3D 그래픽을 렌더링한 소프트웨어로 실행할 수 있습니다." + +#: src/slic3r/GUI/GLCanvas3DManager.cpp:292 +msgid "Unsupported OpenGL version" +msgstr "지원되지 않는 OpenGL 버전" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:42 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:144 src/libslic3r/PrintConfig.cpp:3397 +msgid "Cut" +msgstr "자르기" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:168 +msgid "Keep upper part" +msgstr "상위 부분 유지" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:169 +msgid "Keep lower part" +msgstr "낮은 부분 유지" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:170 +msgid "Rotate lower part upwards" +msgstr "아래쪽 부분을 위쪽으로 회전" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:175 +msgid "Perform cut" +msgstr "절단 실행" + +#: src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp:45 +msgid "Place on face" +msgstr "면 배치 " + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:41 +msgid "Hollow this object" +msgstr "이 개체를 비우기" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:42 +msgid "Preview hollowed and drilled model" +msgstr "미리 보기 중이 비어 있고 드릴된 모델" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:43 +msgid "Offset" +msgstr "오프셋" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:44 +msgid "Quality" +msgstr "품질" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:45 +msgid "Closing distance" +msgstr "닫힘 거리" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:46 +msgid "Hole diameter" +msgstr "구멍 직경" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:47 +msgid "Hole depth" +msgstr "구멍 깊이" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:48 +msgid "Remove selected holes" +msgstr "선택한 구멍 제거" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:49 +msgid "Remove all holes" +msgstr "모든 구멍 제거" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:50 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:58 +msgid "Clipping of view" +msgstr "갈무리된것 보기" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:51 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:59 +msgid "Reset direction" +msgstr "방향 재설정" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:52 +msgid "Show supports" +msgstr "서포트 표시" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:413 +msgid "Add drainage hole" +msgstr "배수 구멍 추가" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:530 +msgid "Delete drainage hole" +msgstr "배수 구멍 삭제" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:786 +msgid "Hollowing parameter change" +msgstr "공동화 매개변수 변경" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:858 +msgid "Change drainage hole diameter" +msgstr "배수 구멍 직경 변경" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:948 +msgid "Hollowing and drilling" +msgstr "공동화 및 드릴링" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:1027 +msgid "Move drainage hole" +msgstr "구멍 이동" + +#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:48 +msgid "Move" +msgstr "이동" + +#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:449 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:480 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:499 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:517 +#: src/libslic3r/PrintConfig.cpp:3446 +msgid "Rotate" +msgstr "회전" + +#: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:47 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:230 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:500 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:518 +#: src/libslic3r/PrintConfig.cpp:3461 +msgid "Scale" +msgstr "크기" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:48 +msgid "Head diameter" +msgstr "헤드 지름" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:49 +msgid "Lock supports under new islands" +msgstr "새영역에서 서포트 잠금 지원" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:50 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1350 +msgid "Remove selected points" +msgstr "선택한 지점 제거" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:51 +msgid "Remove all points" +msgstr "모든 지점 제거" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:52 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1353 +msgid "Apply changes" +msgstr "변경 내용을 적용" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:53 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1354 +msgid "Discard changes" +msgstr "변경사항을 취소" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:54 +msgid "Minimal points distance" +msgstr "최소한의 지점 거리" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:55 +#: src/libslic3r/PrintConfig.cpp:2765 +msgid "Support points density" +msgstr "서포트 지점 밀도" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:56 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1356 +msgid "Auto-generate points" +msgstr "지점 자동 생성" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:57 +msgid "Manual editing" +msgstr "수동 편집" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:479 +msgid "Add support point" +msgstr "서포트 지점 추가" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:615 +msgid "Delete support point" +msgstr "서포트 지점 삭제" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:804 +msgid "Change point head diameter" +msgstr "변경된 해드의 끝 점 지름" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:872 +msgid "Support parameter change" +msgstr "서포트 매개 변수 변경" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:978 +msgid "SLA Support Points" +msgstr "SLA 지원 포인트" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:999 +msgid "SLA gizmo turned on" +msgstr "SLA 개체(gizmo)이동 켜기" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1024 +msgid "Do you want to save your manually edited support points?" +msgstr "수동으로 편집한 서포트 지점을 저장 하시 겠습니까?" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1025 +msgid "Save changes?" +msgstr "변경 사항을 저장 하시겠습니까?" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1037 +msgid "SLA gizmo turned off" +msgstr "SLA 개체(gizmo) 이동 끄기" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1076 +msgid "Move support point" +msgstr "서포트 지점 이동" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1175 +msgid "Support points edit" +msgstr "서포트 지점 편집" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1247 +msgid "Autogeneration will erase all manually edited points." +msgstr "자동 생성은 수동으로 편집한 모든 점을 지웁히 지웁습니다." + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1248 +msgid "Are you sure you want to do it?" +msgstr "당신은 그것을 하시겠습니까?" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1249 src/slic3r/GUI/GUI.cpp:246 +#: src/slic3r/GUI/Tab.cpp:3054 src/slic3r/GUI/WipeTowerDialog.cpp:45 +#: src/slic3r/GUI/WipeTowerDialog.cpp:366 +msgid "Warning" +msgstr "위험" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1252 +msgid "Autogenerate support points" +msgstr "서포트 자동 생성" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1313 +msgid "SLA gizmo keyboard shortcuts" +msgstr "SLA 장치 바로 가기" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1324 +msgid "Note: some shortcuts work in (non)editing mode only." +msgstr "참고: 일부 단축키는 (비)편집 모드 에서만 작동 합니다." + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1342 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1345 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1346 +msgid "Left click" +msgstr "왼쪽 클릭" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1342 +msgid "Add point" +msgstr "지점 추가" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1343 +msgid "Right click" +msgstr "오른쪽 클릭" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1343 +msgid "Remove point" +msgstr "복제본 제거" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1344 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1347 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1348 +msgid "Drag" +msgstr "드래그" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1344 +msgid "Move point" +msgstr "지점 이동" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1345 +msgid "Add point to selection" +msgstr "선택 영역에 지점 추가" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1346 +msgid "Remove point from selection" +msgstr "선택 영역에서 지점 제거" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1347 +msgid "Select by rectangle" +msgstr "직사각형으로 선택" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1348 +msgid "Deselect by rectangle" +msgstr "사각형으로 선택 해제" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1349 +msgid "Select all points" +msgstr "모든 지점들 선택" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1351 +msgid "Mouse wheel" +msgstr "마우스 휠" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1351 +msgid "Move clipping plane" +msgstr "갈무리된 평면 이동" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1352 +msgid "Reset clipping plane" +msgstr "갈무리된 평면 재설정" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1355 +msgid "Switch to editing mode" +msgstr "편집 모드로 전환" + +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:498 +msgid "Gizmo-Place on Face" +msgstr "개체(Gizmo)를 배드위로" + +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:572 +msgid "Gizmo-Scale" +msgstr "개체(Gizmo) 배율" + +#: src/slic3r/GUI/GUI_App.cpp:138 +#, c-format +msgid "" +"%s has encountered an error. It was likely caused by running out of memory. " +"If you are sure you have enough RAM on your system, this may also be a bug " +"and we would be glad if you reported it.\n" +"\n" +"The application will now terminate." +msgstr "" +"%s에서 오류가 발생했습니다. 메모리 부족으로 인해 발생했을 수 있습니다. 시스템" +"에 충분한 RAM이 있다고 확신하는 경우 버그가 될 수 있으며 보고하면 기쁠 것입니" +"다.\n" +"\n" +"이제 응용 프로그램이 종료됩니다." + +#: src/slic3r/GUI/GUI_App.cpp:141 +msgid "Fatal error" +msgstr "치명적인 오류" + +#: src/slic3r/GUI/GUI_App.cpp:442 +msgid "Changing of an application language" +msgstr "응용 프로그램 언어 변경" + +#: src/slic3r/GUI/GUI_App.cpp:450 src/slic3r/GUI/GUI_App.cpp:459 +msgid "Recreating" +msgstr "재현" + +#: src/slic3r/GUI/GUI_App.cpp:466 +msgid "Loading of current presets" +msgstr "현재 기본 설정을 불러오기" + +#: src/slic3r/GUI/GUI_App.cpp:474 +msgid "Loading of a mode view" +msgstr "보기 모드를 불러오기" + +#: src/slic3r/GUI/GUI_App.cpp:555 +msgid "Choose one file (3MF/AMF):" +msgstr "파일(3MF/AMF) 선택:" + +#: src/slic3r/GUI/GUI_App.cpp:567 +msgid "Choose one or more files (STL/OBJ/AMF/3MF/PRUSA):" +msgstr "파일을 선택하세요 (STL/OBJ/AMF/3MF/PRUSA):" + +#: src/slic3r/GUI/GUI_App.cpp:629 +msgid "Select the language" +msgstr "언어를 선택" + +#: src/slic3r/GUI/GUI_App.cpp:629 +msgid "Language" +msgstr "언어" + +#: src/slic3r/GUI/GUI_App.cpp:797 +#, c-format +msgid "Run %s" +msgstr "%s 실행" + +#: src/slic3r/GUI/GUI_App.cpp:800 +msgid "&Configuration Snapshots" +msgstr "구성 스냅샷" + +#: src/slic3r/GUI/GUI_App.cpp:800 +msgid "Inspect / activate configuration snapshots" +msgstr "구성 스냅 샷 검사 / 활성화" + +#: src/slic3r/GUI/GUI_App.cpp:801 +msgid "Take Configuration &Snapshot" +msgstr "구성 스냅 샷 가져 오기" + +#: src/slic3r/GUI/GUI_App.cpp:801 +msgid "Capture a configuration snapshot" +msgstr "구성 스냅 샷 캡처" + +#: src/slic3r/GUI/GUI_App.cpp:802 +msgid "Check for updates" +msgstr "업데이트 확인" + +#: src/slic3r/GUI/GUI_App.cpp:802 +msgid "Check for configuration updates" +msgstr "구성 업데이트 확인" + +#: src/slic3r/GUI/GUI_App.cpp:804 +msgid "&Preferences" +msgstr "환경 설정" + +#: src/slic3r/GUI/GUI_App.cpp:810 +msgid "Application preferences" +msgstr "응용 프로그램 환경 설정" + +#: src/slic3r/GUI/GUI_App.cpp:813 src/slic3r/GUI/wxExtensions.cpp:730 +msgid "Simple" +msgstr "단순" + +#: src/slic3r/GUI/GUI_App.cpp:813 +msgid "Simple View Mode" +msgstr "기본 보기 모드" + +#: src/slic3r/GUI/GUI_App.cpp:814 src/slic3r/GUI/GUI_ObjectList.cpp:102 +#: src/slic3r/GUI/GUI_ObjectList.cpp:620 src/slic3r/GUI/Tab.cpp:1077 +#: src/slic3r/GUI/Tab.cpp:1092 src/slic3r/GUI/Tab.cpp:1191 +#: src/slic3r/GUI/Tab.cpp:1194 src/slic3r/GUI/Tab.cpp:1464 +#: src/slic3r/GUI/Tab.cpp:1951 src/slic3r/GUI/Tab.cpp:3633 +#: src/slic3r/GUI/wxExtensions.cpp:731 src/libslic3r/PrintConfig.cpp:88 +#: src/libslic3r/PrintConfig.cpp:213 src/libslic3r/PrintConfig.cpp:376 +#: src/libslic3r/PrintConfig.cpp:1038 src/libslic3r/PrintConfig.cpp:2286 +msgid "Advanced" +msgstr "고급" + +#: src/slic3r/GUI/GUI_App.cpp:814 +msgid "Advanced View Mode" +msgstr "고급 보기 모드" + +#: src/slic3r/GUI/GUI_App.cpp:815 src/slic3r/GUI/wxExtensions.cpp:732 +msgid "Expert" +msgstr "전문가" + +#: src/slic3r/GUI/GUI_App.cpp:815 +msgid "Expert View Mode" +msgstr "전문가 보기 모드" + +#: src/slic3r/GUI/GUI_App.cpp:820 +msgid "Mode" +msgstr "모드" + +#: src/slic3r/GUI/GUI_App.cpp:820 +#, c-format +msgid "%s View Mode" +msgstr "%s 보기 모드" + +#: src/slic3r/GUI/GUI_App.cpp:822 +msgid "Change Application &Language" +msgstr "응용 프로그램 언어 번경" + +#: src/slic3r/GUI/GUI_App.cpp:824 +msgid "Flash printer &firmware" +msgstr "프린터 펌웨어 플래시" + +#: src/slic3r/GUI/GUI_App.cpp:824 +msgid "Upload a firmware image into an Arduino based printer" +msgstr "아두이노 기반의 프린터 이미지 업로드" + +#: src/slic3r/GUI/GUI_App.cpp:839 +msgid "Taking configuration snapshot" +msgstr "구성 스냅 샷 만들기" + +#: src/slic3r/GUI/GUI_App.cpp:839 +msgid "Snapshot name" +msgstr "스냅 샷 이름" + +#: src/slic3r/GUI/GUI_App.cpp:882 +msgid "" +"Switching the language will trigger application restart.\n" +"You will lose content of the plater." +msgstr "" +"언어를 전환 하면 응용 프로그램 재시작 합니다. 플레이트 위 객체(object)는 모" +"두 지워집니다." + +#: src/slic3r/GUI/GUI_App.cpp:884 +msgid "Do you want to proceed?" +msgstr "계속 하시겠습니까?" + +#: src/slic3r/GUI/GUI_App.cpp:885 +msgid "Language selection" +msgstr "국가에 맞는 언어를 선택" + +#: src/slic3r/GUI/GUI_App.cpp:908 +msgid "&Configuration" +msgstr "&구성" + +#: src/slic3r/GUI/GUI_App.cpp:932 +msgid "The presets on the following tabs were modified" +msgstr "다음 탭의 사전 설정이 수정 되었습니다" + +#: src/slic3r/GUI/GUI_App.cpp:932 src/slic3r/GUI/Tab.cpp:2916 +msgid "Discard changes and continue anyway?" +msgstr "수정된 사항을 취소하고 계속하겠습니까?" + +#: src/slic3r/GUI/GUI_App.cpp:935 +msgid "Unsaved Presets" +msgstr "저장되지 않은 기존설정" + +#: src/slic3r/GUI/GUI_App.cpp:1084 src/slic3r/GUI/Tab.cpp:2928 +msgid "It's impossible to print multi-part object(s) with SLA technology." +msgstr "SLA 방식을 사용 하여 다중 객체(object)를 인쇄할 수는 없습니다." + +#: src/slic3r/GUI/GUI_App.cpp:1085 +msgid "Please check and fix your object list." +msgstr "객체(object) 목록을 확인 하고 수정 하십시오." + +#: src/slic3r/GUI/GUI_App.cpp:1086 src/slic3r/GUI/Plater.cpp:2299 +#: src/slic3r/GUI/Tab.cpp:2930 +msgid "Attention!" +msgstr "주목!" + +#: src/slic3r/GUI/GUI_App.cpp:1103 +msgid "Select a gcode file:" +msgstr "gcode 파일 선택:" #: src/slic3r/GUI/GUI_ObjectLayers.cpp:27 msgid "Start at height" @@ -839,988 +2231,583 @@ msgstr "높이에서 시작" msgid "Stop at height" msgstr "높이에서 정지" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2203 -msgid "Settings for height range" -msgstr "높이 범위에 대한 설정" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1435 -msgid "Printable" -msgstr "인쇄가능" - -#: src/slic3r/GUI/Plater.cpp:3530 -msgid "Set number of instances" -msgstr "복제할 수량 설정" - -#: src/slic3r/GUI/Plater.cpp:4260 -#, c-format -msgid "Set numbers of copies to %d" -msgstr "복사본 수를 %d로 설정" - -#: src/slic3r/GUI/GLCanvas3D.cpp:3486 -msgid "Arrange selection" -msgstr "선택 정렬" - -#: src/slic3r/GUI/GLCanvas3D.cpp:3498 -msgid "Copy" -msgstr "복사" - -#: src/slic3r/GUI/GLCanvas3D.cpp:3507 -msgid "Paste" -msgstr "붙여넣기" - -#: src/slic3r/GUI/GLCanvas3D.cpp:3519 -msgid "Add instance" -msgstr "복제본 추가" - -#: src/slic3r/GUI/GLCanvas3D.cpp:3530 -msgid "Remove instance" -msgstr "복제본 제거" - -#: src/slic3r/GUI/GLCanvas3D.cpp:3543 -msgid "Split to objects" -msgstr "객체(object)별 분할" - -#: src/slic3r/GUI/GLCanvas3D.cpp:3553 src/slic3r/GUI/GUI_ObjectList.cpp:1280 -msgid "Split to parts" -msgstr "부품(Part)별 분할" - -#: src/slic3r/GUI/GLCanvas3D.cpp:3566 -msgid "Layers editing" -msgstr "레이어층 편집" - -#: src/slic3r/GUI/GLCanvas3D.cpp:5623 -msgid "Selection-Add from rectangle" -msgstr "선택-사각형에서 추가" - -#: src/slic3r/GUI/GLCanvas3D.cpp:5642 -msgid "Selection-Remove from rectangle" -msgstr "선택- 사각형에서 제거" - -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:40 -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:144 src/libslic3r/PrintConfig.cpp:3176 -msgid "Cut" -msgstr "자르기" - -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:149 -msgid "Keep upper part" -msgstr "상위 부분 유지" - -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:150 -msgid "Keep lower part" -msgstr "낮은 부분 유지" - -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:151 -msgid "Rotate lower part upwards" -msgstr "아래쪽 부분을 위쪽으로 회전" - -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:154 -msgid "Perform cut" -msgstr "절단 실행" - -#: src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp:45 -msgid "Place on face" -msgstr "면 배치 " - -#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:48 -msgid "Move" -msgstr "이동" - -#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:177 -msgid "Position (mm)" -msgstr "위치 (mm)" - -#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:177 -msgid "Displacement (mm)" -msgstr "변위 (mm)" - -#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:449 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:466 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:485 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:503 -#: src/libslic3r/PrintConfig.cpp:3225 -msgid "Rotate" -msgstr "회전" - -#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:482 -msgid "Rotation (deg)" -msgstr "회전 (°)" - -#: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:47 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:390 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:486 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:504 -#: src/libslic3r/PrintConfig.cpp:3240 -msgid "Scale" -msgstr "크기" - -#: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:292 -msgid "Scale (%)" -msgstr "크기 (%)" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:44 -msgid "Head diameter" -msgstr "헤드 지름" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:45 -msgid "Lock supports under new islands" -msgstr "새영역에서 서포트 잠금 지원" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:46 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1427 -msgid "Remove selected points" -msgstr "선택한 지점 제거" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:47 -msgid "Remove all points" -msgstr "모든 지점 제거" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:48 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1430 -msgid "Apply changes" -msgstr "변경 내용을 적용" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:49 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1431 -msgid "Discard changes" -msgstr "변경사항을 취소" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:50 -msgid "Minimal points distance" -msgstr "최소한의 지점 거리" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:51 -#: src/libslic3r/PrintConfig.cpp:2620 -msgid "Support points density" -msgstr "서포트 지점 밀도" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:52 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1433 -msgid "Auto-generate points" -msgstr "지점 자동 생성" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:53 -msgid "Manual editing" -msgstr "수동 편집" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1347 -msgid "Height range Modifier" -msgstr "높이 범위에 대한 설정" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:54 -msgid "Clipping of view" -msgstr "갈무리된것 보기" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:55 -msgid "Reset direction" -msgstr "방향 재설정" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:531 -msgid "Add support point" -msgstr "서포트 지점 추가" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:720 -msgid "Delete support point" -msgstr "서포트 지점 삭제" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:925 -msgid "Change point head diameter" -msgstr "변경된 해드의 끝 점 지름" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:991 -msgid "Support parameter change" -msgstr "서포트 매개 변수 변경" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1099 -msgid "SLA Support Points" -msgstr "SLA 서포트 지점" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1138 -msgid "Do you want to save your manually edited support points?" -msgstr "수동으로 편집한 서포트 지점을 저장 하시 겠습니까?" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1139 -msgid "Save changes?" -msgstr "변경 사항을 저장 하시겠습니까?" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1183 -msgid "Move support point" -msgstr "서포트 지점 이동" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1282 -msgid "Support points edit" -msgstr "서포트 지점 편집" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1333 -msgid "" -"Autogeneration will erase all manually edited points.\n" -"\n" -"Are you sure you want to do it?\n" -msgstr "" -"서포트 자동 생성은 수동으로 편집한 모든 지점을 지웁니다.\n" -"\n" -"그렇게 하시겠습니까?\n" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1335 src/slic3r/GUI/GUI.cpp:289 -#: src/slic3r/GUI/WipeTowerDialog.cpp:44 src/slic3r/GUI/WipeTowerDialog.cpp:328 -msgid "Warning" -msgstr "위험" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1338 -msgid "Autogenerate support points" -msgstr "서포트 자동 생성" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1390 -msgid "SLA gizmo keyboard shortcuts" -msgstr "SLA 장치 바로 가기" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1401 -msgid "Note: some shortcuts work in (non)editing mode only." -msgstr "참고: 일부 단축키는 (비)편집 모드 에서만 작동 합니다." - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1419 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1422 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1423 -msgid "Left click" -msgstr "왼쪽 클릭" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1419 -msgid "Add point" -msgstr "지점 추가" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1420 -msgid "Right click" -msgstr "오른쪽 클릭" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1420 -msgid "Remove point" -msgstr "복제본 제거" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1421 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1424 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1425 -msgid "Drag" -msgstr "드래그" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1421 -msgid "Move point" -msgstr "지점 이동" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1422 -msgid "Add point to selection" -msgstr "선택 영역에 지점 추가" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1423 -msgid "Remove point from selection" -msgstr "선택 영역에서 지점 제거" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1424 -msgid "Select by rectangle" -msgstr "직사각형으로 선택" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1425 -msgid "Deselect by rectangle" -msgstr "사각형으로 선택 해제" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1426 -msgid "Select all points" -msgstr "모든 지점들 선택" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1428 -msgid "Mouse wheel" -msgstr "마우스 휠" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1428 -msgid "Move clipping plane" -msgstr "갈무리된 평면 이동" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1429 -msgid "Reset clipping plane" -msgstr "갈무리된 평면 재설정" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1432 -msgid "Switch to editing mode" -msgstr "편집 모드로 전환" - -#: src/slic3r/GUI/GUI.cpp:141 src/slic3r/GUI/Tab.cpp:3063 -msgid "It's impossible to print multi-part object(s) with SLA technology." -msgstr "SLA 방식을 사용 하여 다중 객체(object)를 인쇄할 수는 없습니다." - -#: src/slic3r/GUI/GUI.cpp:142 -msgid "Please check and fix your object list." -msgstr "객체(object) 목록을 확인 하고 수정 하십시오." - -#: src/slic3r/GUI/GUI.cpp:143 src/slic3r/GUI/Plater.cpp:2213 -#: src/slic3r/GUI/Tab.cpp:3065 -msgid "Attention!" -msgstr "주목!" - -#: src/slic3r/GUI/GUI.cpp:283 -msgid "Notice" -msgstr "공지" - -#: src/slic3r/GUI/GUI_App.cpp:435 -msgid "Changing of an application language" -msgstr "응용 프로그램 언어 변경" - -#: src/slic3r/GUI/GUI_App.cpp:443 src/slic3r/GUI/GUI_App.cpp:452 -msgid "Recreating" -msgstr "재현" - -#: src/slic3r/GUI/GUI_App.cpp:456 -msgid "Loading of current presets" -msgstr "현재 기본 설정을 불러오기" - -#: src/slic3r/GUI/GUI_App.cpp:464 -msgid "Loading of a mode view" -msgstr "보기 모드를 불러오기" - -#: src/slic3r/GUI/GUI_App.cpp:544 -msgid "Choose one file (3MF/AMF):" -msgstr "파일(3MF/AMF) 선택:" - -#: src/slic3r/GUI/GUI_App.cpp:556 -msgid "Choose one or more files (STL/OBJ/AMF/3MF/PRUSA):" -msgstr "파일을 선택하세요 (STL/OBJ/AMF/3MF/PRUSA):" - -#: src/slic3r/GUI/GUI_App.cpp:598 -msgid "Select the language" -msgstr "언어를 선택" - -#: src/slic3r/GUI/GUI_App.cpp:599 -msgid "Language" -msgstr "언어" - -#: src/slic3r/GUI/GUI_App.cpp:750 -msgid "&Configuration Snapshots" -msgstr "구성 스냅숏" - -#: src/slic3r/GUI/GUI_App.cpp:750 -msgid "Inspect / activate configuration snapshots" -msgstr "구성 스냅 샷 검사 / 활성화" - -#: src/slic3r/GUI/GUI_App.cpp:751 -msgid "Take Configuration &Snapshot" -msgstr "구성 스냅 샷 가져 오기" - -#: src/slic3r/GUI/GUI_App.cpp:751 -msgid "Capture a configuration snapshot" -msgstr "구성 스냅 샷 캡처" - -#: src/slic3r/GUI/GUI_App.cpp:754 -msgid "&Preferences" -msgstr "환경 설정" - -#: src/slic3r/GUI/GUI_App.cpp:760 -msgid "Application preferences" -msgstr "응용 프로그램 환경 설정" - -#: src/slic3r/GUI/GUI_App.cpp:763 src/slic3r/GUI/wxExtensions.cpp:2882 -msgid "Simple" -msgstr "단순" - -#: src/slic3r/GUI/GUI_App.cpp:763 -msgid "Simple View Mode" -msgstr "기본 보기 모드" - -#: src/slic3r/GUI/GUI_App.cpp:764 src/slic3r/GUI/GUI_ObjectList.cpp:93 -#: src/slic3r/GUI/GUI_ObjectList.cpp:567 src/slic3r/GUI/Tab.cpp:1037 -#: src/slic3r/GUI/Tab.cpp:1052 src/slic3r/GUI/Tab.cpp:1150 -#: src/slic3r/GUI/Tab.cpp:1153 src/slic3r/GUI/Tab.cpp:1649 -#: src/slic3r/GUI/Tab.cpp:2120 src/slic3r/GUI/Tab.cpp:3699 -#: src/slic3r/GUI/wxExtensions.cpp:2883 src/libslic3r/PrintConfig.cpp:83 -#: src/libslic3r/PrintConfig.cpp:197 src/libslic3r/PrintConfig.cpp:360 -#: src/libslic3r/PrintConfig.cpp:1013 src/libslic3r/PrintConfig.cpp:2226 -msgid "Advanced" -msgstr "고급" - -#: src/slic3r/GUI/GUI_App.cpp:764 -msgid "Advanced View Mode" -msgstr "고급 보기 모드" - -#: src/slic3r/GUI/GUI_App.cpp:765 src/slic3r/GUI/wxExtensions.cpp:2884 -msgid "Expert" -msgstr "전문가" - -#: src/slic3r/GUI/GUI_App.cpp:765 -msgid "Expert View Mode" -msgstr "전문가 보기 모드" - -#: src/slic3r/GUI/GUI_App.cpp:770 -msgid "Mode" -msgstr "모드" - -#: src/slic3r/GUI/GUI_App.cpp:770 -#, c-format -msgid "%s View Mode" -msgstr "%s 보기 모드" - -#: src/slic3r/GUI/GUI_App.cpp:772 -msgid "Change Application &Language" -msgstr "응용 프로그램 언어 번경" - -#: src/slic3r/GUI/GUI_App.cpp:774 -msgid "Flash printer &firmware" -msgstr "프린터 펌웨어 플래시" - -#: src/slic3r/GUI/GUI_App.cpp:774 -msgid "Upload a firmware image into an Arduino based printer" -msgstr "아두이노 기반의 프린터 이미지 업로드" - -#: src/slic3r/GUI/GUI_App.cpp:786 -msgid "Taking configuration snapshot" -msgstr "구성 스냅 샷 만들기" - -#: src/slic3r/GUI/GUI_App.cpp:786 -msgid "Snapshot name" -msgstr "스냅 샷 이름" - -#: src/slic3r/GUI/GUI_App.cpp:829 -msgid "" -"Switching the language will trigger application restart.\n" -"You will lose content of the plater." -msgstr "언어를 전환 하면 응용 프로그램 재시작 합니다. 플레이트 위 객체(object)는 모두 지워집니다." - -#: src/slic3r/GUI/GUI_App.cpp:831 -msgid "Do you want to proceed?" -msgstr "계속 하시겠습니까?" - -#: src/slic3r/GUI/GUI_App.cpp:832 -msgid "Language selection" -msgstr "국가에 맞는 언어를 선택" - -#: src/slic3r/GUI/GUI_App.cpp:855 -msgid "&Configuration" -msgstr "&구성" - -#: src/slic3r/GUI/GUI_App.cpp:877 -msgid "The presets on the following tabs were modified" -msgstr "다음 탭의 사전 설정이 수정 되었습니다" - -#: src/slic3r/GUI/GUI_App.cpp:877 src/slic3r/GUI/Tab.cpp:3051 -msgid "Discard changes and continue anyway?" -msgstr "수정된 사항을 취소하고 계속하겠습니까?" - -#: src/slic3r/GUI/GUI_App.cpp:880 -msgid "Unsaved Presets" -msgstr "저장되지 않은 기존설정" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:30 src/slic3r/GUI/GUI_ObjectList.cpp:84 -#: src/slic3r/GUI/GUI_ObjectList.cpp:558 src/libslic3r/PrintConfig.cpp:67 -#: src/libslic3r/PrintConfig.cpp:160 src/libslic3r/PrintConfig.cpp:392 -#: src/libslic3r/PrintConfig.cpp:453 src/libslic3r/PrintConfig.cpp:461 -#: src/libslic3r/PrintConfig.cpp:867 src/libslic3r/PrintConfig.cpp:1051 -#: src/libslic3r/PrintConfig.cpp:1354 src/libslic3r/PrintConfig.cpp:1420 -#: src/libslic3r/PrintConfig.cpp:1601 src/libslic3r/PrintConfig.cpp:2037 -#: src/libslic3r/PrintConfig.cpp:2095 +#: src/slic3r/GUI/GUI_ObjectLayers.cpp:153 +msgid "Remove layer range" +msgstr "레이어 범위 제거" + +#: src/slic3r/GUI/GUI_ObjectLayers.cpp:162 +msgid "Add layer range" +msgstr "레이어 범위 추가" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:34 src/slic3r/GUI/GUI_ObjectList.cpp:93 +#: src/slic3r/GUI/GUI_ObjectList.cpp:611 src/libslic3r/PrintConfig.cpp:72 +#: src/libslic3r/PrintConfig.cpp:165 src/libslic3r/PrintConfig.cpp:174 +#: src/libslic3r/PrintConfig.cpp:408 src/libslic3r/PrintConfig.cpp:470 +#: src/libslic3r/PrintConfig.cpp:478 src/libslic3r/PrintConfig.cpp:891 +#: src/libslic3r/PrintConfig.cpp:1076 src/libslic3r/PrintConfig.cpp:1383 +#: src/libslic3r/PrintConfig.cpp:1450 src/libslic3r/PrintConfig.cpp:1631 +#: src/libslic3r/PrintConfig.cpp:2084 src/libslic3r/PrintConfig.cpp:2143 +#: src/libslic3r/PrintConfig.cpp:2152 msgid "Layers and Perimeters" msgstr "레이어 및 둘레" -#: src/slic3r/GUI/GUI_ObjectList.cpp:31 src/slic3r/GUI/GUI_ObjectList.cpp:85 -#: src/slic3r/GUI/GUI_ObjectList.cpp:559 src/slic3r/GUI/Plater.cpp:498 -#: src/slic3r/GUI/Tab.cpp:1041 src/slic3r/GUI/Tab.cpp:1042 -#: src/slic3r/GUI/Tab.cpp:1394 src/libslic3r/PrintConfig.cpp:177 -#: src/libslic3r/PrintConfig.cpp:400 src/libslic3r/PrintConfig.cpp:420 -#: src/libslic3r/PrintConfig.cpp:754 src/libslic3r/PrintConfig.cpp:768 -#: src/libslic3r/PrintConfig.cpp:805 src/libslic3r/PrintConfig.cpp:958 -#: src/libslic3r/PrintConfig.cpp:968 src/libslic3r/PrintConfig.cpp:986 -#: src/libslic3r/PrintConfig.cpp:1004 src/libslic3r/PrintConfig.cpp:1023 -#: src/libslic3r/PrintConfig.cpp:1708 src/libslic3r/PrintConfig.cpp:1725 -msgid "Infill" -msgstr "인필(채움)" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:32 src/slic3r/GUI/GUI_ObjectList.cpp:86 -#: src/slic3r/GUI/GUI_ObjectList.cpp:560 src/slic3r/GUI/GUI_Preview.cpp:243 -#: src/slic3r/GUI/Tab.cpp:1070 src/slic3r/GUI/Tab.cpp:1071 -#: src/libslic3r/PrintConfig.cpp:344 src/libslic3r/PrintConfig.cpp:1481 -#: src/libslic3r/PrintConfig.cpp:1830 src/libslic3r/PrintConfig.cpp:1836 -#: src/libslic3r/PrintConfig.cpp:1844 src/libslic3r/PrintConfig.cpp:1856 -#: src/libslic3r/PrintConfig.cpp:1866 src/libslic3r/PrintConfig.cpp:1874 -#: src/libslic3r/PrintConfig.cpp:1889 src/libslic3r/PrintConfig.cpp:1910 -#: src/libslic3r/PrintConfig.cpp:1921 src/libslic3r/PrintConfig.cpp:1937 -#: src/libslic3r/PrintConfig.cpp:1946 src/libslic3r/PrintConfig.cpp:1955 -#: src/libslic3r/PrintConfig.cpp:1966 src/libslic3r/PrintConfig.cpp:1980 -#: src/libslic3r/PrintConfig.cpp:1988 src/libslic3r/PrintConfig.cpp:1989 -#: src/libslic3r/PrintConfig.cpp:1998 src/libslic3r/PrintConfig.cpp:2006 -#: src/libslic3r/PrintConfig.cpp:2020 src/libslic3r/GCode/PreviewData.cpp:172 +#: src/slic3r/GUI/GUI_ObjectList.cpp:36 src/slic3r/GUI/GUI_ObjectList.cpp:95 +#: src/slic3r/GUI/GUI_ObjectList.cpp:613 src/slic3r/GUI/GUI_Preview.cpp:248 +#: src/slic3r/GUI/Tab.cpp:1110 src/slic3r/GUI/Tab.cpp:1111 +#: src/libslic3r/ExtrusionEntity.cpp:319 src/libslic3r/PrintConfig.cpp:360 +#: src/libslic3r/PrintConfig.cpp:1511 src/libslic3r/PrintConfig.cpp:1876 +#: src/libslic3r/PrintConfig.cpp:1882 src/libslic3r/PrintConfig.cpp:1890 +#: src/libslic3r/PrintConfig.cpp:1902 src/libslic3r/PrintConfig.cpp:1912 +#: src/libslic3r/PrintConfig.cpp:1920 src/libslic3r/PrintConfig.cpp:1935 +#: src/libslic3r/PrintConfig.cpp:1956 src/libslic3r/PrintConfig.cpp:1968 +#: src/libslic3r/PrintConfig.cpp:1984 src/libslic3r/PrintConfig.cpp:1993 +#: src/libslic3r/PrintConfig.cpp:2002 src/libslic3r/PrintConfig.cpp:2013 +#: src/libslic3r/PrintConfig.cpp:2027 src/libslic3r/PrintConfig.cpp:2035 +#: src/libslic3r/PrintConfig.cpp:2036 src/libslic3r/PrintConfig.cpp:2045 +#: src/libslic3r/PrintConfig.cpp:2053 src/libslic3r/PrintConfig.cpp:2067 msgid "Support material" msgstr "서포트 재료(Support material)" -#: src/slic3r/GUI/GUI_ObjectList.cpp:35 src/slic3r/GUI/GUI_ObjectList.cpp:90 -#: src/slic3r/GUI/GUI_ObjectList.cpp:564 src/libslic3r/PrintConfig.cpp:2202 -#: src/libslic3r/PrintConfig.cpp:2210 +#: src/slic3r/GUI/GUI_ObjectList.cpp:39 src/slic3r/GUI/GUI_ObjectList.cpp:99 +#: src/slic3r/GUI/GUI_ObjectList.cpp:617 src/libslic3r/PrintConfig.cpp:2262 +#: src/libslic3r/PrintConfig.cpp:2270 msgid "Wipe options" msgstr "지우기 옵션" -#: src/slic3r/GUI/GUI_ObjectList.cpp:41 +#: src/slic3r/GUI/GUI_ObjectList.cpp:45 msgid "Pad and Support" msgstr "패드 및 서포트" -#: src/slic3r/GUI/GUI_ObjectList.cpp:47 +#: src/slic3r/GUI/GUI_ObjectList.cpp:51 msgid "Add part" msgstr "부품(Part) 추가" -#: src/slic3r/GUI/GUI_ObjectList.cpp:48 +#: src/slic3r/GUI/GUI_ObjectList.cpp:52 msgid "Add modifier" msgstr "편집영역(modifier) 추가" -#: src/slic3r/GUI/GUI_ObjectList.cpp:49 +#: src/slic3r/GUI/GUI_ObjectList.cpp:53 msgid "Add support enforcer" msgstr "서포트 지원(enforcer)영역 추가" -#: src/slic3r/GUI/GUI_ObjectList.cpp:50 +#: src/slic3r/GUI/GUI_ObjectList.cpp:54 msgid "Add support blocker" msgstr "서포트 금지영역(blocker) 추가" -#: src/slic3r/GUI/GUI_ObjectList.cpp:87 src/slic3r/GUI/GUI_ObjectList.cpp:561 -#: src/slic3r/GUI/GUI_Preview.cpp:222 src/slic3r/GUI/Tab.cpp:1095 -#: src/libslic3r/PrintConfig.cpp:209 src/libslic3r/PrintConfig.cpp:441 -#: src/libslic3r/PrintConfig.cpp:896 src/libslic3r/PrintConfig.cpp:1024 -#: src/libslic3r/PrintConfig.cpp:1410 src/libslic3r/PrintConfig.cpp:1647 -#: src/libslic3r/PrintConfig.cpp:1696 src/libslic3r/PrintConfig.cpp:1747 -#: src/libslic3r/PrintConfig.cpp:2080 +#: src/slic3r/GUI/GUI_ObjectList.cpp:96 src/slic3r/GUI/GUI_ObjectList.cpp:614 +#: src/slic3r/GUI/GUI_Preview.cpp:226 src/slic3r/GUI/Tab.cpp:1135 +#: src/libslic3r/PrintConfig.cpp:225 src/libslic3r/PrintConfig.cpp:458 +#: src/libslic3r/PrintConfig.cpp:920 src/libslic3r/PrintConfig.cpp:1049 +#: src/libslic3r/PrintConfig.cpp:1440 src/libslic3r/PrintConfig.cpp:1677 +#: src/libslic3r/PrintConfig.cpp:1726 src/libslic3r/PrintConfig.cpp:1778 +#: src/libslic3r/PrintConfig.cpp:2128 msgid "Speed" msgstr "속도" -#: src/slic3r/GUI/GUI_ObjectList.cpp:88 src/slic3r/GUI/GUI_ObjectList.cpp:562 -#: src/slic3r/GUI/Tab.cpp:1130 src/slic3r/GUI/Tab.cpp:1997 -#: src/libslic3r/PrintConfig.cpp:471 src/libslic3r/PrintConfig.cpp:979 -#: src/libslic3r/PrintConfig.cpp:1389 src/libslic3r/PrintConfig.cpp:1717 -#: src/libslic3r/PrintConfig.cpp:1902 src/libslic3r/PrintConfig.cpp:1928 +#: src/slic3r/GUI/GUI_ObjectList.cpp:97 src/slic3r/GUI/GUI_ObjectList.cpp:615 +#: src/slic3r/GUI/Tab.cpp:1170 src/slic3r/GUI/Tab.cpp:1822 +#: src/libslic3r/PrintConfig.cpp:488 src/libslic3r/PrintConfig.cpp:1003 +#: src/libslic3r/PrintConfig.cpp:1418 src/libslic3r/PrintConfig.cpp:1747 +#: src/libslic3r/PrintConfig.cpp:1948 src/libslic3r/PrintConfig.cpp:1975 msgid "Extruders" msgstr "익스트루더" -#: src/slic3r/GUI/GUI_ObjectList.cpp:89 src/slic3r/GUI/GUI_ObjectList.cpp:563 -#: src/libslic3r/PrintConfig.cpp:431 src/libslic3r/PrintConfig.cpp:538 -#: src/libslic3r/PrintConfig.cpp:855 src/libslic3r/PrintConfig.cpp:987 -#: src/libslic3r/PrintConfig.cpp:1398 src/libslic3r/PrintConfig.cpp:1737 -#: src/libslic3r/PrintConfig.cpp:1911 src/libslic3r/PrintConfig.cpp:2069 +#: src/slic3r/GUI/GUI_ObjectList.cpp:98 src/slic3r/GUI/GUI_ObjectList.cpp:616 +#: src/libslic3r/PrintConfig.cpp:447 src/libslic3r/PrintConfig.cpp:555 +#: src/libslic3r/PrintConfig.cpp:878 src/libslic3r/PrintConfig.cpp:1011 +#: src/libslic3r/PrintConfig.cpp:1427 src/libslic3r/PrintConfig.cpp:1767 +#: src/libslic3r/PrintConfig.cpp:1957 src/libslic3r/PrintConfig.cpp:2116 msgid "Extrusion Width" msgstr "압출 폭" -#: src/slic3r/GUI/GUI_ObjectList.cpp:95 src/slic3r/GUI/GUI_ObjectList.cpp:569 -#: src/slic3r/GUI/Plater.cpp:466 src/slic3r/GUI/Tab.cpp:3655 -#: src/slic3r/GUI/Tab.cpp:3656 src/libslic3r/PrintConfig.cpp:2469 -#: src/libslic3r/PrintConfig.cpp:2476 src/libslic3r/PrintConfig.cpp:2485 -#: src/libslic3r/PrintConfig.cpp:2494 src/libslic3r/PrintConfig.cpp:2504 -#: src/libslic3r/PrintConfig.cpp:2530 src/libslic3r/PrintConfig.cpp:2537 -#: src/libslic3r/PrintConfig.cpp:2548 src/libslic3r/PrintConfig.cpp:2558 -#: src/libslic3r/PrintConfig.cpp:2567 src/libslic3r/PrintConfig.cpp:2580 -#: src/libslic3r/PrintConfig.cpp:2590 src/libslic3r/PrintConfig.cpp:2599 -#: src/libslic3r/PrintConfig.cpp:2609 src/libslic3r/PrintConfig.cpp:2621 -#: src/libslic3r/PrintConfig.cpp:2629 +#: src/slic3r/GUI/GUI_ObjectList.cpp:104 src/slic3r/GUI/GUI_ObjectList.cpp:622 +#: src/slic3r/GUI/Plater.cpp:492 src/slic3r/GUI/Tab.cpp:3576 +#: src/slic3r/GUI/Tab.cpp:3577 src/libslic3r/PrintConfig.cpp:2615 +#: src/libslic3r/PrintConfig.cpp:2622 src/libslic3r/PrintConfig.cpp:2631 +#: src/libslic3r/PrintConfig.cpp:2640 src/libslic3r/PrintConfig.cpp:2650 +#: src/libslic3r/PrintConfig.cpp:2676 src/libslic3r/PrintConfig.cpp:2683 +#: src/libslic3r/PrintConfig.cpp:2694 src/libslic3r/PrintConfig.cpp:2704 +#: src/libslic3r/PrintConfig.cpp:2713 src/libslic3r/PrintConfig.cpp:2726 +#: src/libslic3r/PrintConfig.cpp:2736 src/libslic3r/PrintConfig.cpp:2745 +#: src/libslic3r/PrintConfig.cpp:2755 src/libslic3r/PrintConfig.cpp:2766 +#: src/libslic3r/PrintConfig.cpp:2774 msgid "Supports" msgstr "서포트" -#: src/slic3r/GUI/GUI_ObjectList.cpp:96 src/slic3r/GUI/GUI_ObjectList.cpp:570 -#: src/slic3r/GUI/Tab.cpp:3684 src/slic3r/GUI/Tab.cpp:3685 -#: src/libslic3r/PrintConfig.cpp:2637 src/libslic3r/PrintConfig.cpp:2644 -#: src/libslic3r/PrintConfig.cpp:2658 src/libslic3r/PrintConfig.cpp:2668 -#: src/libslic3r/PrintConfig.cpp:2681 src/libslic3r/PrintConfig.cpp:2690 -#: src/libslic3r/PrintConfig.cpp:2701 src/libslic3r/PrintConfig.cpp:2712 -#: src/libslic3r/PrintConfig.cpp:2722 src/libslic3r/PrintConfig.cpp:2732 +#: src/slic3r/GUI/GUI_ObjectList.cpp:105 src/slic3r/GUI/GUI_ObjectList.cpp:623 +#: src/slic3r/GUI/Plater.cpp:632 src/slic3r/GUI/Tab.cpp:3608 +#: src/slic3r/GUI/Tab.cpp:3609 src/libslic3r/PrintConfig.cpp:2782 +#: src/libslic3r/PrintConfig.cpp:2789 src/libslic3r/PrintConfig.cpp:2803 +#: src/libslic3r/PrintConfig.cpp:2814 src/libslic3r/PrintConfig.cpp:2824 +#: src/libslic3r/PrintConfig.cpp:2846 src/libslic3r/PrintConfig.cpp:2857 +#: src/libslic3r/PrintConfig.cpp:2864 src/libslic3r/PrintConfig.cpp:2871 +#: src/libslic3r/PrintConfig.cpp:2882 src/libslic3r/PrintConfig.cpp:2891 +#: src/libslic3r/PrintConfig.cpp:2900 msgid "Pad" msgstr "패드" -#: src/slic3r/GUI/GUI_ObjectList.cpp:217 +#: src/slic3r/GUI/GUI_ObjectList.cpp:106 src/slic3r/GUI/Tab.cpp:3626 +#: src/slic3r/GUI/Tab.cpp:3627 src/libslic3r/SLA/Hollowing.cpp:46 +#: src/libslic3r/SLA/Hollowing.cpp:58 src/libslic3r/SLA/Hollowing.cpp:67 +#: src/libslic3r/SLA/Hollowing.cpp:76 src/libslic3r/PrintConfig.cpp:2910 +#: src/libslic3r/PrintConfig.cpp:2917 src/libslic3r/PrintConfig.cpp:2927 +#: src/libslic3r/PrintConfig.cpp:2936 +msgid "Hollowing" +msgstr "속이 빈 공동(Hollowing)" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:268 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:153 msgid "Name" msgstr "이름" -#: src/slic3r/GUI/GUI_ObjectList.cpp:271 -#, c-format -msgid "Auto-repaired (%d errors):\n" -msgstr "오류자동수정 (%d errors)\n" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:278 -msgid "degenerate facets" -msgstr "더러운 면" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:279 -msgid "edges fixed" -msgstr "모서리 고정" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:280 -msgid "facets removed" -msgstr "면 제거" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:281 -msgid "facets added" -msgstr "면 추가됨" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:282 -msgid "facets reversed" -msgstr "면 반전" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:283 -msgid "backwards edges" -msgstr "뒤쪽 가장자리" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:291 -msgid "Right button click the icon to fix STL through Netfabb" -msgstr "아이콘을 클릭 하여 Netfabb에서 STL을 수정 합니다" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:325 -msgid "Right button click the icon to change the object settings" -msgstr "아이콘을 클릭 하여 객체(object) 설정을 변경 합니다" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:375 src/slic3r/GUI/GUI_ObjectList.cpp:396 -#: src/slic3r/GUI/GUI_ObjectList.cpp:408 src/slic3r/GUI/GUI_ObjectList.cpp:3508 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3518 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3550 src/slic3r/GUI/wxExtensions.cpp:576 -#: src/slic3r/GUI/wxExtensions.cpp:633 src/slic3r/GUI/wxExtensions.cpp:658 -#: src/slic3r/GUI/wxExtensions.cpp:794 -msgid "default" -msgstr "기본값" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:380 src/slic3r/GUI/Tab.cpp:1613 -#: src/libslic3r/PrintConfig.cpp:470 +#: src/slic3r/GUI/GUI_ObjectList.cpp:276 src/slic3r/GUI/Tab.cpp:1428 +#: src/slic3r/GUI/wxExtensions.cpp:589 src/libslic3r/PrintConfig.cpp:487 msgid "Extruder" msgstr "익스트루더(Extruder)" -#: src/slic3r/GUI/GUI_ObjectList.cpp:493 +#: src/slic3r/GUI/GUI_ObjectList.cpp:280 src/slic3r/GUI/GUI_ObjectList.cpp:392 +msgid "Editing" +msgstr "편집" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:337 +#, c-format +msgid "Auto-repaired (%d errors):" +msgstr "오류자동수정 (%d errors):" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:344 +msgid "degenerate facets" +msgstr "더러운 면" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:345 +msgid "edges fixed" +msgstr "모서리 고정" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:346 +msgid "facets removed" +msgstr "면 제거" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:347 +msgid "facets added" +msgstr "면 추가됨" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:348 +msgid "facets reversed" +msgstr "면 반전" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:349 +msgid "backwards edges" +msgstr "뒤쪽 가장자리" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:357 +msgid "Right button click the icon to fix STL through Netfabb" +msgstr "아이콘을 클릭 하여 Netfabb에서 STL을 수정 합니다" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:394 +msgid "Right button click the icon to change the object settings" +msgstr "아이콘을 클릭 하여 객체(object) 설정을 변경 합니다" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:396 +msgid "Click the icon to change the object settings" +msgstr "아이콘을 클릭 하여 오브젝트 설정을 변경 합니다" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:400 +msgid "Right button click the icon to change the object printable property" +msgstr "오른쪽 버튼이 아이콘을 클릭하여 객체 인쇄 가능한 속성을 변경합니다." + +#: src/slic3r/GUI/GUI_ObjectList.cpp:402 +msgid "Click the icon to change the object printable property" +msgstr "아이콘을 클릭하여 객체 인쇄 가능 속성을 변경합니다." + +#: src/slic3r/GUI/GUI_ObjectList.cpp:455 src/slic3r/GUI/GUI_ObjectList.cpp:467 +#: src/slic3r/GUI/GUI_ObjectList.cpp:915 src/slic3r/GUI/GUI_ObjectList.cpp:3947 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3957 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3992 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:200 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:257 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:282 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:490 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:1725 +msgid "default" +msgstr "기본값" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:534 +msgid "Change Extruder" +msgstr "압출기(익스트루더) 변경" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:549 msgid "Rename Object" msgstr "객체(object) 이름 바꾸기" -#: src/slic3r/GUI/GUI_ObjectList.cpp:493 +#: src/slic3r/GUI/GUI_ObjectList.cpp:549 msgid "Rename Sub-object" msgstr "하위 객체(object) 이름 바꾸기" -#: src/slic3r/GUI/GUI_ObjectList.cpp:934 src/slic3r/GUI/GUI_ObjectList.cpp:3346 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1089 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3756 msgid "Instances to Separated Objects" msgstr "분리된 객체(object)에 대한 복제본" -#: src/slic3r/GUI/GUI_ObjectList.cpp:952 -msgid "Remove Volume(s)" -msgstr "볼륨 제거" +#: src/slic3r/GUI/GUI_ObjectList.cpp:1104 +msgid "Volumes in Object reordered" +msgstr "개체의 볼륨이 재정렬되었습니다." -#: src/slic3r/GUI/GUI_ObjectList.cpp:1007 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1316 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1322 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1556 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1104 +msgid "Object reordered" +msgstr "개체 순서가 다시 지정되었습니다." + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1180 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1528 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1534 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1828 #, c-format msgid "Quick Add Settings (%s)" msgstr "빠른 추가 설정 (%s)" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1077 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1263 msgid "Select showing settings" msgstr "표시된 설정을 선택 합니다" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1126 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1312 msgid "Add Settings for Layers" msgstr "레이어 설정 추가" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1127 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1313 msgid "Add Settings for Sub-object" msgstr "하위 객체(object)에 대한 설정 추가" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1128 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1314 msgid "Add Settings for Object" msgstr "객체(object)에 대한 설정 추가" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1189 -msgid "Add Settings Bundle for Layers" -msgstr "레이어에 대한 번들 설정을 추가" +#: src/slic3r/GUI/GUI_ObjectList.cpp:1384 +msgid "Add Settings Bundle for Height range" +msgstr "높이 범위에 대한 설정 번들 추가" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1190 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1385 msgid "Add Settings Bundle for Sub-object" msgstr "하위 객체(object)에 대한 번들 설정을 추가" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1191 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1386 msgid "Add Settings Bundle for Object" msgstr "객체(object)에 대한 번들 설정을 추가" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1230 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1425 msgid "Load" msgstr "불러오기" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1235 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1260 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1263 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1430 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1462 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1466 msgid "Box" msgstr "박스" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1235 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1430 msgid "Cylinder" msgstr "원통" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1235 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1430 msgid "Sphere" msgstr "영역" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1235 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1430 msgid "Slab" msgstr "슬랩" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1287 -msgid "Edit Layers" -msgstr "레이어 편집" +#: src/slic3r/GUI/GUI_ObjectList.cpp:1498 +msgid "Height range Modifier" +msgstr "높이 범위에 대한 설정" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1295 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1507 msgid "Add settings" msgstr "다음 설정" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1362 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1582 msgid "Change type" msgstr "타입 변경" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1369 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1510 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1589 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1601 msgid "Set as a Separated Object" msgstr "분리 된 객체(object)로 설정" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1375 -msgid "Rename" -msgstr "이름 변경" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1386 -msgid "Fix through the Netfabb" -msgstr "Netfabb를 통해 수정" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1396 src/slic3r/GUI/Plater.cpp:3496 -msgid "Export as STL" -msgstr "STL로 내보내기" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1403 -msgid "Change extruder" -msgstr "압출기(익스트루더) 변경" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1422 src/libslic3r/PrintConfig.cpp:309 -msgid "Default" -msgstr "기본값" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1428 -msgid "Select new extruder for the object/part" -msgstr "객체(object)/부품(Part)에 대한 새 압출(익스트루더) 기 선택" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1440 -msgid "Scale to print volume" -msgstr "인쇄 볼륨에 따라 배율 조정" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1440 -msgid "Scale the selected object to fit the print volume" -msgstr "인쇄 볼륨에 맞게 선택한 객체(object)의 배율 조정" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1510 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1601 msgid "Set as a Separated Objects" msgstr "분리된 객체(object)로 설정" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1585 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1611 +msgid "Printable" +msgstr "인쇄가능" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1626 +msgid "Rename" +msgstr "이름 변경" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1637 +msgid "Fix through the Netfabb" +msgstr "Netfabb를 통해 수정" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1647 src/slic3r/GUI/Plater.cpp:3987 +msgid "Export as STL" +msgstr "STL로 내보내기" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1655 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1658 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3932 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3935 src/slic3r/GUI/Plater.cpp:3946 +#: src/slic3r/GUI/Plater.cpp:3949 +msgid "Reload the selected volumes from disk" +msgstr "디스크에서 선택한 볼륨 다시 로드" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1685 src/libslic3r/PrintConfig.cpp:325 +msgid "Default" +msgstr "기본값" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1691 +msgid "Select new extruder for the object/part" +msgstr "객체(object)/부품(Part)에 대한 새 압출(익스트루더) 기 선택" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1703 +msgid "Scale to print volume" +msgstr "인쇄 볼륨에 따라 배율 조정" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1703 +msgid "Scale the selected object to fit the print volume" +msgstr "인쇄 볼륨에 맞게 선택한 객체(object)의 배율 조정" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1772 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2030 +msgid "Add Shape" +msgstr "모양 추가" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1858 msgid "Load Part" msgstr "부품(Part)을 불러 오기" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1617 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1897 msgid "Error!" msgstr "에러!" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1662 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1972 msgid "Add Generic Subobject" msgstr "기본이 되는 하위 객체(object) 추가" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1669 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2001 msgid "Generic" msgstr "일반" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1770 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1872 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2119 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2221 msgid "Last instance of an object cannot be deleted." msgstr "객체(object)의 마지막 복제본를 삭제할 수 없습니다." -#: src/slic3r/GUI/GUI_ObjectList.cpp:1782 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2131 msgid "Delete Settings" msgstr "설정 삭제" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1806 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2155 msgid "Delete All Instances from Object" msgstr "객체(object)에서 모든 복제본 삭제" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1822 -msgid "Delete Layers Range" -msgstr "레이어 범위 삭제" +#: src/slic3r/GUI/GUI_ObjectList.cpp:2171 +msgid "Delete Height Range" +msgstr "높이 범위 삭제" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1853 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2202 msgid "From Object List You can't delete the last solid part from object." msgstr "객체(object) 리스트에서 마지막 부품(Part)을 삭제할 수 없습니다." -#: src/slic3r/GUI/GUI_ObjectList.cpp:1857 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2206 msgid "Delete Subobject" msgstr "하위 객체(object) 삭제" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1876 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2225 msgid "Delete Instance" msgstr "복제본 삭제" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1900 src/slic3r/GUI/Plater.cpp:2793 -msgid "The selected object couldn't be split because it contains only one part." -msgstr "선택한 객체(object)는 부품(Part) 하나만 포함되어 있기 때문에 분할 할 수 없습니다." +#: src/slic3r/GUI/GUI_ObjectList.cpp:2249 src/slic3r/GUI/Plater.cpp:2964 +msgid "" +"The selected object couldn't be split because it contains only one part." +msgstr "" +"선택한 객체(object)는 부품(Part) 하나만 포함되어 있기 때문에 분할 할 수 없습" +"니다." -#: src/slic3r/GUI/GUI_ObjectList.cpp:1904 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2253 msgid "Split to Parts" msgstr "부품(Part)으로 분할" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1950 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2305 msgid "Add Layers" msgstr "레이어 추가" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2075 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2431 msgid "Group manipulation" msgstr "그룹 조작" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2087 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2443 msgid "Object manipulation" msgstr "객체(object) 조작" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2100 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2456 msgid "Object Settings to modify" msgstr "수정할 객체(object) 설정" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2104 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2460 msgid "Part Settings to modify" msgstr "수정할 부품(Part) 설정" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2109 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2465 msgid "Layer range Settings to modify" msgstr "레이어 범위 설정 수정" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2115 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2471 msgid "Part manipulation" msgstr "부품(Part) 조작" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2121 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2477 msgid "Instance manipulation" msgstr "복제본 제거" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2128 -msgid "Layers Editing" -msgstr "레이어들 편집" +#: src/slic3r/GUI/GUI_ObjectList.cpp:2484 +msgid "Height ranges" +msgstr "높이 범위" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2128 -msgid "Layer Editing" -msgstr "레이어 편집" +#: src/slic3r/GUI/GUI_ObjectList.cpp:2484 +msgid "Settings for height range" +msgstr "높이 범위에 대한 설정" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2303 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2670 msgid "Delete Selected Item" msgstr "선택한 항목(item) 삭제" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2415 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2807 msgid "Delete Selected" msgstr "선택된 것 삭제" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2484 -#: src/slic3r/GUI/GUI_ObjectList.cpp:2513 -#: src/slic3r/GUI/GUI_ObjectList.cpp:2531 -msgid "Add New Layers Range" -msgstr "새 레이어 범위 추가" +#: src/slic3r/GUI/GUI_ObjectList.cpp:2873 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2902 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2920 +msgid "Add Height Range" +msgstr "높이 범위 추가" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2590 -msgid "Edit Layers Range" -msgstr "레이어 범위 편집" +#: src/slic3r/GUI/GUI_ObjectList.cpp:2980 +msgid "Edit Height Range" +msgstr "높이 범위 편집" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2867 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3266 msgid "Selection-Remove from list" msgstr "목록에서 선택-제거" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2875 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3274 msgid "Selection-Add from list" msgstr "목록에서 선택-추가" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2993 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3392 msgid "Object or Instance" msgstr "객체(object) 또는 복제본" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2994 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3127 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3393 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3526 msgid "Part" -msgstr "부품(Part)" +msgstr "부품(Part)(Part)" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2994 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3393 msgid "Layer" msgstr "레이어" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2996 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3395 msgid "Unsupported selection" msgstr "지원 되지 않는 선택" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2997 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3396 #, c-format msgid "You started your selection with %s Item." msgstr "%s 선택된 항목으로 시작합니다." -#: src/slic3r/GUI/GUI_ObjectList.cpp:2998 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3397 #, c-format msgid "In this mode you can select only other %s Items%s" msgstr "이 모드에서는 %s의 다른 %s 항목만 선택할 수 있습니다" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3001 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3400 msgid "of a current Object" msgstr "현재 객체(object)의" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3006 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3081 src/slic3r/GUI/Plater.cpp:126 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3405 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3480 src/slic3r/GUI/Plater.cpp:143 msgid "Info" msgstr "정보" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3122 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3521 msgid "You can't change a type of the last solid part of the object." msgstr "객체(object)의 마지막 부품(Part) 유형은 변경할 수 없습니다." -#: src/slic3r/GUI/GUI_ObjectList.cpp:3127 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3526 msgid "Modifier" msgstr "편집 영역" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3127 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3526 msgid "Support Enforcer" msgstr "서포트 지원 영역" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3127 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3526 msgid "Support Blocker" msgstr "서포트 금지 영역" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3129 -msgid "Type:" -msgstr "형식:" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:3129 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3528 msgid "Select type of part" msgstr "부품(Part) 유형 선택" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3134 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3533 msgid "Change Part Type" msgstr "부품(Part) 유형 변경" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3368 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3778 msgid "Enter new name" msgstr "새 이름 입력" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3368 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3778 msgid "Renaming" msgstr "이름 바꾸기" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3384 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3480 src/slic3r/GUI/Tab.cpp:3536 -#: src/slic3r/GUI/Tab.cpp:3540 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3794 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3901 src/slic3r/GUI/Tab.cpp:3426 +#: src/slic3r/GUI/Tab.cpp:3430 msgid "The supplied name is not valid;" msgstr "제공된 이름이 유효하지 않습니다;" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3385 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3481 src/slic3r/GUI/Tab.cpp:3537 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3795 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3902 src/slic3r/GUI/Tab.cpp:3427 msgid "the following characters are not allowed:" msgstr "다음 문자는 허용되지 않습니다:" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3498 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3927 msgid "Set extruder for selected items" msgstr "선택한 항목에 대한 압출기(익스트루더) 설정" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3499 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3928 msgid "Select extruder number for selected objects and/or parts" msgstr "선택한 객체(object) 및 부품(Part)에 대한 압출기(익스트루더) 번호 선택" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3512 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3951 msgid "Select extruder number:" msgstr "압출기(익스트루더) 번호 선택:" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3513 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3952 msgid "This extruder will be set for selected items" msgstr "선택한 항목에 대한 압출기(익스트루더) 설정" +#: src/slic3r/GUI/GUI_ObjectList.cpp:3977 +msgid "Change Extruders" +msgstr "돌출기 변경" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:4074 src/slic3r/GUI/Selection.cpp:1474 +msgid "Set Printable" +msgstr "인쇄 가능 설정" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:4074 src/slic3r/GUI/Selection.cpp:1474 +msgid "Set Unprintable" +msgstr "인쇄할 수 없는 설정" + #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:62 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:105 msgid "World coordinates" @@ -1835,85 +2822,88 @@ msgstr "로컬 좌표" msgid "Select coordinate space, in which the transformation will be performed." msgstr "변환이 수행될 좌표 공간을 선택 합니다." -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:125 -msgid "Object Manipulation" -msgstr "객체(object) 조작" - -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:176 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:155 src/libslic3r/GCode.cpp:638 msgid "Object name" msgstr "객체(object) 이름" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:212 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:215 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:457 +msgid "Position" +msgstr "위치" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:216 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:458 +#: src/slic3r/GUI/Mouse3DController.cpp:321 +#: src/slic3r/GUI/Mouse3DController.cpp:344 +msgid "Rotation" +msgstr "회전" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:263 #, c-format msgid "Toggle %c axis mirroring" msgstr "전환 %c 축 미러링" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:245 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:297 msgid "Set Mirror" msgstr "미러 설정" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:285 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:290 -msgid "Reset scale" -msgstr "크기 재설정" - -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:303 -msgid "Reset rotation" -msgstr "회전 재설정" - -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:328 -msgid "Reset Rotation" -msgstr "회전 재설정" - -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:340 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:355 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:337 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:349 msgid "Drop to bed" msgstr "배드를 아래로 내리기" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:388 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:443 -msgid "Position" -msgstr "위치" +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:363 +msgid "Reset rotation" +msgstr "회전 재설정" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:389 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:444 -msgid "Rotation" -msgstr "회전" +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:385 +msgid "Reset Rotation" +msgstr "회전 재설정" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:445 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:397 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:399 +msgid "Reset scale" +msgstr "크기 재설정" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:459 msgid "Scale factors" msgstr "축척 계수" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:502 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:516 msgid "Translate" msgstr "번역" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:554 -msgid "You cann't use non-uniform scaling mode for multiple objects/parts selection" -msgstr "여러 객체(object)/부품(Part) 선택에 는 균일하지 않은 배율 조정 모드를 사용할 수 없습니다." +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:578 +msgid "" +"You cannot use non-uniform scaling mode for multiple objects/parts selection" +msgstr "" +"여러 객체/부품 선택에 는 균일하지 않은 배율 조정 모드를 사용할 수 없습니다." -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:715 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:750 msgid "Set Position" msgstr "위치 설정" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:746 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:781 msgid "Set Orientation" msgstr "방향 설정" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:811 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:846 msgid "Set Scale" msgstr "축척 설정" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:895 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:875 msgid "" -"The currently manipulated object is tilted (rotation angles are not multiples of 90°).\n" -"Non-uniform scaling of tilted objects is only possible in the World coordinate system,\n" +"The currently manipulated object is tilted (rotation angles are not " +"multiples of 90°).\n" +"Non-uniform scaling of tilted objects is only possible in the World " +"coordinate system,\n" "once the rotation is embedded into the object coordinates." msgstr "" -"현재 조작 된 객체(object)가 기울어져 있습니다 (회전 각도가 90°의 배수가 아님).\n" +"현재 조작 된 객체(object)가 기울어져 있습니다 (회전 각도가 90°의 배수가 아" +"님).\n" "기울어진 객체(object)의 배율 조정은 기본 좌표에서만 가능 합니다." -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:898 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:878 msgid "" "This operation is irreversible.\n" "Do you want to proceed?" @@ -1921,266 +2911,280 @@ msgstr "" "이 작업은 되돌릴수 없습니다.\n" "계속 하시겠습니까?" -#: src/slic3r/GUI/GUI_ObjectSettings.cpp:58 +#: src/slic3r/GUI/GUI_ObjectSettings.cpp:59 msgid "Additional Settings" msgstr "추가적인 세팅" -#: src/slic3r/GUI/GUI_ObjectSettings.cpp:94 +#: src/slic3r/GUI/GUI_ObjectSettings.cpp:95 msgid "Remove parameter" msgstr "매개 변수 제거" -#: src/slic3r/GUI/GUI_ObjectSettings.cpp:100 +#: src/slic3r/GUI/GUI_ObjectSettings.cpp:101 #, c-format msgid "Delete Option %s" msgstr "삭제 %s 옵션" -#: src/slic3r/GUI/GUI_ObjectSettings.cpp:144 +#: src/slic3r/GUI/GUI_ObjectSettings.cpp:152 #, c-format msgid "Change Option %s" msgstr "옵션 %s 변경" -#: src/slic3r/GUI/GUI_Preview.cpp:216 +#: src/slic3r/GUI/GUI_Preview.cpp:220 msgid "View" msgstr "보기" -#: src/slic3r/GUI/GUI_Preview.cpp:219 src/slic3r/GUI/GUI_Preview.cpp:554 -#: src/libslic3r/GCode/PreviewData.cpp:394 +#: src/slic3r/GUI/GUI_Preview.cpp:223 src/slic3r/GUI/GUI_Preview.cpp:577 +#: src/libslic3r/GCode/PreviewData.cpp:345 msgid "Feature type" msgstr "특색 유형" -#: src/slic3r/GUI/GUI_Preview.cpp:220 src/libslic3r/PrintConfig.cpp:483 +#: src/slic3r/GUI/GUI_Preview.cpp:224 src/libslic3r/PrintConfig.cpp:500 msgid "Height" msgstr "높이" -#: src/slic3r/GUI/GUI_Preview.cpp:221 src/libslic3r/PrintConfig.cpp:2188 +#: src/slic3r/GUI/GUI_Preview.cpp:225 src/libslic3r/PrintConfig.cpp:2248 msgid "Width" msgstr "폭" -#: src/slic3r/GUI/GUI_Preview.cpp:223 +#: src/slic3r/GUI/GUI_Preview.cpp:227 src/slic3r/GUI/Tab.cpp:1451 +msgid "Fan speed" +msgstr "팬 속도" + +#: src/slic3r/GUI/GUI_Preview.cpp:228 msgid "Volumetric flow rate" msgstr "용적의 유량값" -#: src/slic3r/GUI/GUI_Preview.cpp:224 src/slic3r/GUI/GUI_Preview.cpp:328 -#: src/slic3r/GUI/GUI_Preview.cpp:506 src/slic3r/GUI/GUI_Preview.cpp:553 -#: src/slic3r/GUI/GUI_Preview.cpp:749 src/libslic3r/GCode/PreviewData.cpp:404 +#: src/slic3r/GUI/GUI_Preview.cpp:229 src/slic3r/GUI/GUI_Preview.cpp:337 +#: src/slic3r/GUI/GUI_Preview.cpp:521 src/slic3r/GUI/GUI_Preview.cpp:576 +#: src/slic3r/GUI/GUI_Preview.cpp:831 src/libslic3r/GCode/PreviewData.cpp:357 msgid "Tool" msgstr "도구" -#: src/slic3r/GUI/GUI_Preview.cpp:225 src/slic3r/GUI/GUI_Preview.cpp:551 -#: src/libslic3r/GCode/PreviewData.cpp:406 +#: src/slic3r/GUI/GUI_Preview.cpp:230 src/slic3r/GUI/GUI_Preview.cpp:574 +#: src/libslic3r/GCode/PreviewData.cpp:359 msgid "Color Print" msgstr "컬러 프린트" -#: src/slic3r/GUI/GUI_Preview.cpp:228 +#: src/slic3r/GUI/GUI_Preview.cpp:233 msgid "Show" msgstr "보다" -#: src/slic3r/GUI/GUI_Preview.cpp:231 src/slic3r/GUI/GUI_Preview.cpp:232 +#: src/slic3r/GUI/GUI_Preview.cpp:236 src/slic3r/GUI/GUI_Preview.cpp:237 msgid "Feature types" msgstr "특색 유형" -#: src/slic3r/GUI/GUI_Preview.cpp:234 src/libslic3r/GCode/PreviewData.cpp:163 +#: src/slic3r/GUI/GUI_Preview.cpp:239 src/libslic3r/ExtrusionEntity.cpp:310 msgid "Perimeter" msgstr "가장자리" -#: src/slic3r/GUI/GUI_Preview.cpp:235 src/libslic3r/GCode/PreviewData.cpp:164 +#: src/slic3r/GUI/GUI_Preview.cpp:240 src/libslic3r/ExtrusionEntity.cpp:311 msgid "External perimeter" msgstr "외부 가장자리" -#: src/slic3r/GUI/GUI_Preview.cpp:236 src/libslic3r/GCode/PreviewData.cpp:165 +#: src/slic3r/GUI/GUI_Preview.cpp:241 src/libslic3r/ExtrusionEntity.cpp:312 msgid "Overhang perimeter" msgstr "오버행(Overhang) 둘레" -#: src/slic3r/GUI/GUI_Preview.cpp:237 src/libslic3r/GCode/PreviewData.cpp:166 +#: src/slic3r/GUI/GUI_Preview.cpp:242 src/libslic3r/ExtrusionEntity.cpp:313 msgid "Internal infill" msgstr "내부 채움" -#: src/slic3r/GUI/GUI_Preview.cpp:238 src/libslic3r/PrintConfig.cpp:1736 -#: src/libslic3r/PrintConfig.cpp:1746 src/libslic3r/GCode/PreviewData.cpp:167 +#: src/slic3r/GUI/GUI_Preview.cpp:243 src/libslic3r/ExtrusionEntity.cpp:314 +#: src/libslic3r/PrintConfig.cpp:1766 src/libslic3r/PrintConfig.cpp:1777 msgid "Solid infill" msgstr "솔리드 인필" -#: src/slic3r/GUI/GUI_Preview.cpp:239 src/libslic3r/PrintConfig.cpp:2068 -#: src/libslic3r/PrintConfig.cpp:2079 src/libslic3r/GCode/PreviewData.cpp:168 +#: src/slic3r/GUI/GUI_Preview.cpp:244 src/libslic3r/ExtrusionEntity.cpp:315 +#: src/libslic3r/PrintConfig.cpp:2115 src/libslic3r/PrintConfig.cpp:2127 msgid "Top solid infill" msgstr "가장 윗부분 채움" -#: src/slic3r/GUI/GUI_Preview.cpp:240 src/libslic3r/GCode/PreviewData.cpp:169 +#: src/slic3r/GUI/GUI_Preview.cpp:245 src/libslic3r/ExtrusionEntity.cpp:316 msgid "Bridge infill" msgstr "브릿지 채움" -#: src/slic3r/GUI/GUI_Preview.cpp:241 src/libslic3r/PrintConfig.cpp:895 -#: src/libslic3r/GCode/PreviewData.cpp:170 +#: src/slic3r/GUI/GUI_Preview.cpp:246 src/libslic3r/ExtrusionEntity.cpp:317 +#: src/libslic3r/PrintConfig.cpp:919 msgid "Gap fill" msgstr "공백 채움" -#: src/slic3r/GUI/GUI_Preview.cpp:242 src/slic3r/GUI/Tab.cpp:1061 -#: src/libslic3r/GCode/PreviewData.cpp:171 +#: src/slic3r/GUI/GUI_Preview.cpp:247 src/slic3r/GUI/Tab.cpp:1101 +#: src/libslic3r/ExtrusionEntity.cpp:318 msgid "Skirt" msgstr "스커트" -#: src/slic3r/GUI/GUI_Preview.cpp:244 src/libslic3r/PrintConfig.cpp:1954 -#: src/libslic3r/GCode/PreviewData.cpp:173 +#: src/slic3r/GUI/GUI_Preview.cpp:249 src/libslic3r/ExtrusionEntity.cpp:320 +#: src/libslic3r/PrintConfig.cpp:2001 msgid "Support material interface" msgstr "서포트 접점" -#: src/slic3r/GUI/GUI_Preview.cpp:245 src/slic3r/GUI/Tab.cpp:1141 -#: src/libslic3r/GCode/PreviewData.cpp:174 +#: src/slic3r/GUI/GUI_Preview.cpp:250 src/slic3r/GUI/Tab.cpp:1181 +#: src/libslic3r/ExtrusionEntity.cpp:321 msgid "Wipe tower" msgstr "와이프 타워(Wipe tower)" -#: src/slic3r/GUI/GUI_Preview.cpp:250 src/libslic3r/PrintConfig.cpp:2102 +#: src/slic3r/GUI/GUI_Preview.cpp:255 src/libslic3r/PrintConfig.cpp:2162 msgid "Travel" msgstr "이송" -#: src/slic3r/GUI/GUI_Preview.cpp:251 +#: src/slic3r/GUI/GUI_Preview.cpp:256 msgid "Retractions" msgstr "리트랙션" -#: src/slic3r/GUI/GUI_Preview.cpp:252 +#: src/slic3r/GUI/GUI_Preview.cpp:257 msgid "Unretractions" msgstr "리트랙션 취소" -#: src/slic3r/GUI/GUI_Preview.cpp:253 +#: src/slic3r/GUI/GUI_Preview.cpp:258 msgid "Shells" msgstr "쉘(Shells)" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:13 src/slic3r/GUI/MainFrame.cpp:672 +#: src/slic3r/GUI/GUI_Preview.cpp:259 +msgid "Legend" +msgstr "범례" + +#: src/slic3r/GUI/Job.hpp:123 +msgid "ERROR: not enough resources to execute a new job." +msgstr "오류: 새 작업을 실행하기에 충분한 리소스가 없습니다." + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:14 src/slic3r/GUI/MainFrame.cpp:710 msgid "Keyboard Shortcuts" msgstr "키보드 단축기" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:104 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:107 msgid "Open project STL/OBJ/AMF/3MF with config, delete bed" msgstr "프로젝트 구성 열기(STL/OBJ/AMF/3MF), 배드 삭제" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:105 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:108 msgid "Import STL/OBJ/AMF/3MF without config, keep bed" msgstr "구성 없이 가져오기(STL/OBJ/AMF/3MF), 배드 유지" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:106 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:109 msgid "Load Config from .ini/amf/3mf/gcode" msgstr ".Ini/amf/3mf/gcode에서 구성 가져오기" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:107 src/slic3r/GUI/Plater.cpp:822 -#: src/slic3r/GUI/Plater.cpp:4687 src/libslic3r/PrintConfig.cpp:3127 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:110 src/slic3r/GUI/Plater.cpp:888 +#: src/slic3r/GUI/Plater.cpp:5544 src/libslic3r/PrintConfig.cpp:3348 msgid "Export G-code" -msgstr "G-코드 내보내기" +msgstr "G-code 내보내기" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:108 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:111 msgid "Save project (3MF)" msgstr "프로젝트 저장 (3MF)" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:109 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:112 msgid "Load Config from .ini/amf/3mf/gcode and merge" msgstr ".Ini/amf/3mf/gcode 및 병합에서 구성 가져오기" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:110 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:113 msgid "(Re)slice" msgstr "(Re)슬라이스" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:113 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:116 msgid "Select Plater Tab" msgstr "선택 및 플래이터 탭" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:115 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:118 msgid "Select Print Settings Tab" msgstr "인쇄 설정을 선택 합니다" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:116 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:119 msgid "Select Filament Settings Tab" msgstr "필라멘트 설정을 선택" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:117 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:120 msgid "Select Printer Settings Tab" msgstr "프린터 설정을 선택 합니다" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:118 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:121 msgid "Switch to 3D" msgstr "3D로 전환" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:119 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:122 msgid "Switch to Preview" msgstr "미리 보기로 전환" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:120 src/slic3r/GUI/Preferences.cpp:10 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:123 src/slic3r/GUI/Preferences.cpp:10 msgid "Preferences" msgstr "기본 설정" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:121 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:124 #: src/slic3r/GUI/PrintHostDialogs.cpp:136 msgid "Print host upload queue" msgstr "프린터 호스트 업로드 대기" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:122 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:125 msgid "Camera view" msgstr "카메라 뷰" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:123 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:126 msgid "Add Instance of the selected object" msgstr "선택한 객체(object)의 복제본 추가" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:124 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:127 msgid "Remove Instance of the selected object" msgstr "선택한 객체(object)의 복제본 제거" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:125 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:128 msgid "Show keyboard shortcuts list" msgstr "단축 키 목록 표시" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:126 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:129 msgid "Press to select multiple object or move multiple object with mouse" -msgstr "여러 객체(object)를 선택 하거나 마우스로 여러 객체(object)를 이동 하려면 누릅니다" +msgstr "" +"여러 객체(object)를 선택 하거나 마우스로 여러 객체(object)를 이동 하려면 누릅" +"니다" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:128 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:131 msgid "Main Shortcuts" msgstr "주요 단축키" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:135 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:139 msgid "Select All objects" msgstr "모든 객체(object) 선택" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:136 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:140 msgid "Delete selected" msgstr "선택 삭제" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:137 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:141 msgid "Delete All" msgstr "전부 지움" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:138 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:142 msgid "Copy to clipboard" msgstr "클립보드로 복사" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:139 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:143 msgid "Paste from clipboard" msgstr "클립보드에서 붙여넣기" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:140 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:144 msgid "Gizmo move" msgstr "개체(Gizmo) 이동" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:141 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:145 msgid "Gizmo scale" msgstr "개체(Gizmo) 배율" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:142 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:146 msgid "Gizmo rotate" msgstr "개체(Gizmo) 회전" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:143 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:147 msgid "Gizmo cut" msgstr "개체(Gizmo) 자르기" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:144 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:148 msgid "Gizmo Place face on bed" msgstr "개체(Gizmo)를 배드위로" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:145 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:149 msgid "Gizmo SLA support points" msgstr "SLA 개체(Gizmo) 서포트 지점들" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:146 -#, c-format +#: src/slic3r/GUI/KBShortcutsDialog.cpp:150 +#, no-c-format msgid "" "Press to activate selection rectangle\n" "or to snap by 5% in Gizmo scale\n" @@ -2190,681 +3194,747 @@ msgstr "" "5% in 객체(object) 크기를 스냅에 맞춰 조절합니다.\n" "1mm 씩 객체(object)를 스냅에 맞추 이동합니다." -#: src/slic3r/GUI/KBShortcutsDialog.cpp:147 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:151 msgid "" "Press to scale selection to fit print volume\n" "in Gizmo scale" msgstr "개체(Gizmo)크기를 인쇄 볼륨에 맞게 조정하려면 누릅니다." -#: src/slic3r/GUI/KBShortcutsDialog.cpp:148 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:152 msgid "" "Press to activate deselection rectangle\n" "or to scale or rotate selected objects\n" "around their own center" msgstr "" -"중심 주변으로. 선택한 개체의 크기를 조정 하거나 \n" +"중재봉선 주변으로. 선택한 개체의 크기를 조정 하거나 \n" "회전 하려면 누릅니다" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:149 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:153 msgid "Press to activate one direction scaling in Gizmo scale" -msgstr "기즈모 크기 조절을 활성화 합니다." +msgstr "개체(Gizmo) 크기 조절을 활성화 합니다." -#: src/slic3r/GUI/KBShortcutsDialog.cpp:150 -msgid "Change camera type" -msgstr "카메라 유형 변경" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:154 +msgid "Change camera type (perspective, orthographic)" +msgstr "카메라 유형 변경(원근, 직교)" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:151 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:155 msgid "Zoom to Bed" msgstr "배드 확대" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:152 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:156 msgid "Zoom to all objects in scene, if none selected" msgstr "모든 객체(object)를 확대/축소 (선택 하지 않은 경우)" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:153 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:157 msgid "Zoom to selected object" msgstr "선택한 객체(object)를 확대/축소" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:154 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:158 msgid "Zoom in" msgstr "확대" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:155 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:159 msgid "Zoom out" msgstr "축소" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:156 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:161 +msgid "Show/Hide object/instance labels" +msgstr "개체/인스턴스 레이블 표시/숨기기" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:163 +msgid "Show/Hide 3Dconnexion devices settings dialog" +msgstr "3Dconnexion 장치 설정 대화 상자 표시/숨기기" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:164 msgid "Unselect gizmo / Clear selection" msgstr "개체(Gizmo) 선택을 취소 하거나 지우기" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:158 -msgid "Toggle picking pass texture rendering on/off" -msgstr "선택된 텍스처 렌더링을 켜거나 끄기" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:161 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:170 msgid "Plater Shortcuts" msgstr "플레이터 단축기" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:176 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:187 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:185 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:197 msgid "Arrow Up" msgstr "위쪽 화살표" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:176 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:178 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:185 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:187 msgid "Upper Layer" msgstr "상위 레이어" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:177 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:188 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:186 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:198 msgid "Arrow Down" msgstr "아래쪽 화살표" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:177 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:179 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:186 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:188 msgid "Lower Layer" msgstr "하위 레이어" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:181 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:189 +msgid "Show/Hide (L)egend" +msgstr "표시/숨기기(L)egend" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:191 msgid "Preview Shortcuts" msgstr "미리보기 단축기" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:187 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:197 msgid "Move current slider thumb Up" msgstr "현재 마우스 휠을 위로 이동" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:188 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:198 msgid "Move current slider thumb Down" msgstr "현재 마우스 휠을 아래로 이동" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:189 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:199 msgid "Arrow Left" msgstr "왼쪽 화살표" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:189 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:199 msgid "Set upper thumb to current slider thumb" msgstr "마우스 휠을 위로 움직여 설정" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:190 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:200 msgid "Arrow Right" msgstr "오른쪽 화살표" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:190 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:200 msgid "Set lower thumb to current slider thumb" msgstr "마우스 휠을 아래로 움직여 설정" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:191 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:201 msgid "Add color change marker for current layer" msgstr "현재 레이어의 색상을 변경할 마커 추가" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:192 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:202 msgid "Delete color change marker for current layer" msgstr "현재 레이어의 색상을 변경할 마커 삭제" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:194 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:204 msgid "Layers Slider Shortcuts" msgstr "레이어 슬라이더 단축키" -#: src/slic3r/GUI/MainFrame.cpp:62 -msgid " - Remember to check for updates at http://github.com/prusa3d/PrusaSlicer/releases" -msgstr " -http://github.com/prusa3d/slic3r/releases에서 업데이트 확인하는 것을 잊지 마십시오" +#: src/slic3r/GUI/MainFrame.cpp:66 +msgid "" +" - Remember to check for updates at http://github.com/prusa3d/PrusaSlicer/" +"releases" +msgstr "" +" -http://github.com/prusa3d/slic3r/releases에서 업데이트 확인하는 것을 잊지 " +"마십시오" -#: src/slic3r/GUI/MainFrame.cpp:157 +#: src/slic3r/GUI/MainFrame.cpp:174 msgid "based on Slic3r" msgstr "Slic3r 기반" -#: src/slic3r/GUI/MainFrame.cpp:187 +#: src/slic3r/GUI/MainFrame.cpp:204 msgid "Plater" msgstr "플레이터" -#: src/slic3r/GUI/MainFrame.cpp:393 +#: src/slic3r/GUI/MainFrame.cpp:405 msgid "&New Project" msgstr "&새로운 프로젝트" -#: src/slic3r/GUI/MainFrame.cpp:393 +#: src/slic3r/GUI/MainFrame.cpp:405 msgid "Start a new project" msgstr "새로운 프로젝트 시작" -#: src/slic3r/GUI/MainFrame.cpp:396 +#: src/slic3r/GUI/MainFrame.cpp:408 msgid "&Open Project" msgstr "&프로젝트 열기" -#: src/slic3r/GUI/MainFrame.cpp:396 +#: src/slic3r/GUI/MainFrame.cpp:408 msgid "Open a project file" msgstr "프로젝트 파일 열기" -#: src/slic3r/GUI/MainFrame.cpp:401 +#: src/slic3r/GUI/MainFrame.cpp:413 msgid "Recent projects" msgstr "최근 프로젝트" -#: src/slic3r/GUI/MainFrame.cpp:410 +#: src/slic3r/GUI/MainFrame.cpp:422 msgid "The selected project is no more available" msgstr "선택한 프로젝트를 더 이상 사용할 수 없습니다." -#: src/slic3r/GUI/MainFrame.cpp:410 src/slic3r/GUI/MainFrame.cpp:747 +#: src/slic3r/GUI/MainFrame.cpp:422 src/slic3r/GUI/MainFrame.cpp:787 #: src/slic3r/GUI/PrintHostDialogs.cpp:231 msgid "Error" msgstr "에러" -#: src/slic3r/GUI/MainFrame.cpp:434 +#: src/slic3r/GUI/MainFrame.cpp:446 msgid "&Save Project" msgstr "프로젝트 저장" -#: src/slic3r/GUI/MainFrame.cpp:434 +#: src/slic3r/GUI/MainFrame.cpp:446 msgid "Save current project file" msgstr "현재 프로젝트 파일 저장" -#: src/slic3r/GUI/MainFrame.cpp:438 src/slic3r/GUI/MainFrame.cpp:440 +#: src/slic3r/GUI/MainFrame.cpp:450 src/slic3r/GUI/MainFrame.cpp:452 msgid "Save Project &as" msgstr "프로젝트 저장" -#: src/slic3r/GUI/MainFrame.cpp:438 src/slic3r/GUI/MainFrame.cpp:440 +#: src/slic3r/GUI/MainFrame.cpp:450 src/slic3r/GUI/MainFrame.cpp:452 msgid "Save current project file as" msgstr "현재 프로젝트 파일을 다른 이름으로 저장" -#: src/slic3r/GUI/MainFrame.cpp:448 +#: src/slic3r/GUI/MainFrame.cpp:460 msgid "Import STL/OBJ/AM&F/3MF" msgstr "가져오기 STL/OBJ/AM&F/3MF" -#: src/slic3r/GUI/MainFrame.cpp:448 +#: src/slic3r/GUI/MainFrame.cpp:460 msgid "Load a model" msgstr "모델 로드" -#: src/slic3r/GUI/MainFrame.cpp:452 +#: src/slic3r/GUI/MainFrame.cpp:464 msgid "Import &Config" msgstr "&구성 가져오기" -#: src/slic3r/GUI/MainFrame.cpp:452 +#: src/slic3r/GUI/MainFrame.cpp:464 msgid "Load exported configuration file" msgstr "내 보낸 구성 파일로드" -#: src/slic3r/GUI/MainFrame.cpp:454 +#: src/slic3r/GUI/MainFrame.cpp:467 msgid "Import Config from &project" msgstr "프로젝트에서 설정 가져오기" -#: src/slic3r/GUI/MainFrame.cpp:454 +#: src/slic3r/GUI/MainFrame.cpp:467 msgid "Load configuration from project file" msgstr "프로젝트 파일에서 구성 로드" -#: src/slic3r/GUI/MainFrame.cpp:457 +#: src/slic3r/GUI/MainFrame.cpp:471 msgid "Import Config &Bundle" msgstr "번들 &설정 가져오기" -#: src/slic3r/GUI/MainFrame.cpp:457 +#: src/slic3r/GUI/MainFrame.cpp:471 msgid "Load presets from a bundle" msgstr "미리 설정 번들값 가져오기" -#: src/slic3r/GUI/MainFrame.cpp:459 +#: src/slic3r/GUI/MainFrame.cpp:474 msgid "&Import" msgstr "&가져오기" -#: src/slic3r/GUI/MainFrame.cpp:462 src/slic3r/GUI/MainFrame.cpp:708 +#: src/slic3r/GUI/MainFrame.cpp:477 src/slic3r/GUI/MainFrame.cpp:751 msgid "Export &G-code" -msgstr "G-코드 내보내기" +msgstr "G-code 내보내기" -#: src/slic3r/GUI/MainFrame.cpp:462 +#: src/slic3r/GUI/MainFrame.cpp:477 msgid "Export current plate as G-code" msgstr "현재 플레이터를 G 코드로 내보내기" -#: src/slic3r/GUI/MainFrame.cpp:466 src/slic3r/GUI/MainFrame.cpp:709 +#: src/slic3r/GUI/MainFrame.cpp:481 src/slic3r/GUI/MainFrame.cpp:752 msgid "S&end G-code" -msgstr "S&end G- 코드" +msgstr "S&엔드 G- 코드" -#: src/slic3r/GUI/MainFrame.cpp:466 +#: src/slic3r/GUI/MainFrame.cpp:481 msgid "Send to print current plate as G-code" msgstr "현재 플레이트를 G 코드로 인쇄하기 위해 보내기" -#: src/slic3r/GUI/MainFrame.cpp:471 +#: src/slic3r/GUI/MainFrame.cpp:486 msgid "Export plate as &STL" msgstr "STL로 내보내기" -#: src/slic3r/GUI/MainFrame.cpp:471 +#: src/slic3r/GUI/MainFrame.cpp:486 msgid "Export current plate as STL" msgstr "현재 플레이터를 STL로 내보내기" -#: src/slic3r/GUI/MainFrame.cpp:474 -msgid "Export plate as STL including supports" -msgstr "서포트를 포함하여 STL파일로 내보내기" +#: src/slic3r/GUI/MainFrame.cpp:489 +msgid "Export plate as STL &including supports" +msgstr "서포트를 포함하여 플레이터를 STL로 내보내기" -#: src/slic3r/GUI/MainFrame.cpp:474 +#: src/slic3r/GUI/MainFrame.cpp:489 msgid "Export current plate as STL including supports" msgstr "서포트를 포함 하여 현재 플레이터를 STL로 내보내기" -#: src/slic3r/GUI/MainFrame.cpp:477 +#: src/slic3r/GUI/MainFrame.cpp:492 msgid "Export plate as &AMF" msgstr "AMF로 내보내기" -#: src/slic3r/GUI/MainFrame.cpp:477 +#: src/slic3r/GUI/MainFrame.cpp:492 msgid "Export current plate as AMF" msgstr "현재 플레이터를 AMF로 내보내기" -#: src/slic3r/GUI/MainFrame.cpp:481 +#: src/slic3r/GUI/MainFrame.cpp:496 +msgid "Export &toolpaths as OBJ" +msgstr "OBJ로 내보내기 및 공구 경로" + +#: src/slic3r/GUI/MainFrame.cpp:496 +msgid "Export toolpaths as OBJ" +msgstr "도구 경로를 OBJ로 내보내기" + +#: src/slic3r/GUI/MainFrame.cpp:500 msgid "Export &Config" msgstr "&구성 내보내기" -#: src/slic3r/GUI/MainFrame.cpp:481 +#: src/slic3r/GUI/MainFrame.cpp:500 msgid "Export current configuration to file" msgstr "현재 구성을 파일로 내보내기" -#: src/slic3r/GUI/MainFrame.cpp:483 +#: src/slic3r/GUI/MainFrame.cpp:503 msgid "Export Config &Bundle" msgstr "번들 & 내보내기 설정" -#: src/slic3r/GUI/MainFrame.cpp:483 +#: src/slic3r/GUI/MainFrame.cpp:503 msgid "Export all presets to file" msgstr "모든 이전 설정을 파일로 내보내기" -#: src/slic3r/GUI/MainFrame.cpp:485 +#: src/slic3r/GUI/MainFrame.cpp:506 msgid "&Export" msgstr "&내보내기" -#: src/slic3r/GUI/MainFrame.cpp:491 +#: src/slic3r/GUI/MainFrame.cpp:512 msgid "Quick Slice" msgstr "빠른 슬라이스" -#: src/slic3r/GUI/MainFrame.cpp:491 +#: src/slic3r/GUI/MainFrame.cpp:512 msgid "Slice a file into a G-code" msgstr "파일을 G 코드로 분할" -#: src/slic3r/GUI/MainFrame.cpp:497 +#: src/slic3r/GUI/MainFrame.cpp:518 msgid "Quick Slice and Save As" msgstr "빠른 슬라이스 및 다른 이름으로 저장" -#: src/slic3r/GUI/MainFrame.cpp:497 +#: src/slic3r/GUI/MainFrame.cpp:518 msgid "Slice a file into a G-code, save as" msgstr "파일을 G 코드로 분할하고 다른 이름으로 저장" -#: src/slic3r/GUI/MainFrame.cpp:503 +#: src/slic3r/GUI/MainFrame.cpp:524 msgid "Repeat Last Quick Slice" msgstr "마지막으로 빠른 슬라이스 반복" -#: src/slic3r/GUI/MainFrame.cpp:503 +#: src/slic3r/GUI/MainFrame.cpp:524 msgid "Repeat last quick slice" msgstr "마지막으로 빠른 슬라이스 반복" -#: src/slic3r/GUI/MainFrame.cpp:511 +#: src/slic3r/GUI/MainFrame.cpp:532 msgid "(Re)Slice No&w" msgstr "지금(다시)자르기" -#: src/slic3r/GUI/MainFrame.cpp:511 +#: src/slic3r/GUI/MainFrame.cpp:532 msgid "Start new slicing process" msgstr "새로운 슬라이싱 작업 시작" -#: src/slic3r/GUI/MainFrame.cpp:515 +#: src/slic3r/GUI/MainFrame.cpp:536 msgid "&Repair STL file" msgstr "STL 파일 복구" -#: src/slic3r/GUI/MainFrame.cpp:515 +#: src/slic3r/GUI/MainFrame.cpp:536 msgid "Automatically repair an STL file" msgstr "STL 파일을 자동으로 복구합니다" -#: src/slic3r/GUI/MainFrame.cpp:518 +#: src/slic3r/GUI/MainFrame.cpp:540 msgid "&Quit" msgstr "&종료" -#: src/slic3r/GUI/MainFrame.cpp:518 +#: src/slic3r/GUI/MainFrame.cpp:540 #, c-format msgid "Quit %s" msgstr "%s 종료" -#: src/slic3r/GUI/MainFrame.cpp:543 +#: src/slic3r/GUI/MainFrame.cpp:565 msgid "&Select all" msgstr "&모두 선택 " -#: src/slic3r/GUI/MainFrame.cpp:544 +#: src/slic3r/GUI/MainFrame.cpp:566 msgid "Selects all objects" msgstr "모든 객체(object)를 선택 합니다" -#: src/slic3r/GUI/MainFrame.cpp:546 +#: src/slic3r/GUI/MainFrame.cpp:568 msgid "D&eselect all" msgstr "모든 선택 취소 D&select" -#: src/slic3r/GUI/MainFrame.cpp:547 +#: src/slic3r/GUI/MainFrame.cpp:569 msgid "Deselects all objects" msgstr "모든 객체(object) 선택 취소" -#: src/slic3r/GUI/MainFrame.cpp:550 +#: src/slic3r/GUI/MainFrame.cpp:572 msgid "&Delete selected" msgstr "&선택 삭제 " -#: src/slic3r/GUI/MainFrame.cpp:551 +#: src/slic3r/GUI/MainFrame.cpp:573 msgid "Deletes the current selection" msgstr "현재 선택 영역을 삭제 합니다" -#: src/slic3r/GUI/MainFrame.cpp:553 +#: src/slic3r/GUI/MainFrame.cpp:575 msgid "Delete &all" msgstr "전부 지움 " -#: src/slic3r/GUI/MainFrame.cpp:554 +#: src/slic3r/GUI/MainFrame.cpp:576 msgid "Deletes all objects" msgstr "모든 객체(object)를 삭제 합니다" -#: src/slic3r/GUI/MainFrame.cpp:558 +#: src/slic3r/GUI/MainFrame.cpp:580 msgid "&Undo" msgstr "&되돌리기" -#: src/slic3r/GUI/MainFrame.cpp:561 +#: src/slic3r/GUI/MainFrame.cpp:583 msgid "&Redo" msgstr "&앞으로" -#: src/slic3r/GUI/MainFrame.cpp:566 +#: src/slic3r/GUI/MainFrame.cpp:588 msgid "&Copy" msgstr "&복사 " -#: src/slic3r/GUI/MainFrame.cpp:567 +#: src/slic3r/GUI/MainFrame.cpp:589 msgid "Copy selection to clipboard" msgstr "선택영역을 클립보드로 복사합니다" -#: src/slic3r/GUI/MainFrame.cpp:569 +#: src/slic3r/GUI/MainFrame.cpp:591 msgid "&Paste" msgstr "&붙이기 " -#: src/slic3r/GUI/MainFrame.cpp:570 +#: src/slic3r/GUI/MainFrame.cpp:592 msgid "Paste clipboard" msgstr "클립보드 붙여넣기" -#: src/slic3r/GUI/MainFrame.cpp:579 +#: src/slic3r/GUI/MainFrame.cpp:596 +msgid "Re&load from disk" +msgstr "디스크에서 다시 로드" + +#: src/slic3r/GUI/MainFrame.cpp:597 +msgid "Reload the plater from disk" +msgstr "디스크에서 플래터 다시 로드" + +#: src/slic3r/GUI/MainFrame.cpp:606 msgid "&Plater Tab" msgstr "&선택 및 플래이터 탭" -#: src/slic3r/GUI/MainFrame.cpp:579 +#: src/slic3r/GUI/MainFrame.cpp:606 msgid "Show the plater" msgstr "플레이터를 보기" -#: src/slic3r/GUI/MainFrame.cpp:586 +#: src/slic3r/GUI/MainFrame.cpp:614 msgid "P&rint Settings Tab" msgstr "프린트 설정 탭" -#: src/slic3r/GUI/MainFrame.cpp:586 +#: src/slic3r/GUI/MainFrame.cpp:614 msgid "Show the print settings" msgstr "인쇄 설정 표시" -#: src/slic3r/GUI/MainFrame.cpp:588 src/slic3r/GUI/MainFrame.cpp:711 +#: src/slic3r/GUI/MainFrame.cpp:617 src/slic3r/GUI/MainFrame.cpp:754 msgid "&Filament Settings Tab" msgstr "&필라멘트 설정 탭" -#: src/slic3r/GUI/MainFrame.cpp:588 +#: src/slic3r/GUI/MainFrame.cpp:617 msgid "Show the filament settings" msgstr "필라멘트 설정보기" -#: src/slic3r/GUI/MainFrame.cpp:591 +#: src/slic3r/GUI/MainFrame.cpp:621 msgid "Print&er Settings Tab" msgstr "설정 인쇄 탭" -#: src/slic3r/GUI/MainFrame.cpp:591 +#: src/slic3r/GUI/MainFrame.cpp:621 msgid "Show the printer settings" msgstr "간단한 설정보기" -#: src/slic3r/GUI/MainFrame.cpp:595 +#: src/slic3r/GUI/MainFrame.cpp:626 msgid "3&D" msgstr "3&D" -#: src/slic3r/GUI/MainFrame.cpp:595 +#: src/slic3r/GUI/MainFrame.cpp:626 msgid "Show the 3D editing view" msgstr "3D 편집용 보기 표시" -#: src/slic3r/GUI/MainFrame.cpp:598 +#: src/slic3r/GUI/MainFrame.cpp:629 msgid "Pre&view" msgstr "미리 보기" -#: src/slic3r/GUI/MainFrame.cpp:598 +#: src/slic3r/GUI/MainFrame.cpp:629 msgid "Show the 3D slices preview" msgstr "3D 슬라이스 미리 보기 표시" -#: src/slic3r/GUI/MainFrame.cpp:617 +#: src/slic3r/GUI/MainFrame.cpp:648 msgid "Print &Host Upload Queue" -msgstr "호스트 업로드 대기열 인쇄" +msgstr "프린터 호스트 업로드 대기" -#: src/slic3r/GUI/MainFrame.cpp:617 +#: src/slic3r/GUI/MainFrame.cpp:648 msgid "Display the Print Host Upload Queue window" msgstr "호스트 업로드 대기열 인쇄 창 표시" -#: src/slic3r/GUI/MainFrame.cpp:626 +#: src/slic3r/GUI/MainFrame.cpp:658 msgid "Iso" msgstr "기본 " -#: src/slic3r/GUI/MainFrame.cpp:626 +#: src/slic3r/GUI/MainFrame.cpp:658 msgid "Iso View" msgstr "표준 보기" #. TRN To be shown in the main menu View->Top #. TRN To be shown in Print Settings "Top solid layers" -#: src/slic3r/GUI/MainFrame.cpp:630 src/libslic3r/PrintConfig.cpp:2094 +#: src/slic3r/GUI/MainFrame.cpp:662 src/libslic3r/PrintConfig.cpp:2142 +#: src/libslic3r/PrintConfig.cpp:2151 msgid "Top" msgstr "윗부분 " -#: src/slic3r/GUI/MainFrame.cpp:630 +#: src/slic3r/GUI/MainFrame.cpp:662 msgid "Top View" msgstr "위에서 보기" #. TRN To be shown in the main menu View->Bottom #. TRN To be shown in Print Settings "Bottom solid layers" -#: src/slic3r/GUI/MainFrame.cpp:633 src/libslic3r/PrintConfig.cpp:159 +#. TRN To be shown in Print Settings "Top solid layers" +#: src/slic3r/GUI/MainFrame.cpp:665 src/libslic3r/PrintConfig.cpp:164 +#: src/libslic3r/PrintConfig.cpp:173 msgid "Bottom" msgstr "바닥 " -#: src/slic3r/GUI/MainFrame.cpp:633 +#: src/slic3r/GUI/MainFrame.cpp:665 msgid "Bottom View" msgstr "바닥 보기" -#: src/slic3r/GUI/MainFrame.cpp:635 +#: src/slic3r/GUI/MainFrame.cpp:667 msgid "Front" msgstr "앞 " -#: src/slic3r/GUI/MainFrame.cpp:635 +#: src/slic3r/GUI/MainFrame.cpp:667 msgid "Front View" msgstr "앞면 보기 " -#: src/slic3r/GUI/MainFrame.cpp:637 src/libslic3r/PrintConfig.cpp:1611 +#: src/slic3r/GUI/MainFrame.cpp:669 src/libslic3r/PrintConfig.cpp:1641 msgid "Rear" msgstr "뒷면 " -#: src/slic3r/GUI/MainFrame.cpp:637 +#: src/slic3r/GUI/MainFrame.cpp:669 msgid "Rear View" msgstr "뒷면 보기" -#: src/slic3r/GUI/MainFrame.cpp:639 +#: src/slic3r/GUI/MainFrame.cpp:671 msgid "Left" msgstr "왼쪽 " -#: src/slic3r/GUI/MainFrame.cpp:639 +#: src/slic3r/GUI/MainFrame.cpp:671 msgid "Left View" msgstr "왼쪽 보기" -#: src/slic3r/GUI/MainFrame.cpp:641 +#: src/slic3r/GUI/MainFrame.cpp:673 msgid "Right" msgstr "오른쪽 " -#: src/slic3r/GUI/MainFrame.cpp:641 +#: src/slic3r/GUI/MainFrame.cpp:673 msgid "Right View" msgstr "오른쪽 보기" -#: src/slic3r/GUI/MainFrame.cpp:648 +#: src/slic3r/GUI/MainFrame.cpp:677 +msgid "Show &labels" +msgstr "레이블 & 표시 " + +#: src/slic3r/GUI/MainFrame.cpp:677 +msgid "Show object/instance labels in 3D scene" +msgstr "3D 장면에서 오브젝트/인스턴스 레이블 표시" + +#: src/slic3r/GUI/MainFrame.cpp:686 msgid "Prusa 3D &Drivers" msgstr "푸르사 3D 드라이버" -#: src/slic3r/GUI/MainFrame.cpp:648 +#: src/slic3r/GUI/MainFrame.cpp:686 msgid "Open the Prusa3D drivers download page in your browser" msgstr "브라우저에서 Prusa3D 드라이버 다운로드 페이지를 엽니다" -#: src/slic3r/GUI/MainFrame.cpp:650 +#: src/slic3r/GUI/MainFrame.cpp:688 msgid "Software &Releases" msgstr "소프트웨어 &자료" -#: src/slic3r/GUI/MainFrame.cpp:650 +#: src/slic3r/GUI/MainFrame.cpp:688 msgid "Open the software releases page in your browser" msgstr "브라우저에서 소프트웨어 정보 페이지 열기" -#: src/slic3r/GUI/MainFrame.cpp:656 +#: src/slic3r/GUI/MainFrame.cpp:694 #, c-format msgid "%s &Website" msgstr "%s &웹사이트" -#: src/slic3r/GUI/MainFrame.cpp:657 +#: src/slic3r/GUI/MainFrame.cpp:695 #, c-format msgid "Open the %s website in your browser" msgstr "%s 웹사이트를 브라우저에서 열기" -#: src/slic3r/GUI/MainFrame.cpp:663 +#: src/slic3r/GUI/MainFrame.cpp:701 msgid "System &Info" msgstr "시스템 정보" -#: src/slic3r/GUI/MainFrame.cpp:663 +#: src/slic3r/GUI/MainFrame.cpp:701 msgid "Show system information" msgstr "시스템 정보 표시" -#: src/slic3r/GUI/MainFrame.cpp:665 +#: src/slic3r/GUI/MainFrame.cpp:703 msgid "Show &Configuration Folder" msgstr "폴더 표시 및 구성" -#: src/slic3r/GUI/MainFrame.cpp:665 +#: src/slic3r/GUI/MainFrame.cpp:703 msgid "Show user configuration folder (datadir)" msgstr "사용자 구성 폴더를 표시 (datadir)" -#: src/slic3r/GUI/MainFrame.cpp:667 +#: src/slic3r/GUI/MainFrame.cpp:705 msgid "Report an I&ssue" msgstr "문제를 보고" -#: src/slic3r/GUI/MainFrame.cpp:667 +#: src/slic3r/GUI/MainFrame.cpp:705 #, c-format msgid "Report an issue on %s" msgstr "%s에 문제 보고" -#: src/slic3r/GUI/MainFrame.cpp:669 +#: src/slic3r/GUI/MainFrame.cpp:707 #, c-format msgid "&About %s" msgstr "%s 에 대하여" -#: src/slic3r/GUI/MainFrame.cpp:669 +#: src/slic3r/GUI/MainFrame.cpp:707 msgid "Show about dialog" msgstr "다이얼로그 표시" -#: src/slic3r/GUI/MainFrame.cpp:672 +#: src/slic3r/GUI/MainFrame.cpp:710 msgid "Show the list of the keyboard shortcuts" msgstr "키보드 단축키 목록 표시" -#: src/slic3r/GUI/MainFrame.cpp:680 +#: src/slic3r/GUI/MainFrame.cpp:723 msgid "&File" msgstr "&파일" -#: src/slic3r/GUI/MainFrame.cpp:681 +#: src/slic3r/GUI/MainFrame.cpp:724 msgid "&Edit" msgstr "&수정" -#: src/slic3r/GUI/MainFrame.cpp:682 +#: src/slic3r/GUI/MainFrame.cpp:725 msgid "&Window" msgstr "&윈도우" -#: src/slic3r/GUI/MainFrame.cpp:683 +#: src/slic3r/GUI/MainFrame.cpp:726 msgid "&View" msgstr "&시점" -#: src/slic3r/GUI/MainFrame.cpp:686 +#: src/slic3r/GUI/MainFrame.cpp:729 msgid "&Help" msgstr "&도움말" -#: src/slic3r/GUI/MainFrame.cpp:708 +#: src/slic3r/GUI/MainFrame.cpp:751 msgid "E&xport" msgstr "보내기" -#: src/slic3r/GUI/MainFrame.cpp:709 +#: src/slic3r/GUI/MainFrame.cpp:752 msgid "S&end to print" msgstr "끝내고 프린트" -#: src/slic3r/GUI/MainFrame.cpp:711 +#: src/slic3r/GUI/MainFrame.cpp:754 msgid "Mate&rial Settings Tab" msgstr "재료(메터리리알) 설정 탭" -#: src/slic3r/GUI/MainFrame.cpp:732 +#: src/slic3r/GUI/MainFrame.cpp:775 msgid "Choose a file to slice (STL/OBJ/AMF/3MF/PRUSA):" msgstr "슬라이스 할 파일을 선택하십시오 (STL / OBJ / AMF / 3MF / PRUSA):" -#: src/slic3r/GUI/MainFrame.cpp:746 +#: src/slic3r/GUI/MainFrame.cpp:786 msgid "No previously sliced file." msgstr "이전에 분리 된 파일이 없습니다." -#: src/slic3r/GUI/MainFrame.cpp:752 +#: src/slic3r/GUI/MainFrame.cpp:792 msgid "Previously sliced file (" msgstr "이전에 분리 된 파일 (" -#: src/slic3r/GUI/MainFrame.cpp:752 +#: src/slic3r/GUI/MainFrame.cpp:792 msgid ") not found." msgstr ")을 찾을 수 없습니다." -#: src/slic3r/GUI/MainFrame.cpp:753 +#: src/slic3r/GUI/MainFrame.cpp:793 msgid "File Not Found" msgstr "파일을 찾을수 없다" -#: src/slic3r/GUI/MainFrame.cpp:788 +#: src/slic3r/GUI/MainFrame.cpp:828 #, c-format msgid "Save %s file as:" -msgstr "%s 파일을 다음과 같이 저장 합니다" +msgstr "%s 파일을 저장 합니다:" -#: src/slic3r/GUI/MainFrame.cpp:788 +#: src/slic3r/GUI/MainFrame.cpp:828 msgid "SVG" msgstr "Svg" -#: src/slic3r/GUI/MainFrame.cpp:788 +#: src/slic3r/GUI/MainFrame.cpp:828 msgid "G-code" msgstr "G 코드" -#: src/slic3r/GUI/MainFrame.cpp:803 +#: src/slic3r/GUI/MainFrame.cpp:840 msgid "Save zip file as:" msgstr "압축(zip)파일 다른이름 저장:" -#: src/slic3r/GUI/MainFrame.cpp:815 src/slic3r/GUI/Plater.cpp:2933 -#: src/slic3r/GUI/Plater.cpp:4418 src/slic3r/GUI/Tab.cpp:1170 -#: src/slic3r/GUI/Tab.cpp:3700 +#: src/slic3r/GUI/MainFrame.cpp:849 src/slic3r/GUI/Plater.cpp:3107 +#: src/slic3r/GUI/Plater.cpp:5126 src/slic3r/GUI/Tab.cpp:1211 +#: src/slic3r/GUI/Tab.cpp:3634 msgid "Slicing" msgstr "슬라이싱" #. TRN "Processing input_file_basename" -#: src/slic3r/GUI/MainFrame.cpp:817 +#: src/slic3r/GUI/MainFrame.cpp:851 #, c-format msgid "Processing %s" msgstr "처리 %s" -#: src/slic3r/GUI/MainFrame.cpp:840 +#: src/slic3r/GUI/MainFrame.cpp:874 msgid " was successfully sliced." msgstr " 성공적으로 슬라이스." -#: src/slic3r/GUI/MainFrame.cpp:842 +#: src/slic3r/GUI/MainFrame.cpp:876 msgid "Slicing Done!" msgstr "슬라이스 완료!" -#: src/slic3r/GUI/MainFrame.cpp:857 +#: src/slic3r/GUI/MainFrame.cpp:891 msgid "Select the STL file to repair:" msgstr "복구 할 STL 파일을 선택하십시오:" -#: src/slic3r/GUI/MainFrame.cpp:870 +#: src/slic3r/GUI/MainFrame.cpp:901 msgid "Save OBJ file (less prone to coordinate errors than STL) as:" msgstr "OBJ 파일을 저장하십시오 (STL보다 오류를 덜 조정할 가능성이 적음):" -#: src/slic3r/GUI/MainFrame.cpp:885 +#: src/slic3r/GUI/MainFrame.cpp:913 msgid "Your file was repaired." msgstr "파일이 복구되었습니다." -#: src/slic3r/GUI/MainFrame.cpp:885 src/libslic3r/PrintConfig.cpp:3221 +#: src/slic3r/GUI/MainFrame.cpp:913 src/libslic3r/PrintConfig.cpp:3442 msgid "Repair" msgstr "수정" -#: src/slic3r/GUI/MainFrame.cpp:899 +#: src/slic3r/GUI/MainFrame.cpp:927 msgid "Save configuration as:" msgstr "구성을 저장 :" -#: src/slic3r/GUI/MainFrame.cpp:919 src/slic3r/GUI/MainFrame.cpp:983 +#: src/slic3r/GUI/MainFrame.cpp:946 src/slic3r/GUI/MainFrame.cpp:1008 msgid "Select configuration to load:" msgstr "불러올 구성 선택 :" -#: src/slic3r/GUI/MainFrame.cpp:956 +#: src/slic3r/GUI/MainFrame.cpp:982 msgid "Save presets bundle as:" msgstr "이전 번들 설정을 다음과 같이 저장 :" -#: src/slic3r/GUI/MainFrame.cpp:1007 +#: src/slic3r/GUI/MainFrame.cpp:1029 #, c-format msgid "%d presets successfully imported." msgstr "% d 사전 설정을 가져 왔습니다." +#: src/slic3r/GUI/Mouse3DController.cpp:291 +msgid "3Dconnexion settings" +msgstr "3Dconnexion 설정" + +#: src/slic3r/GUI/Mouse3DController.cpp:306 +msgid "Device:" +msgstr "장치:" + +#: src/slic3r/GUI/Mouse3DController.cpp:313 +msgid "Speed:" +msgstr "스피드:" + +#: src/slic3r/GUI/Mouse3DController.cpp:317 +#: src/slic3r/GUI/Mouse3DController.cpp:337 +#: src/slic3r/GUI/Mouse3DController.cpp:339 +msgid "Translation" +msgstr "번역" + +#: src/slic3r/GUI/Mouse3DController.cpp:326 +#: src/slic3r/GUI/Mouse3DController.cpp:337 +msgid "Zoom" +msgstr "확대" + +#: src/slic3r/GUI/Mouse3DController.cpp:332 +msgid "Deadzone:" +msgstr "데드존:" + #: src/slic3r/GUI/MsgDialog.cpp:73 #, c-format msgid "%s error" @@ -2875,769 +3945,1003 @@ msgstr "%s 오류" msgid "%s has encountered an error" msgstr "%s에 오류가 발생 했습니다" -#: src/slic3r/GUI/Plater.cpp:146 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:56 +msgid "Instances" +msgstr "복제본" + +#: src/slic3r/GUI/ObjectDataViewModel.cpp:60 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:216 +#, c-format +msgid "Instance %d" +msgstr "복제본 %d" + +#: src/slic3r/GUI/ObjectDataViewModel.cpp:67 src/slic3r/GUI/Tab.cpp:3482 +#: src/slic3r/GUI/Tab.cpp:3572 +msgid "Layers" +msgstr "레이어" + +#: src/slic3r/GUI/ObjectDataViewModel.cpp:94 +msgid "Range" +msgstr "범위" + +#: src/slic3r/GUI/OptionsGroup.cpp:249 +msgctxt "Layers" +msgid "Top" +msgstr "윗부분 " + +#: src/slic3r/GUI/OptionsGroup.cpp:249 +msgctxt "Layers" +msgid "Bottom" +msgstr "바닥 " + +#: src/slic3r/GUI/Plater.cpp:163 msgid "Volume" msgstr "크기" -#: src/slic3r/GUI/Plater.cpp:147 +#: src/slic3r/GUI/Plater.cpp:164 msgid "Facets" msgstr "측면" -#: src/slic3r/GUI/Plater.cpp:148 +#: src/slic3r/GUI/Plater.cpp:165 msgid "Materials" msgstr "재료" -#: src/slic3r/GUI/Plater.cpp:151 +#: src/slic3r/GUI/Plater.cpp:168 msgid "Manifold" msgstr "많은" -#: src/slic3r/GUI/Plater.cpp:201 +#: src/slic3r/GUI/Plater.cpp:218 msgid "Sliced Info" msgstr "슬라이스된 정보" -#: src/slic3r/GUI/Plater.cpp:220 src/slic3r/GUI/Plater.cpp:1135 +#: src/slic3r/GUI/Plater.cpp:237 src/slic3r/GUI/Plater.cpp:1226 msgid "Used Filament (m)" msgstr "사용자 필라멘트 (m)" -#: src/slic3r/GUI/Plater.cpp:221 +#: src/slic3r/GUI/Plater.cpp:238 msgid "Used Filament (mm³)" msgstr "사용자 필라멘트 (mm³)" -#: src/slic3r/GUI/Plater.cpp:222 +#: src/slic3r/GUI/Plater.cpp:239 msgid "Used Filament (g)" msgstr "사용자 필라멘트 (g)" -#: src/slic3r/GUI/Plater.cpp:223 +#: src/slic3r/GUI/Plater.cpp:240 msgid "Used Material (unit)" msgstr "사용 재료 (단위)" -#: src/slic3r/GUI/Plater.cpp:224 src/slic3r/GUI/Plater.cpp:1150 -#: src/libslic3r/PrintConfig.cpp:742 -msgid "Cost" -msgstr "비용" +#: src/slic3r/GUI/Plater.cpp:241 +msgid "Cost (money)" +msgstr "비용 (돈)" -#: src/slic3r/GUI/Plater.cpp:225 src/slic3r/GUI/Plater.cpp:1122 -#: src/slic3r/GUI/Plater.cpp:1164 +#: src/slic3r/GUI/Plater.cpp:242 src/slic3r/GUI/Plater.cpp:1213 +#: src/slic3r/GUI/Plater.cpp:1255 msgid "Estimated printing time" msgstr "예상 인쇄 시간" -#: src/slic3r/GUI/Plater.cpp:226 +#: src/slic3r/GUI/Plater.cpp:243 msgid "Number of tool changes" msgstr "공구(tool) 변경 수" -#: src/slic3r/GUI/Plater.cpp:317 +#: src/slic3r/GUI/Plater.cpp:340 msgid "Click to edit preset" msgstr "사전 설정을 편집 하려면 클릭 하십시오" -#: src/slic3r/GUI/Plater.cpp:469 +#: src/slic3r/GUI/Plater.cpp:495 msgid "Select what kind of support do you need" msgstr "서포트의 종류를 선택하세요" -#: src/slic3r/GUI/Plater.cpp:471 src/libslic3r/PrintConfig.cpp:1865 -#: src/libslic3r/PrintConfig.cpp:2529 +#: src/slic3r/GUI/Plater.cpp:497 src/libslic3r/PrintConfig.cpp:1911 +#: src/libslic3r/PrintConfig.cpp:2675 msgid "Support on build plate only" msgstr "출력물만 서포트를 지지" -#: src/slic3r/GUI/Plater.cpp:472 src/slic3r/GUI/Plater.cpp:587 +#: src/slic3r/GUI/Plater.cpp:498 src/slic3r/GUI/Plater.cpp:621 msgid "For support enforcers only" msgstr "서포트 지원영역 전용" -#: src/slic3r/GUI/Plater.cpp:473 +#: src/slic3r/GUI/Plater.cpp:499 msgid "Everywhere" msgstr "모든곳" -#: src/slic3r/GUI/Plater.cpp:505 src/slic3r/GUI/Tab.cpp:1067 +#: src/slic3r/GUI/Plater.cpp:531 src/slic3r/GUI/Tab.cpp:1107 msgid "Brim" msgstr "브림" -#: src/slic3r/GUI/Plater.cpp:507 -msgid "This flag enables the brim that will be printed around each object on the first layer." +#: src/slic3r/GUI/Plater.cpp:533 +msgid "" +"This flag enables the brim that will be printed around each object on the " +"first layer." msgstr "첫 번째 레이어의 각 객체(object) 주위에 인쇄 될 브림을 활성화합니다." -#: src/slic3r/GUI/Plater.cpp:515 +#: src/slic3r/GUI/Plater.cpp:541 msgid "Purging volumes" -msgstr "볼륨 삭제" +msgstr "퍼징 조절" -#: src/slic3r/GUI/Plater.cpp:766 +#: src/slic3r/GUI/Plater.cpp:635 +msgid "Select what kind of pad do you need" +msgstr "필요한 패드 종류를 선택하십시오." + +#: src/slic3r/GUI/Plater.cpp:637 +msgid "Below object" +msgstr "개체 아래" + +#: src/slic3r/GUI/Plater.cpp:638 +msgid "Around object" +msgstr "개체 주위" + +#: src/slic3r/GUI/Plater.cpp:812 msgid "Print settings" msgstr "프린트 설정" -#: src/slic3r/GUI/Plater.cpp:767 src/slic3r/GUI/Tab.cpp:1604 -#: src/slic3r/GUI/Tab.cpp:1605 +#: src/slic3r/GUI/Plater.cpp:813 src/slic3r/GUI/Tab.cpp:1419 +#: src/slic3r/GUI/Tab.cpp:1420 msgid "Filament" msgstr "필라멘트" -#: src/slic3r/GUI/Plater.cpp:768 +#: src/slic3r/GUI/Plater.cpp:814 msgid "SLA print settings" msgstr "SLA 인쇄 설정" -#: src/slic3r/GUI/Plater.cpp:769 src/slic3r/GUI/Preset.cpp:1310 +#: src/slic3r/GUI/Plater.cpp:815 src/slic3r/GUI/Preset.cpp:1455 msgid "SLA material" msgstr "SLA 재료" -#: src/slic3r/GUI/Plater.cpp:770 +#: src/slic3r/GUI/Plater.cpp:816 msgid "Printer" msgstr "프린터" -#: src/slic3r/GUI/Plater.cpp:820 src/slic3r/GUI/Plater.cpp:4688 +#: src/slic3r/GUI/Plater.cpp:875 src/slic3r/GUI/Plater.cpp:5545 msgid "Send to printer" msgstr "프린터로 보내기" -#: src/slic3r/GUI/Plater.cpp:823 src/slic3r/GUI/Plater.cpp:2933 -#: src/slic3r/GUI/Plater.cpp:4421 +#: src/slic3r/GUI/Plater.cpp:876 +msgid "Remove device" +msgstr "장치 제거" + +#: src/slic3r/GUI/Plater.cpp:877 +msgid "Export to SD card/ USB thumb drive" +msgstr "SD 카드/USB 썸 드라이브로 내보내기" + +#: src/slic3r/GUI/Plater.cpp:889 src/slic3r/GUI/Plater.cpp:3107 +#: src/slic3r/GUI/Plater.cpp:5129 msgid "Slice now" msgstr "바로 슬라이스" -#: src/slic3r/GUI/Plater.cpp:963 +#: src/slic3r/GUI/Plater.cpp:1039 msgid "Hold Shift to Slice & Export G-code" msgstr "Shift 키를 누른 채 G 코드 내보내기" -#: src/slic3r/GUI/Plater.cpp:1068 +#: src/slic3r/GUI/Plater.cpp:1149 #, c-format msgid "%d (%d shells)" msgstr "% d (% d 쉘)" -#: src/slic3r/GUI/Plater.cpp:1073 +#: src/slic3r/GUI/Plater.cpp:1154 #, c-format msgid "Auto-repaired (%d errors)" msgstr "오류자동수정 (%d errors)" -#: src/slic3r/GUI/Plater.cpp:1076 +#: src/slic3r/GUI/Plater.cpp:1157 #, c-format -msgid "%d degenerate facets, %d edges fixed, %d facets removed, %d facets added, %d facets reversed, %d backwards edges" -msgstr "%d 면 고정, %d 모서리 고정, %d 면 제거, %d 면 추가, %d 면 반전, %d 후방 모서리" +msgid "" +"%d degenerate facets, %d edges fixed, %d facets removed, %d facets added, %d " +"facets reversed, %d backwards edges" +msgstr "" +"%d 면 고정, %d 모서리 고정, %d 면 제거, %d 면 추가, %d 면 반전, %d 후방 모서" +"리" -#: src/slic3r/GUI/Plater.cpp:1086 +#: src/slic3r/GUI/Plater.cpp:1167 msgid "Yes" msgstr "예" -#: src/slic3r/GUI/Plater.cpp:1109 +#: src/slic3r/GUI/Plater.cpp:1188 msgid "Used Material (ml)" msgstr "사용 재료 (ml)" -#: src/slic3r/GUI/Plater.cpp:1112 +#: src/slic3r/GUI/Plater.cpp:1191 msgid "object(s)" msgstr "객체(object)" -#: src/slic3r/GUI/Plater.cpp:1112 +#: src/slic3r/GUI/Plater.cpp:1191 msgid "supports and pad" msgstr "지지대 및 패드" -#: src/slic3r/GUI/Plater.cpp:1137 src/slic3r/GUI/Plater.cpp:1152 +#: src/slic3r/GUI/Plater.cpp:1228 src/slic3r/GUI/Plater.cpp:1243 msgid "objects" msgstr "객체들(objects)" -#: src/slic3r/GUI/Plater.cpp:1137 src/slic3r/GUI/Plater.cpp:1152 +#: src/slic3r/GUI/Plater.cpp:1228 src/slic3r/GUI/Plater.cpp:1243 msgid "wipe tower" msgstr "와이프 타워(Wipe tower)" -#: src/slic3r/GUI/Plater.cpp:1167 +#: src/slic3r/GUI/Plater.cpp:1241 src/libslic3r/PrintConfig.cpp:761 +#: src/libslic3r/PrintConfig.cpp:2511 src/libslic3r/PrintConfig.cpp:2512 +msgid "Cost" +msgstr "비용" + +#: src/slic3r/GUI/Plater.cpp:1258 msgid "normal mode" msgstr "일반 모드" -#: src/slic3r/GUI/Plater.cpp:1171 src/slic3r/GUI/Plater.cpp:1180 -msgid "Color " -msgstr "색(Color) " +#: src/slic3r/GUI/Plater.cpp:1262 src/slic3r/GUI/Plater.cpp:1271 +#: src/libslic3r/PrintConfig.cpp:583 +msgid "Color" +msgstr "색상" -#: src/slic3r/GUI/Plater.cpp:1176 +#: src/slic3r/GUI/Plater.cpp:1267 msgid "stealth mode" msgstr "스텔스 모드" -#: src/slic3r/GUI/Plater.cpp:1271 +#: src/slic3r/GUI/Plater.cpp:1375 msgid "Load File" msgstr "파일 로드" -#: src/slic3r/GUI/Plater.cpp:1275 +#: src/slic3r/GUI/Plater.cpp:1379 msgid "Load Files" msgstr "파일 로드" -#: src/slic3r/GUI/Plater.cpp:1503 -msgid "ERROR: not enough resources to execute a new job." -msgstr "오류: 새 작업을 실행하기에 충분한 리소스가 없습니다." - -#: src/slic3r/GUI/Plater.cpp:2056 +#: src/slic3r/GUI/Plater.cpp:2137 msgid "New Project" msgstr "새로운 프로젝트" -#: src/slic3r/GUI/Plater.cpp:2173 +#: src/slic3r/GUI/Plater.cpp:2259 msgid "Loading" msgstr "로딩" -#: src/slic3r/GUI/Plater.cpp:2183 +#: src/slic3r/GUI/Plater.cpp:2269 #, c-format -msgid "Processing input file %s\n" -msgstr "입력 파일 처리 %s\n" +msgid "Processing input file %s" +msgstr "입력 파일 처리 %s" -#: src/slic3r/GUI/Plater.cpp:2211 -msgid "You can't to load SLA project if there is at least one multi-part object on the bed" -msgstr "침대에 다중 부품(Part) 객체(object)가 하나 이상 있는 경우 SLA 프로젝트를 로드할 수 없습니다." +#: src/slic3r/GUI/Plater.cpp:2297 +msgid "You cannot load SLA project with a multi-part object on the bed" +msgstr "" +"배드에 여러 부분으로 구성된 객체가 있는 SLA 프로젝트를 로드할 수 없습니다." -#: src/slic3r/GUI/Plater.cpp:2212 src/slic3r/GUI/Tab.cpp:3064 +#: src/slic3r/GUI/Plater.cpp:2298 src/slic3r/GUI/Tab.cpp:2929 msgid "Please check your object list before preset changing." msgstr "사전 설정을 변경 하기 전에 객체(object) 목록을 확인 하십시오." -#: src/slic3r/GUI/Plater.cpp:2255 +#: src/slic3r/GUI/Plater.cpp:2343 msgid "" -"This file contains several objects positioned at multiple heights. Instead of considering them as multiple objects, should I consider\n" -"this file as a single object having multiple parts?\n" +"This file contains several objects positioned at multiple heights.\n" +"Instead of considering them as multiple objects, should I consider\n" +"this file as a single object having multiple parts?" msgstr "" -"이 파일에는 여러 높이마다 객체(object)가 있습니다. 여러 객체(object)로 간주하는 대신,\n" -"이 파일은 여러 부품을 갖는 단일 객체(object)로 보입니까?\n" +"이 파일에는 여러 높이마다 객체(object)가 있습니다. 여러 객체(object)로 간주하" +"는 대신,\n" +"이 파일은 여러 부품을 갖는 단일 객체(object)로 보입니까?" -#: src/slic3r/GUI/Plater.cpp:2258 src/slic3r/GUI/Plater.cpp:2310 +#: src/slic3r/GUI/Plater.cpp:2346 src/slic3r/GUI/Plater.cpp:2399 msgid "Multi-part object detected" msgstr "다중 부품(Part) 객체(object)가 감지" -#: src/slic3r/GUI/Plater.cpp:2265 -msgid "This file cannot be loaded in a simple mode. Do you want to switch to an advanced mode?\n" -msgstr "이 파일은 기본 모드에서 로드할 수 없습니다. 고급 모드로 전환 하시겠습니까?\n" +#: src/slic3r/GUI/Plater.cpp:2353 +msgid "" +"This file cannot be loaded in a simple mode. Do you want to switch to an " +"advanced mode?" +msgstr "" +"이 파일은 기본 모드에서 로드할 수 없습니다. 고급 모드로 전환 하시겠습니까?" -#: src/slic3r/GUI/Plater.cpp:2266 +#: src/slic3r/GUI/Plater.cpp:2354 msgid "Detected advanced data" msgstr "감지된 고급 데이터" -#: src/slic3r/GUI/Plater.cpp:2287 +#: src/slic3r/GUI/Plater.cpp:2376 #, c-format -msgid "You can't to add the object(s) from %s because of one or some of them is(are) multi-part" -msgstr "다중 부품(Part) 하나 또는 그 중 일부 때문에 %s에서 객체(object)를 추가 할 수 없습니다" +msgid "" +"You can't to add the object(s) from %s because of one or some of them " +"is(are) multi-part" +msgstr "" +"다중 부품(Part) 하나 또는 그 중 일부 때문에 %s에서 객체(object)를 추가 할 수 " +"없습니다" -#: src/slic3r/GUI/Plater.cpp:2307 +#: src/slic3r/GUI/Plater.cpp:2396 msgid "" "Multiple objects were loaded for a multi-material printer.\n" "Instead of considering them as multiple objects, should I consider\n" -"these files to represent a single object having multiple parts?\n" +"these files to represent a single object having multiple parts?" msgstr "" "다중 재료 프린터에 대해 여러 객체(object)가로드되었습니다.\n" "여러 객체(object)로 간주하는 대신,\n" -"이 파일들은 여러 부분을 갖는 단일 객체(object)를 나타낼 수 있습니까?\n" +"이 파일들은 여러 부분을 갖는 단일 객체(object)를 나타낼 수 있습니까?" -#: src/slic3r/GUI/Plater.cpp:2323 +#: src/slic3r/GUI/Plater.cpp:2412 msgid "Loaded" msgstr "로드(loaded)" -#: src/slic3r/GUI/Plater.cpp:2418 -msgid "Your object appears to be too large, so it was automatically scaled down to fit your print bed." +#: src/slic3r/GUI/Plater.cpp:2514 +msgid "" +"Your object appears to be too large, so it was automatically scaled down to " +"fit your print bed." msgstr "객체(object)가 너무 커서 인쇄물에 맞게 자동으로 축소되었습니다." -#: src/slic3r/GUI/Plater.cpp:2419 +#: src/slic3r/GUI/Plater.cpp:2515 msgid "Object too large?" msgstr "객체(object)가 너무 큽니까?" -#: src/slic3r/GUI/Plater.cpp:2476 +#: src/slic3r/GUI/Plater.cpp:2577 msgid "Export STL file:" msgstr "STL 파일 내보내기:" -#: src/slic3r/GUI/Plater.cpp:2483 +#: src/slic3r/GUI/Plater.cpp:2584 msgid "Export AMF file:" msgstr "AMF 파일 내보내기:" -#: src/slic3r/GUI/Plater.cpp:2489 +#: src/slic3r/GUI/Plater.cpp:2590 msgid "Save file as:" msgstr "다른 이름으로 파일 저장:" -#: src/slic3r/GUI/Plater.cpp:2592 +#: src/slic3r/GUI/Plater.cpp:2596 +msgid "Export OBJ file:" +msgstr "OBJ 파일 내보내기:" + +#: src/slic3r/GUI/Plater.cpp:2698 msgid "Delete Object" msgstr "객체(object) 지우기" -#: src/slic3r/GUI/Plater.cpp:2603 +#: src/slic3r/GUI/Plater.cpp:2709 msgid "Reset Project" msgstr "프로젝트 재설정" -#: src/slic3r/GUI/Plater.cpp:2630 src/slic3r/GUI/Plater.cpp:3517 -msgid "Mirror" -msgstr "반전(Mirror)" +#: src/slic3r/GUI/Plater.cpp:2746 +msgid "Hollow" +msgstr "속비우기" -#: src/slic3r/GUI/Plater.cpp:2643 +#: src/slic3r/GUI/Plater.cpp:2753 msgid "Optimize Rotation" msgstr "회전 최적화" -#: src/slic3r/GUI/Plater.cpp:2689 +#: src/slic3r/GUI/Plater.cpp:2799 msgid "Arranging" msgstr "정렬" -#: src/slic3r/GUI/Plater.cpp:2712 +#: src/slic3r/GUI/Plater.cpp:2821 msgid "Could not arrange model objects! Some geometries may be invalid." -msgstr "모델 객체(object)를 정렬할 수 없습니다. 일부 형상은 유효 하지 않을 수 있습니다." +msgstr "" +"모델 객체(object)를 정렬할 수 없습니다. 일부 형상은 유효 하지 않을 수 있습니" +"다." -#: src/slic3r/GUI/Plater.cpp:2718 +#: src/slic3r/GUI/Plater.cpp:2827 msgid "Arranging canceled." msgstr "취소 된 정렬" -#: src/slic3r/GUI/Plater.cpp:2719 +#: src/slic3r/GUI/Plater.cpp:2828 msgid "Arranging done." msgstr "정렬 완료." -#: src/slic3r/GUI/Plater.cpp:2735 +#: src/slic3r/GUI/Plater.cpp:2844 msgid "Searching for optimal orientation" msgstr "최적의 방향 검색" -#: src/slic3r/GUI/Plater.cpp:2768 +#: src/slic3r/GUI/Plater.cpp:2877 msgid "Orientation search canceled." -msgstr "오리엔테이션 검색이 취소 됨" +msgstr "방향 검색이 취소되었습니다." -#: src/slic3r/GUI/Plater.cpp:2769 +#: src/slic3r/GUI/Plater.cpp:2878 msgid "Orientation found." msgstr "방향을 찾았습니다." -#: src/slic3r/GUI/Plater.cpp:2785 -msgid "The selected object can't be split because it contains more than one volume/material." -msgstr "선택한 객체(object)는 둘 이상의 부품/재료가 포함되어 있기 때문에 분할 할 수 없습니다." +#: src/slic3r/GUI/Plater.cpp:2908 +msgid "Indexing hollowed object" +msgstr "빈 개체 인덱싱" -#: src/slic3r/GUI/Plater.cpp:2796 +#: src/slic3r/GUI/Plater.cpp:2912 +msgid "Hollowing cancelled." +msgstr "공동화 취소." + +#: src/slic3r/GUI/Plater.cpp:2913 +msgid "Hollowing done." +msgstr "속을 비움니다." + +#: src/slic3r/GUI/Plater.cpp:2915 +msgid "Hollowing failed." +msgstr "공동화를 실패했습니다." + +#: src/slic3r/GUI/Plater.cpp:2956 +msgid "" +"The selected object can't be split because it contains more than one volume/" +"material." +msgstr "" +"선택한 객체(object)는 둘 이상의 부품/재료가 포함되어 있기 때문에 분할 할 수 " +"없습니다." + +#: src/slic3r/GUI/Plater.cpp:2967 msgid "Split to Objects" msgstr "객체(object)로 분할" -#: src/slic3r/GUI/Plater.cpp:2918 +#: src/slic3r/GUI/Plater.cpp:3092 msgid "Invalid data" msgstr "잘못 된 데이터" -#: src/slic3r/GUI/Plater.cpp:2927 +#: src/slic3r/GUI/Plater.cpp:3101 msgid "Ready to slice" msgstr "슬라이스 준비" -#: src/slic3r/GUI/Plater.cpp:2965 src/slic3r/GUI/PrintHostDialogs.cpp:232 +#: src/slic3r/GUI/Plater.cpp:3139 src/slic3r/GUI/PrintHostDialogs.cpp:232 msgid "Cancelling" msgstr "취소 중" -#: src/slic3r/GUI/Plater.cpp:2982 +#: src/slic3r/GUI/Plater.cpp:3156 msgid "Another export job is currently running." msgstr "다른 내보내기 작업이 현재 실행 중입니다." -#: src/slic3r/GUI/Plater.cpp:3036 src/slic3r/GUI/Plater.cpp:3493 -msgid "Reload from Disk" -msgstr "디스크에서 다시 불러오기" +#: src/slic3r/GUI/Plater.cpp:3274 +msgid "Please select the file to reload" +msgstr "다시 로드할 파일을 선택하십시오." -#: src/slic3r/GUI/Plater.cpp:3072 +#: src/slic3r/GUI/Plater.cpp:3309 +msgid "It is not allowed to change the file to reload" +msgstr "다시 로드할 파일을 변경할 수 없습니다." + +#: src/slic3r/GUI/Plater.cpp:3309 +msgid "Do you want to retry" +msgstr "다시 시도하시겠습니까?" + +#: src/slic3r/GUI/Plater.cpp:3330 +msgid "Reload from: " +msgstr "다음에서 다시 로드합니다." + +#: src/slic3r/GUI/Plater.cpp:3438 +msgid "Unable to reload:" +msgstr "다시 로드할 수 없음:" + +#: src/slic3r/GUI/Plater.cpp:3443 +msgid "Error during reload" +msgstr "다시 로드하는 동안 오류" + +#: src/slic3r/GUI/Plater.cpp:3463 +msgid "Reload all from disk" +msgstr "디스크에서 모두 다시 로드" + +#: src/slic3r/GUI/Plater.cpp:3484 msgid "Fix Throught NetFabb" msgstr "NetFabb으로 수정" -#: src/slic3r/GUI/Plater.cpp:3254 +#: src/slic3r/GUI/Plater.cpp:3675 msgid "Export failed" msgstr "내보내기 실패" -#: src/slic3r/GUI/Plater.cpp:3259 src/slic3r/GUI/PrintHostDialogs.cpp:233 +#: src/slic3r/GUI/Plater.cpp:3680 src/slic3r/GUI/PrintHostDialogs.cpp:233 msgid "Cancelled" msgstr "취소됨" -#: src/slic3r/GUI/Plater.cpp:3347 src/slic3r/GUI/Plater.cpp:3359 -#: src/slic3r/GUI/Plater.cpp:3473 -msgid "Increase copies" -msgstr "복사본 늘리기" - -#: src/slic3r/GUI/Plater.cpp:3467 src/slic3r/GUI/Plater.cpp:3486 +#: src/slic3r/GUI/Plater.cpp:3942 src/slic3r/GUI/Plater.cpp:3969 msgid "Remove the selected object" msgstr "선택한 객체(object) 제거" -#: src/slic3r/GUI/Plater.cpp:3473 -msgid "Place one more copy of the selected object" -msgstr "선택한 객체(object)를 하나 더 복사합니다" +#: src/slic3r/GUI/Plater.cpp:3956 +msgid "Add one more instance of the selected object" +msgstr "선택한 개체의 인스턴스를 하나 더 추가합니다." -#: src/slic3r/GUI/Plater.cpp:3475 -msgid "Decrease copies" -msgstr "복사본 감소" +#: src/slic3r/GUI/Plater.cpp:3958 +msgid "Remove one instance of the selected object" +msgstr "선택한 개체의 인스턴스 하나 제거" -#: src/slic3r/GUI/Plater.cpp:3475 -msgid "Remove one copy of the selected object" -msgstr "선택한 객체(object) 복사본 하나 삭제" +#: src/slic3r/GUI/Plater.cpp:3960 +msgid "Set number of instances" +msgstr "복제할 수량 설정" -#: src/slic3r/GUI/Plater.cpp:3477 -msgid "Set number of copies" -msgstr "복사될 수량 설정" +#: src/slic3r/GUI/Plater.cpp:3960 +msgid "Change the number of instances of the selected object" +msgstr "선택한 객체의 인스턴스 수 변경" -#: src/slic3r/GUI/Plater.cpp:3477 -msgid "Change the number of copies of the selected object" -msgstr "선택한 객체(object)의 복사본 수 변경" +#: src/slic3r/GUI/Plater.cpp:3980 src/slic3r/GUI/Plater.cpp:3983 +msgid "Reload the selected object from disk" +msgstr "디스크에서 선택한 개체 다시 로드" -#: src/slic3r/GUI/Plater.cpp:3493 -msgid "Reload the selected file from Disk" -msgstr "디스크에서 다시 불러오기" - -#: src/slic3r/GUI/Plater.cpp:3496 +#: src/slic3r/GUI/Plater.cpp:3987 msgid "Export the selected object as STL file" msgstr "선택한 객체(object)를 STL 파일로 내보내기" -#: src/slic3r/GUI/Plater.cpp:3510 +#: src/slic3r/GUI/Plater.cpp:4016 msgid "Along X axis" msgstr "X 축을 따라" -#: src/slic3r/GUI/Plater.cpp:3510 +#: src/slic3r/GUI/Plater.cpp:4016 msgid "Mirror the selected object along the X axis" msgstr "선택한 객체(object)를 X 축을 따라 반전합니다" -#: src/slic3r/GUI/Plater.cpp:3512 +#: src/slic3r/GUI/Plater.cpp:4018 msgid "Along Y axis" msgstr "Y 축을 따라" -#: src/slic3r/GUI/Plater.cpp:3512 +#: src/slic3r/GUI/Plater.cpp:4018 msgid "Mirror the selected object along the Y axis" msgstr "선택한 객체(object)를 Y 축을 따라 반전합니다" -#: src/slic3r/GUI/Plater.cpp:3514 +#: src/slic3r/GUI/Plater.cpp:4020 msgid "Along Z axis" msgstr "Z 축 따라" -#: src/slic3r/GUI/Plater.cpp:3514 +#: src/slic3r/GUI/Plater.cpp:4020 msgid "Mirror the selected object along the Z axis" msgstr "선택한 객체(object)를 Z 축을 따라 반전합니다" -#: src/slic3r/GUI/Plater.cpp:3517 +#: src/slic3r/GUI/Plater.cpp:4023 +msgid "Mirror" +msgstr "반전(Mirror)" + +#: src/slic3r/GUI/Plater.cpp:4023 msgid "Mirror the selected object" msgstr "반전할 객제를 선택" -#: src/slic3r/GUI/Plater.cpp:3529 +#: src/slic3r/GUI/Plater.cpp:4035 msgid "To objects" msgstr "객체(object)에" -#: src/slic3r/GUI/Plater.cpp:3529 src/slic3r/GUI/Plater.cpp:3549 +#: src/slic3r/GUI/Plater.cpp:4035 src/slic3r/GUI/Plater.cpp:4055 msgid "Split the selected object into individual objects" msgstr "선택한 객체(object)를 개별 객체(object)로 분할 합니다." -#: src/slic3r/GUI/Plater.cpp:3531 +#: src/slic3r/GUI/Plater.cpp:4037 msgid "To parts" msgstr "부품(Part)에" -#: src/slic3r/GUI/Plater.cpp:3531 src/slic3r/GUI/Plater.cpp:3563 +#: src/slic3r/GUI/Plater.cpp:4037 src/slic3r/GUI/Plater.cpp:4069 msgid "Split the selected object into individual sub-parts" msgstr "선택한 객체(object)를 개별 하위 부품(Part)으로 분할" -#: src/slic3r/GUI/Plater.cpp:3534 src/slic3r/GUI/Plater.cpp:3549 -#: src/slic3r/GUI/Plater.cpp:3563 src/libslic3r/PrintConfig.cpp:3245 +#: src/slic3r/GUI/Plater.cpp:4040 src/slic3r/GUI/Plater.cpp:4055 +#: src/slic3r/GUI/Plater.cpp:4069 src/libslic3r/PrintConfig.cpp:3466 msgid "Split" msgstr "쪼개기" -#: src/slic3r/GUI/Plater.cpp:3534 +#: src/slic3r/GUI/Plater.cpp:4040 msgid "Split the selected object" msgstr "선택한 객체(object) 분할" -#: src/slic3r/GUI/Plater.cpp:3555 +#: src/slic3r/GUI/Plater.cpp:4061 msgid "Optimize orientation" msgstr "방향 최적화" -#: src/slic3r/GUI/Plater.cpp:3555 +#: src/slic3r/GUI/Plater.cpp:4061 msgid "Optimize the rotation of the object for better print results." msgstr "더 나은 인쇄 결과를 위해 객체(object)의 회전을 최적화합니다." -#: src/slic3r/GUI/Plater.cpp:3595 +#: src/slic3r/GUI/Plater.cpp:4120 msgid "3D editor view" msgstr "3D 편집화면 보기" -#: src/slic3r/GUI/Plater.cpp:3603 src/slic3r/GUI/Tab.cpp:2534 +#: src/slic3r/GUI/Plater.cpp:4128 src/slic3r/GUI/Tab.cpp:2372 msgid "Preview" msgstr "미리보기" -#: src/slic3r/GUI/Plater.cpp:3831 -msgid "%1% printer was active at the time the target Undo / Redo snapshot was taken. Switching to %1% printer requires reloading of %1% presets." -msgstr "%1% 프린터가 대상을 '되돌리기/취소하기' 작업 구성을 생성할 때 활성화되었습니다. %1% 프린터로 전환하려면 %1% 사전 설정을 다시 불러와야 합니다." +#: src/slic3r/GUI/Plater.cpp:4422 +msgid "" +"%1% printer was active at the time the target Undo / Redo snapshot was " +"taken. Switching to %1% printer requires reloading of %1% presets." +msgstr "" +"%1% 프린터가 대상을 '되돌리기/취소하기' 작업 구성을 생성할 때 활성화되었습니" +"다. %1% 프린터로 전환하려면 %1% 사전 설정을 다시 불러와야 합니다." -#: src/slic3r/GUI/Plater.cpp:3992 +#: src/slic3r/GUI/Plater.cpp:4597 msgid "Load Project" msgstr "프로젝트 불러오기" -#: src/slic3r/GUI/Plater.cpp:4016 +#: src/slic3r/GUI/Plater.cpp:4625 msgid "Import Object" msgstr "객체(object) 가져오기" -#: src/slic3r/GUI/Plater.cpp:4020 +#: src/slic3r/GUI/Plater.cpp:4629 msgid "Import Objects" msgstr "객체(object) 가져오기" -#: src/slic3r/GUI/Plater.cpp:4075 -msgid "All objects will be removed, continue ?" +#: src/slic3r/GUI/Plater.cpp:4693 +msgid "All objects will be removed, continue?" msgstr "모든 객체(object)가 제거 됩니다, 계속합니까?" -#: src/slic3r/GUI/Plater.cpp:4083 +#: src/slic3r/GUI/Plater.cpp:4701 msgid "Delete Selected Objects" msgstr "선택한 객체(object) 삭제" -#: src/slic3r/GUI/Plater.cpp:4091 +#: src/slic3r/GUI/Plater.cpp:4709 msgid "Increase Instances" msgstr "복제본 늘리기" -#: src/slic3r/GUI/Plater.cpp:4127 +#: src/slic3r/GUI/Plater.cpp:4744 msgid "Decrease Instances" msgstr "복제본 감소" -#: src/slic3r/GUI/Plater.cpp:4193 +#: src/slic3r/GUI/Plater.cpp:4780 +#, c-format +msgid "Set numbers of copies to %d" +msgstr "복사본 수를 %d로 설정" + +#: src/slic3r/GUI/Plater.cpp:4810 msgid "Cut by Plane" msgstr "평면으로 절단" -#: src/slic3r/GUI/Plater.cpp:4225 +#: src/slic3r/GUI/Plater.cpp:4863 msgid "Save G-code file as:" msgstr "G-code 파일 다른 이름 저장:" -#: src/slic3r/GUI/Plater.cpp:4225 +#: src/slic3r/GUI/Plater.cpp:4863 msgid "Save SL1 file as:" msgstr "SL1 파일 다른이름 저장:" -#: src/slic3r/GUI/Plater.cpp:4337 +#: src/slic3r/GUI/Plater.cpp:4990 #, c-format msgid "STL file exported to %s" msgstr "내보낸 STL 파일 %s" -#: src/slic3r/GUI/Plater.cpp:4353 +#: src/slic3r/GUI/Plater.cpp:5011 #, c-format msgid "AMF file exported to %s" msgstr "내보낸 AMF 파일 %s" -#: src/slic3r/GUI/Plater.cpp:4356 +#: src/slic3r/GUI/Plater.cpp:5014 #, c-format msgid "Error exporting AMF file %s" msgstr "AMF 파일 내보내기 오류 %s" -#: src/slic3r/GUI/Plater.cpp:4382 +#: src/slic3r/GUI/Plater.cpp:5057 #, c-format msgid "3MF file exported to %s" msgstr "3MF 파일을 내보냈습니다 %s" -#: src/slic3r/GUI/Plater.cpp:4387 +#: src/slic3r/GUI/Plater.cpp:5062 #, c-format msgid "Error exporting 3MF file %s" msgstr "3MF 파일 내보내기 오류 %s" -#: src/slic3r/GUI/Plater.cpp:4687 +#: src/slic3r/GUI/Plater.cpp:5544 msgid "Export" msgstr "내보내기" -#: src/slic3r/GUI/Plater.cpp:4688 +#: src/slic3r/GUI/Plater.cpp:5545 msgid "Send G-code" msgstr "G-code 보내기" -#: src/slic3r/GUI/Plater.cpp:4772 +#: src/slic3r/GUI/Plater.cpp:5629 msgid "Paste From Clipboard" msgstr "클립보드에서 붙여넣기" -#: src/slic3r/GUI/Preferences.cpp:22 src/slic3r/GUI/Tab.cpp:1955 -#: src/slic3r/GUI/Tab.cpp:2193 +#: src/slic3r/GUI/Preferences.cpp:22 src/slic3r/GUI/Tab.cpp:1780 +#: src/slic3r/GUI/Tab.cpp:2024 msgid "General" msgstr "일반" -#: src/slic3r/GUI/Preferences.cpp:44 +#: src/slic3r/GUI/Preferences.cpp:39 msgid "Remember output directory" msgstr "출력 디렉토리 기억하기" -#: src/slic3r/GUI/Preferences.cpp:46 -msgid "If this is enabled, Slic3r will prompt the last output directory instead of the one containing the input files." -msgstr "이 옵션을 사용하면 Slic3r은 입력 파일이 들어있는 디렉터리 대신 마지막 출력 디렉터리를 묻습니다." +#: src/slic3r/GUI/Preferences.cpp:41 +msgid "" +"If this is enabled, Slic3r will prompt the last output directory instead of " +"the one containing the input files." +msgstr "" +"이 옵션을 사용하면 Slic3r은 입력 파일이 들어있는 디렉터리 대신 마지막 출력 디" +"렉터리를 묻습니다." -#: src/slic3r/GUI/Preferences.cpp:52 +#: src/slic3r/GUI/Preferences.cpp:47 msgid "Auto-center parts" -msgstr "부품(Part)을 자동으로 중심에" +msgstr "부품(Part)을 자동으로 중재봉선에" -#: src/slic3r/GUI/Preferences.cpp:54 -msgid "If this is enabled, Slic3r will auto-center objects around the print bed center." -msgstr "이 옵션을 사용하면 Slic3r가 객체(object)를 인쇄판 중앙에 자동으로 배치합니다." +#: src/slic3r/GUI/Preferences.cpp:49 +msgid "" +"If this is enabled, Slic3r will auto-center objects around the print bed " +"center." +msgstr "" +"이 옵션을 사용하면 Slic3r가 객체(object)를 인쇄판 중앙에 자동으로 배치합니다." -#: src/slic3r/GUI/Preferences.cpp:60 +#: src/slic3r/GUI/Preferences.cpp:55 msgid "Background processing" msgstr "백그라운드 프로세싱" -#: src/slic3r/GUI/Preferences.cpp:62 -msgid "If this is enabled, Slic3r will pre-process objects as soon as they're loaded in order to save time when exporting G-code." -msgstr "이 사용 하는 경우 Slic3r는 최대한 빨리 시간을 절약 하기 위해 로드된 G-코드를 내보낸다." +#: src/slic3r/GUI/Preferences.cpp:57 +msgid "" +"If this is enabled, Slic3r will pre-process objects as soon as they're " +"loaded in order to save time when exporting G-code." +msgstr "" +"이 사용 하는 경우 Slic3r는 최대한 빨리 시간을 절약 하기 위해 로드된 G-code를 " +"내보낸다." -#: src/slic3r/GUI/Preferences.cpp:71 -msgid "If enabled, PrusaSlicer will check for the new versions of itself online. When a new version becomes available a notification is displayed at the next application startup (never during program usage). This is only a notification mechanisms, no automatic installation is done." -msgstr "프루사 슬라이서는 온라인의 새로운 버전을 확인합니다. 새 버전을 사용할 수 있게되면 다음 응용 프로그램 시작시 (프로그램 사용 중이 아님) 알림이 표시 됩니다. 이는 알림 메커니즘일뿐이며 자동 설치는 수행되지 않습니다." +#: src/slic3r/GUI/Preferences.cpp:66 +msgid "" +"If enabled, PrusaSlicer will check for the new versions of itself online. " +"When a new version becomes available a notification is displayed at the next " +"application startup (never during program usage). This is only a " +"notification mechanisms, no automatic installation is done." +msgstr "" +"프루사 슬라이서는 온라인의 새로운 버전을 확인합니다. 새 버전을 사용할 수 있게" +"되면 다음 응용 프로그램 시작시 (프로그램 사용 중이 아님) 알림이 표시 됩니다. " +"이는 알림 메커니즘일뿐이며 자동 설치는 수행되지 않습니다." -#: src/slic3r/GUI/Preferences.cpp:79 -msgid "If enabled, Slic3r downloads updates of built-in system presets in the background. These updates are downloaded into a separate temporary location. When a new preset version becomes available it is offered at application startup." -msgstr "활성화 된 경우 Slic3r은 백그라운드에서 내장된 시스템 설정의 업데이트를 다운로드합니다. 이러한 업데이트는 별도의 임시 위치에 다운로드됩니다. 새로운 '사전 설정' 버전을 사용할 수 있게되면 응용 프로그램 시작시 제공됩니다." +#: src/slic3r/GUI/Preferences.cpp:73 +msgid "Export sources full pathnames to 3mf and amf" +msgstr "소스 전체 경로 이름을 3mf 및 amf로 내보내기" + +#: src/slic3r/GUI/Preferences.cpp:75 +msgid "" +"If enabled, allows the Reload from disk command to automatically find and " +"load the files when invoked." +msgstr "" +"활성화된 경우 디스크에서 다시 로드 명령을 사용하여 호출될 때 파일을 자동으로 " +"찾고 로드할 수 있습니다." #: src/slic3r/GUI/Preferences.cpp:84 +msgid "" +"If enabled, Slic3r downloads updates of built-in system presets in the " +"background. These updates are downloaded into a separate temporary location. " +"When a new preset version becomes available it is offered at application " +"startup." +msgstr "" +"활성화 된 경우 Slic3r은 백그라운드에서 내장된 시스템 설정의 업데이트를 다운로" +"드합니다. 이러한 업데이트는 별도의 임시 위치에 다운로드됩니다. 새로운 '사전 " +"설정' 버전을 사용할 수 있게되면 응용 프로그램 시작시 제공됩니다." + +#: src/slic3r/GUI/Preferences.cpp:89 msgid "Suppress \" - default - \" presets" msgstr "\"- 기본 -\"사전 설정 숨기기" -#: src/slic3r/GUI/Preferences.cpp:86 -msgid "Suppress \" - default - \" presets in the Print / Filament / Printer selections once there are any other valid presets available." -msgstr "사용 가능한 다른 유효한 '사전 설정'이 있으면 인쇄 / 필라멘트 / 프린터 선택에서 \"- 기본 -\"'사전 설정'을 억제하십시오." +#: src/slic3r/GUI/Preferences.cpp:91 +msgid "" +"Suppress \" - default - \" presets in the Print / Filament / Printer " +"selections once there are any other valid presets available." +msgstr "" +"사용 가능한 다른 유효한 '사전 설정'이 있으면 인쇄 / 필라멘트 / 프린터 선택에" +"서 \"- 기본 -\"'사전 설정'을 억제하십시오." -#: src/slic3r/GUI/Preferences.cpp:92 +#: src/slic3r/GUI/Preferences.cpp:97 msgid "Show incompatible print and filament presets" msgstr "호환 되지 않는 인쇄 및 필라멘트 설정" -#: src/slic3r/GUI/Preferences.cpp:94 -msgid "When checked, the print and filament presets are shown in the preset editor even if they are marked as incompatible with the active printer" -msgstr "이 옵션을 선택하면 프린터와 호환되지 않는 것으로 표시된 경우에도 인쇄 및 필라멘트 '사전 설정'이 '사전 설정' 편집기에 표시됩니다" +#: src/slic3r/GUI/Preferences.cpp:99 +msgid "" +"When checked, the print and filament presets are shown in the preset editor " +"even if they are marked as incompatible with the active printer" +msgstr "" +"이 옵션을 선택하면 프린터와 호환되지 않는 것으로 표시된 경우에도 인쇄 및 필라" +"멘트 '사전 설정'이 '사전 설정' 편집기에 표시됩니다" -#: src/slic3r/GUI/Preferences.cpp:101 +#: src/slic3r/GUI/Preferences.cpp:106 msgid "Use Retina resolution for the 3D scene" msgstr "3D 장면에 레티나 해상도 사용" -#: src/slic3r/GUI/Preferences.cpp:103 -msgid "If enabled, the 3D scene will be rendered in Retina resolution. If you are experiencing 3D performance problems, disabling this option may help." -msgstr "활성화 된 경우 3D 장면은 레티나 해상도로 렌더링 됩니다. 3D 성능 문제가 발생하는 경우, 옵션을 사용하지 않도록 설정 하면 도움이 될 수 있습니다." +#: src/slic3r/GUI/Preferences.cpp:108 +msgid "" +"If enabled, the 3D scene will be rendered in Retina resolution. If you are " +"experiencing 3D performance problems, disabling this option may help." +msgstr "" +"활성화 된 경우 3D 장면은 레티나 해상도로 렌더링 됩니다. 3D 성능 문제가 발생하" +"는 경우, 옵션을 사용하지 않도록 설정 하면 도움이 될 수 있습니다." -#: src/slic3r/GUI/Preferences.cpp:110 +#: src/slic3r/GUI/Preferences.cpp:115 +msgid "Camera" +msgstr "카메라" + +#: src/slic3r/GUI/Preferences.cpp:121 msgid "Use perspective camera" msgstr "원근 보기 사용" -#: src/slic3r/GUI/Preferences.cpp:112 -msgid "If enabled, use perspective camera. If not enabled, use orthographic camera." -msgstr "이 옵션을 사용하면 원근 보기모드를 사용합니다. 활성화되지 않은 경우 일반 보기를 사용합니다." +#: src/slic3r/GUI/Preferences.cpp:123 +msgid "" +"If enabled, use perspective camera. If not enabled, use orthographic camera." +msgstr "" +"이 옵션을 사용하면 원근 보기모드를 사용합니다. 활성화되지 않은 경우 일반 보기" +"를 사용합니다." -#: src/slic3r/GUI/Preferences.cpp:117 +#: src/slic3r/GUI/Preferences.cpp:129 +msgid "Use free camera" +msgstr "무료 카메라 사용" + +#: src/slic3r/GUI/Preferences.cpp:131 +msgid "If enabled, use free camera. If not enabled, use constrained camera." +msgstr "" +"활성화된 경우 무료 카메라를 사용하십시오. 활성화되지 않은 경우 구속된 카메라" +"를 사용합니다." + +#: src/slic3r/GUI/Preferences.cpp:137 +msgid "GUI" +msgstr "GUI" + +#: src/slic3r/GUI/Preferences.cpp:147 msgid "Use custom size for toolbar icons" msgstr "도구 모음 아이콘에 사용자 지정 크기 사용" -#: src/slic3r/GUI/Preferences.cpp:119 +#: src/slic3r/GUI/Preferences.cpp:149 msgid "If enabled, you can change size of toolbar icons manually." msgstr "활성화된 경우 도구 모음 아이콘의 크기를 수동으로 변경할 수 있습니다." -#: src/slic3r/GUI/Preferences.cpp:144 +#: src/slic3r/GUI/Preferences.cpp:176 #, c-format msgid "You need to restart %s to make the changes effective." msgstr "변경 내용을 적용 하려면 %s를 다시 시작 해야 합니다." -#: src/slic3r/GUI/Preferences.cpp:192 +#: src/slic3r/GUI/Preferences.cpp:226 msgid "Icon size in a respect to the default size" msgstr "기본 크기에 대한 아이콘 크기" -#: src/slic3r/GUI/Preferences.cpp:207 +#: src/slic3r/GUI/Preferences.cpp:241 msgid "Select toolbar icon size in respect to the default one." msgstr "기본 도구 모음에 대해 도구 모음 아이콘 크기를 선택합니다." -#: src/slic3r/GUI/Preset.cpp:212 +#: src/slic3r/GUI/Preset.cpp:247 msgid "modified" msgstr "수정된곳" -#: src/slic3r/GUI/Preset.cpp:963 src/slic3r/GUI/Preset.cpp:1003 -#: src/slic3r/GUI/Preset.cpp:1068 src/slic3r/GUI/Preset.cpp:1100 -#: src/slic3r/GUI/PresetBundle.cpp:1480 src/slic3r/GUI/PresetBundle.cpp:1545 +#: src/slic3r/GUI/Preset.cpp:1059 src/slic3r/GUI/Preset.cpp:1106 +#: src/slic3r/GUI/Preset.cpp:1182 src/slic3r/GUI/Preset.cpp:1216 +#: src/slic3r/GUI/PresetBundle.cpp:1576 src/slic3r/GUI/PresetBundle.cpp:1665 msgid "System presets" msgstr "시스템 기본설정" -#: src/slic3r/GUI/Preset.cpp:1007 src/slic3r/GUI/Preset.cpp:1104 -#: src/slic3r/GUI/PresetBundle.cpp:1550 +#: src/slic3r/GUI/Preset.cpp:1110 src/slic3r/GUI/Preset.cpp:1220 +#: src/slic3r/GUI/PresetBundle.cpp:1670 msgid "User presets" msgstr "사용자 사전설정" -#: src/slic3r/GUI/Preset.cpp:1036 src/slic3r/GUI/Tab.cpp:241 +#: src/slic3r/GUI/Preset.cpp:1141 src/slic3r/GUI/Tab.cpp:243 msgid "Add a new printer" msgstr "새 프린터 추가" -#: src/slic3r/GUI/Preset.cpp:1308 +#: src/slic3r/GUI/Preset.cpp:1143 +msgid "Add/Remove materials" +msgstr "재질 추가/제거" + +#: src/slic3r/GUI/Preset.cpp:1453 msgid "filament" msgstr "필라멘트" -#: src/slic3r/GUI/Preset.cpp:1309 +#: src/slic3r/GUI/Preset.cpp:1454 msgid "SLA print" msgstr "SLA 인쇄" -#: src/slic3r/GUI/PresetHints.cpp:28 -msgid "If estimated layer time is below ~%1%s, fan will run at %2%%% and print speed will be reduced so that no less than %3%s are spent on that layer (however, speed will never be reduced below %4%mm/s)." -msgstr "예상 레이어 시간이 ~%1%초 미만이면 팬이 %2%%%에서 실행되고 인쇄 속도가 감소되어 해당 레이어에 %3%초 이상 소비됩니다 (단, 속도는 %4%mm/s 이하로 감소하지 않습니다) ." +#: src/slic3r/GUI/PresetBundle.cpp:1681 +msgid "Add/Remove filaments" +msgstr "필라멘트 추가/제거" -#: src/slic3r/GUI/PresetHints.cpp:35 +#: src/slic3r/GUI/PresetHints.cpp:29 msgid "" -"\n" -"If estimated layer time is greater, but still below ~%1%s, fan will run at a proportionally decreasing speed between %2%%% and %3%%%." +"If estimated layer time is below ~%1%s, fan will run at %2%%% and print " +"speed will be reduced so that no less than %3%s are spent on that layer " +"(however, speed will never be reduced below %4%mm/s)." msgstr "" -"\n" -"예상 레이어 시간이 더 길지만 ~%1%초 미만인 경우 팬은 %2%%%와 %3%%%사이 비례, 감소하는 속도로 실행됩니다." +"예상 레이어 시간이 ~%1%s 미만이면 팬이 %2%%% 에서 실행되고 인쇄 속도가 감소하" +"여 해당 레이어에 %3%s 이상이 소비되지 않습니다 (단, 속도는 아래로 감소하지 않" +"습니다 %4%mm/s)." -#: src/slic3r/GUI/PresetHints.cpp:39 +#: src/slic3r/GUI/PresetHints.cpp:36 msgid "" -"\n" -"During the other layers, fan" +"If estimated layer time is greater, but still below ~%1%s, fan will run at a " +"proportionally decreasing speed between %2%%% and %3%%%." msgstr "" -"\n" -"다른 레이어의, 팬설정은 " +"예상 레이어 시간이 더 크지만 여전히 ~%1%s 미만이면, 팬은 %2%%% ~ %3%%% 사이에" +"서 비례적으로 감소하는 속도로 실행될 것이다." -#: src/slic3r/GUI/PresetHints.cpp:41 +#: src/slic3r/GUI/PresetHints.cpp:40 +msgid "During the other layers, fan" +msgstr "다른 레이어의, 팬설정" + +#: src/slic3r/GUI/PresetHints.cpp:42 msgid "Fan" msgstr "팬(Fan)" -#: src/slic3r/GUI/PresetHints.cpp:47 +#: src/slic3r/GUI/PresetHints.cpp:48 msgid "will always run at %1%%%" msgstr "항상 다음처럼 실행 %1%%%" -#: src/slic3r/GUI/PresetHints.cpp:50 +#: src/slic3r/GUI/PresetHints.cpp:51 msgid "except for the first %1% layers." -msgstr "첫 번째 %d 레이어를 제외하고" +msgstr "첫 번째 %1% 레이어를 제외하고" -#: src/slic3r/GUI/PresetHints.cpp:52 +#: src/slic3r/GUI/PresetHints.cpp:53 msgid "except for the first layer." msgstr "첫 번째 레이어를 제외하고" -#: src/slic3r/GUI/PresetHints.cpp:54 +#: src/slic3r/GUI/PresetHints.cpp:55 msgid "will be turned off." msgstr "off 됩니다." -#: src/slic3r/GUI/PresetHints.cpp:155 +#: src/slic3r/GUI/PresetHints.cpp:156 msgid "external perimeters" msgstr "외부 둘레" -#: src/slic3r/GUI/PresetHints.cpp:164 +#: src/slic3r/GUI/PresetHints.cpp:165 msgid "perimeters" msgstr "둘레" -#: src/slic3r/GUI/PresetHints.cpp:173 +#: src/slic3r/GUI/PresetHints.cpp:174 msgid "infill" msgstr "채움(infill)" -#: src/slic3r/GUI/PresetHints.cpp:183 +#: src/slic3r/GUI/PresetHints.cpp:184 msgid "solid infill" msgstr "외부(solid)부분 채움" -#: src/slic3r/GUI/PresetHints.cpp:191 +#: src/slic3r/GUI/PresetHints.cpp:192 msgid "top solid infill" msgstr "가장 윗부분 채움" -#: src/slic3r/GUI/PresetHints.cpp:202 +#: src/slic3r/GUI/PresetHints.cpp:203 msgid "support" msgstr "서포트" -#: src/slic3r/GUI/PresetHints.cpp:212 +#: src/slic3r/GUI/PresetHints.cpp:213 msgid "support interface" msgstr "서포트 접점" -#: src/slic3r/GUI/PresetHints.cpp:218 +#: src/slic3r/GUI/PresetHints.cpp:219 msgid "First layer volumetric" msgstr "첫번째 레이어 용적은" -#: src/slic3r/GUI/PresetHints.cpp:218 +#: src/slic3r/GUI/PresetHints.cpp:219 msgid "Bridging volumetric" msgstr "브리징(Bridging) 용적" -#: src/slic3r/GUI/PresetHints.cpp:218 +#: src/slic3r/GUI/PresetHints.cpp:219 msgid "Volumetric" msgstr "용적" -#: src/slic3r/GUI/PresetHints.cpp:219 +#: src/slic3r/GUI/PresetHints.cpp:220 msgid "flow rate is maximized" msgstr "의 유속(flow)이 최대화된다. " -#: src/slic3r/GUI/PresetHints.cpp:222 +#: src/slic3r/GUI/PresetHints.cpp:223 msgid "by the print profile maximum" msgstr "인쇄 프로파일 최대 값" -#: src/slic3r/GUI/PresetHints.cpp:223 +#: src/slic3r/GUI/PresetHints.cpp:224 msgid "when printing" msgstr "인쇄 할 때" -#: src/slic3r/GUI/PresetHints.cpp:224 +#: src/slic3r/GUI/PresetHints.cpp:225 msgid "with a volumetric rate" msgstr "의 용적 비율로 " -#: src/slic3r/GUI/PresetHints.cpp:228 +#: src/slic3r/GUI/PresetHints.cpp:229 #, c-format msgid "%3.2f mm³/s at filament speed %3.2f mm/s." msgstr "%3.2f mm³/s 필라멘트 속도는 %3.2f mm/s이다." -#: src/slic3r/GUI/PresetHints.cpp:246 -msgid "Recommended object thin wall thickness: Not available due to invalid layer height." -msgstr "권장 객체(object)의 벽(wall) 두께: 잘못된 레이어 높이 때문에 사용할 수 없음." +#: src/slic3r/GUI/PresetHints.cpp:247 +msgid "" +"Recommended object thin wall thickness: Not available due to invalid layer " +"height." +msgstr "" +"권장 객체(object)의 벽(wall) 두께: 잘못된 레이어 높이 때문에 사용할 수 없음." -#: src/slic3r/GUI/PresetHints.cpp:262 +#: src/slic3r/GUI/PresetHints.cpp:263 #, c-format msgid "Recommended object thin wall thickness for layer height %.2f and" msgstr "객체(object) 레이어 높이 %.2f 에 권장하는 두깨는 " -#: src/slic3r/GUI/PresetHints.cpp:268 +#: src/slic3r/GUI/PresetHints.cpp:269 #, c-format msgid "%d lines: %.2f mm" msgstr "%d 라인:%.2f mm" +#: src/slic3r/GUI/PresetHints.cpp:300 +msgid "" +"Top / bottom shell thickness hint: Not available due to invalid layer height." +msgstr "상단/하단 쉘 두께 힌트: 잘못된 레이어 높이로 인해 사용할 수 없습니다." + +#: src/slic3r/GUI/PresetHints.cpp:313 +msgid "Top shell is %1% mm thick for layer height %2% mm." +msgstr "상단 쉘은 층 높이 %2% mm에 대한 두께 %1% mm입니다." + +#: src/slic3r/GUI/PresetHints.cpp:316 +msgid "Minimum top shell thickness is %1% mm." +msgstr "최소 상단 쉘 두께는 %1% mm입니다." + +#: src/slic3r/GUI/PresetHints.cpp:319 +msgid "Top is open." +msgstr "상단이 열려 있습니다." + +#: src/slic3r/GUI/PresetHints.cpp:332 +msgid "Bottom shell is %1% mm thick for layer height %2% mm." +msgstr "바닥 층 높이 %2% mm에 대한 두께 %1% mm입니다." + +#: src/slic3r/GUI/PresetHints.cpp:335 +msgid "Minimum bottom shell thickness is %1% mm." +msgstr "최소 바닥 쉘 두께는 %1% mm입니다." + +#: src/slic3r/GUI/PresetHints.cpp:338 +msgid "Bottom is open." +msgstr "바닥이 열려 있습니다." + #: src/slic3r/GUI/PrintHostDialogs.cpp:33 msgid "Send G-Code to printer host" msgstr "프린터 호스트로 G 코드 보내기" @@ -3711,11 +5015,13 @@ msgstr "전혀 충돌 없음" msgid "Time" msgstr "시간" -#: src/slic3r/GUI/RammingChart.cpp:76 src/slic3r/GUI/WipeTowerDialog.cpp:82 -#: src/libslic3r/PrintConfig.cpp:627 src/libslic3r/PrintConfig.cpp:671 -#: src/libslic3r/PrintConfig.cpp:686 src/libslic3r/PrintConfig.cpp:2349 -#: src/libslic3r/PrintConfig.cpp:2358 src/libslic3r/PrintConfig.cpp:2418 -#: src/libslic3r/PrintConfig.cpp:2425 +#: src/slic3r/GUI/RammingChart.cpp:76 src/slic3r/GUI/WipeTowerDialog.cpp:83 +#: src/libslic3r/PrintConfig.cpp:645 src/libslic3r/PrintConfig.cpp:689 +#: src/libslic3r/PrintConfig.cpp:704 src/libslic3r/PrintConfig.cpp:2418 +#: src/libslic3r/PrintConfig.cpp:2427 src/libslic3r/PrintConfig.cpp:2528 +#: src/libslic3r/PrintConfig.cpp:2536 src/libslic3r/PrintConfig.cpp:2544 +#: src/libslic3r/PrintConfig.cpp:2551 src/libslic3r/PrintConfig.cpp:2559 +#: src/libslic3r/PrintConfig.cpp:2567 msgid "s" msgstr "s" @@ -3723,11 +5029,55 @@ msgstr "s" msgid "Volumetric speed" msgstr "용적(Volumetric) 스피트" -#: src/slic3r/GUI/RammingChart.cpp:81 src/libslic3r/PrintConfig.cpp:584 -#: src/libslic3r/PrintConfig.cpp:1234 +#: src/slic3r/GUI/RammingChart.cpp:81 src/libslic3r/PrintConfig.cpp:602 +#: src/libslic3r/PrintConfig.cpp:1259 msgid "mm³/s" msgstr "밀리미터 ³/s" +#: src/slic3r/GUI/Selection.cpp:146 +msgid "Selection-Add" +msgstr "선택 추가" + +#: src/slic3r/GUI/Selection.cpp:187 +msgid "Selection-Remove" +msgstr "선택-제거" + +#: src/slic3r/GUI/Selection.cpp:219 +msgid "Selection-Add Object" +msgstr "선택-추가 객체" + +#: src/slic3r/GUI/Selection.cpp:238 +msgid "Selection-Remove Object" +msgstr "선택-제거 개체" + +#: src/slic3r/GUI/Selection.cpp:256 +msgid "Selection-Add Instance" +msgstr "선택-인스턴스 추가" + +#: src/slic3r/GUI/Selection.cpp:275 +msgid "Selection-Remove Instance" +msgstr "선택-제거 인스턴스" + +#: src/slic3r/GUI/Selection.cpp:376 +msgid "Selection-Add All" +msgstr "선택-모두 추가" + +#: src/slic3r/GUI/Selection.cpp:402 +msgid "Selection-Remove All" +msgstr "선택-모두 제거" + +#: src/slic3r/GUI/Selection.cpp:939 +msgid "Scale To Fit" +msgstr "크기에 맞게 조정" + +#: src/slic3r/GUI/Selection.cpp:1475 +msgid "Set Printable Instance" +msgstr "인쇄 가능한 인스턴스 설정" + +#: src/slic3r/GUI/Selection.cpp:1475 +msgid "Set Unprintable Instance" +msgstr "인쇄할 수 없는 인스턴스 설정" + #: src/slic3r/GUI/SysInfoDialog.cpp:78 msgid "System Information" msgstr "시스템 정보" @@ -3736,7 +5086,7 @@ msgstr "시스템 정보" msgid "Copy to Clipboard" msgstr "클립보드에 복사" -#: src/slic3r/GUI/Tab.cpp:52 src/libslic3r/PrintConfig.cpp:239 +#: src/slic3r/GUI/Tab.cpp:52 src/libslic3r/PrintConfig.cpp:255 msgid "Compatible printers" msgstr "호환 가능한 프린터들" @@ -3744,7 +5094,7 @@ msgstr "호환 가능한 프린터들" msgid "Select the printers this profile is compatible with." msgstr "이 프로파일과 호환 가능한 프린터를 선택하세요." -#: src/slic3r/GUI/Tab.cpp:58 src/libslic3r/PrintConfig.cpp:254 +#: src/slic3r/GUI/Tab.cpp:58 src/libslic3r/PrintConfig.cpp:270 msgid "Compatible print profiles" msgstr "호환되는 인쇄 프로 파일" @@ -3753,16 +5103,16 @@ msgid "Select the print profiles this profile is compatible with." msgstr "이 프로필이 호환되는 인쇄 프로필을 선택 합니다." #. TRN "Save current Settings" -#: src/slic3r/GUI/Tab.cpp:133 +#: src/slic3r/GUI/Tab.cpp:135 #, c-format msgid "Save current %s" msgstr "현재 %s 저장" -#: src/slic3r/GUI/Tab.cpp:134 +#: src/slic3r/GUI/Tab.cpp:136 msgid "Delete this preset" msgstr "이전 설정 삭제" -#: src/slic3r/GUI/Tab.cpp:139 +#: src/slic3r/GUI/Tab.cpp:141 msgid "" "Hover the cursor over buttons to find more information \n" "or click this button." @@ -3770,560 +5120,481 @@ msgstr "" "버튼 위로 커서를 가져 가서 자세한 정보를 찾습니다.\n" "또는이 버튼을 클릭하십시오." -#: src/slic3r/GUI/Tab.cpp:921 +#: src/slic3r/GUI/Tab.cpp:943 msgid "This is a default preset." msgstr "기본 설정입니다." -#: src/slic3r/GUI/Tab.cpp:923 +#: src/slic3r/GUI/Tab.cpp:945 msgid "This is a system preset." msgstr "시스템 설정입니다." -#: src/slic3r/GUI/Tab.cpp:925 +#: src/slic3r/GUI/Tab.cpp:947 msgid "Current preset is inherited from the default preset." msgstr "현재 사전 설정은 기본 사전 설정에서 상속됩니다." -#: src/slic3r/GUI/Tab.cpp:928 +#: src/slic3r/GUI/Tab.cpp:950 #, c-format msgid "" "Current preset is inherited from:\n" "\t%s" msgstr "전의 %s 설정에서 가져 옵니다 " -#: src/slic3r/GUI/Tab.cpp:932 +#: src/slic3r/GUI/Tab.cpp:954 msgid "It can't be deleted or modified." msgstr "삭제하거나 수정할 수 없습니다." -#: src/slic3r/GUI/Tab.cpp:933 -msgid "Any modifications should be saved as a new preset inherited from this one." +#: src/slic3r/GUI/Tab.cpp:955 +msgid "" +"Any modifications should be saved as a new preset inherited from this one." msgstr "모든 수정 사항은 이 항목에서 받은 기본 설정으로 저장해야합니다." -#: src/slic3r/GUI/Tab.cpp:934 +#: src/slic3r/GUI/Tab.cpp:956 msgid "To do that please specify a new name for the preset." msgstr "그렇게하려면 기본 설정의 새 이름을 지정하십시오." -#: src/slic3r/GUI/Tab.cpp:938 +#: src/slic3r/GUI/Tab.cpp:960 msgid "Additional information:" msgstr "추가 정보:" -#: src/slic3r/GUI/Tab.cpp:944 +#: src/slic3r/GUI/Tab.cpp:966 msgid "printer model" msgstr "프린터 모델" -#: src/slic3r/GUI/Tab.cpp:952 +#: src/slic3r/GUI/Tab.cpp:974 msgid "default print profile" msgstr "기본 인쇄 프로파일" -#: src/slic3r/GUI/Tab.cpp:955 +#: src/slic3r/GUI/Tab.cpp:977 msgid "default filament profile" msgstr "기본 필라멘트 프로파일" -#: src/slic3r/GUI/Tab.cpp:969 +#: src/slic3r/GUI/Tab.cpp:991 msgid "default SLA material profile" msgstr "기본 SLA 재질 프로 파일" -#: src/slic3r/GUI/Tab.cpp:973 +#: src/slic3r/GUI/Tab.cpp:995 msgid "default SLA print profile" msgstr "기본 SLA 인쇄 프로필" -#: src/slic3r/GUI/Tab.cpp:1008 src/slic3r/GUI/Tab.cpp:3649 +#: src/slic3r/GUI/Tab.cpp:1003 +msgid "full profile name" +msgstr "전체 프로필 이름" + +#: src/slic3r/GUI/Tab.cpp:1004 +msgid "symbolic profile name" +msgstr "기호 프로파일 이름" + +#: src/slic3r/GUI/Tab.cpp:1038 src/slic3r/GUI/Tab.cpp:3570 msgid "Layers and perimeters" msgstr "레이어 및 둘레" -#: src/slic3r/GUI/Tab.cpp:1009 src/slic3r/GUI/Tab.cpp:1257 -#: src/libslic3r/PrintConfig.cpp:66 -msgid "Layer height" -msgstr "레이어 높이" - -#: src/slic3r/GUI/Tab.cpp:1013 +#: src/slic3r/GUI/Tab.cpp:1043 msgid "Vertical shells" msgstr "쉘 높이" -#: src/slic3r/GUI/Tab.cpp:1024 +#: src/slic3r/GUI/Tab.cpp:1054 msgid "Horizontal shells" msgstr "쉘 너비" -#: src/slic3r/GUI/Tab.cpp:1025 src/libslic3r/PrintConfig.cpp:1759 +#: src/slic3r/GUI/Tab.cpp:1055 src/libslic3r/PrintConfig.cpp:1790 msgid "Solid layers" msgstr "솔리드 레이어" -#: src/slic3r/GUI/Tab.cpp:1030 +#: src/slic3r/GUI/Tab.cpp:1059 +msgid "Minimum shell thickness" +msgstr "최소 쉘 두께" + +#: src/slic3r/GUI/Tab.cpp:1070 msgid "Quality (slower slicing)" msgstr "품질(슬라이싱이 느려짐)" -#: src/slic3r/GUI/Tab.cpp:1048 +#: src/slic3r/GUI/Tab.cpp:1088 msgid "Reducing printing time" msgstr "출력 시간 단축" -#: src/slic3r/GUI/Tab.cpp:1060 +#: src/slic3r/GUI/Tab.cpp:1100 msgid "Skirt and brim" msgstr "스커트와 브림" -#: src/slic3r/GUI/Tab.cpp:1077 +#: src/slic3r/GUI/Tab.cpp:1117 msgid "Raft" msgstr "라프트" -#: src/slic3r/GUI/Tab.cpp:1081 +#: src/slic3r/GUI/Tab.cpp:1121 msgid "Options for support material and raft" msgstr "서포트와 라프트 재료를 선택" -#: src/slic3r/GUI/Tab.cpp:1096 +#: src/slic3r/GUI/Tab.cpp:1136 msgid "Speed for print moves" msgstr "출력중 이동 속도" -#: src/slic3r/GUI/Tab.cpp:1108 +#: src/slic3r/GUI/Tab.cpp:1148 msgid "Speed for non-print moves" msgstr "미출력시 이동속도" -#: src/slic3r/GUI/Tab.cpp:1111 +#: src/slic3r/GUI/Tab.cpp:1151 msgid "Modifiers" msgstr "수정" -#: src/slic3r/GUI/Tab.cpp:1114 +#: src/slic3r/GUI/Tab.cpp:1154 msgid "Acceleration control (advanced)" msgstr "가속 제어(고급)" -#: src/slic3r/GUI/Tab.cpp:1121 +#: src/slic3r/GUI/Tab.cpp:1161 msgid "Autospeed (advanced)" msgstr "오토스피트(고급)" -#: src/slic3r/GUI/Tab.cpp:1129 +#: src/slic3r/GUI/Tab.cpp:1169 msgid "Multiple Extruders" msgstr "다중 익스트루더" -#: src/slic3r/GUI/Tab.cpp:1137 +#: src/slic3r/GUI/Tab.cpp:1177 msgid "Ooze prevention" msgstr "오즈 방지(Ooze prevention)" -#: src/slic3r/GUI/Tab.cpp:1154 +#: src/slic3r/GUI/Tab.cpp:1195 msgid "Extrusion width" msgstr "악출 폭(Extrusion width)" -#: src/slic3r/GUI/Tab.cpp:1164 +#: src/slic3r/GUI/Tab.cpp:1205 msgid "Overlap" msgstr "겹침(Overlap)" -#: src/slic3r/GUI/Tab.cpp:1167 +#: src/slic3r/GUI/Tab.cpp:1208 msgid "Flow" msgstr "유량(Flow)" -#: src/slic3r/GUI/Tab.cpp:1176 +#: src/slic3r/GUI/Tab.cpp:1217 msgid "Other" msgstr "그 외" -#: src/slic3r/GUI/Tab.cpp:1179 src/slic3r/GUI/Tab.cpp:3703 +#: src/slic3r/GUI/Tab.cpp:1220 src/slic3r/GUI/Tab.cpp:3637 msgid "Output options" msgstr "출력 옵션" -#: src/slic3r/GUI/Tab.cpp:1180 +#: src/slic3r/GUI/Tab.cpp:1221 msgid "Sequential printing" msgstr "연속 인쇄" -#: src/slic3r/GUI/Tab.cpp:1182 +#: src/slic3r/GUI/Tab.cpp:1223 msgid "Extruder clearance (mm)" msgstr "익스트루더 간격(mm)" -#: src/slic3r/GUI/Tab.cpp:1191 src/slic3r/GUI/Tab.cpp:3704 +#: src/slic3r/GUI/Tab.cpp:1232 src/slic3r/GUI/Tab.cpp:3638 msgid "Output file" msgstr "출력 파일" -#: src/slic3r/GUI/Tab.cpp:1198 src/libslic3r/PrintConfig.cpp:1432 +#: src/slic3r/GUI/Tab.cpp:1239 src/libslic3r/PrintConfig.cpp:1462 msgid "Post-processing scripts" -msgstr "포스트 프로세싱 스크립트" +msgstr "사후 처리 스크립트" -#: src/slic3r/GUI/Tab.cpp:1204 src/slic3r/GUI/Tab.cpp:1205 -#: src/slic3r/GUI/Tab.cpp:1716 src/slic3r/GUI/Tab.cpp:1717 -#: src/slic3r/GUI/Tab.cpp:2165 src/slic3r/GUI/Tab.cpp:2166 -#: src/slic3r/GUI/Tab.cpp:2273 src/slic3r/GUI/Tab.cpp:2274 -#: src/slic3r/GUI/Tab.cpp:3586 src/slic3r/GUI/Tab.cpp:3587 +#: src/slic3r/GUI/Tab.cpp:1245 src/slic3r/GUI/Tab.cpp:1246 +#: src/slic3r/GUI/Tab.cpp:1531 src/slic3r/GUI/Tab.cpp:1532 +#: src/slic3r/GUI/Tab.cpp:1996 src/slic3r/GUI/Tab.cpp:1997 +#: src/slic3r/GUI/Tab.cpp:2110 src/slic3r/GUI/Tab.cpp:2111 +#: src/slic3r/GUI/Tab.cpp:3507 src/slic3r/GUI/Tab.cpp:3508 msgid "Notes" msgstr "메모" -#: src/slic3r/GUI/Tab.cpp:1211 src/slic3r/GUI/Tab.cpp:1724 -#: src/slic3r/GUI/Tab.cpp:2172 src/slic3r/GUI/Tab.cpp:2280 -#: src/slic3r/GUI/Tab.cpp:3594 src/slic3r/GUI/Tab.cpp:3709 +#: src/slic3r/GUI/Tab.cpp:1252 src/slic3r/GUI/Tab.cpp:1539 +#: src/slic3r/GUI/Tab.cpp:2003 src/slic3r/GUI/Tab.cpp:2117 +#: src/slic3r/GUI/Tab.cpp:3515 src/slic3r/GUI/Tab.cpp:3643 msgid "Dependencies" msgstr "속한 그룹" -#: src/slic3r/GUI/Tab.cpp:1212 src/slic3r/GUI/Tab.cpp:1725 -#: src/slic3r/GUI/Tab.cpp:2173 src/slic3r/GUI/Tab.cpp:2281 -#: src/slic3r/GUI/Tab.cpp:3595 src/slic3r/GUI/Tab.cpp:3710 +#: src/slic3r/GUI/Tab.cpp:1253 src/slic3r/GUI/Tab.cpp:1540 +#: src/slic3r/GUI/Tab.cpp:2004 src/slic3r/GUI/Tab.cpp:2118 +#: src/slic3r/GUI/Tab.cpp:3516 src/slic3r/GUI/Tab.cpp:3644 msgid "Profile dependencies" msgstr "프로파일 속한곳" -#: src/slic3r/GUI/Tab.cpp:1256 -msgid "" -"Zero layer height is not valid.\n" -"\n" -"The layer height will be reset to 0.01." -msgstr "" -"바닥 레이어 높이가 잘못되었습니다.\n" -"\n" -"레이어 높이가 0.01로 재설정됩니다." - -#: src/slic3r/GUI/Tab.cpp:1268 -msgid "" -"Zero first layer height is not valid.\n" -"\n" -"The first layer height will be reset to 0.01." -msgstr "" -"첫 번째 레이어 높이가 0이면 유효하지 않습니다.\n" -"\n" -"첫 번째 레이어 높이는 0.01로 재설정됩니다." - -#: src/slic3r/GUI/Tab.cpp:1269 src/libslic3r/PrintConfig.cpp:866 -msgid "First layer height" -msgstr "첫 레이어 높이" - -#: src/slic3r/GUI/Tab.cpp:1283 -#, c-format -msgid "" -"The Spiral Vase mode requires:\n" -"- one perimeter\n" -"- no top solid layers\n" -"- 0% fill density\n" -"- no support material\n" -"- no ensure_vertical_shell_thickness\n" -"\n" -"Shall I adjust those settings in order to enable Spiral Vase?" -msgstr "" -"스파이럴 바이스 모드에는 다음이 필요합니다.\n" -"- one 둘레\n" -"- 탑 솔리드 레이어 없음\n" -"- 0% fill density\n" -"- 서포트 재료 없음\n" -"- 수직 벽 두깨를 보장하지 않음\n" -"\n" -"스파이럴 바이스를 사용하려면 이러한 설정을 조정해야합니까?" - -#: src/slic3r/GUI/Tab.cpp:1290 -msgid "Spiral Vase" -msgstr "스파이럴 바이스" - -#: src/slic3r/GUI/Tab.cpp:1311 -msgid "" -"The Wipe Tower currently supports the non-soluble supports only\n" -"if they are printed with the current extruder without triggering a tool change.\n" -"(both support_material_extruder and support_material_interface_extruder need to be set to 0).\n" -"\n" -"Shall I adjust those settings in order to enable the Wipe Tower?" -msgstr "" -"와이퍼 타워는 현재 비 가용성 서포트 만 지원합니다.\n" -"공구 교환을 트리거하지 않고 현재 압출기로 인쇄 한 경우.\n" -"(support_material_extruder 및 support_material_interface_extruder를 모두 0으로 설정해야 함).\n" -"\n" -"와이퍼 타워를 사용하려면 이러한 설정을 조정해야합니까?" - -#: src/slic3r/GUI/Tab.cpp:1315 src/slic3r/GUI/Tab.cpp:1332 -msgid "Wipe Tower" -msgstr "와이프 타워(Wipe Tower)" - -#: src/slic3r/GUI/Tab.cpp:1329 -msgid "" -"For the Wipe Tower to work with the soluble supports, the support layers\n" -"need to be synchronized with the object layers.\n" -"\n" -"Shall I synchronize support layers in order to enable the Wipe Tower?" -msgstr "" -"와이퍼 타워가 가용성 서포트와 함께 작용하기 위해, 서포트 레이어\n" -"객체(object) 레이어와 동기화되어야합니다.\n" -"\n" -"와이퍼 타워를 사용하려면 서포트 레이어를 동기화해야합니까?" - -#: src/slic3r/GUI/Tab.cpp:1347 -msgid "" -"Supports work better, if the following feature is enabled:\n" -"- Detect bridging perimeters\n" -"\n" -"Shall I adjust those settings for supports?" -msgstr "" -"다음 기능을 사용하는 경우 더 나은 작업을 지원합니다.\n" -"- 브리지의 둘레(perimeters)를 탐지\n" -"\n" -"서포트에 대한 설정을 조정해야합니까?" - -#: src/slic3r/GUI/Tab.cpp:1350 -msgid "Support Generator" -msgstr "서포트 생성" - -#: src/slic3r/GUI/Tab.cpp:1392 -msgid "" -"The %1% infill pattern is not supposed to work at 100%% density.\n" -"\n" -"Shall I switch to rectilinear fill pattern?" -msgstr "" -"%1% 채우기 패턴은 100%의 밀도로 작동 하지 않습니다.\n" -"\n" -"직선 채우기 패턴으로 전환 해야 합니까?" - -#: src/slic3r/GUI/Tab.cpp:1502 src/slic3r/GUI/Tab.cpp:1557 +#: src/slic3r/GUI/Tab.cpp:1317 src/slic3r/GUI/Tab.cpp:1372 msgid "Filament Overrides" msgstr "필라멘트 재정의" -#: src/slic3r/GUI/Tab.cpp:1503 src/slic3r/GUI/Tab.cpp:1562 -#: src/slic3r/GUI/Tab.cpp:2514 +#: src/slic3r/GUI/Tab.cpp:1318 src/slic3r/GUI/Tab.cpp:1377 +#: src/slic3r/GUI/Tab.cpp:2352 msgid "Retraction" msgstr "리트렉션" -#: src/slic3r/GUI/Tab.cpp:1612 src/libslic3r/PrintConfig.cpp:2030 +#: src/slic3r/GUI/Tab.cpp:1427 src/libslic3r/PrintConfig.cpp:2077 msgid "Temperature" msgstr "온도" -#: src/slic3r/GUI/Tab.cpp:1618 +#: src/slic3r/GUI/Tab.cpp:1433 msgid "Bed" msgstr "배드(Bed)" -#: src/slic3r/GUI/Tab.cpp:1623 +#: src/slic3r/GUI/Tab.cpp:1438 msgid "Cooling" msgstr "냉각(Cooling)" -#: src/slic3r/GUI/Tab.cpp:1624 src/libslic3r/PrintConfig.cpp:1335 -#: src/libslic3r/PrintConfig.cpp:2150 +#: src/slic3r/GUI/Tab.cpp:1439 src/libslic3r/PrintConfig.cpp:1364 +#: src/libslic3r/PrintConfig.cpp:2210 msgid "Enable" msgstr "사용" -#: src/slic3r/GUI/Tab.cpp:1635 +#: src/slic3r/GUI/Tab.cpp:1450 msgid "Fan settings" msgstr "팬 설정" -#: src/slic3r/GUI/Tab.cpp:1636 -msgid "Fan speed" -msgstr "팬 속도" - -#: src/slic3r/GUI/Tab.cpp:1644 +#: src/slic3r/GUI/Tab.cpp:1459 msgid "Cooling thresholds" msgstr "냉각 임계 값" -#: src/slic3r/GUI/Tab.cpp:1650 +#: src/slic3r/GUI/Tab.cpp:1465 msgid "Filament properties" msgstr "필라멘트 특성" -#: src/slic3r/GUI/Tab.cpp:1654 +#: src/slic3r/GUI/Tab.cpp:1469 msgid "Print speed override" msgstr "인쇄 속도 중단" -#: src/slic3r/GUI/Tab.cpp:1664 +#: src/slic3r/GUI/Tab.cpp:1479 msgid "Wipe tower parameters" msgstr "타워 매개변수 지우기" -#: src/slic3r/GUI/Tab.cpp:1667 +#: src/slic3r/GUI/Tab.cpp:1482 msgid "Toolchange parameters with single extruder MM printers" msgstr "MMU 프린터의 툴체인지 매개 변수" -#: src/slic3r/GUI/Tab.cpp:1681 +#: src/slic3r/GUI/Tab.cpp:1496 msgid "Ramming settings" msgstr "래밍 설정" -#: src/slic3r/GUI/Tab.cpp:1703 src/slic3r/GUI/Tab.cpp:2128 +#: src/slic3r/GUI/Tab.cpp:1518 src/slic3r/GUI/Tab.cpp:1959 msgid "Custom G-code" msgstr "수동 G코드" -#: src/slic3r/GUI/Tab.cpp:1704 src/slic3r/GUI/Tab.cpp:2129 -#: src/libslic3r/PrintConfig.cpp:1785 src/libslic3r/PrintConfig.cpp:1800 +#: src/slic3r/GUI/Tab.cpp:1519 src/slic3r/GUI/Tab.cpp:1960 +#: src/libslic3r/PrintConfig.cpp:1823 src/libslic3r/PrintConfig.cpp:1838 msgid "Start G-code" msgstr "스타트 G코드" -#: src/slic3r/GUI/Tab.cpp:1710 src/slic3r/GUI/Tab.cpp:2135 -#: src/libslic3r/PrintConfig.cpp:369 src/libslic3r/PrintConfig.cpp:379 +#: src/slic3r/GUI/Tab.cpp:1525 src/slic3r/GUI/Tab.cpp:1966 +#: src/libslic3r/PrintConfig.cpp:385 src/libslic3r/PrintConfig.cpp:395 msgid "End G-code" msgstr "엔드 G코드" -#: src/slic3r/GUI/Tab.cpp:1843 src/slic3r/GUI/Tab.cpp:2068 +#: src/slic3r/GUI/Tab.cpp:1582 +msgid "Volumetric flow hints not available" +msgstr "체적 흐름 힌트를 사용할 수 없음" + +#: src/slic3r/GUI/Tab.cpp:1668 src/slic3r/GUI/Tab.cpp:1899 msgid "Test" msgstr "시험(test)" -#: src/slic3r/GUI/Tab.cpp:1853 +#: src/slic3r/GUI/Tab.cpp:1678 msgid "Could not get a valid Printer Host reference" msgstr "유효한 프린터 호스트 참조를 가져올 수 없습니다" -#: src/slic3r/GUI/Tab.cpp:1859 src/slic3r/GUI/Tab.cpp:2081 +#: src/slic3r/GUI/Tab.cpp:1684 src/slic3r/GUI/Tab.cpp:1912 msgid "Success!" msgstr "성공!" -#: src/slic3r/GUI/Tab.cpp:1874 -msgid "HTTPS CA file is optional. It is only needed if you use HTTPS with a self-signed certificate." -msgstr "HTTPS CA 파일은 선택 사항입니다. 자체 서명 된 인증서로 HTTPS를 사용하는 경우에만 필요합니다." +#: src/slic3r/GUI/Tab.cpp:1699 +msgid "" +"HTTPS CA file is optional. It is only needed if you use HTTPS with a self-" +"signed certificate." +msgstr "" +"HTTPS CA 파일은 선택 사항입니다. 자체 서명 된 인증서로 HTTPS를 사용하는 경우" +"에만 필요합니다." -#: src/slic3r/GUI/Tab.cpp:1887 +#: src/slic3r/GUI/Tab.cpp:1712 msgid "Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*" msgstr "인증서 파일 (* .crt, * .pem) | * .crt; * .pem | 모든 파일 | *. *" -#: src/slic3r/GUI/Tab.cpp:1888 +#: src/slic3r/GUI/Tab.cpp:1713 msgid "Open CA certificate file" msgstr "CA 인증서 파일 열기" -#: src/slic3r/GUI/Tab.cpp:1916 +#: src/slic3r/GUI/Tab.cpp:1741 #, c-format msgid "" "HTTPS CA File:\n" -" \tOn this system, %s uses HTTPS certificates from the system Certificate Store or Keychain.\n" -" \tTo use a custom CA file, please import your CA file into Certificate Store / Keychain." +" \tOn this system, %s uses HTTPS certificates from the system Certificate " +"Store or Keychain.\n" +" \tTo use a custom CA file, please import your CA file into Certificate " +"Store / Keychain." msgstr "" "HTTPS CA 파일:\n" -"\t이 시스템에서 %s는 시스템 인증서 저장소나 키체인의 HTTPS 인증서를 사용 합니다.\n" -"\t사용자 지정 CA 파일을 사용 하려면 CA 파일을 인증서 저장소/키체인에 가져오십시오." +" \t이 시스템에서 %s는 시스템 인증서 저장소나 키체인의 HTTPS 인증서를 사용 " +"합니다.\n" +" \t사용자 지정 CA 파일을 사용 하려면 CA 파일을 인증서 저장소/키체인에 가져" +"오십시오." -#: src/slic3r/GUI/Tab.cpp:1956 src/slic3r/GUI/Tab.cpp:2194 +#: src/slic3r/GUI/Tab.cpp:1781 src/slic3r/GUI/Tab.cpp:2025 msgid "Size and coordinates" msgstr "크기와 좌표" -#: src/slic3r/GUI/Tab.cpp:1961 src/slic3r/GUI/Tab.cpp:2199 -#: src/slic3r/GUI/Tab.cpp:3256 +#: src/slic3r/GUI/Tab.cpp:1786 src/slic3r/GUI/Tab.cpp:2030 +#: src/slic3r/GUI/Tab.cpp:3146 msgid "Set" msgstr "설정" -#: src/slic3r/GUI/Tab.cpp:1993 +#: src/slic3r/GUI/Tab.cpp:1818 msgid "Capabilities" msgstr "기능" -#: src/slic3r/GUI/Tab.cpp:1998 +#: src/slic3r/GUI/Tab.cpp:1823 msgid "Number of extruders of the printer." msgstr "프린터 익스트루더 갯수." -#: src/slic3r/GUI/Tab.cpp:2023 +#: src/slic3r/GUI/Tab.cpp:1851 msgid "" "Single Extruder Multi Material is selected, \n" "and all extruders must have the same diameter.\n" -"Do you want to change the diameter for all extruders to first extruder nozzle diameter value?" +"Do you want to change the diameter for all extruders to first extruder " +"nozzle diameter value?" msgstr "" "단일 압출기 다중 재질이 선택되고, \n" "모든 압출기는 동일한 직경을 가져야 합니다.\n" "모든 압출기의 지름을 첫 번째 압출기 노즐 값으로 변경하시겠습니까?" -#: src/slic3r/GUI/Tab.cpp:2026 src/slic3r/GUI/Tab.cpp:2484 -#: src/libslic3r/PrintConfig.cpp:1310 +#: src/slic3r/GUI/Tab.cpp:1854 src/slic3r/GUI/Tab.cpp:2322 +#: src/libslic3r/PrintConfig.cpp:1335 msgid "Nozzle diameter" msgstr "노즐 직경" -#: src/slic3r/GUI/Tab.cpp:2053 +#: src/slic3r/GUI/Tab.cpp:1884 msgid "USB/Serial connection" msgstr "USB/시리얼 연결" -#: src/slic3r/GUI/Tab.cpp:2054 src/libslic3r/PrintConfig.cpp:1640 +#: src/slic3r/GUI/Tab.cpp:1885 src/libslic3r/PrintConfig.cpp:1670 msgid "Serial port" msgstr "시리얼 포트" -#: src/slic3r/GUI/Tab.cpp:2059 +#: src/slic3r/GUI/Tab.cpp:1890 msgid "Rescan serial ports" msgstr "시리얼포트 재검색" -#: src/slic3r/GUI/Tab.cpp:2081 +#: src/slic3r/GUI/Tab.cpp:1912 msgid "Connection to printer works correctly." msgstr "프린터 연결이 올바르게 작동합니다." -#: src/slic3r/GUI/Tab.cpp:2084 +#: src/slic3r/GUI/Tab.cpp:1915 msgid "Connection failed." msgstr "연결 실패." -#: src/slic3r/GUI/Tab.cpp:2097 src/slic3r/GUI/Tab.cpp:2268 +#: src/slic3r/GUI/Tab.cpp:1928 src/slic3r/GUI/Tab.cpp:2105 msgid "Print Host upload" msgstr "호스트 업로드 인쇄" -#: src/slic3r/GUI/Tab.cpp:2141 src/libslic3r/PrintConfig.cpp:138 +#: src/slic3r/GUI/Tab.cpp:1972 src/libslic3r/PrintConfig.cpp:143 msgid "Before layer change G-code" msgstr "레이어 변경 전 G 코드" -#: src/slic3r/GUI/Tab.cpp:2147 src/libslic3r/PrintConfig.cpp:1056 +#: src/slic3r/GUI/Tab.cpp:1978 src/libslic3r/PrintConfig.cpp:1081 msgid "After layer change G-code" msgstr "레이어 변경 후 G 코드" -#: src/slic3r/GUI/Tab.cpp:2153 src/libslic3r/PrintConfig.cpp:2056 +#: src/slic3r/GUI/Tab.cpp:1984 src/libslic3r/PrintConfig.cpp:2103 msgid "Tool change G-code" msgstr "툴 채인지 G 코드" -#: src/slic3r/GUI/Tab.cpp:2159 +#: src/slic3r/GUI/Tab.cpp:1990 msgid "Between objects G-code (for sequential printing)" msgstr "객체(object) 간 G 코드 (순차 인쇄용)" -#: src/slic3r/GUI/Tab.cpp:2231 +#: src/slic3r/GUI/Tab.cpp:2062 msgid "Display" msgstr "표시" -#: src/slic3r/GUI/Tab.cpp:2246 +#: src/slic3r/GUI/Tab.cpp:2077 msgid "Tilt" msgstr "기울이기" -#: src/slic3r/GUI/Tab.cpp:2247 +#: src/slic3r/GUI/Tab.cpp:2078 msgid "Tilt time" msgstr "기울이기 시간" -#: src/slic3r/GUI/Tab.cpp:2253 src/slic3r/GUI/Tab.cpp:3568 +#: src/slic3r/GUI/Tab.cpp:2084 src/slic3r/GUI/Tab.cpp:3489 msgid "Corrections" msgstr "수정" -#: src/slic3r/GUI/Tab.cpp:2333 src/slic3r/GUI/Tab.cpp:2418 -#: src/libslic3r/PrintConfig.cpp:1106 src/libslic3r/PrintConfig.cpp:1124 -#: src/libslic3r/PrintConfig.cpp:1142 src/libslic3r/PrintConfig.cpp:1159 -#: src/libslic3r/PrintConfig.cpp:1170 src/libslic3r/PrintConfig.cpp:1181 -#: src/libslic3r/PrintConfig.cpp:1192 +#: src/slic3r/GUI/Tab.cpp:2099 src/slic3r/GUI/Tab.cpp:3485 +msgid "Exposure" +msgstr "노출" + +#: src/slic3r/GUI/Tab.cpp:2170 src/slic3r/GUI/Tab.cpp:2255 +#: src/libslic3r/PrintConfig.cpp:1131 src/libslic3r/PrintConfig.cpp:1149 +#: src/libslic3r/PrintConfig.cpp:1167 src/libslic3r/PrintConfig.cpp:1184 +#: src/libslic3r/PrintConfig.cpp:1195 src/libslic3r/PrintConfig.cpp:1206 +#: src/libslic3r/PrintConfig.cpp:1217 msgid "Machine limits" msgstr "머신 한계설정" -#: src/slic3r/GUI/Tab.cpp:2347 +#: src/slic3r/GUI/Tab.cpp:2184 msgid "Values in this column are for Normal mode" msgstr "이 열의 값은 일반 모드입니다" -#: src/slic3r/GUI/Tab.cpp:2348 +#: src/slic3r/GUI/Tab.cpp:2185 msgid "Normal" msgstr "보통" -#: src/slic3r/GUI/Tab.cpp:2353 +#: src/slic3r/GUI/Tab.cpp:2190 msgid "Values in this column are for Stealth mode" msgstr "이 열의 값은 무음 모드 용입니다" -#: src/slic3r/GUI/Tab.cpp:2354 +#: src/slic3r/GUI/Tab.cpp:2191 msgid "Stealth" msgstr "스텔스" -#: src/slic3r/GUI/Tab.cpp:2362 +#: src/slic3r/GUI/Tab.cpp:2199 msgid "Maximum feedrates" msgstr "최대 이송속도" -#: src/slic3r/GUI/Tab.cpp:2367 +#: src/slic3r/GUI/Tab.cpp:2204 msgid "Maximum accelerations" msgstr "최고 가속도" -#: src/slic3r/GUI/Tab.cpp:2374 +#: src/slic3r/GUI/Tab.cpp:2211 msgid "Jerk limits" msgstr "저크(Jerk)값 한계" -#: src/slic3r/GUI/Tab.cpp:2379 +#: src/slic3r/GUI/Tab.cpp:2216 msgid "Minimum feedrates" msgstr "최대 이송속도" -#: src/slic3r/GUI/Tab.cpp:2443 src/slic3r/GUI/Tab.cpp:2451 +#: src/slic3r/GUI/Tab.cpp:2280 src/slic3r/GUI/Tab.cpp:2288 msgid "Single extruder MM setup" msgstr "싱글 익스트루더 MM 설정" -#: src/slic3r/GUI/Tab.cpp:2452 +#: src/slic3r/GUI/Tab.cpp:2289 msgid "Single extruder multimaterial parameters" -msgstr "싱글 익스트루더 다중메터리알 파라미터" +msgstr "싱글 익스트루더 멀티메터리알 파라미터" -#: src/slic3r/GUI/Tab.cpp:2465 src/libslic3r/GCode/PreviewData.cpp:477 -#, c-format -msgid "Extruder %d" -msgstr "익스트루더 %d" +#: src/slic3r/GUI/Tab.cpp:2320 +msgid "" +"This is a single extruder multimaterial printer, diameters of all extruders " +"will be set to the new value. Do you want to proceed?" +msgstr "" +"이것은 단일 압출기 다중 재질 프린터이며 모든 압출기의 지름이 새 값으로 설정됩" +"니다. 계속하시겠습니까?" -#: src/slic3r/GUI/Tab.cpp:2483 -msgid "Do you want to change the diameter for all extruders?" -msgstr "모든 압출기의 지름을 변경하시겠습니까?" - -#: src/slic3r/GUI/Tab.cpp:2506 +#: src/slic3r/GUI/Tab.cpp:2344 msgid "Layer height limits" msgstr "레이어 높이 한계치" -#: src/slic3r/GUI/Tab.cpp:2511 +#: src/slic3r/GUI/Tab.cpp:2349 msgid "Position (for multi-extruder printers)" msgstr "위치 (다중 익스트루더 프린터 포함)" -#: src/slic3r/GUI/Tab.cpp:2517 +#: src/slic3r/GUI/Tab.cpp:2355 msgid "Only lift Z" msgstr "Z축 올림" -#: src/slic3r/GUI/Tab.cpp:2530 -msgid "Retraction when tool is disabled (advanced settings for multi-extruder setups)" +#: src/slic3r/GUI/Tab.cpp:2368 +msgid "" +"Retraction when tool is disabled (advanced settings for multi-extruder " +"setups)" msgstr "도구 비활성화시 리트렉션 (다중 익스트루더 고급 설정)" -#: src/slic3r/GUI/Tab.cpp:2693 +#: src/slic3r/GUI/Tab.cpp:2376 +msgid "Reset to Filament Color" +msgstr "필라멘트 색상으로 재설정" + +#: src/slic3r/GUI/Tab.cpp:2557 msgid "" "The Wipe option is not available when using the Firmware Retraction mode.\n" "\n" @@ -4333,102 +5604,118 @@ msgstr "" "\n" "펌웨어 리트렉션 하려면 비활성화해야합니까?" -#: src/slic3r/GUI/Tab.cpp:2695 +#: src/slic3r/GUI/Tab.cpp:2559 msgid "Firmware Retraction" msgstr "펌웨어 레트렉션" -#: src/slic3r/GUI/Tab.cpp:3024 +#: src/slic3r/GUI/Tab.cpp:2889 #, c-format msgid "Default preset (%s)" msgstr "시스템 기본값 (%s)" -#: src/slic3r/GUI/Tab.cpp:3025 +#: src/slic3r/GUI/Tab.cpp:2890 #, c-format msgid "Preset (%s)" msgstr "프리셋 ( %s)" -#: src/slic3r/GUI/Tab.cpp:3042 +#: src/slic3r/GUI/Tab.cpp:2907 msgid "has the following unsaved changes:" msgstr "저장되지 않은 수정사항:" -#: src/slic3r/GUI/Tab.cpp:3045 +#: src/slic3r/GUI/Tab.cpp:2910 msgid "is not compatible with printer" msgstr "프린터와 호완 되지 않습니다" -#: src/slic3r/GUI/Tab.cpp:3046 +#: src/slic3r/GUI/Tab.cpp:2911 msgid "is not compatible with print profile" msgstr "인쇄 프로필과 호환 되지 않음" -#: src/slic3r/GUI/Tab.cpp:3048 +#: src/slic3r/GUI/Tab.cpp:2913 msgid "and it has the following unsaved changes:" msgstr "저장되지 않은 변경점은 다음과 같습니다:" -#: src/slic3r/GUI/Tab.cpp:3052 +#: src/slic3r/GUI/Tab.cpp:2917 msgid "Unsaved Changes" msgstr "미 저장된 변경점" -#: src/slic3r/GUI/Tab.cpp:3143 +#: src/slic3r/GUI/Tab.cpp:3015 +msgctxt "PresetName" msgid "%1% - Copy" msgstr "%1%-복사" -#: src/slic3r/GUI/Tab.cpp:3166 +#: src/slic3r/GUI/Tab.cpp:3038 msgid "The supplied name is empty. It can't be saved." msgstr "파일 이름이 비어 있습니다. 저장할 수 없습니다." -#: src/slic3r/GUI/Tab.cpp:3171 +#: src/slic3r/GUI/Tab.cpp:3043 msgid "Cannot overwrite a system profile." msgstr "시스템 프로파일을 겹쳐 쓸 수 없습니다." -#: src/slic3r/GUI/Tab.cpp:3175 +#: src/slic3r/GUI/Tab.cpp:3047 msgid "Cannot overwrite an external profile." msgstr "외부 프로필을 덮어 쓸 수 없습니다." -#: src/slic3r/GUI/Tab.cpp:3201 +#: src/slic3r/GUI/Tab.cpp:3052 +msgid "Preset with name \"%1%\" already exists." +msgstr "이름 \"%1%\"가 있는 사전 설정이 이미 있습니다." + +#: src/slic3r/GUI/Tab.cpp:3053 +msgid "Replace?" +msgstr "교체?" + +#: src/slic3r/GUI/Tab.cpp:3091 msgid "remove" msgstr "제거(remove)" -#: src/slic3r/GUI/Tab.cpp:3201 +#: src/slic3r/GUI/Tab.cpp:3091 msgid "delete" msgstr "지우기" #. TRN remove/delete -#: src/slic3r/GUI/Tab.cpp:3203 +#: src/slic3r/GUI/Tab.cpp:3093 msgid "Are you sure you want to %1% the selected preset?" msgstr "선택한 사전 설정의 %1%를 선택 하시겠습니까?" #. TRN Remove/Delete -#: src/slic3r/GUI/Tab.cpp:3206 +#: src/slic3r/GUI/Tab.cpp:3096 msgid "%1% Preset" msgstr "%1% 기본설정" -#: src/slic3r/GUI/Tab.cpp:3332 +#: src/slic3r/GUI/Tab.cpp:3222 msgid "LOCKED LOCK" msgstr "잠긴 잠금" #. TRN Description for "LOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:3334 -msgid "indicates that the settings are the same as the system (or default) values for the current option group" -msgstr "설정이 현재 옵션 그룹의 시스템(또는 기본값) 값과 동일하다는 것을 나타냅니다." +#: src/slic3r/GUI/Tab.cpp:3224 +msgid "" +"indicates that the settings are the same as the system (or default) values " +"for the current option group" +msgstr "" +"설정이 현재 옵션 그룹의 시스템(또는 기본값) 값과 동일하다는 것을 나타냅니다." -#: src/slic3r/GUI/Tab.cpp:3336 +#: src/slic3r/GUI/Tab.cpp:3226 msgid "UNLOCKED LOCK" msgstr "잠금 해제 잠금" #. TRN Description for "UNLOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:3338 +#: src/slic3r/GUI/Tab.cpp:3228 msgid "" -"indicates that some settings were changed and are not equal to the system (or default) values for the current option group.\n" -"Click the UNLOCKED LOCK icon to reset all settings for current option group to the system (or default) values." +"indicates that some settings were changed and are not equal to the system " +"(or default) values for the current option group.\n" +"Click the UNLOCKED LOCK icon to reset all settings for current option group " +"to the system (or default) values." msgstr "" -"은 일부 설정이 변경되었으며 현재 옵션 그룹의 시스템(또는 기본값) 값과 같지 않음을 나타냅니다.\n" -"잠금 해제 잠금 아이콘을 클릭하여 현재 옵션 그룹에 대한 모든 설정을 시스템(또는 기본값) 값으로 재설정합니다." +"은 일부 설정이 변경되었으며 현재 옵션 그룹의 시스템(또는 기본값) 값과 같지 않" +"음을 나타냅니다.\n" +"잠금 해제 잠금 아이콘을 클릭하여 현재 옵션 그룹에 대한 모든 설정을 시스템(또" +"는 기본값) 값으로 재설정합니다." -#: src/slic3r/GUI/Tab.cpp:3343 +#: src/slic3r/GUI/Tab.cpp:3233 msgid "WHITE BULLET" msgstr "흰색 글머리 기호" #. TRN Description for "WHITE BULLET" -#: src/slic3r/GUI/Tab.cpp:3345 +#: src/slic3r/GUI/Tab.cpp:3235 msgid "" "for the left button: \tindicates a non-system (or non-default) preset,\n" "for the right button: \tindicates that the settings hasn't been modified." @@ -4436,147 +5723,154 @@ msgstr "" "왼쪽 단추의 경우: 비시스템(또는 기본이 아닌) 사전 설정을 나타냅니다.\n" "오른쪽 버튼: 설정이 수정되지 않았음을 나타냅니다." -#: src/slic3r/GUI/Tab.cpp:3348 +#: src/slic3r/GUI/Tab.cpp:3238 msgid "BACK ARROW" msgstr "돌아가기 화살표" #. TRN Description for "BACK ARROW" -#: src/slic3r/GUI/Tab.cpp:3350 +#: src/slic3r/GUI/Tab.cpp:3240 msgid "" -"indicates that the settings were changed and are not equal to the last saved preset for the current option group.\n" -"Click the BACK ARROW icon to reset all settings for the current option group to the last saved preset." +"indicates that the settings were changed and are not equal to the last saved " +"preset for the current option group.\n" +"Click the BACK ARROW icon to reset all settings for the current option group " +"to the last saved preset." msgstr "" -"잠금 풀림;일부 설정이 변경되었으며 현재 옵션 그룹의 시스템 값과 같지 않음을 나타냅니다.\n" -"현재 옵션 그룹의 모든 설정을 시스템 값으로 재설정하려면 자물쇠 잠금 아이콘을 클릭하십시오." +"잠금 풀림;일부 설정이 변경되었으며 현재 옵션 그룹의 시스템 값과 같지 않음을 " +"나타냅니다.\n" +"현재 옵션 그룹의 모든 설정을 시스템 값으로 재설정하려면 자물쇠 잠금 아이콘을 " +"클릭하십시오." -#: src/slic3r/GUI/Tab.cpp:3360 -msgid "LOCKED LOCK icon indicates that the settings are the same as the system (or default) values for the current option group" -msgstr "LOCKED LOCK 아이콘은 설정이 현재 옵션 그룹의 시스템(또는 기본값) 값과 동일하다는 것을 나타냅니다." - -#: src/slic3r/GUI/Tab.cpp:3362 +#: src/slic3r/GUI/Tab.cpp:3250 msgid "" -"UNLOCKED LOCK icon indicates that some settings were changed and are not equal to the system (or default) values for the current option group.\n" -"Click to reset all settings for current option group to the system (or default) values." +"LOCKED LOCK icon indicates that the settings are the same as the system (or " +"default) values for the current option group" msgstr "" -"UNLOCKED LOCK 아이콘은 일부 설정이 변경되었으며 현재 옵션 그룹의 시스템(또는 기본값) 값과 같지 않음을 나타냅니다.\n" -"현재 옵션 그룹에 대한 모든 설정을 시스템(또는 기본값) 값으로 재설정하려면 클릭합니다." +"LOCKED LOCK 아이콘은 설정이 현재 옵션 그룹의 시스템(또는 기본값) 값과 동일하" +"다는 것을 나타냅니다." -#: src/slic3r/GUI/Tab.cpp:3365 +#: src/slic3r/GUI/Tab.cpp:3252 +msgid "" +"UNLOCKED LOCK icon indicates that some settings were changed and are not " +"equal to the system (or default) values for the current option group.\n" +"Click to reset all settings for current option group to the system (or " +"default) values." +msgstr "" +"UNLOCKED LOCK 아이콘은 일부 설정이 변경되었으며 현재 옵션 그룹의 시스템(또는 " +"기본값) 값과 같지 않음을 나타냅니다.\n" +"현재 옵션 그룹에 대한 모든 설정을 시스템(또는 기본값) 값으로 재설정하려면 클" +"릭합니다." + +#: src/slic3r/GUI/Tab.cpp:3255 msgid "WHITE BULLET icon indicates a non system (or non default) preset." msgstr "WHITE BULLET 아이콘은 시스템 사전 설정이 아닌 것을 나타냅니다." -#: src/slic3r/GUI/Tab.cpp:3368 -msgid "WHITE BULLET icon indicates that the settings are the same as in the last saved preset for the current option group." -msgstr "WHITE BULLET 기호 아이콘은 설정이 현재 옵션 그룹에 대해 마지막으로 저장 된 사전 설정과 동일 하다는 것을 나타냅니다." - -#: src/slic3r/GUI/Tab.cpp:3370 +#: src/slic3r/GUI/Tab.cpp:3258 msgid "" -"BACK ARROW icon indicates that the settings were changed and are not equal to the last saved preset for the current option group.\n" -"Click to reset all settings for the current option group to the last saved preset." +"WHITE BULLET icon indicates that the settings are the same as in the last " +"saved preset for the current option group." msgstr "" -"BACK ARROW 이콘 설정을 변경 하 고 현재 옵션 그룹에 대 한 마지막 저장 된 프리셋을 동일 하지 않습니다 나타냅니다.\n" -"마지막 현재 옵션 그룹에 대 한 모든 설정 다시 설정을 클릭 하 여 사전 설정을 저장." +"WHITE BULLET 기호 아이콘은 설정이 현재 옵션 그룹에 대해 마지막으로 저장 된 사" +"전 설정과 동일 하다는 것을 나타냅니다." -#: src/slic3r/GUI/Tab.cpp:3376 -msgid "LOCKED LOCK icon indicates that the value is the same as the system (or default) value." -msgstr "LOCKED LOCK 아이콘은 값이 시스템(또는 기본값) 값과 동일하다는 것을 나타냅니다." - -#: src/slic3r/GUI/Tab.cpp:3377 +#: src/slic3r/GUI/Tab.cpp:3260 msgid "" -"UNLOCKED LOCK icon indicates that the value was changed and is not equal to the system (or default) value.\n" +"BACK ARROW icon indicates that the settings were changed and are not equal " +"to the last saved preset for the current option group.\n" +"Click to reset all settings for the current option group to the last saved " +"preset." +msgstr "" +"BACK ARROW 이콘 설정을 변경 하 고 현재 옵션 그룹에 대 한 마지막 저장 된 프리" +"셋을 동일 하지 않습니다 나타냅니다.\n" +"마지막 현재 옵션 그룹에 대 한 모든 설정 다시 설정을 클릭 하 여 사전 설정을 저" +"장." + +#: src/slic3r/GUI/Tab.cpp:3266 +msgid "" +"LOCKED LOCK icon indicates that the value is the same as the system (or " +"default) value." +msgstr "" +"LOCKED LOCK 아이콘은 값이 시스템(또는 기본값) 값과 동일하다는 것을 나타냅니" +"다." + +#: src/slic3r/GUI/Tab.cpp:3267 +msgid "" +"UNLOCKED LOCK icon indicates that the value was changed and is not equal to " +"the system (or default) value.\n" "Click to reset current value to the system (or default) value." msgstr "" -"UNLOCKED LOCK 아이콘은 값이 변경되었으며 시스템(또는 기본값) 값과 같지 않음을 나타냅니다.\n" +"UNLOCKED LOCK 아이콘은 값이 변경되었으며 시스템(또는 기본값) 값과 같지 않음" +"을 나타냅니다.\n" "현재 값을 시스템(또는 기본값) 값으로 재설정하려면 클릭합니다." -#: src/slic3r/GUI/Tab.cpp:3383 -msgid "WHITE BULLET icon indicates that the value is the same as in the last saved preset." -msgstr "WHITE BULLET 기호 아이콘은 마지막으로 저장 한 사전 설정과 동일한 값을 나타냅니다." - -#: src/slic3r/GUI/Tab.cpp:3384 +#: src/slic3r/GUI/Tab.cpp:3273 msgid "" -"BACK ARROW icon indicates that the value was changed and is not equal to the last saved preset.\n" +"WHITE BULLET icon indicates that the value is the same as in the last saved " +"preset." +msgstr "" +"WHITE BULLET 기호 아이콘은 마지막으로 저장 한 사전 설정과 동일한 값을 나타냅" +"니다." + +#: src/slic3r/GUI/Tab.cpp:3274 +msgid "" +"BACK ARROW icon indicates that the value was changed and is not equal to the " +"last saved preset.\n" "Click to reset current value to the last saved preset." msgstr "" -"BACK ARROW 아이콘은 값이 변경되었으며 마지막으로 저장된 사전 설정과 같지 않음을 나타냅니다.\n" +"BACK ARROW 아이콘은 값이 변경되었으며 마지막으로 저장된 사전 설정과 같지 않음" +"을 나타냅니다.\n" "현재 값을 마지막으로 저장된 사전 설정으로 재설정하려면 클릭합니다." #. TRN Preset -#: src/slic3r/GUI/Tab.cpp:3497 +#: src/slic3r/GUI/Tab.cpp:3387 #, c-format msgid "Save %s as:" msgstr "Save %s as:" -#: src/slic3r/GUI/Tab.cpp:3541 +#: src/slic3r/GUI/Tab.cpp:3431 msgid "the following suffix is not allowed:" msgstr "다음 접미사는 허용되지 않습니다:" -#: src/slic3r/GUI/Tab.cpp:3545 +#: src/slic3r/GUI/Tab.cpp:3435 msgid "The supplied name is not available." msgstr "제공된 이름을 사용할 수 없습니다." -#: src/slic3r/GUI/Tab.cpp:3558 +#: src/slic3r/GUI/Tab.cpp:3448 src/slic3r/GUI/Tab.cpp:3450 msgid "Material" msgstr "재료" -#: src/slic3r/GUI/Tab.cpp:3560 src/slic3r/GUI/Tab.cpp:3651 -#: src/slic3r/GUI/wxExtensions.cpp:454 -msgid "Layers" -msgstr "레이어" - -#: src/slic3r/GUI/Tab.cpp:3564 -msgid "Exposure" -msgstr "노출" - -#: src/slic3r/GUI/Tab.cpp:3659 +#: src/slic3r/GUI/Tab.cpp:3580 msgid "Support head" msgstr "서포트 헤드" -#: src/slic3r/GUI/Tab.cpp:3664 +#: src/slic3r/GUI/Tab.cpp:3585 msgid "Support pillar" msgstr "서포트 기둥" -#: src/slic3r/GUI/Tab.cpp:3675 +#: src/slic3r/GUI/Tab.cpp:3599 msgid "Connection of the support sticks and junctions" msgstr "서포트 기둥 및 접합부 연결" -#: src/slic3r/GUI/Tab.cpp:3680 +#: src/slic3r/GUI/Tab.cpp:3604 msgid "Automatic generation" msgstr "자동 생성" -#: src/slic3r/GUI/Tab.cpp:3747 -msgid "Head penetration should not be greater than the head width." -msgstr "헤드 관통은 헤드 폭 보다 크지 않아야 합니다." - -#: src/slic3r/GUI/Tab.cpp:3751 -msgid "Invalid Head penetration" -msgstr "잘못된 헤드 관통" - -#: src/slic3r/GUI/Tab.cpp:3767 -msgid "Pinhead diameter should be smaller than the pillar diameter." -msgstr "핀헤드 지름은 기둥 지름 보다 작아야 합니다." - -#: src/slic3r/GUI/Tab.cpp:3771 -msgid "Invalid pinhead diameter" -msgstr "잘못된 핀 헤드 지름" - -#: src/slic3r/GUI/Tab.hpp:324 src/slic3r/GUI/Tab.hpp:422 +#: src/slic3r/GUI/Tab.hpp:327 src/slic3r/GUI/Tab.hpp:429 msgid "Print Settings" msgstr "출력 설정" -#: src/slic3r/GUI/Tab.hpp:348 +#: src/slic3r/GUI/Tab.hpp:354 msgid "Filament Settings" msgstr "필라멘트 설정" -#: src/slic3r/GUI/Tab.hpp:383 +#: src/slic3r/GUI/Tab.hpp:390 msgid "Printer Settings" msgstr "프린터 설정" -#: src/slic3r/GUI/Tab.hpp:407 +#: src/slic3r/GUI/Tab.hpp:414 msgid "Material Settings" msgstr "재질 설정" -#: src/slic3r/GUI/Tab.hpp:434 +#: src/slic3r/GUI/Tab.hpp:441 msgid "Save preset" msgstr "사전 설정 저장" @@ -4589,187 +5883,257 @@ msgstr "사용가능한 업데이트" msgid "New version of %s is available" msgstr "%s의 새 버전을 사용할 수 있습니다" -#: src/slic3r/GUI/UpdateDialogs.cpp:45 +#: src/slic3r/GUI/UpdateDialogs.cpp:43 msgid "Current version:" msgstr "현재 버전:" -#: src/slic3r/GUI/UpdateDialogs.cpp:47 +#: src/slic3r/GUI/UpdateDialogs.cpp:45 msgid "New version:" msgstr "새로운 버전:" -#: src/slic3r/GUI/UpdateDialogs.cpp:55 +#: src/slic3r/GUI/UpdateDialogs.cpp:53 msgid "Changelog && Download" msgstr "변경 로그 및 다운로드" -#: src/slic3r/GUI/UpdateDialogs.cpp:62 src/slic3r/GUI/UpdateDialogs.cpp:125 +#: src/slic3r/GUI/UpdateDialogs.cpp:60 src/slic3r/GUI/UpdateDialogs.cpp:125 +#: src/slic3r/GUI/UpdateDialogs.cpp:183 msgid "Open changelog page" msgstr "변경 로그 페이지 열기" -#: src/slic3r/GUI/UpdateDialogs.cpp:67 +#: src/slic3r/GUI/UpdateDialogs.cpp:65 msgid "Open download page" msgstr "다운로드 페이지 열기" -#: src/slic3r/GUI/UpdateDialogs.cpp:73 +#: src/slic3r/GUI/UpdateDialogs.cpp:71 msgid "Don't notify about new releases any more" msgstr "새로운 수정사항에 대해 더 이상 알림 안 함" -#: src/slic3r/GUI/UpdateDialogs.cpp:91 src/slic3r/GUI/UpdateDialogs.cpp:205 +#: src/slic3r/GUI/UpdateDialogs.cpp:89 src/slic3r/GUI/UpdateDialogs.cpp:266 msgid "Configuration update" msgstr "구성 업데이트" -#: src/slic3r/GUI/UpdateDialogs.cpp:91 +#: src/slic3r/GUI/UpdateDialogs.cpp:89 msgid "Configuration update is available" msgstr "구성 업데이트를 사용할 수 있음" -#: src/slic3r/GUI/UpdateDialogs.cpp:94 +#: src/slic3r/GUI/UpdateDialogs.cpp:92 msgid "" "Would you like to install it?\n" "\n" -"Note that a full configuration snapshot will be created first. It can then be restored at any time should there be a problem with the new version.\n" +"Note that a full configuration snapshot will be created first. It can then " +"be restored at any time should there be a problem with the new version.\n" "\n" "Updated configuration bundles:" msgstr "" "그것을 설치 하시겠습니까?\n" "\n" -"전체 구성 스냅 샷이 먼저 만들어집니다. 그런 다음 새 버전에 문제가있을 경우 언제든지 복원 할 수 있습니다.\n" +"전체 구성 스냅 샷이 먼저 만들어집니다. 그런 다음 새 버전에 문제가있을 경우 언" +"제든지 복원 할 수 있습니다.\n" "\n" "업데이트 된 구성 번들 :" -#: src/slic3r/GUI/UpdateDialogs.cpp:115 +#: src/slic3r/GUI/UpdateDialogs.cpp:113 src/slic3r/GUI/UpdateDialogs.cpp:173 msgid "Comment:" -msgstr "\"댓글\"" +msgstr "코멘트:" -#: src/slic3r/GUI/UpdateDialogs.cpp:149 +#: src/slic3r/GUI/UpdateDialogs.cpp:148 src/slic3r/GUI/UpdateDialogs.cpp:210 #, c-format msgid "%s incompatibility" msgstr "%s 비 호환성" -#: src/slic3r/GUI/UpdateDialogs.cpp:150 -#, c-format -msgid "%s configuration is incompatible" -msgstr "%s 과 호환되지 않습니다" +#: src/slic3r/GUI/UpdateDialogs.cpp:148 +msgid "Configuration update is necessary to install" +msgstr "설치하려면 구성 업데이트가 필요합니다." -#: src/slic3r/GUI/UpdateDialogs.cpp:155 +#: src/slic3r/GUI/UpdateDialogs.cpp:151 #, c-format msgid "" -"This version of %s is not compatible with currently installed configuration bundles.\n" -"This probably happened as a result of running an older %s after using a newer one.\n" +"%s will now start updates. Otherwise it won't be able to start.\n" "\n" -"You may either exit %s and try again with a newer version, or you may re-run the initial configuration. Doing so will create a backup snapshot of the existing configuration before installing files compatible with this %s.\n" +"Note that a full configuration snapshot will be created first. It can then " +"be restored at any time should there be a problem with the new version.\n" +"\n" +"Updated configuration bundles:" msgstr "" -"%s의 이 버전은 현재 설치 된 구성 번들과 호환 되지 않습니다.\n" -"이것은 새로운 것을 사용한 후 이전 %s를 실행 한 결과로 발생 했을 것입니다.\n" +"%s는 이제 업데이트를 시작합니다. 그렇지 않으면 시작할 수 없습니다.\n" "\n" -" %s를 종료하고 최신 버전으로 다시 시도 하거나 초기 구성을 다시 실행할 수 있습니다. 이렇게 하면 %s와 호환 되는 파일을 설치하기 전에 기존 구성의 백업 스냅샷이 생성 됩니다.\n" +"전체 구성 스냅숏이 먼저 만들어집니다. 그런 다음 새 버전에 문제가 있으면 언제" +"든지 복원 할 수 있습니다.\n" +"\n" +"업데이트된 구성 번들:" -#: src/slic3r/GUI/UpdateDialogs.cpp:164 -#, c-format -msgid "This %s version: %s" -msgstr "이 %s 버전: %s" - -#: src/slic3r/GUI/UpdateDialogs.cpp:169 -msgid "Incompatible bundles:" -msgstr "호환되지 않는 번들 :" - -#: src/slic3r/GUI/UpdateDialogs.cpp:185 +#: src/slic3r/GUI/UpdateDialogs.cpp:191 src/slic3r/GUI/UpdateDialogs.cpp:246 #, c-format msgid "Exit %s" msgstr "%s 종료" -#: src/slic3r/GUI/UpdateDialogs.cpp:188 +#: src/slic3r/GUI/UpdateDialogs.cpp:211 +#, c-format +msgid "%s configuration is incompatible" +msgstr "%s 과 호환되지 않습니다" + +#: src/slic3r/GUI/UpdateDialogs.cpp:216 +#, c-format +msgid "" +"This version of %s is not compatible with currently installed configuration " +"bundles.\n" +"This probably happened as a result of running an older %s after using a " +"newer one.\n" +"\n" +"You may either exit %s and try again with a newer version, or you may re-run " +"the initial configuration. Doing so will create a backup snapshot of the " +"existing configuration before installing files compatible with this %s." +msgstr "" +"%s의 이 버전은 현재 설치 된 구성 번들과 호환 되지 않습니다.\n" +"이것은 새로운 것을 사용한 후 이전 %s를 실행 한 결과로 발생 했을 것입니다.\n" +"\n" +" %s를 종료하고 최신 버전으로 다시 시도 하거나 초기 구성을 다시 실행할 수 있습" +"니다. 이렇게 하면 %s와 호환 되는 파일을 설치하기 전에 기존 구성의 백업 스냅샷" +"이 생성 됩니다." + +#: src/slic3r/GUI/UpdateDialogs.cpp:225 +#, c-format +msgid "This %s version: %s" +msgstr "이 %s 버전: %s" + +#: src/slic3r/GUI/UpdateDialogs.cpp:230 +msgid "Incompatible bundles:" +msgstr "호환되지 않는 번들 :" + +#: src/slic3r/GUI/UpdateDialogs.cpp:249 msgid "Re-configure" msgstr "재구성" -#: src/slic3r/GUI/UpdateDialogs.cpp:209 +#: src/slic3r/GUI/UpdateDialogs.cpp:270 #, c-format msgid "" "%s now uses an updated configuration structure.\n" "\n" -"So called 'System presets' have been introduced, which hold the built-in default settings for various printers. These System presets cannot be modified, instead, users now may create their own presets inheriting settings from one of the System presets.\n" -"An inheriting preset may either inherit a particular value from its parent or override it with a customized value.\n" +"So called 'System presets' have been introduced, which hold the built-in " +"default settings for various printers. These System presets cannot be " +"modified, instead, users now may create their own presets inheriting " +"settings from one of the System presets.\n" +"An inheriting preset may either inherit a particular value from its parent " +"or override it with a customized value.\n" "\n" -"Please proceed with the %s that follows to set up the new presets and to choose whether to enable automatic preset updates." +"Please proceed with the %s that follows to set up the new presets and to " +"choose whether to enable automatic preset updates." msgstr "" "%s이 (가) 이제 업데이트 된 구성 구조를 사용 합니다.\n" "\n" -"'시스템 프리셋 '이 도입 되었습니다, 다양한 프린터에 대한 기본 설정을 내장. 이러한 시스템 프리셋은 수정할 수 없으며, 사용자는 이제 시스템 프리셋 중 하나에서 설정을 상속하는 자신만의 프리셋을 생성할 수 있습니다.\n" -"상속하는 사전 설정은 해당 기본 설정에서 특정 값을 상속 하거나 사용자 지정 된 값으로 재정의할 수 있습니다.\n" +"'시스템 프리셋 '이 도입 되었습니다, 다양한 프린터에 대한 기본 설정을 내장. 이" +"러한 시스템 프리셋은 수정할 수 없으며, 사용자는 이제 시스템 프리셋 중 하나에" +"서 설정을 상속하는 자신만의 프리셋을 생성할 수 있습니다.\n" +"상속하는 사전 설정은 해당 기본 설정에서 특정 값을 상속 하거나 사용자 지정 된 " +"값으로 재정의할 수 있습니다.\n" "\n" -"다음의 %s를 계속 진행하여 새 프리셋을 설정하고 자동 프리셋 업데이트를 사용할지 여부를 선택하십시오." +"다음의 %s를 계속 진행하여 새 프리셋을 설정하고 자동 프리셋 업데이트를 사용할" +"지 여부를 선택하십시오." -#: src/slic3r/GUI/UpdateDialogs.cpp:225 +#: src/slic3r/GUI/UpdateDialogs.cpp:286 msgid "For more information please visit our wiki page:" msgstr "자세한 정보는 위키 페이지를 참조하십시오 :" -#: src/slic3r/GUI/WipeTowerDialog.cpp:14 +#: src/slic3r/GUI/UpdateDialogs.cpp:303 +msgid "Configuration updates" +msgstr "구성 업데이트" + +#: src/slic3r/GUI/UpdateDialogs.cpp:303 +msgid "No updates aviable" +msgstr "실행 가능한 업데이트없음" + +#: src/slic3r/GUI/UpdateDialogs.cpp:308 +#, c-format +msgid "%s has no configuration updates aviable." +msgstr "%s에는 구성 업데이트가 실행 가능한 업데이트가 없습니다." + +#: src/slic3r/GUI/WipeTowerDialog.cpp:15 msgid "Ramming customization" msgstr "사용자 정의 다지기(Ramming)" -#: src/slic3r/GUI/WipeTowerDialog.cpp:40 +#: src/slic3r/GUI/WipeTowerDialog.cpp:41 msgid "" -"Ramming denotes the rapid extrusion just before a tool change in a single-extruder MM printer. Its purpose is to properly shape the end of the unloaded filament so it does not prevent insertion of the new filament and can itself be reinserted later. This phase is important and different materials can require different extrusion speeds to get the good shape. For this reason, the extrusion rates during ramming are adjustable.\n" +"Ramming denotes the rapid extrusion just before a tool change in a single-" +"extruder MM printer. Its purpose is to properly shape the end of the " +"unloaded filament so it does not prevent insertion of the new filament and " +"can itself be reinserted later. This phase is important and different " +"materials can require different extrusion speeds to get the good shape. For " +"this reason, the extrusion rates during ramming are adjustable.\n" "\n" -"This is an expert-level setting, incorrect adjustment will likely lead to jams, extruder wheel grinding into filament etc." +"This is an expert-level setting, incorrect adjustment will likely lead to " +"jams, extruder wheel grinding into filament etc." msgstr "" -"래밍은 단일 압출기 MMU 프린터에서 공구 교환 직전의 신속한 압출을 나타냅니다. 그 목적은 언로드 된 필라멘트의 끝 부분을 적절히 형성하여 새로운 필라멘트의 삽입을 방지하고 나중에 다시 삽입 할 수 있도록하기위한 것입니다. 이 단계는 중요하며 다른 재료는 좋은 모양을 얻기 위해 다른 압출 속도를 요구할 수 있습니다. 이러한 이유로, 래밍 중 압출 속도는 조정 가능합니다.\n" +"래밍은 단일 압출기 MMU 프린터에서 공구 교환 직전의 신속한 압출을 나타냅니다. " +"그 목적은 언로드 된 필라멘트의 끝 부분을 적절히 형성하여 새로운 필라멘트의 삽" +"입을 방지하고 나중에 다시 삽입 할 수 있도록하기위한 것입니다. 이 단계는 중요" +"하며 다른 재료는 좋은 모양을 얻기 위해 다른 압출 속도를 요구할 수 있습니다. " +"이러한 이유로, 래밍 중 압출 속도는 조정 가능합니다.\n" "\n" -"전문가 수준의 설정이므로 잘못된 조정으로 인해 용지 걸림, 압출기 휠이 필라멘트 등에 연삭 될 수 있습니다." +"전문가 수준의 설정이므로 잘못된 조정으로 인해 용지 걸림, 압출기 휠이 필라멘" +"트 등에 연삭 될 수 있습니다." -#: src/slic3r/GUI/WipeTowerDialog.cpp:82 +#: src/slic3r/GUI/WipeTowerDialog.cpp:83 msgid "Total ramming time" msgstr "총 래밍 시간" -#: src/slic3r/GUI/WipeTowerDialog.cpp:84 +#: src/slic3r/GUI/WipeTowerDialog.cpp:85 msgid "Total rammed volume" msgstr "총 레미드 양" -#: src/slic3r/GUI/WipeTowerDialog.cpp:88 +#: src/slic3r/GUI/WipeTowerDialog.cpp:89 msgid "Ramming line width" msgstr "래밍 선 너비" -#: src/slic3r/GUI/WipeTowerDialog.cpp:90 +#: src/slic3r/GUI/WipeTowerDialog.cpp:91 msgid "Ramming line spacing" msgstr "래밍 선 간격" -#: src/slic3r/GUI/WipeTowerDialog.cpp:141 +#: src/slic3r/GUI/WipeTowerDialog.cpp:142 msgid "Wipe tower - Purging volume adjustment" msgstr "와이프 타워 - 버려진 필라멘트 조절" -#: src/slic3r/GUI/WipeTowerDialog.cpp:225 -msgid "Here you can adjust required purging volume (mm³) for any given pair of tools." +#: src/slic3r/GUI/WipeTowerDialog.cpp:254 +msgid "" +"Here you can adjust required purging volume (mm³) for any given pair of " +"tools." msgstr "여기서 주어진 도구 쌍에 필요한 정화 용량 (mm³)을 조정할 수 있습니다." -#: src/slic3r/GUI/WipeTowerDialog.cpp:226 +#: src/slic3r/GUI/WipeTowerDialog.cpp:255 msgid "Extruder changed to" msgstr "익스트루더 번경" -#: src/slic3r/GUI/WipeTowerDialog.cpp:234 +#: src/slic3r/GUI/WipeTowerDialog.cpp:263 msgid "unloaded" msgstr "언로드(unloaded)" -#: src/slic3r/GUI/WipeTowerDialog.cpp:235 +#: src/slic3r/GUI/WipeTowerDialog.cpp:264 msgid "loaded" msgstr "로드(loaded)" -#: src/slic3r/GUI/WipeTowerDialog.cpp:240 +#: src/slic3r/GUI/WipeTowerDialog.cpp:276 msgid "Tool #" msgstr "도구(Tool) #" -#: src/slic3r/GUI/WipeTowerDialog.cpp:247 -msgid "Total purging volume is calculated by summing two values below, depending on which tools are loaded/unloaded." -msgstr "총 정화 량은 어느 공구가로드 / 언로드되는지에 따라 아래의 두 값을 합산하여 계산됩니다." +#: src/slic3r/GUI/WipeTowerDialog.cpp:285 +msgid "" +"Total purging volume is calculated by summing two values below, depending on " +"which tools are loaded/unloaded." +msgstr "" +"총 정화 량은 어느 공구가로드 / 언로드되는지에 따라 아래의 두 값을 합산하여 계" +"산됩니다." -#: src/slic3r/GUI/WipeTowerDialog.cpp:248 +#: src/slic3r/GUI/WipeTowerDialog.cpp:286 msgid "Volume to purge (mm³) when the filament is being" msgstr "제거할 필라멘트 양 (mm³)" -#: src/slic3r/GUI/WipeTowerDialog.cpp:262 +#: src/slic3r/GUI/WipeTowerDialog.cpp:300 msgid "From" msgstr "From" -#: src/slic3r/GUI/WipeTowerDialog.cpp:327 +#: src/slic3r/GUI/WipeTowerDialog.cpp:365 msgid "" -"Switching to simple settings will discard changes done in the advanced mode!\n" +"Switching to simple settings will discard changes done in the advanced " +"mode!\n" "\n" "Do you want to proceed?" msgstr "" @@ -4777,108 +6141,62 @@ msgstr "" "\n" "계속하시겠습니까?" -#: src/slic3r/GUI/WipeTowerDialog.cpp:339 +#: src/slic3r/GUI/WipeTowerDialog.cpp:377 msgid "Show simplified settings" msgstr "간단한 설정보기" -#: src/slic3r/GUI/WipeTowerDialog.cpp:339 +#: src/slic3r/GUI/WipeTowerDialog.cpp:377 msgid "Show advanced settings" msgstr "고급 설정보기" -#: src/slic3r/GUI/wxExtensions.cpp:443 -msgid "Instances" -msgstr "복제본" - -#: src/slic3r/GUI/wxExtensions.cpp:447 src/slic3r/GUI/wxExtensions.cpp:592 -#, c-format -msgid "Instance %d" -msgstr "복제본 %d" - -#: src/slic3r/GUI/wxExtensions.cpp:486 -msgid "Range" -msgstr "범위" - -#: src/slic3r/GUI/wxExtensions.cpp:2570 -msgid "One layer mode" -msgstr "하나의 레이어 모드" - -#: src/slic3r/GUI/wxExtensions.cpp:2571 -msgid "Add/Del color change" -msgstr "현재 레이어의 색상 변경 마커 추가" - -#: src/slic3r/GUI/wxExtensions.cpp:2572 -msgid "Discard all color changes" -msgstr "모든 색상 변경 무시" - -#: src/slic3r/GUI/wxExtensions.cpp:2832 +#: src/slic3r/GUI/wxExtensions.cpp:680 #, c-format msgid "Switch to the %s mode" msgstr "%s 모드로 전환" -#: src/slic3r/GUI/wxExtensions.cpp:2833 +#: src/slic3r/GUI/wxExtensions.cpp:681 #, c-format msgid "Current mode is %s" msgstr "현재 모드는 %s입니다" -#: src/slic3r/Utils/Duet.cpp:51 -msgid "Connection to Duet works correctly." -msgstr "듀엣보드에 대한 연결이 올바르게 작동 합니다." - -#: src/slic3r/Utils/Duet.cpp:56 -msgid "Could not connect to Duet" -msgstr "듀엣보드에 연결할 수 없습니다" - -#: src/slic3r/Utils/Duet.cpp:84 src/slic3r/Utils/Duet.cpp:154 -msgid "Unknown error occured" -msgstr "알 수 없는 오류가 발생 했습니다" - -#: src/slic3r/Utils/Duet.cpp:148 -msgid "Wrong password" -msgstr "잘못된 암호" - -#: src/slic3r/Utils/Duet.cpp:151 -msgid "Could not get resources to create a new connection" -msgstr "새 연결을 만들 리소스를 가져올수 없습니다" - -#: src/slic3r/Utils/OctoPrint.cpp:69 +#: src/slic3r/Utils/AstroBox.cpp:68 src/slic3r/Utils/OctoPrint.cpp:68 #, c-format msgid "Mismatched type of print host: %s" msgstr "일치 하지않는 인쇄 호스트 유형: %s" -#: src/slic3r/Utils/OctoPrint.cpp:84 -msgid "Connection to OctoPrint works correctly." -msgstr "OctoPrint에 연결하면 올바르게 작동합니다." +#: src/slic3r/Utils/AstroBox.cpp:83 +msgid "Connection to AstroBox works correctly." +msgstr "아스트로박스에 대한 연결이 올바르게 작동합니다." -#: src/slic3r/Utils/OctoPrint.cpp:90 -msgid "Could not connect to OctoPrint" -msgstr "OctoPrint에 연결할 수 없습니다" +#: src/slic3r/Utils/AstroBox.cpp:89 +msgid "Could not connect to AstroBox" +msgstr "아스트로박스에 연결할 수 없습니다." -#: src/slic3r/Utils/OctoPrint.cpp:90 -msgid "Note: OctoPrint version at least 1.1.0 is required." -msgstr "참고 : OctoPrint 버전 1.1.0 이상이 필요합니다." +#: src/slic3r/Utils/AstroBox.cpp:89 +msgid "Note: AstroBox version at least 1.1.0 is required." +msgstr "참고: 아스트로박스 버전은 최소 1.1.0이 필요합니다." -#: src/slic3r/Utils/OctoPrint.cpp:195 -msgid "Connection to Prusa SL1 works correctly." -msgstr "Prusa SL1에 대한 연결이 제대로 작동 합니다." +#: src/slic3r/Utils/Duet.cpp:49 +msgid "Connection to Duet works correctly." +msgstr "듀엣보드에 대한 연결이 올바르게 작동 합니다." -#: src/slic3r/Utils/OctoPrint.cpp:200 -msgid "Could not connect to Prusa SLA" -msgstr "Prusa SLA에 연결할 수 없습니다" +#: src/slic3r/Utils/Duet.cpp:54 +msgid "Could not connect to Duet" +msgstr "듀엣보드에 연결할 수 없습니다" -#: src/slic3r/Utils/PresetUpdater.cpp:614 -#, c-format -msgid "requires min. %s and max. %s" -msgstr "최소. %s 와 최대. %s" +#: src/slic3r/Utils/Duet.cpp:82 src/slic3r/Utils/Duet.cpp:137 +#: src/slic3r/Utils/FlashAir.cpp:119 src/slic3r/Utils/FlashAir.cpp:140 +#: src/slic3r/Utils/FlashAir.cpp:156 +msgid "Unknown error occured" +msgstr "알 수 없는 오류가 발생 했습니다" -#: src/slic3r/Utils/PresetUpdater.cpp:619 -#, c-format -msgid "requires min. %s" -msgstr "최소 %s가 필요 합니다" +#: src/slic3r/Utils/Duet.cpp:131 +msgid "Wrong password" +msgstr "잘못된 암호" -#: src/slic3r/Utils/PresetUpdater.cpp:621 -#, c-format -msgid "requires max. %s" -msgstr "최대 필요 합니다. %s" +#: src/slic3r/Utils/Duet.cpp:134 +msgid "Could not get resources to create a new connection" +msgstr "새 연결을 만들 리소스를 가져올수 없습니다" #: src/slic3r/Utils/FixModelByWin10.cpp:219 #: src/slic3r/Utils/FixModelByWin10.cpp:359 @@ -4898,7 +6216,7 @@ msgid "Mesh repair failed." msgstr "메쉬 복구에 실패 했습니다." #: src/slic3r/Utils/FixModelByWin10.cpp:251 -#: src/slic3r/Utils/FixModelByWin10.cpp:378 +#: src/slic3r/Utils/FixModelByWin10.cpp:385 msgid "Loading repaired model" msgstr "복구 된 모델 로드" @@ -4916,50 +6234,110 @@ msgstr "모델 고정" msgid "Exporting model..." msgstr "소스 모델 내보내기..." -#: src/slic3r/Utils/FixModelByWin10.cpp:368 +#: src/slic3r/Utils/FixModelByWin10.cpp:369 +#: src/slic3r/Utils/FixModelByWin10.cpp:374 msgid "Export of a temporary 3mf file failed" msgstr "임시 3mf 파일을 내보내지 못했습니다" -#: src/slic3r/Utils/FixModelByWin10.cpp:383 +#: src/slic3r/Utils/FixModelByWin10.cpp:390 msgid "Import of the repaired 3mf file failed" msgstr "복구된 3mf 파일을 가져오지 못했습니다" -#: src/slic3r/Utils/FixModelByWin10.cpp:385 +#: src/slic3r/Utils/FixModelByWin10.cpp:392 msgid "Repaired 3MF file does not contain any object" msgstr "복구된 3MF 파일에 객체(object)가 포함 되어있지 않습니다" -#: src/slic3r/Utils/FixModelByWin10.cpp:387 +#: src/slic3r/Utils/FixModelByWin10.cpp:394 msgid "Repaired 3MF file contains more than one object" msgstr "복구된 3MF 파일에 둘 이상의 객체(object)가 포함되어 있습니다" -#: src/slic3r/Utils/FixModelByWin10.cpp:389 +#: src/slic3r/Utils/FixModelByWin10.cpp:396 msgid "Repaired 3MF file does not contain any volume" msgstr "복구 된 3MF 파일에 객체(object)가 포함 되어있지 않습니다" -#: src/slic3r/Utils/FixModelByWin10.cpp:391 +#: src/slic3r/Utils/FixModelByWin10.cpp:398 msgid "Repaired 3MF file contains more than one volume" msgstr "복구된 3MF 파일에 둘 이상의 객체(object)가 포함되어 있습니다" -#: src/slic3r/Utils/FixModelByWin10.cpp:400 +#: src/slic3r/Utils/FixModelByWin10.cpp:407 msgid "Model repair finished" msgstr "모델 수리 완료" -#: src/slic3r/Utils/FixModelByWin10.cpp:406 +#: src/slic3r/Utils/FixModelByWin10.cpp:413 msgid "Model repair canceled" msgstr "모델 복구가 취소 되었습니다" -#: src/slic3r/Utils/FixModelByWin10.cpp:423 +#: src/slic3r/Utils/FixModelByWin10.cpp:430 msgid "Model repaired successfully" msgstr "모델이 성공적으로 복구 되었습니다" -#: src/slic3r/Utils/FixModelByWin10.cpp:423 -#: src/slic3r/Utils/FixModelByWin10.cpp:426 +#: src/slic3r/Utils/FixModelByWin10.cpp:430 +#: src/slic3r/Utils/FixModelByWin10.cpp:433 msgid "Model Repair by the Netfabb service" msgstr "Netfabb 서비스에의 한 모델 복구" -#: src/slic3r/Utils/FixModelByWin10.cpp:426 -msgid "Model repair failed: \n" -msgstr "모델 복구 실패:\n" +#: src/slic3r/Utils/FixModelByWin10.cpp:433 +msgid "Model repair failed:" +msgstr "모델 복구 실패:" + +#: src/slic3r/Utils/FlashAir.cpp:58 +msgid "Upload not enabled on FlashAir card." +msgstr "FlashAir 카드에서 업로드가 활성화되지 않았습니다." + +#: src/slic3r/Utils/FlashAir.cpp:68 +msgid "Connection to FlashAir works correctly and upload is enabled." +msgstr "FlashAir에 대한 연결이 올바르게 작동하고 업로드가 활성화되어 있습니다." + +#: src/slic3r/Utils/FlashAir.cpp:73 +msgid "Could not connect to FlashAir" +msgstr "플래시 에어에 연결할 수 없습니다." + +#: src/slic3r/Utils/FlashAir.cpp:73 +msgid "" +"Note: FlashAir with firmware 2.00.02 or newer and activated upload function " +"is required." +msgstr "" +"참고 : 펌웨어 2.00.02 이상 및 활성화 된 업로드 기능이있는 FlashAir가 필요합니" +"다." + +#: src/slic3r/Utils/OctoPrint.cpp:83 +msgid "Connection to OctoPrint works correctly." +msgstr "OctoPrint에 연결하면 올바르게 작동합니다." + +#: src/slic3r/Utils/OctoPrint.cpp:89 +msgid "Could not connect to OctoPrint" +msgstr "OctoPrint에 연결할 수 없습니다" + +#: src/slic3r/Utils/OctoPrint.cpp:89 +msgid "Note: OctoPrint version at least 1.1.0 is required." +msgstr "참고 : OctoPrint 버전 1.1.0 이상이 필요합니다." + +#: src/slic3r/Utils/OctoPrint.cpp:176 +msgid "Connection to Prusa SL1 works correctly." +msgstr "Prusa SL1에 대한 연결이 제대로 작동 합니다." + +#: src/slic3r/Utils/OctoPrint.cpp:181 +msgid "Could not connect to Prusa SLA" +msgstr "Prusa SLA에 연결할 수 없습니다" + +#: src/slic3r/Utils/PresetUpdater.cpp:705 +#, c-format +msgid "requires min. %s and max. %s" +msgstr "최소. %s 와 최대. %s" + +#: src/slic3r/Utils/PresetUpdater.cpp:710 +#, c-format +msgid "requires min. %s" +msgstr "최소 %s가 필요 합니다" + +#: src/slic3r/Utils/PresetUpdater.cpp:713 +#, c-format +msgid "requires max. %s" +msgstr "최대 필요 합니다. %s" + +#: src/libslic3r/SLA/Pad.cpp:691 +msgid "Pad brim size is too small for the current configuration." +msgstr "패드 테두리 크기가 현재 구성에 너무 작습니다." #: src/libslic3r/Zipper.cpp:32 msgid "undefined error" @@ -5071,7 +6449,7 @@ msgstr "내부 오류" #: src/libslic3r/Zipper.cpp:86 msgid "file not found" -msgstr "파일을 찾을수 없다" +msgstr "파일을 찾을 수 없습니다." #: src/libslic3r/Zipper.cpp:88 msgid "archive is too large" @@ -5089,162 +6467,331 @@ msgstr "쓰기 다시 실패" msgid "Error with zip archive" msgstr "zip 아카이브와 오류가 발생 했습니다" -#: src/libslic3r/Print.cpp:1093 +#: src/libslic3r/GCode.cpp:637 +msgid "Empty layers detected, the output would not be printable." +msgstr "빈 레이어가 감지되면 출력을 인쇄할 수 없습니다." + +#: src/libslic3r/GCode.cpp:638 +msgid "Print z" +msgstr "인쇄 z" + +#: src/libslic3r/GCode.cpp:639 +msgid "" +"This is usually caused by negligibly small extrusions or by a faulty model. " +"Try to repair the model or change its orientation on the bed." +msgstr "" +"이는 일반적으로 무시할 수 있는 작은 돌출 또는 결함이 있는 모델에 의해 발생합" +"니다. 모델을 수리하거나 배드에서 방향을 변경하십시오." + +#: src/libslic3r/ExtrusionEntity.cpp:323 +msgid "Mixed" +msgstr "혼합" + +#: src/libslic3r/Flow.cpp:55 +msgid "" +"Cannot calculate extrusion width for %1%: Variable \"%2%\" not accessible." +msgstr "" +"%1%에 대한 압출 폭을 계산할 수 없습니다: 변수 \"%2%\"에 액세스할 수 없습니다." + +#: src/libslic3r/Format/3mf.cpp:1630 +msgid "" +"The selected 3mf file has been saved with a newer version of %1% and is not " +"compatible." +msgstr "선택한 3mf 파일은 %1%의 최신 버전으로 저장되었으며 호환되지 않습니다." + +#: src/libslic3r/Format/AMF.cpp:934 +msgid "" +"The selected amf file has been saved with a newer version of %1% and is not " +"compatible." +msgstr "선택한 amf 파일은 %1%의 최신 버전으로 저장되었으며 호환되지 않습니다." + +#: src/libslic3r/Print.cpp:1158 msgid "All objects are outside of the print volume." msgstr "모든 객체(object)가 인쇄 볼륨 외부에 있습니다." -#: src/libslic3r/Print.cpp:1120 -msgid "Some objects are too close; your extruder will collide with them." -msgstr "일부 객체(object)가 너무 가깝습니다. 귀하의 압출기가 그들과 충돌합니다." - -#: src/libslic3r/Print.cpp:1135 -msgid "Some objects are too tall and cannot be printed without extruder collisions." -msgstr "일부 객체(object)는 너무 크고 익스트루더 충돌없이 인쇄 할 수 없습니다." - -#: src/libslic3r/Print.cpp:1145 -msgid "The Spiral Vase option can only be used when printing a single object." -msgstr "나선형 꽃병(Spiral Vase) 옵션은 단일 객체(object)를 인쇄 할 때만 사용할 수 있습니다." - -#: src/libslic3r/Print.cpp:1147 -msgid "The Spiral Vase option can only be used when printing single material objects." -msgstr "나선형 꽃병 옵션(Spiral Vase)은 단일 재료 객체(object)를 인쇄 할 때만 사용할 수 있습니다." - -#: src/libslic3r/Print.cpp:1155 -msgid "The wipe tower is only supported if all extruders have the same nozzle diameter and use filaments of the same diameter." -msgstr "모든 압출기 의 노즐 직경이 동일하고 동일한 직경의 필라멘트를 사용하는 경우에만 와이프 타워가 지원됩니다." - -#: src/libslic3r/Print.cpp:1159 -msgid "The Wipe Tower is currently only supported for the Marlin, RepRap/Sprinter and Repetier G-code flavors." -msgstr "와이프 타워는 현재 말린, RepRap/Sprinter 및 리피티어에 대해서만 G-코드지원 됩니다." - #: src/libslic3r/Print.cpp:1161 -msgid "The Wipe Tower is currently only supported with the relative extruder addressing (use_relative_e_distances=1)." -msgstr "와이프 타워는 현재 상대적 압출기 어드레싱 (use_relative_e_distances = 1)에서만 지원됩니다." - -#: src/libslic3r/Print.cpp:1165 -msgid "All extruders must have the same diameter for the Wipe Tower." -msgstr "모든 압출기는 와이프 타워의 지름이 같아야 합니다." - -#: src/libslic3r/Print.cpp:1186 -msgid "The Wipe Tower is only supported for multiple objects if they have equal layer heights" -msgstr "와이프 타워 (Wipe Tower)는 같은 레이어 높이에 경우 여러 객체(object)에 대해서만 지원됩니다" - -#: src/libslic3r/Print.cpp:1188 -msgid "The Wipe Tower is only supported for multiple objects if they are printed over an equal number of raft layers" -msgstr "와이프 타워는 같은 수의 라프트 레이어 위에 인쇄 된 경우 여러 객체(object)에 대해서만 지원됩니다" - -#: src/libslic3r/Print.cpp:1190 -msgid "The Wipe Tower is only supported for multiple objects if they are printed with the same support_material_contact_distance" -msgstr "와이프 타워는 동일한 support_material_contact_distance로 인쇄 된 경우 여러 객체(object)에 대해서만 지원됩니다" - -#: src/libslic3r/Print.cpp:1192 -msgid "The Wipe Tower is only supported for multiple objects if they are sliced equally." -msgstr "와이프 타워는 똑같이 슬라이스 된 경우 여러 객체(object)에 대해서만 지원됩니다." - -#: src/libslic3r/Print.cpp:1220 -msgid "The Wipe tower is only supported if all objects have the same layer height profile" -msgstr "모든 객체(object)의 레이어 높이 프로필이 동일한 경우에만 와이프 타워가 지원됩니다" - -#: src/libslic3r/Print.cpp:1230 msgid "The supplied settings will cause an empty print." msgstr "제공된 설정으로 인해 빈 인쇄가 발생합니다." -#: src/libslic3r/Print.cpp:1247 -msgid "One or more object were assigned an extruder that the printer does not have." +#: src/libslic3r/Print.cpp:1188 +msgid "Some objects are too close; your extruder will collide with them." +msgstr "" +"일부 객체(object)가 너무 가깝습니다. 귀하의 압출기가 그들과 충돌합니다." + +#: src/libslic3r/Print.cpp:1203 +msgid "" +"Some objects are too tall and cannot be printed without extruder collisions." +msgstr "일부 객체(object)는 너무 크고 익스트루더 충돌없이 인쇄 할 수 없습니다." + +#: src/libslic3r/Print.cpp:1213 +msgid "The Spiral Vase option can only be used when printing a single object." +msgstr "" +"나선형 꽃병(Spiral Vase) 옵션은 단일 객체(object)를 인쇄 할 때만 사용할 수 있" +"습니다." + +#: src/libslic3r/Print.cpp:1220 +msgid "" +"The Spiral Vase option can only be used when printing single material " +"objects." +msgstr "" +"나선형 꽃병 옵션(Spiral Vase)은 단일 재료 객체(object)를 인쇄 할 때만 사용할 " +"수 있습니다." + +#: src/libslic3r/Print.cpp:1233 +msgid "" +"The wipe tower is only supported if all extruders have the same nozzle " +"diameter and use filaments of the same diameter." +msgstr "" +"모든 압출기 의 노즐 직경이 동일하고 동일한 직경의 필라멘트를 사용하는 경우에" +"만 와이프 타워가 지원됩니다." + +#: src/libslic3r/Print.cpp:1238 +msgid "" +"The Wipe Tower is currently only supported for the Marlin, RepRap/Sprinter " +"and Repetier G-code flavors." +msgstr "" +"와이프 타워는 현재 말린, RepRap/Sprinter 및 리피티어에 대해서만 G-code지원 됩" +"니다." + +#: src/libslic3r/Print.cpp:1240 +msgid "" +"The Wipe Tower is currently only supported with the relative extruder " +"addressing (use_relative_e_distances=1)." +msgstr "" +"와이프 타워는 현재 상대적 압출기 어드레싱 (use_relative_e_distances = 1)에서" +"만 지원됩니다." + +#: src/libslic3r/Print.cpp:1242 +msgid "Ooze prevention is currently not supported with the wipe tower enabled." +msgstr "" +"현재 와이프 타워를 사용하도록 설정되어 있는 경우 스모즈 방지 기능이 지원되지 " +"않습니다." + +#: src/libslic3r/Print.cpp:1244 +msgid "" +"The Wipe Tower currently does not support volumetric E (use_volumetric_e=0)." +msgstr "와이프 타워는 현재 볼륨 E(use_volumetric_e=0)를 지원하지 않습니다." + +#: src/libslic3r/Print.cpp:1246 +msgid "" +"The Wipe Tower is currently not supported for multimaterial sequential " +"prints." +msgstr "와이프 타워는 현재 다중 재질 순차 인쇄에 지원되지 않습니다." + +#: src/libslic3r/Print.cpp:1267 +msgid "" +"The Wipe Tower is only supported for multiple objects if they have equal " +"layer heights" +msgstr "" +"와이프 타워 (Wipe Tower)는 같은 레이어 높이에 경우 여러 객체(object)에 대해서" +"만 지원됩니다" + +#: src/libslic3r/Print.cpp:1269 +msgid "" +"The Wipe Tower is only supported for multiple objects if they are printed " +"over an equal number of raft layers" +msgstr "" +"와이프 타워는 같은 수의 라프트 레이어 위에 인쇄 된 경우 여러 객체(object)에 " +"대해서만 지원됩니다" + +#: src/libslic3r/Print.cpp:1271 +msgid "" +"The Wipe Tower is only supported for multiple objects if they are printed " +"with the same support_material_contact_distance" +msgstr "" +"와이프 타워는 동일한 support_material_contact_distance로 인쇄 된 경우 여러 객" +"체(object)에 대해서만 지원됩니다" + +#: src/libslic3r/Print.cpp:1273 +msgid "" +"The Wipe Tower is only supported for multiple objects if they are sliced " +"equally." +msgstr "" +"와이프 타워는 똑같이 슬라이스 된 경우 여러 객체(object)에 대해서만 지원됩니" +"다." + +#: src/libslic3r/Print.cpp:1315 +msgid "" +"The Wipe tower is only supported if all objects have the same variable layer " +"height" +msgstr "" +"모든 오브젝트의 가변 레이어 높이가 같은 경우에만 지우기 타워가 지원됩니다." + +#: src/libslic3r/Print.cpp:1341 +msgid "" +"One or more object were assigned an extruder that the printer does not have." msgstr "하나 이상의 객체(object)에 프린터에없는 압출기가 지정되었습니다." -#: src/libslic3r/Print.cpp:1256 -msgid "Printing with multiple extruders of differing nozzle diameters. If support is to be printed with the current extruder (support_material_extruder == 0 or support_material_interface_extruder == 0), all nozzles have to be of the same diameter." -msgstr "노즐 지름이 다른 여러 압출기로 인쇄. 지원이 현재 압출기 (support_material_extruder == 0 또는 support_material_interface_extruder == 0)로 인쇄되는 경우 모든 노즐은 동일한 지름이어야합니다." +#: src/libslic3r/Print.cpp:1350 +msgid "%1%=%2% mm is too low to be printable at a layer height %3% mm" +msgstr "%1%=%2% mm가 너무 낮아 레이어 높이 %3% mm에서 인쇄할 수 없습니다." -#: src/libslic3r/Print.cpp:1264 -msgid "For the Wipe Tower to work with the soluble supports, the support layers need to be synchronized with the object layers." -msgstr "와이프 타워가 가용성 지지체와 함께 작동 하려면 서포트 레이어를 객체(object) 레이어와 동기화 해야 합니다." +#: src/libslic3r/Print.cpp:1353 +msgid "Excessive %1%=%2% mm to be printable with a nozzle diameter %3% mm" +msgstr "노즐 직경 %3% mm로 인쇄할 수 있는 과도한 %1%=%2% mm" -#: src/libslic3r/Print.cpp:1268 -msgid "The Wipe Tower currently supports the non-soluble supports only if they are printed with the current extruder without triggering a tool change. (both support_material_extruder and support_material_interface_extruder need to be set to 0)." -msgstr "와이프 타워는 현재 공구 교체를 트리거하지 않고 현재의 압출기로 인쇄 하는 경우에만 비가용성 서포트를 지원 합니다. (support_material_extruder과 support_material_interface_extruder 모두 0으로 설정 해야 합니다.)" +#: src/libslic3r/Print.cpp:1364 +msgid "" +"Printing with multiple extruders of differing nozzle diameters. If support " +"is to be printed with the current extruder (support_material_extruder == 0 " +"or support_material_interface_extruder == 0), all nozzles have to be of the " +"same diameter." +msgstr "" +"노즐 지름이 다른 여러 압출기로 인쇄. 지원이 현재 압출기 " +"(support_material_extruder == 0 또는 support_material_interface_extruder == " +"0)로 인쇄되는 경우 모든 노즐은 동일한 지름이어야합니다." -#: src/libslic3r/Print.cpp:1290 +#: src/libslic3r/Print.cpp:1372 +msgid "" +"For the Wipe Tower to work with the soluble supports, the support layers " +"need to be synchronized with the object layers." +msgstr "" +"와이프 타워가 가용성 지지체와 함께 작동 하려면 서포트 레이어를 객체(object) " +"레이어와 동기화 해야 합니다." + +#: src/libslic3r/Print.cpp:1376 +msgid "" +"The Wipe Tower currently supports the non-soluble supports only if they are " +"printed with the current extruder without triggering a tool change. (both " +"support_material_extruder and support_material_interface_extruder need to be " +"set to 0)." +msgstr "" +"와이프 타워는 현재 공구 교체를 트리거하지 않고 현재의 압출기로 인쇄 하는 경우" +"에만 비가용성 서포트를 지원 합니다. (support_material_extruder과 " +"support_material_interface_extruder 모두 0으로 설정 해야 합니다.)" + +#: src/libslic3r/Print.cpp:1398 msgid "First layer height can't be greater than nozzle diameter" msgstr "첫번째 레이어 높이는 노즐 직경보다 클 수 없습니다" -#: src/libslic3r/Print.cpp:1294 +#: src/libslic3r/Print.cpp:1403 msgid "Layer height can't be greater than nozzle diameter" msgstr "레이어 높이는 노즐 직경보다 클 수 없습니다" -#: src/libslic3r/Print.cpp:1438 +#: src/libslic3r/Print.cpp:1557 msgid "Infilling layers" msgstr "레이어 채우기" -#: src/libslic3r/Print.cpp:1446 +#: src/libslic3r/Print.cpp:1577 msgid "Generating skirt" msgstr "스커트 생성" -#: src/libslic3r/Print.cpp:1454 +#: src/libslic3r/Print.cpp:1585 msgid "Generating brim" msgstr "브림 생성" -#: src/libslic3r/Print.cpp:1482 +#: src/libslic3r/Print.cpp:1609 msgid "Exporting G-code" msgstr "G 코드 내보내기" -#: src/libslic3r/Print.cpp:1486 +#: src/libslic3r/Print.cpp:1613 msgid "Generating G-code" msgstr "G 코드 생성" -#: src/libslic3r/SLAPrint.cpp:58 +#: src/libslic3r/SLAPrint.cpp:613 +msgid "" +"Cannot proceed without support points! Add support points or disable support " +"generation." +msgstr "" +"서포트 포인트 없이 진행할 수 없습니다! 서포트 지점을 추가 하거나 서포트 생성" +"을 사용 하지 않도록 설정 합니다." + +#: src/libslic3r/SLAPrint.cpp:625 +msgid "" +"Elevation is too low for object. Use the \"Pad around object\" feature to " +"print the object without elevation." +msgstr "" +"객체의 고도가 너무 낮습니다. \"오브젝트 주위 패드\" 피쳐를 사용하여 고도 없" +"이 오브젝트를 인쇄합니다." + +#: src/libslic3r/SLAPrint.cpp:631 +msgid "" +"The endings of the support pillars will be deployed on the gap between the " +"object and the pad. 'Support base safety distance' has to be greater than " +"the 'Pad object gap' parameter to avoid this." +msgstr "" +"서포트 기둥 끝은 객체(object)와 패드 사이의 간격에 배치됩니다. 이를 방지하기 " +"위해 '베이스 서포트 안전 거리'는 '패드 객체(object) 갭' 매개변수보다 커야 합" +"니다." + +#: src/libslic3r/SLAPrint.cpp:646 +msgid "Exposition time is out of printer profile bounds." +msgstr "박람회 시간이 프린터 프로파일 범위를 벗어났습니다." + +#: src/libslic3r/SLAPrint.cpp:653 +msgid "Initial exposition time is out of printer profile bounds." +msgstr "초기 박람회 시간이 프린터 프로파일 범위를 벗어났습니다." + +#: src/libslic3r/SLAPrint.cpp:760 +msgid "Slicing done" +msgstr "슬라이싱 완료" + +#: src/libslic3r/SLAPrintSteps.cpp:41 +msgid "Hollowing model" +msgstr "속이 빈 모델" + +#: src/libslic3r/SLAPrintSteps.cpp:42 +msgid "Drilling holes into model." +msgstr "모델에 구멍을 드릴링합니다." + +#: src/libslic3r/SLAPrintSteps.cpp:43 msgid "Slicing model" msgstr "슬라이싱 모델" -#: src/libslic3r/SLAPrint.cpp:59 src/libslic3r/SLAPrint.cpp:871 +#: src/libslic3r/SLAPrintSteps.cpp:44 src/libslic3r/SLAPrintSteps.cpp:308 msgid "Generating support points" msgstr "서포트 지점 생성" -#: src/libslic3r/SLAPrint.cpp:60 +#: src/libslic3r/SLAPrintSteps.cpp:45 msgid "Generating support tree" msgstr "서포트 트리 생성" -#: src/libslic3r/SLAPrint.cpp:61 +#: src/libslic3r/SLAPrintSteps.cpp:46 msgid "Generating pad" msgstr "패드 생성" -#: src/libslic3r/SLAPrint.cpp:62 +#: src/libslic3r/SLAPrintSteps.cpp:47 msgid "Slicing supports" msgstr "슬라이싱 서포트즈" -#: src/libslic3r/SLAPrint.cpp:79 +#: src/libslic3r/SLAPrintSteps.cpp:62 msgid "Merging slices and calculating statistics" msgstr "슬라이스 병합 및 통계 계산" -#: src/libslic3r/SLAPrint.cpp:80 +#: src/libslic3r/SLAPrintSteps.cpp:63 msgid "Rasterizing layers" msgstr "레이어 래스터화" -#: src/libslic3r/SLAPrint.cpp:650 -msgid "Cannot proceed without support points! Add support points or disable support generation." -msgstr "서포트 포인트 없이 진행할 수 없습니다! 서포트 지점을 추가 하거나 서포트 생성을 사용 하지 않도록 설정 합니다." +#: src/libslic3r/SLAPrintSteps.cpp:154 +msgid "" +"Drilling holes into the mesh failed. This is usually caused by broken model. " +"Try to fix it first." +msgstr "" +"메시에 구멍을 뚫는 데 실패했습니다. 이는 일반적으로 모델이 손상되어 발생합니" +"다. 먼저 해결해 보십시오." -#: src/libslic3r/SLAPrint.cpp:664 -msgid "Elevation is too low for object." -msgstr "객체(object) 고도가 너무 낮습니다." +#: src/libslic3r/SLAPrintSteps.cpp:202 +msgid "" +"Slicing had to be stopped due to an internal error: Inconsistent slice index." +msgstr "" +"내부 오류: 일치하지 않는 슬라이스 인덱스로 인해 슬라이싱을 중지해야 했습니다." -#: src/libslic3r/SLAPrint.cpp:670 -msgid "The endings of the support pillars will be deployed on the gap between the object and the pad. 'Support base safety distance' has to be greater than the 'Pad object gap' parameter to avoid this." -msgstr "서포트 기둥 끝은 객체(object)와 패드 사이의 간격에 배치됩니다. 이를 방지하기 위해 '베이스 서포트 안전 거리'는 '패드 객체(object) 갭' 매개변수보다 커야 합니다." - -#: src/libslic3r/SLAPrint.cpp:759 -msgid "Slicing had to be stopped due to an internal error: Inconsistent slice index." -msgstr "내부 오류: 일치하지 않는 슬라이스 인덱스로 인해 슬라이싱을 중지해야 했습니다." - -#: src/libslic3r/SLAPrint.cpp:954 src/libslic3r/SLAPrint.cpp:964 -#: src/libslic3r/SLAPrint.cpp:1005 +#: src/libslic3r/SLAPrintSteps.cpp:365 src/libslic3r/SLAPrintSteps.cpp:374 +#: src/libslic3r/SLAPrintSteps.cpp:413 msgid "Visualizing supports" msgstr "시각화 지원" -#: src/libslic3r/SLAPrint.cpp:1537 -msgid "Slicing done" -msgstr "슬라이싱 완료" +#: src/libslic3r/SLAPrintSteps.cpp:405 +msgid "No pad can be generated for this model with the current configuration" +msgstr "현재 구성으로 이 모델에 대해 패드를 생성할 수 없습니다." + +#: src/libslic3r/SLAPrintSteps.cpp:579 +msgid "" +"There are unprintable objects. Try to adjust support settings to make the " +"objects printable." +msgstr "" +"인쇄할 수 없는 개체가 있습니다. 지원 설정을 조정하여 개체를 인쇄할 수 있도록 " +"합니다." #: src/libslic3r/PrintBase.cpp:71 msgid "Failed processing of the output_filename_format template." @@ -5260,2481 +6807,3545 @@ msgstr "배드 모양" #: src/libslic3r/PrintConfig.cpp:56 msgid "Bed custom texture" -msgstr "침대 사용자 정의 질감" +msgstr "배드 사용자 정의 질감" #: src/libslic3r/PrintConfig.cpp:61 msgid "Bed custom model" -msgstr "침대 사용자 정의 모델" +msgstr "배드 사용자 정의 모델" -#: src/libslic3r/PrintConfig.cpp:68 -msgid "This setting controls the height (and thus the total number) of the slices/layers. Thinner layers give better accuracy but take more time to print." -msgstr "이 설정은 슬라이스/레이어의 높이(따라서 총 수)를 제어합니다. 얇은 층은 더 나은 정확성을 제공하지만 인쇄하는 데는 더 많은 시간이 걸린다." +#: src/libslic3r/PrintConfig.cpp:66 +msgid "Picture sizes to be stored into a .gcode and .sl1 files" +msgstr ".gcode 및 .sl1 파일에 저장할 그림 크기" -#: src/libslic3r/PrintConfig.cpp:75 +#: src/libslic3r/PrintConfig.cpp:73 +msgid "" +"This setting controls the height (and thus the total number) of the slices/" +"layers. Thinner layers give better accuracy but take more time to print." +msgstr "" +"이 설정은 슬라이스/레이어의 높이(따라서 총 수)를 제어합니다. 얇은 층은 더 나" +"은 정확성을 제공하지만 인쇄하는 데는 더 많은 시간이 걸린다." + +#: src/libslic3r/PrintConfig.cpp:80 msgid "Max print height" msgstr "최대 프린트 높이" -#: src/libslic3r/PrintConfig.cpp:76 -msgid "Set this to the maximum height that can be reached by your extruder while printing." +#: src/libslic3r/PrintConfig.cpp:81 +msgid "" +"Set this to the maximum height that can be reached by your extruder while " +"printing." msgstr "인쇄 중에 익스트루더가 도달 할 수있는 최대 높이로 설정하십시오." -#: src/libslic3r/PrintConfig.cpp:82 +#: src/libslic3r/PrintConfig.cpp:87 msgid "Slice gap closing radius" msgstr "슬라이스 간격 닫힘 반경" -#: src/libslic3r/PrintConfig.cpp:84 -msgid "Cracks smaller than 2x gap closing radius are being filled during the triangle mesh slicing. The gap closing operation may reduce the final print resolution, therefore it is advisable to keep the value reasonably low." -msgstr "삼각형 메쉬 슬라이싱 중에, 2배 간격 폐쇄 반경 보다 작은 균열이 채워집니다. 틈 닫기 작업은 최종 인쇄 해상도를 줄일 수 있으므로 값을 합리적으로 낮게 유지 하는 것이 좋습니다." +#: src/libslic3r/PrintConfig.cpp:89 +msgid "" +"Cracks smaller than 2x gap closing radius are being filled during the " +"triangle mesh slicing. The gap closing operation may reduce the final print " +"resolution, therefore it is advisable to keep the value reasonably low." +msgstr "" +"삼각형 메쉬 슬라이싱 중에, 2배 간격 폐쇄 반경 보다 작은 균열이 채워집니다. " +"틈 닫기 작업은 최종 인쇄 해상도를 줄일 수 있으므로 값을 합리적으로 낮게 유지 " +"하는 것이 좋습니다." -#: src/libslic3r/PrintConfig.cpp:92 +#: src/libslic3r/PrintConfig.cpp:97 msgid "Hostname, IP or URL" msgstr "호스트 이름(Hostname), IP or URL" -#: src/libslic3r/PrintConfig.cpp:93 -msgid "Slic3r can upload G-code files to a printer host. This field should contain the hostname, IP address or URL of the printer host instance." -msgstr "Slic3r는 프린터 호스트에 G 코드 파일을 업로드할 수 있습니다. 이 필드는 호스트 이름, IP 주소 또는 프린터 호스트 복제본의 URL을 포함 해야 합니다." +#: src/libslic3r/PrintConfig.cpp:98 +msgid "" +"Slic3r can upload G-code files to a printer host. This field should contain " +"the hostname, IP address or URL of the printer host instance." +msgstr "" +"Slic3r는 프린터 호스트에 G 코드 파일을 업로드할 수 있습니다. 이 필드는 호스" +"트 이름, IP 주소 또는 프린터 호스트 복제본의 URL을 포함 해야 합니다." -#: src/libslic3r/PrintConfig.cpp:99 +#: src/libslic3r/PrintConfig.cpp:104 msgid "API Key / Password" msgstr "API 키/암호" -#: src/libslic3r/PrintConfig.cpp:100 -msgid "Slic3r can upload G-code files to a printer host. This field should contain the API Key or the password required for authentication." -msgstr "Slic3r는 프린터 호스트에 G 코드 파일을 업로드할 수 있습니다. 이 필드는 API 키 또는 인증에 필요한 암호를 포함 해야 합니다." +#: src/libslic3r/PrintConfig.cpp:105 +msgid "" +"Slic3r can upload G-code files to a printer host. This field should contain " +"the API Key or the password required for authentication." +msgstr "" +"Slic3r는 프린터 호스트에 G 코드 파일을 업로드할 수 있습니다. 이 필드는 API " +"키 또는 인증에 필요한 암호를 포함 해야 합니다." -#: src/libslic3r/PrintConfig.cpp:106 +#: src/libslic3r/PrintConfig.cpp:111 msgid "HTTPS CA File" msgstr "HTTPS CA 파일" -#: src/libslic3r/PrintConfig.cpp:107 -msgid "Custom CA certificate file can be specified for HTTPS OctoPrint connections, in crt/pem format. If left blank, the default OS CA certificate repository is used." -msgstr "사용자 지정 CA 인증서 파일은 crt/pem 형식의 HTTPS 옥토 프린트 연결에 대해 지정할 수 있습니다. 비워 두면 기본 OS CA 인증서 리포지토리가 사용 됩니다." +#: src/libslic3r/PrintConfig.cpp:112 +msgid "" +"Custom CA certificate file can be specified for HTTPS OctoPrint connections, " +"in crt/pem format. If left blank, the default OS CA certificate repository " +"is used." +msgstr "" +"사용자 지정 CA 인증서 파일은 crt/pem 형식의 HTTPS 옥토 프린트 연결에 대해 지" +"정할 수 있습니다. 비워 두면 기본 OS CA 인증서 리포지토리가 사용 됩니다." -#: src/libslic3r/PrintConfig.cpp:121 +#: src/libslic3r/PrintConfig.cpp:126 msgid "Avoid crossing perimeters" msgstr "교체된 둘레를 피하세요." -#: src/libslic3r/PrintConfig.cpp:122 -msgid "Optimize travel moves in order to minimize the crossing of perimeters. This is mostly useful with Bowden extruders which suffer from oozing. This feature slows down both the print and the G-code generation." -msgstr "둘레의 교차를 최소화하기 위해 여행 이동을 최적화하십시오. 이것은 보잉 (Bowling) 압출기가 흘러 나오기 쉬운 경우에 주로 유용합니다. 이 기능을 사용하면 인쇄 및 G 코드 생성 속도가 느려집니다." +#: src/libslic3r/PrintConfig.cpp:127 +msgid "" +"Optimize travel moves in order to minimize the crossing of perimeters. This " +"is mostly useful with Bowden extruders which suffer from oozing. This " +"feature slows down both the print and the G-code generation." +msgstr "" +"둘레의 교차를 최소화하기 위해 여행 이동을 최적화하십시오. 이것은 보잉 " +"(Bowling) 압출기가 흘러 나오기 쉬운 경우에 주로 유용합니다. 이 기능을 사용하" +"면 인쇄 및 G 코드 생성 속도가 느려집니다." -#: src/libslic3r/PrintConfig.cpp:129 src/libslic3r/PrintConfig.cpp:2027 +#: src/libslic3r/PrintConfig.cpp:134 src/libslic3r/PrintConfig.cpp:2074 msgid "Other layers" msgstr "다른 레이어" -#: src/libslic3r/PrintConfig.cpp:130 -msgid "Bed temperature for layers after the first one. Set this to zero to disable bed temperature control commands in the output." -msgstr "첫 번째 레이어 이후의 레이어 온도. 이 값을 0으로 설정하면 출력에서 ​​베드 온도 제어 명령을 비활성화합니다." +#: src/libslic3r/PrintConfig.cpp:135 +msgid "" +"Bed temperature for layers after the first one. Set this to zero to disable " +"bed temperature control commands in the output." +msgstr "" +"첫 번째 레이어 이후의 레이어 온도. 이 값을 0으로 설정하면 출력에서 ​​베드 온도 " +"제어 명령을 비활성화합니다." -#: src/libslic3r/PrintConfig.cpp:132 +#: src/libslic3r/PrintConfig.cpp:137 msgid "Bed temperature" msgstr "배드 온도" -#: src/libslic3r/PrintConfig.cpp:139 -msgid "This custom code is inserted at every layer change, right before the Z move. Note that you can use placeholder variables for all Slic3r settings as well as [layer_num] and [layer_z]." -msgstr "이 사용자 정의 코드는 Z 이동 직전의 모든 레이어 변경에 삽입됩니다. [Slide3r] 설정과 [layer_num] 및 [layer_z]에 대한 자리 표시 자 변수를 사용할 수 있습니다." +#: src/libslic3r/PrintConfig.cpp:144 +msgid "" +"This custom code is inserted at every layer change, right before the Z move. " +"Note that you can use placeholder variables for all Slic3r settings as well " +"as [layer_num] and [layer_z]." +msgstr "" +"이 사용자 정의 코드는 Z 이동 직전의 모든 레이어 변경에 삽입됩니다. [Slide3r] " +"설정과 [layer_num] 및 [layer_z]에 대한 자리 표시 자 변수를 사용할 수 있습니" +"다." -#: src/libslic3r/PrintConfig.cpp:149 +#: src/libslic3r/PrintConfig.cpp:154 msgid "Between objects G-code" msgstr "객체(object) 간 G 코드" -#: src/libslic3r/PrintConfig.cpp:150 -msgid "This code is inserted between objects when using sequential printing. By default extruder and bed temperature are reset using non-wait command; however if M104, M109, M140 or M190 are detected in this custom code, Slic3r will not add temperature commands. Note that you can use placeholder variables for all Slic3r settings, so you can put a \"M109 S[first_layer_temperature]\" command wherever you want." -msgstr "이 코드는 순차 인쇄를 사용할 때 객체(object)간에 삽입됩니다. 기본적으로 익스트루더 및 베드 온도는 대기 모드가 아닌 명령을 사용하여 재설정됩니다. 그러나 이 사용자 코드에서 M104, M109, M140 또는 M190이 감지되면 Slic3r은 온도 명령을 추가하지 않습니다. 모든 Slic3r 설정에 자리 표시 변수를 사용할 수 있으므로 원하는 위치에 \"M109 S [first_layer_temperature]\"명령을 넣을 수 있습니다." +#: src/libslic3r/PrintConfig.cpp:155 +msgid "" +"This code is inserted between objects when using sequential printing. By " +"default extruder and bed temperature are reset using non-wait command; " +"however if M104, M109, M140 or M190 are detected in this custom code, Slic3r " +"will not add temperature commands. Note that you can use placeholder " +"variables for all Slic3r settings, so you can put a \"M109 " +"S[first_layer_temperature]\" command wherever you want." +msgstr "" +"이 코드는 순차 인쇄를 사용할 때 객체(object)간에 삽입됩니다. 기본적으로 익스" +"트루더 및 베드 온도는 대기 모드가 아닌 명령을 사용하여 재설정됩니다. 그러나 " +"이 사용자 코드에서 M104, M109, M140 또는 M190이 감지되면 Slic3r은 온도 명령" +"을 추가하지 않습니다. 모든 Slic3r 설정에 자리 표시 변수를 사용할 수 있으므로 " +"원하는 위치에 \"M109 S [first_layer_temperature]\"명령을 넣을 수 있습니다." -#: src/libslic3r/PrintConfig.cpp:161 +#: src/libslic3r/PrintConfig.cpp:166 msgid "Number of solid layers to generate on bottom surfaces." msgstr "바닥면에 생성 할 솔리드 레이어의 수." -#: src/libslic3r/PrintConfig.cpp:162 +#: src/libslic3r/PrintConfig.cpp:167 msgid "Bottom solid layers" msgstr "바닥 단일 레이어" -#: src/libslic3r/PrintConfig.cpp:167 +#: src/libslic3r/PrintConfig.cpp:175 +msgid "" +"The number of bottom solid layers is increased above bottom_solid_layers if " +"necessary to satisfy minimum thickness of bottom shell." +msgstr "" +"바닥 단색 층의 수는 바닥 쉘의 최소 두께를 만족시키기 위해 필요한 경우 " +"bottom_solid_layers 이상으로 증가한다." + +#: src/libslic3r/PrintConfig.cpp:177 +msgid "Minimum bottom shell thickness" +msgstr "최소 하단 쉘 두께" + +#: src/libslic3r/PrintConfig.cpp:183 msgid "Bridge" msgstr "브리지" -#: src/libslic3r/PrintConfig.cpp:168 -msgid "This is the acceleration your printer will use for bridges. Set zero to disable acceleration control for bridges." -msgstr "이것은 프린터가 브릿지에 사용할 가속도입니다. 브리지의 가속 제어를 사용하지 않으려면 0으로 설정하십시오." +#: src/libslic3r/PrintConfig.cpp:184 +msgid "" +"This is the acceleration your printer will use for bridges. Set zero to " +"disable acceleration control for bridges." +msgstr "" +"이것은 프린터가 브릿지에 사용할 가속도입니다. 브리지의 가속 제어를 사용하지 " +"않으려면 0으로 설정하십시오." -#: src/libslic3r/PrintConfig.cpp:170 src/libslic3r/PrintConfig.cpp:313 -#: src/libslic3r/PrintConfig.cpp:840 src/libslic3r/PrintConfig.cpp:961 -#: src/libslic3r/PrintConfig.cpp:1130 src/libslic3r/PrintConfig.cpp:1183 -#: src/libslic3r/PrintConfig.cpp:1194 src/libslic3r/PrintConfig.cpp:1383 +#: src/libslic3r/PrintConfig.cpp:186 src/libslic3r/PrintConfig.cpp:329 +#: src/libslic3r/PrintConfig.cpp:863 src/libslic3r/PrintConfig.cpp:985 +#: src/libslic3r/PrintConfig.cpp:1155 src/libslic3r/PrintConfig.cpp:1208 +#: src/libslic3r/PrintConfig.cpp:1219 src/libslic3r/PrintConfig.cpp:1412 msgid "mm/s²" msgstr "mm/s ²" -#: src/libslic3r/PrintConfig.cpp:176 +#: src/libslic3r/PrintConfig.cpp:192 msgid "Bridging angle" msgstr "브릿지 각도" -#: src/libslic3r/PrintConfig.cpp:178 -msgid "Bridging angle override. If left to zero, the bridging angle will be calculated automatically. Otherwise the provided angle will be used for all bridges. Use 180° for zero angle." -msgstr "브리징 각도 오버라이드(override)값이. 왼쪽으로 0 일 경우 브리징 각도가 자동으로 계산됩니다. 그렇지 않으면 제공된 각도가 모든 브리지에 사용됩니다. 각도 제로는 180 °를 사용하십시오." +#: src/libslic3r/PrintConfig.cpp:194 +msgid "" +"Bridging angle override. If left to zero, the bridging angle will be " +"calculated automatically. Otherwise the provided angle will be used for all " +"bridges. Use 180° for zero angle." +msgstr "" +"브리징 각도 오버라이드(override)값이. 왼쪽으로 0 일 경우 브리징 각도가 자동으" +"로 계산됩니다. 그렇지 않으면 제공된 각도가 모든 브리지에 사용됩니다. 각도 제" +"로는 180 °를 사용하십시오." -#: src/libslic3r/PrintConfig.cpp:181 src/libslic3r/PrintConfig.cpp:758 -#: src/libslic3r/PrintConfig.cpp:1619 src/libslic3r/PrintConfig.cpp:1629 -#: src/libslic3r/PrintConfig.cpp:1858 src/libslic3r/PrintConfig.cpp:2012 -#: src/libslic3r/PrintConfig.cpp:2197 src/libslic3r/PrintConfig.cpp:2582 -#: src/libslic3r/PrintConfig.cpp:2693 +#: src/libslic3r/PrintConfig.cpp:197 src/libslic3r/PrintConfig.cpp:781 +#: src/libslic3r/PrintConfig.cpp:1649 src/libslic3r/PrintConfig.cpp:1659 +#: src/libslic3r/PrintConfig.cpp:1904 src/libslic3r/PrintConfig.cpp:2059 +#: src/libslic3r/PrintConfig.cpp:2257 src/libslic3r/PrintConfig.cpp:2728 +#: src/libslic3r/PrintConfig.cpp:2849 msgid "°" msgstr "°" -#: src/libslic3r/PrintConfig.cpp:187 +#: src/libslic3r/PrintConfig.cpp:203 msgid "Bridges fan speed" msgstr "브릿지 팬 속도" -#: src/libslic3r/PrintConfig.cpp:188 +#: src/libslic3r/PrintConfig.cpp:204 msgid "This fan speed is enforced during all bridges and overhangs." msgstr "이 팬 속도는 모든 브릿지 및 오버행 중에 적용됩니다." -#: src/libslic3r/PrintConfig.cpp:189 src/libslic3r/PrintConfig.cpp:770 -#: src/libslic3r/PrintConfig.cpp:1203 src/libslic3r/PrintConfig.cpp:1266 -#: src/libslic3r/PrintConfig.cpp:1511 src/libslic3r/PrintConfig.cpp:2366 -#: src/libslic3r/PrintConfig.cpp:2623 +#: src/libslic3r/PrintConfig.cpp:205 src/libslic3r/PrintConfig.cpp:793 +#: src/libslic3r/PrintConfig.cpp:1228 src/libslic3r/PrintConfig.cpp:1291 +#: src/libslic3r/PrintConfig.cpp:1541 src/libslic3r/PrintConfig.cpp:2435 +#: src/libslic3r/PrintConfig.cpp:2768 msgid "%" msgstr "%" -#: src/libslic3r/PrintConfig.cpp:196 +#: src/libslic3r/PrintConfig.cpp:212 msgid "Bridge flow ratio" msgstr "브릿지 유량(flow)값" -#: src/libslic3r/PrintConfig.cpp:198 -msgid "This factor affects the amount of plastic for bridging. You can decrease it slightly to pull the extrudates and prevent sagging, although default settings are usually good and you should experiment with cooling (use a fan) before tweaking this." -msgstr "이 요인은 브리징을위한 플라스틱의 양에 영향을 미칩니다. 압출 성형물을 잡아 당겨 처짐을 방지하기 위해 약간 줄일 수 있지만 기본 설정은 일반적으로 좋지만이 문제를 해결하기 전에 냉각 (팬 사용)을 시도해야합니다." +#: src/libslic3r/PrintConfig.cpp:214 +msgid "" +"This factor affects the amount of plastic for bridging. You can decrease it " +"slightly to pull the extrudates and prevent sagging, although default " +"settings are usually good and you should experiment with cooling (use a fan) " +"before tweaking this." +msgstr "" +"이 요인은 브리징을위한 플라스틱의 양에 영향을 미칩니다. 압출 성형물을 잡아 당" +"겨 처짐을 방지하기 위해 약간 줄일 수 있지만 기본 설정은 일반적으로 좋지만이 " +"문제를 해결하기 전에 냉각 (팬 사용)을 시도해야합니다." -#: src/libslic3r/PrintConfig.cpp:208 +#: src/libslic3r/PrintConfig.cpp:224 msgid "Bridges" msgstr "브릿지(Bridges)" -#: src/libslic3r/PrintConfig.cpp:210 +#: src/libslic3r/PrintConfig.cpp:226 msgid "Speed for printing bridges." msgstr "브릿지 인쇄 속도." -#: src/libslic3r/PrintConfig.cpp:211 src/libslic3r/PrintConfig.cpp:592 -#: src/libslic3r/PrintConfig.cpp:600 src/libslic3r/PrintConfig.cpp:609 -#: src/libslic3r/PrintConfig.cpp:617 src/libslic3r/PrintConfig.cpp:644 -#: src/libslic3r/PrintConfig.cpp:663 src/libslic3r/PrintConfig.cpp:899 -#: src/libslic3r/PrintConfig.cpp:1026 src/libslic3r/PrintConfig.cpp:1112 -#: src/libslic3r/PrintConfig.cpp:1148 src/libslic3r/PrintConfig.cpp:1161 -#: src/libslic3r/PrintConfig.cpp:1172 src/libslic3r/PrintConfig.cpp:1225 -#: src/libslic3r/PrintConfig.cpp:1284 src/libslic3r/PrintConfig.cpp:1412 -#: src/libslic3r/PrintConfig.cpp:1586 src/libslic3r/PrintConfig.cpp:1595 -#: src/libslic3r/PrintConfig.cpp:1991 src/libslic3r/PrintConfig.cpp:2104 +#: src/libslic3r/PrintConfig.cpp:227 src/libslic3r/PrintConfig.cpp:610 +#: src/libslic3r/PrintConfig.cpp:618 src/libslic3r/PrintConfig.cpp:627 +#: src/libslic3r/PrintConfig.cpp:635 src/libslic3r/PrintConfig.cpp:662 +#: src/libslic3r/PrintConfig.cpp:681 src/libslic3r/PrintConfig.cpp:923 +#: src/libslic3r/PrintConfig.cpp:1051 src/libslic3r/PrintConfig.cpp:1137 +#: src/libslic3r/PrintConfig.cpp:1173 src/libslic3r/PrintConfig.cpp:1186 +#: src/libslic3r/PrintConfig.cpp:1197 src/libslic3r/PrintConfig.cpp:1250 +#: src/libslic3r/PrintConfig.cpp:1309 src/libslic3r/PrintConfig.cpp:1442 +#: src/libslic3r/PrintConfig.cpp:1616 src/libslic3r/PrintConfig.cpp:1625 +#: src/libslic3r/PrintConfig.cpp:2038 src/libslic3r/PrintConfig.cpp:2164 msgid "mm/s" msgstr "mm/s" -#: src/libslic3r/PrintConfig.cpp:218 +#: src/libslic3r/PrintConfig.cpp:234 msgid "Brim width" msgstr "브림 폭" -#: src/libslic3r/PrintConfig.cpp:219 -msgid "Horizontal width of the brim that will be printed around each object on the first layer." -msgstr "첫 번째 레이어의 각 객체(object) 주위에 인쇄 될 가장자리의 가로 폭입니다." +#: src/libslic3r/PrintConfig.cpp:235 +msgid "" +"Horizontal width of the brim that will be printed around each object on the " +"first layer." +msgstr "" +"첫 번째 레이어의 각 객체(object) 주위에 인쇄 될 가장자리의 가로 폭입니다." -#: src/libslic3r/PrintConfig.cpp:226 +#: src/libslic3r/PrintConfig.cpp:242 msgid "Clip multi-part objects" msgstr "여러 부품(Part) 객체(object) 클립" -#: src/libslic3r/PrintConfig.cpp:227 -msgid "When printing multi-material objects, this settings will make Slic3r to clip the overlapping object parts one by the other (2nd part will be clipped by the 1st, 3rd part will be clipped by the 1st and 2nd etc)." -msgstr "다중 메터리얼(multi-material) 객체(object)를 인쇄 할 때이 설정을 사용하면 겹치는 객체(object) 부품(Part)를 서로 겹쳐서 잘라낼 수 있습니다 (두 번째 부분은 첫 번째 부분에서 클리핑되며 세 번째 부분은 첫 번째 및 두 번째 부분에서 잘립니다)." +#: src/libslic3r/PrintConfig.cpp:243 +msgid "" +"When printing multi-material objects, this settings will make Slic3r to clip " +"the overlapping object parts one by the other (2nd part will be clipped by " +"the 1st, 3rd part will be clipped by the 1st and 2nd etc)." +msgstr "" +"다중 메터리얼(multi-material) 객체(object)를 인쇄 할 때이 설정을 사용하면 겹" +"치는 객체(object) 부품(Part)를 서로 겹쳐서 잘라낼 수 있습니다 (두 번째 부분" +"은 첫 번째 부분에서 클리핑되며 세 번째 부분은 첫 번째 및 두 번째 부분에서 잘" +"립니다)." -#: src/libslic3r/PrintConfig.cpp:234 +#: src/libslic3r/PrintConfig.cpp:250 msgid "Colorprint height" msgstr "컬러 인쇄 높이" -#: src/libslic3r/PrintConfig.cpp:235 +#: src/libslic3r/PrintConfig.cpp:251 msgid "Heights at which a filament change is to occur." msgstr "필라멘트 체인지가 발생 하는 높이." -#: src/libslic3r/PrintConfig.cpp:245 +#: src/libslic3r/PrintConfig.cpp:261 msgid "Compatible printers condition" msgstr "호환 가능한 프린터 조건" -#: src/libslic3r/PrintConfig.cpp:246 -msgid "A boolean expression using the configuration values of an active printer profile. If this expression evaluates to true, this profile is considered compatible with the active printer profile." -msgstr "활성 프린터 프로파일의 구성 값을 사용하는 부울 표현식. 이 표현식이 true로 평가되면이 프로필은 활성 프린터 프로필과 호환되는 것으로 간주됩니다." +#: src/libslic3r/PrintConfig.cpp:262 +msgid "" +"A boolean expression using the configuration values of an active printer " +"profile. If this expression evaluates to true, this profile is considered " +"compatible with the active printer profile." +msgstr "" +"활성 프린터 프로파일의 구성 값을 사용하는 부울 표현식. 이 표현식이 true로 평" +"가되면이 프로필은 활성 프린터 프로필과 호환되는 것으로 간주됩니다." -#: src/libslic3r/PrintConfig.cpp:260 +#: src/libslic3r/PrintConfig.cpp:276 msgid "Compatible print profiles condition" msgstr "호환 되는 인쇄 프로 파일 조건" -#: src/libslic3r/PrintConfig.cpp:261 -msgid "A boolean expression using the configuration values of an active print profile. If this expression evaluates to true, this profile is considered compatible with the active print profile." -msgstr "활성 인쇄 프로 파일의 구성 값을 사용하는 부울식입니다. 이 식이 true로 평가 되면, 이 프로필이 활성 인쇄 프로필과 호환 되는 것으로 간주 됩니다." +#: src/libslic3r/PrintConfig.cpp:277 +msgid "" +"A boolean expression using the configuration values of an active print " +"profile. If this expression evaluates to true, this profile is considered " +"compatible with the active print profile." +msgstr "" +"활성 인쇄 프로 파일의 구성 값을 사용하는 부울식입니다. 이 식이 true로 평가 되" +"면, 이 프로필이 활성 인쇄 프로필과 호환 되는 것으로 간주 됩니다." -#: src/libslic3r/PrintConfig.cpp:278 +#: src/libslic3r/PrintConfig.cpp:294 msgid "Complete individual objects" msgstr "개별 객체(object) 완성" -#: src/libslic3r/PrintConfig.cpp:279 -msgid "When printing multiple objects or copies, this feature will complete each object before moving onto next one (and starting it from its bottom layer). This feature is useful to avoid the risk of ruined prints. Slic3r should warn and prevent you from extruder collisions, but beware." -msgstr "여러 객체(object) 또는 사본을 인쇄 할 때이 객체(object)는 다음 객체(object)로 이동하기 전에 각 객체(object)를 완성합니다 (맨 아래 레이어에서 시작). 이 기능은 인쇄물이 망가지는 위험을 피할 때 유용합니다. Slic3r은 압출기 충돌을 경고하고 예방해야하지만 조심하십시오." +#: src/libslic3r/PrintConfig.cpp:295 +msgid "" +"When printing multiple objects or copies, this feature will complete each " +"object before moving onto next one (and starting it from its bottom layer). " +"This feature is useful to avoid the risk of ruined prints. Slic3r should " +"warn and prevent you from extruder collisions, but beware." +msgstr "" +"여러 객체(object) 또는 사본을 인쇄 할 때이 객체(object)는 다음 객체(object)" +"로 이동하기 전에 각 객체(object)를 완성합니다 (맨 아래 레이어에서 시작). 이 " +"기능은 인쇄물이 망가지는 위험을 피할 때 유용합니다. Slic3r은 압출기 충돌을 경" +"고하고 예방해야하지만 조재봉선하십시오." -#: src/libslic3r/PrintConfig.cpp:287 +#: src/libslic3r/PrintConfig.cpp:303 msgid "Enable auto cooling" msgstr "자동 냉각 사용" -#: src/libslic3r/PrintConfig.cpp:288 -msgid "This flag enables the automatic cooling logic that adjusts print speed and fan speed according to layer printing time." -msgstr "이 플래그는 레이어 인쇄 시간에 따라 인쇄 속도와 팬 속도를 조정하는 자동 냉각 논리를 활성화합니다." +#: src/libslic3r/PrintConfig.cpp:304 +msgid "" +"This flag enables the automatic cooling logic that adjusts print speed and " +"fan speed according to layer printing time." +msgstr "" +"이 플래그는 레이어 인쇄 시간에 따라 인쇄 속도와 팬 속도를 조정하는 자동 냉각 " +"논리를 활성화합니다." -#: src/libslic3r/PrintConfig.cpp:293 +#: src/libslic3r/PrintConfig.cpp:309 msgid "Cooling tube position" msgstr "냉각 튜브 위치" -#: src/libslic3r/PrintConfig.cpp:294 +#: src/libslic3r/PrintConfig.cpp:310 msgid "Distance of the center-point of the cooling tube from the extruder tip." -msgstr "압출기 팁에서 냉각 튜브의 중심점까지의 거리 " +msgstr "압출기 팁에서 냉각 튜브의 중재봉선점까지의 거리 " -#: src/libslic3r/PrintConfig.cpp:301 +#: src/libslic3r/PrintConfig.cpp:317 msgid "Cooling tube length" msgstr "냉각 튜브 길이" -#: src/libslic3r/PrintConfig.cpp:302 +#: src/libslic3r/PrintConfig.cpp:318 msgid "Length of the cooling tube to limit space for cooling moves inside it." msgstr "내부의 냉각 이동을 위해 공간을 제한하는 냉각 튜브의 길이 " -#: src/libslic3r/PrintConfig.cpp:310 -msgid "This is the acceleration your printer will be reset to after the role-specific acceleration values are used (perimeter/infill). Set zero to prevent resetting acceleration at all." -msgstr "역할 별 가속도 값이 사용 된 후에 프린터가 재설정되는 속도입니다 (둘레 / 충전). 가속을 전혀 재설정하지 않으려면 0으로 설정하십시오." +#: src/libslic3r/PrintConfig.cpp:326 +msgid "" +"This is the acceleration your printer will be reset to after the role-" +"specific acceleration values are used (perimeter/infill). Set zero to " +"prevent resetting acceleration at all." +msgstr "" +"역할 별 가속도 값이 사용 된 후에 프린터가 재설정되는 속도입니다 (둘레 / 충" +"전). 가속을 전혀 재설정하지 않으려면 0으로 설정하십시오." -#: src/libslic3r/PrintConfig.cpp:319 +#: src/libslic3r/PrintConfig.cpp:335 msgid "Default filament profile" msgstr "기본 필라멘트 프로파일" -#: src/libslic3r/PrintConfig.cpp:320 -msgid "Default filament profile associated with the current printer profile. On selection of the current printer profile, this filament profile will be activated." -msgstr "현재 프린터 프로파일과 연관된 기본 필라멘트 프로파일. 현재 프린터 프로파일을 선택하면 이 필라멘트 프로파일이 활성화됩니다." +#: src/libslic3r/PrintConfig.cpp:336 +msgid "" +"Default filament profile associated with the current printer profile. On " +"selection of the current printer profile, this filament profile will be " +"activated." +msgstr "" +"현재 프린터 프로파일과 연관된 기본 필라멘트 프로파일. 현재 프린터 프로파일을 " +"선택하면 이 필라멘트 프로파일이 활성화됩니다." -#: src/libslic3r/PrintConfig.cpp:326 +#: src/libslic3r/PrintConfig.cpp:342 msgid "Default print profile" msgstr "기본 인쇄 프로파일" -#: src/libslic3r/PrintConfig.cpp:327 src/libslic3r/PrintConfig.cpp:2447 -#: src/libslic3r/PrintConfig.cpp:2458 -msgid "Default print profile associated with the current printer profile. On selection of the current printer profile, this print profile will be activated." -msgstr "현재 프린터 프로파일과 연관된 기본 인쇄 프로파일. 현재 프린터 프로파일을 선택하면이 인쇄 프로파일이 활성화됩니다." +#: src/libslic3r/PrintConfig.cpp:343 src/libslic3r/PrintConfig.cpp:2593 +#: src/libslic3r/PrintConfig.cpp:2604 +msgid "" +"Default print profile associated with the current printer profile. On " +"selection of the current printer profile, this print profile will be " +"activated." +msgstr "" +"현재 프린터 프로파일과 연관된 기본 인쇄 프로파일. 현재 프린터 프로파일을 선택" +"하면이 인쇄 프로파일이 활성화됩니다." -#: src/libslic3r/PrintConfig.cpp:333 +#: src/libslic3r/PrintConfig.cpp:349 msgid "Disable fan for the first" msgstr "첫 번째 팬 사용 중지" -#: src/libslic3r/PrintConfig.cpp:334 -msgid "You can set this to a positive value to disable fan at all during the first layers, so that it does not make adhesion worse." -msgstr "이 값을 양수 값으로 설정하면 첫 번째 레이어에서 팬을 사용하지 않도록 설정하여 접착력을 악화시키지 않습니다." +#: src/libslic3r/PrintConfig.cpp:350 +msgid "" +"You can set this to a positive value to disable fan at all during the first " +"layers, so that it does not make adhesion worse." +msgstr "" +"이 값을 양수 값으로 설정하면 첫 번째 레이어에서 팬을 사용하지 않도록 설정하" +"여 접착력을 악화시키지 않습니다." -#: src/libslic3r/PrintConfig.cpp:336 src/libslic3r/PrintConfig.cpp:971 -#: src/libslic3r/PrintConfig.cpp:1484 src/libslic3r/PrintConfig.cpp:1669 -#: src/libslic3r/PrintConfig.cpp:1730 src/libslic3r/PrintConfig.cpp:1894 -#: src/libslic3r/PrintConfig.cpp:1939 -msgid "layers" -msgstr "레이어" - -#: src/libslic3r/PrintConfig.cpp:343 +#: src/libslic3r/PrintConfig.cpp:359 msgid "Don't support bridges" msgstr "서포트와 브릿지를 사용하지 않음" -#: src/libslic3r/PrintConfig.cpp:345 -msgid "Experimental option for preventing support material from being generated under bridged areas." -msgstr "브릿지 영역 아래에 서포팅 재료가 생성되는 것을 방지하기위한 실험적 옵션." +#: src/libslic3r/PrintConfig.cpp:361 +msgid "" +"Experimental option for preventing support material from being generated " +"under bridged areas." +msgstr "" +"브릿지 영역 아래에 서포팅 재료가 생성되는 것을 방지하기위한 실험적 옵션." -#: src/libslic3r/PrintConfig.cpp:351 +#: src/libslic3r/PrintConfig.cpp:367 msgid "Distance between copies" msgstr "복사본 간 거리" -#: src/libslic3r/PrintConfig.cpp:352 +#: src/libslic3r/PrintConfig.cpp:368 msgid "Distance used for the auto-arrange feature of the plater." msgstr "플래이터(plater)의 자동 정렬 기능에 사용되는 거리입니다." -#: src/libslic3r/PrintConfig.cpp:359 +#: src/libslic3r/PrintConfig.cpp:375 msgid "Elephant foot compensation" msgstr "코끼리 발(Elephant foot) 보상값" -#: src/libslic3r/PrintConfig.cpp:361 -msgid "The first layer will be shrunk in the XY plane by the configured value to compensate for the 1st layer squish aka an Elephant Foot effect." -msgstr "첫 번째 레이어는 구성 요소 값에 따라 XY 평면에서 수축되어 일층 스 퀴시 코끼리발(Elephant Foot) 효과를 보완합니다." +#: src/libslic3r/PrintConfig.cpp:377 +msgid "" +"The first layer will be shrunk in the XY plane by the configured value to " +"compensate for the 1st layer squish aka an Elephant Foot effect." +msgstr "" +"첫 번째 레이어는 구성 요소 값에 따라 XY 평면에서 수축되어 일층 스 퀴시 코끼리" +"발(Elephant Foot) 효과를 보완합니다." -#: src/libslic3r/PrintConfig.cpp:370 -msgid "This end procedure is inserted at the end of the output file. Note that you can use placeholder variables for all Slic3r settings." -msgstr "이 종료 절차는 출력 파일의 끝에 삽입된다. 모든 Slic3r 설정에 자리 표시자 변수를 사용할 수 있다는 점에 유의하십시오." +#: src/libslic3r/PrintConfig.cpp:386 +msgid "" +"This end procedure is inserted at the end of the output file. Note that you " +"can use placeholder variables for all PrusaSlicer settings." +msgstr "" +"이 끝 프로시저는 출력 파일의 끝에 삽입됩니다. 모든 PrusaSlicer 설정에 자리 표" +"시자 변수를 사용할 수 있습니다." -#: src/libslic3r/PrintConfig.cpp:380 -msgid "This end procedure is inserted at the end of the output file, before the printer end gcode (and before any toolchange from this filament in case of multimaterial printers). Note that you can use placeholder variables for all Slic3r settings. If you have multiple extruders, the gcode is processed in extruder order." -msgstr "이 종료 절차는 출력 파일의 끝, 프린터 종료 gcode 이전 (및 복합 재료 프린터의 경우이 필라멘트에서 도구를 변경하기 전에)에 삽입됩니다. 모든 Slic3r 설정에 자리 표시 자 변수를 사용할 수 있습니다. 압출기가 여러 개인 경우 gcode는 압출기 순서대로 처리됩니다." +#: src/libslic3r/PrintConfig.cpp:396 +msgid "" +"This end procedure is inserted at the end of the output file, before the " +"printer end gcode (and before any toolchange from this filament in case of " +"multimaterial printers). Note that you can use placeholder variables for all " +"PrusaSlicer settings. If you have multiple extruders, the gcode is processed " +"in extruder order." +msgstr "" +"이 끝 프로시저는 프린터가 gcode를 종료하기 전에 출력 파일의 끝에 삽입됩니다" +"(다중 재질 프린터의 경우 이 필라멘트에서 공구를 변경하기 전에). 모든 " +"PrusaSlicer 설정에 자리 표시자 변수를 사용할 수 있습니다. 압출기가 여러 개 있" +"는 경우 gcode는 압출기 순서로 처리됩니다." -#: src/libslic3r/PrintConfig.cpp:391 +#: src/libslic3r/PrintConfig.cpp:407 msgid "Ensure vertical shell thickness" msgstr "수직 쉘(shell) 두께 확인" -#: src/libslic3r/PrintConfig.cpp:393 -msgid "Add solid infill near sloping surfaces to guarantee the vertical shell thickness (top+bottom solid layers)." -msgstr "경사 표면 근처에 솔리드 인필을 추가하여 수직 셸 두께(상단+하단 솔리드 레이어)를 보장하십시오." +#: src/libslic3r/PrintConfig.cpp:409 +msgid "" +"Add solid infill near sloping surfaces to guarantee the vertical shell " +"thickness (top+bottom solid layers)." +msgstr "" +"경사 표면 근처에 솔리드 인필을 추가하여 수직 셸 두께(상단+하단 솔리드 레이어)" +"를 보장하십시오." -#: src/libslic3r/PrintConfig.cpp:399 +#: src/libslic3r/PrintConfig.cpp:415 msgid "Top fill pattern" msgstr "상단 채우기 패턴" -#: src/libslic3r/PrintConfig.cpp:401 -msgid "Fill pattern for top infill. This only affects the top visible layer, and not its adjacent solid shells." -msgstr "상단 채우기의 채우기 패턴. 이는 인접 한 솔리드 쉘이 아니라 보이는 상위 레이어에만 영향을 줍니다." +#: src/libslic3r/PrintConfig.cpp:417 +msgid "" +"Fill pattern for top infill. This only affects the top visible layer, and " +"not its adjacent solid shells." +msgstr "" +"상단 채우기의 채우기 패턴. 이는 인접 한 솔리드 쉘이 아니라 보이는 상위 레이어" +"에만 영향을 줍니다." -#: src/libslic3r/PrintConfig.cpp:409 src/libslic3r/PrintConfig.cpp:821 -#: src/libslic3r/PrintConfig.cpp:1972 +#: src/libslic3r/PrintConfig.cpp:425 src/libslic3r/PrintConfig.cpp:844 +#: src/libslic3r/PrintConfig.cpp:2019 msgid "Rectilinear" msgstr "직선면(Rectilinear)" -#: src/libslic3r/PrintConfig.cpp:410 src/libslic3r/PrintConfig.cpp:827 +#: src/libslic3r/PrintConfig.cpp:426 src/libslic3r/PrintConfig.cpp:850 msgid "Concentric" msgstr "동심원(Concentric)" -#: src/libslic3r/PrintConfig.cpp:411 src/libslic3r/PrintConfig.cpp:831 +#: src/libslic3r/PrintConfig.cpp:427 src/libslic3r/PrintConfig.cpp:854 msgid "Hilbert Curve" msgstr "힐버트 곡선(Hilbert Curve)" -#: src/libslic3r/PrintConfig.cpp:412 src/libslic3r/PrintConfig.cpp:832 +#: src/libslic3r/PrintConfig.cpp:428 src/libslic3r/PrintConfig.cpp:855 msgid "Archimedean Chords" msgstr "아르키메데우스(Archimedean Chords)" -#: src/libslic3r/PrintConfig.cpp:413 src/libslic3r/PrintConfig.cpp:833 +#: src/libslic3r/PrintConfig.cpp:429 src/libslic3r/PrintConfig.cpp:856 msgid "Octagram Spiral" msgstr "옥타그램 나선(Octagram Spiral)" -#: src/libslic3r/PrintConfig.cpp:419 +#: src/libslic3r/PrintConfig.cpp:435 msgid "Bottom fill pattern" msgstr "아래쪽 채우기 패턴" -#: src/libslic3r/PrintConfig.cpp:421 -msgid "Fill pattern for bottom infill. This only affects the bottom external visible layer, and not its adjacent solid shells." -msgstr "하단 채우기의 채우기 패턴. 이는 인접 한 솔리드 쉘이 아니라 아래쪽에 보이는 외부 레이어에만 영향을 줍니다." +#: src/libslic3r/PrintConfig.cpp:437 +msgid "" +"Fill pattern for bottom infill. This only affects the bottom external " +"visible layer, and not its adjacent solid shells." +msgstr "" +"하단 채우기의 채우기 패턴. 이는 인접 한 솔리드 쉘이 아니라 아래쪽에 보이는 외" +"부 레이어에만 영향을 줍니다." -#: src/libslic3r/PrintConfig.cpp:430 src/libslic3r/PrintConfig.cpp:440 +#: src/libslic3r/PrintConfig.cpp:446 src/libslic3r/PrintConfig.cpp:457 msgid "External perimeters" msgstr "외측 둘레" -#: src/libslic3r/PrintConfig.cpp:432 -msgid "Set this to a non-zero value to set a manual extrusion width for external perimeters. If left zero, default extrusion width will be used if set, otherwise 1.125 x nozzle diameter will be used. If expressed as percentage (for example 200%), it will be computed over layer height." -msgstr "외부 경계에 대한 수동 압출 폭을 설정하려면 이 값을 0이 아닌 값으로 설정하십시오. 0인 경우 기본 압출 너비가 사용되며, 그렇지 않으면 1.125 x 노즐 직경이 사용된다. 백분율(예: 200%)로 표현되는 경우, 레이어 높이에 걸쳐 계산됩니다." +#: src/libslic3r/PrintConfig.cpp:448 +msgid "" +"Set this to a non-zero value to set a manual extrusion width for external " +"perimeters. If left zero, default extrusion width will be used if set, " +"otherwise 1.125 x nozzle diameter will be used. If expressed as percentage " +"(for example 200%), it will be computed over layer height." +msgstr "" +"외부 경계에 대한 수동 압출 폭을 설정하려면 이 값을 0이 아닌 값으로 설정하십시" +"오. 0인 경우 기본 압출 너비가 사용되며, 그렇지 않으면 1.125 x 노즐 직경이 사" +"용된다. 백분율(예: 200%)로 표현되는 경우, 레이어 높이에 걸쳐 계산됩니다." -#: src/libslic3r/PrintConfig.cpp:435 src/libslic3r/PrintConfig.cpp:543 -#: src/libslic3r/PrintConfig.cpp:860 src/libslic3r/PrintConfig.cpp:872 -#: src/libslic3r/PrintConfig.cpp:992 src/libslic3r/PrintConfig.cpp:1017 -#: src/libslic3r/PrintConfig.cpp:1403 src/libslic3r/PrintConfig.cpp:1741 -#: src/libslic3r/PrintConfig.cpp:1847 src/libslic3r/PrintConfig.cpp:1915 -#: src/libslic3r/PrintConfig.cpp:2074 +#: src/libslic3r/PrintConfig.cpp:451 src/libslic3r/PrintConfig.cpp:560 +#: src/libslic3r/PrintConfig.cpp:883 src/libslic3r/PrintConfig.cpp:896 +#: src/libslic3r/PrintConfig.cpp:1016 src/libslic3r/PrintConfig.cpp:1042 +#: src/libslic3r/PrintConfig.cpp:1432 src/libslic3r/PrintConfig.cpp:1771 +#: src/libslic3r/PrintConfig.cpp:1893 src/libslic3r/PrintConfig.cpp:1961 +#: src/libslic3r/PrintConfig.cpp:2121 msgid "mm or %" msgstr "mm/s 또는 %" -#: src/libslic3r/PrintConfig.cpp:442 -msgid "This separate setting will affect the speed of external perimeters (the visible ones). If expressed as percentage (for example: 80%) it will be calculated on the perimeters speed setting above. Set to zero for auto." -msgstr "이 별도의 설정은 외부 경계선(시각적 경계선)의 속도에 영향을 미친다. 백분율(예: 80%)로 표현되는 경우 위의 Perimeter 속도 설정에 따라 계산된다. 자동을 위해 0으로 설정한다." +#: src/libslic3r/PrintConfig.cpp:459 +msgid "" +"This separate setting will affect the speed of external perimeters (the " +"visible ones). If expressed as percentage (for example: 80%) it will be " +"calculated on the perimeters speed setting above. Set to zero for auto." +msgstr "" +"이 별도의 설정은 외부 경계선(시각적 경계선)의 속도에 영향을 미친다. 백분율" +"(예: 80%)로 표현되는 경우 위의 Perimeter 속도 설정에 따라 계산된다. 자동을 위" +"해 0으로 설정한다." -#: src/libslic3r/PrintConfig.cpp:445 src/libslic3r/PrintConfig.cpp:881 -#: src/libslic3r/PrintConfig.cpp:1700 src/libslic3r/PrintConfig.cpp:1751 -#: src/libslic3r/PrintConfig.cpp:1958 src/libslic3r/PrintConfig.cpp:2086 +#: src/libslic3r/PrintConfig.cpp:462 src/libslic3r/PrintConfig.cpp:905 +#: src/libslic3r/PrintConfig.cpp:1730 src/libslic3r/PrintConfig.cpp:1782 +#: src/libslic3r/PrintConfig.cpp:2005 src/libslic3r/PrintConfig.cpp:2134 msgid "mm/s or %" msgstr "mm/s 또는 %" -#: src/libslic3r/PrintConfig.cpp:452 +#: src/libslic3r/PrintConfig.cpp:469 msgid "External perimeters first" msgstr "외부 경계선 먼저" -#: src/libslic3r/PrintConfig.cpp:454 -msgid "Print contour perimeters from the outermost one to the innermost one instead of the default inverse order." -msgstr "기본 역순 대신 가장 바깥쪽부터 가장 안쪽까지 윤곽선을 인쇄하십시오. 타겟 TTS복사하기번역 저장번역 저장번역 수정." +#: src/libslic3r/PrintConfig.cpp:471 +msgid "" +"Print contour perimeters from the outermost one to the innermost one instead " +"of the default inverse order." +msgstr "" +"기본 역순 대신 가장 바깥쪽부터 가장 안쪽까지 윤곽선을 인쇄하십시오. 타겟 TTS" +"복사하기번역 저장번역 저장번역 수정." -#: src/libslic3r/PrintConfig.cpp:460 +#: src/libslic3r/PrintConfig.cpp:477 msgid "Extra perimeters if needed" msgstr "필요한 경우 추가 둘레" -#: src/libslic3r/PrintConfig.cpp:462 -#, c-format -msgid "Add more perimeters when needed for avoiding gaps in sloping walls. Slic3r keeps adding perimeters, until more than 70% of the loop immediately above is supported." -msgstr "경사 벽의 틈을 피하기 위해 필요한 경우 더 많은 둘래(perimeter)를 추가하십시오. 위의 루프의 70% of 이상이 지지될 때까지 Slic3r는 계속해서 둘ㄹ를 추가한다." +#: src/libslic3r/PrintConfig.cpp:479 +#, no-c-format +msgid "" +"Add more perimeters when needed for avoiding gaps in sloping walls. Slic3r " +"keeps adding perimeters, until more than 70% of the loop immediately above " +"is supported." +msgstr "" +"경사 벽의 틈을 피하기 위해 필요한 경우 더 많은 둘래(perimeter)를 추가하십시" +"오. 위의 루프의 70% of 이상이 지지될 때까지 Slic3r는 계속해서 둘ㄹ를 추가한" +"다." -#: src/libslic3r/PrintConfig.cpp:472 -msgid "The extruder to use (unless more specific extruder settings are specified). This value overrides perimeter and infill extruders, but not the support extruders." -msgstr "사용할 압출부(더 구체적인 압출부 설정이 지정되지 않은 경우) 이 값은 경계 및 압출부를 초과하지만 지원 압출자를 주입하지는 않는다." +#: src/libslic3r/PrintConfig.cpp:489 +msgid "" +"The extruder to use (unless more specific extruder settings are specified). " +"This value overrides perimeter and infill extruders, but not the support " +"extruders." +msgstr "" +"사용할 압출부(더 구체적인 압출부 설정이 지정되지 않은 경우) 이 값은 경계 및 " +"압출부를 초과하지만 지원 압출자를 주입하지는 않는다." -#: src/libslic3r/PrintConfig.cpp:484 -msgid "Set this to the vertical distance between your nozzle tip and (usually) the X carriage rods. In other words, this is the height of the clearance cylinder around your extruder, and it represents the maximum depth the extruder can peek before colliding with other printed objects." -msgstr "이것을 노즐 팁과 (일반적으로) X 캐리지 로드 사이의 수직 거리로 설정하십시오. 다시 말하면, 이것은 당신의 압출기 주위의 틈새 실린더의 높이이며, 그것은 다른 인쇄된 물체와 충돌하기 전에 압출기가 엿볼 수 있는 최대 깊이를 나타낸다." +#: src/libslic3r/PrintConfig.cpp:501 +msgid "" +"Set this to the vertical distance between your nozzle tip and (usually) the " +"X carriage rods. In other words, this is the height of the clearance " +"cylinder around your extruder, and it represents the maximum depth the " +"extruder can peek before colliding with other printed objects." +msgstr "" +"이것을 노즐 팁과 (일반적으로) X 캐리지 로드 사이의 수직 거리로 설정하십시오. " +"다시 말하면, 이것은 당신의 압출기 주위의 틈새 실린더의 높이이며, 그것은 다른 " +"인쇄된 개체와 충돌하기 전에 압출기가 엿볼 수 있는 최대 깊이를 나타낸다." -#: src/libslic3r/PrintConfig.cpp:494 -msgid "Radius" -msgstr "반지름" +#: src/libslic3r/PrintConfig.cpp:512 +msgid "" +"Set this to the clearance radius around your extruder. If the extruder is " +"not centered, choose the largest value for safety. This setting is used to " +"check for collisions and to display the graphical preview in the plater." +msgstr "" +"이것을 당신의 압출기 주변의 간극 반경으로 설정하시오. 압출부가 중앙에 있지 않" +"으면 안전을 위해 가장 큰 값을 선택하십시오. 이 설정은 충돌 여부를 확인하고 플" +"래터에 그래픽 미리 보기를 표시하기 위해 사용된다." -#: src/libslic3r/PrintConfig.cpp:495 -msgid "Set this to the clearance radius around your extruder. If the extruder is not centered, choose the largest value for safety. This setting is used to check for collisions and to display the graphical preview in the plater." -msgstr "이것을 당신의 압출기 주변의 간극 반경으로 설정하시오. 압출부가 중앙에 있지 않으면 안전을 위해 가장 큰 값을 선택하십시오. 이 설정은 충돌 여부를 확인하고 플래터에 그래픽 미리 보기를 표시하기 위해 사용된다." - -#: src/libslic3r/PrintConfig.cpp:505 +#: src/libslic3r/PrintConfig.cpp:522 msgid "Extruder Color" msgstr "익스트루더 컬러" -#: src/libslic3r/PrintConfig.cpp:506 src/libslic3r/PrintConfig.cpp:566 +#: src/libslic3r/PrintConfig.cpp:523 src/libslic3r/PrintConfig.cpp:584 msgid "This is only used in the Slic3r interface as a visual help." msgstr "이것은 시각적 도움말로 Slic3r 접점에서만 사용된다." -#: src/libslic3r/PrintConfig.cpp:512 +#: src/libslic3r/PrintConfig.cpp:529 msgid "Extruder offset" msgstr "익스트루더 오프셋" -#: src/libslic3r/PrintConfig.cpp:513 -msgid "If your firmware doesn't handle the extruder displacement you need the G-code to take it into account. This option lets you specify the displacement of each extruder with respect to the first one. It expects positive coordinates (they will be subtracted from the XY coordinate)." -msgstr "펌웨어가 압출기 위치 변경을 처리하지 못하면 G 코드를 고려해야합니다. 이 옵션을 사용하면 첫 번째 것에 대한 각 압출기의 변위를 지정할 수 있습니다. 양의 좌표가 필요합니다 (XY 좌표에서 뺍니다)." +#: src/libslic3r/PrintConfig.cpp:530 +msgid "" +"If your firmware doesn't handle the extruder displacement you need the G-" +"code to take it into account. This option lets you specify the displacement " +"of each extruder with respect to the first one. It expects positive " +"coordinates (they will be subtracted from the XY coordinate)." +msgstr "" +"펌웨어가 압출기 위치 변경을 처리하지 못하면 G 코드를 고려해야합니다. 이 옵션" +"을 사용하면 첫 번째 것에 대한 각 압출기의 변위를 지정할 수 있습니다. 양의 좌" +"표가 필요합니다 (XY 좌표에서 뺍니다)." -#: src/libslic3r/PrintConfig.cpp:522 +#: src/libslic3r/PrintConfig.cpp:539 msgid "Extrusion axis" msgstr "압출 축" -#: src/libslic3r/PrintConfig.cpp:523 -msgid "Use this option to set the axis letter associated to your printer's extruder (usually E but some printers use A)." -msgstr "이 옵션을 사용하여 프린터의 압출기에 연결된 축 문자를 설정합니다 (보통 E이지만 일부 프린터는 A를 사용합니다)." +#: src/libslic3r/PrintConfig.cpp:540 +msgid "" +"Use this option to set the axis letter associated to your printer's extruder " +"(usually E but some printers use A)." +msgstr "" +"이 옵션을 사용하여 프린터의 압출기에 연결된 축 문자를 설정합니다 (보통 E이지" +"만 일부 프린터는 A를 사용합니다)." -#: src/libslic3r/PrintConfig.cpp:528 +#: src/libslic3r/PrintConfig.cpp:545 msgid "Extrusion multiplier" msgstr "압출 승수" -#: src/libslic3r/PrintConfig.cpp:529 -msgid "This factor changes the amount of flow proportionally. You may need to tweak this setting to get nice surface finish and correct single wall widths. Usual values are between 0.9 and 1.1. If you think you need to change this more, check filament diameter and your firmware E steps." -msgstr "이 요소는 비례하여 유량의 양을 변경합니다. 멋진 서페이스 마무리와 단일 벽 너비를 얻기 위해이 설정을 조정해야 할 수도 있습니다. 일반적인 값은 0.9와 1.1 사이입니다. 이 값을 더 변경해야한다고 판단되면 필라멘트 직경과 펌웨어 E 단계를 확인하십시오." +#: src/libslic3r/PrintConfig.cpp:546 +msgid "" +"This factor changes the amount of flow proportionally. You may need to tweak " +"this setting to get nice surface finish and correct single wall widths. " +"Usual values are between 0.9 and 1.1. If you think you need to change this " +"more, check filament diameter and your firmware E steps." +msgstr "" +"이 요소는 비례하여 유량의 양을 변경합니다. 멋진 서페이스 마무리와 단일 벽 너" +"비를 얻기 위해이 설정을 조정해야 할 수도 있습니다. 일반적인 값은 0.9와 1.1 사" +"이입니다. 이 값을 더 변경해야한다고 판단되면 필라멘트 직경과 펌웨어 E 단계를 " +"확인하십시오." -#: src/libslic3r/PrintConfig.cpp:537 +#: src/libslic3r/PrintConfig.cpp:554 msgid "Default extrusion width" msgstr "기본 압출 폭" -#: src/libslic3r/PrintConfig.cpp:539 -msgid "Set this to a non-zero value to allow a manual extrusion width. If left to zero, Slic3r derives extrusion widths from the nozzle diameter (see the tooltips for perimeter extrusion width, infill extrusion width etc). If expressed as percentage (for example: 230%), it will be computed over layer height." -msgstr "수동 압출 폭을 허용하려면이 값을 0이 아닌 값으로 설정하십시오. 0으로 남겨두면 Slic3r은 노즐 직경에서 압출 폭을 도출합니다 (주변 압출 폭, 성형 압출 폭 등의 툴팁 참조). 백분율로 표시되는 경우 (예 : 230 %) 레이어 높이를 기준으로 계산됩니다." +#: src/libslic3r/PrintConfig.cpp:556 +msgid "" +"Set this to a non-zero value to allow a manual extrusion width. If left to " +"zero, Slic3r derives extrusion widths from the nozzle diameter (see the " +"tooltips for perimeter extrusion width, infill extrusion width etc). If " +"expressed as percentage (for example: 230%), it will be computed over layer " +"height." +msgstr "" +"수동 압출 폭을 허용하려면이 값을 0이 아닌 값으로 설정하십시오. 0으로 남겨두" +"면 Slic3r은 노즐 직경에서 압출 폭을 도출합니다 (주변 압출 폭, 성형 압출 폭 등" +"의 툴팁 참조). 백분율로 표시되는 경우 (예 : 230 %) 레이어 높이를 기준으로 계" +"산됩니다." -#: src/libslic3r/PrintConfig.cpp:548 +#: src/libslic3r/PrintConfig.cpp:566 msgid "Keep fan always on" msgstr "항상 팬 켜기" -#: src/libslic3r/PrintConfig.cpp:549 -msgid "If this is enabled, fan will never be disabled and will be kept running at least at its minimum speed. Useful for PLA, harmful for ABS." -msgstr "이 기능을 사용하면 팬이 비활성화되지 않으며 최소한 최소 속도로 계속 회전합니다. PLA에 유용하며 ABS에 해롭다." +#: src/libslic3r/PrintConfig.cpp:567 +msgid "" +"If this is enabled, fan will never be disabled and will be kept running at " +"least at its minimum speed. Useful for PLA, harmful for ABS." +msgstr "" +"이 기능을 사용하면 팬이 비활성화되지 않으며 최소한 최소 속도로 계속 회전합니" +"다. PLA에 유용하며 ABS에 해롭다." -#: src/libslic3r/PrintConfig.cpp:554 +#: src/libslic3r/PrintConfig.cpp:572 msgid "Enable fan if layer print time is below" msgstr "레이어 인쇄 시간이 미만인 경우 팬 활성화" -#: src/libslic3r/PrintConfig.cpp:555 -msgid "If layer print time is estimated below this number of seconds, fan will be enabled and its speed will be calculated by interpolating the minimum and maximum speeds." -msgstr "레이어 인쇄 시간이이 초 미만으로 예상되는 경우 팬이 활성화되고 속도는 최소 및 최대 속도를 보간하여 계산됩니다." +#: src/libslic3r/PrintConfig.cpp:573 +msgid "" +"If layer print time is estimated below this number of seconds, fan will be " +"enabled and its speed will be calculated by interpolating the minimum and " +"maximum speeds." +msgstr "" +"레이어 인쇄 시간이이 초 미만으로 예상되는 경우 팬이 활성화되고 속도는 최소 " +"및 최대 속도를 보간하여 계산됩니다." -#: src/libslic3r/PrintConfig.cpp:557 src/libslic3r/PrintConfig.cpp:1687 +#: src/libslic3r/PrintConfig.cpp:575 src/libslic3r/PrintConfig.cpp:1717 msgid "approximate seconds" msgstr "근사치 초" -#: src/libslic3r/PrintConfig.cpp:565 -msgid "Color" -msgstr "색상" - -#: src/libslic3r/PrintConfig.cpp:571 +#: src/libslic3r/PrintConfig.cpp:589 msgid "Filament notes" msgstr "필라멘트 메모" -#: src/libslic3r/PrintConfig.cpp:572 +#: src/libslic3r/PrintConfig.cpp:590 msgid "You can put your notes regarding the filament here." msgstr "여기에 필라멘트에 관한 메모를 넣을 수 있다." -#: src/libslic3r/PrintConfig.cpp:580 src/libslic3r/PrintConfig.cpp:1231 +#: src/libslic3r/PrintConfig.cpp:598 src/libslic3r/PrintConfig.cpp:1256 msgid "Max volumetric speed" msgstr "최대 체적 속도" -#: src/libslic3r/PrintConfig.cpp:581 -msgid "Maximum volumetric speed allowed for this filament. Limits the maximum volumetric speed of a print to the minimum of print and filament volumetric speed. Set to zero for no limit." -msgstr "이 필라멘트에 허용되는 최대 체적 속도. 인쇄물의 최대 체적 속도를 인쇄 및 필라멘트 체적 속도 최소로 제한한다. 제한 없음에 대해 0으로 설정하십시오." +#: src/libslic3r/PrintConfig.cpp:599 +msgid "" +"Maximum volumetric speed allowed for this filament. Limits the maximum " +"volumetric speed of a print to the minimum of print and filament volumetric " +"speed. Set to zero for no limit." +msgstr "" +"이 필라멘트에 허용되는 최대 체적 속도. 인쇄물의 최대 체적 속도를 인쇄 및 필라" +"멘트 체적 속도 최소로 제한한다. 제한 없음에 대해 0으로 설정하십시오." -#: src/libslic3r/PrintConfig.cpp:590 +#: src/libslic3r/PrintConfig.cpp:608 msgid "Loading speed" msgstr "로딩 속도" -#: src/libslic3r/PrintConfig.cpp:591 +#: src/libslic3r/PrintConfig.cpp:609 msgid "Speed used for loading the filament on the wipe tower." -msgstr "와이퍼 탑(wipe)에 필라멘트를 장착하는 데 사용되는 속도. " +msgstr "와이퍼 타워(wipe)에 필라멘트를 장착하는 데 사용되는 속도. " -#: src/libslic3r/PrintConfig.cpp:598 +#: src/libslic3r/PrintConfig.cpp:616 msgid "Loading speed at the start" msgstr "시작시 로딩 속도" -#: src/libslic3r/PrintConfig.cpp:599 +#: src/libslic3r/PrintConfig.cpp:617 msgid "Speed used at the very beginning of loading phase." msgstr "로딩 단계의 시작에 사용 되는 속도." -#: src/libslic3r/PrintConfig.cpp:606 +#: src/libslic3r/PrintConfig.cpp:624 msgid "Unloading speed" msgstr "언로딩 스피드" -#: src/libslic3r/PrintConfig.cpp:607 -msgid "Speed used for unloading the filament on the wipe tower (does not affect initial part of unloading just after ramming)." -msgstr "와이퍼 타워에서 필라멘트를 언로드하는 데 사용되는 속도(램핑 후 바로 언로딩의 초기 부분에는 영향을 주지 않음)." +#: src/libslic3r/PrintConfig.cpp:625 +msgid "" +"Speed used for unloading the filament on the wipe tower (does not affect " +"initial part of unloading just after ramming)." +msgstr "" +"와이퍼 타워에서 필라멘트를 언로드하는 데 사용되는 속도(램핑 후 바로 언로딩의 " +"초기 부분에는 영향을 주지 않음)." -#: src/libslic3r/PrintConfig.cpp:615 +#: src/libslic3r/PrintConfig.cpp:633 msgid "Unloading speed at the start" msgstr "시작 시 언로드 속도" -#: src/libslic3r/PrintConfig.cpp:616 -msgid "Speed used for unloading the tip of the filament immediately after ramming." +#: src/libslic3r/PrintConfig.cpp:634 +msgid "" +"Speed used for unloading the tip of the filament immediately after ramming." msgstr "속도는 램 밍 직후 필 라 멘 트의 팁을 언로딩 하는 데 사용 됩니다." -#: src/libslic3r/PrintConfig.cpp:623 +#: src/libslic3r/PrintConfig.cpp:641 msgid "Delay after unloading" msgstr "언로드 후 딜레이" -#: src/libslic3r/PrintConfig.cpp:624 -msgid "Time to wait after the filament is unloaded. May help to get reliable toolchanges with flexible materials that may need more time to shrink to original dimensions." -msgstr "필라멘트를 내린 후 기다리는 시간. 원래 치수로 축소하는 데, 더 많은 시간이 필요할 수 있는 유연한 재료로 신뢰할 수있는 공구 교환을 얻을 수 있습니다." +#: src/libslic3r/PrintConfig.cpp:642 +msgid "" +"Time to wait after the filament is unloaded. May help to get reliable " +"toolchanges with flexible materials that may need more time to shrink to " +"original dimensions." +msgstr "" +"필라멘트를 내린 후 기다리는 시간. 원래 치수로 축소하는 데, 더 많은 시간이 필" +"요할 수 있는 유연한 재료로 신뢰할 수있는 공구 교환을 얻을 수 있습니다." -#: src/libslic3r/PrintConfig.cpp:633 +#: src/libslic3r/PrintConfig.cpp:651 msgid "Number of cooling moves" msgstr "쿨링 이동 숫자" -#: src/libslic3r/PrintConfig.cpp:634 -msgid "Filament is cooled by being moved back and forth in the cooling tubes. Specify desired number of these moves." -msgstr "필라멘트는 쿨링 튜브에서 앞뒤로 이동 하여 냉각 됩니다. 이러한 이동의 원하는 값을 지정 합니다." +#: src/libslic3r/PrintConfig.cpp:652 +msgid "" +"Filament is cooled by being moved back and forth in the cooling tubes. " +"Specify desired number of these moves." +msgstr "" +"필라멘트는 쿨링 튜브에서 앞뒤로 이동 하여 냉각 됩니다. 이러한 이동의 원하는 " +"값을 지정 합니다." -#: src/libslic3r/PrintConfig.cpp:642 +#: src/libslic3r/PrintConfig.cpp:660 msgid "Speed of the first cooling move" msgstr "첫 번째 냉각 이동 속도" -#: src/libslic3r/PrintConfig.cpp:643 +#: src/libslic3r/PrintConfig.cpp:661 msgid "Cooling moves are gradually accelerating beginning at this speed." msgstr "냉각 속도가 서서히 빨라지고 있습니다." -#: src/libslic3r/PrintConfig.cpp:650 +#: src/libslic3r/PrintConfig.cpp:668 msgid "Minimal purge on wipe tower" msgstr "와이프(wipe) 탑의 최소 퍼지" -#: src/libslic3r/PrintConfig.cpp:651 -msgid "After a tool change, the exact position of the newly loaded filament inside the nozzle may not be known, and the filament pressure is likely not yet stable. Before purging the print head into an infill or a sacrificial object, Slic3r will always prime this amount of material into the wipe tower to produce successive infill or sacrificial object extrusions reliably." -msgstr "공구가 변경 된 후 노즐 내부에 새로 로드 된 필라멘트의 정확한 위치를 알 수 없으며, 필라멘트 압력이 아직 안정적이지 않을 수 있습니다. 프린트 헤드를 인필 또는 희생(sacrificial) 객체(object)로 소거 하기 전에 Slic3r는 항상이 양의 재료를 와이프 탑에 넣어 연속적인 채우기 또는 희생(sacrificial) 객체(object) 돌출을 안정적으로 생성 합니다." +#: src/libslic3r/PrintConfig.cpp:669 +msgid "" +"After a tool change, the exact position of the newly loaded filament inside " +"the nozzle may not be known, and the filament pressure is likely not yet " +"stable. Before purging the print head into an infill or a sacrificial " +"object, Slic3r will always prime this amount of material into the wipe tower " +"to produce successive infill or sacrificial object extrusions reliably." +msgstr "" +"공구가 변경 된 후 노즐 내부에 새로 로드 된 필라멘트의 정확한 위치를 알 수 없" +"으며, 필라멘트 압력이 아직 안정적이지 않을 수 있습니다. 프린트 헤드를 인필 또" +"는 희생(sacrificial) 객체(object)로 소거 하기 전에 Slic3r는 항상이 양의 재료" +"를 와이프 탑에 넣어 연속적인 채우기 또는 희생(sacrificial) 객체(object) 돌출" +"을 안정적으로 생성 합니다." -#: src/libslic3r/PrintConfig.cpp:655 +#: src/libslic3r/PrintConfig.cpp:673 msgid "mm³" msgstr "mm ³" -#: src/libslic3r/PrintConfig.cpp:661 +#: src/libslic3r/PrintConfig.cpp:679 msgid "Speed of the last cooling move" msgstr "마지막 냉각 이동 속도" -#: src/libslic3r/PrintConfig.cpp:662 +#: src/libslic3r/PrintConfig.cpp:680 msgid "Cooling moves are gradually accelerating towards this speed." msgstr "냉각은 이 속도쪽으로 점차 가속화되고 있습니다. " -#: src/libslic3r/PrintConfig.cpp:669 +#: src/libslic3r/PrintConfig.cpp:687 msgid "Filament load time" msgstr "필라멘트 로드 시간" -#: src/libslic3r/PrintConfig.cpp:670 -msgid "Time for the printer firmware (or the Multi Material Unit 2.0) to load a new filament during a tool change (when executing the T code). This time is added to the total print time by the G-code time estimator." -msgstr "프린터 펌웨어 (또는 MMU 2.0)가 공구를 변경하는 동안(T 코드를 실행할 때) 새필라멘트를 로드하는 시간입니다. 이 시간은 G 코드 시간 추정기에 의해 총 인쇄 시간에 추가 됩니다." +#: src/libslic3r/PrintConfig.cpp:688 +msgid "" +"Time for the printer firmware (or the Multi Material Unit 2.0) to load a new " +"filament during a tool change (when executing the T code). This time is " +"added to the total print time by the G-code time estimator." +msgstr "" +"프린터 펌웨어 (또는 MMU 2.0)가 공구를 변경하는 동안(T 코드를 실행할 때) 새필" +"라멘트를 로드하는 시간입니다. 이 시간은 G 코드 시간 추정기에 의해 총 인쇄 시" +"간에 추가 됩니다." -#: src/libslic3r/PrintConfig.cpp:677 +#: src/libslic3r/PrintConfig.cpp:695 msgid "Ramming parameters" msgstr "래밍 파라미터" -#: src/libslic3r/PrintConfig.cpp:678 -msgid "This string is edited by RammingDialog and contains ramming specific parameters." -msgstr "이 문자열은 RammingDialog에 의해 편집되고 래밍 특정 매개 변수를 포함합니다." +#: src/libslic3r/PrintConfig.cpp:696 +msgid "" +"This string is edited by RammingDialog and contains ramming specific " +"parameters." +msgstr "" +"이 문자열은 RammingDialog에 의해 편집되고 래밍 특정 매개 변수를 포함합니다." -#: src/libslic3r/PrintConfig.cpp:684 +#: src/libslic3r/PrintConfig.cpp:702 msgid "Filament unload time" msgstr "필라멘트 언로드 시간" -#: src/libslic3r/PrintConfig.cpp:685 -msgid "Time for the printer firmware (or the Multi Material Unit 2.0) to unload a filament during a tool change (when executing the T code). This time is added to the total print time by the G-code time estimator." -msgstr "프린터 펌웨어 (또는 MMU2.0)가 공구 교환 중에 필라멘트를 언로드하기 위한 시간입니다 (T 코드를 실행할 때). 이 시간은 G 코드 시간추정기에 의해 총 인쇄 시간에 추가 됩니다." +#: src/libslic3r/PrintConfig.cpp:703 +msgid "" +"Time for the printer firmware (or the Multi Material Unit 2.0) to unload a " +"filament during a tool change (when executing the T code). This time is " +"added to the total print time by the G-code time estimator." +msgstr "" +"프린터 펌웨어 (또는 MMU2.0)가 공구 교환 중에 필라멘트를 언로드하기 위한 시간" +"입니다 (T 코드를 실행할 때). 이 시간은 G 코드 시간추정기에 의해 총 인쇄 시간" +"에 추가 됩니다." -#: src/libslic3r/PrintConfig.cpp:693 -msgid "Enter your filament diameter here. Good precision is required, so use a caliper and do multiple measurements along the filament, then compute the average." -msgstr "여기에 필라멘트 직경을 입력하십시오. 정밀도가 필요하므로 캘리퍼를 사용하여 필라멘트를 따라 여러 번 측정 한 다음 평균을 계산하십시오." +#: src/libslic3r/PrintConfig.cpp:711 +msgid "" +"Enter your filament diameter here. Good precision is required, so use a " +"caliper and do multiple measurements along the filament, then compute the " +"average." +msgstr "" +"여기에 필라멘트 직경을 입력하십시오. 정밀도가 필요하므로 캘리퍼를 사용하여 필" +"라멘트를 따라 여러 번 측정 한 다음 평균을 계산하십시오." -#: src/libslic3r/PrintConfig.cpp:700 +#: src/libslic3r/PrintConfig.cpp:718 src/libslic3r/PrintConfig.cpp:2504 +#: src/libslic3r/PrintConfig.cpp:2505 msgid "Density" msgstr "밀도" -#: src/libslic3r/PrintConfig.cpp:701 -msgid "Enter your filament density here. This is only for statistical information. A decent way is to weigh a known length of filament and compute the ratio of the length to volume. Better is to calculate the volume directly through displacement." -msgstr "여기서 필라멘트 밀도를 입력하십시오. 이것은 통계 정보 용입니다. 괜찮은 방법은 알려진 길이의 필라멘트의 무게를 측정하고 길이와 볼륨의 비율을 계산하는 것입니다. 변위를 통해 직접적으로 부피를 계산하는 것이 더 좋습니다." +#: src/libslic3r/PrintConfig.cpp:719 +msgid "" +"Enter your filament density here. This is only for statistical information. " +"A decent way is to weigh a known length of filament and compute the ratio of " +"the length to volume. Better is to calculate the volume directly through " +"displacement." +msgstr "" +"여기서 필라멘트 밀도를 입력하십시오. 이것은 통계 정보 용입니다. 괜찮은 방법" +"은 알려진 길이의 필라멘트의 무게를 측정하고 길이와 볼륨의 비율을 계산하는 것" +"입니다. 변위를 통해 직접적으로 부피를 계산하는 것이 더 좋습니다." -#: src/libslic3r/PrintConfig.cpp:704 +#: src/libslic3r/PrintConfig.cpp:722 msgid "g/cm³" msgstr "g/cm³" -#: src/libslic3r/PrintConfig.cpp:709 +#: src/libslic3r/PrintConfig.cpp:727 msgid "Filament type" msgstr "필라멘트 타입" -#: src/libslic3r/PrintConfig.cpp:710 +#: src/libslic3r/PrintConfig.cpp:728 msgid "The filament material type for use in custom G-codes." msgstr "사용자 지정 G 코드에 사용할 필라멘트재료 유형입니다." -#: src/libslic3r/PrintConfig.cpp:736 +#: src/libslic3r/PrintConfig.cpp:755 msgid "Soluble material" msgstr "수용성 재료" -#: src/libslic3r/PrintConfig.cpp:737 +#: src/libslic3r/PrintConfig.cpp:756 msgid "Soluble material is most likely used for a soluble support." msgstr "수용성 재료눈 물에 녹는 서포트에 가장 많이 사용된다." -#: src/libslic3r/PrintConfig.cpp:743 -msgid "Enter your filament cost per kg here. This is only for statistical information." +#: src/libslic3r/PrintConfig.cpp:762 +msgid "" +"Enter your filament cost per kg here. This is only for statistical " +"information." msgstr "필라멘트(kg당) 비용을 여기에 입력하십시오. 통계를 내기 위해서 입니다." -#: src/libslic3r/PrintConfig.cpp:744 +#: src/libslic3r/PrintConfig.cpp:763 msgid "money/kg" msgstr "원(\\)/kg" -#: src/libslic3r/PrintConfig.cpp:753 +#: src/libslic3r/PrintConfig.cpp:772 src/libslic3r/PrintConfig.cpp:2588 +msgid "(Unknown)" +msgstr "(알 수 없음)" + +#: src/libslic3r/PrintConfig.cpp:776 msgid "Fill angle" msgstr "채움 각도" -#: src/libslic3r/PrintConfig.cpp:755 -msgid "Default base angle for infill orientation. Cross-hatching will be applied to this. Bridges will be infilled using the best direction Slic3r can detect, so this setting does not affect them." -msgstr "본 오리엔테이션 방향의 기본 각도입니다. 해칭이 적용될 것입니다. Slic3r이 감지 할 수있는 최상의 방향을 사용하여 브릿징이 채워지므로이 설정은 영향을 미치지 않습니다." +#: src/libslic3r/PrintConfig.cpp:778 +msgid "" +"Default base angle for infill orientation. Cross-hatching will be applied to " +"this. Bridges will be infilled using the best direction Slic3r can detect, " +"so this setting does not affect them." +msgstr "" +"본 오리엔테이션 방향의 기본 각도입니다. 해칭이 적용될 것입니다. Slic3r이 감" +"지 할 수있는 최상의 방향을 사용하여 브릿징이 채워지므로이 설정은 영향을 미치" +"지 않습니다." -#: src/libslic3r/PrintConfig.cpp:767 +#: src/libslic3r/PrintConfig.cpp:790 msgid "Fill density" msgstr "채우기(fill) 밀도" -#: src/libslic3r/PrintConfig.cpp:769 +#: src/libslic3r/PrintConfig.cpp:792 msgid "Density of internal infill, expressed in the range 0% - 100%." msgstr "0 % - 100 % 범위로 표현 된 내부 채움(infill)의 밀도." -#: src/libslic3r/PrintConfig.cpp:804 +#: src/libslic3r/PrintConfig.cpp:827 msgid "Fill pattern" msgstr "채우기(fill) 패턴" -#: src/libslic3r/PrintConfig.cpp:806 +#: src/libslic3r/PrintConfig.cpp:829 msgid "Fill pattern for general low-density infill." msgstr "일반 낮은 밀도 채움의 패턴." -#: src/libslic3r/PrintConfig.cpp:822 +#: src/libslic3r/PrintConfig.cpp:845 msgid "Grid" msgstr "그리드(Grid)" -#: src/libslic3r/PrintConfig.cpp:823 +#: src/libslic3r/PrintConfig.cpp:846 msgid "Triangles" msgstr "삼각형(Triangles)" -#: src/libslic3r/PrintConfig.cpp:824 +#: src/libslic3r/PrintConfig.cpp:847 msgid "Stars" msgstr "별(Stars)" -#: src/libslic3r/PrintConfig.cpp:825 +#: src/libslic3r/PrintConfig.cpp:848 msgid "Cubic" msgstr "큐빅" -#: src/libslic3r/PrintConfig.cpp:826 +#: src/libslic3r/PrintConfig.cpp:849 msgid "Line" msgstr "선(Line)" -#: src/libslic3r/PrintConfig.cpp:828 src/libslic3r/PrintConfig.cpp:1974 +#: src/libslic3r/PrintConfig.cpp:851 src/libslic3r/PrintConfig.cpp:2021 msgid "Honeycomb" msgstr "벌집" -#: src/libslic3r/PrintConfig.cpp:829 +#: src/libslic3r/PrintConfig.cpp:852 msgid "3D Honeycomb" msgstr "3D 벌집" -#: src/libslic3r/PrintConfig.cpp:830 +#: src/libslic3r/PrintConfig.cpp:853 msgid "Gyroid" msgstr "자이로이드(Gyroid)" -#: src/libslic3r/PrintConfig.cpp:837 src/libslic3r/PrintConfig.cpp:846 -#: src/libslic3r/PrintConfig.cpp:854 src/libslic3r/PrintConfig.cpp:887 +#: src/libslic3r/PrintConfig.cpp:860 src/libslic3r/PrintConfig.cpp:869 +#: src/libslic3r/PrintConfig.cpp:877 src/libslic3r/PrintConfig.cpp:911 msgid "First layer" msgstr "첫 레이어" -#: src/libslic3r/PrintConfig.cpp:838 -msgid "This is the acceleration your printer will use for first layer. Set zero to disable acceleration control for first layer." -msgstr "이것은 프린터가 첫 번째 레이어에 사용할 가속도입니다. 0을 설정하면 첫 번째 레이어에 대한 가속 제어가 사용되지 않습니다." +#: src/libslic3r/PrintConfig.cpp:861 +msgid "" +"This is the acceleration your printer will use for first layer. Set zero to " +"disable acceleration control for first layer." +msgstr "" +"이것은 프린터가 첫 번째 레이어에 사용할 가속도입니다. 0을 설정하면 첫 번째 레" +"이어에 대한 가속 제어가 사용되지 않습니다." -#: src/libslic3r/PrintConfig.cpp:847 -msgid "Heated build plate temperature for the first layer. Set this to zero to disable bed temperature control commands in the output." -msgstr "첫 번째 레이어에 대한 빌드 플레이트 온도를 가열. 이 값을 0으로 설정하면 출력에서 ​​베드 온도 제어 명령을 비활성화합니다." +#: src/libslic3r/PrintConfig.cpp:870 +msgid "" +"Heated build plate temperature for the first layer. Set this to zero to " +"disable bed temperature control commands in the output." +msgstr "" +"첫 번째 레이어에 대한 빌드 플레이트 온도를 가열. 이 값을 0으로 설정하면 출력" +"에서 ​​베드 온도 제어 명령을 비활성화합니다." -#: src/libslic3r/PrintConfig.cpp:856 -msgid "Set this to a non-zero value to set a manual extrusion width for first layer. You can use this to force fatter extrudates for better adhesion. If expressed as percentage (for example 120%) it will be computed over first layer height. If set to zero, it will use the default extrusion width." -msgstr "첫 번째 레이어의 수동 압출 폭을 설정하려면이 값을 0이 아닌 값으로 설정합니다. 이 방법을 사용하면보다 우수한 접착력을 위해 더 두꺼운 압출 성형물을 만들 수 있습니다. 백분율 (예 : 120 %)로 표현하면 첫 번째 레이어 높이를 기준으로 계산됩니다. 0으로 설정하면 기본 압출 폭이 사용됩니다." +#: src/libslic3r/PrintConfig.cpp:879 +msgid "" +"Set this to a non-zero value to set a manual extrusion width for first " +"layer. You can use this to force fatter extrudates for better adhesion. If " +"expressed as percentage (for example 120%) it will be computed over first " +"layer height. If set to zero, it will use the default extrusion width." +msgstr "" +"첫 번째 레이어의 수동 압출 폭을 설정하려면이 값을 0이 아닌 값으로 설정합니" +"다. 이 방법을 사용하면보다 우수한 접착력을 위해 더 두꺼운 압출 성형물을 만들 " +"수 있습니다. 백분율 (예 : 120 %)로 표현하면 첫 번째 레이어 높이를 기준으로 계" +"산됩니다. 0으로 설정하면 기본 압출 폭이 사용됩니다." -#: src/libslic3r/PrintConfig.cpp:868 -msgid "When printing with very low layer heights, you might still want to print a thicker bottom layer to improve adhesion and tolerance for non perfect build plates. This can be expressed as an absolute value or as a percentage (for example: 150%) over the default layer height." -msgstr "매우 낮은 층의 높이로 인쇄할 때, 당신은 여전히 완벽하지 않은 빌드 플레이트의 부착력과 허용오차를 개선하기 위해 더 두꺼운 바닥 층을 인쇄하기를 원할 수 있다. 이것은 절대값 또는 기본 계층 높이에 대한 백분율(예: 150%)로 표시할 수 있다." +#: src/libslic3r/PrintConfig.cpp:892 +msgid "" +"When printing with very low layer heights, you might still want to print a " +"thicker bottom layer to improve adhesion and tolerance for non perfect build " +"plates. This can be expressed as an absolute value or as a percentage (for " +"example: 150%) over the default layer height." +msgstr "" +"매우 낮은 층의 높이로 인쇄할 때, 당신은 여전히 완벽하지 않은 빌드 플레이트의 " +"부착력과 허용오차를 개선하기 위해 더 두꺼운 바닥 층을 인쇄하기를 원할 수 있" +"다. 이것은 절대값 또는 기본 계층 높이에 대한 백분율(예: 150%)로 표시할 수 있" +"다." -#: src/libslic3r/PrintConfig.cpp:877 +#: src/libslic3r/PrintConfig.cpp:901 msgid "First layer speed" msgstr "첫 레이어 속도" -#: src/libslic3r/PrintConfig.cpp:878 -msgid "If expressed as absolute value in mm/s, this speed will be applied to all the print moves of the first layer, regardless of their type. If expressed as a percentage (for example: 40%) it will scale the default speeds." -msgstr "절대값(mm/s)으로 표현되는 경우, 이 속도는 유형에 관계없이 첫 번째 층의 모든 인쇄 이동에 적용된다. 백분율(예: 40%)로 표현되는 경우 기본 속도를 스케일링한다." +#: src/libslic3r/PrintConfig.cpp:902 +msgid "" +"If expressed as absolute value in mm/s, this speed will be applied to all " +"the print moves of the first layer, regardless of their type. If expressed " +"as a percentage (for example: 40%) it will scale the default speeds." +msgstr "" +"절대값(mm/s)으로 표현되는 경우, 이 속도는 유형에 관계없이 첫 번째 층의 모든 " +"인쇄 이동에 적용된다. 백분율(예: 40%)로 표현되는 경우 기본 속도를 스케일링한" +"다." -#: src/libslic3r/PrintConfig.cpp:888 -msgid "Extruder temperature for first layer. If you want to control temperature manually during print, set this to zero to disable temperature control commands in the output file." -msgstr "첫 번째 층의 외부 온도. 인쇄 중에 온도를 수동으로 제어하려면 출력 파일에서 온도 제어 명령을 사용하지 않으려면 이 값을 0으로 설정하십시오." +#: src/libslic3r/PrintConfig.cpp:912 +msgid "" +"Extruder temperature for first layer. If you want to control temperature " +"manually during print, set this to zero to disable temperature control " +"commands in the output file." +msgstr "" +"첫 번째 층의 외부 온도. 인쇄 중에 온도를 수동으로 제어하려면 출력 파일에서 온" +"도 제어 명령을 사용하지 않으려면 이 값을 0으로 설정하십시오." -#: src/libslic3r/PrintConfig.cpp:897 -msgid "Speed for filling small gaps using short zigzag moves. Keep this reasonably low to avoid too much shaking and resonance issues. Set zero to disable gaps filling." -msgstr "짧은 지그재그로 작은 틈을 메우기 위한 속도. 너무 많은 진동과 공진 문제를 피하기 위해 이것을 합리적으로 낮게 유지한다. 간격 채우기를 사용하지 않으려면 0을 설정하십시오." +#: src/libslic3r/PrintConfig.cpp:921 +msgid "" +"Speed for filling small gaps using short zigzag moves. Keep this reasonably " +"low to avoid too much shaking and resonance issues. Set zero to disable gaps " +"filling." +msgstr "" +"짧은 지그재그로 작은 틈을 메우기 위한 속도. 너무 많은 진동과 공진 문제를 피하" +"기 위해 이것을 합리적으로 낮게 유지한다. 간격 채우기를 사용하지 않으려면 0을 " +"설정하십시오." -#: src/libslic3r/PrintConfig.cpp:905 +#: src/libslic3r/PrintConfig.cpp:929 msgid "Verbose G-code" -msgstr "세부 G-코드" +msgstr "세부 G-code" -#: src/libslic3r/PrintConfig.cpp:906 -msgid "Enable this to get a commented G-code file, with each line explained by a descriptive text. If you print from SD card, the additional weight of the file could make your firmware slow down." -msgstr "설명 텍스트로 설명되는 각 행과 함께 코멘트된 G-code 파일을 가져오려면 이 옵션을 선택하십시오. 만일 당신이 SD카드로 인쇄한다면, 파일의 추가 무게로 인해 펌웨어의 속도가 느려질 수 있다." +#: src/libslic3r/PrintConfig.cpp:930 +msgid "" +"Enable this to get a commented G-code file, with each line explained by a " +"descriptive text. If you print from SD card, the additional weight of the " +"file could make your firmware slow down." +msgstr "" +"설명 텍스트로 설명되는 각 행과 함께 코멘트된 G-code 파일을 가져오려면 이 옵션" +"을 선택하십시오. 만일 당신이 SD카드로 인쇄한다면, 파일의 추가 무게로 인해 펌" +"웨어의 속도가 느려질 수 있다." -#: src/libslic3r/PrintConfig.cpp:913 +#: src/libslic3r/PrintConfig.cpp:937 msgid "G-code flavor" msgstr "G-code 형식" -#: src/libslic3r/PrintConfig.cpp:914 -msgid "Some G/M-code commands, including temperature control and others, are not universal. Set this option to your printer's firmware to get a compatible output. The \"No extrusion\" flavor prevents Slic3r from exporting any extrusion value at all." -msgstr "온도 조절 등을 포함한 일부 G/M-코드 명령은 보편적이지 않습니다. 호환되는 출력을 얻으려면 보드에 적제된 프린터의 펌웨어로 설정하십시오. \"압출 없음\" 형식은 Slic3r가 어떠한 압출 값도 출력하지 못하게 합니다." +#: src/libslic3r/PrintConfig.cpp:938 +msgid "" +"Some G/M-code commands, including temperature control and others, are not " +"universal. Set this option to your printer's firmware to get a compatible " +"output. The \"No extrusion\" flavor prevents PrusaSlicer from exporting any " +"extrusion value at all." +msgstr "" +"온도 제어 및 기타 를 포함한 일부 G/M 코드 명령은 범용이 아닙니다. 호환되는 출" +"력을 얻으려면 프린터의 펌웨어로 이 옵션을 설정합니다. \"돌출 없음\" 맛은 " +"PrusaSlicer가 압출 값을 전혀 내보내지 못하게 합니다." -#: src/libslic3r/PrintConfig.cpp:937 +#: src/libslic3r/PrintConfig.cpp:961 msgid "No extrusion" msgstr "압출 없음" -#: src/libslic3r/PrintConfig.cpp:942 +#: src/libslic3r/PrintConfig.cpp:966 msgid "Label objects" msgstr "레이블 객체(object)" -#: src/libslic3r/PrintConfig.cpp:943 -msgid "Enable this to add comments into the G-Code labeling print moves with what object they belong to, which is useful for the Octoprint CancelObject plugin. This settings is NOT compatible with Single Extruder Multi Material setup and Wipe into Object / Wipe into Infill." -msgstr "이 기능을 사용 하 여 G 코드 레이블 인쇄에 주석이 속해 있는 객체(object)와 함께 이동 하 여 주석을 추가할 수 있으며,이는 옥 토 프린트 캔 커 작업 플러그인에 유용 합니다. 이 설정은 단일 압출 기 다중 재료 설정과 호환 되지 않으며 객체(object)를 닦아 내 고 채우기로 닦습니다." +#: src/libslic3r/PrintConfig.cpp:967 +msgid "" +"Enable this to add comments into the G-Code labeling print moves with what " +"object they belong to, which is useful for the Octoprint CancelObject " +"plugin. This settings is NOT compatible with Single Extruder Multi Material " +"setup and Wipe into Object / Wipe into Infill." +msgstr "" +"이 기능을 사용 하 여 G 코드 레이블 인쇄에 주석이 속해 있는 객체(object)와 함" +"께 이동 하 여 주석을 추가할 수 있으며,이는 옥 토 프린트 캔 커 작업 플러그인" +"에 유용 합니다. 이 설정은 단일 압출 기 다중 재료 설정과 호환 되지 않으며 객체" +"(object)를 닦아 내 고 채우기로 닦습니다." -#: src/libslic3r/PrintConfig.cpp:950 +#: src/libslic3r/PrintConfig.cpp:974 msgid "High extruder current on filament swap" msgstr "필라멘트스왑에 높은 압출 기 전류" -#: src/libslic3r/PrintConfig.cpp:951 -msgid "It may be beneficial to increase the extruder motor current during the filament exchange sequence to allow for rapid ramming feed rates and to overcome resistance when loading a filament with an ugly shaped tip." -msgstr "필라멘트 교환 동안 압출기 모터 전류를 증가 시키는 것이 유리할 수 있으며, 이는 빠른 래밍 공급 속도를 가능 하게하고, 불규칙한 모양의 필라멘트를 로딩할때 저항을 극복하기 위한것이다." +#: src/libslic3r/PrintConfig.cpp:975 +msgid "" +"It may be beneficial to increase the extruder motor current during the " +"filament exchange sequence to allow for rapid ramming feed rates and to " +"overcome resistance when loading a filament with an ugly shaped tip." +msgstr "" +"필라멘트 교환 동안 압출기 모터 전류를 증가 시키는 것이 유리할 수 있으며, 이" +"는 빠른 래밍 공급 속도를 가능 하게하고, 불규칙한 모양의 필라멘트를 로딩할때 " +"저항을 극복하기 위한것이다." -#: src/libslic3r/PrintConfig.cpp:959 -msgid "This is the acceleration your printer will use for infill. Set zero to disable acceleration control for infill." -msgstr "이것은 당신 프린터의 채움 가속력이다. 주입에 대한 가속 제어를 비활성화하려면 0을 설정하십시오." +#: src/libslic3r/PrintConfig.cpp:983 +msgid "" +"This is the acceleration your printer will use for infill. Set zero to " +"disable acceleration control for infill." +msgstr "" +"이것은 당신 프린터의 채움 가속력이다. 주입에 대한 가속 제어를 비활성화하려면 " +"0을 설정하십시오." -#: src/libslic3r/PrintConfig.cpp:967 +#: src/libslic3r/PrintConfig.cpp:991 msgid "Combine infill every" msgstr "다음 레이어마다 결합" -#: src/libslic3r/PrintConfig.cpp:969 -msgid "This feature allows to combine infill and speed up your print by extruding thicker infill layers while preserving thin perimeters, thus accuracy." -msgstr "이 기능은 인필을 결합하고 얇은 주변기기를 보존하면서 두꺼운 인필 층을 압출하여 인쇄 속도를 높일 수 있도록 하여 정확도를 높인다." +#: src/libslic3r/PrintConfig.cpp:993 +msgid "" +"This feature allows to combine infill and speed up your print by extruding " +"thicker infill layers while preserving thin perimeters, thus accuracy." +msgstr "" +"이 기능은 인필을 결합하고 얇은 주변기기를 보존하면서 두꺼운 인필 층을 압출하" +"여 인쇄 속도를 높일 수 있도록 하여 정확도를 높인다." -#: src/libslic3r/PrintConfig.cpp:972 +#: src/libslic3r/PrintConfig.cpp:996 msgid "Combine infill every n layers" msgstr "모든 n개 층을 채우기 위해 결합" -#: src/libslic3r/PrintConfig.cpp:978 +#: src/libslic3r/PrintConfig.cpp:1002 msgid "Infill extruder" msgstr "채움(Infill) 익스트루더" -#: src/libslic3r/PrintConfig.cpp:980 +#: src/libslic3r/PrintConfig.cpp:1004 msgid "The extruder to use when printing infill." msgstr "채움으로 사용할 익스트루더." -#: src/libslic3r/PrintConfig.cpp:988 -msgid "Set this to a non-zero value to set a manual extrusion width for infill. If left zero, default extrusion width will be used if set, otherwise 1.125 x nozzle diameter will be used. You may want to use fatter extrudates to speed up the infill and make your parts stronger. If expressed as percentage (for example 90%) it will be computed over layer height." -msgstr "채움에 수동 압출 폭을 설정하려면이 값을 0이 아닌 값으로 설정합니다. 0으로 설정하면 설정된 경우 기본 압출 폭이 사용되고 그렇지 않으면 1.125 x 노즐 직경이 사용됩니다. 채움 속도를 높이고 부품(Part)을 더 강하게 만들려면보다 큰 압출 성형물을 사용하는 것이 좋습니다. 백분율 (예 : 90 %)로 표현하면 레이어 높이를 기준으로 계산됩니다." +#: src/libslic3r/PrintConfig.cpp:1012 +msgid "" +"Set this to a non-zero value to set a manual extrusion width for infill. If " +"left zero, default extrusion width will be used if set, otherwise 1.125 x " +"nozzle diameter will be used. You may want to use fatter extrudates to speed " +"up the infill and make your parts stronger. If expressed as percentage (for " +"example 90%) it will be computed over layer height." +msgstr "" +"채움에 수동 압출 폭을 설정하려면이 값을 0이 아닌 값으로 설정합니다. 0으로 설" +"정하면 설정된 경우 기본 압출 폭이 사용되고 그렇지 않으면 1.125 x 노즐 직경이 " +"사용됩니다. 채움 속도를 높이고 부품(Part)을 더 강하게 만들려면보다 큰 압출 성" +"형물을 사용하는 것이 좋습니다. 백분율 (예 : 90 %)로 표현하면 레이어 높이를 기" +"준으로 계산됩니다." -#: src/libslic3r/PrintConfig.cpp:997 +#: src/libslic3r/PrintConfig.cpp:1022 msgid "Infill before perimeters" msgstr "둘레보다 앞쪽에 채움" -#: src/libslic3r/PrintConfig.cpp:998 -msgid "This option will switch the print order of perimeters and infill, making the latter first." +#: src/libslic3r/PrintConfig.cpp:1023 +msgid "" +"This option will switch the print order of perimeters and infill, making the " +"latter first." msgstr "이 옵션은 외부출력과 채움 인쇄 순서를 바꾸어, 후자를 먼저 만든다." -#: src/libslic3r/PrintConfig.cpp:1003 +#: src/libslic3r/PrintConfig.cpp:1028 msgid "Only infill where needed" msgstr "필요한 경우 채움" -#: src/libslic3r/PrintConfig.cpp:1005 -msgid "This option will limit infill to the areas actually needed for supporting ceilings (it will act as internal support material). If enabled, slows down the G-code generation due to the multiple checks involved." -msgstr "이 옵션은 천장 지원에 실제로 필요한 영역에만 적용된다(내부 서포트 재료 역할을 할 것이다). 활성화된 경우 관련된 여러 번의 점검으로 인해 G-code 생성 속도를 늦춰라." +#: src/libslic3r/PrintConfig.cpp:1030 +msgid "" +"This option will limit infill to the areas actually needed for supporting " +"ceilings (it will act as internal support material). If enabled, slows down " +"the G-code generation due to the multiple checks involved." +msgstr "" +"이 옵션은 천장 지원에 실제로 필요한 영역에만 적용된다(내부 서포트 재료 역할" +"을 할 것이다). 활성화된 경우 관련된 여러 번의 점검으로 인해 G-code 생성 속도" +"를 늦춰라." -#: src/libslic3r/PrintConfig.cpp:1012 +#: src/libslic3r/PrintConfig.cpp:1037 msgid "Infill/perimeters overlap" msgstr "채움/둘레 겹침(perimeters overlap)" -#: src/libslic3r/PrintConfig.cpp:1014 -msgid "This setting applies an additional overlap between infill and perimeters for better bonding. Theoretically this shouldn't be needed, but backlash might cause gaps. If expressed as percentage (example: 15%) it is calculated over perimeter extrusion width." -msgstr "이 설정은 더 나은 본딩을 위해 충전 및 둘레 사이에 추가 겹침을 적용합니다. 이론적으로 이것은 필요하지 않아야하지만 백래시가 갭을 유발할 수 있습니다. 백분율 (예 : 15 %)로 표시되는 경우 경계 압출 폭을 기준으로 계산됩니다." +#: src/libslic3r/PrintConfig.cpp:1039 +msgid "" +"This setting applies an additional overlap between infill and perimeters for " +"better bonding. Theoretically this shouldn't be needed, but backlash might " +"cause gaps. If expressed as percentage (example: 15%) it is calculated over " +"perimeter extrusion width." +msgstr "" +"이 설정은 더 나은 본딩을 위해 충전 및 둘레 사이에 추가 겹침을 적용합니다. 이" +"론적으로 이것은 필요하지 않아야하지만 백래시가 갭을 유발할 수 있습니다. 백분" +"율 (예 : 15 %)로 표시되는 경우 경계 압출 폭을 기준으로 계산됩니다." -#: src/libslic3r/PrintConfig.cpp:1025 +#: src/libslic3r/PrintConfig.cpp:1050 msgid "Speed for printing the internal fill. Set to zero for auto." msgstr "내부 채우기 인쇄 속도. 자동으로 0으로 설정하십시오." -#: src/libslic3r/PrintConfig.cpp:1033 +#: src/libslic3r/PrintConfig.cpp:1058 msgid "Inherits profile" msgstr "프로필 상속" -#: src/libslic3r/PrintConfig.cpp:1034 +#: src/libslic3r/PrintConfig.cpp:1059 msgid "Name of the profile, from which this profile inherits." msgstr "이 프로파일이 상속되는 프로파일의 이름." -#: src/libslic3r/PrintConfig.cpp:1047 +#: src/libslic3r/PrintConfig.cpp:1072 msgid "Interface shells" msgstr "접점 셸(shells)" -#: src/libslic3r/PrintConfig.cpp:1048 -msgid "Force the generation of solid shells between adjacent materials/volumes. Useful for multi-extruder prints with translucent materials or manual soluble support material." -msgstr "인접 재료/볼륨 사이에 고체 쉘 생성을 강제하십시오. 반투명 재료 또는 수동 수용성 서포트 재료를 사용한 다중 압ㅊ기 인쇄에 유용함." +#: src/libslic3r/PrintConfig.cpp:1073 +msgid "" +"Force the generation of solid shells between adjacent materials/volumes. " +"Useful for multi-extruder prints with translucent materials or manual " +"soluble support material." +msgstr "" +"인접 재료/볼륨 사이에 고체 쉘 생성을 강제하십시오. 반투명 재료 또는 수동 수용" +"성 서포트 재료를 사용한 다중 압ㅊ기 인쇄에 유용함." -#: src/libslic3r/PrintConfig.cpp:1057 -msgid "This custom code is inserted at every layer change, right after the Z move and before the extruder moves to the first layer point. Note that you can use placeholder variables for all Slic3r settings as well as [layer_num] and [layer_z]." -msgstr "이 사용자 정의 코드는 Z 이동 직후와 압출부가 첫 번째 레이어 포인트로 이동하기 전에 모든 레이어 변경 시 삽입된다. 모든 Slic3r 설정뿐만 아니라 [layer_num] 및 [layer_z]에 자리 표시자 변수를 사용할 수 있다는 점에 유의하십시오." +#: src/libslic3r/PrintConfig.cpp:1082 +msgid "" +"This custom code is inserted at every layer change, right after the Z move " +"and before the extruder moves to the first layer point. Note that you can " +"use placeholder variables for all Slic3r settings as well as [layer_num] and " +"[layer_z]." +msgstr "" +"이 사용자 정의 코드는 Z 이동 직후와 압출부가 첫 번째 레이어 포인트로 이동하" +"기 전에 모든 레이어 변경 시 삽입된다. 모든 Slic3r 설정뿐만 아니라 " +"[layer_num] 및 [layer_z]에 자리 표시자 변수를 사용할 수 있다는 점에 유의하십" +"시오." -#: src/libslic3r/PrintConfig.cpp:1068 +#: src/libslic3r/PrintConfig.cpp:1093 msgid "Supports remaining times" msgstr "남은 시간 지원" -#: src/libslic3r/PrintConfig.cpp:1069 -msgid "Emit M73 P[percent printed] R[remaining time in minutes] at 1 minute intervals into the G-code to let the firmware show accurate remaining time. As of now only the Prusa i3 MK3 firmware recognizes M73. Also the i3 MK3 firmware supports M73 Qxx Sxx for the silent mode." -msgstr "G 코드에 1 분 간격으로 M73 P [퍼센트 인쇄] R[remaining time in minutes]을 방출하여 펌웨어가 정확한 잔여 시간을 표시 하도록 합니다. 현재만 Prusa i3 MK3 펌웨어는 M73를 인식 하 고 있습니다. 또한 i3 MK3 펌웨어는 자동 모드에서 M73 Qxx Sxx를 지원 합니다." +#: src/libslic3r/PrintConfig.cpp:1094 +msgid "" +"Emit M73 P[percent printed] R[remaining time in minutes] at 1 minute " +"intervals into the G-code to let the firmware show accurate remaining time. " +"As of now only the Prusa i3 MK3 firmware recognizes M73. Also the i3 MK3 " +"firmware supports M73 Qxx Sxx for the silent mode." +msgstr "" +"G 코드에 1 분 간격으로 M73 P [퍼센트 인쇄] R[remaining time in minutes]을 방" +"출하여 펌웨어가 정확한 잔여 시간을 표시 하도록 합니다. 현재만 Prusa i3 MK3 펌" +"웨어는 M73를 인식 하 고 있습니다. 또한 i3 MK3 펌웨어는 자동 모드에서 M73 Qxx " +"Sxx를 지원 합니다." -#: src/libslic3r/PrintConfig.cpp:1077 +#: src/libslic3r/PrintConfig.cpp:1102 msgid "Supports stealth mode" msgstr "자동 모드 지원" -#: src/libslic3r/PrintConfig.cpp:1078 +#: src/libslic3r/PrintConfig.cpp:1103 msgid "The firmware supports stealth mode" msgstr "펌웨어는 스텔스 모드를 지원 합니다" -#: src/libslic3r/PrintConfig.cpp:1102 +#: src/libslic3r/PrintConfig.cpp:1127 msgid "Maximum feedrate X" msgstr "최대 이송 속도 X" -#: src/libslic3r/PrintConfig.cpp:1103 +#: src/libslic3r/PrintConfig.cpp:1128 msgid "Maximum feedrate Y" msgstr "최대 이송 속도 Y" -#: src/libslic3r/PrintConfig.cpp:1104 +#: src/libslic3r/PrintConfig.cpp:1129 msgid "Maximum feedrate Z" msgstr "최대 이송 속도 Z" -#: src/libslic3r/PrintConfig.cpp:1105 +#: src/libslic3r/PrintConfig.cpp:1130 msgid "Maximum feedrate E" msgstr "최대 이송 속도 E" -#: src/libslic3r/PrintConfig.cpp:1108 +#: src/libslic3r/PrintConfig.cpp:1133 msgid "Maximum feedrate of the X axis" msgstr "X 축의 최대 이송 속도" -#: src/libslic3r/PrintConfig.cpp:1109 +#: src/libslic3r/PrintConfig.cpp:1134 msgid "Maximum feedrate of the Y axis" msgstr "Y 축의 최대 이송 속도" -#: src/libslic3r/PrintConfig.cpp:1110 +#: src/libslic3r/PrintConfig.cpp:1135 msgid "Maximum feedrate of the Z axis" msgstr "Z 축의 최대 이송 속도" -#: src/libslic3r/PrintConfig.cpp:1111 +#: src/libslic3r/PrintConfig.cpp:1136 msgid "Maximum feedrate of the E axis" msgstr "E 축의 최대 이송 속도" -#: src/libslic3r/PrintConfig.cpp:1120 +#: src/libslic3r/PrintConfig.cpp:1145 msgid "Maximum acceleration X" msgstr "최대 가속도 X" -#: src/libslic3r/PrintConfig.cpp:1121 +#: src/libslic3r/PrintConfig.cpp:1146 msgid "Maximum acceleration Y" msgstr "최대 가속도 Y" -#: src/libslic3r/PrintConfig.cpp:1122 +#: src/libslic3r/PrintConfig.cpp:1147 msgid "Maximum acceleration Z" msgstr "최대 가속 Z" -#: src/libslic3r/PrintConfig.cpp:1123 +#: src/libslic3r/PrintConfig.cpp:1148 msgid "Maximum acceleration E" msgstr "최대 가속 E" -#: src/libslic3r/PrintConfig.cpp:1126 +#: src/libslic3r/PrintConfig.cpp:1151 msgid "Maximum acceleration of the X axis" msgstr "X 축의 최대 가속도" -#: src/libslic3r/PrintConfig.cpp:1127 +#: src/libslic3r/PrintConfig.cpp:1152 msgid "Maximum acceleration of the Y axis" msgstr "Y 축의 최대 가속도" -#: src/libslic3r/PrintConfig.cpp:1128 +#: src/libslic3r/PrintConfig.cpp:1153 msgid "Maximum acceleration of the Z axis" msgstr "Z 축의 최대 가속도" -#: src/libslic3r/PrintConfig.cpp:1129 +#: src/libslic3r/PrintConfig.cpp:1154 msgid "Maximum acceleration of the E axis" msgstr "E 축의 최대 가속도" -#: src/libslic3r/PrintConfig.cpp:1138 +#: src/libslic3r/PrintConfig.cpp:1163 msgid "Maximum jerk X" msgstr "최대 저크(jerk) X" -#: src/libslic3r/PrintConfig.cpp:1139 +#: src/libslic3r/PrintConfig.cpp:1164 msgid "Maximum jerk Y" msgstr "최대 저크(jerk) Y" -#: src/libslic3r/PrintConfig.cpp:1140 +#: src/libslic3r/PrintConfig.cpp:1165 msgid "Maximum jerk Z" msgstr "최대 저크(jerk) Z" -#: src/libslic3r/PrintConfig.cpp:1141 +#: src/libslic3r/PrintConfig.cpp:1166 msgid "Maximum jerk E" msgstr "최대 저크(jerk) E" -#: src/libslic3r/PrintConfig.cpp:1144 +#: src/libslic3r/PrintConfig.cpp:1169 msgid "Maximum jerk of the X axis" msgstr "X축 최대 저크(jerk)" -#: src/libslic3r/PrintConfig.cpp:1145 +#: src/libslic3r/PrintConfig.cpp:1170 msgid "Maximum jerk of the Y axis" msgstr "Y축 최대 저크는(jerk)" -#: src/libslic3r/PrintConfig.cpp:1146 +#: src/libslic3r/PrintConfig.cpp:1171 msgid "Maximum jerk of the Z axis" msgstr "Z축 최대 저크(jerk)" -#: src/libslic3r/PrintConfig.cpp:1147 +#: src/libslic3r/PrintConfig.cpp:1172 msgid "Maximum jerk of the E axis" msgstr "E축 최대 저크(jerk)" -#: src/libslic3r/PrintConfig.cpp:1158 +#: src/libslic3r/PrintConfig.cpp:1183 msgid "Minimum feedrate when extruding" msgstr "압출시 최소 공급 속도" -#: src/libslic3r/PrintConfig.cpp:1160 +#: src/libslic3r/PrintConfig.cpp:1185 msgid "Minimum feedrate when extruding (M205 S)" msgstr "압출 시 최소 이송 속도 (M205 S)" -#: src/libslic3r/PrintConfig.cpp:1169 +#: src/libslic3r/PrintConfig.cpp:1194 msgid "Minimum travel feedrate" msgstr "최소 이송 속도" -#: src/libslic3r/PrintConfig.cpp:1171 +#: src/libslic3r/PrintConfig.cpp:1196 msgid "Minimum travel feedrate (M205 T)" msgstr "최소 이동 이송 속도 (M205 T)" -#: src/libslic3r/PrintConfig.cpp:1180 +#: src/libslic3r/PrintConfig.cpp:1205 msgid "Maximum acceleration when extruding" msgstr "압출시 최대 가속도" -#: src/libslic3r/PrintConfig.cpp:1182 +#: src/libslic3r/PrintConfig.cpp:1207 msgid "Maximum acceleration when extruding (M204 S)" msgstr "압출 시 최대 가속도 (M204 S)" -#: src/libslic3r/PrintConfig.cpp:1191 +#: src/libslic3r/PrintConfig.cpp:1216 msgid "Maximum acceleration when retracting" msgstr "리트렉션 최대 가속도" -#: src/libslic3r/PrintConfig.cpp:1193 +#: src/libslic3r/PrintConfig.cpp:1218 msgid "Maximum acceleration when retracting (M204 T)" msgstr "후퇴 시 최대 가속도 (M204 T)" -#: src/libslic3r/PrintConfig.cpp:1201 src/libslic3r/PrintConfig.cpp:1210 +#: src/libslic3r/PrintConfig.cpp:1226 src/libslic3r/PrintConfig.cpp:1235 msgid "Max" msgstr "최대" -#: src/libslic3r/PrintConfig.cpp:1202 +#: src/libslic3r/PrintConfig.cpp:1227 msgid "This setting represents the maximum speed of your fan." msgstr "이 설정은 팬의 최대 속도를 나타냅니다." -#: src/libslic3r/PrintConfig.cpp:1211 -#, c-format -msgid "This is the highest printable layer height for this extruder, used to cap the variable layer height and support layer height. Maximum recommended layer height is 75% of the extrusion width to achieve reasonable inter-layer adhesion. If set to 0, layer height is limited to 75% of the nozzle diameter." -msgstr "이것은 이 익스트루더의 가장 높은 인쇄 가능 층 높이이며, 가변 층 높이 및 지지층 높이를 캡하는 데 사용됩니다. 합당한 층간 접착력을 얻기 위해 최대 권장 높이는 압출 폭의 75% of 입니다. 0으로 설정하면 층 높이가 노즐 지름의 75% of로 제한됩니다." +#: src/libslic3r/PrintConfig.cpp:1236 +#, no-c-format +msgid "" +"This is the highest printable layer height for this extruder, used to cap " +"the variable layer height and support layer height. Maximum recommended " +"layer height is 75% of the extrusion width to achieve reasonable inter-layer " +"adhesion. If set to 0, layer height is limited to 75% of the nozzle diameter." +msgstr "" +"이것은 이 익스트루더의 가장 높은 인쇄 가능 층 높이이며, 가변 층 높이 및 지지" +"층 높이를 캡하는 데 사용됩니다. 합당한 층간 접착력을 얻기 위해 최대 권장 높이" +"는 압출 폭의 75% of 입니다. 0으로 설정하면 층 높이가 노즐 지름의 75% of로 제" +"한됩니다." -#: src/libslic3r/PrintConfig.cpp:1221 +#: src/libslic3r/PrintConfig.cpp:1246 msgid "Max print speed" msgstr "최대 프린트 속도" -#: src/libslic3r/PrintConfig.cpp:1222 -msgid "When setting other speed settings to 0 Slic3r will autocalculate the optimal speed in order to keep constant extruder pressure. This experimental setting is used to set the highest print speed you want to allow." -msgstr "다른 속도 설정을 0으로 설정할 경우, 지속적인 외부 압력을 유지하기 위해 최적의 속도를 자동 계산한다. 이 실험 설정은 허용할 최대 인쇄 속도를 설정하는 데 사용된다." +#: src/libslic3r/PrintConfig.cpp:1247 +msgid "" +"When setting other speed settings to 0 Slic3r will autocalculate the optimal " +"speed in order to keep constant extruder pressure. This experimental setting " +"is used to set the highest print speed you want to allow." +msgstr "" +"다른 속도 설정을 0으로 설정할 경우, 지속적인 외부 압력을 유지하기 위해 최적" +"의 속도를 자동 계산한다. 이 실험 설정은 허용할 최대 인쇄 속도를 설정하는 데 " +"사용된다." -#: src/libslic3r/PrintConfig.cpp:1232 -msgid "This experimental setting is used to set the maximum volumetric speed your extruder supports." -msgstr "이 실험 설정은 압출기가 지원하는 최대 체적 속도를 설정하기 위해 사용된다." +#: src/libslic3r/PrintConfig.cpp:1257 +msgid "" +"This experimental setting is used to set the maximum volumetric speed your " +"extruder supports." +msgstr "" +"이 실험 설정은 압출기가 지원하는 최대 체적 속도를 설정하기 위해 사용된다." -#: src/libslic3r/PrintConfig.cpp:1241 +#: src/libslic3r/PrintConfig.cpp:1266 msgid "Max volumetric slope positive" msgstr "최대 체적 기울기 양" -#: src/libslic3r/PrintConfig.cpp:1242 src/libslic3r/PrintConfig.cpp:1253 -msgid "This experimental setting is used to limit the speed of change in extrusion rate. A value of 1.8 mm³/s² ensures, that a change from the extrusion rate of 1.8 mm³/s (0.45mm extrusion width, 0.2mm extrusion height, feedrate 20 mm/s) to 5.4 mm³/s (feedrate 60 mm/s) will take at least 2 seconds." -msgstr "이 실험 설정은 돌출율의 변화 속도를 제한하는데 사용된다. 1.8mm3/s2 값은 1.8mm3/s(0.45mm 압출 폭, 0.2mm 압출 높이, 공급 속도 20mm/s)에서 5.4mm3/s(공급 속도 60mm/s)로 변경하는 데 최소 2초 이상 걸린다." +#: src/libslic3r/PrintConfig.cpp:1267 src/libslic3r/PrintConfig.cpp:1278 +msgid "" +"This experimental setting is used to limit the speed of change in extrusion " +"rate. A value of 1.8 mm³/s² ensures, that a change from the extrusion rate " +"of 1.8 mm³/s (0.45mm extrusion width, 0.2mm extrusion height, feedrate 20 mm/" +"s) to 5.4 mm³/s (feedrate 60 mm/s) will take at least 2 seconds." +msgstr "" +"이 실험 설정은 돌출율의 변화 속도를 제한하는데 사용된다. 1.8mm3/s2 값은 " +"1.8mm3/s(0.45mm 압출 폭, 0.2mm 압출 높이, 공급 속도 20mm/s)에서 5.4mm3/s(공" +"급 속도 60mm/s)로 변경하는 데 최소 2초 이상 걸린다." -#: src/libslic3r/PrintConfig.cpp:1246 src/libslic3r/PrintConfig.cpp:1257 +#: src/libslic3r/PrintConfig.cpp:1271 src/libslic3r/PrintConfig.cpp:1282 msgid "mm³/s²" msgstr "mm³/s²" -#: src/libslic3r/PrintConfig.cpp:1252 +#: src/libslic3r/PrintConfig.cpp:1277 msgid "Max volumetric slope negative" msgstr "최대 체적 기울기 음수" -#: src/libslic3r/PrintConfig.cpp:1264 src/libslic3r/PrintConfig.cpp:1273 +#: src/libslic3r/PrintConfig.cpp:1289 src/libslic3r/PrintConfig.cpp:1298 msgid "Min" msgstr "최소" -#: src/libslic3r/PrintConfig.cpp:1265 +#: src/libslic3r/PrintConfig.cpp:1290 msgid "This setting represents the minimum PWM your fan needs to work." msgstr "이 설정은 최소 PWM팬이 활동하는데 필요한를 나타냅니다." -#: src/libslic3r/PrintConfig.cpp:1274 -msgid "This is the lowest printable layer height for this extruder and limits the resolution for variable layer height. Typical values are between 0.05 mm and 0.1 mm." -msgstr "이것은 이 압출기에 대한 가장 낮은 인쇄 가능한 층 높이이고 가변 층 높이에 대한 분해능을 제한한다. 대표적인 값은 0.05mm와 0.1mm이다." +#: src/libslic3r/PrintConfig.cpp:1299 +msgid "" +"This is the lowest printable layer height for this extruder and limits the " +"resolution for variable layer height. Typical values are between 0.05 mm and " +"0.1 mm." +msgstr "" +"이것은 이 압출기에 대한 가장 낮은 인쇄 가능한 층 높이이고 가변 층 높이에 대" +"한 분해능을 제한한다. 대표적인 값은 0.05mm와 0.1mm이다." -#: src/libslic3r/PrintConfig.cpp:1282 +#: src/libslic3r/PrintConfig.cpp:1307 msgid "Min print speed" msgstr "최소 인쇄 속도" -#: src/libslic3r/PrintConfig.cpp:1283 +#: src/libslic3r/PrintConfig.cpp:1308 msgid "Slic3r will not scale speed down below this speed." msgstr "Slic3r는 이 속도 이하로 속도를 낮추지 않을 것이다." -#: src/libslic3r/PrintConfig.cpp:1290 +#: src/libslic3r/PrintConfig.cpp:1315 msgid "Minimal filament extrusion length" msgstr "최소 필라멘트 압출 길이" -#: src/libslic3r/PrintConfig.cpp:1291 -msgid "Generate no less than the number of skirt loops required to consume the specified amount of filament on the bottom layer. For multi-extruder machines, this minimum applies to each extruder." -msgstr "하단 레이어에서 지정된 양의 필라멘트를 사용하는 데 필요한 스커트 루프의 수 이상으로 생성한다. 다중 익스트루더의 경우, 이 최소값은 각 추가기기에 적용된다." +#: src/libslic3r/PrintConfig.cpp:1316 +msgid "" +"Generate no less than the number of skirt loops required to consume the " +"specified amount of filament on the bottom layer. For multi-extruder " +"machines, this minimum applies to each extruder." +msgstr "" +"하단 레이어에서 지정된 양의 필라멘트를 사용하는 데 필요한 스커트 루프의 수 이" +"상으로 생성한다. 다중 익스트루더의 경우, 이 최소값은 각 추가기기에 적용된다." -#: src/libslic3r/PrintConfig.cpp:1300 +#: src/libslic3r/PrintConfig.cpp:1325 msgid "Configuration notes" msgstr "구성 노트" -#: src/libslic3r/PrintConfig.cpp:1301 -msgid "You can put here your personal notes. This text will be added to the G-code header comments." -msgstr "여기에 개인 노트를 넣을 수 있다. 이 텍스트는 G-code 헤더 코멘트에 추가될 것이다." +#: src/libslic3r/PrintConfig.cpp:1326 +msgid "" +"You can put here your personal notes. This text will be added to the G-code " +"header comments." +msgstr "" +"여기에 개인 노트를 넣을 수 있다. 이 텍스트는 G-code 헤더 코멘트에 추가될 것이" +"다." -#: src/libslic3r/PrintConfig.cpp:1311 -msgid "This is the diameter of your extruder nozzle (for example: 0.5, 0.35 etc.)" -msgstr "이 지름은 ㅇ스트루더 노즐의 직경이다(예: 0.5, 0.35 등)." +#: src/libslic3r/PrintConfig.cpp:1336 +msgid "" +"This is the diameter of your extruder nozzle (for example: 0.5, 0.35 etc.)" +msgstr "이 지름은 익스트루더 노즐의 직경이다(예: 0.5, 0.35 등)." -#: src/libslic3r/PrintConfig.cpp:1316 +#: src/libslic3r/PrintConfig.cpp:1341 msgid "Host Type" msgstr "호스트 유형" -#: src/libslic3r/PrintConfig.cpp:1317 -msgid "Slic3r can upload G-code files to a printer host. This field must contain the kind of the host." -msgstr "Slic3r는 프린터 호스트에 G 코드 파일을 업로드할 수 있습니다. 이 필드에는 호스트의 종류가 포함 되어야 합니다." +#: src/libslic3r/PrintConfig.cpp:1342 +msgid "" +"Slic3r can upload G-code files to a printer host. This field must contain " +"the kind of the host." +msgstr "" +"Slic3r는 프린터 호스트에 G 코드 파일을 업로드할 수 있습니다. 이 필드에는 호스" +"트의 종류가 포함 되어야 합니다." -#: src/libslic3r/PrintConfig.cpp:1328 +#: src/libslic3r/PrintConfig.cpp:1357 msgid "Only retract when crossing perimeters" msgstr "둘레를 횡단 할 때만 수축" -#: src/libslic3r/PrintConfig.cpp:1329 -msgid "Disables retraction when the travel path does not exceed the upper layer's perimeters (and thus any ooze will be probably invisible)." -msgstr "이동 경로가 상위 레이어의 경계를 초과하지 않는 경우 리트랙션을 비활성화합니다. 따라서 모든 오즈가 보이지 않습니다." +#: src/libslic3r/PrintConfig.cpp:1358 +msgid "" +"Disables retraction when the travel path does not exceed the upper layer's " +"perimeters (and thus any ooze will be probably invisible)." +msgstr "" +"이동 경로가 상위 레이어의 경계를 초과하지 않는 경우 리트랙션을 비활성화합니" +"다. 따라서 모든 오즈가 보이지 않습니다." -#: src/libslic3r/PrintConfig.cpp:1336 -msgid "This option will drop the temperature of the inactive extruders to prevent oozing. It will enable a tall skirt automatically and move extruders outside such skirt when changing temperatures." -msgstr "이 옵션은 누출을 방지하기 위해 비활성 압출기의 온도를 떨어 뜨립니다. 온도를 변경할 때 키가 큰 스커트를 자동으로 사용하고 스커트 외부로 압출기를 이동합니다." +#: src/libslic3r/PrintConfig.cpp:1365 +msgid "" +"This option will drop the temperature of the inactive extruders to prevent " +"oozing. It will enable a tall skirt automatically and move extruders outside " +"such skirt when changing temperatures." +msgstr "" +"이 옵션은 누출을 방지하기 위해 비활성 압출기의 온도를 떨어 뜨립니다. 온도를 " +"변경할 때 키가 큰 스커트를 자동으로 사용하고 스커트 외부로 압출기를 이동합니" +"다." -#: src/libslic3r/PrintConfig.cpp:1343 +#: src/libslic3r/PrintConfig.cpp:1372 msgid "Output filename format" msgstr "출력 파일이름 형식" -#: src/libslic3r/PrintConfig.cpp:1344 -msgid "You can use all configuration options as variables inside this template. For example: [layer_height], [fill_density] etc. You can also use [timestamp], [year], [month], [day], [hour], [minute], [second], [version], [input_filename], [input_filename_base]." -msgstr "모든 구성 옵션을이 템플릿 내의 변수로 사용할 수 있습니다. 예: [layer_height], [fill_density] 등 또한 [타임 스탬프], [연도], [월], [일], [시간], [input_filename], [input_filename_base]을 사용할 수 있습니다." +#: src/libslic3r/PrintConfig.cpp:1373 +msgid "" +"You can use all configuration options as variables inside this template. For " +"example: [layer_height], [fill_density] etc. You can also use [timestamp], " +"[year], [month], [day], [hour], [minute], [second], [version], " +"[input_filename], [input_filename_base]." +msgstr "" +"모든 구성 옵션을이 템플릿 내의 변수로 사용할 수 있습니다. 예: " +"[layer_height], [fill_density] 등 또한 [타임 스탬프], [연도], [월], [일], [시" +"간], [input_filename], [input_filename_base]을 사용할 수 있습니다." -#: src/libslic3r/PrintConfig.cpp:1353 +#: src/libslic3r/PrintConfig.cpp:1382 msgid "Detect bridging perimeters" msgstr "브릿 징 경계선 감지" -#: src/libslic3r/PrintConfig.cpp:1355 -msgid "Experimental option to adjust flow for overhangs (bridge flow will be used), to apply bridge speed to them and enable fan." -msgstr "오버행에 대한 유량을 조정하는 실험 옵션 (브리지 흐름(flow)이 사용됨)에 브릿지 속도를 적용하고 팬을 활성화합니다." +#: src/libslic3r/PrintConfig.cpp:1384 +msgid "" +"Experimental option to adjust flow for overhangs (bridge flow will be used), " +"to apply bridge speed to them and enable fan." +msgstr "" +"오버행에 대한 유량을 조정하는 실험 옵션 (브리지 흐름(flow)이 사용됨)에 브릿" +"지 속도를 적용하고 팬을 활성화합니다." -#: src/libslic3r/PrintConfig.cpp:1361 +#: src/libslic3r/PrintConfig.cpp:1390 msgid "Filament parking position" msgstr "필라멘트 멈춤 위치" -#: src/libslic3r/PrintConfig.cpp:1362 -msgid "Distance of the extruder tip from the position where the filament is parked when unloaded. This should match the value in printer firmware." -msgstr "언로딩시 필라멘트 위치에서 압출기 팁의 거리. 이 값은 프린터 펌웨어의 값과 일치해야합니다." +#: src/libslic3r/PrintConfig.cpp:1391 +msgid "" +"Distance of the extruder tip from the position where the filament is parked " +"when unloaded. This should match the value in printer firmware." +msgstr "" +"언로딩시 필라멘트 위치에서 압출기 팁의 거리. 이 값은 프린터 펌웨어의 값과 일" +"치해야합니다." -#: src/libslic3r/PrintConfig.cpp:1370 +#: src/libslic3r/PrintConfig.cpp:1399 msgid "Extra loading distance" msgstr "추가 로딩 거리" -#: src/libslic3r/PrintConfig.cpp:1371 -msgid "When set to zero, the distance the filament is moved from parking position during load is exactly the same as it was moved back during unload. When positive, it is loaded further, if negative, the loading move is shorter than unloading." -msgstr "0으로 설정하면로드 중에 필라멘트가 위치에서 이동 한 거리는 언로드 중에 다시 이동 한 거리와 동일합니다. 양수이면 음수가 더 많이 로드되고 로드가 음수 인 경우 언로드보다 짧습니다." +#: src/libslic3r/PrintConfig.cpp:1400 +msgid "" +"When set to zero, the distance the filament is moved from parking position " +"during load is exactly the same as it was moved back during unload. When " +"positive, it is loaded further, if negative, the loading move is shorter " +"than unloading." +msgstr "" +"0으로 설정하면로드 중에 필라멘트가 위치에서 이동 한 거리는 언로드 중에 다시 " +"이동 한 거리와 동일합니다. 양수이면 음수가 더 많이 로드되고 로드가 음수 인 경" +"우 언로드보다 짧습니다." -#: src/libslic3r/PrintConfig.cpp:1379 src/libslic3r/PrintConfig.cpp:1397 -#: src/libslic3r/PrintConfig.cpp:1409 src/libslic3r/PrintConfig.cpp:1419 +#: src/libslic3r/PrintConfig.cpp:1408 src/libslic3r/PrintConfig.cpp:1426 +#: src/libslic3r/PrintConfig.cpp:1439 src/libslic3r/PrintConfig.cpp:1449 msgid "Perimeters" msgstr "둘레" -#: src/libslic3r/PrintConfig.cpp:1380 -msgid "This is the acceleration your printer will use for perimeters. A high value like 9000 usually gives good results if your hardware is up to the job. Set zero to disable acceleration control for perimeters." -msgstr "프린터가 둘레로 사용할 가속도입니다. 9000과 같은 높은 값은 하드웨어가 제대로 작동하면 좋은 결과를 제공합니다. 주변을 가속 제어하지 않으려면 0으로 설정하십시오." +#: src/libslic3r/PrintConfig.cpp:1409 +msgid "" +"This is the acceleration your printer will use for perimeters. A high value " +"like 9000 usually gives good results if your hardware is up to the job. Set " +"zero to disable acceleration control for perimeters." +msgstr "" +"프린터가 둘레로 사용할 가속도입니다. 9000과 같은 높은 값은 하드웨어가 제대로 " +"작동하면 좋은 결과를 제공합니다. 주변을 가속 제어하지 않으려면 0으로 설정하십" +"시오." -#: src/libslic3r/PrintConfig.cpp:1388 +#: src/libslic3r/PrintConfig.cpp:1417 msgid "Perimeter extruder" msgstr "가장자리(Perimeter) 익스트루더" -#: src/libslic3r/PrintConfig.cpp:1390 -msgid "The extruder to use when printing perimeters and brim. First extruder is 1." -msgstr "둘레와 가장자리를 인쇄 할 때 사용할 압출기입니다. 첫 번째 압출기는 1입니다." +#: src/libslic3r/PrintConfig.cpp:1419 +msgid "" +"The extruder to use when printing perimeters and brim. First extruder is 1." +msgstr "" +"둘레와 가장자리를 인쇄 할 때 사용할 압출기입니다. 첫 번째 압출기는 1입니다." -#: src/libslic3r/PrintConfig.cpp:1399 -msgid "Set this to a non-zero value to set a manual extrusion width for perimeters. You may want to use thinner extrudates to get more accurate surfaces. If left zero, default extrusion width will be used if set, otherwise 1.125 x nozzle diameter will be used. If expressed as percentage (for example 200%) it will be computed over layer height." -msgstr "이 값을 0이 아닌 값으로 설정하면 수동 압출 폭을 둘레로 설정할 수 있습니다. 보다 정확한 서페이스를 얻으려면 더 얇은 압출 성형품을 사용하는 것이 좋습니다. 0으로 설정하면 설정된 경우 기본 돌출 폭이 사용되고 그렇지 않으면 1.125 x 노즐 직경이 사용됩니다. 백분율 (예 : 200 %)로 표현하면 레이어 높이를 기준으로 계산됩니다." +#: src/libslic3r/PrintConfig.cpp:1428 +msgid "" +"Set this to a non-zero value to set a manual extrusion width for perimeters. " +"You may want to use thinner extrudates to get more accurate surfaces. If " +"left zero, default extrusion width will be used if set, otherwise 1.125 x " +"nozzle diameter will be used. If expressed as percentage (for example 200%) " +"it will be computed over layer height." +msgstr "" +"이 값을 0이 아닌 값으로 설정하면 수동 압출 폭을 둘레로 설정할 수 있습니다. 보" +"다 정확한 서페이스를 얻으려면 더 얇은 압출 성형품을 사용하는 것이 좋습니다. 0" +"으로 설정하면 설정된 경우 기본 돌출 폭이 사용되고 그렇지 않으면 1.125 x 노즐 " +"직경이 사용됩니다. 백분율 (예 : 200 %)로 표현하면 레이어 높이를 기준으로 계산" +"됩니다." -#: src/libslic3r/PrintConfig.cpp:1411 -msgid "Speed for perimeters (contours, aka vertical shells). Set to zero for auto." +#: src/libslic3r/PrintConfig.cpp:1441 +msgid "" +"Speed for perimeters (contours, aka vertical shells). Set to zero for auto." msgstr "둘레의 속도 (등고선, 일명 세로 셸). 자동으로 0으로 설정하십시오." -#: src/libslic3r/PrintConfig.cpp:1421 -msgid "This option sets the number of perimeters to generate for each layer. Note that Slic3r may increase this number automatically when it detects sloping surfaces which benefit from a higher number of perimeters if the Extra Perimeters option is enabled." -msgstr "이 옵션은 각 레이어에 대해 생성 할 경계 수를 설정합니다. 추가 경계선 옵션을 사용하면 더 큰 주변 수를 사용하는 경사면을 감지 할 때 Slic3r이이 수를 자동으로 증가시킬 수 있습니다." +#: src/libslic3r/PrintConfig.cpp:1451 +msgid "" +"This option sets the number of perimeters to generate for each layer. Note " +"that Slic3r may increase this number automatically when it detects sloping " +"surfaces which benefit from a higher number of perimeters if the Extra " +"Perimeters option is enabled." +msgstr "" +"이 옵션은 각 레이어에 대해 생성 할 경계 수를 설정합니다. 추가 경계선 옵션을 " +"사용하면 더 큰 주변 수를 사용하는 경사면을 감지 할 때 Slic3r이이 수를 자동으" +"로 증가시킬 수 있습니다." -#: src/libslic3r/PrintConfig.cpp:1425 +#: src/libslic3r/PrintConfig.cpp:1455 msgid "(minimum)" msgstr "(최소)" -#: src/libslic3r/PrintConfig.cpp:1433 -msgid "If you want to process the output G-code through custom scripts, just list their absolute paths here. Separate multiple scripts with a semicolon. Scripts will be passed the absolute path to the G-code file as the first argument, and they can access the Slic3r config settings by reading environment variables." -msgstr "사용자 정의 스크립트를 통해 출력 G 코드를 처리하려면 여기에 절대 경로를 나열하십시오. 여러 개의 스크립트를 세미콜론으로 구분하십시오. 스크립트는 G 코드 파일의 절대 경로를 첫 번째 인수로 전달되며 환경 변수를 읽음으로써 Slic3r 구성 설정에 액세스 할 수 있습니다." +#: src/libslic3r/PrintConfig.cpp:1463 +msgid "" +"If you want to process the output G-code through custom scripts, just list " +"their absolute paths here. Separate multiple scripts with a semicolon. " +"Scripts will be passed the absolute path to the G-code file as the first " +"argument, and they can access the Slic3r config settings by reading " +"environment variables." +msgstr "" +"사용자 정의 스크립트를 통해 출력 G 코드를 처리하려면 여기에 절대 경로를 나열" +"하십시오. 여러 개의 스크립트를 세미콜론으로 구분하십시오. 스크립트는 G 코드 " +"파일의 절대 경로를 첫 번째 인수로 전달되며 환경 변수를 읽음으로써 Slic3r 구" +"성 설정에 액세스 할 수 있습니다." -#: src/libslic3r/PrintConfig.cpp:1445 +#: src/libslic3r/PrintConfig.cpp:1475 msgid "Printer type" msgstr "프린터 타입" -#: src/libslic3r/PrintConfig.cpp:1446 +#: src/libslic3r/PrintConfig.cpp:1476 msgid "Type of the printer." msgstr "프린터 유형." -#: src/libslic3r/PrintConfig.cpp:1451 +#: src/libslic3r/PrintConfig.cpp:1481 msgid "Printer notes" msgstr "프린터 노트" -#: src/libslic3r/PrintConfig.cpp:1452 +#: src/libslic3r/PrintConfig.cpp:1482 msgid "You can put your notes regarding the printer here." msgstr "프린터 관련 메모를 여기에 넣을 수 있습니다." -#: src/libslic3r/PrintConfig.cpp:1460 +#: src/libslic3r/PrintConfig.cpp:1490 msgid "Printer vendor" msgstr "제조 회사" -#: src/libslic3r/PrintConfig.cpp:1461 +#: src/libslic3r/PrintConfig.cpp:1491 msgid "Name of the printer vendor." msgstr "프린터 공급 업체의 이름입니다." -#: src/libslic3r/PrintConfig.cpp:1466 +#: src/libslic3r/PrintConfig.cpp:1496 msgid "Printer variant" msgstr "프린터 변형" -#: src/libslic3r/PrintConfig.cpp:1467 -msgid "Name of the printer variant. For example, the printer variants may be differentiated by a nozzle diameter." -msgstr "프린터 변종 이름입니다. 예를 들어, 프린터 변형은 노즐 지름으로 구별 될 수 있습니다." +#: src/libslic3r/PrintConfig.cpp:1497 +msgid "" +"Name of the printer variant. For example, the printer variants may be " +"differentiated by a nozzle diameter." +msgstr "" +"프린터 변종 이름입니다. 예를 들어, 프린터 변형은 노즐 지름으로 구별 될 수 있" +"습니다." -#: src/libslic3r/PrintConfig.cpp:1480 +#: src/libslic3r/PrintConfig.cpp:1510 msgid "Raft layers" msgstr "라프트(Raft) 레이어" -#: src/libslic3r/PrintConfig.cpp:1482 -msgid "The object will be raised by this number of layers, and support material will be generated under it." -msgstr "물체는 이 개수의 층에 의해 상승되며, 그 아래에서 서포트 재료가 생성될 것이다." +#: src/libslic3r/PrintConfig.cpp:1512 +msgid "" +"The object will be raised by this number of layers, and support material " +"will be generated under it." +msgstr "" +"개체는 이 개수의 층에 의해 상승되며, 그 아래에서 서포트 재료가 생성될 것이다." -#: src/libslic3r/PrintConfig.cpp:1490 +#: src/libslic3r/PrintConfig.cpp:1520 msgid "Resolution" -msgstr "레졸루션" +msgstr "해상도" -#: src/libslic3r/PrintConfig.cpp:1491 -msgid "Minimum detail resolution, used to simplify the input file for speeding up the slicing job and reducing memory usage. High-resolution models often carry more detail than printers can render. Set to zero to disable any simplification and use full resolution from input." -msgstr "잘라내기 작업의 속도를 높이고 메모리 사용량을 줄이기 위해 입력 파일을 단순화하는 데 사용되는 최소 세부 해상도. 고해상도 모델은 종종 프린터가 렌더링할 수 있는 것보다 더 많은 디테일을 가지고 있다. 단순화를 사용하지 않고 입력에서 전체 해상도를 사용하려면 0으로 설정하십시오." +#: src/libslic3r/PrintConfig.cpp:1521 +msgid "" +"Minimum detail resolution, used to simplify the input file for speeding up " +"the slicing job and reducing memory usage. High-resolution models often " +"carry more detail than printers can render. Set to zero to disable any " +"simplification and use full resolution from input." +msgstr "" +"잘라내기 작업의 속도를 높이고 메모리 사용량을 줄이기 위해 입력 파일을 단순화" +"하는 데 사용되는 최소 세부 해상도. 고해상도 모델은 종종 프린터가 렌더링할 수 " +"있는 것보다 더 많은 디테일을 가지고 있다. 단순화를 사용하지 않고 입력에서 전" +"체 해상도를 사용하려면 0으로 설정하십시오." -#: src/libslic3r/PrintConfig.cpp:1501 +#: src/libslic3r/PrintConfig.cpp:1531 msgid "Minimum travel after retraction" msgstr "리트랙션 후 최소 이동 거리" -#: src/libslic3r/PrintConfig.cpp:1502 -msgid "Retraction is not triggered when travel moves are shorter than this length." +#: src/libslic3r/PrintConfig.cpp:1532 +msgid "" +"Retraction is not triggered when travel moves are shorter than this length." msgstr "이동 거리가 이 길이보다 짧으면 리트렉션이 트리거되지 않습니다." -#: src/libslic3r/PrintConfig.cpp:1508 +#: src/libslic3r/PrintConfig.cpp:1538 msgid "Retract amount before wipe" msgstr "닦아 내기 전의 수축량" -#: src/libslic3r/PrintConfig.cpp:1509 -msgid "With bowden extruders, it may be wise to do some amount of quick retract before doing the wipe movement." -msgstr "보우 덴 압출기를 사용하면 와이퍼 동작을하기 전에 약간의 빠른 리트랙션 를하는 것이 좋습니다." +#: src/libslic3r/PrintConfig.cpp:1539 +msgid "" +"With bowden extruders, it may be wise to do some amount of quick retract " +"before doing the wipe movement." +msgstr "" +"보우 덴 압출기를 사용하면 와이퍼 동작을하기 전에 약간의 빠른 리트랙션 를하는 " +"것이 좋습니다." -#: src/libslic3r/PrintConfig.cpp:1516 +#: src/libslic3r/PrintConfig.cpp:1546 msgid "Retract on layer change" msgstr "레이어 변경 후퇴" -#: src/libslic3r/PrintConfig.cpp:1517 +#: src/libslic3r/PrintConfig.cpp:1547 msgid "This flag enforces a retraction whenever a Z move is done." msgstr "이 플래그는 Z 이동이 완료 될 때마다 취소를 강제 실행합니다." -#: src/libslic3r/PrintConfig.cpp:1522 src/libslic3r/PrintConfig.cpp:1530 +#: src/libslic3r/PrintConfig.cpp:1552 src/libslic3r/PrintConfig.cpp:1560 msgid "Length" msgstr "길이" -#: src/libslic3r/PrintConfig.cpp:1523 +#: src/libslic3r/PrintConfig.cpp:1553 msgid "Retraction Length" msgstr "리트랙션 길이" -#: src/libslic3r/PrintConfig.cpp:1524 -msgid "When retraction is triggered, filament is pulled back by the specified amount (the length is measured on raw filament, before it enters the extruder)." -msgstr "후퇴가 트리거되면 필라멘트가 지정된 양만큼 뒤로 당겨집니다 (길이는 압출기에 들어가기 전에 원시 필라멘트에서 측정됩니다)." +#: src/libslic3r/PrintConfig.cpp:1554 +msgid "" +"When retraction is triggered, filament is pulled back by the specified " +"amount (the length is measured on raw filament, before it enters the " +"extruder)." +msgstr "" +"후퇴가 트리거되면 필라멘트가 지정된 양만큼 뒤로 당겨집니다 (길이는 압출기에 " +"들어가기 전에 원시 필라멘트에서 측정됩니다)." -#: src/libslic3r/PrintConfig.cpp:1526 src/libslic3r/PrintConfig.cpp:1535 +#: src/libslic3r/PrintConfig.cpp:1556 src/libslic3r/PrintConfig.cpp:1565 msgid "mm (zero to disable)" msgstr "mm (0은 비활성화)" -#: src/libslic3r/PrintConfig.cpp:1531 +#: src/libslic3r/PrintConfig.cpp:1561 msgid "Retraction Length (Toolchange)" msgstr "리트랙션 길이 (툴 체인지)" -#: src/libslic3r/PrintConfig.cpp:1532 -msgid "When retraction is triggered before changing tool, filament is pulled back by the specified amount (the length is measured on raw filament, before it enters the extruder)." -msgstr "공구를 교체하기 전에 후퇴가 트리거되면 필라멘트가 지정된 양만큼 뒤로 당겨집니다 (길이는 압출기에 들어가기 전에 원시 필라멘트에서 측정됩니다)." +#: src/libslic3r/PrintConfig.cpp:1562 +msgid "" +"When retraction is triggered before changing tool, filament is pulled back " +"by the specified amount (the length is measured on raw filament, before it " +"enters the extruder)." +msgstr "" +"공구를 교체하기 전에 후퇴가 트리거되면 필라멘트가 지정된 양만큼 뒤로 당겨집니" +"다 (길이는 압출기에 들어가기 전에 원시 필라멘트에서 측정됩니다)." -#: src/libslic3r/PrintConfig.cpp:1540 +#: src/libslic3r/PrintConfig.cpp:1570 msgid "Lift Z" msgstr "Z축 올림" -#: src/libslic3r/PrintConfig.cpp:1541 -msgid "If you set this to a positive value, Z is quickly raised every time a retraction is triggered. When using multiple extruders, only the setting for the first extruder will be considered." -msgstr "이 값을 양수 값으로 설정하면 철회가 트리거 될 때마다 Z가 빠르게 올라갑니다. 여러 개의 압출기를 사용하는 경우 첫 번째 압출기의 설정 만 고려됩니다." +#: src/libslic3r/PrintConfig.cpp:1571 +msgid "" +"If you set this to a positive value, Z is quickly raised every time a " +"retraction is triggered. When using multiple extruders, only the setting for " +"the first extruder will be considered." +msgstr "" +"이 값을 양수 값으로 설정하면 철회가 트리거 될 때마다 Z가 빠르게 올라갑니다. " +"여러 개의 압출기를 사용하는 경우 첫 번째 압출기의 설정 만 고려됩니다." -#: src/libslic3r/PrintConfig.cpp:1548 +#: src/libslic3r/PrintConfig.cpp:1578 msgid "Above Z" msgstr "Z 위" -#: src/libslic3r/PrintConfig.cpp:1549 +#: src/libslic3r/PrintConfig.cpp:1579 msgid "Only lift Z above" msgstr "오직 Z축 위로만" -#: src/libslic3r/PrintConfig.cpp:1550 -msgid "If you set this to a positive value, Z lift will only take place above the specified absolute Z. You can tune this setting for skipping lift on the first layers." -msgstr "이것을 양의 값으로 설정하면, Z 리프트는 지정된 절대 Z 위로만 발생한다. 첫 번째 층에서 리프트를 건너뛸 수 있도록 이 설정을 조정할 수 있다." +#: src/libslic3r/PrintConfig.cpp:1580 +msgid "" +"If you set this to a positive value, Z lift will only take place above the " +"specified absolute Z. You can tune this setting for skipping lift on the " +"first layers." +msgstr "" +"이것을 양의 값으로 설정하면, Z 리프트는 지정된 절대 Z 위로만 발생한다. 첫 번" +"째 층에서 리프트를 건너뛸 수 있도록 이 설정을 조정할 수 있다." -#: src/libslic3r/PrintConfig.cpp:1557 +#: src/libslic3r/PrintConfig.cpp:1587 msgid "Below Z" msgstr "Z 아래" -#: src/libslic3r/PrintConfig.cpp:1558 +#: src/libslic3r/PrintConfig.cpp:1588 msgid "Only lift Z below" msgstr "Z값 아래만" -#: src/libslic3r/PrintConfig.cpp:1559 -msgid "If you set this to a positive value, Z lift will only take place below the specified absolute Z. You can tune this setting for limiting lift to the first layers." -msgstr "이것을 양수 값으로 설정하면 Z 리프트가 지정된 절대 Z 아래에서만 발생합니다. 첫 번째 레이어로 리프트를 제한하기 위해이 설정을 조정할 수 있습니다." +#: src/libslic3r/PrintConfig.cpp:1589 +msgid "" +"If you set this to a positive value, Z lift will only take place below the " +"specified absolute Z. You can tune this setting for limiting lift to the " +"first layers." +msgstr "" +"이것을 양수 값으로 설정하면 Z 리프트가 지정된 절대 Z 아래에서만 발생합니다. " +"첫 번째 레이어로 리프트를 제한하기 위해이 설정을 조정할 수 있습니다." -#: src/libslic3r/PrintConfig.cpp:1567 src/libslic3r/PrintConfig.cpp:1575 +#: src/libslic3r/PrintConfig.cpp:1597 src/libslic3r/PrintConfig.cpp:1605 msgid "Extra length on restart" msgstr "재시작시 여분의 길이" -#: src/libslic3r/PrintConfig.cpp:1568 -msgid "When the retraction is compensated after the travel move, the extruder will push this additional amount of filament. This setting is rarely needed." -msgstr "이동 후 리트렉셔이 보정되면 익스트루더가 추가 양의 필라멘트를 밀어냅니다. 이 설정은 거의 필요하지 않습니다." +#: src/libslic3r/PrintConfig.cpp:1598 +msgid "" +"When the retraction is compensated after the travel move, the extruder will " +"push this additional amount of filament. This setting is rarely needed." +msgstr "" +"이동 후 리트렉셔이 보정되면 익스트루더가 추가 양의 필라멘트를 밀어냅니다. 이 " +"설정은 거의 필요하지 않습니다." -#: src/libslic3r/PrintConfig.cpp:1576 -msgid "When the retraction is compensated after changing tool, the extruder will push this additional amount of filament." -msgstr "도구를 교환 한 후 리트렉션를 보정하면 익스트루더가 추가 양의 필라멘트를 밀게됩니다." +#: src/libslic3r/PrintConfig.cpp:1606 +msgid "" +"When the retraction is compensated after changing tool, the extruder will " +"push this additional amount of filament." +msgstr "" +"도구를 교환 한 후 리트렉션를 보정하면 익스트루더가 추가 양의 필라멘트를 밀게" +"됩니다." -#: src/libslic3r/PrintConfig.cpp:1583 src/libslic3r/PrintConfig.cpp:1584 +#: src/libslic3r/PrintConfig.cpp:1613 src/libslic3r/PrintConfig.cpp:1614 msgid "Retraction Speed" msgstr "리트랙션 속도" -#: src/libslic3r/PrintConfig.cpp:1585 +#: src/libslic3r/PrintConfig.cpp:1615 msgid "The speed for retractions (it only applies to the extruder motor)." msgstr "리트랙션 속도 (익스트루더 모터에만 적용됨)." -#: src/libslic3r/PrintConfig.cpp:1591 src/libslic3r/PrintConfig.cpp:1592 +#: src/libslic3r/PrintConfig.cpp:1621 src/libslic3r/PrintConfig.cpp:1622 msgid "Deretraction Speed" msgstr "감속 속도" -#: src/libslic3r/PrintConfig.cpp:1593 -msgid "The speed for loading of a filament into extruder after retraction (it only applies to the extruder motor). If left to zero, the retraction speed is used." -msgstr "리트랙션 후 압출기에 필라멘트를 로드하는 속도 (압출기 모터에만 적용됨). 0으로 방치하면 리트랙션 속도가 사용됩니다." +#: src/libslic3r/PrintConfig.cpp:1623 +msgid "" +"The speed for loading of a filament into extruder after retraction (it only " +"applies to the extruder motor). If left to zero, the retraction speed is " +"used." +msgstr "" +"리트랙션 후 압출기에 필라멘트를 로드하는 속도 (압출기 모터에만 적용됨). 0으" +"로 방치하면 리트랙션 속도가 사용됩니다." -#: src/libslic3r/PrintConfig.cpp:1600 +#: src/libslic3r/PrintConfig.cpp:1630 msgid "Seam position" msgstr "재봉선 위치" -#: src/libslic3r/PrintConfig.cpp:1602 +#: src/libslic3r/PrintConfig.cpp:1632 msgid "Position of perimeters starting points." msgstr "둘레의 시작점의 위치." -#: src/libslic3r/PrintConfig.cpp:1608 +#: src/libslic3r/PrintConfig.cpp:1638 msgid "Random" msgstr "무작위" -#: src/libslic3r/PrintConfig.cpp:1609 +#: src/libslic3r/PrintConfig.cpp:1639 msgid "Nearest" msgstr "가장 가까운" -#: src/libslic3r/PrintConfig.cpp:1610 +#: src/libslic3r/PrintConfig.cpp:1640 msgid "Aligned" msgstr "정렬" -#: src/libslic3r/PrintConfig.cpp:1618 +#: src/libslic3r/PrintConfig.cpp:1648 msgid "Direction" msgstr "방향" -#: src/libslic3r/PrintConfig.cpp:1620 +#: src/libslic3r/PrintConfig.cpp:1650 msgid "Preferred direction of the seam" -msgstr "선호하는 심(seam)의 방향" +msgstr "선호하는 재봉선(seam)의 방향" -#: src/libslic3r/PrintConfig.cpp:1621 +#: src/libslic3r/PrintConfig.cpp:1651 msgid "Seam preferred direction" -msgstr "심(Seam) 선호 방향" +msgstr "재봉선(Seam) 선호 방향" -#: src/libslic3r/PrintConfig.cpp:1628 +#: src/libslic3r/PrintConfig.cpp:1658 msgid "Jitter" msgstr "지터(Jitter)" -#: src/libslic3r/PrintConfig.cpp:1630 +#: src/libslic3r/PrintConfig.cpp:1660 msgid "Seam preferred direction jitter" -msgstr "(Seam) 선호 방향 지터(Jitter)" +msgstr "재봉선 선호 방향 지터(Jitter)" -#: src/libslic3r/PrintConfig.cpp:1631 +#: src/libslic3r/PrintConfig.cpp:1661 msgid "Preferred direction of the seam - jitter" msgstr "재봉선 지터의 선호 방향" -#: src/libslic3r/PrintConfig.cpp:1641 +#: src/libslic3r/PrintConfig.cpp:1671 msgid "USB/serial port for printer connection." msgstr "프린터 연결을 위한 USB/시리얼 포트." -#: src/libslic3r/PrintConfig.cpp:1648 +#: src/libslic3r/PrintConfig.cpp:1678 msgid "Serial port speed" msgstr "시리얼 포트 속도" -#: src/libslic3r/PrintConfig.cpp:1649 +#: src/libslic3r/PrintConfig.cpp:1679 msgid "Speed (baud) of USB/serial port for printer connection." msgstr "프린터 연결을 위한 USB/시리얼 포트의 속도(보드)" -#: src/libslic3r/PrintConfig.cpp:1658 +#: src/libslic3r/PrintConfig.cpp:1688 msgid "Distance from object" msgstr "객체(object)로부터의 거리" -#: src/libslic3r/PrintConfig.cpp:1659 -msgid "Distance between skirt and object(s). Set this to zero to attach the skirt to the object(s) and get a brim for better adhesion." -msgstr "스커트와 객체(object) 사이의 거리. 스커트를 객체(object)에 부착하고 접착력을 높이기 위해 이를 0으로 설정한다." +#: src/libslic3r/PrintConfig.cpp:1689 +msgid "" +"Distance between skirt and object(s). Set this to zero to attach the skirt " +"to the object(s) and get a brim for better adhesion." +msgstr "" +"스커트와 객체(object) 사이의 거리. 스커트를 객체(object)에 부착하고 접착력을 " +"높이기 위해 이를 0으로 설정한다." -#: src/libslic3r/PrintConfig.cpp:1666 +#: src/libslic3r/PrintConfig.cpp:1696 msgid "Skirt height" msgstr "스커트(Skirt) 높이" -#: src/libslic3r/PrintConfig.cpp:1667 -msgid "Height of skirt expressed in layers. Set this to a tall value to use skirt as a shield against drafts." -msgstr "스커트의 높이 레이어로 표현된다. 이를 높은 값으로 설정하여 스커트를 드래프트에 대한 쉴ㄷ로 활용하십시오." +#: src/libslic3r/PrintConfig.cpp:1697 +msgid "" +"Height of skirt expressed in layers. Set this to a tall value to use skirt " +"as a shield against drafts." +msgstr "" +"스커트의 높이 레이어로 표현된다. 이를 높은 값으로 설정하여 스커트를 드래프트" +"에 대한 쉴ㄷ로 활용하십시오." -#: src/libslic3r/PrintConfig.cpp:1674 +#: src/libslic3r/PrintConfig.cpp:1704 msgid "Loops (minimum)" msgstr "루프 (최소)" -#: src/libslic3r/PrintConfig.cpp:1675 +#: src/libslic3r/PrintConfig.cpp:1705 msgid "Skirt Loops" msgstr "스커트 루프" -#: src/libslic3r/PrintConfig.cpp:1676 -msgid "Number of loops for the skirt. If the Minimum Extrusion Length option is set, the number of loops might be greater than the one configured here. Set this to zero to disable skirt completely." -msgstr "스커트의 루프 수입니다. 최소 압출 길이 옵션을 설정한 경우 여기에 구성된 루프 수보다 클 수 있다. 스커트를 완전히 비활성화하려면 이 값을 0으로 설정하십시오." +#: src/libslic3r/PrintConfig.cpp:1706 +msgid "" +"Number of loops for the skirt. If the Minimum Extrusion Length option is " +"set, the number of loops might be greater than the one configured here. Set " +"this to zero to disable skirt completely." +msgstr "" +"스커트의 루프 수입니다. 최소 압출 길이 옵션을 설정한 경우 여기에 구성된 루프 " +"수보다 클 수 있다. 스커트를 완전히 비활성화하려면 이 값을 0으로 설정하십시오." -#: src/libslic3r/PrintConfig.cpp:1684 +#: src/libslic3r/PrintConfig.cpp:1714 msgid "Slow down if layer print time is below" msgstr "레이어 인쇄 시간이 다음과 같은 경우 속도를 낮추십시오" -#: src/libslic3r/PrintConfig.cpp:1685 -msgid "If layer print time is estimated below this number of seconds, print moves speed will be scaled down to extend duration to this value." -msgstr "층 인쇄 시간이 이 시간보다 낮게 추정될 경우, 인쇄 이동 속도는 이 값으로 지속되도록 축소된다." +#: src/libslic3r/PrintConfig.cpp:1715 +msgid "" +"If layer print time is estimated below this number of seconds, print moves " +"speed will be scaled down to extend duration to this value." +msgstr "" +"층 인쇄 시간이 이 시간보다 낮게 추정될 경우, 인쇄 이동 속도는 이 값으로 지속" +"되도록 축소된다." -#: src/libslic3r/PrintConfig.cpp:1695 +#: src/libslic3r/PrintConfig.cpp:1725 msgid "Small perimeters" msgstr "작은 둘레" -#: src/libslic3r/PrintConfig.cpp:1697 -msgid "This separate setting will affect the speed of perimeters having radius <= 6.5mm (usually holes). If expressed as percentage (for example: 80%) it will be calculated on the perimeters speed setting above. Set to zero for auto." -msgstr "이 개별 설정은 반경이 6.5mm 미만인 속도 (일반적으로 구멍)에 영향을줍니다. 백분율로 표시되는 경우 (예 : 80 %) 위의 속도 설정에서 계산됩니다. 자동으로 0으로 설정하십시오." +#: src/libslic3r/PrintConfig.cpp:1727 +msgid "" +"This separate setting will affect the speed of perimeters having radius <= " +"6.5mm (usually holes). If expressed as percentage (for example: 80%) it will " +"be calculated on the perimeters speed setting above. Set to zero for auto." +msgstr "" +"이 개별 설정은 반경이 6.5mm 미만인 속도 (일반적으로 구멍)에 영향을줍니다. 백" +"분율로 표시되는 경우 (예 : 80 %) 위의 속도 설정에서 계산됩니다. 자동으로 0으" +"로 설정하십시오." -#: src/libslic3r/PrintConfig.cpp:1707 +#: src/libslic3r/PrintConfig.cpp:1737 msgid "Solid infill threshold area" msgstr "솔리드 채우기 임계값" -#: src/libslic3r/PrintConfig.cpp:1709 -msgid "Force solid infill for regions having a smaller area than the specified threshold." -msgstr "지정된 한계값보다 작은 영역을 가진 영역에 대해 솔리드 인필을 강제 적용." +#: src/libslic3r/PrintConfig.cpp:1739 +msgid "" +"Force solid infill for regions having a smaller area than the specified " +"threshold." +msgstr "" +"지정된 한계값보다 작은 영역을 가진 영역에 대해 솔리드 인필을 강제 적용." -#: src/libslic3r/PrintConfig.cpp:1710 +#: src/libslic3r/PrintConfig.cpp:1740 msgid "mm²" msgstr "mm²" -#: src/libslic3r/PrintConfig.cpp:1716 +#: src/libslic3r/PrintConfig.cpp:1746 msgid "Solid infill extruder" msgstr "솔리드 인필 익스트루더" -#: src/libslic3r/PrintConfig.cpp:1718 +#: src/libslic3r/PrintConfig.cpp:1748 msgid "The extruder to use when printing solid infill." msgstr "꽉찬 면을 인쇄할 때 사용하는 익스트루더." -#: src/libslic3r/PrintConfig.cpp:1724 +#: src/libslic3r/PrintConfig.cpp:1754 msgid "Solid infill every" msgstr "솔리드 인필 간격" -#: src/libslic3r/PrintConfig.cpp:1726 -msgid "This feature allows to force a solid layer every given number of layers. Zero to disable. You can set this to any value (for example 9999); Slic3r will automatically choose the maximum possible number of layers to combine according to nozzle diameter and layer height." -msgstr "이 특징은 주어진 개수의 층마다 단단한 층을 넣을수 있게 한다. 비활성화할 수 없음. 당신은 이것을 어떤 값으로도 설정할 수 있다(예: 9999). Slic3r는 노즐 직경과 층 높이에 따라 결합할 최대 가능한 층 수를 자동으로 선택한다." +#: src/libslic3r/PrintConfig.cpp:1756 +msgid "" +"This feature allows to force a solid layer every given number of layers. " +"Zero to disable. You can set this to any value (for example 9999); Slic3r " +"will automatically choose the maximum possible number of layers to combine " +"according to nozzle diameter and layer height." +msgstr "" +"이 특징은 주어진 개수의 층마다 단단한 층을 넣을수 있게 한다. 비활성화할 수 없" +"음. 당신은 이것을 어떤 값으로도 설정할 수 있다(예: 9999). Slic3r는 노즐 직경" +"과 층 높이에 따라 결합할 최대 가능한 층 수를 자동으로 선택한다." -#: src/libslic3r/PrintConfig.cpp:1738 -msgid "Set this to a non-zero value to set a manual extrusion width for infill for solid surfaces. If left zero, default extrusion width will be used if set, otherwise 1.125 x nozzle diameter will be used. If expressed as percentage (for example 90%) it will be computed over layer height." -msgstr "이 값을 0이 아닌 값으로 설정하여 솔리드 표면 인필에 대한 수동 압출 폭을 설정하십시오. 0인 경우 기본 압출 너비가 사용되며, 그렇지 않으면 1.125 x 노즐 직경이 사용된다. 백분율(예: 90%)로 표현되는 경우, 계층 높이에 걸쳐 계산된다." +#: src/libslic3r/PrintConfig.cpp:1768 +msgid "" +"Set this to a non-zero value to set a manual extrusion width for infill for " +"solid surfaces. If left zero, default extrusion width will be used if set, " +"otherwise 1.125 x nozzle diameter will be used. If expressed as percentage " +"(for example 90%) it will be computed over layer height." +msgstr "" +"이 값을 0이 아닌 값으로 설정하여 솔리드 표면 인필에 대한 수동 압출 폭을 설정" +"하십시오. 0인 경우 기본 압출 너비가 사용되며, 그렇지 않으면 1.125 x 노즐 직경" +"이 사용된다. 백분율(예: 90%)로 표현되는 경우, 계층 높이에 걸쳐 계산된다." -#: src/libslic3r/PrintConfig.cpp:1748 -msgid "Speed for printing solid regions (top/bottom/internal horizontal shells). This can be expressed as a percentage (for example: 80%) over the default infill speed above. Set to zero for auto." -msgstr "솔리드 영역(상단/하부/내부 수평 셸) 인쇄 속도 이는 위의 기본 주입 속도에 대한 백분율(예: 80%)로 표시할 수 있다. 자동을 위해 0으로 설정한다." +#: src/libslic3r/PrintConfig.cpp:1779 +msgid "" +"Speed for printing solid regions (top/bottom/internal horizontal shells). " +"This can be expressed as a percentage (for example: 80%) over the default " +"infill speed above. Set to zero for auto." +msgstr "" +"솔리드 영역(상단/하부/내부 수평 셸) 인쇄 속도 이는 위의 기본 주입 속도에 대" +"한 백분율(예: 80%)로 표시할 수 있다. 자동을 위해 0으로 설정한다." -#: src/libslic3r/PrintConfig.cpp:1760 +#: src/libslic3r/PrintConfig.cpp:1791 msgid "Number of solid layers to generate on top and bottom surfaces." msgstr "상단 및 하단 표면에 생성할 솔리드 레이어 수입니다." -#: src/libslic3r/PrintConfig.cpp:1766 +#: src/libslic3r/PrintConfig.cpp:1797 src/libslic3r/PrintConfig.cpp:1798 +msgid "Minimum thickness of a top / bottom shell" +msgstr "상부/하부 쉘의 최소 두께" + +#: src/libslic3r/PrintConfig.cpp:1804 msgid "Spiral vase" -msgstr "스파이럴 바이스" +msgstr "꽃병 모드(Spiral vase)" -#: src/libslic3r/PrintConfig.cpp:1767 -msgid "This feature will raise Z gradually while printing a single-walled object in order to remove any visible seam. This option requires a single perimeter, no infill, no top solid layers and no support material. You can still set any number of bottom solid layers as well as skirt/brim loops. It won't work when printing more than an object." -msgstr "이 기능은 단일 벽 물체를 인쇄하는 동안 눈에 보이는 심을 제거하기 위해 Z를 점진적으로 상승시킨다. 이 옵션은 단일 둘레, 주입, 상단 솔리드 레이어 및 지지 재료가 필요하지 않다. 당신은 스커트/브림 루프뿐만 아니라 아래 솔리드 레이어의 수에 상관없이 설정할 수 있다. 그것은 물체보다 더 많이 인쇄할 때는 작동하지 않을 것이다." +#: src/libslic3r/PrintConfig.cpp:1805 +msgid "" +"This feature will raise Z gradually while printing a single-walled object in " +"order to remove any visible seam. This option requires a single perimeter, " +"no infill, no top solid layers and no support material. You can still set " +"any number of bottom solid layers as well as skirt/brim loops. It won't work " +"when printing more than an object." +msgstr "" +"이 기능은 단일 벽 개체를 인쇄하는 동안 눈에 보이는 재봉선을 제거하기 위해 Z" +"를 점진적으로 상승시킨다. 이 옵션은 단일 둘레, 주입, 상단 솔리드 레이어 및 지" +"지 재료가 필요하지 않다. 당신은 스커트/브림 루프뿐만 아니라 아래 솔리드 레이" +"어의 수에 상관없이 설정할 수 있다. 그것은 개체보다 더 많이 인쇄할 때는 작동하" +"지 않을 것이다." -#: src/libslic3r/PrintConfig.cpp:1775 +#: src/libslic3r/PrintConfig.cpp:1813 msgid "Temperature variation" msgstr "온도 변화" -#: src/libslic3r/PrintConfig.cpp:1776 -msgid "Temperature difference to be applied when an extruder is not active. Enables a full-height \"sacrificial\" skirt on which the nozzles are periodically wiped." -msgstr "돌출부가 활성화되지 않은 경우 적용되는 온도 차이. 노즐을 주기적으로 닦는 전체 높이 \"인공\" 스커트가 가능하다." +#: src/libslic3r/PrintConfig.cpp:1814 +msgid "" +"Temperature difference to be applied when an extruder is not active. Enables " +"a full-height \"sacrificial\" skirt on which the nozzles are periodically " +"wiped." +msgstr "" +"돌출부가 활성화되지 않은 경우 적용되는 온도 차이. 노즐을 주기적으로 닦는 전" +"체 높이 \"인공\" 스커트가 가능하다." -#: src/libslic3r/PrintConfig.cpp:1786 -msgid "This start procedure is inserted at the beginning, after bed has reached the target temperature and extruder just started heating, and before extruder has finished heating. If Slic3r detects M104 or M190 in your custom codes, such commands will not be prepended automatically so you're free to customize the order of heating commands and other custom actions. Note that you can use placeholder variables for all Slic3r settings, so you can put a \"M109 S[first_layer_temperature]\" command wherever you want." -msgstr "이 시작 절차는 침대가 목표 온도에 도달하고 압출기가 막 가열을 시작한 직후 및 압출기가 가열을 완료하기 전에 처음에 삽입됩니다. Slic3r이 사용자 지정 코드에서 M104 또는 M190을 감지하면 이러한 명령은 자동으로 추가되지 않으므로 가열 명령 및 기타 사용자 지정 동작의 순서를 자유롭게 사용자 지정할 수 있습니다. 모든 Slic3r 설정에 자리 표시 자 변수를 사용할 수 있으므로 원하는 위치에 \"M109 S [first_layer_temperature]\"명령을 넣을 수 있습니다." +#: src/libslic3r/PrintConfig.cpp:1824 +msgid "" +"This start procedure is inserted at the beginning, after bed has reached the " +"target temperature and extruder just started heating, and before extruder " +"has finished heating. If PrusaSlicer detects M104 or M190 in your custom " +"codes, such commands will not be prepended automatically so you're free to " +"customize the order of heating commands and other custom actions. Note that " +"you can use placeholder variables for all PrusaSlicer settings, so you can " +"put a \"M109 S[first_layer_temperature]\" command wherever you want." +msgstr "" +"이 시작 절차는 배드가 목표 온도에 도달하고 압출기가 방금 가열을 시작한 후 압" +"출기가열가 완료되기 전에 처음에 삽입됩니다. PrusaSlicer사용자 지정 코드에서 " +"M104 또는 M190을 감지하는 경우 이러한 명령이 자동으로 준비되지 않으므로 가열 " +"명령 및 기타 사용자 지정 작업의 순서를 자유롭게 사용자 지정할 수 있습니다. 모" +"든 PrusaSlicer 설정에 자리 표시자 변수를 사용할 수 있으므로 원하는 위치에 " +"\"M109 S[first_layer_temperature]\" 명령을 넣을 수 있습니다." -#: src/libslic3r/PrintConfig.cpp:1801 -msgid "This start procedure is inserted at the beginning, after any printer start gcode (and after any toolchange to this filament in case of multi-material printers). This is used to override settings for a specific filament. If Slic3r detects M104, M109, M140 or M190 in your custom codes, such commands will not be prepended automatically so you're free to customize the order of heating commands and other custom actions. Note that you can use placeholder variables for all Slic3r settings, so you can put a \"M109 S[first_layer_temperature]\" command wherever you want. If you have multiple extruders, the gcode is processed in extruder order." -msgstr "이 시작 절차는 프린터가 gcode를 시작한 후(그리고 다중 재질 프린터의 경우 이 필라멘트에 대한 도구 변경 후) 처음에 삽입됩니다. 특정 필라멘트에 대한 설정을 재정의하는 데 사용됩니다. Slic3r가 사용자 지정 코드에서 M104, M109, M140 또는 M190을 감지하면 이러한 명령이 자동으로 준비되지 않으므로 가열 명령 및 기타 사용자 지정 작업의 순서를 자유롭게 사용자 지정할 수 있습니다. 모든 Slic3r 설정에 자리 표시자 변수를 사용할 수 있으므로 원하는 위치에 \"M109 S[first_layer_temperature]\" 명령을 넣을 수 있습니다. 압출기가 여러 개 있는 경우 gcode는 압출기 순서로 처리됩니다." +#: src/libslic3r/PrintConfig.cpp:1839 +msgid "" +"This start procedure is inserted at the beginning, after any printer start " +"gcode (and after any toolchange to this filament in case of multi-material " +"printers). This is used to override settings for a specific filament. If " +"PrusaSlicer detects M104, M109, M140 or M190 in your custom codes, such " +"commands will not be prepended automatically so you're free to customize the " +"order of heating commands and other custom actions. Note that you can use " +"placeholder variables for all PrusaSlicer settings, so you can put a \"M109 " +"S[first_layer_temperature]\" command wherever you want. If you have multiple " +"extruders, the gcode is processed in extruder order." +msgstr "" +"이 시작 절차는 프린터가 gcode를 시작한 후(그리고 다중 재질 프린터의 경우 이 " +"필라멘트에 대한 도구 변경 후) 처음에 삽입됩니다. 특정 필라멘트에 대한 설정을 " +"재정의하는 데 사용됩니다. PrusaSlicer가 사용자 지정 코드에서 M104, M109, " +"M140 또는 M190을 감지하면 이러한 명령이 자동으로 준비되지 않으므로 가열 명령 " +"및 기타 사용자 지정 작업의 순서를 자유롭게 사용자 지정할 수 있습니다. 모든 " +"PrusaSlicer 설정에 자리 표시자 변수를 사용할 수 있으므로 원하는 위치에 " +"\"M109 S[first_layer_temperature]\" 명령을 넣을 수 있습니다. 압출기가 여러 " +"개 있는 경우 gcode는 압출기 순서로 처리됩니다." -#: src/libslic3r/PrintConfig.cpp:1817 +#: src/libslic3r/PrintConfig.cpp:1855 msgid "Single Extruder Multi Material" -msgstr "싱글 익스트루더 멀티메터리얼" +msgstr "싱글 익스트루더 다중메터리얼" -#: src/libslic3r/PrintConfig.cpp:1818 +#: src/libslic3r/PrintConfig.cpp:1856 msgid "The printer multiplexes filaments into a single hot end." msgstr "프린터는 필라멘트를 하나의 핫 엔드에 다중플렉싱합니다." -#: src/libslic3r/PrintConfig.cpp:1823 +#: src/libslic3r/PrintConfig.cpp:1861 msgid "Prime all printing extruders" msgstr "모든 인쇄 압출기 프라임" -#: src/libslic3r/PrintConfig.cpp:1824 -msgid "If enabled, all printing extruders will be primed at the front edge of the print bed at the start of the print." -msgstr "활성화 된 경우, 모든 인쇄 압출기는 인쇄 시작시 프린트 베드의 전면 가장자리에 프라이밍 됩니다." +#: src/libslic3r/PrintConfig.cpp:1862 +msgid "" +"If enabled, all printing extruders will be primed at the front edge of the " +"print bed at the start of the print." +msgstr "" +"활성화 된 경우, 모든 인쇄 압출기는 인쇄 시작시 프린트 베드의 전면 가장자리에 " +"프라이밍 됩니다." -#: src/libslic3r/PrintConfig.cpp:1829 +#: src/libslic3r/PrintConfig.cpp:1867 +msgid "No sparse layers (EXPERIMENTAL)" +msgstr "숨겨진 레이어층 없음(실험적)" + +#: src/libslic3r/PrintConfig.cpp:1868 +msgid "" +"If enabled, the wipe tower will not be printed on layers with no " +"toolchanges. On layers with a toolchange, extruder will travel downward to " +"print the wipe tower. User is responsible for ensuring there is no collision " +"with the print." +msgstr "" +"활성화된 경우 도구 변경 없이 레이어에 와이프 타워가 인쇄되지 않습니다. 툴체인" +"지 레이어에서 압출기는 아래쪽으로 이동하여 와이프 타워를 인쇄합니다. 사용자" +"는 인쇄물과 충돌이 없는지 확인합니다." + +#: src/libslic3r/PrintConfig.cpp:1875 msgid "Generate support material" msgstr "서포트 재료 생성" -#: src/libslic3r/PrintConfig.cpp:1831 +#: src/libslic3r/PrintConfig.cpp:1877 msgid "Enable support material generation." msgstr "서포트 재료를 사용합니다." -#: src/libslic3r/PrintConfig.cpp:1835 +#: src/libslic3r/PrintConfig.cpp:1881 msgid "Auto generated supports" msgstr "자동 생성 지원" -#: src/libslic3r/PrintConfig.cpp:1837 -msgid "If checked, supports will be generated automatically based on the overhang threshold value. If unchecked, supports will be generated inside the \"Support Enforcer\" volumes only." -msgstr "이 옵션을 선택 하면 오버행 임계값에 따라 서포트가 자동으로 생성 됩니다. 이 확인란을 선택 하지 않으면 \"서포트 지원 영역\" 볼륨 내 에서만 지원이 생성 됩니다." +#: src/libslic3r/PrintConfig.cpp:1883 +msgid "" +"If checked, supports will be generated automatically based on the overhang " +"threshold value. If unchecked, supports will be generated inside the " +"\"Support Enforcer\" volumes only." +msgstr "" +"이 옵션을 선택 하면 오버행 임계값에 따라 서포트가 자동으로 생성 됩니다. 이 확" +"인란을 선택 하지 않으면 \"서포트 지원 영역\" 볼륨 내 에서만 지원이 생성 됩니" +"다." -#: src/libslic3r/PrintConfig.cpp:1843 +#: src/libslic3r/PrintConfig.cpp:1889 msgid "XY separation between an object and its support" -msgstr "물체와 그 서포트 사이 XY 분리" +msgstr "개체와 그 서포트 사이 XY 분리" -#: src/libslic3r/PrintConfig.cpp:1845 -msgid "XY separation between an object and its support. If expressed as percentage (for example 50%), it will be calculated over external perimeter width." -msgstr "객체(object)와 그 서포트 사이의 XY 분리. 백분율 (예 : 50 %)로 표시되는 경우 외부 둘레 너비를 기준으로 계산됩니다." +#: src/libslic3r/PrintConfig.cpp:1891 +msgid "" +"XY separation between an object and its support. If expressed as percentage " +"(for example 50%), it will be calculated over external perimeter width." +msgstr "" +"객체(object)와 그 서포트 사이의 XY 분리. 백분율 (예 : 50 %)로 표시되는 경우 " +"외부 둘레 너비를 기준으로 계산됩니다." -#: src/libslic3r/PrintConfig.cpp:1855 +#: src/libslic3r/PrintConfig.cpp:1901 msgid "Pattern angle" msgstr "채움 각도" -#: src/libslic3r/PrintConfig.cpp:1857 -msgid "Use this setting to rotate the support material pattern on the horizontal plane." +#: src/libslic3r/PrintConfig.cpp:1903 +msgid "" +"Use this setting to rotate the support material pattern on the horizontal " +"plane." msgstr "이 설정을 사용하여지지 평면 패턴을 수평면으로 회전시킵니다." -#: src/libslic3r/PrintConfig.cpp:1867 src/libslic3r/PrintConfig.cpp:2531 -msgid "Only create support if it lies on a build plate. Don't create support on a print." -msgstr "그것이 빌드 플레이트에있는 경우에만 지원을 작성하십시오. 인쇄물에 대한 지원을 작성하지 마십시오." +#: src/libslic3r/PrintConfig.cpp:1913 src/libslic3r/PrintConfig.cpp:2677 +msgid "" +"Only create support if it lies on a build plate. Don't create support on a " +"print." +msgstr "" +"그것이 빌드 플레이트에있는 경우에만 지원을 작성하십시오. 인쇄물에 대한 지원" +"을 작성하지 마십시오." -#: src/libslic3r/PrintConfig.cpp:1873 +#: src/libslic3r/PrintConfig.cpp:1919 msgid "Contact Z distance" msgstr "Z 거리 문의" -#: src/libslic3r/PrintConfig.cpp:1875 -msgid "The vertical distance between object and support material interface. Setting this to 0 will also prevent Slic3r from using bridge flow and speed for the first object layer." -msgstr "물체와 서포트 사이의 수직 거리. 이 값을 0으로 설정하면 Slic3r이 첫 번째 객체(object) 레이어에 브리지 흐름과 속도를 사용하지 못하게됩니다." +#: src/libslic3r/PrintConfig.cpp:1921 +msgid "" +"The vertical distance between object and support material interface. Setting " +"this to 0 will also prevent Slic3r from using bridge flow and speed for the " +"first object layer." +msgstr "" +"개체와 서포트 사이의 수직 거리. 이 값을 0으로 설정하면 Slic3r이 첫 번째 객체" +"(object) 레이어에 브리지 흐름과 속도를 사용하지 못하게됩니다." -#: src/libslic3r/PrintConfig.cpp:1882 +#: src/libslic3r/PrintConfig.cpp:1928 msgid "0 (soluble)" msgstr "0 (수용성)" -#: src/libslic3r/PrintConfig.cpp:1883 +#: src/libslic3r/PrintConfig.cpp:1929 msgid "0.2 (detachable)" msgstr "0.2 (분리 가능)" -#: src/libslic3r/PrintConfig.cpp:1888 +#: src/libslic3r/PrintConfig.cpp:1934 msgid "Enforce support for the first" msgstr "첫 번째 서포트 더 강화" -#: src/libslic3r/PrintConfig.cpp:1890 -msgid "Generate support material for the specified number of layers counting from bottom, regardless of whether normal support material is enabled or not and regardless of any angle threshold. This is useful for getting more adhesion of objects having a very thin or poor footprint on the build plate." -msgstr "일반적인 서포트 소재의 활성화 여부와, 각도 임계 값에 관계없이 하단에서부터 세어 지정된 레이어 수에 대한지지 자료를 생성합니다. 이것은 빌드 플레이트에 매우 얇거나 부족한 풋 프린트를 가진 물체를 더 많이 부착 할 때 유용합니다." +#: src/libslic3r/PrintConfig.cpp:1936 +msgid "" +"Generate support material for the specified number of layers counting from " +"bottom, regardless of whether normal support material is enabled or not and " +"regardless of any angle threshold. This is useful for getting more adhesion " +"of objects having a very thin or poor footprint on the build plate." +msgstr "" +"일반적인 서포트 소재의 활성화 여부와, 각도 임계 값에 관계없이 하단에서부터 세" +"어 지정된 레이어 수에 대한지지 자료를 생성합니다. 이것은 빌드 플레이트에 매" +"우 얇거나 부족한 풋 프린트를 가진 개체를 더 많이 부착 할 때 유용합니다." -#: src/libslic3r/PrintConfig.cpp:1895 +#: src/libslic3r/PrintConfig.cpp:1941 msgid "Enforce support for the first n layers" msgstr "첫 번째 n 개의 레이어에 대한 서포트 강화" -#: src/libslic3r/PrintConfig.cpp:1901 +#: src/libslic3r/PrintConfig.cpp:1947 msgid "Support material/raft/skirt extruder" msgstr "서포트 재료 / 라프트 / 스커트 익스트루더" -#: src/libslic3r/PrintConfig.cpp:1903 -msgid "The extruder to use when printing support material, raft and skirt (1+, 0 to use the current extruder to minimize tool changes)." -msgstr "서포트 재료, 라프트 및 스커트를 인쇄 할 때 사용하는 압출기 (도구 변경을 최소화하기 위해 현재 압출기를 사용하려면 1+, 0)." +#: src/libslic3r/PrintConfig.cpp:1949 +msgid "" +"The extruder to use when printing support material, raft and skirt (1+, 0 to " +"use the current extruder to minimize tool changes)." +msgstr "" +"서포트 재료, 라프트 및 스커트를 인쇄 할 때 사용하는 압출기 (도구 변경을 최소" +"화하기 위해 현재 압출기를 사용하려면 1+, 0)." -#: src/libslic3r/PrintConfig.cpp:1912 -msgid "Set this to a non-zero value to set a manual extrusion width for support material. If left zero, default extrusion width will be used if set, otherwise nozzle diameter will be used. If expressed as percentage (for example 90%) it will be computed over layer height." -msgstr "서포트 재료의 수동 압출 폭을 설정하려면이 값을 0이 아닌 값으로 설정하십시오. 0으로 설정하면 설정된 경우 기본 압출 폭이 사용되고 그렇지 않으면 노즐 지름이 사용됩니다. 백분율 (예 : 90 %)로 표현하면 레이어 높이를 기준으로 계산됩니다." +#: src/libslic3r/PrintConfig.cpp:1958 +msgid "" +"Set this to a non-zero value to set a manual extrusion width for support " +"material. If left zero, default extrusion width will be used if set, " +"otherwise nozzle diameter will be used. If expressed as percentage (for " +"example 90%) it will be computed over layer height." +msgstr "" +"서포트 재료의 수동 압출 폭을 설정하려면이 값을 0이 아닌 값으로 설정하십시오. " +"0으로 설정하면 설정된 경우 기본 압출 폭이 사용되고 그렇지 않으면 노즐 지름이 " +"사용됩니다. 백분율 (예 : 90 %)로 표현하면 레이어 높이를 기준으로 계산됩니다." -#: src/libslic3r/PrintConfig.cpp:1920 +#: src/libslic3r/PrintConfig.cpp:1967 msgid "Interface loops" msgstr "접점 루프" -#: src/libslic3r/PrintConfig.cpp:1922 -msgid "Cover the top contact layer of the supports with loops. Disabled by default." +#: src/libslic3r/PrintConfig.cpp:1969 +msgid "" +"Cover the top contact layer of the supports with loops. Disabled by default." msgstr "지지대의 상단 접촉 층을 루프로 덮으십시오. 기본적으로 사용 안 함." -#: src/libslic3r/PrintConfig.cpp:1927 +#: src/libslic3r/PrintConfig.cpp:1974 msgid "Support material/raft interface extruder" msgstr "서포트 재료/라프트 접점 익스트루더" -#: src/libslic3r/PrintConfig.cpp:1929 -msgid "The extruder to use when printing support material interface (1+, 0 to use the current extruder to minimize tool changes). This affects raft too." -msgstr "서포트 재료 접점를 인쇄 할 때 사용할 익스트루더 (도구 변경을 최소화하기 위해 현재 익스트루더를 사용하려면 1+, 0). 이것은 라프트에도 영향을 미칩니다." +#: src/libslic3r/PrintConfig.cpp:1976 +msgid "" +"The extruder to use when printing support material interface (1+, 0 to use " +"the current extruder to minimize tool changes). This affects raft too." +msgstr "" +"서포트 재료 접점를 인쇄 할 때 사용할 익스트루더 (도구 변경을 최소화하기 위해 " +"현재 익스트루더를 사용하려면 1+, 0). 이것은 라프트에도 영향을 미칩니다." -#: src/libslic3r/PrintConfig.cpp:1936 +#: src/libslic3r/PrintConfig.cpp:1983 msgid "Interface layers" msgstr "접점 레이어" -#: src/libslic3r/PrintConfig.cpp:1938 -msgid "Number of interface layers to insert between the object(s) and support material." +#: src/libslic3r/PrintConfig.cpp:1985 +msgid "" +"Number of interface layers to insert between the object(s) and support " +"material." msgstr "객체(object)와 서포트 재료 사이에 삽입할 접점 레이어 수입니다." -#: src/libslic3r/PrintConfig.cpp:1945 +#: src/libslic3r/PrintConfig.cpp:1992 msgid "Interface pattern spacing" msgstr "접점 패턴 간격" -#: src/libslic3r/PrintConfig.cpp:1947 +#: src/libslic3r/PrintConfig.cpp:1994 msgid "Spacing between interface lines. Set zero to get a solid interface." msgstr "접점 라인 간 간격. 솔리드 접점를 가져오려면 0을 설정하십시오." -#: src/libslic3r/PrintConfig.cpp:1956 -msgid "Speed for printing support material interface layers. If expressed as percentage (for example 50%) it will be calculated over support material speed." -msgstr "서포트 재료 접점 레이어 인쇄 속도 백분율(예: 50%)로 표현될 경우 서포트 재료 속도에 따라 계산된다." +#: src/libslic3r/PrintConfig.cpp:2003 +msgid "" +"Speed for printing support material interface layers. If expressed as " +"percentage (for example 50%) it will be calculated over support material " +"speed." +msgstr "" +"서포트 재료 접점 레이어 인쇄 속도 백분율(예: 50%)로 표현될 경우 서포트 재료 " +"속도에 따라 계산된다." -#: src/libslic3r/PrintConfig.cpp:1965 +#: src/libslic3r/PrintConfig.cpp:2012 msgid "Pattern" msgstr "패턴" -#: src/libslic3r/PrintConfig.cpp:1967 +#: src/libslic3r/PrintConfig.cpp:2014 msgid "Pattern used to generate support material." msgstr "서포트 재료를 생성하는 데 사용되는 패턴." -#: src/libslic3r/PrintConfig.cpp:1973 +#: src/libslic3r/PrintConfig.cpp:2020 msgid "Rectilinear grid" msgstr "직선 그리드" -#: src/libslic3r/PrintConfig.cpp:1979 +#: src/libslic3r/PrintConfig.cpp:2026 msgid "Pattern spacing" msgstr "패턴 간격" -#: src/libslic3r/PrintConfig.cpp:1981 +#: src/libslic3r/PrintConfig.cpp:2028 msgid "Spacing between support material lines." msgstr "서포트 재료 라인 사이의 간격." -#: src/libslic3r/PrintConfig.cpp:1990 +#: src/libslic3r/PrintConfig.cpp:2037 msgid "Speed for printing support material." msgstr "서포트 재료를 인쇄하는 속도." -#: src/libslic3r/PrintConfig.cpp:1997 +#: src/libslic3r/PrintConfig.cpp:2044 msgid "Synchronize with object layers" msgstr "객체(object) 레이어와 동기화" -#: src/libslic3r/PrintConfig.cpp:1999 -msgid "Synchronize support layers with the object print layers. This is useful with multi-material printers, where the extruder switch is expensive." -msgstr "서포트 레이어를 프린트 레이어와 동기화하십시오. 이것은 스위치가 비싼 다중 메터리얼 프린터에서 유용하다." +#: src/libslic3r/PrintConfig.cpp:2046 +msgid "" +"Synchronize support layers with the object print layers. This is useful with " +"multi-material printers, where the extruder switch is expensive." +msgstr "" +"서포트 레이어를 프린트 레이어와 동기화하십시오. 이것은 스위치가 비싼 다중 메" +"터리얼 프린터에서 유용하다." -#: src/libslic3r/PrintConfig.cpp:2005 +#: src/libslic3r/PrintConfig.cpp:2052 msgid "Overhang threshold" msgstr "오버행 한계점" -#: src/libslic3r/PrintConfig.cpp:2007 -msgid "Support material will not be generated for overhangs whose slope angle (90° = vertical) is above the given threshold. In other words, this value represent the most horizontal slope (measured from the horizontal plane) that you can print without support material. Set to zero for automatic detection (recommended)." -msgstr "서포트 재료는 경사각(90° = 수직)이 지정된 임계점보다 높은 압출에 대해서는 생성되지 않는다. 즉, 이 값은 서포트 재료 없이 인쇄할 수 있는 가장 수평 경사(수평면에서 측정됨)를 나타낸다. 자동 감지를 위해 0으로 설정하십시오(권장)." +#: src/libslic3r/PrintConfig.cpp:2054 +msgid "" +"Support material will not be generated for overhangs whose slope angle (90° " +"= vertical) is above the given threshold. In other words, this value " +"represent the most horizontal slope (measured from the horizontal plane) " +"that you can print without support material. Set to zero for automatic " +"detection (recommended)." +msgstr "" +"서포트 재료는 경사각(90° = 수직)이 지정된 임계점보다 높은 압출에 대해서는 생" +"성되지 않는다. 즉, 이 값은 서포트 재료 없이 인쇄할 수 있는 가장 수평 경사(수" +"평면에서 측정됨)를 나타낸다. 자동 감지를 위해 0으로 설정하십시오(권장)." -#: src/libslic3r/PrintConfig.cpp:2019 +#: src/libslic3r/PrintConfig.cpp:2066 msgid "With sheath around the support" msgstr "서포트 주변이나 외부로" -#: src/libslic3r/PrintConfig.cpp:2021 -msgid "Add a sheath (a single perimeter line) around the base support. This makes the support more reliable, but also more difficult to remove." -msgstr "기본 서포트 주위에 외장 (단일 주변 선)을 추가하십시오. 이것은 페이스 업을보다 신뢰성있게 만들뿐만 아니라 제거하기도 어렵습니다." +#: src/libslic3r/PrintConfig.cpp:2068 +msgid "" +"Add a sheath (a single perimeter line) around the base support. This makes " +"the support more reliable, but also more difficult to remove." +msgstr "" +"기본 서포트 주위에 외장 (단일 주변 선)을 추가하십시오. 이것은 페이스 업을보" +"다 신뢰성있게 만들뿐만 아니라 제거하기도 어렵습니다." -#: src/libslic3r/PrintConfig.cpp:2028 -msgid "Extruder temperature for layers after the first one. Set this to zero to disable temperature control commands in the output." -msgstr "첫 번째 것 이후에 레이어에 대한 더 낮은 온도. 이 값을 0으로 설정하면 출력에서 ​​온도 제어 명령을 비활성화 할 수 있습니다." +#: src/libslic3r/PrintConfig.cpp:2075 +msgid "" +"Extruder temperature for layers after the first one. Set this to zero to " +"disable temperature control commands in the output." +msgstr "" +"첫 번째 것 이후에 레이어에 대한 더 낮은 온도. 이 값을 0으로 설정하면 출력에" +"서 ​​온도 제어 명령을 비활성화 할 수 있습니다." -#: src/libslic3r/PrintConfig.cpp:2036 +#: src/libslic3r/PrintConfig.cpp:2083 msgid "Detect thin walls" msgstr "얇은 벽(walls) 감지" -#: src/libslic3r/PrintConfig.cpp:2038 -msgid "Detect single-width walls (parts where two extrusions don't fit and we need to collapse them into a single trace)." +#: src/libslic3r/PrintConfig.cpp:2085 +msgid "" +"Detect single-width walls (parts where two extrusions don't fit and we need " +"to collapse them into a single trace)." msgstr "싱글 너비 벽 (두 부분이 맞지 않는 부분과 무너지는 부분)을 감지합니다." -#: src/libslic3r/PrintConfig.cpp:2044 +#: src/libslic3r/PrintConfig.cpp:2091 msgid "Threads" msgstr "스레드(Threads)" -#: src/libslic3r/PrintConfig.cpp:2045 -msgid "Threads are used to parallelize long-running tasks. Optimal threads number is slightly above the number of available cores/processors." -msgstr "스레드는 장기 실행 태스크를 병렬 처리하는 데 사용됩니다. 최적의 스레드 수는 사용 가능한 코어 / 프로세서 수보다 약간 높습니다." +#: src/libslic3r/PrintConfig.cpp:2092 +msgid "" +"Threads are used to parallelize long-running tasks. Optimal threads number " +"is slightly above the number of available cores/processors." +msgstr "" +"스레드는 장기 실행 태스크를 병렬 처리하는 데 사용됩니다. 최적의 스레드 수는 " +"사용 가능한 코어 / 프로세서 수보다 약간 높습니다." -#: src/libslic3r/PrintConfig.cpp:2057 -msgid "This custom code is inserted at every extruder change. If you don't leave this empty, you are expected to take care of the toolchange yourself - PrusaSlicer will not output any other G-code to change the filament. You can use placeholder variables for all Slic3r settings as well as [previous_extruder] and [next_extruder], so e.g. the standard toolchange command can be scripted as T[next_extruder]." -msgstr "이 사용자 지정 코드는 모든 압출기 변경 시 삽입됩니다. 이 것을 비워 두지 않으면 도구 변경을 직접 처리해야합니다 - PrusaSlicer는 필라멘트를 변경하기 위해 다른 G 코드를 출력하지 않습니다. 모든 Slic3r 설정과 [이전_압출기] 및 [next_extruder]에 대해 자리 표시자 변수를 사용할 수 있으므로 표준 도구 변경 명령을 T[next_extruder]로 스크립팅할 수 있습니다." +#: src/libslic3r/PrintConfig.cpp:2104 +msgid "" +"This custom code is inserted before every toolchange. Placeholder variables " +"for all PrusaSlicer settings as well as {previous_extruder} and " +"{next_extruder} can be used. When a tool-changing command which changes to " +"the correct extruder is included (such as T{next_extruder}), PrusaSlicer " +"will emit no other such command. It is therefore possible to script custom " +"behaviour both before and after the toolchange." +msgstr "" +"이 사용자 지정 코드는 모든 도구 변경 전에 삽입됩니다. 모든 PrusaSlicer 설정" +"과 {previous_extruder} 및 {next_extruder}에 대한 자리 표시자 변수를 사용할 " +"수 있습니다. 올바른 압출기로 변경되는 도구 변경 명령(예: T{next_extruder})이 " +"포함되면 PrusaSlicer는 다른 명령을 내림차순을 내보릅니다. 따라서 도구 변경 전" +"후에 사용자 지정 동작을 스크립팅할 수 있습니다." -#: src/libslic3r/PrintConfig.cpp:2070 -msgid "Set this to a non-zero value to set a manual extrusion width for infill for top surfaces. You may want to use thinner extrudates to fill all narrow regions and get a smoother finish. If left zero, default extrusion width will be used if set, otherwise nozzle diameter will be used. If expressed as percentage (for example 90%) it will be computed over layer height." -msgstr "이 값을 0이 아닌 값으로 설정하여 상단 서피스에 대한 infill의 수동 압출 폭을 설정합니다. 얇은 압출 성형물을 사용하여 모든 좁은 지역을 채우고 더 매끄러운 마무리를 할 수 있습니다. 0으로 설정된 경우 기본 압출 폭이 사용되고 그렇지 않으면 노즐 지름이 사용됩니다. 백분율 (예 : 90 %)로 표현하면 레이어 높이를 기준으로 계산됩니다." +#: src/libslic3r/PrintConfig.cpp:2117 +msgid "" +"Set this to a non-zero value to set a manual extrusion width for infill for " +"top surfaces. You may want to use thinner extrudates to fill all narrow " +"regions and get a smoother finish. If left zero, default extrusion width " +"will be used if set, otherwise nozzle diameter will be used. If expressed as " +"percentage (for example 90%) it will be computed over layer height." +msgstr "" +"이 값을 0이 아닌 값으로 설정하여 상단 서피스에 대한 infill의 수동 압출 폭을 " +"설정합니다. 얇은 압출 성형물을 사용하여 모든 좁은 지역을 채우고 더 매끄러운 " +"마무리를 할 수 있습니다. 0으로 설정된 경우 기본 압출 폭이 사용되고 그렇지 않" +"으면 노즐 지름이 사용됩니다. 백분율 (예 : 90 %)로 표현하면 레이어 높이를 기준" +"으로 계산됩니다." -#: src/libslic3r/PrintConfig.cpp:2081 -msgid "Speed for printing top solid layers (it only applies to the uppermost external layers and not to their internal solid layers). You may want to slow down this to get a nicer surface finish. This can be expressed as a percentage (for example: 80%) over the solid infill speed above. Set to zero for auto." -msgstr "상단 솔리드 레이어 인쇄 속도 (솔리드 레이어가 아닌 최상단 외부 레이어에만 적용) 표면을 더 좋게 마무리하려면 속도를 늦추시기 바랍니다. 이것은 위의 고체 충전 속도에 대한 백분율 (예 : 80 %)로 나타낼 수 있습니다. 자동으로 0으로 설정하십시오." +#: src/libslic3r/PrintConfig.cpp:2129 +msgid "" +"Speed for printing top solid layers (it only applies to the uppermost " +"external layers and not to their internal solid layers). You may want to " +"slow down this to get a nicer surface finish. This can be expressed as a " +"percentage (for example: 80%) over the solid infill speed above. Set to zero " +"for auto." +msgstr "" +"상단 솔리드 레이어 인쇄 속도 (솔리드 레이어가 아닌 최상단 외부 레이어에만 적" +"용) 표면을 더 좋게 마무리하려면 속도를 늦추시기 바랍니다. 이것은 위의 고체 충" +"전 속도에 대한 백분율 (예 : 80 %)로 나타낼 수 있습니다. 자동으로 0으로 설정하" +"십시오." -#: src/libslic3r/PrintConfig.cpp:2096 +#: src/libslic3r/PrintConfig.cpp:2144 msgid "Number of solid layers to generate on top surfaces." msgstr "상단 표면에 생성 할 솔리드 레이어 수입니다." -#: src/libslic3r/PrintConfig.cpp:2097 +#: src/libslic3r/PrintConfig.cpp:2145 msgid "Top solid layers" msgstr "탑 솔리드 레이어" -#: src/libslic3r/PrintConfig.cpp:2103 +#: src/libslic3r/PrintConfig.cpp:2153 +msgid "" +"The number of top solid layers is increased above top_solid_layers if " +"necessary to satisfy minimum thickness of top shell. This is useful to " +"prevent pillowing effect when printing with variable layer height." +msgstr "" +"상단 단층의 수는 상단 쉘의 최소 두께를 충족하기 위해 필요한 경우 " +"top_solid_layers 이상으로 증가한다. 이 기능은 가변 레이어 높이로 인쇄할 때 베" +"개 효과를 방지하는 데 유용합니다." + +#: src/libslic3r/PrintConfig.cpp:2156 +msgid "Minimum top shell thickness" +msgstr "최소 상단 쉘 두께" + +#: src/libslic3r/PrintConfig.cpp:2163 msgid "Speed for travel moves (jumps between distant extrusion points)." msgstr "이동 속도 (먼 돌출 점 사이의 점프)." -#: src/libslic3r/PrintConfig.cpp:2111 +#: src/libslic3r/PrintConfig.cpp:2171 msgid "Use firmware retraction" msgstr "펌웨어 철회" -#: src/libslic3r/PrintConfig.cpp:2112 -msgid "This experimental setting uses G10 and G11 commands to have the firmware handle the retraction. This is only supported in recent Marlin." -msgstr "이 실험 설정은 G10 및 G11 명령을 사용하여 펌웨어에서 취소를 처리하도록합니다. 이것은 최근의 말린에서만 지원됩니다." +#: src/libslic3r/PrintConfig.cpp:2172 +msgid "" +"This experimental setting uses G10 and G11 commands to have the firmware " +"handle the retraction. This is only supported in recent Marlin." +msgstr "" +"이 실험 설정은 G10 및 G11 명령을 사용하여 펌웨어에서 취소를 처리하도록합니" +"다. 이것은 최근의 말린에서만 지원됩니다." -#: src/libslic3r/PrintConfig.cpp:2118 +#: src/libslic3r/PrintConfig.cpp:2178 msgid "Use relative E distances" msgstr "상대적인 E 거리 사용" -#: src/libslic3r/PrintConfig.cpp:2119 -msgid "If your firmware requires relative E values, check this, otherwise leave it unchecked. Most firmwares use absolute values." -msgstr "펌웨어에 상대 E 값이 필요한 경우이 값을 선택하고, 그렇지 않으면 선택하지 마십시오. 대부분의 회사는 절대 값을 사용합니다." +#: src/libslic3r/PrintConfig.cpp:2179 +msgid "" +"If your firmware requires relative E values, check this, otherwise leave it " +"unchecked. Most firmwares use absolute values." +msgstr "" +"펌웨어에 상대 E 값이 필요한 경우이 값을 선택하고, 그렇지 않으면 선택하지 마십" +"시오. 대부분의 회사는 절대 값을 사용합니다." -#: src/libslic3r/PrintConfig.cpp:2125 +#: src/libslic3r/PrintConfig.cpp:2185 msgid "Use volumetric E" msgstr "용적 E 사용" -#: src/libslic3r/PrintConfig.cpp:2126 -msgid "This experimental setting uses outputs the E values in cubic millimeters instead of linear millimeters. If your firmware doesn't already know filament diameter(s), you can put commands like 'M200 D[filament_diameter_0] T0' in your start G-code in order to turn volumetric mode on and use the filament diameter associated to the filament selected in Slic3r. This is only supported in recent Marlin." -msgstr "이 실험 설정은 선형 밀리미터 대신에 입방 밀리미터 단위의 E 값을 출력으로 사용합니다. 펌웨어가 필라멘트 직경을 모르는 경우 볼륨 모드를 켜고 선택한 필라멘트와 연결된 필라멘트 직경을 사용하기 위해 시작 G 코드에 'M200 D [filament_diameter_0] T0'과 같은 명령을 입력 할 수 있습니다 Slic3r. 이것은 최근의 말린에서만 지원됩니다." +#: src/libslic3r/PrintConfig.cpp:2186 +msgid "" +"This experimental setting uses outputs the E values in cubic millimeters " +"instead of linear millimeters. If your firmware doesn't already know " +"filament diameter(s), you can put commands like 'M200 D[filament_diameter_0] " +"T0' in your start G-code in order to turn volumetric mode on and use the " +"filament diameter associated to the filament selected in Slic3r. This is " +"only supported in recent Marlin." +msgstr "" +"이 실험 설정은 선형 밀리미터 대신에 입방 밀리미터 단위의 E 값을 출력으로 사용" +"합니다. 펌웨어가 필라멘트 직경을 모르는 경우 볼륨 모드를 켜고 선택한 필라멘트" +"와 연결된 필라멘트 직경을 사용하기 위해 시작 G 코드에 'M200 D " +"[filament_diameter_0] T0'과 같은 명령을 입력 할 수 있습니다 Slic3r. 이것은 최" +"근의 말린에서만 지원됩니다." -#: src/libslic3r/PrintConfig.cpp:2136 +#: src/libslic3r/PrintConfig.cpp:2196 msgid "Enable variable layer height feature" msgstr "가변 레이어 높이 기능 사용" -#: src/libslic3r/PrintConfig.cpp:2137 -msgid "Some printers or printer setups may have difficulties printing with a variable layer height. Enabled by default." -msgstr "일부 프린터 또는 프린터 설정은 가변 레이어 높이로 인쇄하는 데 어려움이있을 수 있습니다. 기본적으로 사용됩니다." +#: src/libslic3r/PrintConfig.cpp:2197 +msgid "" +"Some printers or printer setups may have difficulties printing with a " +"variable layer height. Enabled by default." +msgstr "" +"일부 프린터 또는 프린터 설정은 가변 레이어 높이로 인쇄하는 데 어려움이있을 " +"수 있습니다. 기본적으로 사용됩니다." -#: src/libslic3r/PrintConfig.cpp:2143 +#: src/libslic3r/PrintConfig.cpp:2203 msgid "Wipe while retracting" msgstr "수축시 닦아내십시오" -#: src/libslic3r/PrintConfig.cpp:2144 -msgid "This flag will move the nozzle while retracting to minimize the possible blob on leaky extruders." -msgstr "이 플래그는 누출된 리트랙싱의 블럽 가능성을 최소화하기 위해 수축하는 동안 노즐을 이동시킨다." +#: src/libslic3r/PrintConfig.cpp:2204 +msgid "" +"This flag will move the nozzle while retracting to minimize the possible " +"blob on leaky extruders." +msgstr "" +"이 플래그는 누출된 리트랙싱의 블럽 가능성을 최소화하기 위해 수축하는 동안 노" +"즐을 이동시킨다." -#: src/libslic3r/PrintConfig.cpp:2151 -msgid "Multi material printers may need to prime or purge extruders on tool changes. Extrude the excess material into the wipe tower." -msgstr "다중 메터리알 프린터는 공구 교환 시 익스트루더를 프라이밍하거나 제거해야 할 수 있다. 과도한 물질을 와이퍼 타워에 돌출시킨다." +#: src/libslic3r/PrintConfig.cpp:2211 +msgid "" +"Multi material printers may need to prime or purge extruders on tool " +"changes. Extrude the excess material into the wipe tower." +msgstr "" +"다중 메터리알 프린터는 공구 교환 시 익스트루더를 프라이밍하거나 제거해야 할 " +"수 있다. 과도한 물질을 와이퍼 타워에 돌출시킨다." -#: src/libslic3r/PrintConfig.cpp:2157 +#: src/libslic3r/PrintConfig.cpp:2217 msgid "Purging volumes - load/unload volumes" msgstr "볼륨 삭제 - 볼륨 로드/언로드" -#: src/libslic3r/PrintConfig.cpp:2158 -msgid "This vector saves required volumes to change from/to each tool used on the wipe tower. These values are used to simplify creation of the full purging volumes below." -msgstr "이 벡터는 지우기 타워에서 사용 되는 각 도구에서/로 변경 하는 데 필요한 볼륨을 저장 합니다. 이러한 값은 아래의 전체 퍼징 볼륨의 생성을 단순화 하는 데 사용 됩니다." +#: src/libslic3r/PrintConfig.cpp:2218 +msgid "" +"This vector saves required volumes to change from/to each tool used on the " +"wipe tower. These values are used to simplify creation of the full purging " +"volumes below." +msgstr "" +"이 벡터는 지우기 타워에서 사용 되는 각 도구에서/로 변경 하는 데 필요한 볼륨" +"을 저장 합니다. 이러한 값은 아래의 전체 퍼징 볼륨의 생성을 단순화 하는 데 사" +"용 됩니다." -#: src/libslic3r/PrintConfig.cpp:2164 +#: src/libslic3r/PrintConfig.cpp:2224 msgid "Purging volumes - matrix" msgstr "볼륨 삭제 - 행렬" -#: src/libslic3r/PrintConfig.cpp:2165 -msgid "This matrix describes volumes (in cubic milimetres) required to purge the new filament on the wipe tower for any given pair of tools." -msgstr "이 매트릭스는 지정 된 도구 쌍에 대해 와이퍼 타워의 새필라멘트를 제거 하는 데 필요한 체적 (입방 밀리 미터)을 설명 합니다." +#: src/libslic3r/PrintConfig.cpp:2225 +msgid "" +"This matrix describes volumes (in cubic milimetres) required to purge the " +"new filament on the wipe tower for any given pair of tools." +msgstr "" +"이 매트릭스는 지정 된 도구 쌍에 대해 와이퍼 타워의 새필라멘트를 제거 하는 데 " +"필요한 체적 (입방 밀리 미터)을 설명 합니다." -#: src/libslic3r/PrintConfig.cpp:2174 +#: src/libslic3r/PrintConfig.cpp:2234 msgid "Position X" msgstr "X축 위치" -#: src/libslic3r/PrintConfig.cpp:2175 +#: src/libslic3r/PrintConfig.cpp:2235 msgid "X coordinate of the left front corner of a wipe tower" msgstr "와이프 타워의 좌측 전면 모서리의 X 좌표" -#: src/libslic3r/PrintConfig.cpp:2181 +#: src/libslic3r/PrintConfig.cpp:2241 msgid "Position Y" msgstr "Y축 위치" -#: src/libslic3r/PrintConfig.cpp:2182 +#: src/libslic3r/PrintConfig.cpp:2242 msgid "Y coordinate of the left front corner of a wipe tower" msgstr "와이퍼 작동 타워의 좌측 전방 모서리의 Y 좌표" -#: src/libslic3r/PrintConfig.cpp:2189 +#: src/libslic3r/PrintConfig.cpp:2249 msgid "Width of a wipe tower" msgstr "와이퍼 타워 폭" -#: src/libslic3r/PrintConfig.cpp:2195 +#: src/libslic3r/PrintConfig.cpp:2255 msgid "Wipe tower rotation angle" msgstr "와이퍼 타워 회전각도" -#: src/libslic3r/PrintConfig.cpp:2196 +#: src/libslic3r/PrintConfig.cpp:2256 msgid "Wipe tower rotation angle with respect to x-axis." msgstr "X 축에 대해 타워 회전 각도를 닦습니다." -#: src/libslic3r/PrintConfig.cpp:2203 +#: src/libslic3r/PrintConfig.cpp:2263 msgid "Wipe into this object's infill" msgstr "이 객체(object)의 채우기로 지우기" -#: src/libslic3r/PrintConfig.cpp:2204 -msgid "Purging after toolchange will done inside this object's infills. This lowers the amount of waste but may result in longer print time due to additional travel moves." -msgstr "도구 변경 후 제거는 이 객체(object)의 채우기 내부에서 수행 됩니다. 이렇게 하면 낭비 되는 양이 줄어들지만 추가적인 이동으로 인해 인쇄 시간이 길어질 수 있습니다." +#: src/libslic3r/PrintConfig.cpp:2264 +msgid "" +"Purging after toolchange will done inside this object's infills. This lowers " +"the amount of waste but may result in longer print time due to additional " +"travel moves." +msgstr "" +"도구 변경 후 제거는 이 객체(object)의 채우기 내부에서 수행 됩니다. 이렇게 하" +"면 낭비 되는 양이 줄어들지만 추가적인 이동으로 인해 인쇄 시간이 길어질 수 있" +"습니다." -#: src/libslic3r/PrintConfig.cpp:2211 +#: src/libslic3r/PrintConfig.cpp:2271 msgid "Wipe into this object" msgstr "이 객체(object)로 지우기" -#: src/libslic3r/PrintConfig.cpp:2212 -msgid "Object will be used to purge the nozzle after a toolchange to save material that would otherwise end up in the wipe tower and decrease print time. Colours of the objects will be mixed as a result." -msgstr "객체(object)는 도구 변경 후 노즐을 소거 하는 데 사용 되며, 그렇지 않으면 와이프 타워에서 종료 되는 재료를 저장 하고 인쇄 시간을 줄입니다. 그 결과 객체(object)의 색상이 혼합 됩니다." +#: src/libslic3r/PrintConfig.cpp:2272 +msgid "" +"Object will be used to purge the nozzle after a toolchange to save material " +"that would otherwise end up in the wipe tower and decrease print time. " +"Colours of the objects will be mixed as a result." +msgstr "" +"객체(object)는 도구 변경 후 노즐을 소거 하는 데 사용 되며, 그렇지 않으면 와이" +"프 타워에서 종료 되는 재료를 저장 하고 인쇄 시간을 줄입니다. 그 결과 객체" +"(object)의 색상이 혼합 됩니다." -#: src/libslic3r/PrintConfig.cpp:2218 +#: src/libslic3r/PrintConfig.cpp:2278 msgid "Maximal bridging distance" msgstr "최대 브리징 거리" -#: src/libslic3r/PrintConfig.cpp:2219 +#: src/libslic3r/PrintConfig.cpp:2279 msgid "Maximal distance between supports on sparse infill sections." msgstr "드문드문한 인필 섹션에서 지지대 사이의 최대 거리." -#: src/libslic3r/PrintConfig.cpp:2225 +#: src/libslic3r/PrintConfig.cpp:2285 msgid "XY Size Compensation" -msgstr "XY 크기 보정" +msgstr "XY 수평 확장" -#: src/libslic3r/PrintConfig.cpp:2227 -msgid "The object will be grown/shrunk in the XY plane by the configured value (negative = inwards, positive = outwards). This might be useful for fine-tuning hole sizes." -msgstr "XY 평면에서 설정된 값(음수 = 안, 양 = 바깥쪽)에 따라 객체(object)가 증가/정격된다. 이는 구멍 크기를 미세 조정하는데 유용할 수 있다." +#: src/libslic3r/PrintConfig.cpp:2287 +msgid "" +"The object will be grown/shrunk in the XY plane by the configured value " +"(negative = inwards, positive = outwards). This might be useful for fine-" +"tuning hole sizes." +msgstr "" +"XY 평면에서 설정된 값(음수 = 안, 양 = 바깥쪽)에 따라 객체(object)가 증가/정격" +"된다. 이는 구멍 크기를 미세 조정하는데 유용할 수 있다." -#: src/libslic3r/PrintConfig.cpp:2235 +#: src/libslic3r/PrintConfig.cpp:2295 msgid "Z offset" msgstr "Z 오프셋" -#: src/libslic3r/PrintConfig.cpp:2236 -msgid "This value will be added (or subtracted) from all the Z coordinates in the output G-code. It is used to compensate for bad Z endstop position: for example, if your endstop zero actually leaves the nozzle 0.3mm far from the print bed, set this to -0.3 (or fix your endstop)." -msgstr "이 값은 출력 G-코드의 모든 Z 좌표에서 추가(또는 감산)된다. 예를 들어, 엔드 스톱 0이 실제로 노즐을 프린트 베드에서 0.3mm 떨어진 곳에 둔 경우, 이를 -0.3(또는 엔드 스톱을 고정)으로 설정하십시오." +#: src/libslic3r/PrintConfig.cpp:2296 +msgid "" +"This value will be added (or subtracted) from all the Z coordinates in the " +"output G-code. It is used to compensate for bad Z endstop position: for " +"example, if your endstop zero actually leaves the nozzle 0.3mm far from the " +"print bed, set this to -0.3 (or fix your endstop)." +msgstr "" +"이 값은 출력 G-code의 모든 Z 좌표에서 추가(또는 감산)된다. 예를 들어, 엔드 스" +"톱 0이 실제로 노즐을 프린트 베드에서 0.3mm 떨어진 곳에 둔 경우, 이를 -0.3(또" +"는 엔드 스톱을 고정)으로 설정하십시오." -#: src/libslic3r/PrintConfig.cpp:2294 +#: src/libslic3r/PrintConfig.cpp:2363 msgid "Display width" msgstr "디스플레이 너비" -#: src/libslic3r/PrintConfig.cpp:2295 +#: src/libslic3r/PrintConfig.cpp:2364 msgid "Width of the display" msgstr "디스플레이의 폭입니다" -#: src/libslic3r/PrintConfig.cpp:2300 +#: src/libslic3r/PrintConfig.cpp:2369 msgid "Display height" msgstr "표시 높이" -#: src/libslic3r/PrintConfig.cpp:2301 +#: src/libslic3r/PrintConfig.cpp:2370 msgid "Height of the display" msgstr "디스플레이의 높이" -#: src/libslic3r/PrintConfig.cpp:2306 +#: src/libslic3r/PrintConfig.cpp:2375 msgid "Number of pixels in" msgstr "의 픽셀 수" -#: src/libslic3r/PrintConfig.cpp:2308 +#: src/libslic3r/PrintConfig.cpp:2377 msgid "Number of pixels in X" msgstr "X의 픽셀 수" -#: src/libslic3r/PrintConfig.cpp:2314 +#: src/libslic3r/PrintConfig.cpp:2383 msgid "Number of pixels in Y" msgstr "Y의 픽셀 수" -#: src/libslic3r/PrintConfig.cpp:2319 +#: src/libslic3r/PrintConfig.cpp:2388 msgid "Display horizontal mirroring" msgstr "수평 미러링 표시" -#: src/libslic3r/PrintConfig.cpp:2320 +#: src/libslic3r/PrintConfig.cpp:2389 msgid "Mirror horizontally" msgstr "수평으로 미러" -#: src/libslic3r/PrintConfig.cpp:2321 +#: src/libslic3r/PrintConfig.cpp:2390 msgid "Enable horizontal mirroring of output images" msgstr "출력 이미지의 수평 미러링 사용" -#: src/libslic3r/PrintConfig.cpp:2326 +#: src/libslic3r/PrintConfig.cpp:2395 msgid "Display vertical mirroring" msgstr "수직 미러링 표시" -#: src/libslic3r/PrintConfig.cpp:2327 +#: src/libslic3r/PrintConfig.cpp:2396 msgid "Mirror vertically" msgstr "수직으로 미러" -#: src/libslic3r/PrintConfig.cpp:2328 +#: src/libslic3r/PrintConfig.cpp:2397 msgid "Enable vertical mirroring of output images" msgstr "출력 이미지의 수직 미러링 사용" -#: src/libslic3r/PrintConfig.cpp:2333 +#: src/libslic3r/PrintConfig.cpp:2402 msgid "Display orientation" msgstr "디스플레이 방향" -#: src/libslic3r/PrintConfig.cpp:2334 -msgid "Set the actual LCD display orientation inside the SLA printer. Portrait mode will flip the meaning of display width and height parameters and the output images will be rotated by 90 degrees." -msgstr "SLA 프린터 내에서 실제 LCD 디스플레이 방향을 설정 합니다. 세로 모드는 디스플레이 너비 및 높이 매개 변수의 의미를 반전 하 고 출력 이미지는 90도 회전 합니다." +#: src/libslic3r/PrintConfig.cpp:2403 +msgid "" +"Set the actual LCD display orientation inside the SLA printer. Portrait mode " +"will flip the meaning of display width and height parameters and the output " +"images will be rotated by 90 degrees." +msgstr "" +"SLA 프린터 내에서 실제 LCD 디스플레이 방향을 설정 합니다. 세로 모드는 디스플" +"레이 너비 및 높이 매개 변수의 의미를 반전 하 고 출력 이미지는 90도 회전 합니" +"다." -#: src/libslic3r/PrintConfig.cpp:2340 +#: src/libslic3r/PrintConfig.cpp:2409 msgid "Landscape" msgstr "가로" -#: src/libslic3r/PrintConfig.cpp:2341 +#: src/libslic3r/PrintConfig.cpp:2410 msgid "Portrait" msgstr "세로모드" -#: src/libslic3r/PrintConfig.cpp:2346 +#: src/libslic3r/PrintConfig.cpp:2415 msgid "Fast" msgstr "빠른" -#: src/libslic3r/PrintConfig.cpp:2347 +#: src/libslic3r/PrintConfig.cpp:2416 msgid "Fast tilt" msgstr "빠른 기울기" -#: src/libslic3r/PrintConfig.cpp:2348 +#: src/libslic3r/PrintConfig.cpp:2417 msgid "Time of the fast tilt" msgstr "기울이기 시간" -#: src/libslic3r/PrintConfig.cpp:2355 +#: src/libslic3r/PrintConfig.cpp:2424 msgid "Slow" msgstr "느리게" -#: src/libslic3r/PrintConfig.cpp:2356 +#: src/libslic3r/PrintConfig.cpp:2425 msgid "Slow tilt" msgstr "슬로우 틸트" -#: src/libslic3r/PrintConfig.cpp:2357 +#: src/libslic3r/PrintConfig.cpp:2426 msgid "Time of the slow tilt" msgstr "느린 기울기의 시간" -#: src/libslic3r/PrintConfig.cpp:2364 +#: src/libslic3r/PrintConfig.cpp:2433 msgid "Area fill" msgstr "영역 채우기" -#: src/libslic3r/PrintConfig.cpp:2365 +#: src/libslic3r/PrintConfig.cpp:2434 msgid "" "The percentage of the bed area. \n" "If the print area exceeds the specified value, \n" "then a slow tilt will be used, otherwise - a fast tilt" msgstr "" -"침대 영역의 비율입니다. \n" +"배드 영역의 비율입니다. \n" "인쇄 영역이 지정 된 값을 초과 하면 \n" "그런 다음 느린 기울기가 사용 됩니다, 그렇지 않으면-빠른 기울기가 됩니다" -#: src/libslic3r/PrintConfig.cpp:2372 src/libslic3r/PrintConfig.cpp:2373 -#: src/libslic3r/PrintConfig.cpp:2374 +#: src/libslic3r/PrintConfig.cpp:2441 src/libslic3r/PrintConfig.cpp:2442 +#: src/libslic3r/PrintConfig.cpp:2443 msgid "Printer scaling correction" msgstr "프린터 스케일링 보정" -#: src/libslic3r/PrintConfig.cpp:2380 src/libslic3r/PrintConfig.cpp:2381 +#: src/libslic3r/PrintConfig.cpp:2449 src/libslic3r/PrintConfig.cpp:2450 msgid "Printer absolute correction" msgstr "프린터 절대 보정" -#: src/libslic3r/PrintConfig.cpp:2382 -msgid "Will inflate or deflate the sliced 2D polygons according to the sign of the correction." +#: src/libslic3r/PrintConfig.cpp:2451 +msgid "" +"Will inflate or deflate the sliced 2D polygons according to the sign of the " +"correction." msgstr "교정 기호에 따라 슬라이스된 2D 폴리곤을 팽창 하거나 수축 합니다." -#: src/libslic3r/PrintConfig.cpp:2388 src/libslic3r/PrintConfig.cpp:2389 +#: src/libslic3r/PrintConfig.cpp:2457 src/libslic3r/PrintConfig.cpp:2458 msgid "Printer gamma correction" msgstr "프린터 감마 보정" -#: src/libslic3r/PrintConfig.cpp:2390 -msgid "This will apply a gamma correction to the rasterized 2D polygons. A gamma value of zero means thresholding with the threshold in the middle. This behaviour eliminates antialiasing without losing holes in polygons." -msgstr "이렇게 하면 래스터화된 2D 다각형에 감마 보정이 적용 됩니다. 감마 값이 0 이면 중간에 임계값이 임계화 의미입니다. 이 동작은 폴리곤의 구멍을 잃지 않고 안티알리아싱을 제거 합니다." +#: src/libslic3r/PrintConfig.cpp:2459 +msgid "" +"This will apply a gamma correction to the rasterized 2D polygons. A gamma " +"value of zero means thresholding with the threshold in the middle. This " +"behaviour eliminates antialiasing without losing holes in polygons." +msgstr "" +"이렇게 하면 래스터화된 2D 다각형에 감마 보정이 적용 됩니다. 감마 값이 0 이면 " +"중간에 임계값이 임계화 의미입니다. 이 동작은 폴리곤의 구멍을 잃지 않고 안티알" +"리아싱을 제거 합니다." -#: src/libslic3r/PrintConfig.cpp:2401 src/libslic3r/PrintConfig.cpp:2402 +#: src/libslic3r/PrintConfig.cpp:2471 src/libslic3r/PrintConfig.cpp:2472 +msgid "SLA material type" +msgstr "SLA 재질 유형" + +#: src/libslic3r/PrintConfig.cpp:2483 src/libslic3r/PrintConfig.cpp:2484 msgid "Initial layer height" msgstr "초기 레이어 높이" -#: src/libslic3r/PrintConfig.cpp:2408 +#: src/libslic3r/PrintConfig.cpp:2490 src/libslic3r/PrintConfig.cpp:2491 +msgid "Bottle volume" +msgstr "병 볼륨" + +#: src/libslic3r/PrintConfig.cpp:2492 +msgid "ml" +msgstr "광년" + +#: src/libslic3r/PrintConfig.cpp:2497 src/libslic3r/PrintConfig.cpp:2498 +msgid "Bottle weight" +msgstr "병 무게" + +#: src/libslic3r/PrintConfig.cpp:2499 +msgid "kg" +msgstr "kg" + +#: src/libslic3r/PrintConfig.cpp:2506 +msgid "g/ml" +msgstr "g /ml" + +#: src/libslic3r/PrintConfig.cpp:2513 +msgid "money/bottle" +msgstr "돈 /병" + +#: src/libslic3r/PrintConfig.cpp:2518 msgid "Faded layers" msgstr "페이드 레이어" -#: src/libslic3r/PrintConfig.cpp:2409 -msgid "Number of the layers needed for the exposure time fade from initial exposure time to the exposure time" +#: src/libslic3r/PrintConfig.cpp:2519 +msgid "" +"Number of the layers needed for the exposure time fade from initial exposure " +"time to the exposure time" msgstr "노출 시간에 필요한 레이어 수는 초기 노출 시간에서 노출 시간으로 페이드" -#: src/libslic3r/PrintConfig.cpp:2416 src/libslic3r/PrintConfig.cpp:2417 +#: src/libslic3r/PrintConfig.cpp:2526 src/libslic3r/PrintConfig.cpp:2527 +msgid "Minimum exposure time" +msgstr "최소 노출 시간" + +#: src/libslic3r/PrintConfig.cpp:2534 src/libslic3r/PrintConfig.cpp:2535 +msgid "Maximum exposure time" +msgstr "최대 노출 시간" + +#: src/libslic3r/PrintConfig.cpp:2542 src/libslic3r/PrintConfig.cpp:2543 msgid "Exposure time" msgstr "노출 시간" -#: src/libslic3r/PrintConfig.cpp:2423 src/libslic3r/PrintConfig.cpp:2424 +#: src/libslic3r/PrintConfig.cpp:2549 src/libslic3r/PrintConfig.cpp:2550 +msgid "Minimum initial exposure time" +msgstr "최소 초기 노출 시간" + +#: src/libslic3r/PrintConfig.cpp:2557 src/libslic3r/PrintConfig.cpp:2558 +msgid "Maximum initial exposure time" +msgstr "최대 초기 노출 시간" + +#: src/libslic3r/PrintConfig.cpp:2565 src/libslic3r/PrintConfig.cpp:2566 msgid "Initial exposure time" msgstr "초기 노출 시간" -#: src/libslic3r/PrintConfig.cpp:2430 src/libslic3r/PrintConfig.cpp:2431 +#: src/libslic3r/PrintConfig.cpp:2572 src/libslic3r/PrintConfig.cpp:2573 msgid "Correction for expansion" msgstr "확장 보정" -#: src/libslic3r/PrintConfig.cpp:2437 +#: src/libslic3r/PrintConfig.cpp:2579 msgid "SLA print material notes" msgstr "SLA 인쇄 재료 참고 사항" -#: src/libslic3r/PrintConfig.cpp:2438 +#: src/libslic3r/PrintConfig.cpp:2580 msgid "You can put your notes regarding the SLA print material here." msgstr "여기에서 SLA 인쇄 자료에 대한 메모를 넣을 수 있습니다." -#: src/libslic3r/PrintConfig.cpp:2446 src/libslic3r/PrintConfig.cpp:2457 +#: src/libslic3r/PrintConfig.cpp:2592 src/libslic3r/PrintConfig.cpp:2603 msgid "Default SLA material profile" msgstr "기본 SLA 재질 프로 파일" -#: src/libslic3r/PrintConfig.cpp:2468 +#: src/libslic3r/PrintConfig.cpp:2614 msgid "Generate supports" msgstr "지원 생성" -#: src/libslic3r/PrintConfig.cpp:2470 +#: src/libslic3r/PrintConfig.cpp:2616 msgid "Generate supports for the models" msgstr "모델에 대한 지원 생성" -#: src/libslic3r/PrintConfig.cpp:2475 +#: src/libslic3r/PrintConfig.cpp:2621 msgid "Support head front diameter" msgstr "서포트 헤드 전면 지름" -#: src/libslic3r/PrintConfig.cpp:2477 +#: src/libslic3r/PrintConfig.cpp:2623 msgid "Diameter of the pointing side of the head" msgstr "헤드 포인팅 측면 지름" -#: src/libslic3r/PrintConfig.cpp:2484 +#: src/libslic3r/PrintConfig.cpp:2630 msgid "Support head penetration" msgstr "서포트 헤드 관통" -#: src/libslic3r/PrintConfig.cpp:2486 +#: src/libslic3r/PrintConfig.cpp:2632 msgid "How much the pinhead has to penetrate the model surface" msgstr "핀 헤드가 모델 표면에 침투 하는 정도" -#: src/libslic3r/PrintConfig.cpp:2493 +#: src/libslic3r/PrintConfig.cpp:2639 msgid "Support head width" msgstr "서포트 헤드 폭" -#: src/libslic3r/PrintConfig.cpp:2495 +#: src/libslic3r/PrintConfig.cpp:2641 msgid "Width from the back sphere center to the front sphere center" -msgstr "뒤쪽 구 중심에서 앞쪽 구 중심 까지의 폭입니다" +msgstr "뒤쪽 구 중재봉선에서 앞쪽 구 중재봉선 까지의 폭입니다" -#: src/libslic3r/PrintConfig.cpp:2503 +#: src/libslic3r/PrintConfig.cpp:2649 msgid "Support pillar diameter" msgstr "서포트 기둥 지름" -#: src/libslic3r/PrintConfig.cpp:2505 +#: src/libslic3r/PrintConfig.cpp:2651 msgid "Diameter in mm of the support pillars" msgstr "서포트 기둥의 지름 (mm)" -#: src/libslic3r/PrintConfig.cpp:2513 +#: src/libslic3r/PrintConfig.cpp:2659 msgid "Support pillar connection mode" msgstr "기둥 연결 모드 지원" -#: src/libslic3r/PrintConfig.cpp:2514 -msgid "Controls the bridge type between two neighboring pillars. Can be zig-zag, cross (double zig-zag) or dynamic which will automatically switch between the first two depending on the distance of the two pillars." -msgstr "인접한 두 기둥 사이의 교량 유형을 제어 합니다. 두 기둥의 거리에 따라 자동으로 처음 두 사이를 전환 하는 지그재그, 크로스 (지그재그 더블 지그재그) 또는 동적 수 있습니다." +#: src/libslic3r/PrintConfig.cpp:2660 +msgid "" +"Controls the bridge type between two neighboring pillars. Can be zig-zag, " +"cross (double zig-zag) or dynamic which will automatically switch between " +"the first two depending on the distance of the two pillars." +msgstr "" +"인접한 두 기둥 사이의 교량 유형을 제어 합니다. 두 기둥의 거리에 따라 자동으" +"로 처음 두 사이를 전환 하는 지그재그, 크로스 (지그재그 더블 지그재그) 또는 동" +"적 수 있습니다." -#: src/libslic3r/PrintConfig.cpp:2522 +#: src/libslic3r/PrintConfig.cpp:2668 msgid "Zig-Zag" msgstr "지그재그" -#: src/libslic3r/PrintConfig.cpp:2523 +#: src/libslic3r/PrintConfig.cpp:2669 msgid "Cross" msgstr "크로스" -#: src/libslic3r/PrintConfig.cpp:2524 +#: src/libslic3r/PrintConfig.cpp:2670 msgid "Dynamic" msgstr "동적" -#: src/libslic3r/PrintConfig.cpp:2536 +#: src/libslic3r/PrintConfig.cpp:2682 msgid "Pillar widening factor" msgstr "기둥 확장 계수" -#: src/libslic3r/PrintConfig.cpp:2538 -msgid "Merging bridges or pillars into another pillars can increase the radius. Zero means no increase, one means full increase." -msgstr "브릿지 또는 기둥을 다른 기둥에 병합 하면 반지름을 늘릴 수 있습니다. 0은 증가 없음을 의미 하나는 전체 증가를 의미 합니다." +#: src/libslic3r/PrintConfig.cpp:2684 +msgid "" +"Merging bridges or pillars into another pillars can increase the radius. " +"Zero means no increase, one means full increase." +msgstr "" +"브릿지 또는 기둥을 다른 기둥에 병합 하면 반지름을 늘릴 수 있습니다. 0은 증가 " +"없음을 의미 하나는 전체 증가를 의미 합니다." -#: src/libslic3r/PrintConfig.cpp:2547 +#: src/libslic3r/PrintConfig.cpp:2693 msgid "Support base diameter" msgstr "서포트 베이스 지름" -#: src/libslic3r/PrintConfig.cpp:2549 +#: src/libslic3r/PrintConfig.cpp:2695 msgid "Diameter in mm of the pillar base" msgstr "기둥 베이스의 mm 직경" -#: src/libslic3r/PrintConfig.cpp:2557 +#: src/libslic3r/PrintConfig.cpp:2703 msgid "Support base height" msgstr "서포트 기준 높이" -#: src/libslic3r/PrintConfig.cpp:2559 +#: src/libslic3r/PrintConfig.cpp:2705 msgid "The height of the pillar base cone" msgstr "서포트 베이스 원추의 높이" -#: src/libslic3r/PrintConfig.cpp:2566 +#: src/libslic3r/PrintConfig.cpp:2712 msgid "Support base safety distance" msgstr "지지기본 안전 거리" -#: src/libslic3r/PrintConfig.cpp:2569 -msgid "The minimum distance of the pillar base from the model in mm. Makes sense in zero elevation mode where a gap according to this parameter is inserted between the model and the pad." -msgstr "모델에서 기둥 베이스의 최소 거리(mm.mm.)는 이 매개변수에 따른 간격이 모델과 패드 사이에 삽입되는 제로 고도 모드에서 의미가 있습니다." +#: src/libslic3r/PrintConfig.cpp:2715 +msgid "" +"The minimum distance of the pillar base from the model in mm. Makes sense in " +"zero elevation mode where a gap according to this parameter is inserted " +"between the model and the pad." +msgstr "" +"모델에서 기둥 베이스의 최소 거리(mm.mm.)는 이 매개변수에 따른 간격이 모델과 " +"패드 사이에 삽입되는 제로 고도 모드에서 의미가 있습니다." -#: src/libslic3r/PrintConfig.cpp:2579 +#: src/libslic3r/PrintConfig.cpp:2725 msgid "Critical angle" msgstr "임계 각도" -#: src/libslic3r/PrintConfig.cpp:2581 +#: src/libslic3r/PrintConfig.cpp:2727 msgid "The default angle for connecting support sticks and junctions." msgstr "서포트 스틱과 접합부를 연결 하는 기본 각도입니다." -#: src/libslic3r/PrintConfig.cpp:2589 +#: src/libslic3r/PrintConfig.cpp:2735 msgid "Max bridge length" msgstr "최대 브리지 길이" -#: src/libslic3r/PrintConfig.cpp:2591 +#: src/libslic3r/PrintConfig.cpp:2737 msgid "The max length of a bridge" msgstr "브릿지의 최대 길이" -#: src/libslic3r/PrintConfig.cpp:2598 +#: src/libslic3r/PrintConfig.cpp:2744 msgid "Max pillar linking distance" msgstr "최대 기둥 연결 거리" -#: src/libslic3r/PrintConfig.cpp:2600 -msgid "The max distance of two pillars to get linked with each other. A zero value will prohibit pillar cascading." -msgstr "서로 연결 되는 두기둥의 최대 거리. 0 값은 기둥을 계단식으로 금지 합니다." +#: src/libslic3r/PrintConfig.cpp:2746 +msgid "" +"The max distance of two pillars to get linked with each other. A zero value " +"will prohibit pillar cascading." +msgstr "" +"서로 연결 되는 두기둥의 최대 거리. 0 값은 기둥을 계단식으로 금지 합니다." -#: src/libslic3r/PrintConfig.cpp:2608 +#: src/libslic3r/PrintConfig.cpp:2754 msgid "Object elevation" msgstr "객체(object) 고도" -#: src/libslic3r/PrintConfig.cpp:2610 -msgid "How much the supports should lift up the supported object. If this value is zero, the bottom of the model geometry will be considered as part of the pad." -msgstr "지원 대상을 들어 올려야 하는 양입니다. 이 값이 0이면 모델 형상의 맨 아래가 패드의 일부로 간주됩니다." +#: src/libslic3r/PrintConfig.cpp:2756 +msgid "" +"How much the supports should lift up the supported object. If \"Pad around " +"object\" is enabled, this value is ignored." +msgstr "" +"지원 대상을 들어 올려야 하는 양입니다. \"개체 주위 패드\"를 사용하도록 설정하" +"면 이 값은 무시됩니다." -#: src/libslic3r/PrintConfig.cpp:2622 +#: src/libslic3r/PrintConfig.cpp:2767 msgid "This is a relative measure of support points density." msgstr "이는 서포트 점 밀도의 상대적인 척도입니다." -#: src/libslic3r/PrintConfig.cpp:2628 +#: src/libslic3r/PrintConfig.cpp:2773 msgid "Minimal distance of the support points" msgstr "서포트 지점의 최소 거리" -#: src/libslic3r/PrintConfig.cpp:2630 +#: src/libslic3r/PrintConfig.cpp:2775 msgid "No support points will be placed closer than this threshold." msgstr "서포트 지점은 이 임계값 보다 더 가깝게 배치 되지 않습니다." -#: src/libslic3r/PrintConfig.cpp:2636 +#: src/libslic3r/PrintConfig.cpp:2781 msgid "Use pad" msgstr "패드 사용" -#: src/libslic3r/PrintConfig.cpp:2638 +#: src/libslic3r/PrintConfig.cpp:2783 msgid "Add a pad underneath the supported model" msgstr "서포트 되는 모델 아래에 패드 추가" -#: src/libslic3r/PrintConfig.cpp:2643 +#: src/libslic3r/PrintConfig.cpp:2788 msgid "Pad wall thickness" msgstr "패드 벽 두께" -#: src/libslic3r/PrintConfig.cpp:2645 +#: src/libslic3r/PrintConfig.cpp:2790 msgid "The thickness of the pad and its optional cavity walls." msgstr "패드의 두께와 옵션 캐비티 벽." -#: src/libslic3r/PrintConfig.cpp:2653 +#: src/libslic3r/PrintConfig.cpp:2798 msgid "Pad wall height" msgstr "패드 벽 높이" -#: src/libslic3r/PrintConfig.cpp:2654 -msgid "Defines the pad cavity depth. Set to zero to disable the cavity. Be careful when enabling this feature, as some resins may produce an extreme suction effect inside the cavity, which makes peeling the print off the vat foil difficult." -msgstr "패드 캐비티 깊이를 정의 합니다. 캐비티를 비활성화 하려면 0으로 설정 합니다. 이 기능을 활성화 할 때 주의 해야할, 일부 수 캐비티 내부 극단적인 흡입 효과를 생성 할 수도 있기 때문에, vat 호일 인쇄를 벗겨 어렵게 만든다." +#: src/libslic3r/PrintConfig.cpp:2799 +msgid "" +"Defines the pad cavity depth. Set to zero to disable the cavity. Be careful " +"when enabling this feature, as some resins may produce an extreme suction " +"effect inside the cavity, which makes peeling the print off the vat foil " +"difficult." +msgstr "" +"패드 캐비티 깊이를 정의 합니다. 캐비티를 비활성화 하려면 0으로 설정 합니다. " +"이 기능을 활성화 할 때 주의 해야할, 일부 수 캐비티 내부 극단적인 흡입 효과를 " +"생성 할 수도 있기 때문에, vat 호일 인쇄를 벗겨 어렵게 만든다." -#: src/libslic3r/PrintConfig.cpp:2667 +#: src/libslic3r/PrintConfig.cpp:2812 +msgid "Pad brim size" +msgstr "패드 브럼 사이즈" + +#: src/libslic3r/PrintConfig.cpp:2813 +msgid "How far should the pad extend around the contained geometry" +msgstr "패드가 포함된 형상 주위로 얼마나 확장되어야 하는지" + +#: src/libslic3r/PrintConfig.cpp:2823 msgid "Max merge distance" msgstr "최대 병합 거리" -#: src/libslic3r/PrintConfig.cpp:2669 -msgid "Some objects can get along with a few smaller pads instead of a single big one. This parameter defines how far the center of two smaller pads should be. If theyare closer, they will get merged into one pad." -msgstr "일부 객체(object)는 큰 하나 대신 몇 가지 작은 패드와 함께 얻을 수 있습니다. 이 매개 변수는 두 개의 작은 패드의 중심이 얼마나 되어야 하는지 정의 합니다. 그들은 하나의 패드에 병합을 얻을 것이다." +#: src/libslic3r/PrintConfig.cpp:2825 +msgid "" +"Some objects can get along with a few smaller pads instead of a single big " +"one. This parameter defines how far the center of two smaller pads should " +"be. If theyare closer, they will get merged into one pad." +msgstr "" +"일부 객체(object)는 큰 하나 대신 몇 가지 작은 패드와 함께 얻을 수 있습니다. " +"이 매개 변수는 두 개의 작은 패드의 중재봉선이 얼마나 되어야 하는지 정의 합니" +"다. 그들은 하나의 패드에 병합을 얻을 것이다." -#: src/libslic3r/PrintConfig.cpp:2680 -msgid "Pad edge radius" -msgstr "패드 가장자리 반경" - -#: src/libslic3r/PrintConfig.cpp:2689 +#: src/libslic3r/PrintConfig.cpp:2845 msgid "Pad wall slope" msgstr "패드 벽 경사" -#: src/libslic3r/PrintConfig.cpp:2691 -msgid "The slope of the pad wall relative to the bed plane. 90 degrees means straight walls." -msgstr "침대 평면을 기준으로 하는 패드 벽의 기울기입니다. 90도는 직선 벽을 의미 합니다." +#: src/libslic3r/PrintConfig.cpp:2847 +msgid "" +"The slope of the pad wall relative to the bed plane. 90 degrees means " +"straight walls." +msgstr "" +"배드 평면을 기준으로 하는 패드 벽의 기울기입니다. 90도는 직선 벽을 의미 합니" +"다." -#: src/libslic3r/PrintConfig.cpp:2700 +#: src/libslic3r/PrintConfig.cpp:2856 +msgid "Pad around object" +msgstr "개체 주위패드" + +#: src/libslic3r/PrintConfig.cpp:2858 +msgid "Create pad around object and ignore the support elevation" +msgstr "오브젝트 주위에 패드를 작성하고 지지 고도를 무시합니다." + +#: src/libslic3r/PrintConfig.cpp:2863 +msgid "Pad around object everywhere" +msgstr "어디서나 개체 주위에 패드" + +#: src/libslic3r/PrintConfig.cpp:2865 +msgid "Force pad around object everywhere" +msgstr "사방 오브젝트 주위의 포스 패드" + +#: src/libslic3r/PrintConfig.cpp:2870 msgid "Pad object gap" msgstr "패드 객체(object) 갭" -#: src/libslic3r/PrintConfig.cpp:2702 -msgid "The gap between the object bottom and the generated pad in zero elevation mode." +#: src/libslic3r/PrintConfig.cpp:2872 +msgid "" +"The gap between the object bottom and the generated pad in zero elevation " +"mode." msgstr "0 고도 모드에서 객체(object) 바닥과 생성된 패드 사이의 간격입니다." -#: src/libslic3r/PrintConfig.cpp:2711 +#: src/libslic3r/PrintConfig.cpp:2881 msgid "Pad object connector stride" msgstr "패드 객체(object) 커넥터 보폭" -#: src/libslic3r/PrintConfig.cpp:2713 -msgid "Distance between two connector sticks between the object pad and the generated pad." -msgstr "객체(object) 패드와 생성된 패드 사이의 두 커넥터 스틱 사이의 거리입니다." +#: src/libslic3r/PrintConfig.cpp:2883 +msgid "" +"Distance between two connector sticks which connect the object and the " +"generated pad." +msgstr "오브젝트와 생성된 패드를 연결하는 두 커넥터 스틱 사이의 거리입니다." -#: src/libslic3r/PrintConfig.cpp:2721 +#: src/libslic3r/PrintConfig.cpp:2890 msgid "Pad object connector width" msgstr "패드 객체(object) 커넥터 너비" -#: src/libslic3r/PrintConfig.cpp:2723 -msgid "The width of the connectors sticks which connect the object pad and the generated pad." -msgstr "커넥터의 너비는 객체(object) 패드와 생성된 패드를 연결하는 스틱입니다." +#: src/libslic3r/PrintConfig.cpp:2892 +msgid "" +"Width of the connector sticks which connect the object and the generated pad." +msgstr "개체와 생성된 패드를 연결하는 커넥터 스틱의 너비입니다." -#: src/libslic3r/PrintConfig.cpp:2731 +#: src/libslic3r/PrintConfig.cpp:2899 msgid "Pad object connector penetration" msgstr "패드 객체(object) 커넥터 침투" -#: src/libslic3r/PrintConfig.cpp:2734 +#: src/libslic3r/PrintConfig.cpp:2902 msgid "How much should the tiny connectors penetrate into the model body." msgstr "작은 커넥터가 모델 본체에 얼마나 침투해야 하는가?" -#: src/libslic3r/PrintConfig.cpp:3094 +#: src/libslic3r/PrintConfig.cpp:2909 +msgid "Enable hollowing" +msgstr "속빈 공동 사용" + +#: src/libslic3r/PrintConfig.cpp:2911 +msgid "Hollow out a model to have an empty interior" +msgstr "빈 내부를 가지고 모델을 비우기" + +#: src/libslic3r/PrintConfig.cpp:2916 +msgid "Hollowing thickness" +msgstr "속빈 공동 두께" + +#: src/libslic3r/PrintConfig.cpp:2918 +msgid "Minimum wall thickness of a hollowed model." +msgstr "속이 빈 모델의 최소 벽 두께입니다." + +#: src/libslic3r/PrintConfig.cpp:2926 +msgid "Hollowing accuracy" +msgstr "속빈 공동 정확도" + +#: src/libslic3r/PrintConfig.cpp:2928 +msgid "" +"Performance vs accuracy of calculation. Lower values may produce unwanted " +"artifacts." +msgstr "" +"성능 대 계산의 정확성. 값이 낮을수록 원치 않는 아티팩트가 생성될 수 있습니다." + +#: src/libslic3r/PrintConfig.cpp:2935 +msgid "Hollowing closing distance" +msgstr "공동화된 닫힘 반경" + +#: src/libslic3r/PrintConfig.cpp:3315 msgid "Export OBJ" msgstr "OBJ 내보내기" -#: src/libslic3r/PrintConfig.cpp:3095 +#: src/libslic3r/PrintConfig.cpp:3316 msgid "Export the model(s) as OBJ." msgstr "모델을 OBJ로 내보냅니다." -#: src/libslic3r/PrintConfig.cpp:3106 +#: src/libslic3r/PrintConfig.cpp:3327 msgid "Export SLA" msgstr "STL로 내보내기" -#: src/libslic3r/PrintConfig.cpp:3107 +#: src/libslic3r/PrintConfig.cpp:3328 msgid "Slice the model and export SLA printing layers as PNG." msgstr "모델을 분할하고 SLA 인쇄 레이어를 PNG로 내보냅니다." -#: src/libslic3r/PrintConfig.cpp:3112 +#: src/libslic3r/PrintConfig.cpp:3333 msgid "Export 3MF" msgstr "3MF 내보내기" -#: src/libslic3r/PrintConfig.cpp:3113 +#: src/libslic3r/PrintConfig.cpp:3334 msgid "Export the model(s) as 3MF." msgstr "모델을 3MF로 내보냅니다." -#: src/libslic3r/PrintConfig.cpp:3117 +#: src/libslic3r/PrintConfig.cpp:3338 msgid "Export AMF" msgstr "AMF 내보내기" -#: src/libslic3r/PrintConfig.cpp:3118 +#: src/libslic3r/PrintConfig.cpp:3339 msgid "Export the model(s) as AMF." msgstr "모델을 AMF로 내보냅니다." -#: src/libslic3r/PrintConfig.cpp:3122 +#: src/libslic3r/PrintConfig.cpp:3343 msgid "Export STL" msgstr "STL 내보내기" -#: src/libslic3r/PrintConfig.cpp:3123 +#: src/libslic3r/PrintConfig.cpp:3344 msgid "Export the model(s) as STL." msgstr "모델을 STL로 내보냅니다." -#: src/libslic3r/PrintConfig.cpp:3128 +#: src/libslic3r/PrintConfig.cpp:3349 msgid "Slice the model and export toolpaths as G-code." msgstr "모델을 슬라이스하고 공구 경로를 G 코드로 내보냅니다." -#: src/libslic3r/PrintConfig.cpp:3133 +#: src/libslic3r/PrintConfig.cpp:3354 msgid "Slice" msgstr "슬라이스" -#: src/libslic3r/PrintConfig.cpp:3134 -msgid "Slice the model as FFF or SLA based on the printer_technology configuration value." -msgstr " printer_technology 구성 값을 기반으로 모델을 FFF 또는 SLA로 슬라이스합니다." +#: src/libslic3r/PrintConfig.cpp:3355 +msgid "" +"Slice the model as FFF or SLA based on the printer_technology configuration " +"value." +msgstr "" +" printer_technology 구성 값을 기반으로 모델을 FFF 또는 SLA로 슬라이스합니다." -#: src/libslic3r/PrintConfig.cpp:3139 +#: src/libslic3r/PrintConfig.cpp:3360 msgid "Help" msgstr "도움말" -#: src/libslic3r/PrintConfig.cpp:3140 +#: src/libslic3r/PrintConfig.cpp:3361 msgid "Show this help." msgstr "이 도움말을 표시 합니다." -#: src/libslic3r/PrintConfig.cpp:3145 +#: src/libslic3r/PrintConfig.cpp:3366 msgid "Help (FFF options)" msgstr "도움말 (FFF 옵션)" -#: src/libslic3r/PrintConfig.cpp:3146 +#: src/libslic3r/PrintConfig.cpp:3367 msgid "Show the full list of print/G-code configuration options." msgstr "인쇄/G 코드 구성 옵션의 전체 목록을 표시 합니다." -#: src/libslic3r/PrintConfig.cpp:3150 +#: src/libslic3r/PrintConfig.cpp:3371 msgid "Help (SLA options)" msgstr "도움말 (SLA 옵션)" -#: src/libslic3r/PrintConfig.cpp:3151 +#: src/libslic3r/PrintConfig.cpp:3372 msgid "Show the full list of SLA print configuration options." msgstr "SLA 인쇄 구성 옵션의 전체 목록을 표시 합니다." -#: src/libslic3r/PrintConfig.cpp:3155 +#: src/libslic3r/PrintConfig.cpp:3376 msgid "Output Model Info" msgstr "출력 모델 정보" -#: src/libslic3r/PrintConfig.cpp:3156 +#: src/libslic3r/PrintConfig.cpp:3377 msgid "Write information about the model to the console." msgstr "모델에 대한 정보를 콘솔에 씁니다." -#: src/libslic3r/PrintConfig.cpp:3160 +#: src/libslic3r/PrintConfig.cpp:3381 msgid "Save config file" msgstr "구성 파일 저장" -#: src/libslic3r/PrintConfig.cpp:3161 +#: src/libslic3r/PrintConfig.cpp:3382 msgid "Save configuration to the specified file." msgstr "지정 된 파일에 구성을 저장 합니다." -#: src/libslic3r/PrintConfig.cpp:3171 +#: src/libslic3r/PrintConfig.cpp:3392 msgid "Align XY" msgstr "XY 정렬" -#: src/libslic3r/PrintConfig.cpp:3172 +#: src/libslic3r/PrintConfig.cpp:3393 msgid "Align the model to the given point." msgstr "모델을 지정된 점에 맞춥니다." -#: src/libslic3r/PrintConfig.cpp:3177 +#: src/libslic3r/PrintConfig.cpp:3398 msgid "Cut model at the given Z." msgstr "지정된 Z에서 모델을 잘라냅니다." -#: src/libslic3r/PrintConfig.cpp:3198 +#: src/libslic3r/PrintConfig.cpp:3419 msgid "Center" msgstr "중앙" -#: src/libslic3r/PrintConfig.cpp:3199 +#: src/libslic3r/PrintConfig.cpp:3420 msgid "Center the print around the given center." -msgstr "지정된 점을 중심으로 인쇄 합니다." +msgstr "지정된 점을 중재봉선으로 인쇄 합니다." -#: src/libslic3r/PrintConfig.cpp:3203 +#: src/libslic3r/PrintConfig.cpp:3424 msgid "Don't arrange" msgstr "준비하지 마십시오" -#: src/libslic3r/PrintConfig.cpp:3204 -msgid "Do not rearrange the given models before merging and keep their original XY coordinates." -msgstr "병합하기 전에 지정된 모델을 재정렬하고 원래 XY 좌표를 유지하지 마십시오." +#: src/libslic3r/PrintConfig.cpp:3425 +msgid "" +"Do not rearrange the given models before merging and keep their original XY " +"coordinates." +msgstr "" +"병합하기 전에 지정된 모델을 재정렬하고 원래 XY 좌표를 유지하지 마십시오." -#: src/libslic3r/PrintConfig.cpp:3207 +#: src/libslic3r/PrintConfig.cpp:3428 msgid "Duplicate" msgstr "복사" -#: src/libslic3r/PrintConfig.cpp:3208 +#: src/libslic3r/PrintConfig.cpp:3429 msgid "Multiply copies by this factor." msgstr "이 계수로 복사본을 곱합니다." -#: src/libslic3r/PrintConfig.cpp:3212 +#: src/libslic3r/PrintConfig.cpp:3433 msgid "Duplicate by grid" msgstr "모눈에 따라 복제" -#: src/libslic3r/PrintConfig.cpp:3213 +#: src/libslic3r/PrintConfig.cpp:3434 msgid "Multiply copies by creating a grid." msgstr "그리드를 만들어 복사본을 곱합니다." -#: src/libslic3r/PrintConfig.cpp:3216 +#: src/libslic3r/PrintConfig.cpp:3437 msgid "Merge" msgstr "병합" -#: src/libslic3r/PrintConfig.cpp:3217 -msgid "Arrange the supplied models in a plate and merge them in a single model in order to perform actions once." -msgstr "한 번 작업을 수행하기 위해 제공 된 모델을 정렬하고 단일 모델로 병합 합니다." +#: src/libslic3r/PrintConfig.cpp:3438 +msgid "" +"Arrange the supplied models in a plate and merge them in a single model in " +"order to perform actions once." +msgstr "" +"한 번 작업을 수행하기 위해 제공 된 모델을 정렬하고 단일 모델로 병합 합니다." -#: src/libslic3r/PrintConfig.cpp:3222 -msgid "Try to repair any non-manifold meshes (this option is implicitly added whenever we need to slice the model to perform the requested action)." -msgstr "메쉬를 복구 하십시오 (요청 된 작업을 수행 하기 위해 모델을 슬라이스 해야 할때마다 이 옵션이 암시적으로 추가 됨)." +#: src/libslic3r/PrintConfig.cpp:3443 +msgid "" +"Try to repair any non-manifold meshes (this option is implicitly added " +"whenever we need to slice the model to perform the requested action)." +msgstr "" +"메쉬를 복구 하십시오 (요청 된 작업을 수행 하기 위해 모델을 슬라이스 해야 할때" +"마다 이 옵션이 암시적으로 추가 됨)." -#: src/libslic3r/PrintConfig.cpp:3226 +#: src/libslic3r/PrintConfig.cpp:3447 msgid "Rotation angle around the Z axis in degrees." msgstr "Z 축 주위 회전 각도입니다." -#: src/libslic3r/PrintConfig.cpp:3230 +#: src/libslic3r/PrintConfig.cpp:3451 msgid "Rotate around X" msgstr "X 주위 회전" -#: src/libslic3r/PrintConfig.cpp:3231 +#: src/libslic3r/PrintConfig.cpp:3452 msgid "Rotation angle around the X axis in degrees." -msgstr "X 축을 중심 회전 각도 입니다." +msgstr "X 축을 중재봉선 회전 각도 입니다." -#: src/libslic3r/PrintConfig.cpp:3235 +#: src/libslic3r/PrintConfig.cpp:3456 msgid "Rotate around Y" msgstr "Y 주위로 회전" -#: src/libslic3r/PrintConfig.cpp:3236 +#: src/libslic3r/PrintConfig.cpp:3457 msgid "Rotation angle around the Y axis in degrees." -msgstr "Y 축을 중심 회전 각도 입니다." +msgstr "Y 축을 중재봉선 회전 각도 입니다." -#: src/libslic3r/PrintConfig.cpp:3241 +#: src/libslic3r/PrintConfig.cpp:3462 msgid "Scaling factor or percentage." msgstr "배율 인수 또는 백분율입니다." -#: src/libslic3r/PrintConfig.cpp:3246 -msgid "Detect unconnected parts in the given model(s) and split them into separate objects." -msgstr "지정 된 모델에서 연결 되지 않은 부품(Part)을 감지 하여 별도의 객체(object)로 분할 합니다." +#: src/libslic3r/PrintConfig.cpp:3467 +msgid "" +"Detect unconnected parts in the given model(s) and split them into separate " +"objects." +msgstr "" +"지정 된 모델에서 연결 되지 않은 부품(Part)을 감지 하여 별도의 객체(object)로 " +"분할 합니다." -#: src/libslic3r/PrintConfig.cpp:3249 +#: src/libslic3r/PrintConfig.cpp:3470 msgid "Scale to Fit" msgstr "크기에 맞게 조정" -#: src/libslic3r/PrintConfig.cpp:3250 +#: src/libslic3r/PrintConfig.cpp:3471 msgid "Scale to fit the given volume." msgstr "지정 된 볼륨에 맞게 크기를 조정 합니다." -#: src/libslic3r/PrintConfig.cpp:3259 +#: src/libslic3r/PrintConfig.cpp:3480 msgid "Ignore non-existent config files" msgstr "존재 하지 않는 구성 파일 무시" -#: src/libslic3r/PrintConfig.cpp:3260 +#: src/libslic3r/PrintConfig.cpp:3481 msgid "Do not fail if a file supplied to --load does not exist." msgstr "로드에 제공 된 파일이 없는 경우 실패 하지 않습니다." -#: src/libslic3r/PrintConfig.cpp:3263 +#: src/libslic3r/PrintConfig.cpp:3484 msgid "Load config file" msgstr "구성 파일 로드" -#: src/libslic3r/PrintConfig.cpp:3264 -msgid "Load configuration from the specified file. It can be used more than once to load options from multiple files." -msgstr "지정 된 파일에서 구성을 로드 합니다. 여러 파일에서 옵션을 로드 하는 데 두 번 이상 사용할 수 있습니다." +#: src/libslic3r/PrintConfig.cpp:3485 +msgid "" +"Load configuration from the specified file. It can be used more than once to " +"load options from multiple files." +msgstr "" +"지정 된 파일에서 구성을 로드 합니다. 여러 파일에서 옵션을 로드 하는 데 두 번 " +"이상 사용할 수 있습니다." -#: src/libslic3r/PrintConfig.cpp:3267 +#: src/libslic3r/PrintConfig.cpp:3488 msgid "Output File" -msgstr "출력 파일" +msgstr "출력파일" -#: src/libslic3r/PrintConfig.cpp:3268 -msgid "The file where the output will be written (if not specified, it will be based on the input file)." -msgstr "출력이 기록 되는 파일 (지정 하지 않은 경우 입력 파일을 기반으로 합니다)." +#: src/libslic3r/PrintConfig.cpp:3489 +msgid "" +"The file where the output will be written (if not specified, it will be " +"based on the input file)." +msgstr "" +"출력이 기록 되는 파일 (지정 하지 않은 경우 입력 파일을 기반으로 합니다)." -#: src/libslic3r/PrintConfig.cpp:3278 +#: src/libslic3r/PrintConfig.cpp:3499 msgid "Data directory" msgstr "데이터 디렉터리" -#: src/libslic3r/PrintConfig.cpp:3279 -msgid "Load and store settings at the given directory. This is useful for maintaining different profiles or including configurations from a network storage." -msgstr "지정 된 디렉터리에 설정을 로드 하 고 저장 합니다. 이 기능은 다른 프로 파일을 유지 관리 하거나 네트워크 스토리지의 구성을 포함 하는 데 유용 합니다." +#: src/libslic3r/PrintConfig.cpp:3500 +msgid "" +"Load and store settings at the given directory. This is useful for " +"maintaining different profiles or including configurations from a network " +"storage." +msgstr "" +"지정 된 디렉터리에 설정을 로드 하 고 저장 합니다. 이 기능은 다른 프로 파일을 " +"유지 관리 하거나 네트워크 스토리지의 구성을 포함 하는 데 유용 합니다." -#: src/libslic3r/PrintConfig.cpp:3282 +#: src/libslic3r/PrintConfig.cpp:3503 msgid "Logging level" msgstr "로깅 수준" -#: src/libslic3r/PrintConfig.cpp:3283 -msgid "Messages with severity lower or eqal to the loglevel will be printed out. 0:trace, 1:debug, 2:info, 3:warning, 4:error, 5:fatal" -msgstr "로그 수준에 대한 심각도가 낮거나 eqal인 메시지가 인쇄됩니다. 0:추적, 1:디버그, 2:정보, 3:경고, 4:오류, 5:치명적" +#: src/libslic3r/PrintConfig.cpp:3504 +msgid "" +"Sets logging sensitivity. 0:fatal, 1:error, 2:warning, 3:info, 4:debug, 5:" +"trace\n" +"For example. loglevel=2 logs fatal, error and warning level messages." +msgstr "" +"로깅 민감도를 설정합니다. 0:치명적, 1:오류, 2:경고, 3:info, 4:디버그, 5:" +"trace\n" +"예를 들어. loglevel=2 치명적인, 오류 및 경고 수준 메시지를 기록합니다." -#: src/libslic3r/PrintConfig.cpp:3288 +#: src/libslic3r/PrintConfig.cpp:3510 msgid "Render with a software renderer" msgstr "소프트웨어 렌더러를 사용 하 여 렌더링" -#: src/libslic3r/PrintConfig.cpp:3289 -msgid "Render with a software renderer. The bundled MESA software renderer is loaded instead of the default OpenGL driver." -msgstr "소프트웨어 렌더러를 사용 하여 렌더링 합니다. 번들 메사 소프트웨어 렌더러는 기본 OpenGL 드라이버 대신 로드 됩니다." +#: src/libslic3r/PrintConfig.cpp:3511 +msgid "" +"Render with a software renderer. The bundled MESA software renderer is " +"loaded instead of the default OpenGL driver." +msgstr "" +"소프트웨어 렌더러를 사용 하여 렌더링 합니다. 번들 메사 소프트웨어 렌더러는 기" +"본 OpenGL 드라이버 대신 로드 됩니다." -#: src/libslic3r/PrintObject.cpp:110 +#: src/libslic3r/PrintObject.cpp:108 msgid "Processing triangulated mesh" -msgstr "삼각 측정 메시 처리" +msgstr "삼각 측정 메쉬 처리" -#: src/libslic3r/PrintObject.cpp:141 +#: src/libslic3r/PrintObject.cpp:152 msgid "Generating perimeters" msgstr "둘레 생성" -#: src/libslic3r/PrintObject.cpp:251 +#: src/libslic3r/PrintObject.cpp:255 msgid "Preparing infill" msgstr "채우기 준비" -#: src/libslic3r/PrintObject.cpp:391 +#: src/libslic3r/PrintObject.cpp:395 msgid "Generating support material" msgstr "지원할 서포트 생성" -#: src/libslic3r/GCode/PreviewData.cpp:176 -msgid "Mixed" -msgstr "혼합" - -#: src/libslic3r/GCode/PreviewData.cpp:396 +#: src/libslic3r/GCode/PreviewData.cpp:347 msgid "Height (mm)" msgstr "높이 (mm)" -#: src/libslic3r/GCode/PreviewData.cpp:398 +#: src/libslic3r/GCode/PreviewData.cpp:349 msgid "Width (mm)" msgstr "폭 (mm)" -#: src/libslic3r/GCode/PreviewData.cpp:400 +#: src/libslic3r/GCode/PreviewData.cpp:351 msgid "Speed (mm/s)" msgstr "속도 (mm/s)" -#: src/libslic3r/GCode/PreviewData.cpp:402 -msgid "Volumetric flow rate (mm3/s)" -msgstr "용적 유량값 (mm3/s)" +#: src/libslic3r/GCode/PreviewData.cpp:353 +msgid "Fan Speed (%)" +msgstr "팬 속도(%)" -#: src/libslic3r/GCode/PreviewData.cpp:493 -msgid "Default print color" -msgstr "기본 인쇄 색상" - -#: src/libslic3r/GCode/PreviewData.cpp:500 -#, c-format -msgid "up to %.2f mm" -msgstr "최대%.2f mm" - -#: src/libslic3r/GCode/PreviewData.cpp:504 -#, c-format -msgid "above %.2f mm" -msgstr "above %.2f mm" - -#: src/libslic3r/GCode/PreviewData.cpp:509 -#, c-format -msgid "%.2f - %.2f mm" -msgstr "%.2f - %.2f mm" +#: src/libslic3r/GCode/PreviewData.cpp:355 +msgid "Volumetric flow rate (mm³/s)" +msgstr "체적 유량(mm³/s)" From 5324bdd30fb4dcfb127f4590fbbb1208fcc918bd Mon Sep 17 00:00:00 2001 From: lee hakmin Date: Mon, 10 Feb 2020 20:10:10 +0900 Subject: [PATCH 298/336] Delete PrusaSlicer.mo --- resources/localization/ko_KR/PrusaSlicer.mo | Bin 247944 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 resources/localization/ko_KR/PrusaSlicer.mo diff --git a/resources/localization/ko_KR/PrusaSlicer.mo b/resources/localization/ko_KR/PrusaSlicer.mo deleted file mode 100644 index 1bd998e9ef228b4c9b696ba421aeb0ba1f5a088a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 247944 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

pSh%gNOMrN4QzO1;hkb0%D_8z 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 Ke!KeZ?*9UNNzi2g From 0f5f2bc5194b4062b6a71102b80db3b0cc9887ee Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Mon, 10 Feb 2020 12:36:52 +0100 Subject: [PATCH 299/336] Reintroduce rotation limits for camera for FDM printers --- src/slic3r/GUI/Camera.cpp | 38 +++++++++++++++++++++++++++++++---- src/slic3r/GUI/Camera.hpp | 10 ++++++--- src/slic3r/GUI/GLCanvas3D.cpp | 2 +- 3 files changed, 42 insertions(+), 8 deletions(-) diff --git a/src/slic3r/GUI/Camera.cpp b/src/slic3r/GUI/Camera.cpp index a4eccf050b..18075c3f8c 100644 --- a/src/slic3r/GUI/Camera.cpp +++ b/src/slic3r/GUI/Camera.cpp @@ -50,9 +50,11 @@ Camera::Camera() #endif // ENABLE_6DOF_CAMERA , m_type(Perspective) , m_target(Vec3d::Zero()) -#if !ENABLE_6DOF_CAMERA +#if ENABLE_6DOF_CAMERA + , m_zenit(45.0f) +#else , m_theta(45.0f) -#endif // !ENABLE_6DOF_CAMERA +#endif // ENABLE_6DOF_CAMERA , m_zoom(1.0) , m_distance(DefaultDistance) , m_gui_scale(1.0) @@ -409,6 +411,9 @@ void Camera::debug_render() const Vec3f position = get_position().cast(); Vec3f target = m_target.cast(); float distance = (float)get_distance(); +#if ENABLE_6DOF_CAMERA + float zenit = (float)m_zenit; +#endif // ENABLE_6DOF_CAMERA Vec3f forward = get_dir_forward().cast(); Vec3f right = get_dir_right().cast(); Vec3f up = get_dir_up().cast(); @@ -425,6 +430,10 @@ void Camera::debug_render() const ImGui::InputFloat3("Position", position.data(), "%.6f", ImGuiInputTextFlags_ReadOnly); ImGui::InputFloat3("Target", target.data(), "%.6f", ImGuiInputTextFlags_ReadOnly); ImGui::InputFloat("Distance", &distance, 0.0f, 0.0f, "%.6f", ImGuiInputTextFlags_ReadOnly); +#if ENABLE_6DOF_CAMERA + ImGui::Separator(); + ImGui::InputFloat("Zenit", &zenit, 0.0f, 0.0f, "%.6f", ImGuiInputTextFlags_ReadOnly); +#endif // ENABLE_6DOF_CAMERA ImGui::Separator(); ImGui::InputFloat3("Forward", forward.data(), "%.6f", ImGuiInputTextFlags_ReadOnly); ImGui::InputFloat3("Right", right.data(), "%.6f", ImGuiInputTextFlags_ReadOnly); @@ -456,8 +465,20 @@ void Camera::translate_world(const Vec3d& displacement) } } -void Camera::rotate_on_sphere(double delta_azimut_rad, double delta_zenit_rad) +void Camera::rotate_on_sphere(double delta_azimut_rad, double delta_zenit_rad, bool apply_limits) { + m_zenit += Geometry::rad2deg(delta_zenit_rad); + if (apply_limits) { + if (m_zenit > 90.0f) { + delta_zenit_rad -= Geometry::deg2rad(m_zenit - 90.0f); + m_zenit = 90.0f; + } + else if (m_zenit < -90.0f) { + delta_zenit_rad -= Geometry::deg2rad(m_zenit + 90.0f); + m_zenit = -90.0f; + } + } + // FIXME -> The following is a HACK !!! // When the value of the zenit rotation is large enough, the following call to rotate() shows // numerical instability introducing some scaling into m_view_matrix (verified by checking @@ -501,6 +522,7 @@ void Camera::rotate_local_around_pivot(const Vec3d& rotation_rad, const Vec3d& p m_view_matrix.rotate(Eigen::AngleAxisd(rotation_rad(1), get_dir_up())); m_view_matrix.rotate(Eigen::AngleAxisd(rotation_rad(2), get_dir_forward())); translate_world(center); + update_zenit(); } #endif // ENABLE_6DOF_CAMERA @@ -770,11 +792,14 @@ void Camera::look_at(const Vec3d& position, const Vec3d& target, const Vec3d& up m_view_matrix(3, 1) = 0.0; m_view_matrix(3, 2) = 0.0; m_view_matrix(3, 3) = 1.0; + + update_zenit(); } void Camera::set_default_orientation() { - double theta_rad = Geometry::deg2rad(-45.0); + m_zenit = 45.0f; + double theta_rad = Geometry::deg2rad(-(double)m_zenit); double phi_rad = Geometry::deg2rad(45.0); double sin_theta = ::sin(theta_rad); Vec3d camera_pos = m_target + m_distance * Vec3d(sin_theta * ::sin(phi_rad), sin_theta * ::cos(phi_rad), ::cos(theta_rad)); @@ -795,6 +820,11 @@ Vec3d Camera::validate_target(const Vec3d& target) const std::clamp(target(1), test_box.min(1), test_box.max(1)), std::clamp(target(2), test_box.min(2), test_box.max(2))); } + +void Camera::update_zenit() +{ + m_zenit = Geometry::rad2deg(0.5 * M_PI - std::acos(std::clamp(-get_dir_forward().dot(Vec3d::UnitZ()), -1.0, 1.0))); +} #endif // ENABLE_6DOF_CAMERA } // GUI diff --git a/src/slic3r/GUI/Camera.hpp b/src/slic3r/GUI/Camera.hpp index b0a646ebfe..cda6b77b4b 100644 --- a/src/slic3r/GUI/Camera.hpp +++ b/src/slic3r/GUI/Camera.hpp @@ -39,9 +39,11 @@ struct Camera private: EType m_type; Vec3d m_target; -#if !ENABLE_6DOF_CAMERA +#if ENABLE_6DOF_CAMERA + float m_zenit; +#else float m_theta; -#endif // !ENABLE_6DOF_CAMERA +#endif // ENABLE_6DOF_CAMERA double m_zoom; // Distance between camera position and camera target measured along the camera Z axis mutable double m_distance; @@ -136,7 +138,8 @@ public: // rotate the camera on a sphere having center == m_target and radius == m_distance // using the given variations of spherical coordinates - void rotate_on_sphere(double delta_azimut_rad, double delta_zenit_rad); + // if apply_limits == true the camera stops rotating when its forward vector is parallel to the world Z axis + void rotate_on_sphere(double delta_azimut_rad, double delta_zenit_rad, bool apply_limits); // rotate the camera around three axes parallel to the camera local axes and passing through m_target void rotate_local_around_target(const Vec3d& rotation_rad); @@ -171,6 +174,7 @@ private: void look_at(const Vec3d& position, const Vec3d& target, const Vec3d& up); void set_default_orientation(); Vec3d validate_target(const Vec3d& target) const; + void update_zenit(); #endif // ENABLE_6DOF_CAMERA }; diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 7c0db32c07..ac6071d3f9 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -3499,7 +3499,7 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) if (wxGetApp().plater()->get_mouse3d_controller().is_running() || (wxGetApp().app_config->get("use_free_camera") == "1")) m_camera.rotate_local_around_target(Vec3d(y, x, 0.0)); else - m_camera.rotate_on_sphere(x, y); + m_camera.rotate_on_sphere(x, y, wxGetApp().preset_bundle->printers.get_edited_preset().printer_technology() != ptSLA); #else float sign = m_camera.inverted_phi ? -1.0f : 1.0f; m_camera.phi += sign * ((float)pos(0) - (float)orig(0)) * TRACKBALLSIZE; From d81f7d84652c07806bc76d75dcfa4dbbc8904d05 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Mon, 10 Feb 2020 11:56:49 +0100 Subject: [PATCH 300/336] SlicedInfo: Removed secondes from estimated times --- src/libslic3r/GCode.cpp | 8 ++++---- src/libslic3r/GCodeTimeEstimator.cpp | 27 +++++++++++++++++++++++++++ src/libslic3r/GCodeTimeEstimator.hpp | 5 +++++ 3 files changed, 36 insertions(+), 4 deletions(-) diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index c4c81ff25a..65319c2bf4 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -1031,8 +1031,8 @@ namespace DoExport { std::string filament_stats_string_out; print_statistics.clear(); - print_statistics.estimated_normal_print_time = normal_time_estimator.get_time_dhms(); - print_statistics.estimated_silent_print_time = silent_time_estimator_enabled ? silent_time_estimator.get_time_dhms() : "N/A"; + print_statistics.estimated_normal_print_time = normal_time_estimator.get_time_dhm/*s*/(); + print_statistics.estimated_silent_print_time = silent_time_estimator_enabled ? silent_time_estimator.get_time_dhm/*s*/() : "N/A"; print_statistics.estimated_normal_color_print_times = normal_time_estimator.get_color_times_dhms(true); if (silent_time_estimator_enabled) print_statistics.estimated_silent_color_print_times = silent_time_estimator.get_color_times_dhms(true); @@ -1528,9 +1528,9 @@ void GCode::_do_export(Print& print, FILE* file) _write_format(file, "; total filament cost = %.1lf\n", print.m_print_statistics.total_cost); if (print.m_print_statistics.total_toolchanges > 0) _write_format(file, "; total toolchanges = %i\n", print.m_print_statistics.total_toolchanges); - _write_format(file, "; estimated printing time (normal mode) = %s\n", m_normal_time_estimator.get_time_dhms().c_str()); + _write_format(file, "; estimated printing time (normal mode) = %s\n", m_normal_time_estimator.get_time_dhm/*s*/().c_str()); if (m_silent_time_estimator_enabled) - _write_format(file, "; estimated printing time (silent mode) = %s\n", m_silent_time_estimator.get_time_dhms().c_str()); + _write_format(file, "; estimated printing time (silent mode) = %s\n", m_silent_time_estimator.get_time_dhm/*s*/().c_str()); // Append full config. _write(file, "\n"); diff --git a/src/libslic3r/GCodeTimeEstimator.cpp b/src/libslic3r/GCodeTimeEstimator.cpp index 36127cad77..17f826c578 100644 --- a/src/libslic3r/GCodeTimeEstimator.cpp +++ b/src/libslic3r/GCodeTimeEstimator.cpp @@ -707,6 +707,11 @@ namespace Slic3r { return _get_time_dhms(get_time()); } + std::string GCodeTimeEstimator::get_time_dhm() const + { + return _get_time_dhm(get_time()); + } + std::string GCodeTimeEstimator::get_time_minutes() const { return _get_time_minutes(get_time()); @@ -1616,6 +1621,28 @@ namespace Slic3r { return buffer; } + std::string GCodeTimeEstimator::_get_time_dhm(float time_in_secs) + { + int days = (int)(time_in_secs / 86400.0f); + time_in_secs -= (float)days * 86400.0f; + int hours = (int)(time_in_secs / 3600.0f); + time_in_secs -= (float)hours * 3600.0f; + int minutes = (int)(time_in_secs / 60.0f); + time_in_secs -= (float)minutes * 60.0f; + + char buffer[64]; + if (days > 0) + ::sprintf(buffer, "%dd %dh %dm", days, hours, minutes); + else if (hours > 0) + ::sprintf(buffer, "%dh %dm", hours, minutes); + else if (minutes > 0) + ::sprintf(buffer, "%dm", minutes); + else + ::sprintf(buffer, "%ds", (int)time_in_secs); + + return buffer; + } + std::string GCodeTimeEstimator::_get_time_minutes(float time_in_secs) { return std::to_string((int)(::roundf(time_in_secs / 60.0f))); diff --git a/src/libslic3r/GCodeTimeEstimator.hpp b/src/libslic3r/GCodeTimeEstimator.hpp index bd997a0470..496b992d8f 100644 --- a/src/libslic3r/GCodeTimeEstimator.hpp +++ b/src/libslic3r/GCodeTimeEstimator.hpp @@ -363,6 +363,9 @@ namespace Slic3r { // Returns the estimated time, in format DDd HHh MMm SSs std::string get_time_dhms() const; + // Returns the estimated time, in format DDd HHh MMm + std::string get_time_dhm() const; + // Returns the estimated time, in minutes (integer) std::string get_time_minutes() const; @@ -473,6 +476,8 @@ namespace Slic3r { // Returns the given time is seconds in format DDd HHh MMm SSs static std::string _get_time_dhms(float time_in_secs); + // Returns the given time is minutes in format DDd HHh MMm + static std::string _get_time_dhm(float time_in_secs); // Returns the given, in minutes (integer) static std::string _get_time_minutes(float time_in_secs); From a5de3386acad158e66f48514a2b941152b1eb11a Mon Sep 17 00:00:00 2001 From: YuSanka Date: Mon, 10 Feb 2020 12:46:07 +0100 Subject: [PATCH 301/336] Changed size of hexagons. + ModeButton: Added another constructor --- src/slic3r/GUI/Tab.cpp | 7 ++++--- src/slic3r/GUI/wxExtensions.cpp | 16 +++++++++++++++- src/slic3r/GUI/wxExtensions.hpp | 15 ++++++++++++--- 3 files changed, 31 insertions(+), 7 deletions(-) diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index 5f17955d41..83dc21cec7 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -257,9 +257,10 @@ void Tab::create_preset_tab() // Fill cache for mode bitmaps m_mode_bitmap_cache.reserve(3); - m_mode_bitmap_cache.push_back(ScalableBitmap(this, "mode_simple")); - m_mode_bitmap_cache.push_back(ScalableBitmap(this, "mode_advanced")); - m_mode_bitmap_cache.push_back(ScalableBitmap(this, "mode_expert")); + int icon_px = 14; + m_mode_bitmap_cache.push_back(ScalableBitmap(this, "mode_simple" , icon_px)); + m_mode_bitmap_cache.push_back(ScalableBitmap(this, "mode_advanced", icon_px)); + m_mode_bitmap_cache.push_back(ScalableBitmap(this, "mode_expert" , icon_px)); // Initialize the DynamicPrintConfig by default keys/values. build(); diff --git a/src/slic3r/GUI/wxExtensions.cpp b/src/slic3r/GUI/wxExtensions.cpp index 7e9ec86f98..e6d928b255 100644 --- a/src/slic3r/GUI/wxExtensions.cpp +++ b/src/slic3r/GUI/wxExtensions.cpp @@ -676,6 +676,20 @@ ModeButton::ModeButton( wxWindow * parent, const wxSize& size /* = wxDefaultSize*/, const wxPoint& pos /* = wxDefaultPosition*/) : ScalableButton(parent, id, icon_name, mode, size, pos, wxBU_EXACTFIT) +{ + Init(mode); +} + +ModeButton::ModeButton( wxWindow* parent, + const wxString& mode/* = wxEmptyString*/, + const std::string& icon_name/* = ""*/, + int px_cnt/* = 16*/) : + ScalableButton(parent, wxID_ANY, ScalableBitmap(parent, icon_name, px_cnt), mode, wxBU_EXACTFIT) +{ + Init(mode); +} + +void ModeButton::Init(const wxString &mode) { m_tt_focused = wxString::Format(_(L("Switch to the %s mode")), mode); m_tt_selected = wxString::Format(_(L("Current mode is %s")), mode); @@ -739,7 +753,7 @@ ModeSizer::ModeSizer(wxWindow *parent, int hgap/* = 0*/) : m_mode_btns.reserve(3); for (const auto& button : buttons) { - m_mode_btns.push_back(new ModeButton(parent, wxID_ANY, button.second, button.first)); + m_mode_btns.push_back(new ModeButton(parent, button.first, button.second, 14)); m_mode_btns.back()->Bind(wxEVT_BUTTON, std::bind(modebtnfn, std::placeholders::_1, int(m_mode_btns.size() - 1))); Add(m_mode_btns.back()); diff --git a/src/slic3r/GUI/wxExtensions.hpp b/src/slic3r/GUI/wxExtensions.hpp index d4679f757c..839a122c40 100644 --- a/src/slic3r/GUI/wxExtensions.hpp +++ b/src/slic3r/GUI/wxExtensions.hpp @@ -255,9 +255,9 @@ public: void msw_rescale(); private: - wxWindow* m_parent; - std::string m_current_icon_name = ""; - std::string m_disabled_icon_name = ""; + wxWindow* m_parent { nullptr }; + std::string m_current_icon_name; + std::string m_disabled_icon_name; int m_width {-1}; // should be multiplied to em_unit int m_height{-1}; // should be multiplied to em_unit @@ -280,8 +280,17 @@ public: const wxString& mode = wxEmptyString, const wxSize& size = wxDefaultSize, const wxPoint& pos = wxDefaultPosition); + + ModeButton( + wxWindow* parent, + const wxString& mode = wxEmptyString, + const std::string& icon_name = "", + int px_cnt = 16); + ~ModeButton() {} + void Init(const wxString& mode); + void OnButton(wxCommandEvent& event); void OnEnterBtn(wxMouseEvent& event) { focus_button(true); event.Skip(); } void OnLeaveBtn(wxMouseEvent& event) { focus_button(m_is_selected); event.Skip(); } From bfbf3ac94d607cfbd81b308e51b415a033138395 Mon Sep 17 00:00:00 2001 From: bubnikv Date: Mon, 10 Feb 2020 14:24:21 +0100 Subject: [PATCH 302/336] Follow up on the hot fix of #3637 53bfb6bed32f79c5f29b5ce1491e74f9c322e7f1 This is the correct solution, which maintains the optimization introduced by 3e0690b37bff4af00015a3b393c39a129ab0d1cc --- src/libslic3r/GCode.cpp | 25 ++++++++++--------------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index 65319c2bf4..61b4893cc6 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -2123,21 +2123,16 @@ void GCode::process_layer( // Let's recover vector of extruder overrides: const WipingExtrusions::ExtruderPerCopy *entity_overrides = nullptr; - // see GH issue #3637: Object disappears when wipe to object turned on - //FIXME Vojtec With the optimization disabled, the G-code generator will not be slower - // than PrusaSlicer 2.1.1. I am leaving the code there to mark for further optimization opportunities. - //if (is_anything_overridden) - if (true) - { - printing_extruders.clear(); - if (! layer_tools.has_extruder(correct_extruder_id)) { - // this entity is not overridden, but its extruder is not in layer_tools - we'll print it - // by last extruder on this layer (could happen e.g. when a wiping object is taller than others - dontcare extruders are eradicated from layer_tools) - correct_extruder_id = layer_tools.extruders.back(); - } + if (! layer_tools.has_extruder(correct_extruder_id)) { + // this entity is not overridden, but its extruder is not in layer_tools - we'll print it + // by last extruder on this layer (could happen e.g. when a wiping object is taller than others - dontcare extruders are eradicated from layer_tools) + correct_extruder_id = layer_tools.extruders.back(); + } + printing_extruders.clear(); + if (is_anything_overridden) { entity_overrides = const_cast(layer_tools).wiping_extrusions().get_extruder_overrides(extrusions, correct_extruder_id, layer_to_print.object()->instances().size()); if (entity_overrides == nullptr) { - printing_extruders.emplace_back(correct_extruder_id); + printing_extruders.emplace_back(correct_extruder_id); } else { printing_extruders.reserve(entity_overrides->size()); for (int extruder : *entity_overrides) @@ -2146,10 +2141,10 @@ void GCode::process_layer( extruder : // at least one copy would normally be printed with this extruder (see get_extruder_overrides function for explanation) static_cast(- extruder - 1)); + Slic3r::sort_remove_duplicates(printing_extruders); } - Slic3r::sort_remove_duplicates(printing_extruders); } else - printing_extruders = { (unsigned int)correct_extruder_id }; + printing_extruders.emplace_back(correct_extruder_id); // Now we must add this extrusion into the by_extruder map, once for each extruder that will print it: for (unsigned int extruder : printing_extruders) From a25f58731e29030d436bd23bd2bc2469b67e9061 Mon Sep 17 00:00:00 2001 From: bubnikv Date: Mon, 10 Feb 2020 14:40:21 +0100 Subject: [PATCH 303/336] Fix of d81f7d84652c07806bc76d75dcfa4dbbc8904d05 (SlicedInfo: Removed secondes from estimated times): GCodeTimeEstimator::_get_time_dhm() shall round to minutes, old code rounded down to minutes, new code rounds to 1/2. --- src/libslic3r/GCodeTimeEstimator.cpp | 29 ++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/src/libslic3r/GCodeTimeEstimator.cpp b/src/libslic3r/GCodeTimeEstimator.cpp index 17f826c578..3ef325aef1 100644 --- a/src/libslic3r/GCodeTimeEstimator.cpp +++ b/src/libslic3r/GCodeTimeEstimator.cpp @@ -1623,22 +1623,23 @@ namespace Slic3r { std::string GCodeTimeEstimator::_get_time_dhm(float time_in_secs) { - int days = (int)(time_in_secs / 86400.0f); - time_in_secs -= (float)days * 86400.0f; - int hours = (int)(time_in_secs / 3600.0f); - time_in_secs -= (float)hours * 3600.0f; - int minutes = (int)(time_in_secs / 60.0f); - time_in_secs -= (float)minutes * 60.0f; - char buffer[64]; - if (days > 0) - ::sprintf(buffer, "%dd %dh %dm", days, hours, minutes); - else if (hours > 0) - ::sprintf(buffer, "%dh %dm", hours, minutes); - else if (minutes > 0) - ::sprintf(buffer, "%dm", minutes); - else + + int minutes = std::round(time_in_secs / 60.); + if (minutes <= 0) { ::sprintf(buffer, "%ds", (int)time_in_secs); + } else { + int days = minutes / 1440; + minutes -= days * 1440; + int hours = minutes / 60; + minutes -= hours * 60; + if (days > 0) + ::sprintf(buffer, "%dd %dh %dm", days, hours, minutes); + else if (hours > 0) + ::sprintf(buffer, "%dh %dm", hours, minutes); + else + ::sprintf(buffer, "%dm", minutes); + } return buffer; } From 9f40e9e56ed617d45cdad670dd85ab79530c50f1 Mon Sep 17 00:00:00 2001 From: bubnikv Date: Mon, 10 Feb 2020 15:46:08 +0100 Subject: [PATCH 304/336] Reverted the time estimate number stored into the G-code from days/hours/minutes to days/hours/minutes/seconds, because who knows who is already parsing the file. --- src/libslic3r/GCode.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index 61b4893cc6..a4e8127199 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -1528,9 +1528,9 @@ void GCode::_do_export(Print& print, FILE* file) _write_format(file, "; total filament cost = %.1lf\n", print.m_print_statistics.total_cost); if (print.m_print_statistics.total_toolchanges > 0) _write_format(file, "; total toolchanges = %i\n", print.m_print_statistics.total_toolchanges); - _write_format(file, "; estimated printing time (normal mode) = %s\n", m_normal_time_estimator.get_time_dhm/*s*/().c_str()); + _write_format(file, "; estimated printing time (normal mode) = %s\n", m_normal_time_estimator.get_time_dhm().c_str()); if (m_silent_time_estimator_enabled) - _write_format(file, "; estimated printing time (silent mode) = %s\n", m_silent_time_estimator.get_time_dhm/*s*/().c_str()); + _write_format(file, "; estimated printing time (silent mode) = %s\n", m_silent_time_estimator.get_time_dhm().c_str()); // Append full config. _write(file, "\n"); From 76554886395fb05d28ddeb4355e86398ab1bdc4c Mon Sep 17 00:00:00 2001 From: bubnikv Date: Mon, 10 Feb 2020 15:53:11 +0100 Subject: [PATCH 305/336] Ammendment of Reverted the time estimate number stored into the G-code from days/hours/minutes to days/hours/minutes/seconds, because who knows who is already parsing the file. --- src/libslic3r/GCode.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index a4e8127199..06d0cdb574 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -1528,9 +1528,9 @@ void GCode::_do_export(Print& print, FILE* file) _write_format(file, "; total filament cost = %.1lf\n", print.m_print_statistics.total_cost); if (print.m_print_statistics.total_toolchanges > 0) _write_format(file, "; total toolchanges = %i\n", print.m_print_statistics.total_toolchanges); - _write_format(file, "; estimated printing time (normal mode) = %s\n", m_normal_time_estimator.get_time_dhm().c_str()); + _write_format(file, "; estimated printing time (normal mode) = %s\n", m_normal_time_estimator.get_time_dhms().c_str()); if (m_silent_time_estimator_enabled) - _write_format(file, "; estimated printing time (silent mode) = %s\n", m_silent_time_estimator.get_time_dhm().c_str()); + _write_format(file, "; estimated printing time (silent mode) = %s\n", m_silent_time_estimator.get_time_dhms().c_str()); // Append full config. _write(file, "\n"); From 41388bdb01e7418717a265d66c42f900814b50aa Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Mon, 10 Feb 2020 16:33:59 +0100 Subject: [PATCH 306/336] Remove the hollowed interior slices from the model slices in 2D --- src/libslic3r/SLAPrintSteps.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/libslic3r/SLAPrintSteps.cpp b/src/libslic3r/SLAPrintSteps.cpp index ff170d917a..e740b72606 100644 --- a/src/libslic3r/SLAPrintSteps.cpp +++ b/src/libslic3r/SLAPrintSteps.cpp @@ -222,8 +222,14 @@ void SLAPrint::Steps::slice_model(SLAPrintObject &po) auto &slice_grid = po.m_model_height_levels; slicer.slice(slice_grid, SlicingMode::Regular, closing_r, &po.m_model_slices, thr); -// sla::DrainHoles drainholes = po.transformed_drainhole_points(); -// cut_drainholes(po.m_model_slices, slice_grid, closing_r, drainholes, thr); + if (po.m_hollowing_data) { + po.m_hollowing_data->interior.repair(); + TriangleMeshSlicer interior_slicer(&po.m_hollowing_data->interior); + std::vector interior_slices; + interior_slicer.slice(slice_grid, SlicingMode::Regular, closing_r, &interior_slices, thr); + for (size_t i = 0; i < slice_grid.size(); ++i) + po.m_model_slices[i] = diff_ex(po.m_model_slices[i], interior_slices[i]); + } auto mit = slindex_it; double doffs = m_print->m_printer_config.absolute_correction.getFloat(); From 26a6a9b23f1014ce38b1ec3d8c9c3978364f95cb Mon Sep 17 00:00:00 2001 From: bubnikv Date: Mon, 10 Feb 2020 16:37:38 +0100 Subject: [PATCH 307/336] Fixed regression crashing when generating G-code with supports. --- src/libslic3r/GCode.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index 06d0cdb574..6543bf255f 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -1875,7 +1875,9 @@ namespace Skirt { const Print &print, const std::vector &layers, const LayerTools &layer_tools, - // Heights (print_z) at which the skirt has already been extruded. + // First non-empty support layer. + const SupportLayer *support_layer, + // Heights (print_z) at which the skirt has already been extruded. std::vector &skirt_done) { // Extrude skirt at the print_z of the raft layers and normal object layers @@ -1888,7 +1890,7 @@ namespace Skirt { // This print_z has not been extruded yet (sequential print) skirt_done.back() < layer_tools.print_z - EPSILON && // and this layer is an object layer, or it is a raft layer. - (layer_tools.has_object || layers.front().support_layer->id() < (size_t)layers.front().support_layer->object()->config().raft_layers.value)) { + (layer_tools.has_object || support_layer->id() < (size_t)support_layer->object()->config().raft_layers.value)) { #if 0 // Prime just the first printing extruder. This is original Slic3r's implementation. skirt_loops_per_extruder_out[layer_tools.extruders.front()] = std::pair(0, print.config().skirts.value); @@ -2016,7 +2018,7 @@ void GCode::process_layer( // not at the print_z of the interlaced support material layers. skirt_loops_per_extruder = first_layer ? Skirt::make_skirt_loops_per_extruder_1st_layer(print, layers, layer_tools, m_skirt_done) : - Skirt::make_skirt_loops_per_extruder_other_layers(print, layers, layer_tools, m_skirt_done); + Skirt::make_skirt_loops_per_extruder_other_layers(print, layers, layer_tools, support_layer, m_skirt_done); // Group extrusions by an extruder, then by an object, an island and a region. std::map> by_extruder; From 384d1ae1bb00221a84d67b1842ec8217641477dc Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Mon, 10 Feb 2020 16:56:46 +0100 Subject: [PATCH 308/336] Use parallel execution for cutting the hollowed interior partial solution for #3622 --- src/libslic3r/SLAPrintSteps.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/libslic3r/SLAPrintSteps.cpp b/src/libslic3r/SLAPrintSteps.cpp index e740b72606..108ac3e17c 100644 --- a/src/libslic3r/SLAPrintSteps.cpp +++ b/src/libslic3r/SLAPrintSteps.cpp @@ -227,8 +227,12 @@ void SLAPrint::Steps::slice_model(SLAPrintObject &po) TriangleMeshSlicer interior_slicer(&po.m_hollowing_data->interior); std::vector interior_slices; interior_slicer.slice(slice_grid, SlicingMode::Regular, closing_r, &interior_slices, thr); - for (size_t i = 0; i < slice_grid.size(); ++i) - po.m_model_slices[i] = diff_ex(po.m_model_slices[i], interior_slices[i]); + + sla::ccr::enumerate(interior_slices.begin(), interior_slices.end(), + [&po](const ExPolygons &slice, size_t i) { + po.m_model_slices[i] = + diff_ex(po.m_model_slices[i], slice); + }); } auto mit = slindex_it; From 94d3ca70163cb47f11e96d9d9758dcb0a2ccdedf Mon Sep 17 00:00:00 2001 From: YuSanka Date: Mon, 10 Feb 2020 20:05:20 +0100 Subject: [PATCH 309/336] Manually merged Korean translation by @ulsanether + updated MO for Korean translation + set small size for mode icons --- resources/localization/ko/PrusaSlicer.mo | Bin 214618 -> 247994 bytes .../localization/ko/PrusaSlicer_ko_KR.po | 7020 ++++++----- resources/localization/ko_KR/PrusaSlicer.po | 10351 ---------------- src/slic3r/GUI/Tab.cpp | 7 +- src/slic3r/GUI/wxExtensions.cpp | 11 +- src/slic3r/GUI/wxExtensions.hpp | 1 + 6 files changed, 4211 insertions(+), 13179 deletions(-) delete mode 100644 resources/localization/ko_KR/PrusaSlicer.po diff --git a/resources/localization/ko/PrusaSlicer.mo b/resources/localization/ko/PrusaSlicer.mo index 5ba55934e21ae3b9a182b9f847f5d8830554ba0f..867fdc1e93b477eba897f745f1daa4b8baaef6a5 100644 GIT binary patch delta 82290 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 B)QbQB diff --git a/resources/localization/ko/PrusaSlicer_ko_KR.po b/resources/localization/ko/PrusaSlicer_ko_KR.po index 7bb8a8c6a7..71bc4488a3 100644 --- a/resources/localization/ko/PrusaSlicer_ko_KR.po +++ b/resources/localization/ko/PrusaSlicer_ko_KR.po @@ -1,3 +1,8 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# msgid "" msgstr "" "Project-Id-Version: \n" @@ -16,42 +21,42 @@ msgstr "" "X-Crowdin-Language: ko\n" "X-Crowdin-File: ko_KR.po\n" -#: src/slic3r/GUI/AboutDialog.cpp:39 src/slic3r/GUI/AboutDialog.cpp:289 +#: src/slic3r/GUI/AboutDialog.cpp:39 src/slic3r/GUI/AboutDialog.cpp:291 msgid "Portions copyright" msgstr "다른 저작권" -#: src/slic3r/GUI/AboutDialog.cpp:125 src/slic3r/GUI/AboutDialog.cpp:254 +#: src/slic3r/GUI/AboutDialog.cpp:127 src/slic3r/GUI/AboutDialog.cpp:256 msgid "Copyright" msgstr "저작권" #. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:127 +#: src/slic3r/GUI/AboutDialog.cpp:129 msgid "" "License agreements of all following programs (libraries) are part of " "application license agreement" msgstr "" "다음의 모든 프로그램 (라이브러리)의 라이센스 계약은 응용 프로그램 라이센스 계" -"약의 일부입니다." +"약의 일부입니다" -#: src/slic3r/GUI/AboutDialog.cpp:197 +#: src/slic3r/GUI/AboutDialog.cpp:199 #, c-format msgid "About %s" msgstr "%s에 대하여" -#: src/slic3r/GUI/AboutDialog.cpp:229 src/slic3r/GUI/MainFrame.cpp:60 +#: src/slic3r/GUI/AboutDialog.cpp:231 src/slic3r/GUI/MainFrame.cpp:64 msgid "Version" msgstr "버전" #. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:256 +#: src/slic3r/GUI/AboutDialog.cpp:258 msgid "is licensed under the" msgstr "라이선스는" -#: src/slic3r/GUI/AboutDialog.cpp:257 +#: src/slic3r/GUI/AboutDialog.cpp:259 msgid "GNU Affero General Public License, version 3" msgstr "GNU Affero 일반 공중 사용 허가서, 버전 3" -#: src/slic3r/GUI/AboutDialog.cpp:258 +#: src/slic3r/GUI/AboutDialog.cpp:260 msgid "" "PrusaSlicer is based on Slic3r by Alessandro Ranellucci and the RepRap " "community." @@ -59,7 +64,7 @@ msgstr "" "프루사슬라이서는 알레산드로 라넬루치와 RepRap 커뮤니티 Slic3r를 기반으로합니" "다." -#: src/slic3r/GUI/AboutDialog.cpp:259 +#: src/slic3r/GUI/AboutDialog.cpp:261 msgid "" "Contributions by Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, " "Petr Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik and " @@ -67,184 +72,211 @@ msgid "" msgstr "" "Contributions by Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, " "Petr Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik and " -"numerous others. 한국어 번역 울산에테르." +"numerous others. 한국어 번역 울산에테르, 밤송이직박구리" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:92 +#: src/slic3r/GUI/AppConfig.cpp:118 +msgid "" +"Error parsing PrusaSlicer config file, it is probably corrupted. Try to " +"manually delete the file to recover from the error. Your user profiles will " +"not be affected." +msgstr "" +"PrusaSlicer 구성 파일을 구문 분석하는 오류, 아마 손상된 것입니다. 파일을 수동" +"으로 삭제하여 오류에 복구해 보십시오. 사용자 프로필은 영향을 받지 않습니다." + +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:118 msgid "" "Copying of the temporary G-code to the output G-code failed. Maybe the SD " "card is write locked?" msgstr "" -"임시 G-코드를 출력할 SD카드에 복사하는 데 실패했습니다. SD카드의 락을 확인 하" +"임시 G-code를 출력할 SD카드에 복사하는 데 실패했습니다. SD카드의 락을 확인 하" "시오." -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:93 -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:406 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:120 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:470 msgid "Running post-processing scripts" msgstr "포스트 프로세싱 스크립트" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:95 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:122 msgid "G-code file exported to %1%" msgstr "%1%로 내보낸 G 코드 파일" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:99 -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:117 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:126 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:176 msgid "Slicing complete" msgstr "슬라이스 완료" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:113 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:172 msgid "Masked SLA file exported to %1%" msgstr "마스크 된 SLA 파일을 %1%로 내보냅니" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:408 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:214 +#, c-format +msgid "" +"%s has encountered an error. It was likely caused by running out of memory. " +"If you are sure you have enough RAM on your system, this may also be a bug " +"and we would be glad if you reported it." +msgstr "" +"%s에서 오류가 발생했습니다. 메모리 부족으로 인해 발생했을 수 있습니다. 시스템" +"에 충분한 RAM이 있다고 확신하는 경우 버그가 될 수 있으며 보고해 주길 바랍니" +"다." + +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:472 msgid "Copying of the temporary G-code to the output G-code failed" msgstr "임시 G 코드를 출력 G 코드에 복사 하지 못했습니다" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:417 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:497 msgid "Scheduling upload to `%1%`. See Window -> Print Host Upload Queue" msgstr "" "`%1%`. 로 업로드를 예약 합니다. 창-> 인쇄 호스트 업로드 대기열을 참조 하십시" "오" -#: src/slic3r/GUI/BedShapeDialog.cpp:65 +#: src/slic3r/GUI/BedShapeDialog.cpp:66 src/slic3r/GUI/GUI_ObjectList.cpp:2038 msgid "Shape" msgstr "모양" -#: src/slic3r/GUI/BedShapeDialog.cpp:72 +#: src/slic3r/GUI/BedShapeDialog.cpp:73 msgid "Rectangular" msgstr "직사각형" -#: src/slic3r/GUI/BedShapeDialog.cpp:76 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:391 src/slic3r/GUI/Plater.cpp:145 -#: src/slic3r/GUI/Tab.cpp:2469 +#: src/slic3r/GUI/BedShapeDialog.cpp:77 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:232 src/slic3r/GUI/Plater.cpp:162 +#: src/slic3r/GUI/Tab.cpp:2306 msgid "Size" msgstr "사이즈" -#: src/slic3r/GUI/BedShapeDialog.cpp:77 +#: src/slic3r/GUI/BedShapeDialog.cpp:78 msgid "Size in X and Y of the rectangular plate." -msgstr "사격형 플레이트 X 및 Y 크기." - -#: src/slic3r/GUI/BedShapeDialog.cpp:83 -msgid "Origin" -msgstr "원본" +msgstr "사각 플레이트 X 및 Y 크기." #: src/slic3r/GUI/BedShapeDialog.cpp:84 +msgid "Origin" +msgstr "원점" + +#: src/slic3r/GUI/BedShapeDialog.cpp:85 msgid "" "Distance of the 0,0 G-code coordinate from the front left corner of the " "rectangle." -msgstr "사각형의 전면 왼쪽된 모서리에서 0, 0 G-코드 좌표 거리입니다." +msgstr "사각 전면 왼쪽 모서리에서 원저(0, 0) G-code 좌표 거리입니다." -#: src/slic3r/GUI/BedShapeDialog.cpp:88 +#: src/slic3r/GUI/BedShapeDialog.cpp:89 msgid "Circular" msgstr "원형" -#: src/slic3r/GUI/BedShapeDialog.cpp:91 src/slic3r/GUI/ConfigWizard.cpp:118 -#: src/slic3r/GUI/ConfigWizard.cpp:571 src/slic3r/GUI/ConfigWizard.cpp:585 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:388 -#: src/slic3r/GUI/WipeTowerDialog.cpp:84 src/slic3r/GUI/wxExtensions.cpp:486 -#: src/libslic3r/PrintConfig.cpp:70 src/libslic3r/PrintConfig.cpp:77 -#: src/libslic3r/PrintConfig.cpp:86 src/libslic3r/PrintConfig.cpp:220 -#: src/libslic3r/PrintConfig.cpp:295 src/libslic3r/PrintConfig.cpp:303 -#: src/libslic3r/PrintConfig.cpp:353 src/libslic3r/PrintConfig.cpp:363 -#: src/libslic3r/PrintConfig.cpp:488 src/libslic3r/PrintConfig.cpp:499 -#: src/libslic3r/PrintConfig.cpp:517 src/libslic3r/PrintConfig.cpp:695 -#: src/libslic3r/PrintConfig.cpp:1215 src/libslic3r/PrintConfig.cpp:1276 -#: src/libslic3r/PrintConfig.cpp:1294 src/libslic3r/PrintConfig.cpp:1312 -#: src/libslic3r/PrintConfig.cpp:1364 src/libslic3r/PrintConfig.cpp:1374 -#: src/libslic3r/PrintConfig.cpp:1495 src/libslic3r/PrintConfig.cpp:1503 -#: src/libslic3r/PrintConfig.cpp:1544 src/libslic3r/PrintConfig.cpp:1552 -#: src/libslic3r/PrintConfig.cpp:1562 src/libslic3r/PrintConfig.cpp:1570 -#: src/libslic3r/PrintConfig.cpp:1578 src/libslic3r/PrintConfig.cpp:1661 -#: src/libslic3r/PrintConfig.cpp:1878 src/libslic3r/PrintConfig.cpp:1948 -#: src/libslic3r/PrintConfig.cpp:1982 src/libslic3r/PrintConfig.cpp:2176 -#: src/libslic3r/PrintConfig.cpp:2183 src/libslic3r/PrintConfig.cpp:2190 -#: src/libslic3r/PrintConfig.cpp:2220 src/libslic3r/PrintConfig.cpp:2230 -#: src/libslic3r/PrintConfig.cpp:2240 src/libslic3r/PrintConfig.cpp:2403 -#: src/libslic3r/PrintConfig.cpp:2478 src/libslic3r/PrintConfig.cpp:2487 -#: src/libslic3r/PrintConfig.cpp:2496 src/libslic3r/PrintConfig.cpp:2506 -#: src/libslic3r/PrintConfig.cpp:2550 src/libslic3r/PrintConfig.cpp:2560 -#: src/libslic3r/PrintConfig.cpp:2572 src/libslic3r/PrintConfig.cpp:2592 -#: src/libslic3r/PrintConfig.cpp:2602 src/libslic3r/PrintConfig.cpp:2613 -#: src/libslic3r/PrintConfig.cpp:2631 src/libslic3r/PrintConfig.cpp:2646 -#: src/libslic3r/PrintConfig.cpp:2660 src/libslic3r/PrintConfig.cpp:2673 -#: src/libslic3r/PrintConfig.cpp:2683 src/libslic3r/PrintConfig.cpp:2704 -#: src/libslic3r/PrintConfig.cpp:2715 src/libslic3r/PrintConfig.cpp:2725 -#: src/libslic3r/PrintConfig.cpp:2735 +#: src/slic3r/GUI/BedShapeDialog.cpp:92 src/slic3r/GUI/ConfigWizard.cpp:218 +#: src/slic3r/GUI/ConfigWizard.cpp:971 src/slic3r/GUI/ConfigWizard.cpp:985 +#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:87 +#: src/slic3r/GUI/GUI_ObjectLayers.cpp:135 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:333 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:94 +#: src/slic3r/GUI/WipeTowerDialog.cpp:85 src/libslic3r/PrintConfig.cpp:75 +#: src/libslic3r/PrintConfig.cpp:82 src/libslic3r/PrintConfig.cpp:91 +#: src/libslic3r/PrintConfig.cpp:178 src/libslic3r/PrintConfig.cpp:236 +#: src/libslic3r/PrintConfig.cpp:311 src/libslic3r/PrintConfig.cpp:319 +#: src/libslic3r/PrintConfig.cpp:369 src/libslic3r/PrintConfig.cpp:379 +#: src/libslic3r/PrintConfig.cpp:505 src/libslic3r/PrintConfig.cpp:516 +#: src/libslic3r/PrintConfig.cpp:534 src/libslic3r/PrintConfig.cpp:713 +#: src/libslic3r/PrintConfig.cpp:1240 src/libslic3r/PrintConfig.cpp:1301 +#: src/libslic3r/PrintConfig.cpp:1319 src/libslic3r/PrintConfig.cpp:1337 +#: src/libslic3r/PrintConfig.cpp:1393 src/libslic3r/PrintConfig.cpp:1403 +#: src/libslic3r/PrintConfig.cpp:1525 src/libslic3r/PrintConfig.cpp:1533 +#: src/libslic3r/PrintConfig.cpp:1574 src/libslic3r/PrintConfig.cpp:1582 +#: src/libslic3r/PrintConfig.cpp:1592 src/libslic3r/PrintConfig.cpp:1600 +#: src/libslic3r/PrintConfig.cpp:1608 src/libslic3r/PrintConfig.cpp:1691 +#: src/libslic3r/PrintConfig.cpp:1924 src/libslic3r/PrintConfig.cpp:1995 +#: src/libslic3r/PrintConfig.cpp:2029 src/libslic3r/PrintConfig.cpp:2157 +#: src/libslic3r/PrintConfig.cpp:2236 src/libslic3r/PrintConfig.cpp:2243 +#: src/libslic3r/PrintConfig.cpp:2250 src/libslic3r/PrintConfig.cpp:2280 +#: src/libslic3r/PrintConfig.cpp:2290 src/libslic3r/PrintConfig.cpp:2300 +#: src/libslic3r/PrintConfig.cpp:2485 src/libslic3r/PrintConfig.cpp:2624 +#: src/libslic3r/PrintConfig.cpp:2633 src/libslic3r/PrintConfig.cpp:2642 +#: src/libslic3r/PrintConfig.cpp:2652 src/libslic3r/PrintConfig.cpp:2696 +#: src/libslic3r/PrintConfig.cpp:2706 src/libslic3r/PrintConfig.cpp:2718 +#: src/libslic3r/PrintConfig.cpp:2738 src/libslic3r/PrintConfig.cpp:2748 +#: src/libslic3r/PrintConfig.cpp:2758 src/libslic3r/PrintConfig.cpp:2776 +#: src/libslic3r/PrintConfig.cpp:2791 src/libslic3r/PrintConfig.cpp:2805 +#: src/libslic3r/PrintConfig.cpp:2816 src/libslic3r/PrintConfig.cpp:2829 +#: src/libslic3r/PrintConfig.cpp:2874 src/libslic3r/PrintConfig.cpp:2884 +#: src/libslic3r/PrintConfig.cpp:2893 src/libslic3r/PrintConfig.cpp:2903 +#: src/libslic3r/PrintConfig.cpp:2919 msgid "mm" msgstr "mm" -#: src/slic3r/GUI/BedShapeDialog.cpp:92 src/libslic3r/PrintConfig.cpp:692 +#: src/slic3r/GUI/BedShapeDialog.cpp:93 src/libslic3r/PrintConfig.cpp:710 msgid "Diameter" msgstr "노즐 직경" -#: src/slic3r/GUI/BedShapeDialog.cpp:93 +#: src/slic3r/GUI/BedShapeDialog.cpp:94 msgid "" "Diameter of the print bed. It is assumed that origin (0,0) is located in the " "center." -msgstr "인쇄 침대의 직경. 원점 (0,0) 은 중심에 있다고 가정합니다." +msgstr "인쇄 배드의 직경. 원점 (0,0) 은 중재봉선에 있다고 가정합니다." -#: src/slic3r/GUI/BedShapeDialog.cpp:97 src/slic3r/GUI/GUI_Preview.cpp:246 -#: src/libslic3r/GCode/PreviewData.cpp:175 +#: src/slic3r/GUI/BedShapeDialog.cpp:98 src/slic3r/GUI/GUI_Preview.cpp:251 +#: src/libslic3r/ExtrusionEntity.cpp:322 msgid "Custom" msgstr "사용자 정의" -#: src/slic3r/GUI/BedShapeDialog.cpp:101 +#: src/slic3r/GUI/BedShapeDialog.cpp:102 msgid "Load shape from STL..." msgstr "STL파일 로드." -#: src/slic3r/GUI/BedShapeDialog.cpp:154 +#: src/slic3r/GUI/BedShapeDialog.cpp:155 msgid "Settings" msgstr "설정" -#: src/slic3r/GUI/BedShapeDialog.cpp:171 +#: src/slic3r/GUI/BedShapeDialog.cpp:172 msgid "Texture" msgstr "질감" -#: src/slic3r/GUI/BedShapeDialog.cpp:181 src/slic3r/GUI/BedShapeDialog.cpp:249 +#: src/slic3r/GUI/BedShapeDialog.cpp:182 src/slic3r/GUI/BedShapeDialog.cpp:261 msgid "Load..." msgstr "불러오기..." -#: src/slic3r/GUI/BedShapeDialog.cpp:189 src/slic3r/GUI/BedShapeDialog.cpp:257 -#: src/slic3r/GUI/Tab.cpp:3204 +#: src/slic3r/GUI/BedShapeDialog.cpp:190 src/slic3r/GUI/BedShapeDialog.cpp:269 +#: src/slic3r/GUI/Tab.cpp:3094 msgid "Remove" msgstr "제거" -#: src/slic3r/GUI/BedShapeDialog.cpp:239 +#: src/slic3r/GUI/BedShapeDialog.cpp:223 src/slic3r/GUI/BedShapeDialog.cpp:302 +msgid "Not found: " +msgstr "찾을 수 없음:" + +#: src/slic3r/GUI/BedShapeDialog.cpp:251 msgid "Model" msgstr "모델" -#: src/slic3r/GUI/BedShapeDialog.cpp:464 +#: src/slic3r/GUI/BedShapeDialog.cpp:487 msgid "Choose an STL file to import bed shape from:" -msgstr "다음 에서 침대 모양을 가져올 STL 파일을 선택합니다." +msgstr "가져올 베드 모양을(STL 파일) 선택합니다:" -#: src/slic3r/GUI/BedShapeDialog.cpp:471 src/slic3r/GUI/BedShapeDialog.cpp:520 -#: src/slic3r/GUI/BedShapeDialog.cpp:543 +#: src/slic3r/GUI/BedShapeDialog.cpp:494 src/slic3r/GUI/BedShapeDialog.cpp:543 +#: src/slic3r/GUI/BedShapeDialog.cpp:566 msgid "Invalid file format." msgstr "잘못된 파일 형식." -#: src/slic3r/GUI/BedShapeDialog.cpp:482 +#: src/slic3r/GUI/BedShapeDialog.cpp:505 msgid "Error! Invalid model" msgstr "오류! 잘못된 모델" -#: src/slic3r/GUI/BedShapeDialog.cpp:490 +#: src/slic3r/GUI/BedShapeDialog.cpp:513 msgid "The selected file contains no geometry." -msgstr "선택한 파일에는 형상이 없는 포함 되어 있습니다." +msgstr "선택한 파일에 없는 형상이 있습니다." -#: src/slic3r/GUI/BedShapeDialog.cpp:494 +#: src/slic3r/GUI/BedShapeDialog.cpp:517 msgid "" "The selected file contains several disjoint areas. This is not supported." msgstr "" -"선택한 파일 여러 분리 된 영역을 포함 되어 있습니다. 이것ㅇ 지원 되지 않습니" -"다." - -#: src/slic3r/GUI/BedShapeDialog.cpp:509 -msgid "Choose a file to import bed texture from (PNG/SVG):" -msgstr "(PNG /SVG)에서 침대 텍스처를 가져올 파일을 선택합니다." +"선택한 파일은 여러개의 분리 된 영역을 포함 되어 있어 지원 되지 않습니다." #: src/slic3r/GUI/BedShapeDialog.cpp:532 -msgid "Choose an STL file to import bed model from:" -msgstr "다음에서 침대 모델을 가져올 STL 파일을 선택합니다." +msgid "Choose a file to import bed texture from (PNG/SVG):" +msgstr "(PNG /SVG)에서 배드 텍스처를 가져올 파일을 선택합니다." -#: src/slic3r/GUI/BedShapeDialog.hpp:59 src/slic3r/GUI/ConfigWizard.cpp:530 +#: src/slic3r/GUI/BedShapeDialog.cpp:555 +msgid "Choose an STL file to import bed model from:" +msgstr "다음에서 베드 모델을 가져올 STL 파일을 선택합니다:" + +#: src/slic3r/GUI/BedShapeDialog.hpp:59 src/slic3r/GUI/ConfigWizard.cpp:930 msgid "Bed Shape" msgstr "배드 모양" @@ -288,8 +320,150 @@ msgstr "이 값은 시스템 값과 같습니다" msgid "" "Value was changed and is not equal to the system value or the last saved " "preset" +msgstr "값이 변경 되었고, 시스템 값 또는 마지막으로 저장된 설정값과 다릅니다." + +#: src/slic3r/GUI/ConfigManipulation.cpp:48 +msgid "" +"Zero layer height is not valid.\n" +"\n" +"The layer height will be reset to 0.01." msgstr "" -"값이 변경 되었고 시스템 값 또는 마지막으로 저장 된 사전 설정과 같지 않음" +"바닥 레이어 높이가 잘못되었습니다.\n" +"\n" +"레이어 높이가 0.01로 재설정됩니다." + +#: src/slic3r/GUI/ConfigManipulation.cpp:49 +#: src/slic3r/GUI/GUI_ObjectLayers.cpp:27 src/slic3r/GUI/Tab.cpp:1039 +#: src/libslic3r/PrintConfig.cpp:71 +msgid "Layer height" +msgstr "레이어 높이" + +#: src/slic3r/GUI/ConfigManipulation.cpp:60 +msgid "" +"Zero first layer height is not valid.\n" +"\n" +"The first layer height will be reset to 0.01." +msgstr "" +"첫 번째 레이어 높이가 0이면 유효하지 않습니다.\n" +"\n" +"첫 번째 레이어 높이는 0.01로 재설정됩니다." + +#: src/slic3r/GUI/ConfigManipulation.cpp:61 src/libslic3r/PrintConfig.cpp:890 +msgid "First layer height" +msgstr "첫 레이어 높이" + +#: src/slic3r/GUI/ConfigManipulation.cpp:75 +#, no-c-format +msgid "" +"The Spiral Vase mode requires:\n" +"- one perimeter\n" +"- no top solid layers\n" +"- 0% fill density\n" +"- no support material\n" +"- inactive Ensure vertical shell thickness" +msgstr "" +"나선형 꽃병 모드는 다음을 필요로 합니다.\n" +"- 하나의 둘레\n" +"- 상단 솔리드 레이어 없음\n" +"- 0% 충진 밀도\n" +"- 서포트가 필요 없음\n" +"- 비활성 수직 쉘 두께 보장" + +#: src/slic3r/GUI/ConfigManipulation.cpp:82 +msgid "Shall I adjust those settings in order to enable Spiral Vase?" +msgstr "나선형 꽃병을 활성화하기 위해 이러한 설정을 조정해야 합니까?" + +#: src/slic3r/GUI/ConfigManipulation.cpp:83 +msgid "Spiral Vase" +msgstr "스파이럴 바이스" + +#: src/slic3r/GUI/ConfigManipulation.cpp:107 +msgid "" +"The Wipe Tower currently supports the non-soluble supports only\n" +"if they are printed with the current extruder without triggering a tool " +"change.\n" +"(both support_material_extruder and support_material_interface_extruder need " +"to be set to 0)." +msgstr "" +"와이프 타워는 현재 비수용성 지원만 지원합니다.\n" +"공구 교환을 트리거하지 않고 현재 압출기로 인쇄된 경우\n" +"(support_material_extruder support_material_interface_extruder 모두 0으로 설" +"정해야 합니다)." + +#: src/slic3r/GUI/ConfigManipulation.cpp:111 +msgid "Shall I adjust those settings in order to enable the Wipe Tower?" +msgstr "와이프 타워를 활성화하기 위해 이러한 설정을 조정해야 합니까?" + +#: src/slic3r/GUI/ConfigManipulation.cpp:112 +#: src/slic3r/GUI/ConfigManipulation.cpp:132 +msgid "Wipe Tower" +msgstr "와이프 타워(Wipe Tower)" + +#: src/slic3r/GUI/ConfigManipulation.cpp:128 +msgid "" +"For the Wipe Tower to work with the soluble supports, the support layers\n" +"need to be synchronized with the object layers." +msgstr "" +"와이프 타워가 가용성 지지체와 함께 작동 하려면 서포트 레이어를 객체(object) " +"레이어와 동기화 해야 합니다." + +#: src/slic3r/GUI/ConfigManipulation.cpp:131 +msgid "Shall I synchronize support layers in order to enable the Wipe Tower?" +msgstr "와이프 타워를 활성화하기 위해 지원 레이어를 동기화해야 합니까?" + +#: src/slic3r/GUI/ConfigManipulation.cpp:151 +msgid "" +"Supports work better, if the following feature is enabled:\n" +"- Detect bridging perimeters" +msgstr "" +"다음 기능이 활성화된 경우 더 나은 작업을 지원합니다.\n" +"- 브리징 경계를 감지" + +#: src/slic3r/GUI/ConfigManipulation.cpp:154 +msgid "Shall I adjust those settings for supports?" +msgstr "지원에 대한 설정을 조정해야 합니까?" + +#: src/slic3r/GUI/ConfigManipulation.cpp:155 +msgid "Support Generator" +msgstr "서포트 생성" + +#: src/slic3r/GUI/ConfigManipulation.cpp:200 +msgid "The %1% infill pattern is not supposed to work at 100%% density." +msgstr "%1% 채우기 패턴은 100% 밀도로 작동하도록 되어 있지 않습니다." + +#: src/slic3r/GUI/ConfigManipulation.cpp:202 +msgid "Shall I switch to rectilinear fill pattern?" +msgstr "직선 채우기 패턴으로 전환해야 합니까?" + +#: src/slic3r/GUI/ConfigManipulation.cpp:203 +#: src/slic3r/GUI/GUI_ObjectList.cpp:35 src/slic3r/GUI/GUI_ObjectList.cpp:94 +#: src/slic3r/GUI/GUI_ObjectList.cpp:612 src/slic3r/GUI/Plater.cpp:524 +#: src/slic3r/GUI/Tab.cpp:1081 src/slic3r/GUI/Tab.cpp:1082 +#: src/libslic3r/PrintConfig.cpp:193 src/libslic3r/PrintConfig.cpp:416 +#: src/libslic3r/PrintConfig.cpp:436 src/libslic3r/PrintConfig.cpp:777 +#: src/libslic3r/PrintConfig.cpp:791 src/libslic3r/PrintConfig.cpp:828 +#: src/libslic3r/PrintConfig.cpp:982 src/libslic3r/PrintConfig.cpp:992 +#: src/libslic3r/PrintConfig.cpp:1010 src/libslic3r/PrintConfig.cpp:1029 +#: src/libslic3r/PrintConfig.cpp:1048 src/libslic3r/PrintConfig.cpp:1738 +#: src/libslic3r/PrintConfig.cpp:1755 +msgid "Infill" +msgstr "인필(채움)" + +#: src/slic3r/GUI/ConfigManipulation.cpp:309 +msgid "Head penetration should not be greater than the head width." +msgstr "헤드 관통은 헤드 폭 보다 크지 않아야 합니다." + +#: src/slic3r/GUI/ConfigManipulation.cpp:311 +msgid "Invalid Head penetration" +msgstr "잘못된 헤드 관통" + +#: src/slic3r/GUI/ConfigManipulation.cpp:322 +msgid "Pinhead diameter should be smaller than the pillar diameter." +msgstr "핀헤드 지름은 기둥 지름 보다 작아야 합니다." + +#: src/slic3r/GUI/ConfigManipulation.cpp:324 +msgid "Invalid pinhead diameter" +msgstr "잘못된 핀 헤드 지름" #: src/slic3r/GUI/ConfigSnapshotDialog.cpp:18 msgid "Upgrade" @@ -311,152 +485,165 @@ msgstr "사용자" msgid "Unknown" msgstr "알 수 없음" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:39 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:43 msgid "Active" msgstr "활동중" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:45 -msgid "slic3r version" -msgstr "slic3r 버전" +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:50 +msgid "PrusaSlicer version" +msgstr "Prusa슬라이서 버전" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:46 src/slic3r/GUI/Preset.cpp:1307 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:51 src/slic3r/GUI/Preset.cpp:1452 msgid "print" -msgstr "프린트" +msgstr "출력" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:47 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:52 msgid "filaments" msgstr "필라멘트" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:48 src/slic3r/GUI/Preset.cpp:1311 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:53 src/slic3r/GUI/Preset.cpp:1456 msgid "printer" msgstr "프린터" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:52 src/slic3r/GUI/Tab.cpp:939 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:57 src/slic3r/GUI/Tab.cpp:961 msgid "vendor" msgstr "제조 회사" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:52 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:57 msgid "version" msgstr "버전" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:53 -msgid "min slic3r version" -msgstr "최소 slic3r 버전" - -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:55 -msgid "max slic3r version" -msgstr "최대 slic3r 버전" - #: src/slic3r/GUI/ConfigSnapshotDialog.cpp:58 +msgid "min PrusaSlicer version" +msgstr "이전 slic3r 버전" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:60 +msgid "max PrusaSlicer version" +msgstr "최신 slic3r 버전" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:63 msgid "model" msgstr "모델" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:58 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:63 msgid "variants" msgstr "변종" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:70 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:75 #, c-format msgid "Incompatible with this %s" msgstr "%s 과 호환되지 않습니다" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:73 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:78 msgid "Activate" msgstr "활성화" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:99 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:104 msgid "Configuration Snapshots" msgstr "구성 스냅숏" -#: src/slic3r/GUI/ConfigWizard.cpp:118 +#: src/slic3r/GUI/ConfigWizard.cpp:218 msgid "nozzle" msgstr "노즐" -#: src/slic3r/GUI/ConfigWizard.cpp:122 +#: src/slic3r/GUI/ConfigWizard.cpp:222 msgid "Alternate nozzles:" msgstr "대체 노즐:" -#: src/slic3r/GUI/ConfigWizard.cpp:188 +#: src/slic3r/GUI/ConfigWizard.cpp:289 msgid "All standard" msgstr "모두 표준설정" -#: src/slic3r/GUI/ConfigWizard.cpp:189 src/slic3r/GUI/Tab.cpp:3254 +#: src/slic3r/GUI/ConfigWizard.cpp:289 +msgid "Standard" +msgstr "표준" + +#: src/slic3r/GUI/ConfigWizard.cpp:290 src/slic3r/GUI/ConfigWizard.cpp:573 +#: src/slic3r/GUI/Tab.cpp:3144 msgid "All" msgstr "모두 선택" -#: src/slic3r/GUI/ConfigWizard.cpp:190 src/slic3r/GUI/Plater.cpp:470 -#: src/libslic3r/GCode/PreviewData.cpp:162 +#: src/slic3r/GUI/ConfigWizard.cpp:291 src/slic3r/GUI/ConfigWizard.cpp:574 +#: src/slic3r/GUI/Plater.cpp:496 src/slic3r/GUI/Plater.cpp:636 +#: src/libslic3r/ExtrusionEntity.cpp:309 msgid "None" msgstr "없음" -#: src/slic3r/GUI/ConfigWizard.cpp:296 +#: src/slic3r/GUI/ConfigWizard.cpp:427 #, c-format msgid "Welcome to the %s Configuration Assistant" msgstr "%s 구성 도우미에 오신 것을 환영 합니다" -#: src/slic3r/GUI/ConfigWizard.cpp:298 +#: src/slic3r/GUI/ConfigWizard.cpp:429 #, c-format msgid "Welcome to the %s Configuration Wizard" -msgstr "%s에 오신것을 환영 합니다." +msgstr "%s 구성 마법사에 오신 것을 환영 합니다" -#: src/slic3r/GUI/ConfigWizard.cpp:300 +#: src/slic3r/GUI/ConfigWizard.cpp:431 msgid "Welcome" msgstr "환영합니다" -#: src/slic3r/GUI/ConfigWizard.cpp:304 src/slic3r/GUI/GUI_App.cpp:747 -#, c-format -msgid "Run %s" -msgstr "%s 실행" - -#: src/slic3r/GUI/ConfigWizard.cpp:306 +#: src/slic3r/GUI/ConfigWizard.cpp:433 #, c-format msgid "" "Hello, welcome to %s! This %s helps you with the initial configuration; just " "a few settings and you will be ready to print." msgstr "" -"안녕하세요 ,%s에 오신 것을 환영 합니다! 이 %s는 초기 구성에 도움이 됩니다. 그" -"냥 몇 가지 설정 하 고 당신은 인쇄 할 준비가 될 것입니다." +"안녕하세요 ,%s에 오신 것을 환영 합니다! 이 %s는 초기 구성에 도움이 됩니다. " +"몇 가지 설정만으로 인쇄 준비가 될 것입니다." -#: src/slic3r/GUI/ConfigWizard.cpp:311 +#: src/slic3r/GUI/ConfigWizard.cpp:438 msgid "" "Remove user profiles - install from scratch (a snapshot will be taken " "beforehand)" -msgstr "사용자 프로필 제거-처음부터 설치 (스냅숏은 사전에 수행 됩니다)" +msgstr "사용자 프로필 제거 - 처음부터 설치 (스냅숏 값은 먼저 저장 됩니다.)" -#: src/slic3r/GUI/ConfigWizard.cpp:342 +#: src/slic3r/GUI/ConfigWizard.cpp:481 #, c-format msgid "%s Family" msgstr "%s의 가족들" -#: src/slic3r/GUI/ConfigWizard.cpp:379 +#: src/slic3r/GUI/ConfigWizard.cpp:565 +msgid "Vendor:" +msgstr "벤더:" + +#: src/slic3r/GUI/ConfigWizard.cpp:566 +msgid "Profile:" +msgstr "프로필:" + +#: src/slic3r/GUI/ConfigWizard.cpp:603 src/slic3r/GUI/ConfigWizard.cpp:631 +msgid "(All)" +msgstr "(모두)" + +#: src/slic3r/GUI/ConfigWizard.cpp:732 msgid "Custom Printer Setup" msgstr "사용자 지정 프린터 설정" -#: src/slic3r/GUI/ConfigWizard.cpp:379 +#: src/slic3r/GUI/ConfigWizard.cpp:732 msgid "Custom Printer" msgstr "사용자 정의 프린터" -#: src/slic3r/GUI/ConfigWizard.cpp:381 +#: src/slic3r/GUI/ConfigWizard.cpp:734 msgid "Define a custom printer profile" -msgstr "사용자 정의 프린터 프로필 정의" +msgstr "사용자 정의 프린터 프로필" -#: src/slic3r/GUI/ConfigWizard.cpp:383 +#: src/slic3r/GUI/ConfigWizard.cpp:736 msgid "Custom profile name:" -msgstr "사용자 지정 프로필 이름:" +msgstr "사용자 정의 프로필 명칭:" -#: src/slic3r/GUI/ConfigWizard.cpp:407 +#: src/slic3r/GUI/ConfigWizard.cpp:760 msgid "Automatic updates" msgstr "자동 업데이트" -#: src/slic3r/GUI/ConfigWizard.cpp:407 +#: src/slic3r/GUI/ConfigWizard.cpp:760 msgid "Updates" msgstr "업데이트" -#: src/slic3r/GUI/ConfigWizard.cpp:415 src/slic3r/GUI/Preferences.cpp:69 +#: src/slic3r/GUI/ConfigWizard.cpp:768 src/slic3r/GUI/Preferences.cpp:64 msgid "Check for application updates" msgstr "프로그램 업데이트 확인" -#: src/slic3r/GUI/ConfigWizard.cpp:419 +#: src/slic3r/GUI/ConfigWizard.cpp:772 #, c-format msgid "" "If enabled, %s checks for new application versions online. When a new " @@ -464,15 +651,15 @@ msgid "" "application startup (never during program usage). This is only a " "notification mechanisms, no automatic installation is done." msgstr "" -"활성화 된 경우 %s은 온라인의 새 버전을 확인합니다. 새 버전을 사용할 수있게되" -"면 다음 응용 프로그램 시작시 알림이 표시됩니다 (프로그램 사용 중에는 절대로 " -"사용하지 마십시오).이것은 알림 메커니즘 일뿐 자동 설치가 수행되지 않습니다." +"활성화 된 경우 %s은 온라인의 새 버전을 확인합니다. 새 버전을 사용할 수 있게 " +"되면, 다음 응용 프로그램 시작시 알림이 표시됩니다 (프로그램 사용 중에는 절대" +"로 사용하지 마십시오).이것은 단순한 알림 일뿐 자동으로 설치가 되지 않습니다." -#: src/slic3r/GUI/ConfigWizard.cpp:425 src/slic3r/GUI/Preferences.cpp:77 +#: src/slic3r/GUI/ConfigWizard.cpp:778 src/slic3r/GUI/Preferences.cpp:82 msgid "Update built-in Presets automatically" msgstr "기존의 설정 자동 업데이트" -#: src/slic3r/GUI/ConfigWizard.cpp:429 +#: src/slic3r/GUI/ConfigWizard.cpp:782 #, c-format msgid "" "If enabled, %s downloads updates of built-in system presets in the " @@ -480,74 +667,131 @@ msgid "" "When a new preset version becomes available it is offered at application " "startup." msgstr "" -"활성화 된 경우 %s은 백그라운드에서 내장 시스템 사전 설정의 업데이트를 다운로" -"드합니다. 이러한 업데이트는 별도의 임시 위치에 다운로드됩니다. 새로운 사전 설" -"정 버전을 사용할 수있게되면 응용 프로그램 시작시 제공됩니다." +"활성화 된 경우 %s은 백그라운드에서, 시스템 사전 설정을 다운로드합니다. 이러" +"한 업데이트는 별도의 임시 위치에 다운로드됩니다. 새로운 사전 설정 버전을 사용" +"할 수 있게되면 응용 프로그램 시작시 제공됩니다." -#: src/slic3r/GUI/ConfigWizard.cpp:432 +#: src/slic3r/GUI/ConfigWizard.cpp:785 msgid "" "Updates are never applied without user's consent and never overwrite user's " "customized settings." msgstr "" -"업데이트는 사용자의 동의없이 적용되지 않으며 사용자의 사용자 지정된 설정을 덮" -"어 쓰지 않습니다." +"업데이트는 사용자의 동의를 받아야 하고, 지정된 이전 설정을 덮어 쓰지 않습니" +"다." -#: src/slic3r/GUI/ConfigWizard.cpp:437 +#: src/slic3r/GUI/ConfigWizard.cpp:790 msgid "" "Additionally a backup snapshot of the whole configuration is created before " "an update is applied." -msgstr "또한 업데이트가 적용되기 전에 전체 구성의 백업 스냅 샷이 생성됩니다." +msgstr "" +"또한 업데이트가 적용되기 전에 전체 구성의 백업 구성(스냅샷)이 생성됩니다." -#: src/slic3r/GUI/ConfigWizard.cpp:444 +#: src/slic3r/GUI/ConfigWizard.cpp:798 src/slic3r/GUI/GUI_ObjectList.cpp:1655 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1658 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3932 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3935 src/slic3r/GUI/Plater.cpp:3211 +#: src/slic3r/GUI/Plater.cpp:3946 src/slic3r/GUI/Plater.cpp:3949 +#: src/slic3r/GUI/Plater.cpp:3980 src/slic3r/GUI/Plater.cpp:3983 +msgid "Reload from disk" +msgstr "디스크에서 다시 불러오기" + +#: src/slic3r/GUI/ConfigWizard.cpp:801 +msgid "" +"Export full pathnames of models and parts sources into 3mf and amf files" +msgstr "모델 및 부품 소스의 전체 경로 이름을 3mf 및 amf 파일로 내보내기" + +#: src/slic3r/GUI/ConfigWizard.cpp:805 +msgid "" +"If enabled, allows the Reload from disk command to automatically find and " +"load the files when invoked.\n" +"If not enabled, the Reload from disk command will ask to select each file " +"using an open file dialog." +msgstr "" +"활성화된 경우 디스크에서 다시 로드 명령을 사용하여 호출될 때 파일을 자동으로 " +"찾고 로드할 수 있습니다.\n" +"활성화되지 않으면 디스크에서 다시 로드 명령에서 열린 파일 대화 상자를 사용하" +"여 각 파일을 선택하라는 요청이 표시됩니다." + +#: src/slic3r/GUI/ConfigWizard.cpp:814 +msgid "View mode" +msgstr "방법 보기" + +#: src/slic3r/GUI/ConfigWizard.cpp:816 +msgid "" +"PrusaSlicer's user interfaces comes in three variants:\n" +"Simple, Advanced, and Expert.\n" +"The Simple mode shows only the most frequently used settings relevant for " +"regular 3D printing. The other two offer progressively more sophisticated " +"fine-tuning, they are suitable for advanced and expert users, respectively." +msgstr "" +"PrusaSlicer의 사용자 인터페이스는 세 가지 변형으로 제공됩니다.\n" +"간단하고 고급, 전문가.\n" +"단순 모드는 일반 3D 인쇄와 관련된 가장 자주 사용되는 설정만 표시합니다. 다른 " +"두 가지는 점진적으로 더 정교한 미세 조정을 제공하며, 각각 고급 및 전문가 사용" +"자에게 적합합니다." + +#: src/slic3r/GUI/ConfigWizard.cpp:821 +msgid "Simple mode" +msgstr "단순 모드" + +#: src/slic3r/GUI/ConfigWizard.cpp:822 +msgid "Advanced mode" +msgstr "고급 모드" + +#: src/slic3r/GUI/ConfigWizard.cpp:823 +msgid "Expert mode" +msgstr "전문가 모드" + +#: src/slic3r/GUI/ConfigWizard.cpp:857 msgid "Other Vendors" msgstr "다른 공급 업체" -#: src/slic3r/GUI/ConfigWizard.cpp:446 +#: src/slic3r/GUI/ConfigWizard.cpp:861 #, c-format -msgid "Pick another vendor supported by %s:" +msgid "Pick another vendor supported by %s" msgstr "%s가 지원하는 다른 공급 업체를 선택하십시오:" -#: src/slic3r/GUI/ConfigWizard.cpp:492 +#: src/slic3r/GUI/ConfigWizard.cpp:892 msgid "Firmware Type" -msgstr "펌웨어 타입" +msgstr "펌웨어 종류" -#: src/slic3r/GUI/ConfigWizard.cpp:492 src/slic3r/GUI/Tab.cpp:2100 +#: src/slic3r/GUI/ConfigWizard.cpp:892 src/slic3r/GUI/Tab.cpp:1931 msgid "Firmware" msgstr "펌웨어" -#: src/slic3r/GUI/ConfigWizard.cpp:496 +#: src/slic3r/GUI/ConfigWizard.cpp:896 msgid "Choose the type of firmware used by your printer." -msgstr "프린터에 패치할 펌웨어를 선택하세요." +msgstr "프린터에 업로드 할 펌웨어를 선택하세요." -#: src/slic3r/GUI/ConfigWizard.cpp:530 +#: src/slic3r/GUI/ConfigWizard.cpp:930 msgid "Bed Shape and Size" msgstr "배드 모양과 크기" -#: src/slic3r/GUI/ConfigWizard.cpp:533 +#: src/slic3r/GUI/ConfigWizard.cpp:933 msgid "Set the shape of your printer's bed." msgstr "프린터 배드모양을 설정하세요." -#: src/slic3r/GUI/ConfigWizard.cpp:553 +#: src/slic3r/GUI/ConfigWizard.cpp:953 msgid "Filament and Nozzle Diameters" msgstr "필라멘트와 노즐 크기" -#: src/slic3r/GUI/ConfigWizard.cpp:553 +#: src/slic3r/GUI/ConfigWizard.cpp:953 msgid "Print Diameters" msgstr "인쇄 직경" -#: src/slic3r/GUI/ConfigWizard.cpp:567 +#: src/slic3r/GUI/ConfigWizard.cpp:967 msgid "Enter the diameter of your printer's hot end nozzle." msgstr "핫 엔드 노즐 직경을 입력하십시오." -#: src/slic3r/GUI/ConfigWizard.cpp:570 +#: src/slic3r/GUI/ConfigWizard.cpp:970 msgid "Nozzle Diameter:" msgstr "노즐 직경:" -#: src/slic3r/GUI/ConfigWizard.cpp:580 +#: src/slic3r/GUI/ConfigWizard.cpp:980 msgid "Enter the diameter of your filament." msgstr "필라멘트의 직경을 입력하십시오." -#: src/slic3r/GUI/ConfigWizard.cpp:581 +#: src/slic3r/GUI/ConfigWizard.cpp:981 msgid "" "Good precision is required, so use a caliper and do multiple measurements " "along the filament, then compute the average." @@ -555,41 +799,41 @@ msgstr "" "정밀도가 필요하므로 캘리퍼를 사용하여 필라멘트를 따라 여러 번 측정 한 다음 평" "균을 계산하십시오." -#: src/slic3r/GUI/ConfigWizard.cpp:584 +#: src/slic3r/GUI/ConfigWizard.cpp:984 msgid "Filament Diameter:" msgstr "필라멘트 직경:" -#: src/slic3r/GUI/ConfigWizard.cpp:618 +#: src/slic3r/GUI/ConfigWizard.cpp:1018 msgid "Extruder and Bed Temperatures" msgstr "익스트루더와 배드 온도" -#: src/slic3r/GUI/ConfigWizard.cpp:618 +#: src/slic3r/GUI/ConfigWizard.cpp:1018 msgid "Temperatures" msgstr "온도" -#: src/slic3r/GUI/ConfigWizard.cpp:634 +#: src/slic3r/GUI/ConfigWizard.cpp:1034 msgid "Enter the temperature needed for extruding your filament." msgstr "필라멘트 압출에 필요한 온도를 입력하십시오." -#: src/slic3r/GUI/ConfigWizard.cpp:635 +#: src/slic3r/GUI/ConfigWizard.cpp:1035 msgid "A rule of thumb is 160 to 230 °C for PLA, and 215 to 250 °C for ABS." msgstr "보통 PLA의 경우 160 ~ 230 ° C, ABS의 경우 215 ~ 250 ° C입니다." -#: src/slic3r/GUI/ConfigWizard.cpp:638 +#: src/slic3r/GUI/ConfigWizard.cpp:1038 msgid "Extrusion Temperature:" msgstr "출력 온도 :" -#: src/slic3r/GUI/ConfigWizard.cpp:639 src/slic3r/GUI/ConfigWizard.cpp:653 +#: src/slic3r/GUI/ConfigWizard.cpp:1039 src/slic3r/GUI/ConfigWizard.cpp:1053 msgid "°C" msgstr "°C" -#: src/slic3r/GUI/ConfigWizard.cpp:648 +#: src/slic3r/GUI/ConfigWizard.cpp:1048 msgid "" "Enter the bed temperature needed for getting your filament to stick to your " "heated bed." -msgstr "필라멘트가 핫배드에 접착하는데 필요한 배드온도를 입력하십시오." +msgstr "필라멘트가 핫배드에 접착하는데 필요한 온도를 입력하십시오." -#: src/slic3r/GUI/ConfigWizard.cpp:649 +#: src/slic3r/GUI/ConfigWizard.cpp:1049 msgid "" "A rule of thumb is 60 °C for PLA and 110 °C for ABS. Leave zero if you have " "no heated bed." @@ -597,81 +841,451 @@ msgstr "" "보통은 PLA의 경우 60 ° C이고 ABS의 경우 110 ° C입니다. 핫배드가 없는 경우에" "는 0으로 두십시오." -#: src/slic3r/GUI/ConfigWizard.cpp:652 +#: src/slic3r/GUI/ConfigWizard.cpp:1052 msgid "Bed Temperature:" msgstr "배드 온도 :" -#: src/slic3r/GUI/ConfigWizard.cpp:1115 +#: src/slic3r/GUI/ConfigWizard.cpp:1474 src/slic3r/GUI/ConfigWizard.cpp:2014 +msgid "Filaments" +msgstr "필라멘트" + +#: src/slic3r/GUI/ConfigWizard.cpp:1474 src/slic3r/GUI/ConfigWizard.cpp:2016 +msgid "SLA Materials" +msgstr "SLA 재료" + +#: src/slic3r/GUI/ConfigWizard.cpp:1528 +msgid "FFF Technology Printers" +msgstr "FFF 기술 프린터" + +#: src/slic3r/GUI/ConfigWizard.cpp:1533 +msgid "SLA Technology Printers" +msgstr "SLA 기술 프린터" + +#: src/slic3r/GUI/ConfigWizard.cpp:1751 src/slic3r/GUI/DoubleSlider.cpp:1877 +#: src/slic3r/GUI/DoubleSlider.cpp:1898 src/slic3r/GUI/GUI.cpp:240 +msgid "Notice" +msgstr "공지" + +#: src/slic3r/GUI/ConfigWizard.cpp:1760 +msgid "You have to select at least one filament for selected printers" +msgstr "선택한 프린터에 대해 필라멘트를 하나 이상 선택해야 합니다." + +#: src/slic3r/GUI/ConfigWizard.cpp:1761 +msgid "Do you want to automatic select default filaments?" +msgstr "기본 필라멘트를 자동으로 선택하시겠습니까?" + +#: src/slic3r/GUI/ConfigWizard.cpp:1771 +msgid "You have to select at least one material for selected printers" +msgstr "선택한 프린터에 대해 하나 이상의 재질을 선택해야 합니다." + +#: src/slic3r/GUI/ConfigWizard.cpp:1772 +msgid "Do you want to automatic select default materials?" +msgstr "기본 재질을 자동으로 선택하시겠습니까?" + +#: src/slic3r/GUI/ConfigWizard.cpp:1979 msgid "Select all standard printers" msgstr "이 프로파일과 호환 가능한 프린터를 선택하세요" -#: src/slic3r/GUI/ConfigWizard.cpp:1118 +#: src/slic3r/GUI/ConfigWizard.cpp:1982 msgid "< &Back" msgstr "< &뒤로" -#: src/slic3r/GUI/ConfigWizard.cpp:1119 +#: src/slic3r/GUI/ConfigWizard.cpp:1983 msgid "&Next >" msgstr "&다음 >" -#: src/slic3r/GUI/ConfigWizard.cpp:1120 +#: src/slic3r/GUI/ConfigWizard.cpp:1984 msgid "&Finish" msgstr "&완료" -#: src/slic3r/GUI/ConfigWizard.cpp:1121 src/slic3r/GUI/FirmwareDialog.cpp:151 -#: src/slic3r/GUI/ProgressStatusBar.cpp:27 +#: src/slic3r/GUI/ConfigWizard.cpp:1985 src/slic3r/GUI/FirmwareDialog.cpp:151 +#: src/slic3r/GUI/ProgressStatusBar.cpp:26 msgid "Cancel" msgstr "취소" -#: src/slic3r/GUI/ConfigWizard.cpp:1135 +#: src/slic3r/GUI/ConfigWizard.cpp:1998 msgid "Prusa FFF Technology Printers" msgstr "Prusa FFF 방식 프린터" -#: src/slic3r/GUI/ConfigWizard.cpp:1138 +#: src/slic3r/GUI/ConfigWizard.cpp:2001 msgid "Prusa MSLA Technology Printers" msgstr "Prusa MSLA 방식 프린터" -#: src/slic3r/GUI/ConfigWizard.cpp:1207 +#: src/slic3r/GUI/ConfigWizard.cpp:2014 +msgid "Filament Profiles Selection" +msgstr "필라멘트 프로파일 선택" + +#: src/slic3r/GUI/ConfigWizard.cpp:2014 src/slic3r/GUI/GUI_ObjectList.cpp:3528 +msgid "Type:" +msgstr "형식:" + +#: src/slic3r/GUI/ConfigWizard.cpp:2016 +msgid "SLA Material Profiles Selection" +msgstr "SLA 재질 프로파일 선택" + +#: src/slic3r/GUI/ConfigWizard.cpp:2016 +msgid "Layer height:" +msgstr "레이어 높이:" + +#: src/slic3r/GUI/ConfigWizard.cpp:2112 msgid "Configuration Assistant" msgstr "구성 도우미" -#: src/slic3r/GUI/ConfigWizard.cpp:1208 +#: src/slic3r/GUI/ConfigWizard.cpp:2113 msgid "Configuration &Assistant" msgstr "구성 & 도우미" -#: src/slic3r/GUI/ConfigWizard.cpp:1210 +#: src/slic3r/GUI/ConfigWizard.cpp:2115 msgid "Configuration Wizard" msgstr "구성 마법사" -#: src/slic3r/GUI/ConfigWizard.cpp:1211 +#: src/slic3r/GUI/ConfigWizard.cpp:2116 msgid "Configuration &Wizard" msgstr "구성 & 마법사" -#: src/slic3r/GUI/Field.cpp:125 +#: src/slic3r/GUI/DoubleSlider.cpp:79 +msgid "Place bearings in slots and resume" +msgstr "슬롯에 베어링을 배치하고 다시 시작" + +#: src/slic3r/GUI/DoubleSlider.cpp:923 +msgid "One layer mode" +msgstr "하나의 레이어 모드" + +#: src/slic3r/GUI/DoubleSlider.cpp:925 +msgid "Discard all custom changes" +msgstr "모든 사용자 지정 변경 내용 삭제" + +#: src/slic3r/GUI/DoubleSlider.cpp:928 +msgid "For jump to print Z use left mouse button click OR (Shift+G)" +msgstr "Z를 인쇄하는 점프를 위해 왼쪽 마우스 버튼을 클릭 (Shift +G)" + +#: src/slic3r/GUI/DoubleSlider.cpp:929 +msgid "For set extruder sequence for whole print use right mouse button click" +msgstr "전체 인쇄 용 돌출부 시퀀스 설정용 마우스 버튼 클릭" + +#: src/slic3r/GUI/DoubleSlider.cpp:930 src/slic3r/GUI/DoubleSlider.cpp:1495 +msgid "Jump to print Z" +msgstr "Z 인쇄로 이동" + +#: src/slic3r/GUI/DoubleSlider.cpp:933 +msgid "For edit current color use right mouse button click on colored band" +msgstr "현재 색상 사용 오른쪽 마우스 버튼을 편집하려면 컬러 밴드를 클릭" + +#: src/slic3r/GUI/DoubleSlider.cpp:941 +msgid "Slider(print) mode" +msgstr "슬라이더(인쇄) 모드" + +#: src/slic3r/GUI/DoubleSlider.cpp:955 +msgid "For add change extruder use left mouse button click" +msgstr "추가 변경 압출기 사용 왼쪽 마우스 단추 단추를 클릭" + +#: src/slic3r/GUI/DoubleSlider.cpp:957 +msgid "" +"For add color change use left mouse button click if you want to use colors " +"from default color list, or Shift + left mouse button click if you want to " +"select a color" +msgstr "" +"색상 변경 추가하려면 기본 색상 목록에서 색상을 사용하려는 경우 왼쪽 마우스 버" +"튼을 클릭하거나 색상을 선택하려면 Shift + 왼쪽 마우스 버튼을 클릭하십시오." + +#: src/slic3r/GUI/DoubleSlider.cpp:960 +msgid "For add color change use left mouse button click" +msgstr "색상 변경 추가하려면 왼쪽 마우스 버튼을 클릭하십시오." + +#: src/slic3r/GUI/DoubleSlider.cpp:961 +msgid "OR pres \"+\" key" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:963 +msgid "For add another code use Ctrl + left mouse button click" +msgstr "다른 코드를 추가하려면 Ctrl + 왼쪽 마우스 버튼을 클릭" + +#: src/slic3r/GUI/DoubleSlider.cpp:964 +msgid "For add another code use right mouse button click" +msgstr "다른 코드를 추가하려면 오른쪽 마우스 버튼을 클릭하십시오." + +#: src/slic3r/GUI/DoubleSlider.cpp:973 +msgid "Color change (\"%1%\")" +msgstr "색상 변경(\"%1%\")" + +#: src/slic3r/GUI/DoubleSlider.cpp:974 +msgid "Color change (\"%1%\") for Extruder %2%" +msgstr "압출기 %2%의 색상 변경(\"%1%\")" + +#: src/slic3r/GUI/DoubleSlider.cpp:977 +msgid "Pause print (\"%1%\")" +msgstr "일시 중지 인쇄(\"%1%\")" + +#: src/slic3r/GUI/DoubleSlider.cpp:979 +msgid "Extruder(tool) is changed to Extruder \"%1%\"" +msgstr "압출기(도구)가 압출기 \"%1%\"로 변경됩니다." + +#: src/slic3r/GUI/DoubleSlider.cpp:980 +msgid "\"%1%\"" +msgstr "\"%1%\"" + +#: src/slic3r/GUI/DoubleSlider.cpp:986 +msgid "Note" +msgstr "메모" + +#: src/slic3r/GUI/DoubleSlider.cpp:988 +msgid "" +"G-code of this tick has a conflict with slider(print) mode.\n" +"Any its editing will cause a changes of DoubleSlider data." +msgstr "" +"이 틱의 G 코드는 슬라이더(인쇄) 모드와 충돌합니다.\n" +"편집하면 두개의 슬라이더 데이터가 변경됩니다." + +#: src/slic3r/GUI/DoubleSlider.cpp:991 +msgid "" +"There is a color change for extruder that wouldn't be used till the end of " +"printing.\n" +"This code wouldn't be processed during GCode generation." +msgstr "" +"인쇄가 끝날 때까지 사용되지 않는 압출기의 색상 변경이 있습니다.\n" +"이 코드는 GCode 생성 중에 처리되지 않습니다." + +#: src/slic3r/GUI/DoubleSlider.cpp:994 +msgid "" +"There is a extruder change to the same extruder.\n" +"This code wouldn't be processed during GCode generation." +msgstr "" +"동일한 압출기로 돌출기 변경이 있습니다.\n" +"이 코드는 GCode 생성 중에 처리되지 않습니다." + +#: src/slic3r/GUI/DoubleSlider.cpp:997 +msgid "" +"There is a color change for extruder that has not been used before.\n" +"Check your choice to avoid redundant color changes." +msgstr "" +"이전에 사용되지 않은 압출기의 색상 변경이 있습니다.\n" +"중복 색상 변경을 방지하려면 선택 사항을 확인하십시오." + +#: src/slic3r/GUI/DoubleSlider.cpp:1002 +msgid "For Delete tick use left mouse button click OR pres \"-\" key" +msgstr "삭제 진드기 사용 왼쪽 마우스 버튼 클릭 또는 \"-\" 키를 pres" + +#: src/slic3r/GUI/DoubleSlider.cpp:1004 +msgid "For Edit tick use Ctrl + Left mouse button click" +msgstr "편집 진드기 사용 Ctrl + 왼쪽 마우스 버튼을 클릭" + +#: src/slic3r/GUI/DoubleSlider.cpp:1005 +msgid "For Edit tick use right mouse button click" +msgstr "편집 사용 오른쪽 마우스 버튼을 클릭" + +#: src/slic3r/GUI/DoubleSlider.cpp:1099 src/slic3r/GUI/DoubleSlider.cpp:1135 +#: src/slic3r/GUI/GLCanvas3D.cpp:982 src/slic3r/GUI/Tab.cpp:2302 +#: src/libslic3r/GCode/PreviewData.cpp:445 +#, c-format +msgid "Extruder %d" +msgstr "익스트루더 %d" + +#: src/slic3r/GUI/DoubleSlider.cpp:1100 +msgid "active" +msgstr "활성" + +#: src/slic3r/GUI/DoubleSlider.cpp:1109 +msgid "Switch code to Change extruder" +msgstr "코드 전환- 압출기 변경" + +#: src/slic3r/GUI/DoubleSlider.cpp:1109 src/slic3r/GUI/GUI_ObjectList.cpp:1666 +msgid "Change extruder" +msgstr "압출기(익스트루더) 변경" + +#: src/slic3r/GUI/DoubleSlider.cpp:1110 +msgid "Change extruder (N/A)" +msgstr "돌출자 변경(N/A)" + +#: src/slic3r/GUI/DoubleSlider.cpp:1112 +msgid "Use another extruder" +msgstr "다른 압출기 사용" + +#: src/slic3r/GUI/DoubleSlider.cpp:1136 +msgid "used" +msgstr "사용됨" + +#: src/slic3r/GUI/DoubleSlider.cpp:1144 +msgid "Switch code to Color change (%1%) for:" +msgstr "코드 에서 색상 변경(%1%) 에 대 한:" + +#: src/slic3r/GUI/DoubleSlider.cpp:1145 +msgid "Add color change (%1%) for:" +msgstr "색상 변경 추가(%1%) 에 대 한:" + +#: src/slic3r/GUI/DoubleSlider.cpp:1443 +msgid "Add color change" +msgstr "색상 변경 추가" + +#: src/slic3r/GUI/DoubleSlider.cpp:1453 +msgid "Add pause print" +msgstr "일시 정지 인쇄 추가" + +#: src/slic3r/GUI/DoubleSlider.cpp:1456 +msgid "Add custom G-code" +msgstr "사용자 지정 G 코드 추가" + +#: src/slic3r/GUI/DoubleSlider.cpp:1474 +msgid "Edit color" +msgstr "색상 편집" + +#: src/slic3r/GUI/DoubleSlider.cpp:1475 +msgid "Edit pause print message" +msgstr "일시 정지 인쇄 메시지 편집" + +#: src/slic3r/GUI/DoubleSlider.cpp:1476 +msgid "Edit custom G-code" +msgstr "사용자 지정 G 코드 편집" + +#: src/slic3r/GUI/DoubleSlider.cpp:1482 +msgid "Delete color change" +msgstr "색상 변경 삭제" + +#: src/slic3r/GUI/DoubleSlider.cpp:1483 +msgid "Delete tool change" +msgstr "도구 변경 삭제" + +#: src/slic3r/GUI/DoubleSlider.cpp:1484 +msgid "Delete pause print" +msgstr "일시 정지 인쇄 삭제" + +#: src/slic3r/GUI/DoubleSlider.cpp:1485 +msgid "Delete custom G-code" +msgstr "사용자 지정 G 코드 삭제" + +#: src/slic3r/GUI/DoubleSlider.cpp:1498 +msgid "Set extruder sequence for whole print" +msgstr "전체 인쇄를 위한 압출기 시퀀스 설정" + +#: src/slic3r/GUI/DoubleSlider.cpp:1584 +msgid "Enter custom G-code used on current layer" +msgstr "현재 레이어에 사용되는 사용자 지정 G 코드를 입력합니다." + +#: src/slic3r/GUI/DoubleSlider.cpp:1585 +msgid "Custom Gcode on current layer (%1% mm)." +msgstr "현재 레이어에 사용자 지정 Gcode(%1% mm)." + +#: src/slic3r/GUI/DoubleSlider.cpp:1600 +msgid "Enter short message shown on Printer display during pause print" +msgstr "" +"일시 정지시 인쇄 중에 프린터 디스플레이에 표시된 짧은 메시지를 입력합니다." + +#: src/slic3r/GUI/DoubleSlider.cpp:1601 +msgid "Message for pause print on current layer (%1% mm)." +msgstr "현재 레이어에서 일시 중지 인쇄를 위한 메시지(%1% mm)." + +#: src/slic3r/GUI/DoubleSlider.cpp:1616 +msgid "Enter print z value to jump to" +msgstr "인쇄 z 값을 입력하여" + +#: src/slic3r/GUI/DoubleSlider.cpp:1617 +msgid "Jump to print z" +msgstr "Z 인쇄로 이동" + +#: src/slic3r/GUI/DoubleSlider.cpp:1871 +msgid "" +"The last color change data was saved for a single extruder printer profile." +msgstr "" +"단일 압출기 프린터 프로파일에 대해 마지막 색상 변경 데이터가 저장되었습니다." + +#: src/slic3r/GUI/DoubleSlider.cpp:1872 +msgid "" +"The last color change data was saved for a multiple extruder printer profile." +msgstr "" +"여러 압출기 프린터 프로파일에 대해 마지막 색상 변경 데이터가 저장되었습니다." + +#: src/slic3r/GUI/DoubleSlider.cpp:1874 +msgid "Your current changes will cause a deletion of all saved color changes." +msgstr "현재 변경으로 인해 저장된 모든 색상 변경 내용이 삭제됩니다." + +#: src/slic3r/GUI/DoubleSlider.cpp:1875 src/slic3r/GUI/DoubleSlider.cpp:1896 +msgid "Are you sure you want to continue?" +msgstr "정말 계속하기를 원하십니까?" + +#: src/slic3r/GUI/DoubleSlider.cpp:1888 +msgid "The last color change data was saved for a multi extruder printing." +msgstr "다중 압출기 인쇄를 위해 마지막 색상 변경 데이터가 저장되었습니다." + +#: src/slic3r/GUI/DoubleSlider.cpp:1889 +msgid "" +"Select YES if you want to delete all saved tool changes, \n" +"\tNO if you want all tool changes switch to color changes, \n" +"\tor CANCEL for do nothing" +msgstr "" +"저장된 도구 변경 내용을 모두 삭제하려면 YES를 선택합니다. \n" +"\t아니오 모든 도구 변경 이 색상 변경으로 전환하려면 \n" +"\t또는 아무것도 하지 않는 취소" + +#: src/slic3r/GUI/DoubleSlider.cpp:1892 +msgid "Do you want to delete all saved tool changes?" +msgstr "저장된 도구 변경 내용을 모두 삭제하시겠습니까?" + +#: src/slic3r/GUI/DoubleSlider.cpp:1894 +msgid "" +"The last color change data was saved for a multi extruder printing with tool " +"changes for whole print." +msgstr "" +"마지막 색상 변경 데이터는 전체 인쇄에 대한 도구 변경이 있는 다중 압출기 인쇄" +"를 위해 저장되었습니다." + +#: src/slic3r/GUI/DoubleSlider.cpp:1895 +msgid "Your current changes will cause a deletion of all saved tool changes." +msgstr "현재 변경 으로 인해 저장된 모든 도구 변경 내용이 삭제됩니다." + +#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:23 +msgid "Set extruder sequence" +msgstr "압출기 시퀀스 설정" + +#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:39 +msgid "Set extruder change for every" +msgstr "모든 압출기 변경 설정" + +#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:52 +#: src/libslic3r/PrintConfig.cpp:352 src/libslic3r/PrintConfig.cpp:995 +#: src/libslic3r/PrintConfig.cpp:1514 src/libslic3r/PrintConfig.cpp:1699 +#: src/libslic3r/PrintConfig.cpp:1760 src/libslic3r/PrintConfig.cpp:1940 +#: src/libslic3r/PrintConfig.cpp:1986 +msgid "layers" +msgstr "레이어" + +#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:136 +msgid "Set extruder(tool) sequence" +msgstr "돌출기(도구) 시퀀스 설정" + +#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:182 +msgid "Remove extruder from sequence" +msgstr "시퀀스에서 압출기 제거" + +#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:192 +msgid "Add extruder to sequence" +msgstr "시퀀스에 압출기 추가" + +#: src/slic3r/GUI/Field.cpp:131 msgid "default value" msgstr "기본값" -#: src/slic3r/GUI/Field.cpp:128 +#: src/slic3r/GUI/Field.cpp:134 msgid "parameter name" msgstr "매개 변수 명칭" -#: src/slic3r/GUI/Field.cpp:139 +#: src/slic3r/GUI/Field.cpp:145 src/slic3r/GUI/OptionsGroup.cpp:570 msgid "N/A" msgstr "N/A" -#: src/slic3r/GUI/Field.cpp:158 +#: src/slic3r/GUI/Field.cpp:170 #, c-format msgid "%s doesn't support percentage" msgstr "%s 이(가) 백분율을 지원하지 않음" -#: src/slic3r/GUI/Field.cpp:174 src/slic3r/GUI/Field.cpp:197 +#: src/slic3r/GUI/Field.cpp:190 src/slic3r/GUI/Field.cpp:221 +#: src/slic3r/GUI/GUI_ObjectLayers.cpp:376 msgid "Invalid numeric input." msgstr "숫자 입력이 잘못 되었습니다." -#: src/slic3r/GUI/Field.cpp:179 +#: src/slic3r/GUI/Field.cpp:199 msgid "Input value is out of range" -msgstr "Input value is out of range" +msgstr "입력 값이 범위를 벗어났습니다." -#: src/slic3r/GUI/Field.cpp:206 +#: src/slic3r/GUI/Field.cpp:235 #, c-format msgid "" "Do you mean %s%% instead of %s %s?\n" @@ -680,9 +1294,9 @@ msgid "" msgstr "" "%s %s 대신 %s%%을 하려고 합니까?\n" "이 값을 %s%%, 로 변경하려면 YES를 선택하십시오. \n" -"또는 %s %s 이(가) 올바른 값인지 확인하는 경우 NO를 선택하세요. " +"또는 %s %s 이(가) 올바른 값인지 확인하는 경우 NO를 선택하세요." -#: src/slic3r/GUI/Field.cpp:209 +#: src/slic3r/GUI/Field.cpp:238 msgid "Parameter validation" msgstr "매개 변수 유효성 검사" @@ -731,8 +1345,7 @@ msgstr "" #, c-format msgid "" "Multiple %s devices found. Please only connect one at a time for flashing." -msgstr "" -"여러 %s 장치를 찾았습니다. 깜박이는 경우에는 한 번에 하나씩만 연결 하십시오." +msgstr "여러 %s 장치를 찾았습니다. 깜박이면 한 번에 하나씩만 연결하십시오." #: src/slic3r/GUI/FirmwareDialog.cpp:436 #, c-format @@ -741,8 +1354,8 @@ msgid "" "If the device is connected, please press the Reset button next to the USB " "connector ..." msgstr "" -"%s 장치를 찾을 하지 않았습니다.\n" -"장치가 연결 된 경우 USB 커넥터 옆에 있는 리셋 단추를 누르십시오." +"%s 장치를 찾을 수 없습니다.\n" +"장치가 연결되어 있는 경우 USB 커넥터 옆에 있는 리셋 버튼을 누르십시오..." #: src/slic3r/GUI/FirmwareDialog.cpp:548 #, c-format @@ -767,8 +1380,8 @@ msgstr "펌웨어 업로드" msgid "Firmware image:" msgstr "펌웨어 이미지:" -#: src/slic3r/GUI/FirmwareDialog.cpp:805 src/slic3r/GUI/Tab.cpp:1824 -#: src/slic3r/GUI/Tab.cpp:1880 +#: src/slic3r/GUI/FirmwareDialog.cpp:805 src/slic3r/GUI/Tab.cpp:1649 +#: src/slic3r/GUI/Tab.cpp:1705 msgid "Browse" msgstr "검색" @@ -801,11 +1414,12 @@ msgid "Advanced: Output log" msgstr "고급: 출력 로그" #: src/slic3r/GUI/FirmwareDialog.cpp:852 +#: src/slic3r/GUI/Mouse3DController.cpp:387 #: src/slic3r/GUI/PrintHostDialogs.cpp:161 msgid "Close" msgstr "닫기" -#: src/slic3r/GUI/FirmwareDialog.cpp:903 +#: src/slic3r/GUI/FirmwareDialog.cpp:902 msgid "" "Are you sure you want to cancel firmware flashing?\n" "This could leave your printer in an unusable state!" @@ -813,147 +1427,317 @@ msgstr "" "새펌웨어 적용을 취소하시겠습니까?\n" "프린터가 사용할 수 없는 상태가 될 수 있습니다!" -#: src/slic3r/GUI/FirmwareDialog.cpp:904 +#: src/slic3r/GUI/FirmwareDialog.cpp:903 msgid "Confirmation" msgstr "확인" -#: src/slic3r/GUI/FirmwareDialog.cpp:907 +#: src/slic3r/GUI/FirmwareDialog.cpp:906 msgid "Cancelling..." msgstr "취소 중...." -#: src/slic3r/GUI/GLCanvas3D.cpp:526 -msgid "Layers heights" -msgstr "레이어 높이" +#: src/slic3r/GUI/GLCanvas3D.cpp:239 src/slic3r/GUI/GLCanvas3D.cpp:4622 +msgid "Variable layer height" +msgstr "가변 레이어 높이" -#: src/slic3r/GUI/GLCanvas3D.cpp:623 +#: src/slic3r/GUI/GLCanvas3D.cpp:242 +msgid "Left mouse button:" +msgstr "왼쪽 마우스 단추:" + +#: src/slic3r/GUI/GLCanvas3D.cpp:245 +msgid "Add detail" +msgstr "디테일 추가" + +#: src/slic3r/GUI/GLCanvas3D.cpp:248 +msgid "Right mouse button:" +msgstr "오른쪽 마우스 버튼:" + +#: src/slic3r/GUI/GLCanvas3D.cpp:251 +msgid "Remove detail" +msgstr "디테일 제거" + +#: src/slic3r/GUI/GLCanvas3D.cpp:254 +msgid "Shift + Left mouse button:" +msgstr "시프트 + 왼쪽 마우스 버튼:" + +#: src/slic3r/GUI/GLCanvas3D.cpp:257 +msgid "Reset to base" +msgstr "기본으로 재설정" + +#: src/slic3r/GUI/GLCanvas3D.cpp:260 +msgid "Shift + Right mouse button:" +msgstr "시프트 + 오른쪽 마우스 버튼:" + +#: src/slic3r/GUI/GLCanvas3D.cpp:263 +msgid "Smoothing" +msgstr "부드럽게" + +#: src/slic3r/GUI/GLCanvas3D.cpp:266 +msgid "Mouse wheel:" +msgstr "마우스 휠: " + +#: src/slic3r/GUI/GLCanvas3D.cpp:269 +msgid "Increase/decrease edit area" +msgstr "편집 영역 증가/감소" + +#: src/slic3r/GUI/GLCanvas3D.cpp:272 +msgid "Adaptive" +msgstr "어뎁티브" + +#: src/slic3r/GUI/GLCanvas3D.cpp:278 +msgid "Quality / Speed" +msgstr "품질 / 속도" + +#: src/slic3r/GUI/GLCanvas3D.cpp:282 +msgid "Higher print quality versus higher print speed." +msgstr "인쇄 품질이 높고 인쇄 속도가 빨라질 수 있습니다." + +#: src/slic3r/GUI/GLCanvas3D.cpp:293 +msgid "Smooth" +msgstr "부드럽게" + +#: src/slic3r/GUI/GLCanvas3D.cpp:299 src/libslic3r/PrintConfig.cpp:511 +msgid "Radius" +msgstr " 반지름" + +#: src/slic3r/GUI/GLCanvas3D.cpp:309 +msgid "Keep min" +msgstr "최소 유지" + +#: src/slic3r/GUI/GLCanvas3D.cpp:318 +msgid "Reset" +msgstr "초기화" + +#: src/slic3r/GUI/GLCanvas3D.cpp:604 +msgid "Variable layer height - Manual edit" +msgstr "가변 레이어 높이 - 수동 편집" + +#: src/slic3r/GUI/GLCanvas3D.cpp:690 msgid "An object outside the print area was detected" -msgstr "인쇄 영역 밖에 있는 개체가 감지 되었습니다" +msgstr "인쇄 영역 밖에 있는 객체(object)가 감지 되었습니다" -#: src/slic3r/GUI/GLCanvas3D.cpp:624 +#: src/slic3r/GUI/GLCanvas3D.cpp:691 msgid "A toolpath outside the print area was detected" msgstr "인쇄 영역 밖에 있는 공구 경로가 감지 되었습니다" -#: src/slic3r/GUI/GLCanvas3D.cpp:625 +#: src/slic3r/GUI/GLCanvas3D.cpp:692 msgid "SLA supports outside the print area were detected" -msgstr "인쇄 영역 외부의 SLA 지원 감지 됨" +msgstr "인쇄 영역 외부의 SLA 서포트가 감지 됨" -#: src/slic3r/GUI/GLCanvas3D.cpp:626 -msgid "Some objects are not visible when editing supports" -msgstr "편집 지원 시 일부 객체가 표시 되지 않음" +#: src/slic3r/GUI/GLCanvas3D.cpp:693 +msgid "Some objects are not visible" +msgstr "일부 개체가 표시되지 않습니다" -#: src/slic3r/GUI/GLCanvas3D.cpp:628 +#: src/slic3r/GUI/GLCanvas3D.cpp:695 msgid "" "An object outside the print area was detected\n" "Resolve the current problem to continue slicing" msgstr "" -"인쇄 영역 밖에 있는 개체가 감지 되었습니다.\n" -"현재 문제를 해결 하여 슬라이싱을 계속 합니다" +"인쇄 영역 밖에 있는 객체(object)가 감지 되었습니다.\n" +"현재 문제를 해결하고 슬라이싱을 계속 합니다" -#: src/slic3r/GUI/GLCanvas3D.cpp:1711 +#: src/slic3r/GUI/GLCanvas3D.cpp:909 src/slic3r/GUI/GLCanvas3D.cpp:938 +msgid "Default print color" +msgstr "기본 인쇄 색상" + +#: src/slic3r/GUI/GLCanvas3D.cpp:939 src/slic3r/GUI/GLCanvas3D.cpp:948 +#: src/slic3r/GUI/GLCanvas3D.cpp:987 +msgid "Pause print or custom G-code" +msgstr "인쇄 또는 사용자 지정 G-코드 일시 중지" + +#: src/slic3r/GUI/GLCanvas3D.cpp:960 +#, c-format +msgid "up to %.2f mm" +msgstr "최대%.2f mm" + +#: src/slic3r/GUI/GLCanvas3D.cpp:964 +#, c-format +msgid "above %.2f mm" +msgstr "above %.2f mm" + +#: src/slic3r/GUI/GLCanvas3D.cpp:968 +#, c-format +msgid "%.2f - %.2f mm" +msgstr "%.2f - %.2f mm" + +#: src/slic3r/GUI/GLCanvas3D.cpp:995 +#, c-format +msgid "Color change for Extruder %d at %.2f mm" +msgstr "압출기 %d의 색상 변화 %.2f mm" + +#: src/slic3r/GUI/GLCanvas3D.cpp:1306 +msgid "Seq." +msgstr "순서" + +#: src/slic3r/GUI/GLCanvas3D.cpp:1705 +msgid "Variable layer height - Reset" +msgstr "가변 레이어 높이 - 재설정" + +#: src/slic3r/GUI/GLCanvas3D.cpp:1713 +msgid "Variable layer height - Adaptive" +msgstr "가변 레이어 높이 - 어뎁티브" + +#: src/slic3r/GUI/GLCanvas3D.cpp:1721 +msgid "Variable layer height - Smooth all" +msgstr "가변 레이어 높이 - 모두 부드럽게" + +#: src/slic3r/GUI/GLCanvas3D.cpp:2075 msgid "Mirror Object" -msgstr "오브젝트 미러" +msgstr "객체(object) 반전" -#: src/slic3r/GUI/GLCanvas3D.cpp:2872 +#: src/slic3r/GUI/GLCanvas3D.cpp:2945 +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:571 +msgid "Gizmo-Move" +msgstr "개체(Gizmo) 이동" + +#: src/slic3r/GUI/GLCanvas3D.cpp:3025 +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:573 +msgid "Gizmo-Rotate" +msgstr "개체(Gizmo) 회전" + +#: src/slic3r/GUI/GLCanvas3D.cpp:3538 msgid "Move Object" -msgstr "오브젝트 이동" +msgstr "객체(object) 이동" -#: src/slic3r/GUI/GLCanvas3D.cpp:3389 src/slic3r/GUI/GLCanvas3D.cpp:3609 -#: src/slic3r/GUI/MainFrame.cpp:559 -msgid "Undo" -msgstr "실행 취소" +#: src/slic3r/GUI/GLCanvas3D.cpp:4085 +msgid "Undo History" +msgstr "실행취소 기록" -#: src/slic3r/GUI/GLCanvas3D.cpp:3389 src/slic3r/GUI/GLCanvas3D.cpp:3639 -#: src/slic3r/GUI/MainFrame.cpp:562 -msgid "Redo" -msgstr "다시 실행" +#: src/slic3r/GUI/GLCanvas3D.cpp:4085 +msgid "Redo History" +msgstr "다시 실행 히스토리" -#: src/slic3r/GUI/GLCanvas3D.cpp:3395 +#: src/slic3r/GUI/GLCanvas3D.cpp:4103 #, c-format -msgid "%s Stack" -msgstr "%s 스택" +msgid "Undo %1$d Action" +msgid_plural "Undo %1$d Actions" +msgstr[0] "실행 취소 %1$d 작업" -#: src/slic3r/GUI/GLCanvas3D.cpp:3413 +#: src/slic3r/GUI/GLCanvas3D.cpp:4103 #, c-format -msgid "%s %d Action" -msgstr "%s %d 액션" +msgid "Redo %1$d Action" +msgid_plural "Redo %1$d Actions" +msgstr[0] "작업 %1$d 다시 실행" -#: src/slic3r/GUI/GLCanvas3D.cpp:3460 +#: src/slic3r/GUI/GLCanvas3D.cpp:4516 msgid "Add..." msgstr "추가..." -#: src/slic3r/GUI/GLCanvas3D.cpp:3468 src/slic3r/GUI/GUI_ObjectList.cpp:1434 -#: src/slic3r/GUI/Plater.cpp:3467 src/slic3r/GUI/Plater.cpp:3486 -#: src/slic3r/GUI/Tab.cpp:3204 +#: src/slic3r/GUI/GLCanvas3D.cpp:4524 src/slic3r/GUI/GUI_ObjectList.cpp:1697 +#: src/slic3r/GUI/Plater.cpp:3942 src/slic3r/GUI/Plater.cpp:3969 +#: src/slic3r/GUI/Tab.cpp:3094 msgid "Delete" msgstr "지우기 " -#: src/slic3r/GUI/GLCanvas3D.cpp:3477 src/slic3r/GUI/Plater.cpp:4075 +#: src/slic3r/GUI/GLCanvas3D.cpp:4533 src/slic3r/GUI/Plater.cpp:4693 msgid "Delete all" msgstr "전부 지우기" -#: src/slic3r/GUI/GLCanvas3D.cpp:3486 src/slic3r/GUI/KBShortcutsDialog.cpp:134 -#: src/slic3r/GUI/Plater.cpp:2636 +#: src/slic3r/GUI/GLCanvas3D.cpp:4542 src/slic3r/GUI/KBShortcutsDialog.cpp:137 +#: src/slic3r/GUI/Plater.cpp:2740 msgid "Arrange" msgstr "정렬" -#: src/slic3r/GUI/GLCanvas3D.cpp:3486 +#: src/slic3r/GUI/GLCanvas3D.cpp:4542 src/slic3r/GUI/KBShortcutsDialog.cpp:138 msgid "Arrange selection" msgstr "선택 정렬" -#: src/slic3r/GUI/GLCanvas3D.cpp:3498 +#: src/slic3r/GUI/GLCanvas3D.cpp:4554 msgid "Copy" msgstr "복사" -#: src/slic3r/GUI/GLCanvas3D.cpp:3507 +#: src/slic3r/GUI/GLCanvas3D.cpp:4563 msgid "Paste" msgstr "붙여넣기" -#: src/slic3r/GUI/GLCanvas3D.cpp:3519 +#: src/slic3r/GUI/GLCanvas3D.cpp:4575 src/slic3r/GUI/Plater.cpp:3799 +#: src/slic3r/GUI/Plater.cpp:3811 src/slic3r/GUI/Plater.cpp:3956 msgid "Add instance" msgstr "복제본 추가" -#: src/slic3r/GUI/GLCanvas3D.cpp:3530 +#: src/slic3r/GUI/GLCanvas3D.cpp:4586 src/slic3r/GUI/Plater.cpp:3958 msgid "Remove instance" msgstr "복제본 제거" -#: src/slic3r/GUI/GLCanvas3D.cpp:3543 +#: src/slic3r/GUI/GLCanvas3D.cpp:4599 msgid "Split to objects" -msgstr "객체로 분할" +msgstr "객체(object)별 분할" -#: src/slic3r/GUI/GLCanvas3D.cpp:3553 src/slic3r/GUI/GUI_ObjectList.cpp:1280 +#: src/slic3r/GUI/GLCanvas3D.cpp:4609 src/slic3r/GUI/GUI_ObjectList.cpp:1485 msgid "Split to parts" -msgstr "파트로 분할" +msgstr "부품(Part)별 분할" -#: src/slic3r/GUI/GLCanvas3D.cpp:3566 -msgid "Layers editing" -msgstr "레이어층을 편집" +#: src/slic3r/GUI/GLCanvas3D.cpp:4673 src/slic3r/GUI/MainFrame.cpp:581 +msgid "Undo" +msgstr "되돌리기" -#: src/slic3r/GUI/GLCanvas3D.cpp:5623 +#: src/slic3r/GUI/GLCanvas3D.cpp:4673 src/slic3r/GUI/GLCanvas3D.cpp:4706 +msgid "Click right mouse button to open History" +msgstr "마우스 오른쪽 버튼을 클릭하여 기록을 엽니다." + +#: src/slic3r/GUI/GLCanvas3D.cpp:4690 +msgid "Next Undo action: %1%" +msgstr "다음 작업 실행 취소 : %1%" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4706 src/slic3r/GUI/MainFrame.cpp:584 +msgid "Redo" +msgstr "다시실행" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4722 +msgid "Next Redo action: %1%" +msgstr "다음 작업 다시 실행: %1%" + +#: src/slic3r/GUI/GLCanvas3D.cpp:6659 msgid "Selection-Add from rectangle" -msgstr "사각형에서 선택-추가" +msgstr "선택-사각형에서 추가" -#: src/slic3r/GUI/GLCanvas3D.cpp:5642 +#: src/slic3r/GUI/GLCanvas3D.cpp:6678 msgid "Selection-Remove from rectangle" msgstr "선택- 사각형에서 제거" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:40 -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:144 src/libslic3r/PrintConfig.cpp:3176 +#: src/slic3r/GUI/GLCanvas3DManager.cpp:284 +#, c-format +msgid "" +"PrusaSlicer requires OpenGL 2.0 capable graphics driver to run correctly, \n" +"while OpenGL version %s, render %s, vendor %s was detected." +msgstr "" +"PrusaSlicer 제대로 실행하려면 OpenGL 2.0 가능한 그래픽 드라이버가 필요합니" +"다. \n" +"OpenGL 버전 %s, 렌더링 %s 동안, 공급 업체 %s가 감지되었습니다." + +#: src/slic3r/GUI/GLCanvas3DManager.cpp:287 +msgid "You may need to update your graphics card driver." +msgstr "그래픽 카드 드라이버를 업데이트해야 할 수 있습니다." + +#: src/slic3r/GUI/GLCanvas3DManager.cpp:290 +msgid "" +"As a workaround, you may run PrusaSlicer with a software rendered 3D " +"graphics by running prusa-slicer.exe with the --sw_renderer parameter." +msgstr "" +"해결 방법으로 prusaSlicer를 \"sw_renderer 매개 변수\"로 prusa-slicer.exe를 실" +"행하여 3D 그래픽을 렌더링한 소프트웨어로 실행할 수 있습니다." + +#: src/slic3r/GUI/GLCanvas3DManager.cpp:292 +msgid "Unsupported OpenGL version" +msgstr "지원되지 않는 OpenGL 버전" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:42 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:144 src/libslic3r/PrintConfig.cpp:3397 msgid "Cut" msgstr "자르기" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:149 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:168 msgid "Keep upper part" msgstr "상위 부분 유지" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:150 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:169 msgid "Keep lower part" msgstr "낮은 부분 유지" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:151 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:170 msgid "Rotate lower part upwards" msgstr "아래쪽 부분을 위쪽으로 회전" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:154 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:175 msgid "Perform cut" msgstr "절단 실행" @@ -961,906 +1745,1069 @@ msgstr "절단 실행" msgid "Place on face" msgstr "면 배치 " +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:41 +msgid "Hollow this object" +msgstr "이 개체를 비우기" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:42 +msgid "Preview hollowed and drilled model" +msgstr "미리 보기 중이 비어 있고 드릴된 모델" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:43 +msgid "Offset" +msgstr "오프셋" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:44 +msgid "Quality" +msgstr "품질" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:45 +msgid "Closing distance" +msgstr "닫힘 거리" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:46 +msgid "Hole diameter" +msgstr "구멍 직경" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:47 +msgid "Hole depth" +msgstr "구멍 깊이" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:48 +msgid "Remove selected holes" +msgstr "선택한 구멍 제거" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:49 +msgid "Remove all holes" +msgstr "모든 구멍 제거" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:50 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:58 +msgid "Clipping of view" +msgstr "갈무리된것 보기" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:51 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:59 +msgid "Reset direction" +msgstr "방향 재설정" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:52 +msgid "Show supports" +msgstr "서포트 표시" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:413 +msgid "Add drainage hole" +msgstr "배수 구멍 추가" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:530 +msgid "Delete drainage hole" +msgstr "배수 구멍 삭제" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:786 +msgid "Hollowing parameter change" +msgstr "공동화 매개변수 변경" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:858 +msgid "Change drainage hole diameter" +msgstr "배수 구멍 직경 변경" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:948 +msgid "Hollowing and drilling" +msgstr "공동화 및 드릴링" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:1027 +msgid "Move drainage hole" +msgstr "구멍 이동" + #: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:48 msgid "Move" msgstr "이동" -#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:177 -msgid "Position (mm)" -msgstr "위치 (mm)" - -#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:177 -msgid "Displacement (mm)" -msgstr "변위 (mm)" - #: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:449 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:466 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:485 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:503 -#: src/libslic3r/PrintConfig.cpp:3225 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:480 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:499 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:517 +#: src/libslic3r/PrintConfig.cpp:3446 msgid "Rotate" msgstr "회전" -#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:482 -msgid "Rotation (deg)" -msgstr "회전 (°)" - #: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:47 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:390 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:486 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:504 -#: src/libslic3r/PrintConfig.cpp:3240 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:230 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:500 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:518 +#: src/libslic3r/PrintConfig.cpp:3461 msgid "Scale" msgstr "크기" -#: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:292 -msgid "Scale (%)" -msgstr "스케일 (%)" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:44 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:48 msgid "Head diameter" msgstr "헤드 지름" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:45 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:49 msgid "Lock supports under new islands" -msgstr "새 고립 영역에서 잠금 지원" +msgstr "새영역에서 서포트 잠금 지원" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:46 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1427 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:50 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1350 msgid "Remove selected points" -msgstr "선택한 점 제거" +msgstr "선택한 지점 제거" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:47 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:51 msgid "Remove all points" -msgstr "모든 점 제거" +msgstr "모든 지점 제거" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:48 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1430 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:52 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1353 msgid "Apply changes" msgstr "변경 내용을 적용" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:49 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1431 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:53 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1354 msgid "Discard changes" msgstr "변경사항을 취소" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:50 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:54 msgid "Minimal points distance" -msgstr "최소 포인트 거리" +msgstr "최소한의 지점 거리" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:51 -#: src/libslic3r/PrintConfig.cpp:2620 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:55 +#: src/libslic3r/PrintConfig.cpp:2765 msgid "Support points density" -msgstr "지원 포인트 밀도" +msgstr "서포트 지점 밀도" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:52 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1433 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:56 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1356 msgid "Auto-generate points" -msgstr "점 자동 생성" +msgstr "지점 자동 생성" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:53 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:57 msgid "Manual editing" msgstr "수동 편집" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:54 -msgid "Clipping of view" -msgstr "클랩핑된것 보기" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:55 -msgid "Reset direction" -msgstr "방향 재설정" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:531 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:479 msgid "Add support point" msgstr "서포트 지점 추가" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:720 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:615 msgid "Delete support point" msgstr "서포트 지점 삭제" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:925 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:804 msgid "Change point head diameter" -msgstr "변경 점 헤드 지름" +msgstr "변경된 해드의 끝 점 지름" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:991 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:872 msgid "Support parameter change" msgstr "서포트 매개 변수 변경" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1099 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:978 msgid "SLA Support Points" msgstr "SLA 지원 포인트" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1138 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:999 +msgid "SLA gizmo turned on" +msgstr "SLA 개체(gizmo)이동 켜기" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1024 msgid "Do you want to save your manually edited support points?" -msgstr "수동으로 편집한 서포트 지점을 저장 하 시겠습니까?" +msgstr "수동으로 편집한 서포트 지점을 저장 하시 겠습니까?" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1139 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1025 msgid "Save changes?" -msgstr "변경 사항을 저장 하 시겠습니까?" +msgstr "변경 사항을 저장 하시겠습니까?" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1183 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1037 +msgid "SLA gizmo turned off" +msgstr "SLA 개체(gizmo) 이동 끄기" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1076 msgid "Move support point" -msgstr "서포트 점 이동" +msgstr "서포트 지점 이동" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1282 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1175 msgid "Support points edit" -msgstr "서포트 포인트 편집" +msgstr "서포트 지점 편집" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1333 -msgid "" -"Autogeneration will erase all manually edited points.\n" -"\n" -"Are you sure you want to do it?\n" -msgstr "" -"자동 생성은 수동으로 편집한 모든 점을 지웁니다.\n" -"\n" -"그렇게 하시겠습니까?\n" +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1247 +msgid "Autogeneration will erase all manually edited points." +msgstr "자동 생성은 수동으로 편집한 모든 점을 지웁히 지웁습니다." -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1335 src/slic3r/GUI/GUI.cpp:289 -#: src/slic3r/GUI/WipeTowerDialog.cpp:44 src/slic3r/GUI/WipeTowerDialog.cpp:328 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1248 +msgid "Are you sure you want to do it?" +msgstr "당신은 그것을 하시겠습니까?" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1249 src/slic3r/GUI/GUI.cpp:246 +#: src/slic3r/GUI/Tab.cpp:3054 src/slic3r/GUI/WipeTowerDialog.cpp:45 +#: src/slic3r/GUI/WipeTowerDialog.cpp:366 msgid "Warning" msgstr "위험" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1338 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1252 msgid "Autogenerate support points" msgstr "서포트 자동 생성" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1390 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1313 msgid "SLA gizmo keyboard shortcuts" -msgstr "SLA 장치바로 가기" +msgstr "SLA 장치 바로 가기" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1401 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1324 msgid "Note: some shortcuts work in (non)editing mode only." msgstr "참고: 일부 단축키는 (비)편집 모드 에서만 작동 합니다." -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1419 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1422 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1423 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1342 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1345 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1346 msgid "Left click" msgstr "왼쪽 클릭" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1419 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1342 msgid "Add point" -msgstr "점 추가" +msgstr "지점 추가" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1420 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1343 msgid "Right click" msgstr "오른쪽 클릭" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1420 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1343 msgid "Remove point" msgstr "복제본 제거" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1421 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1424 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1425 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1344 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1347 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1348 msgid "Drag" msgstr "드래그" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1421 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1344 msgid "Move point" -msgstr "점 이동" +msgstr "지점 이동" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1422 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1345 msgid "Add point to selection" -msgstr "선택 영역에 점 추가" +msgstr "선택 영역에 지점 추가" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1423 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1346 msgid "Remove point from selection" -msgstr "선택 영역에서 점 제거" +msgstr "선택 영역에서 지점 제거" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1424 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1347 msgid "Select by rectangle" msgstr "직사각형으로 선택" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1425 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1348 msgid "Deselect by rectangle" msgstr "사각형으로 선택 해제" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1426 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1349 msgid "Select all points" -msgstr "모든 점 선택" +msgstr "모든 지점들 선택" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1428 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1351 msgid "Mouse wheel" msgstr "마우스 휠" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1428 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1351 msgid "Move clipping plane" -msgstr "클립핑 평면 이동" +msgstr "갈무리된 평면 이동" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1429 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1352 msgid "Reset clipping plane" -msgstr "클립핑 평면 재설정" +msgstr "갈무리된 평면 재설정" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1432 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1355 msgid "Switch to editing mode" msgstr "편집 모드로 전환" -#: src/slic3r/GUI/GUI.cpp:141 src/slic3r/GUI/Tab.cpp:3063 -msgid "It's impossible to print multi-part object(s) with SLA technology." -msgstr "SLA 방식을 사용 하여 멀티파트를 인쇄할 수는 없습니다." +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:498 +msgid "Gizmo-Place on Face" +msgstr "개체(Gizmo)를 배드위로" -#: src/slic3r/GUI/GUI.cpp:142 -msgid "Please check and fix your object list." -msgstr "개체 목록을 확인 하고 수정 하십시오." +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:572 +msgid "Gizmo-Scale" +msgstr "개체(Gizmo) 배율" -#: src/slic3r/GUI/GUI.cpp:143 src/slic3r/GUI/Plater.cpp:2213 -#: src/slic3r/GUI/Tab.cpp:3065 -msgid "Attention!" -msgstr "주목!" +#: src/slic3r/GUI/GUI_App.cpp:138 +#, c-format +msgid "" +"%s has encountered an error. It was likely caused by running out of memory. " +"If you are sure you have enough RAM on your system, this may also be a bug " +"and we would be glad if you reported it.\n" +"\n" +"The application will now terminate." +msgstr "" +"%s에서 오류가 발생했습니다. 메모리 부족으로 인해 발생했을 수 있습니다. 시스템" +"에 충분한 RAM이 있다고 확신하는 경우 버그가 될 수 있으며 보고하면 기쁠 것입니" +"다.\n" +"\n" +"이제 응용 프로그램이 종료됩니다." -#: src/slic3r/GUI/GUI.cpp:283 -msgid "Notice" -msgstr "공지" +#: src/slic3r/GUI/GUI_App.cpp:141 +msgid "Fatal error" +msgstr "치명적인 오류" -#: src/slic3r/GUI/GUI_App.cpp:435 +#: src/slic3r/GUI/GUI_App.cpp:442 msgid "Changing of an application language" msgstr "응용 프로그램 언어 변경" -#: src/slic3r/GUI/GUI_App.cpp:443 src/slic3r/GUI/GUI_App.cpp:452 +#: src/slic3r/GUI/GUI_App.cpp:450 src/slic3r/GUI/GUI_App.cpp:459 msgid "Recreating" msgstr "재현" -#: src/slic3r/GUI/GUI_App.cpp:456 +#: src/slic3r/GUI/GUI_App.cpp:466 msgid "Loading of current presets" -msgstr "현재 프리셋 불러오기" +msgstr "현재 기본 설정을 불러오기" -#: src/slic3r/GUI/GUI_App.cpp:464 +#: src/slic3r/GUI/GUI_App.cpp:474 msgid "Loading of a mode view" -msgstr "모드 보기 로드" +msgstr "보기 모드를 불러오기" -#: src/slic3r/GUI/GUI_App.cpp:544 +#: src/slic3r/GUI/GUI_App.cpp:555 msgid "Choose one file (3MF/AMF):" msgstr "파일(3MF/AMF) 선택:" -#: src/slic3r/GUI/GUI_App.cpp:556 +#: src/slic3r/GUI/GUI_App.cpp:567 msgid "Choose one or more files (STL/OBJ/AMF/3MF/PRUSA):" msgstr "파일을 선택하세요 (STL/OBJ/AMF/3MF/PRUSA):" -#: src/slic3r/GUI/GUI_App.cpp:598 +#: src/slic3r/GUI/GUI_App.cpp:629 msgid "Select the language" msgstr "언어를 선택" -#: src/slic3r/GUI/GUI_App.cpp:599 +#: src/slic3r/GUI/GUI_App.cpp:629 msgid "Language" msgstr "언어" -#: src/slic3r/GUI/GUI_App.cpp:750 -msgid "&Configuration Snapshots" -msgstr "구성 스냅숏" +#: src/slic3r/GUI/GUI_App.cpp:797 +#, c-format +msgid "Run %s" +msgstr "%s 실행" -#: src/slic3r/GUI/GUI_App.cpp:750 +#: src/slic3r/GUI/GUI_App.cpp:800 +msgid "&Configuration Snapshots" +msgstr "구성 스냅샷" + +#: src/slic3r/GUI/GUI_App.cpp:800 msgid "Inspect / activate configuration snapshots" msgstr "구성 스냅 샷 검사 / 활성화" -#: src/slic3r/GUI/GUI_App.cpp:751 +#: src/slic3r/GUI/GUI_App.cpp:801 msgid "Take Configuration &Snapshot" msgstr "구성 스냅 샷 가져 오기" -#: src/slic3r/GUI/GUI_App.cpp:751 +#: src/slic3r/GUI/GUI_App.cpp:801 msgid "Capture a configuration snapshot" msgstr "구성 스냅 샷 캡처" -#: src/slic3r/GUI/GUI_App.cpp:754 +#: src/slic3r/GUI/GUI_App.cpp:802 +msgid "Check for updates" +msgstr "업데이트 확인" + +#: src/slic3r/GUI/GUI_App.cpp:802 +msgid "Check for configuration updates" +msgstr "구성 업데이트 확인" + +#: src/slic3r/GUI/GUI_App.cpp:804 msgid "&Preferences" msgstr "환경 설정" -#: src/slic3r/GUI/GUI_App.cpp:760 +#: src/slic3r/GUI/GUI_App.cpp:810 msgid "Application preferences" msgstr "응용 프로그램 환경 설정" -#: src/slic3r/GUI/GUI_App.cpp:763 src/slic3r/GUI/wxExtensions.cpp:2882 +#: src/slic3r/GUI/GUI_App.cpp:813 src/slic3r/GUI/wxExtensions.cpp:730 msgid "Simple" msgstr "단순" -#: src/slic3r/GUI/GUI_App.cpp:763 +#: src/slic3r/GUI/GUI_App.cpp:813 msgid "Simple View Mode" -msgstr "단순 보기 모드" +msgstr "기본 보기 모드" -#: src/slic3r/GUI/GUI_App.cpp:764 src/slic3r/GUI/GUI_ObjectList.cpp:93 -#: src/slic3r/GUI/GUI_ObjectList.cpp:567 src/slic3r/GUI/Tab.cpp:1037 -#: src/slic3r/GUI/Tab.cpp:1052 src/slic3r/GUI/Tab.cpp:1150 -#: src/slic3r/GUI/Tab.cpp:1153 src/slic3r/GUI/Tab.cpp:1649 -#: src/slic3r/GUI/Tab.cpp:2120 src/slic3r/GUI/Tab.cpp:3699 -#: src/slic3r/GUI/wxExtensions.cpp:2883 src/libslic3r/PrintConfig.cpp:83 -#: src/libslic3r/PrintConfig.cpp:197 src/libslic3r/PrintConfig.cpp:360 -#: src/libslic3r/PrintConfig.cpp:1013 src/libslic3r/PrintConfig.cpp:2226 +#: src/slic3r/GUI/GUI_App.cpp:814 src/slic3r/GUI/GUI_ObjectList.cpp:102 +#: src/slic3r/GUI/GUI_ObjectList.cpp:620 src/slic3r/GUI/Tab.cpp:1077 +#: src/slic3r/GUI/Tab.cpp:1092 src/slic3r/GUI/Tab.cpp:1191 +#: src/slic3r/GUI/Tab.cpp:1194 src/slic3r/GUI/Tab.cpp:1464 +#: src/slic3r/GUI/Tab.cpp:1951 src/slic3r/GUI/Tab.cpp:3633 +#: src/slic3r/GUI/wxExtensions.cpp:731 src/libslic3r/PrintConfig.cpp:88 +#: src/libslic3r/PrintConfig.cpp:213 src/libslic3r/PrintConfig.cpp:376 +#: src/libslic3r/PrintConfig.cpp:1038 src/libslic3r/PrintConfig.cpp:2286 msgid "Advanced" msgstr "고급" -#: src/slic3r/GUI/GUI_App.cpp:764 +#: src/slic3r/GUI/GUI_App.cpp:814 msgid "Advanced View Mode" msgstr "고급 보기 모드" -#: src/slic3r/GUI/GUI_App.cpp:765 src/slic3r/GUI/wxExtensions.cpp:2884 +#: src/slic3r/GUI/GUI_App.cpp:815 src/slic3r/GUI/wxExtensions.cpp:732 msgid "Expert" msgstr "전문가" -#: src/slic3r/GUI/GUI_App.cpp:765 +#: src/slic3r/GUI/GUI_App.cpp:815 msgid "Expert View Mode" msgstr "전문가 보기 모드" -#: src/slic3r/GUI/GUI_App.cpp:770 +#: src/slic3r/GUI/GUI_App.cpp:820 msgid "Mode" msgstr "모드" -#: src/slic3r/GUI/GUI_App.cpp:770 +#: src/slic3r/GUI/GUI_App.cpp:820 #, c-format msgid "%s View Mode" msgstr "%s 보기 모드" -#: src/slic3r/GUI/GUI_App.cpp:772 +#: src/slic3r/GUI/GUI_App.cpp:822 msgid "Change Application &Language" msgstr "응용 프로그램 언어 번경" -#: src/slic3r/GUI/GUI_App.cpp:774 +#: src/slic3r/GUI/GUI_App.cpp:824 msgid "Flash printer &firmware" msgstr "프린터 펌웨어 플래시" -#: src/slic3r/GUI/GUI_App.cpp:774 +#: src/slic3r/GUI/GUI_App.cpp:824 msgid "Upload a firmware image into an Arduino based printer" msgstr "아두이노 기반의 프린터 이미지 업로드" -#: src/slic3r/GUI/GUI_App.cpp:786 +#: src/slic3r/GUI/GUI_App.cpp:839 msgid "Taking configuration snapshot" msgstr "구성 스냅 샷 만들기" -#: src/slic3r/GUI/GUI_App.cpp:786 +#: src/slic3r/GUI/GUI_App.cpp:839 msgid "Snapshot name" msgstr "스냅 샷 이름" -#: src/slic3r/GUI/GUI_App.cpp:829 +#: src/slic3r/GUI/GUI_App.cpp:882 msgid "" "Switching the language will trigger application restart.\n" "You will lose content of the plater." msgstr "" -"언어를 전환 하면 응용 프로그램 재시작 합니다.플레이트 위 오브젝트는 모두 지워" -"집니다." +"언어를 전환 하면 응용 프로그램 재시작 합니다. 플레이트 위 객체(object)는 모" +"두 지워집니다." -#: src/slic3r/GUI/GUI_App.cpp:831 +#: src/slic3r/GUI/GUI_App.cpp:884 msgid "Do you want to proceed?" msgstr "계속 하시겠습니까?" -#: src/slic3r/GUI/GUI_App.cpp:832 +#: src/slic3r/GUI/GUI_App.cpp:885 msgid "Language selection" msgstr "국가에 맞는 언어를 선택" -#: src/slic3r/GUI/GUI_App.cpp:855 +#: src/slic3r/GUI/GUI_App.cpp:908 msgid "&Configuration" msgstr "&구성" -#: src/slic3r/GUI/GUI_App.cpp:877 +#: src/slic3r/GUI/GUI_App.cpp:932 msgid "The presets on the following tabs were modified" msgstr "다음 탭의 사전 설정이 수정 되었습니다" -#: src/slic3r/GUI/GUI_App.cpp:877 src/slic3r/GUI/Tab.cpp:3051 +#: src/slic3r/GUI/GUI_App.cpp:932 src/slic3r/GUI/Tab.cpp:2916 msgid "Discard changes and continue anyway?" msgstr "수정된 사항을 취소하고 계속하겠습니까?" -#: src/slic3r/GUI/GUI_App.cpp:880 +#: src/slic3r/GUI/GUI_App.cpp:935 msgid "Unsaved Presets" msgstr "저장되지 않은 기존설정" -#: src/slic3r/GUI/GUI_ObjectList.cpp:30 src/slic3r/GUI/GUI_ObjectList.cpp:84 -#: src/slic3r/GUI/GUI_ObjectList.cpp:558 src/libslic3r/PrintConfig.cpp:67 -#: src/libslic3r/PrintConfig.cpp:160 src/libslic3r/PrintConfig.cpp:392 -#: src/libslic3r/PrintConfig.cpp:453 src/libslic3r/PrintConfig.cpp:461 -#: src/libslic3r/PrintConfig.cpp:867 src/libslic3r/PrintConfig.cpp:1051 -#: src/libslic3r/PrintConfig.cpp:1354 src/libslic3r/PrintConfig.cpp:1420 -#: src/libslic3r/PrintConfig.cpp:1601 src/libslic3r/PrintConfig.cpp:2037 -#: src/libslic3r/PrintConfig.cpp:2095 +#: src/slic3r/GUI/GUI_App.cpp:1084 src/slic3r/GUI/Tab.cpp:2928 +msgid "It's impossible to print multi-part object(s) with SLA technology." +msgstr "SLA 방식을 사용 하여 다중 객체(object)를 인쇄할 수는 없습니다." + +#: src/slic3r/GUI/GUI_App.cpp:1085 +msgid "Please check and fix your object list." +msgstr "객체(object) 목록을 확인 하고 수정 하십시오." + +#: src/slic3r/GUI/GUI_App.cpp:1086 src/slic3r/GUI/Plater.cpp:2299 +#: src/slic3r/GUI/Tab.cpp:2930 +msgid "Attention!" +msgstr "주목!" + +#: src/slic3r/GUI/GUI_App.cpp:1103 +msgid "Select a gcode file:" +msgstr "gcode 파일 선택:" + +#: src/slic3r/GUI/GUI_ObjectLayers.cpp:27 +msgid "Start at height" +msgstr "높이에서 시작" + +#: src/slic3r/GUI/GUI_ObjectLayers.cpp:27 +msgid "Stop at height" +msgstr "높이에서 정지" + +#: src/slic3r/GUI/GUI_ObjectLayers.cpp:153 +msgid "Remove layer range" +msgstr "레이어 범위 제거" + +#: src/slic3r/GUI/GUI_ObjectLayers.cpp:162 +msgid "Add layer range" +msgstr "레이어 범위 추가" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:34 src/slic3r/GUI/GUI_ObjectList.cpp:93 +#: src/slic3r/GUI/GUI_ObjectList.cpp:611 src/libslic3r/PrintConfig.cpp:72 +#: src/libslic3r/PrintConfig.cpp:165 src/libslic3r/PrintConfig.cpp:174 +#: src/libslic3r/PrintConfig.cpp:408 src/libslic3r/PrintConfig.cpp:470 +#: src/libslic3r/PrintConfig.cpp:478 src/libslic3r/PrintConfig.cpp:891 +#: src/libslic3r/PrintConfig.cpp:1076 src/libslic3r/PrintConfig.cpp:1383 +#: src/libslic3r/PrintConfig.cpp:1450 src/libslic3r/PrintConfig.cpp:1631 +#: src/libslic3r/PrintConfig.cpp:2084 src/libslic3r/PrintConfig.cpp:2143 +#: src/libslic3r/PrintConfig.cpp:2152 msgid "Layers and Perimeters" -msgstr "레이어 및 경계선" +msgstr "레이어 및 둘레" -#: src/slic3r/GUI/GUI_ObjectList.cpp:31 src/slic3r/GUI/GUI_ObjectList.cpp:85 -#: src/slic3r/GUI/GUI_ObjectList.cpp:559 src/slic3r/GUI/Plater.cpp:498 -#: src/slic3r/GUI/Tab.cpp:1041 src/slic3r/GUI/Tab.cpp:1042 -#: src/slic3r/GUI/Tab.cpp:1394 src/libslic3r/PrintConfig.cpp:177 -#: src/libslic3r/PrintConfig.cpp:400 src/libslic3r/PrintConfig.cpp:420 -#: src/libslic3r/PrintConfig.cpp:754 src/libslic3r/PrintConfig.cpp:768 -#: src/libslic3r/PrintConfig.cpp:805 src/libslic3r/PrintConfig.cpp:958 -#: src/libslic3r/PrintConfig.cpp:968 src/libslic3r/PrintConfig.cpp:986 -#: src/libslic3r/PrintConfig.cpp:1004 src/libslic3r/PrintConfig.cpp:1023 -#: src/libslic3r/PrintConfig.cpp:1708 src/libslic3r/PrintConfig.cpp:1725 -msgid "Infill" -msgstr "인필(채움)" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:32 src/slic3r/GUI/GUI_ObjectList.cpp:86 -#: src/slic3r/GUI/GUI_ObjectList.cpp:560 src/slic3r/GUI/GUI_Preview.cpp:243 -#: src/slic3r/GUI/Tab.cpp:1070 src/slic3r/GUI/Tab.cpp:1071 -#: src/libslic3r/PrintConfig.cpp:344 src/libslic3r/PrintConfig.cpp:1481 -#: src/libslic3r/PrintConfig.cpp:1830 src/libslic3r/PrintConfig.cpp:1836 -#: src/libslic3r/PrintConfig.cpp:1844 src/libslic3r/PrintConfig.cpp:1856 -#: src/libslic3r/PrintConfig.cpp:1866 src/libslic3r/PrintConfig.cpp:1874 -#: src/libslic3r/PrintConfig.cpp:1889 src/libslic3r/PrintConfig.cpp:1910 -#: src/libslic3r/PrintConfig.cpp:1921 src/libslic3r/PrintConfig.cpp:1937 -#: src/libslic3r/PrintConfig.cpp:1946 src/libslic3r/PrintConfig.cpp:1955 -#: src/libslic3r/PrintConfig.cpp:1966 src/libslic3r/PrintConfig.cpp:1980 -#: src/libslic3r/PrintConfig.cpp:1988 src/libslic3r/PrintConfig.cpp:1989 -#: src/libslic3r/PrintConfig.cpp:1998 src/libslic3r/PrintConfig.cpp:2006 -#: src/libslic3r/PrintConfig.cpp:2020 src/libslic3r/GCode/PreviewData.cpp:172 +#: src/slic3r/GUI/GUI_ObjectList.cpp:36 src/slic3r/GUI/GUI_ObjectList.cpp:95 +#: src/slic3r/GUI/GUI_ObjectList.cpp:613 src/slic3r/GUI/GUI_Preview.cpp:248 +#: src/slic3r/GUI/Tab.cpp:1110 src/slic3r/GUI/Tab.cpp:1111 +#: src/libslic3r/ExtrusionEntity.cpp:319 src/libslic3r/PrintConfig.cpp:360 +#: src/libslic3r/PrintConfig.cpp:1511 src/libslic3r/PrintConfig.cpp:1876 +#: src/libslic3r/PrintConfig.cpp:1882 src/libslic3r/PrintConfig.cpp:1890 +#: src/libslic3r/PrintConfig.cpp:1902 src/libslic3r/PrintConfig.cpp:1912 +#: src/libslic3r/PrintConfig.cpp:1920 src/libslic3r/PrintConfig.cpp:1935 +#: src/libslic3r/PrintConfig.cpp:1956 src/libslic3r/PrintConfig.cpp:1968 +#: src/libslic3r/PrintConfig.cpp:1984 src/libslic3r/PrintConfig.cpp:1993 +#: src/libslic3r/PrintConfig.cpp:2002 src/libslic3r/PrintConfig.cpp:2013 +#: src/libslic3r/PrintConfig.cpp:2027 src/libslic3r/PrintConfig.cpp:2035 +#: src/libslic3r/PrintConfig.cpp:2036 src/libslic3r/PrintConfig.cpp:2045 +#: src/libslic3r/PrintConfig.cpp:2053 src/libslic3r/PrintConfig.cpp:2067 msgid "Support material" msgstr "서포트 재료(Support material)" -#: src/slic3r/GUI/GUI_ObjectList.cpp:35 src/slic3r/GUI/GUI_ObjectList.cpp:90 -#: src/slic3r/GUI/GUI_ObjectList.cpp:564 src/libslic3r/PrintConfig.cpp:2202 -#: src/libslic3r/PrintConfig.cpp:2210 +#: src/slic3r/GUI/GUI_ObjectList.cpp:39 src/slic3r/GUI/GUI_ObjectList.cpp:99 +#: src/slic3r/GUI/GUI_ObjectList.cpp:617 src/libslic3r/PrintConfig.cpp:2262 +#: src/libslic3r/PrintConfig.cpp:2270 msgid "Wipe options" msgstr "지우기 옵션" -#: src/slic3r/GUI/GUI_ObjectList.cpp:41 +#: src/slic3r/GUI/GUI_ObjectList.cpp:45 msgid "Pad and Support" msgstr "패드 및 서포트" -#: src/slic3r/GUI/GUI_ObjectList.cpp:47 +#: src/slic3r/GUI/GUI_ObjectList.cpp:51 msgid "Add part" -msgstr "파트 추가" +msgstr "부품(Part) 추가" -#: src/slic3r/GUI/GUI_ObjectList.cpp:48 +#: src/slic3r/GUI/GUI_ObjectList.cpp:52 msgid "Add modifier" msgstr "편집영역(modifier) 추가" -#: src/slic3r/GUI/GUI_ObjectList.cpp:49 +#: src/slic3r/GUI/GUI_ObjectList.cpp:53 msgid "Add support enforcer" msgstr "서포트 지원(enforcer)영역 추가" -#: src/slic3r/GUI/GUI_ObjectList.cpp:50 +#: src/slic3r/GUI/GUI_ObjectList.cpp:54 msgid "Add support blocker" msgstr "서포트 금지영역(blocker) 추가" -#: src/slic3r/GUI/GUI_ObjectList.cpp:87 src/slic3r/GUI/GUI_ObjectList.cpp:561 -#: src/slic3r/GUI/GUI_Preview.cpp:222 src/slic3r/GUI/Tab.cpp:1095 -#: src/libslic3r/PrintConfig.cpp:209 src/libslic3r/PrintConfig.cpp:441 -#: src/libslic3r/PrintConfig.cpp:896 src/libslic3r/PrintConfig.cpp:1024 -#: src/libslic3r/PrintConfig.cpp:1410 src/libslic3r/PrintConfig.cpp:1647 -#: src/libslic3r/PrintConfig.cpp:1696 src/libslic3r/PrintConfig.cpp:1747 -#: src/libslic3r/PrintConfig.cpp:2080 +#: src/slic3r/GUI/GUI_ObjectList.cpp:96 src/slic3r/GUI/GUI_ObjectList.cpp:614 +#: src/slic3r/GUI/GUI_Preview.cpp:226 src/slic3r/GUI/Tab.cpp:1135 +#: src/libslic3r/PrintConfig.cpp:225 src/libslic3r/PrintConfig.cpp:458 +#: src/libslic3r/PrintConfig.cpp:920 src/libslic3r/PrintConfig.cpp:1049 +#: src/libslic3r/PrintConfig.cpp:1440 src/libslic3r/PrintConfig.cpp:1677 +#: src/libslic3r/PrintConfig.cpp:1726 src/libslic3r/PrintConfig.cpp:1778 +#: src/libslic3r/PrintConfig.cpp:2128 msgid "Speed" msgstr "속도" -#: src/slic3r/GUI/GUI_ObjectList.cpp:88 src/slic3r/GUI/GUI_ObjectList.cpp:562 -#: src/slic3r/GUI/Tab.cpp:1130 src/slic3r/GUI/Tab.cpp:1997 -#: src/libslic3r/PrintConfig.cpp:471 src/libslic3r/PrintConfig.cpp:979 -#: src/libslic3r/PrintConfig.cpp:1389 src/libslic3r/PrintConfig.cpp:1717 -#: src/libslic3r/PrintConfig.cpp:1902 src/libslic3r/PrintConfig.cpp:1928 +#: src/slic3r/GUI/GUI_ObjectList.cpp:97 src/slic3r/GUI/GUI_ObjectList.cpp:615 +#: src/slic3r/GUI/Tab.cpp:1170 src/slic3r/GUI/Tab.cpp:1822 +#: src/libslic3r/PrintConfig.cpp:488 src/libslic3r/PrintConfig.cpp:1003 +#: src/libslic3r/PrintConfig.cpp:1418 src/libslic3r/PrintConfig.cpp:1747 +#: src/libslic3r/PrintConfig.cpp:1948 src/libslic3r/PrintConfig.cpp:1975 msgid "Extruders" msgstr "익스트루더" -#: src/slic3r/GUI/GUI_ObjectList.cpp:89 src/slic3r/GUI/GUI_ObjectList.cpp:563 -#: src/libslic3r/PrintConfig.cpp:431 src/libslic3r/PrintConfig.cpp:538 -#: src/libslic3r/PrintConfig.cpp:855 src/libslic3r/PrintConfig.cpp:987 -#: src/libslic3r/PrintConfig.cpp:1398 src/libslic3r/PrintConfig.cpp:1737 -#: src/libslic3r/PrintConfig.cpp:1911 src/libslic3r/PrintConfig.cpp:2069 +#: src/slic3r/GUI/GUI_ObjectList.cpp:98 src/slic3r/GUI/GUI_ObjectList.cpp:616 +#: src/libslic3r/PrintConfig.cpp:447 src/libslic3r/PrintConfig.cpp:555 +#: src/libslic3r/PrintConfig.cpp:878 src/libslic3r/PrintConfig.cpp:1011 +#: src/libslic3r/PrintConfig.cpp:1427 src/libslic3r/PrintConfig.cpp:1767 +#: src/libslic3r/PrintConfig.cpp:1957 src/libslic3r/PrintConfig.cpp:2116 msgid "Extrusion Width" msgstr "압출 폭" -#: src/slic3r/GUI/GUI_ObjectList.cpp:95 src/slic3r/GUI/GUI_ObjectList.cpp:569 -#: src/slic3r/GUI/Plater.cpp:466 src/slic3r/GUI/Tab.cpp:3655 -#: src/slic3r/GUI/Tab.cpp:3656 src/libslic3r/PrintConfig.cpp:2469 -#: src/libslic3r/PrintConfig.cpp:2476 src/libslic3r/PrintConfig.cpp:2485 -#: src/libslic3r/PrintConfig.cpp:2494 src/libslic3r/PrintConfig.cpp:2504 -#: src/libslic3r/PrintConfig.cpp:2530 src/libslic3r/PrintConfig.cpp:2537 -#: src/libslic3r/PrintConfig.cpp:2548 src/libslic3r/PrintConfig.cpp:2558 -#: src/libslic3r/PrintConfig.cpp:2567 src/libslic3r/PrintConfig.cpp:2580 -#: src/libslic3r/PrintConfig.cpp:2590 src/libslic3r/PrintConfig.cpp:2599 -#: src/libslic3r/PrintConfig.cpp:2609 src/libslic3r/PrintConfig.cpp:2621 -#: src/libslic3r/PrintConfig.cpp:2629 +#: src/slic3r/GUI/GUI_ObjectList.cpp:104 src/slic3r/GUI/GUI_ObjectList.cpp:622 +#: src/slic3r/GUI/Plater.cpp:492 src/slic3r/GUI/Tab.cpp:3576 +#: src/slic3r/GUI/Tab.cpp:3577 src/libslic3r/PrintConfig.cpp:2615 +#: src/libslic3r/PrintConfig.cpp:2622 src/libslic3r/PrintConfig.cpp:2631 +#: src/libslic3r/PrintConfig.cpp:2640 src/libslic3r/PrintConfig.cpp:2650 +#: src/libslic3r/PrintConfig.cpp:2676 src/libslic3r/PrintConfig.cpp:2683 +#: src/libslic3r/PrintConfig.cpp:2694 src/libslic3r/PrintConfig.cpp:2704 +#: src/libslic3r/PrintConfig.cpp:2713 src/libslic3r/PrintConfig.cpp:2726 +#: src/libslic3r/PrintConfig.cpp:2736 src/libslic3r/PrintConfig.cpp:2745 +#: src/libslic3r/PrintConfig.cpp:2755 src/libslic3r/PrintConfig.cpp:2766 +#: src/libslic3r/PrintConfig.cpp:2774 msgid "Supports" msgstr "서포트" -#: src/slic3r/GUI/GUI_ObjectList.cpp:96 src/slic3r/GUI/GUI_ObjectList.cpp:570 -#: src/slic3r/GUI/Tab.cpp:3684 src/slic3r/GUI/Tab.cpp:3685 -#: src/libslic3r/PrintConfig.cpp:2637 src/libslic3r/PrintConfig.cpp:2644 -#: src/libslic3r/PrintConfig.cpp:2658 src/libslic3r/PrintConfig.cpp:2668 -#: src/libslic3r/PrintConfig.cpp:2681 src/libslic3r/PrintConfig.cpp:2690 -#: src/libslic3r/PrintConfig.cpp:2701 src/libslic3r/PrintConfig.cpp:2712 -#: src/libslic3r/PrintConfig.cpp:2722 src/libslic3r/PrintConfig.cpp:2732 +#: src/slic3r/GUI/GUI_ObjectList.cpp:105 src/slic3r/GUI/GUI_ObjectList.cpp:623 +#: src/slic3r/GUI/Plater.cpp:632 src/slic3r/GUI/Tab.cpp:3608 +#: src/slic3r/GUI/Tab.cpp:3609 src/libslic3r/PrintConfig.cpp:2782 +#: src/libslic3r/PrintConfig.cpp:2789 src/libslic3r/PrintConfig.cpp:2803 +#: src/libslic3r/PrintConfig.cpp:2814 src/libslic3r/PrintConfig.cpp:2824 +#: src/libslic3r/PrintConfig.cpp:2846 src/libslic3r/PrintConfig.cpp:2857 +#: src/libslic3r/PrintConfig.cpp:2864 src/libslic3r/PrintConfig.cpp:2871 +#: src/libslic3r/PrintConfig.cpp:2882 src/libslic3r/PrintConfig.cpp:2891 +#: src/libslic3r/PrintConfig.cpp:2900 msgid "Pad" msgstr "패드" -#: src/slic3r/GUI/GUI_ObjectList.cpp:217 +#: src/slic3r/GUI/GUI_ObjectList.cpp:106 src/slic3r/GUI/Tab.cpp:3626 +#: src/slic3r/GUI/Tab.cpp:3627 src/libslic3r/SLA/Hollowing.cpp:46 +#: src/libslic3r/SLA/Hollowing.cpp:58 src/libslic3r/SLA/Hollowing.cpp:67 +#: src/libslic3r/SLA/Hollowing.cpp:76 src/libslic3r/PrintConfig.cpp:2910 +#: src/libslic3r/PrintConfig.cpp:2917 src/libslic3r/PrintConfig.cpp:2927 +#: src/libslic3r/PrintConfig.cpp:2936 +msgid "Hollowing" +msgstr "속이 빈 공동(Hollowing)" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:268 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:153 msgid "Name" msgstr "이름" -#: src/slic3r/GUI/GUI_ObjectList.cpp:271 -#, c-format -msgid "Auto-repaired (%d errors):\n" -msgstr "오류자동수정 (%d errors)\n" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:278 -msgid "degenerate facets" -msgstr "더러운 면" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:279 -msgid "edges fixed" -msgstr "모서리 고정" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:280 -msgid "facets removed" -msgstr "면 제거" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:281 -msgid "facets added" -msgstr "면 추가됨" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:282 -msgid "facets reversed" -msgstr "면 반전" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:283 -msgid "backwards edges" -msgstr "뒤쪽 가장자리" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:291 -msgid "Right button click the icon to fix STL through Netfabb" -msgstr "아이콘을 클릭 하여 Netfabb에서 STL을 수정 합니다" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:325 -msgid "Right button click the icon to change the object settings" -msgstr "아이콘을 클릭 하여 개체 설정을 변경 합니다" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:375 src/slic3r/GUI/GUI_ObjectList.cpp:396 -#: src/slic3r/GUI/GUI_ObjectList.cpp:408 src/slic3r/GUI/GUI_ObjectList.cpp:3508 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3518 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3550 src/slic3r/GUI/wxExtensions.cpp:576 -#: src/slic3r/GUI/wxExtensions.cpp:633 src/slic3r/GUI/wxExtensions.cpp:658 -#: src/slic3r/GUI/wxExtensions.cpp:794 -msgid "default" -msgstr "기본값" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:380 src/slic3r/GUI/Tab.cpp:1613 -#: src/libslic3r/PrintConfig.cpp:470 +#: src/slic3r/GUI/GUI_ObjectList.cpp:276 src/slic3r/GUI/Tab.cpp:1428 +#: src/slic3r/GUI/wxExtensions.cpp:589 src/libslic3r/PrintConfig.cpp:487 msgid "Extruder" msgstr "익스트루더(Extruder)" -#: src/slic3r/GUI/GUI_ObjectList.cpp:493 +#: src/slic3r/GUI/GUI_ObjectList.cpp:280 src/slic3r/GUI/GUI_ObjectList.cpp:392 +msgid "Editing" +msgstr "편집" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:337 +#, c-format +msgid "Auto-repaired (%d errors):" +msgstr "오류자동수정 (%d errors):" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:344 +msgid "degenerate facets" +msgstr "더러운 면" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:345 +msgid "edges fixed" +msgstr "모서리 고정" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:346 +msgid "facets removed" +msgstr "면 제거" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:347 +msgid "facets added" +msgstr "면 추가됨" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:348 +msgid "facets reversed" +msgstr "면 반전" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:349 +msgid "backwards edges" +msgstr "뒤쪽 가장자리" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:357 +msgid "Right button click the icon to fix STL through Netfabb" +msgstr "아이콘을 클릭 하여 Netfabb에서 STL을 수정 합니다" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:394 +msgid "Right button click the icon to change the object settings" +msgstr "아이콘을 클릭 하여 객체(object) 설정을 변경 합니다" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:396 +msgid "Click the icon to change the object settings" +msgstr "아이콘을 클릭 하여 오브젝트 설정을 변경 합니다" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:400 +msgid "Right button click the icon to change the object printable property" +msgstr "오른쪽 버튼이 아이콘을 클릭하여 객체 인쇄 가능한 속성을 변경합니다." + +#: src/slic3r/GUI/GUI_ObjectList.cpp:402 +msgid "Click the icon to change the object printable property" +msgstr "아이콘을 클릭하여 객체 인쇄 가능 속성을 변경합니다." + +#: src/slic3r/GUI/GUI_ObjectList.cpp:455 src/slic3r/GUI/GUI_ObjectList.cpp:467 +#: src/slic3r/GUI/GUI_ObjectList.cpp:915 src/slic3r/GUI/GUI_ObjectList.cpp:3947 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3957 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3992 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:200 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:257 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:282 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:490 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:1725 +msgid "default" +msgstr "기본값" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:534 +msgid "Change Extruder" +msgstr "압출기(익스트루더) 변경" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:549 msgid "Rename Object" -msgstr "개체 이름 바꾸기" +msgstr "객체(object) 이름 바꾸기" -#: src/slic3r/GUI/GUI_ObjectList.cpp:493 +#: src/slic3r/GUI/GUI_ObjectList.cpp:549 msgid "Rename Sub-object" -msgstr "하위 오브젝트 이름 바꾸기" +msgstr "하위 객체(object) 이름 바꾸기" -#: src/slic3r/GUI/GUI_ObjectList.cpp:934 src/slic3r/GUI/GUI_ObjectList.cpp:3346 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1089 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3756 msgid "Instances to Separated Objects" -msgstr "분리된 객체에 대한 복제본" +msgstr "분리된 객체(object)에 대한 복제본" -#: src/slic3r/GUI/GUI_ObjectList.cpp:952 -msgid "Remove Volume(s)" -msgstr "볼륨 제거" +#: src/slic3r/GUI/GUI_ObjectList.cpp:1104 +msgid "Volumes in Object reordered" +msgstr "개체의 볼륨이 재정렬되었습니다." -#: src/slic3r/GUI/GUI_ObjectList.cpp:1007 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1316 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1322 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1556 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1104 +msgid "Object reordered" +msgstr "개체 순서가 다시 지정되었습니다." + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1180 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1528 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1534 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1828 #, c-format msgid "Quick Add Settings (%s)" msgstr "빠른 추가 설정 (%s)" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1077 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1263 msgid "Select showing settings" -msgstr "설정 표시를 선택 합니다" +msgstr "표시된 설정을 선택 합니다" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1126 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1312 msgid "Add Settings for Layers" -msgstr "도면층에 대한 설정 추가" +msgstr "레이어 설정 추가" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1127 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1313 msgid "Add Settings for Sub-object" -msgstr "하위 개체에 대한 설정 추가" +msgstr "하위 객체(object)에 대한 설정 추가" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1128 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1314 msgid "Add Settings for Object" -msgstr "개체에 대한 설정 추가" +msgstr "객체(object)에 대한 설정 추가" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1189 -msgid "Add Settings Bundle for Layers" -msgstr "레이어에 대한 설정 번들 추가" +#: src/slic3r/GUI/GUI_ObjectList.cpp:1384 +msgid "Add Settings Bundle for Height range" +msgstr "높이 범위에 대한 설정 번들 추가" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1190 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1385 msgid "Add Settings Bundle for Sub-object" -msgstr "하위 오브젝트에 대한 설정 번들 추가" +msgstr "하위 객체(object)에 대한 번들 설정을 추가" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1191 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1386 msgid "Add Settings Bundle for Object" -msgstr "개체에 대한 설정 번들 추가" +msgstr "객체(object)에 대한 번들 설정을 추가" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1230 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1425 msgid "Load" msgstr "불러오기" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1235 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1260 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1263 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1430 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1462 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1466 msgid "Box" msgstr "박스" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1235 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1430 msgid "Cylinder" msgstr "원통" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1235 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1430 msgid "Sphere" msgstr "영역" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1235 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1430 msgid "Slab" msgstr "슬랩" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1287 -msgid "Edit Layers" -msgstr "레이어 편집" +#: src/slic3r/GUI/GUI_ObjectList.cpp:1498 +msgid "Height range Modifier" +msgstr "높이 범위에 대한 설정" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1295 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1507 msgid "Add settings" msgstr "다음 설정" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1362 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1582 msgid "Change type" msgstr "타입 변경" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1369 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1510 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1589 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1601 msgid "Set as a Separated Object" -msgstr "분리 된 객체로 설정" +msgstr "분리 된 객체(object)로 설정" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1375 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1601 +msgid "Set as a Separated Objects" +msgstr "분리된 객체(object)로 설정" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1611 +msgid "Printable" +msgstr "인쇄가능" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1626 msgid "Rename" msgstr "이름 변경" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1386 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1637 msgid "Fix through the Netfabb" -msgstr "네트워크를 통해 수정" +msgstr "Netfabb를 통해 수정" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1396 src/slic3r/GUI/Plater.cpp:3496 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1647 src/slic3r/GUI/Plater.cpp:3987 msgid "Export as STL" msgstr "STL로 내보내기" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1403 -msgid "Change extruder" -msgstr "압출기(익스트루더) 변경" +#: src/slic3r/GUI/GUI_ObjectList.cpp:1655 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1658 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3932 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3935 src/slic3r/GUI/Plater.cpp:3946 +#: src/slic3r/GUI/Plater.cpp:3949 +msgid "Reload the selected volumes from disk" +msgstr "디스크에서 선택한 볼륨 다시 로드" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1422 src/libslic3r/PrintConfig.cpp:309 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1685 src/libslic3r/PrintConfig.cpp:325 msgid "Default" msgstr "기본값" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1428 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1691 msgid "Select new extruder for the object/part" -msgstr "객체/부품에 대한 새 압출(익스트루더) 기 선택" +msgstr "객체(object)/부품(Part)에 대한 새 압출(익스트루더) 기 선택" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1440 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1703 msgid "Scale to print volume" msgstr "인쇄 볼륨에 따라 배율 조정" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1440 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1703 msgid "Scale the selected object to fit the print volume" -msgstr "인쇄 볼륨에 맞게 선택한 오브젝트의 배율 조정" +msgstr "인쇄 볼륨에 맞게 선택한 객체(object)의 배율 조정" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1510 -msgid "Set as a Separated Objects" -msgstr "분리 된 객체로 설정" +#: src/slic3r/GUI/GUI_ObjectList.cpp:1772 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2030 +msgid "Add Shape" +msgstr "모양 추가" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1585 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1858 msgid "Load Part" -msgstr "하중 부품" +msgstr "부품(Part)을 불러 오기" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1617 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1897 msgid "Error!" msgstr "에러!" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1662 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1972 msgid "Add Generic Subobject" -msgstr "일반 하위 개체 추가" +msgstr "기본이 되는 하위 객체(object) 추가" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1669 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2001 msgid "Generic" msgstr "일반" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1770 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1872 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2119 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2221 msgid "Last instance of an object cannot be deleted." -msgstr "개체의 마지막 복제본를 삭제할 수 없습니다." +msgstr "객체(object)의 마지막 복제본를 삭제할 수 없습니다." -#: src/slic3r/GUI/GUI_ObjectList.cpp:1782 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2131 msgid "Delete Settings" msgstr "설정 삭제" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1806 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2155 msgid "Delete All Instances from Object" -msgstr "개체에서 모든 복제본 삭제" +msgstr "객체(object)에서 모든 복제본 삭제" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1822 -msgid "Delete Layers Range" -msgstr "레이어 범위 삭제" +#: src/slic3r/GUI/GUI_ObjectList.cpp:2171 +msgid "Delete Height Range" +msgstr "높이 범위 삭제" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1853 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2202 msgid "From Object List You can't delete the last solid part from object." -msgstr "개체 목록에서 개체에서 마지막 솔리드 부품을 삭제할 수 없습니다." +msgstr "객체(object) 리스트에서 마지막 부품(Part)을 삭제할 수 없습니다." -#: src/slic3r/GUI/GUI_ObjectList.cpp:1857 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2206 msgid "Delete Subobject" -msgstr "하위 개체 삭제" +msgstr "하위 객체(object) 삭제" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1876 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2225 msgid "Delete Instance" msgstr "복제본 삭제" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1900 src/slic3r/GUI/Plater.cpp:2793 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2249 src/slic3r/GUI/Plater.cpp:2964 msgid "" "The selected object couldn't be split because it contains only one part." msgstr "" -"선택한 오브젝트는 파트 하나만 포함되어 있기 때문에 분할 할 수 없습니다." +"선택한 객체(object)는 부품(Part) 하나만 포함되어 있기 때문에 분할 할 수 없습" +"니다." -#: src/slic3r/GUI/GUI_ObjectList.cpp:1904 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2253 msgid "Split to Parts" -msgstr "파트로 분할" +msgstr "부품(Part)으로 분할" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1950 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2305 msgid "Add Layers" msgstr "레이어 추가" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2075 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2431 msgid "Group manipulation" msgstr "그룹 조작" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2087 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2443 msgid "Object manipulation" -msgstr "개체 조작" +msgstr "객체(object) 조작" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2100 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2456 msgid "Object Settings to modify" -msgstr "수정할 개체 설정" +msgstr "수정할 객체(object) 설정" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2104 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2460 msgid "Part Settings to modify" -msgstr "수정할 부품 설정" +msgstr "수정할 부품(Part) 설정" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2109 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2465 msgid "Layer range Settings to modify" msgstr "레이어 범위 설정 수정" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2115 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2471 msgid "Part manipulation" -msgstr "파트 조작" +msgstr "부품(Part) 조작" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2121 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2477 msgid "Instance manipulation" msgstr "복제본 제거" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2128 -msgid "Layers Editing" -msgstr "레이어층을 편집" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2128 -msgid "Layer Editing" -msgstr "레이어 편집" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2303 -msgid "Delete Selected Item" -msgstr "선택한 항목 삭제" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2415 -msgid "Delete Selected" -msgstr "선택된 것을 삭제" +#: src/slic3r/GUI/GUI_ObjectList.cpp:2484 +msgid "Height ranges" +msgstr "높이 범위" #: src/slic3r/GUI/GUI_ObjectList.cpp:2484 -#: src/slic3r/GUI/GUI_ObjectList.cpp:2513 -#: src/slic3r/GUI/GUI_ObjectList.cpp:2531 -msgid "Add New Layers Range" -msgstr "새 레이어 범위 추가" +msgid "Settings for height range" +msgstr "높이 범위에 대한 설정" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2590 -msgid "Edit Layers Range" -msgstr "레이어 범위 편집" +#: src/slic3r/GUI/GUI_ObjectList.cpp:2670 +msgid "Delete Selected Item" +msgstr "선택한 항목(item) 삭제" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2867 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2807 +msgid "Delete Selected" +msgstr "선택된 것 삭제" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2873 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2902 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2920 +msgid "Add Height Range" +msgstr "높이 범위 추가" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2980 +msgid "Edit Height Range" +msgstr "높이 범위 편집" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3266 msgid "Selection-Remove from list" msgstr "목록에서 선택-제거" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2875 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3274 msgid "Selection-Add from list" msgstr "목록에서 선택-추가" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2993 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3392 msgid "Object or Instance" -msgstr "개체 또는 복제본" +msgstr "객체(object) 또는 복제본" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2994 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3127 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3393 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3526 msgid "Part" -msgstr "부품(Part)" +msgstr "부품(Part)(Part)" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2994 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3393 msgid "Layer" msgstr "레이어" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2996 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3395 msgid "Unsupported selection" msgstr "지원 되지 않는 선택" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2997 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3396 #, c-format msgid "You started your selection with %s Item." -msgstr "%s 항목으로 선택을 시작 했습니다." +msgstr "%s 선택된 항목으로 시작합니다." -#: src/slic3r/GUI/GUI_ObjectList.cpp:2998 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3397 #, c-format msgid "In this mode you can select only other %s Items%s" msgstr "이 모드에서는 %s의 다른 %s 항목만 선택할 수 있습니다" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3001 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3400 msgid "of a current Object" -msgstr "현재 개체의" +msgstr "현재 객체(object)의" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3006 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3081 src/slic3r/GUI/Plater.cpp:126 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3405 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3480 src/slic3r/GUI/Plater.cpp:143 msgid "Info" msgstr "정보" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3122 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3521 msgid "You can't change a type of the last solid part of the object." -msgstr "객체의 마지막 솔리드 부품 유형은 변경할 수 없습니다." +msgstr "객체(object)의 마지막 부품(Part) 유형은 변경할 수 없습니다." -#: src/slic3r/GUI/GUI_ObjectList.cpp:3127 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3526 msgid "Modifier" msgstr "편집 영역" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3127 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3526 msgid "Support Enforcer" msgstr "서포트 지원 영역" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3127 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3526 msgid "Support Blocker" msgstr "서포트 금지 영역" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3129 -msgid "Type:" -msgstr "형식:" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:3129 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3528 msgid "Select type of part" -msgstr "부품 유형 선택" +msgstr "부품(Part) 유형 선택" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3134 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3533 msgid "Change Part Type" -msgstr "부품 유형 변경" +msgstr "부품(Part) 유형 변경" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3368 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3778 msgid "Enter new name" msgstr "새 이름 입력" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3368 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3778 msgid "Renaming" msgstr "이름 바꾸기" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3384 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3480 src/slic3r/GUI/Tab.cpp:3536 -#: src/slic3r/GUI/Tab.cpp:3540 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3794 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3901 src/slic3r/GUI/Tab.cpp:3426 +#: src/slic3r/GUI/Tab.cpp:3430 msgid "The supplied name is not valid;" msgstr "제공된 이름이 유효하지 않습니다;" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3385 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3481 src/slic3r/GUI/Tab.cpp:3537 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3795 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3902 src/slic3r/GUI/Tab.cpp:3427 msgid "the following characters are not allowed:" msgstr "다음 문자는 허용되지 않습니다:" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3498 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3927 msgid "Set extruder for selected items" msgstr "선택한 항목에 대한 압출기(익스트루더) 설정" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3499 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3928 msgid "Select extruder number for selected objects and/or parts" -msgstr "선택한 객체 및 부품에 대한 압출기(익스트루더) 번호 선택" +msgstr "선택한 객체(object) 및 부품(Part)에 대한 압출기(익스트루더) 번호 선택" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3512 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3951 msgid "Select extruder number:" msgstr "압출기(익스트루더) 번호 선택:" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3513 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3952 msgid "This extruder will be set for selected items" msgstr "선택한 항목에 대한 압출기(익스트루더) 설정" +#: src/slic3r/GUI/GUI_ObjectList.cpp:3977 +msgid "Change Extruders" +msgstr "돌출기 변경" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:4074 src/slic3r/GUI/Selection.cpp:1474 +msgid "Set Printable" +msgstr "인쇄 가능 설정" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:4074 src/slic3r/GUI/Selection.cpp:1474 +msgid "Set Unprintable" +msgstr "인쇄할 수 없는 설정" + #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:62 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:105 msgid "World coordinates" @@ -1875,78 +2822,76 @@ msgstr "로컬 좌표" msgid "Select coordinate space, in which the transformation will be performed." msgstr "변환이 수행될 좌표 공간을 선택 합니다." -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:125 -msgid "Object Manipulation" -msgstr "개체 조작" - -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:176 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:155 src/libslic3r/GCode.cpp:638 msgid "Object name" -msgstr "개체 이름" +msgstr "객체(object) 이름" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:212 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:215 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:457 +msgid "Position" +msgstr "위치" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:216 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:458 +#: src/slic3r/GUI/Mouse3DController.cpp:321 +#: src/slic3r/GUI/Mouse3DController.cpp:344 +msgid "Rotation" +msgstr "회전" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:263 #, c-format msgid "Toggle %c axis mirroring" msgstr "전환 %c 축 미러링" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:245 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:297 msgid "Set Mirror" msgstr "미러 설정" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:285 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:290 -msgid "Reset scale" -msgstr "스케일 재설정" +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:337 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:349 +msgid "Drop to bed" +msgstr "배드를 아래로 내리기" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:303 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:363 msgid "Reset rotation" msgstr "회전 재설정" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:328 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:385 msgid "Reset Rotation" msgstr "회전 재설정" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:340 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:355 -msgid "Drop to bed" -msgstr "잠자리에 들기" +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:397 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:399 +msgid "Reset scale" +msgstr "크기 재설정" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:388 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:443 -msgid "Position" -msgstr "위치" - -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:389 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:444 -msgid "Rotation" -msgstr "회전" - -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:445 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:459 msgid "Scale factors" msgstr "축척 계수" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:502 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:516 msgid "Translate" msgstr "번역" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:554 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:578 msgid "" -"You cann't use non-uniform scaling mode for multiple objects/parts selection" +"You cannot use non-uniform scaling mode for multiple objects/parts selection" msgstr "" "여러 객체/부품 선택에 는 균일하지 않은 배율 조정 모드를 사용할 수 없습니다." -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:715 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:750 msgid "Set Position" msgstr "위치 설정" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:746 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:781 msgid "Set Orientation" msgstr "방향 설정" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:811 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:846 msgid "Set Scale" msgstr "축척 설정" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:895 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:875 msgid "" "The currently manipulated object is tilted (rotation angles are not " "multiples of 90°).\n" @@ -1954,969 +2899,1042 @@ msgid "" "coordinate system,\n" "once the rotation is embedded into the object coordinates." msgstr "" -"현재 조작 된 오브젝트가 기울어져 있습니다 (회전 각도가 90 °의 배수가 아님).\n" -"기울어진 오브젝트의 비균일 배율 조정은 표준 좌표계에서만 가능 합니다.\n" -"회전이 오브젝트 좌표로 삽입되면." +"현재 조작 된 객체(object)가 기울어져 있습니다 (회전 각도가 90°의 배수가 아" +"님).\n" +"기울어진 객체(object)의 배율 조정은 기본 좌표에서만 가능 합니다." -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:898 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:878 msgid "" "This operation is irreversible.\n" "Do you want to proceed?" msgstr "" "이 작업은 되돌릴수 없습니다.\n" -"계속 하 시겠습니까?" +"계속 하시겠습니까?" -#: src/slic3r/GUI/GUI_ObjectSettings.cpp:58 +#: src/slic3r/GUI/GUI_ObjectSettings.cpp:59 msgid "Additional Settings" msgstr "추가적인 세팅" -#: src/slic3r/GUI/GUI_ObjectSettings.cpp:94 +#: src/slic3r/GUI/GUI_ObjectSettings.cpp:95 msgid "Remove parameter" msgstr "매개 변수 제거" -#: src/slic3r/GUI/GUI_ObjectSettings.cpp:100 +#: src/slic3r/GUI/GUI_ObjectSettings.cpp:101 #, c-format msgid "Delete Option %s" msgstr "삭제 %s 옵션" -#: src/slic3r/GUI/GUI_ObjectSettings.cpp:144 +#: src/slic3r/GUI/GUI_ObjectSettings.cpp:152 #, c-format msgid "Change Option %s" msgstr "옵션 %s 변경" -#: src/slic3r/GUI/GUI_Preview.cpp:216 +#: src/slic3r/GUI/GUI_Preview.cpp:220 msgid "View" msgstr "보기" -#: src/slic3r/GUI/GUI_Preview.cpp:219 src/slic3r/GUI/GUI_Preview.cpp:554 -#: src/libslic3r/GCode/PreviewData.cpp:394 +#: src/slic3r/GUI/GUI_Preview.cpp:223 src/slic3r/GUI/GUI_Preview.cpp:577 +#: src/libslic3r/GCode/PreviewData.cpp:345 msgid "Feature type" msgstr "특색 유형" -#: src/slic3r/GUI/GUI_Preview.cpp:220 src/libslic3r/PrintConfig.cpp:483 +#: src/slic3r/GUI/GUI_Preview.cpp:224 src/libslic3r/PrintConfig.cpp:500 msgid "Height" msgstr "높이" -#: src/slic3r/GUI/GUI_Preview.cpp:221 src/libslic3r/PrintConfig.cpp:2188 +#: src/slic3r/GUI/GUI_Preview.cpp:225 src/libslic3r/PrintConfig.cpp:2248 msgid "Width" msgstr "폭" -#: src/slic3r/GUI/GUI_Preview.cpp:223 +#: src/slic3r/GUI/GUI_Preview.cpp:227 src/slic3r/GUI/Tab.cpp:1451 +msgid "Fan speed" +msgstr "팬 속도" + +#: src/slic3r/GUI/GUI_Preview.cpp:228 msgid "Volumetric flow rate" msgstr "용적의 유량값" -#: src/slic3r/GUI/GUI_Preview.cpp:224 src/slic3r/GUI/GUI_Preview.cpp:328 -#: src/slic3r/GUI/GUI_Preview.cpp:506 src/slic3r/GUI/GUI_Preview.cpp:553 -#: src/slic3r/GUI/GUI_Preview.cpp:749 src/libslic3r/GCode/PreviewData.cpp:404 +#: src/slic3r/GUI/GUI_Preview.cpp:229 src/slic3r/GUI/GUI_Preview.cpp:337 +#: src/slic3r/GUI/GUI_Preview.cpp:521 src/slic3r/GUI/GUI_Preview.cpp:576 +#: src/slic3r/GUI/GUI_Preview.cpp:831 src/libslic3r/GCode/PreviewData.cpp:357 msgid "Tool" msgstr "도구" -#: src/slic3r/GUI/GUI_Preview.cpp:225 src/slic3r/GUI/GUI_Preview.cpp:551 -#: src/libslic3r/GCode/PreviewData.cpp:406 +#: src/slic3r/GUI/GUI_Preview.cpp:230 src/slic3r/GUI/GUI_Preview.cpp:574 +#: src/libslic3r/GCode/PreviewData.cpp:359 msgid "Color Print" msgstr "컬러 프린트" -#: src/slic3r/GUI/GUI_Preview.cpp:228 +#: src/slic3r/GUI/GUI_Preview.cpp:233 msgid "Show" msgstr "보다" -#: src/slic3r/GUI/GUI_Preview.cpp:231 src/slic3r/GUI/GUI_Preview.cpp:232 +#: src/slic3r/GUI/GUI_Preview.cpp:236 src/slic3r/GUI/GUI_Preview.cpp:237 msgid "Feature types" msgstr "특색 유형" -#: src/slic3r/GUI/GUI_Preview.cpp:234 src/libslic3r/GCode/PreviewData.cpp:163 +#: src/slic3r/GUI/GUI_Preview.cpp:239 src/libslic3r/ExtrusionEntity.cpp:310 msgid "Perimeter" msgstr "가장자리" -#: src/slic3r/GUI/GUI_Preview.cpp:235 src/libslic3r/GCode/PreviewData.cpp:164 +#: src/slic3r/GUI/GUI_Preview.cpp:240 src/libslic3r/ExtrusionEntity.cpp:311 msgid "External perimeter" msgstr "외부 가장자리" -#: src/slic3r/GUI/GUI_Preview.cpp:236 src/libslic3r/GCode/PreviewData.cpp:165 +#: src/slic3r/GUI/GUI_Preview.cpp:241 src/libslic3r/ExtrusionEntity.cpp:312 msgid "Overhang perimeter" msgstr "오버행(Overhang) 둘레" -#: src/slic3r/GUI/GUI_Preview.cpp:237 src/libslic3r/GCode/PreviewData.cpp:166 +#: src/slic3r/GUI/GUI_Preview.cpp:242 src/libslic3r/ExtrusionEntity.cpp:313 msgid "Internal infill" msgstr "내부 채움" -#: src/slic3r/GUI/GUI_Preview.cpp:238 src/libslic3r/PrintConfig.cpp:1736 -#: src/libslic3r/PrintConfig.cpp:1746 src/libslic3r/GCode/PreviewData.cpp:167 +#: src/slic3r/GUI/GUI_Preview.cpp:243 src/libslic3r/ExtrusionEntity.cpp:314 +#: src/libslic3r/PrintConfig.cpp:1766 src/libslic3r/PrintConfig.cpp:1777 msgid "Solid infill" msgstr "솔리드 인필" -#: src/slic3r/GUI/GUI_Preview.cpp:239 src/libslic3r/PrintConfig.cpp:2068 -#: src/libslic3r/PrintConfig.cpp:2079 src/libslic3r/GCode/PreviewData.cpp:168 +#: src/slic3r/GUI/GUI_Preview.cpp:244 src/libslic3r/ExtrusionEntity.cpp:315 +#: src/libslic3r/PrintConfig.cpp:2115 src/libslic3r/PrintConfig.cpp:2127 msgid "Top solid infill" msgstr "가장 윗부분 채움" -#: src/slic3r/GUI/GUI_Preview.cpp:240 src/libslic3r/GCode/PreviewData.cpp:169 +#: src/slic3r/GUI/GUI_Preview.cpp:245 src/libslic3r/ExtrusionEntity.cpp:316 msgid "Bridge infill" msgstr "브릿지 채움" -#: src/slic3r/GUI/GUI_Preview.cpp:241 src/libslic3r/PrintConfig.cpp:895 -#: src/libslic3r/GCode/PreviewData.cpp:170 +#: src/slic3r/GUI/GUI_Preview.cpp:246 src/libslic3r/ExtrusionEntity.cpp:317 +#: src/libslic3r/PrintConfig.cpp:919 msgid "Gap fill" msgstr "공백 채움" -#: src/slic3r/GUI/GUI_Preview.cpp:242 src/slic3r/GUI/Tab.cpp:1061 -#: src/libslic3r/GCode/PreviewData.cpp:171 +#: src/slic3r/GUI/GUI_Preview.cpp:247 src/slic3r/GUI/Tab.cpp:1101 +#: src/libslic3r/ExtrusionEntity.cpp:318 msgid "Skirt" msgstr "스커트" -#: src/slic3r/GUI/GUI_Preview.cpp:244 src/libslic3r/PrintConfig.cpp:1954 -#: src/libslic3r/GCode/PreviewData.cpp:173 +#: src/slic3r/GUI/GUI_Preview.cpp:249 src/libslic3r/ExtrusionEntity.cpp:320 +#: src/libslic3r/PrintConfig.cpp:2001 msgid "Support material interface" -msgstr "서포트 재료 인터페이스" +msgstr "서포트 접점" -#: src/slic3r/GUI/GUI_Preview.cpp:245 src/slic3r/GUI/Tab.cpp:1141 -#: src/libslic3r/GCode/PreviewData.cpp:174 +#: src/slic3r/GUI/GUI_Preview.cpp:250 src/slic3r/GUI/Tab.cpp:1181 +#: src/libslic3r/ExtrusionEntity.cpp:321 msgid "Wipe tower" msgstr "와이프 타워(Wipe tower)" -#: src/slic3r/GUI/GUI_Preview.cpp:250 src/libslic3r/PrintConfig.cpp:2102 +#: src/slic3r/GUI/GUI_Preview.cpp:255 src/libslic3r/PrintConfig.cpp:2162 msgid "Travel" msgstr "이송" -#: src/slic3r/GUI/GUI_Preview.cpp:251 +#: src/slic3r/GUI/GUI_Preview.cpp:256 msgid "Retractions" msgstr "리트랙션" -#: src/slic3r/GUI/GUI_Preview.cpp:252 +#: src/slic3r/GUI/GUI_Preview.cpp:257 msgid "Unretractions" msgstr "리트랙션 취소" -#: src/slic3r/GUI/GUI_Preview.cpp:253 +#: src/slic3r/GUI/GUI_Preview.cpp:258 msgid "Shells" -msgstr "쉘" +msgstr "쉘(Shells)" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:13 src/slic3r/GUI/MainFrame.cpp:672 +#: src/slic3r/GUI/GUI_Preview.cpp:259 +msgid "Legend" +msgstr "범례" + +#: src/slic3r/GUI/Job.hpp:123 +msgid "ERROR: not enough resources to execute a new job." +msgstr "오류: 새 작업을 실행하기에 충분한 리소스가 없습니다." + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:14 src/slic3r/GUI/MainFrame.cpp:710 msgid "Keyboard Shortcuts" -msgstr "키보드 바로 가기" +msgstr "키보드 단축기" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:104 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:107 msgid "Open project STL/OBJ/AMF/3MF with config, delete bed" -msgstr "구성으로 프로젝트 STL/OBJ/AMF/3MF 열기, 배드 삭제" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:105 -msgid "Import STL/OBJ/AMF/3MF without config, keep bed" -msgstr "구성 없이 STL/OBJ/AMF/3MF 가져오기, 배드 유지" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:106 -msgid "Load Config from .ini/amf/3mf/gcode" -msgstr ".Ini/amf/3mf/gcode에서 구성 로드" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:107 src/slic3r/GUI/Plater.cpp:822 -#: src/slic3r/GUI/Plater.cpp:4687 src/libslic3r/PrintConfig.cpp:3127 -msgid "Export G-code" -msgstr "G-코드 내보내기" +msgstr "프로젝트 구성 열기(STL/OBJ/AMF/3MF), 배드 삭제" #: src/slic3r/GUI/KBShortcutsDialog.cpp:108 +msgid "Import STL/OBJ/AMF/3MF without config, keep bed" +msgstr "구성 없이 가져오기(STL/OBJ/AMF/3MF), 배드 유지" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:109 +msgid "Load Config from .ini/amf/3mf/gcode" +msgstr ".Ini/amf/3mf/gcode에서 구성 가져오기" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:110 src/slic3r/GUI/Plater.cpp:888 +#: src/slic3r/GUI/Plater.cpp:5544 src/libslic3r/PrintConfig.cpp:3348 +msgid "Export G-code" +msgstr "G-code 내보내기" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:111 msgid "Save project (3MF)" msgstr "프로젝트 저장 (3MF)" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:109 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:112 msgid "Load Config from .ini/amf/3mf/gcode and merge" -msgstr ".Ini/amf/3mf/gcode 및 병합에서 구성 로드" +msgstr ".Ini/amf/3mf/gcode 및 병합에서 구성 가져오기" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:110 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:113 msgid "(Re)slice" msgstr "(Re)슬라이스" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:113 -msgid "Select Plater Tab" -msgstr "선택 및 플래이트 탭" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:115 -msgid "Select Print Settings Tab" -msgstr "인쇄 설정 탭을 선택 합니다" - #: src/slic3r/GUI/KBShortcutsDialog.cpp:116 -msgid "Select Filament Settings Tab" -msgstr "필라멘트 설정 탭 선택" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:117 -msgid "Select Printer Settings Tab" -msgstr "프린터 설정 탭을 선택 합니다" +msgid "Select Plater Tab" +msgstr "선택 및 플래이터 탭" #: src/slic3r/GUI/KBShortcutsDialog.cpp:118 +msgid "Select Print Settings Tab" +msgstr "인쇄 설정을 선택 합니다" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:119 +msgid "Select Filament Settings Tab" +msgstr "필라멘트 설정을 선택" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:120 +msgid "Select Printer Settings Tab" +msgstr "프린터 설정을 선택 합니다" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:121 msgid "Switch to 3D" msgstr "3D로 전환" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:119 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:122 msgid "Switch to Preview" msgstr "미리 보기로 전환" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:120 src/slic3r/GUI/Preferences.cpp:10 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:123 src/slic3r/GUI/Preferences.cpp:10 msgid "Preferences" msgstr "기본 설정" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:121 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:124 #: src/slic3r/GUI/PrintHostDialogs.cpp:136 msgid "Print host upload queue" -msgstr "호스트 업로드 대기열 인쇄" +msgstr "프린터 호스트 업로드 대기" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:122 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:125 msgid "Camera view" msgstr "카메라 뷰" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:123 -msgid "Add Instance of the selected object" -msgstr "선택한 개체의 복제본 추가" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:124 -msgid "Remove Instance of the selected object" -msgstr "선택한 개체의 복제본 제거" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:125 -msgid "Show keyboard shortcuts list" -msgstr "바로 가기 키 목록 표시" - #: src/slic3r/GUI/KBShortcutsDialog.cpp:126 -msgid "Press to select multiple object or move multiple object with mouse" -msgstr "여러 개체를 선택 하거나 마우스로 여러 개체를 이동 하려면 누릅니다" +msgid "Add Instance of the selected object" +msgstr "선택한 객체(object)의 복제본 추가" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:127 +msgid "Remove Instance of the selected object" +msgstr "선택한 객체(object)의 복제본 제거" #: src/slic3r/GUI/KBShortcutsDialog.cpp:128 +msgid "Show keyboard shortcuts list" +msgstr "단축 키 목록 표시" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:129 +msgid "Press to select multiple object or move multiple object with mouse" +msgstr "" +"여러 객체(object)를 선택 하거나 마우스로 여러 객체(object)를 이동 하려면 누릅" +"니다" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:131 msgid "Main Shortcuts" msgstr "주요 단축키" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:135 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:139 msgid "Select All objects" -msgstr "모든 객체 선택" +msgstr "모든 객체(object) 선택" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:136 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:140 msgid "Delete selected" msgstr "선택 삭제" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:137 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:141 msgid "Delete All" msgstr "전부 지움" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:138 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:142 msgid "Copy to clipboard" msgstr "클립보드로 복사" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:139 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:143 msgid "Paste from clipboard" msgstr "클립보드에서 붙여넣기" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:140 -msgid "Gizmo move" -msgstr "객체 이동" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:141 -msgid "Gizmo scale" -msgstr "객체 배율" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:142 -msgid "Gizmo rotate" -msgstr "객체 회전" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:143 -msgid "Gizmo cut" -msgstr "기즈모 자르기" - #: src/slic3r/GUI/KBShortcutsDialog.cpp:144 -msgid "Gizmo Place face on bed" -msgstr "기즈모를 배드위에서" +msgid "Gizmo move" +msgstr "개체(Gizmo) 이동" #: src/slic3r/GUI/KBShortcutsDialog.cpp:145 -msgid "Gizmo SLA support points" -msgstr "객체 SLA 지원 포인트" +msgid "Gizmo scale" +msgstr "개체(Gizmo) 배율" #: src/slic3r/GUI/KBShortcutsDialog.cpp:146 -#, c-format +msgid "Gizmo rotate" +msgstr "개체(Gizmo) 회전" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:147 +msgid "Gizmo cut" +msgstr "개체(Gizmo) 자르기" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:148 +msgid "Gizmo Place face on bed" +msgstr "개체(Gizmo)를 배드위로" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:149 +msgid "Gizmo SLA support points" +msgstr "SLA 개체(Gizmo) 서포트 지점들" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:150 +#, no-c-format msgid "" "Press to activate selection rectangle\n" "or to snap by 5% in Gizmo scale\n" "or to snap by 1mm in Gizmo move" msgstr "" "활성화된 사각형을 선택합니다.\n" -"5% in 객체 크기를 스냅에 맞춰 조절합니다.\n" -"1mm 씩 객체를 스냅에 맞추 이동합니다." +"5% in 객체(object) 크기를 스냅에 맞춰 조절합니다.\n" +"1mm 씩 객체(object)를 스냅에 맞추 이동합니다." -#: src/slic3r/GUI/KBShortcutsDialog.cpp:147 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:151 msgid "" "Press to scale selection to fit print volume\n" "in Gizmo scale" -msgstr "" -"인쇄 볼륨에 맞게 선택 크기를 조정하려면 누릅니다.\n" -"기즈모 스케일" +msgstr "개체(Gizmo)크기를 인쇄 볼륨에 맞게 조정하려면 누릅니다." -#: src/slic3r/GUI/KBShortcutsDialog.cpp:148 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:152 msgid "" "Press to activate deselection rectangle\n" "or to scale or rotate selected objects\n" "around their own center" msgstr "" -"자신의 중심 주변\n" -"선택한 개체의 크기를 조정 하거나\n" +"중재봉선 주변으로. 선택한 개체의 크기를 조정 하거나 \n" "회전 하려면 누릅니다" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:149 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:153 msgid "Press to activate one direction scaling in Gizmo scale" -msgstr "기즈모 크기 조절을 활성화 합니다." +msgstr "개체(Gizmo) 크기 조절을 활성화 합니다." -#: src/slic3r/GUI/KBShortcutsDialog.cpp:150 -msgid "Change camera type" -msgstr "카메라 유형 변경" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:154 +msgid "Change camera type (perspective, orthographic)" +msgstr "카메라 유형 변경(원근, 직교)" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:151 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:155 msgid "Zoom to Bed" msgstr "배드 확대" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:152 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:156 msgid "Zoom to all objects in scene, if none selected" -msgstr "장면의 모든 오브젝트로 확대/축소 (선택 하지 않은 경우)" +msgstr "모든 객체(object)를 확대/축소 (선택 하지 않은 경우)" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:153 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:157 msgid "Zoom to selected object" -msgstr "선택한 개체로 확대/축소" +msgstr "선택한 객체(object)를 확대/축소" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:154 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:158 msgid "Zoom in" msgstr "확대" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:155 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:159 msgid "Zoom out" -msgstr "줌 아웃" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:156 -msgid "Unselect gizmo / Clear selection" -msgstr "기즈모 선택을 취소 하거나 지우기" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:158 -msgid "Toggle picking pass texture rendering on/off" -msgstr "선택 패스 텍스처 렌더링 켜기/끄기 전환" +msgstr "축소" #: src/slic3r/GUI/KBShortcutsDialog.cpp:161 +msgid "Show/Hide object/instance labels" +msgstr "개체/인스턴스 레이블 표시/숨기기" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:163 +msgid "Show/Hide 3Dconnexion devices settings dialog" +msgstr "3Dconnexion 장치 설정 대화 상자 표시/숨기기" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:164 +msgid "Unselect gizmo / Clear selection" +msgstr "개체(Gizmo) 선택을 취소 하거나 지우기" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:170 msgid "Plater Shortcuts" msgstr "플레이터 단축기" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:176 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:187 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:185 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:197 msgid "Arrow Up" msgstr "위쪽 화살표" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:176 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:178 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:185 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:187 msgid "Upper Layer" msgstr "상위 레이어" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:177 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:188 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:186 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:198 msgid "Arrow Down" msgstr "아래쪽 화살표" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:177 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:179 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:186 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:188 msgid "Lower Layer" msgstr "하위 레이어" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:181 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:189 +msgid "Show/Hide (L)egend" +msgstr "표시/숨기기(L)egend" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:191 msgid "Preview Shortcuts" msgstr "미리보기 단축기" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:187 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:197 msgid "Move current slider thumb Up" -msgstr "현재 마우스 휠 슬라이더를 위로 이동" +msgstr "현재 마우스 휠을 위로 이동" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:188 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:198 msgid "Move current slider thumb Down" -msgstr "현재 마우스 휠 슬라이더를 아래로 이동" +msgstr "현재 마우스 휠을 아래로 이동" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:189 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:199 msgid "Arrow Left" msgstr "왼쪽 화살표" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:189 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:199 msgid "Set upper thumb to current slider thumb" msgstr "마우스 휠을 위로 움직여 설정" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:190 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:200 msgid "Arrow Right" msgstr "오른쪽 화살표" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:190 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:200 msgid "Set lower thumb to current slider thumb" msgstr "마우스 휠을 아래로 움직여 설정" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:191 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:201 msgid "Add color change marker for current layer" -msgstr "현재 레이어의 색상 변경 마커 추가" +msgstr "현재 레이어의 색상을 변경할 마커 추가" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:192 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:202 msgid "Delete color change marker for current layer" -msgstr "현재 레이어의 색상 변경 마커 삭제" +msgstr "현재 레이어의 색상을 변경할 마커 삭제" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:194 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:204 msgid "Layers Slider Shortcuts" msgstr "레이어 슬라이더 단축키" -#: src/slic3r/GUI/MainFrame.cpp:62 +#: src/slic3r/GUI/MainFrame.cpp:66 msgid "" " - Remember to check for updates at http://github.com/prusa3d/PrusaSlicer/" "releases" msgstr "" -" -http://github.com/prusa3d/slic3r/releases에서 업데이트를 확인하는 것을 잊" -"지 마십시오" +" -http://github.com/prusa3d/slic3r/releases에서 업데이트 확인하는 것을 잊지 " +"마십시오" -#: src/slic3r/GUI/MainFrame.cpp:157 +#: src/slic3r/GUI/MainFrame.cpp:174 msgid "based on Slic3r" msgstr "Slic3r 기반" -#: src/slic3r/GUI/MainFrame.cpp:187 +#: src/slic3r/GUI/MainFrame.cpp:204 msgid "Plater" msgstr "플레이터" -#: src/slic3r/GUI/MainFrame.cpp:393 +#: src/slic3r/GUI/MainFrame.cpp:405 msgid "&New Project" msgstr "&새로운 프로젝트" -#: src/slic3r/GUI/MainFrame.cpp:393 +#: src/slic3r/GUI/MainFrame.cpp:405 msgid "Start a new project" msgstr "새로운 프로젝트 시작" -#: src/slic3r/GUI/MainFrame.cpp:396 +#: src/slic3r/GUI/MainFrame.cpp:408 msgid "&Open Project" msgstr "&프로젝트 열기" -#: src/slic3r/GUI/MainFrame.cpp:396 +#: src/slic3r/GUI/MainFrame.cpp:408 msgid "Open a project file" msgstr "프로젝트 파일 열기" -#: src/slic3r/GUI/MainFrame.cpp:401 +#: src/slic3r/GUI/MainFrame.cpp:413 msgid "Recent projects" msgstr "최근 프로젝트" -#: src/slic3r/GUI/MainFrame.cpp:410 +#: src/slic3r/GUI/MainFrame.cpp:422 msgid "The selected project is no more available" msgstr "선택한 프로젝트를 더 이상 사용할 수 없습니다." -#: src/slic3r/GUI/MainFrame.cpp:410 src/slic3r/GUI/MainFrame.cpp:747 +#: src/slic3r/GUI/MainFrame.cpp:422 src/slic3r/GUI/MainFrame.cpp:787 #: src/slic3r/GUI/PrintHostDialogs.cpp:231 msgid "Error" msgstr "에러" -#: src/slic3r/GUI/MainFrame.cpp:434 +#: src/slic3r/GUI/MainFrame.cpp:446 msgid "&Save Project" msgstr "프로젝트 저장" -#: src/slic3r/GUI/MainFrame.cpp:434 +#: src/slic3r/GUI/MainFrame.cpp:446 msgid "Save current project file" msgstr "현재 프로젝트 파일 저장" -#: src/slic3r/GUI/MainFrame.cpp:438 src/slic3r/GUI/MainFrame.cpp:440 +#: src/slic3r/GUI/MainFrame.cpp:450 src/slic3r/GUI/MainFrame.cpp:452 msgid "Save Project &as" msgstr "프로젝트 저장" -#: src/slic3r/GUI/MainFrame.cpp:438 src/slic3r/GUI/MainFrame.cpp:440 +#: src/slic3r/GUI/MainFrame.cpp:450 src/slic3r/GUI/MainFrame.cpp:452 msgid "Save current project file as" msgstr "현재 프로젝트 파일을 다른 이름으로 저장" -#: src/slic3r/GUI/MainFrame.cpp:448 +#: src/slic3r/GUI/MainFrame.cpp:460 msgid "Import STL/OBJ/AM&F/3MF" msgstr "가져오기 STL/OBJ/AM&F/3MF" -#: src/slic3r/GUI/MainFrame.cpp:448 +#: src/slic3r/GUI/MainFrame.cpp:460 msgid "Load a model" msgstr "모델 로드" -#: src/slic3r/GUI/MainFrame.cpp:452 +#: src/slic3r/GUI/MainFrame.cpp:464 msgid "Import &Config" msgstr "&구성 가져오기" -#: src/slic3r/GUI/MainFrame.cpp:452 +#: src/slic3r/GUI/MainFrame.cpp:464 msgid "Load exported configuration file" msgstr "내 보낸 구성 파일로드" -#: src/slic3r/GUI/MainFrame.cpp:454 +#: src/slic3r/GUI/MainFrame.cpp:467 msgid "Import Config from &project" msgstr "프로젝트에서 설정 가져오기" -#: src/slic3r/GUI/MainFrame.cpp:454 +#: src/slic3r/GUI/MainFrame.cpp:467 msgid "Load configuration from project file" msgstr "프로젝트 파일에서 구성 로드" -#: src/slic3r/GUI/MainFrame.cpp:457 +#: src/slic3r/GUI/MainFrame.cpp:471 msgid "Import Config &Bundle" msgstr "번들 &설정 가져오기" -#: src/slic3r/GUI/MainFrame.cpp:457 +#: src/slic3r/GUI/MainFrame.cpp:471 msgid "Load presets from a bundle" -msgstr "번들에서 미리 설정로드" +msgstr "미리 설정 번들값 가져오기" -#: src/slic3r/GUI/MainFrame.cpp:459 +#: src/slic3r/GUI/MainFrame.cpp:474 msgid "&Import" msgstr "&가져오기" -#: src/slic3r/GUI/MainFrame.cpp:462 src/slic3r/GUI/MainFrame.cpp:708 +#: src/slic3r/GUI/MainFrame.cpp:477 src/slic3r/GUI/MainFrame.cpp:751 msgid "Export &G-code" -msgstr "G-코드 내보내기" +msgstr "G-code 내보내기" -#: src/slic3r/GUI/MainFrame.cpp:462 +#: src/slic3r/GUI/MainFrame.cpp:477 msgid "Export current plate as G-code" msgstr "현재 플레이터를 G 코드로 내보내기" -#: src/slic3r/GUI/MainFrame.cpp:466 src/slic3r/GUI/MainFrame.cpp:709 +#: src/slic3r/GUI/MainFrame.cpp:481 src/slic3r/GUI/MainFrame.cpp:752 msgid "S&end G-code" msgstr "S&엔드 G- 코드" -#: src/slic3r/GUI/MainFrame.cpp:466 +#: src/slic3r/GUI/MainFrame.cpp:481 msgid "Send to print current plate as G-code" msgstr "현재 플레이트를 G 코드로 인쇄하기 위해 보내기" -#: src/slic3r/GUI/MainFrame.cpp:471 +#: src/slic3r/GUI/MainFrame.cpp:486 msgid "Export plate as &STL" msgstr "STL로 내보내기" -#: src/slic3r/GUI/MainFrame.cpp:471 +#: src/slic3r/GUI/MainFrame.cpp:486 msgid "Export current plate as STL" msgstr "현재 플레이터를 STL로 내보내기" -#: src/slic3r/GUI/MainFrame.cpp:474 -msgid "Export plate as STL including supports" -msgstr "서포트를 포함하여 STL파일로 내보내기" +#: src/slic3r/GUI/MainFrame.cpp:489 +msgid "Export plate as STL &including supports" +msgstr "서포트를 포함하여 플레이터를 STL로 내보내기" -#: src/slic3r/GUI/MainFrame.cpp:474 +#: src/slic3r/GUI/MainFrame.cpp:489 msgid "Export current plate as STL including supports" msgstr "서포트를 포함 하여 현재 플레이터를 STL로 내보내기" -#: src/slic3r/GUI/MainFrame.cpp:477 +#: src/slic3r/GUI/MainFrame.cpp:492 msgid "Export plate as &AMF" msgstr "AMF로 내보내기" -#: src/slic3r/GUI/MainFrame.cpp:477 +#: src/slic3r/GUI/MainFrame.cpp:492 msgid "Export current plate as AMF" -msgstr "현재 플레이터를AMF로 내보내기" +msgstr "현재 플레이터를 AMF로 내보내기" -#: src/slic3r/GUI/MainFrame.cpp:481 +#: src/slic3r/GUI/MainFrame.cpp:496 +msgid "Export &toolpaths as OBJ" +msgstr "OBJ로 내보내기 및 공구 경로" + +#: src/slic3r/GUI/MainFrame.cpp:496 +msgid "Export toolpaths as OBJ" +msgstr "도구 경로를 OBJ로 내보내기" + +#: src/slic3r/GUI/MainFrame.cpp:500 msgid "Export &Config" msgstr "&구성 내보내기" -#: src/slic3r/GUI/MainFrame.cpp:481 +#: src/slic3r/GUI/MainFrame.cpp:500 msgid "Export current configuration to file" msgstr "현재 구성을 파일로 내보내기" -#: src/slic3r/GUI/MainFrame.cpp:483 +#: src/slic3r/GUI/MainFrame.cpp:503 msgid "Export Config &Bundle" msgstr "번들 & 내보내기 설정" -#: src/slic3r/GUI/MainFrame.cpp:483 +#: src/slic3r/GUI/MainFrame.cpp:503 msgid "Export all presets to file" msgstr "모든 이전 설정을 파일로 내보내기" -#: src/slic3r/GUI/MainFrame.cpp:485 +#: src/slic3r/GUI/MainFrame.cpp:506 msgid "&Export" msgstr "&내보내기" -#: src/slic3r/GUI/MainFrame.cpp:491 +#: src/slic3r/GUI/MainFrame.cpp:512 msgid "Quick Slice" msgstr "빠른 슬라이스" -#: src/slic3r/GUI/MainFrame.cpp:491 +#: src/slic3r/GUI/MainFrame.cpp:512 msgid "Slice a file into a G-code" msgstr "파일을 G 코드로 분할" -#: src/slic3r/GUI/MainFrame.cpp:497 +#: src/slic3r/GUI/MainFrame.cpp:518 msgid "Quick Slice and Save As" msgstr "빠른 슬라이스 및 다른 이름으로 저장" -#: src/slic3r/GUI/MainFrame.cpp:497 +#: src/slic3r/GUI/MainFrame.cpp:518 msgid "Slice a file into a G-code, save as" -msgstr "파일을 G 코드로 분할하고 다음으로 저장" +msgstr "파일을 G 코드로 분할하고 다른 이름으로 저장" -#: src/slic3r/GUI/MainFrame.cpp:503 +#: src/slic3r/GUI/MainFrame.cpp:524 msgid "Repeat Last Quick Slice" msgstr "마지막으로 빠른 슬라이스 반복" -#: src/slic3r/GUI/MainFrame.cpp:503 +#: src/slic3r/GUI/MainFrame.cpp:524 msgid "Repeat last quick slice" msgstr "마지막으로 빠른 슬라이스 반복" -#: src/slic3r/GUI/MainFrame.cpp:511 +#: src/slic3r/GUI/MainFrame.cpp:532 msgid "(Re)Slice No&w" msgstr "지금(다시)자르기" -#: src/slic3r/GUI/MainFrame.cpp:511 +#: src/slic3r/GUI/MainFrame.cpp:532 msgid "Start new slicing process" msgstr "새로운 슬라이싱 작업 시작" -#: src/slic3r/GUI/MainFrame.cpp:515 +#: src/slic3r/GUI/MainFrame.cpp:536 msgid "&Repair STL file" msgstr "STL 파일 복구" -#: src/slic3r/GUI/MainFrame.cpp:515 +#: src/slic3r/GUI/MainFrame.cpp:536 msgid "Automatically repair an STL file" msgstr "STL 파일을 자동으로 복구합니다" -#: src/slic3r/GUI/MainFrame.cpp:518 +#: src/slic3r/GUI/MainFrame.cpp:540 msgid "&Quit" msgstr "&종료" -#: src/slic3r/GUI/MainFrame.cpp:518 +#: src/slic3r/GUI/MainFrame.cpp:540 #, c-format msgid "Quit %s" msgstr "%s 종료" -#: src/slic3r/GUI/MainFrame.cpp:543 +#: src/slic3r/GUI/MainFrame.cpp:565 msgid "&Select all" msgstr "&모두 선택 " -#: src/slic3r/GUI/MainFrame.cpp:544 +#: src/slic3r/GUI/MainFrame.cpp:566 msgid "Selects all objects" -msgstr "모든 개체를 선택 합니다" +msgstr "모든 객체(object)를 선택 합니다" -#: src/slic3r/GUI/MainFrame.cpp:546 +#: src/slic3r/GUI/MainFrame.cpp:568 msgid "D&eselect all" -msgstr "선택 취소 D&select+" +msgstr "모든 선택 취소 D&select" -#: src/slic3r/GUI/MainFrame.cpp:547 +#: src/slic3r/GUI/MainFrame.cpp:569 msgid "Deselects all objects" -msgstr "모든 객체 선택 취소" +msgstr "모든 객체(object) 선택 취소" -#: src/slic3r/GUI/MainFrame.cpp:550 +#: src/slic3r/GUI/MainFrame.cpp:572 msgid "&Delete selected" msgstr "&선택 삭제 " -#: src/slic3r/GUI/MainFrame.cpp:551 +#: src/slic3r/GUI/MainFrame.cpp:573 msgid "Deletes the current selection" msgstr "현재 선택 영역을 삭제 합니다" -#: src/slic3r/GUI/MainFrame.cpp:553 +#: src/slic3r/GUI/MainFrame.cpp:575 msgid "Delete &all" msgstr "전부 지움 " -#: src/slic3r/GUI/MainFrame.cpp:554 +#: src/slic3r/GUI/MainFrame.cpp:576 msgid "Deletes all objects" -msgstr "모든 객체를 삭제 합니다" +msgstr "모든 객체(object)를 삭제 합니다" -#: src/slic3r/GUI/MainFrame.cpp:558 +#: src/slic3r/GUI/MainFrame.cpp:580 msgid "&Undo" msgstr "&되돌리기" -#: src/slic3r/GUI/MainFrame.cpp:561 +#: src/slic3r/GUI/MainFrame.cpp:583 msgid "&Redo" msgstr "&앞으로" -#: src/slic3r/GUI/MainFrame.cpp:566 +#: src/slic3r/GUI/MainFrame.cpp:588 msgid "&Copy" msgstr "&복사 " -#: src/slic3r/GUI/MainFrame.cpp:567 +#: src/slic3r/GUI/MainFrame.cpp:589 msgid "Copy selection to clipboard" msgstr "선택영역을 클립보드로 복사합니다" -#: src/slic3r/GUI/MainFrame.cpp:569 +#: src/slic3r/GUI/MainFrame.cpp:591 msgid "&Paste" msgstr "&붙이기 " -#: src/slic3r/GUI/MainFrame.cpp:570 +#: src/slic3r/GUI/MainFrame.cpp:592 msgid "Paste clipboard" msgstr "클립보드 붙여넣기" -#: src/slic3r/GUI/MainFrame.cpp:579 +#: src/slic3r/GUI/MainFrame.cpp:596 +msgid "Re&load from disk" +msgstr "디스크에서 다시 로드" + +#: src/slic3r/GUI/MainFrame.cpp:597 +msgid "Reload the plater from disk" +msgstr "디스크에서 플래터 다시 로드" + +#: src/slic3r/GUI/MainFrame.cpp:606 msgid "&Plater Tab" msgstr "&선택 및 플래이터 탭" -#: src/slic3r/GUI/MainFrame.cpp:579 +#: src/slic3r/GUI/MainFrame.cpp:606 msgid "Show the plater" msgstr "플레이터를 보기" -#: src/slic3r/GUI/MainFrame.cpp:586 +#: src/slic3r/GUI/MainFrame.cpp:614 msgid "P&rint Settings Tab" msgstr "프린트 설정 탭" -#: src/slic3r/GUI/MainFrame.cpp:586 +#: src/slic3r/GUI/MainFrame.cpp:614 msgid "Show the print settings" msgstr "인쇄 설정 표시" -#: src/slic3r/GUI/MainFrame.cpp:588 src/slic3r/GUI/MainFrame.cpp:711 +#: src/slic3r/GUI/MainFrame.cpp:617 src/slic3r/GUI/MainFrame.cpp:754 msgid "&Filament Settings Tab" msgstr "&필라멘트 설정 탭" -#: src/slic3r/GUI/MainFrame.cpp:588 +#: src/slic3r/GUI/MainFrame.cpp:617 msgid "Show the filament settings" msgstr "필라멘트 설정보기" -#: src/slic3r/GUI/MainFrame.cpp:591 +#: src/slic3r/GUI/MainFrame.cpp:621 msgid "Print&er Settings Tab" msgstr "설정 인쇄 탭" -#: src/slic3r/GUI/MainFrame.cpp:591 +#: src/slic3r/GUI/MainFrame.cpp:621 msgid "Show the printer settings" msgstr "간단한 설정보기" -#: src/slic3r/GUI/MainFrame.cpp:595 +#: src/slic3r/GUI/MainFrame.cpp:626 msgid "3&D" msgstr "3&D" -#: src/slic3r/GUI/MainFrame.cpp:595 +#: src/slic3r/GUI/MainFrame.cpp:626 msgid "Show the 3D editing view" msgstr "3D 편집용 보기 표시" -#: src/slic3r/GUI/MainFrame.cpp:598 +#: src/slic3r/GUI/MainFrame.cpp:629 msgid "Pre&view" msgstr "미리 보기" -#: src/slic3r/GUI/MainFrame.cpp:598 +#: src/slic3r/GUI/MainFrame.cpp:629 msgid "Show the 3D slices preview" msgstr "3D 슬라이스 미리 보기 표시" -#: src/slic3r/GUI/MainFrame.cpp:617 +#: src/slic3r/GUI/MainFrame.cpp:648 msgid "Print &Host Upload Queue" -msgstr "호스트 업로드 대기열 인쇄" +msgstr "프린터 호스트 업로드 대기" -#: src/slic3r/GUI/MainFrame.cpp:617 +#: src/slic3r/GUI/MainFrame.cpp:648 msgid "Display the Print Host Upload Queue window" msgstr "호스트 업로드 대기열 인쇄 창 표시" -#: src/slic3r/GUI/MainFrame.cpp:626 +#: src/slic3r/GUI/MainFrame.cpp:658 msgid "Iso" msgstr "기본 " -#: src/slic3r/GUI/MainFrame.cpp:626 +#: src/slic3r/GUI/MainFrame.cpp:658 msgid "Iso View" msgstr "표준 보기" #. TRN To be shown in the main menu View->Top #. TRN To be shown in Print Settings "Top solid layers" -#: src/slic3r/GUI/MainFrame.cpp:630 src/libslic3r/PrintConfig.cpp:2094 +#: src/slic3r/GUI/MainFrame.cpp:662 src/libslic3r/PrintConfig.cpp:2142 +#: src/libslic3r/PrintConfig.cpp:2151 msgid "Top" msgstr "윗부분 " -#: src/slic3r/GUI/MainFrame.cpp:630 +#: src/slic3r/GUI/MainFrame.cpp:662 msgid "Top View" msgstr "위에서 보기" #. TRN To be shown in the main menu View->Bottom #. TRN To be shown in Print Settings "Bottom solid layers" -#: src/slic3r/GUI/MainFrame.cpp:633 src/libslic3r/PrintConfig.cpp:159 +#. TRN To be shown in Print Settings "Top solid layers" +#: src/slic3r/GUI/MainFrame.cpp:665 src/libslic3r/PrintConfig.cpp:164 +#: src/libslic3r/PrintConfig.cpp:173 msgid "Bottom" msgstr "바닥 " -#: src/slic3r/GUI/MainFrame.cpp:633 +#: src/slic3r/GUI/MainFrame.cpp:665 msgid "Bottom View" msgstr "바닥 보기" -#: src/slic3r/GUI/MainFrame.cpp:635 +#: src/slic3r/GUI/MainFrame.cpp:667 msgid "Front" msgstr "앞 " -#: src/slic3r/GUI/MainFrame.cpp:635 +#: src/slic3r/GUI/MainFrame.cpp:667 msgid "Front View" msgstr "앞면 보기 " -#: src/slic3r/GUI/MainFrame.cpp:637 src/libslic3r/PrintConfig.cpp:1611 +#: src/slic3r/GUI/MainFrame.cpp:669 src/libslic3r/PrintConfig.cpp:1641 msgid "Rear" msgstr "뒷면 " -#: src/slic3r/GUI/MainFrame.cpp:637 +#: src/slic3r/GUI/MainFrame.cpp:669 msgid "Rear View" msgstr "뒷면 보기" -#: src/slic3r/GUI/MainFrame.cpp:639 +#: src/slic3r/GUI/MainFrame.cpp:671 msgid "Left" msgstr "왼쪽 " -#: src/slic3r/GUI/MainFrame.cpp:639 +#: src/slic3r/GUI/MainFrame.cpp:671 msgid "Left View" msgstr "왼쪽 보기" -#: src/slic3r/GUI/MainFrame.cpp:641 +#: src/slic3r/GUI/MainFrame.cpp:673 msgid "Right" msgstr "오른쪽 " -#: src/slic3r/GUI/MainFrame.cpp:641 +#: src/slic3r/GUI/MainFrame.cpp:673 msgid "Right View" msgstr "오른쪽 보기" -#: src/slic3r/GUI/MainFrame.cpp:648 +#: src/slic3r/GUI/MainFrame.cpp:677 +msgid "Show &labels" +msgstr "레이블 & 표시 " + +#: src/slic3r/GUI/MainFrame.cpp:677 +msgid "Show object/instance labels in 3D scene" +msgstr "3D 장면에서 오브젝트/인스턴스 레이블 표시" + +#: src/slic3r/GUI/MainFrame.cpp:686 msgid "Prusa 3D &Drivers" msgstr "푸르사 3D 드라이버" -#: src/slic3r/GUI/MainFrame.cpp:648 +#: src/slic3r/GUI/MainFrame.cpp:686 msgid "Open the Prusa3D drivers download page in your browser" msgstr "브라우저에서 Prusa3D 드라이버 다운로드 페이지를 엽니다" -#: src/slic3r/GUI/MainFrame.cpp:650 +#: src/slic3r/GUI/MainFrame.cpp:688 msgid "Software &Releases" msgstr "소프트웨어 &자료" -#: src/slic3r/GUI/MainFrame.cpp:650 +#: src/slic3r/GUI/MainFrame.cpp:688 msgid "Open the software releases page in your browser" msgstr "브라우저에서 소프트웨어 정보 페이지 열기" -#: src/slic3r/GUI/MainFrame.cpp:656 +#: src/slic3r/GUI/MainFrame.cpp:694 #, c-format msgid "%s &Website" msgstr "%s &웹사이트" -#: src/slic3r/GUI/MainFrame.cpp:657 +#: src/slic3r/GUI/MainFrame.cpp:695 #, c-format msgid "Open the %s website in your browser" msgstr "%s 웹사이트를 브라우저에서 열기" -#: src/slic3r/GUI/MainFrame.cpp:663 +#: src/slic3r/GUI/MainFrame.cpp:701 msgid "System &Info" msgstr "시스템 정보" -#: src/slic3r/GUI/MainFrame.cpp:663 +#: src/slic3r/GUI/MainFrame.cpp:701 msgid "Show system information" msgstr "시스템 정보 표시" -#: src/slic3r/GUI/MainFrame.cpp:665 +#: src/slic3r/GUI/MainFrame.cpp:703 msgid "Show &Configuration Folder" msgstr "폴더 표시 및 구성" -#: src/slic3r/GUI/MainFrame.cpp:665 +#: src/slic3r/GUI/MainFrame.cpp:703 msgid "Show user configuration folder (datadir)" -msgstr "사용자 구성 폴더 표시 (datadir)" +msgstr "사용자 구성 폴더를 표시 (datadir)" -#: src/slic3r/GUI/MainFrame.cpp:667 +#: src/slic3r/GUI/MainFrame.cpp:705 msgid "Report an I&ssue" msgstr "문제를 보고" -#: src/slic3r/GUI/MainFrame.cpp:667 +#: src/slic3r/GUI/MainFrame.cpp:705 #, c-format msgid "Report an issue on %s" msgstr "%s에 문제 보고" -#: src/slic3r/GUI/MainFrame.cpp:669 +#: src/slic3r/GUI/MainFrame.cpp:707 #, c-format msgid "&About %s" msgstr "%s 에 대하여" -#: src/slic3r/GUI/MainFrame.cpp:669 +#: src/slic3r/GUI/MainFrame.cpp:707 msgid "Show about dialog" msgstr "다이얼로그 표시" -#: src/slic3r/GUI/MainFrame.cpp:672 +#: src/slic3r/GUI/MainFrame.cpp:710 msgid "Show the list of the keyboard shortcuts" msgstr "키보드 단축키 목록 표시" -#: src/slic3r/GUI/MainFrame.cpp:680 +#: src/slic3r/GUI/MainFrame.cpp:723 msgid "&File" msgstr "&파일" -#: src/slic3r/GUI/MainFrame.cpp:681 +#: src/slic3r/GUI/MainFrame.cpp:724 msgid "&Edit" msgstr "&수정" -#: src/slic3r/GUI/MainFrame.cpp:682 +#: src/slic3r/GUI/MainFrame.cpp:725 msgid "&Window" msgstr "&윈도우" -#: src/slic3r/GUI/MainFrame.cpp:683 +#: src/slic3r/GUI/MainFrame.cpp:726 msgid "&View" msgstr "&시점" -#: src/slic3r/GUI/MainFrame.cpp:686 +#: src/slic3r/GUI/MainFrame.cpp:729 msgid "&Help" msgstr "&도움말" -#: src/slic3r/GUI/MainFrame.cpp:708 +#: src/slic3r/GUI/MainFrame.cpp:751 msgid "E&xport" msgstr "보내기" -#: src/slic3r/GUI/MainFrame.cpp:709 +#: src/slic3r/GUI/MainFrame.cpp:752 msgid "S&end to print" msgstr "끝내고 프린트" -#: src/slic3r/GUI/MainFrame.cpp:711 +#: src/slic3r/GUI/MainFrame.cpp:754 msgid "Mate&rial Settings Tab" msgstr "재료(메터리리알) 설정 탭" -#: src/slic3r/GUI/MainFrame.cpp:732 +#: src/slic3r/GUI/MainFrame.cpp:775 msgid "Choose a file to slice (STL/OBJ/AMF/3MF/PRUSA):" msgstr "슬라이스 할 파일을 선택하십시오 (STL / OBJ / AMF / 3MF / PRUSA):" -#: src/slic3r/GUI/MainFrame.cpp:746 +#: src/slic3r/GUI/MainFrame.cpp:786 msgid "No previously sliced file." msgstr "이전에 분리 된 파일이 없습니다." -#: src/slic3r/GUI/MainFrame.cpp:752 +#: src/slic3r/GUI/MainFrame.cpp:792 msgid "Previously sliced file (" msgstr "이전에 분리 된 파일 (" -#: src/slic3r/GUI/MainFrame.cpp:752 +#: src/slic3r/GUI/MainFrame.cpp:792 msgid ") not found." msgstr ")을 찾을 수 없습니다." -#: src/slic3r/GUI/MainFrame.cpp:753 +#: src/slic3r/GUI/MainFrame.cpp:793 msgid "File Not Found" msgstr "파일을 찾을수 없다" -#: src/slic3r/GUI/MainFrame.cpp:788 +#: src/slic3r/GUI/MainFrame.cpp:828 #, c-format msgid "Save %s file as:" -msgstr "%s 파일을 다음과 같이 저장 합니다" +msgstr "%s 파일을 저장 합니다:" -#: src/slic3r/GUI/MainFrame.cpp:788 +#: src/slic3r/GUI/MainFrame.cpp:828 msgid "SVG" msgstr "Svg" -#: src/slic3r/GUI/MainFrame.cpp:788 +#: src/slic3r/GUI/MainFrame.cpp:828 msgid "G-code" msgstr "G 코드" -#: src/slic3r/GUI/MainFrame.cpp:803 +#: src/slic3r/GUI/MainFrame.cpp:840 msgid "Save zip file as:" msgstr "압축(zip)파일 다른이름 저장:" -#: src/slic3r/GUI/MainFrame.cpp:815 src/slic3r/GUI/Plater.cpp:2933 -#: src/slic3r/GUI/Plater.cpp:4418 src/slic3r/GUI/Tab.cpp:1170 -#: src/slic3r/GUI/Tab.cpp:3700 +#: src/slic3r/GUI/MainFrame.cpp:849 src/slic3r/GUI/Plater.cpp:3107 +#: src/slic3r/GUI/Plater.cpp:5126 src/slic3r/GUI/Tab.cpp:1211 +#: src/slic3r/GUI/Tab.cpp:3634 msgid "Slicing" msgstr "슬라이싱" #. TRN "Processing input_file_basename" -#: src/slic3r/GUI/MainFrame.cpp:817 +#: src/slic3r/GUI/MainFrame.cpp:851 #, c-format msgid "Processing %s" msgstr "처리 %s" -#: src/slic3r/GUI/MainFrame.cpp:840 +#: src/slic3r/GUI/MainFrame.cpp:874 msgid " was successfully sliced." msgstr " 성공적으로 슬라이스." -#: src/slic3r/GUI/MainFrame.cpp:842 +#: src/slic3r/GUI/MainFrame.cpp:876 msgid "Slicing Done!" msgstr "슬라이스 완료!" -#: src/slic3r/GUI/MainFrame.cpp:857 +#: src/slic3r/GUI/MainFrame.cpp:891 msgid "Select the STL file to repair:" msgstr "복구 할 STL 파일을 선택하십시오:" -#: src/slic3r/GUI/MainFrame.cpp:870 +#: src/slic3r/GUI/MainFrame.cpp:901 msgid "Save OBJ file (less prone to coordinate errors than STL) as:" msgstr "OBJ 파일을 저장하십시오 (STL보다 오류를 덜 조정할 가능성이 적음):" -#: src/slic3r/GUI/MainFrame.cpp:885 +#: src/slic3r/GUI/MainFrame.cpp:913 msgid "Your file was repaired." msgstr "파일이 복구되었습니다." -#: src/slic3r/GUI/MainFrame.cpp:885 src/libslic3r/PrintConfig.cpp:3221 +#: src/slic3r/GUI/MainFrame.cpp:913 src/libslic3r/PrintConfig.cpp:3442 msgid "Repair" msgstr "수정" -#: src/slic3r/GUI/MainFrame.cpp:899 +#: src/slic3r/GUI/MainFrame.cpp:927 msgid "Save configuration as:" msgstr "구성을 저장 :" -#: src/slic3r/GUI/MainFrame.cpp:919 src/slic3r/GUI/MainFrame.cpp:983 +#: src/slic3r/GUI/MainFrame.cpp:946 src/slic3r/GUI/MainFrame.cpp:1008 msgid "Select configuration to load:" -msgstr "로드 할 구성 선택 :" +msgstr "불러올 구성 선택 :" -#: src/slic3r/GUI/MainFrame.cpp:956 +#: src/slic3r/GUI/MainFrame.cpp:982 msgid "Save presets bundle as:" -msgstr "이전 설정 번들을 다음과 같이 저장 :" +msgstr "이전 번들 설정을 다음과 같이 저장 :" -#: src/slic3r/GUI/MainFrame.cpp:1007 +#: src/slic3r/GUI/MainFrame.cpp:1029 #, c-format msgid "%d presets successfully imported." msgstr "% d 사전 설정을 가져 왔습니다." +#: src/slic3r/GUI/Mouse3DController.cpp:291 +msgid "3Dconnexion settings" +msgstr "3Dconnexion 설정" + +#: src/slic3r/GUI/Mouse3DController.cpp:306 +msgid "Device:" +msgstr "장치:" + +#: src/slic3r/GUI/Mouse3DController.cpp:313 +msgid "Speed:" +msgstr "스피드:" + +#: src/slic3r/GUI/Mouse3DController.cpp:317 +#: src/slic3r/GUI/Mouse3DController.cpp:337 +#: src/slic3r/GUI/Mouse3DController.cpp:339 +msgid "Translation" +msgstr "번역" + +#: src/slic3r/GUI/Mouse3DController.cpp:326 +#: src/slic3r/GUI/Mouse3DController.cpp:337 +msgid "Zoom" +msgstr "확대" + +#: src/slic3r/GUI/Mouse3DController.cpp:332 +msgid "Deadzone:" +msgstr "데드존:" + #: src/slic3r/GUI/MsgDialog.cpp:73 #, c-format msgid "%s error" @@ -2927,137 +3945,184 @@ msgstr "%s 오류" msgid "%s has encountered an error" msgstr "%s에 오류가 발생 했습니다" -#: src/slic3r/GUI/Plater.cpp:146 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:56 +msgid "Instances" +msgstr "복제본" + +#: src/slic3r/GUI/ObjectDataViewModel.cpp:60 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:216 +#, c-format +msgid "Instance %d" +msgstr "복제본 %d" + +#: src/slic3r/GUI/ObjectDataViewModel.cpp:67 src/slic3r/GUI/Tab.cpp:3482 +#: src/slic3r/GUI/Tab.cpp:3572 +msgid "Layers" +msgstr "레이어" + +#: src/slic3r/GUI/ObjectDataViewModel.cpp:94 +msgid "Range" +msgstr "범위" + +#: src/slic3r/GUI/OptionsGroup.cpp:249 +msgctxt "Layers" +msgid "Top" +msgstr "윗부분 " + +#: src/slic3r/GUI/OptionsGroup.cpp:249 +msgctxt "Layers" +msgid "Bottom" +msgstr "바닥 " + +#: src/slic3r/GUI/Plater.cpp:163 msgid "Volume" msgstr "크기" -#: src/slic3r/GUI/Plater.cpp:147 +#: src/slic3r/GUI/Plater.cpp:164 msgid "Facets" msgstr "측면" -#: src/slic3r/GUI/Plater.cpp:148 +#: src/slic3r/GUI/Plater.cpp:165 msgid "Materials" msgstr "재료" -#: src/slic3r/GUI/Plater.cpp:151 +#: src/slic3r/GUI/Plater.cpp:168 msgid "Manifold" msgstr "많은" -#: src/slic3r/GUI/Plater.cpp:201 +#: src/slic3r/GUI/Plater.cpp:218 msgid "Sliced Info" msgstr "슬라이스된 정보" -#: src/slic3r/GUI/Plater.cpp:220 src/slic3r/GUI/Plater.cpp:1135 +#: src/slic3r/GUI/Plater.cpp:237 src/slic3r/GUI/Plater.cpp:1226 msgid "Used Filament (m)" msgstr "사용자 필라멘트 (m)" -#: src/slic3r/GUI/Plater.cpp:221 +#: src/slic3r/GUI/Plater.cpp:238 msgid "Used Filament (mm³)" msgstr "사용자 필라멘트 (mm³)" -#: src/slic3r/GUI/Plater.cpp:222 +#: src/slic3r/GUI/Plater.cpp:239 msgid "Used Filament (g)" msgstr "사용자 필라멘트 (g)" -#: src/slic3r/GUI/Plater.cpp:223 +#: src/slic3r/GUI/Plater.cpp:240 msgid "Used Material (unit)" msgstr "사용 재료 (단위)" -#: src/slic3r/GUI/Plater.cpp:224 src/slic3r/GUI/Plater.cpp:1150 -#: src/libslic3r/PrintConfig.cpp:742 -msgid "Cost" -msgstr "비용" +#: src/slic3r/GUI/Plater.cpp:241 +msgid "Cost (money)" +msgstr "비용 (돈)" -#: src/slic3r/GUI/Plater.cpp:225 src/slic3r/GUI/Plater.cpp:1122 -#: src/slic3r/GUI/Plater.cpp:1164 +#: src/slic3r/GUI/Plater.cpp:242 src/slic3r/GUI/Plater.cpp:1213 +#: src/slic3r/GUI/Plater.cpp:1255 msgid "Estimated printing time" msgstr "예상 인쇄 시간" -#: src/slic3r/GUI/Plater.cpp:226 +#: src/slic3r/GUI/Plater.cpp:243 msgid "Number of tool changes" msgstr "공구(tool) 변경 수" -#: src/slic3r/GUI/Plater.cpp:317 +#: src/slic3r/GUI/Plater.cpp:340 msgid "Click to edit preset" msgstr "사전 설정을 편집 하려면 클릭 하십시오" -#: src/slic3r/GUI/Plater.cpp:469 +#: src/slic3r/GUI/Plater.cpp:495 msgid "Select what kind of support do you need" msgstr "서포트의 종류를 선택하세요" -#: src/slic3r/GUI/Plater.cpp:471 src/libslic3r/PrintConfig.cpp:1865 -#: src/libslic3r/PrintConfig.cpp:2529 +#: src/slic3r/GUI/Plater.cpp:497 src/libslic3r/PrintConfig.cpp:1911 +#: src/libslic3r/PrintConfig.cpp:2675 msgid "Support on build plate only" msgstr "출력물만 서포트를 지지" -#: src/slic3r/GUI/Plater.cpp:472 src/slic3r/GUI/Plater.cpp:587 +#: src/slic3r/GUI/Plater.cpp:498 src/slic3r/GUI/Plater.cpp:621 msgid "For support enforcers only" msgstr "서포트 지원영역 전용" -#: src/slic3r/GUI/Plater.cpp:473 +#: src/slic3r/GUI/Plater.cpp:499 msgid "Everywhere" msgstr "모든곳" -#: src/slic3r/GUI/Plater.cpp:505 src/slic3r/GUI/Tab.cpp:1067 +#: src/slic3r/GUI/Plater.cpp:531 src/slic3r/GUI/Tab.cpp:1107 msgid "Brim" msgstr "브림" -#: src/slic3r/GUI/Plater.cpp:507 +#: src/slic3r/GUI/Plater.cpp:533 msgid "" "This flag enables the brim that will be printed around each object on the " "first layer." -msgstr "" -"이 플래그는 첫 번째 레이어의 각 개체 주위에 인쇄 될 브림을 활성화합니다." +msgstr "첫 번째 레이어의 각 객체(object) 주위에 인쇄 될 브림을 활성화합니다." -#: src/slic3r/GUI/Plater.cpp:515 +#: src/slic3r/GUI/Plater.cpp:541 msgid "Purging volumes" -msgstr "볼륨 삭제" +msgstr "퍼징 조절" -#: src/slic3r/GUI/Plater.cpp:766 +#: src/slic3r/GUI/Plater.cpp:635 +msgid "Select what kind of pad do you need" +msgstr "필요한 패드 종류를 선택하십시오." + +#: src/slic3r/GUI/Plater.cpp:637 +msgid "Below object" +msgstr "개체 아래" + +#: src/slic3r/GUI/Plater.cpp:638 +msgid "Around object" +msgstr "개체 주위" + +#: src/slic3r/GUI/Plater.cpp:812 msgid "Print settings" msgstr "프린트 설정" -#: src/slic3r/GUI/Plater.cpp:767 src/slic3r/GUI/Tab.cpp:1604 -#: src/slic3r/GUI/Tab.cpp:1605 +#: src/slic3r/GUI/Plater.cpp:813 src/slic3r/GUI/Tab.cpp:1419 +#: src/slic3r/GUI/Tab.cpp:1420 msgid "Filament" msgstr "필라멘트" -#: src/slic3r/GUI/Plater.cpp:768 +#: src/slic3r/GUI/Plater.cpp:814 msgid "SLA print settings" msgstr "SLA 인쇄 설정" -#: src/slic3r/GUI/Plater.cpp:769 src/slic3r/GUI/Preset.cpp:1310 +#: src/slic3r/GUI/Plater.cpp:815 src/slic3r/GUI/Preset.cpp:1455 msgid "SLA material" msgstr "SLA 재료" -#: src/slic3r/GUI/Plater.cpp:770 +#: src/slic3r/GUI/Plater.cpp:816 msgid "Printer" msgstr "프린터" -#: src/slic3r/GUI/Plater.cpp:820 src/slic3r/GUI/Plater.cpp:4688 +#: src/slic3r/GUI/Plater.cpp:875 src/slic3r/GUI/Plater.cpp:5545 msgid "Send to printer" msgstr "프린터로 보내기" -#: src/slic3r/GUI/Plater.cpp:823 src/slic3r/GUI/Plater.cpp:2933 -#: src/slic3r/GUI/Plater.cpp:4421 -msgid "Slice now" -msgstr "지금 자르기" +#: src/slic3r/GUI/Plater.cpp:876 +msgid "Remove device" +msgstr "장치 제거" -#: src/slic3r/GUI/Plater.cpp:963 +#: src/slic3r/GUI/Plater.cpp:877 +msgid "Export to SD card/ USB thumb drive" +msgstr "SD 카드/USB 썸 드라이브로 내보내기" + +#: src/slic3r/GUI/Plater.cpp:889 src/slic3r/GUI/Plater.cpp:3107 +#: src/slic3r/GUI/Plater.cpp:5129 +msgid "Slice now" +msgstr "바로 슬라이스" + +#: src/slic3r/GUI/Plater.cpp:1039 msgid "Hold Shift to Slice & Export G-code" msgstr "Shift 키를 누른 채 G 코드 내보내기" -#: src/slic3r/GUI/Plater.cpp:1068 +#: src/slic3r/GUI/Plater.cpp:1149 #, c-format msgid "%d (%d shells)" msgstr "% d (% d 쉘)" -#: src/slic3r/GUI/Plater.cpp:1073 +#: src/slic3r/GUI/Plater.cpp:1154 #, c-format msgid "Auto-repaired (%d errors)" msgstr "오류자동수정 (%d errors)" -#: src/slic3r/GUI/Plater.cpp:1076 +#: src/slic3r/GUI/Plater.cpp:1157 #, c-format msgid "" "%d degenerate facets, %d edges fixed, %d facets removed, %d facets added, %d " @@ -3066,442 +4131,483 @@ msgstr "" "%d 면 고정, %d 모서리 고정, %d 면 제거, %d 면 추가, %d 면 반전, %d 후방 모서" "리" -#: src/slic3r/GUI/Plater.cpp:1086 +#: src/slic3r/GUI/Plater.cpp:1167 msgid "Yes" msgstr "예" -#: src/slic3r/GUI/Plater.cpp:1109 +#: src/slic3r/GUI/Plater.cpp:1188 msgid "Used Material (ml)" msgstr "사용 재료 (ml)" -#: src/slic3r/GUI/Plater.cpp:1112 +#: src/slic3r/GUI/Plater.cpp:1191 msgid "object(s)" -msgstr "개체(들)" +msgstr "객체(object)" -#: src/slic3r/GUI/Plater.cpp:1112 +#: src/slic3r/GUI/Plater.cpp:1191 msgid "supports and pad" msgstr "지지대 및 패드" -#: src/slic3r/GUI/Plater.cpp:1137 src/slic3r/GUI/Plater.cpp:1152 +#: src/slic3r/GUI/Plater.cpp:1228 src/slic3r/GUI/Plater.cpp:1243 msgid "objects" -msgstr "개체" +msgstr "객체들(objects)" -#: src/slic3r/GUI/Plater.cpp:1137 src/slic3r/GUI/Plater.cpp:1152 +#: src/slic3r/GUI/Plater.cpp:1228 src/slic3r/GUI/Plater.cpp:1243 msgid "wipe tower" msgstr "와이프 타워(Wipe tower)" -#: src/slic3r/GUI/Plater.cpp:1167 +#: src/slic3r/GUI/Plater.cpp:1241 src/libslic3r/PrintConfig.cpp:761 +#: src/libslic3r/PrintConfig.cpp:2511 src/libslic3r/PrintConfig.cpp:2512 +msgid "Cost" +msgstr "비용" + +#: src/slic3r/GUI/Plater.cpp:1258 msgid "normal mode" msgstr "일반 모드" -#: src/slic3r/GUI/Plater.cpp:1171 src/slic3r/GUI/Plater.cpp:1180 -msgid "Color " -msgstr "색" +#: src/slic3r/GUI/Plater.cpp:1262 src/slic3r/GUI/Plater.cpp:1271 +#: src/libslic3r/PrintConfig.cpp:583 +msgid "Color" +msgstr "색상" -#: src/slic3r/GUI/Plater.cpp:1176 +#: src/slic3r/GUI/Plater.cpp:1267 msgid "stealth mode" msgstr "스텔스 모드" -#: src/slic3r/GUI/Plater.cpp:1271 +#: src/slic3r/GUI/Plater.cpp:1375 msgid "Load File" msgstr "파일 로드" -#: src/slic3r/GUI/Plater.cpp:1275 +#: src/slic3r/GUI/Plater.cpp:1379 msgid "Load Files" msgstr "파일 로드" -#: src/slic3r/GUI/Plater.cpp:1503 -msgid "ERROR: not enough resources to execute a new job." -msgstr "오류: 새 작업을 실행하기에 충분한 리소스가 아닙니다." - -#: src/slic3r/GUI/Plater.cpp:2056 +#: src/slic3r/GUI/Plater.cpp:2137 msgid "New Project" msgstr "새로운 프로젝트" -#: src/slic3r/GUI/Plater.cpp:2173 +#: src/slic3r/GUI/Plater.cpp:2259 msgid "Loading" msgstr "로딩" -#: src/slic3r/GUI/Plater.cpp:2183 +#: src/slic3r/GUI/Plater.cpp:2269 #, c-format -msgid "Processing input file %s\n" -msgstr "입력 파일 처리 %s\n" +msgid "Processing input file %s" +msgstr "입력 파일 처리 %s" -#: src/slic3r/GUI/Plater.cpp:2211 -msgid "" -"You can't to load SLA project if there is at least one multi-part object on " -"the bed" +#: src/slic3r/GUI/Plater.cpp:2297 +msgid "You cannot load SLA project with a multi-part object on the bed" msgstr "" -"침대에 다중 부품 개체가 하나 이상 있는 경우 SLA 프로젝트를 로드할 수 없습니" -"다." +"배드에 여러 부분으로 구성된 객체가 있는 SLA 프로젝트를 로드할 수 없습니다." -#: src/slic3r/GUI/Plater.cpp:2212 src/slic3r/GUI/Tab.cpp:3064 +#: src/slic3r/GUI/Plater.cpp:2298 src/slic3r/GUI/Tab.cpp:2929 msgid "Please check your object list before preset changing." -msgstr "사전 설정을 변경 하기 전에 개체 목록을 확인 하십시오." +msgstr "사전 설정을 변경 하기 전에 객체(object) 목록을 확인 하십시오." -#: src/slic3r/GUI/Plater.cpp:2255 +#: src/slic3r/GUI/Plater.cpp:2343 msgid "" -"This file contains several objects positioned at multiple heights. Instead " -"of considering them as multiple objects, should I consider\n" -"this file as a single object having multiple parts?\n" +"This file contains several objects positioned at multiple heights.\n" +"Instead of considering them as multiple objects, should I consider\n" +"this file as a single object having multiple parts?" msgstr "" -"이 파일에는 여러 높이에 위치한 여러 객체가 들어 있습니다. 여러 객체로 간주하" +"이 파일에는 여러 높이마다 객체(object)가 있습니다. 여러 객체(object)로 간주하" "는 대신,\n" -"이 파일은 여러 부분을 갖는 단일 객체로 보입니까?\n" +"이 파일은 여러 부품을 갖는 단일 객체(object)로 보입니까?" -#: src/slic3r/GUI/Plater.cpp:2258 src/slic3r/GUI/Plater.cpp:2310 +#: src/slic3r/GUI/Plater.cpp:2346 src/slic3r/GUI/Plater.cpp:2399 msgid "Multi-part object detected" -msgstr "다중 부품 객체가 감지" +msgstr "다중 부품(Part) 객체(object)가 감지" -#: src/slic3r/GUI/Plater.cpp:2265 +#: src/slic3r/GUI/Plater.cpp:2353 msgid "" "This file cannot be loaded in a simple mode. Do you want to switch to an " -"advanced mode?\n" +"advanced mode?" msgstr "" -"이 파일은 단순 모드에서 로드할 수 없습니다. 고급 모드로 전환 하시겠습니까?\n" +"이 파일은 기본 모드에서 로드할 수 없습니다. 고급 모드로 전환 하시겠습니까?" -#: src/slic3r/GUI/Plater.cpp:2266 +#: src/slic3r/GUI/Plater.cpp:2354 msgid "Detected advanced data" msgstr "감지된 고급 데이터" -#: src/slic3r/GUI/Plater.cpp:2287 +#: src/slic3r/GUI/Plater.cpp:2376 #, c-format msgid "" "You can't to add the object(s) from %s because of one or some of them " "is(are) multi-part" -msgstr "멀티파트 하나 또는 그 중 일부 때문에 %s에서 개체를 추가 할 수 없습니다" +msgstr "" +"다중 부품(Part) 하나 또는 그 중 일부 때문에 %s에서 객체(object)를 추가 할 수 " +"없습니다" -#: src/slic3r/GUI/Plater.cpp:2307 +#: src/slic3r/GUI/Plater.cpp:2396 msgid "" "Multiple objects were loaded for a multi-material printer.\n" "Instead of considering them as multiple objects, should I consider\n" -"these files to represent a single object having multiple parts?\n" +"these files to represent a single object having multiple parts?" msgstr "" -"다중 재료 프린터에 대해 여러 객체가로드되었습니다.\n" -"여러 객체로 간주하는 대신,\n" -"이 파일들은 여러 부분을 갖는 단일 객체를 나타낼 수 있습니까?\n" +"다중 재료 프린터에 대해 여러 객체(object)가로드되었습니다.\n" +"여러 객체(object)로 간주하는 대신,\n" +"이 파일들은 여러 부분을 갖는 단일 객체(object)를 나타낼 수 있습니까?" -#: src/slic3r/GUI/Plater.cpp:2323 +#: src/slic3r/GUI/Plater.cpp:2412 msgid "Loaded" msgstr "로드(loaded)" -#: src/slic3r/GUI/Plater.cpp:2418 +#: src/slic3r/GUI/Plater.cpp:2514 msgid "" "Your object appears to be too large, so it was automatically scaled down to " "fit your print bed." -msgstr "개체가 너무 커서 인쇄물에 맞게 자동으로 축소되었습니다." +msgstr "객체(object)가 너무 커서 인쇄물에 맞게 자동으로 축소되었습니다." -#: src/slic3r/GUI/Plater.cpp:2419 +#: src/slic3r/GUI/Plater.cpp:2515 msgid "Object too large?" -msgstr "개체가 너무 큽니까?" +msgstr "객체(object)가 너무 큽니까?" -#: src/slic3r/GUI/Plater.cpp:2476 +#: src/slic3r/GUI/Plater.cpp:2577 msgid "Export STL file:" msgstr "STL 파일 내보내기:" -#: src/slic3r/GUI/Plater.cpp:2483 +#: src/slic3r/GUI/Plater.cpp:2584 msgid "Export AMF file:" msgstr "AMF 파일 내보내기:" -#: src/slic3r/GUI/Plater.cpp:2489 +#: src/slic3r/GUI/Plater.cpp:2590 msgid "Save file as:" msgstr "다른 이름으로 파일 저장:" -#: src/slic3r/GUI/Plater.cpp:2592 -msgid "Delete Object" -msgstr "오브젝트 지우기" +#: src/slic3r/GUI/Plater.cpp:2596 +msgid "Export OBJ file:" +msgstr "OBJ 파일 내보내기:" -#: src/slic3r/GUI/Plater.cpp:2603 +#: src/slic3r/GUI/Plater.cpp:2698 +msgid "Delete Object" +msgstr "객체(object) 지우기" + +#: src/slic3r/GUI/Plater.cpp:2709 msgid "Reset Project" msgstr "프로젝트 재설정" -#: src/slic3r/GUI/Plater.cpp:2630 src/slic3r/GUI/Plater.cpp:3517 -msgid "Mirror" -msgstr "반전(Mirror)" +#: src/slic3r/GUI/Plater.cpp:2746 +msgid "Hollow" +msgstr "속비우기" -#: src/slic3r/GUI/Plater.cpp:2643 +#: src/slic3r/GUI/Plater.cpp:2753 msgid "Optimize Rotation" msgstr "회전 최적화" -#: src/slic3r/GUI/Plater.cpp:2689 +#: src/slic3r/GUI/Plater.cpp:2799 msgid "Arranging" msgstr "정렬" -#: src/slic3r/GUI/Plater.cpp:2712 +#: src/slic3r/GUI/Plater.cpp:2821 msgid "Could not arrange model objects! Some geometries may be invalid." msgstr "" -"모델 개체를 정렬할 수 없습니다. 일부 형상은 유효 하지 않을 수 있습니다." +"모델 객체(object)를 정렬할 수 없습니다. 일부 형상은 유효 하지 않을 수 있습니" +"다." -#: src/slic3r/GUI/Plater.cpp:2718 +#: src/slic3r/GUI/Plater.cpp:2827 msgid "Arranging canceled." msgstr "취소 된 정렬" -#: src/slic3r/GUI/Plater.cpp:2719 +#: src/slic3r/GUI/Plater.cpp:2828 msgid "Arranging done." msgstr "정렬 완료." -#: src/slic3r/GUI/Plater.cpp:2735 +#: src/slic3r/GUI/Plater.cpp:2844 msgid "Searching for optimal orientation" msgstr "최적의 방향 검색" -#: src/slic3r/GUI/Plater.cpp:2768 +#: src/slic3r/GUI/Plater.cpp:2877 msgid "Orientation search canceled." -msgstr "오리엔테이션 검색이 취소 됨" +msgstr "방향 검색이 취소되었습니다." -#: src/slic3r/GUI/Plater.cpp:2769 +#: src/slic3r/GUI/Plater.cpp:2878 msgid "Orientation found." msgstr "방향을 찾았습니다." -#: src/slic3r/GUI/Plater.cpp:2785 +#: src/slic3r/GUI/Plater.cpp:2908 +msgid "Indexing hollowed object" +msgstr "빈 개체 인덱싱" + +#: src/slic3r/GUI/Plater.cpp:2912 +msgid "Hollowing cancelled." +msgstr "공동화 취소." + +#: src/slic3r/GUI/Plater.cpp:2913 +msgid "Hollowing done." +msgstr "속을 비움니다." + +#: src/slic3r/GUI/Plater.cpp:2915 +msgid "Hollowing failed." +msgstr "공동화를 실패했습니다." + +#: src/slic3r/GUI/Plater.cpp:2956 msgid "" "The selected object can't be split because it contains more than one volume/" "material." msgstr "" -"선택한 객체는 둘 이상의 볼륨 / 재료가 포함되어 있기 때문에 분할 할 수 없습니" -"다." +"선택한 객체(object)는 둘 이상의 부품/재료가 포함되어 있기 때문에 분할 할 수 " +"없습니다." -#: src/slic3r/GUI/Plater.cpp:2796 +#: src/slic3r/GUI/Plater.cpp:2967 msgid "Split to Objects" -msgstr "객체로 분할" +msgstr "객체(object)로 분할" -#: src/slic3r/GUI/Plater.cpp:2918 +#: src/slic3r/GUI/Plater.cpp:3092 msgid "Invalid data" msgstr "잘못 된 데이터" -#: src/slic3r/GUI/Plater.cpp:2927 +#: src/slic3r/GUI/Plater.cpp:3101 msgid "Ready to slice" msgstr "슬라이스 준비" -#: src/slic3r/GUI/Plater.cpp:2965 src/slic3r/GUI/PrintHostDialogs.cpp:232 +#: src/slic3r/GUI/Plater.cpp:3139 src/slic3r/GUI/PrintHostDialogs.cpp:232 msgid "Cancelling" msgstr "취소 중" -#: src/slic3r/GUI/Plater.cpp:2982 +#: src/slic3r/GUI/Plater.cpp:3156 msgid "Another export job is currently running." msgstr "다른 내보내기 작업이 현재 실행 중입니다." -#: src/slic3r/GUI/Plater.cpp:3036 src/slic3r/GUI/Plater.cpp:3493 -msgid "Reload from Disk" -msgstr "디스크에서 다시 불러오기" +#: src/slic3r/GUI/Plater.cpp:3274 +msgid "Please select the file to reload" +msgstr "다시 로드할 파일을 선택하십시오." -#: src/slic3r/GUI/Plater.cpp:3072 +#: src/slic3r/GUI/Plater.cpp:3309 +msgid "It is not allowed to change the file to reload" +msgstr "다시 로드할 파일을 변경할 수 없습니다." + +#: src/slic3r/GUI/Plater.cpp:3309 +msgid "Do you want to retry" +msgstr "다시 시도하시겠습니까?" + +#: src/slic3r/GUI/Plater.cpp:3330 +msgid "Reload from: " +msgstr "다음에서 다시 로드합니다." + +#: src/slic3r/GUI/Plater.cpp:3438 +msgid "Unable to reload:" +msgstr "다시 로드할 수 없음:" + +#: src/slic3r/GUI/Plater.cpp:3443 +msgid "Error during reload" +msgstr "다시 로드하는 동안 오류" + +#: src/slic3r/GUI/Plater.cpp:3463 +msgid "Reload all from disk" +msgstr "디스크에서 모두 다시 로드" + +#: src/slic3r/GUI/Plater.cpp:3484 msgid "Fix Throught NetFabb" msgstr "NetFabb으로 수정" -#: src/slic3r/GUI/Plater.cpp:3254 +#: src/slic3r/GUI/Plater.cpp:3675 msgid "Export failed" msgstr "내보내기 실패" -#: src/slic3r/GUI/Plater.cpp:3259 src/slic3r/GUI/PrintHostDialogs.cpp:233 +#: src/slic3r/GUI/Plater.cpp:3680 src/slic3r/GUI/PrintHostDialogs.cpp:233 msgid "Cancelled" msgstr "취소됨" -#: src/slic3r/GUI/Plater.cpp:3347 src/slic3r/GUI/Plater.cpp:3359 -#: src/slic3r/GUI/Plater.cpp:3473 -msgid "Increase copies" -msgstr "복사본 늘리기" - -#: src/slic3r/GUI/Plater.cpp:3467 src/slic3r/GUI/Plater.cpp:3486 +#: src/slic3r/GUI/Plater.cpp:3942 src/slic3r/GUI/Plater.cpp:3969 msgid "Remove the selected object" -msgstr "선택한 객체 제거" +msgstr "선택한 객체(object) 제거" -#: src/slic3r/GUI/Plater.cpp:3473 -msgid "Place one more copy of the selected object" -msgstr "선택한 객체를 하나 더 복사합니다" +#: src/slic3r/GUI/Plater.cpp:3956 +msgid "Add one more instance of the selected object" +msgstr "선택한 개체의 인스턴스를 하나 더 추가합니다." -#: src/slic3r/GUI/Plater.cpp:3475 -msgid "Decrease copies" -msgstr "복사본 감소" +#: src/slic3r/GUI/Plater.cpp:3958 +msgid "Remove one instance of the selected object" +msgstr "선택한 개체의 인스턴스 하나 제거" -#: src/slic3r/GUI/Plater.cpp:3475 -msgid "Remove one copy of the selected object" -msgstr "선택한 객체 복사본 하나 삭제" +#: src/slic3r/GUI/Plater.cpp:3960 +msgid "Set number of instances" +msgstr "복제할 수량 설정" -#: src/slic3r/GUI/Plater.cpp:3477 -msgid "Set number of copies" -msgstr "복사될 수량 설정" +#: src/slic3r/GUI/Plater.cpp:3960 +msgid "Change the number of instances of the selected object" +msgstr "선택한 객체의 인스턴스 수 변경" -#: src/slic3r/GUI/Plater.cpp:3477 -msgid "Change the number of copies of the selected object" -msgstr "선택한 개체의 복사본 수 변경" +#: src/slic3r/GUI/Plater.cpp:3980 src/slic3r/GUI/Plater.cpp:3983 +msgid "Reload the selected object from disk" +msgstr "디스크에서 선택한 개체 다시 로드" -#: src/slic3r/GUI/Plater.cpp:3493 -msgid "Reload the selected file from Disk" -msgstr "디스크에서 다시 불러오기" - -#: src/slic3r/GUI/Plater.cpp:3496 +#: src/slic3r/GUI/Plater.cpp:3987 msgid "Export the selected object as STL file" -msgstr "선택한 객체를 STL 파일로 내보내기" +msgstr "선택한 객체(object)를 STL 파일로 내보내기" -#: src/slic3r/GUI/Plater.cpp:3510 +#: src/slic3r/GUI/Plater.cpp:4016 msgid "Along X axis" msgstr "X 축을 따라" -#: src/slic3r/GUI/Plater.cpp:3510 +#: src/slic3r/GUI/Plater.cpp:4016 msgid "Mirror the selected object along the X axis" -msgstr "선택한 객체를 X 축을 따라 반전합니다" +msgstr "선택한 객체(object)를 X 축을 따라 반전합니다" -#: src/slic3r/GUI/Plater.cpp:3512 +#: src/slic3r/GUI/Plater.cpp:4018 msgid "Along Y axis" msgstr "Y 축을 따라" -#: src/slic3r/GUI/Plater.cpp:3512 +#: src/slic3r/GUI/Plater.cpp:4018 msgid "Mirror the selected object along the Y axis" -msgstr "선택한 객체를 Y 축을 따라 반전합니다" +msgstr "선택한 객체(object)를 Y 축을 따라 반전합니다" -#: src/slic3r/GUI/Plater.cpp:3514 +#: src/slic3r/GUI/Plater.cpp:4020 msgid "Along Z axis" msgstr "Z 축 따라" -#: src/slic3r/GUI/Plater.cpp:3514 +#: src/slic3r/GUI/Plater.cpp:4020 msgid "Mirror the selected object along the Z axis" -msgstr "선택한 객체를 Z 축을 따라 반전합니다" +msgstr "선택한 객체(object)를 Z 축을 따라 반전합니다" -#: src/slic3r/GUI/Plater.cpp:3517 +#: src/slic3r/GUI/Plater.cpp:4023 +msgid "Mirror" +msgstr "반전(Mirror)" + +#: src/slic3r/GUI/Plater.cpp:4023 msgid "Mirror the selected object" msgstr "반전할 객제를 선택" -#: src/slic3r/GUI/Plater.cpp:3529 +#: src/slic3r/GUI/Plater.cpp:4035 msgid "To objects" -msgstr "개체에" +msgstr "객체(object)에" -#: src/slic3r/GUI/Plater.cpp:3529 src/slic3r/GUI/Plater.cpp:3549 +#: src/slic3r/GUI/Plater.cpp:4035 src/slic3r/GUI/Plater.cpp:4055 msgid "Split the selected object into individual objects" -msgstr "선택한 개체를 개별 개체로 분할 합니다." +msgstr "선택한 객체(object)를 개별 객체(object)로 분할 합니다." -#: src/slic3r/GUI/Plater.cpp:3531 +#: src/slic3r/GUI/Plater.cpp:4037 msgid "To parts" -msgstr "부품에" +msgstr "부품(Part)에" -#: src/slic3r/GUI/Plater.cpp:3531 src/slic3r/GUI/Plater.cpp:3563 +#: src/slic3r/GUI/Plater.cpp:4037 src/slic3r/GUI/Plater.cpp:4069 msgid "Split the selected object into individual sub-parts" -msgstr "선택한 오브젝트를 개별 하위 파트로 분할" +msgstr "선택한 객체(object)를 개별 하위 부품(Part)으로 분할" -#: src/slic3r/GUI/Plater.cpp:3534 src/slic3r/GUI/Plater.cpp:3549 -#: src/slic3r/GUI/Plater.cpp:3563 src/libslic3r/PrintConfig.cpp:3245 +#: src/slic3r/GUI/Plater.cpp:4040 src/slic3r/GUI/Plater.cpp:4055 +#: src/slic3r/GUI/Plater.cpp:4069 src/libslic3r/PrintConfig.cpp:3466 msgid "Split" msgstr "쪼개기" -#: src/slic3r/GUI/Plater.cpp:3534 +#: src/slic3r/GUI/Plater.cpp:4040 msgid "Split the selected object" -msgstr "선택한 개체 분할" +msgstr "선택한 객체(object) 분할" -#: src/slic3r/GUI/Plater.cpp:3555 +#: src/slic3r/GUI/Plater.cpp:4061 msgid "Optimize orientation" msgstr "방향 최적화" -#: src/slic3r/GUI/Plater.cpp:3555 +#: src/slic3r/GUI/Plater.cpp:4061 msgid "Optimize the rotation of the object for better print results." -msgstr "더 나은 인쇄 결과를 위해 개체의 회전을 최적화합니다." +msgstr "더 나은 인쇄 결과를 위해 객체(object)의 회전을 최적화합니다." -#: src/slic3r/GUI/Plater.cpp:3595 +#: src/slic3r/GUI/Plater.cpp:4120 msgid "3D editor view" msgstr "3D 편집화면 보기" -#: src/slic3r/GUI/Plater.cpp:3603 src/slic3r/GUI/Tab.cpp:2534 +#: src/slic3r/GUI/Plater.cpp:4128 src/slic3r/GUI/Tab.cpp:2372 msgid "Preview" -msgstr "프리뷰" +msgstr "미리보기" -#: src/slic3r/GUI/Plater.cpp:3831 +#: src/slic3r/GUI/Plater.cpp:4422 msgid "" "%1% printer was active at the time the target Undo / Redo snapshot was " "taken. Switching to %1% printer requires reloading of %1% presets." msgstr "" -"%1% 프린터가 대상 재생 취소/다시 작업 스냅샷을 생성할 때 활성화되었습니다. " -"%1% 프린터로 전환하려면 %1% 사전 설정을 다시 로드해야 합니다." +"%1% 프린터가 대상을 '되돌리기/취소하기' 작업 구성을 생성할 때 활성화되었습니" +"다. %1% 프린터로 전환하려면 %1% 사전 설정을 다시 불러와야 합니다." -#: src/slic3r/GUI/Plater.cpp:3992 +#: src/slic3r/GUI/Plater.cpp:4597 msgid "Load Project" -msgstr "프로젝트 로드" +msgstr "프로젝트 불러오기" -#: src/slic3r/GUI/Plater.cpp:4016 +#: src/slic3r/GUI/Plater.cpp:4625 msgid "Import Object" -msgstr "개체 가져오기" +msgstr "객체(object) 가져오기" -#: src/slic3r/GUI/Plater.cpp:4020 +#: src/slic3r/GUI/Plater.cpp:4629 msgid "Import Objects" -msgstr "객체 가져오기" +msgstr "객체(object) 가져오기" -#: src/slic3r/GUI/Plater.cpp:4075 -msgid "All objects will be removed, continue ?" -msgstr "모든 개체가 제거 됩니다, 계속합니까?" +#: src/slic3r/GUI/Plater.cpp:4693 +msgid "All objects will be removed, continue?" +msgstr "모든 객체(object)가 제거 됩니다, 계속합니까?" -#: src/slic3r/GUI/Plater.cpp:4083 +#: src/slic3r/GUI/Plater.cpp:4701 msgid "Delete Selected Objects" -msgstr "선택한 객체 삭제" +msgstr "선택한 객체(object) 삭제" -#: src/slic3r/GUI/Plater.cpp:4091 +#: src/slic3r/GUI/Plater.cpp:4709 msgid "Increase Instances" msgstr "복제본 늘리기" -#: src/slic3r/GUI/Plater.cpp:4127 +#: src/slic3r/GUI/Plater.cpp:4744 msgid "Decrease Instances" msgstr "복제본 감소" -#: src/slic3r/GUI/Plater.cpp:4163 +#: src/slic3r/GUI/Plater.cpp:4780 #, c-format msgid "Set numbers of copies to %d" msgstr "복사본 수를 %d로 설정" -#: src/slic3r/GUI/Plater.cpp:4193 +#: src/slic3r/GUI/Plater.cpp:4810 msgid "Cut by Plane" msgstr "평면으로 절단" -#: src/slic3r/GUI/Plater.cpp:4225 +#: src/slic3r/GUI/Plater.cpp:4863 msgid "Save G-code file as:" msgstr "G-code 파일 다른 이름 저장:" -#: src/slic3r/GUI/Plater.cpp:4225 +#: src/slic3r/GUI/Plater.cpp:4863 msgid "Save SL1 file as:" msgstr "SL1 파일 다른이름 저장:" -#: src/slic3r/GUI/Plater.cpp:4337 +#: src/slic3r/GUI/Plater.cpp:4990 #, c-format msgid "STL file exported to %s" msgstr "내보낸 STL 파일 %s" -#: src/slic3r/GUI/Plater.cpp:4353 +#: src/slic3r/GUI/Plater.cpp:5011 #, c-format msgid "AMF file exported to %s" msgstr "내보낸 AMF 파일 %s" -#: src/slic3r/GUI/Plater.cpp:4356 +#: src/slic3r/GUI/Plater.cpp:5014 #, c-format msgid "Error exporting AMF file %s" msgstr "AMF 파일 내보내기 오류 %s" -#: src/slic3r/GUI/Plater.cpp:4382 +#: src/slic3r/GUI/Plater.cpp:5057 #, c-format msgid "3MF file exported to %s" msgstr "3MF 파일을 내보냈습니다 %s" -#: src/slic3r/GUI/Plater.cpp:4387 +#: src/slic3r/GUI/Plater.cpp:5062 #, c-format msgid "Error exporting 3MF file %s" msgstr "3MF 파일 내보내기 오류 %s" -#: src/slic3r/GUI/Plater.cpp:4687 +#: src/slic3r/GUI/Plater.cpp:5544 msgid "Export" msgstr "내보내기" -#: src/slic3r/GUI/Plater.cpp:4688 +#: src/slic3r/GUI/Plater.cpp:5545 msgid "Send G-code" -msgstr "G 코드 보내기" +msgstr "G-code 보내기" -#: src/slic3r/GUI/Plater.cpp:4772 +#: src/slic3r/GUI/Plater.cpp:5629 msgid "Paste From Clipboard" msgstr "클립보드에서 붙여넣기" -#: src/slic3r/GUI/Preferences.cpp:22 src/slic3r/GUI/Tab.cpp:1955 -#: src/slic3r/GUI/Tab.cpp:2193 +#: src/slic3r/GUI/Preferences.cpp:22 src/slic3r/GUI/Tab.cpp:1780 +#: src/slic3r/GUI/Tab.cpp:2024 msgid "General" msgstr "일반" -#: src/slic3r/GUI/Preferences.cpp:44 +#: src/slic3r/GUI/Preferences.cpp:39 msgid "Remember output directory" msgstr "출력 디렉토리 기억하기" -#: src/slic3r/GUI/Preferences.cpp:46 +#: src/slic3r/GUI/Preferences.cpp:41 msgid "" "If this is enabled, Slic3r will prompt the last output directory instead of " "the one containing the input files." @@ -3509,29 +4615,30 @@ msgstr "" "이 옵션을 사용하면 Slic3r은 입력 파일이 들어있는 디렉터리 대신 마지막 출력 디" "렉터리를 묻습니다." -#: src/slic3r/GUI/Preferences.cpp:52 +#: src/slic3r/GUI/Preferences.cpp:47 msgid "Auto-center parts" -msgstr "부품을 자동으로 중심에" +msgstr "부품(Part)을 자동으로 중재봉선에" -#: src/slic3r/GUI/Preferences.cpp:54 +#: src/slic3r/GUI/Preferences.cpp:49 msgid "" "If this is enabled, Slic3r will auto-center objects around the print bed " "center." -msgstr "이 옵션을 사용하면 Slic3r가 개체를 인쇄판 중앙에 자동으로 배치합니다." +msgstr "" +"이 옵션을 사용하면 Slic3r가 객체(object)를 인쇄판 중앙에 자동으로 배치합니다." -#: src/slic3r/GUI/Preferences.cpp:60 +#: src/slic3r/GUI/Preferences.cpp:55 msgid "Background processing" msgstr "백그라운드 프로세싱" -#: src/slic3r/GUI/Preferences.cpp:62 +#: src/slic3r/GUI/Preferences.cpp:57 msgid "" "If this is enabled, Slic3r will pre-process objects as soon as they're " "loaded in order to save time when exporting G-code." msgstr "" -"이 사용 하는 경우 Slic3r는 전처리 개체 최대한 빨리 그들이 시간을 절약 하기 위" -"해 로드 G-코드를 내보낼 때." +"이 사용 하는 경우 Slic3r는 최대한 빨리 시간을 절약 하기 위해 로드된 G-code를 " +"내보낸다." -#: src/slic3r/GUI/Preferences.cpp:71 +#: src/slic3r/GUI/Preferences.cpp:66 msgid "" "If enabled, PrusaSlicer will check for the new versions of itself online. " "When a new version becomes available a notification is displayed at the next " @@ -3542,46 +4649,58 @@ msgstr "" "되면 다음 응용 프로그램 시작시 (프로그램 사용 중이 아님) 알림이 표시 됩니다. " "이는 알림 메커니즘일뿐이며 자동 설치는 수행되지 않습니다." -#: src/slic3r/GUI/Preferences.cpp:79 +#: src/slic3r/GUI/Preferences.cpp:73 +msgid "Export sources full pathnames to 3mf and amf" +msgstr "소스 전체 경로 이름을 3mf 및 amf로 내보내기" + +#: src/slic3r/GUI/Preferences.cpp:75 +msgid "" +"If enabled, allows the Reload from disk command to automatically find and " +"load the files when invoked." +msgstr "" +"활성화된 경우 디스크에서 다시 로드 명령을 사용하여 호출될 때 파일을 자동으로 " +"찾고 로드할 수 있습니다." + +#: src/slic3r/GUI/Preferences.cpp:84 msgid "" "If enabled, Slic3r downloads updates of built-in system presets in the " "background. These updates are downloaded into a separate temporary location. " "When a new preset version becomes available it is offered at application " "startup." msgstr "" -"활성화 된 경우 Slic3r은 백그라운드에서 내장 시스템 사전 설정의 업데이트를 다" -"운로드합니다. 이러한 업데이트는 별도의 임시 위치에 다운로드됩니다. 새로운 사" -"전 설정 버전을 사용할 수있게되면 응용 프로그램 시작시 제공됩니다." +"활성화 된 경우 Slic3r은 백그라운드에서 내장된 시스템 설정의 업데이트를 다운로" +"드합니다. 이러한 업데이트는 별도의 임시 위치에 다운로드됩니다. 새로운 '사전 " +"설정' 버전을 사용할 수 있게되면 응용 프로그램 시작시 제공됩니다." -#: src/slic3r/GUI/Preferences.cpp:84 +#: src/slic3r/GUI/Preferences.cpp:89 msgid "Suppress \" - default - \" presets" msgstr "\"- 기본 -\"사전 설정 숨기기" -#: src/slic3r/GUI/Preferences.cpp:86 +#: src/slic3r/GUI/Preferences.cpp:91 msgid "" "Suppress \" - default - \" presets in the Print / Filament / Printer " "selections once there are any other valid presets available." msgstr "" -"사용 가능한 다른 유효한 사전 설정이 있으면 인쇄 / 필라멘트 / 프린터 선택에서 " -"\"- 기본 -\"사전 설정을 억제하십시오." +"사용 가능한 다른 유효한 '사전 설정'이 있으면 인쇄 / 필라멘트 / 프린터 선택에" +"서 \"- 기본 -\"'사전 설정'을 억제하십시오." -#: src/slic3r/GUI/Preferences.cpp:92 +#: src/slic3r/GUI/Preferences.cpp:97 msgid "Show incompatible print and filament presets" msgstr "호환 되지 않는 인쇄 및 필라멘트 설정" -#: src/slic3r/GUI/Preferences.cpp:94 +#: src/slic3r/GUI/Preferences.cpp:99 msgid "" "When checked, the print and filament presets are shown in the preset editor " "even if they are marked as incompatible with the active printer" msgstr "" -"이 옵션을 선택하면 활성 프린터와 호환되지 않는 것으로 표시된 경우에도 인쇄 " -"및 필라멘트 사전 설정이 사전 설정 편집기에 표시됩니다" +"이 옵션을 선택하면 프린터와 호환되지 않는 것으로 표시된 경우에도 인쇄 및 필라" +"멘트 '사전 설정'이 '사전 설정' 편집기에 표시됩니다" -#: src/slic3r/GUI/Preferences.cpp:101 +#: src/slic3r/GUI/Preferences.cpp:106 msgid "Use Retina resolution for the 3D scene" msgstr "3D 장면에 레티나 해상도 사용" -#: src/slic3r/GUI/Preferences.cpp:103 +#: src/slic3r/GUI/Preferences.cpp:108 msgid "" "If enabled, the 3D scene will be rendered in Retina resolution. If you are " "experiencing 3D performance problems, disabling this option may help." @@ -3589,191 +4708,240 @@ msgstr "" "활성화 된 경우 3D 장면은 레티나 해상도로 렌더링 됩니다. 3D 성능 문제가 발생하" "는 경우, 옵션을 사용하지 않도록 설정 하면 도움이 될 수 있습니다." -#: src/slic3r/GUI/Preferences.cpp:110 -msgid "Use perspective camera" -msgstr "원근 카메라 사용" +#: src/slic3r/GUI/Preferences.cpp:115 +msgid "Camera" +msgstr "카메라" -#: src/slic3r/GUI/Preferences.cpp:112 +#: src/slic3r/GUI/Preferences.cpp:121 +msgid "Use perspective camera" +msgstr "원근 보기 사용" + +#: src/slic3r/GUI/Preferences.cpp:123 msgid "" "If enabled, use perspective camera. If not enabled, use orthographic camera." msgstr "" -"이 옵션을 사용하면 원근 카메라를 사용합니다. 활성화되지 않은 경우 직교 카메라" +"이 옵션을 사용하면 원근 보기모드를 사용합니다. 활성화되지 않은 경우 일반 보기" "를 사용합니다." -#: src/slic3r/GUI/Preferences.cpp:117 +#: src/slic3r/GUI/Preferences.cpp:129 +msgid "Use free camera" +msgstr "무료 카메라 사용" + +#: src/slic3r/GUI/Preferences.cpp:131 +msgid "If enabled, use free camera. If not enabled, use constrained camera." +msgstr "" +"활성화된 경우 무료 카메라를 사용하십시오. 활성화되지 않은 경우 구속된 카메라" +"를 사용합니다." + +#: src/slic3r/GUI/Preferences.cpp:137 +msgid "GUI" +msgstr "GUI" + +#: src/slic3r/GUI/Preferences.cpp:147 msgid "Use custom size for toolbar icons" msgstr "도구 모음 아이콘에 사용자 지정 크기 사용" -#: src/slic3r/GUI/Preferences.cpp:119 +#: src/slic3r/GUI/Preferences.cpp:149 msgid "If enabled, you can change size of toolbar icons manually." msgstr "활성화된 경우 도구 모음 아이콘의 크기를 수동으로 변경할 수 있습니다." -#: src/slic3r/GUI/Preferences.cpp:144 +#: src/slic3r/GUI/Preferences.cpp:176 #, c-format msgid "You need to restart %s to make the changes effective." msgstr "변경 내용을 적용 하려면 %s를 다시 시작 해야 합니다." -#: src/slic3r/GUI/Preferences.cpp:192 +#: src/slic3r/GUI/Preferences.cpp:226 msgid "Icon size in a respect to the default size" msgstr "기본 크기에 대한 아이콘 크기" -#: src/slic3r/GUI/Preferences.cpp:207 +#: src/slic3r/GUI/Preferences.cpp:241 msgid "Select toolbar icon size in respect to the default one." msgstr "기본 도구 모음에 대해 도구 모음 아이콘 크기를 선택합니다." -#: src/slic3r/GUI/Preset.cpp:212 +#: src/slic3r/GUI/Preset.cpp:247 msgid "modified" msgstr "수정된곳" -#: src/slic3r/GUI/Preset.cpp:963 src/slic3r/GUI/Preset.cpp:1003 -#: src/slic3r/GUI/Preset.cpp:1068 src/slic3r/GUI/Preset.cpp:1100 -#: src/slic3r/GUI/PresetBundle.cpp:1480 src/slic3r/GUI/PresetBundle.cpp:1545 +#: src/slic3r/GUI/Preset.cpp:1059 src/slic3r/GUI/Preset.cpp:1106 +#: src/slic3r/GUI/Preset.cpp:1182 src/slic3r/GUI/Preset.cpp:1216 +#: src/slic3r/GUI/PresetBundle.cpp:1576 src/slic3r/GUI/PresetBundle.cpp:1665 msgid "System presets" msgstr "시스템 기본설정" -#: src/slic3r/GUI/Preset.cpp:1007 src/slic3r/GUI/Preset.cpp:1104 -#: src/slic3r/GUI/PresetBundle.cpp:1550 +#: src/slic3r/GUI/Preset.cpp:1110 src/slic3r/GUI/Preset.cpp:1220 +#: src/slic3r/GUI/PresetBundle.cpp:1670 msgid "User presets" msgstr "사용자 사전설정" -#: src/slic3r/GUI/Preset.cpp:1036 src/slic3r/GUI/Tab.cpp:241 +#: src/slic3r/GUI/Preset.cpp:1141 src/slic3r/GUI/Tab.cpp:243 msgid "Add a new printer" msgstr "새 프린터 추가" -#: src/slic3r/GUI/Preset.cpp:1308 +#: src/slic3r/GUI/Preset.cpp:1143 +msgid "Add/Remove materials" +msgstr "재질 추가/제거" + +#: src/slic3r/GUI/Preset.cpp:1453 msgid "filament" msgstr "필라멘트" -#: src/slic3r/GUI/Preset.cpp:1309 +#: src/slic3r/GUI/Preset.cpp:1454 msgid "SLA print" msgstr "SLA 인쇄" -#: src/slic3r/GUI/PresetHints.cpp:28 +#: src/slic3r/GUI/PresetBundle.cpp:1681 +msgid "Add/Remove filaments" +msgstr "필라멘트 추가/제거" + +#: src/slic3r/GUI/PresetHints.cpp:29 msgid "" "If estimated layer time is below ~%1%s, fan will run at %2%%% and print " "speed will be reduced so that no less than %3%s are spent on that layer " "(however, speed will never be reduced below %4%mm/s)." msgstr "" -"예상 레이어 시간이 ~%1%초 미만이면 팬이 %2%%%에서 실행되고 인쇄 속도가 감소되" -"어 해당 레이어에 %3%초 이상 소비됩니다 (단, 속도는 %4%mm/s 이하로 감소하지 않" -"습니다) ." +"예상 레이어 시간이 ~%1%s 미만이면 팬이 %2%%% 에서 실행되고 인쇄 속도가 감소하" +"여 해당 레이어에 %3%s 이상이 소비되지 않습니다 (단, 속도는 아래로 감소하지 않" +"습니다 %4%mm/s)." -#: src/slic3r/GUI/PresetHints.cpp:35 +#: src/slic3r/GUI/PresetHints.cpp:36 msgid "" -"\n" "If estimated layer time is greater, but still below ~%1%s, fan will run at a " "proportionally decreasing speed between %2%%% and %3%%%." msgstr "" -"\n" -"예상 레이어 시간이 더 길지만 ~%1%초 미만인 경우 팬은 %2%%%와 %3%%%사이 비례, " -"감소하는 속도로 실행됩니다." +"예상 레이어 시간이 더 크지만 여전히 ~%1%s 미만이면, 팬은 %2%%% ~ %3%%% 사이에" +"서 비례적으로 감소하는 속도로 실행될 것이다." -#: src/slic3r/GUI/PresetHints.cpp:39 -msgid "" -"\n" -"During the other layers, fan" -msgstr "" -"\n" -"다른 레이어의, 팬설정은 " +#: src/slic3r/GUI/PresetHints.cpp:40 +msgid "During the other layers, fan" +msgstr "다른 레이어의, 팬설정" -#: src/slic3r/GUI/PresetHints.cpp:41 +#: src/slic3r/GUI/PresetHints.cpp:42 msgid "Fan" msgstr "팬(Fan)" -#: src/slic3r/GUI/PresetHints.cpp:47 +#: src/slic3r/GUI/PresetHints.cpp:48 msgid "will always run at %1%%%" msgstr "항상 다음처럼 실행 %1%%%" -#: src/slic3r/GUI/PresetHints.cpp:50 +#: src/slic3r/GUI/PresetHints.cpp:51 msgid "except for the first %1% layers." -msgstr "첫 번째 %d 레이어를 제외하고" +msgstr "첫 번째 %1% 레이어를 제외하고" -#: src/slic3r/GUI/PresetHints.cpp:52 +#: src/slic3r/GUI/PresetHints.cpp:53 msgid "except for the first layer." msgstr "첫 번째 레이어를 제외하고" -#: src/slic3r/GUI/PresetHints.cpp:54 +#: src/slic3r/GUI/PresetHints.cpp:55 msgid "will be turned off." msgstr "off 됩니다." -#: src/slic3r/GUI/PresetHints.cpp:155 +#: src/slic3r/GUI/PresetHints.cpp:156 msgid "external perimeters" msgstr "외부 둘레" -#: src/slic3r/GUI/PresetHints.cpp:164 +#: src/slic3r/GUI/PresetHints.cpp:165 msgid "perimeters" msgstr "둘레" -#: src/slic3r/GUI/PresetHints.cpp:173 +#: src/slic3r/GUI/PresetHints.cpp:174 msgid "infill" msgstr "채움(infill)" -#: src/slic3r/GUI/PresetHints.cpp:183 +#: src/slic3r/GUI/PresetHints.cpp:184 msgid "solid infill" msgstr "외부(solid)부분 채움" -#: src/slic3r/GUI/PresetHints.cpp:191 +#: src/slic3r/GUI/PresetHints.cpp:192 msgid "top solid infill" msgstr "가장 윗부분 채움" -#: src/slic3r/GUI/PresetHints.cpp:202 +#: src/slic3r/GUI/PresetHints.cpp:203 msgid "support" msgstr "서포트" -#: src/slic3r/GUI/PresetHints.cpp:212 +#: src/slic3r/GUI/PresetHints.cpp:213 msgid "support interface" -msgstr "서포트 인터페이스" +msgstr "서포트 접점" -#: src/slic3r/GUI/PresetHints.cpp:218 +#: src/slic3r/GUI/PresetHints.cpp:219 msgid "First layer volumetric" msgstr "첫번째 레이어 용적은" -#: src/slic3r/GUI/PresetHints.cpp:218 +#: src/slic3r/GUI/PresetHints.cpp:219 msgid "Bridging volumetric" msgstr "브리징(Bridging) 용적" -#: src/slic3r/GUI/PresetHints.cpp:218 +#: src/slic3r/GUI/PresetHints.cpp:219 msgid "Volumetric" msgstr "용적" -#: src/slic3r/GUI/PresetHints.cpp:219 +#: src/slic3r/GUI/PresetHints.cpp:220 msgid "flow rate is maximized" msgstr "의 유속(flow)이 최대화된다. " -#: src/slic3r/GUI/PresetHints.cpp:222 +#: src/slic3r/GUI/PresetHints.cpp:223 msgid "by the print profile maximum" msgstr "인쇄 프로파일 최대 값" -#: src/slic3r/GUI/PresetHints.cpp:223 +#: src/slic3r/GUI/PresetHints.cpp:224 msgid "when printing" msgstr "인쇄 할 때" -#: src/slic3r/GUI/PresetHints.cpp:224 +#: src/slic3r/GUI/PresetHints.cpp:225 msgid "with a volumetric rate" msgstr "의 용적 비율로 " -#: src/slic3r/GUI/PresetHints.cpp:228 +#: src/slic3r/GUI/PresetHints.cpp:229 #, c-format msgid "%3.2f mm³/s at filament speed %3.2f mm/s." msgstr "%3.2f mm³/s 필라멘트 속도는 %3.2f mm/s이다." -#: src/slic3r/GUI/PresetHints.cpp:246 +#: src/slic3r/GUI/PresetHints.cpp:247 msgid "" "Recommended object thin wall thickness: Not available due to invalid layer " "height." msgstr "" "권장 객체(object)의 벽(wall) 두께: 잘못된 레이어 높이 때문에 사용할 수 없음." -#: src/slic3r/GUI/PresetHints.cpp:262 +#: src/slic3r/GUI/PresetHints.cpp:263 #, c-format msgid "Recommended object thin wall thickness for layer height %.2f and" -msgstr "객체 레이어 높이 %.2f 에 권장하는 두깨는 " +msgstr "객체(object) 레이어 높이 %.2f 에 권장하는 두깨는 " -#: src/slic3r/GUI/PresetHints.cpp:268 +#: src/slic3r/GUI/PresetHints.cpp:269 #, c-format msgid "%d lines: %.2f mm" msgstr "%d 라인:%.2f mm" +#: src/slic3r/GUI/PresetHints.cpp:300 +msgid "" +"Top / bottom shell thickness hint: Not available due to invalid layer height." +msgstr "상단/하단 쉘 두께 힌트: 잘못된 레이어 높이로 인해 사용할 수 없습니다." + +#: src/slic3r/GUI/PresetHints.cpp:313 +msgid "Top shell is %1% mm thick for layer height %2% mm." +msgstr "상단 쉘은 층 높이 %2% mm에 대한 두께 %1% mm입니다." + +#: src/slic3r/GUI/PresetHints.cpp:316 +msgid "Minimum top shell thickness is %1% mm." +msgstr "최소 상단 쉘 두께는 %1% mm입니다." + +#: src/slic3r/GUI/PresetHints.cpp:319 +msgid "Top is open." +msgstr "상단이 열려 있습니다." + +#: src/slic3r/GUI/PresetHints.cpp:332 +msgid "Bottom shell is %1% mm thick for layer height %2% mm." +msgstr "바닥 층 높이 %2% mm에 대한 두께 %1% mm입니다." + +#: src/slic3r/GUI/PresetHints.cpp:335 +msgid "Minimum bottom shell thickness is %1% mm." +msgstr "최소 바닥 쉘 두께는 %1% mm입니다." + +#: src/slic3r/GUI/PresetHints.cpp:338 +msgid "Bottom is open." +msgstr "바닥이 열려 있습니다." + #: src/slic3r/GUI/PrintHostDialogs.cpp:33 msgid "Send G-Code to printer host" msgstr "프린터 호스트로 G 코드 보내기" @@ -3847,11 +5015,13 @@ msgstr "전혀 충돌 없음" msgid "Time" msgstr "시간" -#: src/slic3r/GUI/RammingChart.cpp:76 src/slic3r/GUI/WipeTowerDialog.cpp:82 -#: src/libslic3r/PrintConfig.cpp:627 src/libslic3r/PrintConfig.cpp:671 -#: src/libslic3r/PrintConfig.cpp:686 src/libslic3r/PrintConfig.cpp:2349 -#: src/libslic3r/PrintConfig.cpp:2358 src/libslic3r/PrintConfig.cpp:2418 -#: src/libslic3r/PrintConfig.cpp:2425 +#: src/slic3r/GUI/RammingChart.cpp:76 src/slic3r/GUI/WipeTowerDialog.cpp:83 +#: src/libslic3r/PrintConfig.cpp:645 src/libslic3r/PrintConfig.cpp:689 +#: src/libslic3r/PrintConfig.cpp:704 src/libslic3r/PrintConfig.cpp:2418 +#: src/libslic3r/PrintConfig.cpp:2427 src/libslic3r/PrintConfig.cpp:2528 +#: src/libslic3r/PrintConfig.cpp:2536 src/libslic3r/PrintConfig.cpp:2544 +#: src/libslic3r/PrintConfig.cpp:2551 src/libslic3r/PrintConfig.cpp:2559 +#: src/libslic3r/PrintConfig.cpp:2567 msgid "s" msgstr "s" @@ -3859,11 +5029,55 @@ msgstr "s" msgid "Volumetric speed" msgstr "용적(Volumetric) 스피트" -#: src/slic3r/GUI/RammingChart.cpp:81 src/libslic3r/PrintConfig.cpp:584 -#: src/libslic3r/PrintConfig.cpp:1234 +#: src/slic3r/GUI/RammingChart.cpp:81 src/libslic3r/PrintConfig.cpp:602 +#: src/libslic3r/PrintConfig.cpp:1259 msgid "mm³/s" msgstr "밀리미터 ³/s" +#: src/slic3r/GUI/Selection.cpp:146 +msgid "Selection-Add" +msgstr "선택 추가" + +#: src/slic3r/GUI/Selection.cpp:187 +msgid "Selection-Remove" +msgstr "선택-제거" + +#: src/slic3r/GUI/Selection.cpp:219 +msgid "Selection-Add Object" +msgstr "선택-추가 객체" + +#: src/slic3r/GUI/Selection.cpp:238 +msgid "Selection-Remove Object" +msgstr "선택-제거 개체" + +#: src/slic3r/GUI/Selection.cpp:256 +msgid "Selection-Add Instance" +msgstr "선택-인스턴스 추가" + +#: src/slic3r/GUI/Selection.cpp:275 +msgid "Selection-Remove Instance" +msgstr "선택-제거 인스턴스" + +#: src/slic3r/GUI/Selection.cpp:376 +msgid "Selection-Add All" +msgstr "선택-모두 추가" + +#: src/slic3r/GUI/Selection.cpp:402 +msgid "Selection-Remove All" +msgstr "선택-모두 제거" + +#: src/slic3r/GUI/Selection.cpp:939 +msgid "Scale To Fit" +msgstr "크기에 맞게 조정" + +#: src/slic3r/GUI/Selection.cpp:1475 +msgid "Set Printable Instance" +msgstr "인쇄 가능한 인스턴스 설정" + +#: src/slic3r/GUI/Selection.cpp:1475 +msgid "Set Unprintable Instance" +msgstr "인쇄할 수 없는 인스턴스 설정" + #: src/slic3r/GUI/SysInfoDialog.cpp:78 msgid "System Information" msgstr "시스템 정보" @@ -3872,7 +5086,7 @@ msgstr "시스템 정보" msgid "Copy to Clipboard" msgstr "클립보드에 복사" -#: src/slic3r/GUI/Tab.cpp:52 src/libslic3r/PrintConfig.cpp:239 +#: src/slic3r/GUI/Tab.cpp:52 src/libslic3r/PrintConfig.cpp:255 msgid "Compatible printers" msgstr "호환 가능한 프린터들" @@ -3880,7 +5094,7 @@ msgstr "호환 가능한 프린터들" msgid "Select the printers this profile is compatible with." msgstr "이 프로파일과 호환 가능한 프린터를 선택하세요." -#: src/slic3r/GUI/Tab.cpp:58 src/libslic3r/PrintConfig.cpp:254 +#: src/slic3r/GUI/Tab.cpp:58 src/libslic3r/PrintConfig.cpp:270 msgid "Compatible print profiles" msgstr "호환되는 인쇄 프로 파일" @@ -3889,16 +5103,16 @@ msgid "Select the print profiles this profile is compatible with." msgstr "이 프로필이 호환되는 인쇄 프로필을 선택 합니다." #. TRN "Save current Settings" -#: src/slic3r/GUI/Tab.cpp:133 +#: src/slic3r/GUI/Tab.cpp:135 #, c-format msgid "Save current %s" msgstr "현재 %s 저장" -#: src/slic3r/GUI/Tab.cpp:134 +#: src/slic3r/GUI/Tab.cpp:136 msgid "Delete this preset" msgstr "이전 설정 삭제" -#: src/slic3r/GUI/Tab.cpp:139 +#: src/slic3r/GUI/Tab.cpp:141 msgid "" "Hover the cursor over buttons to find more information \n" "or click this button." @@ -3906,380 +5120,279 @@ msgstr "" "버튼 위로 커서를 가져 가서 자세한 정보를 찾습니다.\n" "또는이 버튼을 클릭하십시오." -#: src/slic3r/GUI/Tab.cpp:921 +#: src/slic3r/GUI/Tab.cpp:943 msgid "This is a default preset." msgstr "기본 설정입니다." -#: src/slic3r/GUI/Tab.cpp:923 +#: src/slic3r/GUI/Tab.cpp:945 msgid "This is a system preset." msgstr "시스템 설정입니다." -#: src/slic3r/GUI/Tab.cpp:925 +#: src/slic3r/GUI/Tab.cpp:947 msgid "Current preset is inherited from the default preset." msgstr "현재 사전 설정은 기본 사전 설정에서 상속됩니다." -#: src/slic3r/GUI/Tab.cpp:928 +#: src/slic3r/GUI/Tab.cpp:950 #, c-format msgid "" "Current preset is inherited from:\n" "\t%s" msgstr "전의 %s 설정에서 가져 옵니다 " -#: src/slic3r/GUI/Tab.cpp:932 +#: src/slic3r/GUI/Tab.cpp:954 msgid "It can't be deleted or modified." msgstr "삭제하거나 수정할 수 없습니다." -#: src/slic3r/GUI/Tab.cpp:933 +#: src/slic3r/GUI/Tab.cpp:955 msgid "" "Any modifications should be saved as a new preset inherited from this one." msgstr "모든 수정 사항은 이 항목에서 받은 기본 설정으로 저장해야합니다." -#: src/slic3r/GUI/Tab.cpp:934 +#: src/slic3r/GUI/Tab.cpp:956 msgid "To do that please specify a new name for the preset." msgstr "그렇게하려면 기본 설정의 새 이름을 지정하십시오." -#: src/slic3r/GUI/Tab.cpp:938 +#: src/slic3r/GUI/Tab.cpp:960 msgid "Additional information:" msgstr "추가 정보:" -#: src/slic3r/GUI/Tab.cpp:944 +#: src/slic3r/GUI/Tab.cpp:966 msgid "printer model" msgstr "프린터 모델" -#: src/slic3r/GUI/Tab.cpp:952 +#: src/slic3r/GUI/Tab.cpp:974 msgid "default print profile" msgstr "기본 인쇄 프로파일" -#: src/slic3r/GUI/Tab.cpp:955 +#: src/slic3r/GUI/Tab.cpp:977 msgid "default filament profile" msgstr "기본 필라멘트 프로파일" -#: src/slic3r/GUI/Tab.cpp:969 +#: src/slic3r/GUI/Tab.cpp:991 msgid "default SLA material profile" msgstr "기본 SLA 재질 프로 파일" -#: src/slic3r/GUI/Tab.cpp:973 +#: src/slic3r/GUI/Tab.cpp:995 msgid "default SLA print profile" msgstr "기본 SLA 인쇄 프로필" -#: src/slic3r/GUI/Tab.cpp:1008 src/slic3r/GUI/Tab.cpp:3649 +#: src/slic3r/GUI/Tab.cpp:1003 +msgid "full profile name" +msgstr "전체 프로필 이름" + +#: src/slic3r/GUI/Tab.cpp:1004 +msgid "symbolic profile name" +msgstr "기호 프로파일 이름" + +#: src/slic3r/GUI/Tab.cpp:1038 src/slic3r/GUI/Tab.cpp:3570 msgid "Layers and perimeters" -msgstr "레이어 및 경계선" +msgstr "레이어 및 둘레" -#: src/slic3r/GUI/Tab.cpp:1009 src/slic3r/GUI/Tab.cpp:1257 -#: src/libslic3r/PrintConfig.cpp:66 -msgid "Layer height" -msgstr "레이어 높이" - -#: src/slic3r/GUI/Tab.cpp:1013 +#: src/slic3r/GUI/Tab.cpp:1043 msgid "Vertical shells" msgstr "쉘 높이" -#: src/slic3r/GUI/Tab.cpp:1024 +#: src/slic3r/GUI/Tab.cpp:1054 msgid "Horizontal shells" msgstr "쉘 너비" -#: src/slic3r/GUI/Tab.cpp:1025 src/libslic3r/PrintConfig.cpp:1759 +#: src/slic3r/GUI/Tab.cpp:1055 src/libslic3r/PrintConfig.cpp:1790 msgid "Solid layers" msgstr "솔리드 레이어" -#: src/slic3r/GUI/Tab.cpp:1030 +#: src/slic3r/GUI/Tab.cpp:1059 +msgid "Minimum shell thickness" +msgstr "최소 쉘 두께" + +#: src/slic3r/GUI/Tab.cpp:1070 msgid "Quality (slower slicing)" msgstr "품질(슬라이싱이 느려짐)" -#: src/slic3r/GUI/Tab.cpp:1048 +#: src/slic3r/GUI/Tab.cpp:1088 msgid "Reducing printing time" msgstr "출력 시간 단축" -#: src/slic3r/GUI/Tab.cpp:1060 +#: src/slic3r/GUI/Tab.cpp:1100 msgid "Skirt and brim" msgstr "스커트와 브림" -#: src/slic3r/GUI/Tab.cpp:1077 +#: src/slic3r/GUI/Tab.cpp:1117 msgid "Raft" msgstr "라프트" -#: src/slic3r/GUI/Tab.cpp:1081 +#: src/slic3r/GUI/Tab.cpp:1121 msgid "Options for support material and raft" msgstr "서포트와 라프트 재료를 선택" -#: src/slic3r/GUI/Tab.cpp:1096 +#: src/slic3r/GUI/Tab.cpp:1136 msgid "Speed for print moves" msgstr "출력중 이동 속도" -#: src/slic3r/GUI/Tab.cpp:1108 +#: src/slic3r/GUI/Tab.cpp:1148 msgid "Speed for non-print moves" msgstr "미출력시 이동속도" -#: src/slic3r/GUI/Tab.cpp:1111 +#: src/slic3r/GUI/Tab.cpp:1151 msgid "Modifiers" msgstr "수정" -#: src/slic3r/GUI/Tab.cpp:1114 +#: src/slic3r/GUI/Tab.cpp:1154 msgid "Acceleration control (advanced)" msgstr "가속 제어(고급)" -#: src/slic3r/GUI/Tab.cpp:1121 +#: src/slic3r/GUI/Tab.cpp:1161 msgid "Autospeed (advanced)" msgstr "오토스피트(고급)" -#: src/slic3r/GUI/Tab.cpp:1129 +#: src/slic3r/GUI/Tab.cpp:1169 msgid "Multiple Extruders" msgstr "다중 익스트루더" -#: src/slic3r/GUI/Tab.cpp:1137 +#: src/slic3r/GUI/Tab.cpp:1177 msgid "Ooze prevention" msgstr "오즈 방지(Ooze prevention)" -#: src/slic3r/GUI/Tab.cpp:1154 +#: src/slic3r/GUI/Tab.cpp:1195 msgid "Extrusion width" msgstr "악출 폭(Extrusion width)" -#: src/slic3r/GUI/Tab.cpp:1164 +#: src/slic3r/GUI/Tab.cpp:1205 msgid "Overlap" msgstr "겹침(Overlap)" -#: src/slic3r/GUI/Tab.cpp:1167 +#: src/slic3r/GUI/Tab.cpp:1208 msgid "Flow" msgstr "유량(Flow)" -#: src/slic3r/GUI/Tab.cpp:1176 +#: src/slic3r/GUI/Tab.cpp:1217 msgid "Other" msgstr "그 외" -#: src/slic3r/GUI/Tab.cpp:1179 src/slic3r/GUI/Tab.cpp:3703 +#: src/slic3r/GUI/Tab.cpp:1220 src/slic3r/GUI/Tab.cpp:3637 msgid "Output options" msgstr "출력 옵션" -#: src/slic3r/GUI/Tab.cpp:1180 +#: src/slic3r/GUI/Tab.cpp:1221 msgid "Sequential printing" msgstr "연속 인쇄" -#: src/slic3r/GUI/Tab.cpp:1182 +#: src/slic3r/GUI/Tab.cpp:1223 msgid "Extruder clearance (mm)" msgstr "익스트루더 간격(mm)" -#: src/slic3r/GUI/Tab.cpp:1191 src/slic3r/GUI/Tab.cpp:3704 +#: src/slic3r/GUI/Tab.cpp:1232 src/slic3r/GUI/Tab.cpp:3638 msgid "Output file" msgstr "출력 파일" -#: src/slic3r/GUI/Tab.cpp:1198 src/libslic3r/PrintConfig.cpp:1432 +#: src/slic3r/GUI/Tab.cpp:1239 src/libslic3r/PrintConfig.cpp:1462 msgid "Post-processing scripts" msgstr "사후 처리 스크립트" -#: src/slic3r/GUI/Tab.cpp:1204 src/slic3r/GUI/Tab.cpp:1205 -#: src/slic3r/GUI/Tab.cpp:1716 src/slic3r/GUI/Tab.cpp:1717 -#: src/slic3r/GUI/Tab.cpp:2165 src/slic3r/GUI/Tab.cpp:2166 -#: src/slic3r/GUI/Tab.cpp:2273 src/slic3r/GUI/Tab.cpp:2274 -#: src/slic3r/GUI/Tab.cpp:3586 src/slic3r/GUI/Tab.cpp:3587 +#: src/slic3r/GUI/Tab.cpp:1245 src/slic3r/GUI/Tab.cpp:1246 +#: src/slic3r/GUI/Tab.cpp:1531 src/slic3r/GUI/Tab.cpp:1532 +#: src/slic3r/GUI/Tab.cpp:1996 src/slic3r/GUI/Tab.cpp:1997 +#: src/slic3r/GUI/Tab.cpp:2110 src/slic3r/GUI/Tab.cpp:2111 +#: src/slic3r/GUI/Tab.cpp:3507 src/slic3r/GUI/Tab.cpp:3508 msgid "Notes" msgstr "메모" -#: src/slic3r/GUI/Tab.cpp:1211 src/slic3r/GUI/Tab.cpp:1724 -#: src/slic3r/GUI/Tab.cpp:2172 src/slic3r/GUI/Tab.cpp:2280 -#: src/slic3r/GUI/Tab.cpp:3594 src/slic3r/GUI/Tab.cpp:3709 +#: src/slic3r/GUI/Tab.cpp:1252 src/slic3r/GUI/Tab.cpp:1539 +#: src/slic3r/GUI/Tab.cpp:2003 src/slic3r/GUI/Tab.cpp:2117 +#: src/slic3r/GUI/Tab.cpp:3515 src/slic3r/GUI/Tab.cpp:3643 msgid "Dependencies" msgstr "속한 그룹" -#: src/slic3r/GUI/Tab.cpp:1212 src/slic3r/GUI/Tab.cpp:1725 -#: src/slic3r/GUI/Tab.cpp:2173 src/slic3r/GUI/Tab.cpp:2281 -#: src/slic3r/GUI/Tab.cpp:3595 src/slic3r/GUI/Tab.cpp:3710 +#: src/slic3r/GUI/Tab.cpp:1253 src/slic3r/GUI/Tab.cpp:1540 +#: src/slic3r/GUI/Tab.cpp:2004 src/slic3r/GUI/Tab.cpp:2118 +#: src/slic3r/GUI/Tab.cpp:3516 src/slic3r/GUI/Tab.cpp:3644 msgid "Profile dependencies" msgstr "프로파일 속한곳" -#: src/slic3r/GUI/Tab.cpp:1256 -msgid "" -"Zero layer height is not valid.\n" -"\n" -"The layer height will be reset to 0.01." -msgstr "" -"바닥 레이어 높이가 잘못되었습니다.\n" -"\n" -"레이어 높이가 0.01로 재설정됩니다." - -#: src/slic3r/GUI/Tab.cpp:1268 -msgid "" -"Zero first layer height is not valid.\n" -"\n" -"The first layer height will be reset to 0.01." -msgstr "" -"첫 번째 레이어 높이가 0이면 유효하지 않습니다.\n" -"\n" -"첫 번째 레이어 높이는 0.01로 재설정됩니다." - -#: src/slic3r/GUI/Tab.cpp:1269 src/libslic3r/PrintConfig.cpp:866 -msgid "First layer height" -msgstr "첫 레이어 높이" - -#: src/slic3r/GUI/Tab.cpp:1283 -#, c-format -msgid "" -"The Spiral Vase mode requires:\n" -"- one perimeter\n" -"- no top solid layers\n" -"- 0% fill density\n" -"- no support material\n" -"- no ensure_vertical_shell_thickness\n" -"\n" -"Shall I adjust those settings in order to enable Spiral Vase?" -msgstr "" -"스파이럴 바이스 모드에는 다음이 필요합니다.\n" -"- one 둘레\n" -"- 탑 솔리드 레이어 없음\n" -"- 0% fill density\n" -"- 서포트 재료 없음\n" -"- 수직 벽 두깨를 보장하지 않음\n" -"\n" -"스파이럴 바이스를 사용하려면 이러한 설정을 조정해야합니까?" - -#: src/slic3r/GUI/Tab.cpp:1290 -msgid "Spiral Vase" -msgstr "스파이럴 바이스" - -#: src/slic3r/GUI/Tab.cpp:1311 -msgid "" -"The Wipe Tower currently supports the non-soluble supports only\n" -"if they are printed with the current extruder without triggering a tool " -"change.\n" -"(both support_material_extruder and support_material_interface_extruder need " -"to be set to 0).\n" -"\n" -"Shall I adjust those settings in order to enable the Wipe Tower?" -msgstr "" -"와이퍼 타워는 현재 비 가용성 서포트 만 지원합니다.\n" -"공구 교환을 트리거하지 않고 현재 압출기로 인쇄 한 경우.\n" -"(support_material_extruder 및 support_material_interface_extruder를 모두 0으" -"로 설정해야 함).\n" -"\n" -"와이퍼 타워를 사용하려면 이러한 설정을 조정해야합니까?" - -#: src/slic3r/GUI/Tab.cpp:1315 src/slic3r/GUI/Tab.cpp:1332 -msgid "Wipe Tower" -msgstr "와이프 타워(Wipe Tower)" - -#: src/slic3r/GUI/Tab.cpp:1329 -msgid "" -"For the Wipe Tower to work with the soluble supports, the support layers\n" -"need to be synchronized with the object layers.\n" -"\n" -"Shall I synchronize support layers in order to enable the Wipe Tower?" -msgstr "" -"와이퍼 타워가 가용성 서포트와 함께 작용하기 위해, 서포트 레이어\n" -"객체 레이어와 동기화되어야합니다.\n" -"\n" -"와이퍼 타워를 사용하려면 서포트 레이어를 동기화해야합니까?" - -#: src/slic3r/GUI/Tab.cpp:1347 -msgid "" -"Supports work better, if the following feature is enabled:\n" -"- Detect bridging perimeters\n" -"\n" -"Shall I adjust those settings for supports?" -msgstr "" -"다음 기능을 사용하는 경우 더 나은 작업을 지원합니다.\n" -"- 브리지 경계 검출\n" -"\n" -"서포트에 대한 설정을 조정해야합니까?" - -#: src/slic3r/GUI/Tab.cpp:1350 -msgid "Support Generator" -msgstr "서포트 생성" - -#: src/slic3r/GUI/Tab.cpp:1392 -msgid "" -"The %1% infill pattern is not supposed to work at 100%% density.\n" -"\n" -"Shall I switch to rectilinear fill pattern?" -msgstr "" -"%1% 채우기 패턴은 100%의 밀도로 작동 하지 않습니다.\n" -"\n" -"직선 채우기 패턴으로 전환 해야 합니까?" - -#: src/slic3r/GUI/Tab.cpp:1502 src/slic3r/GUI/Tab.cpp:1557 +#: src/slic3r/GUI/Tab.cpp:1317 src/slic3r/GUI/Tab.cpp:1372 msgid "Filament Overrides" msgstr "필라멘트 재정의" -#: src/slic3r/GUI/Tab.cpp:1503 src/slic3r/GUI/Tab.cpp:1562 -#: src/slic3r/GUI/Tab.cpp:2514 +#: src/slic3r/GUI/Tab.cpp:1318 src/slic3r/GUI/Tab.cpp:1377 +#: src/slic3r/GUI/Tab.cpp:2352 msgid "Retraction" msgstr "리트렉션" -#: src/slic3r/GUI/Tab.cpp:1612 src/libslic3r/PrintConfig.cpp:2030 +#: src/slic3r/GUI/Tab.cpp:1427 src/libslic3r/PrintConfig.cpp:2077 msgid "Temperature" msgstr "온도" -#: src/slic3r/GUI/Tab.cpp:1618 +#: src/slic3r/GUI/Tab.cpp:1433 msgid "Bed" msgstr "배드(Bed)" -#: src/slic3r/GUI/Tab.cpp:1623 +#: src/slic3r/GUI/Tab.cpp:1438 msgid "Cooling" msgstr "냉각(Cooling)" -#: src/slic3r/GUI/Tab.cpp:1624 src/libslic3r/PrintConfig.cpp:1335 -#: src/libslic3r/PrintConfig.cpp:2150 +#: src/slic3r/GUI/Tab.cpp:1439 src/libslic3r/PrintConfig.cpp:1364 +#: src/libslic3r/PrintConfig.cpp:2210 msgid "Enable" msgstr "사용" -#: src/slic3r/GUI/Tab.cpp:1635 +#: src/slic3r/GUI/Tab.cpp:1450 msgid "Fan settings" msgstr "팬 설정" -#: src/slic3r/GUI/Tab.cpp:1636 -msgid "Fan speed" -msgstr "팬 속도" - -#: src/slic3r/GUI/Tab.cpp:1644 +#: src/slic3r/GUI/Tab.cpp:1459 msgid "Cooling thresholds" msgstr "냉각 임계 값" -#: src/slic3r/GUI/Tab.cpp:1650 +#: src/slic3r/GUI/Tab.cpp:1465 msgid "Filament properties" msgstr "필라멘트 특성" -#: src/slic3r/GUI/Tab.cpp:1654 +#: src/slic3r/GUI/Tab.cpp:1469 msgid "Print speed override" msgstr "인쇄 속도 중단" -#: src/slic3r/GUI/Tab.cpp:1664 +#: src/slic3r/GUI/Tab.cpp:1479 msgid "Wipe tower parameters" msgstr "타워 매개변수 지우기" -#: src/slic3r/GUI/Tab.cpp:1667 +#: src/slic3r/GUI/Tab.cpp:1482 msgid "Toolchange parameters with single extruder MM printers" -msgstr "싱글 익스트루더 멀티 터리알 프린터를 사용한 공구 교환 매개 변수" +msgstr "MMU 프린터의 툴체인지 매개 변수" -#: src/slic3r/GUI/Tab.cpp:1681 +#: src/slic3r/GUI/Tab.cpp:1496 msgid "Ramming settings" msgstr "래밍 설정" -#: src/slic3r/GUI/Tab.cpp:1703 src/slic3r/GUI/Tab.cpp:2128 +#: src/slic3r/GUI/Tab.cpp:1518 src/slic3r/GUI/Tab.cpp:1959 msgid "Custom G-code" msgstr "수동 G코드" -#: src/slic3r/GUI/Tab.cpp:1704 src/slic3r/GUI/Tab.cpp:2129 -#: src/libslic3r/PrintConfig.cpp:1785 src/libslic3r/PrintConfig.cpp:1800 +#: src/slic3r/GUI/Tab.cpp:1519 src/slic3r/GUI/Tab.cpp:1960 +#: src/libslic3r/PrintConfig.cpp:1823 src/libslic3r/PrintConfig.cpp:1838 msgid "Start G-code" msgstr "스타트 G코드" -#: src/slic3r/GUI/Tab.cpp:1710 src/slic3r/GUI/Tab.cpp:2135 -#: src/libslic3r/PrintConfig.cpp:369 src/libslic3r/PrintConfig.cpp:379 +#: src/slic3r/GUI/Tab.cpp:1525 src/slic3r/GUI/Tab.cpp:1966 +#: src/libslic3r/PrintConfig.cpp:385 src/libslic3r/PrintConfig.cpp:395 msgid "End G-code" msgstr "엔드 G코드" -#: src/slic3r/GUI/Tab.cpp:1843 src/slic3r/GUI/Tab.cpp:2068 +#: src/slic3r/GUI/Tab.cpp:1582 +msgid "Volumetric flow hints not available" +msgstr "체적 흐름 힌트를 사용할 수 없음" + +#: src/slic3r/GUI/Tab.cpp:1668 src/slic3r/GUI/Tab.cpp:1899 msgid "Test" msgstr "시험(test)" -#: src/slic3r/GUI/Tab.cpp:1853 +#: src/slic3r/GUI/Tab.cpp:1678 msgid "Could not get a valid Printer Host reference" msgstr "유효한 프린터 호스트 참조를 가져올 수 없습니다" -#: src/slic3r/GUI/Tab.cpp:1859 src/slic3r/GUI/Tab.cpp:2081 +#: src/slic3r/GUI/Tab.cpp:1684 src/slic3r/GUI/Tab.cpp:1912 msgid "Success!" msgstr "성공!" -#: src/slic3r/GUI/Tab.cpp:1874 +#: src/slic3r/GUI/Tab.cpp:1699 msgid "" "HTTPS CA file is optional. It is only needed if you use HTTPS with a self-" "signed certificate." @@ -4287,15 +5400,15 @@ msgstr "" "HTTPS CA 파일은 선택 사항입니다. 자체 서명 된 인증서로 HTTPS를 사용하는 경우" "에만 필요합니다." -#: src/slic3r/GUI/Tab.cpp:1887 +#: src/slic3r/GUI/Tab.cpp:1712 msgid "Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*" msgstr "인증서 파일 (* .crt, * .pem) | * .crt; * .pem | 모든 파일 | *. *" -#: src/slic3r/GUI/Tab.cpp:1888 +#: src/slic3r/GUI/Tab.cpp:1713 msgid "Open CA certificate file" msgstr "CA 인증서 파일 열기" -#: src/slic3r/GUI/Tab.cpp:1916 +#: src/slic3r/GUI/Tab.cpp:1741 #, c-format msgid "" "HTTPS CA File:\n" @@ -4305,176 +5418,183 @@ msgid "" "Store / Keychain." msgstr "" "HTTPS CA 파일:\n" -"\t이 시스템에서 %s는 시스템 인증서 저장소나 키체인의 HTTPS 인증서를 사용 합니" -"다.\n" -"\t사용자 지정 CA 파일을 사용 하려면 CA 파일을 인증서 저장소/키체인에 가져오십" -"시오." +" \t이 시스템에서 %s는 시스템 인증서 저장소나 키체인의 HTTPS 인증서를 사용 " +"합니다.\n" +" \t사용자 지정 CA 파일을 사용 하려면 CA 파일을 인증서 저장소/키체인에 가져" +"오십시오." -#: src/slic3r/GUI/Tab.cpp:1956 src/slic3r/GUI/Tab.cpp:2194 +#: src/slic3r/GUI/Tab.cpp:1781 src/slic3r/GUI/Tab.cpp:2025 msgid "Size and coordinates" msgstr "크기와 좌표" -#: src/slic3r/GUI/Tab.cpp:1961 src/slic3r/GUI/Tab.cpp:2199 -#: src/slic3r/GUI/Tab.cpp:3256 +#: src/slic3r/GUI/Tab.cpp:1786 src/slic3r/GUI/Tab.cpp:2030 +#: src/slic3r/GUI/Tab.cpp:3146 msgid "Set" msgstr "설정" -#: src/slic3r/GUI/Tab.cpp:1993 +#: src/slic3r/GUI/Tab.cpp:1818 msgid "Capabilities" msgstr "기능" -#: src/slic3r/GUI/Tab.cpp:1998 +#: src/slic3r/GUI/Tab.cpp:1823 msgid "Number of extruders of the printer." -msgstr "프린터 익스트루더 숫자." +msgstr "프린터 익스트루더 갯수." -#: src/slic3r/GUI/Tab.cpp:2023 +#: src/slic3r/GUI/Tab.cpp:1851 msgid "" "Single Extruder Multi Material is selected, \n" "and all extruders must have the same diameter.\n" "Do you want to change the diameter for all extruders to first extruder " "nozzle diameter value?" msgstr "" -"단일 압출기 멀티 재질이 선택되고, \n" +"단일 압출기 다중 재질이 선택되고, \n" "모든 압출기는 동일한 직경을 가져야 합니다.\n" "모든 압출기의 지름을 첫 번째 압출기 노즐 값으로 변경하시겠습니까?" -#: src/slic3r/GUI/Tab.cpp:2026 src/slic3r/GUI/Tab.cpp:2484 -#: src/libslic3r/PrintConfig.cpp:1310 +#: src/slic3r/GUI/Tab.cpp:1854 src/slic3r/GUI/Tab.cpp:2322 +#: src/libslic3r/PrintConfig.cpp:1335 msgid "Nozzle diameter" msgstr "노즐 직경" -#: src/slic3r/GUI/Tab.cpp:2053 +#: src/slic3r/GUI/Tab.cpp:1884 msgid "USB/Serial connection" msgstr "USB/시리얼 연결" -#: src/slic3r/GUI/Tab.cpp:2054 src/libslic3r/PrintConfig.cpp:1640 +#: src/slic3r/GUI/Tab.cpp:1885 src/libslic3r/PrintConfig.cpp:1670 msgid "Serial port" msgstr "시리얼 포트" -#: src/slic3r/GUI/Tab.cpp:2059 +#: src/slic3r/GUI/Tab.cpp:1890 msgid "Rescan serial ports" msgstr "시리얼포트 재검색" -#: src/slic3r/GUI/Tab.cpp:2081 +#: src/slic3r/GUI/Tab.cpp:1912 msgid "Connection to printer works correctly." msgstr "프린터 연결이 올바르게 작동합니다." -#: src/slic3r/GUI/Tab.cpp:2084 +#: src/slic3r/GUI/Tab.cpp:1915 msgid "Connection failed." msgstr "연결 실패." -#: src/slic3r/GUI/Tab.cpp:2097 src/slic3r/GUI/Tab.cpp:2268 +#: src/slic3r/GUI/Tab.cpp:1928 src/slic3r/GUI/Tab.cpp:2105 msgid "Print Host upload" msgstr "호스트 업로드 인쇄" -#: src/slic3r/GUI/Tab.cpp:2141 src/libslic3r/PrintConfig.cpp:138 +#: src/slic3r/GUI/Tab.cpp:1972 src/libslic3r/PrintConfig.cpp:143 msgid "Before layer change G-code" msgstr "레이어 변경 전 G 코드" -#: src/slic3r/GUI/Tab.cpp:2147 src/libslic3r/PrintConfig.cpp:1056 +#: src/slic3r/GUI/Tab.cpp:1978 src/libslic3r/PrintConfig.cpp:1081 msgid "After layer change G-code" msgstr "레이어 변경 후 G 코드" -#: src/slic3r/GUI/Tab.cpp:2153 src/libslic3r/PrintConfig.cpp:2056 +#: src/slic3r/GUI/Tab.cpp:1984 src/libslic3r/PrintConfig.cpp:2103 msgid "Tool change G-code" msgstr "툴 채인지 G 코드" -#: src/slic3r/GUI/Tab.cpp:2159 +#: src/slic3r/GUI/Tab.cpp:1990 msgid "Between objects G-code (for sequential printing)" -msgstr "객체 간 G 코드 (순차 인쇄용)" +msgstr "객체(object) 간 G 코드 (순차 인쇄용)" -#: src/slic3r/GUI/Tab.cpp:2231 +#: src/slic3r/GUI/Tab.cpp:2062 msgid "Display" msgstr "표시" -#: src/slic3r/GUI/Tab.cpp:2246 +#: src/slic3r/GUI/Tab.cpp:2077 msgid "Tilt" msgstr "기울이기" -#: src/slic3r/GUI/Tab.cpp:2247 +#: src/slic3r/GUI/Tab.cpp:2078 msgid "Tilt time" msgstr "기울이기 시간" -#: src/slic3r/GUI/Tab.cpp:2253 src/slic3r/GUI/Tab.cpp:3568 +#: src/slic3r/GUI/Tab.cpp:2084 src/slic3r/GUI/Tab.cpp:3489 msgid "Corrections" msgstr "수정" -#: src/slic3r/GUI/Tab.cpp:2333 src/slic3r/GUI/Tab.cpp:2418 -#: src/libslic3r/PrintConfig.cpp:1106 src/libslic3r/PrintConfig.cpp:1124 -#: src/libslic3r/PrintConfig.cpp:1142 src/libslic3r/PrintConfig.cpp:1159 -#: src/libslic3r/PrintConfig.cpp:1170 src/libslic3r/PrintConfig.cpp:1181 -#: src/libslic3r/PrintConfig.cpp:1192 +#: src/slic3r/GUI/Tab.cpp:2099 src/slic3r/GUI/Tab.cpp:3485 +msgid "Exposure" +msgstr "노출" + +#: src/slic3r/GUI/Tab.cpp:2170 src/slic3r/GUI/Tab.cpp:2255 +#: src/libslic3r/PrintConfig.cpp:1131 src/libslic3r/PrintConfig.cpp:1149 +#: src/libslic3r/PrintConfig.cpp:1167 src/libslic3r/PrintConfig.cpp:1184 +#: src/libslic3r/PrintConfig.cpp:1195 src/libslic3r/PrintConfig.cpp:1206 +#: src/libslic3r/PrintConfig.cpp:1217 msgid "Machine limits" msgstr "머신 한계설정" -#: src/slic3r/GUI/Tab.cpp:2347 +#: src/slic3r/GUI/Tab.cpp:2184 msgid "Values in this column are for Normal mode" msgstr "이 열의 값은 일반 모드입니다" -#: src/slic3r/GUI/Tab.cpp:2348 +#: src/slic3r/GUI/Tab.cpp:2185 msgid "Normal" msgstr "보통" -#: src/slic3r/GUI/Tab.cpp:2353 +#: src/slic3r/GUI/Tab.cpp:2190 msgid "Values in this column are for Stealth mode" msgstr "이 열의 값은 무음 모드 용입니다" -#: src/slic3r/GUI/Tab.cpp:2354 +#: src/slic3r/GUI/Tab.cpp:2191 msgid "Stealth" msgstr "스텔스" -#: src/slic3r/GUI/Tab.cpp:2362 +#: src/slic3r/GUI/Tab.cpp:2199 msgid "Maximum feedrates" msgstr "최대 이송속도" -#: src/slic3r/GUI/Tab.cpp:2367 +#: src/slic3r/GUI/Tab.cpp:2204 msgid "Maximum accelerations" msgstr "최고 가속도" -#: src/slic3r/GUI/Tab.cpp:2374 +#: src/slic3r/GUI/Tab.cpp:2211 msgid "Jerk limits" msgstr "저크(Jerk)값 한계" -#: src/slic3r/GUI/Tab.cpp:2379 +#: src/slic3r/GUI/Tab.cpp:2216 msgid "Minimum feedrates" msgstr "최대 이송속도" -#: src/slic3r/GUI/Tab.cpp:2443 src/slic3r/GUI/Tab.cpp:2451 +#: src/slic3r/GUI/Tab.cpp:2280 src/slic3r/GUI/Tab.cpp:2288 msgid "Single extruder MM setup" msgstr "싱글 익스트루더 MM 설정" -#: src/slic3r/GUI/Tab.cpp:2452 +#: src/slic3r/GUI/Tab.cpp:2289 msgid "Single extruder multimaterial parameters" msgstr "싱글 익스트루더 멀티메터리알 파라미터" -#: src/slic3r/GUI/Tab.cpp:2465 src/libslic3r/GCode/PreviewData.cpp:477 -#, c-format -msgid "Extruder %d" -msgstr "익스트루더 %d" +#: src/slic3r/GUI/Tab.cpp:2320 +msgid "" +"This is a single extruder multimaterial printer, diameters of all extruders " +"will be set to the new value. Do you want to proceed?" +msgstr "" +"이것은 단일 압출기 다중 재질 프린터이며 모든 압출기의 지름이 새 값으로 설정됩" +"니다. 계속하시겠습니까?" -#: src/slic3r/GUI/Tab.cpp:2483 -msgid "Do you want to change the diameter for all extruders?" -msgstr "모든 압출기의 지름을 변경하시겠습니까?" - -#: src/slic3r/GUI/Tab.cpp:2506 +#: src/slic3r/GUI/Tab.cpp:2344 msgid "Layer height limits" msgstr "레이어 높이 한계치" -#: src/slic3r/GUI/Tab.cpp:2511 +#: src/slic3r/GUI/Tab.cpp:2349 msgid "Position (for multi-extruder printers)" -msgstr "위치 (멀티 익스트루더 프린터 포함)" +msgstr "위치 (다중 익스트루더 프린터 포함)" -#: src/slic3r/GUI/Tab.cpp:2517 +#: src/slic3r/GUI/Tab.cpp:2355 msgid "Only lift Z" msgstr "Z축 올림" -#: src/slic3r/GUI/Tab.cpp:2530 +#: src/slic3r/GUI/Tab.cpp:2368 msgid "" "Retraction when tool is disabled (advanced settings for multi-extruder " "setups)" -msgstr "도구 비활성화시 리트렉션 (멀티 익스트루더 고급 설정)" +msgstr "도구 비활성화시 리트렉션 (다중 익스트루더 고급 설정)" -#: src/slic3r/GUI/Tab.cpp:2693 +#: src/slic3r/GUI/Tab.cpp:2376 +msgid "Reset to Filament Color" +msgstr "필라멘트 색상으로 재설정" + +#: src/slic3r/GUI/Tab.cpp:2557 msgid "" "The Wipe option is not available when using the Firmware Retraction mode.\n" "\n" @@ -4484,92 +5604,101 @@ msgstr "" "\n" "펌웨어 리트렉션 하려면 비활성화해야합니까?" -#: src/slic3r/GUI/Tab.cpp:2695 +#: src/slic3r/GUI/Tab.cpp:2559 msgid "Firmware Retraction" msgstr "펌웨어 레트렉션" -#: src/slic3r/GUI/Tab.cpp:3024 +#: src/slic3r/GUI/Tab.cpp:2889 #, c-format msgid "Default preset (%s)" msgstr "시스템 기본값 (%s)" -#: src/slic3r/GUI/Tab.cpp:3025 +#: src/slic3r/GUI/Tab.cpp:2890 #, c-format msgid "Preset (%s)" msgstr "프리셋 ( %s)" -#: src/slic3r/GUI/Tab.cpp:3042 +#: src/slic3r/GUI/Tab.cpp:2907 msgid "has the following unsaved changes:" msgstr "저장되지 않은 수정사항:" -#: src/slic3r/GUI/Tab.cpp:3045 +#: src/slic3r/GUI/Tab.cpp:2910 msgid "is not compatible with printer" msgstr "프린터와 호완 되지 않습니다" -#: src/slic3r/GUI/Tab.cpp:3046 +#: src/slic3r/GUI/Tab.cpp:2911 msgid "is not compatible with print profile" msgstr "인쇄 프로필과 호환 되지 않음" -#: src/slic3r/GUI/Tab.cpp:3048 +#: src/slic3r/GUI/Tab.cpp:2913 msgid "and it has the following unsaved changes:" msgstr "저장되지 않은 변경점은 다음과 같습니다:" -#: src/slic3r/GUI/Tab.cpp:3052 +#: src/slic3r/GUI/Tab.cpp:2917 msgid "Unsaved Changes" msgstr "미 저장된 변경점" -#: src/slic3r/GUI/Tab.cpp:3143 +#: src/slic3r/GUI/Tab.cpp:3015 +msgctxt "PresetName" msgid "%1% - Copy" msgstr "%1%-복사" -#: src/slic3r/GUI/Tab.cpp:3166 +#: src/slic3r/GUI/Tab.cpp:3038 msgid "The supplied name is empty. It can't be saved." msgstr "파일 이름이 비어 있습니다. 저장할 수 없습니다." -#: src/slic3r/GUI/Tab.cpp:3171 +#: src/slic3r/GUI/Tab.cpp:3043 msgid "Cannot overwrite a system profile." msgstr "시스템 프로파일을 겹쳐 쓸 수 없습니다." -#: src/slic3r/GUI/Tab.cpp:3175 +#: src/slic3r/GUI/Tab.cpp:3047 msgid "Cannot overwrite an external profile." msgstr "외부 프로필을 덮어 쓸 수 없습니다." -#: src/slic3r/GUI/Tab.cpp:3201 +#: src/slic3r/GUI/Tab.cpp:3052 +msgid "Preset with name \"%1%\" already exists." +msgstr "이름 \"%1%\"가 있는 사전 설정이 이미 있습니다." + +#: src/slic3r/GUI/Tab.cpp:3053 +msgid "Replace?" +msgstr "교체?" + +#: src/slic3r/GUI/Tab.cpp:3091 msgid "remove" msgstr "제거(remove)" -#: src/slic3r/GUI/Tab.cpp:3201 +#: src/slic3r/GUI/Tab.cpp:3091 msgid "delete" msgstr "지우기" #. TRN remove/delete -#: src/slic3r/GUI/Tab.cpp:3203 +#: src/slic3r/GUI/Tab.cpp:3093 msgid "Are you sure you want to %1% the selected preset?" msgstr "선택한 사전 설정의 %1%를 선택 하시겠습니까?" #. TRN Remove/Delete -#: src/slic3r/GUI/Tab.cpp:3206 +#: src/slic3r/GUI/Tab.cpp:3096 msgid "%1% Preset" msgstr "%1% 기본설정" -#: src/slic3r/GUI/Tab.cpp:3332 +#: src/slic3r/GUI/Tab.cpp:3222 msgid "LOCKED LOCK" msgstr "잠긴 잠금" #. TRN Description for "LOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:3334 +#: src/slic3r/GUI/Tab.cpp:3224 msgid "" "indicates that the settings are the same as the system (or default) values " "for the current option group" msgstr "" "설정이 현재 옵션 그룹의 시스템(또는 기본값) 값과 동일하다는 것을 나타냅니다." -#: src/slic3r/GUI/Tab.cpp:3336 +#: src/slic3r/GUI/Tab.cpp:3226 msgid "UNLOCKED LOCK" msgstr "잠금 해제 잠금" #. TRN Description for "UNLOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:3338 +#: src/slic3r/GUI/Tab.cpp:3228 msgid "" "indicates that some settings were changed and are not equal to the system " "(or default) values for the current option group.\n" @@ -4581,12 +5710,12 @@ msgstr "" "잠금 해제 잠금 아이콘을 클릭하여 현재 옵션 그룹에 대한 모든 설정을 시스템(또" "는 기본값) 값으로 재설정합니다." -#: src/slic3r/GUI/Tab.cpp:3343 +#: src/slic3r/GUI/Tab.cpp:3233 msgid "WHITE BULLET" msgstr "흰색 글머리 기호" #. TRN Description for "WHITE BULLET" -#: src/slic3r/GUI/Tab.cpp:3345 +#: src/slic3r/GUI/Tab.cpp:3235 msgid "" "for the left button: \tindicates a non-system (or non-default) preset,\n" "for the right button: \tindicates that the settings hasn't been modified." @@ -4594,12 +5723,12 @@ msgstr "" "왼쪽 단추의 경우: 비시스템(또는 기본이 아닌) 사전 설정을 나타냅니다.\n" "오른쪽 버튼: 설정이 수정되지 않았음을 나타냅니다." -#: src/slic3r/GUI/Tab.cpp:3348 +#: src/slic3r/GUI/Tab.cpp:3238 msgid "BACK ARROW" msgstr "돌아가기 화살표" #. TRN Description for "BACK ARROW" -#: src/slic3r/GUI/Tab.cpp:3350 +#: src/slic3r/GUI/Tab.cpp:3240 msgid "" "indicates that the settings were changed and are not equal to the last saved " "preset for the current option group.\n" @@ -4611,7 +5740,7 @@ msgstr "" "현재 옵션 그룹의 모든 설정을 시스템 값으로 재설정하려면 자물쇠 잠금 아이콘을 " "클릭하십시오." -#: src/slic3r/GUI/Tab.cpp:3360 +#: src/slic3r/GUI/Tab.cpp:3250 msgid "" "LOCKED LOCK icon indicates that the settings are the same as the system (or " "default) values for the current option group" @@ -4619,7 +5748,7 @@ msgstr "" "LOCKED LOCK 아이콘은 설정이 현재 옵션 그룹의 시스템(또는 기본값) 값과 동일하" "다는 것을 나타냅니다." -#: src/slic3r/GUI/Tab.cpp:3362 +#: src/slic3r/GUI/Tab.cpp:3252 msgid "" "UNLOCKED LOCK icon indicates that some settings were changed and are not " "equal to the system (or default) values for the current option group.\n" @@ -4631,11 +5760,11 @@ msgstr "" "현재 옵션 그룹에 대한 모든 설정을 시스템(또는 기본값) 값으로 재설정하려면 클" "릭합니다." -#: src/slic3r/GUI/Tab.cpp:3365 +#: src/slic3r/GUI/Tab.cpp:3255 msgid "WHITE BULLET icon indicates a non system (or non default) preset." msgstr "WHITE BULLET 아이콘은 시스템 사전 설정이 아닌 것을 나타냅니다." -#: src/slic3r/GUI/Tab.cpp:3368 +#: src/slic3r/GUI/Tab.cpp:3258 msgid "" "WHITE BULLET icon indicates that the settings are the same as in the last " "saved preset for the current option group." @@ -4643,7 +5772,7 @@ msgstr "" "WHITE BULLET 기호 아이콘은 설정이 현재 옵션 그룹에 대해 마지막으로 저장 된 사" "전 설정과 동일 하다는 것을 나타냅니다." -#: src/slic3r/GUI/Tab.cpp:3370 +#: src/slic3r/GUI/Tab.cpp:3260 msgid "" "BACK ARROW icon indicates that the settings were changed and are not equal " "to the last saved preset for the current option group.\n" @@ -4655,7 +5784,7 @@ msgstr "" "마지막 현재 옵션 그룹에 대 한 모든 설정 다시 설정을 클릭 하 여 사전 설정을 저" "장." -#: src/slic3r/GUI/Tab.cpp:3376 +#: src/slic3r/GUI/Tab.cpp:3266 msgid "" "LOCKED LOCK icon indicates that the value is the same as the system (or " "default) value." @@ -4663,7 +5792,7 @@ msgstr "" "LOCKED LOCK 아이콘은 값이 시스템(또는 기본값) 값과 동일하다는 것을 나타냅니" "다." -#: src/slic3r/GUI/Tab.cpp:3377 +#: src/slic3r/GUI/Tab.cpp:3267 msgid "" "UNLOCKED LOCK icon indicates that the value was changed and is not equal to " "the system (or default) value.\n" @@ -4673,7 +5802,7 @@ msgstr "" "을 나타냅니다.\n" "현재 값을 시스템(또는 기본값) 값으로 재설정하려면 클릭합니다." -#: src/slic3r/GUI/Tab.cpp:3383 +#: src/slic3r/GUI/Tab.cpp:3273 msgid "" "WHITE BULLET icon indicates that the value is the same as in the last saved " "preset." @@ -4681,7 +5810,7 @@ msgstr "" "WHITE BULLET 기호 아이콘은 마지막으로 저장 한 사전 설정과 동일한 값을 나타냅" "니다." -#: src/slic3r/GUI/Tab.cpp:3384 +#: src/slic3r/GUI/Tab.cpp:3274 msgid "" "BACK ARROW icon indicates that the value was changed and is not equal to the " "last saved preset.\n" @@ -4692,81 +5821,56 @@ msgstr "" "현재 값을 마지막으로 저장된 사전 설정으로 재설정하려면 클릭합니다." #. TRN Preset -#: src/slic3r/GUI/Tab.cpp:3497 +#: src/slic3r/GUI/Tab.cpp:3387 #, c-format msgid "Save %s as:" msgstr "Save %s as:" -#: src/slic3r/GUI/Tab.cpp:3541 +#: src/slic3r/GUI/Tab.cpp:3431 msgid "the following suffix is not allowed:" msgstr "다음 접미사는 허용되지 않습니다:" -#: src/slic3r/GUI/Tab.cpp:3545 +#: src/slic3r/GUI/Tab.cpp:3435 msgid "The supplied name is not available." msgstr "제공된 이름을 사용할 수 없습니다." -#: src/slic3r/GUI/Tab.cpp:3558 +#: src/slic3r/GUI/Tab.cpp:3448 src/slic3r/GUI/Tab.cpp:3450 msgid "Material" msgstr "재료" -#: src/slic3r/GUI/Tab.cpp:3560 src/slic3r/GUI/Tab.cpp:3651 -#: src/slic3r/GUI/wxExtensions.cpp:454 -msgid "Layers" -msgstr "레이어" - -#: src/slic3r/GUI/Tab.cpp:3564 -msgid "Exposure" -msgstr "노출" - -#: src/slic3r/GUI/Tab.cpp:3659 +#: src/slic3r/GUI/Tab.cpp:3580 msgid "Support head" msgstr "서포트 헤드" -#: src/slic3r/GUI/Tab.cpp:3664 +#: src/slic3r/GUI/Tab.cpp:3585 msgid "Support pillar" msgstr "서포트 기둥" -#: src/slic3r/GUI/Tab.cpp:3675 +#: src/slic3r/GUI/Tab.cpp:3599 msgid "Connection of the support sticks and junctions" msgstr "서포트 기둥 및 접합부 연결" -#: src/slic3r/GUI/Tab.cpp:3680 +#: src/slic3r/GUI/Tab.cpp:3604 msgid "Automatic generation" msgstr "자동 생성" -#: src/slic3r/GUI/Tab.cpp:3747 -msgid "Head penetration should not be greater than the head width." -msgstr "헤드 관통은 헤드 폭 보다 크지 않아야 합니다." - -#: src/slic3r/GUI/Tab.cpp:3751 -msgid "Invalid Head penetration" -msgstr "잘못된 헤드 관통" - -#: src/slic3r/GUI/Tab.cpp:3767 -msgid "Pinhead diameter should be smaller than the pillar diameter." -msgstr "핀헤드 지름은 기둥 지름 보다 작아야 합니다." - -#: src/slic3r/GUI/Tab.cpp:3771 -msgid "Invalid pinhead diameter" -msgstr "잘못된 핀 헤드 지름" - -#: src/slic3r/GUI/Tab.hpp:324 src/slic3r/GUI/Tab.hpp:422 +#: src/slic3r/GUI/Tab.hpp:327 src/slic3r/GUI/Tab.hpp:429 msgid "Print Settings" msgstr "출력 설정" -#: src/slic3r/GUI/Tab.hpp:348 +#: src/slic3r/GUI/Tab.hpp:354 msgid "Filament Settings" msgstr "필라멘트 설정" -#: src/slic3r/GUI/Tab.hpp:383 +#: src/slic3r/GUI/Tab.hpp:390 msgid "Printer Settings" msgstr "프린터 설정" -#: src/slic3r/GUI/Tab.hpp:407 +#: src/slic3r/GUI/Tab.hpp:414 msgid "Material Settings" msgstr "재질 설정" -#: src/slic3r/GUI/Tab.hpp:434 +#: src/slic3r/GUI/Tab.hpp:441 msgid "Save preset" msgstr "사전 설정 저장" @@ -4779,39 +5883,40 @@ msgstr "사용가능한 업데이트" msgid "New version of %s is available" msgstr "%s의 새 버전을 사용할 수 있습니다" -#: src/slic3r/GUI/UpdateDialogs.cpp:45 +#: src/slic3r/GUI/UpdateDialogs.cpp:43 msgid "Current version:" msgstr "현재 버전:" -#: src/slic3r/GUI/UpdateDialogs.cpp:47 +#: src/slic3r/GUI/UpdateDialogs.cpp:45 msgid "New version:" msgstr "새로운 버전:" -#: src/slic3r/GUI/UpdateDialogs.cpp:55 +#: src/slic3r/GUI/UpdateDialogs.cpp:53 msgid "Changelog && Download" msgstr "변경 로그 및 다운로드" -#: src/slic3r/GUI/UpdateDialogs.cpp:62 src/slic3r/GUI/UpdateDialogs.cpp:125 +#: src/slic3r/GUI/UpdateDialogs.cpp:60 src/slic3r/GUI/UpdateDialogs.cpp:125 +#: src/slic3r/GUI/UpdateDialogs.cpp:183 msgid "Open changelog page" msgstr "변경 로그 페이지 열기" -#: src/slic3r/GUI/UpdateDialogs.cpp:67 +#: src/slic3r/GUI/UpdateDialogs.cpp:65 msgid "Open download page" msgstr "다운로드 페이지 열기" -#: src/slic3r/GUI/UpdateDialogs.cpp:73 +#: src/slic3r/GUI/UpdateDialogs.cpp:71 msgid "Don't notify about new releases any more" msgstr "새로운 수정사항에 대해 더 이상 알림 안 함" -#: src/slic3r/GUI/UpdateDialogs.cpp:91 src/slic3r/GUI/UpdateDialogs.cpp:205 +#: src/slic3r/GUI/UpdateDialogs.cpp:89 src/slic3r/GUI/UpdateDialogs.cpp:266 msgid "Configuration update" msgstr "구성 업데이트" -#: src/slic3r/GUI/UpdateDialogs.cpp:91 +#: src/slic3r/GUI/UpdateDialogs.cpp:89 msgid "Configuration update is available" msgstr "구성 업데이트를 사용할 수 있음" -#: src/slic3r/GUI/UpdateDialogs.cpp:94 +#: src/slic3r/GUI/UpdateDialogs.cpp:92 msgid "" "Would you like to install it?\n" "\n" @@ -4827,21 +5932,47 @@ msgstr "" "\n" "업데이트 된 구성 번들 :" -#: src/slic3r/GUI/UpdateDialogs.cpp:115 +#: src/slic3r/GUI/UpdateDialogs.cpp:113 src/slic3r/GUI/UpdateDialogs.cpp:173 msgid "Comment:" -msgstr "\"댓글\"" +msgstr "코멘트:" -#: src/slic3r/GUI/UpdateDialogs.cpp:149 +#: src/slic3r/GUI/UpdateDialogs.cpp:148 src/slic3r/GUI/UpdateDialogs.cpp:210 #, c-format msgid "%s incompatibility" msgstr "%s 비 호환성" -#: src/slic3r/GUI/UpdateDialogs.cpp:150 +#: src/slic3r/GUI/UpdateDialogs.cpp:148 +msgid "Configuration update is necessary to install" +msgstr "설치하려면 구성 업데이트가 필요합니다." + +#: src/slic3r/GUI/UpdateDialogs.cpp:151 +#, c-format +msgid "" +"%s will now start updates. Otherwise it won't be able to start.\n" +"\n" +"Note that a full configuration snapshot will be created first. It can then " +"be restored at any time should there be a problem with the new version.\n" +"\n" +"Updated configuration bundles:" +msgstr "" +"%s는 이제 업데이트를 시작합니다. 그렇지 않으면 시작할 수 없습니다.\n" +"\n" +"전체 구성 스냅숏이 먼저 만들어집니다. 그런 다음 새 버전에 문제가 있으면 언제" +"든지 복원 할 수 있습니다.\n" +"\n" +"업데이트된 구성 번들:" + +#: src/slic3r/GUI/UpdateDialogs.cpp:191 src/slic3r/GUI/UpdateDialogs.cpp:246 +#, c-format +msgid "Exit %s" +msgstr "%s 종료" + +#: src/slic3r/GUI/UpdateDialogs.cpp:211 #, c-format msgid "%s configuration is incompatible" msgstr "%s 과 호환되지 않습니다" -#: src/slic3r/GUI/UpdateDialogs.cpp:155 +#: src/slic3r/GUI/UpdateDialogs.cpp:216 #, c-format msgid "" "This version of %s is not compatible with currently installed configuration " @@ -4851,34 +5982,29 @@ msgid "" "\n" "You may either exit %s and try again with a newer version, or you may re-run " "the initial configuration. Doing so will create a backup snapshot of the " -"existing configuration before installing files compatible with this %s.\n" +"existing configuration before installing files compatible with this %s." msgstr "" "%s의 이 버전은 현재 설치 된 구성 번들과 호환 되지 않습니다.\n" "이것은 새로운 것을 사용한 후 이전 %s를 실행 한 결과로 발생 했을 것입니다.\n" "\n" " %s를 종료하고 최신 버전으로 다시 시도 하거나 초기 구성을 다시 실행할 수 있습" "니다. 이렇게 하면 %s와 호환 되는 파일을 설치하기 전에 기존 구성의 백업 스냅샷" -"이 생성 됩니다.\n" +"이 생성 됩니다." -#: src/slic3r/GUI/UpdateDialogs.cpp:164 +#: src/slic3r/GUI/UpdateDialogs.cpp:225 #, c-format msgid "This %s version: %s" msgstr "이 %s 버전: %s" -#: src/slic3r/GUI/UpdateDialogs.cpp:169 +#: src/slic3r/GUI/UpdateDialogs.cpp:230 msgid "Incompatible bundles:" msgstr "호환되지 않는 번들 :" -#: src/slic3r/GUI/UpdateDialogs.cpp:185 -#, c-format -msgid "Exit %s" -msgstr "%s Exit" - -#: src/slic3r/GUI/UpdateDialogs.cpp:188 +#: src/slic3r/GUI/UpdateDialogs.cpp:249 msgid "Re-configure" msgstr "재구성" -#: src/slic3r/GUI/UpdateDialogs.cpp:209 +#: src/slic3r/GUI/UpdateDialogs.cpp:270 #, c-format msgid "" "%s now uses an updated configuration structure.\n" @@ -4904,15 +6030,28 @@ msgstr "" "다음의 %s를 계속 진행하여 새 프리셋을 설정하고 자동 프리셋 업데이트를 사용할" "지 여부를 선택하십시오." -#: src/slic3r/GUI/UpdateDialogs.cpp:225 +#: src/slic3r/GUI/UpdateDialogs.cpp:286 msgid "For more information please visit our wiki page:" msgstr "자세한 정보는 위키 페이지를 참조하십시오 :" -#: src/slic3r/GUI/WipeTowerDialog.cpp:14 +#: src/slic3r/GUI/UpdateDialogs.cpp:303 +msgid "Configuration updates" +msgstr "구성 업데이트" + +#: src/slic3r/GUI/UpdateDialogs.cpp:303 +msgid "No updates aviable" +msgstr "실행 가능한 업데이트없음" + +#: src/slic3r/GUI/UpdateDialogs.cpp:308 +#, c-format +msgid "%s has no configuration updates aviable." +msgstr "%s에는 구성 업데이트가 실행 가능한 업데이트가 없습니다." + +#: src/slic3r/GUI/WipeTowerDialog.cpp:15 msgid "Ramming customization" msgstr "사용자 정의 다지기(Ramming)" -#: src/slic3r/GUI/WipeTowerDialog.cpp:40 +#: src/slic3r/GUI/WipeTowerDialog.cpp:41 msgid "" "Ramming denotes the rapid extrusion just before a tool change in a single-" "extruder MM printer. Its purpose is to properly shape the end of the " @@ -4924,7 +6063,7 @@ msgid "" "This is an expert-level setting, incorrect adjustment will likely lead to " "jams, extruder wheel grinding into filament etc." msgstr "" -"래밍은 단일 압출기 MM 프린터에서 공구 교환 직전의 신속한 압출을 나타냅니다. " +"래밍은 단일 압출기 MMU 프린터에서 공구 교환 직전의 신속한 압출을 나타냅니다. " "그 목적은 언로드 된 필라멘트의 끝 부분을 적절히 형성하여 새로운 필라멘트의 삽" "입을 방지하고 나중에 다시 삽입 할 수 있도록하기위한 것입니다. 이 단계는 중요" "하며 다른 재료는 좋은 모양을 얻기 위해 다른 압출 속도를 요구할 수 있습니다. " @@ -4933,49 +6072,49 @@ msgstr "" "전문가 수준의 설정이므로 잘못된 조정으로 인해 용지 걸림, 압출기 휠이 필라멘" "트 등에 연삭 될 수 있습니다." -#: src/slic3r/GUI/WipeTowerDialog.cpp:82 +#: src/slic3r/GUI/WipeTowerDialog.cpp:83 msgid "Total ramming time" msgstr "총 래밍 시간" -#: src/slic3r/GUI/WipeTowerDialog.cpp:84 +#: src/slic3r/GUI/WipeTowerDialog.cpp:85 msgid "Total rammed volume" msgstr "총 레미드 양" -#: src/slic3r/GUI/WipeTowerDialog.cpp:88 +#: src/slic3r/GUI/WipeTowerDialog.cpp:89 msgid "Ramming line width" msgstr "래밍 선 너비" -#: src/slic3r/GUI/WipeTowerDialog.cpp:90 +#: src/slic3r/GUI/WipeTowerDialog.cpp:91 msgid "Ramming line spacing" msgstr "래밍 선 간격" -#: src/slic3r/GUI/WipeTowerDialog.cpp:141 +#: src/slic3r/GUI/WipeTowerDialog.cpp:142 msgid "Wipe tower - Purging volume adjustment" msgstr "와이프 타워 - 버려진 필라멘트 조절" -#: src/slic3r/GUI/WipeTowerDialog.cpp:225 +#: src/slic3r/GUI/WipeTowerDialog.cpp:254 msgid "" "Here you can adjust required purging volume (mm³) for any given pair of " "tools." msgstr "여기서 주어진 도구 쌍에 필요한 정화 용량 (mm³)을 조정할 수 있습니다." -#: src/slic3r/GUI/WipeTowerDialog.cpp:226 +#: src/slic3r/GUI/WipeTowerDialog.cpp:255 msgid "Extruder changed to" msgstr "익스트루더 번경" -#: src/slic3r/GUI/WipeTowerDialog.cpp:234 +#: src/slic3r/GUI/WipeTowerDialog.cpp:263 msgid "unloaded" msgstr "언로드(unloaded)" -#: src/slic3r/GUI/WipeTowerDialog.cpp:235 +#: src/slic3r/GUI/WipeTowerDialog.cpp:264 msgid "loaded" msgstr "로드(loaded)" -#: src/slic3r/GUI/WipeTowerDialog.cpp:240 +#: src/slic3r/GUI/WipeTowerDialog.cpp:276 msgid "Tool #" msgstr "도구(Tool) #" -#: src/slic3r/GUI/WipeTowerDialog.cpp:247 +#: src/slic3r/GUI/WipeTowerDialog.cpp:285 msgid "" "Total purging volume is calculated by summing two values below, depending on " "which tools are loaded/unloaded." @@ -4983,15 +6122,15 @@ msgstr "" "총 정화 량은 어느 공구가로드 / 언로드되는지에 따라 아래의 두 값을 합산하여 계" "산됩니다." -#: src/slic3r/GUI/WipeTowerDialog.cpp:248 +#: src/slic3r/GUI/WipeTowerDialog.cpp:286 msgid "Volume to purge (mm³) when the filament is being" msgstr "제거할 필라멘트 양 (mm³)" -#: src/slic3r/GUI/WipeTowerDialog.cpp:262 +#: src/slic3r/GUI/WipeTowerDialog.cpp:300 msgid "From" msgstr "From" -#: src/slic3r/GUI/WipeTowerDialog.cpp:327 +#: src/slic3r/GUI/WipeTowerDialog.cpp:365 msgid "" "Switching to simple settings will discard changes done in the advanced " "mode!\n" @@ -5002,108 +6141,62 @@ msgstr "" "\n" "계속하시겠습니까?" -#: src/slic3r/GUI/WipeTowerDialog.cpp:339 +#: src/slic3r/GUI/WipeTowerDialog.cpp:377 msgid "Show simplified settings" msgstr "간단한 설정보기" -#: src/slic3r/GUI/WipeTowerDialog.cpp:339 +#: src/slic3r/GUI/WipeTowerDialog.cpp:377 msgid "Show advanced settings" msgstr "고급 설정보기" -#: src/slic3r/GUI/wxExtensions.cpp:443 -msgid "Instances" -msgstr "복제본" - -#: src/slic3r/GUI/wxExtensions.cpp:447 src/slic3r/GUI/wxExtensions.cpp:592 -#, c-format -msgid "Instance %d" -msgstr "복제본 %d" - -#: src/slic3r/GUI/wxExtensions.cpp:486 -msgid "Range" -msgstr "범위" - -#: src/slic3r/GUI/wxExtensions.cpp:2570 -msgid "One layer mode" -msgstr "하나의 레이어 모드" - -#: src/slic3r/GUI/wxExtensions.cpp:2571 -msgid "Add/Del color change" -msgstr "현재 레이어의 색상 변경 마커 추가" - -#: src/slic3r/GUI/wxExtensions.cpp:2572 -msgid "Discard all color changes" -msgstr "모든 색상 변경 무시" - -#: src/slic3r/GUI/wxExtensions.cpp:2832 +#: src/slic3r/GUI/wxExtensions.cpp:680 #, c-format msgid "Switch to the %s mode" msgstr "%s 모드로 전환" -#: src/slic3r/GUI/wxExtensions.cpp:2833 +#: src/slic3r/GUI/wxExtensions.cpp:681 #, c-format msgid "Current mode is %s" msgstr "현재 모드는 %s입니다" -#: src/slic3r/Utils/Duet.cpp:51 -msgid "Connection to Duet works correctly." -msgstr "듀엣보드에 대한 연결이 올바르게 작동 합니다." - -#: src/slic3r/Utils/Duet.cpp:56 -msgid "Could not connect to Duet" -msgstr "듀엣보드에 연결할 수 없습니다" - -#: src/slic3r/Utils/Duet.cpp:84 src/slic3r/Utils/Duet.cpp:154 -msgid "Unknown error occured" -msgstr "알 수 없는 오류가 발생 했습니다" - -#: src/slic3r/Utils/Duet.cpp:148 -msgid "Wrong password" -msgstr "잘못된 암호" - -#: src/slic3r/Utils/Duet.cpp:151 -msgid "Could not get resources to create a new connection" -msgstr "새 연결을 만들 리소스를 가져올수 없습니다" - -#: src/slic3r/Utils/OctoPrint.cpp:69 +#: src/slic3r/Utils/AstroBox.cpp:68 src/slic3r/Utils/OctoPrint.cpp:68 #, c-format msgid "Mismatched type of print host: %s" msgstr "일치 하지않는 인쇄 호스트 유형: %s" -#: src/slic3r/Utils/OctoPrint.cpp:84 -msgid "Connection to OctoPrint works correctly." -msgstr "OctoPrint에 연결하면 올바르게 작동합니다." +#: src/slic3r/Utils/AstroBox.cpp:83 +msgid "Connection to AstroBox works correctly." +msgstr "아스트로박스에 대한 연결이 올바르게 작동합니다." -#: src/slic3r/Utils/OctoPrint.cpp:90 -msgid "Could not connect to OctoPrint" -msgstr "OctoPrint에 연결할 수 없습니다" +#: src/slic3r/Utils/AstroBox.cpp:89 +msgid "Could not connect to AstroBox" +msgstr "아스트로박스에 연결할 수 없습니다." -#: src/slic3r/Utils/OctoPrint.cpp:90 -msgid "Note: OctoPrint version at least 1.1.0 is required." -msgstr "참고 : OctoPrint 버전 1.1.0 이상이 필요합니다." +#: src/slic3r/Utils/AstroBox.cpp:89 +msgid "Note: AstroBox version at least 1.1.0 is required." +msgstr "참고: 아스트로박스 버전은 최소 1.1.0이 필요합니다." -#: src/slic3r/Utils/OctoPrint.cpp:195 -msgid "Connection to Prusa SL1 works correctly." -msgstr "Prusa SL1에 대한 연결이 제대로 작동 합니다." +#: src/slic3r/Utils/Duet.cpp:49 +msgid "Connection to Duet works correctly." +msgstr "듀엣보드에 대한 연결이 올바르게 작동 합니다." -#: src/slic3r/Utils/OctoPrint.cpp:200 -msgid "Could not connect to Prusa SLA" -msgstr "Prusa SLA에 연결할 수 없습니다" +#: src/slic3r/Utils/Duet.cpp:54 +msgid "Could not connect to Duet" +msgstr "듀엣보드에 연결할 수 없습니다" -#: src/slic3r/Utils/PresetUpdater.cpp:614 -#, c-format -msgid "requires min. %s and max. %s" -msgstr "최소. %s 와 최대. %s" +#: src/slic3r/Utils/Duet.cpp:82 src/slic3r/Utils/Duet.cpp:137 +#: src/slic3r/Utils/FlashAir.cpp:119 src/slic3r/Utils/FlashAir.cpp:140 +#: src/slic3r/Utils/FlashAir.cpp:156 +msgid "Unknown error occured" +msgstr "알 수 없는 오류가 발생 했습니다" -#: src/slic3r/Utils/PresetUpdater.cpp:619 -#, c-format -msgid "requires min. %s" -msgstr "최소 %s가 필요 합니다" +#: src/slic3r/Utils/Duet.cpp:131 +msgid "Wrong password" +msgstr "잘못된 암호" -#: src/slic3r/Utils/PresetUpdater.cpp:621 -#, c-format -msgid "requires max. %s" -msgstr "최대 필요 합니다. %s" +#: src/slic3r/Utils/Duet.cpp:134 +msgid "Could not get resources to create a new connection" +msgstr "새 연결을 만들 리소스를 가져올수 없습니다" #: src/slic3r/Utils/FixModelByWin10.cpp:219 #: src/slic3r/Utils/FixModelByWin10.cpp:359 @@ -5123,7 +6216,7 @@ msgid "Mesh repair failed." msgstr "메쉬 복구에 실패 했습니다." #: src/slic3r/Utils/FixModelByWin10.cpp:251 -#: src/slic3r/Utils/FixModelByWin10.cpp:378 +#: src/slic3r/Utils/FixModelByWin10.cpp:385 msgid "Loading repaired model" msgstr "복구 된 모델 로드" @@ -5141,50 +6234,110 @@ msgstr "모델 고정" msgid "Exporting model..." msgstr "소스 모델 내보내기..." -#: src/slic3r/Utils/FixModelByWin10.cpp:368 +#: src/slic3r/Utils/FixModelByWin10.cpp:369 +#: src/slic3r/Utils/FixModelByWin10.cpp:374 msgid "Export of a temporary 3mf file failed" msgstr "임시 3mf 파일을 내보내지 못했습니다" -#: src/slic3r/Utils/FixModelByWin10.cpp:383 +#: src/slic3r/Utils/FixModelByWin10.cpp:390 msgid "Import of the repaired 3mf file failed" msgstr "복구된 3mf 파일을 가져오지 못했습니다" -#: src/slic3r/Utils/FixModelByWin10.cpp:385 +#: src/slic3r/Utils/FixModelByWin10.cpp:392 msgid "Repaired 3MF file does not contain any object" -msgstr "복구된 3MF 파일에 개체가 포함 되어있지 않습니다" +msgstr "복구된 3MF 파일에 객체(object)가 포함 되어있지 않습니다" -#: src/slic3r/Utils/FixModelByWin10.cpp:387 +#: src/slic3r/Utils/FixModelByWin10.cpp:394 msgid "Repaired 3MF file contains more than one object" -msgstr "복구된 3MF 파일에 둘 이상의 개체가 포함되어 있습니다" +msgstr "복구된 3MF 파일에 둘 이상의 객체(object)가 포함되어 있습니다" -#: src/slic3r/Utils/FixModelByWin10.cpp:389 +#: src/slic3r/Utils/FixModelByWin10.cpp:396 msgid "Repaired 3MF file does not contain any volume" -msgstr "복구 된 3MF 파일에 개체가 포함 되어있지 않습니다" +msgstr "복구 된 3MF 파일에 객체(object)가 포함 되어있지 않습니다" -#: src/slic3r/Utils/FixModelByWin10.cpp:391 +#: src/slic3r/Utils/FixModelByWin10.cpp:398 msgid "Repaired 3MF file contains more than one volume" -msgstr "복구된 3MF 파일에 둘 이상의 개체가 포함되어 있습니다" +msgstr "복구된 3MF 파일에 둘 이상의 객체(object)가 포함되어 있습니다" -#: src/slic3r/Utils/FixModelByWin10.cpp:400 +#: src/slic3r/Utils/FixModelByWin10.cpp:407 msgid "Model repair finished" msgstr "모델 수리 완료" -#: src/slic3r/Utils/FixModelByWin10.cpp:406 +#: src/slic3r/Utils/FixModelByWin10.cpp:413 msgid "Model repair canceled" msgstr "모델 복구가 취소 되었습니다" -#: src/slic3r/Utils/FixModelByWin10.cpp:423 +#: src/slic3r/Utils/FixModelByWin10.cpp:430 msgid "Model repaired successfully" msgstr "모델이 성공적으로 복구 되었습니다" -#: src/slic3r/Utils/FixModelByWin10.cpp:423 -#: src/slic3r/Utils/FixModelByWin10.cpp:426 +#: src/slic3r/Utils/FixModelByWin10.cpp:430 +#: src/slic3r/Utils/FixModelByWin10.cpp:433 msgid "Model Repair by the Netfabb service" msgstr "Netfabb 서비스에의 한 모델 복구" -#: src/slic3r/Utils/FixModelByWin10.cpp:426 -msgid "Model repair failed: \n" -msgstr "모델 복구 실패:\n" +#: src/slic3r/Utils/FixModelByWin10.cpp:433 +msgid "Model repair failed:" +msgstr "모델 복구 실패:" + +#: src/slic3r/Utils/FlashAir.cpp:58 +msgid "Upload not enabled on FlashAir card." +msgstr "FlashAir 카드에서 업로드가 활성화되지 않았습니다." + +#: src/slic3r/Utils/FlashAir.cpp:68 +msgid "Connection to FlashAir works correctly and upload is enabled." +msgstr "FlashAir에 대한 연결이 올바르게 작동하고 업로드가 활성화되어 있습니다." + +#: src/slic3r/Utils/FlashAir.cpp:73 +msgid "Could not connect to FlashAir" +msgstr "플래시 에어에 연결할 수 없습니다." + +#: src/slic3r/Utils/FlashAir.cpp:73 +msgid "" +"Note: FlashAir with firmware 2.00.02 or newer and activated upload function " +"is required." +msgstr "" +"참고 : 펌웨어 2.00.02 이상 및 활성화 된 업로드 기능이있는 FlashAir가 필요합니" +"다." + +#: src/slic3r/Utils/OctoPrint.cpp:83 +msgid "Connection to OctoPrint works correctly." +msgstr "OctoPrint에 연결하면 올바르게 작동합니다." + +#: src/slic3r/Utils/OctoPrint.cpp:89 +msgid "Could not connect to OctoPrint" +msgstr "OctoPrint에 연결할 수 없습니다" + +#: src/slic3r/Utils/OctoPrint.cpp:89 +msgid "Note: OctoPrint version at least 1.1.0 is required." +msgstr "참고 : OctoPrint 버전 1.1.0 이상이 필요합니다." + +#: src/slic3r/Utils/OctoPrint.cpp:176 +msgid "Connection to Prusa SL1 works correctly." +msgstr "Prusa SL1에 대한 연결이 제대로 작동 합니다." + +#: src/slic3r/Utils/OctoPrint.cpp:181 +msgid "Could not connect to Prusa SLA" +msgstr "Prusa SLA에 연결할 수 없습니다" + +#: src/slic3r/Utils/PresetUpdater.cpp:705 +#, c-format +msgid "requires min. %s and max. %s" +msgstr "최소. %s 와 최대. %s" + +#: src/slic3r/Utils/PresetUpdater.cpp:710 +#, c-format +msgid "requires min. %s" +msgstr "최소 %s가 필요 합니다" + +#: src/slic3r/Utils/PresetUpdater.cpp:713 +#, c-format +msgid "requires max. %s" +msgstr "최대 필요 합니다. %s" + +#: src/libslic3r/SLA/Pad.cpp:691 +msgid "Pad brim size is too small for the current configuration." +msgstr "패드 테두리 크기가 현재 구성에 너무 작습니다." #: src/libslic3r/Zipper.cpp:32 msgid "undefined error" @@ -5224,7 +6377,7 @@ msgstr "잘못 된 헤더 또는 아카이브가 손상 되었습니다" #: src/libslic3r/Zipper.cpp:50 msgid "unsupported multidisk archive" -msgstr "지원 되지 않는 멀티 디스크 아카이브" +msgstr "지원 되지 않는 다중 디스크 아카이브" #: src/libslic3r/Zipper.cpp:52 msgid "decompression failed or archive is corrupted" @@ -5296,7 +6449,7 @@ msgstr "내부 오류" #: src/libslic3r/Zipper.cpp:86 msgid "file not found" -msgstr "파일을 찾을수 없다" +msgstr "파일을 찾을 수 없습니다." #: src/libslic3r/Zipper.cpp:88 msgid "archive is too large" @@ -5314,33 +6467,77 @@ msgstr "쓰기 다시 실패" msgid "Error with zip archive" msgstr "zip 아카이브와 오류가 발생 했습니다" -#: src/libslic3r/Print.cpp:1093 +#: src/libslic3r/GCode.cpp:637 +msgid "Empty layers detected, the output would not be printable." +msgstr "빈 레이어가 감지되면 출력을 인쇄할 수 없습니다." + +#: src/libslic3r/GCode.cpp:638 +msgid "Print z" +msgstr "인쇄 z" + +#: src/libslic3r/GCode.cpp:639 +msgid "" +"This is usually caused by negligibly small extrusions or by a faulty model. " +"Try to repair the model or change its orientation on the bed." +msgstr "" +"이는 일반적으로 무시할 수 있는 작은 돌출 또는 결함이 있는 모델에 의해 발생합" +"니다. 모델을 수리하거나 배드에서 방향을 변경하십시오." + +#: src/libslic3r/ExtrusionEntity.cpp:323 +msgid "Mixed" +msgstr "혼합" + +#: src/libslic3r/Flow.cpp:55 +msgid "" +"Cannot calculate extrusion width for %1%: Variable \"%2%\" not accessible." +msgstr "" +"%1%에 대한 압출 폭을 계산할 수 없습니다: 변수 \"%2%\"에 액세스할 수 없습니다." + +#: src/libslic3r/Format/3mf.cpp:1630 +msgid "" +"The selected 3mf file has been saved with a newer version of %1% and is not " +"compatible." +msgstr "선택한 3mf 파일은 %1%의 최신 버전으로 저장되었으며 호환되지 않습니다." + +#: src/libslic3r/Format/AMF.cpp:934 +msgid "" +"The selected amf file has been saved with a newer version of %1% and is not " +"compatible." +msgstr "선택한 amf 파일은 %1%의 최신 버전으로 저장되었으며 호환되지 않습니다." + +#: src/libslic3r/Print.cpp:1158 msgid "All objects are outside of the print volume." -msgstr "모든 개체가 인쇄 볼륨 외부에 있습니다." +msgstr "모든 객체(object)가 인쇄 볼륨 외부에 있습니다." -#: src/libslic3r/Print.cpp:1120 +#: src/libslic3r/Print.cpp:1161 +msgid "The supplied settings will cause an empty print." +msgstr "제공된 설정으로 인해 빈 인쇄가 발생합니다." + +#: src/libslic3r/Print.cpp:1188 msgid "Some objects are too close; your extruder will collide with them." -msgstr "일부 개체가 너무 가깝습니다. 귀하의 압출기가 그들과 충돌합니다." +msgstr "" +"일부 객체(object)가 너무 가깝습니다. 귀하의 압출기가 그들과 충돌합니다." -#: src/libslic3r/Print.cpp:1135 +#: src/libslic3r/Print.cpp:1203 msgid "" "Some objects are too tall and cannot be printed without extruder collisions." -msgstr "일부 개체는 너무 크고 익스트루더 충돌없이 인쇄 할 수 없습니다." +msgstr "일부 객체(object)는 너무 크고 익스트루더 충돌없이 인쇄 할 수 없습니다." -#: src/libslic3r/Print.cpp:1145 +#: src/libslic3r/Print.cpp:1213 msgid "The Spiral Vase option can only be used when printing a single object." msgstr "" -"나선형 꽃병(Spiral Vase) 옵션은 단일 개체를 인쇄 할 때만 사용할 수 있습니다." +"나선형 꽃병(Spiral Vase) 옵션은 단일 객체(object)를 인쇄 할 때만 사용할 수 있" +"습니다." -#: src/libslic3r/Print.cpp:1147 +#: src/libslic3r/Print.cpp:1220 msgid "" "The Spiral Vase option can only be used when printing single material " "objects." msgstr "" -"나선형 꽃병 옵션(Spiral Vase)은 단일 재료 객체를 인쇄 할 때만 사용할 수 있습" -"니다." +"나선형 꽃병 옵션(Spiral Vase)은 단일 재료 객체(object)를 인쇄 할 때만 사용할 " +"수 있습니다." -#: src/libslic3r/Print.cpp:1155 +#: src/libslic3r/Print.cpp:1233 msgid "" "The wipe tower is only supported if all extruders have the same nozzle " "diameter and use filaments of the same diameter." @@ -5348,15 +6545,15 @@ msgstr "" "모든 압출기 의 노즐 직경이 동일하고 동일한 직경의 필라멘트를 사용하는 경우에" "만 와이프 타워가 지원됩니다." -#: src/libslic3r/Print.cpp:1159 +#: src/libslic3r/Print.cpp:1238 msgid "" "The Wipe Tower is currently only supported for the Marlin, RepRap/Sprinter " "and Repetier G-code flavors." msgstr "" -"와이프 타워는 현재 말린, RepRap/Sprinter 및 리피티어에 대해서만 G-코드지원 됩" +"와이프 타워는 현재 말린, RepRap/Sprinter 및 리피티어에 대해서만 G-code지원 됩" "니다." -#: src/libslic3r/Print.cpp:1161 +#: src/libslic3r/Print.cpp:1240 msgid "" "The Wipe Tower is currently only supported with the relative extruder " "addressing (use_relative_e_distances=1)." @@ -5364,58 +6561,76 @@ msgstr "" "와이프 타워는 현재 상대적 압출기 어드레싱 (use_relative_e_distances = 1)에서" "만 지원됩니다." -#: src/libslic3r/Print.cpp:1165 -msgid "All extruders must have the same diameter for the Wipe Tower." -msgstr "모든 압출기는 와이프 타워의 지름이 같아야 합니다." +#: src/libslic3r/Print.cpp:1242 +msgid "Ooze prevention is currently not supported with the wipe tower enabled." +msgstr "" +"현재 와이프 타워를 사용하도록 설정되어 있는 경우 스모즈 방지 기능이 지원되지 " +"않습니다." -#: src/libslic3r/Print.cpp:1186 +#: src/libslic3r/Print.cpp:1244 +msgid "" +"The Wipe Tower currently does not support volumetric E (use_volumetric_e=0)." +msgstr "와이프 타워는 현재 볼륨 E(use_volumetric_e=0)를 지원하지 않습니다." + +#: src/libslic3r/Print.cpp:1246 +msgid "" +"The Wipe Tower is currently not supported for multimaterial sequential " +"prints." +msgstr "와이프 타워는 현재 다중 재질 순차 인쇄에 지원되지 않습니다." + +#: src/libslic3r/Print.cpp:1267 msgid "" "The Wipe Tower is only supported for multiple objects if they have equal " "layer heights" msgstr "" -"와이프 타워 (Wipe Tower)는 같은 레이어 높이에 경우 여러 객체에 대해서만 지원" -"됩니다" +"와이프 타워 (Wipe Tower)는 같은 레이어 높이에 경우 여러 객체(object)에 대해서" +"만 지원됩니다" -#: src/libslic3r/Print.cpp:1188 +#: src/libslic3r/Print.cpp:1269 msgid "" "The Wipe Tower is only supported for multiple objects if they are printed " "over an equal number of raft layers" msgstr "" -"와이프 타워는 같은 수의 라프트 레이어 위에 인쇄 된 경우 여러 객체에 대해서만 " -"지원됩니다" +"와이프 타워는 같은 수의 라프트 레이어 위에 인쇄 된 경우 여러 객체(object)에 " +"대해서만 지원됩니다" -#: src/libslic3r/Print.cpp:1190 +#: src/libslic3r/Print.cpp:1271 msgid "" "The Wipe Tower is only supported for multiple objects if they are printed " "with the same support_material_contact_distance" msgstr "" "와이프 타워는 동일한 support_material_contact_distance로 인쇄 된 경우 여러 객" -"체에 대해서만 지원됩니다" +"체(object)에 대해서만 지원됩니다" -#: src/libslic3r/Print.cpp:1192 +#: src/libslic3r/Print.cpp:1273 msgid "" "The Wipe Tower is only supported for multiple objects if they are sliced " "equally." msgstr "" -"와이프 타워는 똑같이 슬라이스 된 경우 여러 오브젝트에 대해서만 지원됩니다." +"와이프 타워는 똑같이 슬라이스 된 경우 여러 객체(object)에 대해서만 지원됩니" +"다." -#: src/libslic3r/Print.cpp:1220 +#: src/libslic3r/Print.cpp:1315 msgid "" -"The Wipe tower is only supported if all objects have the same layer height " -"profile" +"The Wipe tower is only supported if all objects have the same variable layer " +"height" msgstr "" -"모든 오브젝트의 레이어 높이 프로필이 동일한 경우에만 와이프 타워가 지원됩니다" +"모든 오브젝트의 가변 레이어 높이가 같은 경우에만 지우기 타워가 지원됩니다." -#: src/libslic3r/Print.cpp:1230 -msgid "The supplied settings will cause an empty print." -msgstr "제공된 설정으로 인해 빈 인쇄가 발생합니다." - -#: src/libslic3r/Print.cpp:1247 +#: src/libslic3r/Print.cpp:1341 msgid "" "One or more object were assigned an extruder that the printer does not have." -msgstr "하나 이상의 개체에 프린터에없는 압출기가 지정되었습니다." +msgstr "하나 이상의 객체(object)에 프린터에없는 압출기가 지정되었습니다." -#: src/libslic3r/Print.cpp:1256 +#: src/libslic3r/Print.cpp:1350 +msgid "%1%=%2% mm is too low to be printable at a layer height %3% mm" +msgstr "%1%=%2% mm가 너무 낮아 레이어 높이 %3% mm에서 인쇄할 수 없습니다." + +#: src/libslic3r/Print.cpp:1353 +msgid "Excessive %1%=%2% mm to be printable with a nozzle diameter %3% mm" +msgstr "노즐 직경 %3% mm로 인쇄할 수 있는 과도한 %1%=%2% mm" + +#: src/libslic3r/Print.cpp:1364 msgid "" "Printing with multiple extruders of differing nozzle diameters. If support " "is to be printed with the current extruder (support_material_extruder == 0 " @@ -5426,15 +6641,15 @@ msgstr "" "(support_material_extruder == 0 또는 support_material_interface_extruder == " "0)로 인쇄되는 경우 모든 노즐은 동일한 지름이어야합니다." -#: src/libslic3r/Print.cpp:1264 +#: src/libslic3r/Print.cpp:1372 msgid "" "For the Wipe Tower to work with the soluble supports, the support layers " "need to be synchronized with the object layers." msgstr "" -"와이프 타워가 가용성 지지체와 함께 작동 하려면 서포트 레이어를 오브젝트 레이" -"어와 동기화 해야 합니다." +"와이프 타워가 가용성 지지체와 함께 작동 하려면 서포트 레이어를 객체(object) " +"레이어와 동기화 해야 합니다." -#: src/libslic3r/Print.cpp:1268 +#: src/libslic3r/Print.cpp:1376 msgid "" "The Wipe Tower currently supports the non-soluble supports only if they are " "printed with the current extruder without triggering a tool change. (both " @@ -5445,63 +6660,35 @@ msgstr "" "에만 비가용성 서포트를 지원 합니다. (support_material_extruder과 " "support_material_interface_extruder 모두 0으로 설정 해야 합니다.)" -#: src/libslic3r/Print.cpp:1290 +#: src/libslic3r/Print.cpp:1398 msgid "First layer height can't be greater than nozzle diameter" msgstr "첫번째 레이어 높이는 노즐 직경보다 클 수 없습니다" -#: src/libslic3r/Print.cpp:1294 +#: src/libslic3r/Print.cpp:1403 msgid "Layer height can't be greater than nozzle diameter" msgstr "레이어 높이는 노즐 직경보다 클 수 없습니다" -#: src/libslic3r/Print.cpp:1438 +#: src/libslic3r/Print.cpp:1557 msgid "Infilling layers" msgstr "레이어 채우기" -#: src/libslic3r/Print.cpp:1446 +#: src/libslic3r/Print.cpp:1577 msgid "Generating skirt" msgstr "스커트 생성" -#: src/libslic3r/Print.cpp:1454 +#: src/libslic3r/Print.cpp:1585 msgid "Generating brim" msgstr "브림 생성" -#: src/libslic3r/Print.cpp:1482 +#: src/libslic3r/Print.cpp:1609 msgid "Exporting G-code" msgstr "G 코드 내보내기" -#: src/libslic3r/Print.cpp:1486 +#: src/libslic3r/Print.cpp:1613 msgid "Generating G-code" msgstr "G 코드 생성" -#: src/libslic3r/SLAPrint.cpp:58 -msgid "Slicing model" -msgstr "슬라이싱 모델" - -#: src/libslic3r/SLAPrint.cpp:59 src/libslic3r/SLAPrint.cpp:871 -msgid "Generating support points" -msgstr "서포트 지점 생성" - -#: src/libslic3r/SLAPrint.cpp:60 -msgid "Generating support tree" -msgstr "서포트 트리 생성" - -#: src/libslic3r/SLAPrint.cpp:61 -msgid "Generating pad" -msgstr "패드 생성" - -#: src/libslic3r/SLAPrint.cpp:62 -msgid "Slicing supports" -msgstr "슬라이싱 서포트즈" - -#: src/libslic3r/SLAPrint.cpp:79 -msgid "Merging slices and calculating statistics" -msgstr "슬라이스 병합 및 통계 계산" - -#: src/libslic3r/SLAPrint.cpp:80 -msgid "Rasterizing layers" -msgstr "레이어 래스터화" - -#: src/libslic3r/SLAPrint.cpp:650 +#: src/libslic3r/SLAPrint.cpp:613 msgid "" "Cannot proceed without support points! Add support points or disable support " "generation." @@ -5509,33 +6696,102 @@ msgstr "" "서포트 포인트 없이 진행할 수 없습니다! 서포트 지점을 추가 하거나 서포트 생성" "을 사용 하지 않도록 설정 합니다." -#: src/libslic3r/SLAPrint.cpp:664 -msgid "Elevation is too low for object." -msgstr "객체 고도가 너무 낮습니다." +#: src/libslic3r/SLAPrint.cpp:625 +msgid "" +"Elevation is too low for object. Use the \"Pad around object\" feature to " +"print the object without elevation." +msgstr "" +"객체의 고도가 너무 낮습니다. \"오브젝트 주위 패드\" 피쳐를 사용하여 고도 없" +"이 오브젝트를 인쇄합니다." -#: src/libslic3r/SLAPrint.cpp:670 +#: src/libslic3r/SLAPrint.cpp:631 msgid "" "The endings of the support pillars will be deployed on the gap between the " "object and the pad. 'Support base safety distance' has to be greater than " "the 'Pad object gap' parameter to avoid this." msgstr "" -"서포트 기둥 끝은 오브젝트와 패드 사이의 간격에 배치됩니다. 이를 방지하기 위" -"해 '베이스 서포트 안전 거리'는 '패드 오브젝트 갭' 매개변수보다 커야 합니다." +"서포트 기둥 끝은 객체(object)와 패드 사이의 간격에 배치됩니다. 이를 방지하기 " +"위해 '베이스 서포트 안전 거리'는 '패드 객체(object) 갭' 매개변수보다 커야 합" +"니다." -#: src/libslic3r/SLAPrint.cpp:759 +#: src/libslic3r/SLAPrint.cpp:646 +msgid "Exposition time is out of printer profile bounds." +msgstr "박람회 시간이 프린터 프로파일 범위를 벗어났습니다." + +#: src/libslic3r/SLAPrint.cpp:653 +msgid "Initial exposition time is out of printer profile bounds." +msgstr "초기 박람회 시간이 프린터 프로파일 범위를 벗어났습니다." + +#: src/libslic3r/SLAPrint.cpp:760 +msgid "Slicing done" +msgstr "슬라이싱 완료" + +#: src/libslic3r/SLAPrintSteps.cpp:41 +msgid "Hollowing model" +msgstr "속이 빈 모델" + +#: src/libslic3r/SLAPrintSteps.cpp:42 +msgid "Drilling holes into model." +msgstr "모델에 구멍을 드릴링합니다." + +#: src/libslic3r/SLAPrintSteps.cpp:43 +msgid "Slicing model" +msgstr "슬라이싱 모델" + +#: src/libslic3r/SLAPrintSteps.cpp:44 src/libslic3r/SLAPrintSteps.cpp:308 +msgid "Generating support points" +msgstr "서포트 지점 생성" + +#: src/libslic3r/SLAPrintSteps.cpp:45 +msgid "Generating support tree" +msgstr "서포트 트리 생성" + +#: src/libslic3r/SLAPrintSteps.cpp:46 +msgid "Generating pad" +msgstr "패드 생성" + +#: src/libslic3r/SLAPrintSteps.cpp:47 +msgid "Slicing supports" +msgstr "슬라이싱 서포트즈" + +#: src/libslic3r/SLAPrintSteps.cpp:62 +msgid "Merging slices and calculating statistics" +msgstr "슬라이스 병합 및 통계 계산" + +#: src/libslic3r/SLAPrintSteps.cpp:63 +msgid "Rasterizing layers" +msgstr "레이어 래스터화" + +#: src/libslic3r/SLAPrintSteps.cpp:154 +msgid "" +"Drilling holes into the mesh failed. This is usually caused by broken model. " +"Try to fix it first." +msgstr "" +"메시에 구멍을 뚫는 데 실패했습니다. 이는 일반적으로 모델이 손상되어 발생합니" +"다. 먼저 해결해 보십시오." + +#: src/libslic3r/SLAPrintSteps.cpp:202 msgid "" "Slicing had to be stopped due to an internal error: Inconsistent slice index." msgstr "" "내부 오류: 일치하지 않는 슬라이스 인덱스로 인해 슬라이싱을 중지해야 했습니다." -#: src/libslic3r/SLAPrint.cpp:954 src/libslic3r/SLAPrint.cpp:964 -#: src/libslic3r/SLAPrint.cpp:1005 +#: src/libslic3r/SLAPrintSteps.cpp:365 src/libslic3r/SLAPrintSteps.cpp:374 +#: src/libslic3r/SLAPrintSteps.cpp:413 msgid "Visualizing supports" msgstr "시각화 지원" -#: src/libslic3r/SLAPrint.cpp:1537 -msgid "Slicing done" -msgstr "슬라이싱 완료" +#: src/libslic3r/SLAPrintSteps.cpp:405 +msgid "No pad can be generated for this model with the current configuration" +msgstr "현재 구성으로 이 모델에 대해 패드를 생성할 수 없습니다." + +#: src/libslic3r/SLAPrintSteps.cpp:579 +msgid "" +"There are unprintable objects. Try to adjust support settings to make the " +"objects printable." +msgstr "" +"인쇄할 수 없는 개체가 있습니다. 지원 설정을 조정하여 개체를 인쇄할 수 있도록 " +"합니다." #: src/libslic3r/PrintBase.cpp:71 msgid "Failed processing of the output_filename_format template." @@ -5551,13 +6807,17 @@ msgstr "배드 모양" #: src/libslic3r/PrintConfig.cpp:56 msgid "Bed custom texture" -msgstr "침대 사용자 정의 질감" +msgstr "배드 사용자 정의 질감" #: src/libslic3r/PrintConfig.cpp:61 msgid "Bed custom model" -msgstr "침대 사용자 정의 모델" +msgstr "배드 사용자 정의 모델" -#: src/libslic3r/PrintConfig.cpp:68 +#: src/libslic3r/PrintConfig.cpp:66 +msgid "Picture sizes to be stored into a .gcode and .sl1 files" +msgstr ".gcode 및 .sl1 파일에 저장할 그림 크기" + +#: src/libslic3r/PrintConfig.cpp:73 msgid "" "This setting controls the height (and thus the total number) of the slices/" "layers. Thinner layers give better accuracy but take more time to print." @@ -5565,21 +6825,21 @@ msgstr "" "이 설정은 슬라이스/레이어의 높이(따라서 총 수)를 제어합니다. 얇은 층은 더 나" "은 정확성을 제공하지만 인쇄하는 데는 더 많은 시간이 걸린다." -#: src/libslic3r/PrintConfig.cpp:75 +#: src/libslic3r/PrintConfig.cpp:80 msgid "Max print height" msgstr "최대 프린트 높이" -#: src/libslic3r/PrintConfig.cpp:76 +#: src/libslic3r/PrintConfig.cpp:81 msgid "" "Set this to the maximum height that can be reached by your extruder while " "printing." msgstr "인쇄 중에 익스트루더가 도달 할 수있는 최대 높이로 설정하십시오." -#: src/libslic3r/PrintConfig.cpp:82 +#: src/libslic3r/PrintConfig.cpp:87 msgid "Slice gap closing radius" msgstr "슬라이스 간격 닫힘 반경" -#: src/libslic3r/PrintConfig.cpp:84 +#: src/libslic3r/PrintConfig.cpp:89 msgid "" "Cracks smaller than 2x gap closing radius are being filled during the " "triangle mesh slicing. The gap closing operation may reduce the final print " @@ -5589,11 +6849,11 @@ msgstr "" "틈 닫기 작업은 최종 인쇄 해상도를 줄일 수 있으므로 값을 합리적으로 낮게 유지 " "하는 것이 좋습니다." -#: src/libslic3r/PrintConfig.cpp:92 +#: src/libslic3r/PrintConfig.cpp:97 msgid "Hostname, IP or URL" msgstr "호스트 이름(Hostname), IP or URL" -#: src/libslic3r/PrintConfig.cpp:93 +#: src/libslic3r/PrintConfig.cpp:98 msgid "" "Slic3r can upload G-code files to a printer host. This field should contain " "the hostname, IP address or URL of the printer host instance." @@ -5601,11 +6861,11 @@ msgstr "" "Slic3r는 프린터 호스트에 G 코드 파일을 업로드할 수 있습니다. 이 필드는 호스" "트 이름, IP 주소 또는 프린터 호스트 복제본의 URL을 포함 해야 합니다." -#: src/libslic3r/PrintConfig.cpp:99 +#: src/libslic3r/PrintConfig.cpp:104 msgid "API Key / Password" msgstr "API 키/암호" -#: src/libslic3r/PrintConfig.cpp:100 +#: src/libslic3r/PrintConfig.cpp:105 msgid "" "Slic3r can upload G-code files to a printer host. This field should contain " "the API Key or the password required for authentication." @@ -5613,11 +6873,11 @@ msgstr "" "Slic3r는 프린터 호스트에 G 코드 파일을 업로드할 수 있습니다. 이 필드는 API " "키 또는 인증에 필요한 암호를 포함 해야 합니다." -#: src/libslic3r/PrintConfig.cpp:106 +#: src/libslic3r/PrintConfig.cpp:111 msgid "HTTPS CA File" msgstr "HTTPS CA 파일" -#: src/libslic3r/PrintConfig.cpp:107 +#: src/libslic3r/PrintConfig.cpp:112 msgid "" "Custom CA certificate file can be specified for HTTPS OctoPrint connections, " "in crt/pem format. If left blank, the default OS CA certificate repository " @@ -5626,25 +6886,25 @@ msgstr "" "사용자 지정 CA 인증서 파일은 crt/pem 형식의 HTTPS 옥토 프린트 연결에 대해 지" "정할 수 있습니다. 비워 두면 기본 OS CA 인증서 리포지토리가 사용 됩니다." -#: src/libslic3r/PrintConfig.cpp:121 +#: src/libslic3r/PrintConfig.cpp:126 msgid "Avoid crossing perimeters" -msgstr "출력된 외측을 피하세요" +msgstr "교체된 둘레를 피하세요." -#: src/libslic3r/PrintConfig.cpp:122 +#: src/libslic3r/PrintConfig.cpp:127 msgid "" "Optimize travel moves in order to minimize the crossing of perimeters. This " "is mostly useful with Bowden extruders which suffer from oozing. This " "feature slows down both the print and the G-code generation." msgstr "" -"둘레의 교차를 최소화하기 위해 여행 이동을 최적화하십시오. 이것은 보 잉 " +"둘레의 교차를 최소화하기 위해 여행 이동을 최적화하십시오. 이것은 보잉 " "(Bowling) 압출기가 흘러 나오기 쉬운 경우에 주로 유용합니다. 이 기능을 사용하" "면 인쇄 및 G 코드 생성 속도가 느려집니다." -#: src/libslic3r/PrintConfig.cpp:129 src/libslic3r/PrintConfig.cpp:2027 +#: src/libslic3r/PrintConfig.cpp:134 src/libslic3r/PrintConfig.cpp:2074 msgid "Other layers" msgstr "다른 레이어" -#: src/libslic3r/PrintConfig.cpp:130 +#: src/libslic3r/PrintConfig.cpp:135 msgid "" "Bed temperature for layers after the first one. Set this to zero to disable " "bed temperature control commands in the output." @@ -5652,11 +6912,11 @@ msgstr "" "첫 번째 레이어 이후의 레이어 온도. 이 값을 0으로 설정하면 출력에서 ​​베드 온도 " "제어 명령을 비활성화합니다." -#: src/libslic3r/PrintConfig.cpp:132 +#: src/libslic3r/PrintConfig.cpp:137 msgid "Bed temperature" msgstr "배드 온도" -#: src/libslic3r/PrintConfig.cpp:139 +#: src/libslic3r/PrintConfig.cpp:144 msgid "" "This custom code is inserted at every layer change, right before the Z move. " "Note that you can use placeholder variables for all Slic3r settings as well " @@ -5666,11 +6926,11 @@ msgstr "" "설정과 [layer_num] 및 [layer_z]에 대한 자리 표시 자 변수를 사용할 수 있습니" "다." -#: src/libslic3r/PrintConfig.cpp:149 +#: src/libslic3r/PrintConfig.cpp:154 msgid "Between objects G-code" -msgstr "객체 간 G 코드" +msgstr "객체(object) 간 G 코드" -#: src/libslic3r/PrintConfig.cpp:150 +#: src/libslic3r/PrintConfig.cpp:155 msgid "" "This code is inserted between objects when using sequential printing. By " "default extruder and bed temperature are reset using non-wait command; " @@ -5679,25 +6939,37 @@ msgid "" "variables for all Slic3r settings, so you can put a \"M109 " "S[first_layer_temperature]\" command wherever you want." msgstr "" -"이 코드는 순차 인쇄를 사용할 때 객체간에 삽입됩니다. 기본적으로 익스트루더 " -"및 베드 온도는 대기 모드가 아닌 명령을 사용하여 재설정됩니다. 그러나 이 사용" -"자 코드에서 M104, M109, M140 또는 M190이 감지되면 Slic3r은 온도 명령을 추가하" -"지 않습니다. 모든 Slic3r 설정에 자리 표시 변수를 사용할 수 있으므로 원하는 위" -"치에 \"M109 S [first_layer_temperature]\"명령을 넣을 수 있습니다." +"이 코드는 순차 인쇄를 사용할 때 객체(object)간에 삽입됩니다. 기본적으로 익스" +"트루더 및 베드 온도는 대기 모드가 아닌 명령을 사용하여 재설정됩니다. 그러나 " +"이 사용자 코드에서 M104, M109, M140 또는 M190이 감지되면 Slic3r은 온도 명령" +"을 추가하지 않습니다. 모든 Slic3r 설정에 자리 표시 변수를 사용할 수 있으므로 " +"원하는 위치에 \"M109 S [first_layer_temperature]\"명령을 넣을 수 있습니다." -#: src/libslic3r/PrintConfig.cpp:161 +#: src/libslic3r/PrintConfig.cpp:166 msgid "Number of solid layers to generate on bottom surfaces." msgstr "바닥면에 생성 할 솔리드 레이어의 수." -#: src/libslic3r/PrintConfig.cpp:162 +#: src/libslic3r/PrintConfig.cpp:167 msgid "Bottom solid layers" msgstr "바닥 단일 레이어" -#: src/libslic3r/PrintConfig.cpp:167 +#: src/libslic3r/PrintConfig.cpp:175 +msgid "" +"The number of bottom solid layers is increased above bottom_solid_layers if " +"necessary to satisfy minimum thickness of bottom shell." +msgstr "" +"바닥 단색 층의 수는 바닥 쉘의 최소 두께를 만족시키기 위해 필요한 경우 " +"bottom_solid_layers 이상으로 증가한다." + +#: src/libslic3r/PrintConfig.cpp:177 +msgid "Minimum bottom shell thickness" +msgstr "최소 하단 쉘 두께" + +#: src/libslic3r/PrintConfig.cpp:183 msgid "Bridge" msgstr "브리지" -#: src/libslic3r/PrintConfig.cpp:168 +#: src/libslic3r/PrintConfig.cpp:184 msgid "" "This is the acceleration your printer will use for bridges. Set zero to " "disable acceleration control for bridges." @@ -5705,18 +6977,18 @@ msgstr "" "이것은 프린터가 브릿지에 사용할 가속도입니다. 브리지의 가속 제어를 사용하지 " "않으려면 0으로 설정하십시오." -#: src/libslic3r/PrintConfig.cpp:170 src/libslic3r/PrintConfig.cpp:313 -#: src/libslic3r/PrintConfig.cpp:840 src/libslic3r/PrintConfig.cpp:961 -#: src/libslic3r/PrintConfig.cpp:1130 src/libslic3r/PrintConfig.cpp:1183 -#: src/libslic3r/PrintConfig.cpp:1194 src/libslic3r/PrintConfig.cpp:1383 +#: src/libslic3r/PrintConfig.cpp:186 src/libslic3r/PrintConfig.cpp:329 +#: src/libslic3r/PrintConfig.cpp:863 src/libslic3r/PrintConfig.cpp:985 +#: src/libslic3r/PrintConfig.cpp:1155 src/libslic3r/PrintConfig.cpp:1208 +#: src/libslic3r/PrintConfig.cpp:1219 src/libslic3r/PrintConfig.cpp:1412 msgid "mm/s²" msgstr "mm/s ²" -#: src/libslic3r/PrintConfig.cpp:176 +#: src/libslic3r/PrintConfig.cpp:192 msgid "Bridging angle" msgstr "브릿지 각도" -#: src/libslic3r/PrintConfig.cpp:178 +#: src/libslic3r/PrintConfig.cpp:194 msgid "" "Bridging angle override. If left to zero, the bridging angle will be " "calculated automatically. Otherwise the provided angle will be used for all " @@ -5726,34 +6998,34 @@ msgstr "" "로 계산됩니다. 그렇지 않으면 제공된 각도가 모든 브리지에 사용됩니다. 각도 제" "로는 180 °를 사용하십시오." -#: src/libslic3r/PrintConfig.cpp:181 src/libslic3r/PrintConfig.cpp:758 -#: src/libslic3r/PrintConfig.cpp:1619 src/libslic3r/PrintConfig.cpp:1629 -#: src/libslic3r/PrintConfig.cpp:1858 src/libslic3r/PrintConfig.cpp:2012 -#: src/libslic3r/PrintConfig.cpp:2197 src/libslic3r/PrintConfig.cpp:2582 -#: src/libslic3r/PrintConfig.cpp:2693 +#: src/libslic3r/PrintConfig.cpp:197 src/libslic3r/PrintConfig.cpp:781 +#: src/libslic3r/PrintConfig.cpp:1649 src/libslic3r/PrintConfig.cpp:1659 +#: src/libslic3r/PrintConfig.cpp:1904 src/libslic3r/PrintConfig.cpp:2059 +#: src/libslic3r/PrintConfig.cpp:2257 src/libslic3r/PrintConfig.cpp:2728 +#: src/libslic3r/PrintConfig.cpp:2849 msgid "°" msgstr "°" -#: src/libslic3r/PrintConfig.cpp:187 +#: src/libslic3r/PrintConfig.cpp:203 msgid "Bridges fan speed" msgstr "브릿지 팬 속도" -#: src/libslic3r/PrintConfig.cpp:188 +#: src/libslic3r/PrintConfig.cpp:204 msgid "This fan speed is enforced during all bridges and overhangs." msgstr "이 팬 속도는 모든 브릿지 및 오버행 중에 적용됩니다." -#: src/libslic3r/PrintConfig.cpp:189 src/libslic3r/PrintConfig.cpp:770 -#: src/libslic3r/PrintConfig.cpp:1203 src/libslic3r/PrintConfig.cpp:1266 -#: src/libslic3r/PrintConfig.cpp:1511 src/libslic3r/PrintConfig.cpp:2366 -#: src/libslic3r/PrintConfig.cpp:2623 +#: src/libslic3r/PrintConfig.cpp:205 src/libslic3r/PrintConfig.cpp:793 +#: src/libslic3r/PrintConfig.cpp:1228 src/libslic3r/PrintConfig.cpp:1291 +#: src/libslic3r/PrintConfig.cpp:1541 src/libslic3r/PrintConfig.cpp:2435 +#: src/libslic3r/PrintConfig.cpp:2768 msgid "%" msgstr "%" -#: src/libslic3r/PrintConfig.cpp:196 +#: src/libslic3r/PrintConfig.cpp:212 msgid "Bridge flow ratio" msgstr "브릿지 유량(flow)값" -#: src/libslic3r/PrintConfig.cpp:198 +#: src/libslic3r/PrintConfig.cpp:214 msgid "" "This factor affects the amount of plastic for bridging. You can decrease it " "slightly to pull the extrudates and prevent sagging, although default " @@ -5764,64 +7036,66 @@ msgstr "" "겨 처짐을 방지하기 위해 약간 줄일 수 있지만 기본 설정은 일반적으로 좋지만이 " "문제를 해결하기 전에 냉각 (팬 사용)을 시도해야합니다." -#: src/libslic3r/PrintConfig.cpp:208 +#: src/libslic3r/PrintConfig.cpp:224 msgid "Bridges" msgstr "브릿지(Bridges)" -#: src/libslic3r/PrintConfig.cpp:210 +#: src/libslic3r/PrintConfig.cpp:226 msgid "Speed for printing bridges." msgstr "브릿지 인쇄 속도." -#: src/libslic3r/PrintConfig.cpp:211 src/libslic3r/PrintConfig.cpp:592 -#: src/libslic3r/PrintConfig.cpp:600 src/libslic3r/PrintConfig.cpp:609 -#: src/libslic3r/PrintConfig.cpp:617 src/libslic3r/PrintConfig.cpp:644 -#: src/libslic3r/PrintConfig.cpp:663 src/libslic3r/PrintConfig.cpp:899 -#: src/libslic3r/PrintConfig.cpp:1026 src/libslic3r/PrintConfig.cpp:1112 -#: src/libslic3r/PrintConfig.cpp:1148 src/libslic3r/PrintConfig.cpp:1161 -#: src/libslic3r/PrintConfig.cpp:1172 src/libslic3r/PrintConfig.cpp:1225 -#: src/libslic3r/PrintConfig.cpp:1284 src/libslic3r/PrintConfig.cpp:1412 -#: src/libslic3r/PrintConfig.cpp:1586 src/libslic3r/PrintConfig.cpp:1595 -#: src/libslic3r/PrintConfig.cpp:1991 src/libslic3r/PrintConfig.cpp:2104 +#: src/libslic3r/PrintConfig.cpp:227 src/libslic3r/PrintConfig.cpp:610 +#: src/libslic3r/PrintConfig.cpp:618 src/libslic3r/PrintConfig.cpp:627 +#: src/libslic3r/PrintConfig.cpp:635 src/libslic3r/PrintConfig.cpp:662 +#: src/libslic3r/PrintConfig.cpp:681 src/libslic3r/PrintConfig.cpp:923 +#: src/libslic3r/PrintConfig.cpp:1051 src/libslic3r/PrintConfig.cpp:1137 +#: src/libslic3r/PrintConfig.cpp:1173 src/libslic3r/PrintConfig.cpp:1186 +#: src/libslic3r/PrintConfig.cpp:1197 src/libslic3r/PrintConfig.cpp:1250 +#: src/libslic3r/PrintConfig.cpp:1309 src/libslic3r/PrintConfig.cpp:1442 +#: src/libslic3r/PrintConfig.cpp:1616 src/libslic3r/PrintConfig.cpp:1625 +#: src/libslic3r/PrintConfig.cpp:2038 src/libslic3r/PrintConfig.cpp:2164 msgid "mm/s" msgstr "mm/s" -#: src/libslic3r/PrintConfig.cpp:218 +#: src/libslic3r/PrintConfig.cpp:234 msgid "Brim width" msgstr "브림 폭" -#: src/libslic3r/PrintConfig.cpp:219 +#: src/libslic3r/PrintConfig.cpp:235 msgid "" "Horizontal width of the brim that will be printed around each object on the " "first layer." -msgstr "첫 번째 레이어의 각 객체 주위에 인쇄 될 가장자리의 가로 폭입니다." +msgstr "" +"첫 번째 레이어의 각 객체(object) 주위에 인쇄 될 가장자리의 가로 폭입니다." -#: src/libslic3r/PrintConfig.cpp:226 +#: src/libslic3r/PrintConfig.cpp:242 msgid "Clip multi-part objects" -msgstr "여러 파트 오브젝트 클립" +msgstr "여러 부품(Part) 객체(object) 클립" -#: src/libslic3r/PrintConfig.cpp:227 +#: src/libslic3r/PrintConfig.cpp:243 msgid "" "When printing multi-material objects, this settings will make Slic3r to clip " "the overlapping object parts one by the other (2nd part will be clipped by " "the 1st, 3rd part will be clipped by the 1st and 2nd etc)." msgstr "" -"멀티 메터리얼(multi-material) 개체를 인쇄 할 때이 설정을 사용하면 겹치는 개" -"체 파트를 서로 겹쳐서 잘라낼 수 있습니다 (두 번째 부분은 첫 번째 부분에서 클" -"리핑되며 세 번째 부분은 첫 번째 및 두 번째 부분에서 잘립니다)." +"다중 메터리얼(multi-material) 객체(object)를 인쇄 할 때이 설정을 사용하면 겹" +"치는 객체(object) 부품(Part)를 서로 겹쳐서 잘라낼 수 있습니다 (두 번째 부분" +"은 첫 번째 부분에서 클리핑되며 세 번째 부분은 첫 번째 및 두 번째 부분에서 잘" +"립니다)." -#: src/libslic3r/PrintConfig.cpp:234 +#: src/libslic3r/PrintConfig.cpp:250 msgid "Colorprint height" msgstr "컬러 인쇄 높이" -#: src/libslic3r/PrintConfig.cpp:235 +#: src/libslic3r/PrintConfig.cpp:251 msgid "Heights at which a filament change is to occur." msgstr "필라멘트 체인지가 발생 하는 높이." -#: src/libslic3r/PrintConfig.cpp:245 +#: src/libslic3r/PrintConfig.cpp:261 msgid "Compatible printers condition" msgstr "호환 가능한 프린터 조건" -#: src/libslic3r/PrintConfig.cpp:246 +#: src/libslic3r/PrintConfig.cpp:262 msgid "" "A boolean expression using the configuration values of an active printer " "profile. If this expression evaluates to true, this profile is considered " @@ -5830,11 +7104,11 @@ msgstr "" "활성 프린터 프로파일의 구성 값을 사용하는 부울 표현식. 이 표현식이 true로 평" "가되면이 프로필은 활성 프린터 프로필과 호환되는 것으로 간주됩니다." -#: src/libslic3r/PrintConfig.cpp:260 +#: src/libslic3r/PrintConfig.cpp:276 msgid "Compatible print profiles condition" msgstr "호환 되는 인쇄 프로 파일 조건" -#: src/libslic3r/PrintConfig.cpp:261 +#: src/libslic3r/PrintConfig.cpp:277 msgid "" "A boolean expression using the configuration values of an active print " "profile. If this expression evaluates to true, this profile is considered " @@ -5843,27 +7117,27 @@ msgstr "" "활성 인쇄 프로 파일의 구성 값을 사용하는 부울식입니다. 이 식이 true로 평가 되" "면, 이 프로필이 활성 인쇄 프로필과 호환 되는 것으로 간주 됩니다." -#: src/libslic3r/PrintConfig.cpp:278 +#: src/libslic3r/PrintConfig.cpp:294 msgid "Complete individual objects" -msgstr "개별 개체 완성" +msgstr "개별 객체(object) 완성" -#: src/libslic3r/PrintConfig.cpp:279 +#: src/libslic3r/PrintConfig.cpp:295 msgid "" "When printing multiple objects or copies, this feature will complete each " "object before moving onto next one (and starting it from its bottom layer). " "This feature is useful to avoid the risk of ruined prints. Slic3r should " "warn and prevent you from extruder collisions, but beware." msgstr "" -"여러 객체 또는 사본을 인쇄 할 때이 객체는 다음 객체로 이동하기 전에 각 객체" -"를 완성합니다 (맨 아래 레이어에서 시작). 이 기능은 인쇄물이 망가지는 위험을 " -"피할 때 유용합니다. Slic3r은 압출기 충돌을 경고하고 예방해야하지만 조심하십시" -"오." +"여러 객체(object) 또는 사본을 인쇄 할 때이 객체(object)는 다음 객체(object)" +"로 이동하기 전에 각 객체(object)를 완성합니다 (맨 아래 레이어에서 시작). 이 " +"기능은 인쇄물이 망가지는 위험을 피할 때 유용합니다. Slic3r은 압출기 충돌을 경" +"고하고 예방해야하지만 조재봉선하십시오." -#: src/libslic3r/PrintConfig.cpp:287 +#: src/libslic3r/PrintConfig.cpp:303 msgid "Enable auto cooling" msgstr "자동 냉각 사용" -#: src/libslic3r/PrintConfig.cpp:288 +#: src/libslic3r/PrintConfig.cpp:304 msgid "" "This flag enables the automatic cooling logic that adjusts print speed and " "fan speed according to layer printing time." @@ -5871,23 +7145,23 @@ msgstr "" "이 플래그는 레이어 인쇄 시간에 따라 인쇄 속도와 팬 속도를 조정하는 자동 냉각 " "논리를 활성화합니다." -#: src/libslic3r/PrintConfig.cpp:293 +#: src/libslic3r/PrintConfig.cpp:309 msgid "Cooling tube position" msgstr "냉각 튜브 위치" -#: src/libslic3r/PrintConfig.cpp:294 +#: src/libslic3r/PrintConfig.cpp:310 msgid "Distance of the center-point of the cooling tube from the extruder tip." -msgstr "압출기 팁에서 냉각 튜브의 중심점까지의 거리 " +msgstr "압출기 팁에서 냉각 튜브의 중재봉선점까지의 거리 " -#: src/libslic3r/PrintConfig.cpp:301 +#: src/libslic3r/PrintConfig.cpp:317 msgid "Cooling tube length" msgstr "냉각 튜브 길이" -#: src/libslic3r/PrintConfig.cpp:302 +#: src/libslic3r/PrintConfig.cpp:318 msgid "Length of the cooling tube to limit space for cooling moves inside it." msgstr "내부의 냉각 이동을 위해 공간을 제한하는 냉각 튜브의 길이 " -#: src/libslic3r/PrintConfig.cpp:310 +#: src/libslic3r/PrintConfig.cpp:326 msgid "" "This is the acceleration your printer will be reset to after the role-" "specific acceleration values are used (perimeter/infill). Set zero to " @@ -5896,11 +7170,11 @@ msgstr "" "역할 별 가속도 값이 사용 된 후에 프린터가 재설정되는 속도입니다 (둘레 / 충" "전). 가속을 전혀 재설정하지 않으려면 0으로 설정하십시오." -#: src/libslic3r/PrintConfig.cpp:319 +#: src/libslic3r/PrintConfig.cpp:335 msgid "Default filament profile" msgstr "기본 필라멘트 프로파일" -#: src/libslic3r/PrintConfig.cpp:320 +#: src/libslic3r/PrintConfig.cpp:336 msgid "" "Default filament profile associated with the current printer profile. On " "selection of the current printer profile, this filament profile will be " @@ -5909,12 +7183,12 @@ msgstr "" "현재 프린터 프로파일과 연관된 기본 필라멘트 프로파일. 현재 프린터 프로파일을 " "선택하면 이 필라멘트 프로파일이 활성화됩니다." -#: src/libslic3r/PrintConfig.cpp:326 +#: src/libslic3r/PrintConfig.cpp:342 msgid "Default print profile" msgstr "기본 인쇄 프로파일" -#: src/libslic3r/PrintConfig.cpp:327 src/libslic3r/PrintConfig.cpp:2447 -#: src/libslic3r/PrintConfig.cpp:2458 +#: src/libslic3r/PrintConfig.cpp:343 src/libslic3r/PrintConfig.cpp:2593 +#: src/libslic3r/PrintConfig.cpp:2604 msgid "" "Default print profile associated with the current printer profile. On " "selection of the current printer profile, this print profile will be " @@ -5923,11 +7197,11 @@ msgstr "" "현재 프린터 프로파일과 연관된 기본 인쇄 프로파일. 현재 프린터 프로파일을 선택" "하면이 인쇄 프로파일이 활성화됩니다." -#: src/libslic3r/PrintConfig.cpp:333 +#: src/libslic3r/PrintConfig.cpp:349 msgid "Disable fan for the first" msgstr "첫 번째 팬 사용 중지" -#: src/libslic3r/PrintConfig.cpp:334 +#: src/libslic3r/PrintConfig.cpp:350 msgid "" "You can set this to a positive value to disable fan at all during the first " "layers, so that it does not make adhesion worse." @@ -5935,37 +7209,30 @@ msgstr "" "이 값을 양수 값으로 설정하면 첫 번째 레이어에서 팬을 사용하지 않도록 설정하" "여 접착력을 악화시키지 않습니다." -#: src/libslic3r/PrintConfig.cpp:336 src/libslic3r/PrintConfig.cpp:971 -#: src/libslic3r/PrintConfig.cpp:1484 src/libslic3r/PrintConfig.cpp:1669 -#: src/libslic3r/PrintConfig.cpp:1730 src/libslic3r/PrintConfig.cpp:1894 -#: src/libslic3r/PrintConfig.cpp:1939 -msgid "layers" -msgstr "레이어" - -#: src/libslic3r/PrintConfig.cpp:343 +#: src/libslic3r/PrintConfig.cpp:359 msgid "Don't support bridges" msgstr "서포트와 브릿지를 사용하지 않음" -#: src/libslic3r/PrintConfig.cpp:345 +#: src/libslic3r/PrintConfig.cpp:361 msgid "" "Experimental option for preventing support material from being generated " "under bridged areas." msgstr "" "브릿지 영역 아래에 서포팅 재료가 생성되는 것을 방지하기위한 실험적 옵션." -#: src/libslic3r/PrintConfig.cpp:351 +#: src/libslic3r/PrintConfig.cpp:367 msgid "Distance between copies" msgstr "복사본 간 거리" -#: src/libslic3r/PrintConfig.cpp:352 +#: src/libslic3r/PrintConfig.cpp:368 msgid "Distance used for the auto-arrange feature of the plater." msgstr "플래이터(plater)의 자동 정렬 기능에 사용되는 거리입니다." -#: src/libslic3r/PrintConfig.cpp:359 +#: src/libslic3r/PrintConfig.cpp:375 msgid "Elephant foot compensation" msgstr "코끼리 발(Elephant foot) 보상값" -#: src/libslic3r/PrintConfig.cpp:361 +#: src/libslic3r/PrintConfig.cpp:377 msgid "" "The first layer will be shrunk in the XY plane by the configured value to " "compensate for the 1st layer squish aka an Elephant Foot effect." @@ -5973,32 +7240,32 @@ msgstr "" "첫 번째 레이어는 구성 요소 값에 따라 XY 평면에서 수축되어 일층 스 퀴시 코끼리" "발(Elephant Foot) 효과를 보완합니다." -#: src/libslic3r/PrintConfig.cpp:370 +#: src/libslic3r/PrintConfig.cpp:386 msgid "" "This end procedure is inserted at the end of the output file. Note that you " -"can use placeholder variables for all Slic3r settings." +"can use placeholder variables for all PrusaSlicer settings." msgstr "" -"이 종료 절차는 출력 파일의 끝에 삽입된다. 모든 Slic3r 설정에 자리 표시자 변수" -"를 사용할 수 있다는 점에 유의하십시오." +"이 끝 프로시저는 출력 파일의 끝에 삽입됩니다. 모든 PrusaSlicer 설정에 자리 표" +"시자 변수를 사용할 수 있습니다." -#: src/libslic3r/PrintConfig.cpp:380 +#: src/libslic3r/PrintConfig.cpp:396 msgid "" "This end procedure is inserted at the end of the output file, before the " "printer end gcode (and before any toolchange from this filament in case of " "multimaterial printers). Note that you can use placeholder variables for all " -"Slic3r settings. If you have multiple extruders, the gcode is processed in " -"extruder order." +"PrusaSlicer settings. If you have multiple extruders, the gcode is processed " +"in extruder order." msgstr "" -"이 종료 절차는 출력 파일의 끝, 프린터 종료 gcode 이전 (및 복합 재료 프린터의 " -"경우이 필라멘트에서 도구를 변경하기 전에)에 삽입됩니다. 모든 Slic3r 설정에 자" -"리 표시 자 변수를 사용할 수 있습니다. 압출기가 여러 개인 경우 gcode는 압출기 " -"순서대로 처리됩니다." +"이 끝 프로시저는 프린터가 gcode를 종료하기 전에 출력 파일의 끝에 삽입됩니다" +"(다중 재질 프린터의 경우 이 필라멘트에서 공구를 변경하기 전에). 모든 " +"PrusaSlicer 설정에 자리 표시자 변수를 사용할 수 있습니다. 압출기가 여러 개 있" +"는 경우 gcode는 압출기 순서로 처리됩니다." -#: src/libslic3r/PrintConfig.cpp:391 +#: src/libslic3r/PrintConfig.cpp:407 msgid "Ensure vertical shell thickness" msgstr "수직 쉘(shell) 두께 확인" -#: src/libslic3r/PrintConfig.cpp:393 +#: src/libslic3r/PrintConfig.cpp:409 msgid "" "Add solid infill near sloping surfaces to guarantee the vertical shell " "thickness (top+bottom solid layers)." @@ -6006,11 +7273,11 @@ msgstr "" "경사 표면 근처에 솔리드 인필을 추가하여 수직 셸 두께(상단+하단 솔리드 레이어)" "를 보장하십시오." -#: src/libslic3r/PrintConfig.cpp:399 +#: src/libslic3r/PrintConfig.cpp:415 msgid "Top fill pattern" msgstr "상단 채우기 패턴" -#: src/libslic3r/PrintConfig.cpp:401 +#: src/libslic3r/PrintConfig.cpp:417 msgid "" "Fill pattern for top infill. This only affects the top visible layer, and " "not its adjacent solid shells." @@ -6018,32 +7285,32 @@ msgstr "" "상단 채우기의 채우기 패턴. 이는 인접 한 솔리드 쉘이 아니라 보이는 상위 레이어" "에만 영향을 줍니다." -#: src/libslic3r/PrintConfig.cpp:409 src/libslic3r/PrintConfig.cpp:821 -#: src/libslic3r/PrintConfig.cpp:1972 +#: src/libslic3r/PrintConfig.cpp:425 src/libslic3r/PrintConfig.cpp:844 +#: src/libslic3r/PrintConfig.cpp:2019 msgid "Rectilinear" msgstr "직선면(Rectilinear)" -#: src/libslic3r/PrintConfig.cpp:410 src/libslic3r/PrintConfig.cpp:827 +#: src/libslic3r/PrintConfig.cpp:426 src/libslic3r/PrintConfig.cpp:850 msgid "Concentric" msgstr "동심원(Concentric)" -#: src/libslic3r/PrintConfig.cpp:411 src/libslic3r/PrintConfig.cpp:831 +#: src/libslic3r/PrintConfig.cpp:427 src/libslic3r/PrintConfig.cpp:854 msgid "Hilbert Curve" msgstr "힐버트 곡선(Hilbert Curve)" -#: src/libslic3r/PrintConfig.cpp:412 src/libslic3r/PrintConfig.cpp:832 +#: src/libslic3r/PrintConfig.cpp:428 src/libslic3r/PrintConfig.cpp:855 msgid "Archimedean Chords" msgstr "아르키메데우스(Archimedean Chords)" -#: src/libslic3r/PrintConfig.cpp:413 src/libslic3r/PrintConfig.cpp:833 +#: src/libslic3r/PrintConfig.cpp:429 src/libslic3r/PrintConfig.cpp:856 msgid "Octagram Spiral" msgstr "옥타그램 나선(Octagram Spiral)" -#: src/libslic3r/PrintConfig.cpp:419 +#: src/libslic3r/PrintConfig.cpp:435 msgid "Bottom fill pattern" msgstr "아래쪽 채우기 패턴" -#: src/libslic3r/PrintConfig.cpp:421 +#: src/libslic3r/PrintConfig.cpp:437 msgid "" "Fill pattern for bottom infill. This only affects the bottom external " "visible layer, and not its adjacent solid shells." @@ -6051,11 +7318,11 @@ msgstr "" "하단 채우기의 채우기 패턴. 이는 인접 한 솔리드 쉘이 아니라 아래쪽에 보이는 외" "부 레이어에만 영향을 줍니다." -#: src/libslic3r/PrintConfig.cpp:430 src/libslic3r/PrintConfig.cpp:440 +#: src/libslic3r/PrintConfig.cpp:446 src/libslic3r/PrintConfig.cpp:457 msgid "External perimeters" msgstr "외측 둘레" -#: src/libslic3r/PrintConfig.cpp:432 +#: src/libslic3r/PrintConfig.cpp:448 msgid "" "Set this to a non-zero value to set a manual extrusion width for external " "perimeters. If left zero, default extrusion width will be used if set, " @@ -6066,16 +7333,16 @@ msgstr "" "오. 0인 경우 기본 압출 너비가 사용되며, 그렇지 않으면 1.125 x 노즐 직경이 사" "용된다. 백분율(예: 200%)로 표현되는 경우, 레이어 높이에 걸쳐 계산됩니다." -#: src/libslic3r/PrintConfig.cpp:435 src/libslic3r/PrintConfig.cpp:543 -#: src/libslic3r/PrintConfig.cpp:860 src/libslic3r/PrintConfig.cpp:872 -#: src/libslic3r/PrintConfig.cpp:992 src/libslic3r/PrintConfig.cpp:1017 -#: src/libslic3r/PrintConfig.cpp:1403 src/libslic3r/PrintConfig.cpp:1741 -#: src/libslic3r/PrintConfig.cpp:1847 src/libslic3r/PrintConfig.cpp:1915 -#: src/libslic3r/PrintConfig.cpp:2074 +#: src/libslic3r/PrintConfig.cpp:451 src/libslic3r/PrintConfig.cpp:560 +#: src/libslic3r/PrintConfig.cpp:883 src/libslic3r/PrintConfig.cpp:896 +#: src/libslic3r/PrintConfig.cpp:1016 src/libslic3r/PrintConfig.cpp:1042 +#: src/libslic3r/PrintConfig.cpp:1432 src/libslic3r/PrintConfig.cpp:1771 +#: src/libslic3r/PrintConfig.cpp:1893 src/libslic3r/PrintConfig.cpp:1961 +#: src/libslic3r/PrintConfig.cpp:2121 msgid "mm or %" msgstr "mm/s 또는 %" -#: src/libslic3r/PrintConfig.cpp:442 +#: src/libslic3r/PrintConfig.cpp:459 msgid "" "This separate setting will affect the speed of external perimeters (the " "visible ones). If expressed as percentage (for example: 80%) it will be " @@ -6085,17 +7352,17 @@ msgstr "" "(예: 80%)로 표현되는 경우 위의 Perimeter 속도 설정에 따라 계산된다. 자동을 위" "해 0으로 설정한다." -#: src/libslic3r/PrintConfig.cpp:445 src/libslic3r/PrintConfig.cpp:881 -#: src/libslic3r/PrintConfig.cpp:1700 src/libslic3r/PrintConfig.cpp:1751 -#: src/libslic3r/PrintConfig.cpp:1958 src/libslic3r/PrintConfig.cpp:2086 +#: src/libslic3r/PrintConfig.cpp:462 src/libslic3r/PrintConfig.cpp:905 +#: src/libslic3r/PrintConfig.cpp:1730 src/libslic3r/PrintConfig.cpp:1782 +#: src/libslic3r/PrintConfig.cpp:2005 src/libslic3r/PrintConfig.cpp:2134 msgid "mm/s or %" msgstr "mm/s 또는 %" -#: src/libslic3r/PrintConfig.cpp:452 +#: src/libslic3r/PrintConfig.cpp:469 msgid "External perimeters first" msgstr "외부 경계선 먼저" -#: src/libslic3r/PrintConfig.cpp:454 +#: src/libslic3r/PrintConfig.cpp:471 msgid "" "Print contour perimeters from the outermost one to the innermost one instead " "of the default inverse order." @@ -6103,12 +7370,12 @@ msgstr "" "기본 역순 대신 가장 바깥쪽부터 가장 안쪽까지 윤곽선을 인쇄하십시오. 타겟 TTS" "복사하기번역 저장번역 저장번역 수정." -#: src/libslic3r/PrintConfig.cpp:460 +#: src/libslic3r/PrintConfig.cpp:477 msgid "Extra perimeters if needed" msgstr "필요한 경우 추가 둘레" -#: src/libslic3r/PrintConfig.cpp:462 -#, c-format +#: src/libslic3r/PrintConfig.cpp:479 +#, no-c-format msgid "" "Add more perimeters when needed for avoiding gaps in sloping walls. Slic3r " "keeps adding perimeters, until more than 70% of the loop immediately above " @@ -6118,7 +7385,7 @@ msgstr "" "오. 위의 루프의 70% of 이상이 지지될 때까지 Slic3r는 계속해서 둘ㄹ를 추가한" "다." -#: src/libslic3r/PrintConfig.cpp:472 +#: src/libslic3r/PrintConfig.cpp:489 msgid "" "The extruder to use (unless more specific extruder settings are specified). " "This value overrides perimeter and infill extruders, but not the support " @@ -6127,7 +7394,7 @@ msgstr "" "사용할 압출부(더 구체적인 압출부 설정이 지정되지 않은 경우) 이 값은 경계 및 " "압출부를 초과하지만 지원 압출자를 주입하지는 않는다." -#: src/libslic3r/PrintConfig.cpp:484 +#: src/libslic3r/PrintConfig.cpp:501 msgid "" "Set this to the vertical distance between your nozzle tip and (usually) the " "X carriage rods. In other words, this is the height of the clearance " @@ -6136,13 +7403,9 @@ msgid "" msgstr "" "이것을 노즐 팁과 (일반적으로) X 캐리지 로드 사이의 수직 거리로 설정하십시오. " "다시 말하면, 이것은 당신의 압출기 주위의 틈새 실린더의 높이이며, 그것은 다른 " -"인쇄된 물체와 충돌하기 전에 압출기가 엿볼 수 있는 최대 깊이를 나타낸다." +"인쇄된 개체와 충돌하기 전에 압출기가 엿볼 수 있는 최대 깊이를 나타낸다." -#: src/libslic3r/PrintConfig.cpp:494 -msgid "Radius" -msgstr "반지름" - -#: src/libslic3r/PrintConfig.cpp:495 +#: src/libslic3r/PrintConfig.cpp:512 msgid "" "Set this to the clearance radius around your extruder. If the extruder is " "not centered, choose the largest value for safety. This setting is used to " @@ -6152,19 +7415,19 @@ msgstr "" "으면 안전을 위해 가장 큰 값을 선택하십시오. 이 설정은 충돌 여부를 확인하고 플" "래터에 그래픽 미리 보기를 표시하기 위해 사용된다." -#: src/libslic3r/PrintConfig.cpp:505 +#: src/libslic3r/PrintConfig.cpp:522 msgid "Extruder Color" msgstr "익스트루더 컬러" -#: src/libslic3r/PrintConfig.cpp:506 src/libslic3r/PrintConfig.cpp:566 +#: src/libslic3r/PrintConfig.cpp:523 src/libslic3r/PrintConfig.cpp:584 msgid "This is only used in the Slic3r interface as a visual help." -msgstr "이것은 시각적 도움말로 Slic3r 인터페이스에서만 사용된다." +msgstr "이것은 시각적 도움말로 Slic3r 접점에서만 사용된다." -#: src/libslic3r/PrintConfig.cpp:512 +#: src/libslic3r/PrintConfig.cpp:529 msgid "Extruder offset" msgstr "익스트루더 오프셋" -#: src/libslic3r/PrintConfig.cpp:513 +#: src/libslic3r/PrintConfig.cpp:530 msgid "" "If your firmware doesn't handle the extruder displacement you need the G-" "code to take it into account. This option lets you specify the displacement " @@ -6175,11 +7438,11 @@ msgstr "" "을 사용하면 첫 번째 것에 대한 각 압출기의 변위를 지정할 수 있습니다. 양의 좌" "표가 필요합니다 (XY 좌표에서 뺍니다)." -#: src/libslic3r/PrintConfig.cpp:522 +#: src/libslic3r/PrintConfig.cpp:539 msgid "Extrusion axis" msgstr "압출 축" -#: src/libslic3r/PrintConfig.cpp:523 +#: src/libslic3r/PrintConfig.cpp:540 msgid "" "Use this option to set the axis letter associated to your printer's extruder " "(usually E but some printers use A)." @@ -6187,11 +7450,11 @@ msgstr "" "이 옵션을 사용하여 프린터의 압출기에 연결된 축 문자를 설정합니다 (보통 E이지" "만 일부 프린터는 A를 사용합니다)." -#: src/libslic3r/PrintConfig.cpp:528 +#: src/libslic3r/PrintConfig.cpp:545 msgid "Extrusion multiplier" msgstr "압출 승수" -#: src/libslic3r/PrintConfig.cpp:529 +#: src/libslic3r/PrintConfig.cpp:546 msgid "" "This factor changes the amount of flow proportionally. You may need to tweak " "this setting to get nice surface finish and correct single wall widths. " @@ -6203,11 +7466,11 @@ msgstr "" "이입니다. 이 값을 더 변경해야한다고 판단되면 필라멘트 직경과 펌웨어 E 단계를 " "확인하십시오." -#: src/libslic3r/PrintConfig.cpp:537 +#: src/libslic3r/PrintConfig.cpp:554 msgid "Default extrusion width" msgstr "기본 압출 폭" -#: src/libslic3r/PrintConfig.cpp:539 +#: src/libslic3r/PrintConfig.cpp:556 msgid "" "Set this to a non-zero value to allow a manual extrusion width. If left to " "zero, Slic3r derives extrusion widths from the nozzle diameter (see the " @@ -6220,11 +7483,11 @@ msgstr "" "의 툴팁 참조). 백분율로 표시되는 경우 (예 : 230 %) 레이어 높이를 기준으로 계" "산됩니다." -#: src/libslic3r/PrintConfig.cpp:548 +#: src/libslic3r/PrintConfig.cpp:566 msgid "Keep fan always on" msgstr "항상 팬 켜기" -#: src/libslic3r/PrintConfig.cpp:549 +#: src/libslic3r/PrintConfig.cpp:567 msgid "" "If this is enabled, fan will never be disabled and will be kept running at " "least at its minimum speed. Useful for PLA, harmful for ABS." @@ -6232,11 +7495,11 @@ msgstr "" "이 기능을 사용하면 팬이 비활성화되지 않으며 최소한 최소 속도로 계속 회전합니" "다. PLA에 유용하며 ABS에 해롭다." -#: src/libslic3r/PrintConfig.cpp:554 +#: src/libslic3r/PrintConfig.cpp:572 msgid "Enable fan if layer print time is below" msgstr "레이어 인쇄 시간이 미만인 경우 팬 활성화" -#: src/libslic3r/PrintConfig.cpp:555 +#: src/libslic3r/PrintConfig.cpp:573 msgid "" "If layer print time is estimated below this number of seconds, fan will be " "enabled and its speed will be calculated by interpolating the minimum and " @@ -6245,27 +7508,23 @@ msgstr "" "레이어 인쇄 시간이이 초 미만으로 예상되는 경우 팬이 활성화되고 속도는 최소 " "및 최대 속도를 보간하여 계산됩니다." -#: src/libslic3r/PrintConfig.cpp:557 src/libslic3r/PrintConfig.cpp:1687 +#: src/libslic3r/PrintConfig.cpp:575 src/libslic3r/PrintConfig.cpp:1717 msgid "approximate seconds" msgstr "근사치 초" -#: src/libslic3r/PrintConfig.cpp:565 -msgid "Color" -msgstr "색상" - -#: src/libslic3r/PrintConfig.cpp:571 +#: src/libslic3r/PrintConfig.cpp:589 msgid "Filament notes" msgstr "필라멘트 메모" -#: src/libslic3r/PrintConfig.cpp:572 +#: src/libslic3r/PrintConfig.cpp:590 msgid "You can put your notes regarding the filament here." msgstr "여기에 필라멘트에 관한 메모를 넣을 수 있다." -#: src/libslic3r/PrintConfig.cpp:580 src/libslic3r/PrintConfig.cpp:1231 +#: src/libslic3r/PrintConfig.cpp:598 src/libslic3r/PrintConfig.cpp:1256 msgid "Max volumetric speed" msgstr "최대 체적 속도" -#: src/libslic3r/PrintConfig.cpp:581 +#: src/libslic3r/PrintConfig.cpp:599 msgid "" "Maximum volumetric speed allowed for this filament. Limits the maximum " "volumetric speed of a print to the minimum of print and filament volumetric " @@ -6274,27 +7533,27 @@ msgstr "" "이 필라멘트에 허용되는 최대 체적 속도. 인쇄물의 최대 체적 속도를 인쇄 및 필라" "멘트 체적 속도 최소로 제한한다. 제한 없음에 대해 0으로 설정하십시오." -#: src/libslic3r/PrintConfig.cpp:590 +#: src/libslic3r/PrintConfig.cpp:608 msgid "Loading speed" msgstr "로딩 속도" -#: src/libslic3r/PrintConfig.cpp:591 +#: src/libslic3r/PrintConfig.cpp:609 msgid "Speed used for loading the filament on the wipe tower." -msgstr "와이퍼 탑(wipe)에 필라멘트를 장착하는 데 사용되는 속도. " +msgstr "와이퍼 타워(wipe)에 필라멘트를 장착하는 데 사용되는 속도. " -#: src/libslic3r/PrintConfig.cpp:598 +#: src/libslic3r/PrintConfig.cpp:616 msgid "Loading speed at the start" msgstr "시작시 로딩 속도" -#: src/libslic3r/PrintConfig.cpp:599 +#: src/libslic3r/PrintConfig.cpp:617 msgid "Speed used at the very beginning of loading phase." msgstr "로딩 단계의 시작에 사용 되는 속도." -#: src/libslic3r/PrintConfig.cpp:606 +#: src/libslic3r/PrintConfig.cpp:624 msgid "Unloading speed" msgstr "언로딩 스피드" -#: src/libslic3r/PrintConfig.cpp:607 +#: src/libslic3r/PrintConfig.cpp:625 msgid "" "Speed used for unloading the filament on the wipe tower (does not affect " "initial part of unloading just after ramming)." @@ -6302,20 +7561,20 @@ msgstr "" "와이퍼 타워에서 필라멘트를 언로드하는 데 사용되는 속도(램핑 후 바로 언로딩의 " "초기 부분에는 영향을 주지 않음)." -#: src/libslic3r/PrintConfig.cpp:615 +#: src/libslic3r/PrintConfig.cpp:633 msgid "Unloading speed at the start" msgstr "시작 시 언로드 속도" -#: src/libslic3r/PrintConfig.cpp:616 +#: src/libslic3r/PrintConfig.cpp:634 msgid "" "Speed used for unloading the tip of the filament immediately after ramming." msgstr "속도는 램 밍 직후 필 라 멘 트의 팁을 언로딩 하는 데 사용 됩니다." -#: src/libslic3r/PrintConfig.cpp:623 +#: src/libslic3r/PrintConfig.cpp:641 msgid "Delay after unloading" msgstr "언로드 후 딜레이" -#: src/libslic3r/PrintConfig.cpp:624 +#: src/libslic3r/PrintConfig.cpp:642 msgid "" "Time to wait after the filament is unloaded. May help to get reliable " "toolchanges with flexible materials that may need more time to shrink to " @@ -6324,11 +7583,11 @@ msgstr "" "필라멘트를 내린 후 기다리는 시간. 원래 치수로 축소하는 데, 더 많은 시간이 필" "요할 수 있는 유연한 재료로 신뢰할 수있는 공구 교환을 얻을 수 있습니다." -#: src/libslic3r/PrintConfig.cpp:633 +#: src/libslic3r/PrintConfig.cpp:651 msgid "Number of cooling moves" msgstr "쿨링 이동 숫자" -#: src/libslic3r/PrintConfig.cpp:634 +#: src/libslic3r/PrintConfig.cpp:652 msgid "" "Filament is cooled by being moved back and forth in the cooling tubes. " "Specify desired number of these moves." @@ -6336,19 +7595,19 @@ msgstr "" "필라멘트는 쿨링 튜브에서 앞뒤로 이동 하여 냉각 됩니다. 이러한 이동의 원하는 " "값을 지정 합니다." -#: src/libslic3r/PrintConfig.cpp:642 +#: src/libslic3r/PrintConfig.cpp:660 msgid "Speed of the first cooling move" msgstr "첫 번째 냉각 이동 속도" -#: src/libslic3r/PrintConfig.cpp:643 +#: src/libslic3r/PrintConfig.cpp:661 msgid "Cooling moves are gradually accelerating beginning at this speed." msgstr "냉각 속도가 서서히 빨라지고 있습니다." -#: src/libslic3r/PrintConfig.cpp:650 +#: src/libslic3r/PrintConfig.cpp:668 msgid "Minimal purge on wipe tower" msgstr "와이프(wipe) 탑의 최소 퍼지" -#: src/libslic3r/PrintConfig.cpp:651 +#: src/libslic3r/PrintConfig.cpp:669 msgid "" "After a tool change, the exact position of the newly loaded filament inside " "the nozzle may not be known, and the filament pressure is likely not yet " @@ -6358,27 +7617,27 @@ msgid "" msgstr "" "공구가 변경 된 후 노즐 내부에 새로 로드 된 필라멘트의 정확한 위치를 알 수 없" "으며, 필라멘트 압력이 아직 안정적이지 않을 수 있습니다. 프린트 헤드를 인필 또" -"는 희생(sacrificial) 객체로 소거 하기 전에 Slic3r는 항상이 양의 재료를 와이" -"프 탑에 넣어 연속적인 채우기 또는 희생(sacrificial) 객체 돌출을 안정적으로 생" -"성 합니다." +"는 희생(sacrificial) 객체(object)로 소거 하기 전에 Slic3r는 항상이 양의 재료" +"를 와이프 탑에 넣어 연속적인 채우기 또는 희생(sacrificial) 객체(object) 돌출" +"을 안정적으로 생성 합니다." -#: src/libslic3r/PrintConfig.cpp:655 +#: src/libslic3r/PrintConfig.cpp:673 msgid "mm³" msgstr "mm ³" -#: src/libslic3r/PrintConfig.cpp:661 +#: src/libslic3r/PrintConfig.cpp:679 msgid "Speed of the last cooling move" msgstr "마지막 냉각 이동 속도" -#: src/libslic3r/PrintConfig.cpp:662 +#: src/libslic3r/PrintConfig.cpp:680 msgid "Cooling moves are gradually accelerating towards this speed." msgstr "냉각은 이 속도쪽으로 점차 가속화되고 있습니다. " -#: src/libslic3r/PrintConfig.cpp:669 +#: src/libslic3r/PrintConfig.cpp:687 msgid "Filament load time" msgstr "필라멘트 로드 시간" -#: src/libslic3r/PrintConfig.cpp:670 +#: src/libslic3r/PrintConfig.cpp:688 msgid "" "Time for the printer firmware (or the Multi Material Unit 2.0) to load a new " "filament during a tool change (when executing the T code). This time is " @@ -6388,22 +7647,22 @@ msgstr "" "라멘트를 로드하는 시간입니다. 이 시간은 G 코드 시간 추정기에 의해 총 인쇄 시" "간에 추가 됩니다." -#: src/libslic3r/PrintConfig.cpp:677 +#: src/libslic3r/PrintConfig.cpp:695 msgid "Ramming parameters" msgstr "래밍 파라미터" -#: src/libslic3r/PrintConfig.cpp:678 +#: src/libslic3r/PrintConfig.cpp:696 msgid "" "This string is edited by RammingDialog and contains ramming specific " "parameters." msgstr "" "이 문자열은 RammingDialog에 의해 편집되고 래밍 특정 매개 변수를 포함합니다." -#: src/libslic3r/PrintConfig.cpp:684 +#: src/libslic3r/PrintConfig.cpp:702 msgid "Filament unload time" msgstr "필라멘트 언로드 시간" -#: src/libslic3r/PrintConfig.cpp:685 +#: src/libslic3r/PrintConfig.cpp:703 msgid "" "Time for the printer firmware (or the Multi Material Unit 2.0) to unload a " "filament during a tool change (when executing the T code). This time is " @@ -6413,7 +7672,7 @@ msgstr "" "입니다 (T 코드를 실행할 때). 이 시간은 G 코드 시간추정기에 의해 총 인쇄 시간" "에 추가 됩니다." -#: src/libslic3r/PrintConfig.cpp:693 +#: src/libslic3r/PrintConfig.cpp:711 msgid "" "Enter your filament diameter here. Good precision is required, so use a " "caliper and do multiple measurements along the filament, then compute the " @@ -6422,11 +7681,12 @@ msgstr "" "여기에 필라멘트 직경을 입력하십시오. 정밀도가 필요하므로 캘리퍼를 사용하여 필" "라멘트를 따라 여러 번 측정 한 다음 평균을 계산하십시오." -#: src/libslic3r/PrintConfig.cpp:700 +#: src/libslic3r/PrintConfig.cpp:718 src/libslic3r/PrintConfig.cpp:2504 +#: src/libslic3r/PrintConfig.cpp:2505 msgid "Density" msgstr "밀도" -#: src/libslic3r/PrintConfig.cpp:701 +#: src/libslic3r/PrintConfig.cpp:719 msgid "" "Enter your filament density here. This is only for statistical information. " "A decent way is to weigh a known length of filament and compute the ratio of " @@ -6437,41 +7697,45 @@ msgstr "" "은 알려진 길이의 필라멘트의 무게를 측정하고 길이와 볼륨의 비율을 계산하는 것" "입니다. 변위를 통해 직접적으로 부피를 계산하는 것이 더 좋습니다." -#: src/libslic3r/PrintConfig.cpp:704 +#: src/libslic3r/PrintConfig.cpp:722 msgid "g/cm³" msgstr "g/cm³" -#: src/libslic3r/PrintConfig.cpp:709 +#: src/libslic3r/PrintConfig.cpp:727 msgid "Filament type" msgstr "필라멘트 타입" -#: src/libslic3r/PrintConfig.cpp:710 +#: src/libslic3r/PrintConfig.cpp:728 msgid "The filament material type for use in custom G-codes." msgstr "사용자 지정 G 코드에 사용할 필라멘트재료 유형입니다." -#: src/libslic3r/PrintConfig.cpp:736 +#: src/libslic3r/PrintConfig.cpp:755 msgid "Soluble material" msgstr "수용성 재료" -#: src/libslic3r/PrintConfig.cpp:737 +#: src/libslic3r/PrintConfig.cpp:756 msgid "Soluble material is most likely used for a soluble support." msgstr "수용성 재료눈 물에 녹는 서포트에 가장 많이 사용된다." -#: src/libslic3r/PrintConfig.cpp:743 +#: src/libslic3r/PrintConfig.cpp:762 msgid "" "Enter your filament cost per kg here. This is only for statistical " "information." msgstr "필라멘트(kg당) 비용을 여기에 입력하십시오. 통계를 내기 위해서 입니다." -#: src/libslic3r/PrintConfig.cpp:744 +#: src/libslic3r/PrintConfig.cpp:763 msgid "money/kg" msgstr "원(\\)/kg" -#: src/libslic3r/PrintConfig.cpp:753 +#: src/libslic3r/PrintConfig.cpp:772 src/libslic3r/PrintConfig.cpp:2588 +msgid "(Unknown)" +msgstr "(알 수 없음)" + +#: src/libslic3r/PrintConfig.cpp:776 msgid "Fill angle" msgstr "채움 각도" -#: src/libslic3r/PrintConfig.cpp:755 +#: src/libslic3r/PrintConfig.cpp:778 msgid "" "Default base angle for infill orientation. Cross-hatching will be applied to " "this. Bridges will be infilled using the best direction Slic3r can detect, " @@ -6481,60 +7745,60 @@ msgstr "" "지 할 수있는 최상의 방향을 사용하여 브릿징이 채워지므로이 설정은 영향을 미치" "지 않습니다." -#: src/libslic3r/PrintConfig.cpp:767 +#: src/libslic3r/PrintConfig.cpp:790 msgid "Fill density" msgstr "채우기(fill) 밀도" -#: src/libslic3r/PrintConfig.cpp:769 +#: src/libslic3r/PrintConfig.cpp:792 msgid "Density of internal infill, expressed in the range 0% - 100%." msgstr "0 % - 100 % 범위로 표현 된 내부 채움(infill)의 밀도." -#: src/libslic3r/PrintConfig.cpp:804 +#: src/libslic3r/PrintConfig.cpp:827 msgid "Fill pattern" msgstr "채우기(fill) 패턴" -#: src/libslic3r/PrintConfig.cpp:806 +#: src/libslic3r/PrintConfig.cpp:829 msgid "Fill pattern for general low-density infill." msgstr "일반 낮은 밀도 채움의 패턴." -#: src/libslic3r/PrintConfig.cpp:822 +#: src/libslic3r/PrintConfig.cpp:845 msgid "Grid" msgstr "그리드(Grid)" -#: src/libslic3r/PrintConfig.cpp:823 +#: src/libslic3r/PrintConfig.cpp:846 msgid "Triangles" msgstr "삼각형(Triangles)" -#: src/libslic3r/PrintConfig.cpp:824 +#: src/libslic3r/PrintConfig.cpp:847 msgid "Stars" msgstr "별(Stars)" -#: src/libslic3r/PrintConfig.cpp:825 +#: src/libslic3r/PrintConfig.cpp:848 msgid "Cubic" msgstr "큐빅" -#: src/libslic3r/PrintConfig.cpp:826 +#: src/libslic3r/PrintConfig.cpp:849 msgid "Line" msgstr "선(Line)" -#: src/libslic3r/PrintConfig.cpp:828 src/libslic3r/PrintConfig.cpp:1974 +#: src/libslic3r/PrintConfig.cpp:851 src/libslic3r/PrintConfig.cpp:2021 msgid "Honeycomb" msgstr "벌집" -#: src/libslic3r/PrintConfig.cpp:829 +#: src/libslic3r/PrintConfig.cpp:852 msgid "3D Honeycomb" msgstr "3D 벌집" -#: src/libslic3r/PrintConfig.cpp:830 +#: src/libslic3r/PrintConfig.cpp:853 msgid "Gyroid" msgstr "자이로이드(Gyroid)" -#: src/libslic3r/PrintConfig.cpp:837 src/libslic3r/PrintConfig.cpp:846 -#: src/libslic3r/PrintConfig.cpp:854 src/libslic3r/PrintConfig.cpp:887 +#: src/libslic3r/PrintConfig.cpp:860 src/libslic3r/PrintConfig.cpp:869 +#: src/libslic3r/PrintConfig.cpp:877 src/libslic3r/PrintConfig.cpp:911 msgid "First layer" msgstr "첫 레이어" -#: src/libslic3r/PrintConfig.cpp:838 +#: src/libslic3r/PrintConfig.cpp:861 msgid "" "This is the acceleration your printer will use for first layer. Set zero to " "disable acceleration control for first layer." @@ -6542,7 +7806,7 @@ msgstr "" "이것은 프린터가 첫 번째 레이어에 사용할 가속도입니다. 0을 설정하면 첫 번째 레" "이어에 대한 가속 제어가 사용되지 않습니다." -#: src/libslic3r/PrintConfig.cpp:847 +#: src/libslic3r/PrintConfig.cpp:870 msgid "" "Heated build plate temperature for the first layer. Set this to zero to " "disable bed temperature control commands in the output." @@ -6550,7 +7814,7 @@ msgstr "" "첫 번째 레이어에 대한 빌드 플레이트 온도를 가열. 이 값을 0으로 설정하면 출력" "에서 ​​베드 온도 제어 명령을 비활성화합니다." -#: src/libslic3r/PrintConfig.cpp:856 +#: src/libslic3r/PrintConfig.cpp:879 msgid "" "Set this to a non-zero value to set a manual extrusion width for first " "layer. You can use this to force fatter extrudates for better adhesion. If " @@ -6562,7 +7826,7 @@ msgstr "" "수 있습니다. 백분율 (예 : 120 %)로 표현하면 첫 번째 레이어 높이를 기준으로 계" "산됩니다. 0으로 설정하면 기본 압출 폭이 사용됩니다." -#: src/libslic3r/PrintConfig.cpp:868 +#: src/libslic3r/PrintConfig.cpp:892 msgid "" "When printing with very low layer heights, you might still want to print a " "thicker bottom layer to improve adhesion and tolerance for non perfect build " @@ -6574,11 +7838,11 @@ msgstr "" "다. 이것은 절대값 또는 기본 계층 높이에 대한 백분율(예: 150%)로 표시할 수 있" "다." -#: src/libslic3r/PrintConfig.cpp:877 +#: src/libslic3r/PrintConfig.cpp:901 msgid "First layer speed" msgstr "첫 레이어 속도" -#: src/libslic3r/PrintConfig.cpp:878 +#: src/libslic3r/PrintConfig.cpp:902 msgid "" "If expressed as absolute value in mm/s, this speed will be applied to all " "the print moves of the first layer, regardless of their type. If expressed " @@ -6588,7 +7852,7 @@ msgstr "" "인쇄 이동에 적용된다. 백분율(예: 40%)로 표현되는 경우 기본 속도를 스케일링한" "다." -#: src/libslic3r/PrintConfig.cpp:888 +#: src/libslic3r/PrintConfig.cpp:912 msgid "" "Extruder temperature for first layer. If you want to control temperature " "manually during print, set this to zero to disable temperature control " @@ -6597,7 +7861,7 @@ msgstr "" "첫 번째 층의 외부 온도. 인쇄 중에 온도를 수동으로 제어하려면 출력 파일에서 온" "도 제어 명령을 사용하지 않으려면 이 값을 0으로 설정하십시오." -#: src/libslic3r/PrintConfig.cpp:897 +#: src/libslic3r/PrintConfig.cpp:921 msgid "" "Speed for filling small gaps using short zigzag moves. Keep this reasonably " "low to avoid too much shaking and resonance issues. Set zero to disable gaps " @@ -6607,11 +7871,11 @@ msgstr "" "기 위해 이것을 합리적으로 낮게 유지한다. 간격 채우기를 사용하지 않으려면 0을 " "설정하십시오." -#: src/libslic3r/PrintConfig.cpp:905 +#: src/libslic3r/PrintConfig.cpp:929 msgid "Verbose G-code" -msgstr "세부 G-코드" +msgstr "세부 G-code" -#: src/libslic3r/PrintConfig.cpp:906 +#: src/libslic3r/PrintConfig.cpp:930 msgid "" "Enable this to get a commented G-code file, with each line explained by a " "descriptive text. If you print from SD card, the additional weight of the " @@ -6621,46 +7885,46 @@ msgstr "" "을 선택하십시오. 만일 당신이 SD카드로 인쇄한다면, 파일의 추가 무게로 인해 펌" "웨어의 속도가 느려질 수 있다." -#: src/libslic3r/PrintConfig.cpp:913 +#: src/libslic3r/PrintConfig.cpp:937 msgid "G-code flavor" msgstr "G-code 형식" -#: src/libslic3r/PrintConfig.cpp:914 +#: src/libslic3r/PrintConfig.cpp:938 msgid "" "Some G/M-code commands, including temperature control and others, are not " "universal. Set this option to your printer's firmware to get a compatible " -"output. The \"No extrusion\" flavor prevents Slic3r from exporting any " +"output. The \"No extrusion\" flavor prevents PrusaSlicer from exporting any " "extrusion value at all." msgstr "" -"온도 조절 등을 포함한 일부 G/M-코드 명령은 보편적이지 않습니다. 호환되는 출력" -"을 얻으려면 보드에 적제된 프린터의 펌웨어로 설정하십시오. \"압출 없음\" 형식" -"은 Slic3r가 어떠한 압출 값도 출력하지 못하게 합니다." +"온도 제어 및 기타 를 포함한 일부 G/M 코드 명령은 범용이 아닙니다. 호환되는 출" +"력을 얻으려면 프린터의 펌웨어로 이 옵션을 설정합니다. \"돌출 없음\" 맛은 " +"PrusaSlicer가 압출 값을 전혀 내보내지 못하게 합니다." -#: src/libslic3r/PrintConfig.cpp:937 +#: src/libslic3r/PrintConfig.cpp:961 msgid "No extrusion" msgstr "압출 없음" -#: src/libslic3r/PrintConfig.cpp:942 +#: src/libslic3r/PrintConfig.cpp:966 msgid "Label objects" -msgstr "레이블 개체" +msgstr "레이블 객체(object)" -#: src/libslic3r/PrintConfig.cpp:943 +#: src/libslic3r/PrintConfig.cpp:967 msgid "" "Enable this to add comments into the G-Code labeling print moves with what " "object they belong to, which is useful for the Octoprint CancelObject " "plugin. This settings is NOT compatible with Single Extruder Multi Material " "setup and Wipe into Object / Wipe into Infill." msgstr "" -"이 기능을 사용 하 여 G 코드 레이블 인쇄에 주석이 속해 있는 객체와 함께 이동 " -"하 여 주석을 추가할 수 있으며,이는 옥 토 프린트 캔 커 작업 플러그인에 유용 합" -"니다. 이 설정은 단일 압출 기 다중 재료 설정과 호환 되지 않으며 객체를 닦아 " -"내 고 채우기로 닦습니다." +"이 기능을 사용 하 여 G 코드 레이블 인쇄에 주석이 속해 있는 객체(object)와 함" +"께 이동 하 여 주석을 추가할 수 있으며,이는 옥 토 프린트 캔 커 작업 플러그인" +"에 유용 합니다. 이 설정은 단일 압출 기 다중 재료 설정과 호환 되지 않으며 객체" +"(object)를 닦아 내 고 채우기로 닦습니다." -#: src/libslic3r/PrintConfig.cpp:950 +#: src/libslic3r/PrintConfig.cpp:974 msgid "High extruder current on filament swap" msgstr "필라멘트스왑에 높은 압출 기 전류" -#: src/libslic3r/PrintConfig.cpp:951 +#: src/libslic3r/PrintConfig.cpp:975 msgid "" "It may be beneficial to increase the extruder motor current during the " "filament exchange sequence to allow for rapid ramming feed rates and to " @@ -6670,7 +7934,7 @@ msgstr "" "는 빠른 래밍 공급 속도를 가능 하게하고, 불규칙한 모양의 필라멘트를 로딩할때 " "저항을 극복하기 위한것이다." -#: src/libslic3r/PrintConfig.cpp:959 +#: src/libslic3r/PrintConfig.cpp:983 msgid "" "This is the acceleration your printer will use for infill. Set zero to " "disable acceleration control for infill." @@ -6678,11 +7942,11 @@ msgstr "" "이것은 당신 프린터의 채움 가속력이다. 주입에 대한 가속 제어를 비활성화하려면 " "0을 설정하십시오." -#: src/libslic3r/PrintConfig.cpp:967 +#: src/libslic3r/PrintConfig.cpp:991 msgid "Combine infill every" -msgstr "다음 시간마다 결합" +msgstr "다음 레이어마다 결합" -#: src/libslic3r/PrintConfig.cpp:969 +#: src/libslic3r/PrintConfig.cpp:993 msgid "" "This feature allows to combine infill and speed up your print by extruding " "thicker infill layers while preserving thin perimeters, thus accuracy." @@ -6690,19 +7954,19 @@ msgstr "" "이 기능은 인필을 결합하고 얇은 주변기기를 보존하면서 두꺼운 인필 층을 압출하" "여 인쇄 속도를 높일 수 있도록 하여 정확도를 높인다." -#: src/libslic3r/PrintConfig.cpp:972 +#: src/libslic3r/PrintConfig.cpp:996 msgid "Combine infill every n layers" msgstr "모든 n개 층을 채우기 위해 결합" -#: src/libslic3r/PrintConfig.cpp:978 +#: src/libslic3r/PrintConfig.cpp:1002 msgid "Infill extruder" msgstr "채움(Infill) 익스트루더" -#: src/libslic3r/PrintConfig.cpp:980 +#: src/libslic3r/PrintConfig.cpp:1004 msgid "The extruder to use when printing infill." msgstr "채움으로 사용할 익스트루더." -#: src/libslic3r/PrintConfig.cpp:988 +#: src/libslic3r/PrintConfig.cpp:1012 msgid "" "Set this to a non-zero value to set a manual extrusion width for infill. If " "left zero, default extrusion width will be used if set, otherwise 1.125 x " @@ -6712,25 +7976,25 @@ msgid "" msgstr "" "채움에 수동 압출 폭을 설정하려면이 값을 0이 아닌 값으로 설정합니다. 0으로 설" "정하면 설정된 경우 기본 압출 폭이 사용되고 그렇지 않으면 1.125 x 노즐 직경이 " -"사용됩니다. 채움 속도를 높이고 부품을 더 강하게 만들려면보다 큰 압출 성형물" -"을 사용하는 것이 좋습니다. 백분율 (예 : 90 %)로 표현하면 레이어 높이를 기준으" -"로 계산됩니다." +"사용됩니다. 채움 속도를 높이고 부품(Part)을 더 강하게 만들려면보다 큰 압출 성" +"형물을 사용하는 것이 좋습니다. 백분율 (예 : 90 %)로 표현하면 레이어 높이를 기" +"준으로 계산됩니다." -#: src/libslic3r/PrintConfig.cpp:997 +#: src/libslic3r/PrintConfig.cpp:1022 msgid "Infill before perimeters" msgstr "둘레보다 앞쪽에 채움" -#: src/libslic3r/PrintConfig.cpp:998 +#: src/libslic3r/PrintConfig.cpp:1023 msgid "" "This option will switch the print order of perimeters and infill, making the " "latter first." msgstr "이 옵션은 외부출력과 채움 인쇄 순서를 바꾸어, 후자를 먼저 만든다." -#: src/libslic3r/PrintConfig.cpp:1003 +#: src/libslic3r/PrintConfig.cpp:1028 msgid "Only infill where needed" -msgstr "필요한 경우 채음" +msgstr "필요한 경우 채움" -#: src/libslic3r/PrintConfig.cpp:1005 +#: src/libslic3r/PrintConfig.cpp:1030 msgid "" "This option will limit infill to the areas actually needed for supporting " "ceilings (it will act as internal support material). If enabled, slows down " @@ -6740,11 +8004,11 @@ msgstr "" "을 할 것이다). 활성화된 경우 관련된 여러 번의 점검으로 인해 G-code 생성 속도" "를 늦춰라." -#: src/libslic3r/PrintConfig.cpp:1012 +#: src/libslic3r/PrintConfig.cpp:1037 msgid "Infill/perimeters overlap" msgstr "채움/둘레 겹침(perimeters overlap)" -#: src/libslic3r/PrintConfig.cpp:1014 +#: src/libslic3r/PrintConfig.cpp:1039 msgid "" "This setting applies an additional overlap between infill and perimeters for " "better bonding. Theoretically this shouldn't be needed, but backlash might " @@ -6755,23 +8019,23 @@ msgstr "" "론적으로 이것은 필요하지 않아야하지만 백래시가 갭을 유발할 수 있습니다. 백분" "율 (예 : 15 %)로 표시되는 경우 경계 압출 폭을 기준으로 계산됩니다." -#: src/libslic3r/PrintConfig.cpp:1025 +#: src/libslic3r/PrintConfig.cpp:1050 msgid "Speed for printing the internal fill. Set to zero for auto." msgstr "내부 채우기 인쇄 속도. 자동으로 0으로 설정하십시오." -#: src/libslic3r/PrintConfig.cpp:1033 +#: src/libslic3r/PrintConfig.cpp:1058 msgid "Inherits profile" msgstr "프로필 상속" -#: src/libslic3r/PrintConfig.cpp:1034 +#: src/libslic3r/PrintConfig.cpp:1059 msgid "Name of the profile, from which this profile inherits." msgstr "이 프로파일이 상속되는 프로파일의 이름." -#: src/libslic3r/PrintConfig.cpp:1047 +#: src/libslic3r/PrintConfig.cpp:1072 msgid "Interface shells" -msgstr "인터페이스 셸(shells)" +msgstr "접점 셸(shells)" -#: src/libslic3r/PrintConfig.cpp:1048 +#: src/libslic3r/PrintConfig.cpp:1073 msgid "" "Force the generation of solid shells between adjacent materials/volumes. " "Useful for multi-extruder prints with translucent materials or manual " @@ -6780,7 +8044,7 @@ msgstr "" "인접 재료/볼륨 사이에 고체 쉘 생성을 강제하십시오. 반투명 재료 또는 수동 수용" "성 서포트 재료를 사용한 다중 압ㅊ기 인쇄에 유용함." -#: src/libslic3r/PrintConfig.cpp:1057 +#: src/libslic3r/PrintConfig.cpp:1082 msgid "" "This custom code is inserted at every layer change, right after the Z move " "and before the extruder moves to the first layer point. Note that you can " @@ -6792,11 +8056,11 @@ msgstr "" "[layer_num] 및 [layer_z]에 자리 표시자 변수를 사용할 수 있다는 점에 유의하십" "시오." -#: src/libslic3r/PrintConfig.cpp:1068 +#: src/libslic3r/PrintConfig.cpp:1093 msgid "Supports remaining times" msgstr "남은 시간 지원" -#: src/libslic3r/PrintConfig.cpp:1069 +#: src/libslic3r/PrintConfig.cpp:1094 msgid "" "Emit M73 P[percent printed] R[remaining time in minutes] at 1 minute " "intervals into the G-code to let the firmware show accurate remaining time. " @@ -6808,168 +8072,168 @@ msgstr "" "웨어는 M73를 인식 하 고 있습니다. 또한 i3 MK3 펌웨어는 자동 모드에서 M73 Qxx " "Sxx를 지원 합니다." -#: src/libslic3r/PrintConfig.cpp:1077 +#: src/libslic3r/PrintConfig.cpp:1102 msgid "Supports stealth mode" msgstr "자동 모드 지원" -#: src/libslic3r/PrintConfig.cpp:1078 +#: src/libslic3r/PrintConfig.cpp:1103 msgid "The firmware supports stealth mode" msgstr "펌웨어는 스텔스 모드를 지원 합니다" -#: src/libslic3r/PrintConfig.cpp:1102 +#: src/libslic3r/PrintConfig.cpp:1127 msgid "Maximum feedrate X" msgstr "최대 이송 속도 X" -#: src/libslic3r/PrintConfig.cpp:1103 +#: src/libslic3r/PrintConfig.cpp:1128 msgid "Maximum feedrate Y" msgstr "최대 이송 속도 Y" -#: src/libslic3r/PrintConfig.cpp:1104 +#: src/libslic3r/PrintConfig.cpp:1129 msgid "Maximum feedrate Z" msgstr "최대 이송 속도 Z" -#: src/libslic3r/PrintConfig.cpp:1105 +#: src/libslic3r/PrintConfig.cpp:1130 msgid "Maximum feedrate E" msgstr "최대 이송 속도 E" -#: src/libslic3r/PrintConfig.cpp:1108 +#: src/libslic3r/PrintConfig.cpp:1133 msgid "Maximum feedrate of the X axis" msgstr "X 축의 최대 이송 속도" -#: src/libslic3r/PrintConfig.cpp:1109 +#: src/libslic3r/PrintConfig.cpp:1134 msgid "Maximum feedrate of the Y axis" msgstr "Y 축의 최대 이송 속도" -#: src/libslic3r/PrintConfig.cpp:1110 +#: src/libslic3r/PrintConfig.cpp:1135 msgid "Maximum feedrate of the Z axis" msgstr "Z 축의 최대 이송 속도" -#: src/libslic3r/PrintConfig.cpp:1111 +#: src/libslic3r/PrintConfig.cpp:1136 msgid "Maximum feedrate of the E axis" msgstr "E 축의 최대 이송 속도" -#: src/libslic3r/PrintConfig.cpp:1120 +#: src/libslic3r/PrintConfig.cpp:1145 msgid "Maximum acceleration X" msgstr "최대 가속도 X" -#: src/libslic3r/PrintConfig.cpp:1121 +#: src/libslic3r/PrintConfig.cpp:1146 msgid "Maximum acceleration Y" msgstr "최대 가속도 Y" -#: src/libslic3r/PrintConfig.cpp:1122 +#: src/libslic3r/PrintConfig.cpp:1147 msgid "Maximum acceleration Z" msgstr "최대 가속 Z" -#: src/libslic3r/PrintConfig.cpp:1123 +#: src/libslic3r/PrintConfig.cpp:1148 msgid "Maximum acceleration E" msgstr "최대 가속 E" -#: src/libslic3r/PrintConfig.cpp:1126 +#: src/libslic3r/PrintConfig.cpp:1151 msgid "Maximum acceleration of the X axis" msgstr "X 축의 최대 가속도" -#: src/libslic3r/PrintConfig.cpp:1127 +#: src/libslic3r/PrintConfig.cpp:1152 msgid "Maximum acceleration of the Y axis" msgstr "Y 축의 최대 가속도" -#: src/libslic3r/PrintConfig.cpp:1128 +#: src/libslic3r/PrintConfig.cpp:1153 msgid "Maximum acceleration of the Z axis" msgstr "Z 축의 최대 가속도" -#: src/libslic3r/PrintConfig.cpp:1129 +#: src/libslic3r/PrintConfig.cpp:1154 msgid "Maximum acceleration of the E axis" msgstr "E 축의 최대 가속도" -#: src/libslic3r/PrintConfig.cpp:1138 +#: src/libslic3r/PrintConfig.cpp:1163 msgid "Maximum jerk X" msgstr "최대 저크(jerk) X" -#: src/libslic3r/PrintConfig.cpp:1139 +#: src/libslic3r/PrintConfig.cpp:1164 msgid "Maximum jerk Y" msgstr "최대 저크(jerk) Y" -#: src/libslic3r/PrintConfig.cpp:1140 +#: src/libslic3r/PrintConfig.cpp:1165 msgid "Maximum jerk Z" msgstr "최대 저크(jerk) Z" -#: src/libslic3r/PrintConfig.cpp:1141 +#: src/libslic3r/PrintConfig.cpp:1166 msgid "Maximum jerk E" msgstr "최대 저크(jerk) E" -#: src/libslic3r/PrintConfig.cpp:1144 +#: src/libslic3r/PrintConfig.cpp:1169 msgid "Maximum jerk of the X axis" msgstr "X축 최대 저크(jerk)" -#: src/libslic3r/PrintConfig.cpp:1145 +#: src/libslic3r/PrintConfig.cpp:1170 msgid "Maximum jerk of the Y axis" msgstr "Y축 최대 저크는(jerk)" -#: src/libslic3r/PrintConfig.cpp:1146 +#: src/libslic3r/PrintConfig.cpp:1171 msgid "Maximum jerk of the Z axis" msgstr "Z축 최대 저크(jerk)" -#: src/libslic3r/PrintConfig.cpp:1147 +#: src/libslic3r/PrintConfig.cpp:1172 msgid "Maximum jerk of the E axis" msgstr "E축 최대 저크(jerk)" -#: src/libslic3r/PrintConfig.cpp:1158 +#: src/libslic3r/PrintConfig.cpp:1183 msgid "Minimum feedrate when extruding" msgstr "압출시 최소 공급 속도" -#: src/libslic3r/PrintConfig.cpp:1160 +#: src/libslic3r/PrintConfig.cpp:1185 msgid "Minimum feedrate when extruding (M205 S)" msgstr "압출 시 최소 이송 속도 (M205 S)" -#: src/libslic3r/PrintConfig.cpp:1169 +#: src/libslic3r/PrintConfig.cpp:1194 msgid "Minimum travel feedrate" msgstr "최소 이송 속도" -#: src/libslic3r/PrintConfig.cpp:1171 +#: src/libslic3r/PrintConfig.cpp:1196 msgid "Minimum travel feedrate (M205 T)" msgstr "최소 이동 이송 속도 (M205 T)" -#: src/libslic3r/PrintConfig.cpp:1180 +#: src/libslic3r/PrintConfig.cpp:1205 msgid "Maximum acceleration when extruding" msgstr "압출시 최대 가속도" -#: src/libslic3r/PrintConfig.cpp:1182 +#: src/libslic3r/PrintConfig.cpp:1207 msgid "Maximum acceleration when extruding (M204 S)" msgstr "압출 시 최대 가속도 (M204 S)" -#: src/libslic3r/PrintConfig.cpp:1191 +#: src/libslic3r/PrintConfig.cpp:1216 msgid "Maximum acceleration when retracting" msgstr "리트렉션 최대 가속도" -#: src/libslic3r/PrintConfig.cpp:1193 +#: src/libslic3r/PrintConfig.cpp:1218 msgid "Maximum acceleration when retracting (M204 T)" msgstr "후퇴 시 최대 가속도 (M204 T)" -#: src/libslic3r/PrintConfig.cpp:1201 src/libslic3r/PrintConfig.cpp:1210 +#: src/libslic3r/PrintConfig.cpp:1226 src/libslic3r/PrintConfig.cpp:1235 msgid "Max" msgstr "최대" -#: src/libslic3r/PrintConfig.cpp:1202 +#: src/libslic3r/PrintConfig.cpp:1227 msgid "This setting represents the maximum speed of your fan." msgstr "이 설정은 팬의 최대 속도를 나타냅니다." -#: src/libslic3r/PrintConfig.cpp:1211 -#, c-format +#: src/libslic3r/PrintConfig.cpp:1236 +#, no-c-format msgid "" "This is the highest printable layer height for this extruder, used to cap " "the variable layer height and support layer height. Maximum recommended " "layer height is 75% of the extrusion width to achieve reasonable inter-layer " "adhesion. If set to 0, layer height is limited to 75% of the nozzle diameter." msgstr "" -"이것은이 익스트루더의 가장 높은 인쇄 가능 층 높이이며, 가변 층 높이 및 지지" +"이것은 이 익스트루더의 가장 높은 인쇄 가능 층 높이이며, 가변 층 높이 및 지지" "층 높이를 캡하는 데 사용됩니다. 합당한 층간 접착력을 얻기 위해 최대 권장 높이" "는 압출 폭의 75% of 입니다. 0으로 설정하면 층 높이가 노즐 지름의 75% of로 제" "한됩니다." -#: src/libslic3r/PrintConfig.cpp:1221 +#: src/libslic3r/PrintConfig.cpp:1246 msgid "Max print speed" msgstr "최대 프린트 속도" -#: src/libslic3r/PrintConfig.cpp:1222 +#: src/libslic3r/PrintConfig.cpp:1247 msgid "" "When setting other speed settings to 0 Slic3r will autocalculate the optimal " "speed in order to keep constant extruder pressure. This experimental setting " @@ -6979,18 +8243,18 @@ msgstr "" "의 속도를 자동 계산한다. 이 실험 설정은 허용할 최대 인쇄 속도를 설정하는 데 " "사용된다." -#: src/libslic3r/PrintConfig.cpp:1232 +#: src/libslic3r/PrintConfig.cpp:1257 msgid "" "This experimental setting is used to set the maximum volumetric speed your " "extruder supports." msgstr "" "이 실험 설정은 압출기가 지원하는 최대 체적 속도를 설정하기 위해 사용된다." -#: src/libslic3r/PrintConfig.cpp:1241 +#: src/libslic3r/PrintConfig.cpp:1266 msgid "Max volumetric slope positive" msgstr "최대 체적 기울기 양" -#: src/libslic3r/PrintConfig.cpp:1242 src/libslic3r/PrintConfig.cpp:1253 +#: src/libslic3r/PrintConfig.cpp:1267 src/libslic3r/PrintConfig.cpp:1278 msgid "" "This experimental setting is used to limit the speed of change in extrusion " "rate. A value of 1.8 mm³/s² ensures, that a change from the extrusion rate " @@ -7001,23 +8265,23 @@ msgstr "" "1.8mm3/s(0.45mm 압출 폭, 0.2mm 압출 높이, 공급 속도 20mm/s)에서 5.4mm3/s(공" "급 속도 60mm/s)로 변경하는 데 최소 2초 이상 걸린다." -#: src/libslic3r/PrintConfig.cpp:1246 src/libslic3r/PrintConfig.cpp:1257 +#: src/libslic3r/PrintConfig.cpp:1271 src/libslic3r/PrintConfig.cpp:1282 msgid "mm³/s²" msgstr "mm³/s²" -#: src/libslic3r/PrintConfig.cpp:1252 +#: src/libslic3r/PrintConfig.cpp:1277 msgid "Max volumetric slope negative" msgstr "최대 체적 기울기 음수" -#: src/libslic3r/PrintConfig.cpp:1264 src/libslic3r/PrintConfig.cpp:1273 +#: src/libslic3r/PrintConfig.cpp:1289 src/libslic3r/PrintConfig.cpp:1298 msgid "Min" msgstr "최소" -#: src/libslic3r/PrintConfig.cpp:1265 +#: src/libslic3r/PrintConfig.cpp:1290 msgid "This setting represents the minimum PWM your fan needs to work." msgstr "이 설정은 최소 PWM팬이 활동하는데 필요한를 나타냅니다." -#: src/libslic3r/PrintConfig.cpp:1274 +#: src/libslic3r/PrintConfig.cpp:1299 msgid "" "This is the lowest printable layer height for this extruder and limits the " "resolution for variable layer height. Typical values are between 0.05 mm and " @@ -7026,32 +8290,32 @@ msgstr "" "이것은 이 압출기에 대한 가장 낮은 인쇄 가능한 층 높이이고 가변 층 높이에 대" "한 분해능을 제한한다. 대표적인 값은 0.05mm와 0.1mm이다." -#: src/libslic3r/PrintConfig.cpp:1282 +#: src/libslic3r/PrintConfig.cpp:1307 msgid "Min print speed" msgstr "최소 인쇄 속도" -#: src/libslic3r/PrintConfig.cpp:1283 +#: src/libslic3r/PrintConfig.cpp:1308 msgid "Slic3r will not scale speed down below this speed." msgstr "Slic3r는 이 속도 이하로 속도를 낮추지 않을 것이다." -#: src/libslic3r/PrintConfig.cpp:1290 +#: src/libslic3r/PrintConfig.cpp:1315 msgid "Minimal filament extrusion length" msgstr "최소 필라멘트 압출 길이" -#: src/libslic3r/PrintConfig.cpp:1291 +#: src/libslic3r/PrintConfig.cpp:1316 msgid "" "Generate no less than the number of skirt loops required to consume the " "specified amount of filament on the bottom layer. For multi-extruder " "machines, this minimum applies to each extruder." msgstr "" "하단 레이어에서 지정된 양의 필라멘트를 사용하는 데 필요한 스커트 루프의 수 이" -"상으로 생성한다. 멀티 익스트루더의 경우, 이 최소값은 각 추가기기에 적용된다." +"상으로 생성한다. 다중 익스트루더의 경우, 이 최소값은 각 추가기기에 적용된다." -#: src/libslic3r/PrintConfig.cpp:1300 +#: src/libslic3r/PrintConfig.cpp:1325 msgid "Configuration notes" msgstr "구성 노트" -#: src/libslic3r/PrintConfig.cpp:1301 +#: src/libslic3r/PrintConfig.cpp:1326 msgid "" "You can put here your personal notes. This text will be added to the G-code " "header comments." @@ -7059,16 +8323,16 @@ msgstr "" "여기에 개인 노트를 넣을 수 있다. 이 텍스트는 G-code 헤더 코멘트에 추가될 것이" "다." -#: src/libslic3r/PrintConfig.cpp:1311 +#: src/libslic3r/PrintConfig.cpp:1336 msgid "" "This is the diameter of your extruder nozzle (for example: 0.5, 0.35 etc.)" -msgstr "이 지름은 엑스트루더 노즐의 직경이다(예: 0.5, 0.35 등)." +msgstr "이 지름은 익스트루더 노즐의 직경이다(예: 0.5, 0.35 등)." -#: src/libslic3r/PrintConfig.cpp:1316 +#: src/libslic3r/PrintConfig.cpp:1341 msgid "Host Type" msgstr "호스트 유형" -#: src/libslic3r/PrintConfig.cpp:1317 +#: src/libslic3r/PrintConfig.cpp:1342 msgid "" "Slic3r can upload G-code files to a printer host. This field must contain " "the kind of the host." @@ -7076,11 +8340,11 @@ msgstr "" "Slic3r는 프린터 호스트에 G 코드 파일을 업로드할 수 있습니다. 이 필드에는 호스" "트의 종류가 포함 되어야 합니다." -#: src/libslic3r/PrintConfig.cpp:1328 +#: src/libslic3r/PrintConfig.cpp:1357 msgid "Only retract when crossing perimeters" msgstr "둘레를 횡단 할 때만 수축" -#: src/libslic3r/PrintConfig.cpp:1329 +#: src/libslic3r/PrintConfig.cpp:1358 msgid "" "Disables retraction when the travel path does not exceed the upper layer's " "perimeters (and thus any ooze will be probably invisible)." @@ -7088,7 +8352,7 @@ msgstr "" "이동 경로가 상위 레이어의 경계를 초과하지 않는 경우 리트랙션을 비활성화합니" "다. 따라서 모든 오즈가 보이지 않습니다." -#: src/libslic3r/PrintConfig.cpp:1336 +#: src/libslic3r/PrintConfig.cpp:1365 msgid "" "This option will drop the temperature of the inactive extruders to prevent " "oozing. It will enable a tall skirt automatically and move extruders outside " @@ -7098,11 +8362,11 @@ msgstr "" "변경할 때 키가 큰 스커트를 자동으로 사용하고 스커트 외부로 압출기를 이동합니" "다." -#: src/libslic3r/PrintConfig.cpp:1343 +#: src/libslic3r/PrintConfig.cpp:1372 msgid "Output filename format" msgstr "출력 파일이름 형식" -#: src/libslic3r/PrintConfig.cpp:1344 +#: src/libslic3r/PrintConfig.cpp:1373 msgid "" "You can use all configuration options as variables inside this template. For " "example: [layer_height], [fill_density] etc. You can also use [timestamp], " @@ -7113,11 +8377,11 @@ msgstr "" "[layer_height], [fill_density] 등 또한 [타임 스탬프], [연도], [월], [일], [시" "간], [input_filename], [input_filename_base]을 사용할 수 있습니다." -#: src/libslic3r/PrintConfig.cpp:1353 +#: src/libslic3r/PrintConfig.cpp:1382 msgid "Detect bridging perimeters" msgstr "브릿 징 경계선 감지" -#: src/libslic3r/PrintConfig.cpp:1355 +#: src/libslic3r/PrintConfig.cpp:1384 msgid "" "Experimental option to adjust flow for overhangs (bridge flow will be used), " "to apply bridge speed to them and enable fan." @@ -7125,11 +8389,11 @@ msgstr "" "오버행에 대한 유량을 조정하는 실험 옵션 (브리지 흐름(flow)이 사용됨)에 브릿" "지 속도를 적용하고 팬을 활성화합니다." -#: src/libslic3r/PrintConfig.cpp:1361 +#: src/libslic3r/PrintConfig.cpp:1390 msgid "Filament parking position" msgstr "필라멘트 멈춤 위치" -#: src/libslic3r/PrintConfig.cpp:1362 +#: src/libslic3r/PrintConfig.cpp:1391 msgid "" "Distance of the extruder tip from the position where the filament is parked " "when unloaded. This should match the value in printer firmware." @@ -7137,11 +8401,11 @@ msgstr "" "언로딩시 필라멘트 위치에서 압출기 팁의 거리. 이 값은 프린터 펌웨어의 값과 일" "치해야합니다." -#: src/libslic3r/PrintConfig.cpp:1370 +#: src/libslic3r/PrintConfig.cpp:1399 msgid "Extra loading distance" msgstr "추가 로딩 거리" -#: src/libslic3r/PrintConfig.cpp:1371 +#: src/libslic3r/PrintConfig.cpp:1400 msgid "" "When set to zero, the distance the filament is moved from parking position " "during load is exactly the same as it was moved back during unload. When " @@ -7152,12 +8416,12 @@ msgstr "" "이동 한 거리와 동일합니다. 양수이면 음수가 더 많이 로드되고 로드가 음수 인 경" "우 언로드보다 짧습니다." -#: src/libslic3r/PrintConfig.cpp:1379 src/libslic3r/PrintConfig.cpp:1397 -#: src/libslic3r/PrintConfig.cpp:1409 src/libslic3r/PrintConfig.cpp:1419 +#: src/libslic3r/PrintConfig.cpp:1408 src/libslic3r/PrintConfig.cpp:1426 +#: src/libslic3r/PrintConfig.cpp:1439 src/libslic3r/PrintConfig.cpp:1449 msgid "Perimeters" msgstr "둘레" -#: src/libslic3r/PrintConfig.cpp:1380 +#: src/libslic3r/PrintConfig.cpp:1409 msgid "" "This is the acceleration your printer will use for perimeters. A high value " "like 9000 usually gives good results if your hardware is up to the job. Set " @@ -7167,17 +8431,17 @@ msgstr "" "작동하면 좋은 결과를 제공합니다. 주변을 가속 제어하지 않으려면 0으로 설정하십" "시오." -#: src/libslic3r/PrintConfig.cpp:1388 +#: src/libslic3r/PrintConfig.cpp:1417 msgid "Perimeter extruder" -msgstr "주변 익스트루더" +msgstr "가장자리(Perimeter) 익스트루더" -#: src/libslic3r/PrintConfig.cpp:1390 +#: src/libslic3r/PrintConfig.cpp:1419 msgid "" "The extruder to use when printing perimeters and brim. First extruder is 1." msgstr "" "둘레와 가장자리를 인쇄 할 때 사용할 압출기입니다. 첫 번째 압출기는 1입니다." -#: src/libslic3r/PrintConfig.cpp:1399 +#: src/libslic3r/PrintConfig.cpp:1428 msgid "" "Set this to a non-zero value to set a manual extrusion width for perimeters. " "You may want to use thinner extrudates to get more accurate surfaces. If " @@ -7191,12 +8455,12 @@ msgstr "" "직경이 사용됩니다. 백분율 (예 : 200 %)로 표현하면 레이어 높이를 기준으로 계산" "됩니다." -#: src/libslic3r/PrintConfig.cpp:1411 +#: src/libslic3r/PrintConfig.cpp:1441 msgid "" "Speed for perimeters (contours, aka vertical shells). Set to zero for auto." msgstr "둘레의 속도 (등고선, 일명 세로 셸). 자동으로 0으로 설정하십시오." -#: src/libslic3r/PrintConfig.cpp:1421 +#: src/libslic3r/PrintConfig.cpp:1451 msgid "" "This option sets the number of perimeters to generate for each layer. Note " "that Slic3r may increase this number automatically when it detects sloping " @@ -7207,11 +8471,11 @@ msgstr "" "사용하면 더 큰 주변 수를 사용하는 경사면을 감지 할 때 Slic3r이이 수를 자동으" "로 증가시킬 수 있습니다." -#: src/libslic3r/PrintConfig.cpp:1425 +#: src/libslic3r/PrintConfig.cpp:1455 msgid "(minimum)" msgstr "(최소)" -#: src/libslic3r/PrintConfig.cpp:1433 +#: src/libslic3r/PrintConfig.cpp:1463 msgid "" "If you want to process the output G-code through custom scripts, just list " "their absolute paths here. Separate multiple scripts with a semicolon. " @@ -7224,35 +8488,35 @@ msgstr "" "파일의 절대 경로를 첫 번째 인수로 전달되며 환경 변수를 읽음으로써 Slic3r 구" "성 설정에 액세스 할 수 있습니다." -#: src/libslic3r/PrintConfig.cpp:1445 +#: src/libslic3r/PrintConfig.cpp:1475 msgid "Printer type" msgstr "프린터 타입" -#: src/libslic3r/PrintConfig.cpp:1446 +#: src/libslic3r/PrintConfig.cpp:1476 msgid "Type of the printer." msgstr "프린터 유형." -#: src/libslic3r/PrintConfig.cpp:1451 +#: src/libslic3r/PrintConfig.cpp:1481 msgid "Printer notes" msgstr "프린터 노트" -#: src/libslic3r/PrintConfig.cpp:1452 +#: src/libslic3r/PrintConfig.cpp:1482 msgid "You can put your notes regarding the printer here." msgstr "프린터 관련 메모를 여기에 넣을 수 있습니다." -#: src/libslic3r/PrintConfig.cpp:1460 +#: src/libslic3r/PrintConfig.cpp:1490 msgid "Printer vendor" msgstr "제조 회사" -#: src/libslic3r/PrintConfig.cpp:1461 +#: src/libslic3r/PrintConfig.cpp:1491 msgid "Name of the printer vendor." msgstr "프린터 공급 업체의 이름입니다." -#: src/libslic3r/PrintConfig.cpp:1466 +#: src/libslic3r/PrintConfig.cpp:1496 msgid "Printer variant" msgstr "프린터 변형" -#: src/libslic3r/PrintConfig.cpp:1467 +#: src/libslic3r/PrintConfig.cpp:1497 msgid "" "Name of the printer variant. For example, the printer variants may be " "differentiated by a nozzle diameter." @@ -7260,22 +8524,22 @@ msgstr "" "프린터 변종 이름입니다. 예를 들어, 프린터 변형은 노즐 지름으로 구별 될 수 있" "습니다." -#: src/libslic3r/PrintConfig.cpp:1480 +#: src/libslic3r/PrintConfig.cpp:1510 msgid "Raft layers" msgstr "라프트(Raft) 레이어" -#: src/libslic3r/PrintConfig.cpp:1482 +#: src/libslic3r/PrintConfig.cpp:1512 msgid "" "The object will be raised by this number of layers, and support material " "will be generated under it." msgstr "" -"물체는 이 개수의 층에 의해 상승되며, 그 아래에서 서포트 재료가 생성될 것이다." +"개체는 이 개수의 층에 의해 상승되며, 그 아래에서 서포트 재료가 생성될 것이다." -#: src/libslic3r/PrintConfig.cpp:1490 +#: src/libslic3r/PrintConfig.cpp:1520 msgid "Resolution" -msgstr "해결" +msgstr "해상도" -#: src/libslic3r/PrintConfig.cpp:1491 +#: src/libslic3r/PrintConfig.cpp:1521 msgid "" "Minimum detail resolution, used to simplify the input file for speeding up " "the slicing job and reducing memory usage. High-resolution models often " @@ -7287,20 +8551,20 @@ msgstr "" "있는 것보다 더 많은 디테일을 가지고 있다. 단순화를 사용하지 않고 입력에서 전" "체 해상도를 사용하려면 0으로 설정하십시오." -#: src/libslic3r/PrintConfig.cpp:1501 +#: src/libslic3r/PrintConfig.cpp:1531 msgid "Minimum travel after retraction" msgstr "리트랙션 후 최소 이동 거리" -#: src/libslic3r/PrintConfig.cpp:1502 +#: src/libslic3r/PrintConfig.cpp:1532 msgid "" "Retraction is not triggered when travel moves are shorter than this length." msgstr "이동 거리가 이 길이보다 짧으면 리트렉션이 트리거되지 않습니다." -#: src/libslic3r/PrintConfig.cpp:1508 +#: src/libslic3r/PrintConfig.cpp:1538 msgid "Retract amount before wipe" msgstr "닦아 내기 전의 수축량" -#: src/libslic3r/PrintConfig.cpp:1509 +#: src/libslic3r/PrintConfig.cpp:1539 msgid "" "With bowden extruders, it may be wise to do some amount of quick retract " "before doing the wipe movement." @@ -7308,23 +8572,23 @@ msgstr "" "보우 덴 압출기를 사용하면 와이퍼 동작을하기 전에 약간의 빠른 리트랙션 를하는 " "것이 좋습니다." -#: src/libslic3r/PrintConfig.cpp:1516 +#: src/libslic3r/PrintConfig.cpp:1546 msgid "Retract on layer change" msgstr "레이어 변경 후퇴" -#: src/libslic3r/PrintConfig.cpp:1517 +#: src/libslic3r/PrintConfig.cpp:1547 msgid "This flag enforces a retraction whenever a Z move is done." msgstr "이 플래그는 Z 이동이 완료 될 때마다 취소를 강제 실행합니다." -#: src/libslic3r/PrintConfig.cpp:1522 src/libslic3r/PrintConfig.cpp:1530 +#: src/libslic3r/PrintConfig.cpp:1552 src/libslic3r/PrintConfig.cpp:1560 msgid "Length" msgstr "길이" -#: src/libslic3r/PrintConfig.cpp:1523 +#: src/libslic3r/PrintConfig.cpp:1553 msgid "Retraction Length" msgstr "리트랙션 길이" -#: src/libslic3r/PrintConfig.cpp:1524 +#: src/libslic3r/PrintConfig.cpp:1554 msgid "" "When retraction is triggered, filament is pulled back by the specified " "amount (the length is measured on raw filament, before it enters the " @@ -7333,15 +8597,15 @@ msgstr "" "후퇴가 트리거되면 필라멘트가 지정된 양만큼 뒤로 당겨집니다 (길이는 압출기에 " "들어가기 전에 원시 필라멘트에서 측정됩니다)." -#: src/libslic3r/PrintConfig.cpp:1526 src/libslic3r/PrintConfig.cpp:1535 +#: src/libslic3r/PrintConfig.cpp:1556 src/libslic3r/PrintConfig.cpp:1565 msgid "mm (zero to disable)" msgstr "mm (0은 비활성화)" -#: src/libslic3r/PrintConfig.cpp:1531 +#: src/libslic3r/PrintConfig.cpp:1561 msgid "Retraction Length (Toolchange)" msgstr "리트랙션 길이 (툴 체인지)" -#: src/libslic3r/PrintConfig.cpp:1532 +#: src/libslic3r/PrintConfig.cpp:1562 msgid "" "When retraction is triggered before changing tool, filament is pulled back " "by the specified amount (the length is measured on raw filament, before it " @@ -7350,11 +8614,11 @@ msgstr "" "공구를 교체하기 전에 후퇴가 트리거되면 필라멘트가 지정된 양만큼 뒤로 당겨집니" "다 (길이는 압출기에 들어가기 전에 원시 필라멘트에서 측정됩니다)." -#: src/libslic3r/PrintConfig.cpp:1540 +#: src/libslic3r/PrintConfig.cpp:1570 msgid "Lift Z" msgstr "Z축 올림" -#: src/libslic3r/PrintConfig.cpp:1541 +#: src/libslic3r/PrintConfig.cpp:1571 msgid "" "If you set this to a positive value, Z is quickly raised every time a " "retraction is triggered. When using multiple extruders, only the setting for " @@ -7363,15 +8627,15 @@ msgstr "" "이 값을 양수 값으로 설정하면 철회가 트리거 될 때마다 Z가 빠르게 올라갑니다. " "여러 개의 압출기를 사용하는 경우 첫 번째 압출기의 설정 만 고려됩니다." -#: src/libslic3r/PrintConfig.cpp:1548 +#: src/libslic3r/PrintConfig.cpp:1578 msgid "Above Z" msgstr "Z 위" -#: src/libslic3r/PrintConfig.cpp:1549 +#: src/libslic3r/PrintConfig.cpp:1579 msgid "Only lift Z above" msgstr "오직 Z축 위로만" -#: src/libslic3r/PrintConfig.cpp:1550 +#: src/libslic3r/PrintConfig.cpp:1580 msgid "" "If you set this to a positive value, Z lift will only take place above the " "specified absolute Z. You can tune this setting for skipping lift on the " @@ -7380,15 +8644,15 @@ msgstr "" "이것을 양의 값으로 설정하면, Z 리프트는 지정된 절대 Z 위로만 발생한다. 첫 번" "째 층에서 리프트를 건너뛸 수 있도록 이 설정을 조정할 수 있다." -#: src/libslic3r/PrintConfig.cpp:1557 +#: src/libslic3r/PrintConfig.cpp:1587 msgid "Below Z" msgstr "Z 아래" -#: src/libslic3r/PrintConfig.cpp:1558 +#: src/libslic3r/PrintConfig.cpp:1588 msgid "Only lift Z below" msgstr "Z값 아래만" -#: src/libslic3r/PrintConfig.cpp:1559 +#: src/libslic3r/PrintConfig.cpp:1589 msgid "" "If you set this to a positive value, Z lift will only take place below the " "specified absolute Z. You can tune this setting for limiting lift to the " @@ -7397,11 +8661,11 @@ msgstr "" "이것을 양수 값으로 설정하면 Z 리프트가 지정된 절대 Z 아래에서만 발생합니다. " "첫 번째 레이어로 리프트를 제한하기 위해이 설정을 조정할 수 있습니다." -#: src/libslic3r/PrintConfig.cpp:1567 src/libslic3r/PrintConfig.cpp:1575 +#: src/libslic3r/PrintConfig.cpp:1597 src/libslic3r/PrintConfig.cpp:1605 msgid "Extra length on restart" msgstr "재시작시 여분의 길이" -#: src/libslic3r/PrintConfig.cpp:1568 +#: src/libslic3r/PrintConfig.cpp:1598 msgid "" "When the retraction is compensated after the travel move, the extruder will " "push this additional amount of filament. This setting is rarely needed." @@ -7409,7 +8673,7 @@ msgstr "" "이동 후 리트렉셔이 보정되면 익스트루더가 추가 양의 필라멘트를 밀어냅니다. 이 " "설정은 거의 필요하지 않습니다." -#: src/libslic3r/PrintConfig.cpp:1576 +#: src/libslic3r/PrintConfig.cpp:1606 msgid "" "When the retraction is compensated after changing tool, the extruder will " "push this additional amount of filament." @@ -7417,19 +8681,19 @@ msgstr "" "도구를 교환 한 후 리트렉션를 보정하면 익스트루더가 추가 양의 필라멘트를 밀게" "됩니다." -#: src/libslic3r/PrintConfig.cpp:1583 src/libslic3r/PrintConfig.cpp:1584 +#: src/libslic3r/PrintConfig.cpp:1613 src/libslic3r/PrintConfig.cpp:1614 msgid "Retraction Speed" msgstr "리트랙션 속도" -#: src/libslic3r/PrintConfig.cpp:1585 +#: src/libslic3r/PrintConfig.cpp:1615 msgid "The speed for retractions (it only applies to the extruder motor)." msgstr "리트랙션 속도 (익스트루더 모터에만 적용됨)." -#: src/libslic3r/PrintConfig.cpp:1591 src/libslic3r/PrintConfig.cpp:1592 +#: src/libslic3r/PrintConfig.cpp:1621 src/libslic3r/PrintConfig.cpp:1622 msgid "Deretraction Speed" msgstr "감속 속도" -#: src/libslic3r/PrintConfig.cpp:1593 +#: src/libslic3r/PrintConfig.cpp:1623 msgid "" "The speed for loading of a filament into extruder after retraction (it only " "applies to the extruder motor). If left to zero, the retraction speed is " @@ -7438,79 +8702,79 @@ msgstr "" "리트랙션 후 압출기에 필라멘트를 로드하는 속도 (압출기 모터에만 적용됨). 0으" "로 방치하면 리트랙션 속도가 사용됩니다." -#: src/libslic3r/PrintConfig.cpp:1600 +#: src/libslic3r/PrintConfig.cpp:1630 msgid "Seam position" msgstr "재봉선 위치" -#: src/libslic3r/PrintConfig.cpp:1602 +#: src/libslic3r/PrintConfig.cpp:1632 msgid "Position of perimeters starting points." msgstr "둘레의 시작점의 위치." -#: src/libslic3r/PrintConfig.cpp:1608 +#: src/libslic3r/PrintConfig.cpp:1638 msgid "Random" msgstr "무작위" -#: src/libslic3r/PrintConfig.cpp:1609 +#: src/libslic3r/PrintConfig.cpp:1639 msgid "Nearest" msgstr "가장 가까운" -#: src/libslic3r/PrintConfig.cpp:1610 +#: src/libslic3r/PrintConfig.cpp:1640 msgid "Aligned" msgstr "정렬" -#: src/libslic3r/PrintConfig.cpp:1618 +#: src/libslic3r/PrintConfig.cpp:1648 msgid "Direction" msgstr "방향" -#: src/libslic3r/PrintConfig.cpp:1620 +#: src/libslic3r/PrintConfig.cpp:1650 msgid "Preferred direction of the seam" -msgstr "선호하는 심(seam)의 방향" +msgstr "선호하는 재봉선(seam)의 방향" -#: src/libslic3r/PrintConfig.cpp:1621 +#: src/libslic3r/PrintConfig.cpp:1651 msgid "Seam preferred direction" -msgstr "심(Seam) 선호 방향" +msgstr "재봉선(Seam) 선호 방향" -#: src/libslic3r/PrintConfig.cpp:1628 +#: src/libslic3r/PrintConfig.cpp:1658 msgid "Jitter" msgstr "지터(Jitter)" -#: src/libslic3r/PrintConfig.cpp:1630 +#: src/libslic3r/PrintConfig.cpp:1660 msgid "Seam preferred direction jitter" -msgstr "(Seam) 선호 방향 지터(Jitter)" +msgstr "재봉선 선호 방향 지터(Jitter)" -#: src/libslic3r/PrintConfig.cpp:1631 +#: src/libslic3r/PrintConfig.cpp:1661 msgid "Preferred direction of the seam - jitter" msgstr "재봉선 지터의 선호 방향" -#: src/libslic3r/PrintConfig.cpp:1641 +#: src/libslic3r/PrintConfig.cpp:1671 msgid "USB/serial port for printer connection." msgstr "프린터 연결을 위한 USB/시리얼 포트." -#: src/libslic3r/PrintConfig.cpp:1648 +#: src/libslic3r/PrintConfig.cpp:1678 msgid "Serial port speed" msgstr "시리얼 포트 속도" -#: src/libslic3r/PrintConfig.cpp:1649 +#: src/libslic3r/PrintConfig.cpp:1679 msgid "Speed (baud) of USB/serial port for printer connection." msgstr "프린터 연결을 위한 USB/시리얼 포트의 속도(보드)" -#: src/libslic3r/PrintConfig.cpp:1658 +#: src/libslic3r/PrintConfig.cpp:1688 msgid "Distance from object" -msgstr "객체로부터의 거리" +msgstr "객체(object)로부터의 거리" -#: src/libslic3r/PrintConfig.cpp:1659 +#: src/libslic3r/PrintConfig.cpp:1689 msgid "" "Distance between skirt and object(s). Set this to zero to attach the skirt " "to the object(s) and get a brim for better adhesion." msgstr "" -"스커트와 객체 사이의 거리. 스커트를 객체에 부착하고 접착력을 높이기 위해 이" -"를 0으로 설정한다." +"스커트와 객체(object) 사이의 거리. 스커트를 객체(object)에 부착하고 접착력을 " +"높이기 위해 이를 0으로 설정한다." -#: src/libslic3r/PrintConfig.cpp:1666 +#: src/libslic3r/PrintConfig.cpp:1696 msgid "Skirt height" msgstr "스커트(Skirt) 높이" -#: src/libslic3r/PrintConfig.cpp:1667 +#: src/libslic3r/PrintConfig.cpp:1697 msgid "" "Height of skirt expressed in layers. Set this to a tall value to use skirt " "as a shield against drafts." @@ -7518,15 +8782,15 @@ msgstr "" "스커트의 높이 레이어로 표현된다. 이를 높은 값으로 설정하여 스커트를 드래프트" "에 대한 쉴ㄷ로 활용하십시오." -#: src/libslic3r/PrintConfig.cpp:1674 +#: src/libslic3r/PrintConfig.cpp:1704 msgid "Loops (minimum)" msgstr "루프 (최소)" -#: src/libslic3r/PrintConfig.cpp:1675 +#: src/libslic3r/PrintConfig.cpp:1705 msgid "Skirt Loops" msgstr "스커트 루프" -#: src/libslic3r/PrintConfig.cpp:1676 +#: src/libslic3r/PrintConfig.cpp:1706 msgid "" "Number of loops for the skirt. If the Minimum Extrusion Length option is " "set, the number of loops might be greater than the one configured here. Set " @@ -7535,11 +8799,11 @@ msgstr "" "스커트의 루프 수입니다. 최소 압출 길이 옵션을 설정한 경우 여기에 구성된 루프 " "수보다 클 수 있다. 스커트를 완전히 비활성화하려면 이 값을 0으로 설정하십시오." -#: src/libslic3r/PrintConfig.cpp:1684 +#: src/libslic3r/PrintConfig.cpp:1714 msgid "Slow down if layer print time is below" msgstr "레이어 인쇄 시간이 다음과 같은 경우 속도를 낮추십시오" -#: src/libslic3r/PrintConfig.cpp:1685 +#: src/libslic3r/PrintConfig.cpp:1715 msgid "" "If layer print time is estimated below this number of seconds, print moves " "speed will be scaled down to extend duration to this value." @@ -7547,11 +8811,11 @@ msgstr "" "층 인쇄 시간이 이 시간보다 낮게 추정될 경우, 인쇄 이동 속도는 이 값으로 지속" "되도록 축소된다." -#: src/libslic3r/PrintConfig.cpp:1695 +#: src/libslic3r/PrintConfig.cpp:1725 msgid "Small perimeters" msgstr "작은 둘레" -#: src/libslic3r/PrintConfig.cpp:1697 +#: src/libslic3r/PrintConfig.cpp:1727 msgid "" "This separate setting will affect the speed of perimeters having radius <= " "6.5mm (usually holes). If expressed as percentage (for example: 80%) it will " @@ -7561,34 +8825,34 @@ msgstr "" "분율로 표시되는 경우 (예 : 80 %) 위의 속도 설정에서 계산됩니다. 자동으로 0으" "로 설정하십시오." -#: src/libslic3r/PrintConfig.cpp:1707 +#: src/libslic3r/PrintConfig.cpp:1737 msgid "Solid infill threshold area" -msgstr "솔리드 채우기 임계값 영역" +msgstr "솔리드 채우기 임계값" -#: src/libslic3r/PrintConfig.cpp:1709 +#: src/libslic3r/PrintConfig.cpp:1739 msgid "" "Force solid infill for regions having a smaller area than the specified " "threshold." msgstr "" "지정된 한계값보다 작은 영역을 가진 영역에 대해 솔리드 인필을 강제 적용." -#: src/libslic3r/PrintConfig.cpp:1710 +#: src/libslic3r/PrintConfig.cpp:1740 msgid "mm²" msgstr "mm²" -#: src/libslic3r/PrintConfig.cpp:1716 +#: src/libslic3r/PrintConfig.cpp:1746 msgid "Solid infill extruder" msgstr "솔리드 인필 익스트루더" -#: src/libslic3r/PrintConfig.cpp:1718 +#: src/libslic3r/PrintConfig.cpp:1748 msgid "The extruder to use when printing solid infill." msgstr "꽉찬 면을 인쇄할 때 사용하는 익스트루더." -#: src/libslic3r/PrintConfig.cpp:1724 +#: src/libslic3r/PrintConfig.cpp:1754 msgid "Solid infill every" msgstr "솔리드 인필 간격" -#: src/libslic3r/PrintConfig.cpp:1726 +#: src/libslic3r/PrintConfig.cpp:1756 msgid "" "This feature allows to force a solid layer every given number of layers. " "Zero to disable. You can set this to any value (for example 9999); Slic3r " @@ -7599,7 +8863,7 @@ msgstr "" "음. 당신은 이것을 어떤 값으로도 설정할 수 있다(예: 9999). Slic3r는 노즐 직경" "과 층 높이에 따라 결합할 최대 가능한 층 수를 자동으로 선택한다." -#: src/libslic3r/PrintConfig.cpp:1738 +#: src/libslic3r/PrintConfig.cpp:1768 msgid "" "Set this to a non-zero value to set a manual extrusion width for infill for " "solid surfaces. If left zero, default extrusion width will be used if set, " @@ -7610,7 +8874,7 @@ msgstr "" "하십시오. 0인 경우 기본 압출 너비가 사용되며, 그렇지 않으면 1.125 x 노즐 직경" "이 사용된다. 백분율(예: 90%)로 표현되는 경우, 계층 높이에 걸쳐 계산된다." -#: src/libslic3r/PrintConfig.cpp:1748 +#: src/libslic3r/PrintConfig.cpp:1779 msgid "" "Speed for printing solid regions (top/bottom/internal horizontal shells). " "This can be expressed as a percentage (for example: 80%) over the default " @@ -7619,15 +8883,19 @@ msgstr "" "솔리드 영역(상단/하부/내부 수평 셸) 인쇄 속도 이는 위의 기본 주입 속도에 대" "한 백분율(예: 80%)로 표시할 수 있다. 자동을 위해 0으로 설정한다." -#: src/libslic3r/PrintConfig.cpp:1760 +#: src/libslic3r/PrintConfig.cpp:1791 msgid "Number of solid layers to generate on top and bottom surfaces." msgstr "상단 및 하단 표면에 생성할 솔리드 레이어 수입니다." -#: src/libslic3r/PrintConfig.cpp:1766 -msgid "Spiral vase" -msgstr "스파이럴 바이스" +#: src/libslic3r/PrintConfig.cpp:1797 src/libslic3r/PrintConfig.cpp:1798 +msgid "Minimum thickness of a top / bottom shell" +msgstr "상부/하부 쉘의 최소 두께" -#: src/libslic3r/PrintConfig.cpp:1767 +#: src/libslic3r/PrintConfig.cpp:1804 +msgid "Spiral vase" +msgstr "꽃병 모드(Spiral vase)" + +#: src/libslic3r/PrintConfig.cpp:1805 msgid "" "This feature will raise Z gradually while printing a single-walled object in " "order to remove any visible seam. This option requires a single perimeter, " @@ -7635,17 +8903,17 @@ msgid "" "any number of bottom solid layers as well as skirt/brim loops. It won't work " "when printing more than an object." msgstr "" -"이 기능은 단일 벽 물체를 인쇄하는 동안 눈에 보이는 심을 제거하기 위해 Z를 점" -"진적으로 상승시킨다. 이 옵션은 단일 둘레, 주입, 상단 솔리드 레이어 및 지지 재" -"료가 필요하지 않다. 당신은 스커트/브림 루프뿐만 아니라 아래 솔리드 레이어의 " -"수에 상관없이 설정할 수 있다. 그것은 물체보다 더 많이 인쇄할 때는 작동하지 않" -"을 것이다." +"이 기능은 단일 벽 개체를 인쇄하는 동안 눈에 보이는 재봉선을 제거하기 위해 Z" +"를 점진적으로 상승시킨다. 이 옵션은 단일 둘레, 주입, 상단 솔리드 레이어 및 지" +"지 재료가 필요하지 않다. 당신은 스커트/브림 루프뿐만 아니라 아래 솔리드 레이" +"어의 수에 상관없이 설정할 수 있다. 그것은 개체보다 더 많이 인쇄할 때는 작동하" +"지 않을 것이다." -#: src/libslic3r/PrintConfig.cpp:1775 +#: src/libslic3r/PrintConfig.cpp:1813 msgid "Temperature variation" msgstr "온도 변화" -#: src/libslic3r/PrintConfig.cpp:1776 +#: src/libslic3r/PrintConfig.cpp:1814 msgid "" "Temperature difference to be applied when an extruder is not active. Enables " "a full-height \"sacrificial\" skirt on which the nozzles are periodically " @@ -7654,57 +8922,57 @@ msgstr "" "돌출부가 활성화되지 않은 경우 적용되는 온도 차이. 노즐을 주기적으로 닦는 전" "체 높이 \"인공\" 스커트가 가능하다." -#: src/libslic3r/PrintConfig.cpp:1786 +#: src/libslic3r/PrintConfig.cpp:1824 msgid "" "This start procedure is inserted at the beginning, after bed has reached the " "target temperature and extruder just started heating, and before extruder " -"has finished heating. If Slic3r detects M104 or M190 in your custom codes, " -"such commands will not be prepended automatically so you're free to " +"has finished heating. If PrusaSlicer detects M104 or M190 in your custom " +"codes, such commands will not be prepended automatically so you're free to " "customize the order of heating commands and other custom actions. Note that " -"you can use placeholder variables for all Slic3r settings, so you can put a " -"\"M109 S[first_layer_temperature]\" command wherever you want." +"you can use placeholder variables for all PrusaSlicer settings, so you can " +"put a \"M109 S[first_layer_temperature]\" command wherever you want." msgstr "" -"이 시작 절차는 침대가 목표 온도에 도달하고 압출기가 막 가열을 시작한 직후 및 " -"압출기가 가열을 완료하기 전에 처음에 삽입됩니다. Slic3r이 사용자 지정 코드에" -"서 M104 또는 M190을 감지하면 이러한 명령은 자동으로 추가되지 않으므로 가열 명" -"령 및 기타 사용자 지정 동작의 순서를 자유롭게 사용자 지정할 수 있습니다. 모" -"든 Slic3r 설정에 자리 표시 자 변수를 사용할 수 있으므로 원하는 위치에 \"M109 " -"S [first_layer_temperature]\"명령을 넣을 수 있습니다." +"이 시작 절차는 배드가 목표 온도에 도달하고 압출기가 방금 가열을 시작한 후 압" +"출기가열가 완료되기 전에 처음에 삽입됩니다. PrusaSlicer사용자 지정 코드에서 " +"M104 또는 M190을 감지하는 경우 이러한 명령이 자동으로 준비되지 않으므로 가열 " +"명령 및 기타 사용자 지정 작업의 순서를 자유롭게 사용자 지정할 수 있습니다. 모" +"든 PrusaSlicer 설정에 자리 표시자 변수를 사용할 수 있으므로 원하는 위치에 " +"\"M109 S[first_layer_temperature]\" 명령을 넣을 수 있습니다." -#: src/libslic3r/PrintConfig.cpp:1801 +#: src/libslic3r/PrintConfig.cpp:1839 msgid "" "This start procedure is inserted at the beginning, after any printer start " "gcode (and after any toolchange to this filament in case of multi-material " "printers). This is used to override settings for a specific filament. If " -"Slic3r detects M104, M109, M140 or M190 in your custom codes, such commands " -"will not be prepended automatically so you're free to customize the order of " -"heating commands and other custom actions. Note that you can use placeholder " -"variables for all Slic3r settings, so you can put a \"M109 " +"PrusaSlicer detects M104, M109, M140 or M190 in your custom codes, such " +"commands will not be prepended automatically so you're free to customize the " +"order of heating commands and other custom actions. Note that you can use " +"placeholder variables for all PrusaSlicer settings, so you can put a \"M109 " "S[first_layer_temperature]\" command wherever you want. If you have multiple " "extruders, the gcode is processed in extruder order." msgstr "" "이 시작 절차는 프린터가 gcode를 시작한 후(그리고 다중 재질 프린터의 경우 이 " "필라멘트에 대한 도구 변경 후) 처음에 삽입됩니다. 특정 필라멘트에 대한 설정을 " -"재정의하는 데 사용됩니다. Slic3r가 사용자 지정 코드에서 M104, M109, M140 또" -"는 M190을 감지하면 이러한 명령이 자동으로 준비되지 않으므로 가열 명령 및 기" -"타 사용자 지정 작업의 순서를 자유롭게 사용자 지정할 수 있습니다. 모든 Slic3r " -"설정에 자리 표시자 변수를 사용할 수 있으므로 원하는 위치에 \"M109 " -"S[first_layer_temperature]\" 명령을 넣을 수 있습니다. 압출기가 여러 개 있는 " -"경우 gcode는 압출기 순서로 처리됩니다." +"재정의하는 데 사용됩니다. PrusaSlicer가 사용자 지정 코드에서 M104, M109, " +"M140 또는 M190을 감지하면 이러한 명령이 자동으로 준비되지 않으므로 가열 명령 " +"및 기타 사용자 지정 작업의 순서를 자유롭게 사용자 지정할 수 있습니다. 모든 " +"PrusaSlicer 설정에 자리 표시자 변수를 사용할 수 있으므로 원하는 위치에 " +"\"M109 S[first_layer_temperature]\" 명령을 넣을 수 있습니다. 압출기가 여러 " +"개 있는 경우 gcode는 압출기 순서로 처리됩니다." -#: src/libslic3r/PrintConfig.cpp:1817 +#: src/libslic3r/PrintConfig.cpp:1855 msgid "Single Extruder Multi Material" -msgstr "싱글 익스트루더 멀티메터리얼" +msgstr "싱글 익스트루더 다중메터리얼" -#: src/libslic3r/PrintConfig.cpp:1818 +#: src/libslic3r/PrintConfig.cpp:1856 msgid "The printer multiplexes filaments into a single hot end." -msgstr "프린터는 필라멘트를 하나의 핫 엔드에 멀티플렉싱합니다." +msgstr "프린터는 필라멘트를 하나의 핫 엔드에 다중플렉싱합니다." -#: src/libslic3r/PrintConfig.cpp:1823 +#: src/libslic3r/PrintConfig.cpp:1861 msgid "Prime all printing extruders" msgstr "모든 인쇄 압출기 프라임" -#: src/libslic3r/PrintConfig.cpp:1824 +#: src/libslic3r/PrintConfig.cpp:1862 msgid "" "If enabled, all printing extruders will be primed at the front edge of the " "print bed at the start of the print." @@ -7712,19 +8980,34 @@ msgstr "" "활성화 된 경우, 모든 인쇄 압출기는 인쇄 시작시 프린트 베드의 전면 가장자리에 " "프라이밍 됩니다." -#: src/libslic3r/PrintConfig.cpp:1829 +#: src/libslic3r/PrintConfig.cpp:1867 +msgid "No sparse layers (EXPERIMENTAL)" +msgstr "숨겨진 레이어층 없음(실험적)" + +#: src/libslic3r/PrintConfig.cpp:1868 +msgid "" +"If enabled, the wipe tower will not be printed on layers with no " +"toolchanges. On layers with a toolchange, extruder will travel downward to " +"print the wipe tower. User is responsible for ensuring there is no collision " +"with the print." +msgstr "" +"활성화된 경우 도구 변경 없이 레이어에 와이프 타워가 인쇄되지 않습니다. 툴체인" +"지 레이어에서 압출기는 아래쪽으로 이동하여 와이프 타워를 인쇄합니다. 사용자" +"는 인쇄물과 충돌이 없는지 확인합니다." + +#: src/libslic3r/PrintConfig.cpp:1875 msgid "Generate support material" msgstr "서포트 재료 생성" -#: src/libslic3r/PrintConfig.cpp:1831 +#: src/libslic3r/PrintConfig.cpp:1877 msgid "Enable support material generation." msgstr "서포트 재료를 사용합니다." -#: src/libslic3r/PrintConfig.cpp:1835 +#: src/libslic3r/PrintConfig.cpp:1881 msgid "Auto generated supports" msgstr "자동 생성 지원" -#: src/libslic3r/PrintConfig.cpp:1837 +#: src/libslic3r/PrintConfig.cpp:1883 msgid "" "If checked, supports will be generated automatically based on the overhang " "threshold value. If unchecked, supports will be generated inside the " @@ -7734,29 +9017,29 @@ msgstr "" "인란을 선택 하지 않으면 \"서포트 지원 영역\" 볼륨 내 에서만 지원이 생성 됩니" "다." -#: src/libslic3r/PrintConfig.cpp:1843 +#: src/libslic3r/PrintConfig.cpp:1889 msgid "XY separation between an object and its support" -msgstr "물체와 그 서포트 사이 XY 분리" +msgstr "개체와 그 서포트 사이 XY 분리" -#: src/libslic3r/PrintConfig.cpp:1845 +#: src/libslic3r/PrintConfig.cpp:1891 msgid "" "XY separation between an object and its support. If expressed as percentage " "(for example 50%), it will be calculated over external perimeter width." msgstr "" -"객체와 그 서포트 사이의 XY 분리. 백분율 (예 : 50 %)로 표시되는 경우 외부 둘" -"레 너비를 기준으로 계산됩니다." +"객체(object)와 그 서포트 사이의 XY 분리. 백분율 (예 : 50 %)로 표시되는 경우 " +"외부 둘레 너비를 기준으로 계산됩니다." -#: src/libslic3r/PrintConfig.cpp:1855 +#: src/libslic3r/PrintConfig.cpp:1901 msgid "Pattern angle" msgstr "채움 각도" -#: src/libslic3r/PrintConfig.cpp:1857 +#: src/libslic3r/PrintConfig.cpp:1903 msgid "" "Use this setting to rotate the support material pattern on the horizontal " "plane." msgstr "이 설정을 사용하여지지 평면 패턴을 수평면으로 회전시킵니다." -#: src/libslic3r/PrintConfig.cpp:1867 src/libslic3r/PrintConfig.cpp:2531 +#: src/libslic3r/PrintConfig.cpp:1913 src/libslic3r/PrintConfig.cpp:2677 msgid "" "Only create support if it lies on a build plate. Don't create support on a " "print." @@ -7764,32 +9047,32 @@ msgstr "" "그것이 빌드 플레이트에있는 경우에만 지원을 작성하십시오. 인쇄물에 대한 지원" "을 작성하지 마십시오." -#: src/libslic3r/PrintConfig.cpp:1873 +#: src/libslic3r/PrintConfig.cpp:1919 msgid "Contact Z distance" msgstr "Z 거리 문의" -#: src/libslic3r/PrintConfig.cpp:1875 +#: src/libslic3r/PrintConfig.cpp:1921 msgid "" "The vertical distance between object and support material interface. Setting " "this to 0 will also prevent Slic3r from using bridge flow and speed for the " "first object layer." msgstr "" -"물체와 서포트 사이의 수직 거리. 이 값을 0으로 설정하면 Slic3r이 첫 번째 객체 " -"레이어에 브리지 흐름과 속도를 사용하지 못하게됩니다." +"개체와 서포트 사이의 수직 거리. 이 값을 0으로 설정하면 Slic3r이 첫 번째 객체" +"(object) 레이어에 브리지 흐름과 속도를 사용하지 못하게됩니다." -#: src/libslic3r/PrintConfig.cpp:1882 +#: src/libslic3r/PrintConfig.cpp:1928 msgid "0 (soluble)" msgstr "0 (수용성)" -#: src/libslic3r/PrintConfig.cpp:1883 +#: src/libslic3r/PrintConfig.cpp:1929 msgid "0.2 (detachable)" msgstr "0.2 (분리 가능)" -#: src/libslic3r/PrintConfig.cpp:1888 +#: src/libslic3r/PrintConfig.cpp:1934 msgid "Enforce support for the first" msgstr "첫 번째 서포트 더 강화" -#: src/libslic3r/PrintConfig.cpp:1890 +#: src/libslic3r/PrintConfig.cpp:1936 msgid "" "Generate support material for the specified number of layers counting from " "bottom, regardless of whether normal support material is enabled or not and " @@ -7798,17 +9081,17 @@ msgid "" msgstr "" "일반적인 서포트 소재의 활성화 여부와, 각도 임계 값에 관계없이 하단에서부터 세" "어 지정된 레이어 수에 대한지지 자료를 생성합니다. 이것은 빌드 플레이트에 매" -"우 얇거나 부족한 풋 프린트를 가진 물체를 더 많이 부착 할 때 유용합니다." +"우 얇거나 부족한 풋 프린트를 가진 개체를 더 많이 부착 할 때 유용합니다." -#: src/libslic3r/PrintConfig.cpp:1895 +#: src/libslic3r/PrintConfig.cpp:1941 msgid "Enforce support for the first n layers" msgstr "첫 번째 n 개의 레이어에 대한 서포트 강화" -#: src/libslic3r/PrintConfig.cpp:1901 +#: src/libslic3r/PrintConfig.cpp:1947 msgid "Support material/raft/skirt extruder" msgstr "서포트 재료 / 라프트 / 스커트 익스트루더" -#: src/libslic3r/PrintConfig.cpp:1903 +#: src/libslic3r/PrintConfig.cpp:1949 msgid "" "The extruder to use when printing support material, raft and skirt (1+, 0 to " "use the current extruder to minimize tool changes)." @@ -7816,7 +9099,7 @@ msgstr "" "서포트 재료, 라프트 및 스커트를 인쇄 할 때 사용하는 압출기 (도구 변경을 최소" "화하기 위해 현재 압출기를 사용하려면 1+, 0)." -#: src/libslic3r/PrintConfig.cpp:1912 +#: src/libslic3r/PrintConfig.cpp:1958 msgid "" "Set this to a non-zero value to set a manual extrusion width for support " "material. If left zero, default extrusion width will be used if set, " @@ -7827,97 +9110,95 @@ msgstr "" "0으로 설정하면 설정된 경우 기본 압출 폭이 사용되고 그렇지 않으면 노즐 지름이 " "사용됩니다. 백분율 (예 : 90 %)로 표현하면 레이어 높이를 기준으로 계산됩니다." -#: src/libslic3r/PrintConfig.cpp:1920 +#: src/libslic3r/PrintConfig.cpp:1967 msgid "Interface loops" -msgstr "인터페이스 루프" +msgstr "접점 루프" -#: src/libslic3r/PrintConfig.cpp:1922 +#: src/libslic3r/PrintConfig.cpp:1969 msgid "" "Cover the top contact layer of the supports with loops. Disabled by default." msgstr "지지대의 상단 접촉 층을 루프로 덮으십시오. 기본적으로 사용 안 함." -#: src/libslic3r/PrintConfig.cpp:1927 +#: src/libslic3r/PrintConfig.cpp:1974 msgid "Support material/raft interface extruder" -msgstr "서포트 재료/라프트 인터페이스 익스트루더" +msgstr "서포트 재료/라프트 접점 익스트루더" -#: src/libslic3r/PrintConfig.cpp:1929 +#: src/libslic3r/PrintConfig.cpp:1976 msgid "" "The extruder to use when printing support material interface (1+, 0 to use " "the current extruder to minimize tool changes). This affects raft too." msgstr "" -"서포트 재료 인터페이스를 인쇄 할 때 사용할 익스트루더 (도구 변경을 최소화하" -"기 위해 현재 익스트루더를 사용하려면 1+, 0). 이것은 라프트에도 영향을 미칩니" -"다." +"서포트 재료 접점를 인쇄 할 때 사용할 익스트루더 (도구 변경을 최소화하기 위해 " +"현재 익스트루더를 사용하려면 1+, 0). 이것은 라프트에도 영향을 미칩니다." -#: src/libslic3r/PrintConfig.cpp:1936 +#: src/libslic3r/PrintConfig.cpp:1983 msgid "Interface layers" -msgstr "인터페이스 레이어" +msgstr "접점 레이어" -#: src/libslic3r/PrintConfig.cpp:1938 +#: src/libslic3r/PrintConfig.cpp:1985 msgid "" "Number of interface layers to insert between the object(s) and support " "material." -msgstr "객체와 서포트 재료 사이에 삽입할 인터페이스 레이어 수입니다." +msgstr "객체(object)와 서포트 재료 사이에 삽입할 접점 레이어 수입니다." -#: src/libslic3r/PrintConfig.cpp:1945 +#: src/libslic3r/PrintConfig.cpp:1992 msgid "Interface pattern spacing" -msgstr "인터페이스 패턴 간격" +msgstr "접점 패턴 간격" -#: src/libslic3r/PrintConfig.cpp:1947 +#: src/libslic3r/PrintConfig.cpp:1994 msgid "Spacing between interface lines. Set zero to get a solid interface." -msgstr "" -"인터페이스 라인 간 간격. 솔리드 인터페이스를 가져오려면 0을 설정하십시오." +msgstr "접점 라인 간 간격. 솔리드 접점를 가져오려면 0을 설정하십시오." -#: src/libslic3r/PrintConfig.cpp:1956 +#: src/libslic3r/PrintConfig.cpp:2003 msgid "" "Speed for printing support material interface layers. If expressed as " "percentage (for example 50%) it will be calculated over support material " "speed." msgstr "" -"서포트 재료 인터페이스 레이어 인쇄 속도 백분율(예: 50%)로 표현될 경우 서포트 " -"재료 속도에 따라 계산된다." +"서포트 재료 접점 레이어 인쇄 속도 백분율(예: 50%)로 표현될 경우 서포트 재료 " +"속도에 따라 계산된다." -#: src/libslic3r/PrintConfig.cpp:1965 +#: src/libslic3r/PrintConfig.cpp:2012 msgid "Pattern" msgstr "패턴" -#: src/libslic3r/PrintConfig.cpp:1967 +#: src/libslic3r/PrintConfig.cpp:2014 msgid "Pattern used to generate support material." msgstr "서포트 재료를 생성하는 데 사용되는 패턴." -#: src/libslic3r/PrintConfig.cpp:1973 +#: src/libslic3r/PrintConfig.cpp:2020 msgid "Rectilinear grid" msgstr "직선 그리드" -#: src/libslic3r/PrintConfig.cpp:1979 +#: src/libslic3r/PrintConfig.cpp:2026 msgid "Pattern spacing" msgstr "패턴 간격" -#: src/libslic3r/PrintConfig.cpp:1981 +#: src/libslic3r/PrintConfig.cpp:2028 msgid "Spacing between support material lines." msgstr "서포트 재료 라인 사이의 간격." -#: src/libslic3r/PrintConfig.cpp:1990 +#: src/libslic3r/PrintConfig.cpp:2037 msgid "Speed for printing support material." msgstr "서포트 재료를 인쇄하는 속도." -#: src/libslic3r/PrintConfig.cpp:1997 +#: src/libslic3r/PrintConfig.cpp:2044 msgid "Synchronize with object layers" -msgstr "객체 레이어와 동기화" +msgstr "객체(object) 레이어와 동기화" -#: src/libslic3r/PrintConfig.cpp:1999 +#: src/libslic3r/PrintConfig.cpp:2046 msgid "" "Synchronize support layers with the object print layers. This is useful with " "multi-material printers, where the extruder switch is expensive." msgstr "" -"서포트 레이어를 프린트 레이어와 동기화하십시오. 이것은 스위치가 비싼 멀티 메" +"서포트 레이어를 프린트 레이어와 동기화하십시오. 이것은 스위치가 비싼 다중 메" "터리얼 프린터에서 유용하다." -#: src/libslic3r/PrintConfig.cpp:2005 +#: src/libslic3r/PrintConfig.cpp:2052 msgid "Overhang threshold" msgstr "오버행 한계점" -#: src/libslic3r/PrintConfig.cpp:2007 +#: src/libslic3r/PrintConfig.cpp:2054 msgid "" "Support material will not be generated for overhangs whose slope angle (90° " "= vertical) is above the given threshold. In other words, this value " @@ -7929,11 +9210,11 @@ msgstr "" "성되지 않는다. 즉, 이 값은 서포트 재료 없이 인쇄할 수 있는 가장 수평 경사(수" "평면에서 측정됨)를 나타낸다. 자동 감지를 위해 0으로 설정하십시오(권장)." -#: src/libslic3r/PrintConfig.cpp:2019 +#: src/libslic3r/PrintConfig.cpp:2066 msgid "With sheath around the support" msgstr "서포트 주변이나 외부로" -#: src/libslic3r/PrintConfig.cpp:2021 +#: src/libslic3r/PrintConfig.cpp:2068 msgid "" "Add a sheath (a single perimeter line) around the base support. This makes " "the support more reliable, but also more difficult to remove." @@ -7941,7 +9222,7 @@ msgstr "" "기본 서포트 주위에 외장 (단일 주변 선)을 추가하십시오. 이것은 페이스 업을보" "다 신뢰성있게 만들뿐만 아니라 제거하기도 어렵습니다." -#: src/libslic3r/PrintConfig.cpp:2028 +#: src/libslic3r/PrintConfig.cpp:2075 msgid "" "Extruder temperature for layers after the first one. Set this to zero to " "disable temperature control commands in the output." @@ -7949,21 +9230,21 @@ msgstr "" "첫 번째 것 이후에 레이어에 대한 더 낮은 온도. 이 값을 0으로 설정하면 출력에" "서 ​​온도 제어 명령을 비활성화 할 수 있습니다." -#: src/libslic3r/PrintConfig.cpp:2036 +#: src/libslic3r/PrintConfig.cpp:2083 msgid "Detect thin walls" msgstr "얇은 벽(walls) 감지" -#: src/libslic3r/PrintConfig.cpp:2038 +#: src/libslic3r/PrintConfig.cpp:2085 msgid "" "Detect single-width walls (parts where two extrusions don't fit and we need " "to collapse them into a single trace)." msgstr "싱글 너비 벽 (두 부분이 맞지 않는 부분과 무너지는 부분)을 감지합니다." -#: src/libslic3r/PrintConfig.cpp:2044 +#: src/libslic3r/PrintConfig.cpp:2091 msgid "Threads" msgstr "스레드(Threads)" -#: src/libslic3r/PrintConfig.cpp:2045 +#: src/libslic3r/PrintConfig.cpp:2092 msgid "" "Threads are used to parallelize long-running tasks. Optimal threads number " "is slightly above the number of available cores/processors." @@ -7971,22 +9252,22 @@ msgstr "" "스레드는 장기 실행 태스크를 병렬 처리하는 데 사용됩니다. 최적의 스레드 수는 " "사용 가능한 코어 / 프로세서 수보다 약간 높습니다." -#: src/libslic3r/PrintConfig.cpp:2057 +#: src/libslic3r/PrintConfig.cpp:2104 msgid "" -"This custom code is inserted at every extruder change. If you don't leave " -"this empty, you are expected to take care of the toolchange yourself - " -"PrusaSlicer will not output any other G-code to change the filament. You can " -"use placeholder variables for all Slic3r settings as well as " -"[previous_extruder] and [next_extruder], so e.g. the standard toolchange " -"command can be scripted as T[next_extruder]." +"This custom code is inserted before every toolchange. Placeholder variables " +"for all PrusaSlicer settings as well as {previous_extruder} and " +"{next_extruder} can be used. When a tool-changing command which changes to " +"the correct extruder is included (such as T{next_extruder}), PrusaSlicer " +"will emit no other such command. It is therefore possible to script custom " +"behaviour both before and after the toolchange." msgstr "" -"이 사용자 지정 코드는 모든 압출기 변경 시 삽입됩니다. 이 것을 비워 두지 않으" -"면 도구 변경을 직접 처리해야합니다 - PrusaSlicer는 필라멘트를 변경하기 위해 " -"다른 G 코드를 출력하지 않습니다. 모든 Slic3r 설정과 [이전_압출기] 및 " -"[next_extruder]에 대해 자리 표시자 변수를 사용할 수 있으므로 표준 도구 변경 " -"명령을 T[next_extruder]로 스크립팅할 수 있습니다." +"이 사용자 지정 코드는 모든 도구 변경 전에 삽입됩니다. 모든 PrusaSlicer 설정" +"과 {previous_extruder} 및 {next_extruder}에 대한 자리 표시자 변수를 사용할 " +"수 있습니다. 올바른 압출기로 변경되는 도구 변경 명령(예: T{next_extruder})이 " +"포함되면 PrusaSlicer는 다른 명령을 내림차순을 내보릅니다. 따라서 도구 변경 전" +"후에 사용자 지정 동작을 스크립팅할 수 있습니다." -#: src/libslic3r/PrintConfig.cpp:2070 +#: src/libslic3r/PrintConfig.cpp:2117 msgid "" "Set this to a non-zero value to set a manual extrusion width for infill for " "top surfaces. You may want to use thinner extrudates to fill all narrow " @@ -8000,7 +9281,7 @@ msgstr "" "으면 노즐 지름이 사용됩니다. 백분율 (예 : 90 %)로 표현하면 레이어 높이를 기준" "으로 계산됩니다." -#: src/libslic3r/PrintConfig.cpp:2081 +#: src/libslic3r/PrintConfig.cpp:2129 msgid "" "Speed for printing top solid layers (it only applies to the uppermost " "external layers and not to their internal solid layers). You may want to " @@ -8013,23 +9294,37 @@ msgstr "" "전 속도에 대한 백분율 (예 : 80 %)로 나타낼 수 있습니다. 자동으로 0으로 설정하" "십시오." -#: src/libslic3r/PrintConfig.cpp:2096 +#: src/libslic3r/PrintConfig.cpp:2144 msgid "Number of solid layers to generate on top surfaces." msgstr "상단 표면에 생성 할 솔리드 레이어 수입니다." -#: src/libslic3r/PrintConfig.cpp:2097 +#: src/libslic3r/PrintConfig.cpp:2145 msgid "Top solid layers" msgstr "탑 솔리드 레이어" -#: src/libslic3r/PrintConfig.cpp:2103 +#: src/libslic3r/PrintConfig.cpp:2153 +msgid "" +"The number of top solid layers is increased above top_solid_layers if " +"necessary to satisfy minimum thickness of top shell. This is useful to " +"prevent pillowing effect when printing with variable layer height." +msgstr "" +"상단 단층의 수는 상단 쉘의 최소 두께를 충족하기 위해 필요한 경우 " +"top_solid_layers 이상으로 증가한다. 이 기능은 가변 레이어 높이로 인쇄할 때 베" +"개 효과를 방지하는 데 유용합니다." + +#: src/libslic3r/PrintConfig.cpp:2156 +msgid "Minimum top shell thickness" +msgstr "최소 상단 쉘 두께" + +#: src/libslic3r/PrintConfig.cpp:2163 msgid "Speed for travel moves (jumps between distant extrusion points)." msgstr "이동 속도 (먼 돌출 점 사이의 점프)." -#: src/libslic3r/PrintConfig.cpp:2111 +#: src/libslic3r/PrintConfig.cpp:2171 msgid "Use firmware retraction" msgstr "펌웨어 철회" -#: src/libslic3r/PrintConfig.cpp:2112 +#: src/libslic3r/PrintConfig.cpp:2172 msgid "" "This experimental setting uses G10 and G11 commands to have the firmware " "handle the retraction. This is only supported in recent Marlin." @@ -8037,11 +9332,11 @@ msgstr "" "이 실험 설정은 G10 및 G11 명령을 사용하여 펌웨어에서 취소를 처리하도록합니" "다. 이것은 최근의 말린에서만 지원됩니다." -#: src/libslic3r/PrintConfig.cpp:2118 +#: src/libslic3r/PrintConfig.cpp:2178 msgid "Use relative E distances" msgstr "상대적인 E 거리 사용" -#: src/libslic3r/PrintConfig.cpp:2119 +#: src/libslic3r/PrintConfig.cpp:2179 msgid "" "If your firmware requires relative E values, check this, otherwise leave it " "unchecked. Most firmwares use absolute values." @@ -8049,11 +9344,11 @@ msgstr "" "펌웨어에 상대 E 값이 필요한 경우이 값을 선택하고, 그렇지 않으면 선택하지 마십" "시오. 대부분의 회사는 절대 값을 사용합니다." -#: src/libslic3r/PrintConfig.cpp:2125 +#: src/libslic3r/PrintConfig.cpp:2185 msgid "Use volumetric E" msgstr "용적 E 사용" -#: src/libslic3r/PrintConfig.cpp:2126 +#: src/libslic3r/PrintConfig.cpp:2186 msgid "" "This experimental setting uses outputs the E values in cubic millimeters " "instead of linear millimeters. If your firmware doesn't already know " @@ -8068,11 +9363,11 @@ msgstr "" "[filament_diameter_0] T0'과 같은 명령을 입력 할 수 있습니다 Slic3r. 이것은 최" "근의 말린에서만 지원됩니다." -#: src/libslic3r/PrintConfig.cpp:2136 +#: src/libslic3r/PrintConfig.cpp:2196 msgid "Enable variable layer height feature" msgstr "가변 레이어 높이 기능 사용" -#: src/libslic3r/PrintConfig.cpp:2137 +#: src/libslic3r/PrintConfig.cpp:2197 msgid "" "Some printers or printer setups may have difficulties printing with a " "variable layer height. Enabled by default." @@ -8080,11 +9375,11 @@ msgstr "" "일부 프린터 또는 프린터 설정은 가변 레이어 높이로 인쇄하는 데 어려움이있을 " "수 있습니다. 기본적으로 사용됩니다." -#: src/libslic3r/PrintConfig.cpp:2143 +#: src/libslic3r/PrintConfig.cpp:2203 msgid "Wipe while retracting" msgstr "수축시 닦아내십시오" -#: src/libslic3r/PrintConfig.cpp:2144 +#: src/libslic3r/PrintConfig.cpp:2204 msgid "" "This flag will move the nozzle while retracting to minimize the possible " "blob on leaky extruders." @@ -8092,19 +9387,19 @@ msgstr "" "이 플래그는 누출된 리트랙싱의 블럽 가능성을 최소화하기 위해 수축하는 동안 노" "즐을 이동시킨다." -#: src/libslic3r/PrintConfig.cpp:2151 +#: src/libslic3r/PrintConfig.cpp:2211 msgid "" "Multi material printers may need to prime or purge extruders on tool " "changes. Extrude the excess material into the wipe tower." msgstr "" -"멀티 메터리알 프린터는 공구 교환 시 익스트루더를 프라이밍하거나 제거해야 할 " +"다중 메터리알 프린터는 공구 교환 시 익스트루더를 프라이밍하거나 제거해야 할 " "수 있다. 과도한 물질을 와이퍼 타워에 돌출시킨다." -#: src/libslic3r/PrintConfig.cpp:2157 +#: src/libslic3r/PrintConfig.cpp:2217 msgid "Purging volumes - load/unload volumes" msgstr "볼륨 삭제 - 볼륨 로드/언로드" -#: src/libslic3r/PrintConfig.cpp:2158 +#: src/libslic3r/PrintConfig.cpp:2218 msgid "" "This vector saves required volumes to change from/to each tool used on the " "wipe tower. These values are used to simplify creation of the full purging " @@ -8114,11 +9409,11 @@ msgstr "" "을 저장 합니다. 이러한 값은 아래의 전체 퍼징 볼륨의 생성을 단순화 하는 데 사" "용 됩니다." -#: src/libslic3r/PrintConfig.cpp:2164 +#: src/libslic3r/PrintConfig.cpp:2224 msgid "Purging volumes - matrix" msgstr "볼륨 삭제 - 행렬" -#: src/libslic3r/PrintConfig.cpp:2165 +#: src/libslic3r/PrintConfig.cpp:2225 msgid "" "This matrix describes volumes (in cubic milimetres) required to purge the " "new filament on the wipe tower for any given pair of tools." @@ -8126,154 +9421,155 @@ msgstr "" "이 매트릭스는 지정 된 도구 쌍에 대해 와이퍼 타워의 새필라멘트를 제거 하는 데 " "필요한 체적 (입방 밀리 미터)을 설명 합니다." -#: src/libslic3r/PrintConfig.cpp:2174 +#: src/libslic3r/PrintConfig.cpp:2234 msgid "Position X" msgstr "X축 위치" -#: src/libslic3r/PrintConfig.cpp:2175 +#: src/libslic3r/PrintConfig.cpp:2235 msgid "X coordinate of the left front corner of a wipe tower" msgstr "와이프 타워의 좌측 전면 모서리의 X 좌표" -#: src/libslic3r/PrintConfig.cpp:2181 +#: src/libslic3r/PrintConfig.cpp:2241 msgid "Position Y" msgstr "Y축 위치" -#: src/libslic3r/PrintConfig.cpp:2182 +#: src/libslic3r/PrintConfig.cpp:2242 msgid "Y coordinate of the left front corner of a wipe tower" msgstr "와이퍼 작동 타워의 좌측 전방 모서리의 Y 좌표" -#: src/libslic3r/PrintConfig.cpp:2189 +#: src/libslic3r/PrintConfig.cpp:2249 msgid "Width of a wipe tower" msgstr "와이퍼 타워 폭" -#: src/libslic3r/PrintConfig.cpp:2195 +#: src/libslic3r/PrintConfig.cpp:2255 msgid "Wipe tower rotation angle" msgstr "와이퍼 타워 회전각도" -#: src/libslic3r/PrintConfig.cpp:2196 +#: src/libslic3r/PrintConfig.cpp:2256 msgid "Wipe tower rotation angle with respect to x-axis." msgstr "X 축에 대해 타워 회전 각도를 닦습니다." -#: src/libslic3r/PrintConfig.cpp:2203 +#: src/libslic3r/PrintConfig.cpp:2263 msgid "Wipe into this object's infill" -msgstr "이 오브젝트의 채우기로 지우기" +msgstr "이 객체(object)의 채우기로 지우기" -#: src/libslic3r/PrintConfig.cpp:2204 +#: src/libslic3r/PrintConfig.cpp:2264 msgid "" "Purging after toolchange will done inside this object's infills. This lowers " "the amount of waste but may result in longer print time due to additional " "travel moves." msgstr "" -"도구 변경 후 제거는 이 개체의 채우기 내부에서 수행 됩니다. 이렇게 하면 낭비 " -"되는 양이 줄어들지만 추가적인 이동으로 인해 인쇄 시간이 길어질 수 있습니다." +"도구 변경 후 제거는 이 객체(object)의 채우기 내부에서 수행 됩니다. 이렇게 하" +"면 낭비 되는 양이 줄어들지만 추가적인 이동으로 인해 인쇄 시간이 길어질 수 있" +"습니다." -#: src/libslic3r/PrintConfig.cpp:2211 +#: src/libslic3r/PrintConfig.cpp:2271 msgid "Wipe into this object" -msgstr "이 개체로 지우기" +msgstr "이 객체(object)로 지우기" -#: src/libslic3r/PrintConfig.cpp:2212 +#: src/libslic3r/PrintConfig.cpp:2272 msgid "" "Object will be used to purge the nozzle after a toolchange to save material " "that would otherwise end up in the wipe tower and decrease print time. " "Colours of the objects will be mixed as a result." msgstr "" -"객체는 도구 변경 후 노즐을 소거 하는 데 사용 되며, 그렇지 않으면 와이프 타워" -"에서 종료 되는 재료를 저장 하고 인쇄 시간을 줄입니다. 그 결과 개체의 색상이 " -"혼합 됩니다." +"객체(object)는 도구 변경 후 노즐을 소거 하는 데 사용 되며, 그렇지 않으면 와이" +"프 타워에서 종료 되는 재료를 저장 하고 인쇄 시간을 줄입니다. 그 결과 객체" +"(object)의 색상이 혼합 됩니다." -#: src/libslic3r/PrintConfig.cpp:2218 +#: src/libslic3r/PrintConfig.cpp:2278 msgid "Maximal bridging distance" msgstr "최대 브리징 거리" -#: src/libslic3r/PrintConfig.cpp:2219 +#: src/libslic3r/PrintConfig.cpp:2279 msgid "Maximal distance between supports on sparse infill sections." msgstr "드문드문한 인필 섹션에서 지지대 사이의 최대 거리." -#: src/libslic3r/PrintConfig.cpp:2225 +#: src/libslic3r/PrintConfig.cpp:2285 msgid "XY Size Compensation" -msgstr "XY 크기 보정" +msgstr "XY 수평 확장" -#: src/libslic3r/PrintConfig.cpp:2227 +#: src/libslic3r/PrintConfig.cpp:2287 msgid "" "The object will be grown/shrunk in the XY plane by the configured value " "(negative = inwards, positive = outwards). This might be useful for fine-" "tuning hole sizes." msgstr "" -"XY 평면에서 설정된 값(음수 = 안, 양 = 바깥쪽)에 따라 객체가 증가/정격된다. 이" -"는 구멍 크기를 미세 조정하는데 유용할 수 있다." +"XY 평면에서 설정된 값(음수 = 안, 양 = 바깥쪽)에 따라 객체(object)가 증가/정격" +"된다. 이는 구멍 크기를 미세 조정하는데 유용할 수 있다." -#: src/libslic3r/PrintConfig.cpp:2235 +#: src/libslic3r/PrintConfig.cpp:2295 msgid "Z offset" msgstr "Z 오프셋" -#: src/libslic3r/PrintConfig.cpp:2236 +#: src/libslic3r/PrintConfig.cpp:2296 msgid "" "This value will be added (or subtracted) from all the Z coordinates in the " "output G-code. It is used to compensate for bad Z endstop position: for " "example, if your endstop zero actually leaves the nozzle 0.3mm far from the " "print bed, set this to -0.3 (or fix your endstop)." msgstr "" -"이 값은 출력 G-코드의 모든 Z 좌표에서 추가(또는 감산)된다. 예를 들어, 엔드 스" +"이 값은 출력 G-code의 모든 Z 좌표에서 추가(또는 감산)된다. 예를 들어, 엔드 스" "톱 0이 실제로 노즐을 프린트 베드에서 0.3mm 떨어진 곳에 둔 경우, 이를 -0.3(또" "는 엔드 스톱을 고정)으로 설정하십시오." -#: src/libslic3r/PrintConfig.cpp:2294 +#: src/libslic3r/PrintConfig.cpp:2363 msgid "Display width" msgstr "디스플레이 너비" -#: src/libslic3r/PrintConfig.cpp:2295 +#: src/libslic3r/PrintConfig.cpp:2364 msgid "Width of the display" msgstr "디스플레이의 폭입니다" -#: src/libslic3r/PrintConfig.cpp:2300 +#: src/libslic3r/PrintConfig.cpp:2369 msgid "Display height" msgstr "표시 높이" -#: src/libslic3r/PrintConfig.cpp:2301 +#: src/libslic3r/PrintConfig.cpp:2370 msgid "Height of the display" msgstr "디스플레이의 높이" -#: src/libslic3r/PrintConfig.cpp:2306 +#: src/libslic3r/PrintConfig.cpp:2375 msgid "Number of pixels in" msgstr "의 픽셀 수" -#: src/libslic3r/PrintConfig.cpp:2308 +#: src/libslic3r/PrintConfig.cpp:2377 msgid "Number of pixels in X" msgstr "X의 픽셀 수" -#: src/libslic3r/PrintConfig.cpp:2314 +#: src/libslic3r/PrintConfig.cpp:2383 msgid "Number of pixels in Y" msgstr "Y의 픽셀 수" -#: src/libslic3r/PrintConfig.cpp:2319 +#: src/libslic3r/PrintConfig.cpp:2388 msgid "Display horizontal mirroring" msgstr "수평 미러링 표시" -#: src/libslic3r/PrintConfig.cpp:2320 +#: src/libslic3r/PrintConfig.cpp:2389 msgid "Mirror horizontally" msgstr "수평으로 미러" -#: src/libslic3r/PrintConfig.cpp:2321 +#: src/libslic3r/PrintConfig.cpp:2390 msgid "Enable horizontal mirroring of output images" msgstr "출력 이미지의 수평 미러링 사용" -#: src/libslic3r/PrintConfig.cpp:2326 +#: src/libslic3r/PrintConfig.cpp:2395 msgid "Display vertical mirroring" msgstr "수직 미러링 표시" -#: src/libslic3r/PrintConfig.cpp:2327 +#: src/libslic3r/PrintConfig.cpp:2396 msgid "Mirror vertically" msgstr "수직으로 미러" -#: src/libslic3r/PrintConfig.cpp:2328 +#: src/libslic3r/PrintConfig.cpp:2397 msgid "Enable vertical mirroring of output images" msgstr "출력 이미지의 수직 미러링 사용" -#: src/libslic3r/PrintConfig.cpp:2333 +#: src/libslic3r/PrintConfig.cpp:2402 msgid "Display orientation" msgstr "디스플레이 방향" -#: src/libslic3r/PrintConfig.cpp:2334 +#: src/libslic3r/PrintConfig.cpp:2403 msgid "" "Set the actual LCD display orientation inside the SLA printer. Portrait mode " "will flip the meaning of display width and height parameters and the output " @@ -8283,72 +9579,72 @@ msgstr "" "레이 너비 및 높이 매개 변수의 의미를 반전 하 고 출력 이미지는 90도 회전 합니" "다." -#: src/libslic3r/PrintConfig.cpp:2340 +#: src/libslic3r/PrintConfig.cpp:2409 msgid "Landscape" msgstr "가로" -#: src/libslic3r/PrintConfig.cpp:2341 +#: src/libslic3r/PrintConfig.cpp:2410 msgid "Portrait" msgstr "세로모드" -#: src/libslic3r/PrintConfig.cpp:2346 +#: src/libslic3r/PrintConfig.cpp:2415 msgid "Fast" msgstr "빠른" -#: src/libslic3r/PrintConfig.cpp:2347 +#: src/libslic3r/PrintConfig.cpp:2416 msgid "Fast tilt" msgstr "빠른 기울기" -#: src/libslic3r/PrintConfig.cpp:2348 +#: src/libslic3r/PrintConfig.cpp:2417 msgid "Time of the fast tilt" msgstr "기울이기 시간" -#: src/libslic3r/PrintConfig.cpp:2355 +#: src/libslic3r/PrintConfig.cpp:2424 msgid "Slow" msgstr "느리게" -#: src/libslic3r/PrintConfig.cpp:2356 +#: src/libslic3r/PrintConfig.cpp:2425 msgid "Slow tilt" msgstr "슬로우 틸트" -#: src/libslic3r/PrintConfig.cpp:2357 +#: src/libslic3r/PrintConfig.cpp:2426 msgid "Time of the slow tilt" msgstr "느린 기울기의 시간" -#: src/libslic3r/PrintConfig.cpp:2364 +#: src/libslic3r/PrintConfig.cpp:2433 msgid "Area fill" msgstr "영역 채우기" -#: src/libslic3r/PrintConfig.cpp:2365 +#: src/libslic3r/PrintConfig.cpp:2434 msgid "" "The percentage of the bed area. \n" "If the print area exceeds the specified value, \n" "then a slow tilt will be used, otherwise - a fast tilt" msgstr "" -"침대 영역의 비율입니다. \n" +"배드 영역의 비율입니다. \n" "인쇄 영역이 지정 된 값을 초과 하면 \n" "그런 다음 느린 기울기가 사용 됩니다, 그렇지 않으면-빠른 기울기가 됩니다" -#: src/libslic3r/PrintConfig.cpp:2372 src/libslic3r/PrintConfig.cpp:2373 -#: src/libslic3r/PrintConfig.cpp:2374 +#: src/libslic3r/PrintConfig.cpp:2441 src/libslic3r/PrintConfig.cpp:2442 +#: src/libslic3r/PrintConfig.cpp:2443 msgid "Printer scaling correction" msgstr "프린터 스케일링 보정" -#: src/libslic3r/PrintConfig.cpp:2380 src/libslic3r/PrintConfig.cpp:2381 +#: src/libslic3r/PrintConfig.cpp:2449 src/libslic3r/PrintConfig.cpp:2450 msgid "Printer absolute correction" msgstr "프린터 절대 보정" -#: src/libslic3r/PrintConfig.cpp:2382 +#: src/libslic3r/PrintConfig.cpp:2451 msgid "" "Will inflate or deflate the sliced 2D polygons according to the sign of the " "correction." msgstr "교정 기호에 따라 슬라이스된 2D 폴리곤을 팽창 하거나 수축 합니다." -#: src/libslic3r/PrintConfig.cpp:2388 src/libslic3r/PrintConfig.cpp:2389 +#: src/libslic3r/PrintConfig.cpp:2457 src/libslic3r/PrintConfig.cpp:2458 msgid "Printer gamma correction" msgstr "프린터 감마 보정" -#: src/libslic3r/PrintConfig.cpp:2390 +#: src/libslic3r/PrintConfig.cpp:2459 msgid "" "This will apply a gamma correction to the rasterized 2D polygons. A gamma " "value of zero means thresholding with the threshold in the middle. This " @@ -8358,89 +9654,133 @@ msgstr "" "중간에 임계값이 임계화 의미입니다. 이 동작은 폴리곤의 구멍을 잃지 않고 안티알" "리아싱을 제거 합니다." -#: src/libslic3r/PrintConfig.cpp:2401 src/libslic3r/PrintConfig.cpp:2402 +#: src/libslic3r/PrintConfig.cpp:2471 src/libslic3r/PrintConfig.cpp:2472 +msgid "SLA material type" +msgstr "SLA 재질 유형" + +#: src/libslic3r/PrintConfig.cpp:2483 src/libslic3r/PrintConfig.cpp:2484 msgid "Initial layer height" msgstr "초기 레이어 높이" -#: src/libslic3r/PrintConfig.cpp:2408 +#: src/libslic3r/PrintConfig.cpp:2490 src/libslic3r/PrintConfig.cpp:2491 +msgid "Bottle volume" +msgstr "병 볼륨" + +#: src/libslic3r/PrintConfig.cpp:2492 +msgid "ml" +msgstr "광년" + +#: src/libslic3r/PrintConfig.cpp:2497 src/libslic3r/PrintConfig.cpp:2498 +msgid "Bottle weight" +msgstr "병 무게" + +#: src/libslic3r/PrintConfig.cpp:2499 +msgid "kg" +msgstr "kg" + +#: src/libslic3r/PrintConfig.cpp:2506 +msgid "g/ml" +msgstr "g /ml" + +#: src/libslic3r/PrintConfig.cpp:2513 +msgid "money/bottle" +msgstr "돈 /병" + +#: src/libslic3r/PrintConfig.cpp:2518 msgid "Faded layers" msgstr "페이드 레이어" -#: src/libslic3r/PrintConfig.cpp:2409 +#: src/libslic3r/PrintConfig.cpp:2519 msgid "" "Number of the layers needed for the exposure time fade from initial exposure " "time to the exposure time" msgstr "노출 시간에 필요한 레이어 수는 초기 노출 시간에서 노출 시간으로 페이드" -#: src/libslic3r/PrintConfig.cpp:2416 src/libslic3r/PrintConfig.cpp:2417 +#: src/libslic3r/PrintConfig.cpp:2526 src/libslic3r/PrintConfig.cpp:2527 +msgid "Minimum exposure time" +msgstr "최소 노출 시간" + +#: src/libslic3r/PrintConfig.cpp:2534 src/libslic3r/PrintConfig.cpp:2535 +msgid "Maximum exposure time" +msgstr "최대 노출 시간" + +#: src/libslic3r/PrintConfig.cpp:2542 src/libslic3r/PrintConfig.cpp:2543 msgid "Exposure time" msgstr "노출 시간" -#: src/libslic3r/PrintConfig.cpp:2423 src/libslic3r/PrintConfig.cpp:2424 +#: src/libslic3r/PrintConfig.cpp:2549 src/libslic3r/PrintConfig.cpp:2550 +msgid "Minimum initial exposure time" +msgstr "최소 초기 노출 시간" + +#: src/libslic3r/PrintConfig.cpp:2557 src/libslic3r/PrintConfig.cpp:2558 +msgid "Maximum initial exposure time" +msgstr "최대 초기 노출 시간" + +#: src/libslic3r/PrintConfig.cpp:2565 src/libslic3r/PrintConfig.cpp:2566 msgid "Initial exposure time" msgstr "초기 노출 시간" -#: src/libslic3r/PrintConfig.cpp:2430 src/libslic3r/PrintConfig.cpp:2431 +#: src/libslic3r/PrintConfig.cpp:2572 src/libslic3r/PrintConfig.cpp:2573 msgid "Correction for expansion" msgstr "확장 보정" -#: src/libslic3r/PrintConfig.cpp:2437 +#: src/libslic3r/PrintConfig.cpp:2579 msgid "SLA print material notes" msgstr "SLA 인쇄 재료 참고 사항" -#: src/libslic3r/PrintConfig.cpp:2438 +#: src/libslic3r/PrintConfig.cpp:2580 msgid "You can put your notes regarding the SLA print material here." msgstr "여기에서 SLA 인쇄 자료에 대한 메모를 넣을 수 있습니다." -#: src/libslic3r/PrintConfig.cpp:2446 src/libslic3r/PrintConfig.cpp:2457 +#: src/libslic3r/PrintConfig.cpp:2592 src/libslic3r/PrintConfig.cpp:2603 msgid "Default SLA material profile" msgstr "기본 SLA 재질 프로 파일" -#: src/libslic3r/PrintConfig.cpp:2468 +#: src/libslic3r/PrintConfig.cpp:2614 msgid "Generate supports" msgstr "지원 생성" -#: src/libslic3r/PrintConfig.cpp:2470 +#: src/libslic3r/PrintConfig.cpp:2616 msgid "Generate supports for the models" msgstr "모델에 대한 지원 생성" -#: src/libslic3r/PrintConfig.cpp:2475 +#: src/libslic3r/PrintConfig.cpp:2621 msgid "Support head front diameter" msgstr "서포트 헤드 전면 지름" -#: src/libslic3r/PrintConfig.cpp:2477 +#: src/libslic3r/PrintConfig.cpp:2623 msgid "Diameter of the pointing side of the head" msgstr "헤드 포인팅 측면 지름" -#: src/libslic3r/PrintConfig.cpp:2484 +#: src/libslic3r/PrintConfig.cpp:2630 msgid "Support head penetration" msgstr "서포트 헤드 관통" -#: src/libslic3r/PrintConfig.cpp:2486 +#: src/libslic3r/PrintConfig.cpp:2632 msgid "How much the pinhead has to penetrate the model surface" msgstr "핀 헤드가 모델 표면에 침투 하는 정도" -#: src/libslic3r/PrintConfig.cpp:2493 +#: src/libslic3r/PrintConfig.cpp:2639 msgid "Support head width" msgstr "서포트 헤드 폭" -#: src/libslic3r/PrintConfig.cpp:2495 +#: src/libslic3r/PrintConfig.cpp:2641 msgid "Width from the back sphere center to the front sphere center" -msgstr "뒤쪽 구 중심에서 앞쪽 구 중심 까지의 폭입니다" +msgstr "뒤쪽 구 중재봉선에서 앞쪽 구 중재봉선 까지의 폭입니다" -#: src/libslic3r/PrintConfig.cpp:2503 +#: src/libslic3r/PrintConfig.cpp:2649 msgid "Support pillar diameter" msgstr "서포트 기둥 지름" -#: src/libslic3r/PrintConfig.cpp:2505 +#: src/libslic3r/PrintConfig.cpp:2651 msgid "Diameter in mm of the support pillars" msgstr "서포트 기둥의 지름 (mm)" -#: src/libslic3r/PrintConfig.cpp:2513 +#: src/libslic3r/PrintConfig.cpp:2659 msgid "Support pillar connection mode" msgstr "기둥 연결 모드 지원" -#: src/libslic3r/PrintConfig.cpp:2514 +#: src/libslic3r/PrintConfig.cpp:2660 msgid "" "Controls the bridge type between two neighboring pillars. Can be zig-zag, " "cross (double zig-zag) or dynamic which will automatically switch between " @@ -8450,23 +9790,23 @@ msgstr "" "로 처음 두 사이를 전환 하는 지그재그, 크로스 (지그재그 더블 지그재그) 또는 동" "적 수 있습니다." -#: src/libslic3r/PrintConfig.cpp:2522 +#: src/libslic3r/PrintConfig.cpp:2668 msgid "Zig-Zag" msgstr "지그재그" -#: src/libslic3r/PrintConfig.cpp:2523 +#: src/libslic3r/PrintConfig.cpp:2669 msgid "Cross" msgstr "크로스" -#: src/libslic3r/PrintConfig.cpp:2524 +#: src/libslic3r/PrintConfig.cpp:2670 msgid "Dynamic" msgstr "동적" -#: src/libslic3r/PrintConfig.cpp:2536 +#: src/libslic3r/PrintConfig.cpp:2682 msgid "Pillar widening factor" msgstr "기둥 확장 계수" -#: src/libslic3r/PrintConfig.cpp:2538 +#: src/libslic3r/PrintConfig.cpp:2684 msgid "" "Merging bridges or pillars into another pillars can increase the radius. " "Zero means no increase, one means full increase." @@ -8474,27 +9814,27 @@ msgstr "" "브릿지 또는 기둥을 다른 기둥에 병합 하면 반지름을 늘릴 수 있습니다. 0은 증가 " "없음을 의미 하나는 전체 증가를 의미 합니다." -#: src/libslic3r/PrintConfig.cpp:2547 +#: src/libslic3r/PrintConfig.cpp:2693 msgid "Support base diameter" msgstr "서포트 베이스 지름" -#: src/libslic3r/PrintConfig.cpp:2549 +#: src/libslic3r/PrintConfig.cpp:2695 msgid "Diameter in mm of the pillar base" msgstr "기둥 베이스의 mm 직경" -#: src/libslic3r/PrintConfig.cpp:2557 +#: src/libslic3r/PrintConfig.cpp:2703 msgid "Support base height" msgstr "서포트 기준 높이" -#: src/libslic3r/PrintConfig.cpp:2559 +#: src/libslic3r/PrintConfig.cpp:2705 msgid "The height of the pillar base cone" msgstr "서포트 베이스 원추의 높이" -#: src/libslic3r/PrintConfig.cpp:2566 +#: src/libslic3r/PrintConfig.cpp:2712 msgid "Support base safety distance" msgstr "지지기본 안전 거리" -#: src/libslic3r/PrintConfig.cpp:2569 +#: src/libslic3r/PrintConfig.cpp:2715 msgid "" "The minimum distance of the pillar base from the model in mm. Makes sense in " "zero elevation mode where a gap according to this parameter is inserted " @@ -8503,78 +9843,78 @@ msgstr "" "모델에서 기둥 베이스의 최소 거리(mm.mm.)는 이 매개변수에 따른 간격이 모델과 " "패드 사이에 삽입되는 제로 고도 모드에서 의미가 있습니다." -#: src/libslic3r/PrintConfig.cpp:2579 +#: src/libslic3r/PrintConfig.cpp:2725 msgid "Critical angle" msgstr "임계 각도" -#: src/libslic3r/PrintConfig.cpp:2581 +#: src/libslic3r/PrintConfig.cpp:2727 msgid "The default angle for connecting support sticks and junctions." msgstr "서포트 스틱과 접합부를 연결 하는 기본 각도입니다." -#: src/libslic3r/PrintConfig.cpp:2589 +#: src/libslic3r/PrintConfig.cpp:2735 msgid "Max bridge length" msgstr "최대 브리지 길이" -#: src/libslic3r/PrintConfig.cpp:2591 +#: src/libslic3r/PrintConfig.cpp:2737 msgid "The max length of a bridge" msgstr "브릿지의 최대 길이" -#: src/libslic3r/PrintConfig.cpp:2598 +#: src/libslic3r/PrintConfig.cpp:2744 msgid "Max pillar linking distance" msgstr "최대 기둥 연결 거리" -#: src/libslic3r/PrintConfig.cpp:2600 +#: src/libslic3r/PrintConfig.cpp:2746 msgid "" "The max distance of two pillars to get linked with each other. A zero value " "will prohibit pillar cascading." msgstr "" "서로 연결 되는 두기둥의 최대 거리. 0 값은 기둥을 계단식으로 금지 합니다." -#: src/libslic3r/PrintConfig.cpp:2608 +#: src/libslic3r/PrintConfig.cpp:2754 msgid "Object elevation" -msgstr "객체 고도" +msgstr "객체(object) 고도" -#: src/libslic3r/PrintConfig.cpp:2610 +#: src/libslic3r/PrintConfig.cpp:2756 msgid "" -"How much the supports should lift up the supported object. If this value is " -"zero, the bottom of the model geometry will be considered as part of the pad." +"How much the supports should lift up the supported object. If \"Pad around " +"object\" is enabled, this value is ignored." msgstr "" -"지원 대상을 들어 올려야 하는 양입니다. 이 값이 0이면 모델 형상의 맨 아래가 패" -"드의 일부로 간주됩니다." +"지원 대상을 들어 올려야 하는 양입니다. \"개체 주위 패드\"를 사용하도록 설정하" +"면 이 값은 무시됩니다." -#: src/libslic3r/PrintConfig.cpp:2622 +#: src/libslic3r/PrintConfig.cpp:2767 msgid "This is a relative measure of support points density." msgstr "이는 서포트 점 밀도의 상대적인 척도입니다." -#: src/libslic3r/PrintConfig.cpp:2628 +#: src/libslic3r/PrintConfig.cpp:2773 msgid "Minimal distance of the support points" msgstr "서포트 지점의 최소 거리" -#: src/libslic3r/PrintConfig.cpp:2630 +#: src/libslic3r/PrintConfig.cpp:2775 msgid "No support points will be placed closer than this threshold." msgstr "서포트 지점은 이 임계값 보다 더 가깝게 배치 되지 않습니다." -#: src/libslic3r/PrintConfig.cpp:2636 +#: src/libslic3r/PrintConfig.cpp:2781 msgid "Use pad" msgstr "패드 사용" -#: src/libslic3r/PrintConfig.cpp:2638 +#: src/libslic3r/PrintConfig.cpp:2783 msgid "Add a pad underneath the supported model" msgstr "서포트 되는 모델 아래에 패드 추가" -#: src/libslic3r/PrintConfig.cpp:2643 +#: src/libslic3r/PrintConfig.cpp:2788 msgid "Pad wall thickness" msgstr "패드 벽 두께" -#: src/libslic3r/PrintConfig.cpp:2645 +#: src/libslic3r/PrintConfig.cpp:2790 msgid "The thickness of the pad and its optional cavity walls." msgstr "패드의 두께와 옵션 캐비티 벽." -#: src/libslic3r/PrintConfig.cpp:2653 +#: src/libslic3r/PrintConfig.cpp:2798 msgid "Pad wall height" msgstr "패드 벽 높이" -#: src/libslic3r/PrintConfig.cpp:2654 +#: src/libslic3r/PrintConfig.cpp:2799 msgid "" "Defines the pad cavity depth. Set to zero to disable the cavity. Be careful " "when enabling this feature, as some resins may produce an extreme suction " @@ -8585,228 +9925,278 @@ msgstr "" "이 기능을 활성화 할 때 주의 해야할, 일부 수 캐비티 내부 극단적인 흡입 효과를 " "생성 할 수도 있기 때문에, vat 호일 인쇄를 벗겨 어렵게 만든다." -#: src/libslic3r/PrintConfig.cpp:2667 +#: src/libslic3r/PrintConfig.cpp:2812 +msgid "Pad brim size" +msgstr "패드 브럼 사이즈" + +#: src/libslic3r/PrintConfig.cpp:2813 +msgid "How far should the pad extend around the contained geometry" +msgstr "패드가 포함된 형상 주위로 얼마나 확장되어야 하는지" + +#: src/libslic3r/PrintConfig.cpp:2823 msgid "Max merge distance" msgstr "최대 병합 거리" -#: src/libslic3r/PrintConfig.cpp:2669 +#: src/libslic3r/PrintConfig.cpp:2825 msgid "" "Some objects can get along with a few smaller pads instead of a single big " "one. This parameter defines how far the center of two smaller pads should " "be. If theyare closer, they will get merged into one pad." msgstr "" -"일부 개체는 큰 하나 대신 몇 가지 작은 패드와 함께 얻을 수 있습니다. 이 매개 " -"변수는 두 개의 작은 패드의 중심이 얼마나 되어야 하는지 정의 합니다. 그들은 하" -"나의 패드에 병합을 얻을 것이다." +"일부 객체(object)는 큰 하나 대신 몇 가지 작은 패드와 함께 얻을 수 있습니다. " +"이 매개 변수는 두 개의 작은 패드의 중재봉선이 얼마나 되어야 하는지 정의 합니" +"다. 그들은 하나의 패드에 병합을 얻을 것이다." -#: src/libslic3r/PrintConfig.cpp:2680 -msgid "Pad edge radius" -msgstr "패드 가장자리 반경" - -#: src/libslic3r/PrintConfig.cpp:2689 +#: src/libslic3r/PrintConfig.cpp:2845 msgid "Pad wall slope" msgstr "패드 벽 경사" -#: src/libslic3r/PrintConfig.cpp:2691 +#: src/libslic3r/PrintConfig.cpp:2847 msgid "" "The slope of the pad wall relative to the bed plane. 90 degrees means " "straight walls." msgstr "" -"침대 평면을 기준으로 하는 패드 벽의 기울기입니다. 90도는 직선 벽을 의미 합니" +"배드 평면을 기준으로 하는 패드 벽의 기울기입니다. 90도는 직선 벽을 의미 합니" "다." -#: src/libslic3r/PrintConfig.cpp:2700 -msgid "Pad object gap" -msgstr "패드 오브젝트 갭" +#: src/libslic3r/PrintConfig.cpp:2856 +msgid "Pad around object" +msgstr "개체 주위패드" -#: src/libslic3r/PrintConfig.cpp:2702 +#: src/libslic3r/PrintConfig.cpp:2858 +msgid "Create pad around object and ignore the support elevation" +msgstr "오브젝트 주위에 패드를 작성하고 지지 고도를 무시합니다." + +#: src/libslic3r/PrintConfig.cpp:2863 +msgid "Pad around object everywhere" +msgstr "어디서나 개체 주위에 패드" + +#: src/libslic3r/PrintConfig.cpp:2865 +msgid "Force pad around object everywhere" +msgstr "사방 오브젝트 주위의 포스 패드" + +#: src/libslic3r/PrintConfig.cpp:2870 +msgid "Pad object gap" +msgstr "패드 객체(object) 갭" + +#: src/libslic3r/PrintConfig.cpp:2872 msgid "" "The gap between the object bottom and the generated pad in zero elevation " "mode." -msgstr "0 고도 모드에서 오브젝트 바닥과 생성된 패드 사이의 간격입니다." +msgstr "0 고도 모드에서 객체(object) 바닥과 생성된 패드 사이의 간격입니다." -#: src/libslic3r/PrintConfig.cpp:2711 +#: src/libslic3r/PrintConfig.cpp:2881 msgid "Pad object connector stride" -msgstr "패드 오브젝트 커넥터 보폭" +msgstr "패드 객체(object) 커넥터 보폭" -#: src/libslic3r/PrintConfig.cpp:2713 +#: src/libslic3r/PrintConfig.cpp:2883 msgid "" -"Distance between two connector sticks between the object pad and the " +"Distance between two connector sticks which connect the object and the " "generated pad." -msgstr "오브젝트 패드와 생성된 패드 사이의 두 커넥터 스틱 사이의 거리입니다." +msgstr "오브젝트와 생성된 패드를 연결하는 두 커넥터 스틱 사이의 거리입니다." -#: src/libslic3r/PrintConfig.cpp:2721 +#: src/libslic3r/PrintConfig.cpp:2890 msgid "Pad object connector width" -msgstr "패드 오브젝트 커넥터 너비" +msgstr "패드 객체(object) 커넥터 너비" -#: src/libslic3r/PrintConfig.cpp:2723 +#: src/libslic3r/PrintConfig.cpp:2892 msgid "" -"The width of the connectors sticks which connect the object pad and the " -"generated pad." -msgstr "커넥터의 너비는 오브젝트 패드와 생성된 패드를 연결하는 스틱입니다." +"Width of the connector sticks which connect the object and the generated pad." +msgstr "개체와 생성된 패드를 연결하는 커넥터 스틱의 너비입니다." -#: src/libslic3r/PrintConfig.cpp:2731 +#: src/libslic3r/PrintConfig.cpp:2899 msgid "Pad object connector penetration" -msgstr "패드 오브젝트 커넥터 침투" +msgstr "패드 객체(object) 커넥터 침투" -#: src/libslic3r/PrintConfig.cpp:2734 +#: src/libslic3r/PrintConfig.cpp:2902 msgid "How much should the tiny connectors penetrate into the model body." msgstr "작은 커넥터가 모델 본체에 얼마나 침투해야 하는가?" -#: src/libslic3r/PrintConfig.cpp:3094 +#: src/libslic3r/PrintConfig.cpp:2909 +msgid "Enable hollowing" +msgstr "속빈 공동 사용" + +#: src/libslic3r/PrintConfig.cpp:2911 +msgid "Hollow out a model to have an empty interior" +msgstr "빈 내부를 가지고 모델을 비우기" + +#: src/libslic3r/PrintConfig.cpp:2916 +msgid "Hollowing thickness" +msgstr "속빈 공동 두께" + +#: src/libslic3r/PrintConfig.cpp:2918 +msgid "Minimum wall thickness of a hollowed model." +msgstr "속이 빈 모델의 최소 벽 두께입니다." + +#: src/libslic3r/PrintConfig.cpp:2926 +msgid "Hollowing accuracy" +msgstr "속빈 공동 정확도" + +#: src/libslic3r/PrintConfig.cpp:2928 +msgid "" +"Performance vs accuracy of calculation. Lower values may produce unwanted " +"artifacts." +msgstr "" +"성능 대 계산의 정확성. 값이 낮을수록 원치 않는 아티팩트가 생성될 수 있습니다." + +#: src/libslic3r/PrintConfig.cpp:2935 +msgid "Hollowing closing distance" +msgstr "공동화된 닫힘 반경" + +#: src/libslic3r/PrintConfig.cpp:3315 msgid "Export OBJ" msgstr "OBJ 내보내기" -#: src/libslic3r/PrintConfig.cpp:3095 +#: src/libslic3r/PrintConfig.cpp:3316 msgid "Export the model(s) as OBJ." msgstr "모델을 OBJ로 내보냅니다." -#: src/libslic3r/PrintConfig.cpp:3106 +#: src/libslic3r/PrintConfig.cpp:3327 msgid "Export SLA" msgstr "STL로 내보내기" -#: src/libslic3r/PrintConfig.cpp:3107 +#: src/libslic3r/PrintConfig.cpp:3328 msgid "Slice the model and export SLA printing layers as PNG." msgstr "모델을 분할하고 SLA 인쇄 레이어를 PNG로 내보냅니다." -#: src/libslic3r/PrintConfig.cpp:3112 +#: src/libslic3r/PrintConfig.cpp:3333 msgid "Export 3MF" msgstr "3MF 내보내기" -#: src/libslic3r/PrintConfig.cpp:3113 +#: src/libslic3r/PrintConfig.cpp:3334 msgid "Export the model(s) as 3MF." msgstr "모델을 3MF로 내보냅니다." -#: src/libslic3r/PrintConfig.cpp:3117 +#: src/libslic3r/PrintConfig.cpp:3338 msgid "Export AMF" msgstr "AMF 내보내기" -#: src/libslic3r/PrintConfig.cpp:3118 +#: src/libslic3r/PrintConfig.cpp:3339 msgid "Export the model(s) as AMF." msgstr "모델을 AMF로 내보냅니다." -#: src/libslic3r/PrintConfig.cpp:3122 +#: src/libslic3r/PrintConfig.cpp:3343 msgid "Export STL" msgstr "STL 내보내기" -#: src/libslic3r/PrintConfig.cpp:3123 +#: src/libslic3r/PrintConfig.cpp:3344 msgid "Export the model(s) as STL." msgstr "모델을 STL로 내보냅니다." -#: src/libslic3r/PrintConfig.cpp:3128 +#: src/libslic3r/PrintConfig.cpp:3349 msgid "Slice the model and export toolpaths as G-code." msgstr "모델을 슬라이스하고 공구 경로를 G 코드로 내보냅니다." -#: src/libslic3r/PrintConfig.cpp:3133 +#: src/libslic3r/PrintConfig.cpp:3354 msgid "Slice" msgstr "슬라이스" -#: src/libslic3r/PrintConfig.cpp:3134 +#: src/libslic3r/PrintConfig.cpp:3355 msgid "" "Slice the model as FFF or SLA based on the printer_technology configuration " "value." msgstr "" " printer_technology 구성 값을 기반으로 모델을 FFF 또는 SLA로 슬라이스합니다." -#: src/libslic3r/PrintConfig.cpp:3139 +#: src/libslic3r/PrintConfig.cpp:3360 msgid "Help" msgstr "도움말" -#: src/libslic3r/PrintConfig.cpp:3140 +#: src/libslic3r/PrintConfig.cpp:3361 msgid "Show this help." msgstr "이 도움말을 표시 합니다." -#: src/libslic3r/PrintConfig.cpp:3145 +#: src/libslic3r/PrintConfig.cpp:3366 msgid "Help (FFF options)" msgstr "도움말 (FFF 옵션)" -#: src/libslic3r/PrintConfig.cpp:3146 +#: src/libslic3r/PrintConfig.cpp:3367 msgid "Show the full list of print/G-code configuration options." msgstr "인쇄/G 코드 구성 옵션의 전체 목록을 표시 합니다." -#: src/libslic3r/PrintConfig.cpp:3150 +#: src/libslic3r/PrintConfig.cpp:3371 msgid "Help (SLA options)" msgstr "도움말 (SLA 옵션)" -#: src/libslic3r/PrintConfig.cpp:3151 +#: src/libslic3r/PrintConfig.cpp:3372 msgid "Show the full list of SLA print configuration options." msgstr "SLA 인쇄 구성 옵션의 전체 목록을 표시 합니다." -#: src/libslic3r/PrintConfig.cpp:3155 +#: src/libslic3r/PrintConfig.cpp:3376 msgid "Output Model Info" msgstr "출력 모델 정보" -#: src/libslic3r/PrintConfig.cpp:3156 +#: src/libslic3r/PrintConfig.cpp:3377 msgid "Write information about the model to the console." msgstr "모델에 대한 정보를 콘솔에 씁니다." -#: src/libslic3r/PrintConfig.cpp:3160 +#: src/libslic3r/PrintConfig.cpp:3381 msgid "Save config file" msgstr "구성 파일 저장" -#: src/libslic3r/PrintConfig.cpp:3161 +#: src/libslic3r/PrintConfig.cpp:3382 msgid "Save configuration to the specified file." msgstr "지정 된 파일에 구성을 저장 합니다." -#: src/libslic3r/PrintConfig.cpp:3171 +#: src/libslic3r/PrintConfig.cpp:3392 msgid "Align XY" msgstr "XY 정렬" -#: src/libslic3r/PrintConfig.cpp:3172 +#: src/libslic3r/PrintConfig.cpp:3393 msgid "Align the model to the given point." msgstr "모델을 지정된 점에 맞춥니다." -#: src/libslic3r/PrintConfig.cpp:3177 +#: src/libslic3r/PrintConfig.cpp:3398 msgid "Cut model at the given Z." msgstr "지정된 Z에서 모델을 잘라냅니다." -#: src/libslic3r/PrintConfig.cpp:3198 +#: src/libslic3r/PrintConfig.cpp:3419 msgid "Center" msgstr "중앙" -#: src/libslic3r/PrintConfig.cpp:3199 +#: src/libslic3r/PrintConfig.cpp:3420 msgid "Center the print around the given center." -msgstr "지정된 점을 중심으로 인쇄 합니다." +msgstr "지정된 점을 중재봉선으로 인쇄 합니다." -#: src/libslic3r/PrintConfig.cpp:3203 +#: src/libslic3r/PrintConfig.cpp:3424 msgid "Don't arrange" msgstr "준비하지 마십시오" -#: src/libslic3r/PrintConfig.cpp:3204 +#: src/libslic3r/PrintConfig.cpp:3425 msgid "" "Do not rearrange the given models before merging and keep their original XY " "coordinates." msgstr "" "병합하기 전에 지정된 모델을 재정렬하고 원래 XY 좌표를 유지하지 마십시오." -#: src/libslic3r/PrintConfig.cpp:3207 +#: src/libslic3r/PrintConfig.cpp:3428 msgid "Duplicate" msgstr "복사" -#: src/libslic3r/PrintConfig.cpp:3208 +#: src/libslic3r/PrintConfig.cpp:3429 msgid "Multiply copies by this factor." msgstr "이 계수로 복사본을 곱합니다." -#: src/libslic3r/PrintConfig.cpp:3212 +#: src/libslic3r/PrintConfig.cpp:3433 msgid "Duplicate by grid" msgstr "모눈에 따라 복제" -#: src/libslic3r/PrintConfig.cpp:3213 +#: src/libslic3r/PrintConfig.cpp:3434 msgid "Multiply copies by creating a grid." msgstr "그리드를 만들어 복사본을 곱합니다." -#: src/libslic3r/PrintConfig.cpp:3216 +#: src/libslic3r/PrintConfig.cpp:3437 msgid "Merge" msgstr "병합" -#: src/libslic3r/PrintConfig.cpp:3217 +#: src/libslic3r/PrintConfig.cpp:3438 msgid "" "Arrange the supplied models in a plate and merge them in a single model in " "order to perform actions once." msgstr "" "한 번 작업을 수행하기 위해 제공 된 모델을 정렬하고 단일 모델로 병합 합니다." -#: src/libslic3r/PrintConfig.cpp:3222 +#: src/libslic3r/PrintConfig.cpp:3443 msgid "" "Try to repair any non-manifold meshes (this option is implicitly added " "whenever we need to slice the model to perform the requested action)." @@ -8814,58 +10204,59 @@ msgstr "" "메쉬를 복구 하십시오 (요청 된 작업을 수행 하기 위해 모델을 슬라이스 해야 할때" "마다 이 옵션이 암시적으로 추가 됨)." -#: src/libslic3r/PrintConfig.cpp:3226 +#: src/libslic3r/PrintConfig.cpp:3447 msgid "Rotation angle around the Z axis in degrees." msgstr "Z 축 주위 회전 각도입니다." -#: src/libslic3r/PrintConfig.cpp:3230 +#: src/libslic3r/PrintConfig.cpp:3451 msgid "Rotate around X" msgstr "X 주위 회전" -#: src/libslic3r/PrintConfig.cpp:3231 +#: src/libslic3r/PrintConfig.cpp:3452 msgid "Rotation angle around the X axis in degrees." -msgstr "X 축을 중심 회전 각도 입니다." +msgstr "X 축을 중재봉선 회전 각도 입니다." -#: src/libslic3r/PrintConfig.cpp:3235 +#: src/libslic3r/PrintConfig.cpp:3456 msgid "Rotate around Y" msgstr "Y 주위로 회전" -#: src/libslic3r/PrintConfig.cpp:3236 +#: src/libslic3r/PrintConfig.cpp:3457 msgid "Rotation angle around the Y axis in degrees." -msgstr "Y 축을 중심 회전 각도 입니다." +msgstr "Y 축을 중재봉선 회전 각도 입니다." -#: src/libslic3r/PrintConfig.cpp:3241 +#: src/libslic3r/PrintConfig.cpp:3462 msgid "Scaling factor or percentage." msgstr "배율 인수 또는 백분율입니다." -#: src/libslic3r/PrintConfig.cpp:3246 +#: src/libslic3r/PrintConfig.cpp:3467 msgid "" "Detect unconnected parts in the given model(s) and split them into separate " "objects." msgstr "" -"지정 된 모델에서 연결 되지 않은 부품을 감지 하여 별도의 객체로 분할 합니다." +"지정 된 모델에서 연결 되지 않은 부품(Part)을 감지 하여 별도의 객체(object)로 " +"분할 합니다." -#: src/libslic3r/PrintConfig.cpp:3249 +#: src/libslic3r/PrintConfig.cpp:3470 msgid "Scale to Fit" msgstr "크기에 맞게 조정" -#: src/libslic3r/PrintConfig.cpp:3250 +#: src/libslic3r/PrintConfig.cpp:3471 msgid "Scale to fit the given volume." msgstr "지정 된 볼륨에 맞게 크기를 조정 합니다." -#: src/libslic3r/PrintConfig.cpp:3259 +#: src/libslic3r/PrintConfig.cpp:3480 msgid "Ignore non-existent config files" msgstr "존재 하지 않는 구성 파일 무시" -#: src/libslic3r/PrintConfig.cpp:3260 +#: src/libslic3r/PrintConfig.cpp:3481 msgid "Do not fail if a file supplied to --load does not exist." msgstr "로드에 제공 된 파일이 없는 경우 실패 하지 않습니다." -#: src/libslic3r/PrintConfig.cpp:3263 +#: src/libslic3r/PrintConfig.cpp:3484 msgid "Load config file" msgstr "구성 파일 로드" -#: src/libslic3r/PrintConfig.cpp:3264 +#: src/libslic3r/PrintConfig.cpp:3485 msgid "" "Load configuration from the specified file. It can be used more than once to " "load options from multiple files." @@ -8873,22 +10264,22 @@ msgstr "" "지정 된 파일에서 구성을 로드 합니다. 여러 파일에서 옵션을 로드 하는 데 두 번 " "이상 사용할 수 있습니다." -#: src/libslic3r/PrintConfig.cpp:3267 +#: src/libslic3r/PrintConfig.cpp:3488 msgid "Output File" -msgstr "출력 파일" +msgstr "출력파일" -#: src/libslic3r/PrintConfig.cpp:3268 +#: src/libslic3r/PrintConfig.cpp:3489 msgid "" "The file where the output will be written (if not specified, it will be " "based on the input file)." msgstr "" "출력이 기록 되는 파일 (지정 하지 않은 경우 입력 파일을 기반으로 합니다)." -#: src/libslic3r/PrintConfig.cpp:3278 +#: src/libslic3r/PrintConfig.cpp:3499 msgid "Data directory" msgstr "데이터 디렉터리" -#: src/libslic3r/PrintConfig.cpp:3279 +#: src/libslic3r/PrintConfig.cpp:3500 msgid "" "Load and store settings at the given directory. This is useful for " "maintaining different profiles or including configurations from a network " @@ -8897,23 +10288,25 @@ msgstr "" "지정 된 디렉터리에 설정을 로드 하 고 저장 합니다. 이 기능은 다른 프로 파일을 " "유지 관리 하거나 네트워크 스토리지의 구성을 포함 하는 데 유용 합니다." -#: src/libslic3r/PrintConfig.cpp:3282 +#: src/libslic3r/PrintConfig.cpp:3503 msgid "Logging level" msgstr "로깅 수준" -#: src/libslic3r/PrintConfig.cpp:3283 +#: src/libslic3r/PrintConfig.cpp:3504 msgid "" -"Messages with severity lower or eqal to the loglevel will be printed out. 0:" -"trace, 1:debug, 2:info, 3:warning, 4:error, 5:fatal" +"Sets logging sensitivity. 0:fatal, 1:error, 2:warning, 3:info, 4:debug, 5:" +"trace\n" +"For example. loglevel=2 logs fatal, error and warning level messages." msgstr "" -"로그 수준에 대한 심각도가 낮거나 eqal인 메시지가 인쇄됩니다. 0:추적, 1:디버" -"그, 2:정보, 3:경고, 4:오류, 5:치명적" +"로깅 민감도를 설정합니다. 0:치명적, 1:오류, 2:경고, 3:info, 4:디버그, 5:" +"trace\n" +"예를 들어. loglevel=2 치명적인, 오류 및 경고 수준 메시지를 기록합니다." -#: src/libslic3r/PrintConfig.cpp:3288 +#: src/libslic3r/PrintConfig.cpp:3510 msgid "Render with a software renderer" msgstr "소프트웨어 렌더러를 사용 하 여 렌더링" -#: src/libslic3r/PrintConfig.cpp:3289 +#: src/libslic3r/PrintConfig.cpp:3511 msgid "" "Render with a software renderer. The bundled MESA software renderer is " "loaded instead of the default OpenGL driver." @@ -8921,57 +10314,38 @@ msgstr "" "소프트웨어 렌더러를 사용 하여 렌더링 합니다. 번들 메사 소프트웨어 렌더러는 기" "본 OpenGL 드라이버 대신 로드 됩니다." -#: src/libslic3r/PrintObject.cpp:110 +#: src/libslic3r/PrintObject.cpp:108 msgid "Processing triangulated mesh" -msgstr "삼각 측정 메시 처리" +msgstr "삼각 측정 메쉬 처리" -#: src/libslic3r/PrintObject.cpp:141 +#: src/libslic3r/PrintObject.cpp:152 msgid "Generating perimeters" msgstr "둘레 생성" -#: src/libslic3r/PrintObject.cpp:251 +#: src/libslic3r/PrintObject.cpp:255 msgid "Preparing infill" msgstr "채우기 준비" -#: src/libslic3r/PrintObject.cpp:391 +#: src/libslic3r/PrintObject.cpp:395 msgid "Generating support material" msgstr "지원할 서포트 생성" -#: src/libslic3r/GCode/PreviewData.cpp:176 -msgid "Mixed" -msgstr "혼합" - -#: src/libslic3r/GCode/PreviewData.cpp:396 +#: src/libslic3r/GCode/PreviewData.cpp:347 msgid "Height (mm)" msgstr "높이 (mm)" -#: src/libslic3r/GCode/PreviewData.cpp:398 +#: src/libslic3r/GCode/PreviewData.cpp:349 msgid "Width (mm)" msgstr "폭 (mm)" -#: src/libslic3r/GCode/PreviewData.cpp:400 +#: src/libslic3r/GCode/PreviewData.cpp:351 msgid "Speed (mm/s)" msgstr "속도 (mm/s)" -#: src/libslic3r/GCode/PreviewData.cpp:402 -msgid "Volumetric flow rate (mm3/s)" -msgstr "용적 유량값 (mm3/s)" +#: src/libslic3r/GCode/PreviewData.cpp:353 +msgid "Fan Speed (%)" +msgstr "팬 속도(%)" -#: src/libslic3r/GCode/PreviewData.cpp:493 -msgid "Default print color" -msgstr "기본 인쇄 색상" - -#: src/libslic3r/GCode/PreviewData.cpp:500 -#, c-format -msgid "up to %.2f mm" -msgstr "최대%.2f mm" - -#: src/libslic3r/GCode/PreviewData.cpp:504 -#, c-format -msgid "above %.2f mm" -msgstr "above %.2f mm" - -#: src/libslic3r/GCode/PreviewData.cpp:509 -#, c-format -msgid "%.2f - %.2f mm" -msgstr "%.2f - %.2f mm" \ No newline at end of file +#: src/libslic3r/GCode/PreviewData.cpp:355 +msgid "Volumetric flow rate (mm³/s)" +msgstr "체적 유량(mm³/s)" diff --git a/resources/localization/ko_KR/PrusaSlicer.po b/resources/localization/ko_KR/PrusaSlicer.po deleted file mode 100644 index 7513716a8a..0000000000 --- a/resources/localization/ko_KR/PrusaSlicer.po +++ /dev/null @@ -1,10351 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-08-06 09:54+0200\n" -"PO-Revision-Date: 2020-02-09 22:11+0900\n" -"Last-Translator: lee hak-min \n" -"Language-Team: ulsanether\n" -"Language: ko_KR\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.3\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"X-Crowdin-Project: slic3rkorean\n" -"X-Crowdin-Language: ko\n" -"X-Crowdin-File: ko_KR.po\n" - -#: src/slic3r/GUI/AboutDialog.cpp:39 src/slic3r/GUI/AboutDialog.cpp:291 -msgid "Portions copyright" -msgstr "다른 저작권" - -#: src/slic3r/GUI/AboutDialog.cpp:127 src/slic3r/GUI/AboutDialog.cpp:256 -msgid "Copyright" -msgstr "저작권" - -#. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:129 -msgid "" -"License agreements of all following programs (libraries) are part of " -"application license agreement" -msgstr "" -"다음의 모든 프로그램 (라이브러리)의 라이센스 계약은 응용 프로그램 라이센스 계" -"약의 일부입니다" - -#: src/slic3r/GUI/AboutDialog.cpp:199 -#, c-format -msgid "About %s" -msgstr "%s에 대하여" - -#: src/slic3r/GUI/AboutDialog.cpp:231 src/slic3r/GUI/MainFrame.cpp:64 -msgid "Version" -msgstr "버전" - -#. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:258 -msgid "is licensed under the" -msgstr "라이선스는" - -#: src/slic3r/GUI/AboutDialog.cpp:259 -msgid "GNU Affero General Public License, version 3" -msgstr "GNU Affero 일반 공중 사용 허가서, 버전 3" - -#: src/slic3r/GUI/AboutDialog.cpp:260 -msgid "" -"PrusaSlicer is based on Slic3r by Alessandro Ranellucci and the RepRap " -"community." -msgstr "" -"프루사슬라이서는 알레산드로 라넬루치와 RepRap 커뮤니티 Slic3r를 기반으로합니" -"다." - -#: src/slic3r/GUI/AboutDialog.cpp:261 -msgid "" -"Contributions by Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, " -"Petr Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik and " -"numerous others." -msgstr "" -"Contributions by Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, " -"Petr Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik and " -"numerous others. 한국어 번역 울산에테르, 밤송이직박구리" - -#: src/slic3r/GUI/AppConfig.cpp:118 -msgid "" -"Error parsing PrusaSlicer config file, it is probably corrupted. Try to " -"manually delete the file to recover from the error. Your user profiles will " -"not be affected." -msgstr "" -"PrusaSlicer 구성 파일을 구문 분석하는 오류, 아마 손상된 것입니다. 파일을 수동" -"으로 삭제하여 오류에 복구해 보십시오. 사용자 프로필은 영향을 받지 않습니다." - -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:118 -msgid "" -"Copying of the temporary G-code to the output G-code failed. Maybe the SD " -"card is write locked?" -msgstr "" -"임시 G-code를 출력할 SD카드에 복사하는 데 실패했습니다. SD카드의 락을 확인 하" -"시오." - -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:120 -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:470 -msgid "Running post-processing scripts" -msgstr "포스트 프로세싱 스크립트" - -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:122 -msgid "G-code file exported to %1%" -msgstr "%1%로 내보낸 G 코드 파일" - -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:126 -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:176 -msgid "Slicing complete" -msgstr "슬라이스 완료" - -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:172 -msgid "Masked SLA file exported to %1%" -msgstr "마스크 된 SLA 파일을 %1%로 내보냅니" - -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:214 -#, c-format -msgid "" -"%s has encountered an error. It was likely caused by running out of memory. " -"If you are sure you have enough RAM on your system, this may also be a bug " -"and we would be glad if you reported it." -msgstr "" -"%s에서 오류가 발생했습니다. 메모리 부족으로 인해 발생했을 수 있습니다. 시스템" -"에 충분한 RAM이 있다고 확신하는 경우 버그가 될 수 있으며 보고해 주길 바랍니" -"다." - -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:472 -msgid "Copying of the temporary G-code to the output G-code failed" -msgstr "임시 G 코드를 출력 G 코드에 복사 하지 못했습니다" - -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:497 -msgid "Scheduling upload to `%1%`. See Window -> Print Host Upload Queue" -msgstr "" -"`%1%`. 로 업로드를 예약 합니다. 창-> 인쇄 호스트 업로드 대기열을 참조 하십시" -"오" - -#: src/slic3r/GUI/BedShapeDialog.cpp:66 src/slic3r/GUI/GUI_ObjectList.cpp:2038 -msgid "Shape" -msgstr "모양" - -#: src/slic3r/GUI/BedShapeDialog.cpp:73 -msgid "Rectangular" -msgstr "직사각형" - -#: src/slic3r/GUI/BedShapeDialog.cpp:77 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:232 src/slic3r/GUI/Plater.cpp:162 -#: src/slic3r/GUI/Tab.cpp:2306 -msgid "Size" -msgstr "사이즈" - -#: src/slic3r/GUI/BedShapeDialog.cpp:78 -msgid "Size in X and Y of the rectangular plate." -msgstr "사각 플레이트 X 및 Y 크기." - -#: src/slic3r/GUI/BedShapeDialog.cpp:84 -msgid "Origin" -msgstr "원점" - -#: src/slic3r/GUI/BedShapeDialog.cpp:85 -msgid "" -"Distance of the 0,0 G-code coordinate from the front left corner of the " -"rectangle." -msgstr "사각 전면 왼쪽 모서리에서 원저(0, 0) G-code 좌표 거리입니다." - -#: src/slic3r/GUI/BedShapeDialog.cpp:89 -msgid "Circular" -msgstr "원형" - -#: src/slic3r/GUI/BedShapeDialog.cpp:92 src/slic3r/GUI/ConfigWizard.cpp:218 -#: src/slic3r/GUI/ConfigWizard.cpp:971 src/slic3r/GUI/ConfigWizard.cpp:985 -#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:87 -#: src/slic3r/GUI/GUI_ObjectLayers.cpp:135 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:333 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:94 -#: src/slic3r/GUI/WipeTowerDialog.cpp:85 src/libslic3r/PrintConfig.cpp:75 -#: src/libslic3r/PrintConfig.cpp:82 src/libslic3r/PrintConfig.cpp:91 -#: src/libslic3r/PrintConfig.cpp:178 src/libslic3r/PrintConfig.cpp:236 -#: src/libslic3r/PrintConfig.cpp:311 src/libslic3r/PrintConfig.cpp:319 -#: src/libslic3r/PrintConfig.cpp:369 src/libslic3r/PrintConfig.cpp:379 -#: src/libslic3r/PrintConfig.cpp:505 src/libslic3r/PrintConfig.cpp:516 -#: src/libslic3r/PrintConfig.cpp:534 src/libslic3r/PrintConfig.cpp:713 -#: src/libslic3r/PrintConfig.cpp:1240 src/libslic3r/PrintConfig.cpp:1301 -#: src/libslic3r/PrintConfig.cpp:1319 src/libslic3r/PrintConfig.cpp:1337 -#: src/libslic3r/PrintConfig.cpp:1393 src/libslic3r/PrintConfig.cpp:1403 -#: src/libslic3r/PrintConfig.cpp:1525 src/libslic3r/PrintConfig.cpp:1533 -#: src/libslic3r/PrintConfig.cpp:1574 src/libslic3r/PrintConfig.cpp:1582 -#: src/libslic3r/PrintConfig.cpp:1592 src/libslic3r/PrintConfig.cpp:1600 -#: src/libslic3r/PrintConfig.cpp:1608 src/libslic3r/PrintConfig.cpp:1691 -#: src/libslic3r/PrintConfig.cpp:1924 src/libslic3r/PrintConfig.cpp:1995 -#: src/libslic3r/PrintConfig.cpp:2029 src/libslic3r/PrintConfig.cpp:2157 -#: src/libslic3r/PrintConfig.cpp:2236 src/libslic3r/PrintConfig.cpp:2243 -#: src/libslic3r/PrintConfig.cpp:2250 src/libslic3r/PrintConfig.cpp:2280 -#: src/libslic3r/PrintConfig.cpp:2290 src/libslic3r/PrintConfig.cpp:2300 -#: src/libslic3r/PrintConfig.cpp:2485 src/libslic3r/PrintConfig.cpp:2624 -#: src/libslic3r/PrintConfig.cpp:2633 src/libslic3r/PrintConfig.cpp:2642 -#: src/libslic3r/PrintConfig.cpp:2652 src/libslic3r/PrintConfig.cpp:2696 -#: src/libslic3r/PrintConfig.cpp:2706 src/libslic3r/PrintConfig.cpp:2718 -#: src/libslic3r/PrintConfig.cpp:2738 src/libslic3r/PrintConfig.cpp:2748 -#: src/libslic3r/PrintConfig.cpp:2758 src/libslic3r/PrintConfig.cpp:2776 -#: src/libslic3r/PrintConfig.cpp:2791 src/libslic3r/PrintConfig.cpp:2805 -#: src/libslic3r/PrintConfig.cpp:2816 src/libslic3r/PrintConfig.cpp:2829 -#: src/libslic3r/PrintConfig.cpp:2874 src/libslic3r/PrintConfig.cpp:2884 -#: src/libslic3r/PrintConfig.cpp:2893 src/libslic3r/PrintConfig.cpp:2903 -#: src/libslic3r/PrintConfig.cpp:2919 -msgid "mm" -msgstr "mm" - -#: src/slic3r/GUI/BedShapeDialog.cpp:93 src/libslic3r/PrintConfig.cpp:710 -msgid "Diameter" -msgstr "노즐 직경" - -#: src/slic3r/GUI/BedShapeDialog.cpp:94 -msgid "" -"Diameter of the print bed. It is assumed that origin (0,0) is located in the " -"center." -msgstr "인쇄 배드의 직경. 원점 (0,0) 은 중재봉선에 있다고 가정합니다." - -#: src/slic3r/GUI/BedShapeDialog.cpp:98 src/slic3r/GUI/GUI_Preview.cpp:251 -#: src/libslic3r/ExtrusionEntity.cpp:322 -msgid "Custom" -msgstr "사용자 정의" - -#: src/slic3r/GUI/BedShapeDialog.cpp:102 -msgid "Load shape from STL..." -msgstr "STL파일 로드." - -#: src/slic3r/GUI/BedShapeDialog.cpp:155 -msgid "Settings" -msgstr "설정" - -#: src/slic3r/GUI/BedShapeDialog.cpp:172 -msgid "Texture" -msgstr "질감" - -#: src/slic3r/GUI/BedShapeDialog.cpp:182 src/slic3r/GUI/BedShapeDialog.cpp:261 -msgid "Load..." -msgstr "불러오기..." - -#: src/slic3r/GUI/BedShapeDialog.cpp:190 src/slic3r/GUI/BedShapeDialog.cpp:269 -#: src/slic3r/GUI/Tab.cpp:3094 -msgid "Remove" -msgstr "제거" - -#: src/slic3r/GUI/BedShapeDialog.cpp:223 src/slic3r/GUI/BedShapeDialog.cpp:302 -msgid "Not found: " -msgstr "찾을 수 없음:" - -#: src/slic3r/GUI/BedShapeDialog.cpp:251 -msgid "Model" -msgstr "모델" - -#: src/slic3r/GUI/BedShapeDialog.cpp:487 -msgid "Choose an STL file to import bed shape from:" -msgstr "가져올 베드 모양을(STL 파일) 선택합니다:" - -#: src/slic3r/GUI/BedShapeDialog.cpp:494 src/slic3r/GUI/BedShapeDialog.cpp:543 -#: src/slic3r/GUI/BedShapeDialog.cpp:566 -msgid "Invalid file format." -msgstr "잘못된 파일 형식." - -#: src/slic3r/GUI/BedShapeDialog.cpp:505 -msgid "Error! Invalid model" -msgstr "오류! 잘못된 모델" - -#: src/slic3r/GUI/BedShapeDialog.cpp:513 -msgid "The selected file contains no geometry." -msgstr "선택한 파일에 없는 형상이 있습니다." - -#: src/slic3r/GUI/BedShapeDialog.cpp:517 -msgid "" -"The selected file contains several disjoint areas. This is not supported." -msgstr "" -"선택한 파일은 여러개의 분리 된 영역을 포함 되어 있어 지원 되지 않습니다." - -#: src/slic3r/GUI/BedShapeDialog.cpp:532 -msgid "Choose a file to import bed texture from (PNG/SVG):" -msgstr "(PNG /SVG)에서 배드 텍스처를 가져올 파일을 선택합니다." - -#: src/slic3r/GUI/BedShapeDialog.cpp:555 -msgid "Choose an STL file to import bed model from:" -msgstr "다음에서 베드 모델을 가져올 STL 파일을 선택합니다:" - -#: src/slic3r/GUI/BedShapeDialog.hpp:59 src/slic3r/GUI/ConfigWizard.cpp:930 -msgid "Bed Shape" -msgstr "배드 모양" - -#: src/slic3r/GUI/BonjourDialog.cpp:55 -msgid "Network lookup" -msgstr "네트워크 조회" - -#: src/slic3r/GUI/BonjourDialog.cpp:72 -msgid "Address" -msgstr "주소" - -#: src/slic3r/GUI/BonjourDialog.cpp:73 -msgid "Hostname" -msgstr "호스트이름" - -#: src/slic3r/GUI/BonjourDialog.cpp:74 -msgid "Service name" -msgstr "서비스 이름" - -#: src/slic3r/GUI/BonjourDialog.cpp:76 -msgid "OctoPrint version" -msgstr "옥토프린트 버전" - -#: src/slic3r/GUI/BonjourDialog.cpp:218 -msgid "Searching for devices" -msgstr "디바이스 검색" - -#: src/slic3r/GUI/BonjourDialog.cpp:225 -msgid "Finished" -msgstr "완료" - -#: src/slic3r/GUI/ButtonsDescription.cpp:16 -msgid "Buttons And Text Colors Description" -msgstr "버튼 및 텍스트 색상 설명" - -#: src/slic3r/GUI/ButtonsDescription.cpp:36 -msgid "Value is the same as the system value" -msgstr "이 값은 시스템 값과 같습니다" - -#: src/slic3r/GUI/ButtonsDescription.cpp:53 -msgid "" -"Value was changed and is not equal to the system value or the last saved " -"preset" -msgstr "값이 변경 되었고, 시스템 값 또는 마지막으로 저장된 설정값과 다릅니다." - -#: src/slic3r/GUI/ConfigManipulation.cpp:48 -msgid "" -"Zero layer height is not valid.\n" -"\n" -"The layer height will be reset to 0.01." -msgstr "" -"바닥 레이어 높이가 잘못되었습니다.\n" -"\n" -"레이어 높이가 0.01로 재설정됩니다." - -#: src/slic3r/GUI/ConfigManipulation.cpp:49 -#: src/slic3r/GUI/GUI_ObjectLayers.cpp:27 src/slic3r/GUI/Tab.cpp:1039 -#: src/libslic3r/PrintConfig.cpp:71 -msgid "Layer height" -msgstr "레이어 높이" - -#: src/slic3r/GUI/ConfigManipulation.cpp:60 -msgid "" -"Zero first layer height is not valid.\n" -"\n" -"The first layer height will be reset to 0.01." -msgstr "" -"첫 번째 레이어 높이가 0이면 유효하지 않습니다.\n" -"\n" -"첫 번째 레이어 높이는 0.01로 재설정됩니다." - -#: src/slic3r/GUI/ConfigManipulation.cpp:61 src/libslic3r/PrintConfig.cpp:890 -msgid "First layer height" -msgstr "첫 레이어 높이" - -#: src/slic3r/GUI/ConfigManipulation.cpp:75 -#, no-c-format -msgid "" -"The Spiral Vase mode requires:\n" -"- one perimeter\n" -"- no top solid layers\n" -"- 0% fill density\n" -"- no support material\n" -"- inactive Ensure vertical shell thickness" -msgstr "" -"나선형 꽃병 모드는 다음을 필요로 합니다.\n" -"- 하나의 둘레\n" -"- 상단 솔리드 레이어 없음\n" -"- 0% 충진 밀도\n" -"- 서포트가 필요 없음\n" -"- 비활성 수직 쉘 두께 보장" - -#: src/slic3r/GUI/ConfigManipulation.cpp:82 -msgid "Shall I adjust those settings in order to enable Spiral Vase?" -msgstr "나선형 꽃병을 활성화하기 위해 이러한 설정을 조정해야 합니까?" - -#: src/slic3r/GUI/ConfigManipulation.cpp:83 -msgid "Spiral Vase" -msgstr "스파이럴 바이스" - -#: src/slic3r/GUI/ConfigManipulation.cpp:107 -msgid "" -"The Wipe Tower currently supports the non-soluble supports only\n" -"if they are printed with the current extruder without triggering a tool " -"change.\n" -"(both support_material_extruder and support_material_interface_extruder need " -"to be set to 0)." -msgstr "" -"와이프 타워는 현재 비수용성 지원만 지원합니다.\n" -"공구 교환을 트리거하지 않고 현재 압출기로 인쇄된 경우\n" -"(support_material_extruder support_material_interface_extruder 모두 0으로 설" -"정해야 합니다)." - -#: src/slic3r/GUI/ConfigManipulation.cpp:111 -msgid "Shall I adjust those settings in order to enable the Wipe Tower?" -msgstr "와이프 타워를 활성화하기 위해 이러한 설정을 조정해야 합니까?" - -#: src/slic3r/GUI/ConfigManipulation.cpp:112 -#: src/slic3r/GUI/ConfigManipulation.cpp:132 -msgid "Wipe Tower" -msgstr "와이프 타워(Wipe Tower)" - -#: src/slic3r/GUI/ConfigManipulation.cpp:128 -msgid "" -"For the Wipe Tower to work with the soluble supports, the support layers\n" -"need to be synchronized with the object layers." -msgstr "" -"와이프 타워가 가용성 지지체와 함께 작동 하려면 서포트 레이어를 객체(object) " -"레이어와 동기화 해야 합니다." - -#: src/slic3r/GUI/ConfigManipulation.cpp:131 -msgid "Shall I synchronize support layers in order to enable the Wipe Tower?" -msgstr "와이프 타워를 활성화하기 위해 지원 레이어를 동기화해야 합니까?" - -#: src/slic3r/GUI/ConfigManipulation.cpp:151 -msgid "" -"Supports work better, if the following feature is enabled:\n" -"- Detect bridging perimeters" -msgstr "" -"다음 기능이 활성화된 경우 더 나은 작업을 지원합니다.\n" -"- 브리징 경계를 감지" - -#: src/slic3r/GUI/ConfigManipulation.cpp:154 -msgid "Shall I adjust those settings for supports?" -msgstr "지원에 대한 설정을 조정해야 합니까?" - -#: src/slic3r/GUI/ConfigManipulation.cpp:155 -msgid "Support Generator" -msgstr "서포트 생성" - -#: src/slic3r/GUI/ConfigManipulation.cpp:200 -msgid "The %1% infill pattern is not supposed to work at 100%% density." -msgstr "%1% 채우기 패턴은 100% 밀도로 작동하도록 되어 있지 않습니다." - -#: src/slic3r/GUI/ConfigManipulation.cpp:202 -msgid "Shall I switch to rectilinear fill pattern?" -msgstr "직선 채우기 패턴으로 전환해야 합니까?" - -#: src/slic3r/GUI/ConfigManipulation.cpp:203 -#: src/slic3r/GUI/GUI_ObjectList.cpp:35 src/slic3r/GUI/GUI_ObjectList.cpp:94 -#: src/slic3r/GUI/GUI_ObjectList.cpp:612 src/slic3r/GUI/Plater.cpp:524 -#: src/slic3r/GUI/Tab.cpp:1081 src/slic3r/GUI/Tab.cpp:1082 -#: src/libslic3r/PrintConfig.cpp:193 src/libslic3r/PrintConfig.cpp:416 -#: src/libslic3r/PrintConfig.cpp:436 src/libslic3r/PrintConfig.cpp:777 -#: src/libslic3r/PrintConfig.cpp:791 src/libslic3r/PrintConfig.cpp:828 -#: src/libslic3r/PrintConfig.cpp:982 src/libslic3r/PrintConfig.cpp:992 -#: src/libslic3r/PrintConfig.cpp:1010 src/libslic3r/PrintConfig.cpp:1029 -#: src/libslic3r/PrintConfig.cpp:1048 src/libslic3r/PrintConfig.cpp:1738 -#: src/libslic3r/PrintConfig.cpp:1755 -msgid "Infill" -msgstr "인필(채움)" - -#: src/slic3r/GUI/ConfigManipulation.cpp:309 -msgid "Head penetration should not be greater than the head width." -msgstr "헤드 관통은 헤드 폭 보다 크지 않아야 합니다." - -#: src/slic3r/GUI/ConfigManipulation.cpp:311 -msgid "Invalid Head penetration" -msgstr "잘못된 헤드 관통" - -#: src/slic3r/GUI/ConfigManipulation.cpp:322 -msgid "Pinhead diameter should be smaller than the pillar diameter." -msgstr "핀헤드 지름은 기둥 지름 보다 작아야 합니다." - -#: src/slic3r/GUI/ConfigManipulation.cpp:324 -msgid "Invalid pinhead diameter" -msgstr "잘못된 핀 헤드 지름" - -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:18 -msgid "Upgrade" -msgstr "업그레이드" - -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:20 -msgid "Downgrade" -msgstr "다운그레이드" - -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:22 -msgid "Before roll back" -msgstr "롤백 전에" - -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:24 -msgid "User" -msgstr "사용자" - -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:27 -msgid "Unknown" -msgstr "알 수 없음" - -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:43 -msgid "Active" -msgstr "활동중" - -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:50 -msgid "PrusaSlicer version" -msgstr "Prusa슬라이서 버전" - -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:51 src/slic3r/GUI/Preset.cpp:1452 -msgid "print" -msgstr "출력" - -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:52 -msgid "filaments" -msgstr "필라멘트" - -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:53 src/slic3r/GUI/Preset.cpp:1456 -msgid "printer" -msgstr "프린터" - -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:57 src/slic3r/GUI/Tab.cpp:961 -msgid "vendor" -msgstr "제조 회사" - -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:57 -msgid "version" -msgstr "버전" - -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:58 -msgid "min PrusaSlicer version" -msgstr "이전 slic3r 버전" - -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:60 -msgid "max PrusaSlicer version" -msgstr "최신 slic3r 버전" - -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:63 -msgid "model" -msgstr "모델" - -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:63 -msgid "variants" -msgstr "변종" - -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:75 -#, c-format -msgid "Incompatible with this %s" -msgstr "%s 과 호환되지 않습니다" - -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:78 -msgid "Activate" -msgstr "활성화" - -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:104 -msgid "Configuration Snapshots" -msgstr "구성 스냅숏" - -#: src/slic3r/GUI/ConfigWizard.cpp:218 -msgid "nozzle" -msgstr "노즐" - -#: src/slic3r/GUI/ConfigWizard.cpp:222 -msgid "Alternate nozzles:" -msgstr "대체 노즐:" - -#: src/slic3r/GUI/ConfigWizard.cpp:289 -msgid "All standard" -msgstr "모두 표준설정" - -#: src/slic3r/GUI/ConfigWizard.cpp:289 -msgid "Standard" -msgstr "표준" - -#: src/slic3r/GUI/ConfigWizard.cpp:290 src/slic3r/GUI/ConfigWizard.cpp:573 -#: src/slic3r/GUI/Tab.cpp:3144 -msgid "All" -msgstr "모두 선택" - -#: src/slic3r/GUI/ConfigWizard.cpp:291 src/slic3r/GUI/ConfigWizard.cpp:574 -#: src/slic3r/GUI/Plater.cpp:496 src/slic3r/GUI/Plater.cpp:636 -#: src/libslic3r/ExtrusionEntity.cpp:309 -msgid "None" -msgstr "없음" - -#: src/slic3r/GUI/ConfigWizard.cpp:427 -#, c-format -msgid "Welcome to the %s Configuration Assistant" -msgstr "%s 구성 도우미에 오신 것을 환영 합니다" - -#: src/slic3r/GUI/ConfigWizard.cpp:429 -#, c-format -msgid "Welcome to the %s Configuration Wizard" -msgstr "%s 구성 마법사에 오신 것을 환영 합니다" - -#: src/slic3r/GUI/ConfigWizard.cpp:431 -msgid "Welcome" -msgstr "환영합니다" - -#: src/slic3r/GUI/ConfigWizard.cpp:433 -#, c-format -msgid "" -"Hello, welcome to %s! This %s helps you with the initial configuration; just " -"a few settings and you will be ready to print." -msgstr "" -"안녕하세요 ,%s에 오신 것을 환영 합니다! 이 %s는 초기 구성에 도움이 됩니다. " -"몇 가지 설정만으로 인쇄 준비가 될 것입니다." - -#: src/slic3r/GUI/ConfigWizard.cpp:438 -msgid "" -"Remove user profiles - install from scratch (a snapshot will be taken " -"beforehand)" -msgstr "사용자 프로필 제거 - 처음부터 설치 (스냅숏 값은 먼저 저장 됩니다.)" - -#: src/slic3r/GUI/ConfigWizard.cpp:481 -#, c-format -msgid "%s Family" -msgstr "%s의 가족들" - -#: src/slic3r/GUI/ConfigWizard.cpp:565 -msgid "Vendor:" -msgstr "벤더:" - -#: src/slic3r/GUI/ConfigWizard.cpp:566 -msgid "Profile:" -msgstr "프로필:" - -#: src/slic3r/GUI/ConfigWizard.cpp:603 src/slic3r/GUI/ConfigWizard.cpp:631 -msgid "(All)" -msgstr "(모두)" - -#: src/slic3r/GUI/ConfigWizard.cpp:732 -msgid "Custom Printer Setup" -msgstr "사용자 지정 프린터 설정" - -#: src/slic3r/GUI/ConfigWizard.cpp:732 -msgid "Custom Printer" -msgstr "사용자 정의 프린터" - -#: src/slic3r/GUI/ConfigWizard.cpp:734 -msgid "Define a custom printer profile" -msgstr "사용자 정의 프린터 프로필" - -#: src/slic3r/GUI/ConfigWizard.cpp:736 -msgid "Custom profile name:" -msgstr "사용자 정의 프로필 명칭:" - -#: src/slic3r/GUI/ConfigWizard.cpp:760 -msgid "Automatic updates" -msgstr "자동 업데이트" - -#: src/slic3r/GUI/ConfigWizard.cpp:760 -msgid "Updates" -msgstr "업데이트" - -#: src/slic3r/GUI/ConfigWizard.cpp:768 src/slic3r/GUI/Preferences.cpp:64 -msgid "Check for application updates" -msgstr "프로그램 업데이트 확인" - -#: src/slic3r/GUI/ConfigWizard.cpp:772 -#, c-format -msgid "" -"If enabled, %s checks for new application versions online. When a new " -"version becomes available, a notification is displayed at the next " -"application startup (never during program usage). This is only a " -"notification mechanisms, no automatic installation is done." -msgstr "" -"활성화 된 경우 %s은 온라인의 새 버전을 확인합니다. 새 버전을 사용할 수 있게 " -"되면, 다음 응용 프로그램 시작시 알림이 표시됩니다 (프로그램 사용 중에는 절대" -"로 사용하지 마십시오).이것은 단순한 알림 일뿐 자동으로 설치가 되지 않습니다." - -#: src/slic3r/GUI/ConfigWizard.cpp:778 src/slic3r/GUI/Preferences.cpp:82 -msgid "Update built-in Presets automatically" -msgstr "기존의 설정 자동 업데이트" - -#: src/slic3r/GUI/ConfigWizard.cpp:782 -#, c-format -msgid "" -"If enabled, %s downloads updates of built-in system presets in the " -"background.These updates are downloaded into a separate temporary location." -"When a new preset version becomes available it is offered at application " -"startup." -msgstr "" -"활성화 된 경우 %s은 백그라운드에서, 시스템 사전 설정을 다운로드합니다. 이러" -"한 업데이트는 별도의 임시 위치에 다운로드됩니다. 새로운 사전 설정 버전을 사용" -"할 수 있게되면 응용 프로그램 시작시 제공됩니다." - -#: src/slic3r/GUI/ConfigWizard.cpp:785 -msgid "" -"Updates are never applied without user's consent and never overwrite user's " -"customized settings." -msgstr "" -"업데이트는 사용자의 동의를 받아야 하고, 지정된 이전 설정을 덮어 쓰지 않습니" -"다." - -#: src/slic3r/GUI/ConfigWizard.cpp:790 -msgid "" -"Additionally a backup snapshot of the whole configuration is created before " -"an update is applied." -msgstr "" -"또한 업데이트가 적용되기 전에 전체 구성의 백업 구성(스냅샷)이 생성됩니다." - -#: src/slic3r/GUI/ConfigWizard.cpp:798 src/slic3r/GUI/GUI_ObjectList.cpp:1655 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1658 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3932 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3935 src/slic3r/GUI/Plater.cpp:3211 -#: src/slic3r/GUI/Plater.cpp:3946 src/slic3r/GUI/Plater.cpp:3949 -#: src/slic3r/GUI/Plater.cpp:3980 src/slic3r/GUI/Plater.cpp:3983 -msgid "Reload from disk" -msgstr "디스크에서 다시 불러오기" - -#: src/slic3r/GUI/ConfigWizard.cpp:801 -msgid "" -"Export full pathnames of models and parts sources into 3mf and amf files" -msgstr "모델 및 부품 소스의 전체 경로 이름을 3mf 및 amf 파일로 내보내기" - -#: src/slic3r/GUI/ConfigWizard.cpp:805 -msgid "" -"If enabled, allows the Reload from disk command to automatically find and " -"load the files when invoked.\n" -"If not enabled, the Reload from disk command will ask to select each file " -"using an open file dialog." -msgstr "" -"활성화된 경우 디스크에서 다시 로드 명령을 사용하여 호출될 때 파일을 자동으로 " -"찾고 로드할 수 있습니다.\n" -"활성화되지 않으면 디스크에서 다시 로드 명령에서 열린 파일 대화 상자를 사용하" -"여 각 파일을 선택하라는 요청이 표시됩니다." - -#: src/slic3r/GUI/ConfigWizard.cpp:814 -msgid "View mode" -msgstr "방법 보기" - -#: src/slic3r/GUI/ConfigWizard.cpp:816 -msgid "" -"PrusaSlicer's user interfaces comes in three variants:\n" -"Simple, Advanced, and Expert.\n" -"The Simple mode shows only the most frequently used settings relevant for " -"regular 3D printing. The other two offer progressively more sophisticated " -"fine-tuning, they are suitable for advanced and expert users, respectively." -msgstr "" -"PrusaSlicer의 사용자 인터페이스는 세 가지 변형으로 제공됩니다.\n" -"간단하고 고급, 전문가.\n" -"단순 모드는 일반 3D 인쇄와 관련된 가장 자주 사용되는 설정만 표시합니다. 다른 " -"두 가지는 점진적으로 더 정교한 미세 조정을 제공하며, 각각 고급 및 전문가 사용" -"자에게 적합합니다." - -#: src/slic3r/GUI/ConfigWizard.cpp:821 -msgid "Simple mode" -msgstr "단순 모드" - -#: src/slic3r/GUI/ConfigWizard.cpp:822 -msgid "Advanced mode" -msgstr "고급 모드" - -#: src/slic3r/GUI/ConfigWizard.cpp:823 -msgid "Expert mode" -msgstr "전문가 모드" - -#: src/slic3r/GUI/ConfigWizard.cpp:857 -msgid "Other Vendors" -msgstr "다른 공급 업체" - -#: src/slic3r/GUI/ConfigWizard.cpp:861 -#, c-format -msgid "Pick another vendor supported by %s" -msgstr "%s가 지원하는 다른 공급 업체를 선택하십시오:" - -#: src/slic3r/GUI/ConfigWizard.cpp:892 -msgid "Firmware Type" -msgstr "펌웨어 종류" - -#: src/slic3r/GUI/ConfigWizard.cpp:892 src/slic3r/GUI/Tab.cpp:1931 -msgid "Firmware" -msgstr "펌웨어" - -#: src/slic3r/GUI/ConfigWizard.cpp:896 -msgid "Choose the type of firmware used by your printer." -msgstr "프린터에 업로드 할 펌웨어를 선택하세요." - -#: src/slic3r/GUI/ConfigWizard.cpp:930 -msgid "Bed Shape and Size" -msgstr "배드 모양과 크기" - -#: src/slic3r/GUI/ConfigWizard.cpp:933 -msgid "Set the shape of your printer's bed." -msgstr "프린터 배드모양을 설정하세요." - -#: src/slic3r/GUI/ConfigWizard.cpp:953 -msgid "Filament and Nozzle Diameters" -msgstr "필라멘트와 노즐 크기" - -#: src/slic3r/GUI/ConfigWizard.cpp:953 -msgid "Print Diameters" -msgstr "인쇄 직경" - -#: src/slic3r/GUI/ConfigWizard.cpp:967 -msgid "Enter the diameter of your printer's hot end nozzle." -msgstr "핫 엔드 노즐 직경을 입력하십시오." - -#: src/slic3r/GUI/ConfigWizard.cpp:970 -msgid "Nozzle Diameter:" -msgstr "노즐 직경:" - -#: src/slic3r/GUI/ConfigWizard.cpp:980 -msgid "Enter the diameter of your filament." -msgstr "필라멘트의 직경을 입력하십시오." - -#: src/slic3r/GUI/ConfigWizard.cpp:981 -msgid "" -"Good precision is required, so use a caliper and do multiple measurements " -"along the filament, then compute the average." -msgstr "" -"정밀도가 필요하므로 캘리퍼를 사용하여 필라멘트를 따라 여러 번 측정 한 다음 평" -"균을 계산하십시오." - -#: src/slic3r/GUI/ConfigWizard.cpp:984 -msgid "Filament Diameter:" -msgstr "필라멘트 직경:" - -#: src/slic3r/GUI/ConfigWizard.cpp:1018 -msgid "Extruder and Bed Temperatures" -msgstr "익스트루더와 배드 온도" - -#: src/slic3r/GUI/ConfigWizard.cpp:1018 -msgid "Temperatures" -msgstr "온도" - -#: src/slic3r/GUI/ConfigWizard.cpp:1034 -msgid "Enter the temperature needed for extruding your filament." -msgstr "필라멘트 압출에 필요한 온도를 입력하십시오." - -#: src/slic3r/GUI/ConfigWizard.cpp:1035 -msgid "A rule of thumb is 160 to 230 °C for PLA, and 215 to 250 °C for ABS." -msgstr "보통 PLA의 경우 160 ~ 230 ° C, ABS의 경우 215 ~ 250 ° C입니다." - -#: src/slic3r/GUI/ConfigWizard.cpp:1038 -msgid "Extrusion Temperature:" -msgstr "출력 온도 :" - -#: src/slic3r/GUI/ConfigWizard.cpp:1039 src/slic3r/GUI/ConfigWizard.cpp:1053 -msgid "°C" -msgstr "°C" - -#: src/slic3r/GUI/ConfigWizard.cpp:1048 -msgid "" -"Enter the bed temperature needed for getting your filament to stick to your " -"heated bed." -msgstr "필라멘트가 핫배드에 접착하는데 필요한 온도를 입력하십시오." - -#: src/slic3r/GUI/ConfigWizard.cpp:1049 -msgid "" -"A rule of thumb is 60 °C for PLA and 110 °C for ABS. Leave zero if you have " -"no heated bed." -msgstr "" -"보통은 PLA의 경우 60 ° C이고 ABS의 경우 110 ° C입니다. 핫배드가 없는 경우에" -"는 0으로 두십시오." - -#: src/slic3r/GUI/ConfigWizard.cpp:1052 -msgid "Bed Temperature:" -msgstr "배드 온도 :" - -#: src/slic3r/GUI/ConfigWizard.cpp:1474 src/slic3r/GUI/ConfigWizard.cpp:2014 -msgid "Filaments" -msgstr "필라멘트" - -#: src/slic3r/GUI/ConfigWizard.cpp:1474 src/slic3r/GUI/ConfigWizard.cpp:2016 -msgid "SLA Materials" -msgstr "SLA 재료" - -#: src/slic3r/GUI/ConfigWizard.cpp:1528 -msgid "FFF Technology Printers" -msgstr "FFF 기술 프린터" - -#: src/slic3r/GUI/ConfigWizard.cpp:1533 -msgid "SLA Technology Printers" -msgstr "SLA 기술 프린터" - -#: src/slic3r/GUI/ConfigWizard.cpp:1751 src/slic3r/GUI/DoubleSlider.cpp:1877 -#: src/slic3r/GUI/DoubleSlider.cpp:1898 src/slic3r/GUI/GUI.cpp:240 -msgid "Notice" -msgstr "공지" - -#: src/slic3r/GUI/ConfigWizard.cpp:1760 -msgid "You have to select at least one filament for selected printers" -msgstr "선택한 프린터에 대해 필라멘트를 하나 이상 선택해야 합니다." - -#: src/slic3r/GUI/ConfigWizard.cpp:1761 -msgid "Do you want to automatic select default filaments?" -msgstr "기본 필라멘트를 자동으로 선택하시겠습니까?" - -#: src/slic3r/GUI/ConfigWizard.cpp:1771 -msgid "You have to select at least one material for selected printers" -msgstr "선택한 프린터에 대해 하나 이상의 재질을 선택해야 합니다." - -#: src/slic3r/GUI/ConfigWizard.cpp:1772 -msgid "Do you want to automatic select default materials?" -msgstr "기본 재질을 자동으로 선택하시겠습니까?" - -#: src/slic3r/GUI/ConfigWizard.cpp:1979 -msgid "Select all standard printers" -msgstr "이 프로파일과 호환 가능한 프린터를 선택하세요" - -#: src/slic3r/GUI/ConfigWizard.cpp:1982 -msgid "< &Back" -msgstr "< &뒤로" - -#: src/slic3r/GUI/ConfigWizard.cpp:1983 -msgid "&Next >" -msgstr "&다음 >" - -#: src/slic3r/GUI/ConfigWizard.cpp:1984 -msgid "&Finish" -msgstr "&완료" - -#: src/slic3r/GUI/ConfigWizard.cpp:1985 src/slic3r/GUI/FirmwareDialog.cpp:151 -#: src/slic3r/GUI/ProgressStatusBar.cpp:26 -msgid "Cancel" -msgstr "취소" - -#: src/slic3r/GUI/ConfigWizard.cpp:1998 -msgid "Prusa FFF Technology Printers" -msgstr "Prusa FFF 방식 프린터" - -#: src/slic3r/GUI/ConfigWizard.cpp:2001 -msgid "Prusa MSLA Technology Printers" -msgstr "Prusa MSLA 방식 프린터" - -#: src/slic3r/GUI/ConfigWizard.cpp:2014 -msgid "Filament Profiles Selection" -msgstr "필라멘트 프로파일 선택" - -#: src/slic3r/GUI/ConfigWizard.cpp:2014 src/slic3r/GUI/GUI_ObjectList.cpp:3528 -msgid "Type:" -msgstr "형식:" - -#: src/slic3r/GUI/ConfigWizard.cpp:2016 -msgid "SLA Material Profiles Selection" -msgstr "SLA 재질 프로파일 선택" - -#: src/slic3r/GUI/ConfigWizard.cpp:2016 -msgid "Layer height:" -msgstr "레이어 높이:" - -#: src/slic3r/GUI/ConfigWizard.cpp:2112 -msgid "Configuration Assistant" -msgstr "구성 도우미" - -#: src/slic3r/GUI/ConfigWizard.cpp:2113 -msgid "Configuration &Assistant" -msgstr "구성 & 도우미" - -#: src/slic3r/GUI/ConfigWizard.cpp:2115 -msgid "Configuration Wizard" -msgstr "구성 마법사" - -#: src/slic3r/GUI/ConfigWizard.cpp:2116 -msgid "Configuration &Wizard" -msgstr "구성 & 마법사" - -#: src/slic3r/GUI/DoubleSlider.cpp:79 -msgid "Place bearings in slots and resume" -msgstr "슬롯에 베어링을 배치하고 다시 시작" - -#: src/slic3r/GUI/DoubleSlider.cpp:923 -msgid "One layer mode" -msgstr "하나의 레이어 모드" - -#: src/slic3r/GUI/DoubleSlider.cpp:925 -msgid "Discard all custom changes" -msgstr "모든 사용자 지정 변경 내용 삭제" - -#: src/slic3r/GUI/DoubleSlider.cpp:928 -msgid "For jump to print Z use left mouse button click OR (Shift+G)" -msgstr "Z를 인쇄하는 점프를 위해 왼쪽 마우스 버튼을 클릭 (Shift +G)" - -#: src/slic3r/GUI/DoubleSlider.cpp:929 -msgid "For set extruder sequence for whole print use right mouse button click" -msgstr "전체 인쇄 용 돌출부 시퀀스 설정용 마우스 버튼 클릭" - -#: src/slic3r/GUI/DoubleSlider.cpp:930 src/slic3r/GUI/DoubleSlider.cpp:1495 -msgid "Jump to print Z" -msgstr "Z 인쇄로 이동" - -#: src/slic3r/GUI/DoubleSlider.cpp:933 -msgid "For edit current color use right mouse button click on colored band" -msgstr "현재 색상 사용 오른쪽 마우스 버튼을 편집하려면 컬러 밴드를 클릭" - -#: src/slic3r/GUI/DoubleSlider.cpp:941 -msgid "Slider(print) mode" -msgstr "슬라이더(인쇄) 모드" - -#: src/slic3r/GUI/DoubleSlider.cpp:955 -msgid "For add change extruder use left mouse button click" -msgstr "추가 변경 압출기 사용 왼쪽 마우스 단추 단추를 클릭" - -#: src/slic3r/GUI/DoubleSlider.cpp:957 -msgid "" -"For add color change use left mouse button click if you want to use colors " -"from default color list, or Shift + left mouse button click if you want to " -"select a color" -msgstr "" -"색상 변경 추가하려면 기본 색상 목록에서 색상을 사용하려는 경우 왼쪽 마우스 버" -"튼을 클릭하거나 색상을 선택하려면 Shift + 왼쪽 마우스 버튼을 클릭하십시오." - -#: src/slic3r/GUI/DoubleSlider.cpp:960 -msgid "For add color change use left mouse button click" -msgstr "색상 변경 추가하려면 왼쪽 마우스 버튼을 클릭하십시오." - -#: src/slic3r/GUI/DoubleSlider.cpp:961 -msgid "OR pres \"+\" key" -msgstr "" - -#: src/slic3r/GUI/DoubleSlider.cpp:963 -msgid "For add another code use Ctrl + left mouse button click" -msgstr "다른 코드를 추가하려면 Ctrl + 왼쪽 마우스 버튼을 클릭" - -#: src/slic3r/GUI/DoubleSlider.cpp:964 -msgid "For add another code use right mouse button click" -msgstr "다른 코드를 추가하려면 오른쪽 마우스 버튼을 클릭하십시오." - -#: src/slic3r/GUI/DoubleSlider.cpp:973 -msgid "Color change (\"%1%\")" -msgstr "색상 변경(\"%1%\")" - -#: src/slic3r/GUI/DoubleSlider.cpp:974 -msgid "Color change (\"%1%\") for Extruder %2%" -msgstr "압출기 %2%의 색상 변경(\"%1%\")" - -#: src/slic3r/GUI/DoubleSlider.cpp:977 -msgid "Pause print (\"%1%\")" -msgstr "일시 중지 인쇄(\"%1%\")" - -#: src/slic3r/GUI/DoubleSlider.cpp:979 -msgid "Extruder(tool) is changed to Extruder \"%1%\"" -msgstr "압출기(도구)가 압출기 \"%1%\"로 변경됩니다." - -#: src/slic3r/GUI/DoubleSlider.cpp:980 -msgid "\"%1%\"" -msgstr "\"%1%\"" - -#: src/slic3r/GUI/DoubleSlider.cpp:986 -msgid "Note" -msgstr "메모" - -#: src/slic3r/GUI/DoubleSlider.cpp:988 -msgid "" -"G-code of this tick has a conflict with slider(print) mode.\n" -"Any its editing will cause a changes of DoubleSlider data." -msgstr "" -"이 틱의 G 코드는 슬라이더(인쇄) 모드와 충돌합니다.\n" -"편집하면 두개의 슬라이더 데이터가 변경됩니다." - -#: src/slic3r/GUI/DoubleSlider.cpp:991 -msgid "" -"There is a color change for extruder that wouldn't be used till the end of " -"printing.\n" -"This code wouldn't be processed during GCode generation." -msgstr "" -"인쇄가 끝날 때까지 사용되지 않는 압출기의 색상 변경이 있습니다.\n" -"이 코드는 GCode 생성 중에 처리되지 않습니다." - -#: src/slic3r/GUI/DoubleSlider.cpp:994 -msgid "" -"There is a extruder change to the same extruder.\n" -"This code wouldn't be processed during GCode generation." -msgstr "" -"동일한 압출기로 돌출기 변경이 있습니다.\n" -"이 코드는 GCode 생성 중에 처리되지 않습니다." - -#: src/slic3r/GUI/DoubleSlider.cpp:997 -msgid "" -"There is a color change for extruder that has not been used before.\n" -"Check your choice to avoid redundant color changes." -msgstr "" -"이전에 사용되지 않은 압출기의 색상 변경이 있습니다.\n" -"중복 색상 변경을 방지하려면 선택 사항을 확인하십시오." - -#: src/slic3r/GUI/DoubleSlider.cpp:1002 -msgid "For Delete tick use left mouse button click OR pres \"-\" key" -msgstr "삭제 진드기 사용 왼쪽 마우스 버튼 클릭 또는 \"-\" 키를 pres" - -#: src/slic3r/GUI/DoubleSlider.cpp:1004 -msgid "For Edit tick use Ctrl + Left mouse button click" -msgstr "편집 진드기 사용 Ctrl + 왼쪽 마우스 버튼을 클릭" - -#: src/slic3r/GUI/DoubleSlider.cpp:1005 -msgid "For Edit tick use right mouse button click" -msgstr "편집 사용 오른쪽 마우스 버튼을 클릭" - -#: src/slic3r/GUI/DoubleSlider.cpp:1099 src/slic3r/GUI/DoubleSlider.cpp:1135 -#: src/slic3r/GUI/GLCanvas3D.cpp:982 src/slic3r/GUI/Tab.cpp:2302 -#: src/libslic3r/GCode/PreviewData.cpp:445 -#, c-format -msgid "Extruder %d" -msgstr "익스트루더 %d" - -#: src/slic3r/GUI/DoubleSlider.cpp:1100 -msgid "active" -msgstr "활성" - -#: src/slic3r/GUI/DoubleSlider.cpp:1109 -msgid "Switch code to Change extruder" -msgstr "코드 전환- 압출기 변경" - -#: src/slic3r/GUI/DoubleSlider.cpp:1109 src/slic3r/GUI/GUI_ObjectList.cpp:1666 -msgid "Change extruder" -msgstr "압출기(익스트루더) 변경" - -#: src/slic3r/GUI/DoubleSlider.cpp:1110 -msgid "Change extruder (N/A)" -msgstr "돌출자 변경(N/A)" - -#: src/slic3r/GUI/DoubleSlider.cpp:1112 -msgid "Use another extruder" -msgstr "다른 압출기 사용" - -#: src/slic3r/GUI/DoubleSlider.cpp:1136 -msgid "used" -msgstr "사용됨" - -#: src/slic3r/GUI/DoubleSlider.cpp:1144 -msgid "Switch code to Color change (%1%) for:" -msgstr "코드 에서 색상 변경(%1%) 에 대 한:" - -#: src/slic3r/GUI/DoubleSlider.cpp:1145 -msgid "Add color change (%1%) for:" -msgstr "색상 변경 추가(%1%) 에 대 한:" - -#: src/slic3r/GUI/DoubleSlider.cpp:1443 -msgid "Add color change" -msgstr "색상 변경 추가" - -#: src/slic3r/GUI/DoubleSlider.cpp:1453 -msgid "Add pause print" -msgstr "일시 정지 인쇄 추가" - -#: src/slic3r/GUI/DoubleSlider.cpp:1456 -msgid "Add custom G-code" -msgstr "사용자 지정 G 코드 추가" - -#: src/slic3r/GUI/DoubleSlider.cpp:1474 -msgid "Edit color" -msgstr "색상 편집" - -#: src/slic3r/GUI/DoubleSlider.cpp:1475 -msgid "Edit pause print message" -msgstr "일시 정지 인쇄 메시지 편집" - -#: src/slic3r/GUI/DoubleSlider.cpp:1476 -msgid "Edit custom G-code" -msgstr "사용자 지정 G 코드 편집" - -#: src/slic3r/GUI/DoubleSlider.cpp:1482 -msgid "Delete color change" -msgstr "색상 변경 삭제" - -#: src/slic3r/GUI/DoubleSlider.cpp:1483 -msgid "Delete tool change" -msgstr "도구 변경 삭제" - -#: src/slic3r/GUI/DoubleSlider.cpp:1484 -msgid "Delete pause print" -msgstr "일시 정지 인쇄 삭제" - -#: src/slic3r/GUI/DoubleSlider.cpp:1485 -msgid "Delete custom G-code" -msgstr "사용자 지정 G 코드 삭제" - -#: src/slic3r/GUI/DoubleSlider.cpp:1498 -msgid "Set extruder sequence for whole print" -msgstr "전체 인쇄를 위한 압출기 시퀀스 설정" - -#: src/slic3r/GUI/DoubleSlider.cpp:1584 -msgid "Enter custom G-code used on current layer" -msgstr "현재 레이어에 사용되는 사용자 지정 G 코드를 입력합니다." - -#: src/slic3r/GUI/DoubleSlider.cpp:1585 -msgid "Custom Gcode on current layer (%1% mm)." -msgstr "현재 레이어에 사용자 지정 Gcode(%1% mm)." - -#: src/slic3r/GUI/DoubleSlider.cpp:1600 -msgid "Enter short message shown on Printer display during pause print" -msgstr "" -"일시 정지시 인쇄 중에 프린터 디스플레이에 표시된 짧은 메시지를 입력합니다." - -#: src/slic3r/GUI/DoubleSlider.cpp:1601 -msgid "Message for pause print on current layer (%1% mm)." -msgstr "현재 레이어에서 일시 중지 인쇄를 위한 메시지(%1% mm)." - -#: src/slic3r/GUI/DoubleSlider.cpp:1616 -msgid "Enter print z value to jump to" -msgstr "인쇄 z 값을 입력하여" - -#: src/slic3r/GUI/DoubleSlider.cpp:1617 -msgid "Jump to print z" -msgstr "Z 인쇄로 이동" - -#: src/slic3r/GUI/DoubleSlider.cpp:1871 -msgid "" -"The last color change data was saved for a single extruder printer profile." -msgstr "" -"단일 압출기 프린터 프로파일에 대해 마지막 색상 변경 데이터가 저장되었습니다." - -#: src/slic3r/GUI/DoubleSlider.cpp:1872 -msgid "" -"The last color change data was saved for a multiple extruder printer profile." -msgstr "" -"여러 압출기 프린터 프로파일에 대해 마지막 색상 변경 데이터가 저장되었습니다." - -#: src/slic3r/GUI/DoubleSlider.cpp:1874 -msgid "Your current changes will cause a deletion of all saved color changes." -msgstr "현재 변경으로 인해 저장된 모든 색상 변경 내용이 삭제됩니다." - -#: src/slic3r/GUI/DoubleSlider.cpp:1875 src/slic3r/GUI/DoubleSlider.cpp:1896 -msgid "Are you sure you want to continue?" -msgstr "정말 계속하기를 원하십니까?" - -#: src/slic3r/GUI/DoubleSlider.cpp:1888 -msgid "The last color change data was saved for a multi extruder printing." -msgstr "다중 압출기 인쇄를 위해 마지막 색상 변경 데이터가 저장되었습니다." - -#: src/slic3r/GUI/DoubleSlider.cpp:1889 -msgid "" -"Select YES if you want to delete all saved tool changes, \n" -"\tNO if you want all tool changes switch to color changes, \n" -"\tor CANCEL for do nothing" -msgstr "" -"저장된 도구 변경 내용을 모두 삭제하려면 YES를 선택합니다. \n" -"\t아니오 모든 도구 변경 이 색상 변경으로 전환하려면 \n" -"\t또는 아무것도 하지 않는 취소" - -#: src/slic3r/GUI/DoubleSlider.cpp:1892 -msgid "Do you want to delete all saved tool changes?" -msgstr "저장된 도구 변경 내용을 모두 삭제하시겠습니까?" - -#: src/slic3r/GUI/DoubleSlider.cpp:1894 -msgid "" -"The last color change data was saved for a multi extruder printing with tool " -"changes for whole print." -msgstr "" -"마지막 색상 변경 데이터는 전체 인쇄에 대한 도구 변경이 있는 다중 압출기 인쇄" -"를 위해 저장되었습니다." - -#: src/slic3r/GUI/DoubleSlider.cpp:1895 -msgid "Your current changes will cause a deletion of all saved tool changes." -msgstr "현재 변경 으로 인해 저장된 모든 도구 변경 내용이 삭제됩니다." - -#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:23 -msgid "Set extruder sequence" -msgstr "압출기 시퀀스 설정" - -#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:39 -msgid "Set extruder change for every" -msgstr "모든 압출기 변경 설정" - -#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:52 -#: src/libslic3r/PrintConfig.cpp:352 src/libslic3r/PrintConfig.cpp:995 -#: src/libslic3r/PrintConfig.cpp:1514 src/libslic3r/PrintConfig.cpp:1699 -#: src/libslic3r/PrintConfig.cpp:1760 src/libslic3r/PrintConfig.cpp:1940 -#: src/libslic3r/PrintConfig.cpp:1986 -msgid "layers" -msgstr "레이어" - -#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:136 -msgid "Set extruder(tool) sequence" -msgstr "돌출기(도구) 시퀀스 설정" - -#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:182 -msgid "Remove extruder from sequence" -msgstr "시퀀스에서 압출기 제거" - -#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:192 -msgid "Add extruder to sequence" -msgstr "시퀀스에 압출기 추가" - -#: src/slic3r/GUI/Field.cpp:131 -msgid "default value" -msgstr "기본값" - -#: src/slic3r/GUI/Field.cpp:134 -msgid "parameter name" -msgstr "매개 변수 명칭" - -#: src/slic3r/GUI/Field.cpp:145 src/slic3r/GUI/OptionsGroup.cpp:570 -msgid "N/A" -msgstr "N/A" - -#: src/slic3r/GUI/Field.cpp:170 -#, c-format -msgid "%s doesn't support percentage" -msgstr "%s 이(가) 백분율을 지원하지 않음" - -#: src/slic3r/GUI/Field.cpp:190 src/slic3r/GUI/Field.cpp:221 -#: src/slic3r/GUI/GUI_ObjectLayers.cpp:376 -msgid "Invalid numeric input." -msgstr "숫자 입력이 잘못 되었습니다." - -#: src/slic3r/GUI/Field.cpp:199 -msgid "Input value is out of range" -msgstr "입력 값이 범위를 벗어났습니다." - -#: src/slic3r/GUI/Field.cpp:235 -#, c-format -msgid "" -"Do you mean %s%% instead of %s %s?\n" -"Select YES if you want to change this value to %s%%, \n" -"or NO if you are sure that %s %s is a correct value." -msgstr "" -"%s %s 대신 %s%%을 하려고 합니까?\n" -"이 값을 %s%%, 로 변경하려면 YES를 선택하십시오. \n" -"또는 %s %s 이(가) 올바른 값인지 확인하는 경우 NO를 선택하세요." - -#: src/slic3r/GUI/Field.cpp:238 -msgid "Parameter validation" -msgstr "매개 변수 유효성 검사" - -#: src/slic3r/GUI/FirmwareDialog.cpp:150 -msgid "Flash!" -msgstr "완료!" - -#: src/slic3r/GUI/FirmwareDialog.cpp:152 -msgid "Flashing in progress. Please do not disconnect the printer!" -msgstr "진행 중입니다. 프린터를 분리하지 마십시오!" - -#: src/slic3r/GUI/FirmwareDialog.cpp:199 -msgid "Flashing failed" -msgstr "펌웨어 적용 실패" - -#: src/slic3r/GUI/FirmwareDialog.cpp:282 -msgid "Flashing succeeded!" -msgstr "적용 성공!" - -#: src/slic3r/GUI/FirmwareDialog.cpp:283 -msgid "Flashing failed. Please see the avrdude log below." -msgstr "적용 실패. 아래의 로그를 확인하세요." - -#: src/slic3r/GUI/FirmwareDialog.cpp:284 -msgid "Flashing cancelled." -msgstr "적용 취소됨." - -#: src/slic3r/GUI/FirmwareDialog.cpp:332 -#, c-format -msgid "" -"This firmware hex file does not match the printer model.\n" -"The hex file is intended for: %s\n" -"Printer reported: %s\n" -"\n" -"Do you want to continue and flash this hex file anyway?\n" -"Please only continue if you are sure this is the right thing to do." -msgstr "" -"이 펌웨어 hex 파일이 프린터 모델과 일치 하지 않습니다.\n" -"Hex 파일은 다음을 위한 것입니다: %s\n" -"보고 된 프린터: %s\n" -"\n" -"그래도이 hex 파일을 계속 적용 하시겠습니까?\n" -"확신 하는 경우에만 계속 하십시오." - -#: src/slic3r/GUI/FirmwareDialog.cpp:419 src/slic3r/GUI/FirmwareDialog.cpp:454 -#, c-format -msgid "" -"Multiple %s devices found. Please only connect one at a time for flashing." -msgstr "여러 %s 장치를 찾았습니다. 깜박이면 한 번에 하나씩만 연결하십시오." - -#: src/slic3r/GUI/FirmwareDialog.cpp:436 -#, c-format -msgid "" -"The %s device was not found.\n" -"If the device is connected, please press the Reset button next to the USB " -"connector ..." -msgstr "" -"%s 장치를 찾을 수 없습니다.\n" -"장치가 연결되어 있는 경우 USB 커넥터 옆에 있는 리셋 버튼을 누르십시오..." - -#: src/slic3r/GUI/FirmwareDialog.cpp:548 -#, c-format -msgid "The %s device could not have been found" -msgstr "%s 장치를 찾을 수 없습니다" - -#: src/slic3r/GUI/FirmwareDialog.cpp:645 -#, c-format -msgid "Error accessing port at %s: %s" -msgstr "%s 포트에 액세스 하는 중 오류가 발생 했습니다 :%s" - -#: src/slic3r/GUI/FirmwareDialog.cpp:647 -#, c-format -msgid "Error: %s" -msgstr "에러: %s" - -#: src/slic3r/GUI/FirmwareDialog.cpp:777 -msgid "Firmware flasher" -msgstr "펌웨어 업로드" - -#: src/slic3r/GUI/FirmwareDialog.cpp:802 -msgid "Firmware image:" -msgstr "펌웨어 이미지:" - -#: src/slic3r/GUI/FirmwareDialog.cpp:805 src/slic3r/GUI/Tab.cpp:1649 -#: src/slic3r/GUI/Tab.cpp:1705 -msgid "Browse" -msgstr "검색" - -#: src/slic3r/GUI/FirmwareDialog.cpp:807 -msgid "Serial port:" -msgstr "시리얼 포트:" - -#: src/slic3r/GUI/FirmwareDialog.cpp:809 -msgid "Autodetected" -msgstr "자동 감지" - -#: src/slic3r/GUI/FirmwareDialog.cpp:810 -msgid "Rescan" -msgstr "재검색" - -#: src/slic3r/GUI/FirmwareDialog.cpp:817 -msgid "Progress:" -msgstr "진행:" - -#: src/slic3r/GUI/FirmwareDialog.cpp:820 -msgid "Status:" -msgstr "상태:" - -#: src/slic3r/GUI/FirmwareDialog.cpp:821 -msgid "Ready" -msgstr "준비" - -#: src/slic3r/GUI/FirmwareDialog.cpp:841 -msgid "Advanced: Output log" -msgstr "고급: 출력 로그" - -#: src/slic3r/GUI/FirmwareDialog.cpp:852 -#: src/slic3r/GUI/Mouse3DController.cpp:387 -#: src/slic3r/GUI/PrintHostDialogs.cpp:161 -msgid "Close" -msgstr "닫기" - -#: src/slic3r/GUI/FirmwareDialog.cpp:902 -msgid "" -"Are you sure you want to cancel firmware flashing?\n" -"This could leave your printer in an unusable state!" -msgstr "" -"새펌웨어 적용을 취소하시겠습니까?\n" -"프린터가 사용할 수 없는 상태가 될 수 있습니다!" - -#: src/slic3r/GUI/FirmwareDialog.cpp:903 -msgid "Confirmation" -msgstr "확인" - -#: src/slic3r/GUI/FirmwareDialog.cpp:906 -msgid "Cancelling..." -msgstr "취소 중...." - -#: src/slic3r/GUI/GLCanvas3D.cpp:239 src/slic3r/GUI/GLCanvas3D.cpp:4622 -msgid "Variable layer height" -msgstr "가변 레이어 높이" - -#: src/slic3r/GUI/GLCanvas3D.cpp:242 -msgid "Left mouse button:" -msgstr "왼쪽 마우스 단추:" - -#: src/slic3r/GUI/GLCanvas3D.cpp:245 -msgid "Add detail" -msgstr "디테일 추가" - -#: src/slic3r/GUI/GLCanvas3D.cpp:248 -msgid "Right mouse button:" -msgstr "오른쪽 마우스 버튼:" - -#: src/slic3r/GUI/GLCanvas3D.cpp:251 -msgid "Remove detail" -msgstr "디테일 제거" - -#: src/slic3r/GUI/GLCanvas3D.cpp:254 -msgid "Shift + Left mouse button:" -msgstr "시프트 + 왼쪽 마우스 버튼:" - -#: src/slic3r/GUI/GLCanvas3D.cpp:257 -msgid "Reset to base" -msgstr "기본으로 재설정" - -#: src/slic3r/GUI/GLCanvas3D.cpp:260 -msgid "Shift + Right mouse button:" -msgstr "시프트 + 오른쪽 마우스 버튼:" - -#: src/slic3r/GUI/GLCanvas3D.cpp:263 -msgid "Smoothing" -msgstr "부드럽게" - -#: src/slic3r/GUI/GLCanvas3D.cpp:266 -msgid "Mouse wheel:" -msgstr "마우스 휠: " - -#: src/slic3r/GUI/GLCanvas3D.cpp:269 -msgid "Increase/decrease edit area" -msgstr "편집 영역 증가/감소" - -#: src/slic3r/GUI/GLCanvas3D.cpp:272 -msgid "Adaptive" -msgstr "어뎁티브" - -#: src/slic3r/GUI/GLCanvas3D.cpp:278 -msgid "Quality / Speed" -msgstr "품질 / 속도" - -#: src/slic3r/GUI/GLCanvas3D.cpp:282 -msgid "Higher print quality versus higher print speed." -msgstr "인쇄 품질이 높고 인쇄 속도가 빨라질 수 있습니다." - -#: src/slic3r/GUI/GLCanvas3D.cpp:293 -msgid "Smooth" -msgstr "부드럽게" - -#: src/slic3r/GUI/GLCanvas3D.cpp:299 src/libslic3r/PrintConfig.cpp:511 -msgid "Radius" -msgstr " 반지름" - -#: src/slic3r/GUI/GLCanvas3D.cpp:309 -msgid "Keep min" -msgstr "최소 유지" - -#: src/slic3r/GUI/GLCanvas3D.cpp:318 -msgid "Reset" -msgstr "초기화" - -#: src/slic3r/GUI/GLCanvas3D.cpp:604 -msgid "Variable layer height - Manual edit" -msgstr "가변 레이어 높이 - 수동 편집" - -#: src/slic3r/GUI/GLCanvas3D.cpp:690 -msgid "An object outside the print area was detected" -msgstr "인쇄 영역 밖에 있는 객체(object)가 감지 되었습니다" - -#: src/slic3r/GUI/GLCanvas3D.cpp:691 -msgid "A toolpath outside the print area was detected" -msgstr "인쇄 영역 밖에 있는 공구 경로가 감지 되었습니다" - -#: src/slic3r/GUI/GLCanvas3D.cpp:692 -msgid "SLA supports outside the print area were detected" -msgstr "인쇄 영역 외부의 SLA 서포트가 감지 됨" - -#: src/slic3r/GUI/GLCanvas3D.cpp:693 -msgid "Some objects are not visible" -msgstr "일부 개체가 표시되지 않습니다" - -#: src/slic3r/GUI/GLCanvas3D.cpp:695 -msgid "" -"An object outside the print area was detected\n" -"Resolve the current problem to continue slicing" -msgstr "" -"인쇄 영역 밖에 있는 객체(object)가 감지 되었습니다.\n" -"현재 문제를 해결하고 슬라이싱을 계속 합니다" - -#: src/slic3r/GUI/GLCanvas3D.cpp:909 src/slic3r/GUI/GLCanvas3D.cpp:938 -msgid "Default print color" -msgstr "기본 인쇄 색상" - -#: src/slic3r/GUI/GLCanvas3D.cpp:939 src/slic3r/GUI/GLCanvas3D.cpp:948 -#: src/slic3r/GUI/GLCanvas3D.cpp:987 -msgid "Pause print or custom G-code" -msgstr "인쇄 또는 사용자 지정 G-코드 일시 중지" - -#: src/slic3r/GUI/GLCanvas3D.cpp:960 -#, c-format -msgid "up to %.2f mm" -msgstr "최대%.2f mm" - -#: src/slic3r/GUI/GLCanvas3D.cpp:964 -#, c-format -msgid "above %.2f mm" -msgstr "above %.2f mm" - -#: src/slic3r/GUI/GLCanvas3D.cpp:968 -#, c-format -msgid "%.2f - %.2f mm" -msgstr "%.2f - %.2f mm" - -#: src/slic3r/GUI/GLCanvas3D.cpp:995 -#, c-format -msgid "Color change for Extruder %d at %.2f mm" -msgstr "압출기 %d의 색상 변화 %.2f mm" - -#: src/slic3r/GUI/GLCanvas3D.cpp:1306 -msgid "Seq." -msgstr "순서" - -#: src/slic3r/GUI/GLCanvas3D.cpp:1705 -msgid "Variable layer height - Reset" -msgstr "가변 레이어 높이 - 재설정" - -#: src/slic3r/GUI/GLCanvas3D.cpp:1713 -msgid "Variable layer height - Adaptive" -msgstr "가변 레이어 높이 - 어뎁티브" - -#: src/slic3r/GUI/GLCanvas3D.cpp:1721 -msgid "Variable layer height - Smooth all" -msgstr "가변 레이어 높이 - 모두 부드럽게" - -#: src/slic3r/GUI/GLCanvas3D.cpp:2075 -msgid "Mirror Object" -msgstr "객체(object) 반전" - -#: src/slic3r/GUI/GLCanvas3D.cpp:2945 -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:571 -msgid "Gizmo-Move" -msgstr "개체(Gizmo) 이동" - -#: src/slic3r/GUI/GLCanvas3D.cpp:3025 -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:573 -msgid "Gizmo-Rotate" -msgstr "개체(Gizmo) 회전" - -#: src/slic3r/GUI/GLCanvas3D.cpp:3538 -msgid "Move Object" -msgstr "객체(object) 이동" - -#: src/slic3r/GUI/GLCanvas3D.cpp:4085 -msgid "Undo History" -msgstr "실행취소 기록" - -#: src/slic3r/GUI/GLCanvas3D.cpp:4085 -msgid "Redo History" -msgstr "다시 실행 히스토리" - -#: src/slic3r/GUI/GLCanvas3D.cpp:4103 -#, c-format -msgid "Undo %1$d Action" -msgid_plural "Undo %1$d Actions" -msgstr[0] "실행 취소 %1$d 작업" - -#: src/slic3r/GUI/GLCanvas3D.cpp:4103 -#, c-format -msgid "Redo %1$d Action" -msgid_plural "Redo %1$d Actions" -msgstr[0] "작업 %1$d 다시 실행" - -#: src/slic3r/GUI/GLCanvas3D.cpp:4516 -msgid "Add..." -msgstr "추가..." - -#: src/slic3r/GUI/GLCanvas3D.cpp:4524 src/slic3r/GUI/GUI_ObjectList.cpp:1697 -#: src/slic3r/GUI/Plater.cpp:3942 src/slic3r/GUI/Plater.cpp:3969 -#: src/slic3r/GUI/Tab.cpp:3094 -msgid "Delete" -msgstr "지우기 " - -#: src/slic3r/GUI/GLCanvas3D.cpp:4533 src/slic3r/GUI/Plater.cpp:4693 -msgid "Delete all" -msgstr "전부 지우기" - -#: src/slic3r/GUI/GLCanvas3D.cpp:4542 src/slic3r/GUI/KBShortcutsDialog.cpp:137 -#: src/slic3r/GUI/Plater.cpp:2740 -msgid "Arrange" -msgstr "정렬" - -#: src/slic3r/GUI/GLCanvas3D.cpp:4542 src/slic3r/GUI/KBShortcutsDialog.cpp:138 -msgid "Arrange selection" -msgstr "선택 정렬" - -#: src/slic3r/GUI/GLCanvas3D.cpp:4554 -msgid "Copy" -msgstr "복사" - -#: src/slic3r/GUI/GLCanvas3D.cpp:4563 -msgid "Paste" -msgstr "붙여넣기" - -#: src/slic3r/GUI/GLCanvas3D.cpp:4575 src/slic3r/GUI/Plater.cpp:3799 -#: src/slic3r/GUI/Plater.cpp:3811 src/slic3r/GUI/Plater.cpp:3956 -msgid "Add instance" -msgstr "복제본 추가" - -#: src/slic3r/GUI/GLCanvas3D.cpp:4586 src/slic3r/GUI/Plater.cpp:3958 -msgid "Remove instance" -msgstr "복제본 제거" - -#: src/slic3r/GUI/GLCanvas3D.cpp:4599 -msgid "Split to objects" -msgstr "객체(object)별 분할" - -#: src/slic3r/GUI/GLCanvas3D.cpp:4609 src/slic3r/GUI/GUI_ObjectList.cpp:1485 -msgid "Split to parts" -msgstr "부품(Part)별 분할" - -#: src/slic3r/GUI/GLCanvas3D.cpp:4673 src/slic3r/GUI/MainFrame.cpp:581 -msgid "Undo" -msgstr "되돌리기" - -#: src/slic3r/GUI/GLCanvas3D.cpp:4673 src/slic3r/GUI/GLCanvas3D.cpp:4706 -msgid "Click right mouse button to open History" -msgstr "마우스 오른쪽 버튼을 클릭하여 기록을 엽니다." - -#: src/slic3r/GUI/GLCanvas3D.cpp:4690 -msgid "Next Undo action: %1%" -msgstr "다음 작업 실행 취소 : %1%" - -#: src/slic3r/GUI/GLCanvas3D.cpp:4706 src/slic3r/GUI/MainFrame.cpp:584 -msgid "Redo" -msgstr "다시실행" - -#: src/slic3r/GUI/GLCanvas3D.cpp:4722 -msgid "Next Redo action: %1%" -msgstr "다음 작업 다시 실행: %1%" - -#: src/slic3r/GUI/GLCanvas3D.cpp:6659 -msgid "Selection-Add from rectangle" -msgstr "선택-사각형에서 추가" - -#: src/slic3r/GUI/GLCanvas3D.cpp:6678 -msgid "Selection-Remove from rectangle" -msgstr "선택- 사각형에서 제거" - -#: src/slic3r/GUI/GLCanvas3DManager.cpp:284 -#, c-format -msgid "" -"PrusaSlicer requires OpenGL 2.0 capable graphics driver to run correctly, \n" -"while OpenGL version %s, render %s, vendor %s was detected." -msgstr "" -"PrusaSlicer 제대로 실행하려면 OpenGL 2.0 가능한 그래픽 드라이버가 필요합니" -"다. \n" -"OpenGL 버전 %s, 렌더링 %s 동안, 공급 업체 %s가 감지되었습니다." - -#: src/slic3r/GUI/GLCanvas3DManager.cpp:287 -msgid "You may need to update your graphics card driver." -msgstr "그래픽 카드 드라이버를 업데이트해야 할 수 있습니다." - -#: src/slic3r/GUI/GLCanvas3DManager.cpp:290 -msgid "" -"As a workaround, you may run PrusaSlicer with a software rendered 3D " -"graphics by running prusa-slicer.exe with the --sw_renderer parameter." -msgstr "" -"해결 방법으로 prusaSlicer를 \"sw_renderer 매개 변수\"로 prusa-slicer.exe를 실" -"행하여 3D 그래픽을 렌더링한 소프트웨어로 실행할 수 있습니다." - -#: src/slic3r/GUI/GLCanvas3DManager.cpp:292 -msgid "Unsupported OpenGL version" -msgstr "지원되지 않는 OpenGL 버전" - -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:42 -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:144 src/libslic3r/PrintConfig.cpp:3397 -msgid "Cut" -msgstr "자르기" - -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:168 -msgid "Keep upper part" -msgstr "상위 부분 유지" - -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:169 -msgid "Keep lower part" -msgstr "낮은 부분 유지" - -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:170 -msgid "Rotate lower part upwards" -msgstr "아래쪽 부분을 위쪽으로 회전" - -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:175 -msgid "Perform cut" -msgstr "절단 실행" - -#: src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp:45 -msgid "Place on face" -msgstr "면 배치 " - -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:41 -msgid "Hollow this object" -msgstr "이 개체를 비우기" - -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:42 -msgid "Preview hollowed and drilled model" -msgstr "미리 보기 중이 비어 있고 드릴된 모델" - -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:43 -msgid "Offset" -msgstr "오프셋" - -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:44 -msgid "Quality" -msgstr "품질" - -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:45 -msgid "Closing distance" -msgstr "닫힘 거리" - -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:46 -msgid "Hole diameter" -msgstr "구멍 직경" - -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:47 -msgid "Hole depth" -msgstr "구멍 깊이" - -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:48 -msgid "Remove selected holes" -msgstr "선택한 구멍 제거" - -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:49 -msgid "Remove all holes" -msgstr "모든 구멍 제거" - -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:50 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:58 -msgid "Clipping of view" -msgstr "갈무리된것 보기" - -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:51 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:59 -msgid "Reset direction" -msgstr "방향 재설정" - -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:52 -msgid "Show supports" -msgstr "서포트 표시" - -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:413 -msgid "Add drainage hole" -msgstr "배수 구멍 추가" - -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:530 -msgid "Delete drainage hole" -msgstr "배수 구멍 삭제" - -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:786 -msgid "Hollowing parameter change" -msgstr "공동화 매개변수 변경" - -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:858 -msgid "Change drainage hole diameter" -msgstr "배수 구멍 직경 변경" - -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:948 -msgid "Hollowing and drilling" -msgstr "공동화 및 드릴링" - -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:1027 -msgid "Move drainage hole" -msgstr "구멍 이동" - -#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:48 -msgid "Move" -msgstr "이동" - -#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:449 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:480 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:499 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:517 -#: src/libslic3r/PrintConfig.cpp:3446 -msgid "Rotate" -msgstr "회전" - -#: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:47 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:230 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:500 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:518 -#: src/libslic3r/PrintConfig.cpp:3461 -msgid "Scale" -msgstr "크기" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:48 -msgid "Head diameter" -msgstr "헤드 지름" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:49 -msgid "Lock supports under new islands" -msgstr "새영역에서 서포트 잠금 지원" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:50 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1350 -msgid "Remove selected points" -msgstr "선택한 지점 제거" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:51 -msgid "Remove all points" -msgstr "모든 지점 제거" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:52 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1353 -msgid "Apply changes" -msgstr "변경 내용을 적용" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:53 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1354 -msgid "Discard changes" -msgstr "변경사항을 취소" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:54 -msgid "Minimal points distance" -msgstr "최소한의 지점 거리" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:55 -#: src/libslic3r/PrintConfig.cpp:2765 -msgid "Support points density" -msgstr "서포트 지점 밀도" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:56 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1356 -msgid "Auto-generate points" -msgstr "지점 자동 생성" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:57 -msgid "Manual editing" -msgstr "수동 편집" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:479 -msgid "Add support point" -msgstr "서포트 지점 추가" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:615 -msgid "Delete support point" -msgstr "서포트 지점 삭제" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:804 -msgid "Change point head diameter" -msgstr "변경된 해드의 끝 점 지름" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:872 -msgid "Support parameter change" -msgstr "서포트 매개 변수 변경" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:978 -msgid "SLA Support Points" -msgstr "SLA 지원 포인트" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:999 -msgid "SLA gizmo turned on" -msgstr "SLA 개체(gizmo)이동 켜기" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1024 -msgid "Do you want to save your manually edited support points?" -msgstr "수동으로 편집한 서포트 지점을 저장 하시 겠습니까?" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1025 -msgid "Save changes?" -msgstr "변경 사항을 저장 하시겠습니까?" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1037 -msgid "SLA gizmo turned off" -msgstr "SLA 개체(gizmo) 이동 끄기" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1076 -msgid "Move support point" -msgstr "서포트 지점 이동" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1175 -msgid "Support points edit" -msgstr "서포트 지점 편집" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1247 -msgid "Autogeneration will erase all manually edited points." -msgstr "자동 생성은 수동으로 편집한 모든 점을 지웁히 지웁습니다." - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1248 -msgid "Are you sure you want to do it?" -msgstr "당신은 그것을 하시겠습니까?" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1249 src/slic3r/GUI/GUI.cpp:246 -#: src/slic3r/GUI/Tab.cpp:3054 src/slic3r/GUI/WipeTowerDialog.cpp:45 -#: src/slic3r/GUI/WipeTowerDialog.cpp:366 -msgid "Warning" -msgstr "위험" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1252 -msgid "Autogenerate support points" -msgstr "서포트 자동 생성" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1313 -msgid "SLA gizmo keyboard shortcuts" -msgstr "SLA 장치 바로 가기" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1324 -msgid "Note: some shortcuts work in (non)editing mode only." -msgstr "참고: 일부 단축키는 (비)편집 모드 에서만 작동 합니다." - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1342 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1345 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1346 -msgid "Left click" -msgstr "왼쪽 클릭" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1342 -msgid "Add point" -msgstr "지점 추가" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1343 -msgid "Right click" -msgstr "오른쪽 클릭" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1343 -msgid "Remove point" -msgstr "복제본 제거" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1344 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1347 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1348 -msgid "Drag" -msgstr "드래그" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1344 -msgid "Move point" -msgstr "지점 이동" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1345 -msgid "Add point to selection" -msgstr "선택 영역에 지점 추가" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1346 -msgid "Remove point from selection" -msgstr "선택 영역에서 지점 제거" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1347 -msgid "Select by rectangle" -msgstr "직사각형으로 선택" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1348 -msgid "Deselect by rectangle" -msgstr "사각형으로 선택 해제" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1349 -msgid "Select all points" -msgstr "모든 지점들 선택" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1351 -msgid "Mouse wheel" -msgstr "마우스 휠" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1351 -msgid "Move clipping plane" -msgstr "갈무리된 평면 이동" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1352 -msgid "Reset clipping plane" -msgstr "갈무리된 평면 재설정" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1355 -msgid "Switch to editing mode" -msgstr "편집 모드로 전환" - -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:498 -msgid "Gizmo-Place on Face" -msgstr "개체(Gizmo)를 배드위로" - -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:572 -msgid "Gizmo-Scale" -msgstr "개체(Gizmo) 배율" - -#: src/slic3r/GUI/GUI_App.cpp:138 -#, c-format -msgid "" -"%s has encountered an error. It was likely caused by running out of memory. " -"If you are sure you have enough RAM on your system, this may also be a bug " -"and we would be glad if you reported it.\n" -"\n" -"The application will now terminate." -msgstr "" -"%s에서 오류가 발생했습니다. 메모리 부족으로 인해 발생했을 수 있습니다. 시스템" -"에 충분한 RAM이 있다고 확신하는 경우 버그가 될 수 있으며 보고하면 기쁠 것입니" -"다.\n" -"\n" -"이제 응용 프로그램이 종료됩니다." - -#: src/slic3r/GUI/GUI_App.cpp:141 -msgid "Fatal error" -msgstr "치명적인 오류" - -#: src/slic3r/GUI/GUI_App.cpp:442 -msgid "Changing of an application language" -msgstr "응용 프로그램 언어 변경" - -#: src/slic3r/GUI/GUI_App.cpp:450 src/slic3r/GUI/GUI_App.cpp:459 -msgid "Recreating" -msgstr "재현" - -#: src/slic3r/GUI/GUI_App.cpp:466 -msgid "Loading of current presets" -msgstr "현재 기본 설정을 불러오기" - -#: src/slic3r/GUI/GUI_App.cpp:474 -msgid "Loading of a mode view" -msgstr "보기 모드를 불러오기" - -#: src/slic3r/GUI/GUI_App.cpp:555 -msgid "Choose one file (3MF/AMF):" -msgstr "파일(3MF/AMF) 선택:" - -#: src/slic3r/GUI/GUI_App.cpp:567 -msgid "Choose one or more files (STL/OBJ/AMF/3MF/PRUSA):" -msgstr "파일을 선택하세요 (STL/OBJ/AMF/3MF/PRUSA):" - -#: src/slic3r/GUI/GUI_App.cpp:629 -msgid "Select the language" -msgstr "언어를 선택" - -#: src/slic3r/GUI/GUI_App.cpp:629 -msgid "Language" -msgstr "언어" - -#: src/slic3r/GUI/GUI_App.cpp:797 -#, c-format -msgid "Run %s" -msgstr "%s 실행" - -#: src/slic3r/GUI/GUI_App.cpp:800 -msgid "&Configuration Snapshots" -msgstr "구성 스냅샷" - -#: src/slic3r/GUI/GUI_App.cpp:800 -msgid "Inspect / activate configuration snapshots" -msgstr "구성 스냅 샷 검사 / 활성화" - -#: src/slic3r/GUI/GUI_App.cpp:801 -msgid "Take Configuration &Snapshot" -msgstr "구성 스냅 샷 가져 오기" - -#: src/slic3r/GUI/GUI_App.cpp:801 -msgid "Capture a configuration snapshot" -msgstr "구성 스냅 샷 캡처" - -#: src/slic3r/GUI/GUI_App.cpp:802 -msgid "Check for updates" -msgstr "업데이트 확인" - -#: src/slic3r/GUI/GUI_App.cpp:802 -msgid "Check for configuration updates" -msgstr "구성 업데이트 확인" - -#: src/slic3r/GUI/GUI_App.cpp:804 -msgid "&Preferences" -msgstr "환경 설정" - -#: src/slic3r/GUI/GUI_App.cpp:810 -msgid "Application preferences" -msgstr "응용 프로그램 환경 설정" - -#: src/slic3r/GUI/GUI_App.cpp:813 src/slic3r/GUI/wxExtensions.cpp:730 -msgid "Simple" -msgstr "단순" - -#: src/slic3r/GUI/GUI_App.cpp:813 -msgid "Simple View Mode" -msgstr "기본 보기 모드" - -#: src/slic3r/GUI/GUI_App.cpp:814 src/slic3r/GUI/GUI_ObjectList.cpp:102 -#: src/slic3r/GUI/GUI_ObjectList.cpp:620 src/slic3r/GUI/Tab.cpp:1077 -#: src/slic3r/GUI/Tab.cpp:1092 src/slic3r/GUI/Tab.cpp:1191 -#: src/slic3r/GUI/Tab.cpp:1194 src/slic3r/GUI/Tab.cpp:1464 -#: src/slic3r/GUI/Tab.cpp:1951 src/slic3r/GUI/Tab.cpp:3633 -#: src/slic3r/GUI/wxExtensions.cpp:731 src/libslic3r/PrintConfig.cpp:88 -#: src/libslic3r/PrintConfig.cpp:213 src/libslic3r/PrintConfig.cpp:376 -#: src/libslic3r/PrintConfig.cpp:1038 src/libslic3r/PrintConfig.cpp:2286 -msgid "Advanced" -msgstr "고급" - -#: src/slic3r/GUI/GUI_App.cpp:814 -msgid "Advanced View Mode" -msgstr "고급 보기 모드" - -#: src/slic3r/GUI/GUI_App.cpp:815 src/slic3r/GUI/wxExtensions.cpp:732 -msgid "Expert" -msgstr "전문가" - -#: src/slic3r/GUI/GUI_App.cpp:815 -msgid "Expert View Mode" -msgstr "전문가 보기 모드" - -#: src/slic3r/GUI/GUI_App.cpp:820 -msgid "Mode" -msgstr "모드" - -#: src/slic3r/GUI/GUI_App.cpp:820 -#, c-format -msgid "%s View Mode" -msgstr "%s 보기 모드" - -#: src/slic3r/GUI/GUI_App.cpp:822 -msgid "Change Application &Language" -msgstr "응용 프로그램 언어 번경" - -#: src/slic3r/GUI/GUI_App.cpp:824 -msgid "Flash printer &firmware" -msgstr "프린터 펌웨어 플래시" - -#: src/slic3r/GUI/GUI_App.cpp:824 -msgid "Upload a firmware image into an Arduino based printer" -msgstr "아두이노 기반의 프린터 이미지 업로드" - -#: src/slic3r/GUI/GUI_App.cpp:839 -msgid "Taking configuration snapshot" -msgstr "구성 스냅 샷 만들기" - -#: src/slic3r/GUI/GUI_App.cpp:839 -msgid "Snapshot name" -msgstr "스냅 샷 이름" - -#: src/slic3r/GUI/GUI_App.cpp:882 -msgid "" -"Switching the language will trigger application restart.\n" -"You will lose content of the plater." -msgstr "" -"언어를 전환 하면 응용 프로그램 재시작 합니다. 플레이트 위 객체(object)는 모" -"두 지워집니다." - -#: src/slic3r/GUI/GUI_App.cpp:884 -msgid "Do you want to proceed?" -msgstr "계속 하시겠습니까?" - -#: src/slic3r/GUI/GUI_App.cpp:885 -msgid "Language selection" -msgstr "국가에 맞는 언어를 선택" - -#: src/slic3r/GUI/GUI_App.cpp:908 -msgid "&Configuration" -msgstr "&구성" - -#: src/slic3r/GUI/GUI_App.cpp:932 -msgid "The presets on the following tabs were modified" -msgstr "다음 탭의 사전 설정이 수정 되었습니다" - -#: src/slic3r/GUI/GUI_App.cpp:932 src/slic3r/GUI/Tab.cpp:2916 -msgid "Discard changes and continue anyway?" -msgstr "수정된 사항을 취소하고 계속하겠습니까?" - -#: src/slic3r/GUI/GUI_App.cpp:935 -msgid "Unsaved Presets" -msgstr "저장되지 않은 기존설정" - -#: src/slic3r/GUI/GUI_App.cpp:1084 src/slic3r/GUI/Tab.cpp:2928 -msgid "It's impossible to print multi-part object(s) with SLA technology." -msgstr "SLA 방식을 사용 하여 다중 객체(object)를 인쇄할 수는 없습니다." - -#: src/slic3r/GUI/GUI_App.cpp:1085 -msgid "Please check and fix your object list." -msgstr "객체(object) 목록을 확인 하고 수정 하십시오." - -#: src/slic3r/GUI/GUI_App.cpp:1086 src/slic3r/GUI/Plater.cpp:2299 -#: src/slic3r/GUI/Tab.cpp:2930 -msgid "Attention!" -msgstr "주목!" - -#: src/slic3r/GUI/GUI_App.cpp:1103 -msgid "Select a gcode file:" -msgstr "gcode 파일 선택:" - -#: src/slic3r/GUI/GUI_ObjectLayers.cpp:27 -msgid "Start at height" -msgstr "높이에서 시작" - -#: src/slic3r/GUI/GUI_ObjectLayers.cpp:27 -msgid "Stop at height" -msgstr "높이에서 정지" - -#: src/slic3r/GUI/GUI_ObjectLayers.cpp:153 -msgid "Remove layer range" -msgstr "레이어 범위 제거" - -#: src/slic3r/GUI/GUI_ObjectLayers.cpp:162 -msgid "Add layer range" -msgstr "레이어 범위 추가" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:34 src/slic3r/GUI/GUI_ObjectList.cpp:93 -#: src/slic3r/GUI/GUI_ObjectList.cpp:611 src/libslic3r/PrintConfig.cpp:72 -#: src/libslic3r/PrintConfig.cpp:165 src/libslic3r/PrintConfig.cpp:174 -#: src/libslic3r/PrintConfig.cpp:408 src/libslic3r/PrintConfig.cpp:470 -#: src/libslic3r/PrintConfig.cpp:478 src/libslic3r/PrintConfig.cpp:891 -#: src/libslic3r/PrintConfig.cpp:1076 src/libslic3r/PrintConfig.cpp:1383 -#: src/libslic3r/PrintConfig.cpp:1450 src/libslic3r/PrintConfig.cpp:1631 -#: src/libslic3r/PrintConfig.cpp:2084 src/libslic3r/PrintConfig.cpp:2143 -#: src/libslic3r/PrintConfig.cpp:2152 -msgid "Layers and Perimeters" -msgstr "레이어 및 둘레" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:36 src/slic3r/GUI/GUI_ObjectList.cpp:95 -#: src/slic3r/GUI/GUI_ObjectList.cpp:613 src/slic3r/GUI/GUI_Preview.cpp:248 -#: src/slic3r/GUI/Tab.cpp:1110 src/slic3r/GUI/Tab.cpp:1111 -#: src/libslic3r/ExtrusionEntity.cpp:319 src/libslic3r/PrintConfig.cpp:360 -#: src/libslic3r/PrintConfig.cpp:1511 src/libslic3r/PrintConfig.cpp:1876 -#: src/libslic3r/PrintConfig.cpp:1882 src/libslic3r/PrintConfig.cpp:1890 -#: src/libslic3r/PrintConfig.cpp:1902 src/libslic3r/PrintConfig.cpp:1912 -#: src/libslic3r/PrintConfig.cpp:1920 src/libslic3r/PrintConfig.cpp:1935 -#: src/libslic3r/PrintConfig.cpp:1956 src/libslic3r/PrintConfig.cpp:1968 -#: src/libslic3r/PrintConfig.cpp:1984 src/libslic3r/PrintConfig.cpp:1993 -#: src/libslic3r/PrintConfig.cpp:2002 src/libslic3r/PrintConfig.cpp:2013 -#: src/libslic3r/PrintConfig.cpp:2027 src/libslic3r/PrintConfig.cpp:2035 -#: src/libslic3r/PrintConfig.cpp:2036 src/libslic3r/PrintConfig.cpp:2045 -#: src/libslic3r/PrintConfig.cpp:2053 src/libslic3r/PrintConfig.cpp:2067 -msgid "Support material" -msgstr "서포트 재료(Support material)" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:39 src/slic3r/GUI/GUI_ObjectList.cpp:99 -#: src/slic3r/GUI/GUI_ObjectList.cpp:617 src/libslic3r/PrintConfig.cpp:2262 -#: src/libslic3r/PrintConfig.cpp:2270 -msgid "Wipe options" -msgstr "지우기 옵션" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:45 -msgid "Pad and Support" -msgstr "패드 및 서포트" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:51 -msgid "Add part" -msgstr "부품(Part) 추가" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:52 -msgid "Add modifier" -msgstr "편집영역(modifier) 추가" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:53 -msgid "Add support enforcer" -msgstr "서포트 지원(enforcer)영역 추가" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:54 -msgid "Add support blocker" -msgstr "서포트 금지영역(blocker) 추가" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:96 src/slic3r/GUI/GUI_ObjectList.cpp:614 -#: src/slic3r/GUI/GUI_Preview.cpp:226 src/slic3r/GUI/Tab.cpp:1135 -#: src/libslic3r/PrintConfig.cpp:225 src/libslic3r/PrintConfig.cpp:458 -#: src/libslic3r/PrintConfig.cpp:920 src/libslic3r/PrintConfig.cpp:1049 -#: src/libslic3r/PrintConfig.cpp:1440 src/libslic3r/PrintConfig.cpp:1677 -#: src/libslic3r/PrintConfig.cpp:1726 src/libslic3r/PrintConfig.cpp:1778 -#: src/libslic3r/PrintConfig.cpp:2128 -msgid "Speed" -msgstr "속도" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:97 src/slic3r/GUI/GUI_ObjectList.cpp:615 -#: src/slic3r/GUI/Tab.cpp:1170 src/slic3r/GUI/Tab.cpp:1822 -#: src/libslic3r/PrintConfig.cpp:488 src/libslic3r/PrintConfig.cpp:1003 -#: src/libslic3r/PrintConfig.cpp:1418 src/libslic3r/PrintConfig.cpp:1747 -#: src/libslic3r/PrintConfig.cpp:1948 src/libslic3r/PrintConfig.cpp:1975 -msgid "Extruders" -msgstr "익스트루더" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:98 src/slic3r/GUI/GUI_ObjectList.cpp:616 -#: src/libslic3r/PrintConfig.cpp:447 src/libslic3r/PrintConfig.cpp:555 -#: src/libslic3r/PrintConfig.cpp:878 src/libslic3r/PrintConfig.cpp:1011 -#: src/libslic3r/PrintConfig.cpp:1427 src/libslic3r/PrintConfig.cpp:1767 -#: src/libslic3r/PrintConfig.cpp:1957 src/libslic3r/PrintConfig.cpp:2116 -msgid "Extrusion Width" -msgstr "압출 폭" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:104 src/slic3r/GUI/GUI_ObjectList.cpp:622 -#: src/slic3r/GUI/Plater.cpp:492 src/slic3r/GUI/Tab.cpp:3576 -#: src/slic3r/GUI/Tab.cpp:3577 src/libslic3r/PrintConfig.cpp:2615 -#: src/libslic3r/PrintConfig.cpp:2622 src/libslic3r/PrintConfig.cpp:2631 -#: src/libslic3r/PrintConfig.cpp:2640 src/libslic3r/PrintConfig.cpp:2650 -#: src/libslic3r/PrintConfig.cpp:2676 src/libslic3r/PrintConfig.cpp:2683 -#: src/libslic3r/PrintConfig.cpp:2694 src/libslic3r/PrintConfig.cpp:2704 -#: src/libslic3r/PrintConfig.cpp:2713 src/libslic3r/PrintConfig.cpp:2726 -#: src/libslic3r/PrintConfig.cpp:2736 src/libslic3r/PrintConfig.cpp:2745 -#: src/libslic3r/PrintConfig.cpp:2755 src/libslic3r/PrintConfig.cpp:2766 -#: src/libslic3r/PrintConfig.cpp:2774 -msgid "Supports" -msgstr "서포트" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:105 src/slic3r/GUI/GUI_ObjectList.cpp:623 -#: src/slic3r/GUI/Plater.cpp:632 src/slic3r/GUI/Tab.cpp:3608 -#: src/slic3r/GUI/Tab.cpp:3609 src/libslic3r/PrintConfig.cpp:2782 -#: src/libslic3r/PrintConfig.cpp:2789 src/libslic3r/PrintConfig.cpp:2803 -#: src/libslic3r/PrintConfig.cpp:2814 src/libslic3r/PrintConfig.cpp:2824 -#: src/libslic3r/PrintConfig.cpp:2846 src/libslic3r/PrintConfig.cpp:2857 -#: src/libslic3r/PrintConfig.cpp:2864 src/libslic3r/PrintConfig.cpp:2871 -#: src/libslic3r/PrintConfig.cpp:2882 src/libslic3r/PrintConfig.cpp:2891 -#: src/libslic3r/PrintConfig.cpp:2900 -msgid "Pad" -msgstr "패드" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:106 src/slic3r/GUI/Tab.cpp:3626 -#: src/slic3r/GUI/Tab.cpp:3627 src/libslic3r/SLA/Hollowing.cpp:46 -#: src/libslic3r/SLA/Hollowing.cpp:58 src/libslic3r/SLA/Hollowing.cpp:67 -#: src/libslic3r/SLA/Hollowing.cpp:76 src/libslic3r/PrintConfig.cpp:2910 -#: src/libslic3r/PrintConfig.cpp:2917 src/libslic3r/PrintConfig.cpp:2927 -#: src/libslic3r/PrintConfig.cpp:2936 -msgid "Hollowing" -msgstr "속이 빈 공동(Hollowing)" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:268 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:153 -msgid "Name" -msgstr "이름" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:276 src/slic3r/GUI/Tab.cpp:1428 -#: src/slic3r/GUI/wxExtensions.cpp:589 src/libslic3r/PrintConfig.cpp:487 -msgid "Extruder" -msgstr "익스트루더(Extruder)" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:280 src/slic3r/GUI/GUI_ObjectList.cpp:392 -msgid "Editing" -msgstr "편집" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:337 -#, c-format -msgid "Auto-repaired (%d errors):" -msgstr "오류자동수정 (%d errors):" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:344 -msgid "degenerate facets" -msgstr "더러운 면" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:345 -msgid "edges fixed" -msgstr "모서리 고정" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:346 -msgid "facets removed" -msgstr "면 제거" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:347 -msgid "facets added" -msgstr "면 추가됨" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:348 -msgid "facets reversed" -msgstr "면 반전" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:349 -msgid "backwards edges" -msgstr "뒤쪽 가장자리" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:357 -msgid "Right button click the icon to fix STL through Netfabb" -msgstr "아이콘을 클릭 하여 Netfabb에서 STL을 수정 합니다" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:394 -msgid "Right button click the icon to change the object settings" -msgstr "아이콘을 클릭 하여 객체(object) 설정을 변경 합니다" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:396 -msgid "Click the icon to change the object settings" -msgstr "아이콘을 클릭 하여 오브젝트 설정을 변경 합니다" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:400 -msgid "Right button click the icon to change the object printable property" -msgstr "오른쪽 버튼이 아이콘을 클릭하여 객체 인쇄 가능한 속성을 변경합니다." - -#: src/slic3r/GUI/GUI_ObjectList.cpp:402 -msgid "Click the icon to change the object printable property" -msgstr "아이콘을 클릭하여 객체 인쇄 가능 속성을 변경합니다." - -#: src/slic3r/GUI/GUI_ObjectList.cpp:455 src/slic3r/GUI/GUI_ObjectList.cpp:467 -#: src/slic3r/GUI/GUI_ObjectList.cpp:915 src/slic3r/GUI/GUI_ObjectList.cpp:3947 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3957 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3992 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:200 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:257 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:282 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:490 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:1725 -msgid "default" -msgstr "기본값" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:534 -msgid "Change Extruder" -msgstr "압출기(익스트루더) 변경" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:549 -msgid "Rename Object" -msgstr "객체(object) 이름 바꾸기" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:549 -msgid "Rename Sub-object" -msgstr "하위 객체(object) 이름 바꾸기" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1089 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3756 -msgid "Instances to Separated Objects" -msgstr "분리된 객체(object)에 대한 복제본" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1104 -msgid "Volumes in Object reordered" -msgstr "개체의 볼륨이 재정렬되었습니다." - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1104 -msgid "Object reordered" -msgstr "개체 순서가 다시 지정되었습니다." - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1180 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1528 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1534 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1828 -#, c-format -msgid "Quick Add Settings (%s)" -msgstr "빠른 추가 설정 (%s)" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1263 -msgid "Select showing settings" -msgstr "표시된 설정을 선택 합니다" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1312 -msgid "Add Settings for Layers" -msgstr "레이어 설정 추가" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1313 -msgid "Add Settings for Sub-object" -msgstr "하위 객체(object)에 대한 설정 추가" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1314 -msgid "Add Settings for Object" -msgstr "객체(object)에 대한 설정 추가" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1384 -msgid "Add Settings Bundle for Height range" -msgstr "높이 범위에 대한 설정 번들 추가" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1385 -msgid "Add Settings Bundle for Sub-object" -msgstr "하위 객체(object)에 대한 번들 설정을 추가" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1386 -msgid "Add Settings Bundle for Object" -msgstr "객체(object)에 대한 번들 설정을 추가" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1425 -msgid "Load" -msgstr "불러오기" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1430 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1462 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1466 -msgid "Box" -msgstr "박스" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1430 -msgid "Cylinder" -msgstr "원통" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1430 -msgid "Sphere" -msgstr "영역" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1430 -msgid "Slab" -msgstr "슬랩" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1498 -msgid "Height range Modifier" -msgstr "높이 범위에 대한 설정" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1507 -msgid "Add settings" -msgstr "다음 설정" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1582 -msgid "Change type" -msgstr "타입 변경" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1589 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1601 -msgid "Set as a Separated Object" -msgstr "분리 된 객체(object)로 설정" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1601 -msgid "Set as a Separated Objects" -msgstr "분리된 객체(object)로 설정" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1611 -msgid "Printable" -msgstr "인쇄가능" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1626 -msgid "Rename" -msgstr "이름 변경" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1637 -msgid "Fix through the Netfabb" -msgstr "Netfabb를 통해 수정" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1647 src/slic3r/GUI/Plater.cpp:3987 -msgid "Export as STL" -msgstr "STL로 내보내기" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1655 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1658 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3932 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3935 src/slic3r/GUI/Plater.cpp:3946 -#: src/slic3r/GUI/Plater.cpp:3949 -msgid "Reload the selected volumes from disk" -msgstr "디스크에서 선택한 볼륨 다시 로드" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1685 src/libslic3r/PrintConfig.cpp:325 -msgid "Default" -msgstr "기본값" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1691 -msgid "Select new extruder for the object/part" -msgstr "객체(object)/부품(Part)에 대한 새 압출(익스트루더) 기 선택" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1703 -msgid "Scale to print volume" -msgstr "인쇄 볼륨에 따라 배율 조정" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1703 -msgid "Scale the selected object to fit the print volume" -msgstr "인쇄 볼륨에 맞게 선택한 객체(object)의 배율 조정" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1772 -#: src/slic3r/GUI/GUI_ObjectList.cpp:2030 -msgid "Add Shape" -msgstr "모양 추가" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1858 -msgid "Load Part" -msgstr "부품(Part)을 불러 오기" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1897 -msgid "Error!" -msgstr "에러!" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1972 -msgid "Add Generic Subobject" -msgstr "기본이 되는 하위 객체(object) 추가" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2001 -msgid "Generic" -msgstr "일반" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2119 -#: src/slic3r/GUI/GUI_ObjectList.cpp:2221 -msgid "Last instance of an object cannot be deleted." -msgstr "객체(object)의 마지막 복제본를 삭제할 수 없습니다." - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2131 -msgid "Delete Settings" -msgstr "설정 삭제" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2155 -msgid "Delete All Instances from Object" -msgstr "객체(object)에서 모든 복제본 삭제" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2171 -msgid "Delete Height Range" -msgstr "높이 범위 삭제" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2202 -msgid "From Object List You can't delete the last solid part from object." -msgstr "객체(object) 리스트에서 마지막 부품(Part)을 삭제할 수 없습니다." - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2206 -msgid "Delete Subobject" -msgstr "하위 객체(object) 삭제" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2225 -msgid "Delete Instance" -msgstr "복제본 삭제" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2249 src/slic3r/GUI/Plater.cpp:2964 -msgid "" -"The selected object couldn't be split because it contains only one part." -msgstr "" -"선택한 객체(object)는 부품(Part) 하나만 포함되어 있기 때문에 분할 할 수 없습" -"니다." - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2253 -msgid "Split to Parts" -msgstr "부품(Part)으로 분할" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2305 -msgid "Add Layers" -msgstr "레이어 추가" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2431 -msgid "Group manipulation" -msgstr "그룹 조작" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2443 -msgid "Object manipulation" -msgstr "객체(object) 조작" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2456 -msgid "Object Settings to modify" -msgstr "수정할 객체(object) 설정" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2460 -msgid "Part Settings to modify" -msgstr "수정할 부품(Part) 설정" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2465 -msgid "Layer range Settings to modify" -msgstr "레이어 범위 설정 수정" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2471 -msgid "Part manipulation" -msgstr "부품(Part) 조작" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2477 -msgid "Instance manipulation" -msgstr "복제본 제거" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2484 -msgid "Height ranges" -msgstr "높이 범위" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2484 -msgid "Settings for height range" -msgstr "높이 범위에 대한 설정" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2670 -msgid "Delete Selected Item" -msgstr "선택한 항목(item) 삭제" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2807 -msgid "Delete Selected" -msgstr "선택된 것 삭제" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2873 -#: src/slic3r/GUI/GUI_ObjectList.cpp:2902 -#: src/slic3r/GUI/GUI_ObjectList.cpp:2920 -msgid "Add Height Range" -msgstr "높이 범위 추가" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2980 -msgid "Edit Height Range" -msgstr "높이 범위 편집" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:3266 -msgid "Selection-Remove from list" -msgstr "목록에서 선택-제거" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:3274 -msgid "Selection-Add from list" -msgstr "목록에서 선택-추가" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:3392 -msgid "Object or Instance" -msgstr "객체(object) 또는 복제본" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:3393 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3526 -msgid "Part" -msgstr "부품(Part)(Part)" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:3393 -msgid "Layer" -msgstr "레이어" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:3395 -msgid "Unsupported selection" -msgstr "지원 되지 않는 선택" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:3396 -#, c-format -msgid "You started your selection with %s Item." -msgstr "%s 선택된 항목으로 시작합니다." - -#: src/slic3r/GUI/GUI_ObjectList.cpp:3397 -#, c-format -msgid "In this mode you can select only other %s Items%s" -msgstr "이 모드에서는 %s의 다른 %s 항목만 선택할 수 있습니다" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:3400 -msgid "of a current Object" -msgstr "현재 객체(object)의" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:3405 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3480 src/slic3r/GUI/Plater.cpp:143 -msgid "Info" -msgstr "정보" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:3521 -msgid "You can't change a type of the last solid part of the object." -msgstr "객체(object)의 마지막 부품(Part) 유형은 변경할 수 없습니다." - -#: src/slic3r/GUI/GUI_ObjectList.cpp:3526 -msgid "Modifier" -msgstr "편집 영역" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:3526 -msgid "Support Enforcer" -msgstr "서포트 지원 영역" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:3526 -msgid "Support Blocker" -msgstr "서포트 금지 영역" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:3528 -msgid "Select type of part" -msgstr "부품(Part) 유형 선택" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:3533 -msgid "Change Part Type" -msgstr "부품(Part) 유형 변경" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:3778 -msgid "Enter new name" -msgstr "새 이름 입력" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:3778 -msgid "Renaming" -msgstr "이름 바꾸기" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:3794 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3901 src/slic3r/GUI/Tab.cpp:3426 -#: src/slic3r/GUI/Tab.cpp:3430 -msgid "The supplied name is not valid;" -msgstr "제공된 이름이 유효하지 않습니다;" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:3795 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3902 src/slic3r/GUI/Tab.cpp:3427 -msgid "the following characters are not allowed:" -msgstr "다음 문자는 허용되지 않습니다:" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:3927 -msgid "Set extruder for selected items" -msgstr "선택한 항목에 대한 압출기(익스트루더) 설정" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:3928 -msgid "Select extruder number for selected objects and/or parts" -msgstr "선택한 객체(object) 및 부품(Part)에 대한 압출기(익스트루더) 번호 선택" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:3951 -msgid "Select extruder number:" -msgstr "압출기(익스트루더) 번호 선택:" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:3952 -msgid "This extruder will be set for selected items" -msgstr "선택한 항목에 대한 압출기(익스트루더) 설정" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:3977 -msgid "Change Extruders" -msgstr "돌출기 변경" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:4074 src/slic3r/GUI/Selection.cpp:1474 -msgid "Set Printable" -msgstr "인쇄 가능 설정" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:4074 src/slic3r/GUI/Selection.cpp:1474 -msgid "Set Unprintable" -msgstr "인쇄할 수 없는 설정" - -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:62 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:105 -msgid "World coordinates" -msgstr "전체크기와 좌표" - -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:63 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:106 -msgid "Local coordinates" -msgstr "로컬 좌표" - -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:82 -msgid "Select coordinate space, in which the transformation will be performed." -msgstr "변환이 수행될 좌표 공간을 선택 합니다." - -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:155 src/libslic3r/GCode.cpp:638 -msgid "Object name" -msgstr "객체(object) 이름" - -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:215 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:457 -msgid "Position" -msgstr "위치" - -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:216 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:458 -#: src/slic3r/GUI/Mouse3DController.cpp:321 -#: src/slic3r/GUI/Mouse3DController.cpp:344 -msgid "Rotation" -msgstr "회전" - -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:263 -#, c-format -msgid "Toggle %c axis mirroring" -msgstr "전환 %c 축 미러링" - -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:297 -msgid "Set Mirror" -msgstr "미러 설정" - -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:337 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:349 -msgid "Drop to bed" -msgstr "배드를 아래로 내리기" - -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:363 -msgid "Reset rotation" -msgstr "회전 재설정" - -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:385 -msgid "Reset Rotation" -msgstr "회전 재설정" - -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:397 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:399 -msgid "Reset scale" -msgstr "크기 재설정" - -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:459 -msgid "Scale factors" -msgstr "축척 계수" - -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:516 -msgid "Translate" -msgstr "번역" - -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:578 -msgid "" -"You cannot use non-uniform scaling mode for multiple objects/parts selection" -msgstr "" -"여러 객체/부품 선택에 는 균일하지 않은 배율 조정 모드를 사용할 수 없습니다." - -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:750 -msgid "Set Position" -msgstr "위치 설정" - -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:781 -msgid "Set Orientation" -msgstr "방향 설정" - -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:846 -msgid "Set Scale" -msgstr "축척 설정" - -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:875 -msgid "" -"The currently manipulated object is tilted (rotation angles are not " -"multiples of 90°).\n" -"Non-uniform scaling of tilted objects is only possible in the World " -"coordinate system,\n" -"once the rotation is embedded into the object coordinates." -msgstr "" -"현재 조작 된 객체(object)가 기울어져 있습니다 (회전 각도가 90°의 배수가 아" -"님).\n" -"기울어진 객체(object)의 배율 조정은 기본 좌표에서만 가능 합니다." - -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:878 -msgid "" -"This operation is irreversible.\n" -"Do you want to proceed?" -msgstr "" -"이 작업은 되돌릴수 없습니다.\n" -"계속 하시겠습니까?" - -#: src/slic3r/GUI/GUI_ObjectSettings.cpp:59 -msgid "Additional Settings" -msgstr "추가적인 세팅" - -#: src/slic3r/GUI/GUI_ObjectSettings.cpp:95 -msgid "Remove parameter" -msgstr "매개 변수 제거" - -#: src/slic3r/GUI/GUI_ObjectSettings.cpp:101 -#, c-format -msgid "Delete Option %s" -msgstr "삭제 %s 옵션" - -#: src/slic3r/GUI/GUI_ObjectSettings.cpp:152 -#, c-format -msgid "Change Option %s" -msgstr "옵션 %s 변경" - -#: src/slic3r/GUI/GUI_Preview.cpp:220 -msgid "View" -msgstr "보기" - -#: src/slic3r/GUI/GUI_Preview.cpp:223 src/slic3r/GUI/GUI_Preview.cpp:577 -#: src/libslic3r/GCode/PreviewData.cpp:345 -msgid "Feature type" -msgstr "특색 유형" - -#: src/slic3r/GUI/GUI_Preview.cpp:224 src/libslic3r/PrintConfig.cpp:500 -msgid "Height" -msgstr "높이" - -#: src/slic3r/GUI/GUI_Preview.cpp:225 src/libslic3r/PrintConfig.cpp:2248 -msgid "Width" -msgstr "폭" - -#: src/slic3r/GUI/GUI_Preview.cpp:227 src/slic3r/GUI/Tab.cpp:1451 -msgid "Fan speed" -msgstr "팬 속도" - -#: src/slic3r/GUI/GUI_Preview.cpp:228 -msgid "Volumetric flow rate" -msgstr "용적의 유량값" - -#: src/slic3r/GUI/GUI_Preview.cpp:229 src/slic3r/GUI/GUI_Preview.cpp:337 -#: src/slic3r/GUI/GUI_Preview.cpp:521 src/slic3r/GUI/GUI_Preview.cpp:576 -#: src/slic3r/GUI/GUI_Preview.cpp:831 src/libslic3r/GCode/PreviewData.cpp:357 -msgid "Tool" -msgstr "도구" - -#: src/slic3r/GUI/GUI_Preview.cpp:230 src/slic3r/GUI/GUI_Preview.cpp:574 -#: src/libslic3r/GCode/PreviewData.cpp:359 -msgid "Color Print" -msgstr "컬러 프린트" - -#: src/slic3r/GUI/GUI_Preview.cpp:233 -msgid "Show" -msgstr "보다" - -#: src/slic3r/GUI/GUI_Preview.cpp:236 src/slic3r/GUI/GUI_Preview.cpp:237 -msgid "Feature types" -msgstr "특색 유형" - -#: src/slic3r/GUI/GUI_Preview.cpp:239 src/libslic3r/ExtrusionEntity.cpp:310 -msgid "Perimeter" -msgstr "가장자리" - -#: src/slic3r/GUI/GUI_Preview.cpp:240 src/libslic3r/ExtrusionEntity.cpp:311 -msgid "External perimeter" -msgstr "외부 가장자리" - -#: src/slic3r/GUI/GUI_Preview.cpp:241 src/libslic3r/ExtrusionEntity.cpp:312 -msgid "Overhang perimeter" -msgstr "오버행(Overhang) 둘레" - -#: src/slic3r/GUI/GUI_Preview.cpp:242 src/libslic3r/ExtrusionEntity.cpp:313 -msgid "Internal infill" -msgstr "내부 채움" - -#: src/slic3r/GUI/GUI_Preview.cpp:243 src/libslic3r/ExtrusionEntity.cpp:314 -#: src/libslic3r/PrintConfig.cpp:1766 src/libslic3r/PrintConfig.cpp:1777 -msgid "Solid infill" -msgstr "솔리드 인필" - -#: src/slic3r/GUI/GUI_Preview.cpp:244 src/libslic3r/ExtrusionEntity.cpp:315 -#: src/libslic3r/PrintConfig.cpp:2115 src/libslic3r/PrintConfig.cpp:2127 -msgid "Top solid infill" -msgstr "가장 윗부분 채움" - -#: src/slic3r/GUI/GUI_Preview.cpp:245 src/libslic3r/ExtrusionEntity.cpp:316 -msgid "Bridge infill" -msgstr "브릿지 채움" - -#: src/slic3r/GUI/GUI_Preview.cpp:246 src/libslic3r/ExtrusionEntity.cpp:317 -#: src/libslic3r/PrintConfig.cpp:919 -msgid "Gap fill" -msgstr "공백 채움" - -#: src/slic3r/GUI/GUI_Preview.cpp:247 src/slic3r/GUI/Tab.cpp:1101 -#: src/libslic3r/ExtrusionEntity.cpp:318 -msgid "Skirt" -msgstr "스커트" - -#: src/slic3r/GUI/GUI_Preview.cpp:249 src/libslic3r/ExtrusionEntity.cpp:320 -#: src/libslic3r/PrintConfig.cpp:2001 -msgid "Support material interface" -msgstr "서포트 접점" - -#: src/slic3r/GUI/GUI_Preview.cpp:250 src/slic3r/GUI/Tab.cpp:1181 -#: src/libslic3r/ExtrusionEntity.cpp:321 -msgid "Wipe tower" -msgstr "와이프 타워(Wipe tower)" - -#: src/slic3r/GUI/GUI_Preview.cpp:255 src/libslic3r/PrintConfig.cpp:2162 -msgid "Travel" -msgstr "이송" - -#: src/slic3r/GUI/GUI_Preview.cpp:256 -msgid "Retractions" -msgstr "리트랙션" - -#: src/slic3r/GUI/GUI_Preview.cpp:257 -msgid "Unretractions" -msgstr "리트랙션 취소" - -#: src/slic3r/GUI/GUI_Preview.cpp:258 -msgid "Shells" -msgstr "쉘(Shells)" - -#: src/slic3r/GUI/GUI_Preview.cpp:259 -msgid "Legend" -msgstr "범례" - -#: src/slic3r/GUI/Job.hpp:123 -msgid "ERROR: not enough resources to execute a new job." -msgstr "오류: 새 작업을 실행하기에 충분한 리소스가 없습니다." - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:14 src/slic3r/GUI/MainFrame.cpp:710 -msgid "Keyboard Shortcuts" -msgstr "키보드 단축기" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:107 -msgid "Open project STL/OBJ/AMF/3MF with config, delete bed" -msgstr "프로젝트 구성 열기(STL/OBJ/AMF/3MF), 배드 삭제" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:108 -msgid "Import STL/OBJ/AMF/3MF without config, keep bed" -msgstr "구성 없이 가져오기(STL/OBJ/AMF/3MF), 배드 유지" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:109 -msgid "Load Config from .ini/amf/3mf/gcode" -msgstr ".Ini/amf/3mf/gcode에서 구성 가져오기" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:110 src/slic3r/GUI/Plater.cpp:888 -#: src/slic3r/GUI/Plater.cpp:5544 src/libslic3r/PrintConfig.cpp:3348 -msgid "Export G-code" -msgstr "G-code 내보내기" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:111 -msgid "Save project (3MF)" -msgstr "프로젝트 저장 (3MF)" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:112 -msgid "Load Config from .ini/amf/3mf/gcode and merge" -msgstr ".Ini/amf/3mf/gcode 및 병합에서 구성 가져오기" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:113 -msgid "(Re)slice" -msgstr "(Re)슬라이스" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:116 -msgid "Select Plater Tab" -msgstr "선택 및 플래이터 탭" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:118 -msgid "Select Print Settings Tab" -msgstr "인쇄 설정을 선택 합니다" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:119 -msgid "Select Filament Settings Tab" -msgstr "필라멘트 설정을 선택" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:120 -msgid "Select Printer Settings Tab" -msgstr "프린터 설정을 선택 합니다" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:121 -msgid "Switch to 3D" -msgstr "3D로 전환" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:122 -msgid "Switch to Preview" -msgstr "미리 보기로 전환" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:123 src/slic3r/GUI/Preferences.cpp:10 -msgid "Preferences" -msgstr "기본 설정" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:124 -#: src/slic3r/GUI/PrintHostDialogs.cpp:136 -msgid "Print host upload queue" -msgstr "프린터 호스트 업로드 대기" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:125 -msgid "Camera view" -msgstr "카메라 뷰" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:126 -msgid "Add Instance of the selected object" -msgstr "선택한 객체(object)의 복제본 추가" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:127 -msgid "Remove Instance of the selected object" -msgstr "선택한 객체(object)의 복제본 제거" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:128 -msgid "Show keyboard shortcuts list" -msgstr "단축 키 목록 표시" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:129 -msgid "Press to select multiple object or move multiple object with mouse" -msgstr "" -"여러 객체(object)를 선택 하거나 마우스로 여러 객체(object)를 이동 하려면 누릅" -"니다" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:131 -msgid "Main Shortcuts" -msgstr "주요 단축키" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:139 -msgid "Select All objects" -msgstr "모든 객체(object) 선택" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:140 -msgid "Delete selected" -msgstr "선택 삭제" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:141 -msgid "Delete All" -msgstr "전부 지움" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:142 -msgid "Copy to clipboard" -msgstr "클립보드로 복사" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:143 -msgid "Paste from clipboard" -msgstr "클립보드에서 붙여넣기" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:144 -msgid "Gizmo move" -msgstr "개체(Gizmo) 이동" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:145 -msgid "Gizmo scale" -msgstr "개체(Gizmo) 배율" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:146 -msgid "Gizmo rotate" -msgstr "개체(Gizmo) 회전" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:147 -msgid "Gizmo cut" -msgstr "개체(Gizmo) 자르기" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:148 -msgid "Gizmo Place face on bed" -msgstr "개체(Gizmo)를 배드위로" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:149 -msgid "Gizmo SLA support points" -msgstr "SLA 개체(Gizmo) 서포트 지점들" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:150 -#, no-c-format -msgid "" -"Press to activate selection rectangle\n" -"or to snap by 5% in Gizmo scale\n" -"or to snap by 1mm in Gizmo move" -msgstr "" -"활성화된 사각형을 선택합니다.\n" -"5% in 객체(object) 크기를 스냅에 맞춰 조절합니다.\n" -"1mm 씩 객체(object)를 스냅에 맞추 이동합니다." - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:151 -msgid "" -"Press to scale selection to fit print volume\n" -"in Gizmo scale" -msgstr "개체(Gizmo)크기를 인쇄 볼륨에 맞게 조정하려면 누릅니다." - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:152 -msgid "" -"Press to activate deselection rectangle\n" -"or to scale or rotate selected objects\n" -"around their own center" -msgstr "" -"중재봉선 주변으로. 선택한 개체의 크기를 조정 하거나 \n" -"회전 하려면 누릅니다" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:153 -msgid "Press to activate one direction scaling in Gizmo scale" -msgstr "개체(Gizmo) 크기 조절을 활성화 합니다." - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:154 -msgid "Change camera type (perspective, orthographic)" -msgstr "카메라 유형 변경(원근, 직교)" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:155 -msgid "Zoom to Bed" -msgstr "배드 확대" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:156 -msgid "Zoom to all objects in scene, if none selected" -msgstr "모든 객체(object)를 확대/축소 (선택 하지 않은 경우)" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:157 -msgid "Zoom to selected object" -msgstr "선택한 객체(object)를 확대/축소" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:158 -msgid "Zoom in" -msgstr "확대" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:159 -msgid "Zoom out" -msgstr "축소" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:161 -msgid "Show/Hide object/instance labels" -msgstr "개체/인스턴스 레이블 표시/숨기기" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:163 -msgid "Show/Hide 3Dconnexion devices settings dialog" -msgstr "3Dconnexion 장치 설정 대화 상자 표시/숨기기" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:164 -msgid "Unselect gizmo / Clear selection" -msgstr "개체(Gizmo) 선택을 취소 하거나 지우기" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:170 -msgid "Plater Shortcuts" -msgstr "플레이터 단축기" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:185 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:197 -msgid "Arrow Up" -msgstr "위쪽 화살표" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:185 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:187 -msgid "Upper Layer" -msgstr "상위 레이어" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:186 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:198 -msgid "Arrow Down" -msgstr "아래쪽 화살표" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:186 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:188 -msgid "Lower Layer" -msgstr "하위 레이어" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:189 -msgid "Show/Hide (L)egend" -msgstr "표시/숨기기(L)egend" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:191 -msgid "Preview Shortcuts" -msgstr "미리보기 단축기" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:197 -msgid "Move current slider thumb Up" -msgstr "현재 마우스 휠을 위로 이동" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:198 -msgid "Move current slider thumb Down" -msgstr "현재 마우스 휠을 아래로 이동" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:199 -msgid "Arrow Left" -msgstr "왼쪽 화살표" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:199 -msgid "Set upper thumb to current slider thumb" -msgstr "마우스 휠을 위로 움직여 설정" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:200 -msgid "Arrow Right" -msgstr "오른쪽 화살표" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:200 -msgid "Set lower thumb to current slider thumb" -msgstr "마우스 휠을 아래로 움직여 설정" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:201 -msgid "Add color change marker for current layer" -msgstr "현재 레이어의 색상을 변경할 마커 추가" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:202 -msgid "Delete color change marker for current layer" -msgstr "현재 레이어의 색상을 변경할 마커 삭제" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:204 -msgid "Layers Slider Shortcuts" -msgstr "레이어 슬라이더 단축키" - -#: src/slic3r/GUI/MainFrame.cpp:66 -msgid "" -" - Remember to check for updates at http://github.com/prusa3d/PrusaSlicer/" -"releases" -msgstr "" -" -http://github.com/prusa3d/slic3r/releases에서 업데이트 확인하는 것을 잊지 " -"마십시오" - -#: src/slic3r/GUI/MainFrame.cpp:174 -msgid "based on Slic3r" -msgstr "Slic3r 기반" - -#: src/slic3r/GUI/MainFrame.cpp:204 -msgid "Plater" -msgstr "플레이터" - -#: src/slic3r/GUI/MainFrame.cpp:405 -msgid "&New Project" -msgstr "&새로운 프로젝트" - -#: src/slic3r/GUI/MainFrame.cpp:405 -msgid "Start a new project" -msgstr "새로운 프로젝트 시작" - -#: src/slic3r/GUI/MainFrame.cpp:408 -msgid "&Open Project" -msgstr "&프로젝트 열기" - -#: src/slic3r/GUI/MainFrame.cpp:408 -msgid "Open a project file" -msgstr "프로젝트 파일 열기" - -#: src/slic3r/GUI/MainFrame.cpp:413 -msgid "Recent projects" -msgstr "최근 프로젝트" - -#: src/slic3r/GUI/MainFrame.cpp:422 -msgid "The selected project is no more available" -msgstr "선택한 프로젝트를 더 이상 사용할 수 없습니다." - -#: src/slic3r/GUI/MainFrame.cpp:422 src/slic3r/GUI/MainFrame.cpp:787 -#: src/slic3r/GUI/PrintHostDialogs.cpp:231 -msgid "Error" -msgstr "에러" - -#: src/slic3r/GUI/MainFrame.cpp:446 -msgid "&Save Project" -msgstr "프로젝트 저장" - -#: src/slic3r/GUI/MainFrame.cpp:446 -msgid "Save current project file" -msgstr "현재 프로젝트 파일 저장" - -#: src/slic3r/GUI/MainFrame.cpp:450 src/slic3r/GUI/MainFrame.cpp:452 -msgid "Save Project &as" -msgstr "프로젝트 저장" - -#: src/slic3r/GUI/MainFrame.cpp:450 src/slic3r/GUI/MainFrame.cpp:452 -msgid "Save current project file as" -msgstr "현재 프로젝트 파일을 다른 이름으로 저장" - -#: src/slic3r/GUI/MainFrame.cpp:460 -msgid "Import STL/OBJ/AM&F/3MF" -msgstr "가져오기 STL/OBJ/AM&F/3MF" - -#: src/slic3r/GUI/MainFrame.cpp:460 -msgid "Load a model" -msgstr "모델 로드" - -#: src/slic3r/GUI/MainFrame.cpp:464 -msgid "Import &Config" -msgstr "&구성 가져오기" - -#: src/slic3r/GUI/MainFrame.cpp:464 -msgid "Load exported configuration file" -msgstr "내 보낸 구성 파일로드" - -#: src/slic3r/GUI/MainFrame.cpp:467 -msgid "Import Config from &project" -msgstr "프로젝트에서 설정 가져오기" - -#: src/slic3r/GUI/MainFrame.cpp:467 -msgid "Load configuration from project file" -msgstr "프로젝트 파일에서 구성 로드" - -#: src/slic3r/GUI/MainFrame.cpp:471 -msgid "Import Config &Bundle" -msgstr "번들 &설정 가져오기" - -#: src/slic3r/GUI/MainFrame.cpp:471 -msgid "Load presets from a bundle" -msgstr "미리 설정 번들값 가져오기" - -#: src/slic3r/GUI/MainFrame.cpp:474 -msgid "&Import" -msgstr "&가져오기" - -#: src/slic3r/GUI/MainFrame.cpp:477 src/slic3r/GUI/MainFrame.cpp:751 -msgid "Export &G-code" -msgstr "G-code 내보내기" - -#: src/slic3r/GUI/MainFrame.cpp:477 -msgid "Export current plate as G-code" -msgstr "현재 플레이터를 G 코드로 내보내기" - -#: src/slic3r/GUI/MainFrame.cpp:481 src/slic3r/GUI/MainFrame.cpp:752 -msgid "S&end G-code" -msgstr "S&엔드 G- 코드" - -#: src/slic3r/GUI/MainFrame.cpp:481 -msgid "Send to print current plate as G-code" -msgstr "현재 플레이트를 G 코드로 인쇄하기 위해 보내기" - -#: src/slic3r/GUI/MainFrame.cpp:486 -msgid "Export plate as &STL" -msgstr "STL로 내보내기" - -#: src/slic3r/GUI/MainFrame.cpp:486 -msgid "Export current plate as STL" -msgstr "현재 플레이터를 STL로 내보내기" - -#: src/slic3r/GUI/MainFrame.cpp:489 -msgid "Export plate as STL &including supports" -msgstr "서포트를 포함하여 플레이터를 STL로 내보내기" - -#: src/slic3r/GUI/MainFrame.cpp:489 -msgid "Export current plate as STL including supports" -msgstr "서포트를 포함 하여 현재 플레이터를 STL로 내보내기" - -#: src/slic3r/GUI/MainFrame.cpp:492 -msgid "Export plate as &AMF" -msgstr "AMF로 내보내기" - -#: src/slic3r/GUI/MainFrame.cpp:492 -msgid "Export current plate as AMF" -msgstr "현재 플레이터를 AMF로 내보내기" - -#: src/slic3r/GUI/MainFrame.cpp:496 -msgid "Export &toolpaths as OBJ" -msgstr "OBJ로 내보내기 및 공구 경로" - -#: src/slic3r/GUI/MainFrame.cpp:496 -msgid "Export toolpaths as OBJ" -msgstr "도구 경로를 OBJ로 내보내기" - -#: src/slic3r/GUI/MainFrame.cpp:500 -msgid "Export &Config" -msgstr "&구성 내보내기" - -#: src/slic3r/GUI/MainFrame.cpp:500 -msgid "Export current configuration to file" -msgstr "현재 구성을 파일로 내보내기" - -#: src/slic3r/GUI/MainFrame.cpp:503 -msgid "Export Config &Bundle" -msgstr "번들 & 내보내기 설정" - -#: src/slic3r/GUI/MainFrame.cpp:503 -msgid "Export all presets to file" -msgstr "모든 이전 설정을 파일로 내보내기" - -#: src/slic3r/GUI/MainFrame.cpp:506 -msgid "&Export" -msgstr "&내보내기" - -#: src/slic3r/GUI/MainFrame.cpp:512 -msgid "Quick Slice" -msgstr "빠른 슬라이스" - -#: src/slic3r/GUI/MainFrame.cpp:512 -msgid "Slice a file into a G-code" -msgstr "파일을 G 코드로 분할" - -#: src/slic3r/GUI/MainFrame.cpp:518 -msgid "Quick Slice and Save As" -msgstr "빠른 슬라이스 및 다른 이름으로 저장" - -#: src/slic3r/GUI/MainFrame.cpp:518 -msgid "Slice a file into a G-code, save as" -msgstr "파일을 G 코드로 분할하고 다른 이름으로 저장" - -#: src/slic3r/GUI/MainFrame.cpp:524 -msgid "Repeat Last Quick Slice" -msgstr "마지막으로 빠른 슬라이스 반복" - -#: src/slic3r/GUI/MainFrame.cpp:524 -msgid "Repeat last quick slice" -msgstr "마지막으로 빠른 슬라이스 반복" - -#: src/slic3r/GUI/MainFrame.cpp:532 -msgid "(Re)Slice No&w" -msgstr "지금(다시)자르기" - -#: src/slic3r/GUI/MainFrame.cpp:532 -msgid "Start new slicing process" -msgstr "새로운 슬라이싱 작업 시작" - -#: src/slic3r/GUI/MainFrame.cpp:536 -msgid "&Repair STL file" -msgstr "STL 파일 복구" - -#: src/slic3r/GUI/MainFrame.cpp:536 -msgid "Automatically repair an STL file" -msgstr "STL 파일을 자동으로 복구합니다" - -#: src/slic3r/GUI/MainFrame.cpp:540 -msgid "&Quit" -msgstr "&종료" - -#: src/slic3r/GUI/MainFrame.cpp:540 -#, c-format -msgid "Quit %s" -msgstr "%s 종료" - -#: src/slic3r/GUI/MainFrame.cpp:565 -msgid "&Select all" -msgstr "&모두 선택 " - -#: src/slic3r/GUI/MainFrame.cpp:566 -msgid "Selects all objects" -msgstr "모든 객체(object)를 선택 합니다" - -#: src/slic3r/GUI/MainFrame.cpp:568 -msgid "D&eselect all" -msgstr "모든 선택 취소 D&select" - -#: src/slic3r/GUI/MainFrame.cpp:569 -msgid "Deselects all objects" -msgstr "모든 객체(object) 선택 취소" - -#: src/slic3r/GUI/MainFrame.cpp:572 -msgid "&Delete selected" -msgstr "&선택 삭제 " - -#: src/slic3r/GUI/MainFrame.cpp:573 -msgid "Deletes the current selection" -msgstr "현재 선택 영역을 삭제 합니다" - -#: src/slic3r/GUI/MainFrame.cpp:575 -msgid "Delete &all" -msgstr "전부 지움 " - -#: src/slic3r/GUI/MainFrame.cpp:576 -msgid "Deletes all objects" -msgstr "모든 객체(object)를 삭제 합니다" - -#: src/slic3r/GUI/MainFrame.cpp:580 -msgid "&Undo" -msgstr "&되돌리기" - -#: src/slic3r/GUI/MainFrame.cpp:583 -msgid "&Redo" -msgstr "&앞으로" - -#: src/slic3r/GUI/MainFrame.cpp:588 -msgid "&Copy" -msgstr "&복사 " - -#: src/slic3r/GUI/MainFrame.cpp:589 -msgid "Copy selection to clipboard" -msgstr "선택영역을 클립보드로 복사합니다" - -#: src/slic3r/GUI/MainFrame.cpp:591 -msgid "&Paste" -msgstr "&붙이기 " - -#: src/slic3r/GUI/MainFrame.cpp:592 -msgid "Paste clipboard" -msgstr "클립보드 붙여넣기" - -#: src/slic3r/GUI/MainFrame.cpp:596 -msgid "Re&load from disk" -msgstr "디스크에서 다시 로드" - -#: src/slic3r/GUI/MainFrame.cpp:597 -msgid "Reload the plater from disk" -msgstr "디스크에서 플래터 다시 로드" - -#: src/slic3r/GUI/MainFrame.cpp:606 -msgid "&Plater Tab" -msgstr "&선택 및 플래이터 탭" - -#: src/slic3r/GUI/MainFrame.cpp:606 -msgid "Show the plater" -msgstr "플레이터를 보기" - -#: src/slic3r/GUI/MainFrame.cpp:614 -msgid "P&rint Settings Tab" -msgstr "프린트 설정 탭" - -#: src/slic3r/GUI/MainFrame.cpp:614 -msgid "Show the print settings" -msgstr "인쇄 설정 표시" - -#: src/slic3r/GUI/MainFrame.cpp:617 src/slic3r/GUI/MainFrame.cpp:754 -msgid "&Filament Settings Tab" -msgstr "&필라멘트 설정 탭" - -#: src/slic3r/GUI/MainFrame.cpp:617 -msgid "Show the filament settings" -msgstr "필라멘트 설정보기" - -#: src/slic3r/GUI/MainFrame.cpp:621 -msgid "Print&er Settings Tab" -msgstr "설정 인쇄 탭" - -#: src/slic3r/GUI/MainFrame.cpp:621 -msgid "Show the printer settings" -msgstr "간단한 설정보기" - -#: src/slic3r/GUI/MainFrame.cpp:626 -msgid "3&D" -msgstr "3&D" - -#: src/slic3r/GUI/MainFrame.cpp:626 -msgid "Show the 3D editing view" -msgstr "3D 편집용 보기 표시" - -#: src/slic3r/GUI/MainFrame.cpp:629 -msgid "Pre&view" -msgstr "미리 보기" - -#: src/slic3r/GUI/MainFrame.cpp:629 -msgid "Show the 3D slices preview" -msgstr "3D 슬라이스 미리 보기 표시" - -#: src/slic3r/GUI/MainFrame.cpp:648 -msgid "Print &Host Upload Queue" -msgstr "프린터 호스트 업로드 대기" - -#: src/slic3r/GUI/MainFrame.cpp:648 -msgid "Display the Print Host Upload Queue window" -msgstr "호스트 업로드 대기열 인쇄 창 표시" - -#: src/slic3r/GUI/MainFrame.cpp:658 -msgid "Iso" -msgstr "기본 " - -#: src/slic3r/GUI/MainFrame.cpp:658 -msgid "Iso View" -msgstr "표준 보기" - -#. TRN To be shown in the main menu View->Top -#. TRN To be shown in Print Settings "Top solid layers" -#: src/slic3r/GUI/MainFrame.cpp:662 src/libslic3r/PrintConfig.cpp:2142 -#: src/libslic3r/PrintConfig.cpp:2151 -msgid "Top" -msgstr "윗부분 " - -#: src/slic3r/GUI/MainFrame.cpp:662 -msgid "Top View" -msgstr "위에서 보기" - -#. TRN To be shown in the main menu View->Bottom -#. TRN To be shown in Print Settings "Bottom solid layers" -#. TRN To be shown in Print Settings "Top solid layers" -#: src/slic3r/GUI/MainFrame.cpp:665 src/libslic3r/PrintConfig.cpp:164 -#: src/libslic3r/PrintConfig.cpp:173 -msgid "Bottom" -msgstr "바닥 " - -#: src/slic3r/GUI/MainFrame.cpp:665 -msgid "Bottom View" -msgstr "바닥 보기" - -#: src/slic3r/GUI/MainFrame.cpp:667 -msgid "Front" -msgstr "앞 " - -#: src/slic3r/GUI/MainFrame.cpp:667 -msgid "Front View" -msgstr "앞면 보기 " - -#: src/slic3r/GUI/MainFrame.cpp:669 src/libslic3r/PrintConfig.cpp:1641 -msgid "Rear" -msgstr "뒷면 " - -#: src/slic3r/GUI/MainFrame.cpp:669 -msgid "Rear View" -msgstr "뒷면 보기" - -#: src/slic3r/GUI/MainFrame.cpp:671 -msgid "Left" -msgstr "왼쪽 " - -#: src/slic3r/GUI/MainFrame.cpp:671 -msgid "Left View" -msgstr "왼쪽 보기" - -#: src/slic3r/GUI/MainFrame.cpp:673 -msgid "Right" -msgstr "오른쪽 " - -#: src/slic3r/GUI/MainFrame.cpp:673 -msgid "Right View" -msgstr "오른쪽 보기" - -#: src/slic3r/GUI/MainFrame.cpp:677 -msgid "Show &labels" -msgstr "레이블 & 표시 " - -#: src/slic3r/GUI/MainFrame.cpp:677 -msgid "Show object/instance labels in 3D scene" -msgstr "3D 장면에서 오브젝트/인스턴스 레이블 표시" - -#: src/slic3r/GUI/MainFrame.cpp:686 -msgid "Prusa 3D &Drivers" -msgstr "푸르사 3D 드라이버" - -#: src/slic3r/GUI/MainFrame.cpp:686 -msgid "Open the Prusa3D drivers download page in your browser" -msgstr "브라우저에서 Prusa3D 드라이버 다운로드 페이지를 엽니다" - -#: src/slic3r/GUI/MainFrame.cpp:688 -msgid "Software &Releases" -msgstr "소프트웨어 &자료" - -#: src/slic3r/GUI/MainFrame.cpp:688 -msgid "Open the software releases page in your browser" -msgstr "브라우저에서 소프트웨어 정보 페이지 열기" - -#: src/slic3r/GUI/MainFrame.cpp:694 -#, c-format -msgid "%s &Website" -msgstr "%s &웹사이트" - -#: src/slic3r/GUI/MainFrame.cpp:695 -#, c-format -msgid "Open the %s website in your browser" -msgstr "%s 웹사이트를 브라우저에서 열기" - -#: src/slic3r/GUI/MainFrame.cpp:701 -msgid "System &Info" -msgstr "시스템 정보" - -#: src/slic3r/GUI/MainFrame.cpp:701 -msgid "Show system information" -msgstr "시스템 정보 표시" - -#: src/slic3r/GUI/MainFrame.cpp:703 -msgid "Show &Configuration Folder" -msgstr "폴더 표시 및 구성" - -#: src/slic3r/GUI/MainFrame.cpp:703 -msgid "Show user configuration folder (datadir)" -msgstr "사용자 구성 폴더를 표시 (datadir)" - -#: src/slic3r/GUI/MainFrame.cpp:705 -msgid "Report an I&ssue" -msgstr "문제를 보고" - -#: src/slic3r/GUI/MainFrame.cpp:705 -#, c-format -msgid "Report an issue on %s" -msgstr "%s에 문제 보고" - -#: src/slic3r/GUI/MainFrame.cpp:707 -#, c-format -msgid "&About %s" -msgstr "%s 에 대하여" - -#: src/slic3r/GUI/MainFrame.cpp:707 -msgid "Show about dialog" -msgstr "다이얼로그 표시" - -#: src/slic3r/GUI/MainFrame.cpp:710 -msgid "Show the list of the keyboard shortcuts" -msgstr "키보드 단축키 목록 표시" - -#: src/slic3r/GUI/MainFrame.cpp:723 -msgid "&File" -msgstr "&파일" - -#: src/slic3r/GUI/MainFrame.cpp:724 -msgid "&Edit" -msgstr "&수정" - -#: src/slic3r/GUI/MainFrame.cpp:725 -msgid "&Window" -msgstr "&윈도우" - -#: src/slic3r/GUI/MainFrame.cpp:726 -msgid "&View" -msgstr "&시점" - -#: src/slic3r/GUI/MainFrame.cpp:729 -msgid "&Help" -msgstr "&도움말" - -#: src/slic3r/GUI/MainFrame.cpp:751 -msgid "E&xport" -msgstr "보내기" - -#: src/slic3r/GUI/MainFrame.cpp:752 -msgid "S&end to print" -msgstr "끝내고 프린트" - -#: src/slic3r/GUI/MainFrame.cpp:754 -msgid "Mate&rial Settings Tab" -msgstr "재료(메터리리알) 설정 탭" - -#: src/slic3r/GUI/MainFrame.cpp:775 -msgid "Choose a file to slice (STL/OBJ/AMF/3MF/PRUSA):" -msgstr "슬라이스 할 파일을 선택하십시오 (STL / OBJ / AMF / 3MF / PRUSA):" - -#: src/slic3r/GUI/MainFrame.cpp:786 -msgid "No previously sliced file." -msgstr "이전에 분리 된 파일이 없습니다." - -#: src/slic3r/GUI/MainFrame.cpp:792 -msgid "Previously sliced file (" -msgstr "이전에 분리 된 파일 (" - -#: src/slic3r/GUI/MainFrame.cpp:792 -msgid ") not found." -msgstr ")을 찾을 수 없습니다." - -#: src/slic3r/GUI/MainFrame.cpp:793 -msgid "File Not Found" -msgstr "파일을 찾을수 없다" - -#: src/slic3r/GUI/MainFrame.cpp:828 -#, c-format -msgid "Save %s file as:" -msgstr "%s 파일을 저장 합니다:" - -#: src/slic3r/GUI/MainFrame.cpp:828 -msgid "SVG" -msgstr "Svg" - -#: src/slic3r/GUI/MainFrame.cpp:828 -msgid "G-code" -msgstr "G 코드" - -#: src/slic3r/GUI/MainFrame.cpp:840 -msgid "Save zip file as:" -msgstr "압축(zip)파일 다른이름 저장:" - -#: src/slic3r/GUI/MainFrame.cpp:849 src/slic3r/GUI/Plater.cpp:3107 -#: src/slic3r/GUI/Plater.cpp:5126 src/slic3r/GUI/Tab.cpp:1211 -#: src/slic3r/GUI/Tab.cpp:3634 -msgid "Slicing" -msgstr "슬라이싱" - -#. TRN "Processing input_file_basename" -#: src/slic3r/GUI/MainFrame.cpp:851 -#, c-format -msgid "Processing %s" -msgstr "처리 %s" - -#: src/slic3r/GUI/MainFrame.cpp:874 -msgid " was successfully sliced." -msgstr " 성공적으로 슬라이스." - -#: src/slic3r/GUI/MainFrame.cpp:876 -msgid "Slicing Done!" -msgstr "슬라이스 완료!" - -#: src/slic3r/GUI/MainFrame.cpp:891 -msgid "Select the STL file to repair:" -msgstr "복구 할 STL 파일을 선택하십시오:" - -#: src/slic3r/GUI/MainFrame.cpp:901 -msgid "Save OBJ file (less prone to coordinate errors than STL) as:" -msgstr "OBJ 파일을 저장하십시오 (STL보다 오류를 덜 조정할 가능성이 적음):" - -#: src/slic3r/GUI/MainFrame.cpp:913 -msgid "Your file was repaired." -msgstr "파일이 복구되었습니다." - -#: src/slic3r/GUI/MainFrame.cpp:913 src/libslic3r/PrintConfig.cpp:3442 -msgid "Repair" -msgstr "수정" - -#: src/slic3r/GUI/MainFrame.cpp:927 -msgid "Save configuration as:" -msgstr "구성을 저장 :" - -#: src/slic3r/GUI/MainFrame.cpp:946 src/slic3r/GUI/MainFrame.cpp:1008 -msgid "Select configuration to load:" -msgstr "불러올 구성 선택 :" - -#: src/slic3r/GUI/MainFrame.cpp:982 -msgid "Save presets bundle as:" -msgstr "이전 번들 설정을 다음과 같이 저장 :" - -#: src/slic3r/GUI/MainFrame.cpp:1029 -#, c-format -msgid "%d presets successfully imported." -msgstr "% d 사전 설정을 가져 왔습니다." - -#: src/slic3r/GUI/Mouse3DController.cpp:291 -msgid "3Dconnexion settings" -msgstr "3Dconnexion 설정" - -#: src/slic3r/GUI/Mouse3DController.cpp:306 -msgid "Device:" -msgstr "장치:" - -#: src/slic3r/GUI/Mouse3DController.cpp:313 -msgid "Speed:" -msgstr "스피드:" - -#: src/slic3r/GUI/Mouse3DController.cpp:317 -#: src/slic3r/GUI/Mouse3DController.cpp:337 -#: src/slic3r/GUI/Mouse3DController.cpp:339 -msgid "Translation" -msgstr "번역" - -#: src/slic3r/GUI/Mouse3DController.cpp:326 -#: src/slic3r/GUI/Mouse3DController.cpp:337 -msgid "Zoom" -msgstr "확대" - -#: src/slic3r/GUI/Mouse3DController.cpp:332 -msgid "Deadzone:" -msgstr "데드존:" - -#: src/slic3r/GUI/MsgDialog.cpp:73 -#, c-format -msgid "%s error" -msgstr "%s 오류" - -#: src/slic3r/GUI/MsgDialog.cpp:74 -#, c-format -msgid "%s has encountered an error" -msgstr "%s에 오류가 발생 했습니다" - -#: src/slic3r/GUI/ObjectDataViewModel.cpp:56 -msgid "Instances" -msgstr "복제본" - -#: src/slic3r/GUI/ObjectDataViewModel.cpp:60 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:216 -#, c-format -msgid "Instance %d" -msgstr "복제본 %d" - -#: src/slic3r/GUI/ObjectDataViewModel.cpp:67 src/slic3r/GUI/Tab.cpp:3482 -#: src/slic3r/GUI/Tab.cpp:3572 -msgid "Layers" -msgstr "레이어" - -#: src/slic3r/GUI/ObjectDataViewModel.cpp:94 -msgid "Range" -msgstr "범위" - -#: src/slic3r/GUI/OptionsGroup.cpp:249 -msgctxt "Layers" -msgid "Top" -msgstr "윗부분 " - -#: src/slic3r/GUI/OptionsGroup.cpp:249 -msgctxt "Layers" -msgid "Bottom" -msgstr "바닥 " - -#: src/slic3r/GUI/Plater.cpp:163 -msgid "Volume" -msgstr "크기" - -#: src/slic3r/GUI/Plater.cpp:164 -msgid "Facets" -msgstr "측면" - -#: src/slic3r/GUI/Plater.cpp:165 -msgid "Materials" -msgstr "재료" - -#: src/slic3r/GUI/Plater.cpp:168 -msgid "Manifold" -msgstr "많은" - -#: src/slic3r/GUI/Plater.cpp:218 -msgid "Sliced Info" -msgstr "슬라이스된 정보" - -#: src/slic3r/GUI/Plater.cpp:237 src/slic3r/GUI/Plater.cpp:1226 -msgid "Used Filament (m)" -msgstr "사용자 필라멘트 (m)" - -#: src/slic3r/GUI/Plater.cpp:238 -msgid "Used Filament (mm³)" -msgstr "사용자 필라멘트 (mm³)" - -#: src/slic3r/GUI/Plater.cpp:239 -msgid "Used Filament (g)" -msgstr "사용자 필라멘트 (g)" - -#: src/slic3r/GUI/Plater.cpp:240 -msgid "Used Material (unit)" -msgstr "사용 재료 (단위)" - -#: src/slic3r/GUI/Plater.cpp:241 -msgid "Cost (money)" -msgstr "비용 (돈)" - -#: src/slic3r/GUI/Plater.cpp:242 src/slic3r/GUI/Plater.cpp:1213 -#: src/slic3r/GUI/Plater.cpp:1255 -msgid "Estimated printing time" -msgstr "예상 인쇄 시간" - -#: src/slic3r/GUI/Plater.cpp:243 -msgid "Number of tool changes" -msgstr "공구(tool) 변경 수" - -#: src/slic3r/GUI/Plater.cpp:340 -msgid "Click to edit preset" -msgstr "사전 설정을 편집 하려면 클릭 하십시오" - -#: src/slic3r/GUI/Plater.cpp:495 -msgid "Select what kind of support do you need" -msgstr "서포트의 종류를 선택하세요" - -#: src/slic3r/GUI/Plater.cpp:497 src/libslic3r/PrintConfig.cpp:1911 -#: src/libslic3r/PrintConfig.cpp:2675 -msgid "Support on build plate only" -msgstr "출력물만 서포트를 지지" - -#: src/slic3r/GUI/Plater.cpp:498 src/slic3r/GUI/Plater.cpp:621 -msgid "For support enforcers only" -msgstr "서포트 지원영역 전용" - -#: src/slic3r/GUI/Plater.cpp:499 -msgid "Everywhere" -msgstr "모든곳" - -#: src/slic3r/GUI/Plater.cpp:531 src/slic3r/GUI/Tab.cpp:1107 -msgid "Brim" -msgstr "브림" - -#: src/slic3r/GUI/Plater.cpp:533 -msgid "" -"This flag enables the brim that will be printed around each object on the " -"first layer." -msgstr "첫 번째 레이어의 각 객체(object) 주위에 인쇄 될 브림을 활성화합니다." - -#: src/slic3r/GUI/Plater.cpp:541 -msgid "Purging volumes" -msgstr "퍼징 조절" - -#: src/slic3r/GUI/Plater.cpp:635 -msgid "Select what kind of pad do you need" -msgstr "필요한 패드 종류를 선택하십시오." - -#: src/slic3r/GUI/Plater.cpp:637 -msgid "Below object" -msgstr "개체 아래" - -#: src/slic3r/GUI/Plater.cpp:638 -msgid "Around object" -msgstr "개체 주위" - -#: src/slic3r/GUI/Plater.cpp:812 -msgid "Print settings" -msgstr "프린트 설정" - -#: src/slic3r/GUI/Plater.cpp:813 src/slic3r/GUI/Tab.cpp:1419 -#: src/slic3r/GUI/Tab.cpp:1420 -msgid "Filament" -msgstr "필라멘트" - -#: src/slic3r/GUI/Plater.cpp:814 -msgid "SLA print settings" -msgstr "SLA 인쇄 설정" - -#: src/slic3r/GUI/Plater.cpp:815 src/slic3r/GUI/Preset.cpp:1455 -msgid "SLA material" -msgstr "SLA 재료" - -#: src/slic3r/GUI/Plater.cpp:816 -msgid "Printer" -msgstr "프린터" - -#: src/slic3r/GUI/Plater.cpp:875 src/slic3r/GUI/Plater.cpp:5545 -msgid "Send to printer" -msgstr "프린터로 보내기" - -#: src/slic3r/GUI/Plater.cpp:876 -msgid "Remove device" -msgstr "장치 제거" - -#: src/slic3r/GUI/Plater.cpp:877 -msgid "Export to SD card/ USB thumb drive" -msgstr "SD 카드/USB 썸 드라이브로 내보내기" - -#: src/slic3r/GUI/Plater.cpp:889 src/slic3r/GUI/Plater.cpp:3107 -#: src/slic3r/GUI/Plater.cpp:5129 -msgid "Slice now" -msgstr "바로 슬라이스" - -#: src/slic3r/GUI/Plater.cpp:1039 -msgid "Hold Shift to Slice & Export G-code" -msgstr "Shift 키를 누른 채 G 코드 내보내기" - -#: src/slic3r/GUI/Plater.cpp:1149 -#, c-format -msgid "%d (%d shells)" -msgstr "% d (% d 쉘)" - -#: src/slic3r/GUI/Plater.cpp:1154 -#, c-format -msgid "Auto-repaired (%d errors)" -msgstr "오류자동수정 (%d errors)" - -#: src/slic3r/GUI/Plater.cpp:1157 -#, c-format -msgid "" -"%d degenerate facets, %d edges fixed, %d facets removed, %d facets added, %d " -"facets reversed, %d backwards edges" -msgstr "" -"%d 면 고정, %d 모서리 고정, %d 면 제거, %d 면 추가, %d 면 반전, %d 후방 모서" -"리" - -#: src/slic3r/GUI/Plater.cpp:1167 -msgid "Yes" -msgstr "예" - -#: src/slic3r/GUI/Plater.cpp:1188 -msgid "Used Material (ml)" -msgstr "사용 재료 (ml)" - -#: src/slic3r/GUI/Plater.cpp:1191 -msgid "object(s)" -msgstr "객체(object)" - -#: src/slic3r/GUI/Plater.cpp:1191 -msgid "supports and pad" -msgstr "지지대 및 패드" - -#: src/slic3r/GUI/Plater.cpp:1228 src/slic3r/GUI/Plater.cpp:1243 -msgid "objects" -msgstr "객체들(objects)" - -#: src/slic3r/GUI/Plater.cpp:1228 src/slic3r/GUI/Plater.cpp:1243 -msgid "wipe tower" -msgstr "와이프 타워(Wipe tower)" - -#: src/slic3r/GUI/Plater.cpp:1241 src/libslic3r/PrintConfig.cpp:761 -#: src/libslic3r/PrintConfig.cpp:2511 src/libslic3r/PrintConfig.cpp:2512 -msgid "Cost" -msgstr "비용" - -#: src/slic3r/GUI/Plater.cpp:1258 -msgid "normal mode" -msgstr "일반 모드" - -#: src/slic3r/GUI/Plater.cpp:1262 src/slic3r/GUI/Plater.cpp:1271 -#: src/libslic3r/PrintConfig.cpp:583 -msgid "Color" -msgstr "색상" - -#: src/slic3r/GUI/Plater.cpp:1267 -msgid "stealth mode" -msgstr "스텔스 모드" - -#: src/slic3r/GUI/Plater.cpp:1375 -msgid "Load File" -msgstr "파일 로드" - -#: src/slic3r/GUI/Plater.cpp:1379 -msgid "Load Files" -msgstr "파일 로드" - -#: src/slic3r/GUI/Plater.cpp:2137 -msgid "New Project" -msgstr "새로운 프로젝트" - -#: src/slic3r/GUI/Plater.cpp:2259 -msgid "Loading" -msgstr "로딩" - -#: src/slic3r/GUI/Plater.cpp:2269 -#, c-format -msgid "Processing input file %s" -msgstr "입력 파일 처리 %s" - -#: src/slic3r/GUI/Plater.cpp:2297 -msgid "You cannot load SLA project with a multi-part object on the bed" -msgstr "" -"배드에 여러 부분으로 구성된 객체가 있는 SLA 프로젝트를 로드할 수 없습니다." - -#: src/slic3r/GUI/Plater.cpp:2298 src/slic3r/GUI/Tab.cpp:2929 -msgid "Please check your object list before preset changing." -msgstr "사전 설정을 변경 하기 전에 객체(object) 목록을 확인 하십시오." - -#: src/slic3r/GUI/Plater.cpp:2343 -msgid "" -"This file contains several objects positioned at multiple heights.\n" -"Instead of considering them as multiple objects, should I consider\n" -"this file as a single object having multiple parts?" -msgstr "" -"이 파일에는 여러 높이마다 객체(object)가 있습니다. 여러 객체(object)로 간주하" -"는 대신,\n" -"이 파일은 여러 부품을 갖는 단일 객체(object)로 보입니까?" - -#: src/slic3r/GUI/Plater.cpp:2346 src/slic3r/GUI/Plater.cpp:2399 -msgid "Multi-part object detected" -msgstr "다중 부품(Part) 객체(object)가 감지" - -#: src/slic3r/GUI/Plater.cpp:2353 -msgid "" -"This file cannot be loaded in a simple mode. Do you want to switch to an " -"advanced mode?" -msgstr "" -"이 파일은 기본 모드에서 로드할 수 없습니다. 고급 모드로 전환 하시겠습니까?" - -#: src/slic3r/GUI/Plater.cpp:2354 -msgid "Detected advanced data" -msgstr "감지된 고급 데이터" - -#: src/slic3r/GUI/Plater.cpp:2376 -#, c-format -msgid "" -"You can't to add the object(s) from %s because of one or some of them " -"is(are) multi-part" -msgstr "" -"다중 부품(Part) 하나 또는 그 중 일부 때문에 %s에서 객체(object)를 추가 할 수 " -"없습니다" - -#: src/slic3r/GUI/Plater.cpp:2396 -msgid "" -"Multiple objects were loaded for a multi-material printer.\n" -"Instead of considering them as multiple objects, should I consider\n" -"these files to represent a single object having multiple parts?" -msgstr "" -"다중 재료 프린터에 대해 여러 객체(object)가로드되었습니다.\n" -"여러 객체(object)로 간주하는 대신,\n" -"이 파일들은 여러 부분을 갖는 단일 객체(object)를 나타낼 수 있습니까?" - -#: src/slic3r/GUI/Plater.cpp:2412 -msgid "Loaded" -msgstr "로드(loaded)" - -#: src/slic3r/GUI/Plater.cpp:2514 -msgid "" -"Your object appears to be too large, so it was automatically scaled down to " -"fit your print bed." -msgstr "객체(object)가 너무 커서 인쇄물에 맞게 자동으로 축소되었습니다." - -#: src/slic3r/GUI/Plater.cpp:2515 -msgid "Object too large?" -msgstr "객체(object)가 너무 큽니까?" - -#: src/slic3r/GUI/Plater.cpp:2577 -msgid "Export STL file:" -msgstr "STL 파일 내보내기:" - -#: src/slic3r/GUI/Plater.cpp:2584 -msgid "Export AMF file:" -msgstr "AMF 파일 내보내기:" - -#: src/slic3r/GUI/Plater.cpp:2590 -msgid "Save file as:" -msgstr "다른 이름으로 파일 저장:" - -#: src/slic3r/GUI/Plater.cpp:2596 -msgid "Export OBJ file:" -msgstr "OBJ 파일 내보내기:" - -#: src/slic3r/GUI/Plater.cpp:2698 -msgid "Delete Object" -msgstr "객체(object) 지우기" - -#: src/slic3r/GUI/Plater.cpp:2709 -msgid "Reset Project" -msgstr "프로젝트 재설정" - -#: src/slic3r/GUI/Plater.cpp:2746 -msgid "Hollow" -msgstr "속비우기" - -#: src/slic3r/GUI/Plater.cpp:2753 -msgid "Optimize Rotation" -msgstr "회전 최적화" - -#: src/slic3r/GUI/Plater.cpp:2799 -msgid "Arranging" -msgstr "정렬" - -#: src/slic3r/GUI/Plater.cpp:2821 -msgid "Could not arrange model objects! Some geometries may be invalid." -msgstr "" -"모델 객체(object)를 정렬할 수 없습니다. 일부 형상은 유효 하지 않을 수 있습니" -"다." - -#: src/slic3r/GUI/Plater.cpp:2827 -msgid "Arranging canceled." -msgstr "취소 된 정렬" - -#: src/slic3r/GUI/Plater.cpp:2828 -msgid "Arranging done." -msgstr "정렬 완료." - -#: src/slic3r/GUI/Plater.cpp:2844 -msgid "Searching for optimal orientation" -msgstr "최적의 방향 검색" - -#: src/slic3r/GUI/Plater.cpp:2877 -msgid "Orientation search canceled." -msgstr "방향 검색이 취소되었습니다." - -#: src/slic3r/GUI/Plater.cpp:2878 -msgid "Orientation found." -msgstr "방향을 찾았습니다." - -#: src/slic3r/GUI/Plater.cpp:2908 -msgid "Indexing hollowed object" -msgstr "빈 개체 인덱싱" - -#: src/slic3r/GUI/Plater.cpp:2912 -msgid "Hollowing cancelled." -msgstr "공동화 취소." - -#: src/slic3r/GUI/Plater.cpp:2913 -msgid "Hollowing done." -msgstr "속을 비움니다." - -#: src/slic3r/GUI/Plater.cpp:2915 -msgid "Hollowing failed." -msgstr "공동화를 실패했습니다." - -#: src/slic3r/GUI/Plater.cpp:2956 -msgid "" -"The selected object can't be split because it contains more than one volume/" -"material." -msgstr "" -"선택한 객체(object)는 둘 이상의 부품/재료가 포함되어 있기 때문에 분할 할 수 " -"없습니다." - -#: src/slic3r/GUI/Plater.cpp:2967 -msgid "Split to Objects" -msgstr "객체(object)로 분할" - -#: src/slic3r/GUI/Plater.cpp:3092 -msgid "Invalid data" -msgstr "잘못 된 데이터" - -#: src/slic3r/GUI/Plater.cpp:3101 -msgid "Ready to slice" -msgstr "슬라이스 준비" - -#: src/slic3r/GUI/Plater.cpp:3139 src/slic3r/GUI/PrintHostDialogs.cpp:232 -msgid "Cancelling" -msgstr "취소 중" - -#: src/slic3r/GUI/Plater.cpp:3156 -msgid "Another export job is currently running." -msgstr "다른 내보내기 작업이 현재 실행 중입니다." - -#: src/slic3r/GUI/Plater.cpp:3274 -msgid "Please select the file to reload" -msgstr "다시 로드할 파일을 선택하십시오." - -#: src/slic3r/GUI/Plater.cpp:3309 -msgid "It is not allowed to change the file to reload" -msgstr "다시 로드할 파일을 변경할 수 없습니다." - -#: src/slic3r/GUI/Plater.cpp:3309 -msgid "Do you want to retry" -msgstr "다시 시도하시겠습니까?" - -#: src/slic3r/GUI/Plater.cpp:3330 -msgid "Reload from: " -msgstr "다음에서 다시 로드합니다." - -#: src/slic3r/GUI/Plater.cpp:3438 -msgid "Unable to reload:" -msgstr "다시 로드할 수 없음:" - -#: src/slic3r/GUI/Plater.cpp:3443 -msgid "Error during reload" -msgstr "다시 로드하는 동안 오류" - -#: src/slic3r/GUI/Plater.cpp:3463 -msgid "Reload all from disk" -msgstr "디스크에서 모두 다시 로드" - -#: src/slic3r/GUI/Plater.cpp:3484 -msgid "Fix Throught NetFabb" -msgstr "NetFabb으로 수정" - -#: src/slic3r/GUI/Plater.cpp:3675 -msgid "Export failed" -msgstr "내보내기 실패" - -#: src/slic3r/GUI/Plater.cpp:3680 src/slic3r/GUI/PrintHostDialogs.cpp:233 -msgid "Cancelled" -msgstr "취소됨" - -#: src/slic3r/GUI/Plater.cpp:3942 src/slic3r/GUI/Plater.cpp:3969 -msgid "Remove the selected object" -msgstr "선택한 객체(object) 제거" - -#: src/slic3r/GUI/Plater.cpp:3956 -msgid "Add one more instance of the selected object" -msgstr "선택한 개체의 인스턴스를 하나 더 추가합니다." - -#: src/slic3r/GUI/Plater.cpp:3958 -msgid "Remove one instance of the selected object" -msgstr "선택한 개체의 인스턴스 하나 제거" - -#: src/slic3r/GUI/Plater.cpp:3960 -msgid "Set number of instances" -msgstr "복제할 수량 설정" - -#: src/slic3r/GUI/Plater.cpp:3960 -msgid "Change the number of instances of the selected object" -msgstr "선택한 객체의 인스턴스 수 변경" - -#: src/slic3r/GUI/Plater.cpp:3980 src/slic3r/GUI/Plater.cpp:3983 -msgid "Reload the selected object from disk" -msgstr "디스크에서 선택한 개체 다시 로드" - -#: src/slic3r/GUI/Plater.cpp:3987 -msgid "Export the selected object as STL file" -msgstr "선택한 객체(object)를 STL 파일로 내보내기" - -#: src/slic3r/GUI/Plater.cpp:4016 -msgid "Along X axis" -msgstr "X 축을 따라" - -#: src/slic3r/GUI/Plater.cpp:4016 -msgid "Mirror the selected object along the X axis" -msgstr "선택한 객체(object)를 X 축을 따라 반전합니다" - -#: src/slic3r/GUI/Plater.cpp:4018 -msgid "Along Y axis" -msgstr "Y 축을 따라" - -#: src/slic3r/GUI/Plater.cpp:4018 -msgid "Mirror the selected object along the Y axis" -msgstr "선택한 객체(object)를 Y 축을 따라 반전합니다" - -#: src/slic3r/GUI/Plater.cpp:4020 -msgid "Along Z axis" -msgstr "Z 축 따라" - -#: src/slic3r/GUI/Plater.cpp:4020 -msgid "Mirror the selected object along the Z axis" -msgstr "선택한 객체(object)를 Z 축을 따라 반전합니다" - -#: src/slic3r/GUI/Plater.cpp:4023 -msgid "Mirror" -msgstr "반전(Mirror)" - -#: src/slic3r/GUI/Plater.cpp:4023 -msgid "Mirror the selected object" -msgstr "반전할 객제를 선택" - -#: src/slic3r/GUI/Plater.cpp:4035 -msgid "To objects" -msgstr "객체(object)에" - -#: src/slic3r/GUI/Plater.cpp:4035 src/slic3r/GUI/Plater.cpp:4055 -msgid "Split the selected object into individual objects" -msgstr "선택한 객체(object)를 개별 객체(object)로 분할 합니다." - -#: src/slic3r/GUI/Plater.cpp:4037 -msgid "To parts" -msgstr "부품(Part)에" - -#: src/slic3r/GUI/Plater.cpp:4037 src/slic3r/GUI/Plater.cpp:4069 -msgid "Split the selected object into individual sub-parts" -msgstr "선택한 객체(object)를 개별 하위 부품(Part)으로 분할" - -#: src/slic3r/GUI/Plater.cpp:4040 src/slic3r/GUI/Plater.cpp:4055 -#: src/slic3r/GUI/Plater.cpp:4069 src/libslic3r/PrintConfig.cpp:3466 -msgid "Split" -msgstr "쪼개기" - -#: src/slic3r/GUI/Plater.cpp:4040 -msgid "Split the selected object" -msgstr "선택한 객체(object) 분할" - -#: src/slic3r/GUI/Plater.cpp:4061 -msgid "Optimize orientation" -msgstr "방향 최적화" - -#: src/slic3r/GUI/Plater.cpp:4061 -msgid "Optimize the rotation of the object for better print results." -msgstr "더 나은 인쇄 결과를 위해 객체(object)의 회전을 최적화합니다." - -#: src/slic3r/GUI/Plater.cpp:4120 -msgid "3D editor view" -msgstr "3D 편집화면 보기" - -#: src/slic3r/GUI/Plater.cpp:4128 src/slic3r/GUI/Tab.cpp:2372 -msgid "Preview" -msgstr "미리보기" - -#: src/slic3r/GUI/Plater.cpp:4422 -msgid "" -"%1% printer was active at the time the target Undo / Redo snapshot was " -"taken. Switching to %1% printer requires reloading of %1% presets." -msgstr "" -"%1% 프린터가 대상을 '되돌리기/취소하기' 작업 구성을 생성할 때 활성화되었습니" -"다. %1% 프린터로 전환하려면 %1% 사전 설정을 다시 불러와야 합니다." - -#: src/slic3r/GUI/Plater.cpp:4597 -msgid "Load Project" -msgstr "프로젝트 불러오기" - -#: src/slic3r/GUI/Plater.cpp:4625 -msgid "Import Object" -msgstr "객체(object) 가져오기" - -#: src/slic3r/GUI/Plater.cpp:4629 -msgid "Import Objects" -msgstr "객체(object) 가져오기" - -#: src/slic3r/GUI/Plater.cpp:4693 -msgid "All objects will be removed, continue?" -msgstr "모든 객체(object)가 제거 됩니다, 계속합니까?" - -#: src/slic3r/GUI/Plater.cpp:4701 -msgid "Delete Selected Objects" -msgstr "선택한 객체(object) 삭제" - -#: src/slic3r/GUI/Plater.cpp:4709 -msgid "Increase Instances" -msgstr "복제본 늘리기" - -#: src/slic3r/GUI/Plater.cpp:4744 -msgid "Decrease Instances" -msgstr "복제본 감소" - -#: src/slic3r/GUI/Plater.cpp:4780 -#, c-format -msgid "Set numbers of copies to %d" -msgstr "복사본 수를 %d로 설정" - -#: src/slic3r/GUI/Plater.cpp:4810 -msgid "Cut by Plane" -msgstr "평면으로 절단" - -#: src/slic3r/GUI/Plater.cpp:4863 -msgid "Save G-code file as:" -msgstr "G-code 파일 다른 이름 저장:" - -#: src/slic3r/GUI/Plater.cpp:4863 -msgid "Save SL1 file as:" -msgstr "SL1 파일 다른이름 저장:" - -#: src/slic3r/GUI/Plater.cpp:4990 -#, c-format -msgid "STL file exported to %s" -msgstr "내보낸 STL 파일 %s" - -#: src/slic3r/GUI/Plater.cpp:5011 -#, c-format -msgid "AMF file exported to %s" -msgstr "내보낸 AMF 파일 %s" - -#: src/slic3r/GUI/Plater.cpp:5014 -#, c-format -msgid "Error exporting AMF file %s" -msgstr "AMF 파일 내보내기 오류 %s" - -#: src/slic3r/GUI/Plater.cpp:5057 -#, c-format -msgid "3MF file exported to %s" -msgstr "3MF 파일을 내보냈습니다 %s" - -#: src/slic3r/GUI/Plater.cpp:5062 -#, c-format -msgid "Error exporting 3MF file %s" -msgstr "3MF 파일 내보내기 오류 %s" - -#: src/slic3r/GUI/Plater.cpp:5544 -msgid "Export" -msgstr "내보내기" - -#: src/slic3r/GUI/Plater.cpp:5545 -msgid "Send G-code" -msgstr "G-code 보내기" - -#: src/slic3r/GUI/Plater.cpp:5629 -msgid "Paste From Clipboard" -msgstr "클립보드에서 붙여넣기" - -#: src/slic3r/GUI/Preferences.cpp:22 src/slic3r/GUI/Tab.cpp:1780 -#: src/slic3r/GUI/Tab.cpp:2024 -msgid "General" -msgstr "일반" - -#: src/slic3r/GUI/Preferences.cpp:39 -msgid "Remember output directory" -msgstr "출력 디렉토리 기억하기" - -#: src/slic3r/GUI/Preferences.cpp:41 -msgid "" -"If this is enabled, Slic3r will prompt the last output directory instead of " -"the one containing the input files." -msgstr "" -"이 옵션을 사용하면 Slic3r은 입력 파일이 들어있는 디렉터리 대신 마지막 출력 디" -"렉터리를 묻습니다." - -#: src/slic3r/GUI/Preferences.cpp:47 -msgid "Auto-center parts" -msgstr "부품(Part)을 자동으로 중재봉선에" - -#: src/slic3r/GUI/Preferences.cpp:49 -msgid "" -"If this is enabled, Slic3r will auto-center objects around the print bed " -"center." -msgstr "" -"이 옵션을 사용하면 Slic3r가 객체(object)를 인쇄판 중앙에 자동으로 배치합니다." - -#: src/slic3r/GUI/Preferences.cpp:55 -msgid "Background processing" -msgstr "백그라운드 프로세싱" - -#: src/slic3r/GUI/Preferences.cpp:57 -msgid "" -"If this is enabled, Slic3r will pre-process objects as soon as they're " -"loaded in order to save time when exporting G-code." -msgstr "" -"이 사용 하는 경우 Slic3r는 최대한 빨리 시간을 절약 하기 위해 로드된 G-code를 " -"내보낸다." - -#: src/slic3r/GUI/Preferences.cpp:66 -msgid "" -"If enabled, PrusaSlicer will check for the new versions of itself online. " -"When a new version becomes available a notification is displayed at the next " -"application startup (never during program usage). This is only a " -"notification mechanisms, no automatic installation is done." -msgstr "" -"프루사 슬라이서는 온라인의 새로운 버전을 확인합니다. 새 버전을 사용할 수 있게" -"되면 다음 응용 프로그램 시작시 (프로그램 사용 중이 아님) 알림이 표시 됩니다. " -"이는 알림 메커니즘일뿐이며 자동 설치는 수행되지 않습니다." - -#: src/slic3r/GUI/Preferences.cpp:73 -msgid "Export sources full pathnames to 3mf and amf" -msgstr "소스 전체 경로 이름을 3mf 및 amf로 내보내기" - -#: src/slic3r/GUI/Preferences.cpp:75 -msgid "" -"If enabled, allows the Reload from disk command to automatically find and " -"load the files when invoked." -msgstr "" -"활성화된 경우 디스크에서 다시 로드 명령을 사용하여 호출될 때 파일을 자동으로 " -"찾고 로드할 수 있습니다." - -#: src/slic3r/GUI/Preferences.cpp:84 -msgid "" -"If enabled, Slic3r downloads updates of built-in system presets in the " -"background. These updates are downloaded into a separate temporary location. " -"When a new preset version becomes available it is offered at application " -"startup." -msgstr "" -"활성화 된 경우 Slic3r은 백그라운드에서 내장된 시스템 설정의 업데이트를 다운로" -"드합니다. 이러한 업데이트는 별도의 임시 위치에 다운로드됩니다. 새로운 '사전 " -"설정' 버전을 사용할 수 있게되면 응용 프로그램 시작시 제공됩니다." - -#: src/slic3r/GUI/Preferences.cpp:89 -msgid "Suppress \" - default - \" presets" -msgstr "\"- 기본 -\"사전 설정 숨기기" - -#: src/slic3r/GUI/Preferences.cpp:91 -msgid "" -"Suppress \" - default - \" presets in the Print / Filament / Printer " -"selections once there are any other valid presets available." -msgstr "" -"사용 가능한 다른 유효한 '사전 설정'이 있으면 인쇄 / 필라멘트 / 프린터 선택에" -"서 \"- 기본 -\"'사전 설정'을 억제하십시오." - -#: src/slic3r/GUI/Preferences.cpp:97 -msgid "Show incompatible print and filament presets" -msgstr "호환 되지 않는 인쇄 및 필라멘트 설정" - -#: src/slic3r/GUI/Preferences.cpp:99 -msgid "" -"When checked, the print and filament presets are shown in the preset editor " -"even if they are marked as incompatible with the active printer" -msgstr "" -"이 옵션을 선택하면 프린터와 호환되지 않는 것으로 표시된 경우에도 인쇄 및 필라" -"멘트 '사전 설정'이 '사전 설정' 편집기에 표시됩니다" - -#: src/slic3r/GUI/Preferences.cpp:106 -msgid "Use Retina resolution for the 3D scene" -msgstr "3D 장면에 레티나 해상도 사용" - -#: src/slic3r/GUI/Preferences.cpp:108 -msgid "" -"If enabled, the 3D scene will be rendered in Retina resolution. If you are " -"experiencing 3D performance problems, disabling this option may help." -msgstr "" -"활성화 된 경우 3D 장면은 레티나 해상도로 렌더링 됩니다. 3D 성능 문제가 발생하" -"는 경우, 옵션을 사용하지 않도록 설정 하면 도움이 될 수 있습니다." - -#: src/slic3r/GUI/Preferences.cpp:115 -msgid "Camera" -msgstr "카메라" - -#: src/slic3r/GUI/Preferences.cpp:121 -msgid "Use perspective camera" -msgstr "원근 보기 사용" - -#: src/slic3r/GUI/Preferences.cpp:123 -msgid "" -"If enabled, use perspective camera. If not enabled, use orthographic camera." -msgstr "" -"이 옵션을 사용하면 원근 보기모드를 사용합니다. 활성화되지 않은 경우 일반 보기" -"를 사용합니다." - -#: src/slic3r/GUI/Preferences.cpp:129 -msgid "Use free camera" -msgstr "무료 카메라 사용" - -#: src/slic3r/GUI/Preferences.cpp:131 -msgid "If enabled, use free camera. If not enabled, use constrained camera." -msgstr "" -"활성화된 경우 무료 카메라를 사용하십시오. 활성화되지 않은 경우 구속된 카메라" -"를 사용합니다." - -#: src/slic3r/GUI/Preferences.cpp:137 -msgid "GUI" -msgstr "GUI" - -#: src/slic3r/GUI/Preferences.cpp:147 -msgid "Use custom size for toolbar icons" -msgstr "도구 모음 아이콘에 사용자 지정 크기 사용" - -#: src/slic3r/GUI/Preferences.cpp:149 -msgid "If enabled, you can change size of toolbar icons manually." -msgstr "활성화된 경우 도구 모음 아이콘의 크기를 수동으로 변경할 수 있습니다." - -#: src/slic3r/GUI/Preferences.cpp:176 -#, c-format -msgid "You need to restart %s to make the changes effective." -msgstr "변경 내용을 적용 하려면 %s를 다시 시작 해야 합니다." - -#: src/slic3r/GUI/Preferences.cpp:226 -msgid "Icon size in a respect to the default size" -msgstr "기본 크기에 대한 아이콘 크기" - -#: src/slic3r/GUI/Preferences.cpp:241 -msgid "Select toolbar icon size in respect to the default one." -msgstr "기본 도구 모음에 대해 도구 모음 아이콘 크기를 선택합니다." - -#: src/slic3r/GUI/Preset.cpp:247 -msgid "modified" -msgstr "수정된곳" - -#: src/slic3r/GUI/Preset.cpp:1059 src/slic3r/GUI/Preset.cpp:1106 -#: src/slic3r/GUI/Preset.cpp:1182 src/slic3r/GUI/Preset.cpp:1216 -#: src/slic3r/GUI/PresetBundle.cpp:1576 src/slic3r/GUI/PresetBundle.cpp:1665 -msgid "System presets" -msgstr "시스템 기본설정" - -#: src/slic3r/GUI/Preset.cpp:1110 src/slic3r/GUI/Preset.cpp:1220 -#: src/slic3r/GUI/PresetBundle.cpp:1670 -msgid "User presets" -msgstr "사용자 사전설정" - -#: src/slic3r/GUI/Preset.cpp:1141 src/slic3r/GUI/Tab.cpp:243 -msgid "Add a new printer" -msgstr "새 프린터 추가" - -#: src/slic3r/GUI/Preset.cpp:1143 -msgid "Add/Remove materials" -msgstr "재질 추가/제거" - -#: src/slic3r/GUI/Preset.cpp:1453 -msgid "filament" -msgstr "필라멘트" - -#: src/slic3r/GUI/Preset.cpp:1454 -msgid "SLA print" -msgstr "SLA 인쇄" - -#: src/slic3r/GUI/PresetBundle.cpp:1681 -msgid "Add/Remove filaments" -msgstr "필라멘트 추가/제거" - -#: src/slic3r/GUI/PresetHints.cpp:29 -msgid "" -"If estimated layer time is below ~%1%s, fan will run at %2%%% and print " -"speed will be reduced so that no less than %3%s are spent on that layer " -"(however, speed will never be reduced below %4%mm/s)." -msgstr "" -"예상 레이어 시간이 ~%1%s 미만이면 팬이 %2%%% 에서 실행되고 인쇄 속도가 감소하" -"여 해당 레이어에 %3%s 이상이 소비되지 않습니다 (단, 속도는 아래로 감소하지 않" -"습니다 %4%mm/s)." - -#: src/slic3r/GUI/PresetHints.cpp:36 -msgid "" -"If estimated layer time is greater, but still below ~%1%s, fan will run at a " -"proportionally decreasing speed between %2%%% and %3%%%." -msgstr "" -"예상 레이어 시간이 더 크지만 여전히 ~%1%s 미만이면, 팬은 %2%%% ~ %3%%% 사이에" -"서 비례적으로 감소하는 속도로 실행될 것이다." - -#: src/slic3r/GUI/PresetHints.cpp:40 -msgid "During the other layers, fan" -msgstr "다른 레이어의, 팬설정" - -#: src/slic3r/GUI/PresetHints.cpp:42 -msgid "Fan" -msgstr "팬(Fan)" - -#: src/slic3r/GUI/PresetHints.cpp:48 -msgid "will always run at %1%%%" -msgstr "항상 다음처럼 실행 %1%%%" - -#: src/slic3r/GUI/PresetHints.cpp:51 -msgid "except for the first %1% layers." -msgstr "첫 번째 %1% 레이어를 제외하고" - -#: src/slic3r/GUI/PresetHints.cpp:53 -msgid "except for the first layer." -msgstr "첫 번째 레이어를 제외하고" - -#: src/slic3r/GUI/PresetHints.cpp:55 -msgid "will be turned off." -msgstr "off 됩니다." - -#: src/slic3r/GUI/PresetHints.cpp:156 -msgid "external perimeters" -msgstr "외부 둘레" - -#: src/slic3r/GUI/PresetHints.cpp:165 -msgid "perimeters" -msgstr "둘레" - -#: src/slic3r/GUI/PresetHints.cpp:174 -msgid "infill" -msgstr "채움(infill)" - -#: src/slic3r/GUI/PresetHints.cpp:184 -msgid "solid infill" -msgstr "외부(solid)부분 채움" - -#: src/slic3r/GUI/PresetHints.cpp:192 -msgid "top solid infill" -msgstr "가장 윗부분 채움" - -#: src/slic3r/GUI/PresetHints.cpp:203 -msgid "support" -msgstr "서포트" - -#: src/slic3r/GUI/PresetHints.cpp:213 -msgid "support interface" -msgstr "서포트 접점" - -#: src/slic3r/GUI/PresetHints.cpp:219 -msgid "First layer volumetric" -msgstr "첫번째 레이어 용적은" - -#: src/slic3r/GUI/PresetHints.cpp:219 -msgid "Bridging volumetric" -msgstr "브리징(Bridging) 용적" - -#: src/slic3r/GUI/PresetHints.cpp:219 -msgid "Volumetric" -msgstr "용적" - -#: src/slic3r/GUI/PresetHints.cpp:220 -msgid "flow rate is maximized" -msgstr "의 유속(flow)이 최대화된다. " - -#: src/slic3r/GUI/PresetHints.cpp:223 -msgid "by the print profile maximum" -msgstr "인쇄 프로파일 최대 값" - -#: src/slic3r/GUI/PresetHints.cpp:224 -msgid "when printing" -msgstr "인쇄 할 때" - -#: src/slic3r/GUI/PresetHints.cpp:225 -msgid "with a volumetric rate" -msgstr "의 용적 비율로 " - -#: src/slic3r/GUI/PresetHints.cpp:229 -#, c-format -msgid "%3.2f mm³/s at filament speed %3.2f mm/s." -msgstr "%3.2f mm³/s 필라멘트 속도는 %3.2f mm/s이다." - -#: src/slic3r/GUI/PresetHints.cpp:247 -msgid "" -"Recommended object thin wall thickness: Not available due to invalid layer " -"height." -msgstr "" -"권장 객체(object)의 벽(wall) 두께: 잘못된 레이어 높이 때문에 사용할 수 없음." - -#: src/slic3r/GUI/PresetHints.cpp:263 -#, c-format -msgid "Recommended object thin wall thickness for layer height %.2f and" -msgstr "객체(object) 레이어 높이 %.2f 에 권장하는 두깨는 " - -#: src/slic3r/GUI/PresetHints.cpp:269 -#, c-format -msgid "%d lines: %.2f mm" -msgstr "%d 라인:%.2f mm" - -#: src/slic3r/GUI/PresetHints.cpp:300 -msgid "" -"Top / bottom shell thickness hint: Not available due to invalid layer height." -msgstr "상단/하단 쉘 두께 힌트: 잘못된 레이어 높이로 인해 사용할 수 없습니다." - -#: src/slic3r/GUI/PresetHints.cpp:313 -msgid "Top shell is %1% mm thick for layer height %2% mm." -msgstr "상단 쉘은 층 높이 %2% mm에 대한 두께 %1% mm입니다." - -#: src/slic3r/GUI/PresetHints.cpp:316 -msgid "Minimum top shell thickness is %1% mm." -msgstr "최소 상단 쉘 두께는 %1% mm입니다." - -#: src/slic3r/GUI/PresetHints.cpp:319 -msgid "Top is open." -msgstr "상단이 열려 있습니다." - -#: src/slic3r/GUI/PresetHints.cpp:332 -msgid "Bottom shell is %1% mm thick for layer height %2% mm." -msgstr "바닥 층 높이 %2% mm에 대한 두께 %1% mm입니다." - -#: src/slic3r/GUI/PresetHints.cpp:335 -msgid "Minimum bottom shell thickness is %1% mm." -msgstr "최소 바닥 쉘 두께는 %1% mm입니다." - -#: src/slic3r/GUI/PresetHints.cpp:338 -msgid "Bottom is open." -msgstr "바닥이 열려 있습니다." - -#: src/slic3r/GUI/PrintHostDialogs.cpp:33 -msgid "Send G-Code to printer host" -msgstr "프린터 호스트로 G 코드 보내기" - -#: src/slic3r/GUI/PrintHostDialogs.cpp:33 -msgid "Upload to Printer Host with the following filename:" -msgstr "다음 파일 이름으로 프린터 호스트에 업로드:" - -#: src/slic3r/GUI/PrintHostDialogs.cpp:35 -msgid "Start printing after upload" -msgstr "업로드 후 인쇄 시작" - -#: src/slic3r/GUI/PrintHostDialogs.cpp:42 -msgid "Use forward slashes ( / ) as a directory separator if needed." -msgstr "필요한 경우 디렉토리 분리 기호로 슬래시 (/)를 사용하십시오." - -#: src/slic3r/GUI/PrintHostDialogs.cpp:149 -msgid "ID" -msgstr "아이디" - -#: src/slic3r/GUI/PrintHostDialogs.cpp:150 -msgid "Progress" -msgstr "진행률" - -#: src/slic3r/GUI/PrintHostDialogs.cpp:151 -msgid "Status" -msgstr "상태" - -#: src/slic3r/GUI/PrintHostDialogs.cpp:152 -msgid "Host" -msgstr "호스트" - -#: src/slic3r/GUI/PrintHostDialogs.cpp:153 -msgid "Filename" -msgstr "파일이름" - -#: src/slic3r/GUI/PrintHostDialogs.cpp:154 -msgid "Error Message" -msgstr "에러 메시지" - -#: src/slic3r/GUI/PrintHostDialogs.cpp:157 -msgid "Cancel selected" -msgstr "선택 취소" - -#: src/slic3r/GUI/PrintHostDialogs.cpp:159 -msgid "Show error message" -msgstr "오류 메시지 표시" - -#: src/slic3r/GUI/PrintHostDialogs.cpp:198 -#: src/slic3r/GUI/PrintHostDialogs.cpp:229 -msgid "Enqueued" -msgstr "입력됨" - -#: src/slic3r/GUI/PrintHostDialogs.cpp:230 -msgid "Uploading" -msgstr "업로드" - -#: src/slic3r/GUI/PrintHostDialogs.cpp:234 -msgid "Completed" -msgstr "완료됨" - -#: src/slic3r/GUI/PrintHostDialogs.cpp:272 -msgid "Error uploading to print host:" -msgstr "인쇄 호스트에 업로드 하는 중 오류 발생:" - -#: src/slic3r/GUI/RammingChart.cpp:23 -msgid "NO RAMMING AT ALL" -msgstr "전혀 충돌 없음" - -#: src/slic3r/GUI/RammingChart.cpp:76 -msgid "Time" -msgstr "시간" - -#: src/slic3r/GUI/RammingChart.cpp:76 src/slic3r/GUI/WipeTowerDialog.cpp:83 -#: src/libslic3r/PrintConfig.cpp:645 src/libslic3r/PrintConfig.cpp:689 -#: src/libslic3r/PrintConfig.cpp:704 src/libslic3r/PrintConfig.cpp:2418 -#: src/libslic3r/PrintConfig.cpp:2427 src/libslic3r/PrintConfig.cpp:2528 -#: src/libslic3r/PrintConfig.cpp:2536 src/libslic3r/PrintConfig.cpp:2544 -#: src/libslic3r/PrintConfig.cpp:2551 src/libslic3r/PrintConfig.cpp:2559 -#: src/libslic3r/PrintConfig.cpp:2567 -msgid "s" -msgstr "s" - -#: src/slic3r/GUI/RammingChart.cpp:81 -msgid "Volumetric speed" -msgstr "용적(Volumetric) 스피트" - -#: src/slic3r/GUI/RammingChart.cpp:81 src/libslic3r/PrintConfig.cpp:602 -#: src/libslic3r/PrintConfig.cpp:1259 -msgid "mm³/s" -msgstr "밀리미터 ³/s" - -#: src/slic3r/GUI/Selection.cpp:146 -msgid "Selection-Add" -msgstr "선택 추가" - -#: src/slic3r/GUI/Selection.cpp:187 -msgid "Selection-Remove" -msgstr "선택-제거" - -#: src/slic3r/GUI/Selection.cpp:219 -msgid "Selection-Add Object" -msgstr "선택-추가 객체" - -#: src/slic3r/GUI/Selection.cpp:238 -msgid "Selection-Remove Object" -msgstr "선택-제거 개체" - -#: src/slic3r/GUI/Selection.cpp:256 -msgid "Selection-Add Instance" -msgstr "선택-인스턴스 추가" - -#: src/slic3r/GUI/Selection.cpp:275 -msgid "Selection-Remove Instance" -msgstr "선택-제거 인스턴스" - -#: src/slic3r/GUI/Selection.cpp:376 -msgid "Selection-Add All" -msgstr "선택-모두 추가" - -#: src/slic3r/GUI/Selection.cpp:402 -msgid "Selection-Remove All" -msgstr "선택-모두 제거" - -#: src/slic3r/GUI/Selection.cpp:939 -msgid "Scale To Fit" -msgstr "크기에 맞게 조정" - -#: src/slic3r/GUI/Selection.cpp:1475 -msgid "Set Printable Instance" -msgstr "인쇄 가능한 인스턴스 설정" - -#: src/slic3r/GUI/Selection.cpp:1475 -msgid "Set Unprintable Instance" -msgstr "인쇄할 수 없는 인스턴스 설정" - -#: src/slic3r/GUI/SysInfoDialog.cpp:78 -msgid "System Information" -msgstr "시스템 정보" - -#: src/slic3r/GUI/SysInfoDialog.cpp:154 -msgid "Copy to Clipboard" -msgstr "클립보드에 복사" - -#: src/slic3r/GUI/Tab.cpp:52 src/libslic3r/PrintConfig.cpp:255 -msgid "Compatible printers" -msgstr "호환 가능한 프린터들" - -#: src/slic3r/GUI/Tab.cpp:53 -msgid "Select the printers this profile is compatible with." -msgstr "이 프로파일과 호환 가능한 프린터를 선택하세요." - -#: src/slic3r/GUI/Tab.cpp:58 src/libslic3r/PrintConfig.cpp:270 -msgid "Compatible print profiles" -msgstr "호환되는 인쇄 프로 파일" - -#: src/slic3r/GUI/Tab.cpp:59 -msgid "Select the print profiles this profile is compatible with." -msgstr "이 프로필이 호환되는 인쇄 프로필을 선택 합니다." - -#. TRN "Save current Settings" -#: src/slic3r/GUI/Tab.cpp:135 -#, c-format -msgid "Save current %s" -msgstr "현재 %s 저장" - -#: src/slic3r/GUI/Tab.cpp:136 -msgid "Delete this preset" -msgstr "이전 설정 삭제" - -#: src/slic3r/GUI/Tab.cpp:141 -msgid "" -"Hover the cursor over buttons to find more information \n" -"or click this button." -msgstr "" -"버튼 위로 커서를 가져 가서 자세한 정보를 찾습니다.\n" -"또는이 버튼을 클릭하십시오." - -#: src/slic3r/GUI/Tab.cpp:943 -msgid "This is a default preset." -msgstr "기본 설정입니다." - -#: src/slic3r/GUI/Tab.cpp:945 -msgid "This is a system preset." -msgstr "시스템 설정입니다." - -#: src/slic3r/GUI/Tab.cpp:947 -msgid "Current preset is inherited from the default preset." -msgstr "현재 사전 설정은 기본 사전 설정에서 상속됩니다." - -#: src/slic3r/GUI/Tab.cpp:950 -#, c-format -msgid "" -"Current preset is inherited from:\n" -"\t%s" -msgstr "전의 %s 설정에서 가져 옵니다 " - -#: src/slic3r/GUI/Tab.cpp:954 -msgid "It can't be deleted or modified." -msgstr "삭제하거나 수정할 수 없습니다." - -#: src/slic3r/GUI/Tab.cpp:955 -msgid "" -"Any modifications should be saved as a new preset inherited from this one." -msgstr "모든 수정 사항은 이 항목에서 받은 기본 설정으로 저장해야합니다." - -#: src/slic3r/GUI/Tab.cpp:956 -msgid "To do that please specify a new name for the preset." -msgstr "그렇게하려면 기본 설정의 새 이름을 지정하십시오." - -#: src/slic3r/GUI/Tab.cpp:960 -msgid "Additional information:" -msgstr "추가 정보:" - -#: src/slic3r/GUI/Tab.cpp:966 -msgid "printer model" -msgstr "프린터 모델" - -#: src/slic3r/GUI/Tab.cpp:974 -msgid "default print profile" -msgstr "기본 인쇄 프로파일" - -#: src/slic3r/GUI/Tab.cpp:977 -msgid "default filament profile" -msgstr "기본 필라멘트 프로파일" - -#: src/slic3r/GUI/Tab.cpp:991 -msgid "default SLA material profile" -msgstr "기본 SLA 재질 프로 파일" - -#: src/slic3r/GUI/Tab.cpp:995 -msgid "default SLA print profile" -msgstr "기본 SLA 인쇄 프로필" - -#: src/slic3r/GUI/Tab.cpp:1003 -msgid "full profile name" -msgstr "전체 프로필 이름" - -#: src/slic3r/GUI/Tab.cpp:1004 -msgid "symbolic profile name" -msgstr "기호 프로파일 이름" - -#: src/slic3r/GUI/Tab.cpp:1038 src/slic3r/GUI/Tab.cpp:3570 -msgid "Layers and perimeters" -msgstr "레이어 및 둘레" - -#: src/slic3r/GUI/Tab.cpp:1043 -msgid "Vertical shells" -msgstr "쉘 높이" - -#: src/slic3r/GUI/Tab.cpp:1054 -msgid "Horizontal shells" -msgstr "쉘 너비" - -#: src/slic3r/GUI/Tab.cpp:1055 src/libslic3r/PrintConfig.cpp:1790 -msgid "Solid layers" -msgstr "솔리드 레이어" - -#: src/slic3r/GUI/Tab.cpp:1059 -msgid "Minimum shell thickness" -msgstr "최소 쉘 두께" - -#: src/slic3r/GUI/Tab.cpp:1070 -msgid "Quality (slower slicing)" -msgstr "품질(슬라이싱이 느려짐)" - -#: src/slic3r/GUI/Tab.cpp:1088 -msgid "Reducing printing time" -msgstr "출력 시간 단축" - -#: src/slic3r/GUI/Tab.cpp:1100 -msgid "Skirt and brim" -msgstr "스커트와 브림" - -#: src/slic3r/GUI/Tab.cpp:1117 -msgid "Raft" -msgstr "라프트" - -#: src/slic3r/GUI/Tab.cpp:1121 -msgid "Options for support material and raft" -msgstr "서포트와 라프트 재료를 선택" - -#: src/slic3r/GUI/Tab.cpp:1136 -msgid "Speed for print moves" -msgstr "출력중 이동 속도" - -#: src/slic3r/GUI/Tab.cpp:1148 -msgid "Speed for non-print moves" -msgstr "미출력시 이동속도" - -#: src/slic3r/GUI/Tab.cpp:1151 -msgid "Modifiers" -msgstr "수정" - -#: src/slic3r/GUI/Tab.cpp:1154 -msgid "Acceleration control (advanced)" -msgstr "가속 제어(고급)" - -#: src/slic3r/GUI/Tab.cpp:1161 -msgid "Autospeed (advanced)" -msgstr "오토스피트(고급)" - -#: src/slic3r/GUI/Tab.cpp:1169 -msgid "Multiple Extruders" -msgstr "다중 익스트루더" - -#: src/slic3r/GUI/Tab.cpp:1177 -msgid "Ooze prevention" -msgstr "오즈 방지(Ooze prevention)" - -#: src/slic3r/GUI/Tab.cpp:1195 -msgid "Extrusion width" -msgstr "악출 폭(Extrusion width)" - -#: src/slic3r/GUI/Tab.cpp:1205 -msgid "Overlap" -msgstr "겹침(Overlap)" - -#: src/slic3r/GUI/Tab.cpp:1208 -msgid "Flow" -msgstr "유량(Flow)" - -#: src/slic3r/GUI/Tab.cpp:1217 -msgid "Other" -msgstr "그 외" - -#: src/slic3r/GUI/Tab.cpp:1220 src/slic3r/GUI/Tab.cpp:3637 -msgid "Output options" -msgstr "출력 옵션" - -#: src/slic3r/GUI/Tab.cpp:1221 -msgid "Sequential printing" -msgstr "연속 인쇄" - -#: src/slic3r/GUI/Tab.cpp:1223 -msgid "Extruder clearance (mm)" -msgstr "익스트루더 간격(mm)" - -#: src/slic3r/GUI/Tab.cpp:1232 src/slic3r/GUI/Tab.cpp:3638 -msgid "Output file" -msgstr "출력 파일" - -#: src/slic3r/GUI/Tab.cpp:1239 src/libslic3r/PrintConfig.cpp:1462 -msgid "Post-processing scripts" -msgstr "사후 처리 스크립트" - -#: src/slic3r/GUI/Tab.cpp:1245 src/slic3r/GUI/Tab.cpp:1246 -#: src/slic3r/GUI/Tab.cpp:1531 src/slic3r/GUI/Tab.cpp:1532 -#: src/slic3r/GUI/Tab.cpp:1996 src/slic3r/GUI/Tab.cpp:1997 -#: src/slic3r/GUI/Tab.cpp:2110 src/slic3r/GUI/Tab.cpp:2111 -#: src/slic3r/GUI/Tab.cpp:3507 src/slic3r/GUI/Tab.cpp:3508 -msgid "Notes" -msgstr "메모" - -#: src/slic3r/GUI/Tab.cpp:1252 src/slic3r/GUI/Tab.cpp:1539 -#: src/slic3r/GUI/Tab.cpp:2003 src/slic3r/GUI/Tab.cpp:2117 -#: src/slic3r/GUI/Tab.cpp:3515 src/slic3r/GUI/Tab.cpp:3643 -msgid "Dependencies" -msgstr "속한 그룹" - -#: src/slic3r/GUI/Tab.cpp:1253 src/slic3r/GUI/Tab.cpp:1540 -#: src/slic3r/GUI/Tab.cpp:2004 src/slic3r/GUI/Tab.cpp:2118 -#: src/slic3r/GUI/Tab.cpp:3516 src/slic3r/GUI/Tab.cpp:3644 -msgid "Profile dependencies" -msgstr "프로파일 속한곳" - -#: src/slic3r/GUI/Tab.cpp:1317 src/slic3r/GUI/Tab.cpp:1372 -msgid "Filament Overrides" -msgstr "필라멘트 재정의" - -#: src/slic3r/GUI/Tab.cpp:1318 src/slic3r/GUI/Tab.cpp:1377 -#: src/slic3r/GUI/Tab.cpp:2352 -msgid "Retraction" -msgstr "리트렉션" - -#: src/slic3r/GUI/Tab.cpp:1427 src/libslic3r/PrintConfig.cpp:2077 -msgid "Temperature" -msgstr "온도" - -#: src/slic3r/GUI/Tab.cpp:1433 -msgid "Bed" -msgstr "배드(Bed)" - -#: src/slic3r/GUI/Tab.cpp:1438 -msgid "Cooling" -msgstr "냉각(Cooling)" - -#: src/slic3r/GUI/Tab.cpp:1439 src/libslic3r/PrintConfig.cpp:1364 -#: src/libslic3r/PrintConfig.cpp:2210 -msgid "Enable" -msgstr "사용" - -#: src/slic3r/GUI/Tab.cpp:1450 -msgid "Fan settings" -msgstr "팬 설정" - -#: src/slic3r/GUI/Tab.cpp:1459 -msgid "Cooling thresholds" -msgstr "냉각 임계 값" - -#: src/slic3r/GUI/Tab.cpp:1465 -msgid "Filament properties" -msgstr "필라멘트 특성" - -#: src/slic3r/GUI/Tab.cpp:1469 -msgid "Print speed override" -msgstr "인쇄 속도 중단" - -#: src/slic3r/GUI/Tab.cpp:1479 -msgid "Wipe tower parameters" -msgstr "타워 매개변수 지우기" - -#: src/slic3r/GUI/Tab.cpp:1482 -msgid "Toolchange parameters with single extruder MM printers" -msgstr "MMU 프린터의 툴체인지 매개 변수" - -#: src/slic3r/GUI/Tab.cpp:1496 -msgid "Ramming settings" -msgstr "래밍 설정" - -#: src/slic3r/GUI/Tab.cpp:1518 src/slic3r/GUI/Tab.cpp:1959 -msgid "Custom G-code" -msgstr "수동 G코드" - -#: src/slic3r/GUI/Tab.cpp:1519 src/slic3r/GUI/Tab.cpp:1960 -#: src/libslic3r/PrintConfig.cpp:1823 src/libslic3r/PrintConfig.cpp:1838 -msgid "Start G-code" -msgstr "스타트 G코드" - -#: src/slic3r/GUI/Tab.cpp:1525 src/slic3r/GUI/Tab.cpp:1966 -#: src/libslic3r/PrintConfig.cpp:385 src/libslic3r/PrintConfig.cpp:395 -msgid "End G-code" -msgstr "엔드 G코드" - -#: src/slic3r/GUI/Tab.cpp:1582 -msgid "Volumetric flow hints not available" -msgstr "체적 흐름 힌트를 사용할 수 없음" - -#: src/slic3r/GUI/Tab.cpp:1668 src/slic3r/GUI/Tab.cpp:1899 -msgid "Test" -msgstr "시험(test)" - -#: src/slic3r/GUI/Tab.cpp:1678 -msgid "Could not get a valid Printer Host reference" -msgstr "유효한 프린터 호스트 참조를 가져올 수 없습니다" - -#: src/slic3r/GUI/Tab.cpp:1684 src/slic3r/GUI/Tab.cpp:1912 -msgid "Success!" -msgstr "성공!" - -#: src/slic3r/GUI/Tab.cpp:1699 -msgid "" -"HTTPS CA file is optional. It is only needed if you use HTTPS with a self-" -"signed certificate." -msgstr "" -"HTTPS CA 파일은 선택 사항입니다. 자체 서명 된 인증서로 HTTPS를 사용하는 경우" -"에만 필요합니다." - -#: src/slic3r/GUI/Tab.cpp:1712 -msgid "Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*" -msgstr "인증서 파일 (* .crt, * .pem) | * .crt; * .pem | 모든 파일 | *. *" - -#: src/slic3r/GUI/Tab.cpp:1713 -msgid "Open CA certificate file" -msgstr "CA 인증서 파일 열기" - -#: src/slic3r/GUI/Tab.cpp:1741 -#, c-format -msgid "" -"HTTPS CA File:\n" -" \tOn this system, %s uses HTTPS certificates from the system Certificate " -"Store or Keychain.\n" -" \tTo use a custom CA file, please import your CA file into Certificate " -"Store / Keychain." -msgstr "" -"HTTPS CA 파일:\n" -" \t이 시스템에서 %s는 시스템 인증서 저장소나 키체인의 HTTPS 인증서를 사용 " -"합니다.\n" -" \t사용자 지정 CA 파일을 사용 하려면 CA 파일을 인증서 저장소/키체인에 가져" -"오십시오." - -#: src/slic3r/GUI/Tab.cpp:1781 src/slic3r/GUI/Tab.cpp:2025 -msgid "Size and coordinates" -msgstr "크기와 좌표" - -#: src/slic3r/GUI/Tab.cpp:1786 src/slic3r/GUI/Tab.cpp:2030 -#: src/slic3r/GUI/Tab.cpp:3146 -msgid "Set" -msgstr "설정" - -#: src/slic3r/GUI/Tab.cpp:1818 -msgid "Capabilities" -msgstr "기능" - -#: src/slic3r/GUI/Tab.cpp:1823 -msgid "Number of extruders of the printer." -msgstr "프린터 익스트루더 갯수." - -#: src/slic3r/GUI/Tab.cpp:1851 -msgid "" -"Single Extruder Multi Material is selected, \n" -"and all extruders must have the same diameter.\n" -"Do you want to change the diameter for all extruders to first extruder " -"nozzle diameter value?" -msgstr "" -"단일 압출기 다중 재질이 선택되고, \n" -"모든 압출기는 동일한 직경을 가져야 합니다.\n" -"모든 압출기의 지름을 첫 번째 압출기 노즐 값으로 변경하시겠습니까?" - -#: src/slic3r/GUI/Tab.cpp:1854 src/slic3r/GUI/Tab.cpp:2322 -#: src/libslic3r/PrintConfig.cpp:1335 -msgid "Nozzle diameter" -msgstr "노즐 직경" - -#: src/slic3r/GUI/Tab.cpp:1884 -msgid "USB/Serial connection" -msgstr "USB/시리얼 연결" - -#: src/slic3r/GUI/Tab.cpp:1885 src/libslic3r/PrintConfig.cpp:1670 -msgid "Serial port" -msgstr "시리얼 포트" - -#: src/slic3r/GUI/Tab.cpp:1890 -msgid "Rescan serial ports" -msgstr "시리얼포트 재검색" - -#: src/slic3r/GUI/Tab.cpp:1912 -msgid "Connection to printer works correctly." -msgstr "프린터 연결이 올바르게 작동합니다." - -#: src/slic3r/GUI/Tab.cpp:1915 -msgid "Connection failed." -msgstr "연결 실패." - -#: src/slic3r/GUI/Tab.cpp:1928 src/slic3r/GUI/Tab.cpp:2105 -msgid "Print Host upload" -msgstr "호스트 업로드 인쇄" - -#: src/slic3r/GUI/Tab.cpp:1972 src/libslic3r/PrintConfig.cpp:143 -msgid "Before layer change G-code" -msgstr "레이어 변경 전 G 코드" - -#: src/slic3r/GUI/Tab.cpp:1978 src/libslic3r/PrintConfig.cpp:1081 -msgid "After layer change G-code" -msgstr "레이어 변경 후 G 코드" - -#: src/slic3r/GUI/Tab.cpp:1984 src/libslic3r/PrintConfig.cpp:2103 -msgid "Tool change G-code" -msgstr "툴 채인지 G 코드" - -#: src/slic3r/GUI/Tab.cpp:1990 -msgid "Between objects G-code (for sequential printing)" -msgstr "객체(object) 간 G 코드 (순차 인쇄용)" - -#: src/slic3r/GUI/Tab.cpp:2062 -msgid "Display" -msgstr "표시" - -#: src/slic3r/GUI/Tab.cpp:2077 -msgid "Tilt" -msgstr "기울이기" - -#: src/slic3r/GUI/Tab.cpp:2078 -msgid "Tilt time" -msgstr "기울이기 시간" - -#: src/slic3r/GUI/Tab.cpp:2084 src/slic3r/GUI/Tab.cpp:3489 -msgid "Corrections" -msgstr "수정" - -#: src/slic3r/GUI/Tab.cpp:2099 src/slic3r/GUI/Tab.cpp:3485 -msgid "Exposure" -msgstr "노출" - -#: src/slic3r/GUI/Tab.cpp:2170 src/slic3r/GUI/Tab.cpp:2255 -#: src/libslic3r/PrintConfig.cpp:1131 src/libslic3r/PrintConfig.cpp:1149 -#: src/libslic3r/PrintConfig.cpp:1167 src/libslic3r/PrintConfig.cpp:1184 -#: src/libslic3r/PrintConfig.cpp:1195 src/libslic3r/PrintConfig.cpp:1206 -#: src/libslic3r/PrintConfig.cpp:1217 -msgid "Machine limits" -msgstr "머신 한계설정" - -#: src/slic3r/GUI/Tab.cpp:2184 -msgid "Values in this column are for Normal mode" -msgstr "이 열의 값은 일반 모드입니다" - -#: src/slic3r/GUI/Tab.cpp:2185 -msgid "Normal" -msgstr "보통" - -#: src/slic3r/GUI/Tab.cpp:2190 -msgid "Values in this column are for Stealth mode" -msgstr "이 열의 값은 무음 모드 용입니다" - -#: src/slic3r/GUI/Tab.cpp:2191 -msgid "Stealth" -msgstr "스텔스" - -#: src/slic3r/GUI/Tab.cpp:2199 -msgid "Maximum feedrates" -msgstr "최대 이송속도" - -#: src/slic3r/GUI/Tab.cpp:2204 -msgid "Maximum accelerations" -msgstr "최고 가속도" - -#: src/slic3r/GUI/Tab.cpp:2211 -msgid "Jerk limits" -msgstr "저크(Jerk)값 한계" - -#: src/slic3r/GUI/Tab.cpp:2216 -msgid "Minimum feedrates" -msgstr "최대 이송속도" - -#: src/slic3r/GUI/Tab.cpp:2280 src/slic3r/GUI/Tab.cpp:2288 -msgid "Single extruder MM setup" -msgstr "싱글 익스트루더 MM 설정" - -#: src/slic3r/GUI/Tab.cpp:2289 -msgid "Single extruder multimaterial parameters" -msgstr "싱글 익스트루더 멀티메터리알 파라미터" - -#: src/slic3r/GUI/Tab.cpp:2320 -msgid "" -"This is a single extruder multimaterial printer, diameters of all extruders " -"will be set to the new value. Do you want to proceed?" -msgstr "" -"이것은 단일 압출기 다중 재질 프린터이며 모든 압출기의 지름이 새 값으로 설정됩" -"니다. 계속하시겠습니까?" - -#: src/slic3r/GUI/Tab.cpp:2344 -msgid "Layer height limits" -msgstr "레이어 높이 한계치" - -#: src/slic3r/GUI/Tab.cpp:2349 -msgid "Position (for multi-extruder printers)" -msgstr "위치 (다중 익스트루더 프린터 포함)" - -#: src/slic3r/GUI/Tab.cpp:2355 -msgid "Only lift Z" -msgstr "Z축 올림" - -#: src/slic3r/GUI/Tab.cpp:2368 -msgid "" -"Retraction when tool is disabled (advanced settings for multi-extruder " -"setups)" -msgstr "도구 비활성화시 리트렉션 (다중 익스트루더 고급 설정)" - -#: src/slic3r/GUI/Tab.cpp:2376 -msgid "Reset to Filament Color" -msgstr "필라멘트 색상으로 재설정" - -#: src/slic3r/GUI/Tab.cpp:2557 -msgid "" -"The Wipe option is not available when using the Firmware Retraction mode.\n" -"\n" -"Shall I disable it in order to enable Firmware Retraction?" -msgstr "" -"펌웨어 리트렉션 모드를 사용할 때는 Wipe 옵션을 사용할 수 없습니다.\n" -"\n" -"펌웨어 리트렉션 하려면 비활성화해야합니까?" - -#: src/slic3r/GUI/Tab.cpp:2559 -msgid "Firmware Retraction" -msgstr "펌웨어 레트렉션" - -#: src/slic3r/GUI/Tab.cpp:2889 -#, c-format -msgid "Default preset (%s)" -msgstr "시스템 기본값 (%s)" - -#: src/slic3r/GUI/Tab.cpp:2890 -#, c-format -msgid "Preset (%s)" -msgstr "프리셋 ( %s)" - -#: src/slic3r/GUI/Tab.cpp:2907 -msgid "has the following unsaved changes:" -msgstr "저장되지 않은 수정사항:" - -#: src/slic3r/GUI/Tab.cpp:2910 -msgid "is not compatible with printer" -msgstr "프린터와 호완 되지 않습니다" - -#: src/slic3r/GUI/Tab.cpp:2911 -msgid "is not compatible with print profile" -msgstr "인쇄 프로필과 호환 되지 않음" - -#: src/slic3r/GUI/Tab.cpp:2913 -msgid "and it has the following unsaved changes:" -msgstr "저장되지 않은 변경점은 다음과 같습니다:" - -#: src/slic3r/GUI/Tab.cpp:2917 -msgid "Unsaved Changes" -msgstr "미 저장된 변경점" - -#: src/slic3r/GUI/Tab.cpp:3015 -msgctxt "PresetName" -msgid "%1% - Copy" -msgstr "%1%-복사" - -#: src/slic3r/GUI/Tab.cpp:3038 -msgid "The supplied name is empty. It can't be saved." -msgstr "파일 이름이 비어 있습니다. 저장할 수 없습니다." - -#: src/slic3r/GUI/Tab.cpp:3043 -msgid "Cannot overwrite a system profile." -msgstr "시스템 프로파일을 겹쳐 쓸 수 없습니다." - -#: src/slic3r/GUI/Tab.cpp:3047 -msgid "Cannot overwrite an external profile." -msgstr "외부 프로필을 덮어 쓸 수 없습니다." - -#: src/slic3r/GUI/Tab.cpp:3052 -msgid "Preset with name \"%1%\" already exists." -msgstr "이름 \"%1%\"가 있는 사전 설정이 이미 있습니다." - -#: src/slic3r/GUI/Tab.cpp:3053 -msgid "Replace?" -msgstr "교체?" - -#: src/slic3r/GUI/Tab.cpp:3091 -msgid "remove" -msgstr "제거(remove)" - -#: src/slic3r/GUI/Tab.cpp:3091 -msgid "delete" -msgstr "지우기" - -#. TRN remove/delete -#: src/slic3r/GUI/Tab.cpp:3093 -msgid "Are you sure you want to %1% the selected preset?" -msgstr "선택한 사전 설정의 %1%를 선택 하시겠습니까?" - -#. TRN Remove/Delete -#: src/slic3r/GUI/Tab.cpp:3096 -msgid "%1% Preset" -msgstr "%1% 기본설정" - -#: src/slic3r/GUI/Tab.cpp:3222 -msgid "LOCKED LOCK" -msgstr "잠긴 잠금" - -#. TRN Description for "LOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:3224 -msgid "" -"indicates that the settings are the same as the system (or default) values " -"for the current option group" -msgstr "" -"설정이 현재 옵션 그룹의 시스템(또는 기본값) 값과 동일하다는 것을 나타냅니다." - -#: src/slic3r/GUI/Tab.cpp:3226 -msgid "UNLOCKED LOCK" -msgstr "잠금 해제 잠금" - -#. TRN Description for "UNLOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:3228 -msgid "" -"indicates that some settings were changed and are not equal to the system " -"(or default) values for the current option group.\n" -"Click the UNLOCKED LOCK icon to reset all settings for current option group " -"to the system (or default) values." -msgstr "" -"은 일부 설정이 변경되었으며 현재 옵션 그룹의 시스템(또는 기본값) 값과 같지 않" -"음을 나타냅니다.\n" -"잠금 해제 잠금 아이콘을 클릭하여 현재 옵션 그룹에 대한 모든 설정을 시스템(또" -"는 기본값) 값으로 재설정합니다." - -#: src/slic3r/GUI/Tab.cpp:3233 -msgid "WHITE BULLET" -msgstr "흰색 글머리 기호" - -#. TRN Description for "WHITE BULLET" -#: src/slic3r/GUI/Tab.cpp:3235 -msgid "" -"for the left button: \tindicates a non-system (or non-default) preset,\n" -"for the right button: \tindicates that the settings hasn't been modified." -msgstr "" -"왼쪽 단추의 경우: 비시스템(또는 기본이 아닌) 사전 설정을 나타냅니다.\n" -"오른쪽 버튼: 설정이 수정되지 않았음을 나타냅니다." - -#: src/slic3r/GUI/Tab.cpp:3238 -msgid "BACK ARROW" -msgstr "돌아가기 화살표" - -#. TRN Description for "BACK ARROW" -#: src/slic3r/GUI/Tab.cpp:3240 -msgid "" -"indicates that the settings were changed and are not equal to the last saved " -"preset for the current option group.\n" -"Click the BACK ARROW icon to reset all settings for the current option group " -"to the last saved preset." -msgstr "" -"잠금 풀림;일부 설정이 변경되었으며 현재 옵션 그룹의 시스템 값과 같지 않음을 " -"나타냅니다.\n" -"현재 옵션 그룹의 모든 설정을 시스템 값으로 재설정하려면 자물쇠 잠금 아이콘을 " -"클릭하십시오." - -#: src/slic3r/GUI/Tab.cpp:3250 -msgid "" -"LOCKED LOCK icon indicates that the settings are the same as the system (or " -"default) values for the current option group" -msgstr "" -"LOCKED LOCK 아이콘은 설정이 현재 옵션 그룹의 시스템(또는 기본값) 값과 동일하" -"다는 것을 나타냅니다." - -#: src/slic3r/GUI/Tab.cpp:3252 -msgid "" -"UNLOCKED LOCK icon indicates that some settings were changed and are not " -"equal to the system (or default) values for the current option group.\n" -"Click to reset all settings for current option group to the system (or " -"default) values." -msgstr "" -"UNLOCKED LOCK 아이콘은 일부 설정이 변경되었으며 현재 옵션 그룹의 시스템(또는 " -"기본값) 값과 같지 않음을 나타냅니다.\n" -"현재 옵션 그룹에 대한 모든 설정을 시스템(또는 기본값) 값으로 재설정하려면 클" -"릭합니다." - -#: src/slic3r/GUI/Tab.cpp:3255 -msgid "WHITE BULLET icon indicates a non system (or non default) preset." -msgstr "WHITE BULLET 아이콘은 시스템 사전 설정이 아닌 것을 나타냅니다." - -#: src/slic3r/GUI/Tab.cpp:3258 -msgid "" -"WHITE BULLET icon indicates that the settings are the same as in the last " -"saved preset for the current option group." -msgstr "" -"WHITE BULLET 기호 아이콘은 설정이 현재 옵션 그룹에 대해 마지막으로 저장 된 사" -"전 설정과 동일 하다는 것을 나타냅니다." - -#: src/slic3r/GUI/Tab.cpp:3260 -msgid "" -"BACK ARROW icon indicates that the settings were changed and are not equal " -"to the last saved preset for the current option group.\n" -"Click to reset all settings for the current option group to the last saved " -"preset." -msgstr "" -"BACK ARROW 이콘 설정을 변경 하 고 현재 옵션 그룹에 대 한 마지막 저장 된 프리" -"셋을 동일 하지 않습니다 나타냅니다.\n" -"마지막 현재 옵션 그룹에 대 한 모든 설정 다시 설정을 클릭 하 여 사전 설정을 저" -"장." - -#: src/slic3r/GUI/Tab.cpp:3266 -msgid "" -"LOCKED LOCK icon indicates that the value is the same as the system (or " -"default) value." -msgstr "" -"LOCKED LOCK 아이콘은 값이 시스템(또는 기본값) 값과 동일하다는 것을 나타냅니" -"다." - -#: src/slic3r/GUI/Tab.cpp:3267 -msgid "" -"UNLOCKED LOCK icon indicates that the value was changed and is not equal to " -"the system (or default) value.\n" -"Click to reset current value to the system (or default) value." -msgstr "" -"UNLOCKED LOCK 아이콘은 값이 변경되었으며 시스템(또는 기본값) 값과 같지 않음" -"을 나타냅니다.\n" -"현재 값을 시스템(또는 기본값) 값으로 재설정하려면 클릭합니다." - -#: src/slic3r/GUI/Tab.cpp:3273 -msgid "" -"WHITE BULLET icon indicates that the value is the same as in the last saved " -"preset." -msgstr "" -"WHITE BULLET 기호 아이콘은 마지막으로 저장 한 사전 설정과 동일한 값을 나타냅" -"니다." - -#: src/slic3r/GUI/Tab.cpp:3274 -msgid "" -"BACK ARROW icon indicates that the value was changed and is not equal to the " -"last saved preset.\n" -"Click to reset current value to the last saved preset." -msgstr "" -"BACK ARROW 아이콘은 값이 변경되었으며 마지막으로 저장된 사전 설정과 같지 않음" -"을 나타냅니다.\n" -"현재 값을 마지막으로 저장된 사전 설정으로 재설정하려면 클릭합니다." - -#. TRN Preset -#: src/slic3r/GUI/Tab.cpp:3387 -#, c-format -msgid "Save %s as:" -msgstr "Save %s as:" - -#: src/slic3r/GUI/Tab.cpp:3431 -msgid "the following suffix is not allowed:" -msgstr "다음 접미사는 허용되지 않습니다:" - -#: src/slic3r/GUI/Tab.cpp:3435 -msgid "The supplied name is not available." -msgstr "제공된 이름을 사용할 수 없습니다." - -#: src/slic3r/GUI/Tab.cpp:3448 src/slic3r/GUI/Tab.cpp:3450 -msgid "Material" -msgstr "재료" - -#: src/slic3r/GUI/Tab.cpp:3580 -msgid "Support head" -msgstr "서포트 헤드" - -#: src/slic3r/GUI/Tab.cpp:3585 -msgid "Support pillar" -msgstr "서포트 기둥" - -#: src/slic3r/GUI/Tab.cpp:3599 -msgid "Connection of the support sticks and junctions" -msgstr "서포트 기둥 및 접합부 연결" - -#: src/slic3r/GUI/Tab.cpp:3604 -msgid "Automatic generation" -msgstr "자동 생성" - -#: src/slic3r/GUI/Tab.hpp:327 src/slic3r/GUI/Tab.hpp:429 -msgid "Print Settings" -msgstr "출력 설정" - -#: src/slic3r/GUI/Tab.hpp:354 -msgid "Filament Settings" -msgstr "필라멘트 설정" - -#: src/slic3r/GUI/Tab.hpp:390 -msgid "Printer Settings" -msgstr "프린터 설정" - -#: src/slic3r/GUI/Tab.hpp:414 -msgid "Material Settings" -msgstr "재질 설정" - -#: src/slic3r/GUI/Tab.hpp:441 -msgid "Save preset" -msgstr "사전 설정 저장" - -#: src/slic3r/GUI/UpdateDialogs.cpp:38 -msgid "Update available" -msgstr "사용가능한 업데이트" - -#: src/slic3r/GUI/UpdateDialogs.cpp:38 -#, c-format -msgid "New version of %s is available" -msgstr "%s의 새 버전을 사용할 수 있습니다" - -#: src/slic3r/GUI/UpdateDialogs.cpp:43 -msgid "Current version:" -msgstr "현재 버전:" - -#: src/slic3r/GUI/UpdateDialogs.cpp:45 -msgid "New version:" -msgstr "새로운 버전:" - -#: src/slic3r/GUI/UpdateDialogs.cpp:53 -msgid "Changelog && Download" -msgstr "변경 로그 및 다운로드" - -#: src/slic3r/GUI/UpdateDialogs.cpp:60 src/slic3r/GUI/UpdateDialogs.cpp:125 -#: src/slic3r/GUI/UpdateDialogs.cpp:183 -msgid "Open changelog page" -msgstr "변경 로그 페이지 열기" - -#: src/slic3r/GUI/UpdateDialogs.cpp:65 -msgid "Open download page" -msgstr "다운로드 페이지 열기" - -#: src/slic3r/GUI/UpdateDialogs.cpp:71 -msgid "Don't notify about new releases any more" -msgstr "새로운 수정사항에 대해 더 이상 알림 안 함" - -#: src/slic3r/GUI/UpdateDialogs.cpp:89 src/slic3r/GUI/UpdateDialogs.cpp:266 -msgid "Configuration update" -msgstr "구성 업데이트" - -#: src/slic3r/GUI/UpdateDialogs.cpp:89 -msgid "Configuration update is available" -msgstr "구성 업데이트를 사용할 수 있음" - -#: src/slic3r/GUI/UpdateDialogs.cpp:92 -msgid "" -"Would you like to install it?\n" -"\n" -"Note that a full configuration snapshot will be created first. It can then " -"be restored at any time should there be a problem with the new version.\n" -"\n" -"Updated configuration bundles:" -msgstr "" -"그것을 설치 하시겠습니까?\n" -"\n" -"전체 구성 스냅 샷이 먼저 만들어집니다. 그런 다음 새 버전에 문제가있을 경우 언" -"제든지 복원 할 수 있습니다.\n" -"\n" -"업데이트 된 구성 번들 :" - -#: src/slic3r/GUI/UpdateDialogs.cpp:113 src/slic3r/GUI/UpdateDialogs.cpp:173 -msgid "Comment:" -msgstr "코멘트:" - -#: src/slic3r/GUI/UpdateDialogs.cpp:148 src/slic3r/GUI/UpdateDialogs.cpp:210 -#, c-format -msgid "%s incompatibility" -msgstr "%s 비 호환성" - -#: src/slic3r/GUI/UpdateDialogs.cpp:148 -msgid "Configuration update is necessary to install" -msgstr "설치하려면 구성 업데이트가 필요합니다." - -#: src/slic3r/GUI/UpdateDialogs.cpp:151 -#, c-format -msgid "" -"%s will now start updates. Otherwise it won't be able to start.\n" -"\n" -"Note that a full configuration snapshot will be created first. It can then " -"be restored at any time should there be a problem with the new version.\n" -"\n" -"Updated configuration bundles:" -msgstr "" -"%s는 이제 업데이트를 시작합니다. 그렇지 않으면 시작할 수 없습니다.\n" -"\n" -"전체 구성 스냅숏이 먼저 만들어집니다. 그런 다음 새 버전에 문제가 있으면 언제" -"든지 복원 할 수 있습니다.\n" -"\n" -"업데이트된 구성 번들:" - -#: src/slic3r/GUI/UpdateDialogs.cpp:191 src/slic3r/GUI/UpdateDialogs.cpp:246 -#, c-format -msgid "Exit %s" -msgstr "%s 종료" - -#: src/slic3r/GUI/UpdateDialogs.cpp:211 -#, c-format -msgid "%s configuration is incompatible" -msgstr "%s 과 호환되지 않습니다" - -#: src/slic3r/GUI/UpdateDialogs.cpp:216 -#, c-format -msgid "" -"This version of %s is not compatible with currently installed configuration " -"bundles.\n" -"This probably happened as a result of running an older %s after using a " -"newer one.\n" -"\n" -"You may either exit %s and try again with a newer version, or you may re-run " -"the initial configuration. Doing so will create a backup snapshot of the " -"existing configuration before installing files compatible with this %s." -msgstr "" -"%s의 이 버전은 현재 설치 된 구성 번들과 호환 되지 않습니다.\n" -"이것은 새로운 것을 사용한 후 이전 %s를 실행 한 결과로 발생 했을 것입니다.\n" -"\n" -" %s를 종료하고 최신 버전으로 다시 시도 하거나 초기 구성을 다시 실행할 수 있습" -"니다. 이렇게 하면 %s와 호환 되는 파일을 설치하기 전에 기존 구성의 백업 스냅샷" -"이 생성 됩니다." - -#: src/slic3r/GUI/UpdateDialogs.cpp:225 -#, c-format -msgid "This %s version: %s" -msgstr "이 %s 버전: %s" - -#: src/slic3r/GUI/UpdateDialogs.cpp:230 -msgid "Incompatible bundles:" -msgstr "호환되지 않는 번들 :" - -#: src/slic3r/GUI/UpdateDialogs.cpp:249 -msgid "Re-configure" -msgstr "재구성" - -#: src/slic3r/GUI/UpdateDialogs.cpp:270 -#, c-format -msgid "" -"%s now uses an updated configuration structure.\n" -"\n" -"So called 'System presets' have been introduced, which hold the built-in " -"default settings for various printers. These System presets cannot be " -"modified, instead, users now may create their own presets inheriting " -"settings from one of the System presets.\n" -"An inheriting preset may either inherit a particular value from its parent " -"or override it with a customized value.\n" -"\n" -"Please proceed with the %s that follows to set up the new presets and to " -"choose whether to enable automatic preset updates." -msgstr "" -"%s이 (가) 이제 업데이트 된 구성 구조를 사용 합니다.\n" -"\n" -"'시스템 프리셋 '이 도입 되었습니다, 다양한 프린터에 대한 기본 설정을 내장. 이" -"러한 시스템 프리셋은 수정할 수 없으며, 사용자는 이제 시스템 프리셋 중 하나에" -"서 설정을 상속하는 자신만의 프리셋을 생성할 수 있습니다.\n" -"상속하는 사전 설정은 해당 기본 설정에서 특정 값을 상속 하거나 사용자 지정 된 " -"값으로 재정의할 수 있습니다.\n" -"\n" -"다음의 %s를 계속 진행하여 새 프리셋을 설정하고 자동 프리셋 업데이트를 사용할" -"지 여부를 선택하십시오." - -#: src/slic3r/GUI/UpdateDialogs.cpp:286 -msgid "For more information please visit our wiki page:" -msgstr "자세한 정보는 위키 페이지를 참조하십시오 :" - -#: src/slic3r/GUI/UpdateDialogs.cpp:303 -msgid "Configuration updates" -msgstr "구성 업데이트" - -#: src/slic3r/GUI/UpdateDialogs.cpp:303 -msgid "No updates aviable" -msgstr "실행 가능한 업데이트없음" - -#: src/slic3r/GUI/UpdateDialogs.cpp:308 -#, c-format -msgid "%s has no configuration updates aviable." -msgstr "%s에는 구성 업데이트가 실행 가능한 업데이트가 없습니다." - -#: src/slic3r/GUI/WipeTowerDialog.cpp:15 -msgid "Ramming customization" -msgstr "사용자 정의 다지기(Ramming)" - -#: src/slic3r/GUI/WipeTowerDialog.cpp:41 -msgid "" -"Ramming denotes the rapid extrusion just before a tool change in a single-" -"extruder MM printer. Its purpose is to properly shape the end of the " -"unloaded filament so it does not prevent insertion of the new filament and " -"can itself be reinserted later. This phase is important and different " -"materials can require different extrusion speeds to get the good shape. For " -"this reason, the extrusion rates during ramming are adjustable.\n" -"\n" -"This is an expert-level setting, incorrect adjustment will likely lead to " -"jams, extruder wheel grinding into filament etc." -msgstr "" -"래밍은 단일 압출기 MMU 프린터에서 공구 교환 직전의 신속한 압출을 나타냅니다. " -"그 목적은 언로드 된 필라멘트의 끝 부분을 적절히 형성하여 새로운 필라멘트의 삽" -"입을 방지하고 나중에 다시 삽입 할 수 있도록하기위한 것입니다. 이 단계는 중요" -"하며 다른 재료는 좋은 모양을 얻기 위해 다른 압출 속도를 요구할 수 있습니다. " -"이러한 이유로, 래밍 중 압출 속도는 조정 가능합니다.\n" -"\n" -"전문가 수준의 설정이므로 잘못된 조정으로 인해 용지 걸림, 압출기 휠이 필라멘" -"트 등에 연삭 될 수 있습니다." - -#: src/slic3r/GUI/WipeTowerDialog.cpp:83 -msgid "Total ramming time" -msgstr "총 래밍 시간" - -#: src/slic3r/GUI/WipeTowerDialog.cpp:85 -msgid "Total rammed volume" -msgstr "총 레미드 양" - -#: src/slic3r/GUI/WipeTowerDialog.cpp:89 -msgid "Ramming line width" -msgstr "래밍 선 너비" - -#: src/slic3r/GUI/WipeTowerDialog.cpp:91 -msgid "Ramming line spacing" -msgstr "래밍 선 간격" - -#: src/slic3r/GUI/WipeTowerDialog.cpp:142 -msgid "Wipe tower - Purging volume adjustment" -msgstr "와이프 타워 - 버려진 필라멘트 조절" - -#: src/slic3r/GUI/WipeTowerDialog.cpp:254 -msgid "" -"Here you can adjust required purging volume (mm³) for any given pair of " -"tools." -msgstr "여기서 주어진 도구 쌍에 필요한 정화 용량 (mm³)을 조정할 수 있습니다." - -#: src/slic3r/GUI/WipeTowerDialog.cpp:255 -msgid "Extruder changed to" -msgstr "익스트루더 번경" - -#: src/slic3r/GUI/WipeTowerDialog.cpp:263 -msgid "unloaded" -msgstr "언로드(unloaded)" - -#: src/slic3r/GUI/WipeTowerDialog.cpp:264 -msgid "loaded" -msgstr "로드(loaded)" - -#: src/slic3r/GUI/WipeTowerDialog.cpp:276 -msgid "Tool #" -msgstr "도구(Tool) #" - -#: src/slic3r/GUI/WipeTowerDialog.cpp:285 -msgid "" -"Total purging volume is calculated by summing two values below, depending on " -"which tools are loaded/unloaded." -msgstr "" -"총 정화 량은 어느 공구가로드 / 언로드되는지에 따라 아래의 두 값을 합산하여 계" -"산됩니다." - -#: src/slic3r/GUI/WipeTowerDialog.cpp:286 -msgid "Volume to purge (mm³) when the filament is being" -msgstr "제거할 필라멘트 양 (mm³)" - -#: src/slic3r/GUI/WipeTowerDialog.cpp:300 -msgid "From" -msgstr "From" - -#: src/slic3r/GUI/WipeTowerDialog.cpp:365 -msgid "" -"Switching to simple settings will discard changes done in the advanced " -"mode!\n" -"\n" -"Do you want to proceed?" -msgstr "" -"단순 설정으로 전환하면 고급 모드에서 수행된 변경 내용이 삭제됨!\n" -"\n" -"계속하시겠습니까?" - -#: src/slic3r/GUI/WipeTowerDialog.cpp:377 -msgid "Show simplified settings" -msgstr "간단한 설정보기" - -#: src/slic3r/GUI/WipeTowerDialog.cpp:377 -msgid "Show advanced settings" -msgstr "고급 설정보기" - -#: src/slic3r/GUI/wxExtensions.cpp:680 -#, c-format -msgid "Switch to the %s mode" -msgstr "%s 모드로 전환" - -#: src/slic3r/GUI/wxExtensions.cpp:681 -#, c-format -msgid "Current mode is %s" -msgstr "현재 모드는 %s입니다" - -#: src/slic3r/Utils/AstroBox.cpp:68 src/slic3r/Utils/OctoPrint.cpp:68 -#, c-format -msgid "Mismatched type of print host: %s" -msgstr "일치 하지않는 인쇄 호스트 유형: %s" - -#: src/slic3r/Utils/AstroBox.cpp:83 -msgid "Connection to AstroBox works correctly." -msgstr "아스트로박스에 대한 연결이 올바르게 작동합니다." - -#: src/slic3r/Utils/AstroBox.cpp:89 -msgid "Could not connect to AstroBox" -msgstr "아스트로박스에 연결할 수 없습니다." - -#: src/slic3r/Utils/AstroBox.cpp:89 -msgid "Note: AstroBox version at least 1.1.0 is required." -msgstr "참고: 아스트로박스 버전은 최소 1.1.0이 필요합니다." - -#: src/slic3r/Utils/Duet.cpp:49 -msgid "Connection to Duet works correctly." -msgstr "듀엣보드에 대한 연결이 올바르게 작동 합니다." - -#: src/slic3r/Utils/Duet.cpp:54 -msgid "Could not connect to Duet" -msgstr "듀엣보드에 연결할 수 없습니다" - -#: src/slic3r/Utils/Duet.cpp:82 src/slic3r/Utils/Duet.cpp:137 -#: src/slic3r/Utils/FlashAir.cpp:119 src/slic3r/Utils/FlashAir.cpp:140 -#: src/slic3r/Utils/FlashAir.cpp:156 -msgid "Unknown error occured" -msgstr "알 수 없는 오류가 발생 했습니다" - -#: src/slic3r/Utils/Duet.cpp:131 -msgid "Wrong password" -msgstr "잘못된 암호" - -#: src/slic3r/Utils/Duet.cpp:134 -msgid "Could not get resources to create a new connection" -msgstr "새 연결을 만들 리소스를 가져올수 없습니다" - -#: src/slic3r/Utils/FixModelByWin10.cpp:219 -#: src/slic3r/Utils/FixModelByWin10.cpp:359 -msgid "Exporting source model" -msgstr "소스 모델 내보내기" - -#: src/slic3r/Utils/FixModelByWin10.cpp:235 -msgid "Failed loading the input model." -msgstr "입력 모델을 로드하지 못했습니다." - -#: src/slic3r/Utils/FixModelByWin10.cpp:242 -msgid "Repairing model by the Netfabb service" -msgstr "Netfabb 서비스에의 한 모델 복구" - -#: src/slic3r/Utils/FixModelByWin10.cpp:248 -msgid "Mesh repair failed." -msgstr "메쉬 복구에 실패 했습니다." - -#: src/slic3r/Utils/FixModelByWin10.cpp:251 -#: src/slic3r/Utils/FixModelByWin10.cpp:385 -msgid "Loading repaired model" -msgstr "복구 된 모델 로드" - -#: src/slic3r/Utils/FixModelByWin10.cpp:263 -#: src/slic3r/Utils/FixModelByWin10.cpp:270 -#: src/slic3r/Utils/FixModelByWin10.cpp:302 -msgid "Saving mesh into the 3MF container failed." -msgstr "3MF 컨테이너에 메쉬를 저장하지 못했습니다." - -#: src/slic3r/Utils/FixModelByWin10.cpp:340 -msgid "Model fixing" -msgstr "모델 고정" - -#: src/slic3r/Utils/FixModelByWin10.cpp:341 -msgid "Exporting model..." -msgstr "소스 모델 내보내기..." - -#: src/slic3r/Utils/FixModelByWin10.cpp:369 -#: src/slic3r/Utils/FixModelByWin10.cpp:374 -msgid "Export of a temporary 3mf file failed" -msgstr "임시 3mf 파일을 내보내지 못했습니다" - -#: src/slic3r/Utils/FixModelByWin10.cpp:390 -msgid "Import of the repaired 3mf file failed" -msgstr "복구된 3mf 파일을 가져오지 못했습니다" - -#: src/slic3r/Utils/FixModelByWin10.cpp:392 -msgid "Repaired 3MF file does not contain any object" -msgstr "복구된 3MF 파일에 객체(object)가 포함 되어있지 않습니다" - -#: src/slic3r/Utils/FixModelByWin10.cpp:394 -msgid "Repaired 3MF file contains more than one object" -msgstr "복구된 3MF 파일에 둘 이상의 객체(object)가 포함되어 있습니다" - -#: src/slic3r/Utils/FixModelByWin10.cpp:396 -msgid "Repaired 3MF file does not contain any volume" -msgstr "복구 된 3MF 파일에 객체(object)가 포함 되어있지 않습니다" - -#: src/slic3r/Utils/FixModelByWin10.cpp:398 -msgid "Repaired 3MF file contains more than one volume" -msgstr "복구된 3MF 파일에 둘 이상의 객체(object)가 포함되어 있습니다" - -#: src/slic3r/Utils/FixModelByWin10.cpp:407 -msgid "Model repair finished" -msgstr "모델 수리 완료" - -#: src/slic3r/Utils/FixModelByWin10.cpp:413 -msgid "Model repair canceled" -msgstr "모델 복구가 취소 되었습니다" - -#: src/slic3r/Utils/FixModelByWin10.cpp:430 -msgid "Model repaired successfully" -msgstr "모델이 성공적으로 복구 되었습니다" - -#: src/slic3r/Utils/FixModelByWin10.cpp:430 -#: src/slic3r/Utils/FixModelByWin10.cpp:433 -msgid "Model Repair by the Netfabb service" -msgstr "Netfabb 서비스에의 한 모델 복구" - -#: src/slic3r/Utils/FixModelByWin10.cpp:433 -msgid "Model repair failed:" -msgstr "모델 복구 실패:" - -#: src/slic3r/Utils/FlashAir.cpp:58 -msgid "Upload not enabled on FlashAir card." -msgstr "FlashAir 카드에서 업로드가 활성화되지 않았습니다." - -#: src/slic3r/Utils/FlashAir.cpp:68 -msgid "Connection to FlashAir works correctly and upload is enabled." -msgstr "FlashAir에 대한 연결이 올바르게 작동하고 업로드가 활성화되어 있습니다." - -#: src/slic3r/Utils/FlashAir.cpp:73 -msgid "Could not connect to FlashAir" -msgstr "플래시 에어에 연결할 수 없습니다." - -#: src/slic3r/Utils/FlashAir.cpp:73 -msgid "" -"Note: FlashAir with firmware 2.00.02 or newer and activated upload function " -"is required." -msgstr "" -"참고 : 펌웨어 2.00.02 이상 및 활성화 된 업로드 기능이있는 FlashAir가 필요합니" -"다." - -#: src/slic3r/Utils/OctoPrint.cpp:83 -msgid "Connection to OctoPrint works correctly." -msgstr "OctoPrint에 연결하면 올바르게 작동합니다." - -#: src/slic3r/Utils/OctoPrint.cpp:89 -msgid "Could not connect to OctoPrint" -msgstr "OctoPrint에 연결할 수 없습니다" - -#: src/slic3r/Utils/OctoPrint.cpp:89 -msgid "Note: OctoPrint version at least 1.1.0 is required." -msgstr "참고 : OctoPrint 버전 1.1.0 이상이 필요합니다." - -#: src/slic3r/Utils/OctoPrint.cpp:176 -msgid "Connection to Prusa SL1 works correctly." -msgstr "Prusa SL1에 대한 연결이 제대로 작동 합니다." - -#: src/slic3r/Utils/OctoPrint.cpp:181 -msgid "Could not connect to Prusa SLA" -msgstr "Prusa SLA에 연결할 수 없습니다" - -#: src/slic3r/Utils/PresetUpdater.cpp:705 -#, c-format -msgid "requires min. %s and max. %s" -msgstr "최소. %s 와 최대. %s" - -#: src/slic3r/Utils/PresetUpdater.cpp:710 -#, c-format -msgid "requires min. %s" -msgstr "최소 %s가 필요 합니다" - -#: src/slic3r/Utils/PresetUpdater.cpp:713 -#, c-format -msgid "requires max. %s" -msgstr "최대 필요 합니다. %s" - -#: src/libslic3r/SLA/Pad.cpp:691 -msgid "Pad brim size is too small for the current configuration." -msgstr "패드 테두리 크기가 현재 구성에 너무 작습니다." - -#: src/libslic3r/Zipper.cpp:32 -msgid "undefined error" -msgstr "정의 되지 않은 오류" - -#: src/libslic3r/Zipper.cpp:34 -msgid "too many files" -msgstr "파일이 너무 많음" - -#: src/libslic3r/Zipper.cpp:36 -msgid "file too large" -msgstr "파일이 너무 큼" - -#: src/libslic3r/Zipper.cpp:38 -msgid "unsupported method" -msgstr "지원 되지 않는 방법" - -#: src/libslic3r/Zipper.cpp:40 -msgid "unsupported encryption" -msgstr "지원 되지 않는 암호화" - -#: src/libslic3r/Zipper.cpp:42 -msgid "unsupported feature" -msgstr "지원 되지 않는 기능" - -#: src/libslic3r/Zipper.cpp:44 -msgid "failed finding central directory" -msgstr "중앙 디렉터리를 찾지 못했습니다." - -#: src/libslic3r/Zipper.cpp:46 -msgid "not a ZIP archive" -msgstr "zIP 아카이브 아님" - -#: src/libslic3r/Zipper.cpp:48 -msgid "invalid header or archive is corrupted" -msgstr "잘못 된 헤더 또는 아카이브가 손상 되었습니다" - -#: src/libslic3r/Zipper.cpp:50 -msgid "unsupported multidisk archive" -msgstr "지원 되지 않는 다중 디스크 아카이브" - -#: src/libslic3r/Zipper.cpp:52 -msgid "decompression failed or archive is corrupted" -msgstr "압축 풀기 실패 또는 아카이브가 손상 되었습니다" - -#: src/libslic3r/Zipper.cpp:54 -msgid "compression failed" -msgstr "압축 실패" - -#: src/libslic3r/Zipper.cpp:56 -msgid "unexpected decompressed size" -msgstr "예기치 않은 압축 해제 크기" - -#: src/libslic3r/Zipper.cpp:58 -msgid "CRC-32 check failed" -msgstr "CRC-32 확인 실패" - -#: src/libslic3r/Zipper.cpp:60 -msgid "unsupported central directory size" -msgstr "지원 되지 않는 중앙 디렉터리 크기" - -#: src/libslic3r/Zipper.cpp:62 -msgid "allocation failed" -msgstr "할당 실패" - -#: src/libslic3r/Zipper.cpp:64 -msgid "file open failed" -msgstr "파일 열기 실패" - -#: src/libslic3r/Zipper.cpp:66 -msgid "file create failed" -msgstr "파일 만들기 실패" - -#: src/libslic3r/Zipper.cpp:68 -msgid "file write failed" -msgstr "파일 쓰기 실패" - -#: src/libslic3r/Zipper.cpp:70 -msgid "file read failed" -msgstr "파일 읽기 실패" - -#: src/libslic3r/Zipper.cpp:72 -msgid "file close failed" -msgstr "파일 닫기 실패" - -#: src/libslic3r/Zipper.cpp:74 -msgid "file seek failed" -msgstr "파일 검색 실패" - -#: src/libslic3r/Zipper.cpp:76 -msgid "file stat failed" -msgstr "파일 통계 실패" - -#: src/libslic3r/Zipper.cpp:78 -msgid "invalid parameter" -msgstr "잘못 된 매개 변수" - -#: src/libslic3r/Zipper.cpp:80 -msgid "invalid filename" -msgstr "잘못 된 파일 이름" - -#: src/libslic3r/Zipper.cpp:82 -msgid "buffer too small" -msgstr "버퍼가 너무 작음" - -#: src/libslic3r/Zipper.cpp:84 -msgid "internal error" -msgstr "내부 오류" - -#: src/libslic3r/Zipper.cpp:86 -msgid "file not found" -msgstr "파일을 찾을 수 없습니다." - -#: src/libslic3r/Zipper.cpp:88 -msgid "archive is too large" -msgstr "아카이브가 너무 큼" - -#: src/libslic3r/Zipper.cpp:90 -msgid "validation failed" -msgstr "유효성 검사 실패" - -#: src/libslic3r/Zipper.cpp:92 -msgid "write calledback failed" -msgstr "쓰기 다시 실패" - -#: src/libslic3r/Zipper.cpp:102 -msgid "Error with zip archive" -msgstr "zip 아카이브와 오류가 발생 했습니다" - -#: src/libslic3r/GCode.cpp:637 -msgid "Empty layers detected, the output would not be printable." -msgstr "빈 레이어가 감지되면 출력을 인쇄할 수 없습니다." - -#: src/libslic3r/GCode.cpp:638 -msgid "Print z" -msgstr "인쇄 z" - -#: src/libslic3r/GCode.cpp:639 -msgid "" -"This is usually caused by negligibly small extrusions or by a faulty model. " -"Try to repair the model or change its orientation on the bed." -msgstr "" -"이는 일반적으로 무시할 수 있는 작은 돌출 또는 결함이 있는 모델에 의해 발생합" -"니다. 모델을 수리하거나 배드에서 방향을 변경하십시오." - -#: src/libslic3r/ExtrusionEntity.cpp:323 -msgid "Mixed" -msgstr "혼합" - -#: src/libslic3r/Flow.cpp:55 -msgid "" -"Cannot calculate extrusion width for %1%: Variable \"%2%\" not accessible." -msgstr "" -"%1%에 대한 압출 폭을 계산할 수 없습니다: 변수 \"%2%\"에 액세스할 수 없습니다." - -#: src/libslic3r/Format/3mf.cpp:1630 -msgid "" -"The selected 3mf file has been saved with a newer version of %1% and is not " -"compatible." -msgstr "선택한 3mf 파일은 %1%의 최신 버전으로 저장되었으며 호환되지 않습니다." - -#: src/libslic3r/Format/AMF.cpp:934 -msgid "" -"The selected amf file has been saved with a newer version of %1% and is not " -"compatible." -msgstr "선택한 amf 파일은 %1%의 최신 버전으로 저장되었으며 호환되지 않습니다." - -#: src/libslic3r/Print.cpp:1158 -msgid "All objects are outside of the print volume." -msgstr "모든 객체(object)가 인쇄 볼륨 외부에 있습니다." - -#: src/libslic3r/Print.cpp:1161 -msgid "The supplied settings will cause an empty print." -msgstr "제공된 설정으로 인해 빈 인쇄가 발생합니다." - -#: src/libslic3r/Print.cpp:1188 -msgid "Some objects are too close; your extruder will collide with them." -msgstr "" -"일부 객체(object)가 너무 가깝습니다. 귀하의 압출기가 그들과 충돌합니다." - -#: src/libslic3r/Print.cpp:1203 -msgid "" -"Some objects are too tall and cannot be printed without extruder collisions." -msgstr "일부 객체(object)는 너무 크고 익스트루더 충돌없이 인쇄 할 수 없습니다." - -#: src/libslic3r/Print.cpp:1213 -msgid "The Spiral Vase option can only be used when printing a single object." -msgstr "" -"나선형 꽃병(Spiral Vase) 옵션은 단일 객체(object)를 인쇄 할 때만 사용할 수 있" -"습니다." - -#: src/libslic3r/Print.cpp:1220 -msgid "" -"The Spiral Vase option can only be used when printing single material " -"objects." -msgstr "" -"나선형 꽃병 옵션(Spiral Vase)은 단일 재료 객체(object)를 인쇄 할 때만 사용할 " -"수 있습니다." - -#: src/libslic3r/Print.cpp:1233 -msgid "" -"The wipe tower is only supported if all extruders have the same nozzle " -"diameter and use filaments of the same diameter." -msgstr "" -"모든 압출기 의 노즐 직경이 동일하고 동일한 직경의 필라멘트를 사용하는 경우에" -"만 와이프 타워가 지원됩니다." - -#: src/libslic3r/Print.cpp:1238 -msgid "" -"The Wipe Tower is currently only supported for the Marlin, RepRap/Sprinter " -"and Repetier G-code flavors." -msgstr "" -"와이프 타워는 현재 말린, RepRap/Sprinter 및 리피티어에 대해서만 G-code지원 됩" -"니다." - -#: src/libslic3r/Print.cpp:1240 -msgid "" -"The Wipe Tower is currently only supported with the relative extruder " -"addressing (use_relative_e_distances=1)." -msgstr "" -"와이프 타워는 현재 상대적 압출기 어드레싱 (use_relative_e_distances = 1)에서" -"만 지원됩니다." - -#: src/libslic3r/Print.cpp:1242 -msgid "Ooze prevention is currently not supported with the wipe tower enabled." -msgstr "" -"현재 와이프 타워를 사용하도록 설정되어 있는 경우 스모즈 방지 기능이 지원되지 " -"않습니다." - -#: src/libslic3r/Print.cpp:1244 -msgid "" -"The Wipe Tower currently does not support volumetric E (use_volumetric_e=0)." -msgstr "와이프 타워는 현재 볼륨 E(use_volumetric_e=0)를 지원하지 않습니다." - -#: src/libslic3r/Print.cpp:1246 -msgid "" -"The Wipe Tower is currently not supported for multimaterial sequential " -"prints." -msgstr "와이프 타워는 현재 다중 재질 순차 인쇄에 지원되지 않습니다." - -#: src/libslic3r/Print.cpp:1267 -msgid "" -"The Wipe Tower is only supported for multiple objects if they have equal " -"layer heights" -msgstr "" -"와이프 타워 (Wipe Tower)는 같은 레이어 높이에 경우 여러 객체(object)에 대해서" -"만 지원됩니다" - -#: src/libslic3r/Print.cpp:1269 -msgid "" -"The Wipe Tower is only supported for multiple objects if they are printed " -"over an equal number of raft layers" -msgstr "" -"와이프 타워는 같은 수의 라프트 레이어 위에 인쇄 된 경우 여러 객체(object)에 " -"대해서만 지원됩니다" - -#: src/libslic3r/Print.cpp:1271 -msgid "" -"The Wipe Tower is only supported for multiple objects if they are printed " -"with the same support_material_contact_distance" -msgstr "" -"와이프 타워는 동일한 support_material_contact_distance로 인쇄 된 경우 여러 객" -"체(object)에 대해서만 지원됩니다" - -#: src/libslic3r/Print.cpp:1273 -msgid "" -"The Wipe Tower is only supported for multiple objects if they are sliced " -"equally." -msgstr "" -"와이프 타워는 똑같이 슬라이스 된 경우 여러 객체(object)에 대해서만 지원됩니" -"다." - -#: src/libslic3r/Print.cpp:1315 -msgid "" -"The Wipe tower is only supported if all objects have the same variable layer " -"height" -msgstr "" -"모든 오브젝트의 가변 레이어 높이가 같은 경우에만 지우기 타워가 지원됩니다." - -#: src/libslic3r/Print.cpp:1341 -msgid "" -"One or more object were assigned an extruder that the printer does not have." -msgstr "하나 이상의 객체(object)에 프린터에없는 압출기가 지정되었습니다." - -#: src/libslic3r/Print.cpp:1350 -msgid "%1%=%2% mm is too low to be printable at a layer height %3% mm" -msgstr "%1%=%2% mm가 너무 낮아 레이어 높이 %3% mm에서 인쇄할 수 없습니다." - -#: src/libslic3r/Print.cpp:1353 -msgid "Excessive %1%=%2% mm to be printable with a nozzle diameter %3% mm" -msgstr "노즐 직경 %3% mm로 인쇄할 수 있는 과도한 %1%=%2% mm" - -#: src/libslic3r/Print.cpp:1364 -msgid "" -"Printing with multiple extruders of differing nozzle diameters. If support " -"is to be printed with the current extruder (support_material_extruder == 0 " -"or support_material_interface_extruder == 0), all nozzles have to be of the " -"same diameter." -msgstr "" -"노즐 지름이 다른 여러 압출기로 인쇄. 지원이 현재 압출기 " -"(support_material_extruder == 0 또는 support_material_interface_extruder == " -"0)로 인쇄되는 경우 모든 노즐은 동일한 지름이어야합니다." - -#: src/libslic3r/Print.cpp:1372 -msgid "" -"For the Wipe Tower to work with the soluble supports, the support layers " -"need to be synchronized with the object layers." -msgstr "" -"와이프 타워가 가용성 지지체와 함께 작동 하려면 서포트 레이어를 객체(object) " -"레이어와 동기화 해야 합니다." - -#: src/libslic3r/Print.cpp:1376 -msgid "" -"The Wipe Tower currently supports the non-soluble supports only if they are " -"printed with the current extruder without triggering a tool change. (both " -"support_material_extruder and support_material_interface_extruder need to be " -"set to 0)." -msgstr "" -"와이프 타워는 현재 공구 교체를 트리거하지 않고 현재의 압출기로 인쇄 하는 경우" -"에만 비가용성 서포트를 지원 합니다. (support_material_extruder과 " -"support_material_interface_extruder 모두 0으로 설정 해야 합니다.)" - -#: src/libslic3r/Print.cpp:1398 -msgid "First layer height can't be greater than nozzle diameter" -msgstr "첫번째 레이어 높이는 노즐 직경보다 클 수 없습니다" - -#: src/libslic3r/Print.cpp:1403 -msgid "Layer height can't be greater than nozzle diameter" -msgstr "레이어 높이는 노즐 직경보다 클 수 없습니다" - -#: src/libslic3r/Print.cpp:1557 -msgid "Infilling layers" -msgstr "레이어 채우기" - -#: src/libslic3r/Print.cpp:1577 -msgid "Generating skirt" -msgstr "스커트 생성" - -#: src/libslic3r/Print.cpp:1585 -msgid "Generating brim" -msgstr "브림 생성" - -#: src/libslic3r/Print.cpp:1609 -msgid "Exporting G-code" -msgstr "G 코드 내보내기" - -#: src/libslic3r/Print.cpp:1613 -msgid "Generating G-code" -msgstr "G 코드 생성" - -#: src/libslic3r/SLAPrint.cpp:613 -msgid "" -"Cannot proceed without support points! Add support points or disable support " -"generation." -msgstr "" -"서포트 포인트 없이 진행할 수 없습니다! 서포트 지점을 추가 하거나 서포트 생성" -"을 사용 하지 않도록 설정 합니다." - -#: src/libslic3r/SLAPrint.cpp:625 -msgid "" -"Elevation is too low for object. Use the \"Pad around object\" feature to " -"print the object without elevation." -msgstr "" -"객체의 고도가 너무 낮습니다. \"오브젝트 주위 패드\" 피쳐를 사용하여 고도 없" -"이 오브젝트를 인쇄합니다." - -#: src/libslic3r/SLAPrint.cpp:631 -msgid "" -"The endings of the support pillars will be deployed on the gap between the " -"object and the pad. 'Support base safety distance' has to be greater than " -"the 'Pad object gap' parameter to avoid this." -msgstr "" -"서포트 기둥 끝은 객체(object)와 패드 사이의 간격에 배치됩니다. 이를 방지하기 " -"위해 '베이스 서포트 안전 거리'는 '패드 객체(object) 갭' 매개변수보다 커야 합" -"니다." - -#: src/libslic3r/SLAPrint.cpp:646 -msgid "Exposition time is out of printer profile bounds." -msgstr "박람회 시간이 프린터 프로파일 범위를 벗어났습니다." - -#: src/libslic3r/SLAPrint.cpp:653 -msgid "Initial exposition time is out of printer profile bounds." -msgstr "초기 박람회 시간이 프린터 프로파일 범위를 벗어났습니다." - -#: src/libslic3r/SLAPrint.cpp:760 -msgid "Slicing done" -msgstr "슬라이싱 완료" - -#: src/libslic3r/SLAPrintSteps.cpp:41 -msgid "Hollowing model" -msgstr "속이 빈 모델" - -#: src/libslic3r/SLAPrintSteps.cpp:42 -msgid "Drilling holes into model." -msgstr "모델에 구멍을 드릴링합니다." - -#: src/libslic3r/SLAPrintSteps.cpp:43 -msgid "Slicing model" -msgstr "슬라이싱 모델" - -#: src/libslic3r/SLAPrintSteps.cpp:44 src/libslic3r/SLAPrintSteps.cpp:308 -msgid "Generating support points" -msgstr "서포트 지점 생성" - -#: src/libslic3r/SLAPrintSteps.cpp:45 -msgid "Generating support tree" -msgstr "서포트 트리 생성" - -#: src/libslic3r/SLAPrintSteps.cpp:46 -msgid "Generating pad" -msgstr "패드 생성" - -#: src/libslic3r/SLAPrintSteps.cpp:47 -msgid "Slicing supports" -msgstr "슬라이싱 서포트즈" - -#: src/libslic3r/SLAPrintSteps.cpp:62 -msgid "Merging slices and calculating statistics" -msgstr "슬라이스 병합 및 통계 계산" - -#: src/libslic3r/SLAPrintSteps.cpp:63 -msgid "Rasterizing layers" -msgstr "레이어 래스터화" - -#: src/libslic3r/SLAPrintSteps.cpp:154 -msgid "" -"Drilling holes into the mesh failed. This is usually caused by broken model. " -"Try to fix it first." -msgstr "" -"메시에 구멍을 뚫는 데 실패했습니다. 이는 일반적으로 모델이 손상되어 발생합니" -"다. 먼저 해결해 보십시오." - -#: src/libslic3r/SLAPrintSteps.cpp:202 -msgid "" -"Slicing had to be stopped due to an internal error: Inconsistent slice index." -msgstr "" -"내부 오류: 일치하지 않는 슬라이스 인덱스로 인해 슬라이싱을 중지해야 했습니다." - -#: src/libslic3r/SLAPrintSteps.cpp:365 src/libslic3r/SLAPrintSteps.cpp:374 -#: src/libslic3r/SLAPrintSteps.cpp:413 -msgid "Visualizing supports" -msgstr "시각화 지원" - -#: src/libslic3r/SLAPrintSteps.cpp:405 -msgid "No pad can be generated for this model with the current configuration" -msgstr "현재 구성으로 이 모델에 대해 패드를 생성할 수 없습니다." - -#: src/libslic3r/SLAPrintSteps.cpp:579 -msgid "" -"There are unprintable objects. Try to adjust support settings to make the " -"objects printable." -msgstr "" -"인쇄할 수 없는 개체가 있습니다. 지원 설정을 조정하여 개체를 인쇄할 수 있도록 " -"합니다." - -#: src/libslic3r/PrintBase.cpp:71 -msgid "Failed processing of the output_filename_format template." -msgstr "아래 output_filename_format 템플리트의 처리에 실패했습니다." - -#: src/libslic3r/PrintConfig.cpp:43 src/libslic3r/PrintConfig.cpp:44 -msgid "Printer technology" -msgstr "프린터 기술" - -#: src/libslic3r/PrintConfig.cpp:51 -msgid "Bed shape" -msgstr "배드 모양" - -#: src/libslic3r/PrintConfig.cpp:56 -msgid "Bed custom texture" -msgstr "배드 사용자 정의 질감" - -#: src/libslic3r/PrintConfig.cpp:61 -msgid "Bed custom model" -msgstr "배드 사용자 정의 모델" - -#: src/libslic3r/PrintConfig.cpp:66 -msgid "Picture sizes to be stored into a .gcode and .sl1 files" -msgstr ".gcode 및 .sl1 파일에 저장할 그림 크기" - -#: src/libslic3r/PrintConfig.cpp:73 -msgid "" -"This setting controls the height (and thus the total number) of the slices/" -"layers. Thinner layers give better accuracy but take more time to print." -msgstr "" -"이 설정은 슬라이스/레이어의 높이(따라서 총 수)를 제어합니다. 얇은 층은 더 나" -"은 정확성을 제공하지만 인쇄하는 데는 더 많은 시간이 걸린다." - -#: src/libslic3r/PrintConfig.cpp:80 -msgid "Max print height" -msgstr "최대 프린트 높이" - -#: src/libslic3r/PrintConfig.cpp:81 -msgid "" -"Set this to the maximum height that can be reached by your extruder while " -"printing." -msgstr "인쇄 중에 익스트루더가 도달 할 수있는 최대 높이로 설정하십시오." - -#: src/libslic3r/PrintConfig.cpp:87 -msgid "Slice gap closing radius" -msgstr "슬라이스 간격 닫힘 반경" - -#: src/libslic3r/PrintConfig.cpp:89 -msgid "" -"Cracks smaller than 2x gap closing radius are being filled during the " -"triangle mesh slicing. The gap closing operation may reduce the final print " -"resolution, therefore it is advisable to keep the value reasonably low." -msgstr "" -"삼각형 메쉬 슬라이싱 중에, 2배 간격 폐쇄 반경 보다 작은 균열이 채워집니다. " -"틈 닫기 작업은 최종 인쇄 해상도를 줄일 수 있으므로 값을 합리적으로 낮게 유지 " -"하는 것이 좋습니다." - -#: src/libslic3r/PrintConfig.cpp:97 -msgid "Hostname, IP or URL" -msgstr "호스트 이름(Hostname), IP or URL" - -#: src/libslic3r/PrintConfig.cpp:98 -msgid "" -"Slic3r can upload G-code files to a printer host. This field should contain " -"the hostname, IP address or URL of the printer host instance." -msgstr "" -"Slic3r는 프린터 호스트에 G 코드 파일을 업로드할 수 있습니다. 이 필드는 호스" -"트 이름, IP 주소 또는 프린터 호스트 복제본의 URL을 포함 해야 합니다." - -#: src/libslic3r/PrintConfig.cpp:104 -msgid "API Key / Password" -msgstr "API 키/암호" - -#: src/libslic3r/PrintConfig.cpp:105 -msgid "" -"Slic3r can upload G-code files to a printer host. This field should contain " -"the API Key or the password required for authentication." -msgstr "" -"Slic3r는 프린터 호스트에 G 코드 파일을 업로드할 수 있습니다. 이 필드는 API " -"키 또는 인증에 필요한 암호를 포함 해야 합니다." - -#: src/libslic3r/PrintConfig.cpp:111 -msgid "HTTPS CA File" -msgstr "HTTPS CA 파일" - -#: src/libslic3r/PrintConfig.cpp:112 -msgid "" -"Custom CA certificate file can be specified for HTTPS OctoPrint connections, " -"in crt/pem format. If left blank, the default OS CA certificate repository " -"is used." -msgstr "" -"사용자 지정 CA 인증서 파일은 crt/pem 형식의 HTTPS 옥토 프린트 연결에 대해 지" -"정할 수 있습니다. 비워 두면 기본 OS CA 인증서 리포지토리가 사용 됩니다." - -#: src/libslic3r/PrintConfig.cpp:126 -msgid "Avoid crossing perimeters" -msgstr "교체된 둘레를 피하세요." - -#: src/libslic3r/PrintConfig.cpp:127 -msgid "" -"Optimize travel moves in order to minimize the crossing of perimeters. This " -"is mostly useful with Bowden extruders which suffer from oozing. This " -"feature slows down both the print and the G-code generation." -msgstr "" -"둘레의 교차를 최소화하기 위해 여행 이동을 최적화하십시오. 이것은 보잉 " -"(Bowling) 압출기가 흘러 나오기 쉬운 경우에 주로 유용합니다. 이 기능을 사용하" -"면 인쇄 및 G 코드 생성 속도가 느려집니다." - -#: src/libslic3r/PrintConfig.cpp:134 src/libslic3r/PrintConfig.cpp:2074 -msgid "Other layers" -msgstr "다른 레이어" - -#: src/libslic3r/PrintConfig.cpp:135 -msgid "" -"Bed temperature for layers after the first one. Set this to zero to disable " -"bed temperature control commands in the output." -msgstr "" -"첫 번째 레이어 이후의 레이어 온도. 이 값을 0으로 설정하면 출력에서 ​​베드 온도 " -"제어 명령을 비활성화합니다." - -#: src/libslic3r/PrintConfig.cpp:137 -msgid "Bed temperature" -msgstr "배드 온도" - -#: src/libslic3r/PrintConfig.cpp:144 -msgid "" -"This custom code is inserted at every layer change, right before the Z move. " -"Note that you can use placeholder variables for all Slic3r settings as well " -"as [layer_num] and [layer_z]." -msgstr "" -"이 사용자 정의 코드는 Z 이동 직전의 모든 레이어 변경에 삽입됩니다. [Slide3r] " -"설정과 [layer_num] 및 [layer_z]에 대한 자리 표시 자 변수를 사용할 수 있습니" -"다." - -#: src/libslic3r/PrintConfig.cpp:154 -msgid "Between objects G-code" -msgstr "객체(object) 간 G 코드" - -#: src/libslic3r/PrintConfig.cpp:155 -msgid "" -"This code is inserted between objects when using sequential printing. By " -"default extruder and bed temperature are reset using non-wait command; " -"however if M104, M109, M140 or M190 are detected in this custom code, Slic3r " -"will not add temperature commands. Note that you can use placeholder " -"variables for all Slic3r settings, so you can put a \"M109 " -"S[first_layer_temperature]\" command wherever you want." -msgstr "" -"이 코드는 순차 인쇄를 사용할 때 객체(object)간에 삽입됩니다. 기본적으로 익스" -"트루더 및 베드 온도는 대기 모드가 아닌 명령을 사용하여 재설정됩니다. 그러나 " -"이 사용자 코드에서 M104, M109, M140 또는 M190이 감지되면 Slic3r은 온도 명령" -"을 추가하지 않습니다. 모든 Slic3r 설정에 자리 표시 변수를 사용할 수 있으므로 " -"원하는 위치에 \"M109 S [first_layer_temperature]\"명령을 넣을 수 있습니다." - -#: src/libslic3r/PrintConfig.cpp:166 -msgid "Number of solid layers to generate on bottom surfaces." -msgstr "바닥면에 생성 할 솔리드 레이어의 수." - -#: src/libslic3r/PrintConfig.cpp:167 -msgid "Bottom solid layers" -msgstr "바닥 단일 레이어" - -#: src/libslic3r/PrintConfig.cpp:175 -msgid "" -"The number of bottom solid layers is increased above bottom_solid_layers if " -"necessary to satisfy minimum thickness of bottom shell." -msgstr "" -"바닥 단색 층의 수는 바닥 쉘의 최소 두께를 만족시키기 위해 필요한 경우 " -"bottom_solid_layers 이상으로 증가한다." - -#: src/libslic3r/PrintConfig.cpp:177 -msgid "Minimum bottom shell thickness" -msgstr "최소 하단 쉘 두께" - -#: src/libslic3r/PrintConfig.cpp:183 -msgid "Bridge" -msgstr "브리지" - -#: src/libslic3r/PrintConfig.cpp:184 -msgid "" -"This is the acceleration your printer will use for bridges. Set zero to " -"disable acceleration control for bridges." -msgstr "" -"이것은 프린터가 브릿지에 사용할 가속도입니다. 브리지의 가속 제어를 사용하지 " -"않으려면 0으로 설정하십시오." - -#: src/libslic3r/PrintConfig.cpp:186 src/libslic3r/PrintConfig.cpp:329 -#: src/libslic3r/PrintConfig.cpp:863 src/libslic3r/PrintConfig.cpp:985 -#: src/libslic3r/PrintConfig.cpp:1155 src/libslic3r/PrintConfig.cpp:1208 -#: src/libslic3r/PrintConfig.cpp:1219 src/libslic3r/PrintConfig.cpp:1412 -msgid "mm/s²" -msgstr "mm/s ²" - -#: src/libslic3r/PrintConfig.cpp:192 -msgid "Bridging angle" -msgstr "브릿지 각도" - -#: src/libslic3r/PrintConfig.cpp:194 -msgid "" -"Bridging angle override. If left to zero, the bridging angle will be " -"calculated automatically. Otherwise the provided angle will be used for all " -"bridges. Use 180° for zero angle." -msgstr "" -"브리징 각도 오버라이드(override)값이. 왼쪽으로 0 일 경우 브리징 각도가 자동으" -"로 계산됩니다. 그렇지 않으면 제공된 각도가 모든 브리지에 사용됩니다. 각도 제" -"로는 180 °를 사용하십시오." - -#: src/libslic3r/PrintConfig.cpp:197 src/libslic3r/PrintConfig.cpp:781 -#: src/libslic3r/PrintConfig.cpp:1649 src/libslic3r/PrintConfig.cpp:1659 -#: src/libslic3r/PrintConfig.cpp:1904 src/libslic3r/PrintConfig.cpp:2059 -#: src/libslic3r/PrintConfig.cpp:2257 src/libslic3r/PrintConfig.cpp:2728 -#: src/libslic3r/PrintConfig.cpp:2849 -msgid "°" -msgstr "°" - -#: src/libslic3r/PrintConfig.cpp:203 -msgid "Bridges fan speed" -msgstr "브릿지 팬 속도" - -#: src/libslic3r/PrintConfig.cpp:204 -msgid "This fan speed is enforced during all bridges and overhangs." -msgstr "이 팬 속도는 모든 브릿지 및 오버행 중에 적용됩니다." - -#: src/libslic3r/PrintConfig.cpp:205 src/libslic3r/PrintConfig.cpp:793 -#: src/libslic3r/PrintConfig.cpp:1228 src/libslic3r/PrintConfig.cpp:1291 -#: src/libslic3r/PrintConfig.cpp:1541 src/libslic3r/PrintConfig.cpp:2435 -#: src/libslic3r/PrintConfig.cpp:2768 -msgid "%" -msgstr "%" - -#: src/libslic3r/PrintConfig.cpp:212 -msgid "Bridge flow ratio" -msgstr "브릿지 유량(flow)값" - -#: src/libslic3r/PrintConfig.cpp:214 -msgid "" -"This factor affects the amount of plastic for bridging. You can decrease it " -"slightly to pull the extrudates and prevent sagging, although default " -"settings are usually good and you should experiment with cooling (use a fan) " -"before tweaking this." -msgstr "" -"이 요인은 브리징을위한 플라스틱의 양에 영향을 미칩니다. 압출 성형물을 잡아 당" -"겨 처짐을 방지하기 위해 약간 줄일 수 있지만 기본 설정은 일반적으로 좋지만이 " -"문제를 해결하기 전에 냉각 (팬 사용)을 시도해야합니다." - -#: src/libslic3r/PrintConfig.cpp:224 -msgid "Bridges" -msgstr "브릿지(Bridges)" - -#: src/libslic3r/PrintConfig.cpp:226 -msgid "Speed for printing bridges." -msgstr "브릿지 인쇄 속도." - -#: src/libslic3r/PrintConfig.cpp:227 src/libslic3r/PrintConfig.cpp:610 -#: src/libslic3r/PrintConfig.cpp:618 src/libslic3r/PrintConfig.cpp:627 -#: src/libslic3r/PrintConfig.cpp:635 src/libslic3r/PrintConfig.cpp:662 -#: src/libslic3r/PrintConfig.cpp:681 src/libslic3r/PrintConfig.cpp:923 -#: src/libslic3r/PrintConfig.cpp:1051 src/libslic3r/PrintConfig.cpp:1137 -#: src/libslic3r/PrintConfig.cpp:1173 src/libslic3r/PrintConfig.cpp:1186 -#: src/libslic3r/PrintConfig.cpp:1197 src/libslic3r/PrintConfig.cpp:1250 -#: src/libslic3r/PrintConfig.cpp:1309 src/libslic3r/PrintConfig.cpp:1442 -#: src/libslic3r/PrintConfig.cpp:1616 src/libslic3r/PrintConfig.cpp:1625 -#: src/libslic3r/PrintConfig.cpp:2038 src/libslic3r/PrintConfig.cpp:2164 -msgid "mm/s" -msgstr "mm/s" - -#: src/libslic3r/PrintConfig.cpp:234 -msgid "Brim width" -msgstr "브림 폭" - -#: src/libslic3r/PrintConfig.cpp:235 -msgid "" -"Horizontal width of the brim that will be printed around each object on the " -"first layer." -msgstr "" -"첫 번째 레이어의 각 객체(object) 주위에 인쇄 될 가장자리의 가로 폭입니다." - -#: src/libslic3r/PrintConfig.cpp:242 -msgid "Clip multi-part objects" -msgstr "여러 부품(Part) 객체(object) 클립" - -#: src/libslic3r/PrintConfig.cpp:243 -msgid "" -"When printing multi-material objects, this settings will make Slic3r to clip " -"the overlapping object parts one by the other (2nd part will be clipped by " -"the 1st, 3rd part will be clipped by the 1st and 2nd etc)." -msgstr "" -"다중 메터리얼(multi-material) 객체(object)를 인쇄 할 때이 설정을 사용하면 겹" -"치는 객체(object) 부품(Part)를 서로 겹쳐서 잘라낼 수 있습니다 (두 번째 부분" -"은 첫 번째 부분에서 클리핑되며 세 번째 부분은 첫 번째 및 두 번째 부분에서 잘" -"립니다)." - -#: src/libslic3r/PrintConfig.cpp:250 -msgid "Colorprint height" -msgstr "컬러 인쇄 높이" - -#: src/libslic3r/PrintConfig.cpp:251 -msgid "Heights at which a filament change is to occur." -msgstr "필라멘트 체인지가 발생 하는 높이." - -#: src/libslic3r/PrintConfig.cpp:261 -msgid "Compatible printers condition" -msgstr "호환 가능한 프린터 조건" - -#: src/libslic3r/PrintConfig.cpp:262 -msgid "" -"A boolean expression using the configuration values of an active printer " -"profile. If this expression evaluates to true, this profile is considered " -"compatible with the active printer profile." -msgstr "" -"활성 프린터 프로파일의 구성 값을 사용하는 부울 표현식. 이 표현식이 true로 평" -"가되면이 프로필은 활성 프린터 프로필과 호환되는 것으로 간주됩니다." - -#: src/libslic3r/PrintConfig.cpp:276 -msgid "Compatible print profiles condition" -msgstr "호환 되는 인쇄 프로 파일 조건" - -#: src/libslic3r/PrintConfig.cpp:277 -msgid "" -"A boolean expression using the configuration values of an active print " -"profile. If this expression evaluates to true, this profile is considered " -"compatible with the active print profile." -msgstr "" -"활성 인쇄 프로 파일의 구성 값을 사용하는 부울식입니다. 이 식이 true로 평가 되" -"면, 이 프로필이 활성 인쇄 프로필과 호환 되는 것으로 간주 됩니다." - -#: src/libslic3r/PrintConfig.cpp:294 -msgid "Complete individual objects" -msgstr "개별 객체(object) 완성" - -#: src/libslic3r/PrintConfig.cpp:295 -msgid "" -"When printing multiple objects or copies, this feature will complete each " -"object before moving onto next one (and starting it from its bottom layer). " -"This feature is useful to avoid the risk of ruined prints. Slic3r should " -"warn and prevent you from extruder collisions, but beware." -msgstr "" -"여러 객체(object) 또는 사본을 인쇄 할 때이 객체(object)는 다음 객체(object)" -"로 이동하기 전에 각 객체(object)를 완성합니다 (맨 아래 레이어에서 시작). 이 " -"기능은 인쇄물이 망가지는 위험을 피할 때 유용합니다. Slic3r은 압출기 충돌을 경" -"고하고 예방해야하지만 조재봉선하십시오." - -#: src/libslic3r/PrintConfig.cpp:303 -msgid "Enable auto cooling" -msgstr "자동 냉각 사용" - -#: src/libslic3r/PrintConfig.cpp:304 -msgid "" -"This flag enables the automatic cooling logic that adjusts print speed and " -"fan speed according to layer printing time." -msgstr "" -"이 플래그는 레이어 인쇄 시간에 따라 인쇄 속도와 팬 속도를 조정하는 자동 냉각 " -"논리를 활성화합니다." - -#: src/libslic3r/PrintConfig.cpp:309 -msgid "Cooling tube position" -msgstr "냉각 튜브 위치" - -#: src/libslic3r/PrintConfig.cpp:310 -msgid "Distance of the center-point of the cooling tube from the extruder tip." -msgstr "압출기 팁에서 냉각 튜브의 중재봉선점까지의 거리 " - -#: src/libslic3r/PrintConfig.cpp:317 -msgid "Cooling tube length" -msgstr "냉각 튜브 길이" - -#: src/libslic3r/PrintConfig.cpp:318 -msgid "Length of the cooling tube to limit space for cooling moves inside it." -msgstr "내부의 냉각 이동을 위해 공간을 제한하는 냉각 튜브의 길이 " - -#: src/libslic3r/PrintConfig.cpp:326 -msgid "" -"This is the acceleration your printer will be reset to after the role-" -"specific acceleration values are used (perimeter/infill). Set zero to " -"prevent resetting acceleration at all." -msgstr "" -"역할 별 가속도 값이 사용 된 후에 프린터가 재설정되는 속도입니다 (둘레 / 충" -"전). 가속을 전혀 재설정하지 않으려면 0으로 설정하십시오." - -#: src/libslic3r/PrintConfig.cpp:335 -msgid "Default filament profile" -msgstr "기본 필라멘트 프로파일" - -#: src/libslic3r/PrintConfig.cpp:336 -msgid "" -"Default filament profile associated with the current printer profile. On " -"selection of the current printer profile, this filament profile will be " -"activated." -msgstr "" -"현재 프린터 프로파일과 연관된 기본 필라멘트 프로파일. 현재 프린터 프로파일을 " -"선택하면 이 필라멘트 프로파일이 활성화됩니다." - -#: src/libslic3r/PrintConfig.cpp:342 -msgid "Default print profile" -msgstr "기본 인쇄 프로파일" - -#: src/libslic3r/PrintConfig.cpp:343 src/libslic3r/PrintConfig.cpp:2593 -#: src/libslic3r/PrintConfig.cpp:2604 -msgid "" -"Default print profile associated with the current printer profile. On " -"selection of the current printer profile, this print profile will be " -"activated." -msgstr "" -"현재 프린터 프로파일과 연관된 기본 인쇄 프로파일. 현재 프린터 프로파일을 선택" -"하면이 인쇄 프로파일이 활성화됩니다." - -#: src/libslic3r/PrintConfig.cpp:349 -msgid "Disable fan for the first" -msgstr "첫 번째 팬 사용 중지" - -#: src/libslic3r/PrintConfig.cpp:350 -msgid "" -"You can set this to a positive value to disable fan at all during the first " -"layers, so that it does not make adhesion worse." -msgstr "" -"이 값을 양수 값으로 설정하면 첫 번째 레이어에서 팬을 사용하지 않도록 설정하" -"여 접착력을 악화시키지 않습니다." - -#: src/libslic3r/PrintConfig.cpp:359 -msgid "Don't support bridges" -msgstr "서포트와 브릿지를 사용하지 않음" - -#: src/libslic3r/PrintConfig.cpp:361 -msgid "" -"Experimental option for preventing support material from being generated " -"under bridged areas." -msgstr "" -"브릿지 영역 아래에 서포팅 재료가 생성되는 것을 방지하기위한 실험적 옵션." - -#: src/libslic3r/PrintConfig.cpp:367 -msgid "Distance between copies" -msgstr "복사본 간 거리" - -#: src/libslic3r/PrintConfig.cpp:368 -msgid "Distance used for the auto-arrange feature of the plater." -msgstr "플래이터(plater)의 자동 정렬 기능에 사용되는 거리입니다." - -#: src/libslic3r/PrintConfig.cpp:375 -msgid "Elephant foot compensation" -msgstr "코끼리 발(Elephant foot) 보상값" - -#: src/libslic3r/PrintConfig.cpp:377 -msgid "" -"The first layer will be shrunk in the XY plane by the configured value to " -"compensate for the 1st layer squish aka an Elephant Foot effect." -msgstr "" -"첫 번째 레이어는 구성 요소 값에 따라 XY 평면에서 수축되어 일층 스 퀴시 코끼리" -"발(Elephant Foot) 효과를 보완합니다." - -#: src/libslic3r/PrintConfig.cpp:386 -msgid "" -"This end procedure is inserted at the end of the output file. Note that you " -"can use placeholder variables for all PrusaSlicer settings." -msgstr "" -"이 끝 프로시저는 출력 파일의 끝에 삽입됩니다. 모든 PrusaSlicer 설정에 자리 표" -"시자 변수를 사용할 수 있습니다." - -#: src/libslic3r/PrintConfig.cpp:396 -msgid "" -"This end procedure is inserted at the end of the output file, before the " -"printer end gcode (and before any toolchange from this filament in case of " -"multimaterial printers). Note that you can use placeholder variables for all " -"PrusaSlicer settings. If you have multiple extruders, the gcode is processed " -"in extruder order." -msgstr "" -"이 끝 프로시저는 프린터가 gcode를 종료하기 전에 출력 파일의 끝에 삽입됩니다" -"(다중 재질 프린터의 경우 이 필라멘트에서 공구를 변경하기 전에). 모든 " -"PrusaSlicer 설정에 자리 표시자 변수를 사용할 수 있습니다. 압출기가 여러 개 있" -"는 경우 gcode는 압출기 순서로 처리됩니다." - -#: src/libslic3r/PrintConfig.cpp:407 -msgid "Ensure vertical shell thickness" -msgstr "수직 쉘(shell) 두께 확인" - -#: src/libslic3r/PrintConfig.cpp:409 -msgid "" -"Add solid infill near sloping surfaces to guarantee the vertical shell " -"thickness (top+bottom solid layers)." -msgstr "" -"경사 표면 근처에 솔리드 인필을 추가하여 수직 셸 두께(상단+하단 솔리드 레이어)" -"를 보장하십시오." - -#: src/libslic3r/PrintConfig.cpp:415 -msgid "Top fill pattern" -msgstr "상단 채우기 패턴" - -#: src/libslic3r/PrintConfig.cpp:417 -msgid "" -"Fill pattern for top infill. This only affects the top visible layer, and " -"not its adjacent solid shells." -msgstr "" -"상단 채우기의 채우기 패턴. 이는 인접 한 솔리드 쉘이 아니라 보이는 상위 레이어" -"에만 영향을 줍니다." - -#: src/libslic3r/PrintConfig.cpp:425 src/libslic3r/PrintConfig.cpp:844 -#: src/libslic3r/PrintConfig.cpp:2019 -msgid "Rectilinear" -msgstr "직선면(Rectilinear)" - -#: src/libslic3r/PrintConfig.cpp:426 src/libslic3r/PrintConfig.cpp:850 -msgid "Concentric" -msgstr "동심원(Concentric)" - -#: src/libslic3r/PrintConfig.cpp:427 src/libslic3r/PrintConfig.cpp:854 -msgid "Hilbert Curve" -msgstr "힐버트 곡선(Hilbert Curve)" - -#: src/libslic3r/PrintConfig.cpp:428 src/libslic3r/PrintConfig.cpp:855 -msgid "Archimedean Chords" -msgstr "아르키메데우스(Archimedean Chords)" - -#: src/libslic3r/PrintConfig.cpp:429 src/libslic3r/PrintConfig.cpp:856 -msgid "Octagram Spiral" -msgstr "옥타그램 나선(Octagram Spiral)" - -#: src/libslic3r/PrintConfig.cpp:435 -msgid "Bottom fill pattern" -msgstr "아래쪽 채우기 패턴" - -#: src/libslic3r/PrintConfig.cpp:437 -msgid "" -"Fill pattern for bottom infill. This only affects the bottom external " -"visible layer, and not its adjacent solid shells." -msgstr "" -"하단 채우기의 채우기 패턴. 이는 인접 한 솔리드 쉘이 아니라 아래쪽에 보이는 외" -"부 레이어에만 영향을 줍니다." - -#: src/libslic3r/PrintConfig.cpp:446 src/libslic3r/PrintConfig.cpp:457 -msgid "External perimeters" -msgstr "외측 둘레" - -#: src/libslic3r/PrintConfig.cpp:448 -msgid "" -"Set this to a non-zero value to set a manual extrusion width for external " -"perimeters. If left zero, default extrusion width will be used if set, " -"otherwise 1.125 x nozzle diameter will be used. If expressed as percentage " -"(for example 200%), it will be computed over layer height." -msgstr "" -"외부 경계에 대한 수동 압출 폭을 설정하려면 이 값을 0이 아닌 값으로 설정하십시" -"오. 0인 경우 기본 압출 너비가 사용되며, 그렇지 않으면 1.125 x 노즐 직경이 사" -"용된다. 백분율(예: 200%)로 표현되는 경우, 레이어 높이에 걸쳐 계산됩니다." - -#: src/libslic3r/PrintConfig.cpp:451 src/libslic3r/PrintConfig.cpp:560 -#: src/libslic3r/PrintConfig.cpp:883 src/libslic3r/PrintConfig.cpp:896 -#: src/libslic3r/PrintConfig.cpp:1016 src/libslic3r/PrintConfig.cpp:1042 -#: src/libslic3r/PrintConfig.cpp:1432 src/libslic3r/PrintConfig.cpp:1771 -#: src/libslic3r/PrintConfig.cpp:1893 src/libslic3r/PrintConfig.cpp:1961 -#: src/libslic3r/PrintConfig.cpp:2121 -msgid "mm or %" -msgstr "mm/s 또는 %" - -#: src/libslic3r/PrintConfig.cpp:459 -msgid "" -"This separate setting will affect the speed of external perimeters (the " -"visible ones). If expressed as percentage (for example: 80%) it will be " -"calculated on the perimeters speed setting above. Set to zero for auto." -msgstr "" -"이 별도의 설정은 외부 경계선(시각적 경계선)의 속도에 영향을 미친다. 백분율" -"(예: 80%)로 표현되는 경우 위의 Perimeter 속도 설정에 따라 계산된다. 자동을 위" -"해 0으로 설정한다." - -#: src/libslic3r/PrintConfig.cpp:462 src/libslic3r/PrintConfig.cpp:905 -#: src/libslic3r/PrintConfig.cpp:1730 src/libslic3r/PrintConfig.cpp:1782 -#: src/libslic3r/PrintConfig.cpp:2005 src/libslic3r/PrintConfig.cpp:2134 -msgid "mm/s or %" -msgstr "mm/s 또는 %" - -#: src/libslic3r/PrintConfig.cpp:469 -msgid "External perimeters first" -msgstr "외부 경계선 먼저" - -#: src/libslic3r/PrintConfig.cpp:471 -msgid "" -"Print contour perimeters from the outermost one to the innermost one instead " -"of the default inverse order." -msgstr "" -"기본 역순 대신 가장 바깥쪽부터 가장 안쪽까지 윤곽선을 인쇄하십시오. 타겟 TTS" -"복사하기번역 저장번역 저장번역 수정." - -#: src/libslic3r/PrintConfig.cpp:477 -msgid "Extra perimeters if needed" -msgstr "필요한 경우 추가 둘레" - -#: src/libslic3r/PrintConfig.cpp:479 -#, no-c-format -msgid "" -"Add more perimeters when needed for avoiding gaps in sloping walls. Slic3r " -"keeps adding perimeters, until more than 70% of the loop immediately above " -"is supported." -msgstr "" -"경사 벽의 틈을 피하기 위해 필요한 경우 더 많은 둘래(perimeter)를 추가하십시" -"오. 위의 루프의 70% of 이상이 지지될 때까지 Slic3r는 계속해서 둘ㄹ를 추가한" -"다." - -#: src/libslic3r/PrintConfig.cpp:489 -msgid "" -"The extruder to use (unless more specific extruder settings are specified). " -"This value overrides perimeter and infill extruders, but not the support " -"extruders." -msgstr "" -"사용할 압출부(더 구체적인 압출부 설정이 지정되지 않은 경우) 이 값은 경계 및 " -"압출부를 초과하지만 지원 압출자를 주입하지는 않는다." - -#: src/libslic3r/PrintConfig.cpp:501 -msgid "" -"Set this to the vertical distance between your nozzle tip and (usually) the " -"X carriage rods. In other words, this is the height of the clearance " -"cylinder around your extruder, and it represents the maximum depth the " -"extruder can peek before colliding with other printed objects." -msgstr "" -"이것을 노즐 팁과 (일반적으로) X 캐리지 로드 사이의 수직 거리로 설정하십시오. " -"다시 말하면, 이것은 당신의 압출기 주위의 틈새 실린더의 높이이며, 그것은 다른 " -"인쇄된 개체와 충돌하기 전에 압출기가 엿볼 수 있는 최대 깊이를 나타낸다." - -#: src/libslic3r/PrintConfig.cpp:512 -msgid "" -"Set this to the clearance radius around your extruder. If the extruder is " -"not centered, choose the largest value for safety. This setting is used to " -"check for collisions and to display the graphical preview in the plater." -msgstr "" -"이것을 당신의 압출기 주변의 간극 반경으로 설정하시오. 압출부가 중앙에 있지 않" -"으면 안전을 위해 가장 큰 값을 선택하십시오. 이 설정은 충돌 여부를 확인하고 플" -"래터에 그래픽 미리 보기를 표시하기 위해 사용된다." - -#: src/libslic3r/PrintConfig.cpp:522 -msgid "Extruder Color" -msgstr "익스트루더 컬러" - -#: src/libslic3r/PrintConfig.cpp:523 src/libslic3r/PrintConfig.cpp:584 -msgid "This is only used in the Slic3r interface as a visual help." -msgstr "이것은 시각적 도움말로 Slic3r 접점에서만 사용된다." - -#: src/libslic3r/PrintConfig.cpp:529 -msgid "Extruder offset" -msgstr "익스트루더 오프셋" - -#: src/libslic3r/PrintConfig.cpp:530 -msgid "" -"If your firmware doesn't handle the extruder displacement you need the G-" -"code to take it into account. This option lets you specify the displacement " -"of each extruder with respect to the first one. It expects positive " -"coordinates (they will be subtracted from the XY coordinate)." -msgstr "" -"펌웨어가 압출기 위치 변경을 처리하지 못하면 G 코드를 고려해야합니다. 이 옵션" -"을 사용하면 첫 번째 것에 대한 각 압출기의 변위를 지정할 수 있습니다. 양의 좌" -"표가 필요합니다 (XY 좌표에서 뺍니다)." - -#: src/libslic3r/PrintConfig.cpp:539 -msgid "Extrusion axis" -msgstr "압출 축" - -#: src/libslic3r/PrintConfig.cpp:540 -msgid "" -"Use this option to set the axis letter associated to your printer's extruder " -"(usually E but some printers use A)." -msgstr "" -"이 옵션을 사용하여 프린터의 압출기에 연결된 축 문자를 설정합니다 (보통 E이지" -"만 일부 프린터는 A를 사용합니다)." - -#: src/libslic3r/PrintConfig.cpp:545 -msgid "Extrusion multiplier" -msgstr "압출 승수" - -#: src/libslic3r/PrintConfig.cpp:546 -msgid "" -"This factor changes the amount of flow proportionally. You may need to tweak " -"this setting to get nice surface finish and correct single wall widths. " -"Usual values are between 0.9 and 1.1. If you think you need to change this " -"more, check filament diameter and your firmware E steps." -msgstr "" -"이 요소는 비례하여 유량의 양을 변경합니다. 멋진 서페이스 마무리와 단일 벽 너" -"비를 얻기 위해이 설정을 조정해야 할 수도 있습니다. 일반적인 값은 0.9와 1.1 사" -"이입니다. 이 값을 더 변경해야한다고 판단되면 필라멘트 직경과 펌웨어 E 단계를 " -"확인하십시오." - -#: src/libslic3r/PrintConfig.cpp:554 -msgid "Default extrusion width" -msgstr "기본 압출 폭" - -#: src/libslic3r/PrintConfig.cpp:556 -msgid "" -"Set this to a non-zero value to allow a manual extrusion width. If left to " -"zero, Slic3r derives extrusion widths from the nozzle diameter (see the " -"tooltips for perimeter extrusion width, infill extrusion width etc). If " -"expressed as percentage (for example: 230%), it will be computed over layer " -"height." -msgstr "" -"수동 압출 폭을 허용하려면이 값을 0이 아닌 값으로 설정하십시오. 0으로 남겨두" -"면 Slic3r은 노즐 직경에서 압출 폭을 도출합니다 (주변 압출 폭, 성형 압출 폭 등" -"의 툴팁 참조). 백분율로 표시되는 경우 (예 : 230 %) 레이어 높이를 기준으로 계" -"산됩니다." - -#: src/libslic3r/PrintConfig.cpp:566 -msgid "Keep fan always on" -msgstr "항상 팬 켜기" - -#: src/libslic3r/PrintConfig.cpp:567 -msgid "" -"If this is enabled, fan will never be disabled and will be kept running at " -"least at its minimum speed. Useful for PLA, harmful for ABS." -msgstr "" -"이 기능을 사용하면 팬이 비활성화되지 않으며 최소한 최소 속도로 계속 회전합니" -"다. PLA에 유용하며 ABS에 해롭다." - -#: src/libslic3r/PrintConfig.cpp:572 -msgid "Enable fan if layer print time is below" -msgstr "레이어 인쇄 시간이 미만인 경우 팬 활성화" - -#: src/libslic3r/PrintConfig.cpp:573 -msgid "" -"If layer print time is estimated below this number of seconds, fan will be " -"enabled and its speed will be calculated by interpolating the minimum and " -"maximum speeds." -msgstr "" -"레이어 인쇄 시간이이 초 미만으로 예상되는 경우 팬이 활성화되고 속도는 최소 " -"및 최대 속도를 보간하여 계산됩니다." - -#: src/libslic3r/PrintConfig.cpp:575 src/libslic3r/PrintConfig.cpp:1717 -msgid "approximate seconds" -msgstr "근사치 초" - -#: src/libslic3r/PrintConfig.cpp:589 -msgid "Filament notes" -msgstr "필라멘트 메모" - -#: src/libslic3r/PrintConfig.cpp:590 -msgid "You can put your notes regarding the filament here." -msgstr "여기에 필라멘트에 관한 메모를 넣을 수 있다." - -#: src/libslic3r/PrintConfig.cpp:598 src/libslic3r/PrintConfig.cpp:1256 -msgid "Max volumetric speed" -msgstr "최대 체적 속도" - -#: src/libslic3r/PrintConfig.cpp:599 -msgid "" -"Maximum volumetric speed allowed for this filament. Limits the maximum " -"volumetric speed of a print to the minimum of print and filament volumetric " -"speed. Set to zero for no limit." -msgstr "" -"이 필라멘트에 허용되는 최대 체적 속도. 인쇄물의 최대 체적 속도를 인쇄 및 필라" -"멘트 체적 속도 최소로 제한한다. 제한 없음에 대해 0으로 설정하십시오." - -#: src/libslic3r/PrintConfig.cpp:608 -msgid "Loading speed" -msgstr "로딩 속도" - -#: src/libslic3r/PrintConfig.cpp:609 -msgid "Speed used for loading the filament on the wipe tower." -msgstr "와이퍼 타워(wipe)에 필라멘트를 장착하는 데 사용되는 속도. " - -#: src/libslic3r/PrintConfig.cpp:616 -msgid "Loading speed at the start" -msgstr "시작시 로딩 속도" - -#: src/libslic3r/PrintConfig.cpp:617 -msgid "Speed used at the very beginning of loading phase." -msgstr "로딩 단계의 시작에 사용 되는 속도." - -#: src/libslic3r/PrintConfig.cpp:624 -msgid "Unloading speed" -msgstr "언로딩 스피드" - -#: src/libslic3r/PrintConfig.cpp:625 -msgid "" -"Speed used for unloading the filament on the wipe tower (does not affect " -"initial part of unloading just after ramming)." -msgstr "" -"와이퍼 타워에서 필라멘트를 언로드하는 데 사용되는 속도(램핑 후 바로 언로딩의 " -"초기 부분에는 영향을 주지 않음)." - -#: src/libslic3r/PrintConfig.cpp:633 -msgid "Unloading speed at the start" -msgstr "시작 시 언로드 속도" - -#: src/libslic3r/PrintConfig.cpp:634 -msgid "" -"Speed used for unloading the tip of the filament immediately after ramming." -msgstr "속도는 램 밍 직후 필 라 멘 트의 팁을 언로딩 하는 데 사용 됩니다." - -#: src/libslic3r/PrintConfig.cpp:641 -msgid "Delay after unloading" -msgstr "언로드 후 딜레이" - -#: src/libslic3r/PrintConfig.cpp:642 -msgid "" -"Time to wait after the filament is unloaded. May help to get reliable " -"toolchanges with flexible materials that may need more time to shrink to " -"original dimensions." -msgstr "" -"필라멘트를 내린 후 기다리는 시간. 원래 치수로 축소하는 데, 더 많은 시간이 필" -"요할 수 있는 유연한 재료로 신뢰할 수있는 공구 교환을 얻을 수 있습니다." - -#: src/libslic3r/PrintConfig.cpp:651 -msgid "Number of cooling moves" -msgstr "쿨링 이동 숫자" - -#: src/libslic3r/PrintConfig.cpp:652 -msgid "" -"Filament is cooled by being moved back and forth in the cooling tubes. " -"Specify desired number of these moves." -msgstr "" -"필라멘트는 쿨링 튜브에서 앞뒤로 이동 하여 냉각 됩니다. 이러한 이동의 원하는 " -"값을 지정 합니다." - -#: src/libslic3r/PrintConfig.cpp:660 -msgid "Speed of the first cooling move" -msgstr "첫 번째 냉각 이동 속도" - -#: src/libslic3r/PrintConfig.cpp:661 -msgid "Cooling moves are gradually accelerating beginning at this speed." -msgstr "냉각 속도가 서서히 빨라지고 있습니다." - -#: src/libslic3r/PrintConfig.cpp:668 -msgid "Minimal purge on wipe tower" -msgstr "와이프(wipe) 탑의 최소 퍼지" - -#: src/libslic3r/PrintConfig.cpp:669 -msgid "" -"After a tool change, the exact position of the newly loaded filament inside " -"the nozzle may not be known, and the filament pressure is likely not yet " -"stable. Before purging the print head into an infill or a sacrificial " -"object, Slic3r will always prime this amount of material into the wipe tower " -"to produce successive infill or sacrificial object extrusions reliably." -msgstr "" -"공구가 변경 된 후 노즐 내부에 새로 로드 된 필라멘트의 정확한 위치를 알 수 없" -"으며, 필라멘트 압력이 아직 안정적이지 않을 수 있습니다. 프린트 헤드를 인필 또" -"는 희생(sacrificial) 객체(object)로 소거 하기 전에 Slic3r는 항상이 양의 재료" -"를 와이프 탑에 넣어 연속적인 채우기 또는 희생(sacrificial) 객체(object) 돌출" -"을 안정적으로 생성 합니다." - -#: src/libslic3r/PrintConfig.cpp:673 -msgid "mm³" -msgstr "mm ³" - -#: src/libslic3r/PrintConfig.cpp:679 -msgid "Speed of the last cooling move" -msgstr "마지막 냉각 이동 속도" - -#: src/libslic3r/PrintConfig.cpp:680 -msgid "Cooling moves are gradually accelerating towards this speed." -msgstr "냉각은 이 속도쪽으로 점차 가속화되고 있습니다. " - -#: src/libslic3r/PrintConfig.cpp:687 -msgid "Filament load time" -msgstr "필라멘트 로드 시간" - -#: src/libslic3r/PrintConfig.cpp:688 -msgid "" -"Time for the printer firmware (or the Multi Material Unit 2.0) to load a new " -"filament during a tool change (when executing the T code). This time is " -"added to the total print time by the G-code time estimator." -msgstr "" -"프린터 펌웨어 (또는 MMU 2.0)가 공구를 변경하는 동안(T 코드를 실행할 때) 새필" -"라멘트를 로드하는 시간입니다. 이 시간은 G 코드 시간 추정기에 의해 총 인쇄 시" -"간에 추가 됩니다." - -#: src/libslic3r/PrintConfig.cpp:695 -msgid "Ramming parameters" -msgstr "래밍 파라미터" - -#: src/libslic3r/PrintConfig.cpp:696 -msgid "" -"This string is edited by RammingDialog and contains ramming specific " -"parameters." -msgstr "" -"이 문자열은 RammingDialog에 의해 편집되고 래밍 특정 매개 변수를 포함합니다." - -#: src/libslic3r/PrintConfig.cpp:702 -msgid "Filament unload time" -msgstr "필라멘트 언로드 시간" - -#: src/libslic3r/PrintConfig.cpp:703 -msgid "" -"Time for the printer firmware (or the Multi Material Unit 2.0) to unload a " -"filament during a tool change (when executing the T code). This time is " -"added to the total print time by the G-code time estimator." -msgstr "" -"프린터 펌웨어 (또는 MMU2.0)가 공구 교환 중에 필라멘트를 언로드하기 위한 시간" -"입니다 (T 코드를 실행할 때). 이 시간은 G 코드 시간추정기에 의해 총 인쇄 시간" -"에 추가 됩니다." - -#: src/libslic3r/PrintConfig.cpp:711 -msgid "" -"Enter your filament diameter here. Good precision is required, so use a " -"caliper and do multiple measurements along the filament, then compute the " -"average." -msgstr "" -"여기에 필라멘트 직경을 입력하십시오. 정밀도가 필요하므로 캘리퍼를 사용하여 필" -"라멘트를 따라 여러 번 측정 한 다음 평균을 계산하십시오." - -#: src/libslic3r/PrintConfig.cpp:718 src/libslic3r/PrintConfig.cpp:2504 -#: src/libslic3r/PrintConfig.cpp:2505 -msgid "Density" -msgstr "밀도" - -#: src/libslic3r/PrintConfig.cpp:719 -msgid "" -"Enter your filament density here. This is only for statistical information. " -"A decent way is to weigh a known length of filament and compute the ratio of " -"the length to volume. Better is to calculate the volume directly through " -"displacement." -msgstr "" -"여기서 필라멘트 밀도를 입력하십시오. 이것은 통계 정보 용입니다. 괜찮은 방법" -"은 알려진 길이의 필라멘트의 무게를 측정하고 길이와 볼륨의 비율을 계산하는 것" -"입니다. 변위를 통해 직접적으로 부피를 계산하는 것이 더 좋습니다." - -#: src/libslic3r/PrintConfig.cpp:722 -msgid "g/cm³" -msgstr "g/cm³" - -#: src/libslic3r/PrintConfig.cpp:727 -msgid "Filament type" -msgstr "필라멘트 타입" - -#: src/libslic3r/PrintConfig.cpp:728 -msgid "The filament material type for use in custom G-codes." -msgstr "사용자 지정 G 코드에 사용할 필라멘트재료 유형입니다." - -#: src/libslic3r/PrintConfig.cpp:755 -msgid "Soluble material" -msgstr "수용성 재료" - -#: src/libslic3r/PrintConfig.cpp:756 -msgid "Soluble material is most likely used for a soluble support." -msgstr "수용성 재료눈 물에 녹는 서포트에 가장 많이 사용된다." - -#: src/libslic3r/PrintConfig.cpp:762 -msgid "" -"Enter your filament cost per kg here. This is only for statistical " -"information." -msgstr "필라멘트(kg당) 비용을 여기에 입력하십시오. 통계를 내기 위해서 입니다." - -#: src/libslic3r/PrintConfig.cpp:763 -msgid "money/kg" -msgstr "원(\\)/kg" - -#: src/libslic3r/PrintConfig.cpp:772 src/libslic3r/PrintConfig.cpp:2588 -msgid "(Unknown)" -msgstr "(알 수 없음)" - -#: src/libslic3r/PrintConfig.cpp:776 -msgid "Fill angle" -msgstr "채움 각도" - -#: src/libslic3r/PrintConfig.cpp:778 -msgid "" -"Default base angle for infill orientation. Cross-hatching will be applied to " -"this. Bridges will be infilled using the best direction Slic3r can detect, " -"so this setting does not affect them." -msgstr "" -"본 오리엔테이션 방향의 기본 각도입니다. 해칭이 적용될 것입니다. Slic3r이 감" -"지 할 수있는 최상의 방향을 사용하여 브릿징이 채워지므로이 설정은 영향을 미치" -"지 않습니다." - -#: src/libslic3r/PrintConfig.cpp:790 -msgid "Fill density" -msgstr "채우기(fill) 밀도" - -#: src/libslic3r/PrintConfig.cpp:792 -msgid "Density of internal infill, expressed in the range 0% - 100%." -msgstr "0 % - 100 % 범위로 표현 된 내부 채움(infill)의 밀도." - -#: src/libslic3r/PrintConfig.cpp:827 -msgid "Fill pattern" -msgstr "채우기(fill) 패턴" - -#: src/libslic3r/PrintConfig.cpp:829 -msgid "Fill pattern for general low-density infill." -msgstr "일반 낮은 밀도 채움의 패턴." - -#: src/libslic3r/PrintConfig.cpp:845 -msgid "Grid" -msgstr "그리드(Grid)" - -#: src/libslic3r/PrintConfig.cpp:846 -msgid "Triangles" -msgstr "삼각형(Triangles)" - -#: src/libslic3r/PrintConfig.cpp:847 -msgid "Stars" -msgstr "별(Stars)" - -#: src/libslic3r/PrintConfig.cpp:848 -msgid "Cubic" -msgstr "큐빅" - -#: src/libslic3r/PrintConfig.cpp:849 -msgid "Line" -msgstr "선(Line)" - -#: src/libslic3r/PrintConfig.cpp:851 src/libslic3r/PrintConfig.cpp:2021 -msgid "Honeycomb" -msgstr "벌집" - -#: src/libslic3r/PrintConfig.cpp:852 -msgid "3D Honeycomb" -msgstr "3D 벌집" - -#: src/libslic3r/PrintConfig.cpp:853 -msgid "Gyroid" -msgstr "자이로이드(Gyroid)" - -#: src/libslic3r/PrintConfig.cpp:860 src/libslic3r/PrintConfig.cpp:869 -#: src/libslic3r/PrintConfig.cpp:877 src/libslic3r/PrintConfig.cpp:911 -msgid "First layer" -msgstr "첫 레이어" - -#: src/libslic3r/PrintConfig.cpp:861 -msgid "" -"This is the acceleration your printer will use for first layer. Set zero to " -"disable acceleration control for first layer." -msgstr "" -"이것은 프린터가 첫 번째 레이어에 사용할 가속도입니다. 0을 설정하면 첫 번째 레" -"이어에 대한 가속 제어가 사용되지 않습니다." - -#: src/libslic3r/PrintConfig.cpp:870 -msgid "" -"Heated build plate temperature for the first layer. Set this to zero to " -"disable bed temperature control commands in the output." -msgstr "" -"첫 번째 레이어에 대한 빌드 플레이트 온도를 가열. 이 값을 0으로 설정하면 출력" -"에서 ​​베드 온도 제어 명령을 비활성화합니다." - -#: src/libslic3r/PrintConfig.cpp:879 -msgid "" -"Set this to a non-zero value to set a manual extrusion width for first " -"layer. You can use this to force fatter extrudates for better adhesion. If " -"expressed as percentage (for example 120%) it will be computed over first " -"layer height. If set to zero, it will use the default extrusion width." -msgstr "" -"첫 번째 레이어의 수동 압출 폭을 설정하려면이 값을 0이 아닌 값으로 설정합니" -"다. 이 방법을 사용하면보다 우수한 접착력을 위해 더 두꺼운 압출 성형물을 만들 " -"수 있습니다. 백분율 (예 : 120 %)로 표현하면 첫 번째 레이어 높이를 기준으로 계" -"산됩니다. 0으로 설정하면 기본 압출 폭이 사용됩니다." - -#: src/libslic3r/PrintConfig.cpp:892 -msgid "" -"When printing with very low layer heights, you might still want to print a " -"thicker bottom layer to improve adhesion and tolerance for non perfect build " -"plates. This can be expressed as an absolute value or as a percentage (for " -"example: 150%) over the default layer height." -msgstr "" -"매우 낮은 층의 높이로 인쇄할 때, 당신은 여전히 완벽하지 않은 빌드 플레이트의 " -"부착력과 허용오차를 개선하기 위해 더 두꺼운 바닥 층을 인쇄하기를 원할 수 있" -"다. 이것은 절대값 또는 기본 계층 높이에 대한 백분율(예: 150%)로 표시할 수 있" -"다." - -#: src/libslic3r/PrintConfig.cpp:901 -msgid "First layer speed" -msgstr "첫 레이어 속도" - -#: src/libslic3r/PrintConfig.cpp:902 -msgid "" -"If expressed as absolute value in mm/s, this speed will be applied to all " -"the print moves of the first layer, regardless of their type. If expressed " -"as a percentage (for example: 40%) it will scale the default speeds." -msgstr "" -"절대값(mm/s)으로 표현되는 경우, 이 속도는 유형에 관계없이 첫 번째 층의 모든 " -"인쇄 이동에 적용된다. 백분율(예: 40%)로 표현되는 경우 기본 속도를 스케일링한" -"다." - -#: src/libslic3r/PrintConfig.cpp:912 -msgid "" -"Extruder temperature for first layer. If you want to control temperature " -"manually during print, set this to zero to disable temperature control " -"commands in the output file." -msgstr "" -"첫 번째 층의 외부 온도. 인쇄 중에 온도를 수동으로 제어하려면 출력 파일에서 온" -"도 제어 명령을 사용하지 않으려면 이 값을 0으로 설정하십시오." - -#: src/libslic3r/PrintConfig.cpp:921 -msgid "" -"Speed for filling small gaps using short zigzag moves. Keep this reasonably " -"low to avoid too much shaking and resonance issues. Set zero to disable gaps " -"filling." -msgstr "" -"짧은 지그재그로 작은 틈을 메우기 위한 속도. 너무 많은 진동과 공진 문제를 피하" -"기 위해 이것을 합리적으로 낮게 유지한다. 간격 채우기를 사용하지 않으려면 0을 " -"설정하십시오." - -#: src/libslic3r/PrintConfig.cpp:929 -msgid "Verbose G-code" -msgstr "세부 G-code" - -#: src/libslic3r/PrintConfig.cpp:930 -msgid "" -"Enable this to get a commented G-code file, with each line explained by a " -"descriptive text. If you print from SD card, the additional weight of the " -"file could make your firmware slow down." -msgstr "" -"설명 텍스트로 설명되는 각 행과 함께 코멘트된 G-code 파일을 가져오려면 이 옵션" -"을 선택하십시오. 만일 당신이 SD카드로 인쇄한다면, 파일의 추가 무게로 인해 펌" -"웨어의 속도가 느려질 수 있다." - -#: src/libslic3r/PrintConfig.cpp:937 -msgid "G-code flavor" -msgstr "G-code 형식" - -#: src/libslic3r/PrintConfig.cpp:938 -msgid "" -"Some G/M-code commands, including temperature control and others, are not " -"universal. Set this option to your printer's firmware to get a compatible " -"output. The \"No extrusion\" flavor prevents PrusaSlicer from exporting any " -"extrusion value at all." -msgstr "" -"온도 제어 및 기타 를 포함한 일부 G/M 코드 명령은 범용이 아닙니다. 호환되는 출" -"력을 얻으려면 프린터의 펌웨어로 이 옵션을 설정합니다. \"돌출 없음\" 맛은 " -"PrusaSlicer가 압출 값을 전혀 내보내지 못하게 합니다." - -#: src/libslic3r/PrintConfig.cpp:961 -msgid "No extrusion" -msgstr "압출 없음" - -#: src/libslic3r/PrintConfig.cpp:966 -msgid "Label objects" -msgstr "레이블 객체(object)" - -#: src/libslic3r/PrintConfig.cpp:967 -msgid "" -"Enable this to add comments into the G-Code labeling print moves with what " -"object they belong to, which is useful for the Octoprint CancelObject " -"plugin. This settings is NOT compatible with Single Extruder Multi Material " -"setup and Wipe into Object / Wipe into Infill." -msgstr "" -"이 기능을 사용 하 여 G 코드 레이블 인쇄에 주석이 속해 있는 객체(object)와 함" -"께 이동 하 여 주석을 추가할 수 있으며,이는 옥 토 프린트 캔 커 작업 플러그인" -"에 유용 합니다. 이 설정은 단일 압출 기 다중 재료 설정과 호환 되지 않으며 객체" -"(object)를 닦아 내 고 채우기로 닦습니다." - -#: src/libslic3r/PrintConfig.cpp:974 -msgid "High extruder current on filament swap" -msgstr "필라멘트스왑에 높은 압출 기 전류" - -#: src/libslic3r/PrintConfig.cpp:975 -msgid "" -"It may be beneficial to increase the extruder motor current during the " -"filament exchange sequence to allow for rapid ramming feed rates and to " -"overcome resistance when loading a filament with an ugly shaped tip." -msgstr "" -"필라멘트 교환 동안 압출기 모터 전류를 증가 시키는 것이 유리할 수 있으며, 이" -"는 빠른 래밍 공급 속도를 가능 하게하고, 불규칙한 모양의 필라멘트를 로딩할때 " -"저항을 극복하기 위한것이다." - -#: src/libslic3r/PrintConfig.cpp:983 -msgid "" -"This is the acceleration your printer will use for infill. Set zero to " -"disable acceleration control for infill." -msgstr "" -"이것은 당신 프린터의 채움 가속력이다. 주입에 대한 가속 제어를 비활성화하려면 " -"0을 설정하십시오." - -#: src/libslic3r/PrintConfig.cpp:991 -msgid "Combine infill every" -msgstr "다음 레이어마다 결합" - -#: src/libslic3r/PrintConfig.cpp:993 -msgid "" -"This feature allows to combine infill and speed up your print by extruding " -"thicker infill layers while preserving thin perimeters, thus accuracy." -msgstr "" -"이 기능은 인필을 결합하고 얇은 주변기기를 보존하면서 두꺼운 인필 층을 압출하" -"여 인쇄 속도를 높일 수 있도록 하여 정확도를 높인다." - -#: src/libslic3r/PrintConfig.cpp:996 -msgid "Combine infill every n layers" -msgstr "모든 n개 층을 채우기 위해 결합" - -#: src/libslic3r/PrintConfig.cpp:1002 -msgid "Infill extruder" -msgstr "채움(Infill) 익스트루더" - -#: src/libslic3r/PrintConfig.cpp:1004 -msgid "The extruder to use when printing infill." -msgstr "채움으로 사용할 익스트루더." - -#: src/libslic3r/PrintConfig.cpp:1012 -msgid "" -"Set this to a non-zero value to set a manual extrusion width for infill. If " -"left zero, default extrusion width will be used if set, otherwise 1.125 x " -"nozzle diameter will be used. You may want to use fatter extrudates to speed " -"up the infill and make your parts stronger. If expressed as percentage (for " -"example 90%) it will be computed over layer height." -msgstr "" -"채움에 수동 압출 폭을 설정하려면이 값을 0이 아닌 값으로 설정합니다. 0으로 설" -"정하면 설정된 경우 기본 압출 폭이 사용되고 그렇지 않으면 1.125 x 노즐 직경이 " -"사용됩니다. 채움 속도를 높이고 부품(Part)을 더 강하게 만들려면보다 큰 압출 성" -"형물을 사용하는 것이 좋습니다. 백분율 (예 : 90 %)로 표현하면 레이어 높이를 기" -"준으로 계산됩니다." - -#: src/libslic3r/PrintConfig.cpp:1022 -msgid "Infill before perimeters" -msgstr "둘레보다 앞쪽에 채움" - -#: src/libslic3r/PrintConfig.cpp:1023 -msgid "" -"This option will switch the print order of perimeters and infill, making the " -"latter first." -msgstr "이 옵션은 외부출력과 채움 인쇄 순서를 바꾸어, 후자를 먼저 만든다." - -#: src/libslic3r/PrintConfig.cpp:1028 -msgid "Only infill where needed" -msgstr "필요한 경우 채움" - -#: src/libslic3r/PrintConfig.cpp:1030 -msgid "" -"This option will limit infill to the areas actually needed for supporting " -"ceilings (it will act as internal support material). If enabled, slows down " -"the G-code generation due to the multiple checks involved." -msgstr "" -"이 옵션은 천장 지원에 실제로 필요한 영역에만 적용된다(내부 서포트 재료 역할" -"을 할 것이다). 활성화된 경우 관련된 여러 번의 점검으로 인해 G-code 생성 속도" -"를 늦춰라." - -#: src/libslic3r/PrintConfig.cpp:1037 -msgid "Infill/perimeters overlap" -msgstr "채움/둘레 겹침(perimeters overlap)" - -#: src/libslic3r/PrintConfig.cpp:1039 -msgid "" -"This setting applies an additional overlap between infill and perimeters for " -"better bonding. Theoretically this shouldn't be needed, but backlash might " -"cause gaps. If expressed as percentage (example: 15%) it is calculated over " -"perimeter extrusion width." -msgstr "" -"이 설정은 더 나은 본딩을 위해 충전 및 둘레 사이에 추가 겹침을 적용합니다. 이" -"론적으로 이것은 필요하지 않아야하지만 백래시가 갭을 유발할 수 있습니다. 백분" -"율 (예 : 15 %)로 표시되는 경우 경계 압출 폭을 기준으로 계산됩니다." - -#: src/libslic3r/PrintConfig.cpp:1050 -msgid "Speed for printing the internal fill. Set to zero for auto." -msgstr "내부 채우기 인쇄 속도. 자동으로 0으로 설정하십시오." - -#: src/libslic3r/PrintConfig.cpp:1058 -msgid "Inherits profile" -msgstr "프로필 상속" - -#: src/libslic3r/PrintConfig.cpp:1059 -msgid "Name of the profile, from which this profile inherits." -msgstr "이 프로파일이 상속되는 프로파일의 이름." - -#: src/libslic3r/PrintConfig.cpp:1072 -msgid "Interface shells" -msgstr "접점 셸(shells)" - -#: src/libslic3r/PrintConfig.cpp:1073 -msgid "" -"Force the generation of solid shells between adjacent materials/volumes. " -"Useful for multi-extruder prints with translucent materials or manual " -"soluble support material." -msgstr "" -"인접 재료/볼륨 사이에 고체 쉘 생성을 강제하십시오. 반투명 재료 또는 수동 수용" -"성 서포트 재료를 사용한 다중 압ㅊ기 인쇄에 유용함." - -#: src/libslic3r/PrintConfig.cpp:1082 -msgid "" -"This custom code is inserted at every layer change, right after the Z move " -"and before the extruder moves to the first layer point. Note that you can " -"use placeholder variables for all Slic3r settings as well as [layer_num] and " -"[layer_z]." -msgstr "" -"이 사용자 정의 코드는 Z 이동 직후와 압출부가 첫 번째 레이어 포인트로 이동하" -"기 전에 모든 레이어 변경 시 삽입된다. 모든 Slic3r 설정뿐만 아니라 " -"[layer_num] 및 [layer_z]에 자리 표시자 변수를 사용할 수 있다는 점에 유의하십" -"시오." - -#: src/libslic3r/PrintConfig.cpp:1093 -msgid "Supports remaining times" -msgstr "남은 시간 지원" - -#: src/libslic3r/PrintConfig.cpp:1094 -msgid "" -"Emit M73 P[percent printed] R[remaining time in minutes] at 1 minute " -"intervals into the G-code to let the firmware show accurate remaining time. " -"As of now only the Prusa i3 MK3 firmware recognizes M73. Also the i3 MK3 " -"firmware supports M73 Qxx Sxx for the silent mode." -msgstr "" -"G 코드에 1 분 간격으로 M73 P [퍼센트 인쇄] R[remaining time in minutes]을 방" -"출하여 펌웨어가 정확한 잔여 시간을 표시 하도록 합니다. 현재만 Prusa i3 MK3 펌" -"웨어는 M73를 인식 하 고 있습니다. 또한 i3 MK3 펌웨어는 자동 모드에서 M73 Qxx " -"Sxx를 지원 합니다." - -#: src/libslic3r/PrintConfig.cpp:1102 -msgid "Supports stealth mode" -msgstr "자동 모드 지원" - -#: src/libslic3r/PrintConfig.cpp:1103 -msgid "The firmware supports stealth mode" -msgstr "펌웨어는 스텔스 모드를 지원 합니다" - -#: src/libslic3r/PrintConfig.cpp:1127 -msgid "Maximum feedrate X" -msgstr "최대 이송 속도 X" - -#: src/libslic3r/PrintConfig.cpp:1128 -msgid "Maximum feedrate Y" -msgstr "최대 이송 속도 Y" - -#: src/libslic3r/PrintConfig.cpp:1129 -msgid "Maximum feedrate Z" -msgstr "최대 이송 속도 Z" - -#: src/libslic3r/PrintConfig.cpp:1130 -msgid "Maximum feedrate E" -msgstr "최대 이송 속도 E" - -#: src/libslic3r/PrintConfig.cpp:1133 -msgid "Maximum feedrate of the X axis" -msgstr "X 축의 최대 이송 속도" - -#: src/libslic3r/PrintConfig.cpp:1134 -msgid "Maximum feedrate of the Y axis" -msgstr "Y 축의 최대 이송 속도" - -#: src/libslic3r/PrintConfig.cpp:1135 -msgid "Maximum feedrate of the Z axis" -msgstr "Z 축의 최대 이송 속도" - -#: src/libslic3r/PrintConfig.cpp:1136 -msgid "Maximum feedrate of the E axis" -msgstr "E 축의 최대 이송 속도" - -#: src/libslic3r/PrintConfig.cpp:1145 -msgid "Maximum acceleration X" -msgstr "최대 가속도 X" - -#: src/libslic3r/PrintConfig.cpp:1146 -msgid "Maximum acceleration Y" -msgstr "최대 가속도 Y" - -#: src/libslic3r/PrintConfig.cpp:1147 -msgid "Maximum acceleration Z" -msgstr "최대 가속 Z" - -#: src/libslic3r/PrintConfig.cpp:1148 -msgid "Maximum acceleration E" -msgstr "최대 가속 E" - -#: src/libslic3r/PrintConfig.cpp:1151 -msgid "Maximum acceleration of the X axis" -msgstr "X 축의 최대 가속도" - -#: src/libslic3r/PrintConfig.cpp:1152 -msgid "Maximum acceleration of the Y axis" -msgstr "Y 축의 최대 가속도" - -#: src/libslic3r/PrintConfig.cpp:1153 -msgid "Maximum acceleration of the Z axis" -msgstr "Z 축의 최대 가속도" - -#: src/libslic3r/PrintConfig.cpp:1154 -msgid "Maximum acceleration of the E axis" -msgstr "E 축의 최대 가속도" - -#: src/libslic3r/PrintConfig.cpp:1163 -msgid "Maximum jerk X" -msgstr "최대 저크(jerk) X" - -#: src/libslic3r/PrintConfig.cpp:1164 -msgid "Maximum jerk Y" -msgstr "최대 저크(jerk) Y" - -#: src/libslic3r/PrintConfig.cpp:1165 -msgid "Maximum jerk Z" -msgstr "최대 저크(jerk) Z" - -#: src/libslic3r/PrintConfig.cpp:1166 -msgid "Maximum jerk E" -msgstr "최대 저크(jerk) E" - -#: src/libslic3r/PrintConfig.cpp:1169 -msgid "Maximum jerk of the X axis" -msgstr "X축 최대 저크(jerk)" - -#: src/libslic3r/PrintConfig.cpp:1170 -msgid "Maximum jerk of the Y axis" -msgstr "Y축 최대 저크는(jerk)" - -#: src/libslic3r/PrintConfig.cpp:1171 -msgid "Maximum jerk of the Z axis" -msgstr "Z축 최대 저크(jerk)" - -#: src/libslic3r/PrintConfig.cpp:1172 -msgid "Maximum jerk of the E axis" -msgstr "E축 최대 저크(jerk)" - -#: src/libslic3r/PrintConfig.cpp:1183 -msgid "Minimum feedrate when extruding" -msgstr "압출시 최소 공급 속도" - -#: src/libslic3r/PrintConfig.cpp:1185 -msgid "Minimum feedrate when extruding (M205 S)" -msgstr "압출 시 최소 이송 속도 (M205 S)" - -#: src/libslic3r/PrintConfig.cpp:1194 -msgid "Minimum travel feedrate" -msgstr "최소 이송 속도" - -#: src/libslic3r/PrintConfig.cpp:1196 -msgid "Minimum travel feedrate (M205 T)" -msgstr "최소 이동 이송 속도 (M205 T)" - -#: src/libslic3r/PrintConfig.cpp:1205 -msgid "Maximum acceleration when extruding" -msgstr "압출시 최대 가속도" - -#: src/libslic3r/PrintConfig.cpp:1207 -msgid "Maximum acceleration when extruding (M204 S)" -msgstr "압출 시 최대 가속도 (M204 S)" - -#: src/libslic3r/PrintConfig.cpp:1216 -msgid "Maximum acceleration when retracting" -msgstr "리트렉션 최대 가속도" - -#: src/libslic3r/PrintConfig.cpp:1218 -msgid "Maximum acceleration when retracting (M204 T)" -msgstr "후퇴 시 최대 가속도 (M204 T)" - -#: src/libslic3r/PrintConfig.cpp:1226 src/libslic3r/PrintConfig.cpp:1235 -msgid "Max" -msgstr "최대" - -#: src/libslic3r/PrintConfig.cpp:1227 -msgid "This setting represents the maximum speed of your fan." -msgstr "이 설정은 팬의 최대 속도를 나타냅니다." - -#: src/libslic3r/PrintConfig.cpp:1236 -#, no-c-format -msgid "" -"This is the highest printable layer height for this extruder, used to cap " -"the variable layer height and support layer height. Maximum recommended " -"layer height is 75% of the extrusion width to achieve reasonable inter-layer " -"adhesion. If set to 0, layer height is limited to 75% of the nozzle diameter." -msgstr "" -"이것은 이 익스트루더의 가장 높은 인쇄 가능 층 높이이며, 가변 층 높이 및 지지" -"층 높이를 캡하는 데 사용됩니다. 합당한 층간 접착력을 얻기 위해 최대 권장 높이" -"는 압출 폭의 75% of 입니다. 0으로 설정하면 층 높이가 노즐 지름의 75% of로 제" -"한됩니다." - -#: src/libslic3r/PrintConfig.cpp:1246 -msgid "Max print speed" -msgstr "최대 프린트 속도" - -#: src/libslic3r/PrintConfig.cpp:1247 -msgid "" -"When setting other speed settings to 0 Slic3r will autocalculate the optimal " -"speed in order to keep constant extruder pressure. This experimental setting " -"is used to set the highest print speed you want to allow." -msgstr "" -"다른 속도 설정을 0으로 설정할 경우, 지속적인 외부 압력을 유지하기 위해 최적" -"의 속도를 자동 계산한다. 이 실험 설정은 허용할 최대 인쇄 속도를 설정하는 데 " -"사용된다." - -#: src/libslic3r/PrintConfig.cpp:1257 -msgid "" -"This experimental setting is used to set the maximum volumetric speed your " -"extruder supports." -msgstr "" -"이 실험 설정은 압출기가 지원하는 최대 체적 속도를 설정하기 위해 사용된다." - -#: src/libslic3r/PrintConfig.cpp:1266 -msgid "Max volumetric slope positive" -msgstr "최대 체적 기울기 양" - -#: src/libslic3r/PrintConfig.cpp:1267 src/libslic3r/PrintConfig.cpp:1278 -msgid "" -"This experimental setting is used to limit the speed of change in extrusion " -"rate. A value of 1.8 mm³/s² ensures, that a change from the extrusion rate " -"of 1.8 mm³/s (0.45mm extrusion width, 0.2mm extrusion height, feedrate 20 mm/" -"s) to 5.4 mm³/s (feedrate 60 mm/s) will take at least 2 seconds." -msgstr "" -"이 실험 설정은 돌출율의 변화 속도를 제한하는데 사용된다. 1.8mm3/s2 값은 " -"1.8mm3/s(0.45mm 압출 폭, 0.2mm 압출 높이, 공급 속도 20mm/s)에서 5.4mm3/s(공" -"급 속도 60mm/s)로 변경하는 데 최소 2초 이상 걸린다." - -#: src/libslic3r/PrintConfig.cpp:1271 src/libslic3r/PrintConfig.cpp:1282 -msgid "mm³/s²" -msgstr "mm³/s²" - -#: src/libslic3r/PrintConfig.cpp:1277 -msgid "Max volumetric slope negative" -msgstr "최대 체적 기울기 음수" - -#: src/libslic3r/PrintConfig.cpp:1289 src/libslic3r/PrintConfig.cpp:1298 -msgid "Min" -msgstr "최소" - -#: src/libslic3r/PrintConfig.cpp:1290 -msgid "This setting represents the minimum PWM your fan needs to work." -msgstr "이 설정은 최소 PWM팬이 활동하는데 필요한를 나타냅니다." - -#: src/libslic3r/PrintConfig.cpp:1299 -msgid "" -"This is the lowest printable layer height for this extruder and limits the " -"resolution for variable layer height. Typical values are between 0.05 mm and " -"0.1 mm." -msgstr "" -"이것은 이 압출기에 대한 가장 낮은 인쇄 가능한 층 높이이고 가변 층 높이에 대" -"한 분해능을 제한한다. 대표적인 값은 0.05mm와 0.1mm이다." - -#: src/libslic3r/PrintConfig.cpp:1307 -msgid "Min print speed" -msgstr "최소 인쇄 속도" - -#: src/libslic3r/PrintConfig.cpp:1308 -msgid "Slic3r will not scale speed down below this speed." -msgstr "Slic3r는 이 속도 이하로 속도를 낮추지 않을 것이다." - -#: src/libslic3r/PrintConfig.cpp:1315 -msgid "Minimal filament extrusion length" -msgstr "최소 필라멘트 압출 길이" - -#: src/libslic3r/PrintConfig.cpp:1316 -msgid "" -"Generate no less than the number of skirt loops required to consume the " -"specified amount of filament on the bottom layer. For multi-extruder " -"machines, this minimum applies to each extruder." -msgstr "" -"하단 레이어에서 지정된 양의 필라멘트를 사용하는 데 필요한 스커트 루프의 수 이" -"상으로 생성한다. 다중 익스트루더의 경우, 이 최소값은 각 추가기기에 적용된다." - -#: src/libslic3r/PrintConfig.cpp:1325 -msgid "Configuration notes" -msgstr "구성 노트" - -#: src/libslic3r/PrintConfig.cpp:1326 -msgid "" -"You can put here your personal notes. This text will be added to the G-code " -"header comments." -msgstr "" -"여기에 개인 노트를 넣을 수 있다. 이 텍스트는 G-code 헤더 코멘트에 추가될 것이" -"다." - -#: src/libslic3r/PrintConfig.cpp:1336 -msgid "" -"This is the diameter of your extruder nozzle (for example: 0.5, 0.35 etc.)" -msgstr "이 지름은 익스트루더 노즐의 직경이다(예: 0.5, 0.35 등)." - -#: src/libslic3r/PrintConfig.cpp:1341 -msgid "Host Type" -msgstr "호스트 유형" - -#: src/libslic3r/PrintConfig.cpp:1342 -msgid "" -"Slic3r can upload G-code files to a printer host. This field must contain " -"the kind of the host." -msgstr "" -"Slic3r는 프린터 호스트에 G 코드 파일을 업로드할 수 있습니다. 이 필드에는 호스" -"트의 종류가 포함 되어야 합니다." - -#: src/libslic3r/PrintConfig.cpp:1357 -msgid "Only retract when crossing perimeters" -msgstr "둘레를 횡단 할 때만 수축" - -#: src/libslic3r/PrintConfig.cpp:1358 -msgid "" -"Disables retraction when the travel path does not exceed the upper layer's " -"perimeters (and thus any ooze will be probably invisible)." -msgstr "" -"이동 경로가 상위 레이어의 경계를 초과하지 않는 경우 리트랙션을 비활성화합니" -"다. 따라서 모든 오즈가 보이지 않습니다." - -#: src/libslic3r/PrintConfig.cpp:1365 -msgid "" -"This option will drop the temperature of the inactive extruders to prevent " -"oozing. It will enable a tall skirt automatically and move extruders outside " -"such skirt when changing temperatures." -msgstr "" -"이 옵션은 누출을 방지하기 위해 비활성 압출기의 온도를 떨어 뜨립니다. 온도를 " -"변경할 때 키가 큰 스커트를 자동으로 사용하고 스커트 외부로 압출기를 이동합니" -"다." - -#: src/libslic3r/PrintConfig.cpp:1372 -msgid "Output filename format" -msgstr "출력 파일이름 형식" - -#: src/libslic3r/PrintConfig.cpp:1373 -msgid "" -"You can use all configuration options as variables inside this template. For " -"example: [layer_height], [fill_density] etc. You can also use [timestamp], " -"[year], [month], [day], [hour], [minute], [second], [version], " -"[input_filename], [input_filename_base]." -msgstr "" -"모든 구성 옵션을이 템플릿 내의 변수로 사용할 수 있습니다. 예: " -"[layer_height], [fill_density] 등 또한 [타임 스탬프], [연도], [월], [일], [시" -"간], [input_filename], [input_filename_base]을 사용할 수 있습니다." - -#: src/libslic3r/PrintConfig.cpp:1382 -msgid "Detect bridging perimeters" -msgstr "브릿 징 경계선 감지" - -#: src/libslic3r/PrintConfig.cpp:1384 -msgid "" -"Experimental option to adjust flow for overhangs (bridge flow will be used), " -"to apply bridge speed to them and enable fan." -msgstr "" -"오버행에 대한 유량을 조정하는 실험 옵션 (브리지 흐름(flow)이 사용됨)에 브릿" -"지 속도를 적용하고 팬을 활성화합니다." - -#: src/libslic3r/PrintConfig.cpp:1390 -msgid "Filament parking position" -msgstr "필라멘트 멈춤 위치" - -#: src/libslic3r/PrintConfig.cpp:1391 -msgid "" -"Distance of the extruder tip from the position where the filament is parked " -"when unloaded. This should match the value in printer firmware." -msgstr "" -"언로딩시 필라멘트 위치에서 압출기 팁의 거리. 이 값은 프린터 펌웨어의 값과 일" -"치해야합니다." - -#: src/libslic3r/PrintConfig.cpp:1399 -msgid "Extra loading distance" -msgstr "추가 로딩 거리" - -#: src/libslic3r/PrintConfig.cpp:1400 -msgid "" -"When set to zero, the distance the filament is moved from parking position " -"during load is exactly the same as it was moved back during unload. When " -"positive, it is loaded further, if negative, the loading move is shorter " -"than unloading." -msgstr "" -"0으로 설정하면로드 중에 필라멘트가 위치에서 이동 한 거리는 언로드 중에 다시 " -"이동 한 거리와 동일합니다. 양수이면 음수가 더 많이 로드되고 로드가 음수 인 경" -"우 언로드보다 짧습니다." - -#: src/libslic3r/PrintConfig.cpp:1408 src/libslic3r/PrintConfig.cpp:1426 -#: src/libslic3r/PrintConfig.cpp:1439 src/libslic3r/PrintConfig.cpp:1449 -msgid "Perimeters" -msgstr "둘레" - -#: src/libslic3r/PrintConfig.cpp:1409 -msgid "" -"This is the acceleration your printer will use for perimeters. A high value " -"like 9000 usually gives good results if your hardware is up to the job. Set " -"zero to disable acceleration control for perimeters." -msgstr "" -"프린터가 둘레로 사용할 가속도입니다. 9000과 같은 높은 값은 하드웨어가 제대로 " -"작동하면 좋은 결과를 제공합니다. 주변을 가속 제어하지 않으려면 0으로 설정하십" -"시오." - -#: src/libslic3r/PrintConfig.cpp:1417 -msgid "Perimeter extruder" -msgstr "가장자리(Perimeter) 익스트루더" - -#: src/libslic3r/PrintConfig.cpp:1419 -msgid "" -"The extruder to use when printing perimeters and brim. First extruder is 1." -msgstr "" -"둘레와 가장자리를 인쇄 할 때 사용할 압출기입니다. 첫 번째 압출기는 1입니다." - -#: src/libslic3r/PrintConfig.cpp:1428 -msgid "" -"Set this to a non-zero value to set a manual extrusion width for perimeters. " -"You may want to use thinner extrudates to get more accurate surfaces. If " -"left zero, default extrusion width will be used if set, otherwise 1.125 x " -"nozzle diameter will be used. If expressed as percentage (for example 200%) " -"it will be computed over layer height." -msgstr "" -"이 값을 0이 아닌 값으로 설정하면 수동 압출 폭을 둘레로 설정할 수 있습니다. 보" -"다 정확한 서페이스를 얻으려면 더 얇은 압출 성형품을 사용하는 것이 좋습니다. 0" -"으로 설정하면 설정된 경우 기본 돌출 폭이 사용되고 그렇지 않으면 1.125 x 노즐 " -"직경이 사용됩니다. 백분율 (예 : 200 %)로 표현하면 레이어 높이를 기준으로 계산" -"됩니다." - -#: src/libslic3r/PrintConfig.cpp:1441 -msgid "" -"Speed for perimeters (contours, aka vertical shells). Set to zero for auto." -msgstr "둘레의 속도 (등고선, 일명 세로 셸). 자동으로 0으로 설정하십시오." - -#: src/libslic3r/PrintConfig.cpp:1451 -msgid "" -"This option sets the number of perimeters to generate for each layer. Note " -"that Slic3r may increase this number automatically when it detects sloping " -"surfaces which benefit from a higher number of perimeters if the Extra " -"Perimeters option is enabled." -msgstr "" -"이 옵션은 각 레이어에 대해 생성 할 경계 수를 설정합니다. 추가 경계선 옵션을 " -"사용하면 더 큰 주변 수를 사용하는 경사면을 감지 할 때 Slic3r이이 수를 자동으" -"로 증가시킬 수 있습니다." - -#: src/libslic3r/PrintConfig.cpp:1455 -msgid "(minimum)" -msgstr "(최소)" - -#: src/libslic3r/PrintConfig.cpp:1463 -msgid "" -"If you want to process the output G-code through custom scripts, just list " -"their absolute paths here. Separate multiple scripts with a semicolon. " -"Scripts will be passed the absolute path to the G-code file as the first " -"argument, and they can access the Slic3r config settings by reading " -"environment variables." -msgstr "" -"사용자 정의 스크립트를 통해 출력 G 코드를 처리하려면 여기에 절대 경로를 나열" -"하십시오. 여러 개의 스크립트를 세미콜론으로 구분하십시오. 스크립트는 G 코드 " -"파일의 절대 경로를 첫 번째 인수로 전달되며 환경 변수를 읽음으로써 Slic3r 구" -"성 설정에 액세스 할 수 있습니다." - -#: src/libslic3r/PrintConfig.cpp:1475 -msgid "Printer type" -msgstr "프린터 타입" - -#: src/libslic3r/PrintConfig.cpp:1476 -msgid "Type of the printer." -msgstr "프린터 유형." - -#: src/libslic3r/PrintConfig.cpp:1481 -msgid "Printer notes" -msgstr "프린터 노트" - -#: src/libslic3r/PrintConfig.cpp:1482 -msgid "You can put your notes regarding the printer here." -msgstr "프린터 관련 메모를 여기에 넣을 수 있습니다." - -#: src/libslic3r/PrintConfig.cpp:1490 -msgid "Printer vendor" -msgstr "제조 회사" - -#: src/libslic3r/PrintConfig.cpp:1491 -msgid "Name of the printer vendor." -msgstr "프린터 공급 업체의 이름입니다." - -#: src/libslic3r/PrintConfig.cpp:1496 -msgid "Printer variant" -msgstr "프린터 변형" - -#: src/libslic3r/PrintConfig.cpp:1497 -msgid "" -"Name of the printer variant. For example, the printer variants may be " -"differentiated by a nozzle diameter." -msgstr "" -"프린터 변종 이름입니다. 예를 들어, 프린터 변형은 노즐 지름으로 구별 될 수 있" -"습니다." - -#: src/libslic3r/PrintConfig.cpp:1510 -msgid "Raft layers" -msgstr "라프트(Raft) 레이어" - -#: src/libslic3r/PrintConfig.cpp:1512 -msgid "" -"The object will be raised by this number of layers, and support material " -"will be generated under it." -msgstr "" -"개체는 이 개수의 층에 의해 상승되며, 그 아래에서 서포트 재료가 생성될 것이다." - -#: src/libslic3r/PrintConfig.cpp:1520 -msgid "Resolution" -msgstr "해상도" - -#: src/libslic3r/PrintConfig.cpp:1521 -msgid "" -"Minimum detail resolution, used to simplify the input file for speeding up " -"the slicing job and reducing memory usage. High-resolution models often " -"carry more detail than printers can render. Set to zero to disable any " -"simplification and use full resolution from input." -msgstr "" -"잘라내기 작업의 속도를 높이고 메모리 사용량을 줄이기 위해 입력 파일을 단순화" -"하는 데 사용되는 최소 세부 해상도. 고해상도 모델은 종종 프린터가 렌더링할 수 " -"있는 것보다 더 많은 디테일을 가지고 있다. 단순화를 사용하지 않고 입력에서 전" -"체 해상도를 사용하려면 0으로 설정하십시오." - -#: src/libslic3r/PrintConfig.cpp:1531 -msgid "Minimum travel after retraction" -msgstr "리트랙션 후 최소 이동 거리" - -#: src/libslic3r/PrintConfig.cpp:1532 -msgid "" -"Retraction is not triggered when travel moves are shorter than this length." -msgstr "이동 거리가 이 길이보다 짧으면 리트렉션이 트리거되지 않습니다." - -#: src/libslic3r/PrintConfig.cpp:1538 -msgid "Retract amount before wipe" -msgstr "닦아 내기 전의 수축량" - -#: src/libslic3r/PrintConfig.cpp:1539 -msgid "" -"With bowden extruders, it may be wise to do some amount of quick retract " -"before doing the wipe movement." -msgstr "" -"보우 덴 압출기를 사용하면 와이퍼 동작을하기 전에 약간의 빠른 리트랙션 를하는 " -"것이 좋습니다." - -#: src/libslic3r/PrintConfig.cpp:1546 -msgid "Retract on layer change" -msgstr "레이어 변경 후퇴" - -#: src/libslic3r/PrintConfig.cpp:1547 -msgid "This flag enforces a retraction whenever a Z move is done." -msgstr "이 플래그는 Z 이동이 완료 될 때마다 취소를 강제 실행합니다." - -#: src/libslic3r/PrintConfig.cpp:1552 src/libslic3r/PrintConfig.cpp:1560 -msgid "Length" -msgstr "길이" - -#: src/libslic3r/PrintConfig.cpp:1553 -msgid "Retraction Length" -msgstr "리트랙션 길이" - -#: src/libslic3r/PrintConfig.cpp:1554 -msgid "" -"When retraction is triggered, filament is pulled back by the specified " -"amount (the length is measured on raw filament, before it enters the " -"extruder)." -msgstr "" -"후퇴가 트리거되면 필라멘트가 지정된 양만큼 뒤로 당겨집니다 (길이는 압출기에 " -"들어가기 전에 원시 필라멘트에서 측정됩니다)." - -#: src/libslic3r/PrintConfig.cpp:1556 src/libslic3r/PrintConfig.cpp:1565 -msgid "mm (zero to disable)" -msgstr "mm (0은 비활성화)" - -#: src/libslic3r/PrintConfig.cpp:1561 -msgid "Retraction Length (Toolchange)" -msgstr "리트랙션 길이 (툴 체인지)" - -#: src/libslic3r/PrintConfig.cpp:1562 -msgid "" -"When retraction is triggered before changing tool, filament is pulled back " -"by the specified amount (the length is measured on raw filament, before it " -"enters the extruder)." -msgstr "" -"공구를 교체하기 전에 후퇴가 트리거되면 필라멘트가 지정된 양만큼 뒤로 당겨집니" -"다 (길이는 압출기에 들어가기 전에 원시 필라멘트에서 측정됩니다)." - -#: src/libslic3r/PrintConfig.cpp:1570 -msgid "Lift Z" -msgstr "Z축 올림" - -#: src/libslic3r/PrintConfig.cpp:1571 -msgid "" -"If you set this to a positive value, Z is quickly raised every time a " -"retraction is triggered. When using multiple extruders, only the setting for " -"the first extruder will be considered." -msgstr "" -"이 값을 양수 값으로 설정하면 철회가 트리거 될 때마다 Z가 빠르게 올라갑니다. " -"여러 개의 압출기를 사용하는 경우 첫 번째 압출기의 설정 만 고려됩니다." - -#: src/libslic3r/PrintConfig.cpp:1578 -msgid "Above Z" -msgstr "Z 위" - -#: src/libslic3r/PrintConfig.cpp:1579 -msgid "Only lift Z above" -msgstr "오직 Z축 위로만" - -#: src/libslic3r/PrintConfig.cpp:1580 -msgid "" -"If you set this to a positive value, Z lift will only take place above the " -"specified absolute Z. You can tune this setting for skipping lift on the " -"first layers." -msgstr "" -"이것을 양의 값으로 설정하면, Z 리프트는 지정된 절대 Z 위로만 발생한다. 첫 번" -"째 층에서 리프트를 건너뛸 수 있도록 이 설정을 조정할 수 있다." - -#: src/libslic3r/PrintConfig.cpp:1587 -msgid "Below Z" -msgstr "Z 아래" - -#: src/libslic3r/PrintConfig.cpp:1588 -msgid "Only lift Z below" -msgstr "Z값 아래만" - -#: src/libslic3r/PrintConfig.cpp:1589 -msgid "" -"If you set this to a positive value, Z lift will only take place below the " -"specified absolute Z. You can tune this setting for limiting lift to the " -"first layers." -msgstr "" -"이것을 양수 값으로 설정하면 Z 리프트가 지정된 절대 Z 아래에서만 발생합니다. " -"첫 번째 레이어로 리프트를 제한하기 위해이 설정을 조정할 수 있습니다." - -#: src/libslic3r/PrintConfig.cpp:1597 src/libslic3r/PrintConfig.cpp:1605 -msgid "Extra length on restart" -msgstr "재시작시 여분의 길이" - -#: src/libslic3r/PrintConfig.cpp:1598 -msgid "" -"When the retraction is compensated after the travel move, the extruder will " -"push this additional amount of filament. This setting is rarely needed." -msgstr "" -"이동 후 리트렉셔이 보정되면 익스트루더가 추가 양의 필라멘트를 밀어냅니다. 이 " -"설정은 거의 필요하지 않습니다." - -#: src/libslic3r/PrintConfig.cpp:1606 -msgid "" -"When the retraction is compensated after changing tool, the extruder will " -"push this additional amount of filament." -msgstr "" -"도구를 교환 한 후 리트렉션를 보정하면 익스트루더가 추가 양의 필라멘트를 밀게" -"됩니다." - -#: src/libslic3r/PrintConfig.cpp:1613 src/libslic3r/PrintConfig.cpp:1614 -msgid "Retraction Speed" -msgstr "리트랙션 속도" - -#: src/libslic3r/PrintConfig.cpp:1615 -msgid "The speed for retractions (it only applies to the extruder motor)." -msgstr "리트랙션 속도 (익스트루더 모터에만 적용됨)." - -#: src/libslic3r/PrintConfig.cpp:1621 src/libslic3r/PrintConfig.cpp:1622 -msgid "Deretraction Speed" -msgstr "감속 속도" - -#: src/libslic3r/PrintConfig.cpp:1623 -msgid "" -"The speed for loading of a filament into extruder after retraction (it only " -"applies to the extruder motor). If left to zero, the retraction speed is " -"used." -msgstr "" -"리트랙션 후 압출기에 필라멘트를 로드하는 속도 (압출기 모터에만 적용됨). 0으" -"로 방치하면 리트랙션 속도가 사용됩니다." - -#: src/libslic3r/PrintConfig.cpp:1630 -msgid "Seam position" -msgstr "재봉선 위치" - -#: src/libslic3r/PrintConfig.cpp:1632 -msgid "Position of perimeters starting points." -msgstr "둘레의 시작점의 위치." - -#: src/libslic3r/PrintConfig.cpp:1638 -msgid "Random" -msgstr "무작위" - -#: src/libslic3r/PrintConfig.cpp:1639 -msgid "Nearest" -msgstr "가장 가까운" - -#: src/libslic3r/PrintConfig.cpp:1640 -msgid "Aligned" -msgstr "정렬" - -#: src/libslic3r/PrintConfig.cpp:1648 -msgid "Direction" -msgstr "방향" - -#: src/libslic3r/PrintConfig.cpp:1650 -msgid "Preferred direction of the seam" -msgstr "선호하는 재봉선(seam)의 방향" - -#: src/libslic3r/PrintConfig.cpp:1651 -msgid "Seam preferred direction" -msgstr "재봉선(Seam) 선호 방향" - -#: src/libslic3r/PrintConfig.cpp:1658 -msgid "Jitter" -msgstr "지터(Jitter)" - -#: src/libslic3r/PrintConfig.cpp:1660 -msgid "Seam preferred direction jitter" -msgstr "재봉선 선호 방향 지터(Jitter)" - -#: src/libslic3r/PrintConfig.cpp:1661 -msgid "Preferred direction of the seam - jitter" -msgstr "재봉선 지터의 선호 방향" - -#: src/libslic3r/PrintConfig.cpp:1671 -msgid "USB/serial port for printer connection." -msgstr "프린터 연결을 위한 USB/시리얼 포트." - -#: src/libslic3r/PrintConfig.cpp:1678 -msgid "Serial port speed" -msgstr "시리얼 포트 속도" - -#: src/libslic3r/PrintConfig.cpp:1679 -msgid "Speed (baud) of USB/serial port for printer connection." -msgstr "프린터 연결을 위한 USB/시리얼 포트의 속도(보드)" - -#: src/libslic3r/PrintConfig.cpp:1688 -msgid "Distance from object" -msgstr "객체(object)로부터의 거리" - -#: src/libslic3r/PrintConfig.cpp:1689 -msgid "" -"Distance between skirt and object(s). Set this to zero to attach the skirt " -"to the object(s) and get a brim for better adhesion." -msgstr "" -"스커트와 객체(object) 사이의 거리. 스커트를 객체(object)에 부착하고 접착력을 " -"높이기 위해 이를 0으로 설정한다." - -#: src/libslic3r/PrintConfig.cpp:1696 -msgid "Skirt height" -msgstr "스커트(Skirt) 높이" - -#: src/libslic3r/PrintConfig.cpp:1697 -msgid "" -"Height of skirt expressed in layers. Set this to a tall value to use skirt " -"as a shield against drafts." -msgstr "" -"스커트의 높이 레이어로 표현된다. 이를 높은 값으로 설정하여 스커트를 드래프트" -"에 대한 쉴ㄷ로 활용하십시오." - -#: src/libslic3r/PrintConfig.cpp:1704 -msgid "Loops (minimum)" -msgstr "루프 (최소)" - -#: src/libslic3r/PrintConfig.cpp:1705 -msgid "Skirt Loops" -msgstr "스커트 루프" - -#: src/libslic3r/PrintConfig.cpp:1706 -msgid "" -"Number of loops for the skirt. If the Minimum Extrusion Length option is " -"set, the number of loops might be greater than the one configured here. Set " -"this to zero to disable skirt completely." -msgstr "" -"스커트의 루프 수입니다. 최소 압출 길이 옵션을 설정한 경우 여기에 구성된 루프 " -"수보다 클 수 있다. 스커트를 완전히 비활성화하려면 이 값을 0으로 설정하십시오." - -#: src/libslic3r/PrintConfig.cpp:1714 -msgid "Slow down if layer print time is below" -msgstr "레이어 인쇄 시간이 다음과 같은 경우 속도를 낮추십시오" - -#: src/libslic3r/PrintConfig.cpp:1715 -msgid "" -"If layer print time is estimated below this number of seconds, print moves " -"speed will be scaled down to extend duration to this value." -msgstr "" -"층 인쇄 시간이 이 시간보다 낮게 추정될 경우, 인쇄 이동 속도는 이 값으로 지속" -"되도록 축소된다." - -#: src/libslic3r/PrintConfig.cpp:1725 -msgid "Small perimeters" -msgstr "작은 둘레" - -#: src/libslic3r/PrintConfig.cpp:1727 -msgid "" -"This separate setting will affect the speed of perimeters having radius <= " -"6.5mm (usually holes). If expressed as percentage (for example: 80%) it will " -"be calculated on the perimeters speed setting above. Set to zero for auto." -msgstr "" -"이 개별 설정은 반경이 6.5mm 미만인 속도 (일반적으로 구멍)에 영향을줍니다. 백" -"분율로 표시되는 경우 (예 : 80 %) 위의 속도 설정에서 계산됩니다. 자동으로 0으" -"로 설정하십시오." - -#: src/libslic3r/PrintConfig.cpp:1737 -msgid "Solid infill threshold area" -msgstr "솔리드 채우기 임계값" - -#: src/libslic3r/PrintConfig.cpp:1739 -msgid "" -"Force solid infill for regions having a smaller area than the specified " -"threshold." -msgstr "" -"지정된 한계값보다 작은 영역을 가진 영역에 대해 솔리드 인필을 강제 적용." - -#: src/libslic3r/PrintConfig.cpp:1740 -msgid "mm²" -msgstr "mm²" - -#: src/libslic3r/PrintConfig.cpp:1746 -msgid "Solid infill extruder" -msgstr "솔리드 인필 익스트루더" - -#: src/libslic3r/PrintConfig.cpp:1748 -msgid "The extruder to use when printing solid infill." -msgstr "꽉찬 면을 인쇄할 때 사용하는 익스트루더." - -#: src/libslic3r/PrintConfig.cpp:1754 -msgid "Solid infill every" -msgstr "솔리드 인필 간격" - -#: src/libslic3r/PrintConfig.cpp:1756 -msgid "" -"This feature allows to force a solid layer every given number of layers. " -"Zero to disable. You can set this to any value (for example 9999); Slic3r " -"will automatically choose the maximum possible number of layers to combine " -"according to nozzle diameter and layer height." -msgstr "" -"이 특징은 주어진 개수의 층마다 단단한 층을 넣을수 있게 한다. 비활성화할 수 없" -"음. 당신은 이것을 어떤 값으로도 설정할 수 있다(예: 9999). Slic3r는 노즐 직경" -"과 층 높이에 따라 결합할 최대 가능한 층 수를 자동으로 선택한다." - -#: src/libslic3r/PrintConfig.cpp:1768 -msgid "" -"Set this to a non-zero value to set a manual extrusion width for infill for " -"solid surfaces. If left zero, default extrusion width will be used if set, " -"otherwise 1.125 x nozzle diameter will be used. If expressed as percentage " -"(for example 90%) it will be computed over layer height." -msgstr "" -"이 값을 0이 아닌 값으로 설정하여 솔리드 표면 인필에 대한 수동 압출 폭을 설정" -"하십시오. 0인 경우 기본 압출 너비가 사용되며, 그렇지 않으면 1.125 x 노즐 직경" -"이 사용된다. 백분율(예: 90%)로 표현되는 경우, 계층 높이에 걸쳐 계산된다." - -#: src/libslic3r/PrintConfig.cpp:1779 -msgid "" -"Speed for printing solid regions (top/bottom/internal horizontal shells). " -"This can be expressed as a percentage (for example: 80%) over the default " -"infill speed above. Set to zero for auto." -msgstr "" -"솔리드 영역(상단/하부/내부 수평 셸) 인쇄 속도 이는 위의 기본 주입 속도에 대" -"한 백분율(예: 80%)로 표시할 수 있다. 자동을 위해 0으로 설정한다." - -#: src/libslic3r/PrintConfig.cpp:1791 -msgid "Number of solid layers to generate on top and bottom surfaces." -msgstr "상단 및 하단 표면에 생성할 솔리드 레이어 수입니다." - -#: src/libslic3r/PrintConfig.cpp:1797 src/libslic3r/PrintConfig.cpp:1798 -msgid "Minimum thickness of a top / bottom shell" -msgstr "상부/하부 쉘의 최소 두께" - -#: src/libslic3r/PrintConfig.cpp:1804 -msgid "Spiral vase" -msgstr "꽃병 모드(Spiral vase)" - -#: src/libslic3r/PrintConfig.cpp:1805 -msgid "" -"This feature will raise Z gradually while printing a single-walled object in " -"order to remove any visible seam. This option requires a single perimeter, " -"no infill, no top solid layers and no support material. You can still set " -"any number of bottom solid layers as well as skirt/brim loops. It won't work " -"when printing more than an object." -msgstr "" -"이 기능은 단일 벽 개체를 인쇄하는 동안 눈에 보이는 재봉선을 제거하기 위해 Z" -"를 점진적으로 상승시킨다. 이 옵션은 단일 둘레, 주입, 상단 솔리드 레이어 및 지" -"지 재료가 필요하지 않다. 당신은 스커트/브림 루프뿐만 아니라 아래 솔리드 레이" -"어의 수에 상관없이 설정할 수 있다. 그것은 개체보다 더 많이 인쇄할 때는 작동하" -"지 않을 것이다." - -#: src/libslic3r/PrintConfig.cpp:1813 -msgid "Temperature variation" -msgstr "온도 변화" - -#: src/libslic3r/PrintConfig.cpp:1814 -msgid "" -"Temperature difference to be applied when an extruder is not active. Enables " -"a full-height \"sacrificial\" skirt on which the nozzles are periodically " -"wiped." -msgstr "" -"돌출부가 활성화되지 않은 경우 적용되는 온도 차이. 노즐을 주기적으로 닦는 전" -"체 높이 \"인공\" 스커트가 가능하다." - -#: src/libslic3r/PrintConfig.cpp:1824 -msgid "" -"This start procedure is inserted at the beginning, after bed has reached the " -"target temperature and extruder just started heating, and before extruder " -"has finished heating. If PrusaSlicer detects M104 or M190 in your custom " -"codes, such commands will not be prepended automatically so you're free to " -"customize the order of heating commands and other custom actions. Note that " -"you can use placeholder variables for all PrusaSlicer settings, so you can " -"put a \"M109 S[first_layer_temperature]\" command wherever you want." -msgstr "" -"이 시작 절차는 배드가 목표 온도에 도달하고 압출기가 방금 가열을 시작한 후 압" -"출기가열가 완료되기 전에 처음에 삽입됩니다. PrusaSlicer사용자 지정 코드에서 " -"M104 또는 M190을 감지하는 경우 이러한 명령이 자동으로 준비되지 않으므로 가열 " -"명령 및 기타 사용자 지정 작업의 순서를 자유롭게 사용자 지정할 수 있습니다. 모" -"든 PrusaSlicer 설정에 자리 표시자 변수를 사용할 수 있으므로 원하는 위치에 " -"\"M109 S[first_layer_temperature]\" 명령을 넣을 수 있습니다." - -#: src/libslic3r/PrintConfig.cpp:1839 -msgid "" -"This start procedure is inserted at the beginning, after any printer start " -"gcode (and after any toolchange to this filament in case of multi-material " -"printers). This is used to override settings for a specific filament. If " -"PrusaSlicer detects M104, M109, M140 or M190 in your custom codes, such " -"commands will not be prepended automatically so you're free to customize the " -"order of heating commands and other custom actions. Note that you can use " -"placeholder variables for all PrusaSlicer settings, so you can put a \"M109 " -"S[first_layer_temperature]\" command wherever you want. If you have multiple " -"extruders, the gcode is processed in extruder order." -msgstr "" -"이 시작 절차는 프린터가 gcode를 시작한 후(그리고 다중 재질 프린터의 경우 이 " -"필라멘트에 대한 도구 변경 후) 처음에 삽입됩니다. 특정 필라멘트에 대한 설정을 " -"재정의하는 데 사용됩니다. PrusaSlicer가 사용자 지정 코드에서 M104, M109, " -"M140 또는 M190을 감지하면 이러한 명령이 자동으로 준비되지 않으므로 가열 명령 " -"및 기타 사용자 지정 작업의 순서를 자유롭게 사용자 지정할 수 있습니다. 모든 " -"PrusaSlicer 설정에 자리 표시자 변수를 사용할 수 있으므로 원하는 위치에 " -"\"M109 S[first_layer_temperature]\" 명령을 넣을 수 있습니다. 압출기가 여러 " -"개 있는 경우 gcode는 압출기 순서로 처리됩니다." - -#: src/libslic3r/PrintConfig.cpp:1855 -msgid "Single Extruder Multi Material" -msgstr "싱글 익스트루더 다중메터리얼" - -#: src/libslic3r/PrintConfig.cpp:1856 -msgid "The printer multiplexes filaments into a single hot end." -msgstr "프린터는 필라멘트를 하나의 핫 엔드에 다중플렉싱합니다." - -#: src/libslic3r/PrintConfig.cpp:1861 -msgid "Prime all printing extruders" -msgstr "모든 인쇄 압출기 프라임" - -#: src/libslic3r/PrintConfig.cpp:1862 -msgid "" -"If enabled, all printing extruders will be primed at the front edge of the " -"print bed at the start of the print." -msgstr "" -"활성화 된 경우, 모든 인쇄 압출기는 인쇄 시작시 프린트 베드의 전면 가장자리에 " -"프라이밍 됩니다." - -#: src/libslic3r/PrintConfig.cpp:1867 -msgid "No sparse layers (EXPERIMENTAL)" -msgstr "숨겨진 레이어층 없음(실험적)" - -#: src/libslic3r/PrintConfig.cpp:1868 -msgid "" -"If enabled, the wipe tower will not be printed on layers with no " -"toolchanges. On layers with a toolchange, extruder will travel downward to " -"print the wipe tower. User is responsible for ensuring there is no collision " -"with the print." -msgstr "" -"활성화된 경우 도구 변경 없이 레이어에 와이프 타워가 인쇄되지 않습니다. 툴체인" -"지 레이어에서 압출기는 아래쪽으로 이동하여 와이프 타워를 인쇄합니다. 사용자" -"는 인쇄물과 충돌이 없는지 확인합니다." - -#: src/libslic3r/PrintConfig.cpp:1875 -msgid "Generate support material" -msgstr "서포트 재료 생성" - -#: src/libslic3r/PrintConfig.cpp:1877 -msgid "Enable support material generation." -msgstr "서포트 재료를 사용합니다." - -#: src/libslic3r/PrintConfig.cpp:1881 -msgid "Auto generated supports" -msgstr "자동 생성 지원" - -#: src/libslic3r/PrintConfig.cpp:1883 -msgid "" -"If checked, supports will be generated automatically based on the overhang " -"threshold value. If unchecked, supports will be generated inside the " -"\"Support Enforcer\" volumes only." -msgstr "" -"이 옵션을 선택 하면 오버행 임계값에 따라 서포트가 자동으로 생성 됩니다. 이 확" -"인란을 선택 하지 않으면 \"서포트 지원 영역\" 볼륨 내 에서만 지원이 생성 됩니" -"다." - -#: src/libslic3r/PrintConfig.cpp:1889 -msgid "XY separation between an object and its support" -msgstr "개체와 그 서포트 사이 XY 분리" - -#: src/libslic3r/PrintConfig.cpp:1891 -msgid "" -"XY separation between an object and its support. If expressed as percentage " -"(for example 50%), it will be calculated over external perimeter width." -msgstr "" -"객체(object)와 그 서포트 사이의 XY 분리. 백분율 (예 : 50 %)로 표시되는 경우 " -"외부 둘레 너비를 기준으로 계산됩니다." - -#: src/libslic3r/PrintConfig.cpp:1901 -msgid "Pattern angle" -msgstr "채움 각도" - -#: src/libslic3r/PrintConfig.cpp:1903 -msgid "" -"Use this setting to rotate the support material pattern on the horizontal " -"plane." -msgstr "이 설정을 사용하여지지 평면 패턴을 수평면으로 회전시킵니다." - -#: src/libslic3r/PrintConfig.cpp:1913 src/libslic3r/PrintConfig.cpp:2677 -msgid "" -"Only create support if it lies on a build plate. Don't create support on a " -"print." -msgstr "" -"그것이 빌드 플레이트에있는 경우에만 지원을 작성하십시오. 인쇄물에 대한 지원" -"을 작성하지 마십시오." - -#: src/libslic3r/PrintConfig.cpp:1919 -msgid "Contact Z distance" -msgstr "Z 거리 문의" - -#: src/libslic3r/PrintConfig.cpp:1921 -msgid "" -"The vertical distance between object and support material interface. Setting " -"this to 0 will also prevent Slic3r from using bridge flow and speed for the " -"first object layer." -msgstr "" -"개체와 서포트 사이의 수직 거리. 이 값을 0으로 설정하면 Slic3r이 첫 번째 객체" -"(object) 레이어에 브리지 흐름과 속도를 사용하지 못하게됩니다." - -#: src/libslic3r/PrintConfig.cpp:1928 -msgid "0 (soluble)" -msgstr "0 (수용성)" - -#: src/libslic3r/PrintConfig.cpp:1929 -msgid "0.2 (detachable)" -msgstr "0.2 (분리 가능)" - -#: src/libslic3r/PrintConfig.cpp:1934 -msgid "Enforce support for the first" -msgstr "첫 번째 서포트 더 강화" - -#: src/libslic3r/PrintConfig.cpp:1936 -msgid "" -"Generate support material for the specified number of layers counting from " -"bottom, regardless of whether normal support material is enabled or not and " -"regardless of any angle threshold. This is useful for getting more adhesion " -"of objects having a very thin or poor footprint on the build plate." -msgstr "" -"일반적인 서포트 소재의 활성화 여부와, 각도 임계 값에 관계없이 하단에서부터 세" -"어 지정된 레이어 수에 대한지지 자료를 생성합니다. 이것은 빌드 플레이트에 매" -"우 얇거나 부족한 풋 프린트를 가진 개체를 더 많이 부착 할 때 유용합니다." - -#: src/libslic3r/PrintConfig.cpp:1941 -msgid "Enforce support for the first n layers" -msgstr "첫 번째 n 개의 레이어에 대한 서포트 강화" - -#: src/libslic3r/PrintConfig.cpp:1947 -msgid "Support material/raft/skirt extruder" -msgstr "서포트 재료 / 라프트 / 스커트 익스트루더" - -#: src/libslic3r/PrintConfig.cpp:1949 -msgid "" -"The extruder to use when printing support material, raft and skirt (1+, 0 to " -"use the current extruder to minimize tool changes)." -msgstr "" -"서포트 재료, 라프트 및 스커트를 인쇄 할 때 사용하는 압출기 (도구 변경을 최소" -"화하기 위해 현재 압출기를 사용하려면 1+, 0)." - -#: src/libslic3r/PrintConfig.cpp:1958 -msgid "" -"Set this to a non-zero value to set a manual extrusion width for support " -"material. If left zero, default extrusion width will be used if set, " -"otherwise nozzle diameter will be used. If expressed as percentage (for " -"example 90%) it will be computed over layer height." -msgstr "" -"서포트 재료의 수동 압출 폭을 설정하려면이 값을 0이 아닌 값으로 설정하십시오. " -"0으로 설정하면 설정된 경우 기본 압출 폭이 사용되고 그렇지 않으면 노즐 지름이 " -"사용됩니다. 백분율 (예 : 90 %)로 표현하면 레이어 높이를 기준으로 계산됩니다." - -#: src/libslic3r/PrintConfig.cpp:1967 -msgid "Interface loops" -msgstr "접점 루프" - -#: src/libslic3r/PrintConfig.cpp:1969 -msgid "" -"Cover the top contact layer of the supports with loops. Disabled by default." -msgstr "지지대의 상단 접촉 층을 루프로 덮으십시오. 기본적으로 사용 안 함." - -#: src/libslic3r/PrintConfig.cpp:1974 -msgid "Support material/raft interface extruder" -msgstr "서포트 재료/라프트 접점 익스트루더" - -#: src/libslic3r/PrintConfig.cpp:1976 -msgid "" -"The extruder to use when printing support material interface (1+, 0 to use " -"the current extruder to minimize tool changes). This affects raft too." -msgstr "" -"서포트 재료 접점를 인쇄 할 때 사용할 익스트루더 (도구 변경을 최소화하기 위해 " -"현재 익스트루더를 사용하려면 1+, 0). 이것은 라프트에도 영향을 미칩니다." - -#: src/libslic3r/PrintConfig.cpp:1983 -msgid "Interface layers" -msgstr "접점 레이어" - -#: src/libslic3r/PrintConfig.cpp:1985 -msgid "" -"Number of interface layers to insert between the object(s) and support " -"material." -msgstr "객체(object)와 서포트 재료 사이에 삽입할 접점 레이어 수입니다." - -#: src/libslic3r/PrintConfig.cpp:1992 -msgid "Interface pattern spacing" -msgstr "접점 패턴 간격" - -#: src/libslic3r/PrintConfig.cpp:1994 -msgid "Spacing between interface lines. Set zero to get a solid interface." -msgstr "접점 라인 간 간격. 솔리드 접점를 가져오려면 0을 설정하십시오." - -#: src/libslic3r/PrintConfig.cpp:2003 -msgid "" -"Speed for printing support material interface layers. If expressed as " -"percentage (for example 50%) it will be calculated over support material " -"speed." -msgstr "" -"서포트 재료 접점 레이어 인쇄 속도 백분율(예: 50%)로 표현될 경우 서포트 재료 " -"속도에 따라 계산된다." - -#: src/libslic3r/PrintConfig.cpp:2012 -msgid "Pattern" -msgstr "패턴" - -#: src/libslic3r/PrintConfig.cpp:2014 -msgid "Pattern used to generate support material." -msgstr "서포트 재료를 생성하는 데 사용되는 패턴." - -#: src/libslic3r/PrintConfig.cpp:2020 -msgid "Rectilinear grid" -msgstr "직선 그리드" - -#: src/libslic3r/PrintConfig.cpp:2026 -msgid "Pattern spacing" -msgstr "패턴 간격" - -#: src/libslic3r/PrintConfig.cpp:2028 -msgid "Spacing between support material lines." -msgstr "서포트 재료 라인 사이의 간격." - -#: src/libslic3r/PrintConfig.cpp:2037 -msgid "Speed for printing support material." -msgstr "서포트 재료를 인쇄하는 속도." - -#: src/libslic3r/PrintConfig.cpp:2044 -msgid "Synchronize with object layers" -msgstr "객체(object) 레이어와 동기화" - -#: src/libslic3r/PrintConfig.cpp:2046 -msgid "" -"Synchronize support layers with the object print layers. This is useful with " -"multi-material printers, where the extruder switch is expensive." -msgstr "" -"서포트 레이어를 프린트 레이어와 동기화하십시오. 이것은 스위치가 비싼 다중 메" -"터리얼 프린터에서 유용하다." - -#: src/libslic3r/PrintConfig.cpp:2052 -msgid "Overhang threshold" -msgstr "오버행 한계점" - -#: src/libslic3r/PrintConfig.cpp:2054 -msgid "" -"Support material will not be generated for overhangs whose slope angle (90° " -"= vertical) is above the given threshold. In other words, this value " -"represent the most horizontal slope (measured from the horizontal plane) " -"that you can print without support material. Set to zero for automatic " -"detection (recommended)." -msgstr "" -"서포트 재료는 경사각(90° = 수직)이 지정된 임계점보다 높은 압출에 대해서는 생" -"성되지 않는다. 즉, 이 값은 서포트 재료 없이 인쇄할 수 있는 가장 수평 경사(수" -"평면에서 측정됨)를 나타낸다. 자동 감지를 위해 0으로 설정하십시오(권장)." - -#: src/libslic3r/PrintConfig.cpp:2066 -msgid "With sheath around the support" -msgstr "서포트 주변이나 외부로" - -#: src/libslic3r/PrintConfig.cpp:2068 -msgid "" -"Add a sheath (a single perimeter line) around the base support. This makes " -"the support more reliable, but also more difficult to remove." -msgstr "" -"기본 서포트 주위에 외장 (단일 주변 선)을 추가하십시오. 이것은 페이스 업을보" -"다 신뢰성있게 만들뿐만 아니라 제거하기도 어렵습니다." - -#: src/libslic3r/PrintConfig.cpp:2075 -msgid "" -"Extruder temperature for layers after the first one. Set this to zero to " -"disable temperature control commands in the output." -msgstr "" -"첫 번째 것 이후에 레이어에 대한 더 낮은 온도. 이 값을 0으로 설정하면 출력에" -"서 ​​온도 제어 명령을 비활성화 할 수 있습니다." - -#: src/libslic3r/PrintConfig.cpp:2083 -msgid "Detect thin walls" -msgstr "얇은 벽(walls) 감지" - -#: src/libslic3r/PrintConfig.cpp:2085 -msgid "" -"Detect single-width walls (parts where two extrusions don't fit and we need " -"to collapse them into a single trace)." -msgstr "싱글 너비 벽 (두 부분이 맞지 않는 부분과 무너지는 부분)을 감지합니다." - -#: src/libslic3r/PrintConfig.cpp:2091 -msgid "Threads" -msgstr "스레드(Threads)" - -#: src/libslic3r/PrintConfig.cpp:2092 -msgid "" -"Threads are used to parallelize long-running tasks. Optimal threads number " -"is slightly above the number of available cores/processors." -msgstr "" -"스레드는 장기 실행 태스크를 병렬 처리하는 데 사용됩니다. 최적의 스레드 수는 " -"사용 가능한 코어 / 프로세서 수보다 약간 높습니다." - -#: src/libslic3r/PrintConfig.cpp:2104 -msgid "" -"This custom code is inserted before every toolchange. Placeholder variables " -"for all PrusaSlicer settings as well as {previous_extruder} and " -"{next_extruder} can be used. When a tool-changing command which changes to " -"the correct extruder is included (such as T{next_extruder}), PrusaSlicer " -"will emit no other such command. It is therefore possible to script custom " -"behaviour both before and after the toolchange." -msgstr "" -"이 사용자 지정 코드는 모든 도구 변경 전에 삽입됩니다. 모든 PrusaSlicer 설정" -"과 {previous_extruder} 및 {next_extruder}에 대한 자리 표시자 변수를 사용할 " -"수 있습니다. 올바른 압출기로 변경되는 도구 변경 명령(예: T{next_extruder})이 " -"포함되면 PrusaSlicer는 다른 명령을 내림차순을 내보릅니다. 따라서 도구 변경 전" -"후에 사용자 지정 동작을 스크립팅할 수 있습니다." - -#: src/libslic3r/PrintConfig.cpp:2117 -msgid "" -"Set this to a non-zero value to set a manual extrusion width for infill for " -"top surfaces. You may want to use thinner extrudates to fill all narrow " -"regions and get a smoother finish. If left zero, default extrusion width " -"will be used if set, otherwise nozzle diameter will be used. If expressed as " -"percentage (for example 90%) it will be computed over layer height." -msgstr "" -"이 값을 0이 아닌 값으로 설정하여 상단 서피스에 대한 infill의 수동 압출 폭을 " -"설정합니다. 얇은 압출 성형물을 사용하여 모든 좁은 지역을 채우고 더 매끄러운 " -"마무리를 할 수 있습니다. 0으로 설정된 경우 기본 압출 폭이 사용되고 그렇지 않" -"으면 노즐 지름이 사용됩니다. 백분율 (예 : 90 %)로 표현하면 레이어 높이를 기준" -"으로 계산됩니다." - -#: src/libslic3r/PrintConfig.cpp:2129 -msgid "" -"Speed for printing top solid layers (it only applies to the uppermost " -"external layers and not to their internal solid layers). You may want to " -"slow down this to get a nicer surface finish. This can be expressed as a " -"percentage (for example: 80%) over the solid infill speed above. Set to zero " -"for auto." -msgstr "" -"상단 솔리드 레이어 인쇄 속도 (솔리드 레이어가 아닌 최상단 외부 레이어에만 적" -"용) 표면을 더 좋게 마무리하려면 속도를 늦추시기 바랍니다. 이것은 위의 고체 충" -"전 속도에 대한 백분율 (예 : 80 %)로 나타낼 수 있습니다. 자동으로 0으로 설정하" -"십시오." - -#: src/libslic3r/PrintConfig.cpp:2144 -msgid "Number of solid layers to generate on top surfaces." -msgstr "상단 표면에 생성 할 솔리드 레이어 수입니다." - -#: src/libslic3r/PrintConfig.cpp:2145 -msgid "Top solid layers" -msgstr "탑 솔리드 레이어" - -#: src/libslic3r/PrintConfig.cpp:2153 -msgid "" -"The number of top solid layers is increased above top_solid_layers if " -"necessary to satisfy minimum thickness of top shell. This is useful to " -"prevent pillowing effect when printing with variable layer height." -msgstr "" -"상단 단층의 수는 상단 쉘의 최소 두께를 충족하기 위해 필요한 경우 " -"top_solid_layers 이상으로 증가한다. 이 기능은 가변 레이어 높이로 인쇄할 때 베" -"개 효과를 방지하는 데 유용합니다." - -#: src/libslic3r/PrintConfig.cpp:2156 -msgid "Minimum top shell thickness" -msgstr "최소 상단 쉘 두께" - -#: src/libslic3r/PrintConfig.cpp:2163 -msgid "Speed for travel moves (jumps between distant extrusion points)." -msgstr "이동 속도 (먼 돌출 점 사이의 점프)." - -#: src/libslic3r/PrintConfig.cpp:2171 -msgid "Use firmware retraction" -msgstr "펌웨어 철회" - -#: src/libslic3r/PrintConfig.cpp:2172 -msgid "" -"This experimental setting uses G10 and G11 commands to have the firmware " -"handle the retraction. This is only supported in recent Marlin." -msgstr "" -"이 실험 설정은 G10 및 G11 명령을 사용하여 펌웨어에서 취소를 처리하도록합니" -"다. 이것은 최근의 말린에서만 지원됩니다." - -#: src/libslic3r/PrintConfig.cpp:2178 -msgid "Use relative E distances" -msgstr "상대적인 E 거리 사용" - -#: src/libslic3r/PrintConfig.cpp:2179 -msgid "" -"If your firmware requires relative E values, check this, otherwise leave it " -"unchecked. Most firmwares use absolute values." -msgstr "" -"펌웨어에 상대 E 값이 필요한 경우이 값을 선택하고, 그렇지 않으면 선택하지 마십" -"시오. 대부분의 회사는 절대 값을 사용합니다." - -#: src/libslic3r/PrintConfig.cpp:2185 -msgid "Use volumetric E" -msgstr "용적 E 사용" - -#: src/libslic3r/PrintConfig.cpp:2186 -msgid "" -"This experimental setting uses outputs the E values in cubic millimeters " -"instead of linear millimeters. If your firmware doesn't already know " -"filament diameter(s), you can put commands like 'M200 D[filament_diameter_0] " -"T0' in your start G-code in order to turn volumetric mode on and use the " -"filament diameter associated to the filament selected in Slic3r. This is " -"only supported in recent Marlin." -msgstr "" -"이 실험 설정은 선형 밀리미터 대신에 입방 밀리미터 단위의 E 값을 출력으로 사용" -"합니다. 펌웨어가 필라멘트 직경을 모르는 경우 볼륨 모드를 켜고 선택한 필라멘트" -"와 연결된 필라멘트 직경을 사용하기 위해 시작 G 코드에 'M200 D " -"[filament_diameter_0] T0'과 같은 명령을 입력 할 수 있습니다 Slic3r. 이것은 최" -"근의 말린에서만 지원됩니다." - -#: src/libslic3r/PrintConfig.cpp:2196 -msgid "Enable variable layer height feature" -msgstr "가변 레이어 높이 기능 사용" - -#: src/libslic3r/PrintConfig.cpp:2197 -msgid "" -"Some printers or printer setups may have difficulties printing with a " -"variable layer height. Enabled by default." -msgstr "" -"일부 프린터 또는 프린터 설정은 가변 레이어 높이로 인쇄하는 데 어려움이있을 " -"수 있습니다. 기본적으로 사용됩니다." - -#: src/libslic3r/PrintConfig.cpp:2203 -msgid "Wipe while retracting" -msgstr "수축시 닦아내십시오" - -#: src/libslic3r/PrintConfig.cpp:2204 -msgid "" -"This flag will move the nozzle while retracting to minimize the possible " -"blob on leaky extruders." -msgstr "" -"이 플래그는 누출된 리트랙싱의 블럽 가능성을 최소화하기 위해 수축하는 동안 노" -"즐을 이동시킨다." - -#: src/libslic3r/PrintConfig.cpp:2211 -msgid "" -"Multi material printers may need to prime or purge extruders on tool " -"changes. Extrude the excess material into the wipe tower." -msgstr "" -"다중 메터리알 프린터는 공구 교환 시 익스트루더를 프라이밍하거나 제거해야 할 " -"수 있다. 과도한 물질을 와이퍼 타워에 돌출시킨다." - -#: src/libslic3r/PrintConfig.cpp:2217 -msgid "Purging volumes - load/unload volumes" -msgstr "볼륨 삭제 - 볼륨 로드/언로드" - -#: src/libslic3r/PrintConfig.cpp:2218 -msgid "" -"This vector saves required volumes to change from/to each tool used on the " -"wipe tower. These values are used to simplify creation of the full purging " -"volumes below." -msgstr "" -"이 벡터는 지우기 타워에서 사용 되는 각 도구에서/로 변경 하는 데 필요한 볼륨" -"을 저장 합니다. 이러한 값은 아래의 전체 퍼징 볼륨의 생성을 단순화 하는 데 사" -"용 됩니다." - -#: src/libslic3r/PrintConfig.cpp:2224 -msgid "Purging volumes - matrix" -msgstr "볼륨 삭제 - 행렬" - -#: src/libslic3r/PrintConfig.cpp:2225 -msgid "" -"This matrix describes volumes (in cubic milimetres) required to purge the " -"new filament on the wipe tower for any given pair of tools." -msgstr "" -"이 매트릭스는 지정 된 도구 쌍에 대해 와이퍼 타워의 새필라멘트를 제거 하는 데 " -"필요한 체적 (입방 밀리 미터)을 설명 합니다." - -#: src/libslic3r/PrintConfig.cpp:2234 -msgid "Position X" -msgstr "X축 위치" - -#: src/libslic3r/PrintConfig.cpp:2235 -msgid "X coordinate of the left front corner of a wipe tower" -msgstr "와이프 타워의 좌측 전면 모서리의 X 좌표" - -#: src/libslic3r/PrintConfig.cpp:2241 -msgid "Position Y" -msgstr "Y축 위치" - -#: src/libslic3r/PrintConfig.cpp:2242 -msgid "Y coordinate of the left front corner of a wipe tower" -msgstr "와이퍼 작동 타워의 좌측 전방 모서리의 Y 좌표" - -#: src/libslic3r/PrintConfig.cpp:2249 -msgid "Width of a wipe tower" -msgstr "와이퍼 타워 폭" - -#: src/libslic3r/PrintConfig.cpp:2255 -msgid "Wipe tower rotation angle" -msgstr "와이퍼 타워 회전각도" - -#: src/libslic3r/PrintConfig.cpp:2256 -msgid "Wipe tower rotation angle with respect to x-axis." -msgstr "X 축에 대해 타워 회전 각도를 닦습니다." - -#: src/libslic3r/PrintConfig.cpp:2263 -msgid "Wipe into this object's infill" -msgstr "이 객체(object)의 채우기로 지우기" - -#: src/libslic3r/PrintConfig.cpp:2264 -msgid "" -"Purging after toolchange will done inside this object's infills. This lowers " -"the amount of waste but may result in longer print time due to additional " -"travel moves." -msgstr "" -"도구 변경 후 제거는 이 객체(object)의 채우기 내부에서 수행 됩니다. 이렇게 하" -"면 낭비 되는 양이 줄어들지만 추가적인 이동으로 인해 인쇄 시간이 길어질 수 있" -"습니다." - -#: src/libslic3r/PrintConfig.cpp:2271 -msgid "Wipe into this object" -msgstr "이 객체(object)로 지우기" - -#: src/libslic3r/PrintConfig.cpp:2272 -msgid "" -"Object will be used to purge the nozzle after a toolchange to save material " -"that would otherwise end up in the wipe tower and decrease print time. " -"Colours of the objects will be mixed as a result." -msgstr "" -"객체(object)는 도구 변경 후 노즐을 소거 하는 데 사용 되며, 그렇지 않으면 와이" -"프 타워에서 종료 되는 재료를 저장 하고 인쇄 시간을 줄입니다. 그 결과 객체" -"(object)의 색상이 혼합 됩니다." - -#: src/libslic3r/PrintConfig.cpp:2278 -msgid "Maximal bridging distance" -msgstr "최대 브리징 거리" - -#: src/libslic3r/PrintConfig.cpp:2279 -msgid "Maximal distance between supports on sparse infill sections." -msgstr "드문드문한 인필 섹션에서 지지대 사이의 최대 거리." - -#: src/libslic3r/PrintConfig.cpp:2285 -msgid "XY Size Compensation" -msgstr "XY 수평 확장" - -#: src/libslic3r/PrintConfig.cpp:2287 -msgid "" -"The object will be grown/shrunk in the XY plane by the configured value " -"(negative = inwards, positive = outwards). This might be useful for fine-" -"tuning hole sizes." -msgstr "" -"XY 평면에서 설정된 값(음수 = 안, 양 = 바깥쪽)에 따라 객체(object)가 증가/정격" -"된다. 이는 구멍 크기를 미세 조정하는데 유용할 수 있다." - -#: src/libslic3r/PrintConfig.cpp:2295 -msgid "Z offset" -msgstr "Z 오프셋" - -#: src/libslic3r/PrintConfig.cpp:2296 -msgid "" -"This value will be added (or subtracted) from all the Z coordinates in the " -"output G-code. It is used to compensate for bad Z endstop position: for " -"example, if your endstop zero actually leaves the nozzle 0.3mm far from the " -"print bed, set this to -0.3 (or fix your endstop)." -msgstr "" -"이 값은 출력 G-code의 모든 Z 좌표에서 추가(또는 감산)된다. 예를 들어, 엔드 스" -"톱 0이 실제로 노즐을 프린트 베드에서 0.3mm 떨어진 곳에 둔 경우, 이를 -0.3(또" -"는 엔드 스톱을 고정)으로 설정하십시오." - -#: src/libslic3r/PrintConfig.cpp:2363 -msgid "Display width" -msgstr "디스플레이 너비" - -#: src/libslic3r/PrintConfig.cpp:2364 -msgid "Width of the display" -msgstr "디스플레이의 폭입니다" - -#: src/libslic3r/PrintConfig.cpp:2369 -msgid "Display height" -msgstr "표시 높이" - -#: src/libslic3r/PrintConfig.cpp:2370 -msgid "Height of the display" -msgstr "디스플레이의 높이" - -#: src/libslic3r/PrintConfig.cpp:2375 -msgid "Number of pixels in" -msgstr "의 픽셀 수" - -#: src/libslic3r/PrintConfig.cpp:2377 -msgid "Number of pixels in X" -msgstr "X의 픽셀 수" - -#: src/libslic3r/PrintConfig.cpp:2383 -msgid "Number of pixels in Y" -msgstr "Y의 픽셀 수" - -#: src/libslic3r/PrintConfig.cpp:2388 -msgid "Display horizontal mirroring" -msgstr "수평 미러링 표시" - -#: src/libslic3r/PrintConfig.cpp:2389 -msgid "Mirror horizontally" -msgstr "수평으로 미러" - -#: src/libslic3r/PrintConfig.cpp:2390 -msgid "Enable horizontal mirroring of output images" -msgstr "출력 이미지의 수평 미러링 사용" - -#: src/libslic3r/PrintConfig.cpp:2395 -msgid "Display vertical mirroring" -msgstr "수직 미러링 표시" - -#: src/libslic3r/PrintConfig.cpp:2396 -msgid "Mirror vertically" -msgstr "수직으로 미러" - -#: src/libslic3r/PrintConfig.cpp:2397 -msgid "Enable vertical mirroring of output images" -msgstr "출력 이미지의 수직 미러링 사용" - -#: src/libslic3r/PrintConfig.cpp:2402 -msgid "Display orientation" -msgstr "디스플레이 방향" - -#: src/libslic3r/PrintConfig.cpp:2403 -msgid "" -"Set the actual LCD display orientation inside the SLA printer. Portrait mode " -"will flip the meaning of display width and height parameters and the output " -"images will be rotated by 90 degrees." -msgstr "" -"SLA 프린터 내에서 실제 LCD 디스플레이 방향을 설정 합니다. 세로 모드는 디스플" -"레이 너비 및 높이 매개 변수의 의미를 반전 하 고 출력 이미지는 90도 회전 합니" -"다." - -#: src/libslic3r/PrintConfig.cpp:2409 -msgid "Landscape" -msgstr "가로" - -#: src/libslic3r/PrintConfig.cpp:2410 -msgid "Portrait" -msgstr "세로모드" - -#: src/libslic3r/PrintConfig.cpp:2415 -msgid "Fast" -msgstr "빠른" - -#: src/libslic3r/PrintConfig.cpp:2416 -msgid "Fast tilt" -msgstr "빠른 기울기" - -#: src/libslic3r/PrintConfig.cpp:2417 -msgid "Time of the fast tilt" -msgstr "기울이기 시간" - -#: src/libslic3r/PrintConfig.cpp:2424 -msgid "Slow" -msgstr "느리게" - -#: src/libslic3r/PrintConfig.cpp:2425 -msgid "Slow tilt" -msgstr "슬로우 틸트" - -#: src/libslic3r/PrintConfig.cpp:2426 -msgid "Time of the slow tilt" -msgstr "느린 기울기의 시간" - -#: src/libslic3r/PrintConfig.cpp:2433 -msgid "Area fill" -msgstr "영역 채우기" - -#: src/libslic3r/PrintConfig.cpp:2434 -msgid "" -"The percentage of the bed area. \n" -"If the print area exceeds the specified value, \n" -"then a slow tilt will be used, otherwise - a fast tilt" -msgstr "" -"배드 영역의 비율입니다. \n" -"인쇄 영역이 지정 된 값을 초과 하면 \n" -"그런 다음 느린 기울기가 사용 됩니다, 그렇지 않으면-빠른 기울기가 됩니다" - -#: src/libslic3r/PrintConfig.cpp:2441 src/libslic3r/PrintConfig.cpp:2442 -#: src/libslic3r/PrintConfig.cpp:2443 -msgid "Printer scaling correction" -msgstr "프린터 스케일링 보정" - -#: src/libslic3r/PrintConfig.cpp:2449 src/libslic3r/PrintConfig.cpp:2450 -msgid "Printer absolute correction" -msgstr "프린터 절대 보정" - -#: src/libslic3r/PrintConfig.cpp:2451 -msgid "" -"Will inflate or deflate the sliced 2D polygons according to the sign of the " -"correction." -msgstr "교정 기호에 따라 슬라이스된 2D 폴리곤을 팽창 하거나 수축 합니다." - -#: src/libslic3r/PrintConfig.cpp:2457 src/libslic3r/PrintConfig.cpp:2458 -msgid "Printer gamma correction" -msgstr "프린터 감마 보정" - -#: src/libslic3r/PrintConfig.cpp:2459 -msgid "" -"This will apply a gamma correction to the rasterized 2D polygons. A gamma " -"value of zero means thresholding with the threshold in the middle. This " -"behaviour eliminates antialiasing without losing holes in polygons." -msgstr "" -"이렇게 하면 래스터화된 2D 다각형에 감마 보정이 적용 됩니다. 감마 값이 0 이면 " -"중간에 임계값이 임계화 의미입니다. 이 동작은 폴리곤의 구멍을 잃지 않고 안티알" -"리아싱을 제거 합니다." - -#: src/libslic3r/PrintConfig.cpp:2471 src/libslic3r/PrintConfig.cpp:2472 -msgid "SLA material type" -msgstr "SLA 재질 유형" - -#: src/libslic3r/PrintConfig.cpp:2483 src/libslic3r/PrintConfig.cpp:2484 -msgid "Initial layer height" -msgstr "초기 레이어 높이" - -#: src/libslic3r/PrintConfig.cpp:2490 src/libslic3r/PrintConfig.cpp:2491 -msgid "Bottle volume" -msgstr "병 볼륨" - -#: src/libslic3r/PrintConfig.cpp:2492 -msgid "ml" -msgstr "광년" - -#: src/libslic3r/PrintConfig.cpp:2497 src/libslic3r/PrintConfig.cpp:2498 -msgid "Bottle weight" -msgstr "병 무게" - -#: src/libslic3r/PrintConfig.cpp:2499 -msgid "kg" -msgstr "kg" - -#: src/libslic3r/PrintConfig.cpp:2506 -msgid "g/ml" -msgstr "g /ml" - -#: src/libslic3r/PrintConfig.cpp:2513 -msgid "money/bottle" -msgstr "돈 /병" - -#: src/libslic3r/PrintConfig.cpp:2518 -msgid "Faded layers" -msgstr "페이드 레이어" - -#: src/libslic3r/PrintConfig.cpp:2519 -msgid "" -"Number of the layers needed for the exposure time fade from initial exposure " -"time to the exposure time" -msgstr "노출 시간에 필요한 레이어 수는 초기 노출 시간에서 노출 시간으로 페이드" - -#: src/libslic3r/PrintConfig.cpp:2526 src/libslic3r/PrintConfig.cpp:2527 -msgid "Minimum exposure time" -msgstr "최소 노출 시간" - -#: src/libslic3r/PrintConfig.cpp:2534 src/libslic3r/PrintConfig.cpp:2535 -msgid "Maximum exposure time" -msgstr "최대 노출 시간" - -#: src/libslic3r/PrintConfig.cpp:2542 src/libslic3r/PrintConfig.cpp:2543 -msgid "Exposure time" -msgstr "노출 시간" - -#: src/libslic3r/PrintConfig.cpp:2549 src/libslic3r/PrintConfig.cpp:2550 -msgid "Minimum initial exposure time" -msgstr "최소 초기 노출 시간" - -#: src/libslic3r/PrintConfig.cpp:2557 src/libslic3r/PrintConfig.cpp:2558 -msgid "Maximum initial exposure time" -msgstr "최대 초기 노출 시간" - -#: src/libslic3r/PrintConfig.cpp:2565 src/libslic3r/PrintConfig.cpp:2566 -msgid "Initial exposure time" -msgstr "초기 노출 시간" - -#: src/libslic3r/PrintConfig.cpp:2572 src/libslic3r/PrintConfig.cpp:2573 -msgid "Correction for expansion" -msgstr "확장 보정" - -#: src/libslic3r/PrintConfig.cpp:2579 -msgid "SLA print material notes" -msgstr "SLA 인쇄 재료 참고 사항" - -#: src/libslic3r/PrintConfig.cpp:2580 -msgid "You can put your notes regarding the SLA print material here." -msgstr "여기에서 SLA 인쇄 자료에 대한 메모를 넣을 수 있습니다." - -#: src/libslic3r/PrintConfig.cpp:2592 src/libslic3r/PrintConfig.cpp:2603 -msgid "Default SLA material profile" -msgstr "기본 SLA 재질 프로 파일" - -#: src/libslic3r/PrintConfig.cpp:2614 -msgid "Generate supports" -msgstr "지원 생성" - -#: src/libslic3r/PrintConfig.cpp:2616 -msgid "Generate supports for the models" -msgstr "모델에 대한 지원 생성" - -#: src/libslic3r/PrintConfig.cpp:2621 -msgid "Support head front diameter" -msgstr "서포트 헤드 전면 지름" - -#: src/libslic3r/PrintConfig.cpp:2623 -msgid "Diameter of the pointing side of the head" -msgstr "헤드 포인팅 측면 지름" - -#: src/libslic3r/PrintConfig.cpp:2630 -msgid "Support head penetration" -msgstr "서포트 헤드 관통" - -#: src/libslic3r/PrintConfig.cpp:2632 -msgid "How much the pinhead has to penetrate the model surface" -msgstr "핀 헤드가 모델 표면에 침투 하는 정도" - -#: src/libslic3r/PrintConfig.cpp:2639 -msgid "Support head width" -msgstr "서포트 헤드 폭" - -#: src/libslic3r/PrintConfig.cpp:2641 -msgid "Width from the back sphere center to the front sphere center" -msgstr "뒤쪽 구 중재봉선에서 앞쪽 구 중재봉선 까지의 폭입니다" - -#: src/libslic3r/PrintConfig.cpp:2649 -msgid "Support pillar diameter" -msgstr "서포트 기둥 지름" - -#: src/libslic3r/PrintConfig.cpp:2651 -msgid "Diameter in mm of the support pillars" -msgstr "서포트 기둥의 지름 (mm)" - -#: src/libslic3r/PrintConfig.cpp:2659 -msgid "Support pillar connection mode" -msgstr "기둥 연결 모드 지원" - -#: src/libslic3r/PrintConfig.cpp:2660 -msgid "" -"Controls the bridge type between two neighboring pillars. Can be zig-zag, " -"cross (double zig-zag) or dynamic which will automatically switch between " -"the first two depending on the distance of the two pillars." -msgstr "" -"인접한 두 기둥 사이의 교량 유형을 제어 합니다. 두 기둥의 거리에 따라 자동으" -"로 처음 두 사이를 전환 하는 지그재그, 크로스 (지그재그 더블 지그재그) 또는 동" -"적 수 있습니다." - -#: src/libslic3r/PrintConfig.cpp:2668 -msgid "Zig-Zag" -msgstr "지그재그" - -#: src/libslic3r/PrintConfig.cpp:2669 -msgid "Cross" -msgstr "크로스" - -#: src/libslic3r/PrintConfig.cpp:2670 -msgid "Dynamic" -msgstr "동적" - -#: src/libslic3r/PrintConfig.cpp:2682 -msgid "Pillar widening factor" -msgstr "기둥 확장 계수" - -#: src/libslic3r/PrintConfig.cpp:2684 -msgid "" -"Merging bridges or pillars into another pillars can increase the radius. " -"Zero means no increase, one means full increase." -msgstr "" -"브릿지 또는 기둥을 다른 기둥에 병합 하면 반지름을 늘릴 수 있습니다. 0은 증가 " -"없음을 의미 하나는 전체 증가를 의미 합니다." - -#: src/libslic3r/PrintConfig.cpp:2693 -msgid "Support base diameter" -msgstr "서포트 베이스 지름" - -#: src/libslic3r/PrintConfig.cpp:2695 -msgid "Diameter in mm of the pillar base" -msgstr "기둥 베이스의 mm 직경" - -#: src/libslic3r/PrintConfig.cpp:2703 -msgid "Support base height" -msgstr "서포트 기준 높이" - -#: src/libslic3r/PrintConfig.cpp:2705 -msgid "The height of the pillar base cone" -msgstr "서포트 베이스 원추의 높이" - -#: src/libslic3r/PrintConfig.cpp:2712 -msgid "Support base safety distance" -msgstr "지지기본 안전 거리" - -#: src/libslic3r/PrintConfig.cpp:2715 -msgid "" -"The minimum distance of the pillar base from the model in mm. Makes sense in " -"zero elevation mode where a gap according to this parameter is inserted " -"between the model and the pad." -msgstr "" -"모델에서 기둥 베이스의 최소 거리(mm.mm.)는 이 매개변수에 따른 간격이 모델과 " -"패드 사이에 삽입되는 제로 고도 모드에서 의미가 있습니다." - -#: src/libslic3r/PrintConfig.cpp:2725 -msgid "Critical angle" -msgstr "임계 각도" - -#: src/libslic3r/PrintConfig.cpp:2727 -msgid "The default angle for connecting support sticks and junctions." -msgstr "서포트 스틱과 접합부를 연결 하는 기본 각도입니다." - -#: src/libslic3r/PrintConfig.cpp:2735 -msgid "Max bridge length" -msgstr "최대 브리지 길이" - -#: src/libslic3r/PrintConfig.cpp:2737 -msgid "The max length of a bridge" -msgstr "브릿지의 최대 길이" - -#: src/libslic3r/PrintConfig.cpp:2744 -msgid "Max pillar linking distance" -msgstr "최대 기둥 연결 거리" - -#: src/libslic3r/PrintConfig.cpp:2746 -msgid "" -"The max distance of two pillars to get linked with each other. A zero value " -"will prohibit pillar cascading." -msgstr "" -"서로 연결 되는 두기둥의 최대 거리. 0 값은 기둥을 계단식으로 금지 합니다." - -#: src/libslic3r/PrintConfig.cpp:2754 -msgid "Object elevation" -msgstr "객체(object) 고도" - -#: src/libslic3r/PrintConfig.cpp:2756 -msgid "" -"How much the supports should lift up the supported object. If \"Pad around " -"object\" is enabled, this value is ignored." -msgstr "" -"지원 대상을 들어 올려야 하는 양입니다. \"개체 주위 패드\"를 사용하도록 설정하" -"면 이 값은 무시됩니다." - -#: src/libslic3r/PrintConfig.cpp:2767 -msgid "This is a relative measure of support points density." -msgstr "이는 서포트 점 밀도의 상대적인 척도입니다." - -#: src/libslic3r/PrintConfig.cpp:2773 -msgid "Minimal distance of the support points" -msgstr "서포트 지점의 최소 거리" - -#: src/libslic3r/PrintConfig.cpp:2775 -msgid "No support points will be placed closer than this threshold." -msgstr "서포트 지점은 이 임계값 보다 더 가깝게 배치 되지 않습니다." - -#: src/libslic3r/PrintConfig.cpp:2781 -msgid "Use pad" -msgstr "패드 사용" - -#: src/libslic3r/PrintConfig.cpp:2783 -msgid "Add a pad underneath the supported model" -msgstr "서포트 되는 모델 아래에 패드 추가" - -#: src/libslic3r/PrintConfig.cpp:2788 -msgid "Pad wall thickness" -msgstr "패드 벽 두께" - -#: src/libslic3r/PrintConfig.cpp:2790 -msgid "The thickness of the pad and its optional cavity walls." -msgstr "패드의 두께와 옵션 캐비티 벽." - -#: src/libslic3r/PrintConfig.cpp:2798 -msgid "Pad wall height" -msgstr "패드 벽 높이" - -#: src/libslic3r/PrintConfig.cpp:2799 -msgid "" -"Defines the pad cavity depth. Set to zero to disable the cavity. Be careful " -"when enabling this feature, as some resins may produce an extreme suction " -"effect inside the cavity, which makes peeling the print off the vat foil " -"difficult." -msgstr "" -"패드 캐비티 깊이를 정의 합니다. 캐비티를 비활성화 하려면 0으로 설정 합니다. " -"이 기능을 활성화 할 때 주의 해야할, 일부 수 캐비티 내부 극단적인 흡입 효과를 " -"생성 할 수도 있기 때문에, vat 호일 인쇄를 벗겨 어렵게 만든다." - -#: src/libslic3r/PrintConfig.cpp:2812 -msgid "Pad brim size" -msgstr "패드 브럼 사이즈" - -#: src/libslic3r/PrintConfig.cpp:2813 -msgid "How far should the pad extend around the contained geometry" -msgstr "패드가 포함된 형상 주위로 얼마나 확장되어야 하는지" - -#: src/libslic3r/PrintConfig.cpp:2823 -msgid "Max merge distance" -msgstr "최대 병합 거리" - -#: src/libslic3r/PrintConfig.cpp:2825 -msgid "" -"Some objects can get along with a few smaller pads instead of a single big " -"one. This parameter defines how far the center of two smaller pads should " -"be. If theyare closer, they will get merged into one pad." -msgstr "" -"일부 객체(object)는 큰 하나 대신 몇 가지 작은 패드와 함께 얻을 수 있습니다. " -"이 매개 변수는 두 개의 작은 패드의 중재봉선이 얼마나 되어야 하는지 정의 합니" -"다. 그들은 하나의 패드에 병합을 얻을 것이다." - -#: src/libslic3r/PrintConfig.cpp:2845 -msgid "Pad wall slope" -msgstr "패드 벽 경사" - -#: src/libslic3r/PrintConfig.cpp:2847 -msgid "" -"The slope of the pad wall relative to the bed plane. 90 degrees means " -"straight walls." -msgstr "" -"배드 평면을 기준으로 하는 패드 벽의 기울기입니다. 90도는 직선 벽을 의미 합니" -"다." - -#: src/libslic3r/PrintConfig.cpp:2856 -msgid "Pad around object" -msgstr "개체 주위패드" - -#: src/libslic3r/PrintConfig.cpp:2858 -msgid "Create pad around object and ignore the support elevation" -msgstr "오브젝트 주위에 패드를 작성하고 지지 고도를 무시합니다." - -#: src/libslic3r/PrintConfig.cpp:2863 -msgid "Pad around object everywhere" -msgstr "어디서나 개체 주위에 패드" - -#: src/libslic3r/PrintConfig.cpp:2865 -msgid "Force pad around object everywhere" -msgstr "사방 오브젝트 주위의 포스 패드" - -#: src/libslic3r/PrintConfig.cpp:2870 -msgid "Pad object gap" -msgstr "패드 객체(object) 갭" - -#: src/libslic3r/PrintConfig.cpp:2872 -msgid "" -"The gap between the object bottom and the generated pad in zero elevation " -"mode." -msgstr "0 고도 모드에서 객체(object) 바닥과 생성된 패드 사이의 간격입니다." - -#: src/libslic3r/PrintConfig.cpp:2881 -msgid "Pad object connector stride" -msgstr "패드 객체(object) 커넥터 보폭" - -#: src/libslic3r/PrintConfig.cpp:2883 -msgid "" -"Distance between two connector sticks which connect the object and the " -"generated pad." -msgstr "오브젝트와 생성된 패드를 연결하는 두 커넥터 스틱 사이의 거리입니다." - -#: src/libslic3r/PrintConfig.cpp:2890 -msgid "Pad object connector width" -msgstr "패드 객체(object) 커넥터 너비" - -#: src/libslic3r/PrintConfig.cpp:2892 -msgid "" -"Width of the connector sticks which connect the object and the generated pad." -msgstr "개체와 생성된 패드를 연결하는 커넥터 스틱의 너비입니다." - -#: src/libslic3r/PrintConfig.cpp:2899 -msgid "Pad object connector penetration" -msgstr "패드 객체(object) 커넥터 침투" - -#: src/libslic3r/PrintConfig.cpp:2902 -msgid "How much should the tiny connectors penetrate into the model body." -msgstr "작은 커넥터가 모델 본체에 얼마나 침투해야 하는가?" - -#: src/libslic3r/PrintConfig.cpp:2909 -msgid "Enable hollowing" -msgstr "속빈 공동 사용" - -#: src/libslic3r/PrintConfig.cpp:2911 -msgid "Hollow out a model to have an empty interior" -msgstr "빈 내부를 가지고 모델을 비우기" - -#: src/libslic3r/PrintConfig.cpp:2916 -msgid "Hollowing thickness" -msgstr "속빈 공동 두께" - -#: src/libslic3r/PrintConfig.cpp:2918 -msgid "Minimum wall thickness of a hollowed model." -msgstr "속이 빈 모델의 최소 벽 두께입니다." - -#: src/libslic3r/PrintConfig.cpp:2926 -msgid "Hollowing accuracy" -msgstr "속빈 공동 정확도" - -#: src/libslic3r/PrintConfig.cpp:2928 -msgid "" -"Performance vs accuracy of calculation. Lower values may produce unwanted " -"artifacts." -msgstr "" -"성능 대 계산의 정확성. 값이 낮을수록 원치 않는 아티팩트가 생성될 수 있습니다." - -#: src/libslic3r/PrintConfig.cpp:2935 -msgid "Hollowing closing distance" -msgstr "공동화된 닫힘 반경" - -#: src/libslic3r/PrintConfig.cpp:3315 -msgid "Export OBJ" -msgstr "OBJ 내보내기" - -#: src/libslic3r/PrintConfig.cpp:3316 -msgid "Export the model(s) as OBJ." -msgstr "모델을 OBJ로 내보냅니다." - -#: src/libslic3r/PrintConfig.cpp:3327 -msgid "Export SLA" -msgstr "STL로 내보내기" - -#: src/libslic3r/PrintConfig.cpp:3328 -msgid "Slice the model and export SLA printing layers as PNG." -msgstr "모델을 분할하고 SLA 인쇄 레이어를 PNG로 내보냅니다." - -#: src/libslic3r/PrintConfig.cpp:3333 -msgid "Export 3MF" -msgstr "3MF 내보내기" - -#: src/libslic3r/PrintConfig.cpp:3334 -msgid "Export the model(s) as 3MF." -msgstr "모델을 3MF로 내보냅니다." - -#: src/libslic3r/PrintConfig.cpp:3338 -msgid "Export AMF" -msgstr "AMF 내보내기" - -#: src/libslic3r/PrintConfig.cpp:3339 -msgid "Export the model(s) as AMF." -msgstr "모델을 AMF로 내보냅니다." - -#: src/libslic3r/PrintConfig.cpp:3343 -msgid "Export STL" -msgstr "STL 내보내기" - -#: src/libslic3r/PrintConfig.cpp:3344 -msgid "Export the model(s) as STL." -msgstr "모델을 STL로 내보냅니다." - -#: src/libslic3r/PrintConfig.cpp:3349 -msgid "Slice the model and export toolpaths as G-code." -msgstr "모델을 슬라이스하고 공구 경로를 G 코드로 내보냅니다." - -#: src/libslic3r/PrintConfig.cpp:3354 -msgid "Slice" -msgstr "슬라이스" - -#: src/libslic3r/PrintConfig.cpp:3355 -msgid "" -"Slice the model as FFF or SLA based on the printer_technology configuration " -"value." -msgstr "" -" printer_technology 구성 값을 기반으로 모델을 FFF 또는 SLA로 슬라이스합니다." - -#: src/libslic3r/PrintConfig.cpp:3360 -msgid "Help" -msgstr "도움말" - -#: src/libslic3r/PrintConfig.cpp:3361 -msgid "Show this help." -msgstr "이 도움말을 표시 합니다." - -#: src/libslic3r/PrintConfig.cpp:3366 -msgid "Help (FFF options)" -msgstr "도움말 (FFF 옵션)" - -#: src/libslic3r/PrintConfig.cpp:3367 -msgid "Show the full list of print/G-code configuration options." -msgstr "인쇄/G 코드 구성 옵션의 전체 목록을 표시 합니다." - -#: src/libslic3r/PrintConfig.cpp:3371 -msgid "Help (SLA options)" -msgstr "도움말 (SLA 옵션)" - -#: src/libslic3r/PrintConfig.cpp:3372 -msgid "Show the full list of SLA print configuration options." -msgstr "SLA 인쇄 구성 옵션의 전체 목록을 표시 합니다." - -#: src/libslic3r/PrintConfig.cpp:3376 -msgid "Output Model Info" -msgstr "출력 모델 정보" - -#: src/libslic3r/PrintConfig.cpp:3377 -msgid "Write information about the model to the console." -msgstr "모델에 대한 정보를 콘솔에 씁니다." - -#: src/libslic3r/PrintConfig.cpp:3381 -msgid "Save config file" -msgstr "구성 파일 저장" - -#: src/libslic3r/PrintConfig.cpp:3382 -msgid "Save configuration to the specified file." -msgstr "지정 된 파일에 구성을 저장 합니다." - -#: src/libslic3r/PrintConfig.cpp:3392 -msgid "Align XY" -msgstr "XY 정렬" - -#: src/libslic3r/PrintConfig.cpp:3393 -msgid "Align the model to the given point." -msgstr "모델을 지정된 점에 맞춥니다." - -#: src/libslic3r/PrintConfig.cpp:3398 -msgid "Cut model at the given Z." -msgstr "지정된 Z에서 모델을 잘라냅니다." - -#: src/libslic3r/PrintConfig.cpp:3419 -msgid "Center" -msgstr "중앙" - -#: src/libslic3r/PrintConfig.cpp:3420 -msgid "Center the print around the given center." -msgstr "지정된 점을 중재봉선으로 인쇄 합니다." - -#: src/libslic3r/PrintConfig.cpp:3424 -msgid "Don't arrange" -msgstr "준비하지 마십시오" - -#: src/libslic3r/PrintConfig.cpp:3425 -msgid "" -"Do not rearrange the given models before merging and keep their original XY " -"coordinates." -msgstr "" -"병합하기 전에 지정된 모델을 재정렬하고 원래 XY 좌표를 유지하지 마십시오." - -#: src/libslic3r/PrintConfig.cpp:3428 -msgid "Duplicate" -msgstr "복사" - -#: src/libslic3r/PrintConfig.cpp:3429 -msgid "Multiply copies by this factor." -msgstr "이 계수로 복사본을 곱합니다." - -#: src/libslic3r/PrintConfig.cpp:3433 -msgid "Duplicate by grid" -msgstr "모눈에 따라 복제" - -#: src/libslic3r/PrintConfig.cpp:3434 -msgid "Multiply copies by creating a grid." -msgstr "그리드를 만들어 복사본을 곱합니다." - -#: src/libslic3r/PrintConfig.cpp:3437 -msgid "Merge" -msgstr "병합" - -#: src/libslic3r/PrintConfig.cpp:3438 -msgid "" -"Arrange the supplied models in a plate and merge them in a single model in " -"order to perform actions once." -msgstr "" -"한 번 작업을 수행하기 위해 제공 된 모델을 정렬하고 단일 모델로 병합 합니다." - -#: src/libslic3r/PrintConfig.cpp:3443 -msgid "" -"Try to repair any non-manifold meshes (this option is implicitly added " -"whenever we need to slice the model to perform the requested action)." -msgstr "" -"메쉬를 복구 하십시오 (요청 된 작업을 수행 하기 위해 모델을 슬라이스 해야 할때" -"마다 이 옵션이 암시적으로 추가 됨)." - -#: src/libslic3r/PrintConfig.cpp:3447 -msgid "Rotation angle around the Z axis in degrees." -msgstr "Z 축 주위 회전 각도입니다." - -#: src/libslic3r/PrintConfig.cpp:3451 -msgid "Rotate around X" -msgstr "X 주위 회전" - -#: src/libslic3r/PrintConfig.cpp:3452 -msgid "Rotation angle around the X axis in degrees." -msgstr "X 축을 중재봉선 회전 각도 입니다." - -#: src/libslic3r/PrintConfig.cpp:3456 -msgid "Rotate around Y" -msgstr "Y 주위로 회전" - -#: src/libslic3r/PrintConfig.cpp:3457 -msgid "Rotation angle around the Y axis in degrees." -msgstr "Y 축을 중재봉선 회전 각도 입니다." - -#: src/libslic3r/PrintConfig.cpp:3462 -msgid "Scaling factor or percentage." -msgstr "배율 인수 또는 백분율입니다." - -#: src/libslic3r/PrintConfig.cpp:3467 -msgid "" -"Detect unconnected parts in the given model(s) and split them into separate " -"objects." -msgstr "" -"지정 된 모델에서 연결 되지 않은 부품(Part)을 감지 하여 별도의 객체(object)로 " -"분할 합니다." - -#: src/libslic3r/PrintConfig.cpp:3470 -msgid "Scale to Fit" -msgstr "크기에 맞게 조정" - -#: src/libslic3r/PrintConfig.cpp:3471 -msgid "Scale to fit the given volume." -msgstr "지정 된 볼륨에 맞게 크기를 조정 합니다." - -#: src/libslic3r/PrintConfig.cpp:3480 -msgid "Ignore non-existent config files" -msgstr "존재 하지 않는 구성 파일 무시" - -#: src/libslic3r/PrintConfig.cpp:3481 -msgid "Do not fail if a file supplied to --load does not exist." -msgstr "로드에 제공 된 파일이 없는 경우 실패 하지 않습니다." - -#: src/libslic3r/PrintConfig.cpp:3484 -msgid "Load config file" -msgstr "구성 파일 로드" - -#: src/libslic3r/PrintConfig.cpp:3485 -msgid "" -"Load configuration from the specified file. It can be used more than once to " -"load options from multiple files." -msgstr "" -"지정 된 파일에서 구성을 로드 합니다. 여러 파일에서 옵션을 로드 하는 데 두 번 " -"이상 사용할 수 있습니다." - -#: src/libslic3r/PrintConfig.cpp:3488 -msgid "Output File" -msgstr "출력파일" - -#: src/libslic3r/PrintConfig.cpp:3489 -msgid "" -"The file where the output will be written (if not specified, it will be " -"based on the input file)." -msgstr "" -"출력이 기록 되는 파일 (지정 하지 않은 경우 입력 파일을 기반으로 합니다)." - -#: src/libslic3r/PrintConfig.cpp:3499 -msgid "Data directory" -msgstr "데이터 디렉터리" - -#: src/libslic3r/PrintConfig.cpp:3500 -msgid "" -"Load and store settings at the given directory. This is useful for " -"maintaining different profiles or including configurations from a network " -"storage." -msgstr "" -"지정 된 디렉터리에 설정을 로드 하 고 저장 합니다. 이 기능은 다른 프로 파일을 " -"유지 관리 하거나 네트워크 스토리지의 구성을 포함 하는 데 유용 합니다." - -#: src/libslic3r/PrintConfig.cpp:3503 -msgid "Logging level" -msgstr "로깅 수준" - -#: src/libslic3r/PrintConfig.cpp:3504 -msgid "" -"Sets logging sensitivity. 0:fatal, 1:error, 2:warning, 3:info, 4:debug, 5:" -"trace\n" -"For example. loglevel=2 logs fatal, error and warning level messages." -msgstr "" -"로깅 민감도를 설정합니다. 0:치명적, 1:오류, 2:경고, 3:info, 4:디버그, 5:" -"trace\n" -"예를 들어. loglevel=2 치명적인, 오류 및 경고 수준 메시지를 기록합니다." - -#: src/libslic3r/PrintConfig.cpp:3510 -msgid "Render with a software renderer" -msgstr "소프트웨어 렌더러를 사용 하 여 렌더링" - -#: src/libslic3r/PrintConfig.cpp:3511 -msgid "" -"Render with a software renderer. The bundled MESA software renderer is " -"loaded instead of the default OpenGL driver." -msgstr "" -"소프트웨어 렌더러를 사용 하여 렌더링 합니다. 번들 메사 소프트웨어 렌더러는 기" -"본 OpenGL 드라이버 대신 로드 됩니다." - -#: src/libslic3r/PrintObject.cpp:108 -msgid "Processing triangulated mesh" -msgstr "삼각 측정 메쉬 처리" - -#: src/libslic3r/PrintObject.cpp:152 -msgid "Generating perimeters" -msgstr "둘레 생성" - -#: src/libslic3r/PrintObject.cpp:255 -msgid "Preparing infill" -msgstr "채우기 준비" - -#: src/libslic3r/PrintObject.cpp:395 -msgid "Generating support material" -msgstr "지원할 서포트 생성" - -#: src/libslic3r/GCode/PreviewData.cpp:347 -msgid "Height (mm)" -msgstr "높이 (mm)" - -#: src/libslic3r/GCode/PreviewData.cpp:349 -msgid "Width (mm)" -msgstr "폭 (mm)" - -#: src/libslic3r/GCode/PreviewData.cpp:351 -msgid "Speed (mm/s)" -msgstr "속도 (mm/s)" - -#: src/libslic3r/GCode/PreviewData.cpp:353 -msgid "Fan Speed (%)" -msgstr "팬 속도(%)" - -#: src/libslic3r/GCode/PreviewData.cpp:355 -msgid "Volumetric flow rate (mm³/s)" -msgstr "체적 유량(mm³/s)" diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index 83dc21cec7..92132956b6 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -257,10 +257,9 @@ void Tab::create_preset_tab() // Fill cache for mode bitmaps m_mode_bitmap_cache.reserve(3); - int icon_px = 14; - m_mode_bitmap_cache.push_back(ScalableBitmap(this, "mode_simple" , icon_px)); - m_mode_bitmap_cache.push_back(ScalableBitmap(this, "mode_advanced", icon_px)); - m_mode_bitmap_cache.push_back(ScalableBitmap(this, "mode_expert" , icon_px)); + m_mode_bitmap_cache.push_back(ScalableBitmap(this, "mode_simple" , mode_icon_px_size())); + m_mode_bitmap_cache.push_back(ScalableBitmap(this, "mode_advanced", mode_icon_px_size())); + m_mode_bitmap_cache.push_back(ScalableBitmap(this, "mode_expert" , mode_icon_px_size())); // Initialize the DynamicPrintConfig by default keys/values. build(); diff --git a/src/slic3r/GUI/wxExtensions.cpp b/src/slic3r/GUI/wxExtensions.cpp index e6d928b255..939c6d1dce 100644 --- a/src/slic3r/GUI/wxExtensions.cpp +++ b/src/slic3r/GUI/wxExtensions.cpp @@ -486,6 +486,15 @@ int em_unit(wxWindow* win) return Slic3r::GUI::wxGetApp().em_unit(); } +int mode_icon_px_size() +{ +#ifdef __APPLE__ + return 10; +#else + return 12; +#endif +} + // win is used to get a correct em_unit value // It's important for bitmaps of dialogs. // if win == nullptr, em_unit value of MainFrame will be used @@ -753,7 +762,7 @@ ModeSizer::ModeSizer(wxWindow *parent, int hgap/* = 0*/) : m_mode_btns.reserve(3); for (const auto& button : buttons) { - m_mode_btns.push_back(new ModeButton(parent, button.first, button.second, 14)); + m_mode_btns.push_back(new ModeButton(parent, button.first, button.second, mode_icon_px_size())); m_mode_btns.back()->Bind(wxEVT_BUTTON, std::bind(modebtnfn, std::placeholders::_1, int(m_mode_btns.size() - 1))); Add(m_mode_btns.back()); diff --git a/src/slic3r/GUI/wxExtensions.hpp b/src/slic3r/GUI/wxExtensions.hpp index 839a122c40..38d726ad39 100644 --- a/src/slic3r/GUI/wxExtensions.hpp +++ b/src/slic3r/GUI/wxExtensions.hpp @@ -45,6 +45,7 @@ class wxDialog; void edit_tooltip(wxString& tooltip); void msw_buttons_rescale(wxDialog* dlg, const int em_unit, const std::vector& btn_ids); int em_unit(wxWindow* win); +int mode_icon_px_size(); wxBitmap create_scaled_bitmap(const std::string& bmp_name, wxWindow *win = nullptr, const int px_cnt = 16, const bool grayscale = false); From 6d0cf167970ab908a803a8683ad3e7fe04e1e6bc Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Tue, 11 Feb 2020 00:58:19 +0100 Subject: [PATCH 310/336] Export STL exports hollowed & drilled mesh (if it is shown) --- src/slic3r/GUI/Plater.cpp | 146 ++++++++++++++++++++++---------------- 1 file changed, 83 insertions(+), 63 deletions(-) diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 7e206bba20..1e753206a4 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -4893,85 +4893,105 @@ void Plater::export_stl(bool extended, bool selection_only) wxBusyCursor wait; + const auto &selection = p->get_selection(); + const auto obj_idx = selection.get_object_idx(); + if (selection_only && (obj_idx == -1 || selection.is_wipe_tower())) + return; + TriangleMesh mesh; - if (selection_only) { - const auto &selection = p->get_selection(); - if (selection.is_wipe_tower()) { return; } - - const auto obj_idx = selection.get_object_idx(); - if (obj_idx == -1) { return; } - - const ModelObject* model_object = p->model.objects[obj_idx]; - if (selection.get_mode() == Selection::Instance) - { - if (selection.is_single_full_object()) - mesh = model_object->mesh(); + if (p->printer_technology == ptFFF) { + if (selection_only) { + const ModelObject* model_object = p->model.objects[obj_idx]; + if (selection.get_mode() == Selection::Instance) + { + if (selection.is_single_full_object()) + mesh = model_object->mesh(); + else + mesh = model_object->full_raw_mesh(); + } else - mesh = model_object->full_raw_mesh(); + { + const GLVolume* volume = selection.get_volume(*selection.get_volume_idxs().begin()); + mesh = model_object->volumes[volume->volume_idx()]->mesh(); + mesh.transform(volume->get_volume_transformation().get_matrix()); + mesh.translate(-model_object->origin_translation.cast()); + } } - else - { - const GLVolume* volume = selection.get_volume(*selection.get_volume_idxs().begin()); - mesh = model_object->volumes[volume->volume_idx()]->mesh(); - mesh.transform(volume->get_volume_transformation().get_matrix()); - mesh.translate(-model_object->origin_translation.cast()); + else { + mesh = p->model.mesh(); } } else { - mesh = p->model.mesh(); + // This is SLA mode, all objects have only one volume. + // However, we must have a look at the backend to load + // hollowed mesh and/or supports - if (extended && (p->printer_technology == ptSLA)) + const PrintObjects& objects = p->sla_print.objects(); + for (const SLAPrintObject* object : objects) { - const PrintObjects& objects = p->sla_print.objects(); - for (const SLAPrintObject* object : objects) + const ModelObject* model_object = object->model_object(); + if (selection_only) { + if (model_object->id() != p->model.objects[obj_idx]->id()) + continue; + } + Transform3d mesh_trafo_inv = object->trafo().inverse(); + bool is_left_handed = object->is_left_handed(); + + TriangleMesh pad_mesh; + bool has_pad_mesh = extended && object->has_mesh(slaposPad); + if (has_pad_mesh) { - const ModelObject* model_object = object->model_object(); - Transform3d mesh_trafo_inv = object->trafo().inverse(); - bool is_left_handed = object->is_left_handed(); + pad_mesh = object->get_mesh(slaposPad); + pad_mesh.transform(mesh_trafo_inv); + } - TriangleMesh pad_mesh; - bool has_pad_mesh = object->has_mesh(slaposPad); - if (has_pad_mesh) + TriangleMesh supports_mesh; + bool has_supports_mesh = extended && object->has_mesh(slaposSupportTree); + if (has_supports_mesh) + { + supports_mesh = object->get_mesh(slaposSupportTree); + supports_mesh.transform(mesh_trafo_inv); + } + + const std::vector& obj_instances = object->instances(); + for (const SLAPrintObject::Instance& obj_instance : obj_instances) + { + auto it = std::find_if(model_object->instances.begin(), model_object->instances.end(), + [&obj_instance](const ModelInstance *mi) { return mi->id() == obj_instance.instance_id; }); + assert(it != model_object->instances.end()); + + if (it != model_object->instances.end()) { - pad_mesh = object->get_mesh(slaposPad); - pad_mesh.transform(mesh_trafo_inv); - } + bool one_inst_only = selection_only && ! selection.is_single_full_object(); - TriangleMesh supports_mesh; - bool has_supports_mesh = object->has_mesh(slaposSupportTree); - if (has_supports_mesh) - { - supports_mesh = object->get_mesh(slaposSupportTree); - supports_mesh.transform(mesh_trafo_inv); - } + int instance_idx = it - model_object->instances.begin(); + const Transform3d& inst_transform = one_inst_only + ? Transform3d::Identity() + : object->model_object()->instances[instance_idx]->get_transformation().get_matrix(); - const std::vector& obj_instances = object->instances(); - for (const SLAPrintObject::Instance& obj_instance : obj_instances) - { - auto it = std::find_if(model_object->instances.begin(), model_object->instances.end(), - [&obj_instance](const ModelInstance *mi) { return mi->id() == obj_instance.instance_id; }); - assert(it != model_object->instances.end()); - - if (it != model_object->instances.end()) + if (has_pad_mesh) { - int instance_idx = it - model_object->instances.begin(); - const Transform3d& inst_transform = object->model_object()->instances[instance_idx]->get_transformation().get_matrix(); - - if (has_pad_mesh) - { - TriangleMesh inst_pad_mesh = pad_mesh; - inst_pad_mesh.transform(inst_transform, is_left_handed); - mesh.merge(inst_pad_mesh); - } - - if (has_supports_mesh) - { - TriangleMesh inst_supports_mesh = supports_mesh; - inst_supports_mesh.transform(inst_transform, is_left_handed); - mesh.merge(inst_supports_mesh); - } + TriangleMesh inst_pad_mesh = pad_mesh; + inst_pad_mesh.transform(inst_transform, is_left_handed); + mesh.merge(inst_pad_mesh); } + + if (has_supports_mesh) + { + TriangleMesh inst_supports_mesh = supports_mesh; + inst_supports_mesh.transform(inst_transform, is_left_handed); + mesh.merge(inst_supports_mesh); + } + + TriangleMesh inst_object_mesh = object->get_mesh_to_print(); + inst_object_mesh.translate(0.f, 0.f, -object->get_elevation()); + inst_object_mesh.transform(inst_transform, is_left_handed); + + mesh.merge(inst_object_mesh); + + if (one_inst_only) + break; } } } From dc375be682356d1fcd248b16e0c6cdcb019c6e16 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Tue, 11 Feb 2020 14:27:44 +0100 Subject: [PATCH 311/336] Rework of keyboard shortcut dialog layout -> use wxListbook on top --- src/slic3r/GUI/KBShortcutsDialog.cpp | 416 ++++++++++++++------------- src/slic3r/GUI/KBShortcutsDialog.hpp | 18 +- 2 files changed, 220 insertions(+), 214 deletions(-) diff --git a/src/slic3r/GUI/KBShortcutsDialog.cpp b/src/slic3r/GUI/KBShortcutsDialog.cpp index 30f1d9ec0b..34b6d7d9d0 100644 --- a/src/slic3r/GUI/KBShortcutsDialog.cpp +++ b/src/slic3r/GUI/KBShortcutsDialog.cpp @@ -7,204 +7,72 @@ #include "GUI_App.hpp" #include "wxExtensions.hpp" +#define NOTEBOOK_TOP 1 +#define NOTEBOOK_LEFT 2 +#define LISTBOOK_TOP 3 +#define LISTBOOK_LEFT 4 +#define TOOLBOOK 5 +#define CHOICEBOOK 6 +#define BOOK_TYPE LISTBOOK_TOP + +#if (BOOK_TYPE == NOTEBOOK_TOP) || (BOOK_TYPE == NOTEBOOK_LEFT) +#include +#elif (BOOK_TYPE == LISTBOOK_TOP) || (BOOK_TYPE == LISTBOOK_LEFT) +#include +#elif BOOK_TYPE == TOOLBOOK +#include +#elif BOOK_TYPE == CHOICEBOOK +#include +#endif // BOOK_TYPE + namespace Slic3r { namespace GUI { KBShortcutsDialog::KBShortcutsDialog() : DPIDialog(NULL, wxID_ANY, wxString(SLIC3R_APP_NAME) + " - " + _(L("Keyboard Shortcuts")), - wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER) + wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE) // | wxRESIZE_BORDER) { SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW)); - auto main_sizer = new wxBoxSizer(wxVERTICAL); - - // logo - m_logo_bmp = ScalableBitmap(this, "PrusaSlicer_32px.png", 32); - // fonts const wxFont& font = wxGetApp().normal_font(); const wxFont& bold_font = wxGetApp().bold_font(); SetFont(font); - wxFont head_font = bold_font; -#ifdef __WXOSX__ - head_font.SetPointSize(14); -#else - head_font.SetPointSize(bold_font.GetPointSize() + 2); -#endif // __WXOSX__ + auto main_sizer = new wxBoxSizer(wxVERTICAL); + + main_sizer->Add(create_header(this, bold_font), 0, wxEXPAND | wxALL, 10); + +#if BOOK_TYPE == NOTEBOOK_TOP + wxNotebook* book = new wxNotebook(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNB_TOP); +#elif BOOK_TYPE == NOTEBOOK_LEFT + wxNotebook* book = new wxNotebook(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNB_LEFT); +#elif BOOK_TYPE == LISTBOOK_TOP + wxListbook* book = new wxListbook(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLB_TOP); +#elif BOOK_TYPE == LISTBOOK_LEFT + wxListbook* book = new wxListbook(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLB_LEFT); +#elif BOOK_TYPE == TOOLBOOK + wxToolbook* book = new wxToolbook(this, wxID_ANY); +#elif BOOK_TYPE == CHOICEBOOK + wxChoicebook* book = new wxChoicebook(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxCHB_TOP); +#endif // BOOK_TYPE +main_sizer->Add(book, 1, wxEXPAND | wxALL, 10); fill_shortcuts(); - - panel = new wxScrolledWindow(this, wxID_ANY, wxDefaultPosition, get_size()); - panel->SetScrollbars(1, 20, 1, 2); - - auto main_grid_sizer = new wxFlexGridSizer(2, 10, 10); - panel->SetSizer(main_grid_sizer); - main_sizer->Add(panel, 1, wxEXPAND | wxALL, 0); - - wxBoxSizer* l_sizer = new wxBoxSizer(wxVERTICAL); - main_grid_sizer->Add(l_sizer, 0); - - wxBoxSizer* r_sizer = new wxBoxSizer(wxVERTICAL); - main_grid_sizer->Add(r_sizer, 0); - - m_head_bitmaps.reserve(m_full_shortcuts.size()); - - for (auto& shortcut : m_full_shortcuts) + for (size_t i = 0; i < m_full_shortcuts.size(); ++i) { - auto sizer = shortcut.second.second == szLeft ? l_sizer : r_sizer; - wxBoxSizer* hsizer = new wxBoxSizer(wxHORIZONTAL); - sizer->Add(hsizer, 0, wxEXPAND | wxTOP | wxBOTTOM, 10); - - // logo - m_head_bitmaps.push_back(new wxStaticBitmap(panel, wxID_ANY, m_logo_bmp.bmp())); - hsizer->Add(m_head_bitmaps.back(), 0, wxEXPAND | wxLEFT | wxRIGHT, 15); - - // head - wxStaticText* head = new wxStaticText(panel, wxID_ANY, shortcut.first); - head->SetFont(head_font); - hsizer->Add(head, 0, wxALIGN_CENTER_VERTICAL); - - - // Shortcuts list - auto grid_sizer = new wxFlexGridSizer(2, 5, 15); - sizer->Add(grid_sizer, 0, wxEXPAND | wxLEFT| wxRIGHT, 15); - - for (auto pair : shortcut.second.first) - { - auto shortcut = new wxStaticText(panel, wxID_ANY, _(pair.first)); - shortcut->SetFont(bold_font); - grid_sizer->Add(shortcut, -1, wxALIGN_CENTRE_VERTICAL); - - auto description = new wxStaticText(panel, wxID_ANY, _(pair.second)); - description->SetFont(font); - grid_sizer->Add(description, -1, wxALIGN_CENTRE_VERTICAL); - } + book->AddPage(create_page(book, m_full_shortcuts[i], font, bold_font), m_full_shortcuts[i].first, i == 0); } wxStdDialogButtonSizer* buttons = this->CreateStdDialogButtonSizer(wxOK); - this->SetEscapeId(wxID_OK); - this->Bind(wxEVT_BUTTON, &KBShortcutsDialog::onCloseDialog, this, wxID_OK); - main_sizer->Add(buttons, 0, wxEXPAND | wxRIGHT | wxBOTTOM, 15); - - this->Bind(wxEVT_LEFT_DOWN, &KBShortcutsDialog::onCloseDialog, this); + main_sizer->Add(buttons, 0, wxEXPAND | wxALL, 10); SetSizer(main_sizer); main_sizer->SetSizeHints(this); } -void KBShortcutsDialog::fill_shortcuts() -{ - const std::string &ctrl = GUI::shortkey_ctrl_prefix(); - const std::string &alt = GUI::shortkey_alt_prefix(); - - m_full_shortcuts.reserve(4); - - Shortcuts main_shortcuts; - main_shortcuts.reserve(25); - - main_shortcuts.push_back(Shortcut(ctrl+"O" ,L("Open project STL/OBJ/AMF/3MF with config, delete bed"))); - main_shortcuts.push_back(Shortcut(ctrl+"I" ,L("Import STL/OBJ/AMF/3MF without config, keep bed"))); - main_shortcuts.push_back(Shortcut(ctrl+"L" ,L("Load Config from .ini/amf/3mf/gcode"))); - main_shortcuts.push_back(Shortcut(ctrl+"G" ,L("Export G-code"))); - main_shortcuts.push_back(Shortcut(ctrl+"S" ,L("Save project (3MF)"))); - main_shortcuts.push_back(Shortcut(ctrl+alt+"L" ,L("Load Config from .ini/amf/3mf/gcode and merge"))); - main_shortcuts.push_back(Shortcut(ctrl+"R" ,L("(Re)slice"))); -// main_shortcuts.push_back(Shortcut(ctrl+"U" ,L("Quick slice"))); -// main_shortcuts.push_back(Shortcut(ctrl+"Shift+U" ,L("Repeat last quick slice"))); - main_shortcuts.push_back(Shortcut(ctrl+"1" ,L("Select Plater Tab"))); -// main_shortcuts.push_back(Shortcut(ctrl+alt+"U" ,L("Quick slice and Save as"))); - main_shortcuts.push_back(Shortcut(ctrl+"2" ,L("Select Print Settings Tab"))); - main_shortcuts.push_back(Shortcut(ctrl+"3" ,L("Select Filament Settings Tab"))); - main_shortcuts.push_back(Shortcut(ctrl+"4" ,L("Select Printer Settings Tab"))); - main_shortcuts.push_back(Shortcut(ctrl+"5" ,L("Switch to 3D"))); - main_shortcuts.push_back(Shortcut(ctrl+"6" ,L("Switch to Preview"))); - main_shortcuts.push_back(Shortcut(ctrl+"P" ,L("Preferences"))); - main_shortcuts.push_back(Shortcut(ctrl+"J" ,L("Print host upload queue"))); - main_shortcuts.push_back(Shortcut("0-6" ,L("Camera view"))); - main_shortcuts.push_back(Shortcut("+" ,L("Add Instance of the selected object"))); - main_shortcuts.push_back(Shortcut("-" ,L("Remove Instance of the selected object"))); - main_shortcuts.push_back(Shortcut("?" ,L("Show keyboard shortcuts list"))); - main_shortcuts.push_back(Shortcut(ctrl/*+"LeftMouse"*/,L("Press to select multiple object or move multiple object with mouse"))); - - m_full_shortcuts.push_back(std::make_pair(_(L("Main Shortcuts")), std::make_pair(main_shortcuts, szLeft))); - - - Shortcuts plater_shortcuts; - plater_shortcuts.reserve(20); - - plater_shortcuts.push_back(Shortcut("A", L("Arrange"))); - plater_shortcuts.push_back(Shortcut("Shift+A", L("Arrange selection"))); - plater_shortcuts.push_back(Shortcut(ctrl+"A", L("Select All objects"))); - plater_shortcuts.push_back(Shortcut("Del", L("Delete selected"))); - plater_shortcuts.push_back(Shortcut(ctrl+"Del", L("Delete All"))); - plater_shortcuts.push_back(Shortcut(ctrl+"C", L("Copy to clipboard"))); - plater_shortcuts.push_back(Shortcut(ctrl+"V", L("Paste from clipboard"))); - plater_shortcuts.push_back(Shortcut("M", L("Gizmo move"))); - plater_shortcuts.push_back(Shortcut("S", L("Gizmo scale"))); - plater_shortcuts.push_back(Shortcut("R", L("Gizmo rotate"))); - plater_shortcuts.push_back(Shortcut("C", L("Gizmo cut"))); - plater_shortcuts.push_back(Shortcut("F", L("Gizmo Place face on bed"))); - plater_shortcuts.push_back(Shortcut("L", L("Gizmo SLA support points"))); - plater_shortcuts.push_back(Shortcut("Shift+", L("Press to activate selection rectangle\nor to snap by 5% in Gizmo scale\nor to snap by 1mm in Gizmo move"))); - plater_shortcuts.push_back(Shortcut("F", L("Press to scale selection to fit print volume\nin Gizmo scale"))); - plater_shortcuts.push_back(Shortcut(alt, L("Press to activate deselection rectangle\nor to scale or rotate selected objects\naround their own center"))); - plater_shortcuts.push_back(Shortcut(ctrl, L("Press to activate one direction scaling in Gizmo scale"))); - plater_shortcuts.push_back(Shortcut("K", L("Change camera type (perspective, orthographic)"))); - plater_shortcuts.push_back(Shortcut("B", L("Zoom to Bed"))); - plater_shortcuts.push_back(Shortcut("Z", L("Zoom to all objects in scene, if none selected"))); - plater_shortcuts.push_back(Shortcut("Z", L("Zoom to selected object"))); - plater_shortcuts.push_back(Shortcut("I", L("Zoom in"))); - plater_shortcuts.push_back(Shortcut("O", L("Zoom out"))); -#if ENABLE_SHOW_SCENE_LABELS - plater_shortcuts.push_back(Shortcut("E", L("Show/Hide object/instance labels"))); -#endif // ENABLE_SHOW_SCENE_LABELS - plater_shortcuts.push_back(Shortcut(ctrl+"M", L("Show/Hide 3Dconnexion devices settings dialog"))); - plater_shortcuts.push_back(Shortcut("ESC", L("Unselect gizmo / Clear selection"))); -#if ENABLE_RENDER_PICKING_PASS - // Don't localize debugging texts. - plater_shortcuts.push_back(Shortcut("T", "Toggle picking pass texture rendering on/off")); -#endif // ENABLE_RENDER_PICKING_PASS - - m_full_shortcuts.push_back(std::make_pair(_(L("Plater Shortcuts")), std::make_pair(plater_shortcuts, szRight))); - - -// Shortcuts gizmo_shortcuts; -// gizmo_shortcuts.reserve(2); -// -// gizmo_shortcuts.push_back(Shortcut("Shift+", L("Press to snap by 5% in Gizmo Scale\n or by 1mm in Gizmo Move"))); -// gizmo_shortcuts.push_back(Shortcut(alt, L("Press to scale or rotate selected objects around their own center"))); -// -// m_full_shortcuts.push_back(std::make_pair(_(L("Gizmo Shortcuts")), std::make_pair(gizmo_shortcuts, 1))); - - - Shortcuts preview_shortcuts; - preview_shortcuts.reserve(4); - - preview_shortcuts.push_back(Shortcut(L("Arrow Up"), L("Upper Layer"))); - preview_shortcuts.push_back(Shortcut(L("Arrow Down"), L("Lower Layer"))); - preview_shortcuts.push_back(Shortcut("U", L("Upper Layer"))); - preview_shortcuts.push_back(Shortcut("D", L("Lower Layer"))); - preview_shortcuts.push_back(Shortcut("L", L("Show/Hide (L)egend"))); - - m_full_shortcuts.push_back(std::make_pair(_(L("Preview Shortcuts")), std::make_pair(preview_shortcuts, szLeft))); - - - Shortcuts layers_slider_shortcuts; - layers_slider_shortcuts.reserve(6); - - layers_slider_shortcuts.push_back(Shortcut(L("Arrow Up"), L("Move current slider thumb Up"))); - layers_slider_shortcuts.push_back(Shortcut(L("Arrow Down"), L("Move current slider thumb Down"))); - layers_slider_shortcuts.push_back(Shortcut(L("Arrow Left"), L("Set upper thumb to current slider thumb"))); - layers_slider_shortcuts.push_back(Shortcut(L("Arrow Right"),L("Set lower thumb to current slider thumb"))); - layers_slider_shortcuts.push_back(Shortcut("+", L("Add color change marker for current layer"))); - layers_slider_shortcuts.push_back(Shortcut("-", L("Delete color change marker for current layer"))); - - m_full_shortcuts.push_back(std::make_pair(_(L("Layers Slider Shortcuts")), std::make_pair(layers_slider_shortcuts, szRight))); -} - -void KBShortcutsDialog::on_dpi_changed(const wxRect &suggested_rect) +void KBShortcutsDialog::on_dpi_changed(const wxRect& suggested_rect) { m_logo_bmp.msw_rescale(); @@ -215,44 +83,190 @@ void KBShortcutsDialog::on_dpi_changed(const wxRect &suggested_rect) msw_buttons_rescale(this, em, { wxID_OK }); - wxSize size = get_size(); - - panel->SetMinSize(size); - - SetMinSize(size); + Layout(); Fit(); - Refresh(); } -void KBShortcutsDialog::onCloseDialog(wxEvent &) +void KBShortcutsDialog::fill_shortcuts() { - this->EndModal(wxID_CLOSE); + const std::string& ctrl = GUI::shortkey_ctrl_prefix(); + const std::string& alt = GUI::shortkey_alt_prefix(); + + Shortcuts commands_shortcuts = { + // File + { ctrl + "N", L("New project, clear plater") }, + { ctrl + "O", L("Open project STL/OBJ/AMF/3MF with config, clear plater") }, + { ctrl + "S", L("Save project (3mf)") }, + { ctrl + alt + "S", L("Save project as (3mf)") }, + { ctrl + "R", L("(Re)slice") }, + // File>Import + { ctrl + "I", L("Import STL/OBJ/AMF/3MF without config, keep plater") }, + { ctrl + "L", L("Import Config from ini/amf/3mf/gcode") }, + { ctrl + alt + "L", L("Load Config from ini/amf/3mf/gcode and merge") }, + // File>Export + { ctrl + "G", L("Export G-code") }, + { ctrl + "Shift+" + "G", L("Send G-code") }, + { ctrl + "E", L("Export config") }, + // Edit + { ctrl + "A", L("Select all objects") }, + { "Esc", L("Deselect all") }, + { "Del", L("Delete selected") }, + { ctrl + "Del", L("Delete all") }, + { ctrl + "Z", L("Undo") }, + { ctrl + "Y", L("Redo") }, + { ctrl + "C", L("Copy to clipboard") }, + { ctrl + "V", L("Paste from clipboard") }, + { "F5", L("Reload plater from disk") }, + // Window + { ctrl + "1", L("Select Plater Tab") }, + { ctrl + "2", L("Select Print Settings Tab") }, + { ctrl + "3", L("Select Filament Settings Tab") }, + { ctrl + "4", L("Select Printer Settings Tab") }, + { ctrl + "5", L("Switch to 3D") }, + { ctrl + "6", L("Switch to Preview") }, + { ctrl + "J", L("Print host upload queue") }, + // View + { "0-6", L("Camera view") }, +#if ENABLE_SHOW_SCENE_LABELS + { "E", L("Show/Hide object/instance labels") }, +#endif // ENABLE_SHOW_SCENE_LABELS + // Configuration + { ctrl + "P", L("Preferences") }, + // Help + { "?", L("Show keyboard shortcuts list") } + }; + + m_full_shortcuts.push_back(std::make_pair(_(L("Commands")), commands_shortcuts)); + + Shortcuts plater_shortcuts = { + { "A", L("Arrange") }, + { "Shift+A", L("Arrange selection") }, + { "+", L("Add Instance of the selected object") }, + { "-", L("Remove Instance of the selected object") }, + { ctrl, L("Press to select multiple object\nor move multiple object with mouse") }, + { "Shift+", L("Press to activate selection rectangle") }, + { alt, L("Press to activate deselection rectangle") }, + { L("Arrow Up"), L("Move selection 10 mm in positive Y direction") }, + { L("Arrow Down"), L("Move selection 10 mm in negative Y direction") }, + { L("Arrow Left"), L("Move selection 10 mm in negative X direction") }, + { L("Arrow Right"), L("Move selection 10 mm in positive X direction") }, + { std::string("Shift+") + L("Any arrow"), L("Movement step set to 1 mm") }, + { ctrl + L("Any arrow"), L("Movement in camera space") }, + { L("Page Up"), L("Rotate selection 45 degrees CCW") }, + { L("Page Down"), L("Rotate selection 45 degrees CW") }, + { "M", L("Gizmo move") }, + { "S", L("Gizmo scale") }, + { "R", L("Gizmo rotate") }, + { "C", L("Gizmo cut") }, + { "F", L("Gizmo Place face on bed") }, + { "H", L("Gizmo SLA hollow") }, + { "L", L("Gizmo SLA support points") }, + { "Esc", L("Unselect gizmo or clear selection") }, + { "K", L("Change camera type (perspective, orthographic)") }, + { "B", L("Zoom to Bed") }, + { "Z", L("Zoom to selected object\nor all objects in scene, if none selected") }, + { "I", L("Zoom in") }, + { "O", L("Zoom out") }, + { ctrl + "M", L("Show/Hide 3Dconnexion devices settings dialog") } +#if ENABLE_RENDER_PICKING_PASS + // Don't localize debugging texts. + , { "T", "Toggle picking pass texture rendering on/off" } +#endif // ENABLE_RENDER_PICKING_PASS + }; + + m_full_shortcuts.push_back(std::make_pair(_(L("Plater")), plater_shortcuts)); + + Shortcuts gizmos_shortcuts = { + { "Shift+", L("Press to to snap by 5% in Gizmo scale\nor to snap by 1mm in Gizmo move") }, + { "F", L("Scale selection to fit print volume\nin Gizmo scale") }, + { ctrl, L("Press to activate one direction scaling in Gizmo scale") }, + { alt, L("Press to scale (in Gizmo scale) or rotate (in Gizmo rotate)\nselected objects around their own center") }, + }; + + m_full_shortcuts.push_back(std::make_pair(_(L("Gizmos")), gizmos_shortcuts)); + + Shortcuts preview_shortcuts = { + { L("Arrow Up"), L("Upper Layer") }, + { L("Arrow Down"), L("Lower Layer") }, + { "U", L("Upper Layer") }, + { "D", L("Lower Layer") }, + { "L", L("Show/Hide Legend") } + }; + + m_full_shortcuts.push_back(std::make_pair(_(L("Preview")), preview_shortcuts)); + + Shortcuts layers_slider_shortcuts = { + { L("Arrow Up"), L("Move current slider thumb Up") }, + { L("Arrow Down"), L("Move current slider thumb Down") }, + { L("Arrow Left"), L("Set upper thumb to current slider thumb") }, + { L("Arrow Right"), L("Set lower thumb to current slider thumb") }, + { "+", L("Add color change marker for current layer") }, + { "-", L("Delete color change marker for current layer") } + }; + + m_full_shortcuts.push_back(std::make_pair(_(L("Layers Slider")), layers_slider_shortcuts)); } -wxSize KBShortcutsDialog::get_size() +wxPanel* KBShortcutsDialog::create_header(wxWindow* parent, const wxFont& bold_font) { - wxTopLevelWindow* window = Slic3r::GUI::find_toplevel_parent(this); - const int display_idx = wxDisplay::GetFromWindow(window); - wxRect display; - if (display_idx == wxNOT_FOUND) { - display = wxDisplay(0u).GetClientArea(); - window->Move(display.GetTopLeft()); - } - else { - display = wxDisplay(display_idx).GetClientArea(); + wxPanel* panel = new wxPanel(parent); + wxBoxSizer* sizer = new wxBoxSizer(wxHORIZONTAL); + + wxFont header_font = bold_font; +#ifdef __WXOSX__ + header_font.SetPointSize(14); +#else + header_font.SetPointSize(bold_font.GetPointSize() + 2); +#endif // __WXOSX__ + + sizer->AddStretchSpacer(); + + // logo + m_logo_bmp = ScalableBitmap(this, "PrusaSlicer_32px.png", 32); + m_head_bitmaps.push_back(new wxStaticBitmap(panel, wxID_ANY, m_logo_bmp.bmp())); + sizer->Add(m_head_bitmaps.back(), 0, wxEXPAND | wxLEFT | wxRIGHT, 10); + + // text + wxStaticText* text = new wxStaticText(panel, wxID_ANY, _(L("Keyboard shortcuts"))); + text->SetFont(header_font); + sizer->Add(text, 0, wxALIGN_CENTER_VERTICAL); + + sizer->AddStretchSpacer(); + + panel->SetSizer(sizer); + return panel; +} + +wxPanel* KBShortcutsDialog::create_page(wxWindow* parent, const std::pair& shortcuts, const wxFont& font, const wxFont& bold_font) +{ + static const int max_items_per_column = 20; + int columns_count = 2 * (1 + (int)shortcuts.second.size() / max_items_per_column); + + wxPanel* page = new wxPanel(parent); +#if (BOOK_TYPE == LISTBOOK_TOP) || (BOOK_TYPE == LISTBOOK_LEFT) + wxStaticBoxSizer* sizer = new wxStaticBoxSizer(wxVERTICAL, page, " " + shortcuts.first + " "); + sizer->GetStaticBox()->SetFont(bold_font); +#else + wxBoxSizer* sizer = new wxBoxSizer(wxVERTICAL); +#endif // BOOK_TYPE + + wxFlexGridSizer* grid_sizer = new wxFlexGridSizer(columns_count, 5, 15); + + for (const auto& [shortcut, description] : shortcuts.second) + { + auto key = new wxStaticText(page, wxID_ANY, _(shortcut)); + key->SetFont(bold_font); + grid_sizer->Add(key, 0, wxALIGN_CENTRE_VERTICAL); + + auto desc = new wxStaticText(page, wxID_ANY, _(description)); + desc->SetFont(font); + grid_sizer->Add(desc, 0, wxALIGN_CENTRE_VERTICAL); } - const int em = em_unit(); - wxSize dialog_size = wxSize(90 * em, 85 * em); - - const int margin = 10 * em; - if (dialog_size.x > display.GetWidth()) - dialog_size.x = display.GetWidth() - margin; - if (dialog_size.y > display.GetHeight()) - dialog_size.y = display.GetHeight() - margin; - - return dialog_size; + sizer->Add(grid_sizer, 1, wxEXPAND | wxALL, 10); + page->SetSizer(sizer); + return page; } } // namespace GUI diff --git a/src/slic3r/GUI/KBShortcutsDialog.hpp b/src/slic3r/GUI/KBShortcutsDialog.hpp index 7ac28778b5..c551df8287 100644 --- a/src/slic3r/GUI/KBShortcutsDialog.hpp +++ b/src/slic3r/GUI/KBShortcutsDialog.hpp @@ -13,17 +13,9 @@ namespace GUI { class KBShortcutsDialog : public DPIDialog { - enum PLACED_SIZER_ID - { - szLeft = 0, - szRight - }; - typedef std::pair Shortcut; typedef std::vector< Shortcut > Shortcuts; - typedef std::vector< std::pair> > ShortcutsVec; - - wxScrolledWindow* panel; + typedef std::vector> ShortcutsVec; ShortcutsVec m_full_shortcuts; ScalableBitmap m_logo_bmp; @@ -32,14 +24,14 @@ class KBShortcutsDialog : public DPIDialog public: KBShortcutsDialog(); - void fill_shortcuts(); - protected: void on_dpi_changed(const wxRect &suggested_rect) override; private: - void onCloseDialog(wxEvent &); - wxSize get_size(); + void fill_shortcuts(); + + wxPanel* create_header(wxWindow* parent, const wxFont& bold_font); + wxPanel* create_page(wxWindow* parent, const std::pair& shortcuts, const wxFont& font, const wxFont& bold_font); }; } // namespace GUI From afb129bb5d972313e12f3886005ad9e5e510b586 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Tue, 11 Feb 2020 14:33:19 +0100 Subject: [PATCH 312/336] Rework of keyboard shortcut dialog layout -> use wxListbook at left --- src/slic3r/GUI/KBShortcutsDialog.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/slic3r/GUI/KBShortcutsDialog.cpp b/src/slic3r/GUI/KBShortcutsDialog.cpp index 34b6d7d9d0..40ae263fef 100644 --- a/src/slic3r/GUI/KBShortcutsDialog.cpp +++ b/src/slic3r/GUI/KBShortcutsDialog.cpp @@ -13,7 +13,7 @@ #define LISTBOOK_LEFT 4 #define TOOLBOOK 5 #define CHOICEBOOK 6 -#define BOOK_TYPE LISTBOOK_TOP +#define BOOK_TYPE LISTBOOK_LEFT #if (BOOK_TYPE == NOTEBOOK_TOP) || (BOOK_TYPE == NOTEBOOK_LEFT) #include From e327d8a6d4aac436e516f21e8f879d9cdd6540b4 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Tue, 11 Feb 2020 14:39:27 +0100 Subject: [PATCH 313/336] Rework of keyboard shortcut dialog layout -> use wxNotebook on top --- src/slic3r/GUI/KBShortcutsDialog.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/slic3r/GUI/KBShortcutsDialog.cpp b/src/slic3r/GUI/KBShortcutsDialog.cpp index 40ae263fef..b3cd7b29f6 100644 --- a/src/slic3r/GUI/KBShortcutsDialog.cpp +++ b/src/slic3r/GUI/KBShortcutsDialog.cpp @@ -13,7 +13,7 @@ #define LISTBOOK_LEFT 4 #define TOOLBOOK 5 #define CHOICEBOOK 6 -#define BOOK_TYPE LISTBOOK_LEFT +#define BOOK_TYPE NOTEBOOK_TOP #if (BOOK_TYPE == NOTEBOOK_TOP) || (BOOK_TYPE == NOTEBOOK_LEFT) #include From c0ee66fd52f03b2e91524e06ee14c04f87592522 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Tue, 11 Feb 2020 15:01:32 +0100 Subject: [PATCH 314/336] Rework of keyboard shortcut dialog layout -> use wxNotebook at left --- src/slic3r/GUI/KBShortcutsDialog.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/slic3r/GUI/KBShortcutsDialog.cpp b/src/slic3r/GUI/KBShortcutsDialog.cpp index b3cd7b29f6..c27f4d44f7 100644 --- a/src/slic3r/GUI/KBShortcutsDialog.cpp +++ b/src/slic3r/GUI/KBShortcutsDialog.cpp @@ -13,7 +13,7 @@ #define LISTBOOK_LEFT 4 #define TOOLBOOK 5 #define CHOICEBOOK 6 -#define BOOK_TYPE NOTEBOOK_TOP +#define BOOK_TYPE NOTEBOOK_LEFT #if (BOOK_TYPE == NOTEBOOK_TOP) || (BOOK_TYPE == NOTEBOOK_LEFT) #include From 9689d006c015c5c46d541b912f4ff9bba0f833fb Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Tue, 11 Feb 2020 15:12:35 +0100 Subject: [PATCH 315/336] Rework of keyboard shortcut dialog layout -> use wxChoicebook --- src/slic3r/GUI/KBShortcutsDialog.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/slic3r/GUI/KBShortcutsDialog.cpp b/src/slic3r/GUI/KBShortcutsDialog.cpp index c27f4d44f7..15e5035d9a 100644 --- a/src/slic3r/GUI/KBShortcutsDialog.cpp +++ b/src/slic3r/GUI/KBShortcutsDialog.cpp @@ -13,7 +13,7 @@ #define LISTBOOK_LEFT 4 #define TOOLBOOK 5 #define CHOICEBOOK 6 -#define BOOK_TYPE NOTEBOOK_LEFT +#define BOOK_TYPE CHOICEBOOK #if (BOOK_TYPE == NOTEBOOK_TOP) || (BOOK_TYPE == NOTEBOOK_LEFT) #include From 2e62f03ba88fd3f4908c687efd6f814233a71cee Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Tue, 11 Feb 2020 15:25:28 +0100 Subject: [PATCH 316/336] Small fix of 41388bd: Interior mesh can be empty and TriangleMeshSlicer would fail in that case. Also, recalculating shared vertices after repair should probably be done, TMS relies on it. --- src/libslic3r/SLAPrintSteps.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libslic3r/SLAPrintSteps.cpp b/src/libslic3r/SLAPrintSteps.cpp index 108ac3e17c..c8550e2fe3 100644 --- a/src/libslic3r/SLAPrintSteps.cpp +++ b/src/libslic3r/SLAPrintSteps.cpp @@ -222,8 +222,8 @@ void SLAPrint::Steps::slice_model(SLAPrintObject &po) auto &slice_grid = po.m_model_height_levels; slicer.slice(slice_grid, SlicingMode::Regular, closing_r, &po.m_model_slices, thr); - if (po.m_hollowing_data) { - po.m_hollowing_data->interior.repair(); + if (po.m_hollowing_data && ! po.m_hollowing_data->interior.empty()) { + po.m_hollowing_data->interior.repair(true); TriangleMeshSlicer interior_slicer(&po.m_hollowing_data->interior); std::vector interior_slices; interior_slicer.slice(slice_grid, SlicingMode::Regular, closing_r, &interior_slices, thr); From b5152e41268987f87b678bca67dd4d12b9ec4640 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Wed, 12 Feb 2020 08:49:56 +0100 Subject: [PATCH 317/336] New keyboard shortcuts dialog -> Fixed items order and use wxNotebook on top --- src/slic3r/GUI/KBShortcutsDialog.cpp | 44 +++++++++++++++------------- src/slic3r/GUI/KBShortcutsDialog.hpp | 10 +++---- 2 files changed, 29 insertions(+), 25 deletions(-) diff --git a/src/slic3r/GUI/KBShortcutsDialog.cpp b/src/slic3r/GUI/KBShortcutsDialog.cpp index 15e5035d9a..d380a4d7df 100644 --- a/src/slic3r/GUI/KBShortcutsDialog.cpp +++ b/src/slic3r/GUI/KBShortcutsDialog.cpp @@ -13,7 +13,7 @@ #define LISTBOOK_LEFT 4 #define TOOLBOOK 5 #define CHOICEBOOK 6 -#define BOOK_TYPE CHOICEBOOK +#define BOOK_TYPE NOTEBOOK_TOP #if (BOOK_TYPE == NOTEBOOK_TOP) || (BOOK_TYPE == NOTEBOOK_LEFT) #include @@ -75,13 +75,8 @@ main_sizer->Add(book, 1, wxEXPAND | wxALL, 10); void KBShortcutsDialog::on_dpi_changed(const wxRect& suggested_rect) { m_logo_bmp.msw_rescale(); - - for (wxStaticBitmap* bmp : m_head_bitmaps) - bmp->SetBitmap(m_logo_bmp.bmp()); - - const int em = em_unit(); - - msw_buttons_rescale(this, em, { wxID_OK }); + m_header_bitmap->SetBitmap(m_logo_bmp.bmp()); + msw_buttons_rescale(this, em_unit(), { wxID_OK }); Layout(); Fit(); @@ -224,9 +219,9 @@ wxPanel* KBShortcutsDialog::create_header(wxWindow* parent, const wxFont& bold_f // logo m_logo_bmp = ScalableBitmap(this, "PrusaSlicer_32px.png", 32); - m_head_bitmaps.push_back(new wxStaticBitmap(panel, wxID_ANY, m_logo_bmp.bmp())); - sizer->Add(m_head_bitmaps.back(), 0, wxEXPAND | wxLEFT | wxRIGHT, 10); - + m_header_bitmap = new wxStaticBitmap(panel, wxID_ANY, m_logo_bmp.bmp()); + sizer->Add(m_header_bitmap, 0, wxEXPAND | wxLEFT | wxRIGHT, 10); + // text wxStaticText* text = new wxStaticText(panel, wxID_ANY, _(L("Keyboard shortcuts"))); text->SetFont(header_font); @@ -241,7 +236,7 @@ wxPanel* KBShortcutsDialog::create_header(wxWindow* parent, const wxFont& bold_f wxPanel* KBShortcutsDialog::create_page(wxWindow* parent, const std::pair& shortcuts, const wxFont& font, const wxFont& bold_font) { static const int max_items_per_column = 20; - int columns_count = 2 * (1 + (int)shortcuts.second.size() / max_items_per_column); + int columns_count = 1 + (int)shortcuts.second.size() / max_items_per_column; wxPanel* page = new wxPanel(parent); #if (BOOK_TYPE == LISTBOOK_TOP) || (BOOK_TYPE == LISTBOOK_LEFT) @@ -251,17 +246,26 @@ wxPanel* KBShortcutsDialog::create_page(wxWindow* parent, const std::pairSetFont(bold_font); - grid_sizer->Add(key, 0, wxALIGN_CENTRE_VERTICAL); + for (int j = 0; j < columns_count; ++j) + { + int id = j * max_items_per_column + i; + if (id >= items_count) + break; - auto desc = new wxStaticText(page, wxID_ANY, _(description)); - desc->SetFont(font); - grid_sizer->Add(desc, 0, wxALIGN_CENTRE_VERTICAL); + const auto& [shortcut, description] = shortcuts.second[id]; + auto key = new wxStaticText(page, wxID_ANY, _(shortcut)); + key->SetFont(bold_font); + grid_sizer->Add(key, 0, wxALIGN_CENTRE_VERTICAL); + + auto desc = new wxStaticText(page, wxID_ANY, _(description)); + desc->SetFont(font); + grid_sizer->Add(desc, 0, wxALIGN_CENTRE_VERTICAL); + } } sizer->Add(grid_sizer, 1, wxEXPAND | wxALL, 10); diff --git a/src/slic3r/GUI/KBShortcutsDialog.hpp b/src/slic3r/GUI/KBShortcutsDialog.hpp index c551df8287..f690be8c1c 100644 --- a/src/slic3r/GUI/KBShortcutsDialog.hpp +++ b/src/slic3r/GUI/KBShortcutsDialog.hpp @@ -14,12 +14,12 @@ namespace GUI { class KBShortcutsDialog : public DPIDialog { typedef std::pair Shortcut; - typedef std::vector< Shortcut > Shortcuts; - typedef std::vector> ShortcutsVec; + typedef std::vector Shortcuts; + typedef std::vector> ShortcutsVec; - ShortcutsVec m_full_shortcuts; - ScalableBitmap m_logo_bmp; - std::vector m_head_bitmaps; + ShortcutsVec m_full_shortcuts; + ScalableBitmap m_logo_bmp; + wxStaticBitmap* m_header_bitmap; public: KBShortcutsDialog(); From c33dc5c2fe896aa76e63154f0b065ffb7b19169b Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Wed, 12 Feb 2020 11:25:36 +0100 Subject: [PATCH 318/336] New keyboard shortcuts dialog -> Scrollable pages and resizable dialog --- src/slic3r/GUI/KBShortcutsDialog.cpp | 31 ++++++++++++++++++++++++++-- src/slic3r/GUI/KBShortcutsDialog.hpp | 6 ++++++ 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/src/slic3r/GUI/KBShortcutsDialog.cpp b/src/slic3r/GUI/KBShortcutsDialog.cpp index d380a4d7df..3c7681d1f8 100644 --- a/src/slic3r/GUI/KBShortcutsDialog.cpp +++ b/src/slic3r/GUI/KBShortcutsDialog.cpp @@ -25,12 +25,25 @@ #include #endif // BOOK_TYPE +#if ENABLE_SCROLLABLE +static wxSize get_screen_size(wxWindow* window) +{ + const auto idx = wxDisplay::GetFromWindow(window); + wxDisplay display(idx != wxNOT_FOUND ? idx : 0u); + return display.GetClientArea().GetSize(); +} +#endif // ENABLE_SCROLLABLE + namespace Slic3r { namespace GUI { KBShortcutsDialog::KBShortcutsDialog() : DPIDialog(NULL, wxID_ANY, wxString(SLIC3R_APP_NAME) + " - " + _(L("Keyboard Shortcuts")), - wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE) // | wxRESIZE_BORDER) +#if ENABLE_SCROLLABLE + wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER) +#else + wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE) +#endif // ENABLE_SCROLLABLE { SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW)); @@ -61,12 +74,18 @@ main_sizer->Add(book, 1, wxEXPAND | wxALL, 10); fill_shortcuts(); for (size_t i = 0; i < m_full_shortcuts.size(); ++i) { +#if ENABLE_SCROLLABLE + wxPanel* page = create_page(book, m_full_shortcuts[i], font, bold_font); + m_pages.push_back(page); + book->AddPage(page, m_full_shortcuts[i].first, i == 0); +#else book->AddPage(create_page(book, m_full_shortcuts[i], font, bold_font), m_full_shortcuts[i].first, i == 0); +#endif // ENABLE_SCROLLABLE } wxStdDialogButtonSizer* buttons = this->CreateStdDialogButtonSizer(wxOK); this->SetEscapeId(wxID_OK); - main_sizer->Add(buttons, 0, wxEXPAND | wxALL, 10); + main_sizer->Add(buttons, 0, wxEXPAND | wxALL, 5); SetSizer(main_sizer); main_sizer->SetSizeHints(this); @@ -238,7 +257,14 @@ wxPanel* KBShortcutsDialog::create_page(wxWindow* parent, const std::pairSetScrollbars(20, 20, 50, 50); + page->SetInitialSize(wxSize(750, 350)); +#else wxPanel* page = new wxPanel(parent); +#endif // ENABLE_SCROLLABLE + #if (BOOK_TYPE == LISTBOOK_TOP) || (BOOK_TYPE == LISTBOOK_LEFT) wxStaticBoxSizer* sizer = new wxStaticBoxSizer(wxVERTICAL, page, " " + shortcuts.first + " "); sizer->GetStaticBox()->SetFont(bold_font); @@ -269,6 +295,7 @@ wxPanel* KBShortcutsDialog::create_page(wxWindow* parent, const std::pairAdd(grid_sizer, 1, wxEXPAND | wxALL, 10); + page->SetSizer(sizer); return page; } diff --git a/src/slic3r/GUI/KBShortcutsDialog.hpp b/src/slic3r/GUI/KBShortcutsDialog.hpp index f690be8c1c..70820ae774 100644 --- a/src/slic3r/GUI/KBShortcutsDialog.hpp +++ b/src/slic3r/GUI/KBShortcutsDialog.hpp @@ -8,6 +8,8 @@ #include "GUI_Utils.hpp" #include "wxExtensions.hpp" +#define ENABLE_SCROLLABLE 1 + namespace Slic3r { namespace GUI { @@ -20,6 +22,9 @@ class KBShortcutsDialog : public DPIDialog ShortcutsVec m_full_shortcuts; ScalableBitmap m_logo_bmp; wxStaticBitmap* m_header_bitmap; +#if ENABLE_SCROLLABLE + std::vector m_pages; +#endif // ENABLE_SCROLLABLE public: KBShortcutsDialog(); @@ -32,6 +37,7 @@ private: wxPanel* create_header(wxWindow* parent, const wxFont& bold_font); wxPanel* create_page(wxWindow* parent, const std::pair& shortcuts, const wxFont& font, const wxFont& bold_font); + }; } // namespace GUI From fcd1cf371ba97cdceb380890998fcfcae05605ea Mon Sep 17 00:00:00 2001 From: YuSanka Date: Wed, 12 Feb 2020 12:08:43 +0100 Subject: [PATCH 319/336] Alignments of options in settings tabs + msw_rescale() is overridden for PrinterTab to rescale of all the option Pages and not just a respect to current print technology + A Setting of the option.width in PrintConfig is no need anymore --- src/libslic3r/PrintConfig.cpp | 10 ------ src/slic3r/GUI/Field.cpp | 56 +++++++++++++++++++++++---------- src/slic3r/GUI/Field.hpp | 28 ++++++++--------- src/slic3r/GUI/OptionsGroup.cpp | 10 ++++-- src/slic3r/GUI/Tab.cpp | 35 ++++++++++++++------- src/slic3r/GUI/Tab.hpp | 3 +- 6 files changed, 85 insertions(+), 57 deletions(-) diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index 37602b2315..25609e923d 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -573,7 +573,6 @@ void PrintConfigDef::init_fff_params() def->tooltip = L("If layer print time is estimated below this number of seconds, fan will be enabled " "and its speed will be calculated by interpolating the minimum and maximum speeds."); def->sidetext = L("approximate seconds"); - def->width = 6; def->min = 0; def->max = 1000; def->mode = comExpert; @@ -1104,7 +1103,6 @@ void PrintConfigDef::init_fff_params() def->mode = comExpert; def->set_default_value(new ConfigOptionBool(true)); - const int machine_limits_opt_width = 7; { struct AxisDefault { std::string name; @@ -1136,7 +1134,6 @@ void PrintConfigDef::init_fff_params() (void)L("Maximum feedrate of the E axis"); def->sidetext = L("mm/s"); def->min = 0; - def->width = machine_limits_opt_width; def->mode = comAdvanced; def->set_default_value(new ConfigOptionFloats(axis.max_feedrate)); // Add the machine acceleration limits for XYZE axes (M201) @@ -1154,7 +1151,6 @@ void PrintConfigDef::init_fff_params() (void)L("Maximum acceleration of the E axis"); def->sidetext = L("mm/s²"); def->min = 0; - def->width = machine_limits_opt_width; def->mode = comAdvanced; def->set_default_value(new ConfigOptionFloats(axis.max_acceleration)); // Add the machine jerk limits for XYZE axes (M205) @@ -1172,7 +1168,6 @@ void PrintConfigDef::init_fff_params() (void)L("Maximum jerk of the E axis"); def->sidetext = L("mm/s"); def->min = 0; - def->width = machine_limits_opt_width; def->mode = comAdvanced; def->set_default_value(new ConfigOptionFloats(axis.max_jerk)); } @@ -1185,7 +1180,6 @@ void PrintConfigDef::init_fff_params() def->tooltip = L("Minimum feedrate when extruding (M205 S)"); def->sidetext = L("mm/s"); def->min = 0; - def->width = machine_limits_opt_width; def->mode = comAdvanced; def->set_default_value(new ConfigOptionFloats{ 0., 0. }); @@ -1196,7 +1190,6 @@ void PrintConfigDef::init_fff_params() def->tooltip = L("Minimum travel feedrate (M205 T)"); def->sidetext = L("mm/s"); def->min = 0; - def->width = machine_limits_opt_width; def->mode = comAdvanced; def->set_default_value(new ConfigOptionFloats{ 0., 0. }); @@ -1207,7 +1200,6 @@ void PrintConfigDef::init_fff_params() def->tooltip = L("Maximum acceleration when extruding (M204 S)"); def->sidetext = L("mm/s²"); def->min = 0; - def->width = machine_limits_opt_width; def->mode = comAdvanced; def->set_default_value(new ConfigOptionFloats{ 1500., 1250. }); @@ -1218,7 +1210,6 @@ void PrintConfigDef::init_fff_params() def->tooltip = L("Maximum acceleration when retracting (M204 T)"); def->sidetext = L("mm/s²"); def->min = 0; - def->width = machine_limits_opt_width; def->mode = comAdvanced; def->set_default_value(new ConfigOptionFloats{ 1500., 1250. }); @@ -1715,7 +1706,6 @@ void PrintConfigDef::init_fff_params() def->tooltip = L("If layer print time is estimated below this number of seconds, print moves " "speed will be scaled down to extend duration to this value."); def->sidetext = L("approximate seconds"); - def->width = 6; def->min = 0; def->max = 1000; def->mode = comExpert; diff --git a/src/slic3r/GUI/Field.cpp b/src/slic3r/GUI/Field.cpp index a8953f166e..2fd76e8ba6 100644 --- a/src/slic3r/GUI/Field.cpp +++ b/src/slic3r/GUI/Field.cpp @@ -250,6 +250,23 @@ void Field::get_value_by_opt_type(wxString& str, const bool check_value/* = true } } +void Field::msw_rescale(bool rescale_sidetext) +{ + m_Undo_to_sys_btn->msw_rescale(); + m_Undo_btn->msw_rescale(); + + // update em_unit value + m_em_unit = em_unit(m_parent); + + // update sidetext if it is needed + if (m_side_text && rescale_sidetext) + { + auto size = wxSize(def_width_thinner() * m_em_unit, -1); + m_side_text->SetSize(size); + m_side_text->SetMinSize(size); + } +} + template bool is_defined_input_value(wxWindow* win, const ConfigOptionType& type) { @@ -259,7 +276,7 @@ bool is_defined_input_value(wxWindow* win, const ConfigOptionType& type) } void TextCtrl::BUILD() { - auto size = wxSize(wxDefaultSize); + auto size = wxSize(def_width()*m_em_unit, wxDefaultCoord); if (m_opt.height >= 0) size.SetHeight(m_opt.height*m_em_unit); if (m_opt.width >= 0) size.SetWidth(m_opt.width*m_em_unit); @@ -455,10 +472,10 @@ boost::any& TextCtrl::get_value() return m_value; } -void TextCtrl::msw_rescale() +void TextCtrl::msw_rescale(bool rescale_sidetext/* = false*/) { - Field::msw_rescale(); - auto size = wxSize(wxDefaultSize); + Field::msw_rescale(rescale_sidetext); + auto size = wxSize(def_width() * m_em_unit, wxDefaultCoord); if (m_opt.height >= 0) size.SetHeight(m_opt.height*m_em_unit); if (m_opt.width >= 0) size.SetWidth(m_opt.width*m_em_unit); @@ -555,7 +572,7 @@ boost::any& CheckBox::get_value() return m_value; } -void CheckBox::msw_rescale() +void CheckBox::msw_rescale(bool rescale_sidetext/* = false*/) { Field::msw_rescale(); @@ -565,7 +582,7 @@ void CheckBox::msw_rescale() void SpinCtrl::BUILD() { - auto size = wxSize(wxDefaultSize); + auto size = wxSize(def_width() * m_em_unit, wxDefaultCoord); if (m_opt.height >= 0) size.SetHeight(m_opt.height*m_em_unit); if (m_opt.width >= 0) size.SetWidth(m_opt.width*m_em_unit); @@ -690,16 +707,16 @@ void SpinCtrl::propagate_value() suppress_propagation = false; } -void SpinCtrl::msw_rescale() +void SpinCtrl::msw_rescale(bool rescale_sidetext/* = false*/) { - Field::msw_rescale(); + Field::msw_rescale(rescale_sidetext); wxSpinCtrl* field = dynamic_cast(window); - field->SetMinSize(wxSize(-1, int(1.9f*field->GetFont().GetPixelSize().y))); + field->SetMinSize(wxSize(def_width() * m_em_unit, int(1.9f*field->GetFont().GetPixelSize().y))); } void Choice::BUILD() { - wxSize size(m_width * m_em_unit, -1); + wxSize size(def_width_wider() * m_em_unit, wxDefaultCoord); if (m_opt.height >= 0) size.SetHeight(m_opt.height*m_em_unit); if (m_opt.width >= 0) size.SetWidth(m_opt.width*m_em_unit); @@ -1018,7 +1035,7 @@ boost::any& Choice::get_value() return m_value; } -void Choice::msw_rescale() +void Choice::msw_rescale(bool rescale_sidetext/* = false*/) { Field::msw_rescale(); @@ -1034,7 +1051,7 @@ void Choice::msw_rescale() */ field->Clear(); wxSize size(wxDefaultSize); - size.SetWidth((m_opt.width > 0 ? m_opt.width : m_width) * m_em_unit); + size.SetWidth((m_opt.width > 0 ? m_opt.width : def_width_wider()) * m_em_unit); // Set rescaled min height to correct layout field->SetMinSize(wxSize(-1, int(1.5f*field->GetFont().GetPixelSize().y + 0.5f))); @@ -1065,7 +1082,7 @@ void Choice::msw_rescale() void ColourPicker::BUILD() { - auto size = wxSize(wxDefaultSize); + auto size = wxSize(def_width() * m_em_unit, wxDefaultCoord); if (m_opt.height >= 0) size.SetHeight(m_opt.height*m_em_unit); if (m_opt.width >= 0) size.SetWidth(m_opt.width*m_em_unit); @@ -1133,11 +1150,16 @@ boost::any& ColourPicker::get_value() return m_value; } -void ColourPicker::msw_rescale() +void ColourPicker::msw_rescale(bool rescale_sidetext/* = false*/) { Field::msw_rescale(); - wxColourPickerCtrl* field = dynamic_cast(window); + wxColourPickerCtrl* field = dynamic_cast(window); + auto size = wxSize(def_width() * m_em_unit, wxDefaultCoord); + if (m_opt.height >= 0) size.SetHeight(m_opt.height * m_em_unit); + if (m_opt.width >= 0) size.SetWidth(m_opt.width * m_em_unit); + field->SetMinSize(size); + if (field->GetColour() == wxTransparentColour) set_undef_value(field); } @@ -1189,7 +1211,7 @@ void PointCtrl::BUILD() y_textctrl->SetToolTip(get_tooltip_text(X+", "+Y)); } -void PointCtrl::msw_rescale() +void PointCtrl::msw_rescale(bool rescale_sidetext/* = false*/) { Field::msw_rescale(); @@ -1259,7 +1281,7 @@ void StaticText::BUILD() temp->SetToolTip(get_tooltip_text(legend)); } -void StaticText::msw_rescale() +void StaticText::msw_rescale(bool rescale_sidetext/* = false*/) { Field::msw_rescale(); diff --git a/src/slic3r/GUI/Field.hpp b/src/slic3r/GUI/Field.hpp index b3cbf573f6..bd325005e2 100644 --- a/src/slic3r/GUI/Field.hpp +++ b/src/slic3r/GUI/Field.hpp @@ -220,17 +220,16 @@ public: m_side_text = side_text; } - virtual void msw_rescale() { - m_Undo_to_sys_btn->msw_rescale(); - m_Undo_btn->msw_rescale(); - - // update em_unit value - m_em_unit = em_unit(m_parent); - } + virtual void msw_rescale(bool rescale_sidetext = false); bool get_enter_pressed() const { return bEnterPressed; } void set_enter_pressed(bool pressed) { bEnterPressed = pressed; } + // Values of width to "systematic" alignments of fields + static int def_width() { return 7; } + static int def_width_wider() { return 14; } + static int def_width_thinner() { return 4; } + protected: RevertButton* m_Undo_btn = nullptr; // Bitmap and Tooltip text for m_Undo_btn. The wxButton will be updated only if the new wxBitmap pointer differs from the currently rendered one. @@ -297,7 +296,7 @@ public: boost::any& get_value() override; - void msw_rescale() override; + void msw_rescale(bool rescale_sidetext = false) override; virtual void enable(); virtual void disable(); @@ -325,7 +324,7 @@ public: void set_na_value() override; boost::any& get_value() override; - void msw_rescale() override; + void msw_rescale(bool rescale_sidetext = false) override; void enable() override { dynamic_cast(window)->Enable(); } void disable() override { dynamic_cast(window)->Disable(); } @@ -368,7 +367,7 @@ public: return m_value = value; } - void msw_rescale() override; + void msw_rescale(bool rescale_sidetext = false) override; void enable() override { dynamic_cast(window)->Enable(); } void disable() override { dynamic_cast(window)->Disable(); } @@ -377,7 +376,6 @@ public: class Choice : public Field { using Field::Field; - int m_width{ 15 }; public: Choice(const ConfigOptionDef& opt, const t_config_option_key& id) : Field(opt, id) {} Choice(wxWindow* parent, const ConfigOptionDef& opt, const t_config_option_key& id) : Field(parent, opt, id) {} @@ -397,7 +395,7 @@ public: void set_values(const std::vector &values); boost::any& get_value() override; - void msw_rescale() override; + void msw_rescale(bool rescale_sidetext = false) override; void enable() override { dynamic_cast(window)->Enable(); }; void disable() override{ dynamic_cast(window)->Disable(); }; @@ -423,7 +421,7 @@ public: } void set_value(const boost::any& value, bool change_event = false) override; boost::any& get_value() override; - void msw_rescale() override; + void msw_rescale(bool rescale_sidetext = false) override; void enable() override { dynamic_cast(window)->Enable(); }; void disable() override{ dynamic_cast(window)->Disable(); }; @@ -448,7 +446,7 @@ public: void set_value(const boost::any& value, bool change_event = false); boost::any& get_value() override; - void msw_rescale() override; + void msw_rescale(bool rescale_sidetext = false) override; void enable() override { x_textctrl->Enable(); @@ -482,7 +480,7 @@ public: boost::any& get_value()override { return m_value; } - void msw_rescale() override; + void msw_rescale(bool rescale_sidetext = false) override; void enable() override { dynamic_cast(window)->Enable(); }; void disable() override{ dynamic_cast(window)->Disable(); }; diff --git a/src/slic3r/GUI/OptionsGroup.cpp b/src/slic3r/GUI/OptionsGroup.cpp index 366df43463..4e964ff74e 100644 --- a/src/slic3r/GUI/OptionsGroup.cpp +++ b/src/slic3r/GUI/OptionsGroup.cpp @@ -128,6 +128,10 @@ void OptionsGroup::append_line(const Line& line, wxStaticText** full_Label/* = n for (auto opt : option_set) m_options.emplace(opt.opt_id, opt); + // Set sidetext width for a better alignment of options in line + if (option_set.size() > 1) + sidetext_width = Field::def_width_thinner(); + // add mode value for current line to m_options_mode if (!option_set.empty()) m_options_mode.push_back(option_set[0].opt.mode); @@ -274,9 +278,9 @@ void OptionsGroup::append_line(const Line& line, wxStaticText** full_Label/* = n sizer_tmp->Add(field->getWindow(), 0, wxALIGN_CENTER_VERTICAL, 0); // add sidetext if any - if (option.sidetext != "") { + if (!option.sidetext.empty() || sidetext_width > 0) { auto sidetext = new wxStaticText( this->ctrl_parent(), wxID_ANY, _(option.sidetext), wxDefaultPosition, - wxSize(sidetext_width != -1 ? sidetext_width*wxGetApp().em_unit() : -1, -1) /*wxDefaultSize*/, wxALIGN_LEFT); + wxSize(sidetext_width != -1 ? sidetext_width*wxGetApp().em_unit() : -1, -1), wxALIGN_LEFT); sidetext->SetBackgroundStyle(wxBG_STYLE_PAINT); sidetext->SetFont(wxGetApp().normal_font()); sizer_tmp->Add(sidetext, 0, wxLEFT | wxALIGN_CENTER_VERTICAL, 4); @@ -498,7 +502,7 @@ void ConfigOptionsGroup::msw_rescale() // update undo buttons : rescale bitmaps for (const auto& field : m_fields) - field.second->msw_rescale(); + field.second->msw_rescale(sidetext_width>0); const int em = em_unit(parent()); diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index 92132956b6..f38db93c3b 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -518,6 +518,18 @@ void TabPrinter::init_options_list() m_options_list.emplace("extruders_count", m_opt_status_value); } +void TabPrinter::msw_rescale() +{ + Tab::msw_rescale(); + + // rescale missed options_groups + const std::vector& pages = m_printer_technology == ptFFF ? m_pages_sla : m_pages_fff; + for (auto page : pages) + page->msw_rescale(); + + Layout(); +} + void TabSLAMaterial::init_options_list() { if (!m_options_list.empty()) @@ -1221,18 +1233,14 @@ void TabPrint::build() optgroup = page->new_optgroup(_(L("Sequential printing"))); optgroup->append_single_option_line("complete_objects"); line = { _(L("Extruder clearance (mm)")), "" }; - Option option = optgroup->get_option("extruder_clearance_radius"); - option.opt.width = 6; - line.append_option(option); - option = optgroup->get_option("extruder_clearance_height"); - option.opt.width = 6; - line.append_option(option); + line.append_option(optgroup->get_option("extruder_clearance_radius")); + line.append_option(optgroup->get_option("extruder_clearance_height")); optgroup->append_line(line); optgroup = page->new_optgroup(_(L("Output file"))); optgroup->append_single_option_line("gcode_comments"); optgroup->append_single_option_line("gcode_label_objects"); - option = optgroup->get_option("output_filename_format"); + Option option = optgroup->get_option("output_filename_format"); option.opt.full_width = true; optgroup->append_single_option_line(option); @@ -1463,7 +1471,10 @@ void TabFilament::build() page = add_options_page(_(L("Advanced")), "wrench"); optgroup = page->new_optgroup(_(L("Filament properties"))); - optgroup->append_single_option_line("filament_type"); + // Set size as all another fields for a better alignment + Option option = optgroup->get_option("filament_type"); + option.opt.width = Field::def_width(); + optgroup->append_single_option_line(option); optgroup->append_single_option_line("filament_soluble"); optgroup = page->new_optgroup(_(L("Print speed override"))); @@ -1517,7 +1528,7 @@ void TabFilament::build() page = add_options_page(_(L("Custom G-code")), "cog"); optgroup = page->new_optgroup(_(L("Start G-code")), 0); - Option option = optgroup->get_option("start_filament_gcode"); + option = optgroup->get_option("start_filament_gcode"); option.opt.full_width = true; option.opt.height = gcode_field_height;// 150; optgroup->append_single_option_line(option); @@ -1690,7 +1701,10 @@ void TabPrinter::build_printhost(ConfigOptionsGroup *optgroup) return sizer; }; - Line host_line = optgroup->create_single_option_line("print_host"); + // Set a wider width for a better alignment + Option option = optgroup->get_option("print_host"); + option.opt.width = Field::def_width_wider(); + Line host_line = optgroup->create_single_option_line(option); host_line.append_widget(printhost_browse); host_line.append_widget(print_host_test); optgroup->append_line(host_line); @@ -3497,7 +3511,6 @@ void TabSLAMaterial::build() for (auto& axis : axes) { auto opt = optgroup->get_option(opt_key, id); opt.opt.label = axis; - opt.opt.width = 6; line.append_option(opt); ++id; } diff --git a/src/slic3r/GUI/Tab.hpp b/src/slic3r/GUI/Tab.hpp index c88a74e53f..09662bf814 100644 --- a/src/slic3r/GUI/Tab.hpp +++ b/src/slic3r/GUI/Tab.hpp @@ -290,7 +290,7 @@ public: virtual void reload_config(); void update_mode(); void update_visibility(); - void msw_rescale(); + virtual void msw_rescale(); Field* get_field(const t_config_option_key& opt_key, int opt_index = -1) const; bool set_value(const t_config_option_key& opt_key, const boost::any& value); wxSizer* description_line_widget(wxWindow* parent, ogStaticText** StaticText); @@ -403,6 +403,7 @@ public: void build_unregular_pages(); void on_preset_loaded() override; void init_options_list() override; + void msw_rescale() override; bool supports_printer_technology(const PrinterTechnology /* tech */) override { return true; } }; From e70b17f38ccfd87a8a190d3085b92a4e0810ad2f Mon Sep 17 00:00:00 2001 From: YuSanka Date: Wed, 12 Feb 2020 14:19:48 +0100 Subject: [PATCH 320/336] Updated POT + Fixed texts in DoubleSlider.cpp --- resources/localization/PrusaSlicer.pot | 2516 ++++++++++++------------ src/slic3r/GUI/DoubleSlider.cpp | 69 +- 2 files changed, 1290 insertions(+), 1295 deletions(-) diff --git a/resources/localization/PrusaSlicer.pot b/resources/localization/PrusaSlicer.pot index e79f4b61bb..6236ed8a5b 100644 --- a/resources/localization/PrusaSlicer.pot +++ b/resources/localization/PrusaSlicer.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-02-06 20:24+0100\n" +"POT-Creation-Date: 2020-02-12 14:01+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -111,7 +111,7 @@ msgstr "" msgid "Scheduling upload to `%1%`. See Window -> Print Host Upload Queue" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:66 src/slic3r/GUI/GUI_ObjectList.cpp:2038 +#: src/slic3r/GUI/BedShapeDialog.cpp:66 src/slic3r/GUI/GUI_ObjectList.cpp:2033 msgid "Shape" msgstr "" @@ -121,7 +121,7 @@ msgstr "" #: src/slic3r/GUI/BedShapeDialog.cpp:77 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:232 src/slic3r/GUI/Plater.cpp:162 -#: src/slic3r/GUI/Tab.cpp:2306 +#: src/slic3r/GUI/Tab.cpp:2320 msgid "Size" msgstr "" @@ -155,34 +155,34 @@ msgstr "" #: src/libslic3r/PrintConfig.cpp:311 src/libslic3r/PrintConfig.cpp:319 #: src/libslic3r/PrintConfig.cpp:369 src/libslic3r/PrintConfig.cpp:379 #: src/libslic3r/PrintConfig.cpp:505 src/libslic3r/PrintConfig.cpp:516 -#: src/libslic3r/PrintConfig.cpp:534 src/libslic3r/PrintConfig.cpp:713 -#: src/libslic3r/PrintConfig.cpp:1240 src/libslic3r/PrintConfig.cpp:1301 -#: src/libslic3r/PrintConfig.cpp:1319 src/libslic3r/PrintConfig.cpp:1337 -#: src/libslic3r/PrintConfig.cpp:1393 src/libslic3r/PrintConfig.cpp:1403 -#: src/libslic3r/PrintConfig.cpp:1525 src/libslic3r/PrintConfig.cpp:1533 -#: src/libslic3r/PrintConfig.cpp:1574 src/libslic3r/PrintConfig.cpp:1582 -#: src/libslic3r/PrintConfig.cpp:1592 src/libslic3r/PrintConfig.cpp:1600 -#: src/libslic3r/PrintConfig.cpp:1608 src/libslic3r/PrintConfig.cpp:1691 -#: src/libslic3r/PrintConfig.cpp:1924 src/libslic3r/PrintConfig.cpp:1995 -#: src/libslic3r/PrintConfig.cpp:2029 src/libslic3r/PrintConfig.cpp:2157 -#: src/libslic3r/PrintConfig.cpp:2236 src/libslic3r/PrintConfig.cpp:2243 -#: src/libslic3r/PrintConfig.cpp:2250 src/libslic3r/PrintConfig.cpp:2280 -#: src/libslic3r/PrintConfig.cpp:2290 src/libslic3r/PrintConfig.cpp:2300 -#: src/libslic3r/PrintConfig.cpp:2485 src/libslic3r/PrintConfig.cpp:2624 -#: src/libslic3r/PrintConfig.cpp:2633 src/libslic3r/PrintConfig.cpp:2642 -#: src/libslic3r/PrintConfig.cpp:2652 src/libslic3r/PrintConfig.cpp:2696 -#: src/libslic3r/PrintConfig.cpp:2706 src/libslic3r/PrintConfig.cpp:2718 -#: src/libslic3r/PrintConfig.cpp:2738 src/libslic3r/PrintConfig.cpp:2748 -#: src/libslic3r/PrintConfig.cpp:2758 src/libslic3r/PrintConfig.cpp:2776 -#: src/libslic3r/PrintConfig.cpp:2791 src/libslic3r/PrintConfig.cpp:2805 -#: src/libslic3r/PrintConfig.cpp:2816 src/libslic3r/PrintConfig.cpp:2829 -#: src/libslic3r/PrintConfig.cpp:2874 src/libslic3r/PrintConfig.cpp:2884 -#: src/libslic3r/PrintConfig.cpp:2893 src/libslic3r/PrintConfig.cpp:2903 -#: src/libslic3r/PrintConfig.cpp:2919 +#: src/libslic3r/PrintConfig.cpp:534 src/libslic3r/PrintConfig.cpp:712 +#: src/libslic3r/PrintConfig.cpp:1231 src/libslic3r/PrintConfig.cpp:1292 +#: src/libslic3r/PrintConfig.cpp:1310 src/libslic3r/PrintConfig.cpp:1328 +#: src/libslic3r/PrintConfig.cpp:1384 src/libslic3r/PrintConfig.cpp:1394 +#: src/libslic3r/PrintConfig.cpp:1516 src/libslic3r/PrintConfig.cpp:1524 +#: src/libslic3r/PrintConfig.cpp:1565 src/libslic3r/PrintConfig.cpp:1573 +#: src/libslic3r/PrintConfig.cpp:1583 src/libslic3r/PrintConfig.cpp:1591 +#: src/libslic3r/PrintConfig.cpp:1599 src/libslic3r/PrintConfig.cpp:1682 +#: src/libslic3r/PrintConfig.cpp:1914 src/libslic3r/PrintConfig.cpp:1985 +#: src/libslic3r/PrintConfig.cpp:2019 src/libslic3r/PrintConfig.cpp:2147 +#: src/libslic3r/PrintConfig.cpp:2226 src/libslic3r/PrintConfig.cpp:2233 +#: src/libslic3r/PrintConfig.cpp:2240 src/libslic3r/PrintConfig.cpp:2270 +#: src/libslic3r/PrintConfig.cpp:2280 src/libslic3r/PrintConfig.cpp:2290 +#: src/libslic3r/PrintConfig.cpp:2475 src/libslic3r/PrintConfig.cpp:2614 +#: src/libslic3r/PrintConfig.cpp:2623 src/libslic3r/PrintConfig.cpp:2632 +#: src/libslic3r/PrintConfig.cpp:2642 src/libslic3r/PrintConfig.cpp:2686 +#: src/libslic3r/PrintConfig.cpp:2696 src/libslic3r/PrintConfig.cpp:2708 +#: src/libslic3r/PrintConfig.cpp:2728 src/libslic3r/PrintConfig.cpp:2738 +#: src/libslic3r/PrintConfig.cpp:2748 src/libslic3r/PrintConfig.cpp:2766 +#: src/libslic3r/PrintConfig.cpp:2781 src/libslic3r/PrintConfig.cpp:2795 +#: src/libslic3r/PrintConfig.cpp:2806 src/libslic3r/PrintConfig.cpp:2819 +#: src/libslic3r/PrintConfig.cpp:2864 src/libslic3r/PrintConfig.cpp:2874 +#: src/libslic3r/PrintConfig.cpp:2883 src/libslic3r/PrintConfig.cpp:2893 +#: src/libslic3r/PrintConfig.cpp:2909 msgid "mm" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:93 src/libslic3r/PrintConfig.cpp:710 +#: src/slic3r/GUI/BedShapeDialog.cpp:93 src/libslic3r/PrintConfig.cpp:709 msgid "Diameter" msgstr "" @@ -214,7 +214,7 @@ msgid "Load..." msgstr "" #: src/slic3r/GUI/BedShapeDialog.cpp:190 src/slic3r/GUI/BedShapeDialog.cpp:269 -#: src/slic3r/GUI/Tab.cpp:3094 +#: src/slic3r/GUI/Tab.cpp:3108 msgid "Remove" msgstr "" @@ -310,7 +310,7 @@ msgid "" msgstr "" #: src/slic3r/GUI/ConfigManipulation.cpp:49 -#: src/slic3r/GUI/GUI_ObjectLayers.cpp:27 src/slic3r/GUI/Tab.cpp:1039 +#: src/slic3r/GUI/GUI_ObjectLayers.cpp:27 src/slic3r/GUI/Tab.cpp:1051 #: src/libslic3r/PrintConfig.cpp:71 msgid "Layer height" msgstr "" @@ -322,11 +322,11 @@ msgid "" "The first layer height will be reset to 0.01." msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:61 src/libslic3r/PrintConfig.cpp:890 +#: src/slic3r/GUI/ConfigManipulation.cpp:61 src/libslic3r/PrintConfig.cpp:889 msgid "First layer height" msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:75 +#: src/slic3r/GUI/ConfigManipulation.cpp:81 #, no-c-format msgid "" "The Spiral Vase mode requires:\n" @@ -334,18 +334,19 @@ msgid "" "- no top solid layers\n" "- 0% fill density\n" "- no support material\n" -"- inactive Ensure vertical shell thickness" +"- Ensure vertical shell thickness enabled\n" +"- Detect thin walls disabled" msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:82 +#: src/slic3r/GUI/ConfigManipulation.cpp:89 msgid "Shall I adjust those settings in order to enable Spiral Vase?" msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:83 +#: src/slic3r/GUI/ConfigManipulation.cpp:90 msgid "Spiral Vase" msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:107 +#: src/slic3r/GUI/ConfigManipulation.cpp:115 msgid "" "The Wipe Tower currently supports the non-soluble supports only\n" "if they are printed with the current extruder without triggering a tool " @@ -354,74 +355,74 @@ msgid "" "to be set to 0)." msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:111 +#: src/slic3r/GUI/ConfigManipulation.cpp:119 msgid "Shall I adjust those settings in order to enable the Wipe Tower?" msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:112 -#: src/slic3r/GUI/ConfigManipulation.cpp:132 +#: src/slic3r/GUI/ConfigManipulation.cpp:120 +#: src/slic3r/GUI/ConfigManipulation.cpp:140 msgid "Wipe Tower" msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:128 +#: src/slic3r/GUI/ConfigManipulation.cpp:136 msgid "" "For the Wipe Tower to work with the soluble supports, the support layers\n" "need to be synchronized with the object layers." msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:131 +#: src/slic3r/GUI/ConfigManipulation.cpp:139 msgid "Shall I synchronize support layers in order to enable the Wipe Tower?" msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:151 +#: src/slic3r/GUI/ConfigManipulation.cpp:159 msgid "" "Supports work better, if the following feature is enabled:\n" "- Detect bridging perimeters" msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:154 +#: src/slic3r/GUI/ConfigManipulation.cpp:162 msgid "Shall I adjust those settings for supports?" msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:155 +#: src/slic3r/GUI/ConfigManipulation.cpp:163 msgid "Support Generator" msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:200 +#: src/slic3r/GUI/ConfigManipulation.cpp:208 msgid "The %1% infill pattern is not supposed to work at 100%% density." msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:202 +#: src/slic3r/GUI/ConfigManipulation.cpp:210 msgid "Shall I switch to rectilinear fill pattern?" msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:203 +#: src/slic3r/GUI/ConfigManipulation.cpp:211 #: src/slic3r/GUI/GUI_ObjectList.cpp:35 src/slic3r/GUI/GUI_ObjectList.cpp:94 #: src/slic3r/GUI/GUI_ObjectList.cpp:612 src/slic3r/GUI/Plater.cpp:524 -#: src/slic3r/GUI/Tab.cpp:1081 src/slic3r/GUI/Tab.cpp:1082 +#: src/slic3r/GUI/Tab.cpp:1093 src/slic3r/GUI/Tab.cpp:1094 #: src/libslic3r/PrintConfig.cpp:193 src/libslic3r/PrintConfig.cpp:416 -#: src/libslic3r/PrintConfig.cpp:436 src/libslic3r/PrintConfig.cpp:777 -#: src/libslic3r/PrintConfig.cpp:791 src/libslic3r/PrintConfig.cpp:828 -#: src/libslic3r/PrintConfig.cpp:982 src/libslic3r/PrintConfig.cpp:992 -#: src/libslic3r/PrintConfig.cpp:1010 src/libslic3r/PrintConfig.cpp:1029 -#: src/libslic3r/PrintConfig.cpp:1048 src/libslic3r/PrintConfig.cpp:1738 -#: src/libslic3r/PrintConfig.cpp:1755 +#: src/libslic3r/PrintConfig.cpp:436 src/libslic3r/PrintConfig.cpp:776 +#: src/libslic3r/PrintConfig.cpp:790 src/libslic3r/PrintConfig.cpp:827 +#: src/libslic3r/PrintConfig.cpp:981 src/libslic3r/PrintConfig.cpp:991 +#: src/libslic3r/PrintConfig.cpp:1009 src/libslic3r/PrintConfig.cpp:1028 +#: src/libslic3r/PrintConfig.cpp:1047 src/libslic3r/PrintConfig.cpp:1728 +#: src/libslic3r/PrintConfig.cpp:1745 msgid "Infill" msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:309 +#: src/slic3r/GUI/ConfigManipulation.cpp:317 msgid "Head penetration should not be greater than the head width." msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:311 +#: src/slic3r/GUI/ConfigManipulation.cpp:319 msgid "Invalid Head penetration" msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:322 +#: src/slic3r/GUI/ConfigManipulation.cpp:330 msgid "Pinhead diameter should be smaller than the pillar diameter." msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:324 +#: src/slic3r/GUI/ConfigManipulation.cpp:332 msgid "Invalid pinhead diameter" msgstr "" @@ -453,7 +454,7 @@ msgstr "" msgid "PrusaSlicer version" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:51 src/slic3r/GUI/Preset.cpp:1452 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:51 src/slic3r/GUI/Preset.cpp:1471 msgid "print" msgstr "" @@ -461,11 +462,11 @@ msgstr "" msgid "filaments" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:53 src/slic3r/GUI/Preset.cpp:1456 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:53 src/slic3r/GUI/Preset.cpp:1475 msgid "printer" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:57 src/slic3r/GUI/Tab.cpp:961 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:57 src/slic3r/GUI/Tab.cpp:973 msgid "vendor" msgstr "" @@ -519,7 +520,7 @@ msgid "Standard" msgstr "" #: src/slic3r/GUI/ConfigWizard.cpp:290 src/slic3r/GUI/ConfigWizard.cpp:573 -#: src/slic3r/GUI/Tab.cpp:3144 +#: src/slic3r/GUI/Tab.cpp:3158 msgid "All" msgstr "" @@ -635,12 +636,9 @@ msgid "" "an update is applied." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:798 src/slic3r/GUI/GUI_ObjectList.cpp:1655 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1658 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3932 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3935 src/slic3r/GUI/Plater.cpp:3211 -#: src/slic3r/GUI/Plater.cpp:3946 src/slic3r/GUI/Plater.cpp:3949 -#: src/slic3r/GUI/Plater.cpp:3980 src/slic3r/GUI/Plater.cpp:3983 +#: src/slic3r/GUI/ConfigWizard.cpp:798 src/slic3r/GUI/GUI_ObjectList.cpp:1654 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3930 src/slic3r/GUI/Plater.cpp:3209 +#: src/slic3r/GUI/Plater.cpp:3943 src/slic3r/GUI/Plater.cpp:3972 msgid "Reload from disk" msgstr "" @@ -695,7 +693,7 @@ msgstr "" msgid "Firmware Type" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:892 src/slic3r/GUI/Tab.cpp:1931 +#: src/slic3r/GUI/ConfigWizard.cpp:892 src/slic3r/GUI/Tab.cpp:1945 msgid "Firmware" msgstr "" @@ -797,8 +795,8 @@ msgstr "" msgid "SLA Technology Printers" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1751 src/slic3r/GUI/DoubleSlider.cpp:1877 -#: src/slic3r/GUI/DoubleSlider.cpp:1898 src/slic3r/GUI/GUI.cpp:240 +#: src/slic3r/GUI/ConfigWizard.cpp:1751 src/slic3r/GUI/DoubleSlider.cpp:1878 +#: src/slic3r/GUI/DoubleSlider.cpp:1899 src/slic3r/GUI/GUI.cpp:240 msgid "Notice" msgstr "" @@ -851,7 +849,7 @@ msgstr "" msgid "Filament Profiles Selection" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2014 src/slic3r/GUI/GUI_ObjectList.cpp:3528 +#: src/slic3r/GUI/ConfigWizard.cpp:2014 src/slic3r/GUI/GUI_ObjectList.cpp:3527 msgid "Type:" msgstr "" @@ -880,7 +878,7 @@ msgid "Configuration &Wizard" msgstr "" #: src/slic3r/GUI/DoubleSlider.cpp:79 -msgid "Place bearings in slots and resume" +msgid "Place bearings in slots and resume printing" msgstr "" #: src/slic3r/GUI/DoubleSlider.cpp:923 @@ -892,261 +890,254 @@ msgid "Discard all custom changes" msgstr "" #: src/slic3r/GUI/DoubleSlider.cpp:928 -msgid "For jump to print Z use left mouse button click OR (Shift+G)" +#, possible-c-format +msgid "Jump to height %s or Set extruder sequence for the entire print" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:929 -msgid "For set extruder sequence for whole print use right mouse button click" -msgstr "" - -#: src/slic3r/GUI/DoubleSlider.cpp:930 src/slic3r/GUI/DoubleSlider.cpp:1495 -msgid "Jump to print Z" +#: src/slic3r/GUI/DoubleSlider.cpp:930 src/slic3r/GUI/DoubleSlider.cpp:1501 +#: src/slic3r/GUI/DoubleSlider.cpp:1623 +msgid "Jump to height" msgstr "" #: src/slic3r/GUI/DoubleSlider.cpp:933 -msgid "For edit current color use right mouse button click on colored band" +msgid "Edit current color - Right click the colored slider segment" msgstr "" #: src/slic3r/GUI/DoubleSlider.cpp:941 -msgid "Slider(print) mode" +msgid "Print mode" msgstr "" #: src/slic3r/GUI/DoubleSlider.cpp:955 -msgid "For add change extruder use left mouse button click" +msgid "Add extruder change - Left click" msgstr "" #: src/slic3r/GUI/DoubleSlider.cpp:957 msgid "" -"For add color change use left mouse button click if you want to use colors " -"from default color list, or Shift + left mouse button click if you want to " -"select a color" +"Add color change - Left click for predefined color orShift + Left click for " +"custom color selection" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:959 +msgid "Add color change - Left click" msgstr "" #: src/slic3r/GUI/DoubleSlider.cpp:960 -msgid "For add color change use left mouse button click" +msgid "or press \"+\" key" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:961 -msgid "OR pres \"+\" key" +#: src/slic3r/GUI/DoubleSlider.cpp:962 +msgid "To add another code use Ctrl + Left click" msgstr "" #: src/slic3r/GUI/DoubleSlider.cpp:963 -msgid "For add another code use Ctrl + left mouse button click" +msgid "To add another code use Right click" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:964 -msgid "For add another code use right mouse button click" -msgstr "" - -#: src/slic3r/GUI/DoubleSlider.cpp:973 +#: src/slic3r/GUI/DoubleSlider.cpp:972 msgid "Color change (\"%1%\")" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:974 +#: src/slic3r/GUI/DoubleSlider.cpp:973 msgid "Color change (\"%1%\") for Extruder %2%" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:977 +#: src/slic3r/GUI/DoubleSlider.cpp:976 msgid "Pause print (\"%1%\")" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:979 -msgid "Extruder(tool) is changed to Extruder \"%1%\"" +#: src/slic3r/GUI/DoubleSlider.cpp:978 +msgid "Extruder (tool) is changed to Extruder \"%1%\"" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:980 +#: src/slic3r/GUI/DoubleSlider.cpp:979 msgid "\"%1%\"" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:986 +#: src/slic3r/GUI/DoubleSlider.cpp:985 msgid "Note" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:988 +#: src/slic3r/GUI/DoubleSlider.cpp:987 msgid "" -"G-code of this tick has a conflict with slider(print) mode.\n" -"Any its editing will cause a changes of DoubleSlider data." +"G-code associated to this tick mark is in a conflict with print mode.\n" +"Editing it will cause changes of Slider data." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:991 +#: src/slic3r/GUI/DoubleSlider.cpp:990 msgid "" -"There is a color change for extruder that wouldn't be used till the end of " -"printing.\n" -"This code wouldn't be processed during GCode generation." +"There is a color change for extruder that won't be used till the end of " +"print job.\n" +"This code won't be processed during G-code generation." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:994 +#: src/slic3r/GUI/DoubleSlider.cpp:993 msgid "" -"There is a extruder change to the same extruder.\n" -"This code wouldn't be processed during GCode generation." +"There is an extruder change set to the same extruder.\n" +"This code won't be processed during G-code generation." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:997 +#: src/slic3r/GUI/DoubleSlider.cpp:996 msgid "" "There is a color change for extruder that has not been used before.\n" -"Check your choice to avoid redundant color changes." +"Check your settings to avoid redundant color changes." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1002 -msgid "For Delete tick use left mouse button click OR pres \"-\" key" +#: src/slic3r/GUI/DoubleSlider.cpp:1001 +msgid "Delete tick mark - Left click or press \"-\" key" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:1003 +msgid "Edit tick mark - Ctrl + Left click" msgstr "" #: src/slic3r/GUI/DoubleSlider.cpp:1004 -msgid "For Edit tick use Ctrl + Left mouse button click" +msgid "Edit tick mark - Right click" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1005 -msgid "For Edit tick use right mouse button click" -msgstr "" - -#: src/slic3r/GUI/DoubleSlider.cpp:1099 src/slic3r/GUI/DoubleSlider.cpp:1135 -#: src/slic3r/GUI/GLCanvas3D.cpp:982 src/slic3r/GUI/Tab.cpp:2302 +#: src/slic3r/GUI/DoubleSlider.cpp:1102 src/slic3r/GUI/DoubleSlider.cpp:1138 +#: src/slic3r/GUI/GLCanvas3D.cpp:982 src/slic3r/GUI/Tab.cpp:2316 #: src/libslic3r/GCode/PreviewData.cpp:445 #, possible-c-format msgid "Extruder %d" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1100 +#: src/slic3r/GUI/DoubleSlider.cpp:1103 msgid "active" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1109 +#: src/slic3r/GUI/DoubleSlider.cpp:1112 msgid "Switch code to Change extruder" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1109 src/slic3r/GUI/GUI_ObjectList.cpp:1666 +#: src/slic3r/GUI/DoubleSlider.cpp:1112 src/slic3r/GUI/GUI_ObjectList.cpp:1661 msgid "Change extruder" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1110 +#: src/slic3r/GUI/DoubleSlider.cpp:1113 msgid "Change extruder (N/A)" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1112 +#: src/slic3r/GUI/DoubleSlider.cpp:1115 msgid "Use another extruder" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1136 +#: src/slic3r/GUI/DoubleSlider.cpp:1139 msgid "used" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1144 +#: src/slic3r/GUI/DoubleSlider.cpp:1147 msgid "Switch code to Color change (%1%) for:" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1145 +#: src/slic3r/GUI/DoubleSlider.cpp:1148 msgid "Add color change (%1%) for:" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1443 +#: src/slic3r/GUI/DoubleSlider.cpp:1449 msgid "Add color change" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1453 +#: src/slic3r/GUI/DoubleSlider.cpp:1459 msgid "Add pause print" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1456 +#: src/slic3r/GUI/DoubleSlider.cpp:1462 msgid "Add custom G-code" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1474 +#: src/slic3r/GUI/DoubleSlider.cpp:1480 msgid "Edit color" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1475 +#: src/slic3r/GUI/DoubleSlider.cpp:1481 msgid "Edit pause print message" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1476 +#: src/slic3r/GUI/DoubleSlider.cpp:1482 msgid "Edit custom G-code" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1482 +#: src/slic3r/GUI/DoubleSlider.cpp:1488 msgid "Delete color change" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1483 +#: src/slic3r/GUI/DoubleSlider.cpp:1489 msgid "Delete tool change" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1484 +#: src/slic3r/GUI/DoubleSlider.cpp:1490 msgid "Delete pause print" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1485 +#: src/slic3r/GUI/DoubleSlider.cpp:1491 msgid "Delete custom G-code" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1498 -msgid "Set extruder sequence for whole print" +#: src/slic3r/GUI/DoubleSlider.cpp:1504 +msgid "Set extruder sequence for the entire print" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1584 +#: src/slic3r/GUI/DoubleSlider.cpp:1590 msgid "Enter custom G-code used on current layer" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1585 -msgid "Custom Gcode on current layer (%1% mm)." +#: src/slic3r/GUI/DoubleSlider.cpp:1591 +msgid "Custom G-code on current layer (%1% mm)." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1600 -msgid "Enter short message shown on Printer display during pause print" +#: src/slic3r/GUI/DoubleSlider.cpp:1606 +msgid "Enter short message shown on Printer display when a print is paused" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1601 +#: src/slic3r/GUI/DoubleSlider.cpp:1607 msgid "Message for pause print on current layer (%1% mm)." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1616 -msgid "Enter print z value to jump to" -msgstr "" - -#: src/slic3r/GUI/DoubleSlider.cpp:1617 -msgid "Jump to print z" -msgstr "" - -#: src/slic3r/GUI/DoubleSlider.cpp:1871 -msgid "" -"The last color change data was saved for a single extruder printer profile." +#: src/slic3r/GUI/DoubleSlider.cpp:1622 +msgid "Enter the height you want to jump to" msgstr "" #: src/slic3r/GUI/DoubleSlider.cpp:1872 msgid "" +"The last color change data was saved for a single extruder printer profile." +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:1873 +msgid "" "The last color change data was saved for a multiple extruder printer profile." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1874 -msgid "Your current changes will cause a deletion of all saved color changes." +#: src/slic3r/GUI/DoubleSlider.cpp:1875 +msgid "Your current changes will delete all saved color changes." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1875 src/slic3r/GUI/DoubleSlider.cpp:1896 +#: src/slic3r/GUI/DoubleSlider.cpp:1876 src/slic3r/GUI/DoubleSlider.cpp:1897 msgid "Are you sure you want to continue?" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1888 +#: src/slic3r/GUI/DoubleSlider.cpp:1889 msgid "The last color change data was saved for a multi extruder printing." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1889 +#: src/slic3r/GUI/DoubleSlider.cpp:1890 msgid "" "Select YES if you want to delete all saved tool changes, \n" "\tNO if you want all tool changes switch to color changes, \n" -"\tor CANCEL for do nothing" +"\tor CANCEL to leave it unchanged" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1892 +#: src/slic3r/GUI/DoubleSlider.cpp:1893 msgid "Do you want to delete all saved tool changes?" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1894 +#: src/slic3r/GUI/DoubleSlider.cpp:1895 msgid "" "The last color change data was saved for a multi extruder printing with tool " "changes for whole print." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1895 -msgid "Your current changes will cause a deletion of all saved tool changes." +#: src/slic3r/GUI/DoubleSlider.cpp:1896 +msgid "Your current changes will delete all saved extruder (tool) changes." msgstr "" #: src/slic3r/GUI/ExtruderSequenceDialog.cpp:23 @@ -1158,10 +1149,10 @@ msgid "Set extruder change for every" msgstr "" #: src/slic3r/GUI/ExtruderSequenceDialog.cpp:52 -#: src/libslic3r/PrintConfig.cpp:352 src/libslic3r/PrintConfig.cpp:995 -#: src/libslic3r/PrintConfig.cpp:1514 src/libslic3r/PrintConfig.cpp:1699 -#: src/libslic3r/PrintConfig.cpp:1760 src/libslic3r/PrintConfig.cpp:1940 -#: src/libslic3r/PrintConfig.cpp:1986 +#: src/libslic3r/PrintConfig.cpp:352 src/libslic3r/PrintConfig.cpp:994 +#: src/libslic3r/PrintConfig.cpp:1505 src/libslic3r/PrintConfig.cpp:1690 +#: src/libslic3r/PrintConfig.cpp:1750 src/libslic3r/PrintConfig.cpp:1930 +#: src/libslic3r/PrintConfig.cpp:1976 msgid "layers" msgstr "" @@ -1185,7 +1176,7 @@ msgstr "" msgid "parameter name" msgstr "" -#: src/slic3r/GUI/Field.cpp:145 src/slic3r/GUI/OptionsGroup.cpp:570 +#: src/slic3r/GUI/Field.cpp:145 src/slic3r/GUI/OptionsGroup.cpp:574 msgid "N/A" msgstr "" @@ -1287,8 +1278,8 @@ msgstr "" msgid "Firmware image:" msgstr "" -#: src/slic3r/GUI/FirmwareDialog.cpp:805 src/slic3r/GUI/Tab.cpp:1649 -#: src/slic3r/GUI/Tab.cpp:1705 +#: src/slic3r/GUI/FirmwareDialog.cpp:805 src/slic3r/GUI/Tab.cpp:1660 +#: src/slic3r/GUI/Tab.cpp:1719 msgid "Browse" msgstr "" @@ -1488,12 +1479,12 @@ msgid "Mirror Object" msgstr "" #: src/slic3r/GUI/GLCanvas3D.cpp:2945 -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:571 +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:573 msgid "Gizmo-Move" msgstr "" #: src/slic3r/GUI/GLCanvas3D.cpp:3025 -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:573 +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:575 msgid "Gizmo-Rotate" msgstr "" @@ -1527,18 +1518,18 @@ msgstr[1] "" msgid "Add..." msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4524 src/slic3r/GUI/GUI_ObjectList.cpp:1697 -#: src/slic3r/GUI/Plater.cpp:3942 src/slic3r/GUI/Plater.cpp:3969 -#: src/slic3r/GUI/Tab.cpp:3094 +#: src/slic3r/GUI/GLCanvas3D.cpp:4524 src/slic3r/GUI/GUI_ObjectList.cpp:1692 +#: src/slic3r/GUI/Plater.cpp:3940 src/slic3r/GUI/Plater.cpp:3962 +#: src/slic3r/GUI/Tab.cpp:3108 msgid "Delete" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4533 src/slic3r/GUI/Plater.cpp:4693 +#: src/slic3r/GUI/GLCanvas3D.cpp:4533 src/slic3r/GUI/Plater.cpp:4684 msgid "Delete all" msgstr "" #: src/slic3r/GUI/GLCanvas3D.cpp:4542 src/slic3r/GUI/KBShortcutsDialog.cpp:137 -#: src/slic3r/GUI/Plater.cpp:2740 +#: src/slic3r/GUI/Plater.cpp:2738 msgid "Arrange" msgstr "" @@ -1554,12 +1545,12 @@ msgstr "" msgid "Paste" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4575 src/slic3r/GUI/Plater.cpp:3799 -#: src/slic3r/GUI/Plater.cpp:3811 src/slic3r/GUI/Plater.cpp:3956 +#: src/slic3r/GUI/GLCanvas3D.cpp:4575 src/slic3r/GUI/Plater.cpp:3797 +#: src/slic3r/GUI/Plater.cpp:3809 src/slic3r/GUI/Plater.cpp:3949 msgid "Add instance" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4586 src/slic3r/GUI/Plater.cpp:3958 +#: src/slic3r/GUI/GLCanvas3D.cpp:4586 src/slic3r/GUI/Plater.cpp:3951 msgid "Remove instance" msgstr "" @@ -1621,7 +1612,7 @@ msgid "Unsupported OpenGL version" msgstr "" #: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:42 -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:144 src/libslic3r/PrintConfig.cpp:3397 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:144 src/libslic3r/PrintConfig.cpp:3387 msgid "Cut" msgstr "" @@ -1703,19 +1694,19 @@ msgstr "" msgid "Delete drainage hole" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:786 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:791 msgid "Hollowing parameter change" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:858 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:863 msgid "Change drainage hole diameter" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:948 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:953 msgid "Hollowing and drilling" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:1027 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:1033 msgid "Move drainage hole" msgstr "" @@ -1727,7 +1718,7 @@ msgstr "" #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:480 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:499 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:517 -#: src/libslic3r/PrintConfig.cpp:3446 +#: src/libslic3r/PrintConfig.cpp:3436 msgid "Rotate" msgstr "" @@ -1735,7 +1726,7 @@ msgstr "" #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:230 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:500 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:518 -#: src/libslic3r/PrintConfig.cpp:3461 +#: src/libslic3r/PrintConfig.cpp:3451 msgid "Scale" msgstr "" @@ -1771,7 +1762,7 @@ msgid "Minimal points distance" msgstr "" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:55 -#: src/libslic3r/PrintConfig.cpp:2765 +#: src/libslic3r/PrintConfig.cpp:2755 msgid "Support points density" msgstr "" @@ -1837,7 +1828,7 @@ msgid "Are you sure you want to do it?" msgstr "" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1249 src/slic3r/GUI/GUI.cpp:246 -#: src/slic3r/GUI/Tab.cpp:3054 src/slic3r/GUI/WipeTowerDialog.cpp:45 +#: src/slic3r/GUI/Tab.cpp:3068 src/slic3r/GUI/WipeTowerDialog.cpp:45 #: src/slic3r/GUI/WipeTowerDialog.cpp:366 msgid "Warning" msgstr "" @@ -1918,11 +1909,11 @@ msgstr "" msgid "Switch to editing mode" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:498 +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:500 msgid "Gizmo-Place on Face" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:572 +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:574 msgid "Gizmo-Scale" msgstr "" @@ -2009,7 +2000,7 @@ msgstr "" msgid "Application preferences" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:813 src/slic3r/GUI/wxExtensions.cpp:730 +#: src/slic3r/GUI/GUI_App.cpp:813 src/slic3r/GUI/wxExtensions.cpp:753 msgid "Simple" msgstr "" @@ -2018,13 +2009,13 @@ msgid "Simple View Mode" msgstr "" #: src/slic3r/GUI/GUI_App.cpp:814 src/slic3r/GUI/GUI_ObjectList.cpp:102 -#: src/slic3r/GUI/GUI_ObjectList.cpp:620 src/slic3r/GUI/Tab.cpp:1077 -#: src/slic3r/GUI/Tab.cpp:1092 src/slic3r/GUI/Tab.cpp:1191 -#: src/slic3r/GUI/Tab.cpp:1194 src/slic3r/GUI/Tab.cpp:1464 -#: src/slic3r/GUI/Tab.cpp:1951 src/slic3r/GUI/Tab.cpp:3633 -#: src/slic3r/GUI/wxExtensions.cpp:731 src/libslic3r/PrintConfig.cpp:88 +#: src/slic3r/GUI/GUI_ObjectList.cpp:620 src/slic3r/GUI/Tab.cpp:1089 +#: src/slic3r/GUI/Tab.cpp:1104 src/slic3r/GUI/Tab.cpp:1203 +#: src/slic3r/GUI/Tab.cpp:1206 src/slic3r/GUI/Tab.cpp:1472 +#: src/slic3r/GUI/Tab.cpp:1965 src/slic3r/GUI/Tab.cpp:3646 +#: src/slic3r/GUI/wxExtensions.cpp:754 src/libslic3r/PrintConfig.cpp:88 #: src/libslic3r/PrintConfig.cpp:213 src/libslic3r/PrintConfig.cpp:376 -#: src/libslic3r/PrintConfig.cpp:1038 src/libslic3r/PrintConfig.cpp:2286 +#: src/libslic3r/PrintConfig.cpp:1037 src/libslic3r/PrintConfig.cpp:2276 msgid "Advanced" msgstr "" @@ -2032,7 +2023,7 @@ msgstr "" msgid "Advanced View Mode" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:815 src/slic3r/GUI/wxExtensions.cpp:732 +#: src/slic3r/GUI/GUI_App.cpp:815 src/slic3r/GUI/wxExtensions.cpp:755 msgid "Expert" msgstr "" @@ -2091,7 +2082,7 @@ msgstr "" msgid "The presets on the following tabs were modified" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:932 src/slic3r/GUI/Tab.cpp:2916 +#: src/slic3r/GUI/GUI_App.cpp:932 src/slic3r/GUI/Tab.cpp:2930 msgid "Discard changes and continue anyway?" msgstr "" @@ -2099,7 +2090,7 @@ msgstr "" msgid "Unsaved Presets" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1084 src/slic3r/GUI/Tab.cpp:2928 +#: src/slic3r/GUI/GUI_App.cpp:1084 src/slic3r/GUI/Tab.cpp:2942 msgid "It's impossible to print multi-part object(s) with SLA technology." msgstr "" @@ -2107,8 +2098,8 @@ msgstr "" msgid "Please check and fix your object list." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1086 src/slic3r/GUI/Plater.cpp:2299 -#: src/slic3r/GUI/Tab.cpp:2930 +#: src/slic3r/GUI/GUI_App.cpp:1086 src/slic3r/GUI/Plater.cpp:2297 +#: src/slic3r/GUI/Tab.cpp:2944 msgid "Attention!" msgstr "" @@ -2136,34 +2127,34 @@ msgstr "" #: src/slic3r/GUI/GUI_ObjectList.cpp:611 src/libslic3r/PrintConfig.cpp:72 #: src/libslic3r/PrintConfig.cpp:165 src/libslic3r/PrintConfig.cpp:174 #: src/libslic3r/PrintConfig.cpp:408 src/libslic3r/PrintConfig.cpp:470 -#: src/libslic3r/PrintConfig.cpp:478 src/libslic3r/PrintConfig.cpp:891 -#: src/libslic3r/PrintConfig.cpp:1076 src/libslic3r/PrintConfig.cpp:1383 -#: src/libslic3r/PrintConfig.cpp:1450 src/libslic3r/PrintConfig.cpp:1631 -#: src/libslic3r/PrintConfig.cpp:2084 src/libslic3r/PrintConfig.cpp:2143 -#: src/libslic3r/PrintConfig.cpp:2152 +#: src/libslic3r/PrintConfig.cpp:478 src/libslic3r/PrintConfig.cpp:890 +#: src/libslic3r/PrintConfig.cpp:1075 src/libslic3r/PrintConfig.cpp:1374 +#: src/libslic3r/PrintConfig.cpp:1441 src/libslic3r/PrintConfig.cpp:1622 +#: src/libslic3r/PrintConfig.cpp:2074 src/libslic3r/PrintConfig.cpp:2133 +#: src/libslic3r/PrintConfig.cpp:2142 msgid "Layers and Perimeters" msgstr "" #: src/slic3r/GUI/GUI_ObjectList.cpp:36 src/slic3r/GUI/GUI_ObjectList.cpp:95 #: src/slic3r/GUI/GUI_ObjectList.cpp:613 src/slic3r/GUI/GUI_Preview.cpp:248 -#: src/slic3r/GUI/Tab.cpp:1110 src/slic3r/GUI/Tab.cpp:1111 +#: src/slic3r/GUI/Tab.cpp:1122 src/slic3r/GUI/Tab.cpp:1123 #: src/libslic3r/ExtrusionEntity.cpp:319 src/libslic3r/PrintConfig.cpp:360 -#: src/libslic3r/PrintConfig.cpp:1511 src/libslic3r/PrintConfig.cpp:1876 -#: src/libslic3r/PrintConfig.cpp:1882 src/libslic3r/PrintConfig.cpp:1890 -#: src/libslic3r/PrintConfig.cpp:1902 src/libslic3r/PrintConfig.cpp:1912 -#: src/libslic3r/PrintConfig.cpp:1920 src/libslic3r/PrintConfig.cpp:1935 -#: src/libslic3r/PrintConfig.cpp:1956 src/libslic3r/PrintConfig.cpp:1968 -#: src/libslic3r/PrintConfig.cpp:1984 src/libslic3r/PrintConfig.cpp:1993 -#: src/libslic3r/PrintConfig.cpp:2002 src/libslic3r/PrintConfig.cpp:2013 -#: src/libslic3r/PrintConfig.cpp:2027 src/libslic3r/PrintConfig.cpp:2035 -#: src/libslic3r/PrintConfig.cpp:2036 src/libslic3r/PrintConfig.cpp:2045 -#: src/libslic3r/PrintConfig.cpp:2053 src/libslic3r/PrintConfig.cpp:2067 +#: src/libslic3r/PrintConfig.cpp:1502 src/libslic3r/PrintConfig.cpp:1866 +#: src/libslic3r/PrintConfig.cpp:1872 src/libslic3r/PrintConfig.cpp:1880 +#: src/libslic3r/PrintConfig.cpp:1892 src/libslic3r/PrintConfig.cpp:1902 +#: src/libslic3r/PrintConfig.cpp:1910 src/libslic3r/PrintConfig.cpp:1925 +#: src/libslic3r/PrintConfig.cpp:1946 src/libslic3r/PrintConfig.cpp:1958 +#: src/libslic3r/PrintConfig.cpp:1974 src/libslic3r/PrintConfig.cpp:1983 +#: src/libslic3r/PrintConfig.cpp:1992 src/libslic3r/PrintConfig.cpp:2003 +#: src/libslic3r/PrintConfig.cpp:2017 src/libslic3r/PrintConfig.cpp:2025 +#: src/libslic3r/PrintConfig.cpp:2026 src/libslic3r/PrintConfig.cpp:2035 +#: src/libslic3r/PrintConfig.cpp:2043 src/libslic3r/PrintConfig.cpp:2057 msgid "Support material" msgstr "" #: src/slic3r/GUI/GUI_ObjectList.cpp:39 src/slic3r/GUI/GUI_ObjectList.cpp:99 -#: src/slic3r/GUI/GUI_ObjectList.cpp:617 src/libslic3r/PrintConfig.cpp:2262 -#: src/libslic3r/PrintConfig.cpp:2270 +#: src/slic3r/GUI/GUI_ObjectList.cpp:617 src/libslic3r/PrintConfig.cpp:2252 +#: src/libslic3r/PrintConfig.cpp:2260 msgid "Wipe options" msgstr "" @@ -2188,63 +2179,63 @@ msgid "Add support blocker" msgstr "" #: src/slic3r/GUI/GUI_ObjectList.cpp:96 src/slic3r/GUI/GUI_ObjectList.cpp:614 -#: src/slic3r/GUI/GUI_Preview.cpp:226 src/slic3r/GUI/Tab.cpp:1135 +#: src/slic3r/GUI/GUI_Preview.cpp:226 src/slic3r/GUI/Tab.cpp:1147 #: src/libslic3r/PrintConfig.cpp:225 src/libslic3r/PrintConfig.cpp:458 -#: src/libslic3r/PrintConfig.cpp:920 src/libslic3r/PrintConfig.cpp:1049 -#: src/libslic3r/PrintConfig.cpp:1440 src/libslic3r/PrintConfig.cpp:1677 -#: src/libslic3r/PrintConfig.cpp:1726 src/libslic3r/PrintConfig.cpp:1778 -#: src/libslic3r/PrintConfig.cpp:2128 +#: src/libslic3r/PrintConfig.cpp:919 src/libslic3r/PrintConfig.cpp:1048 +#: src/libslic3r/PrintConfig.cpp:1431 src/libslic3r/PrintConfig.cpp:1668 +#: src/libslic3r/PrintConfig.cpp:1716 src/libslic3r/PrintConfig.cpp:1768 +#: src/libslic3r/PrintConfig.cpp:2118 msgid "Speed" msgstr "" #: src/slic3r/GUI/GUI_ObjectList.cpp:97 src/slic3r/GUI/GUI_ObjectList.cpp:615 -#: src/slic3r/GUI/Tab.cpp:1170 src/slic3r/GUI/Tab.cpp:1822 -#: src/libslic3r/PrintConfig.cpp:488 src/libslic3r/PrintConfig.cpp:1003 -#: src/libslic3r/PrintConfig.cpp:1418 src/libslic3r/PrintConfig.cpp:1747 -#: src/libslic3r/PrintConfig.cpp:1948 src/libslic3r/PrintConfig.cpp:1975 +#: src/slic3r/GUI/Tab.cpp:1182 src/slic3r/GUI/Tab.cpp:1836 +#: src/libslic3r/PrintConfig.cpp:488 src/libslic3r/PrintConfig.cpp:1002 +#: src/libslic3r/PrintConfig.cpp:1409 src/libslic3r/PrintConfig.cpp:1737 +#: src/libslic3r/PrintConfig.cpp:1938 src/libslic3r/PrintConfig.cpp:1965 msgid "Extruders" msgstr "" #: src/slic3r/GUI/GUI_ObjectList.cpp:98 src/slic3r/GUI/GUI_ObjectList.cpp:616 #: src/libslic3r/PrintConfig.cpp:447 src/libslic3r/PrintConfig.cpp:555 -#: src/libslic3r/PrintConfig.cpp:878 src/libslic3r/PrintConfig.cpp:1011 -#: src/libslic3r/PrintConfig.cpp:1427 src/libslic3r/PrintConfig.cpp:1767 -#: src/libslic3r/PrintConfig.cpp:1957 src/libslic3r/PrintConfig.cpp:2116 +#: src/libslic3r/PrintConfig.cpp:877 src/libslic3r/PrintConfig.cpp:1010 +#: src/libslic3r/PrintConfig.cpp:1418 src/libslic3r/PrintConfig.cpp:1757 +#: src/libslic3r/PrintConfig.cpp:1947 src/libslic3r/PrintConfig.cpp:2106 msgid "Extrusion Width" msgstr "" #: src/slic3r/GUI/GUI_ObjectList.cpp:104 src/slic3r/GUI/GUI_ObjectList.cpp:622 -#: src/slic3r/GUI/Plater.cpp:492 src/slic3r/GUI/Tab.cpp:3576 -#: src/slic3r/GUI/Tab.cpp:3577 src/libslic3r/PrintConfig.cpp:2615 -#: src/libslic3r/PrintConfig.cpp:2622 src/libslic3r/PrintConfig.cpp:2631 -#: src/libslic3r/PrintConfig.cpp:2640 src/libslic3r/PrintConfig.cpp:2650 -#: src/libslic3r/PrintConfig.cpp:2676 src/libslic3r/PrintConfig.cpp:2683 -#: src/libslic3r/PrintConfig.cpp:2694 src/libslic3r/PrintConfig.cpp:2704 -#: src/libslic3r/PrintConfig.cpp:2713 src/libslic3r/PrintConfig.cpp:2726 -#: src/libslic3r/PrintConfig.cpp:2736 src/libslic3r/PrintConfig.cpp:2745 -#: src/libslic3r/PrintConfig.cpp:2755 src/libslic3r/PrintConfig.cpp:2766 -#: src/libslic3r/PrintConfig.cpp:2774 +#: src/slic3r/GUI/Plater.cpp:492 src/slic3r/GUI/Tab.cpp:3589 +#: src/slic3r/GUI/Tab.cpp:3590 src/libslic3r/PrintConfig.cpp:2605 +#: src/libslic3r/PrintConfig.cpp:2612 src/libslic3r/PrintConfig.cpp:2621 +#: src/libslic3r/PrintConfig.cpp:2630 src/libslic3r/PrintConfig.cpp:2640 +#: src/libslic3r/PrintConfig.cpp:2666 src/libslic3r/PrintConfig.cpp:2673 +#: src/libslic3r/PrintConfig.cpp:2684 src/libslic3r/PrintConfig.cpp:2694 +#: src/libslic3r/PrintConfig.cpp:2703 src/libslic3r/PrintConfig.cpp:2716 +#: src/libslic3r/PrintConfig.cpp:2726 src/libslic3r/PrintConfig.cpp:2735 +#: src/libslic3r/PrintConfig.cpp:2745 src/libslic3r/PrintConfig.cpp:2756 +#: src/libslic3r/PrintConfig.cpp:2764 msgid "Supports" msgstr "" #: src/slic3r/GUI/GUI_ObjectList.cpp:105 src/slic3r/GUI/GUI_ObjectList.cpp:623 -#: src/slic3r/GUI/Plater.cpp:632 src/slic3r/GUI/Tab.cpp:3608 -#: src/slic3r/GUI/Tab.cpp:3609 src/libslic3r/PrintConfig.cpp:2782 -#: src/libslic3r/PrintConfig.cpp:2789 src/libslic3r/PrintConfig.cpp:2803 -#: src/libslic3r/PrintConfig.cpp:2814 src/libslic3r/PrintConfig.cpp:2824 -#: src/libslic3r/PrintConfig.cpp:2846 src/libslic3r/PrintConfig.cpp:2857 -#: src/libslic3r/PrintConfig.cpp:2864 src/libslic3r/PrintConfig.cpp:2871 -#: src/libslic3r/PrintConfig.cpp:2882 src/libslic3r/PrintConfig.cpp:2891 -#: src/libslic3r/PrintConfig.cpp:2900 +#: src/slic3r/GUI/Plater.cpp:632 src/slic3r/GUI/Tab.cpp:3621 +#: src/slic3r/GUI/Tab.cpp:3622 src/libslic3r/PrintConfig.cpp:2772 +#: src/libslic3r/PrintConfig.cpp:2779 src/libslic3r/PrintConfig.cpp:2793 +#: src/libslic3r/PrintConfig.cpp:2804 src/libslic3r/PrintConfig.cpp:2814 +#: src/libslic3r/PrintConfig.cpp:2836 src/libslic3r/PrintConfig.cpp:2847 +#: src/libslic3r/PrintConfig.cpp:2854 src/libslic3r/PrintConfig.cpp:2861 +#: src/libslic3r/PrintConfig.cpp:2872 src/libslic3r/PrintConfig.cpp:2881 +#: src/libslic3r/PrintConfig.cpp:2890 msgid "Pad" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:106 src/slic3r/GUI/Tab.cpp:3626 -#: src/slic3r/GUI/Tab.cpp:3627 src/libslic3r/SLA/Hollowing.cpp:46 +#: src/slic3r/GUI/GUI_ObjectList.cpp:106 src/slic3r/GUI/Tab.cpp:3639 +#: src/slic3r/GUI/Tab.cpp:3640 src/libslic3r/SLA/Hollowing.cpp:46 #: src/libslic3r/SLA/Hollowing.cpp:58 src/libslic3r/SLA/Hollowing.cpp:67 -#: src/libslic3r/SLA/Hollowing.cpp:76 src/libslic3r/PrintConfig.cpp:2910 -#: src/libslic3r/PrintConfig.cpp:2917 src/libslic3r/PrintConfig.cpp:2927 -#: src/libslic3r/PrintConfig.cpp:2936 +#: src/libslic3r/SLA/Hollowing.cpp:76 src/libslic3r/PrintConfig.cpp:2900 +#: src/libslic3r/PrintConfig.cpp:2907 src/libslic3r/PrintConfig.cpp:2917 +#: src/libslic3r/PrintConfig.cpp:2926 msgid "Hollowing" msgstr "" @@ -2253,8 +2244,8 @@ msgstr "" msgid "Name" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:276 src/slic3r/GUI/Tab.cpp:1428 -#: src/slic3r/GUI/wxExtensions.cpp:589 src/libslic3r/PrintConfig.cpp:487 +#: src/slic3r/GUI/GUI_ObjectList.cpp:276 src/slic3r/GUI/Tab.cpp:1436 +#: src/slic3r/GUI/wxExtensions.cpp:598 src/libslic3r/PrintConfig.cpp:487 msgid "Extruder" msgstr "" @@ -2312,9 +2303,9 @@ msgid "Click the icon to change the object printable property" msgstr "" #: src/slic3r/GUI/GUI_ObjectList.cpp:455 src/slic3r/GUI/GUI_ObjectList.cpp:467 -#: src/slic3r/GUI/GUI_ObjectList.cpp:915 src/slic3r/GUI/GUI_ObjectList.cpp:3947 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3957 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3992 +#: src/slic3r/GUI/GUI_ObjectList.cpp:915 src/slic3r/GUI/GUI_ObjectList.cpp:3941 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3951 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3986 #: src/slic3r/GUI/ObjectDataViewModel.cpp:200 #: src/slic3r/GUI/ObjectDataViewModel.cpp:257 #: src/slic3r/GUI/ObjectDataViewModel.cpp:282 @@ -2336,7 +2327,7 @@ msgid "Rename Sub-object" msgstr "" #: src/slic3r/GUI/GUI_ObjectList.cpp:1089 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3756 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3755 msgid "Instances to Separated Objects" msgstr "" @@ -2351,7 +2342,7 @@ msgstr "" #: src/slic3r/GUI/GUI_ObjectList.cpp:1180 #: src/slic3r/GUI/GUI_ObjectList.cpp:1528 #: src/slic3r/GUI/GUI_ObjectList.cpp:1534 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1828 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1823 #, possible-c-format msgid "Quick Add Settings (%s)" msgstr "" @@ -2439,263 +2430,260 @@ msgstr "" msgid "Fix through the Netfabb" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1647 src/slic3r/GUI/Plater.cpp:3987 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1647 src/slic3r/GUI/Plater.cpp:3975 msgid "Export as STL" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1655 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1658 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3932 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3935 src/slic3r/GUI/Plater.cpp:3946 -#: src/slic3r/GUI/Plater.cpp:3949 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1654 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3930 src/slic3r/GUI/Plater.cpp:3943 msgid "Reload the selected volumes from disk" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1685 src/libslic3r/PrintConfig.cpp:325 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1680 src/libslic3r/PrintConfig.cpp:325 msgid "Default" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1691 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1686 msgid "Select new extruder for the object/part" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1703 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1698 msgid "Scale to print volume" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1703 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1698 msgid "Scale the selected object to fit the print volume" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1772 -#: src/slic3r/GUI/GUI_ObjectList.cpp:2030 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1767 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2025 msgid "Add Shape" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1858 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1853 msgid "Load Part" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1897 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1892 msgid "Error!" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1972 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1967 msgid "Add Generic Subobject" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2001 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1996 msgid "Generic" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2119 -#: src/slic3r/GUI/GUI_ObjectList.cpp:2221 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2114 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2216 msgid "Last instance of an object cannot be deleted." msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2131 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2126 msgid "Delete Settings" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2155 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2150 msgid "Delete All Instances from Object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2171 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2166 msgid "Delete Height Range" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2202 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2197 msgid "From Object List You can't delete the last solid part from object." msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2206 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2201 msgid "Delete Subobject" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2225 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2220 msgid "Delete Instance" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2249 src/slic3r/GUI/Plater.cpp:2964 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2244 src/slic3r/GUI/Plater.cpp:2962 msgid "" "The selected object couldn't be split because it contains only one part." msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2253 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2248 msgid "Split to Parts" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2305 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2304 msgid "Add Layers" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2431 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2430 msgid "Group manipulation" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2443 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2442 msgid "Object manipulation" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2456 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2455 msgid "Object Settings to modify" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2460 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2459 msgid "Part Settings to modify" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2465 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2464 msgid "Layer range Settings to modify" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2471 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2470 msgid "Part manipulation" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2477 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2476 msgid "Instance manipulation" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2484 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2483 msgid "Height ranges" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2484 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2483 msgid "Settings for height range" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2670 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2669 msgid "Delete Selected Item" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2807 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2806 msgid "Delete Selected" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2873 -#: src/slic3r/GUI/GUI_ObjectList.cpp:2902 -#: src/slic3r/GUI/GUI_ObjectList.cpp:2920 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2872 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2901 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2919 msgid "Add Height Range" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2980 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2979 msgid "Edit Height Range" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3266 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3265 msgid "Selection-Remove from list" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3274 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3273 msgid "Selection-Add from list" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3392 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3391 msgid "Object or Instance" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3393 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3526 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3392 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3525 msgid "Part" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3393 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3392 msgid "Layer" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3395 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3394 msgid "Unsupported selection" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3396 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3395 #, possible-c-format msgid "You started your selection with %s Item." msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3397 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3396 #, possible-c-format msgid "In this mode you can select only other %s Items%s" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3400 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3399 msgid "of a current Object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3405 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3480 src/slic3r/GUI/Plater.cpp:143 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3404 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3479 src/slic3r/GUI/Plater.cpp:143 msgid "Info" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3521 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3520 msgid "You can't change a type of the last solid part of the object." msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3526 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3525 msgid "Modifier" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3526 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3525 msgid "Support Enforcer" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3526 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3525 msgid "Support Blocker" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3528 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3527 msgid "Select type of part" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3533 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3532 msgid "Change Part Type" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3778 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3777 msgid "Enter new name" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3778 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3777 msgid "Renaming" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3794 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3901 src/slic3r/GUI/Tab.cpp:3426 -#: src/slic3r/GUI/Tab.cpp:3430 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3793 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3900 src/slic3r/GUI/Tab.cpp:3440 +#: src/slic3r/GUI/Tab.cpp:3444 msgid "The supplied name is not valid;" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3795 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3902 src/slic3r/GUI/Tab.cpp:3427 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3794 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3901 src/slic3r/GUI/Tab.cpp:3441 msgid "the following characters are not allowed:" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3927 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3926 msgid "Set extruder for selected items" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3928 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3927 msgid "Select extruder number for selected objects and/or parts" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3951 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3945 msgid "Select extruder number:" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3952 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3946 msgid "This extruder will be set for selected items" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3977 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3971 msgid "Change Extruders" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4074 src/slic3r/GUI/Selection.cpp:1474 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4068 src/slic3r/GUI/Selection.cpp:1474 msgid "Set Printable" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4074 src/slic3r/GUI/Selection.cpp:1474 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4068 src/slic3r/GUI/Selection.cpp:1474 msgid "Set Unprintable" msgstr "" @@ -2827,11 +2815,11 @@ msgstr "" msgid "Height" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:225 src/libslic3r/PrintConfig.cpp:2248 +#: src/slic3r/GUI/GUI_Preview.cpp:225 src/libslic3r/PrintConfig.cpp:2238 msgid "Width" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:227 src/slic3r/GUI/Tab.cpp:1451 +#: src/slic3r/GUI/GUI_Preview.cpp:227 src/slic3r/GUI/Tab.cpp:1459 msgid "Fan speed" msgstr "" @@ -2875,12 +2863,12 @@ msgid "Internal infill" msgstr "" #: src/slic3r/GUI/GUI_Preview.cpp:243 src/libslic3r/ExtrusionEntity.cpp:314 -#: src/libslic3r/PrintConfig.cpp:1766 src/libslic3r/PrintConfig.cpp:1777 +#: src/libslic3r/PrintConfig.cpp:1756 src/libslic3r/PrintConfig.cpp:1767 msgid "Solid infill" msgstr "" #: src/slic3r/GUI/GUI_Preview.cpp:244 src/libslic3r/ExtrusionEntity.cpp:315 -#: src/libslic3r/PrintConfig.cpp:2115 src/libslic3r/PrintConfig.cpp:2127 +#: src/libslic3r/PrintConfig.cpp:2105 src/libslic3r/PrintConfig.cpp:2117 msgid "Top solid infill" msgstr "" @@ -2889,26 +2877,26 @@ msgid "Bridge infill" msgstr "" #: src/slic3r/GUI/GUI_Preview.cpp:246 src/libslic3r/ExtrusionEntity.cpp:317 -#: src/libslic3r/PrintConfig.cpp:919 +#: src/libslic3r/PrintConfig.cpp:918 msgid "Gap fill" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:247 src/slic3r/GUI/Tab.cpp:1101 +#: src/slic3r/GUI/GUI_Preview.cpp:247 src/slic3r/GUI/Tab.cpp:1113 #: src/libslic3r/ExtrusionEntity.cpp:318 msgid "Skirt" msgstr "" #: src/slic3r/GUI/GUI_Preview.cpp:249 src/libslic3r/ExtrusionEntity.cpp:320 -#: src/libslic3r/PrintConfig.cpp:2001 +#: src/libslic3r/PrintConfig.cpp:1991 msgid "Support material interface" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:250 src/slic3r/GUI/Tab.cpp:1181 +#: src/slic3r/GUI/GUI_Preview.cpp:250 src/slic3r/GUI/Tab.cpp:1193 #: src/libslic3r/ExtrusionEntity.cpp:321 msgid "Wipe tower" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:255 src/libslic3r/PrintConfig.cpp:2162 +#: src/slic3r/GUI/GUI_Preview.cpp:255 src/libslic3r/PrintConfig.cpp:2152 msgid "Travel" msgstr "" @@ -2949,7 +2937,7 @@ msgid "Load Config from .ini/amf/3mf/gcode" msgstr "" #: src/slic3r/GUI/KBShortcutsDialog.cpp:110 src/slic3r/GUI/Plater.cpp:888 -#: src/slic3r/GUI/Plater.cpp:5544 src/libslic3r/PrintConfig.cpp:3348 +#: src/slic3r/GUI/Plater.cpp:5555 src/libslic3r/PrintConfig.cpp:3338 msgid "Export G-code" msgstr "" @@ -3537,8 +3525,8 @@ msgstr "" #. TRN To be shown in the main menu View->Top #. TRN To be shown in Print Settings "Top solid layers" -#: src/slic3r/GUI/MainFrame.cpp:662 src/libslic3r/PrintConfig.cpp:2142 -#: src/libslic3r/PrintConfig.cpp:2151 +#: src/slic3r/GUI/MainFrame.cpp:662 src/libslic3r/PrintConfig.cpp:2132 +#: src/libslic3r/PrintConfig.cpp:2141 msgid "Top" msgstr "" @@ -3566,7 +3554,7 @@ msgstr "" msgid "Front View" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:669 src/libslic3r/PrintConfig.cpp:1641 +#: src/slic3r/GUI/MainFrame.cpp:669 src/libslic3r/PrintConfig.cpp:1632 msgid "Rear" msgstr "" @@ -3731,9 +3719,9 @@ msgstr "" msgid "Save zip file as:" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:849 src/slic3r/GUI/Plater.cpp:3107 -#: src/slic3r/GUI/Plater.cpp:5126 src/slic3r/GUI/Tab.cpp:1211 -#: src/slic3r/GUI/Tab.cpp:3634 +#: src/slic3r/GUI/MainFrame.cpp:849 src/slic3r/GUI/Plater.cpp:3105 +#: src/slic3r/GUI/Plater.cpp:5137 src/slic3r/GUI/Tab.cpp:1223 +#: src/slic3r/GUI/Tab.cpp:3647 msgid "Slicing" msgstr "" @@ -3763,7 +3751,7 @@ msgstr "" msgid "Your file was repaired." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:913 src/libslic3r/PrintConfig.cpp:3442 +#: src/slic3r/GUI/MainFrame.cpp:913 src/libslic3r/PrintConfig.cpp:3432 msgid "Repair" msgstr "" @@ -3831,8 +3819,8 @@ msgstr "" msgid "Instance %d" msgstr "" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:67 src/slic3r/GUI/Tab.cpp:3482 -#: src/slic3r/GUI/Tab.cpp:3572 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:67 src/slic3r/GUI/Tab.cpp:3496 +#: src/slic3r/GUI/Tab.cpp:3585 msgid "Layers" msgstr "" @@ -3840,12 +3828,12 @@ msgstr "" msgid "Range" msgstr "" -#: src/slic3r/GUI/OptionsGroup.cpp:249 +#: src/slic3r/GUI/OptionsGroup.cpp:253 msgctxt "Layers" msgid "Top" msgstr "" -#: src/slic3r/GUI/OptionsGroup.cpp:249 +#: src/slic3r/GUI/OptionsGroup.cpp:253 msgctxt "Layers" msgid "Bottom" msgstr "" @@ -3907,8 +3895,8 @@ msgstr "" msgid "Select what kind of support do you need" msgstr "" -#: src/slic3r/GUI/Plater.cpp:497 src/libslic3r/PrintConfig.cpp:1911 -#: src/libslic3r/PrintConfig.cpp:2675 +#: src/slic3r/GUI/Plater.cpp:497 src/libslic3r/PrintConfig.cpp:1901 +#: src/libslic3r/PrintConfig.cpp:2665 msgid "Support on build plate only" msgstr "" @@ -3920,7 +3908,7 @@ msgstr "" msgid "Everywhere" msgstr "" -#: src/slic3r/GUI/Plater.cpp:531 src/slic3r/GUI/Tab.cpp:1107 +#: src/slic3r/GUI/Plater.cpp:531 src/slic3r/GUI/Tab.cpp:1119 msgid "Brim" msgstr "" @@ -3950,8 +3938,8 @@ msgstr "" msgid "Print settings" msgstr "" -#: src/slic3r/GUI/Plater.cpp:813 src/slic3r/GUI/Tab.cpp:1419 -#: src/slic3r/GUI/Tab.cpp:1420 +#: src/slic3r/GUI/Plater.cpp:813 src/slic3r/GUI/Tab.cpp:1427 +#: src/slic3r/GUI/Tab.cpp:1428 msgid "Filament" msgstr "" @@ -3959,7 +3947,7 @@ msgstr "" msgid "SLA print settings" msgstr "" -#: src/slic3r/GUI/Plater.cpp:815 src/slic3r/GUI/Preset.cpp:1455 +#: src/slic3r/GUI/Plater.cpp:815 src/slic3r/GUI/Preset.cpp:1474 msgid "SLA material" msgstr "" @@ -3967,7 +3955,7 @@ msgstr "" msgid "Printer" msgstr "" -#: src/slic3r/GUI/Plater.cpp:875 src/slic3r/GUI/Plater.cpp:5545 +#: src/slic3r/GUI/Plater.cpp:875 src/slic3r/GUI/Plater.cpp:5556 msgid "Send to printer" msgstr "" @@ -3976,11 +3964,11 @@ msgid "Remove device" msgstr "" #: src/slic3r/GUI/Plater.cpp:877 -msgid "Export to SD card/ USB thumb drive" +msgid "Export to SD card / Flash drive" msgstr "" -#: src/slic3r/GUI/Plater.cpp:889 src/slic3r/GUI/Plater.cpp:3107 -#: src/slic3r/GUI/Plater.cpp:5129 +#: src/slic3r/GUI/Plater.cpp:889 src/slic3r/GUI/Plater.cpp:3105 +#: src/slic3r/GUI/Plater.cpp:5140 msgid "Slice now" msgstr "" @@ -4029,8 +4017,8 @@ msgstr "" msgid "wipe tower" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1241 src/libslic3r/PrintConfig.cpp:761 -#: src/libslic3r/PrintConfig.cpp:2511 src/libslic3r/PrintConfig.cpp:2512 +#: src/slic3r/GUI/Plater.cpp:1241 src/libslic3r/PrintConfig.cpp:760 +#: src/libslic3r/PrintConfig.cpp:2501 src/libslic3r/PrintConfig.cpp:2502 msgid "Cost" msgstr "" @@ -4039,7 +4027,7 @@ msgid "normal mode" msgstr "" #: src/slic3r/GUI/Plater.cpp:1262 src/slic3r/GUI/Plater.cpp:1271 -#: src/libslic3r/PrintConfig.cpp:583 +#: src/libslic3r/PrintConfig.cpp:582 msgid "Color" msgstr "" @@ -4055,409 +4043,409 @@ msgstr "" msgid "Load Files" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2137 +#: src/slic3r/GUI/Plater.cpp:2135 msgid "New Project" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2259 +#: src/slic3r/GUI/Plater.cpp:2257 msgid "Loading" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2269 +#: src/slic3r/GUI/Plater.cpp:2267 #, possible-c-format msgid "Processing input file %s" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2297 +#: src/slic3r/GUI/Plater.cpp:2295 msgid "You cannot load SLA project with a multi-part object on the bed" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2298 src/slic3r/GUI/Tab.cpp:2929 +#: src/slic3r/GUI/Plater.cpp:2296 src/slic3r/GUI/Tab.cpp:2943 msgid "Please check your object list before preset changing." msgstr "" -#: src/slic3r/GUI/Plater.cpp:2343 +#: src/slic3r/GUI/Plater.cpp:2341 msgid "" "This file contains several objects positioned at multiple heights.\n" "Instead of considering them as multiple objects, should I consider\n" "this file as a single object having multiple parts?" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2346 src/slic3r/GUI/Plater.cpp:2399 +#: src/slic3r/GUI/Plater.cpp:2344 src/slic3r/GUI/Plater.cpp:2397 msgid "Multi-part object detected" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2353 +#: src/slic3r/GUI/Plater.cpp:2351 msgid "" "This file cannot be loaded in a simple mode. Do you want to switch to an " "advanced mode?" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2354 +#: src/slic3r/GUI/Plater.cpp:2352 msgid "Detected advanced data" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2376 +#: src/slic3r/GUI/Plater.cpp:2374 #, possible-c-format msgid "" "You can't to add the object(s) from %s because of one or some of them " "is(are) multi-part" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2396 +#: src/slic3r/GUI/Plater.cpp:2394 msgid "" "Multiple objects were loaded for a multi-material printer.\n" "Instead of considering them as multiple objects, should I consider\n" "these files to represent a single object having multiple parts?" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2412 +#: src/slic3r/GUI/Plater.cpp:2410 msgid "Loaded" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2514 +#: src/slic3r/GUI/Plater.cpp:2512 msgid "" "Your object appears to be too large, so it was automatically scaled down to " "fit your print bed." msgstr "" -#: src/slic3r/GUI/Plater.cpp:2515 +#: src/slic3r/GUI/Plater.cpp:2513 msgid "Object too large?" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2577 +#: src/slic3r/GUI/Plater.cpp:2575 msgid "Export STL file:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2584 +#: src/slic3r/GUI/Plater.cpp:2582 msgid "Export AMF file:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2590 +#: src/slic3r/GUI/Plater.cpp:2588 msgid "Save file as:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2596 +#: src/slic3r/GUI/Plater.cpp:2594 msgid "Export OBJ file:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2698 +#: src/slic3r/GUI/Plater.cpp:2696 msgid "Delete Object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2709 +#: src/slic3r/GUI/Plater.cpp:2707 msgid "Reset Project" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2746 +#: src/slic3r/GUI/Plater.cpp:2744 msgid "Hollow" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2753 +#: src/slic3r/GUI/Plater.cpp:2751 msgid "Optimize Rotation" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2799 +#: src/slic3r/GUI/Plater.cpp:2797 msgid "Arranging" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2821 +#: src/slic3r/GUI/Plater.cpp:2819 msgid "Could not arrange model objects! Some geometries may be invalid." msgstr "" -#: src/slic3r/GUI/Plater.cpp:2827 +#: src/slic3r/GUI/Plater.cpp:2825 msgid "Arranging canceled." msgstr "" -#: src/slic3r/GUI/Plater.cpp:2828 +#: src/slic3r/GUI/Plater.cpp:2826 msgid "Arranging done." msgstr "" -#: src/slic3r/GUI/Plater.cpp:2844 +#: src/slic3r/GUI/Plater.cpp:2842 msgid "Searching for optimal orientation" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2877 +#: src/slic3r/GUI/Plater.cpp:2875 msgid "Orientation search canceled." msgstr "" -#: src/slic3r/GUI/Plater.cpp:2878 +#: src/slic3r/GUI/Plater.cpp:2876 msgid "Orientation found." msgstr "" -#: src/slic3r/GUI/Plater.cpp:2908 +#: src/slic3r/GUI/Plater.cpp:2906 msgid "Indexing hollowed object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2912 +#: src/slic3r/GUI/Plater.cpp:2910 msgid "Hollowing cancelled." msgstr "" -#: src/slic3r/GUI/Plater.cpp:2913 +#: src/slic3r/GUI/Plater.cpp:2911 msgid "Hollowing done." msgstr "" -#: src/slic3r/GUI/Plater.cpp:2915 +#: src/slic3r/GUI/Plater.cpp:2913 msgid "Hollowing failed." msgstr "" -#: src/slic3r/GUI/Plater.cpp:2956 +#: src/slic3r/GUI/Plater.cpp:2954 msgid "" "The selected object can't be split because it contains more than one volume/" "material." msgstr "" -#: src/slic3r/GUI/Plater.cpp:2967 +#: src/slic3r/GUI/Plater.cpp:2965 msgid "Split to Objects" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3092 +#: src/slic3r/GUI/Plater.cpp:3090 msgid "Invalid data" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3101 +#: src/slic3r/GUI/Plater.cpp:3099 msgid "Ready to slice" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3139 src/slic3r/GUI/PrintHostDialogs.cpp:232 +#: src/slic3r/GUI/Plater.cpp:3137 src/slic3r/GUI/PrintHostDialogs.cpp:232 msgid "Cancelling" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3156 +#: src/slic3r/GUI/Plater.cpp:3154 msgid "Another export job is currently running." msgstr "" -#: src/slic3r/GUI/Plater.cpp:3274 +#: src/slic3r/GUI/Plater.cpp:3272 msgid "Please select the file to reload" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3309 +#: src/slic3r/GUI/Plater.cpp:3307 msgid "It is not allowed to change the file to reload" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3309 +#: src/slic3r/GUI/Plater.cpp:3307 msgid "Do you want to retry" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3330 +#: src/slic3r/GUI/Plater.cpp:3328 msgid "Reload from: " msgstr "" -#: src/slic3r/GUI/Plater.cpp:3438 +#: src/slic3r/GUI/Plater.cpp:3436 msgid "Unable to reload:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3443 +#: src/slic3r/GUI/Plater.cpp:3441 msgid "Error during reload" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3463 +#: src/slic3r/GUI/Plater.cpp:3461 msgid "Reload all from disk" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3484 +#: src/slic3r/GUI/Plater.cpp:3482 msgid "Fix Throught NetFabb" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3675 +#: src/slic3r/GUI/Plater.cpp:3673 msgid "Export failed" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3680 src/slic3r/GUI/PrintHostDialogs.cpp:233 +#: src/slic3r/GUI/Plater.cpp:3678 src/slic3r/GUI/PrintHostDialogs.cpp:233 msgid "Cancelled" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3942 src/slic3r/GUI/Plater.cpp:3969 +#: src/slic3r/GUI/Plater.cpp:3940 src/slic3r/GUI/Plater.cpp:3962 msgid "Remove the selected object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3956 +#: src/slic3r/GUI/Plater.cpp:3949 msgid "Add one more instance of the selected object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3958 +#: src/slic3r/GUI/Plater.cpp:3951 msgid "Remove one instance of the selected object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3960 +#: src/slic3r/GUI/Plater.cpp:3953 msgid "Set number of instances" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3960 +#: src/slic3r/GUI/Plater.cpp:3953 msgid "Change the number of instances of the selected object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3980 src/slic3r/GUI/Plater.cpp:3983 +#: src/slic3r/GUI/Plater.cpp:3972 msgid "Reload the selected object from disk" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3987 +#: src/slic3r/GUI/Plater.cpp:3975 msgid "Export the selected object as STL file" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4016 +#: src/slic3r/GUI/Plater.cpp:4004 msgid "Along X axis" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4016 +#: src/slic3r/GUI/Plater.cpp:4004 msgid "Mirror the selected object along the X axis" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4018 +#: src/slic3r/GUI/Plater.cpp:4006 msgid "Along Y axis" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4018 +#: src/slic3r/GUI/Plater.cpp:4006 msgid "Mirror the selected object along the Y axis" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4020 +#: src/slic3r/GUI/Plater.cpp:4008 msgid "Along Z axis" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4020 +#: src/slic3r/GUI/Plater.cpp:4008 msgid "Mirror the selected object along the Z axis" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4023 +#: src/slic3r/GUI/Plater.cpp:4011 msgid "Mirror" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4023 +#: src/slic3r/GUI/Plater.cpp:4011 msgid "Mirror the selected object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4035 +#: src/slic3r/GUI/Plater.cpp:4023 msgid "To objects" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4035 src/slic3r/GUI/Plater.cpp:4055 +#: src/slic3r/GUI/Plater.cpp:4023 src/slic3r/GUI/Plater.cpp:4043 msgid "Split the selected object into individual objects" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4037 +#: src/slic3r/GUI/Plater.cpp:4025 msgid "To parts" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4037 src/slic3r/GUI/Plater.cpp:4069 +#: src/slic3r/GUI/Plater.cpp:4025 src/slic3r/GUI/Plater.cpp:4057 msgid "Split the selected object into individual sub-parts" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4040 src/slic3r/GUI/Plater.cpp:4055 -#: src/slic3r/GUI/Plater.cpp:4069 src/libslic3r/PrintConfig.cpp:3466 +#: src/slic3r/GUI/Plater.cpp:4028 src/slic3r/GUI/Plater.cpp:4043 +#: src/slic3r/GUI/Plater.cpp:4057 src/libslic3r/PrintConfig.cpp:3456 msgid "Split" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4040 +#: src/slic3r/GUI/Plater.cpp:4028 msgid "Split the selected object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4061 +#: src/slic3r/GUI/Plater.cpp:4049 msgid "Optimize orientation" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4061 +#: src/slic3r/GUI/Plater.cpp:4049 msgid "Optimize the rotation of the object for better print results." msgstr "" -#: src/slic3r/GUI/Plater.cpp:4120 +#: src/slic3r/GUI/Plater.cpp:4108 msgid "3D editor view" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4128 src/slic3r/GUI/Tab.cpp:2372 +#: src/slic3r/GUI/Plater.cpp:4116 src/slic3r/GUI/Tab.cpp:2386 msgid "Preview" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4422 +#: src/slic3r/GUI/Plater.cpp:4413 msgid "" "%1% printer was active at the time the target Undo / Redo snapshot was " "taken. Switching to %1% printer requires reloading of %1% presets." msgstr "" -#: src/slic3r/GUI/Plater.cpp:4597 +#: src/slic3r/GUI/Plater.cpp:4588 msgid "Load Project" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4625 +#: src/slic3r/GUI/Plater.cpp:4616 msgid "Import Object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4629 +#: src/slic3r/GUI/Plater.cpp:4620 msgid "Import Objects" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4693 +#: src/slic3r/GUI/Plater.cpp:4684 msgid "All objects will be removed, continue?" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4701 +#: src/slic3r/GUI/Plater.cpp:4692 msgid "Delete Selected Objects" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4709 +#: src/slic3r/GUI/Plater.cpp:4700 msgid "Increase Instances" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4744 +#: src/slic3r/GUI/Plater.cpp:4735 msgid "Decrease Instances" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4780 +#: src/slic3r/GUI/Plater.cpp:4771 #, possible-c-format msgid "Set numbers of copies to %d" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4810 +#: src/slic3r/GUI/Plater.cpp:4801 msgid "Cut by Plane" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4863 +#: src/slic3r/GUI/Plater.cpp:4854 msgid "Save G-code file as:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4863 +#: src/slic3r/GUI/Plater.cpp:4854 msgid "Save SL1 file as:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4990 +#: src/slic3r/GUI/Plater.cpp:5001 #, possible-c-format msgid "STL file exported to %s" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5011 +#: src/slic3r/GUI/Plater.cpp:5022 #, possible-c-format msgid "AMF file exported to %s" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5014 +#: src/slic3r/GUI/Plater.cpp:5025 #, possible-c-format msgid "Error exporting AMF file %s" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5057 +#: src/slic3r/GUI/Plater.cpp:5068 #, possible-c-format msgid "3MF file exported to %s" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5062 +#: src/slic3r/GUI/Plater.cpp:5073 #, possible-c-format msgid "Error exporting 3MF file %s" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5544 +#: src/slic3r/GUI/Plater.cpp:5555 msgid "Export" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5545 +#: src/slic3r/GUI/Plater.cpp:5556 msgid "Send G-code" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5629 +#: src/slic3r/GUI/Plater.cpp:5640 msgid "Paste From Clipboard" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:22 src/slic3r/GUI/Tab.cpp:1780 -#: src/slic3r/GUI/Tab.cpp:2024 +#: src/slic3r/GUI/Preferences.cpp:22 src/slic3r/GUI/Tab.cpp:1794 +#: src/slic3r/GUI/Tab.cpp:2038 msgid "General" msgstr "" @@ -4597,34 +4585,34 @@ msgstr "" msgid "modified" msgstr "" -#: src/slic3r/GUI/Preset.cpp:1059 src/slic3r/GUI/Preset.cpp:1106 -#: src/slic3r/GUI/Preset.cpp:1182 src/slic3r/GUI/Preset.cpp:1216 +#: src/slic3r/GUI/Preset.cpp:1059 src/slic3r/GUI/Preset.cpp:1114 +#: src/slic3r/GUI/Preset.cpp:1192 src/slic3r/GUI/Preset.cpp:1234 #: src/slic3r/GUI/PresetBundle.cpp:1576 src/slic3r/GUI/PresetBundle.cpp:1665 msgid "System presets" msgstr "" -#: src/slic3r/GUI/Preset.cpp:1110 src/slic3r/GUI/Preset.cpp:1220 +#: src/slic3r/GUI/Preset.cpp:1118 src/slic3r/GUI/Preset.cpp:1238 #: src/slic3r/GUI/PresetBundle.cpp:1670 msgid "User presets" msgstr "" -#: src/slic3r/GUI/Preset.cpp:1141 src/slic3r/GUI/Tab.cpp:243 -msgid "Add a new printer" -msgstr "" - -#: src/slic3r/GUI/Preset.cpp:1143 +#: src/slic3r/GUI/Preset.cpp:1151 msgid "Add/Remove materials" msgstr "" -#: src/slic3r/GUI/Preset.cpp:1453 +#: src/slic3r/GUI/Preset.cpp:1153 +msgid "Add/Remove printers" +msgstr "" + +#: src/slic3r/GUI/Preset.cpp:1472 msgid "filament" msgstr "" -#: src/slic3r/GUI/Preset.cpp:1454 +#: src/slic3r/GUI/Preset.cpp:1473 msgid "SLA print" msgstr "" -#: src/slic3r/GUI/PresetBundle.cpp:1681 +#: src/slic3r/GUI/PresetBundle.cpp:1697 msgid "Add/Remove filaments" msgstr "" @@ -4845,12 +4833,12 @@ msgid "Time" msgstr "" #: src/slic3r/GUI/RammingChart.cpp:76 src/slic3r/GUI/WipeTowerDialog.cpp:83 -#: src/libslic3r/PrintConfig.cpp:645 src/libslic3r/PrintConfig.cpp:689 -#: src/libslic3r/PrintConfig.cpp:704 src/libslic3r/PrintConfig.cpp:2418 -#: src/libslic3r/PrintConfig.cpp:2427 src/libslic3r/PrintConfig.cpp:2528 -#: src/libslic3r/PrintConfig.cpp:2536 src/libslic3r/PrintConfig.cpp:2544 -#: src/libslic3r/PrintConfig.cpp:2551 src/libslic3r/PrintConfig.cpp:2559 -#: src/libslic3r/PrintConfig.cpp:2567 +#: src/libslic3r/PrintConfig.cpp:644 src/libslic3r/PrintConfig.cpp:688 +#: src/libslic3r/PrintConfig.cpp:703 src/libslic3r/PrintConfig.cpp:2408 +#: src/libslic3r/PrintConfig.cpp:2417 src/libslic3r/PrintConfig.cpp:2518 +#: src/libslic3r/PrintConfig.cpp:2526 src/libslic3r/PrintConfig.cpp:2534 +#: src/libslic3r/PrintConfig.cpp:2541 src/libslic3r/PrintConfig.cpp:2549 +#: src/libslic3r/PrintConfig.cpp:2557 msgid "s" msgstr "" @@ -4858,8 +4846,8 @@ msgstr "" msgid "Volumetric speed" msgstr "" -#: src/slic3r/GUI/RammingChart.cpp:81 src/libslic3r/PrintConfig.cpp:602 -#: src/libslic3r/PrintConfig.cpp:1259 +#: src/slic3r/GUI/RammingChart.cpp:81 src/libslic3r/PrintConfig.cpp:601 +#: src/libslic3r/PrintConfig.cpp:1250 msgid "mm³/s" msgstr "" @@ -4947,293 +4935,297 @@ msgid "" "or click this button." msgstr "" -#: src/slic3r/GUI/Tab.cpp:943 +#: src/slic3r/GUI/Tab.cpp:243 +msgid "Add a new printer" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:955 msgid "This is a default preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:945 +#: src/slic3r/GUI/Tab.cpp:957 msgid "This is a system preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:947 +#: src/slic3r/GUI/Tab.cpp:959 msgid "Current preset is inherited from the default preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:950 +#: src/slic3r/GUI/Tab.cpp:962 #, possible-c-format msgid "" "Current preset is inherited from:\n" "\t%s" msgstr "" -#: src/slic3r/GUI/Tab.cpp:954 +#: src/slic3r/GUI/Tab.cpp:966 msgid "It can't be deleted or modified." msgstr "" -#: src/slic3r/GUI/Tab.cpp:955 +#: src/slic3r/GUI/Tab.cpp:967 msgid "" "Any modifications should be saved as a new preset inherited from this one." msgstr "" -#: src/slic3r/GUI/Tab.cpp:956 +#: src/slic3r/GUI/Tab.cpp:968 msgid "To do that please specify a new name for the preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:960 +#: src/slic3r/GUI/Tab.cpp:972 msgid "Additional information:" msgstr "" -#: src/slic3r/GUI/Tab.cpp:966 +#: src/slic3r/GUI/Tab.cpp:978 msgid "printer model" msgstr "" -#: src/slic3r/GUI/Tab.cpp:974 +#: src/slic3r/GUI/Tab.cpp:986 msgid "default print profile" msgstr "" -#: src/slic3r/GUI/Tab.cpp:977 +#: src/slic3r/GUI/Tab.cpp:989 msgid "default filament profile" msgstr "" -#: src/slic3r/GUI/Tab.cpp:991 +#: src/slic3r/GUI/Tab.cpp:1003 msgid "default SLA material profile" msgstr "" -#: src/slic3r/GUI/Tab.cpp:995 +#: src/slic3r/GUI/Tab.cpp:1007 msgid "default SLA print profile" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1003 +#: src/slic3r/GUI/Tab.cpp:1015 msgid "full profile name" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1004 +#: src/slic3r/GUI/Tab.cpp:1016 msgid "symbolic profile name" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1038 src/slic3r/GUI/Tab.cpp:3570 +#: src/slic3r/GUI/Tab.cpp:1050 src/slic3r/GUI/Tab.cpp:3583 msgid "Layers and perimeters" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1043 +#: src/slic3r/GUI/Tab.cpp:1055 msgid "Vertical shells" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1054 +#: src/slic3r/GUI/Tab.cpp:1066 msgid "Horizontal shells" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1055 src/libslic3r/PrintConfig.cpp:1790 +#: src/slic3r/GUI/Tab.cpp:1067 src/libslic3r/PrintConfig.cpp:1780 msgid "Solid layers" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1059 +#: src/slic3r/GUI/Tab.cpp:1071 msgid "Minimum shell thickness" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1070 +#: src/slic3r/GUI/Tab.cpp:1082 msgid "Quality (slower slicing)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1088 +#: src/slic3r/GUI/Tab.cpp:1100 msgid "Reducing printing time" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1100 +#: src/slic3r/GUI/Tab.cpp:1112 msgid "Skirt and brim" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1117 +#: src/slic3r/GUI/Tab.cpp:1129 msgid "Raft" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1121 +#: src/slic3r/GUI/Tab.cpp:1133 msgid "Options for support material and raft" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1136 +#: src/slic3r/GUI/Tab.cpp:1148 msgid "Speed for print moves" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1148 +#: src/slic3r/GUI/Tab.cpp:1160 msgid "Speed for non-print moves" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1151 +#: src/slic3r/GUI/Tab.cpp:1163 msgid "Modifiers" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1154 +#: src/slic3r/GUI/Tab.cpp:1166 msgid "Acceleration control (advanced)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1161 +#: src/slic3r/GUI/Tab.cpp:1173 msgid "Autospeed (advanced)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1169 +#: src/slic3r/GUI/Tab.cpp:1181 msgid "Multiple Extruders" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1177 +#: src/slic3r/GUI/Tab.cpp:1189 msgid "Ooze prevention" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1195 +#: src/slic3r/GUI/Tab.cpp:1207 msgid "Extrusion width" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1205 +#: src/slic3r/GUI/Tab.cpp:1217 msgid "Overlap" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1208 +#: src/slic3r/GUI/Tab.cpp:1220 msgid "Flow" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1217 +#: src/slic3r/GUI/Tab.cpp:1229 msgid "Other" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1220 src/slic3r/GUI/Tab.cpp:3637 +#: src/slic3r/GUI/Tab.cpp:1232 src/slic3r/GUI/Tab.cpp:3650 msgid "Output options" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1221 +#: src/slic3r/GUI/Tab.cpp:1233 msgid "Sequential printing" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1223 +#: src/slic3r/GUI/Tab.cpp:1235 msgid "Extruder clearance (mm)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1232 src/slic3r/GUI/Tab.cpp:3638 +#: src/slic3r/GUI/Tab.cpp:1240 src/slic3r/GUI/Tab.cpp:3651 msgid "Output file" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1239 src/libslic3r/PrintConfig.cpp:1462 +#: src/slic3r/GUI/Tab.cpp:1247 src/libslic3r/PrintConfig.cpp:1453 msgid "Post-processing scripts" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1245 src/slic3r/GUI/Tab.cpp:1246 -#: src/slic3r/GUI/Tab.cpp:1531 src/slic3r/GUI/Tab.cpp:1532 -#: src/slic3r/GUI/Tab.cpp:1996 src/slic3r/GUI/Tab.cpp:1997 -#: src/slic3r/GUI/Tab.cpp:2110 src/slic3r/GUI/Tab.cpp:2111 -#: src/slic3r/GUI/Tab.cpp:3507 src/slic3r/GUI/Tab.cpp:3508 +#: src/slic3r/GUI/Tab.cpp:1253 src/slic3r/GUI/Tab.cpp:1254 +#: src/slic3r/GUI/Tab.cpp:1542 src/slic3r/GUI/Tab.cpp:1543 +#: src/slic3r/GUI/Tab.cpp:2010 src/slic3r/GUI/Tab.cpp:2011 +#: src/slic3r/GUI/Tab.cpp:2124 src/slic3r/GUI/Tab.cpp:2125 +#: src/slic3r/GUI/Tab.cpp:3520 src/slic3r/GUI/Tab.cpp:3521 msgid "Notes" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1252 src/slic3r/GUI/Tab.cpp:1539 -#: src/slic3r/GUI/Tab.cpp:2003 src/slic3r/GUI/Tab.cpp:2117 -#: src/slic3r/GUI/Tab.cpp:3515 src/slic3r/GUI/Tab.cpp:3643 +#: src/slic3r/GUI/Tab.cpp:1260 src/slic3r/GUI/Tab.cpp:1550 +#: src/slic3r/GUI/Tab.cpp:2017 src/slic3r/GUI/Tab.cpp:2131 +#: src/slic3r/GUI/Tab.cpp:3528 src/slic3r/GUI/Tab.cpp:3656 msgid "Dependencies" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1253 src/slic3r/GUI/Tab.cpp:1540 -#: src/slic3r/GUI/Tab.cpp:2004 src/slic3r/GUI/Tab.cpp:2118 -#: src/slic3r/GUI/Tab.cpp:3516 src/slic3r/GUI/Tab.cpp:3644 +#: src/slic3r/GUI/Tab.cpp:1261 src/slic3r/GUI/Tab.cpp:1551 +#: src/slic3r/GUI/Tab.cpp:2018 src/slic3r/GUI/Tab.cpp:2132 +#: src/slic3r/GUI/Tab.cpp:3529 src/slic3r/GUI/Tab.cpp:3657 msgid "Profile dependencies" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1317 src/slic3r/GUI/Tab.cpp:1372 +#: src/slic3r/GUI/Tab.cpp:1325 src/slic3r/GUI/Tab.cpp:1380 msgid "Filament Overrides" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1318 src/slic3r/GUI/Tab.cpp:1377 -#: src/slic3r/GUI/Tab.cpp:2352 +#: src/slic3r/GUI/Tab.cpp:1326 src/slic3r/GUI/Tab.cpp:1385 +#: src/slic3r/GUI/Tab.cpp:2366 msgid "Retraction" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1427 src/libslic3r/PrintConfig.cpp:2077 +#: src/slic3r/GUI/Tab.cpp:1435 src/libslic3r/PrintConfig.cpp:2067 msgid "Temperature" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1433 +#: src/slic3r/GUI/Tab.cpp:1441 msgid "Bed" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1438 +#: src/slic3r/GUI/Tab.cpp:1446 msgid "Cooling" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1439 src/libslic3r/PrintConfig.cpp:1364 -#: src/libslic3r/PrintConfig.cpp:2210 +#: src/slic3r/GUI/Tab.cpp:1447 src/libslic3r/PrintConfig.cpp:1355 +#: src/libslic3r/PrintConfig.cpp:2200 msgid "Enable" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1450 +#: src/slic3r/GUI/Tab.cpp:1458 msgid "Fan settings" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1459 +#: src/slic3r/GUI/Tab.cpp:1467 msgid "Cooling thresholds" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1465 +#: src/slic3r/GUI/Tab.cpp:1473 msgid "Filament properties" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1469 +#: src/slic3r/GUI/Tab.cpp:1480 msgid "Print speed override" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1479 +#: src/slic3r/GUI/Tab.cpp:1490 msgid "Wipe tower parameters" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1482 +#: src/slic3r/GUI/Tab.cpp:1493 msgid "Toolchange parameters with single extruder MM printers" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1496 +#: src/slic3r/GUI/Tab.cpp:1507 msgid "Ramming settings" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1518 src/slic3r/GUI/Tab.cpp:1959 +#: src/slic3r/GUI/Tab.cpp:1529 src/slic3r/GUI/Tab.cpp:1973 msgid "Custom G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1519 src/slic3r/GUI/Tab.cpp:1960 -#: src/libslic3r/PrintConfig.cpp:1823 src/libslic3r/PrintConfig.cpp:1838 +#: src/slic3r/GUI/Tab.cpp:1530 src/slic3r/GUI/Tab.cpp:1974 +#: src/libslic3r/PrintConfig.cpp:1813 src/libslic3r/PrintConfig.cpp:1828 msgid "Start G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1525 src/slic3r/GUI/Tab.cpp:1966 +#: src/slic3r/GUI/Tab.cpp:1536 src/slic3r/GUI/Tab.cpp:1980 #: src/libslic3r/PrintConfig.cpp:385 src/libslic3r/PrintConfig.cpp:395 msgid "End G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1582 +#: src/slic3r/GUI/Tab.cpp:1593 msgid "Volumetric flow hints not available" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1668 src/slic3r/GUI/Tab.cpp:1899 +#: src/slic3r/GUI/Tab.cpp:1679 src/slic3r/GUI/Tab.cpp:1913 msgid "Test" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1678 +#: src/slic3r/GUI/Tab.cpp:1689 msgid "Could not get a valid Printer Host reference" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1684 src/slic3r/GUI/Tab.cpp:1912 +#: src/slic3r/GUI/Tab.cpp:1695 src/slic3r/GUI/Tab.cpp:1926 msgid "Success!" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1699 +#: src/slic3r/GUI/Tab.cpp:1713 msgid "" "HTTPS CA file is optional. It is only needed if you use HTTPS with a self-" "signed certificate." msgstr "" -#: src/slic3r/GUI/Tab.cpp:1712 +#: src/slic3r/GUI/Tab.cpp:1726 msgid "Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1713 +#: src/slic3r/GUI/Tab.cpp:1727 msgid "Open CA certificate file" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1741 +#: src/slic3r/GUI/Tab.cpp:1755 #, possible-c-format msgid "" "HTTPS CA File:\n" @@ -5243,24 +5235,24 @@ msgid "" "Store / Keychain." msgstr "" -#: src/slic3r/GUI/Tab.cpp:1781 src/slic3r/GUI/Tab.cpp:2025 +#: src/slic3r/GUI/Tab.cpp:1795 src/slic3r/GUI/Tab.cpp:2039 msgid "Size and coordinates" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1786 src/slic3r/GUI/Tab.cpp:2030 -#: src/slic3r/GUI/Tab.cpp:3146 +#: src/slic3r/GUI/Tab.cpp:1800 src/slic3r/GUI/Tab.cpp:2044 +#: src/slic3r/GUI/Tab.cpp:3160 msgid "Set" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1818 +#: src/slic3r/GUI/Tab.cpp:1832 msgid "Capabilities" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1823 +#: src/slic3r/GUI/Tab.cpp:1837 msgid "Number of extruders of the printer." msgstr "" -#: src/slic3r/GUI/Tab.cpp:1851 +#: src/slic3r/GUI/Tab.cpp:1865 msgid "" "Single Extruder Multi Material is selected, \n" "and all extruders must have the same diameter.\n" @@ -5268,248 +5260,248 @@ msgid "" "nozzle diameter value?" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1854 src/slic3r/GUI/Tab.cpp:2322 -#: src/libslic3r/PrintConfig.cpp:1335 +#: src/slic3r/GUI/Tab.cpp:1868 src/slic3r/GUI/Tab.cpp:2336 +#: src/libslic3r/PrintConfig.cpp:1326 msgid "Nozzle diameter" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1884 +#: src/slic3r/GUI/Tab.cpp:1898 msgid "USB/Serial connection" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1885 src/libslic3r/PrintConfig.cpp:1670 +#: src/slic3r/GUI/Tab.cpp:1899 src/libslic3r/PrintConfig.cpp:1661 msgid "Serial port" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1890 +#: src/slic3r/GUI/Tab.cpp:1904 msgid "Rescan serial ports" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1912 +#: src/slic3r/GUI/Tab.cpp:1926 msgid "Connection to printer works correctly." msgstr "" -#: src/slic3r/GUI/Tab.cpp:1915 +#: src/slic3r/GUI/Tab.cpp:1929 msgid "Connection failed." msgstr "" -#: src/slic3r/GUI/Tab.cpp:1928 src/slic3r/GUI/Tab.cpp:2105 +#: src/slic3r/GUI/Tab.cpp:1942 src/slic3r/GUI/Tab.cpp:2119 msgid "Print Host upload" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1972 src/libslic3r/PrintConfig.cpp:143 +#: src/slic3r/GUI/Tab.cpp:1986 src/libslic3r/PrintConfig.cpp:143 msgid "Before layer change G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1978 src/libslic3r/PrintConfig.cpp:1081 +#: src/slic3r/GUI/Tab.cpp:1992 src/libslic3r/PrintConfig.cpp:1080 msgid "After layer change G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1984 src/libslic3r/PrintConfig.cpp:2103 +#: src/slic3r/GUI/Tab.cpp:1998 src/libslic3r/PrintConfig.cpp:2093 msgid "Tool change G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1990 +#: src/slic3r/GUI/Tab.cpp:2004 msgid "Between objects G-code (for sequential printing)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2062 +#: src/slic3r/GUI/Tab.cpp:2076 msgid "Display" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2077 +#: src/slic3r/GUI/Tab.cpp:2091 msgid "Tilt" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2078 +#: src/slic3r/GUI/Tab.cpp:2092 msgid "Tilt time" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2084 src/slic3r/GUI/Tab.cpp:3489 +#: src/slic3r/GUI/Tab.cpp:2098 src/slic3r/GUI/Tab.cpp:3503 msgid "Corrections" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2099 src/slic3r/GUI/Tab.cpp:3485 +#: src/slic3r/GUI/Tab.cpp:2113 src/slic3r/GUI/Tab.cpp:3499 msgid "Exposure" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2170 src/slic3r/GUI/Tab.cpp:2255 -#: src/libslic3r/PrintConfig.cpp:1131 src/libslic3r/PrintConfig.cpp:1149 -#: src/libslic3r/PrintConfig.cpp:1167 src/libslic3r/PrintConfig.cpp:1184 -#: src/libslic3r/PrintConfig.cpp:1195 src/libslic3r/PrintConfig.cpp:1206 -#: src/libslic3r/PrintConfig.cpp:1217 +#: src/slic3r/GUI/Tab.cpp:2184 src/slic3r/GUI/Tab.cpp:2269 +#: src/libslic3r/PrintConfig.cpp:1129 src/libslic3r/PrintConfig.cpp:1146 +#: src/libslic3r/PrintConfig.cpp:1163 src/libslic3r/PrintConfig.cpp:1179 +#: src/libslic3r/PrintConfig.cpp:1189 src/libslic3r/PrintConfig.cpp:1199 +#: src/libslic3r/PrintConfig.cpp:1209 msgid "Machine limits" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2184 +#: src/slic3r/GUI/Tab.cpp:2198 msgid "Values in this column are for Normal mode" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2185 +#: src/slic3r/GUI/Tab.cpp:2199 msgid "Normal" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2190 +#: src/slic3r/GUI/Tab.cpp:2204 msgid "Values in this column are for Stealth mode" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2191 +#: src/slic3r/GUI/Tab.cpp:2205 msgid "Stealth" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2199 +#: src/slic3r/GUI/Tab.cpp:2213 msgid "Maximum feedrates" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2204 +#: src/slic3r/GUI/Tab.cpp:2218 msgid "Maximum accelerations" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2211 +#: src/slic3r/GUI/Tab.cpp:2225 msgid "Jerk limits" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2216 +#: src/slic3r/GUI/Tab.cpp:2230 msgid "Minimum feedrates" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2280 src/slic3r/GUI/Tab.cpp:2288 +#: src/slic3r/GUI/Tab.cpp:2294 src/slic3r/GUI/Tab.cpp:2302 msgid "Single extruder MM setup" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2289 +#: src/slic3r/GUI/Tab.cpp:2303 msgid "Single extruder multimaterial parameters" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2320 +#: src/slic3r/GUI/Tab.cpp:2334 msgid "" "This is a single extruder multimaterial printer, diameters of all extruders " "will be set to the new value. Do you want to proceed?" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2344 +#: src/slic3r/GUI/Tab.cpp:2358 msgid "Layer height limits" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2349 +#: src/slic3r/GUI/Tab.cpp:2363 msgid "Position (for multi-extruder printers)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2355 +#: src/slic3r/GUI/Tab.cpp:2369 msgid "Only lift Z" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2368 +#: src/slic3r/GUI/Tab.cpp:2382 msgid "" "Retraction when tool is disabled (advanced settings for multi-extruder " "setups)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2376 +#: src/slic3r/GUI/Tab.cpp:2390 msgid "Reset to Filament Color" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2557 +#: src/slic3r/GUI/Tab.cpp:2571 msgid "" "The Wipe option is not available when using the Firmware Retraction mode.\n" "\n" "Shall I disable it in order to enable Firmware Retraction?" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2559 +#: src/slic3r/GUI/Tab.cpp:2573 msgid "Firmware Retraction" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2889 +#: src/slic3r/GUI/Tab.cpp:2903 #, possible-c-format msgid "Default preset (%s)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2890 +#: src/slic3r/GUI/Tab.cpp:2904 #, possible-c-format msgid "Preset (%s)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2907 +#: src/slic3r/GUI/Tab.cpp:2921 msgid "has the following unsaved changes:" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2910 +#: src/slic3r/GUI/Tab.cpp:2924 msgid "is not compatible with printer" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2911 +#: src/slic3r/GUI/Tab.cpp:2925 msgid "is not compatible with print profile" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2913 +#: src/slic3r/GUI/Tab.cpp:2927 msgid "and it has the following unsaved changes:" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2917 +#: src/slic3r/GUI/Tab.cpp:2931 msgid "Unsaved Changes" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3015 +#: src/slic3r/GUI/Tab.cpp:3029 msgctxt "PresetName" msgid "%1% - Copy" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3038 +#: src/slic3r/GUI/Tab.cpp:3052 msgid "The supplied name is empty. It can't be saved." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3043 +#: src/slic3r/GUI/Tab.cpp:3057 msgid "Cannot overwrite a system profile." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3047 +#: src/slic3r/GUI/Tab.cpp:3061 msgid "Cannot overwrite an external profile." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3052 +#: src/slic3r/GUI/Tab.cpp:3066 msgid "Preset with name \"%1%\" already exists." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3053 +#: src/slic3r/GUI/Tab.cpp:3067 msgid "Replace?" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3091 +#: src/slic3r/GUI/Tab.cpp:3105 msgid "remove" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3091 +#: src/slic3r/GUI/Tab.cpp:3105 msgid "delete" msgstr "" #. TRN remove/delete -#: src/slic3r/GUI/Tab.cpp:3093 +#: src/slic3r/GUI/Tab.cpp:3107 msgid "Are you sure you want to %1% the selected preset?" msgstr "" #. TRN Remove/Delete -#: src/slic3r/GUI/Tab.cpp:3096 +#: src/slic3r/GUI/Tab.cpp:3110 msgid "%1% Preset" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3222 +#: src/slic3r/GUI/Tab.cpp:3236 msgid "LOCKED LOCK" msgstr "" #. TRN Description for "LOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:3224 +#: src/slic3r/GUI/Tab.cpp:3238 msgid "" "indicates that the settings are the same as the system (or default) values " "for the current option group" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3226 +#: src/slic3r/GUI/Tab.cpp:3240 msgid "UNLOCKED LOCK" msgstr "" #. TRN Description for "UNLOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:3228 +#: src/slic3r/GUI/Tab.cpp:3242 msgid "" "indicates that some settings were changed and are not equal to the system " "(or default) values for the current option group.\n" @@ -5517,23 +5509,23 @@ msgid "" "to the system (or default) values." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3233 +#: src/slic3r/GUI/Tab.cpp:3247 msgid "WHITE BULLET" msgstr "" #. TRN Description for "WHITE BULLET" -#: src/slic3r/GUI/Tab.cpp:3235 +#: src/slic3r/GUI/Tab.cpp:3249 msgid "" "for the left button: \tindicates a non-system (or non-default) preset,\n" "for the right button: \tindicates that the settings hasn't been modified." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3238 +#: src/slic3r/GUI/Tab.cpp:3252 msgid "BACK ARROW" msgstr "" #. TRN Description for "BACK ARROW" -#: src/slic3r/GUI/Tab.cpp:3240 +#: src/slic3r/GUI/Tab.cpp:3254 msgid "" "indicates that the settings were changed and are not equal to the last saved " "preset for the current option group.\n" @@ -5541,13 +5533,13 @@ msgid "" "to the last saved preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3250 +#: src/slic3r/GUI/Tab.cpp:3264 msgid "" "LOCKED LOCK icon indicates that the settings are the same as the system (or " "default) values for the current option group" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3252 +#: src/slic3r/GUI/Tab.cpp:3266 msgid "" "UNLOCKED LOCK icon indicates that some settings were changed and are not " "equal to the system (or default) values for the current option group.\n" @@ -5555,17 +5547,17 @@ msgid "" "default) values." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3255 +#: src/slic3r/GUI/Tab.cpp:3269 msgid "WHITE BULLET icon indicates a non system (or non default) preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3258 +#: src/slic3r/GUI/Tab.cpp:3272 msgid "" "WHITE BULLET icon indicates that the settings are the same as in the last " "saved preset for the current option group." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3260 +#: src/slic3r/GUI/Tab.cpp:3274 msgid "" "BACK ARROW icon indicates that the settings were changed and are not equal " "to the last saved preset for the current option group.\n" @@ -5573,26 +5565,26 @@ msgid "" "preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3266 +#: src/slic3r/GUI/Tab.cpp:3280 msgid "" "LOCKED LOCK icon indicates that the value is the same as the system (or " "default) value." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3267 +#: src/slic3r/GUI/Tab.cpp:3281 msgid "" "UNLOCKED LOCK icon indicates that the value was changed and is not equal to " "the system (or default) value.\n" "Click to reset current value to the system (or default) value." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3273 +#: src/slic3r/GUI/Tab.cpp:3287 msgid "" "WHITE BULLET icon indicates that the value is the same as in the last saved " "preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3274 +#: src/slic3r/GUI/Tab.cpp:3288 msgid "" "BACK ARROW icon indicates that the value was changed and is not equal to the " "last saved preset.\n" @@ -5600,40 +5592,40 @@ msgid "" msgstr "" #. TRN Preset -#: src/slic3r/GUI/Tab.cpp:3387 +#: src/slic3r/GUI/Tab.cpp:3401 #, possible-c-format msgid "Save %s as:" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3431 +#: src/slic3r/GUI/Tab.cpp:3445 msgid "the following suffix is not allowed:" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3435 +#: src/slic3r/GUI/Tab.cpp:3449 msgid "The supplied name is not available." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3448 src/slic3r/GUI/Tab.cpp:3450 +#: src/slic3r/GUI/Tab.cpp:3462 src/slic3r/GUI/Tab.cpp:3464 msgid "Material" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3580 +#: src/slic3r/GUI/Tab.cpp:3593 msgid "Support head" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3585 +#: src/slic3r/GUI/Tab.cpp:3598 msgid "Support pillar" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3599 +#: src/slic3r/GUI/Tab.cpp:3612 msgid "Connection of the support sticks and junctions" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3604 +#: src/slic3r/GUI/Tab.cpp:3617 msgid "Automatic generation" msgstr "" -#: src/slic3r/GUI/Tab.hpp:327 src/slic3r/GUI/Tab.hpp:429 +#: src/slic3r/GUI/Tab.hpp:327 src/slic3r/GUI/Tab.hpp:430 msgid "Print Settings" msgstr "" @@ -5645,11 +5637,11 @@ msgstr "" msgid "Printer Settings" msgstr "" -#: src/slic3r/GUI/Tab.hpp:414 +#: src/slic3r/GUI/Tab.hpp:415 msgid "Material Settings" msgstr "" -#: src/slic3r/GUI/Tab.hpp:441 +#: src/slic3r/GUI/Tab.hpp:442 msgid "Save preset" msgstr "" @@ -5887,12 +5879,12 @@ msgstr "" msgid "Show advanced settings" msgstr "" -#: src/slic3r/GUI/wxExtensions.cpp:680 +#: src/slic3r/GUI/wxExtensions.cpp:703 #, possible-c-format msgid "Switch to the %s mode" msgstr "" -#: src/slic3r/GUI/wxExtensions.cpp:681 +#: src/slic3r/GUI/wxExtensions.cpp:704 #, possible-c-format msgid "Current mode is %s" msgstr "" @@ -6238,110 +6230,110 @@ msgid "" "compatible." msgstr "" -#: src/libslic3r/Print.cpp:1158 +#: src/libslic3r/Print.cpp:1215 msgid "All objects are outside of the print volume." msgstr "" -#: src/libslic3r/Print.cpp:1161 +#: src/libslic3r/Print.cpp:1218 msgid "The supplied settings will cause an empty print." msgstr "" -#: src/libslic3r/Print.cpp:1188 +#: src/libslic3r/Print.cpp:1222 msgid "Some objects are too close; your extruder will collide with them." msgstr "" -#: src/libslic3r/Print.cpp:1203 +#: src/libslic3r/Print.cpp:1224 msgid "" "Some objects are too tall and cannot be printed without extruder collisions." msgstr "" -#: src/libslic3r/Print.cpp:1213 +#: src/libslic3r/Print.cpp:1233 msgid "The Spiral Vase option can only be used when printing a single object." msgstr "" -#: src/libslic3r/Print.cpp:1220 +#: src/libslic3r/Print.cpp:1240 msgid "" "The Spiral Vase option can only be used when printing single material " "objects." msgstr "" -#: src/libslic3r/Print.cpp:1233 +#: src/libslic3r/Print.cpp:1253 msgid "" "The wipe tower is only supported if all extruders have the same nozzle " "diameter and use filaments of the same diameter." msgstr "" -#: src/libslic3r/Print.cpp:1238 +#: src/libslic3r/Print.cpp:1258 msgid "" "The Wipe Tower is currently only supported for the Marlin, RepRap/Sprinter " "and Repetier G-code flavors." msgstr "" -#: src/libslic3r/Print.cpp:1240 +#: src/libslic3r/Print.cpp:1260 msgid "" "The Wipe Tower is currently only supported with the relative extruder " "addressing (use_relative_e_distances=1)." msgstr "" -#: src/libslic3r/Print.cpp:1242 +#: src/libslic3r/Print.cpp:1262 msgid "Ooze prevention is currently not supported with the wipe tower enabled." msgstr "" -#: src/libslic3r/Print.cpp:1244 +#: src/libslic3r/Print.cpp:1264 msgid "" "The Wipe Tower currently does not support volumetric E (use_volumetric_e=0)." msgstr "" -#: src/libslic3r/Print.cpp:1246 +#: src/libslic3r/Print.cpp:1266 msgid "" "The Wipe Tower is currently not supported for multimaterial sequential " "prints." msgstr "" -#: src/libslic3r/Print.cpp:1267 +#: src/libslic3r/Print.cpp:1287 msgid "" "The Wipe Tower is only supported for multiple objects if they have equal " "layer heights" msgstr "" -#: src/libslic3r/Print.cpp:1269 +#: src/libslic3r/Print.cpp:1289 msgid "" "The Wipe Tower is only supported for multiple objects if they are printed " "over an equal number of raft layers" msgstr "" -#: src/libslic3r/Print.cpp:1271 +#: src/libslic3r/Print.cpp:1291 msgid "" "The Wipe Tower is only supported for multiple objects if they are printed " "with the same support_material_contact_distance" msgstr "" -#: src/libslic3r/Print.cpp:1273 +#: src/libslic3r/Print.cpp:1293 msgid "" "The Wipe Tower is only supported for multiple objects if they are sliced " "equally." msgstr "" -#: src/libslic3r/Print.cpp:1315 +#: src/libslic3r/Print.cpp:1335 msgid "" "The Wipe tower is only supported if all objects have the same variable layer " "height" msgstr "" -#: src/libslic3r/Print.cpp:1341 +#: src/libslic3r/Print.cpp:1361 msgid "" "One or more object were assigned an extruder that the printer does not have." msgstr "" -#: src/libslic3r/Print.cpp:1350 +#: src/libslic3r/Print.cpp:1370 msgid "%1%=%2% mm is too low to be printable at a layer height %3% mm" msgstr "" -#: src/libslic3r/Print.cpp:1353 +#: src/libslic3r/Print.cpp:1373 msgid "Excessive %1%=%2% mm to be printable with a nozzle diameter %3% mm" msgstr "" -#: src/libslic3r/Print.cpp:1364 +#: src/libslic3r/Print.cpp:1384 msgid "" "Printing with multiple extruders of differing nozzle diameters. If support " "is to be printed with the current extruder (support_material_extruder == 0 " @@ -6349,13 +6341,13 @@ msgid "" "same diameter." msgstr "" -#: src/libslic3r/Print.cpp:1372 +#: src/libslic3r/Print.cpp:1392 msgid "" "For the Wipe Tower to work with the soluble supports, the support layers " "need to be synchronized with the object layers." msgstr "" -#: src/libslic3r/Print.cpp:1376 +#: src/libslic3r/Print.cpp:1396 msgid "" "The Wipe Tower currently supports the non-soluble supports only if they are " "printed with the current extruder without triggering a tool change. (both " @@ -6363,31 +6355,31 @@ msgid "" "set to 0)." msgstr "" -#: src/libslic3r/Print.cpp:1398 +#: src/libslic3r/Print.cpp:1418 msgid "First layer height can't be greater than nozzle diameter" msgstr "" -#: src/libslic3r/Print.cpp:1403 +#: src/libslic3r/Print.cpp:1423 msgid "Layer height can't be greater than nozzle diameter" msgstr "" -#: src/libslic3r/Print.cpp:1557 +#: src/libslic3r/Print.cpp:1580 msgid "Infilling layers" msgstr "" -#: src/libslic3r/Print.cpp:1577 +#: src/libslic3r/Print.cpp:1602 msgid "Generating skirt" msgstr "" -#: src/libslic3r/Print.cpp:1585 +#: src/libslic3r/Print.cpp:1610 msgid "Generating brim" msgstr "" -#: src/libslic3r/Print.cpp:1609 +#: src/libslic3r/Print.cpp:1634 msgid "Exporting G-code" msgstr "" -#: src/libslic3r/Print.cpp:1613 +#: src/libslic3r/Print.cpp:1638 msgid "Generating G-code" msgstr "" @@ -6434,7 +6426,7 @@ msgstr "" msgid "Slicing model" msgstr "" -#: src/libslic3r/SLAPrintSteps.cpp:44 src/libslic3r/SLAPrintSteps.cpp:308 +#: src/libslic3r/SLAPrintSteps.cpp:44 src/libslic3r/SLAPrintSteps.cpp:325 msgid "Generating support points" msgstr "" @@ -6459,26 +6451,30 @@ msgid "Rasterizing layers" msgstr "" #: src/libslic3r/SLAPrintSteps.cpp:154 +msgid "Too much overlapping holes." +msgstr "" + +#: src/libslic3r/SLAPrintSteps.cpp:163 msgid "" "Drilling holes into the mesh failed. This is usually caused by broken model. " "Try to fix it first." msgstr "" -#: src/libslic3r/SLAPrintSteps.cpp:202 +#: src/libslic3r/SLAPrintSteps.cpp:209 msgid "" "Slicing had to be stopped due to an internal error: Inconsistent slice index." msgstr "" -#: src/libslic3r/SLAPrintSteps.cpp:365 src/libslic3r/SLAPrintSteps.cpp:374 -#: src/libslic3r/SLAPrintSteps.cpp:413 +#: src/libslic3r/SLAPrintSteps.cpp:382 src/libslic3r/SLAPrintSteps.cpp:391 +#: src/libslic3r/SLAPrintSteps.cpp:430 msgid "Visualizing supports" msgstr "" -#: src/libslic3r/SLAPrintSteps.cpp:405 +#: src/libslic3r/SLAPrintSteps.cpp:422 msgid "No pad can be generated for this model with the current configuration" msgstr "" -#: src/libslic3r/SLAPrintSteps.cpp:579 +#: src/libslic3r/SLAPrintSteps.cpp:596 msgid "" "There are unprintable objects. Try to adjust support settings to make the " "objects printable." @@ -6577,7 +6573,7 @@ msgid "" "feature slows down both the print and the G-code generation." msgstr "" -#: src/libslic3r/PrintConfig.cpp:134 src/libslic3r/PrintConfig.cpp:2074 +#: src/libslic3r/PrintConfig.cpp:134 src/libslic3r/PrintConfig.cpp:2064 msgid "Other layers" msgstr "" @@ -6641,9 +6637,9 @@ msgid "" msgstr "" #: src/libslic3r/PrintConfig.cpp:186 src/libslic3r/PrintConfig.cpp:329 -#: src/libslic3r/PrintConfig.cpp:863 src/libslic3r/PrintConfig.cpp:985 -#: src/libslic3r/PrintConfig.cpp:1155 src/libslic3r/PrintConfig.cpp:1208 -#: src/libslic3r/PrintConfig.cpp:1219 src/libslic3r/PrintConfig.cpp:1412 +#: src/libslic3r/PrintConfig.cpp:862 src/libslic3r/PrintConfig.cpp:984 +#: src/libslic3r/PrintConfig.cpp:1152 src/libslic3r/PrintConfig.cpp:1201 +#: src/libslic3r/PrintConfig.cpp:1211 src/libslic3r/PrintConfig.cpp:1403 msgid "mm/s²" msgstr "" @@ -6658,11 +6654,11 @@ msgid "" "bridges. Use 180° for zero angle." msgstr "" -#: src/libslic3r/PrintConfig.cpp:197 src/libslic3r/PrintConfig.cpp:781 -#: src/libslic3r/PrintConfig.cpp:1649 src/libslic3r/PrintConfig.cpp:1659 -#: src/libslic3r/PrintConfig.cpp:1904 src/libslic3r/PrintConfig.cpp:2059 -#: src/libslic3r/PrintConfig.cpp:2257 src/libslic3r/PrintConfig.cpp:2728 -#: src/libslic3r/PrintConfig.cpp:2849 +#: src/libslic3r/PrintConfig.cpp:197 src/libslic3r/PrintConfig.cpp:780 +#: src/libslic3r/PrintConfig.cpp:1640 src/libslic3r/PrintConfig.cpp:1650 +#: src/libslic3r/PrintConfig.cpp:1894 src/libslic3r/PrintConfig.cpp:2049 +#: src/libslic3r/PrintConfig.cpp:2247 src/libslic3r/PrintConfig.cpp:2718 +#: src/libslic3r/PrintConfig.cpp:2839 msgid "°" msgstr "" @@ -6674,10 +6670,10 @@ msgstr "" msgid "This fan speed is enforced during all bridges and overhangs." msgstr "" -#: src/libslic3r/PrintConfig.cpp:205 src/libslic3r/PrintConfig.cpp:793 -#: src/libslic3r/PrintConfig.cpp:1228 src/libslic3r/PrintConfig.cpp:1291 -#: src/libslic3r/PrintConfig.cpp:1541 src/libslic3r/PrintConfig.cpp:2435 -#: src/libslic3r/PrintConfig.cpp:2768 +#: src/libslic3r/PrintConfig.cpp:205 src/libslic3r/PrintConfig.cpp:792 +#: src/libslic3r/PrintConfig.cpp:1219 src/libslic3r/PrintConfig.cpp:1282 +#: src/libslic3r/PrintConfig.cpp:1532 src/libslic3r/PrintConfig.cpp:2425 +#: src/libslic3r/PrintConfig.cpp:2758 msgid "%" msgstr "" @@ -6701,16 +6697,16 @@ msgstr "" msgid "Speed for printing bridges." msgstr "" -#: src/libslic3r/PrintConfig.cpp:227 src/libslic3r/PrintConfig.cpp:610 -#: src/libslic3r/PrintConfig.cpp:618 src/libslic3r/PrintConfig.cpp:627 -#: src/libslic3r/PrintConfig.cpp:635 src/libslic3r/PrintConfig.cpp:662 -#: src/libslic3r/PrintConfig.cpp:681 src/libslic3r/PrintConfig.cpp:923 -#: src/libslic3r/PrintConfig.cpp:1051 src/libslic3r/PrintConfig.cpp:1137 -#: src/libslic3r/PrintConfig.cpp:1173 src/libslic3r/PrintConfig.cpp:1186 -#: src/libslic3r/PrintConfig.cpp:1197 src/libslic3r/PrintConfig.cpp:1250 -#: src/libslic3r/PrintConfig.cpp:1309 src/libslic3r/PrintConfig.cpp:1442 -#: src/libslic3r/PrintConfig.cpp:1616 src/libslic3r/PrintConfig.cpp:1625 -#: src/libslic3r/PrintConfig.cpp:2038 src/libslic3r/PrintConfig.cpp:2164 +#: src/libslic3r/PrintConfig.cpp:227 src/libslic3r/PrintConfig.cpp:609 +#: src/libslic3r/PrintConfig.cpp:617 src/libslic3r/PrintConfig.cpp:626 +#: src/libslic3r/PrintConfig.cpp:634 src/libslic3r/PrintConfig.cpp:661 +#: src/libslic3r/PrintConfig.cpp:680 src/libslic3r/PrintConfig.cpp:922 +#: src/libslic3r/PrintConfig.cpp:1050 src/libslic3r/PrintConfig.cpp:1135 +#: src/libslic3r/PrintConfig.cpp:1169 src/libslic3r/PrintConfig.cpp:1181 +#: src/libslic3r/PrintConfig.cpp:1191 src/libslic3r/PrintConfig.cpp:1241 +#: src/libslic3r/PrintConfig.cpp:1300 src/libslic3r/PrintConfig.cpp:1433 +#: src/libslic3r/PrintConfig.cpp:1607 src/libslic3r/PrintConfig.cpp:1616 +#: src/libslic3r/PrintConfig.cpp:2028 src/libslic3r/PrintConfig.cpp:2154 msgid "mm/s" msgstr "" @@ -6825,8 +6821,8 @@ msgstr "" msgid "Default print profile" msgstr "" -#: src/libslic3r/PrintConfig.cpp:343 src/libslic3r/PrintConfig.cpp:2593 -#: src/libslic3r/PrintConfig.cpp:2604 +#: src/libslic3r/PrintConfig.cpp:343 src/libslic3r/PrintConfig.cpp:2583 +#: src/libslic3r/PrintConfig.cpp:2594 msgid "" "Default print profile associated with the current printer profile. On " "selection of the current printer profile, this print profile will be " @@ -6906,24 +6902,24 @@ msgid "" "not its adjacent solid shells." msgstr "" -#: src/libslic3r/PrintConfig.cpp:425 src/libslic3r/PrintConfig.cpp:844 -#: src/libslic3r/PrintConfig.cpp:2019 +#: src/libslic3r/PrintConfig.cpp:425 src/libslic3r/PrintConfig.cpp:843 +#: src/libslic3r/PrintConfig.cpp:2009 msgid "Rectilinear" msgstr "" -#: src/libslic3r/PrintConfig.cpp:426 src/libslic3r/PrintConfig.cpp:850 +#: src/libslic3r/PrintConfig.cpp:426 src/libslic3r/PrintConfig.cpp:849 msgid "Concentric" msgstr "" -#: src/libslic3r/PrintConfig.cpp:427 src/libslic3r/PrintConfig.cpp:854 +#: src/libslic3r/PrintConfig.cpp:427 src/libslic3r/PrintConfig.cpp:853 msgid "Hilbert Curve" msgstr "" -#: src/libslic3r/PrintConfig.cpp:428 src/libslic3r/PrintConfig.cpp:855 +#: src/libslic3r/PrintConfig.cpp:428 src/libslic3r/PrintConfig.cpp:854 msgid "Archimedean Chords" msgstr "" -#: src/libslic3r/PrintConfig.cpp:429 src/libslic3r/PrintConfig.cpp:856 +#: src/libslic3r/PrintConfig.cpp:429 src/libslic3r/PrintConfig.cpp:855 msgid "Octagram Spiral" msgstr "" @@ -6950,11 +6946,11 @@ msgid "" msgstr "" #: src/libslic3r/PrintConfig.cpp:451 src/libslic3r/PrintConfig.cpp:560 -#: src/libslic3r/PrintConfig.cpp:883 src/libslic3r/PrintConfig.cpp:896 -#: src/libslic3r/PrintConfig.cpp:1016 src/libslic3r/PrintConfig.cpp:1042 -#: src/libslic3r/PrintConfig.cpp:1432 src/libslic3r/PrintConfig.cpp:1771 -#: src/libslic3r/PrintConfig.cpp:1893 src/libslic3r/PrintConfig.cpp:1961 -#: src/libslic3r/PrintConfig.cpp:2121 +#: src/libslic3r/PrintConfig.cpp:882 src/libslic3r/PrintConfig.cpp:895 +#: src/libslic3r/PrintConfig.cpp:1015 src/libslic3r/PrintConfig.cpp:1041 +#: src/libslic3r/PrintConfig.cpp:1423 src/libslic3r/PrintConfig.cpp:1761 +#: src/libslic3r/PrintConfig.cpp:1883 src/libslic3r/PrintConfig.cpp:1951 +#: src/libslic3r/PrintConfig.cpp:2111 msgid "mm or %" msgstr "" @@ -6965,9 +6961,9 @@ msgid "" "calculated on the perimeters speed setting above. Set to zero for auto." msgstr "" -#: src/libslic3r/PrintConfig.cpp:462 src/libslic3r/PrintConfig.cpp:905 -#: src/libslic3r/PrintConfig.cpp:1730 src/libslic3r/PrintConfig.cpp:1782 -#: src/libslic3r/PrintConfig.cpp:2005 src/libslic3r/PrintConfig.cpp:2134 +#: src/libslic3r/PrintConfig.cpp:462 src/libslic3r/PrintConfig.cpp:904 +#: src/libslic3r/PrintConfig.cpp:1720 src/libslic3r/PrintConfig.cpp:1772 +#: src/libslic3r/PrintConfig.cpp:1995 src/libslic3r/PrintConfig.cpp:2124 msgid "mm/s or %" msgstr "" @@ -7019,7 +7015,7 @@ msgstr "" msgid "Extruder Color" msgstr "" -#: src/libslic3r/PrintConfig.cpp:523 src/libslic3r/PrintConfig.cpp:584 +#: src/libslic3r/PrintConfig.cpp:523 src/libslic3r/PrintConfig.cpp:583 msgid "This is only used in the Slic3r interface as a visual help." msgstr "" @@ -7091,98 +7087,98 @@ msgid "" "maximum speeds." msgstr "" -#: src/libslic3r/PrintConfig.cpp:575 src/libslic3r/PrintConfig.cpp:1717 +#: src/libslic3r/PrintConfig.cpp:575 src/libslic3r/PrintConfig.cpp:1708 msgid "approximate seconds" msgstr "" -#: src/libslic3r/PrintConfig.cpp:589 +#: src/libslic3r/PrintConfig.cpp:588 msgid "Filament notes" msgstr "" -#: src/libslic3r/PrintConfig.cpp:590 +#: src/libslic3r/PrintConfig.cpp:589 msgid "You can put your notes regarding the filament here." msgstr "" -#: src/libslic3r/PrintConfig.cpp:598 src/libslic3r/PrintConfig.cpp:1256 +#: src/libslic3r/PrintConfig.cpp:597 src/libslic3r/PrintConfig.cpp:1247 msgid "Max volumetric speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:599 +#: src/libslic3r/PrintConfig.cpp:598 msgid "" "Maximum volumetric speed allowed for this filament. Limits the maximum " "volumetric speed of a print to the minimum of print and filament volumetric " "speed. Set to zero for no limit." msgstr "" -#: src/libslic3r/PrintConfig.cpp:608 +#: src/libslic3r/PrintConfig.cpp:607 msgid "Loading speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:609 +#: src/libslic3r/PrintConfig.cpp:608 msgid "Speed used for loading the filament on the wipe tower." msgstr "" -#: src/libslic3r/PrintConfig.cpp:616 +#: src/libslic3r/PrintConfig.cpp:615 msgid "Loading speed at the start" msgstr "" -#: src/libslic3r/PrintConfig.cpp:617 +#: src/libslic3r/PrintConfig.cpp:616 msgid "Speed used at the very beginning of loading phase." msgstr "" -#: src/libslic3r/PrintConfig.cpp:624 +#: src/libslic3r/PrintConfig.cpp:623 msgid "Unloading speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:625 +#: src/libslic3r/PrintConfig.cpp:624 msgid "" "Speed used for unloading the filament on the wipe tower (does not affect " "initial part of unloading just after ramming)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:633 +#: src/libslic3r/PrintConfig.cpp:632 msgid "Unloading speed at the start" msgstr "" -#: src/libslic3r/PrintConfig.cpp:634 +#: src/libslic3r/PrintConfig.cpp:633 msgid "" "Speed used for unloading the tip of the filament immediately after ramming." msgstr "" -#: src/libslic3r/PrintConfig.cpp:641 +#: src/libslic3r/PrintConfig.cpp:640 msgid "Delay after unloading" msgstr "" -#: src/libslic3r/PrintConfig.cpp:642 +#: src/libslic3r/PrintConfig.cpp:641 msgid "" "Time to wait after the filament is unloaded. May help to get reliable " "toolchanges with flexible materials that may need more time to shrink to " "original dimensions." msgstr "" -#: src/libslic3r/PrintConfig.cpp:651 +#: src/libslic3r/PrintConfig.cpp:650 msgid "Number of cooling moves" msgstr "" -#: src/libslic3r/PrintConfig.cpp:652 +#: src/libslic3r/PrintConfig.cpp:651 msgid "" "Filament is cooled by being moved back and forth in the cooling tubes. " "Specify desired number of these moves." msgstr "" -#: src/libslic3r/PrintConfig.cpp:660 +#: src/libslic3r/PrintConfig.cpp:659 msgid "Speed of the first cooling move" msgstr "" -#: src/libslic3r/PrintConfig.cpp:661 +#: src/libslic3r/PrintConfig.cpp:660 msgid "Cooling moves are gradually accelerating beginning at this speed." msgstr "" -#: src/libslic3r/PrintConfig.cpp:668 +#: src/libslic3r/PrintConfig.cpp:667 msgid "Minimal purge on wipe tower" msgstr "" -#: src/libslic3r/PrintConfig.cpp:669 +#: src/libslic3r/PrintConfig.cpp:668 msgid "" "After a tool change, the exact position of the newly loaded filament inside " "the nozzle may not be known, and the filament pressure is likely not yet " @@ -7191,63 +7187,63 @@ msgid "" "to produce successive infill or sacrificial object extrusions reliably." msgstr "" -#: src/libslic3r/PrintConfig.cpp:673 +#: src/libslic3r/PrintConfig.cpp:672 msgid "mm³" msgstr "" -#: src/libslic3r/PrintConfig.cpp:679 +#: src/libslic3r/PrintConfig.cpp:678 msgid "Speed of the last cooling move" msgstr "" -#: src/libslic3r/PrintConfig.cpp:680 +#: src/libslic3r/PrintConfig.cpp:679 msgid "Cooling moves are gradually accelerating towards this speed." msgstr "" -#: src/libslic3r/PrintConfig.cpp:687 +#: src/libslic3r/PrintConfig.cpp:686 msgid "Filament load time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:688 +#: src/libslic3r/PrintConfig.cpp:687 msgid "" "Time for the printer firmware (or the Multi Material Unit 2.0) to load a new " "filament during a tool change (when executing the T code). This time is " "added to the total print time by the G-code time estimator." msgstr "" -#: src/libslic3r/PrintConfig.cpp:695 +#: src/libslic3r/PrintConfig.cpp:694 msgid "Ramming parameters" msgstr "" -#: src/libslic3r/PrintConfig.cpp:696 +#: src/libslic3r/PrintConfig.cpp:695 msgid "" "This string is edited by RammingDialog and contains ramming specific " "parameters." msgstr "" -#: src/libslic3r/PrintConfig.cpp:702 +#: src/libslic3r/PrintConfig.cpp:701 msgid "Filament unload time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:703 +#: src/libslic3r/PrintConfig.cpp:702 msgid "" "Time for the printer firmware (or the Multi Material Unit 2.0) to unload a " "filament during a tool change (when executing the T code). This time is " "added to the total print time by the G-code time estimator." msgstr "" -#: src/libslic3r/PrintConfig.cpp:711 +#: src/libslic3r/PrintConfig.cpp:710 msgid "" "Enter your filament diameter here. Good precision is required, so use a " "caliper and do multiple measurements along the filament, then compute the " "average." msgstr "" -#: src/libslic3r/PrintConfig.cpp:718 src/libslic3r/PrintConfig.cpp:2504 -#: src/libslic3r/PrintConfig.cpp:2505 +#: src/libslic3r/PrintConfig.cpp:717 src/libslic3r/PrintConfig.cpp:2494 +#: src/libslic3r/PrintConfig.cpp:2495 msgid "Density" msgstr "" -#: src/libslic3r/PrintConfig.cpp:719 +#: src/libslic3r/PrintConfig.cpp:718 msgid "" "Enter your filament density here. This is only for statistical information. " "A decent way is to weigh a known length of filament and compute the ratio of " @@ -7255,117 +7251,117 @@ msgid "" "displacement." msgstr "" -#: src/libslic3r/PrintConfig.cpp:722 +#: src/libslic3r/PrintConfig.cpp:721 msgid "g/cm³" msgstr "" -#: src/libslic3r/PrintConfig.cpp:727 +#: src/libslic3r/PrintConfig.cpp:726 msgid "Filament type" msgstr "" -#: src/libslic3r/PrintConfig.cpp:728 +#: src/libslic3r/PrintConfig.cpp:727 msgid "The filament material type for use in custom G-codes." msgstr "" -#: src/libslic3r/PrintConfig.cpp:755 +#: src/libslic3r/PrintConfig.cpp:754 msgid "Soluble material" msgstr "" -#: src/libslic3r/PrintConfig.cpp:756 +#: src/libslic3r/PrintConfig.cpp:755 msgid "Soluble material is most likely used for a soluble support." msgstr "" -#: src/libslic3r/PrintConfig.cpp:762 +#: src/libslic3r/PrintConfig.cpp:761 msgid "" "Enter your filament cost per kg here. This is only for statistical " "information." msgstr "" -#: src/libslic3r/PrintConfig.cpp:763 +#: src/libslic3r/PrintConfig.cpp:762 msgid "money/kg" msgstr "" -#: src/libslic3r/PrintConfig.cpp:772 src/libslic3r/PrintConfig.cpp:2588 +#: src/libslic3r/PrintConfig.cpp:771 src/libslic3r/PrintConfig.cpp:2578 msgid "(Unknown)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:776 +#: src/libslic3r/PrintConfig.cpp:775 msgid "Fill angle" msgstr "" -#: src/libslic3r/PrintConfig.cpp:778 +#: src/libslic3r/PrintConfig.cpp:777 msgid "" "Default base angle for infill orientation. Cross-hatching will be applied to " "this. Bridges will be infilled using the best direction Slic3r can detect, " "so this setting does not affect them." msgstr "" -#: src/libslic3r/PrintConfig.cpp:790 +#: src/libslic3r/PrintConfig.cpp:789 msgid "Fill density" msgstr "" -#: src/libslic3r/PrintConfig.cpp:792 +#: src/libslic3r/PrintConfig.cpp:791 msgid "Density of internal infill, expressed in the range 0% - 100%." msgstr "" -#: src/libslic3r/PrintConfig.cpp:827 +#: src/libslic3r/PrintConfig.cpp:826 msgid "Fill pattern" msgstr "" -#: src/libslic3r/PrintConfig.cpp:829 +#: src/libslic3r/PrintConfig.cpp:828 msgid "Fill pattern for general low-density infill." msgstr "" -#: src/libslic3r/PrintConfig.cpp:845 +#: src/libslic3r/PrintConfig.cpp:844 msgid "Grid" msgstr "" -#: src/libslic3r/PrintConfig.cpp:846 +#: src/libslic3r/PrintConfig.cpp:845 msgid "Triangles" msgstr "" -#: src/libslic3r/PrintConfig.cpp:847 +#: src/libslic3r/PrintConfig.cpp:846 msgid "Stars" msgstr "" -#: src/libslic3r/PrintConfig.cpp:848 +#: src/libslic3r/PrintConfig.cpp:847 msgid "Cubic" msgstr "" -#: src/libslic3r/PrintConfig.cpp:849 +#: src/libslic3r/PrintConfig.cpp:848 msgid "Line" msgstr "" -#: src/libslic3r/PrintConfig.cpp:851 src/libslic3r/PrintConfig.cpp:2021 +#: src/libslic3r/PrintConfig.cpp:850 src/libslic3r/PrintConfig.cpp:2011 msgid "Honeycomb" msgstr "" -#: src/libslic3r/PrintConfig.cpp:852 +#: src/libslic3r/PrintConfig.cpp:851 msgid "3D Honeycomb" msgstr "" -#: src/libslic3r/PrintConfig.cpp:853 +#: src/libslic3r/PrintConfig.cpp:852 msgid "Gyroid" msgstr "" -#: src/libslic3r/PrintConfig.cpp:860 src/libslic3r/PrintConfig.cpp:869 -#: src/libslic3r/PrintConfig.cpp:877 src/libslic3r/PrintConfig.cpp:911 +#: src/libslic3r/PrintConfig.cpp:859 src/libslic3r/PrintConfig.cpp:868 +#: src/libslic3r/PrintConfig.cpp:876 src/libslic3r/PrintConfig.cpp:910 msgid "First layer" msgstr "" -#: src/libslic3r/PrintConfig.cpp:861 +#: src/libslic3r/PrintConfig.cpp:860 msgid "" "This is the acceleration your printer will use for first layer. Set zero to " "disable acceleration control for first layer." msgstr "" -#: src/libslic3r/PrintConfig.cpp:870 +#: src/libslic3r/PrintConfig.cpp:869 msgid "" "Heated build plate temperature for the first layer. Set this to zero to " "disable bed temperature control commands in the output." msgstr "" -#: src/libslic3r/PrintConfig.cpp:879 +#: src/libslic3r/PrintConfig.cpp:878 msgid "" "Set this to a non-zero value to set a manual extrusion width for first " "layer. You can use this to force fatter extrudates for better adhesion. If " @@ -7373,7 +7369,7 @@ msgid "" "layer height. If set to zero, it will use the default extrusion width." msgstr "" -#: src/libslic3r/PrintConfig.cpp:892 +#: src/libslic3r/PrintConfig.cpp:891 msgid "" "When printing with very low layer heights, you might still want to print a " "thicker bottom layer to improve adhesion and tolerance for non perfect build " @@ -7381,47 +7377,47 @@ msgid "" "example: 150%) over the default layer height." msgstr "" -#: src/libslic3r/PrintConfig.cpp:901 +#: src/libslic3r/PrintConfig.cpp:900 msgid "First layer speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:902 +#: src/libslic3r/PrintConfig.cpp:901 msgid "" "If expressed as absolute value in mm/s, this speed will be applied to all " "the print moves of the first layer, regardless of their type. If expressed " "as a percentage (for example: 40%) it will scale the default speeds." msgstr "" -#: src/libslic3r/PrintConfig.cpp:912 +#: src/libslic3r/PrintConfig.cpp:911 msgid "" "Extruder temperature for first layer. If you want to control temperature " "manually during print, set this to zero to disable temperature control " "commands in the output file." msgstr "" -#: src/libslic3r/PrintConfig.cpp:921 +#: src/libslic3r/PrintConfig.cpp:920 msgid "" "Speed for filling small gaps using short zigzag moves. Keep this reasonably " "low to avoid too much shaking and resonance issues. Set zero to disable gaps " "filling." msgstr "" -#: src/libslic3r/PrintConfig.cpp:929 +#: src/libslic3r/PrintConfig.cpp:928 msgid "Verbose G-code" msgstr "" -#: src/libslic3r/PrintConfig.cpp:930 +#: src/libslic3r/PrintConfig.cpp:929 msgid "" "Enable this to get a commented G-code file, with each line explained by a " "descriptive text. If you print from SD card, the additional weight of the " "file could make your firmware slow down." msgstr "" -#: src/libslic3r/PrintConfig.cpp:937 +#: src/libslic3r/PrintConfig.cpp:936 msgid "G-code flavor" msgstr "" -#: src/libslic3r/PrintConfig.cpp:938 +#: src/libslic3r/PrintConfig.cpp:937 msgid "" "Some G/M-code commands, including temperature control and others, are not " "universal. Set this option to your printer's firmware to get a compatible " @@ -7429,15 +7425,15 @@ msgid "" "extrusion value at all." msgstr "" -#: src/libslic3r/PrintConfig.cpp:961 +#: src/libslic3r/PrintConfig.cpp:960 msgid "No extrusion" msgstr "" -#: src/libslic3r/PrintConfig.cpp:966 +#: src/libslic3r/PrintConfig.cpp:965 msgid "Label objects" msgstr "" -#: src/libslic3r/PrintConfig.cpp:967 +#: src/libslic3r/PrintConfig.cpp:966 msgid "" "Enable this to add comments into the G-Code labeling print moves with what " "object they belong to, which is useful for the Octoprint CancelObject " @@ -7445,46 +7441,46 @@ msgid "" "setup and Wipe into Object / Wipe into Infill." msgstr "" -#: src/libslic3r/PrintConfig.cpp:974 +#: src/libslic3r/PrintConfig.cpp:973 msgid "High extruder current on filament swap" msgstr "" -#: src/libslic3r/PrintConfig.cpp:975 +#: src/libslic3r/PrintConfig.cpp:974 msgid "" "It may be beneficial to increase the extruder motor current during the " "filament exchange sequence to allow for rapid ramming feed rates and to " "overcome resistance when loading a filament with an ugly shaped tip." msgstr "" -#: src/libslic3r/PrintConfig.cpp:983 +#: src/libslic3r/PrintConfig.cpp:982 msgid "" "This is the acceleration your printer will use for infill. Set zero to " "disable acceleration control for infill." msgstr "" -#: src/libslic3r/PrintConfig.cpp:991 +#: src/libslic3r/PrintConfig.cpp:990 msgid "Combine infill every" msgstr "" -#: src/libslic3r/PrintConfig.cpp:993 +#: src/libslic3r/PrintConfig.cpp:992 msgid "" "This feature allows to combine infill and speed up your print by extruding " "thicker infill layers while preserving thin perimeters, thus accuracy." msgstr "" -#: src/libslic3r/PrintConfig.cpp:996 +#: src/libslic3r/PrintConfig.cpp:995 msgid "Combine infill every n layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1002 +#: src/libslic3r/PrintConfig.cpp:1001 msgid "Infill extruder" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1004 +#: src/libslic3r/PrintConfig.cpp:1003 msgid "The extruder to use when printing infill." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1012 +#: src/libslic3r/PrintConfig.cpp:1011 msgid "" "Set this to a non-zero value to set a manual extrusion width for infill. If " "left zero, default extrusion width will be used if set, otherwise 1.125 x " @@ -7493,32 +7489,32 @@ msgid "" "example 90%) it will be computed over layer height." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1022 +#: src/libslic3r/PrintConfig.cpp:1021 msgid "Infill before perimeters" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1023 +#: src/libslic3r/PrintConfig.cpp:1022 msgid "" "This option will switch the print order of perimeters and infill, making the " "latter first." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1028 +#: src/libslic3r/PrintConfig.cpp:1027 msgid "Only infill where needed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1030 +#: src/libslic3r/PrintConfig.cpp:1029 msgid "" "This option will limit infill to the areas actually needed for supporting " "ceilings (it will act as internal support material). If enabled, slows down " "the G-code generation due to the multiple checks involved." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1037 +#: src/libslic3r/PrintConfig.cpp:1036 msgid "Infill/perimeters overlap" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1039 +#: src/libslic3r/PrintConfig.cpp:1038 msgid "" "This setting applies an additional overlap between infill and perimeters for " "better bonding. Theoretically this shouldn't be needed, but backlash might " @@ -7526,30 +7522,30 @@ msgid "" "perimeter extrusion width." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1050 +#: src/libslic3r/PrintConfig.cpp:1049 msgid "Speed for printing the internal fill. Set to zero for auto." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1058 +#: src/libslic3r/PrintConfig.cpp:1057 msgid "Inherits profile" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1059 +#: src/libslic3r/PrintConfig.cpp:1058 msgid "Name of the profile, from which this profile inherits." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1072 +#: src/libslic3r/PrintConfig.cpp:1071 msgid "Interface shells" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1073 +#: src/libslic3r/PrintConfig.cpp:1072 msgid "" "Force the generation of solid shells between adjacent materials/volumes. " "Useful for multi-extruder prints with translucent materials or manual " "soluble support material." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1082 +#: src/libslic3r/PrintConfig.cpp:1081 msgid "" "This custom code is inserted at every layer change, right after the Z move " "and before the extruder moves to the first layer point. Note that you can " @@ -7557,11 +7553,11 @@ msgid "" "[layer_z]." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1093 +#: src/libslic3r/PrintConfig.cpp:1092 msgid "Supports remaining times" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1094 +#: src/libslic3r/PrintConfig.cpp:1093 msgid "" "Emit M73 P[percent printed] R[remaining time in minutes] at 1 minute " "intervals into the G-code to let the firmware show accurate remaining time. " @@ -7569,151 +7565,151 @@ msgid "" "firmware supports M73 Qxx Sxx for the silent mode." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1102 +#: src/libslic3r/PrintConfig.cpp:1101 msgid "Supports stealth mode" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1103 +#: src/libslic3r/PrintConfig.cpp:1102 msgid "The firmware supports stealth mode" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1127 +#: src/libslic3r/PrintConfig.cpp:1125 msgid "Maximum feedrate X" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1128 +#: src/libslic3r/PrintConfig.cpp:1126 msgid "Maximum feedrate Y" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1129 +#: src/libslic3r/PrintConfig.cpp:1127 msgid "Maximum feedrate Z" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1130 +#: src/libslic3r/PrintConfig.cpp:1128 msgid "Maximum feedrate E" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1133 +#: src/libslic3r/PrintConfig.cpp:1131 msgid "Maximum feedrate of the X axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1134 +#: src/libslic3r/PrintConfig.cpp:1132 msgid "Maximum feedrate of the Y axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1135 +#: src/libslic3r/PrintConfig.cpp:1133 msgid "Maximum feedrate of the Z axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1136 +#: src/libslic3r/PrintConfig.cpp:1134 msgid "Maximum feedrate of the E axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1145 +#: src/libslic3r/PrintConfig.cpp:1142 msgid "Maximum acceleration X" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1146 +#: src/libslic3r/PrintConfig.cpp:1143 msgid "Maximum acceleration Y" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1147 +#: src/libslic3r/PrintConfig.cpp:1144 msgid "Maximum acceleration Z" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1148 +#: src/libslic3r/PrintConfig.cpp:1145 msgid "Maximum acceleration E" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1151 +#: src/libslic3r/PrintConfig.cpp:1148 msgid "Maximum acceleration of the X axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1152 +#: src/libslic3r/PrintConfig.cpp:1149 msgid "Maximum acceleration of the Y axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1153 +#: src/libslic3r/PrintConfig.cpp:1150 msgid "Maximum acceleration of the Z axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1154 +#: src/libslic3r/PrintConfig.cpp:1151 msgid "Maximum acceleration of the E axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1163 +#: src/libslic3r/PrintConfig.cpp:1159 msgid "Maximum jerk X" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1164 +#: src/libslic3r/PrintConfig.cpp:1160 msgid "Maximum jerk Y" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1165 +#: src/libslic3r/PrintConfig.cpp:1161 msgid "Maximum jerk Z" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1166 +#: src/libslic3r/PrintConfig.cpp:1162 msgid "Maximum jerk E" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1169 +#: src/libslic3r/PrintConfig.cpp:1165 msgid "Maximum jerk of the X axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1170 +#: src/libslic3r/PrintConfig.cpp:1166 msgid "Maximum jerk of the Y axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1171 +#: src/libslic3r/PrintConfig.cpp:1167 msgid "Maximum jerk of the Z axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1172 +#: src/libslic3r/PrintConfig.cpp:1168 msgid "Maximum jerk of the E axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1183 +#: src/libslic3r/PrintConfig.cpp:1178 msgid "Minimum feedrate when extruding" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1185 +#: src/libslic3r/PrintConfig.cpp:1180 msgid "Minimum feedrate when extruding (M205 S)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1194 +#: src/libslic3r/PrintConfig.cpp:1188 msgid "Minimum travel feedrate" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1196 +#: src/libslic3r/PrintConfig.cpp:1190 msgid "Minimum travel feedrate (M205 T)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1205 +#: src/libslic3r/PrintConfig.cpp:1198 msgid "Maximum acceleration when extruding" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1207 +#: src/libslic3r/PrintConfig.cpp:1200 msgid "Maximum acceleration when extruding (M204 S)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1216 +#: src/libslic3r/PrintConfig.cpp:1208 msgid "Maximum acceleration when retracting" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1218 +#: src/libslic3r/PrintConfig.cpp:1210 msgid "Maximum acceleration when retracting (M204 T)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1226 src/libslic3r/PrintConfig.cpp:1235 +#: src/libslic3r/PrintConfig.cpp:1217 src/libslic3r/PrintConfig.cpp:1226 msgid "Max" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1227 +#: src/libslic3r/PrintConfig.cpp:1218 msgid "This setting represents the maximum speed of your fan." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1236 +#: src/libslic3r/PrintConfig.cpp:1227 #, no-c-format msgid "" "This is the highest printable layer height for this extruder, used to cap " @@ -7722,28 +7718,28 @@ msgid "" "adhesion. If set to 0, layer height is limited to 75% of the nozzle diameter." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1246 +#: src/libslic3r/PrintConfig.cpp:1237 msgid "Max print speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1247 +#: src/libslic3r/PrintConfig.cpp:1238 msgid "" "When setting other speed settings to 0 Slic3r will autocalculate the optimal " "speed in order to keep constant extruder pressure. This experimental setting " "is used to set the highest print speed you want to allow." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1257 +#: src/libslic3r/PrintConfig.cpp:1248 msgid "" "This experimental setting is used to set the maximum volumetric speed your " "extruder supports." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1266 +#: src/libslic3r/PrintConfig.cpp:1257 msgid "Max volumetric slope positive" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1267 src/libslic3r/PrintConfig.cpp:1278 +#: src/libslic3r/PrintConfig.cpp:1258 src/libslic3r/PrintConfig.cpp:1269 msgid "" "This experimental setting is used to limit the speed of change in extrusion " "rate. A value of 1.8 mm³/s² ensures, that a change from the extrusion rate " @@ -7751,95 +7747,95 @@ msgid "" "s) to 5.4 mm³/s (feedrate 60 mm/s) will take at least 2 seconds." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1271 src/libslic3r/PrintConfig.cpp:1282 +#: src/libslic3r/PrintConfig.cpp:1262 src/libslic3r/PrintConfig.cpp:1273 msgid "mm³/s²" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1277 +#: src/libslic3r/PrintConfig.cpp:1268 msgid "Max volumetric slope negative" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1289 src/libslic3r/PrintConfig.cpp:1298 +#: src/libslic3r/PrintConfig.cpp:1280 src/libslic3r/PrintConfig.cpp:1289 msgid "Min" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1290 +#: src/libslic3r/PrintConfig.cpp:1281 msgid "This setting represents the minimum PWM your fan needs to work." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1299 +#: src/libslic3r/PrintConfig.cpp:1290 msgid "" "This is the lowest printable layer height for this extruder and limits the " "resolution for variable layer height. Typical values are between 0.05 mm and " "0.1 mm." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1307 +#: src/libslic3r/PrintConfig.cpp:1298 msgid "Min print speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1308 +#: src/libslic3r/PrintConfig.cpp:1299 msgid "Slic3r will not scale speed down below this speed." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1315 +#: src/libslic3r/PrintConfig.cpp:1306 msgid "Minimal filament extrusion length" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1316 +#: src/libslic3r/PrintConfig.cpp:1307 msgid "" "Generate no less than the number of skirt loops required to consume the " "specified amount of filament on the bottom layer. For multi-extruder " "machines, this minimum applies to each extruder." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1325 +#: src/libslic3r/PrintConfig.cpp:1316 msgid "Configuration notes" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1326 +#: src/libslic3r/PrintConfig.cpp:1317 msgid "" "You can put here your personal notes. This text will be added to the G-code " "header comments." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1336 +#: src/libslic3r/PrintConfig.cpp:1327 msgid "" "This is the diameter of your extruder nozzle (for example: 0.5, 0.35 etc.)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1341 +#: src/libslic3r/PrintConfig.cpp:1332 msgid "Host Type" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1342 +#: src/libslic3r/PrintConfig.cpp:1333 msgid "" "Slic3r can upload G-code files to a printer host. This field must contain " "the kind of the host." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1357 +#: src/libslic3r/PrintConfig.cpp:1348 msgid "Only retract when crossing perimeters" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1358 +#: src/libslic3r/PrintConfig.cpp:1349 msgid "" "Disables retraction when the travel path does not exceed the upper layer's " "perimeters (and thus any ooze will be probably invisible)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1365 +#: src/libslic3r/PrintConfig.cpp:1356 msgid "" "This option will drop the temperature of the inactive extruders to prevent " "oozing. It will enable a tall skirt automatically and move extruders outside " "such skirt when changing temperatures." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1372 +#: src/libslic3r/PrintConfig.cpp:1363 msgid "Output filename format" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1373 +#: src/libslic3r/PrintConfig.cpp:1364 msgid "" "You can use all configuration options as variables inside this template. For " "example: [layer_height], [fill_density] etc. You can also use [timestamp], " @@ -7847,31 +7843,31 @@ msgid "" "[input_filename], [input_filename_base]." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1382 +#: src/libslic3r/PrintConfig.cpp:1373 msgid "Detect bridging perimeters" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1384 +#: src/libslic3r/PrintConfig.cpp:1375 msgid "" "Experimental option to adjust flow for overhangs (bridge flow will be used), " "to apply bridge speed to them and enable fan." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1390 +#: src/libslic3r/PrintConfig.cpp:1381 msgid "Filament parking position" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1391 +#: src/libslic3r/PrintConfig.cpp:1382 msgid "" "Distance of the extruder tip from the position where the filament is parked " "when unloaded. This should match the value in printer firmware." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1399 +#: src/libslic3r/PrintConfig.cpp:1390 msgid "Extra loading distance" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1400 +#: src/libslic3r/PrintConfig.cpp:1391 msgid "" "When set to zero, the distance the filament is moved from parking position " "during load is exactly the same as it was moved back during unload. When " @@ -7879,28 +7875,28 @@ msgid "" "than unloading." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1408 src/libslic3r/PrintConfig.cpp:1426 -#: src/libslic3r/PrintConfig.cpp:1439 src/libslic3r/PrintConfig.cpp:1449 +#: src/libslic3r/PrintConfig.cpp:1399 src/libslic3r/PrintConfig.cpp:1417 +#: src/libslic3r/PrintConfig.cpp:1430 src/libslic3r/PrintConfig.cpp:1440 msgid "Perimeters" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1409 +#: src/libslic3r/PrintConfig.cpp:1400 msgid "" "This is the acceleration your printer will use for perimeters. A high value " "like 9000 usually gives good results if your hardware is up to the job. Set " "zero to disable acceleration control for perimeters." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1417 +#: src/libslic3r/PrintConfig.cpp:1408 msgid "Perimeter extruder" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1419 +#: src/libslic3r/PrintConfig.cpp:1410 msgid "" "The extruder to use when printing perimeters and brim. First extruder is 1." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1428 +#: src/libslic3r/PrintConfig.cpp:1419 msgid "" "Set this to a non-zero value to set a manual extrusion width for perimeters. " "You may want to use thinner extrudates to get more accurate surfaces. If " @@ -7909,12 +7905,12 @@ msgid "" "it will be computed over layer height." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1441 +#: src/libslic3r/PrintConfig.cpp:1432 msgid "" "Speed for perimeters (contours, aka vertical shells). Set to zero for auto." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1451 +#: src/libslic3r/PrintConfig.cpp:1442 msgid "" "This option sets the number of perimeters to generate for each layer. Note " "that Slic3r may increase this number automatically when it detects sloping " @@ -7922,11 +7918,11 @@ msgid "" "Perimeters option is enabled." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1455 +#: src/libslic3r/PrintConfig.cpp:1446 msgid "(minimum)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1463 +#: src/libslic3r/PrintConfig.cpp:1454 msgid "" "If you want to process the output G-code through custom scripts, just list " "their absolute paths here. Separate multiple scripts with a semicolon. " @@ -7935,55 +7931,55 @@ msgid "" "environment variables." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1475 +#: src/libslic3r/PrintConfig.cpp:1466 msgid "Printer type" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1476 +#: src/libslic3r/PrintConfig.cpp:1467 msgid "Type of the printer." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1481 +#: src/libslic3r/PrintConfig.cpp:1472 msgid "Printer notes" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1482 +#: src/libslic3r/PrintConfig.cpp:1473 msgid "You can put your notes regarding the printer here." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1490 +#: src/libslic3r/PrintConfig.cpp:1481 msgid "Printer vendor" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1491 +#: src/libslic3r/PrintConfig.cpp:1482 msgid "Name of the printer vendor." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1496 +#: src/libslic3r/PrintConfig.cpp:1487 msgid "Printer variant" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1497 +#: src/libslic3r/PrintConfig.cpp:1488 msgid "" "Name of the printer variant. For example, the printer variants may be " "differentiated by a nozzle diameter." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1510 +#: src/libslic3r/PrintConfig.cpp:1501 msgid "Raft layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1512 +#: src/libslic3r/PrintConfig.cpp:1503 msgid "" "The object will be raised by this number of layers, and support material " "will be generated under it." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1520 +#: src/libslic3r/PrintConfig.cpp:1511 msgid "Resolution" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1521 +#: src/libslic3r/PrintConfig.cpp:1512 msgid "" "Minimum detail resolution, used to simplify the input file for speeding up " "the slicing job and reducing memory usage. High-resolution models often " @@ -7991,278 +7987,278 @@ msgid "" "simplification and use full resolution from input." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1531 +#: src/libslic3r/PrintConfig.cpp:1522 msgid "Minimum travel after retraction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1532 +#: src/libslic3r/PrintConfig.cpp:1523 msgid "" "Retraction is not triggered when travel moves are shorter than this length." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1538 +#: src/libslic3r/PrintConfig.cpp:1529 msgid "Retract amount before wipe" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1539 +#: src/libslic3r/PrintConfig.cpp:1530 msgid "" "With bowden extruders, it may be wise to do some amount of quick retract " "before doing the wipe movement." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1546 +#: src/libslic3r/PrintConfig.cpp:1537 msgid "Retract on layer change" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1547 +#: src/libslic3r/PrintConfig.cpp:1538 msgid "This flag enforces a retraction whenever a Z move is done." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1552 src/libslic3r/PrintConfig.cpp:1560 +#: src/libslic3r/PrintConfig.cpp:1543 src/libslic3r/PrintConfig.cpp:1551 msgid "Length" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1553 +#: src/libslic3r/PrintConfig.cpp:1544 msgid "Retraction Length" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1554 +#: src/libslic3r/PrintConfig.cpp:1545 msgid "" "When retraction is triggered, filament is pulled back by the specified " "amount (the length is measured on raw filament, before it enters the " "extruder)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1556 src/libslic3r/PrintConfig.cpp:1565 +#: src/libslic3r/PrintConfig.cpp:1547 src/libslic3r/PrintConfig.cpp:1556 msgid "mm (zero to disable)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1561 +#: src/libslic3r/PrintConfig.cpp:1552 msgid "Retraction Length (Toolchange)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1562 +#: src/libslic3r/PrintConfig.cpp:1553 msgid "" "When retraction is triggered before changing tool, filament is pulled back " "by the specified amount (the length is measured on raw filament, before it " "enters the extruder)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1570 +#: src/libslic3r/PrintConfig.cpp:1561 msgid "Lift Z" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1571 +#: src/libslic3r/PrintConfig.cpp:1562 msgid "" "If you set this to a positive value, Z is quickly raised every time a " "retraction is triggered. When using multiple extruders, only the setting for " "the first extruder will be considered." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1578 +#: src/libslic3r/PrintConfig.cpp:1569 msgid "Above Z" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1579 +#: src/libslic3r/PrintConfig.cpp:1570 msgid "Only lift Z above" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1580 +#: src/libslic3r/PrintConfig.cpp:1571 msgid "" "If you set this to a positive value, Z lift will only take place above the " "specified absolute Z. You can tune this setting for skipping lift on the " "first layers." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1587 +#: src/libslic3r/PrintConfig.cpp:1578 msgid "Below Z" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1588 +#: src/libslic3r/PrintConfig.cpp:1579 msgid "Only lift Z below" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1589 +#: src/libslic3r/PrintConfig.cpp:1580 msgid "" "If you set this to a positive value, Z lift will only take place below the " "specified absolute Z. You can tune this setting for limiting lift to the " "first layers." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1597 src/libslic3r/PrintConfig.cpp:1605 +#: src/libslic3r/PrintConfig.cpp:1588 src/libslic3r/PrintConfig.cpp:1596 msgid "Extra length on restart" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1598 +#: src/libslic3r/PrintConfig.cpp:1589 msgid "" "When the retraction is compensated after the travel move, the extruder will " "push this additional amount of filament. This setting is rarely needed." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1606 +#: src/libslic3r/PrintConfig.cpp:1597 msgid "" "When the retraction is compensated after changing tool, the extruder will " "push this additional amount of filament." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1613 src/libslic3r/PrintConfig.cpp:1614 +#: src/libslic3r/PrintConfig.cpp:1604 src/libslic3r/PrintConfig.cpp:1605 msgid "Retraction Speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1615 +#: src/libslic3r/PrintConfig.cpp:1606 msgid "The speed for retractions (it only applies to the extruder motor)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1621 src/libslic3r/PrintConfig.cpp:1622 +#: src/libslic3r/PrintConfig.cpp:1612 src/libslic3r/PrintConfig.cpp:1613 msgid "Deretraction Speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1623 +#: src/libslic3r/PrintConfig.cpp:1614 msgid "" "The speed for loading of a filament into extruder after retraction (it only " "applies to the extruder motor). If left to zero, the retraction speed is " "used." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1630 +#: src/libslic3r/PrintConfig.cpp:1621 msgid "Seam position" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1632 +#: src/libslic3r/PrintConfig.cpp:1623 msgid "Position of perimeters starting points." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1638 +#: src/libslic3r/PrintConfig.cpp:1629 msgid "Random" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1639 +#: src/libslic3r/PrintConfig.cpp:1630 msgid "Nearest" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1640 +#: src/libslic3r/PrintConfig.cpp:1631 msgid "Aligned" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1648 +#: src/libslic3r/PrintConfig.cpp:1639 msgid "Direction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1650 +#: src/libslic3r/PrintConfig.cpp:1641 msgid "Preferred direction of the seam" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1651 +#: src/libslic3r/PrintConfig.cpp:1642 msgid "Seam preferred direction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1658 +#: src/libslic3r/PrintConfig.cpp:1649 msgid "Jitter" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1660 +#: src/libslic3r/PrintConfig.cpp:1651 msgid "Seam preferred direction jitter" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1661 +#: src/libslic3r/PrintConfig.cpp:1652 msgid "Preferred direction of the seam - jitter" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1671 +#: src/libslic3r/PrintConfig.cpp:1662 msgid "USB/serial port for printer connection." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1678 +#: src/libslic3r/PrintConfig.cpp:1669 msgid "Serial port speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1679 +#: src/libslic3r/PrintConfig.cpp:1670 msgid "Speed (baud) of USB/serial port for printer connection." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1688 +#: src/libslic3r/PrintConfig.cpp:1679 msgid "Distance from object" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1689 +#: src/libslic3r/PrintConfig.cpp:1680 msgid "" "Distance between skirt and object(s). Set this to zero to attach the skirt " "to the object(s) and get a brim for better adhesion." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1696 +#: src/libslic3r/PrintConfig.cpp:1687 msgid "Skirt height" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1697 +#: src/libslic3r/PrintConfig.cpp:1688 msgid "" "Height of skirt expressed in layers. Set this to a tall value to use skirt " "as a shield against drafts." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1704 +#: src/libslic3r/PrintConfig.cpp:1695 msgid "Loops (minimum)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1705 +#: src/libslic3r/PrintConfig.cpp:1696 msgid "Skirt Loops" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1706 +#: src/libslic3r/PrintConfig.cpp:1697 msgid "" "Number of loops for the skirt. If the Minimum Extrusion Length option is " "set, the number of loops might be greater than the one configured here. Set " "this to zero to disable skirt completely." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1714 +#: src/libslic3r/PrintConfig.cpp:1705 msgid "Slow down if layer print time is below" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1715 +#: src/libslic3r/PrintConfig.cpp:1706 msgid "" "If layer print time is estimated below this number of seconds, print moves " "speed will be scaled down to extend duration to this value." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1725 +#: src/libslic3r/PrintConfig.cpp:1715 msgid "Small perimeters" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1727 +#: src/libslic3r/PrintConfig.cpp:1717 msgid "" "This separate setting will affect the speed of perimeters having radius <= " "6.5mm (usually holes). If expressed as percentage (for example: 80%) it will " "be calculated on the perimeters speed setting above. Set to zero for auto." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1737 +#: src/libslic3r/PrintConfig.cpp:1727 msgid "Solid infill threshold area" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1739 +#: src/libslic3r/PrintConfig.cpp:1729 msgid "" "Force solid infill for regions having a smaller area than the specified " "threshold." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1740 +#: src/libslic3r/PrintConfig.cpp:1730 msgid "mm²" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1746 +#: src/libslic3r/PrintConfig.cpp:1736 msgid "Solid infill extruder" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1748 +#: src/libslic3r/PrintConfig.cpp:1738 msgid "The extruder to use when printing solid infill." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1754 +#: src/libslic3r/PrintConfig.cpp:1744 msgid "Solid infill every" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1756 +#: src/libslic3r/PrintConfig.cpp:1746 msgid "" "This feature allows to force a solid layer every given number of layers. " "Zero to disable. You can set this to any value (for example 9999); Slic3r " @@ -8270,7 +8266,7 @@ msgid "" "according to nozzle diameter and layer height." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1768 +#: src/libslic3r/PrintConfig.cpp:1758 msgid "" "Set this to a non-zero value to set a manual extrusion width for infill for " "solid surfaces. If left zero, default extrusion width will be used if set, " @@ -8278,26 +8274,26 @@ msgid "" "(for example 90%) it will be computed over layer height." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1779 +#: src/libslic3r/PrintConfig.cpp:1769 msgid "" "Speed for printing solid regions (top/bottom/internal horizontal shells). " "This can be expressed as a percentage (for example: 80%) over the default " "infill speed above. Set to zero for auto." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1791 +#: src/libslic3r/PrintConfig.cpp:1781 msgid "Number of solid layers to generate on top and bottom surfaces." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1797 src/libslic3r/PrintConfig.cpp:1798 +#: src/libslic3r/PrintConfig.cpp:1787 src/libslic3r/PrintConfig.cpp:1788 msgid "Minimum thickness of a top / bottom shell" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1804 +#: src/libslic3r/PrintConfig.cpp:1794 msgid "Spiral vase" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1805 +#: src/libslic3r/PrintConfig.cpp:1795 msgid "" "This feature will raise Z gradually while printing a single-walled object in " "order to remove any visible seam. This option requires a single perimeter, " @@ -8306,18 +8302,18 @@ msgid "" "when printing more than an object." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1813 +#: src/libslic3r/PrintConfig.cpp:1803 msgid "Temperature variation" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1814 +#: src/libslic3r/PrintConfig.cpp:1804 msgid "" "Temperature difference to be applied when an extruder is not active. Enables " "a full-height \"sacrificial\" skirt on which the nozzles are periodically " "wiped." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1824 +#: src/libslic3r/PrintConfig.cpp:1814 msgid "" "This start procedure is inserted at the beginning, after bed has reached the " "target temperature and extruder just started heating, and before extruder " @@ -8328,7 +8324,7 @@ msgid "" "put a \"M109 S[first_layer_temperature]\" command wherever you want." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1839 +#: src/libslic3r/PrintConfig.cpp:1829 msgid "" "This start procedure is inserted at the beginning, after any printer start " "gcode (and after any toolchange to this filament in case of multi-material " @@ -8341,29 +8337,29 @@ msgid "" "extruders, the gcode is processed in extruder order." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1855 +#: src/libslic3r/PrintConfig.cpp:1845 msgid "Single Extruder Multi Material" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1856 +#: src/libslic3r/PrintConfig.cpp:1846 msgid "The printer multiplexes filaments into a single hot end." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1861 +#: src/libslic3r/PrintConfig.cpp:1851 msgid "Prime all printing extruders" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1862 +#: src/libslic3r/PrintConfig.cpp:1852 msgid "" "If enabled, all printing extruders will be primed at the front edge of the " "print bed at the start of the print." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1867 +#: src/libslic3r/PrintConfig.cpp:1857 msgid "No sparse layers (EXPERIMENTAL)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1868 +#: src/libslic3r/PrintConfig.cpp:1858 msgid "" "If enabled, the wipe tower will not be printed on layers with no " "toolchanges. On layers with a toolchange, extruder will travel downward to " @@ -8371,75 +8367,75 @@ msgid "" "with the print." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1875 +#: src/libslic3r/PrintConfig.cpp:1865 msgid "Generate support material" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1877 +#: src/libslic3r/PrintConfig.cpp:1867 msgid "Enable support material generation." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1881 +#: src/libslic3r/PrintConfig.cpp:1871 msgid "Auto generated supports" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1883 +#: src/libslic3r/PrintConfig.cpp:1873 msgid "" "If checked, supports will be generated automatically based on the overhang " "threshold value. If unchecked, supports will be generated inside the " "\"Support Enforcer\" volumes only." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1889 +#: src/libslic3r/PrintConfig.cpp:1879 msgid "XY separation between an object and its support" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1891 +#: src/libslic3r/PrintConfig.cpp:1881 msgid "" "XY separation between an object and its support. If expressed as percentage " "(for example 50%), it will be calculated over external perimeter width." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1901 +#: src/libslic3r/PrintConfig.cpp:1891 msgid "Pattern angle" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1903 +#: src/libslic3r/PrintConfig.cpp:1893 msgid "" "Use this setting to rotate the support material pattern on the horizontal " "plane." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1913 src/libslic3r/PrintConfig.cpp:2677 +#: src/libslic3r/PrintConfig.cpp:1903 src/libslic3r/PrintConfig.cpp:2667 msgid "" "Only create support if it lies on a build plate. Don't create support on a " "print." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1919 +#: src/libslic3r/PrintConfig.cpp:1909 msgid "Contact Z distance" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1921 +#: src/libslic3r/PrintConfig.cpp:1911 msgid "" "The vertical distance between object and support material interface. Setting " "this to 0 will also prevent Slic3r from using bridge flow and speed for the " "first object layer." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1928 +#: src/libslic3r/PrintConfig.cpp:1918 msgid "0 (soluble)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1929 +#: src/libslic3r/PrintConfig.cpp:1919 msgid "0.2 (detachable)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1934 +#: src/libslic3r/PrintConfig.cpp:1924 msgid "Enforce support for the first" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1936 +#: src/libslic3r/PrintConfig.cpp:1926 msgid "" "Generate support material for the specified number of layers counting from " "bottom, regardless of whether normal support material is enabled or not and " @@ -8447,21 +8443,21 @@ msgid "" "of objects having a very thin or poor footprint on the build plate." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1941 +#: src/libslic3r/PrintConfig.cpp:1931 msgid "Enforce support for the first n layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1947 +#: src/libslic3r/PrintConfig.cpp:1937 msgid "Support material/raft/skirt extruder" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1949 +#: src/libslic3r/PrintConfig.cpp:1939 msgid "" "The extruder to use when printing support material, raft and skirt (1+, 0 to " "use the current extruder to minimize tool changes)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1958 +#: src/libslic3r/PrintConfig.cpp:1948 msgid "" "Set this to a non-zero value to set a manual extrusion width for support " "material. If left zero, default extrusion width will be used if set, " @@ -8469,89 +8465,89 @@ msgid "" "example 90%) it will be computed over layer height." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1967 +#: src/libslic3r/PrintConfig.cpp:1957 msgid "Interface loops" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1969 +#: src/libslic3r/PrintConfig.cpp:1959 msgid "" "Cover the top contact layer of the supports with loops. Disabled by default." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1974 +#: src/libslic3r/PrintConfig.cpp:1964 msgid "Support material/raft interface extruder" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1976 +#: src/libslic3r/PrintConfig.cpp:1966 msgid "" "The extruder to use when printing support material interface (1+, 0 to use " "the current extruder to minimize tool changes). This affects raft too." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1983 +#: src/libslic3r/PrintConfig.cpp:1973 msgid "Interface layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1985 +#: src/libslic3r/PrintConfig.cpp:1975 msgid "" "Number of interface layers to insert between the object(s) and support " "material." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1992 +#: src/libslic3r/PrintConfig.cpp:1982 msgid "Interface pattern spacing" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1994 +#: src/libslic3r/PrintConfig.cpp:1984 msgid "Spacing between interface lines. Set zero to get a solid interface." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2003 +#: src/libslic3r/PrintConfig.cpp:1993 msgid "" "Speed for printing support material interface layers. If expressed as " "percentage (for example 50%) it will be calculated over support material " "speed." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2012 +#: src/libslic3r/PrintConfig.cpp:2002 msgid "Pattern" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2014 +#: src/libslic3r/PrintConfig.cpp:2004 msgid "Pattern used to generate support material." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2020 +#: src/libslic3r/PrintConfig.cpp:2010 msgid "Rectilinear grid" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2026 +#: src/libslic3r/PrintConfig.cpp:2016 msgid "Pattern spacing" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2028 +#: src/libslic3r/PrintConfig.cpp:2018 msgid "Spacing between support material lines." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2037 +#: src/libslic3r/PrintConfig.cpp:2027 msgid "Speed for printing support material." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2044 +#: src/libslic3r/PrintConfig.cpp:2034 msgid "Synchronize with object layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2046 +#: src/libslic3r/PrintConfig.cpp:2036 msgid "" "Synchronize support layers with the object print layers. This is useful with " "multi-material printers, where the extruder switch is expensive." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2052 +#: src/libslic3r/PrintConfig.cpp:2042 msgid "Overhang threshold" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2054 +#: src/libslic3r/PrintConfig.cpp:2044 msgid "" "Support material will not be generated for overhangs whose slope angle (90° " "= vertical) is above the given threshold. In other words, this value " @@ -8560,43 +8556,43 @@ msgid "" "detection (recommended)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2066 +#: src/libslic3r/PrintConfig.cpp:2056 msgid "With sheath around the support" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2068 +#: src/libslic3r/PrintConfig.cpp:2058 msgid "" "Add a sheath (a single perimeter line) around the base support. This makes " "the support more reliable, but also more difficult to remove." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2075 +#: src/libslic3r/PrintConfig.cpp:2065 msgid "" "Extruder temperature for layers after the first one. Set this to zero to " "disable temperature control commands in the output." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2083 +#: src/libslic3r/PrintConfig.cpp:2073 msgid "Detect thin walls" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2085 +#: src/libslic3r/PrintConfig.cpp:2075 msgid "" "Detect single-width walls (parts where two extrusions don't fit and we need " "to collapse them into a single trace)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2091 +#: src/libslic3r/PrintConfig.cpp:2081 msgid "Threads" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2092 +#: src/libslic3r/PrintConfig.cpp:2082 msgid "" "Threads are used to parallelize long-running tasks. Optimal threads number " "is slightly above the number of available cores/processors." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2104 +#: src/libslic3r/PrintConfig.cpp:2094 msgid "" "This custom code is inserted before every toolchange. Placeholder variables " "for all PrusaSlicer settings as well as {previous_extruder} and " @@ -8606,7 +8602,7 @@ msgid "" "behaviour both before and after the toolchange." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2117 +#: src/libslic3r/PrintConfig.cpp:2107 msgid "" "Set this to a non-zero value to set a manual extrusion width for infill for " "top surfaces. You may want to use thinner extrudates to fill all narrow " @@ -8615,7 +8611,7 @@ msgid "" "percentage (for example 90%) it will be computed over layer height." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2129 +#: src/libslic3r/PrintConfig.cpp:2119 msgid "" "Speed for printing top solid layers (it only applies to the uppermost " "external layers and not to their internal solid layers). You may want to " @@ -8624,54 +8620,54 @@ msgid "" "for auto." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2144 +#: src/libslic3r/PrintConfig.cpp:2134 msgid "Number of solid layers to generate on top surfaces." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2145 +#: src/libslic3r/PrintConfig.cpp:2135 msgid "Top solid layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2153 +#: src/libslic3r/PrintConfig.cpp:2143 msgid "" "The number of top solid layers is increased above top_solid_layers if " "necessary to satisfy minimum thickness of top shell. This is useful to " "prevent pillowing effect when printing with variable layer height." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2156 +#: src/libslic3r/PrintConfig.cpp:2146 msgid "Minimum top shell thickness" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2163 +#: src/libslic3r/PrintConfig.cpp:2153 msgid "Speed for travel moves (jumps between distant extrusion points)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2171 +#: src/libslic3r/PrintConfig.cpp:2161 msgid "Use firmware retraction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2172 +#: src/libslic3r/PrintConfig.cpp:2162 msgid "" "This experimental setting uses G10 and G11 commands to have the firmware " "handle the retraction. This is only supported in recent Marlin." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2178 +#: src/libslic3r/PrintConfig.cpp:2168 msgid "Use relative E distances" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2179 +#: src/libslic3r/PrintConfig.cpp:2169 msgid "" "If your firmware requires relative E values, check this, otherwise leave it " "unchecked. Most firmwares use absolute values." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2185 +#: src/libslic3r/PrintConfig.cpp:2175 msgid "Use volumetric E" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2186 +#: src/libslic3r/PrintConfig.cpp:2176 msgid "" "This experimental setting uses outputs the E values in cubic millimeters " "instead of linear millimeters. If your firmware doesn't already know " @@ -8681,127 +8677,127 @@ msgid "" "only supported in recent Marlin." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2196 +#: src/libslic3r/PrintConfig.cpp:2186 msgid "Enable variable layer height feature" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2197 +#: src/libslic3r/PrintConfig.cpp:2187 msgid "" "Some printers or printer setups may have difficulties printing with a " "variable layer height. Enabled by default." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2203 +#: src/libslic3r/PrintConfig.cpp:2193 msgid "Wipe while retracting" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2204 +#: src/libslic3r/PrintConfig.cpp:2194 msgid "" "This flag will move the nozzle while retracting to minimize the possible " "blob on leaky extruders." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2211 +#: src/libslic3r/PrintConfig.cpp:2201 msgid "" "Multi material printers may need to prime or purge extruders on tool " "changes. Extrude the excess material into the wipe tower." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2217 +#: src/libslic3r/PrintConfig.cpp:2207 msgid "Purging volumes - load/unload volumes" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2218 +#: src/libslic3r/PrintConfig.cpp:2208 msgid "" "This vector saves required volumes to change from/to each tool used on the " "wipe tower. These values are used to simplify creation of the full purging " "volumes below." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2224 +#: src/libslic3r/PrintConfig.cpp:2214 msgid "Purging volumes - matrix" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2225 +#: src/libslic3r/PrintConfig.cpp:2215 msgid "" "This matrix describes volumes (in cubic milimetres) required to purge the " "new filament on the wipe tower for any given pair of tools." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2234 +#: src/libslic3r/PrintConfig.cpp:2224 msgid "Position X" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2235 +#: src/libslic3r/PrintConfig.cpp:2225 msgid "X coordinate of the left front corner of a wipe tower" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2241 +#: src/libslic3r/PrintConfig.cpp:2231 msgid "Position Y" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2242 +#: src/libslic3r/PrintConfig.cpp:2232 msgid "Y coordinate of the left front corner of a wipe tower" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2249 +#: src/libslic3r/PrintConfig.cpp:2239 msgid "Width of a wipe tower" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2255 +#: src/libslic3r/PrintConfig.cpp:2245 msgid "Wipe tower rotation angle" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2256 +#: src/libslic3r/PrintConfig.cpp:2246 msgid "Wipe tower rotation angle with respect to x-axis." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2263 +#: src/libslic3r/PrintConfig.cpp:2253 msgid "Wipe into this object's infill" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2264 +#: src/libslic3r/PrintConfig.cpp:2254 msgid "" "Purging after toolchange will done inside this object's infills. This lowers " "the amount of waste but may result in longer print time due to additional " "travel moves." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2271 +#: src/libslic3r/PrintConfig.cpp:2261 msgid "Wipe into this object" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2272 +#: src/libslic3r/PrintConfig.cpp:2262 msgid "" "Object will be used to purge the nozzle after a toolchange to save material " "that would otherwise end up in the wipe tower and decrease print time. " "Colours of the objects will be mixed as a result." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2278 +#: src/libslic3r/PrintConfig.cpp:2268 msgid "Maximal bridging distance" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2279 +#: src/libslic3r/PrintConfig.cpp:2269 msgid "Maximal distance between supports on sparse infill sections." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2285 +#: src/libslic3r/PrintConfig.cpp:2275 msgid "XY Size Compensation" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2287 +#: src/libslic3r/PrintConfig.cpp:2277 msgid "" "The object will be grown/shrunk in the XY plane by the configured value " "(negative = inwards, positive = outwards). This might be useful for fine-" "tuning hole sizes." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2295 +#: src/libslic3r/PrintConfig.cpp:2285 msgid "Z offset" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2296 +#: src/libslic3r/PrintConfig.cpp:2286 msgid "" "This value will be added (or subtracted) from all the Z coordinates in the " "output G-code. It is used to compensate for bad Z endstop position: for " @@ -8809,389 +8805,389 @@ msgid "" "print bed, set this to -0.3 (or fix your endstop)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2363 +#: src/libslic3r/PrintConfig.cpp:2353 msgid "Display width" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2364 +#: src/libslic3r/PrintConfig.cpp:2354 msgid "Width of the display" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2369 +#: src/libslic3r/PrintConfig.cpp:2359 msgid "Display height" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2370 +#: src/libslic3r/PrintConfig.cpp:2360 msgid "Height of the display" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2375 +#: src/libslic3r/PrintConfig.cpp:2365 msgid "Number of pixels in" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2377 +#: src/libslic3r/PrintConfig.cpp:2367 msgid "Number of pixels in X" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2383 +#: src/libslic3r/PrintConfig.cpp:2373 msgid "Number of pixels in Y" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2388 +#: src/libslic3r/PrintConfig.cpp:2378 msgid "Display horizontal mirroring" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2389 +#: src/libslic3r/PrintConfig.cpp:2379 msgid "Mirror horizontally" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2390 +#: src/libslic3r/PrintConfig.cpp:2380 msgid "Enable horizontal mirroring of output images" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2395 +#: src/libslic3r/PrintConfig.cpp:2385 msgid "Display vertical mirroring" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2396 +#: src/libslic3r/PrintConfig.cpp:2386 msgid "Mirror vertically" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2397 +#: src/libslic3r/PrintConfig.cpp:2387 msgid "Enable vertical mirroring of output images" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2402 +#: src/libslic3r/PrintConfig.cpp:2392 msgid "Display orientation" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2403 +#: src/libslic3r/PrintConfig.cpp:2393 msgid "" "Set the actual LCD display orientation inside the SLA printer. Portrait mode " "will flip the meaning of display width and height parameters and the output " "images will be rotated by 90 degrees." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2409 +#: src/libslic3r/PrintConfig.cpp:2399 msgid "Landscape" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2410 +#: src/libslic3r/PrintConfig.cpp:2400 msgid "Portrait" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2415 +#: src/libslic3r/PrintConfig.cpp:2405 msgid "Fast" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2416 +#: src/libslic3r/PrintConfig.cpp:2406 msgid "Fast tilt" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2417 +#: src/libslic3r/PrintConfig.cpp:2407 msgid "Time of the fast tilt" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2424 +#: src/libslic3r/PrintConfig.cpp:2414 msgid "Slow" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2425 +#: src/libslic3r/PrintConfig.cpp:2415 msgid "Slow tilt" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2426 +#: src/libslic3r/PrintConfig.cpp:2416 msgid "Time of the slow tilt" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2433 +#: src/libslic3r/PrintConfig.cpp:2423 msgid "Area fill" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2434 +#: src/libslic3r/PrintConfig.cpp:2424 msgid "" "The percentage of the bed area. \n" "If the print area exceeds the specified value, \n" "then a slow tilt will be used, otherwise - a fast tilt" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2441 src/libslic3r/PrintConfig.cpp:2442 -#: src/libslic3r/PrintConfig.cpp:2443 +#: src/libslic3r/PrintConfig.cpp:2431 src/libslic3r/PrintConfig.cpp:2432 +#: src/libslic3r/PrintConfig.cpp:2433 msgid "Printer scaling correction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2449 src/libslic3r/PrintConfig.cpp:2450 +#: src/libslic3r/PrintConfig.cpp:2439 src/libslic3r/PrintConfig.cpp:2440 msgid "Printer absolute correction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2451 +#: src/libslic3r/PrintConfig.cpp:2441 msgid "" "Will inflate or deflate the sliced 2D polygons according to the sign of the " "correction." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2457 src/libslic3r/PrintConfig.cpp:2458 +#: src/libslic3r/PrintConfig.cpp:2447 src/libslic3r/PrintConfig.cpp:2448 msgid "Printer gamma correction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2459 +#: src/libslic3r/PrintConfig.cpp:2449 msgid "" "This will apply a gamma correction to the rasterized 2D polygons. A gamma " "value of zero means thresholding with the threshold in the middle. This " "behaviour eliminates antialiasing without losing holes in polygons." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2471 src/libslic3r/PrintConfig.cpp:2472 +#: src/libslic3r/PrintConfig.cpp:2461 src/libslic3r/PrintConfig.cpp:2462 msgid "SLA material type" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2483 src/libslic3r/PrintConfig.cpp:2484 +#: src/libslic3r/PrintConfig.cpp:2473 src/libslic3r/PrintConfig.cpp:2474 msgid "Initial layer height" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2490 src/libslic3r/PrintConfig.cpp:2491 +#: src/libslic3r/PrintConfig.cpp:2480 src/libslic3r/PrintConfig.cpp:2481 msgid "Bottle volume" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2492 +#: src/libslic3r/PrintConfig.cpp:2482 msgid "ml" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2497 src/libslic3r/PrintConfig.cpp:2498 +#: src/libslic3r/PrintConfig.cpp:2487 src/libslic3r/PrintConfig.cpp:2488 msgid "Bottle weight" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2499 +#: src/libslic3r/PrintConfig.cpp:2489 msgid "kg" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2506 +#: src/libslic3r/PrintConfig.cpp:2496 msgid "g/ml" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2513 +#: src/libslic3r/PrintConfig.cpp:2503 msgid "money/bottle" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2518 +#: src/libslic3r/PrintConfig.cpp:2508 msgid "Faded layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2519 +#: src/libslic3r/PrintConfig.cpp:2509 msgid "" "Number of the layers needed for the exposure time fade from initial exposure " "time to the exposure time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2526 src/libslic3r/PrintConfig.cpp:2527 +#: src/libslic3r/PrintConfig.cpp:2516 src/libslic3r/PrintConfig.cpp:2517 msgid "Minimum exposure time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2534 src/libslic3r/PrintConfig.cpp:2535 +#: src/libslic3r/PrintConfig.cpp:2524 src/libslic3r/PrintConfig.cpp:2525 msgid "Maximum exposure time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2542 src/libslic3r/PrintConfig.cpp:2543 +#: src/libslic3r/PrintConfig.cpp:2532 src/libslic3r/PrintConfig.cpp:2533 msgid "Exposure time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2549 src/libslic3r/PrintConfig.cpp:2550 +#: src/libslic3r/PrintConfig.cpp:2539 src/libslic3r/PrintConfig.cpp:2540 msgid "Minimum initial exposure time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2557 src/libslic3r/PrintConfig.cpp:2558 +#: src/libslic3r/PrintConfig.cpp:2547 src/libslic3r/PrintConfig.cpp:2548 msgid "Maximum initial exposure time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2565 src/libslic3r/PrintConfig.cpp:2566 +#: src/libslic3r/PrintConfig.cpp:2555 src/libslic3r/PrintConfig.cpp:2556 msgid "Initial exposure time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2572 src/libslic3r/PrintConfig.cpp:2573 +#: src/libslic3r/PrintConfig.cpp:2562 src/libslic3r/PrintConfig.cpp:2563 msgid "Correction for expansion" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2579 +#: src/libslic3r/PrintConfig.cpp:2569 msgid "SLA print material notes" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2580 +#: src/libslic3r/PrintConfig.cpp:2570 msgid "You can put your notes regarding the SLA print material here." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2592 src/libslic3r/PrintConfig.cpp:2603 +#: src/libslic3r/PrintConfig.cpp:2582 src/libslic3r/PrintConfig.cpp:2593 msgid "Default SLA material profile" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2614 +#: src/libslic3r/PrintConfig.cpp:2604 msgid "Generate supports" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2616 +#: src/libslic3r/PrintConfig.cpp:2606 msgid "Generate supports for the models" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2621 +#: src/libslic3r/PrintConfig.cpp:2611 msgid "Support head front diameter" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2623 +#: src/libslic3r/PrintConfig.cpp:2613 msgid "Diameter of the pointing side of the head" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2630 +#: src/libslic3r/PrintConfig.cpp:2620 msgid "Support head penetration" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2632 +#: src/libslic3r/PrintConfig.cpp:2622 msgid "How much the pinhead has to penetrate the model surface" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2639 +#: src/libslic3r/PrintConfig.cpp:2629 msgid "Support head width" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2641 +#: src/libslic3r/PrintConfig.cpp:2631 msgid "Width from the back sphere center to the front sphere center" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2649 +#: src/libslic3r/PrintConfig.cpp:2639 msgid "Support pillar diameter" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2651 +#: src/libslic3r/PrintConfig.cpp:2641 msgid "Diameter in mm of the support pillars" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2659 +#: src/libslic3r/PrintConfig.cpp:2649 msgid "Support pillar connection mode" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2660 +#: src/libslic3r/PrintConfig.cpp:2650 msgid "" "Controls the bridge type between two neighboring pillars. Can be zig-zag, " "cross (double zig-zag) or dynamic which will automatically switch between " "the first two depending on the distance of the two pillars." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2668 +#: src/libslic3r/PrintConfig.cpp:2658 msgid "Zig-Zag" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2669 +#: src/libslic3r/PrintConfig.cpp:2659 msgid "Cross" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2670 +#: src/libslic3r/PrintConfig.cpp:2660 msgid "Dynamic" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2682 +#: src/libslic3r/PrintConfig.cpp:2672 msgid "Pillar widening factor" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2684 +#: src/libslic3r/PrintConfig.cpp:2674 msgid "" "Merging bridges or pillars into another pillars can increase the radius. " "Zero means no increase, one means full increase." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2693 +#: src/libslic3r/PrintConfig.cpp:2683 msgid "Support base diameter" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2695 +#: src/libslic3r/PrintConfig.cpp:2685 msgid "Diameter in mm of the pillar base" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2703 +#: src/libslic3r/PrintConfig.cpp:2693 msgid "Support base height" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2705 +#: src/libslic3r/PrintConfig.cpp:2695 msgid "The height of the pillar base cone" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2712 +#: src/libslic3r/PrintConfig.cpp:2702 msgid "Support base safety distance" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2715 +#: src/libslic3r/PrintConfig.cpp:2705 msgid "" "The minimum distance of the pillar base from the model in mm. Makes sense in " "zero elevation mode where a gap according to this parameter is inserted " "between the model and the pad." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2725 +#: src/libslic3r/PrintConfig.cpp:2715 msgid "Critical angle" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2727 +#: src/libslic3r/PrintConfig.cpp:2717 msgid "The default angle for connecting support sticks and junctions." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2735 +#: src/libslic3r/PrintConfig.cpp:2725 msgid "Max bridge length" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2737 +#: src/libslic3r/PrintConfig.cpp:2727 msgid "The max length of a bridge" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2744 +#: src/libslic3r/PrintConfig.cpp:2734 msgid "Max pillar linking distance" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2746 +#: src/libslic3r/PrintConfig.cpp:2736 msgid "" "The max distance of two pillars to get linked with each other. A zero value " "will prohibit pillar cascading." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2754 +#: src/libslic3r/PrintConfig.cpp:2744 msgid "Object elevation" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2756 +#: src/libslic3r/PrintConfig.cpp:2746 msgid "" "How much the supports should lift up the supported object. If \"Pad around " "object\" is enabled, this value is ignored." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2767 +#: src/libslic3r/PrintConfig.cpp:2757 msgid "This is a relative measure of support points density." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2773 +#: src/libslic3r/PrintConfig.cpp:2763 msgid "Minimal distance of the support points" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2775 +#: src/libslic3r/PrintConfig.cpp:2765 msgid "No support points will be placed closer than this threshold." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2781 +#: src/libslic3r/PrintConfig.cpp:2771 msgid "Use pad" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2783 +#: src/libslic3r/PrintConfig.cpp:2773 msgid "Add a pad underneath the supported model" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2788 +#: src/libslic3r/PrintConfig.cpp:2778 msgid "Pad wall thickness" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2790 +#: src/libslic3r/PrintConfig.cpp:2780 msgid "The thickness of the pad and its optional cavity walls." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2798 +#: src/libslic3r/PrintConfig.cpp:2788 msgid "Pad wall height" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2799 +#: src/libslic3r/PrintConfig.cpp:2789 msgid "" "Defines the pad cavity depth. Set to zero to disable the cavity. Be careful " "when enabling this feature, as some resins may produce an extreme suction " @@ -9199,367 +9195,367 @@ msgid "" "difficult." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2812 +#: src/libslic3r/PrintConfig.cpp:2802 msgid "Pad brim size" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2813 +#: src/libslic3r/PrintConfig.cpp:2803 msgid "How far should the pad extend around the contained geometry" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2823 +#: src/libslic3r/PrintConfig.cpp:2813 msgid "Max merge distance" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2825 +#: src/libslic3r/PrintConfig.cpp:2815 msgid "" "Some objects can get along with a few smaller pads instead of a single big " "one. This parameter defines how far the center of two smaller pads should " "be. If theyare closer, they will get merged into one pad." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2845 +#: src/libslic3r/PrintConfig.cpp:2835 msgid "Pad wall slope" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2847 +#: src/libslic3r/PrintConfig.cpp:2837 msgid "" "The slope of the pad wall relative to the bed plane. 90 degrees means " "straight walls." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2856 +#: src/libslic3r/PrintConfig.cpp:2846 msgid "Pad around object" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2858 +#: src/libslic3r/PrintConfig.cpp:2848 msgid "Create pad around object and ignore the support elevation" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2863 +#: src/libslic3r/PrintConfig.cpp:2853 msgid "Pad around object everywhere" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2865 +#: src/libslic3r/PrintConfig.cpp:2855 msgid "Force pad around object everywhere" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2870 +#: src/libslic3r/PrintConfig.cpp:2860 msgid "Pad object gap" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2872 +#: src/libslic3r/PrintConfig.cpp:2862 msgid "" "The gap between the object bottom and the generated pad in zero elevation " "mode." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2881 +#: src/libslic3r/PrintConfig.cpp:2871 msgid "Pad object connector stride" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2883 +#: src/libslic3r/PrintConfig.cpp:2873 msgid "" "Distance between two connector sticks which connect the object and the " "generated pad." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2890 +#: src/libslic3r/PrintConfig.cpp:2880 msgid "Pad object connector width" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2892 +#: src/libslic3r/PrintConfig.cpp:2882 msgid "" "Width of the connector sticks which connect the object and the generated pad." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2899 +#: src/libslic3r/PrintConfig.cpp:2889 msgid "Pad object connector penetration" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2902 +#: src/libslic3r/PrintConfig.cpp:2892 msgid "How much should the tiny connectors penetrate into the model body." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2909 +#: src/libslic3r/PrintConfig.cpp:2899 msgid "Enable hollowing" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2911 +#: src/libslic3r/PrintConfig.cpp:2901 msgid "Hollow out a model to have an empty interior" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2916 +#: src/libslic3r/PrintConfig.cpp:2906 msgid "Hollowing thickness" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2918 +#: src/libslic3r/PrintConfig.cpp:2908 msgid "Minimum wall thickness of a hollowed model." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2926 +#: src/libslic3r/PrintConfig.cpp:2916 msgid "Hollowing accuracy" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2928 +#: src/libslic3r/PrintConfig.cpp:2918 msgid "" "Performance vs accuracy of calculation. Lower values may produce unwanted " "artifacts." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2935 +#: src/libslic3r/PrintConfig.cpp:2925 msgid "Hollowing closing distance" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3315 +#: src/libslic3r/PrintConfig.cpp:3305 msgid "Export OBJ" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3316 +#: src/libslic3r/PrintConfig.cpp:3306 msgid "Export the model(s) as OBJ." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3327 +#: src/libslic3r/PrintConfig.cpp:3317 msgid "Export SLA" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3328 +#: src/libslic3r/PrintConfig.cpp:3318 msgid "Slice the model and export SLA printing layers as PNG." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3333 +#: src/libslic3r/PrintConfig.cpp:3323 msgid "Export 3MF" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3334 +#: src/libslic3r/PrintConfig.cpp:3324 msgid "Export the model(s) as 3MF." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3338 +#: src/libslic3r/PrintConfig.cpp:3328 msgid "Export AMF" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3339 +#: src/libslic3r/PrintConfig.cpp:3329 msgid "Export the model(s) as AMF." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3343 +#: src/libslic3r/PrintConfig.cpp:3333 msgid "Export STL" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3344 +#: src/libslic3r/PrintConfig.cpp:3334 msgid "Export the model(s) as STL." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3349 +#: src/libslic3r/PrintConfig.cpp:3339 msgid "Slice the model and export toolpaths as G-code." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3354 +#: src/libslic3r/PrintConfig.cpp:3344 msgid "Slice" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3355 +#: src/libslic3r/PrintConfig.cpp:3345 msgid "" "Slice the model as FFF or SLA based on the printer_technology configuration " "value." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3360 +#: src/libslic3r/PrintConfig.cpp:3350 msgid "Help" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3361 +#: src/libslic3r/PrintConfig.cpp:3351 msgid "Show this help." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3366 +#: src/libslic3r/PrintConfig.cpp:3356 msgid "Help (FFF options)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3367 +#: src/libslic3r/PrintConfig.cpp:3357 msgid "Show the full list of print/G-code configuration options." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3371 +#: src/libslic3r/PrintConfig.cpp:3361 msgid "Help (SLA options)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3372 +#: src/libslic3r/PrintConfig.cpp:3362 msgid "Show the full list of SLA print configuration options." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3376 +#: src/libslic3r/PrintConfig.cpp:3366 msgid "Output Model Info" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3377 +#: src/libslic3r/PrintConfig.cpp:3367 msgid "Write information about the model to the console." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3381 +#: src/libslic3r/PrintConfig.cpp:3371 msgid "Save config file" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3382 +#: src/libslic3r/PrintConfig.cpp:3372 msgid "Save configuration to the specified file." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3392 +#: src/libslic3r/PrintConfig.cpp:3382 msgid "Align XY" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3393 +#: src/libslic3r/PrintConfig.cpp:3383 msgid "Align the model to the given point." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3398 +#: src/libslic3r/PrintConfig.cpp:3388 msgid "Cut model at the given Z." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3419 +#: src/libslic3r/PrintConfig.cpp:3409 msgid "Center" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3420 +#: src/libslic3r/PrintConfig.cpp:3410 msgid "Center the print around the given center." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3424 +#: src/libslic3r/PrintConfig.cpp:3414 msgid "Don't arrange" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3425 +#: src/libslic3r/PrintConfig.cpp:3415 msgid "" "Do not rearrange the given models before merging and keep their original XY " "coordinates." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3428 +#: src/libslic3r/PrintConfig.cpp:3418 msgid "Duplicate" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3429 +#: src/libslic3r/PrintConfig.cpp:3419 msgid "Multiply copies by this factor." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3433 +#: src/libslic3r/PrintConfig.cpp:3423 msgid "Duplicate by grid" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3434 +#: src/libslic3r/PrintConfig.cpp:3424 msgid "Multiply copies by creating a grid." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3437 +#: src/libslic3r/PrintConfig.cpp:3427 msgid "Merge" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3438 +#: src/libslic3r/PrintConfig.cpp:3428 msgid "" "Arrange the supplied models in a plate and merge them in a single model in " "order to perform actions once." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3443 +#: src/libslic3r/PrintConfig.cpp:3433 msgid "" "Try to repair any non-manifold meshes (this option is implicitly added " "whenever we need to slice the model to perform the requested action)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3447 +#: src/libslic3r/PrintConfig.cpp:3437 msgid "Rotation angle around the Z axis in degrees." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3451 +#: src/libslic3r/PrintConfig.cpp:3441 msgid "Rotate around X" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3452 +#: src/libslic3r/PrintConfig.cpp:3442 msgid "Rotation angle around the X axis in degrees." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3456 +#: src/libslic3r/PrintConfig.cpp:3446 msgid "Rotate around Y" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3457 +#: src/libslic3r/PrintConfig.cpp:3447 msgid "Rotation angle around the Y axis in degrees." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3462 +#: src/libslic3r/PrintConfig.cpp:3452 msgid "Scaling factor or percentage." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3467 +#: src/libslic3r/PrintConfig.cpp:3457 msgid "" "Detect unconnected parts in the given model(s) and split them into separate " "objects." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3470 +#: src/libslic3r/PrintConfig.cpp:3460 msgid "Scale to Fit" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3471 +#: src/libslic3r/PrintConfig.cpp:3461 msgid "Scale to fit the given volume." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3480 +#: src/libslic3r/PrintConfig.cpp:3470 msgid "Ignore non-existent config files" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3481 +#: src/libslic3r/PrintConfig.cpp:3471 msgid "Do not fail if a file supplied to --load does not exist." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3484 +#: src/libslic3r/PrintConfig.cpp:3474 msgid "Load config file" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3485 +#: src/libslic3r/PrintConfig.cpp:3475 msgid "" "Load configuration from the specified file. It can be used more than once to " "load options from multiple files." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3488 +#: src/libslic3r/PrintConfig.cpp:3478 msgid "Output File" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3489 +#: src/libslic3r/PrintConfig.cpp:3479 msgid "" "The file where the output will be written (if not specified, it will be " "based on the input file)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3499 +#: src/libslic3r/PrintConfig.cpp:3489 msgid "Data directory" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3500 +#: src/libslic3r/PrintConfig.cpp:3490 msgid "" "Load and store settings at the given directory. This is useful for " "maintaining different profiles or including configurations from a network " "storage." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3503 +#: src/libslic3r/PrintConfig.cpp:3493 msgid "Logging level" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3504 +#: src/libslic3r/PrintConfig.cpp:3494 msgid "" "Sets logging sensitivity. 0:fatal, 1:error, 2:warning, 3:info, 4:debug, 5:" "trace\n" "For example. loglevel=2 logs fatal, error and warning level messages." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3510 +#: src/libslic3r/PrintConfig.cpp:3500 msgid "Render with a software renderer" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3511 +#: src/libslic3r/PrintConfig.cpp:3501 msgid "" "Render with a software renderer. The bundled MESA software renderer is " "loaded instead of the default OpenGL driver." diff --git a/src/slic3r/GUI/DoubleSlider.cpp b/src/slic3r/GUI/DoubleSlider.cpp index 1165f901e7..a462b88947 100644 --- a/src/slic3r/GUI/DoubleSlider.cpp +++ b/src/slic3r/GUI/DoubleSlider.cpp @@ -76,7 +76,7 @@ Control::Control( wxWindow *parent, m_cog_icon_dim = m_bmp_cog.GetBmpWidth(); m_selection = ssUndef; - m_ticks.set_pause_print_msg(_utf8(L("Place bearings in slots and resume"))); + m_ticks.set_pause_print_msg(_utf8(L("Place bearings in slots and resume printing"))); // slider events this->Bind(wxEVT_PAINT, &Control::OnPaint, this); @@ -924,13 +924,13 @@ wxString Control::get_tooltip(int tick/*=-1*/) if (m_focus == fiRevertIcon) return _(L("Discard all custom changes")); if (m_focus == fiCogIcon) - return m_mode == t_mode::MultiAsSingle ? - _(L("For jump to print Z use left mouse button click OR (Shift+G)")) + "\n" + - _(L("For set extruder sequence for whole print use right mouse button click")) : - _(L("Jump to print Z")) + " (Shift+G)"; + return m_mode == t_mode::MultiAsSingle ? + wxString::Format(_(L("Jump to height %s or " + "Set extruder sequence for the entire print")), " (Shift + G)\n") : + _(L("Jump to height")) + " (Shift + G)"; if (m_focus == fiColorBand) return m_mode != t_mode::SingleExtruder ? "" : - _(L("For edit current color use right mouse button click on colored band")); + _(L("Edit current color - Right click the colored slider segment")); wxString tooltip; const auto tick_code_it = m_ticks.ticks.find(TickCode{tick}); @@ -938,7 +938,7 @@ wxString Control::get_tooltip(int tick/*=-1*/) if (tick_code_it == m_ticks.ticks.end() && m_focus == fiActionIcon) // tick doesn't exist { // Show mode as a first string of tooltop - tooltip = " " + _(L("Slider(print) mode")) + ": "; + tooltip = " " + _(L("Print mode")) + ": "; tooltip += (m_mode == t_mode::SingleExtruder ? CustomGCode::SingleExtruderMode : m_mode == t_mode::MultiAsSingle ? CustomGCode::MultiAsSingleMode : CustomGCode::MultiExtruderMode ); @@ -952,16 +952,15 @@ wxString Control::get_tooltip(int tick/*=-1*/) // Show list of actions with new tick tooltip += ( m_mode == t_mode::MultiAsSingle ? - _(L("For add change extruder use left mouse button click")) : + _(L("Add extruder change - Left click")) : m_mode == t_mode::SingleExtruder ? - _(L("For add color change use left mouse button click " - "if you want to use colors from default color list, " - "or Shift + left mouse button click if you want to select a color")) : - _(L("For add color change use left mouse button click")) ) + " " + - _(L("OR pres \"+\" key")) + "\n" + ( + _(L("Add color change - Left click for predefined color or" + "Shift + Left click for custom color selection")) : + _(L("Add color change - Left click")) ) + " " + + _(L("or press \"+\" key")) + "\n" + ( is_osx ? - _(L("For add another code use Ctrl + left mouse button click")) : - _(L("For add another code use right mouse button click")) ); + _(L("Add another code - Ctrl + Left click")) : + _(L("Add another code - Right click")) ); } if (tick_code_it != m_ticks.ticks.end()) // tick exists @@ -976,7 +975,7 @@ wxString Control::get_tooltip(int tick/*=-1*/) tick_code_it->gcode == PausePrintCode ? from_u8((boost::format(_utf8(L("Pause print (\"%1%\")"))) % tick_code_it->gcode ).str()) : tick_code_it->gcode == ToolChangeCode ? - from_u8((boost::format(_utf8(L("Extruder(tool) is changed to Extruder \"%1%\""))) % tick_code_it->extruder ).str()) : + from_u8((boost::format(_utf8(L("Extruder (tool) is changed to Extruder \"%1%\""))) % tick_code_it->extruder ).str()) : from_u8((boost::format(_utf8(L("\"%1%\""))) % tick_code_it->gcode ).str()) ; // If tick is marked as a conflict (exclamation icon), @@ -985,24 +984,24 @@ wxString Control::get_tooltip(int tick/*=-1*/) if (conflict != ctNone) tooltip += "\n\n" + _(L("Note")) + "! "; if (conflict == ctModeConflict) - tooltip += _(L("G-code of this tick has a conflict with slider(print) mode.\n" - "Any its editing will cause a changes of DoubleSlider data.")); + tooltip += _(L("G-code associated to this tick mark is in a conflict with print mode.\n" + "Editing it will cause changes of Slider data.")); else if (conflict == ctMeaninglessColorChange) - tooltip += _(L("There is a color change for extruder that wouldn't be used till the end of printing.\n" - "This code wouldn't be processed during GCode generation.")); + tooltip += _(L("There is a color change for extruder that won't be used till the end of print job.\n" + "This code won't be processed during G-code generation.")); else if (conflict == ctMeaninglessToolChange) - tooltip += _(L("There is a extruder change to the same extruder.\n" - "This code wouldn't be processed during GCode generation.")); + tooltip += _(L("There is an extruder change set to the same extruder.\n" + "This code won't be processed during G-code generation.")); else if (conflict == ctRedundant) tooltip += _(L("There is a color change for extruder that has not been used before.\n" - "Check your choice to avoid redundant color changes.")); + "Check your settings to avoid redundant color changes.")); // Show list of actions with existing tick if (m_focus == fiActionIcon) - tooltip += "\n\n" + _(L("For Delete tick use left mouse button click OR pres \"-\" key")) + "\n" + ( + tooltip += "\n\n" + _(L("Delete tick mark - Left click or press \"-\" key")) + "\n" + ( is_osx ? - _(L("For Edit tick use Ctrl + Left mouse button click")) : - _(L("For Edit tick use right mouse button click")) ); + _(L("Edit tick mark - Ctrl + Left click")) : + _(L("Edit tick mark - Right click")) ); } return tooltip; @@ -1499,10 +1498,10 @@ void Control::show_cog_icon_context_menu() { wxMenu menu; - append_menu_item(&menu, wxID_ANY, _(L("Jump to print Z")) + " (Shift+G)", "", + append_menu_item(&menu, wxID_ANY, _(L("Jump to height")) + " (Shift+G)", "", [this](wxCommandEvent&) { jump_to_print_z(); }, "", &menu); - append_menu_item(&menu, wxID_ANY, _(L("Set extruder sequence for whole print")), "", + append_menu_item(&menu, wxID_ANY, _(L("Set extruder sequence for the entire print")), "", [this](wxCommandEvent&) { edit_extruder_sequence(); }, "", &menu); GUI::wxGetApp().plater()->PopupMenu(&menu); @@ -1589,7 +1588,7 @@ static void upgrade_text_entry_dialog(wxTextEntryDialog* dlg, double min = -1.0, static std::string get_custom_code(const std::string& code_in, double height) { wxString msg_text = from_u8(_utf8(L("Enter custom G-code used on current layer"))) + ":"; - wxString msg_header = from_u8((boost::format(_utf8(L("Custom Gcode on current layer (%1% mm)."))) % height).str()); + wxString msg_header = from_u8((boost::format(_utf8(L("Custom G-code on current layer (%1% mm)."))) % height).str()); // get custom gcode wxTextEntryDialog dlg(nullptr, msg_text, msg_header, code_in, @@ -1604,7 +1603,7 @@ static std::string get_custom_code(const std::string& code_in, double height) static std::string get_pause_print_msg(const std::string& msg_in, double height) { - wxString msg_text = from_u8(_utf8(L("Enter short message shown on Printer display during pause print"))) + ":"; + wxString msg_text = from_u8(_utf8(L("Enter short message shown on Printer display when a print is paused"))) + ":"; wxString msg_header = from_u8((boost::format(_utf8(L("Message for pause print on current layer (%1% mm)."))) % height).str()); // get custom gcode @@ -1620,8 +1619,8 @@ static std::string get_pause_print_msg(const std::string& msg_in, double height) static double get_print_z_to_jump(double active_print_z, double min_z, double max_z) { - wxString msg_text = _(L("Enter print z value to jump to")) + " :"; - wxString msg_header = _(L("Jump to print z")); + wxString msg_text = _(L("Enter the height you want to jump to")) + " :"; + wxString msg_header = _(L("Jump to height")); wxString msg_in = GUI::double_to_string(active_print_z); // get custom gcode @@ -1873,7 +1872,7 @@ bool Control::check_ticks_changed_event(const std::string& gcode) _(L("The last color change data was saved for a single extruder printer profile.")) : _(L("The last color change data was saved for a multiple extruder printer profile.")) ) + "\n" + - _(L("Your current changes will cause a deletion of all saved color changes.")) + "\n\n\t" + + _(L("Your current changes will delete all saved color changes.")) + "\n\n\t" + _(L("Are you sure you want to continue?")); wxMessageDialog msg(this, message, _(L("Notice")), wxYES_NO); @@ -1890,11 +1889,11 @@ bool Control::check_ticks_changed_event(const std::string& gcode) _(L("The last color change data was saved for a multi extruder printing.")) + "\n\n" + _(L("Select YES if you want to delete all saved tool changes, \n\t" "NO if you want all tool changes switch to color changes, \n\t" - "or CANCEL for do nothing")) + "\n\n\t" + + "or CANCEL to leave it unchanged")) + "\n\n\t" + _(L("Do you want to delete all saved tool changes?")) ) : ( // t_mode::MultiExtruder _(L("The last color change data was saved for a multi extruder printing with tool changes for whole print.")) + "\n\n" + - _(L("Your current changes will cause a deletion of all saved tool changes.")) + "\n\n\t" + + _(L("Your current changes will delete all saved extruder (tool) changes.")) + "\n\n\t" + _(L("Are you sure you want to continue?")) ) ; wxMessageDialog msg(this, message, _(L("Notice")), wxYES_NO | (m_mode == t_mode::SingleExtruder ? wxCANCEL : 0)); From 00ecafe3d57955bf4bcb70ba6f8d35faf90b54df Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Wed, 12 Feb 2020 14:23:54 +0100 Subject: [PATCH 321/336] #3650 - Fixed extension of exported file when processing models for sla printers from command line --- src/libslic3r/PrintBase.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libslic3r/PrintBase.cpp b/src/libslic3r/PrintBase.cpp index 55e24178de..812e060c6d 100644 --- a/src/libslic3r/PrintBase.cpp +++ b/src/libslic3r/PrintBase.cpp @@ -64,8 +64,8 @@ std::string PrintBase::output_filename(const std::string &format, const std::str boost::filesystem::path filename = format.empty() ? cfg.opt_string("input_filename_base") + default_ext : this->placeholder_parser().process(format, 0, &cfg); - if (filename.extension().empty()) - filename = boost::filesystem::change_extension(filename, default_ext); + if (filename.extension().string() != default_ext) + filename = boost::filesystem::change_extension(filename, default_ext); return filename.string(); } catch (std::runtime_error &err) { throw std::runtime_error(L("Failed processing of the output_filename_format template.") + "\n" + err.what()); From d350d001fc827e877631e53a19eec3221e419659 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Wed, 12 Feb 2020 15:02:22 +0100 Subject: [PATCH 322/336] New keyboard shortcuts dialog -> Bigger default size --- src/slic3r/GUI/KBShortcutsDialog.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/slic3r/GUI/KBShortcutsDialog.cpp b/src/slic3r/GUI/KBShortcutsDialog.cpp index 3c7681d1f8..7d4211b246 100644 --- a/src/slic3r/GUI/KBShortcutsDialog.cpp +++ b/src/slic3r/GUI/KBShortcutsDialog.cpp @@ -260,7 +260,7 @@ wxPanel* KBShortcutsDialog::create_page(wxWindow* parent, const std::pairSetScrollbars(20, 20, 50, 50); - page->SetInitialSize(wxSize(750, 350)); + page->SetInitialSize(wxSize(850, 450)); #else wxPanel* page = new wxPanel(parent); #endif // ENABLE_SCROLLABLE From c55173eba4dfff2ed906c4dc5fcfa191899060e3 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Wed, 12 Feb 2020 15:39:04 +0100 Subject: [PATCH 323/336] Follow-up of 00ecafe3d57955bf4bcb70ba6f8d35faf90b54df -> Fix of #3650 moved into 'SLAPrint::output_filename()' as the previous fix was breaking the export from GUI --- src/libslic3r/PrintBase.cpp | 2 +- src/libslic3r/SLAPrint.cpp | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/libslic3r/PrintBase.cpp b/src/libslic3r/PrintBase.cpp index 812e060c6d..81affe04d4 100644 --- a/src/libslic3r/PrintBase.cpp +++ b/src/libslic3r/PrintBase.cpp @@ -64,7 +64,7 @@ std::string PrintBase::output_filename(const std::string &format, const std::str boost::filesystem::path filename = format.empty() ? cfg.opt_string("input_filename_base") + default_ext : this->placeholder_parser().process(format, 0, &cfg); - if (filename.extension().string() != default_ext) + if (filename.extension().empty()) filename = boost::filesystem::change_extension(filename, default_ext); return filename.string(); } catch (std::runtime_error &err) { diff --git a/src/libslic3r/SLAPrint.cpp b/src/libslic3r/SLAPrint.cpp index 06c4f687b9..ebe7b74027 100644 --- a/src/libslic3r/SLAPrint.cpp +++ b/src/libslic3r/SLAPrint.cpp @@ -597,7 +597,9 @@ void SLAPrint::finalize() std::string SLAPrint::output_filename(const std::string &filename_base) const { DynamicConfig config = this->finished() ? this->print_statistics().config() : this->print_statistics().placeholders(); - return this->PrintBase::output_filename(m_print_config.output_filename_format.value, ".sl1", filename_base, &config); + // we need to remove the extension from the format string or the following call to PrintBase::output_filename() won't be able to change it to ".sl1" + std::string format = boost::filesystem::path(m_print_config.output_filename_format.value).replace_extension("").string(); + return this->PrintBase::output_filename(format, ".sl1", filename_base, &config); } std::string SLAPrint::validate() const From c877549b1bbd8a66287e45426d7c04a9ec90bbb1 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Wed, 12 Feb 2020 15:46:52 +0100 Subject: [PATCH 324/336] Fixed width of "printhost_apikey" and "printhost_cafile" fields --- src/slic3r/GUI/Tab.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index f38db93c3b..c5c6dc4669 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -1708,12 +1708,16 @@ void TabPrinter::build_printhost(ConfigOptionsGroup *optgroup) host_line.append_widget(printhost_browse); host_line.append_widget(print_host_test); optgroup->append_line(host_line); - optgroup->append_single_option_line("printhost_apikey"); + option = optgroup->get_option("printhost_apikey"); + option.opt.width = Field::def_width_wider(); + optgroup->append_single_option_line(option); const auto ca_file_hint = _(L("HTTPS CA file is optional. It is only needed if you use HTTPS with a self-signed certificate.")); if (Http::ca_file_supported()) { - Line cafile_line = optgroup->create_single_option_line("printhost_cafile"); + option = optgroup->get_option("printhost_cafile"); + option.opt.width = Field::def_width_wider(); + Line cafile_line = optgroup->create_single_option_line(option); auto printhost_cafile_browse = [this, optgroup] (wxWindow* parent) { auto btn = new wxButton(parent, wxID_ANY, " " + _(L("Browse"))+" " +dots, wxDefaultPosition, wxDefaultSize, wxBU_LEFT); From d13b0e45f445838b7bd18cdde65142c1abd154ca Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Wed, 12 Feb 2020 18:20:12 +0100 Subject: [PATCH 325/336] Fix command line slicing by tweaking default config values. --- src/PrusaSlicer.cpp | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/src/PrusaSlicer.cpp b/src/PrusaSlicer.cpp index 7662288d35..0cb4a38f3e 100644 --- a/src/PrusaSlicer.cpp +++ b/src/PrusaSlicer.cpp @@ -162,10 +162,26 @@ int CLI::run(int argc, char **argv) // Initialize full print configs for both the FFF and SLA technologies. FullPrintConfig fff_print_config; -// SLAFullPrintConfig sla_print_config; - fff_print_config.apply(m_print_config, true); -// sla_print_config.apply(m_print_config, true); - + SLAFullPrintConfig sla_print_config; + + // Synchronize the default parameters and the ones received on the command line. + if (printer_technology == ptFFF) { + fff_print_config.apply(m_print_config, true); + m_print_config.apply(fff_print_config, true); + } else if (printer_technology == ptSLA) { + // The default value has to be different from the one in fff mode. + sla_print_config.output_filename_format.value = "[input_filename_base].sl1"; + + // The default bed shape should reflect the default display parameters + // and not the fff defaults. + double w = sla_print_config.display_width.getFloat(); + double h = sla_print_config.display_height.getFloat(); + sla_print_config.bed_shape.values = { Vec2d(0, 0), Vec2d(w, 0), Vec2d(w, h), Vec2d(0, h) }; + + sla_print_config.apply(m_print_config, true); + m_print_config.apply(sla_print_config, true); + } + // Loop through transform options. bool user_center_specified = false; for (auto const &opt_key : m_transforms) { From 25e303493e19d3bf08477e4a48a66e411d0f78e6 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Wed, 12 Feb 2020 18:24:48 +0100 Subject: [PATCH 326/336] Revert c55173eb as it breaks features. Output file name is not picked up in the SLA export file dialog. --- src/libslic3r/SLAPrint.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/libslic3r/SLAPrint.cpp b/src/libslic3r/SLAPrint.cpp index ebe7b74027..06c4f687b9 100644 --- a/src/libslic3r/SLAPrint.cpp +++ b/src/libslic3r/SLAPrint.cpp @@ -597,9 +597,7 @@ void SLAPrint::finalize() std::string SLAPrint::output_filename(const std::string &filename_base) const { DynamicConfig config = this->finished() ? this->print_statistics().config() : this->print_statistics().placeholders(); - // we need to remove the extension from the format string or the following call to PrintBase::output_filename() won't be able to change it to ".sl1" - std::string format = boost::filesystem::path(m_print_config.output_filename_format.value).replace_extension("").string(); - return this->PrintBase::output_filename(format, ".sl1", filename_base, &config); + return this->PrintBase::output_filename(m_print_config.output_filename_format.value, ".sl1", filename_base, &config); } std::string SLAPrint::validate() const From 5797c9edc2999d36065c747b401558ba324abcc6 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Thu, 13 Feb 2020 09:20:20 +0100 Subject: [PATCH 327/336] ENABLE_3DCONNEXION_Y_AS_ZOOM set as default --- src/libslic3r/Technologies.hpp | 3 --- src/slic3r/GUI/AppConfig.cpp | 8 -------- src/slic3r/GUI/AppConfig.hpp | 6 ------ src/slic3r/GUI/Mouse3DController.cpp | 26 +------------------------- src/slic3r/GUI/Mouse3DController.hpp | 6 ------ 5 files changed, 1 insertion(+), 48 deletions(-) diff --git a/src/libslic3r/Technologies.hpp b/src/libslic3r/Technologies.hpp index bb494343bc..37b8cd9e1f 100644 --- a/src/libslic3r/Technologies.hpp +++ b/src/libslic3r/Technologies.hpp @@ -47,9 +47,6 @@ //================== #define ENABLE_2_2_0_BETA1 1 -// Enable using Y axis of 3Dconnexion devices as zoom -#define ENABLE_3DCONNEXION_Y_AS_ZOOM (1 && ENABLE_2_2_0_BETA1) - // Enable a modified version of the toolbar textures where all the icons are separated by 1 pixel #define ENABLE_MODIFIED_TOOLBAR_TEXTURES (1 && ENABLE_2_2_0_BETA1) diff --git a/src/slic3r/GUI/AppConfig.cpp b/src/slic3r/GUI/AppConfig.cpp index a410f3ad8d..3c7a498eb5 100644 --- a/src/slic3r/GUI/AppConfig.cpp +++ b/src/slic3r/GUI/AppConfig.cpp @@ -284,11 +284,7 @@ void AppConfig::set_recent_projects(const std::vector& recent_proje } } -#if ENABLE_3DCONNEXION_Y_AS_ZOOM void AppConfig::set_mouse_device(const std::string& name, double translation_speed, double translation_deadzone, float rotation_speed, float rotation_deadzone, double zoom_speed) -#else -void AppConfig::set_mouse_device(const std::string& name, double translation_speed, double translation_deadzone, float rotation_speed, float rotation_deadzone) -#endif // ENABLE_3DCONNEXION_Y_AS_ZOOM { std::string key = std::string("mouse_device:") + name; auto it = m_storage.find(key); @@ -300,9 +296,7 @@ void AppConfig::set_mouse_device(const std::string& name, double translation_spe it->second["translation_deadzone"] = std::to_string(translation_deadzone); it->second["rotation_speed"] = std::to_string(rotation_speed); it->second["rotation_deadzone"] = std::to_string(rotation_deadzone); -#if ENABLE_3DCONNEXION_Y_AS_ZOOM it->second["zoom_speed"] = std::to_string(zoom_speed); -#endif // ENABLE_3DCONNEXION_Y_AS_ZOOM } bool AppConfig::get_mouse_device_translation_speed(const std::string& name, double& speed) @@ -365,7 +359,6 @@ bool AppConfig::get_mouse_device_rotation_deadzone(const std::string& name, floa return true; } -#if ENABLE_3DCONNEXION_Y_AS_ZOOM bool AppConfig::get_mouse_device_zoom_speed(const std::string& name, double& speed) { std::string key = std::string("mouse_device:") + name; @@ -380,7 +373,6 @@ bool AppConfig::get_mouse_device_zoom_speed(const std::string& name, double& spe speed = (float)::atof(it_val->second.c_str()); return true; } -#endif // ENABLE_3DCONNEXION_Y_AS_ZOOM void AppConfig::update_config_dir(const std::string &dir) { diff --git a/src/slic3r/GUI/AppConfig.hpp b/src/slic3r/GUI/AppConfig.hpp index 32f1c32c85..c49260173f 100644 --- a/src/slic3r/GUI/AppConfig.hpp +++ b/src/slic3r/GUI/AppConfig.hpp @@ -133,18 +133,12 @@ public: std::vector get_recent_projects() const; void set_recent_projects(const std::vector& recent_projects); -#if ENABLE_3DCONNEXION_Y_AS_ZOOM void set_mouse_device(const std::string& name, double translation_speed, double translation_deadzone, float rotation_speed, float rotation_deadzone, double zoom_speed); -#else - void set_mouse_device(const std::string& name, double translation_speed, double translation_deadzone, float rotation_speed, float rotation_deadzone); -#endif // ENABLE_3DCONNEXION_Y_AS_ZOOM bool get_mouse_device_translation_speed(const std::string& name, double& speed); bool get_mouse_device_translation_deadzone(const std::string& name, double& deadzone); bool get_mouse_device_rotation_speed(const std::string& name, float& speed); bool get_mouse_device_rotation_deadzone(const std::string& name, float& deadzone); -#if ENABLE_3DCONNEXION_Y_AS_ZOOM bool get_mouse_device_zoom_speed(const std::string& name, double& speed); -#endif // ENABLE_3DCONNEXION_Y_AS_ZOOM static const std::string SECTION_FILAMENTS; static const std::string SECTION_MATERIALS; diff --git a/src/slic3r/GUI/Mouse3DController.cpp b/src/slic3r/GUI/Mouse3DController.cpp index acadc5b2ed..a6d7cbef45 100644 --- a/src/slic3r/GUI/Mouse3DController.cpp +++ b/src/slic3r/GUI/Mouse3DController.cpp @@ -60,17 +60,13 @@ const double Mouse3DController::State::DefaultTranslationDeadzone = 0.5 * Mouse3 const float Mouse3DController::State::DefaultRotationScale = 1.0f; const float Mouse3DController::State::MaxRotationDeadzone = 0.2f; const float Mouse3DController::State::DefaultRotationDeadzone = 0.5f * Mouse3DController::State::MaxRotationDeadzone; -#if ENABLE_3DCONNEXION_Y_AS_ZOOM const double Mouse3DController::State::DefaultZoomScale = 0.1; -#endif // ENABLE_3DCONNEXION_Y_AS_ZOOM Mouse3DController::State::State() : m_buttons_enabled(false) , m_translation_params(DefaultTranslationScale, DefaultTranslationDeadzone) , m_rotation_params(DefaultRotationScale, DefaultRotationDeadzone) -#if ENABLE_3DCONNEXION_Y_AS_ZOOM , m_zoom_params(DefaultZoomScale, 0.0) -#endif // ENABLE_3DCONNEXION_Y_AS_ZOOM , m_mouse_wheel_counter(0) #if ENABLE_3DCONNEXION_DEVICES_DEBUG_OUTPUT , m_translation_queue_max_size(0) @@ -156,14 +152,10 @@ bool Mouse3DController::State::apply(Camera& camera) if (has_translation()) { const Vec3d& translation = m_translation.queue.front(); -#if ENABLE_3DCONNEXION_Y_AS_ZOOM double zoom_factor = camera.min_zoom() / camera.get_zoom(); camera.set_target(camera.get_target() + zoom_factor * m_translation_params.scale * (translation(0) * camera.get_dir_right() + translation(2) * camera.get_dir_up())); if (translation(1) != 0.0) camera.update_zoom(m_zoom_params.scale * translation(1) / std::abs(translation(1))); -#else - camera.set_target(camera.get_target() + m_translation_params.scale * (translation(0) * camera.get_dir_right() + translation(1) * camera.get_dir_forward() + translation(2) * camera.get_dir_up())); -#endif // ENABLE_3DCONNEXION_Y_AS_ZOOM m_translation.queue.pop(); ret = true; } @@ -321,11 +313,9 @@ void Mouse3DController::render_settings_dialog(GLCanvas3D& canvas) const if (imgui.slider_float(_(L("Rotation")) + "##1", &rotation_scale, 0.1f, 10.0f, "%.1f")) m_state.set_rotation_scale(State::DefaultRotationScale * rotation_scale); -#if ENABLE_3DCONNEXION_Y_AS_ZOOM float zoom_scale = m_state.get_zoom_scale() / State::DefaultZoomScale; if (imgui.slider_float(_(L("Zoom")), &zoom_scale, 0.1f, 10.0f, "%.1f")) m_state.set_zoom_scale(State::DefaultZoomScale * zoom_scale); -#endif // ENABLE_3DCONNEXION_Y_AS_ZOOM ImGui::Separator(); ImGui::PushStyleColor(ImGuiCol_Text, color); @@ -333,11 +323,7 @@ void Mouse3DController::render_settings_dialog(GLCanvas3D& canvas) const ImGui::PopStyleColor(); float translation_deadzone = (float)m_state.get_translation_deadzone(); -#if ENABLE_3DCONNEXION_Y_AS_ZOOM if (imgui.slider_float(_(L("Translation")) + "/" + _(L("Zoom")), &translation_deadzone, 0.0f, (float)State::MaxTranslationDeadzone, "%.2f")) -#else - if (imgui.slider_float(_(L("Translation")) + "##2", &translation_deadzone, 0.0f, (float)State::MaxTranslationDeadzone, "%.2f")) -#endif // ENABLE_3DCONNEXION_Y_AS_ZOOM m_state.set_translation_deadzone((double)translation_deadzone); float rotation_deadzone = m_state.get_rotation_deadzone(); @@ -651,24 +637,18 @@ bool Mouse3DController::connect_device() float rotation_speed = 4.0; double translation_deadzone = State::DefaultTranslationDeadzone; float rotation_deadzone = State::DefaultRotationDeadzone; -#if ENABLE_3DCONNEXION_Y_AS_ZOOM double zoom_speed = 2.0; -#endif // ENABLE_3DCONNEXION_Y_AS_ZOOM wxGetApp().app_config->get_mouse_device_translation_speed(m_device_str, translation_speed); wxGetApp().app_config->get_mouse_device_translation_deadzone(m_device_str, translation_deadzone); wxGetApp().app_config->get_mouse_device_rotation_speed(m_device_str, rotation_speed); wxGetApp().app_config->get_mouse_device_rotation_deadzone(m_device_str, rotation_deadzone); -#if ENABLE_3DCONNEXION_Y_AS_ZOOM wxGetApp().app_config->get_mouse_device_zoom_speed(m_device_str, zoom_speed); -#endif // ENABLE_3DCONNEXION_Y_AS_ZOOM // clamp to valid values m_state.set_translation_scale(State::DefaultTranslationScale * std::clamp(translation_speed, 0.1, 10.0)); m_state.set_translation_deadzone(std::clamp(translation_deadzone, 0.0, State::MaxTranslationDeadzone)); m_state.set_rotation_scale(State::DefaultRotationScale * std::clamp(rotation_speed, 0.1f, 10.0f)); m_state.set_rotation_deadzone(std::clamp(rotation_deadzone, 0.0f, State::MaxRotationDeadzone)); -#if ENABLE_3DCONNEXION_Y_AS_ZOOM m_state.set_zoom_scale(State::DefaultZoomScale * std::clamp(zoom_speed, 0.1, 10.0)); -#endif // ENABLE_3DCONNEXION_Y_AS_ZOOM } #if ENABLE_3DCONNEXION_DEVICES_DEBUG_OUTPUT else @@ -694,13 +674,9 @@ void Mouse3DController::disconnect_device() m_thread.join(); // Store current device parameters into the config -#if ENABLE_3DCONNEXION_Y_AS_ZOOM wxGetApp().app_config->set_mouse_device(m_device_str, m_state.get_translation_scale() / State::DefaultTranslationScale, m_state.get_translation_deadzone(), m_state.get_rotation_scale() / State::DefaultRotationScale, m_state.get_rotation_deadzone(), m_state.get_zoom_scale() / State::DefaultZoomScale); -#else - wxGetApp().app_config->set_mouse_device(m_device_str, m_state.get_translation_scale() / State::DefaultTranslationScale, m_state.get_translation_deadzone(), - m_state.get_rotation_scale() / State::DefaultRotationScale, m_state.get_rotation_deadzone()); -#endif // ENABLE_3DCONNEXION_Y_AS_ZOOM + wxGetApp().app_config->save(); // Close the 3Dconnexion device diff --git a/src/slic3r/GUI/Mouse3DController.hpp b/src/slic3r/GUI/Mouse3DController.hpp index 018cb98e6e..f987451245 100644 --- a/src/slic3r/GUI/Mouse3DController.hpp +++ b/src/slic3r/GUI/Mouse3DController.hpp @@ -37,9 +37,7 @@ class Mouse3DController static const float DefaultRotationScale; static const float MaxRotationDeadzone; static const float DefaultRotationDeadzone; -#if ENABLE_3DCONNEXION_Y_AS_ZOOM static const double DefaultZoomScale; -#endif // ENABLE_3DCONNEXION_Y_AS_ZOOM private: template @@ -71,9 +69,7 @@ class Mouse3DController CustomParameters m_translation_params; CustomParameters m_rotation_params; -#if ENABLE_3DCONNEXION_Y_AS_ZOOM CustomParameters m_zoom_params; -#endif // ENABLE_3DCONNEXION_Y_AS_ZOOM // When the 3Dconnexion driver is running the system gets, by default, mouse wheel events when rotations around the X axis are detected. // We want to filter these out because we are getting the data directly from the device, bypassing the driver, and those mouse wheel events interfere @@ -109,10 +105,8 @@ class Mouse3DController float get_rotation_scale() const { return m_rotation_params.scale; } void set_rotation_scale(float scale) { m_rotation_params.scale = scale; } -#if ENABLE_3DCONNEXION_Y_AS_ZOOM double get_zoom_scale() const { return m_zoom_params.scale; } void set_zoom_scale(double scale) { m_zoom_params.scale = scale; } -#endif // ENABLE_3DCONNEXION_Y_AS_ZOOM double get_translation_deadzone() const { return m_translation_params.deadzone; } void set_translation_deadzone(double deadzone) { m_translation_params.deadzone = deadzone; } From b0218daafe63eecc3e4dbd4d4074d503ab7d8d2d Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Thu, 13 Feb 2020 09:50:06 +0100 Subject: [PATCH 328/336] ENABLE_MODIFIED_TOOLBAR_TEXTURES set as default --- src/libslic3r/Technologies.hpp | 3 -- src/slic3r/GUI/GLTexture.cpp | 38 ----------------------- src/slic3r/GUI/GLToolbar.cpp | 27 ---------------- src/slic3r/GUI/GLToolbar.hpp | 3 -- src/slic3r/GUI/Gizmos/GLGizmosManager.cpp | 27 ---------------- 5 files changed, 98 deletions(-) diff --git a/src/libslic3r/Technologies.hpp b/src/libslic3r/Technologies.hpp index 37b8cd9e1f..2f31f1a2b7 100644 --- a/src/libslic3r/Technologies.hpp +++ b/src/libslic3r/Technologies.hpp @@ -47,9 +47,6 @@ //================== #define ENABLE_2_2_0_BETA1 1 -// Enable a modified version of the toolbar textures where all the icons are separated by 1 pixel -#define ENABLE_MODIFIED_TOOLBAR_TEXTURES (1 && ENABLE_2_2_0_BETA1) - // Enable configurable paths export (fullpath or not) to 3mf and amf #define ENABLE_CONFIGURABLE_PATHS_EXPORT_TO_3MF_AND_AMF (1 && ENABLE_2_2_0_BETA1) diff --git a/src/slic3r/GUI/GLTexture.cpp b/src/slic3r/GUI/GLTexture.cpp index 4ac69d71ff..f178ddc73c 100644 --- a/src/slic3r/GUI/GLTexture.cpp +++ b/src/slic3r/GUI/GLTexture.cpp @@ -168,25 +168,15 @@ bool GLTexture::load_from_svg_files_as_sprites_array(const std::vectorwidth, image->height); -#if ENABLE_MODIFIED_TOOLBAR_TEXTURES // offset by 1 to leave the first pixel empty (both in x and y) nsvgRasterize(rast, image, 1, 1, scale, sprite_data.data(), sprite_size_px, sprite_size_px, sprite_stride); -#else - nsvgRasterize(rast, image, 0, 0, scale, sprite_data.data(), sprite_size_px, sprite_size_px, sprite_stride); -#endif // ENABLE_MODIFIED_TOOLBAR_TEXTURES // makes white only copy of the sprite ::memcpy((void*)sprite_white_only_data.data(), (const void*)sprite_data.data(), sprite_bytes); @@ -250,11 +236,7 @@ bool GLTexture::load_from_svg_files_as_sprites_array(const std::vector& state : states) { @@ -273,7 +255,6 @@ bool GLTexture::load_from_svg_files_as_sprites_array(const std::vectorGLTexture::Quad_UVs { assert((tex_width != 0) && (tex_height != 0)); @@ -112,9 +111,6 @@ void GLToolbarItem::render(unsigned int tex_id, float left, float right, float b }; GLTexture::render_sub_texture(tex_id, left, right, bottom, top, uvs(tex_width, tex_height, icon_size)); -#else - GLTexture::render_sub_texture(tex_id, left, right, bottom, top, get_uvs(tex_width, tex_height, icon_size)); -#endif // ENABLE_MODIFIED_TOOLBAR_TEXTURES if (is_pressed()) { @@ -125,29 +121,6 @@ void GLToolbarItem::render(unsigned int tex_id, float left, float right, float b } } -#if !ENABLE_MODIFIED_TOOLBAR_TEXTURES -GLTexture::Quad_UVs GLToolbarItem::get_uvs(unsigned int tex_width, unsigned int tex_height, unsigned int icon_size) const -{ - GLTexture::Quad_UVs uvs; - - float inv_tex_width = (tex_width != 0) ? 1.0f / (float)tex_width : 0.0f; - float inv_tex_height = (tex_height != 0) ? 1.0f / (float)tex_height : 0.0f; - - float scaled_icon_width = (float)icon_size * inv_tex_width; - float scaled_icon_height = (float)icon_size * inv_tex_height; - float left = (float)m_state * scaled_icon_width; - float right = left + scaled_icon_width; - float top = (float)m_data.sprite_id * scaled_icon_height; - float bottom = top + scaled_icon_height; - uvs.left_top = { left, top }; - uvs.left_bottom = { left, bottom }; - uvs.right_bottom = { right, bottom }; - uvs.right_top = { right, top }; - - return uvs; -} -#endif // !ENABLE_MODIFIED_TOOLBAR_TEXTURES - BackgroundTexture::Metadata::Metadata() : filename("") , left(0) diff --git a/src/slic3r/GUI/GLToolbar.hpp b/src/slic3r/GUI/GLToolbar.hpp index f53b8efb99..6f24e22cf8 100644 --- a/src/slic3r/GUI/GLToolbar.hpp +++ b/src/slic3r/GUI/GLToolbar.hpp @@ -143,9 +143,6 @@ public: void render(unsigned int tex_id, float left, float right, float bottom, float top, unsigned int tex_width, unsigned int tex_height, unsigned int icon_size) const; private: -#if !ENABLE_MODIFIED_TOOLBAR_TEXTURES - GLTexture::Quad_UVs get_uvs(unsigned int tex_width, unsigned int tex_height, unsigned int icon_size) const; -#endif // !ENABLE_MODIFIED_TOOLBAR_TEXTURES void set_visible(bool visible) { m_data.visible = visible; } friend class GLToolbar; diff --git a/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp b/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp index 79ac6a00da..7e334c29f2 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp @@ -889,14 +889,9 @@ void GLGizmosManager::render_background(float left, float top, float right, floa void GLGizmosManager::do_render_overlay() const { -#if ENABLE_MODIFIED_TOOLBAR_TEXTURES std::vector selectable_idxs = get_selectable_idxs(); if (selectable_idxs.empty()) return; -#else - if (m_gizmos.empty()) - return; -#endif // ENABLE_MODIFIED_TOOLBAR_TEXTURES float cnv_w = (float)m_parent.get_canvas_size().get_width(); float cnv_h = (float)m_parent.get_canvas_size().get_height(); @@ -928,7 +923,6 @@ void GLGizmosManager::do_render_overlay() const int tex_width = m_icons_texture.get_width(); int tex_height = m_icons_texture.get_height(); -#if ENABLE_MODIFIED_TOOLBAR_TEXTURES if ((icons_texture_id == 0) || (tex_width <= 1) || (tex_height <= 1)) return; @@ -938,39 +932,18 @@ void GLGizmosManager::do_render_overlay() const // tiles in the texture are spaced by 1 pixel float u_offset = 1.0f / (float)tex_width; float v_offset = 1.0f / (float)tex_height; -#else - if ((icons_texture_id == 0) || (tex_width <= 0) || (tex_height <= 0)) - return; - float inv_tex_width = (tex_width != 0) ? 1.0f / tex_width : 0.0f; - float inv_tex_height = (tex_height != 0) ? 1.0f / tex_height : 0.0f; -#endif // ENABLE_MODIFIED_TOOLBAR_TEXTURES - -#if ENABLE_MODIFIED_TOOLBAR_TEXTURES for (size_t idx : selectable_idxs) -#else - for (size_t idx : get_selectable_idxs()) -#endif // ENABLE_MODIFIED_TOOLBAR_TEXTURES { GLGizmoBase* gizmo = m_gizmos[idx].get(); unsigned int sprite_id = gizmo->get_sprite_id(); int icon_idx = (m_current == idx) ? 2 : ((m_hover == idx) ? 1 : (gizmo->is_activable()? 0 : 3)); -#if ENABLE_MODIFIED_TOOLBAR_TEXTURES float v_top = v_offset + sprite_id * dv; float u_left = u_offset + icon_idx * du; float v_bottom = v_top + dv - v_offset; float u_right = u_left + du - u_offset; -#else - float u_icon_size = icons_size * inv_tex_width; - float v_icon_size = icons_size * inv_tex_height; - - float v_top = sprite_id * v_icon_size; - float u_left = icon_idx * u_icon_size; - float v_bottom = v_top + v_icon_size; - float u_right = u_left + u_icon_size; -#endif // ENABLE_MODIFIED_TOOLBAR_TEXTURES GLTexture::render_sub_texture(icons_texture_id, zoomed_top_x, zoomed_top_x + zoomed_icons_size, zoomed_top_y - zoomed_icons_size, zoomed_top_y, { { u_left, v_bottom }, { u_right, v_bottom }, { u_right, v_top }, { u_left, v_top } }); if (idx == m_current) { From 904263d231e20e97ca8f2f62b5ea420a6fa65b26 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Thu, 13 Feb 2020 11:25:34 +0100 Subject: [PATCH 329/336] ENABLE_CONFIGURABLE_PATHS_EXPORT_TO_3MF_AND_AMF set as default --- src/PrusaSlicer.cpp | 8 ----- src/libslic3r/Format/3mf.cpp | 46 ------------------------- src/libslic3r/Format/3mf.hpp | 8 ----- src/libslic3r/Format/AMF.cpp | 8 ----- src/libslic3r/Format/AMF.hpp | 4 --- src/libslic3r/Technologies.hpp | 3 -- src/slic3r/CMakeLists.txt | 1 + src/slic3r/GUI/AppConfig.cpp | 2 -- src/slic3r/GUI/ConfigWizard.cpp | 9 ----- src/slic3r/GUI/ConfigWizard_private.hpp | 8 ----- src/slic3r/GUI/Plater.cpp | 14 -------- src/slic3r/GUI/Preferences.cpp | 2 -- src/slic3r/Utils/FixModelByWin10.cpp | 7 ---- tests/libslic3r/test_3mf.cpp | 4 --- 14 files changed, 1 insertion(+), 123 deletions(-) diff --git a/src/PrusaSlicer.cpp b/src/PrusaSlicer.cpp index 7662288d35..5173822717 100644 --- a/src/PrusaSlicer.cpp +++ b/src/PrusaSlicer.cpp @@ -641,18 +641,10 @@ bool CLI::export_models(IO::ExportFormat format) const std::string path = this->output_filepath(model, format); bool success = false; switch (format) { -#if ENABLE_CONFIGURABLE_PATHS_EXPORT_TO_3MF_AND_AMF case IO::AMF: success = Slic3r::store_amf(path.c_str(), &model, nullptr, false); break; -#else - case IO::AMF: success = Slic3r::store_amf(path.c_str(), &model, nullptr); break; -#endif // ENABLE_CONFIGURABLE_PATHS_EXPORT_TO_3MF_AND_AMF case IO::OBJ: success = Slic3r::store_obj(path.c_str(), &model); break; case IO::STL: success = Slic3r::store_stl(path.c_str(), &model, true); break; -#if ENABLE_CONFIGURABLE_PATHS_EXPORT_TO_3MF_AND_AMF case IO::TMF: success = Slic3r::store_3mf(path.c_str(), &model, nullptr, false); break; -#else - case IO::TMF: success = Slic3r::store_3mf(path.c_str(), &model, nullptr); break; -#endif // ENABLE_CONFIGURABLE_PATHS_EXPORT_TO_3MF_AND_AMF default: assert(false); break; } if (success) diff --git a/src/libslic3r/Format/3mf.cpp b/src/libslic3r/Format/3mf.cpp index 45f39c7873..efeb237003 100644 --- a/src/libslic3r/Format/3mf.cpp +++ b/src/libslic3r/Format/3mf.cpp @@ -1966,24 +1966,14 @@ namespace Slic3r { typedef std::vector BuildItemsList; typedef std::map IdToObjectDataMap; -#if ENABLE_CONFIGURABLE_PATHS_EXPORT_TO_3MF_AND_AMF bool m_fullpath_sources{ true }; -#endif // ENABLE_CONFIGURABLE_PATHS_EXPORT_TO_3MF_AND_AMF public: -#if ENABLE_CONFIGURABLE_PATHS_EXPORT_TO_3MF_AND_AMF #if ENABLE_THUMBNAIL_GENERATOR bool save_model_to_file(const std::string& filename, Model& model, const DynamicPrintConfig* config, bool fullpath_sources, const ThumbnailData* thumbnail_data = nullptr); #else bool save_model_to_file(const std::string& filename, Model& model, const DynamicPrintConfig* config, bool fullpath_sources); #endif // ENABLE_THUMBNAIL_GENERATOR -#else -#if ENABLE_THUMBNAIL_GENERATOR - bool save_model_to_file(const std::string& filename, Model& model, const DynamicPrintConfig* config, const ThumbnailData* thumbnail_data = nullptr); -#else - bool save_model_to_file(const std::string& filename, Model& model, const DynamicPrintConfig* config); -#endif // ENABLE_THUMBNAIL_GENERATOR -#endif // ENABLE_CONFIGURABLE_PATHS_EXPORT_TO_3MF_AND_AMF private: #if ENABLE_THUMBNAIL_GENERATOR @@ -2009,7 +1999,6 @@ namespace Slic3r { bool _add_custom_gcode_per_print_z_file_to_archive(mz_zip_archive& archive, Model& model); }; -#if ENABLE_CONFIGURABLE_PATHS_EXPORT_TO_3MF_AND_AMF #if ENABLE_THUMBNAIL_GENERATOR bool _3MF_Exporter::save_model_to_file(const std::string& filename, Model& model, const DynamicPrintConfig* config, bool fullpath_sources, const ThumbnailData* thumbnail_data) { @@ -2024,21 +2013,6 @@ namespace Slic3r { return _save_model_to_file(filename, model, config); } #endif // ENABLE_THUMBNAIL_GENERATOR -#else -#if ENABLE_THUMBNAIL_GENERATOR - bool _3MF_Exporter::save_model_to_file(const std::string& filename, Model& model, const DynamicPrintConfig* config, const ThumbnailData* thumbnail_data) - { - clear_errors(); - return _save_model_to_file(filename, model, config, thumbnail_data); - } -#else - bool _3MF_Exporter::save_model_to_file(const std::string& filename, Model& model, const DynamicPrintConfig* config) - { - clear_errors(); - return _save_model_to_file(filename, model, config); - } -#endif // ENABLE_THUMBNAIL_GENERATOR -#endif // ENABLE_CONFIGURABLE_PATHS_EXPORT_TO_3MF_AND_AMF #if ENABLE_THUMBNAIL_GENERATOR bool _3MF_Exporter::_save_model_to_file(const std::string& filename, Model& model, const DynamicPrintConfig* config, const ThumbnailData* thumbnail_data) @@ -2725,12 +2699,8 @@ namespace Slic3r { // stores volume's source data if (!volume->source.input_file.empty()) { -#if ENABLE_CONFIGURABLE_PATHS_EXPORT_TO_3MF_AND_AMF std::string input_file = xml_escape(m_fullpath_sources ? volume->source.input_file : boost::filesystem::path(volume->source.input_file).filename().string()); stream << " <" << METADATA_TAG << " " << TYPE_ATTR << "=\"" << VOLUME_TYPE << "\" " << KEY_ATTR << "=\"" << SOURCE_FILE_KEY << "\" " << VALUE_ATTR << "=\"" << input_file << "\"/>\n"; -#else - stream << " <" << METADATA_TAG << " " << TYPE_ATTR << "=\"" << VOLUME_TYPE << "\" " << KEY_ATTR << "=\"" << SOURCE_FILE_KEY << "\" " << VALUE_ATTR << "=\"" << xml_escape(volume->source.input_file) << "\"/>\n"; -#endif // ENABLE_CONFIGURABLE_PATHS_EXPORT_TO_3MF_AND_AMF stream << " <" << METADATA_TAG << " " << TYPE_ATTR << "=\"" << VOLUME_TYPE << "\" " << KEY_ATTR << "=\"" << SOURCE_OBJECT_ID_KEY << "\" " << VALUE_ATTR << "=\"" << volume->source.object_idx << "\"/>\n"; stream << " <" << METADATA_TAG << " " << TYPE_ATTR << "=\"" << VOLUME_TYPE << "\" " << KEY_ATTR << "=\"" << SOURCE_VOLUME_ID_KEY << "\" " << VALUE_ATTR << "=\"" << volume->source.volume_idx << "\"/>\n"; stream << " <" << METADATA_TAG << " " << TYPE_ATTR << "=\"" << VOLUME_TYPE << "\" " << KEY_ATTR << "=\"" << SOURCE_OFFSET_X_KEY << "\" " << VALUE_ATTR << "=\"" << volume->source.mesh_offset(0) << "\"/>\n"; @@ -2825,37 +2795,21 @@ bool load_3mf(const char* path, DynamicPrintConfig* config, Model* model, bool c return res; } -#if ENABLE_CONFIGURABLE_PATHS_EXPORT_TO_3MF_AND_AMF #if ENABLE_THUMBNAIL_GENERATOR bool store_3mf(const char* path, Model* model, const DynamicPrintConfig* config, bool fullpath_sources, const ThumbnailData* thumbnail_data) #else bool store_3mf(const char* path, Model* model, const DynamicPrintConfig* config, bool fullpath_sources) #endif // ENABLE_THUMBNAIL_GENERATOR -#else -#if ENABLE_THUMBNAIL_GENERATOR - bool store_3mf(const char* path, Model* model, const DynamicPrintConfig* config, const ThumbnailData* thumbnail_data) -#else - bool store_3mf(const char* path, Model* model, const DynamicPrintConfig* config) -#endif // ENABLE_THUMBNAIL_GENERATOR -#endif // ENABLE_CONFIGURABLE_PATHS_EXPORT_TO_3MF_AND_AMF { if ((path == nullptr) || (model == nullptr)) return false; _3MF_Exporter exporter; -#if ENABLE_CONFIGURABLE_PATHS_EXPORT_TO_3MF_AND_AMF #if ENABLE_THUMBNAIL_GENERATOR bool res = exporter.save_model_to_file(path, *model, config, fullpath_sources, thumbnail_data); #else bool res = exporter.save_model_to_file(path, *model, config, fullpath_sources); #endif // ENABLE_THUMBNAIL_GENERATOR -#else -#if ENABLE_THUMBNAIL_GENERATOR - bool res = exporter.save_model_to_file(path, *model, config, thumbnail_data); -#else - bool res = exporter.save_model_to_file(path, *model, config); -#endif // ENABLE_THUMBNAIL_GENERATOR -#endif // ENABLE_CONFIGURABLE_PATHS_EXPORT_TO_3MF_AND_AMF if (!res) exporter.log_errors(); diff --git a/src/libslic3r/Format/3mf.hpp b/src/libslic3r/Format/3mf.hpp index 79ac61a234..8ca1ebde85 100644 --- a/src/libslic3r/Format/3mf.hpp +++ b/src/libslic3r/Format/3mf.hpp @@ -35,19 +35,11 @@ namespace Slic3r { // Save the given model and the config data contained in the given Print into a 3mf file. // The model could be modified during the export process if meshes are not repaired or have no shared vertices -#if ENABLE_CONFIGURABLE_PATHS_EXPORT_TO_3MF_AND_AMF #if ENABLE_THUMBNAIL_GENERATOR extern bool store_3mf(const char* path, Model* model, const DynamicPrintConfig* config, bool fullpath_sources, const ThumbnailData* thumbnail_data = nullptr); #else extern bool store_3mf(const char* path, Model* model, const DynamicPrintConfig* config, bool fullpath_sources); #endif // ENABLE_THUMBNAIL_GENERATOR -#else -#if ENABLE_THUMBNAIL_GENERATOR - extern bool store_3mf(const char* path, Model* model, const DynamicPrintConfig* config, const ThumbnailData* thumbnail_data = nullptr); -#else - extern bool store_3mf(const char* path, Model* model, const DynamicPrintConfig* config); -#endif // ENABLE_THUMBNAIL_GENERATOR -#endif // ENABLE_CONFIGURABLE_PATHS_EXPORT_TO_3MF_AND_AMF }; // namespace Slic3r diff --git a/src/libslic3r/Format/AMF.cpp b/src/libslic3r/Format/AMF.cpp index ede4f403bf..2dc4ea0ba5 100644 --- a/src/libslic3r/Format/AMF.cpp +++ b/src/libslic3r/Format/AMF.cpp @@ -1022,11 +1022,7 @@ bool load_amf(const char* path, DynamicPrintConfig* config, Model* model, bool c return false; } -#if ENABLE_CONFIGURABLE_PATHS_EXPORT_TO_3MF_AND_AMF bool store_amf(const char* path, Model* model, const DynamicPrintConfig* config, bool fullpath_sources) -#else -bool store_amf(const char *path, Model *model, const DynamicPrintConfig *config) -#endif // ENABLE_CONFIGURABLE_PATHS_EXPORT_TO_3MF_AND_AMF { if ((path == nullptr) || (model == nullptr)) return false; @@ -1180,12 +1176,8 @@ bool store_amf(const char *path, Model *model, const DynamicPrintConfig *config) stream << "\n"; if (!volume->source.input_file.empty()) { -#if ENABLE_CONFIGURABLE_PATHS_EXPORT_TO_3MF_AND_AMF std::string input_file = xml_escape(fullpath_sources ? volume->source.input_file : boost::filesystem::path(volume->source.input_file).filename().string()); stream << " " << input_file << "\n"; -#else - stream << " " << xml_escape(volume->source.input_file) << "\n"; -#endif // ENABLE_CONFIGURABLE_PATHS_EXPORT_TO_3MF_AND_AMF stream << " " << volume->source.object_idx << "\n"; stream << " " << volume->source.volume_idx << "\n"; stream << " " << volume->source.mesh_offset(0) << "\n"; diff --git a/src/libslic3r/Format/AMF.hpp b/src/libslic3r/Format/AMF.hpp index 7404e1e901..3e33d4aa37 100644 --- a/src/libslic3r/Format/AMF.hpp +++ b/src/libslic3r/Format/AMF.hpp @@ -11,11 +11,7 @@ extern bool load_amf(const char* path, DynamicPrintConfig* config, Model* model, // Save the given model and the config data into an amf file. // The model could be modified during the export process if meshes are not repaired or have no shared vertices -#if ENABLE_CONFIGURABLE_PATHS_EXPORT_TO_3MF_AND_AMF extern bool store_amf(const char* path, Model* model, const DynamicPrintConfig* config, bool fullpath_sources); -#else -extern bool store_amf(const char *path, Model *model, const DynamicPrintConfig *config); -#endif // ENABLE_CONFIGURABLE_PATHS_EXPORT_TO_3MF_AND_AMF }; // namespace Slic3r diff --git a/src/libslic3r/Technologies.hpp b/src/libslic3r/Technologies.hpp index 2f31f1a2b7..17adc8d472 100644 --- a/src/libslic3r/Technologies.hpp +++ b/src/libslic3r/Technologies.hpp @@ -47,9 +47,6 @@ //================== #define ENABLE_2_2_0_BETA1 1 -// Enable configurable paths export (fullpath or not) to 3mf and amf -#define ENABLE_CONFIGURABLE_PATHS_EXPORT_TO_3MF_AND_AMF (1 && ENABLE_2_2_0_BETA1) - // Enable 6 degrees of freedom camera #define ENABLE_6DOF_CAMERA (1 && ENABLE_2_2_0_BETA1) diff --git a/src/slic3r/CMakeLists.txt b/src/slic3r/CMakeLists.txt index 918a2c0512..c8589903e1 100644 --- a/src/slic3r/CMakeLists.txt +++ b/src/slic3r/CMakeLists.txt @@ -131,6 +131,7 @@ set(SLIC3R_GUI_SOURCES Utils/Serial.hpp GUI/ConfigWizard.cpp GUI/ConfigWizard.hpp + GUI/ConfigWizard_private.hpp GUI/MsgDialog.cpp GUI/MsgDialog.hpp GUI/UpdateDialogs.cpp diff --git a/src/slic3r/GUI/AppConfig.cpp b/src/slic3r/GUI/AppConfig.cpp index 3c7a498eb5..9bf407f93f 100644 --- a/src/slic3r/GUI/AppConfig.cpp +++ b/src/slic3r/GUI/AppConfig.cpp @@ -61,10 +61,8 @@ void AppConfig::set_defaults() if (get("preset_update").empty()) set("preset_update", "1"); -#if ENABLE_CONFIGURABLE_PATHS_EXPORT_TO_3MF_AND_AMF if (get("export_sources_full_pathnames").empty()) set("export_sources_full_pathnames", "0"); -#endif // ENABLE_CONFIGURABLE_PATHS_EXPORT_TO_3MF_AND_AMF // remove old 'use_legacy_opengl' parameter from this config, if present if (!get("use_legacy_opengl").empty()) diff --git a/src/slic3r/GUI/ConfigWizard.cpp b/src/slic3r/GUI/ConfigWizard.cpp index 9edc3ac398..99353fbd99 100644 --- a/src/slic3r/GUI/ConfigWizard.cpp +++ b/src/slic3r/GUI/ConfigWizard.cpp @@ -793,7 +793,6 @@ PageUpdate::PageUpdate(ConfigWizard *parent) box_presets->Bind(wxEVT_CHECKBOX, [this](wxCommandEvent &event) { this->preset_update = event.IsChecked(); }); } -#if ENABLE_CONFIGURABLE_PATHS_EXPORT_TO_3MF_AND_AMF PageReloadFromDisk::PageReloadFromDisk(ConfigWizard* parent) : ConfigWizardPage(parent, _(L("Reload from disk")), _(L("Reload from disk"))) , full_pathnames(false) @@ -808,7 +807,6 @@ PageReloadFromDisk::PageReloadFromDisk(ConfigWizard* parent) box_pathnames->Bind(wxEVT_CHECKBOX, [this](wxCommandEvent& event) { this->full_pathnames = event.IsChecked(); }); } -#endif // ENABLE_CONFIGURABLE_PATHS_EXPORT_TO_3MF_AND_AMF PageMode::PageMode(ConfigWizard *parent) : ConfigWizardPage(parent, _(L("View mode")), _(L("View mode"))) @@ -1401,9 +1399,7 @@ void ConfigWizard::priv::load_pages() btn_finish->Enable(any_fff_selected || any_sla_selected); index->add_page(page_update); -#if ENABLE_CONFIGURABLE_PATHS_EXPORT_TO_3MF_AND_AMF index->add_page(page_reload_from_disk); -#endif // ENABLE_CONFIGURABLE_PATHS_EXPORT_TO_3MF_AND_AMF index->add_page(page_mode); index->go_to(former_active); // Will restore the active item/page if possible @@ -1853,10 +1849,7 @@ void ConfigWizard::priv::apply_config(AppConfig *app_config, PresetBundle *prese } app_config->set("version_check", page_update->version_check ? "1" : "0"); app_config->set("preset_update", page_update->preset_update ? "1" : "0"); - -#if ENABLE_CONFIGURABLE_PATHS_EXPORT_TO_3MF_AND_AMF app_config->set("export_sources_full_pathnames", page_reload_from_disk->full_pathnames ? "1" : "0"); -#endif // ENABLE_CONFIGURABLE_PATHS_EXPORT_TO_3MF_AND_AMF page_mode->serialize_mode(app_config); @@ -2017,9 +2010,7 @@ ConfigWizard::ConfigWizard(wxWindow *parent) p->add_page(p->page_custom = new PageCustom(this)); p->add_page(p->page_update = new PageUpdate(this)); -#if ENABLE_CONFIGURABLE_PATHS_EXPORT_TO_3MF_AND_AMF p->add_page(p->page_reload_from_disk = new PageReloadFromDisk(this)); -#endif // ENABLE_CONFIGURABLE_PATHS_EXPORT_TO_3MF_AND_AMF p->add_page(p->page_mode = new PageMode(this)); p->add_page(p->page_firmware = new PageFirmware(this)); p->add_page(p->page_bed = new PageBedShape(this)); diff --git a/src/slic3r/GUI/ConfigWizard_private.hpp b/src/slic3r/GUI/ConfigWizard_private.hpp index 9c14633c9f..e056b0b9e4 100644 --- a/src/slic3r/GUI/ConfigWizard_private.hpp +++ b/src/slic3r/GUI/ConfigWizard_private.hpp @@ -305,16 +305,12 @@ struct PageUpdate: ConfigWizardPage PageUpdate(ConfigWizard *parent); }; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if ENABLE_CONFIGURABLE_PATHS_EXPORT_TO_3MF_AND_AMF struct PageReloadFromDisk : ConfigWizardPage { bool full_pathnames; PageReloadFromDisk(ConfigWizard* parent); }; -#endif // ENABLE_CONFIGURABLE_PATHS_EXPORT_TO_3MF_AND_AMF -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ struct PageMode: ConfigWizardPage { @@ -470,11 +466,7 @@ struct ConfigWizard::priv PageMaterials *page_sla_materials = nullptr; PageCustom *page_custom = nullptr; PageUpdate *page_update = nullptr; -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -#if ENABLE_CONFIGURABLE_PATHS_EXPORT_TO_3MF_AND_AMF PageReloadFromDisk *page_reload_from_disk = nullptr; -#endif // ENABLE_CONFIGURABLE_PATHS_EXPORT_TO_3MF_AND_AMF -//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ PageMode *page_mode = nullptr; PageVendors *page_vendors = nullptr; Pages3rdparty pages_3rdparty; diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 1e753206a4..d351d57936 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -5012,12 +5012,8 @@ void Plater::export_amf() wxBusyCursor wait; bool export_config = true; DynamicPrintConfig cfg = wxGetApp().preset_bundle->full_config_secure(); -#if ENABLE_CONFIGURABLE_PATHS_EXPORT_TO_3MF_AND_AMF bool full_pathnames = wxGetApp().app_config->get("export_sources_full_pathnames") == "1"; if (Slic3r::store_amf(path_u8.c_str(), &p->model, export_config ? &cfg : nullptr, full_pathnames)) { -#else - if (Slic3r::store_amf(path_u8.c_str(), &p->model, export_config ? &cfg : nullptr)) { -#endif // ENABLE_CONFIGURABLE_PATHS_EXPORT_TO_3MF_AND_AMF // Success p->statusbar()->set_status_text(wxString::Format(_(L("AMF file exported to %s")), path)); } else { @@ -5046,7 +5042,6 @@ void Plater::export_3mf(const boost::filesystem::path& output_path) DynamicPrintConfig cfg = wxGetApp().preset_bundle->full_config_secure(); const std::string path_u8 = into_u8(path); wxBusyCursor wait; -#if ENABLE_CONFIGURABLE_PATHS_EXPORT_TO_3MF_AND_AMF bool full_pathnames = wxGetApp().app_config->get("export_sources_full_pathnames") == "1"; #if ENABLE_THUMBNAIL_GENERATOR ThumbnailData thumbnail_data; @@ -5055,15 +5050,6 @@ void Plater::export_3mf(const boost::filesystem::path& output_path) #else if (Slic3r::store_3mf(path_u8.c_str(), &p->model, export_config ? &cfg : nullptr, full_pathnames)) { #endif // ENABLE_THUMBNAIL_GENERATOR -#else -#if ENABLE_THUMBNAIL_GENERATOR - ThumbnailData thumbnail_data; - p->generate_thumbnail(thumbnail_data, THUMBNAIL_SIZE_3MF.first, THUMBNAIL_SIZE_3MF.second, false, true, true, true); - if (Slic3r::store_3mf(path_u8.c_str(), &p->model, export_config ? &cfg : nullptr, &thumbnail_data)) { -#else - if (Slic3r::store_3mf(path_u8.c_str(), &p->model, export_config ? &cfg : nullptr)) { -#endif // ENABLE_THUMBNAIL_GENERATOR -#endif // ENABLE_CONFIGURABLE_PATHS_EXPORT_TO_3MF_AND_AMF // Success p->statusbar()->set_status_text(wxString::Format(_(L("3MF file exported to %s")), path)); p->set_project_filename(path); diff --git a/src/slic3r/GUI/Preferences.cpp b/src/slic3r/GUI/Preferences.cpp index 4fd63fe0ed..118ecf87ac 100644 --- a/src/slic3r/GUI/Preferences.cpp +++ b/src/slic3r/GUI/Preferences.cpp @@ -68,7 +68,6 @@ void PreferencesDialog::build() option = Option (def, "version_check"); m_optgroup_general->append_single_option_line(option); -#if ENABLE_CONFIGURABLE_PATHS_EXPORT_TO_3MF_AND_AMF // Please keep in sync with ConfigWizard def.label = L("Export sources full pathnames to 3mf and amf"); def.type = coBool; @@ -76,7 +75,6 @@ void PreferencesDialog::build() def.set_default_value(new ConfigOptionBool(app_config->get("export_sources_full_pathnames") == "1")); option = Option(def, "export_sources_full_pathnames"); m_optgroup_general->append_single_option_line(option); -#endif // ENABLE_CONFIGURABLE_PATHS_EXPORT_TO_3MF_AND_AMF // Please keep in sync with ConfigWizard def.label = L("Update built-in Presets automatically"); diff --git a/src/slic3r/Utils/FixModelByWin10.cpp b/src/slic3r/Utils/FixModelByWin10.cpp index 28f8b54d5e..0de526432b 100644 --- a/src/slic3r/Utils/FixModelByWin10.cpp +++ b/src/slic3r/Utils/FixModelByWin10.cpp @@ -363,17 +363,10 @@ void fix_model_by_win10_sdk_gui(ModelObject &model_object, int volume_idx) ModelObject *model_object = model.add_object(); model_object->add_volume(*volumes[ivolume]); model_object->add_instance(); -#if ENABLE_CONFIGURABLE_PATHS_EXPORT_TO_3MF_AND_AMF if (!Slic3r::store_3mf(path_src.string().c_str(), &model, nullptr, false)) { boost::filesystem::remove(path_src); throw std::runtime_error(L("Export of a temporary 3mf file failed")); } -#else - if (! Slic3r::store_3mf(path_src.string().c_str(), &model, nullptr)) { - boost::filesystem::remove(path_src); - throw std::runtime_error(L("Export of a temporary 3mf file failed")); - } -#endif // ENABLE_CONFIGURABLE_PATHS_EXPORT_TO_3MF_AND_AMF model.clear_objects(); model.clear_materials(); boost::filesystem::path path_dst = boost::filesystem::temp_directory_path() / boost::filesystem::unique_path(); diff --git a/tests/libslic3r/test_3mf.cpp b/tests/libslic3r/test_3mf.cpp index 6b60182b53..fb41ef93b5 100644 --- a/tests/libslic3r/test_3mf.cpp +++ b/tests/libslic3r/test_3mf.cpp @@ -51,11 +51,7 @@ SCENARIO("Export+Import geometry to/from 3mf file cycle", "[3mf]") { WHEN("model is saved+loaded to/from 3mf file") { // save the model to 3mf file std::string test_file = std::string(TEST_DATA_DIR) + "/test_3mf/prusa.3mf"; -#if ENABLE_CONFIGURABLE_PATHS_EXPORT_TO_3MF_AND_AMF store_3mf(test_file.c_str(), &src_model, nullptr, false); -#else - store_3mf(test_file.c_str(), &src_model, nullptr); -#endif // ENABLE_CONFIGURABLE_PATHS_EXPORT_TO_3MF_AND_AMF // load back the model from the 3mf file Model dst_model; From 847efec2ed71896cdb84e70cac17add166a36154 Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Thu, 13 Feb 2020 12:13:54 +0100 Subject: [PATCH 330/336] ENABLE_6DOF_CAMERA set as default --- src/libslic3r/Technologies.hpp | 3 - src/slic3r/GUI/3DBed.cpp | 10 - src/slic3r/GUI/3DBed.hpp | 4 - src/slic3r/GUI/AppConfig.cpp | 2 - src/slic3r/GUI/Camera.cpp | 328 +++++---------------------- src/slic3r/GUI/Camera.hpp | 36 +-- src/slic3r/GUI/GLCanvas3D.cpp | 55 +---- src/slic3r/GUI/Mouse3DController.cpp | 15 -- src/slic3r/GUI/Preferences.cpp | 2 - src/slic3r/GUI/Selection.cpp | 4 - 10 files changed, 63 insertions(+), 396 deletions(-) diff --git a/src/libslic3r/Technologies.hpp b/src/libslic3r/Technologies.hpp index 17adc8d472..1f934b6c8d 100644 --- a/src/libslic3r/Technologies.hpp +++ b/src/libslic3r/Technologies.hpp @@ -47,9 +47,6 @@ //================== #define ENABLE_2_2_0_BETA1 1 -// Enable 6 degrees of freedom camera -#define ENABLE_6DOF_CAMERA (1 && ENABLE_2_2_0_BETA1) - // Enhance reload from disk to be able to work with 3mf/amf files saved with PrusaSlicer 2.1.0 and earlier #define ENABLE_BACKWARD_COMPATIBLE_RELOAD_FROM_DISK (1 && ENABLE_2_2_0_BETA1) diff --git a/src/slic3r/GUI/3DBed.cpp b/src/slic3r/GUI/3DBed.cpp index 00b7f2382c..23acd18ef7 100644 --- a/src/slic3r/GUI/3DBed.cpp +++ b/src/slic3r/GUI/3DBed.cpp @@ -260,11 +260,7 @@ Point Bed3D::point_projection(const Point& point) const return m_polygon.point_projection(point); } -#if ENABLE_6DOF_CAMERA void Bed3D::render(GLCanvas3D& canvas, bool bottom, float scale_factor, bool show_axes) const -#else -void Bed3D::render(GLCanvas3D& canvas, float theta, float scale_factor, bool show_axes) const -#endif // ENABLE_6DOF_CAMERA { m_scale_factor = scale_factor; @@ -275,15 +271,9 @@ void Bed3D::render(GLCanvas3D& canvas, float theta, float scale_factor, bool sho switch (m_type) { -#if ENABLE_6DOF_CAMERA case System: { render_system(canvas, bottom); break; } default: case Custom: { render_custom(canvas, bottom); break; } -#else - case System: { render_system(canvas, theta > 90.0f); break; } - default: - case Custom: { render_custom(canvas, theta > 90.0f); break; } -#endif // ENABLE_6DOF_CAMERA } glsafe(::glDisable(GL_DEPTH_TEST)); diff --git a/src/slic3r/GUI/3DBed.hpp b/src/slic3r/GUI/3DBed.hpp index b1835a919d..3a5f959788 100644 --- a/src/slic3r/GUI/3DBed.hpp +++ b/src/slic3r/GUI/3DBed.hpp @@ -107,11 +107,7 @@ public: bool contains(const Point& point) const; Point point_projection(const Point& point) const; -#if ENABLE_6DOF_CAMERA void render(GLCanvas3D& canvas, bool bottom, float scale_factor, bool show_axes) const; -#else - void render(GLCanvas3D& canvas, float theta, float scale_factor, bool show_axes) const; -#endif // ENABLE_6DOF_CAMERA private: void calc_bounding_boxes() const; diff --git a/src/slic3r/GUI/AppConfig.cpp b/src/slic3r/GUI/AppConfig.cpp index 9bf407f93f..35799e0460 100644 --- a/src/slic3r/GUI/AppConfig.cpp +++ b/src/slic3r/GUI/AppConfig.cpp @@ -88,10 +88,8 @@ void AppConfig::set_defaults() if (get("use_perspective_camera").empty()) set("use_perspective_camera", "1"); -#if ENABLE_6DOF_CAMERA if (get("use_free_camera").empty()) set("use_free_camera", "0"); -#endif // ENABLE_6DOF_CAMERA // Remove legacy window positions/sizes erase("", "main_frame_maximized"); diff --git a/src/slic3r/GUI/Camera.cpp b/src/slic3r/GUI/Camera.cpp index 18075c3f8c..d17ba7cd7c 100644 --- a/src/slic3r/GUI/Camera.cpp +++ b/src/slic3r/GUI/Camera.cpp @@ -7,17 +7,11 @@ #include "GUI_App.hpp" #include "AppConfig.hpp" #if ENABLE_CAMERA_STATISTICS -#if ENABLE_6DOF_CAMERA #include "Mouse3DController.hpp" -#endif // ENABLE_6DOF_CAMERA #endif // ENABLE_CAMERA_STATISTICS #include -#if !ENABLE_6DOF_CAMERA -static const float GIMBALL_LOCK_THETA_MAX = 180.0f; -#endif // !ENABLE_6DOF_CAMERA - // phi / theta angles to orient the camera. static const float VIEW_DEFAULT[2] = { 45.0f, 45.0f }; static const float VIEW_LEFT[2] = { 90.0f, 90.0f }; @@ -41,29 +35,17 @@ double Camera::FrustrumZMargin = 10.0; double Camera::MaxFovDeg = 60.0; Camera::Camera() -#if ENABLE_6DOF_CAMERA : requires_zoom_to_bed(false) -#else - : phi(45.0f) - , requires_zoom_to_bed(false) - , inverted_phi(false) -#endif // ENABLE_6DOF_CAMERA , m_type(Perspective) , m_target(Vec3d::Zero()) -#if ENABLE_6DOF_CAMERA , m_zenit(45.0f) -#else - , m_theta(45.0f) -#endif // ENABLE_6DOF_CAMERA , m_zoom(1.0) , m_distance(DefaultDistance) , m_gui_scale(1.0) , m_view_matrix(Transform3d::Identity()) , m_projection_matrix(Transform3d::Identity()) { -#if ENABLE_6DOF_CAMERA set_default_orientation(); -#endif // ENABLE_6DOF_CAMERA } std::string Camera::get_type_as_string() const @@ -103,36 +85,9 @@ void Camera::select_next_type() void Camera::set_target(const Vec3d& target) { -#if ENABLE_6DOF_CAMERA translate_world(target - m_target); -#else - BoundingBoxf3 test_box = m_scene_box; - test_box.translate(-m_scene_box.center()); - // We may let this factor be customizable - static const double ScaleFactor = 1.5; - test_box.scale(ScaleFactor); - test_box.translate(m_scene_box.center()); - - m_target(0) = clamp(test_box.min(0), test_box.max(0), target(0)); - m_target(1) = clamp(test_box.min(1), test_box.max(1), target(1)); - m_target(2) = clamp(test_box.min(2), test_box.max(2), target(2)); -#endif // ENABLE_6DOF_CAMERA } -#if !ENABLE_6DOF_CAMERA -void Camera::set_theta(float theta, bool apply_limit) -{ - if (apply_limit) - m_theta = clamp(0.0f, GIMBALL_LOCK_THETA_MAX, theta); - else - { - m_theta = fmod(theta, 360.0f); - if (m_theta < 0.0f) - m_theta += 360.0f; - } -} -#endif // !ENABLE_6DOF_CAMERA - void Camera::update_zoom(double delta_zoom) { set_zoom(m_zoom / (1.0 - std::max(std::min(delta_zoom, 4.0), -4.0) * 0.1)); @@ -149,7 +104,6 @@ void Camera::set_zoom(double zoom) m_zoom = std::min(zoom, max_zoom()); } -#if ENABLE_6DOF_CAMERA void Camera::select_view(const std::string& direction) { if (direction == "iso") @@ -167,36 +121,6 @@ void Camera::select_view(const std::string& direction) else if (direction == "rear") look_at(m_target + m_distance * Vec3d::UnitY(), m_target, Vec3d::UnitZ()); } -#else -bool Camera::select_view(const std::string& direction) -{ - const float* dir_vec = nullptr; - - if (direction == "iso") - dir_vec = VIEW_DEFAULT; - else if (direction == "left") - dir_vec = VIEW_LEFT; - else if (direction == "right") - dir_vec = VIEW_RIGHT; - else if (direction == "top") - dir_vec = VIEW_TOP; - else if (direction == "bottom") - dir_vec = VIEW_BOTTOM; - else if (direction == "front") - dir_vec = VIEW_FRONT; - else if (direction == "rear") - dir_vec = VIEW_REAR; - - if (dir_vec != nullptr) - { - phi = dir_vec[0]; - set_theta(dir_vec[1], false); - return true; - } - else - return false; -} -#endif // ENABLE_6DOF_CAMERA double Camera::get_fov() const { @@ -218,102 +142,53 @@ void Camera::apply_viewport(int x, int y, unsigned int w, unsigned int h) const void Camera::apply_view_matrix() const { -#if !ENABLE_6DOF_CAMERA - double theta_rad = Geometry::deg2rad(-(double)m_theta); - double phi_rad = Geometry::deg2rad((double)phi); - double sin_theta = ::sin(theta_rad); - Vec3d camera_pos = m_target + m_distance * Vec3d(sin_theta * ::sin(phi_rad), sin_theta * ::cos(phi_rad), ::cos(theta_rad)); -#endif // !ENABLE_6DOF_CAMERA - glsafe(::glMatrixMode(GL_MODELVIEW)); glsafe(::glLoadIdentity()); - -#if ENABLE_6DOF_CAMERA glsafe(::glMultMatrixd(m_view_matrix.data())); -#else - glsafe(::glRotatef(-m_theta, 1.0f, 0.0f, 0.0f)); // pitch - glsafe(::glRotatef(phi, 0.0f, 0.0f, 1.0f)); // yaw - - glsafe(::glTranslated(-camera_pos(0), -camera_pos(1), -camera_pos(2))); - - glsafe(::glGetDoublev(GL_MODELVIEW_MATRIX, m_view_matrix.data())); -#endif // ENABLE_6DOF_CAMERA } void Camera::apply_projection(const BoundingBoxf3& box, double near_z, double far_z) const { -#if !ENABLE_6DOF_CAMERA - set_distance(DefaultDistance); -#endif // !ENABLE_6DOF_CAMERA - double w = 0.0; double h = 0.0; -#if ENABLE_6DOF_CAMERA double old_distance = m_distance; m_frustrum_zs = calc_tight_frustrum_zs_around(box); if (m_distance != old_distance) // the camera has been moved re-apply view matrix apply_view_matrix(); -#else - while (true) + + if (near_z > 0.0) + m_frustrum_zs.first = std::max(std::min(m_frustrum_zs.first, near_z), FrustrumMinNearZ); + + if (far_z > 0.0) + m_frustrum_zs.second = std::max(m_frustrum_zs.second, far_z); + + w = 0.5 * (double)m_viewport[2]; + h = 0.5 * (double)m_viewport[3]; + + double inv_zoom = get_inv_zoom(); + w *= inv_zoom; + h *= inv_zoom; + + switch (m_type) { - m_frustrum_zs = calc_tight_frustrum_zs_around(box); -#endif // !ENABLE_6DOF_CAMERA - - if (near_z > 0.0) - m_frustrum_zs.first = std::max(std::min(m_frustrum_zs.first, near_z), FrustrumMinNearZ); - - if (far_z > 0.0) - m_frustrum_zs.second = std::max(m_frustrum_zs.second, far_z); - - w = 0.5 * (double)m_viewport[2]; - h = 0.5 * (double)m_viewport[3]; - - double inv_zoom = get_inv_zoom(); - w *= inv_zoom; - h *= inv_zoom; - - switch (m_type) - { - default: - case Ortho: - { - m_gui_scale = 1.0; - break; - } - case Perspective: - { - // scale near plane to keep w and h constant on the plane at z = m_distance - double scale = m_frustrum_zs.first / m_distance; - w *= scale; - h *= scale; - m_gui_scale = scale; - break; - } - } - -#if !ENABLE_6DOF_CAMERA - if (m_type == Perspective) - { - double fov_deg = Geometry::rad2deg(2.0 * std::atan(h / m_frustrum_zs.first)); - - // adjust camera distance to keep fov in a limited range - if (fov_deg > MaxFovDeg) - { - double delta_z = h / ::tan(0.5 * Geometry::deg2rad(MaxFovDeg)) - m_frustrum_zs.first; - if (delta_z > 0.001) - set_distance(m_distance + delta_z); - else - break; - } - else - break; - } - else - break; + default: + case Ortho: + { + m_gui_scale = 1.0; + break; + } + case Perspective: + { + // scale near plane to keep w and h constant on the plane at z = m_distance + double scale = m_frustrum_zs.first / m_distance; + w *= scale; + h *= scale; + m_gui_scale = scale; + break; + } } -#endif // !ENABLE_6DOF_CAMERA glsafe(::glMatrixMode(GL_PROJECTION)); glsafe(::glLoadIdentity()); @@ -338,22 +213,14 @@ void Camera::apply_projection(const BoundingBoxf3& box, double near_z, double fa } #if ENABLE_THUMBNAIL_GENERATOR -#if ENABLE_6DOF_CAMERA void Camera::zoom_to_box(const BoundingBoxf3& box, double margin_factor) #else -void Camera::zoom_to_box(const BoundingBoxf3& box, int canvas_w, int canvas_h, double margin_factor) -#endif // ENABLE_6DOF_CAMERA -#else void Camera::zoom_to_box(const BoundingBoxf3& box, int canvas_w, int canvas_h) #endif // ENABLE_THUMBNAIL_GENERATOR { // Calculate the zoom factor needed to adjust the view around the given box. #if ENABLE_THUMBNAIL_GENERATOR -#if ENABLE_6DOF_CAMERA double zoom = calc_zoom_to_bounding_box_factor(box, margin_factor); -#else - double zoom = calc_zoom_to_bounding_box_factor(box, canvas_w, canvas_h, margin_factor); -#endif // ENABLE_6DOF_CAMERA #else double zoom = calc_zoom_to_bounding_box_factor(box, canvas_w, canvas_h); #endif // ENABLE_THUMBNAIL_GENERATOR @@ -361,36 +228,20 @@ void Camera::zoom_to_box(const BoundingBoxf3& box, int canvas_w, int canvas_h) { m_zoom = zoom; // center view around box center -#if ENABLE_6DOF_CAMERA set_target(box.center()); -#else - m_target = box.center(); -#endif // ENABLE_6DOF_CAMERA } } #if ENABLE_THUMBNAIL_GENERATOR -#if ENABLE_6DOF_CAMERA void Camera::zoom_to_volumes(const GLVolumePtrs& volumes, double margin_factor) -#else -void Camera::zoom_to_volumes(const GLVolumePtrs& volumes, int canvas_w, int canvas_h, double margin_factor) -#endif // ENABLE_6DOF_CAMERA { Vec3d center; -#if ENABLE_6DOF_CAMERA double zoom = calc_zoom_to_volumes_factor(volumes, center, margin_factor); -#else - double zoom = calc_zoom_to_volumes_factor(volumes, canvas_w, canvas_h, center, margin_factor); -#endif // ENABLE_6DOF_CAMERA if (zoom > 0.0) { m_zoom = zoom; // center view around the calculated center -#if ENABLE_6DOF_CAMERA set_target(center); -#else - m_target = center; -#endif // ENABLE_6DOF_CAMERA } } #endif // ENABLE_THUMBNAIL_GENERATOR @@ -402,18 +253,15 @@ void Camera::debug_render() const imgui.begin(std::string("Camera statistics"), ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse); std::string type = get_type_as_string(); -#if ENABLE_6DOF_CAMERA if (wxGetApp().plater()->get_mouse3d_controller().is_running() || (wxGetApp().app_config->get("use_free_camera") == "1")) type += "/free"; else type += "/constrained"; -#endif // ENABLE_6DOF_CAMERA + Vec3f position = get_position().cast(); Vec3f target = m_target.cast(); float distance = (float)get_distance(); -#if ENABLE_6DOF_CAMERA float zenit = (float)m_zenit; -#endif // ENABLE_6DOF_CAMERA Vec3f forward = get_dir_forward().cast(); Vec3f right = get_dir_right().cast(); Vec3f up = get_dir_up().cast(); @@ -430,10 +278,8 @@ void Camera::debug_render() const ImGui::InputFloat3("Position", position.data(), "%.6f", ImGuiInputTextFlags_ReadOnly); ImGui::InputFloat3("Target", target.data(), "%.6f", ImGuiInputTextFlags_ReadOnly); ImGui::InputFloat("Distance", &distance, 0.0f, 0.0f, "%.6f", ImGuiInputTextFlags_ReadOnly); -#if ENABLE_6DOF_CAMERA ImGui::Separator(); ImGui::InputFloat("Zenit", &zenit, 0.0f, 0.0f, "%.6f", ImGuiInputTextFlags_ReadOnly); -#endif // ENABLE_6DOF_CAMERA ImGui::Separator(); ImGui::InputFloat3("Forward", forward.data(), "%.6f", ImGuiInputTextFlags_ReadOnly); ImGui::InputFloat3("Right", right.data(), "%.6f", ImGuiInputTextFlags_ReadOnly); @@ -453,7 +299,6 @@ void Camera::debug_render() const } #endif // ENABLE_CAMERA_STATISTICS -#if ENABLE_6DOF_CAMERA void Camera::translate_world(const Vec3d& displacement) { Vec3d new_target = validate_target(m_target + displacement); @@ -524,15 +369,10 @@ void Camera::rotate_local_around_pivot(const Vec3d& rotation_rad, const Vec3d& p translate_world(center); update_zenit(); } -#endif // ENABLE_6DOF_CAMERA double Camera::min_zoom() const { -#if ENABLE_6DOF_CAMERA return 0.7 * calc_zoom_to_bounding_box_factor(m_scene_box); -#else - return 0.7 * calc_zoom_to_bounding_box_factor(m_scene_box, m_viewport[2], m_viewport[3]); -#endif // ENABLE_6DOF_CAMERA } std::pair Camera::calc_tight_frustrum_zs_around(const BoundingBoxf3& box) const @@ -540,62 +380,45 @@ std::pair Camera::calc_tight_frustrum_zs_around(const BoundingBo std::pair ret; auto& [near_z, far_z] = ret; -#if !ENABLE_6DOF_CAMERA - while (true) + // box in eye space + BoundingBoxf3 eye_box = box.transformed(m_view_matrix); + near_z = -eye_box.max(2); + far_z = -eye_box.min(2); + + // apply margin + near_z -= FrustrumZMargin; + far_z += FrustrumZMargin; + + // ensure min size + if (far_z - near_z < FrustrumMinZRange) { -#endif // !ENABLE_6DOF_CAMERA - // box in eye space - BoundingBoxf3 eye_box = box.transformed(m_view_matrix); - near_z = -eye_box.max(2); - far_z = -eye_box.min(2); - - // apply margin - near_z -= FrustrumZMargin; - far_z += FrustrumZMargin; - - // ensure min size - if (far_z - near_z < FrustrumMinZRange) - { - double mid_z = 0.5 * (near_z + far_z); - double half_size = 0.5 * FrustrumMinZRange; - near_z = mid_z - half_size; - far_z = mid_z + half_size; - } - -#if ENABLE_6DOF_CAMERA - if (near_z < FrustrumMinNearZ) - { - float delta = FrustrumMinNearZ - near_z; - set_distance(m_distance + delta); - near_z += delta; - far_z += delta; - } - else if ((near_z > 2.0 * FrustrumMinNearZ) && (m_distance > DefaultDistance)) - { - float delta = m_distance - DefaultDistance; - set_distance(DefaultDistance); - near_z -= delta; - far_z -= delta; - } -#else - if (near_z >= FrustrumMinNearZ) - break; - - // ensure min near z - set_distance(m_distance + FrustrumMinNearZ - near_z); + double mid_z = 0.5 * (near_z + far_z); + double half_size = 0.5 * FrustrumMinZRange; + near_z = mid_z - half_size; + far_z = mid_z + half_size; + } + + if (near_z < FrustrumMinNearZ) + { + float delta = FrustrumMinNearZ - near_z; + set_distance(m_distance + delta); + near_z += delta; + far_z += delta; + } + else if ((near_z > 2.0 * FrustrumMinNearZ) && (m_distance > DefaultDistance)) + { + float delta = m_distance - DefaultDistance; + set_distance(DefaultDistance); + near_z -= delta; + far_z -= delta; } -#endif // ENABLE_6DOF_CAMERA return ret; } #if ENABLE_THUMBNAIL_GENERATOR -#if ENABLE_6DOF_CAMERA double Camera::calc_zoom_to_bounding_box_factor(const BoundingBoxf3& box, double margin_factor) const #else -double Camera::calc_zoom_to_bounding_box_factor(const BoundingBoxf3& box, int canvas_w, int canvas_h, double margin_factor) const -#endif // ENABLE_6DOF_CAMERA -#else double Camera::calc_zoom_to_bounding_box_factor(const BoundingBoxf3& box, int canvas_w, int canvas_h) const #endif // ENABLE_THUMBNAIL_GENERATOR { @@ -606,11 +429,6 @@ double Camera::calc_zoom_to_bounding_box_factor(const BoundingBoxf3& box, int ca // project the box vertices on a plane perpendicular to the camera forward axis // then calculates the vertices coordinate on this plane along the camera xy axes -#if !ENABLE_6DOF_CAMERA - // ensure that the view matrix is updated - apply_view_matrix(); -#endif // !ENABLE_6DOF_CAMERA - Vec3d right = get_dir_right(); Vec3d up = get_dir_up(); Vec3d forward = get_dir_forward(); @@ -666,19 +484,11 @@ double Camera::calc_zoom_to_bounding_box_factor(const BoundingBoxf3& box, int ca dx *= margin_factor; dy *= margin_factor; -#if ENABLE_6DOF_CAMERA return std::min((double)m_viewport[2] / dx, (double)m_viewport[3] / dy); -#else - return std::min((double)canvas_w / dx, (double)canvas_h / dy); -#endif // ENABLE_6DOF_CAMERA } #if ENABLE_THUMBNAIL_GENERATOR -#if ENABLE_6DOF_CAMERA double Camera::calc_zoom_to_volumes_factor(const GLVolumePtrs& volumes, Vec3d& center, double margin_factor) const -#else -double Camera::calc_zoom_to_volumes_factor(const GLVolumePtrs& volumes, int canvas_w, int canvas_h, Vec3d& center, double margin_factor) const -#endif // ENABLE_6DOF_CAMERA { if (volumes.empty()) return -1.0; @@ -686,11 +496,6 @@ double Camera::calc_zoom_to_volumes_factor(const GLVolumePtrs& volumes, int canv // project the volumes vertices on a plane perpendicular to the camera forward axis // then calculates the vertices coordinate on this plane along the camera xy axes -#if !ENABLE_6DOF_CAMERA - // ensure that the view matrix is updated - apply_view_matrix(); -#endif // !ENABLE_6DOF_CAMERA - Vec3d right = get_dir_right(); Vec3d up = get_dir_up(); Vec3d forward = get_dir_forward(); @@ -741,29 +546,19 @@ double Camera::calc_zoom_to_volumes_factor(const GLVolumePtrs& volumes, int canv if ((dx <= 0.0) || (dy <= 0.0)) return -1.0f; -#if ENABLE_6DOF_CAMERA return std::min((double)m_viewport[2] / dx, (double)m_viewport[3] / dy); -#else - return std::min((double)canvas_w / dx, (double)canvas_h / dy); -#endif // ENABLE_6DOF_CAMERA } #endif // ENABLE_THUMBNAIL_GENERATOR void Camera::set_distance(double distance) const { -#if ENABLE_6DOF_CAMERA if (m_distance != distance) { m_view_matrix.translate((distance - m_distance) * get_dir_forward()); m_distance = distance; } -#else - m_distance = distance; - apply_view_matrix(); -#endif // ENABLE_6DOF_CAMERA } -#if ENABLE_6DOF_CAMERA void Camera::look_at(const Vec3d& position, const Vec3d& target, const Vec3d& up) { Vec3d unit_z = (position - target).normalized(); @@ -825,7 +620,6 @@ void Camera::update_zenit() { m_zenit = Geometry::rad2deg(0.5 * M_PI - std::acos(std::clamp(-get_dir_forward().dot(Vec3d::UnitZ()), -1.0, 1.0))); } -#endif // ENABLE_6DOF_CAMERA } // GUI } // Slic3r diff --git a/src/slic3r/GUI/Camera.hpp b/src/slic3r/GUI/Camera.hpp index cda6b77b4b..0ddaa8ff38 100644 --- a/src/slic3r/GUI/Camera.hpp +++ b/src/slic3r/GUI/Camera.hpp @@ -30,20 +30,12 @@ struct Camera Num_types }; -#if !ENABLE_6DOF_CAMERA - float phi; - bool inverted_phi; -#endif // !ENABLE_6DOF_CAMERA bool requires_zoom_to_bed; private: EType m_type; Vec3d m_target; -#if ENABLE_6DOF_CAMERA float m_zenit; -#else - float m_theta; -#endif // ENABLE_6DOF_CAMERA double m_zoom; // Distance between camera position and camera target measured along the camera Z axis mutable double m_distance; @@ -69,18 +61,9 @@ public: const Vec3d& get_target() const { return m_target; } void set_target(const Vec3d& target); -#if ENABLE_6DOF_CAMERA double get_distance() const { return (get_position() - m_target).norm(); } -#else - double get_distance() const { return m_distance; } -#endif // ENABLE_6DOF_CAMERA double get_gui_scale() const { return m_gui_scale; } -#if !ENABLE_6DOF_CAMERA - float get_theta() const { return m_theta; } - void set_theta(float theta, bool apply_limit); -#endif // !ENABLE_6DOF_CAMERA - double get_zoom() const { return m_zoom; } double get_inv_zoom() const { assert(m_zoom != 0.0); return 1.0 / m_zoom; } void update_zoom(double delta_zoom); @@ -89,11 +72,7 @@ public: const BoundingBoxf3& get_scene_box() const { return m_scene_box; } void set_scene_box(const BoundingBoxf3& box) { m_scene_box = box; } -#if ENABLE_6DOF_CAMERA void select_view(const std::string& direction); -#else - bool select_view(const std::string& direction); -#endif // ENABLE_6DOF_CAMERA const std::array& get_viewport() const { return m_viewport; } const Transform3d& get_view_matrix() const { return m_view_matrix; } @@ -117,13 +96,8 @@ public: void apply_projection(const BoundingBoxf3& box, double near_z = -1.0, double far_z = -1.0) const; #if ENABLE_THUMBNAIL_GENERATOR -#if ENABLE_6DOF_CAMERA void zoom_to_box(const BoundingBoxf3& box, double margin_factor = DefaultZoomToBoxMarginFactor); void zoom_to_volumes(const GLVolumePtrs& volumes, double margin_factor = DefaultZoomToVolumesMarginFactor); -#else - void zoom_to_box(const BoundingBoxf3& box, int canvas_w, int canvas_h, double margin_factor = DefaultZoomToBoxMarginFactor); - void zoom_to_volumes(const GLVolumePtrs& volumes, int canvas_w, int canvas_h, double margin_factor = DefaultZoomToVolumesMarginFactor); -#endif // ENABLE_6DOF_CAMERA #else void zoom_to_box(const BoundingBoxf3& box, int canvas_w, int canvas_h); #endif // ENABLE_THUMBNAIL_GENERATOR @@ -132,7 +106,6 @@ public: void debug_render() const; #endif // ENABLE_CAMERA_STATISTICS -#if ENABLE_6DOF_CAMERA // translate the camera in world space void translate_world(const Vec3d& displacement); @@ -149,7 +122,7 @@ public: // returns true if the camera z axis (forward) is pointing in the negative direction of the world z axis bool is_looking_downward() const { return get_dir_forward().dot(Vec3d::UnitZ()) < 0.0; } -#endif // ENABLE_6DOF_CAMERA + double max_zoom() const { return 100.0; } double min_zoom() const; @@ -158,24 +131,17 @@ private: // the camera MUST be outside of the bounding box in eye coordinate of the given box std::pair calc_tight_frustrum_zs_around(const BoundingBoxf3& box) const; #if ENABLE_THUMBNAIL_GENERATOR -#if ENABLE_6DOF_CAMERA double calc_zoom_to_bounding_box_factor(const BoundingBoxf3& box, double margin_factor = DefaultZoomToBoxMarginFactor) const; double calc_zoom_to_volumes_factor(const GLVolumePtrs& volumes, Vec3d& center, double margin_factor = DefaultZoomToVolumesMarginFactor) const; -#else - double calc_zoom_to_bounding_box_factor(const BoundingBoxf3& box, int canvas_w, int canvas_h, double margin_factor = DefaultZoomToBoxMarginFactor) const; - double calc_zoom_to_volumes_factor(const GLVolumePtrs& volumes, int canvas_w, int canvas_h, Vec3d& center, double margin_factor = DefaultZoomToVolumesMarginFactor) const; -#endif // ENABLE_6DOF_CAMERA #else double calc_zoom_to_bounding_box_factor(const BoundingBoxf3& box, int canvas_w, int canvas_h) const; #endif // ENABLE_THUMBNAIL_GENERATOR void set_distance(double distance) const; -#if ENABLE_6DOF_CAMERA void look_at(const Vec3d& position, const Vec3d& target, const Vec3d& up); void set_default_orientation(); Vec3d validate_target(const Vec3d& target) const; void update_zenit(); -#endif // ENABLE_6DOF_CAMERA }; } // GUI diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index ac6071d3f9..26d3b14d66 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -1809,14 +1809,9 @@ void GLCanvas3D::zoom_to_selection() void GLCanvas3D::select_view(const std::string& direction) { -#if ENABLE_6DOF_CAMERA m_camera.select_view(direction); if (m_canvas != nullptr) m_canvas->Refresh(); -#else - if (m_camera.select_view(direction) && (m_canvas != nullptr)) - m_canvas->Refresh(); -#endif // ENABLE_6DOF_CAMERA } void GLCanvas3D::update_volumes_colors_by_extruder() @@ -1857,13 +1852,11 @@ void GLCanvas3D::render() } const Size& cnv_size = get_canvas_size(); -#if ENABLE_6DOF_CAMERA // Probably due to different order of events on Linux/GTK2, when one switched from 3D scene // to preview, this was called before canvas had its final size. It reported zero width // and the viewport was set incorrectly, leading to tripping glAsserts further down // the road (in apply_projection). That's why the minimum size is forced to 10. m_camera.apply_viewport(0, 0, std::max(10u, (unsigned int)cnv_size.get_width()), std::max(10u, (unsigned int)cnv_size.get_height())); -#endif // ENABLE_6DOF_CAMERA if (m_camera.requires_zoom_to_bed) { @@ -1880,13 +1873,6 @@ void GLCanvas3D::render() GLfloat position_top[4] = { -0.5f, -0.5f, 1.0f, 0.0f }; glsafe(::glLightfv(GL_LIGHT0, GL_POSITION, position_top)); -#if !ENABLE_6DOF_CAMERA - float theta = m_camera.get_theta(); - if (theta > 180.f) - // absolute value of the rotation - theta = 360.f - theta; -#endif // !ENABLE_6DOF_CAMERA - wxGetApp().imgui()->new_frame(); if (m_picking_enabled) @@ -1910,11 +1896,7 @@ void GLCanvas3D::render() _render_objects(); _render_sla_slices(); _render_selection(); -#if ENABLE_6DOF_CAMERA _render_bed(!m_camera.is_looking_downward(), true); -#else - _render_bed(theta, true); -#endif // ENABLE_6DOF_CAMERA #if ENABLE_RENDER_SELECTION_CENTER _render_selection_center(); @@ -3429,11 +3411,7 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) // we do not want to translate objects if the user just clicked on an object while pressing shift to remove it from the selection and then drag if (m_selection.contains_volume(get_first_hover_volume_idx())) { -#if ENABLE_6DOF_CAMERA if (std::abs(m_camera.get_dir_forward()(2)) < EPSILON) -#else - if (m_camera.get_theta() == 90.0f) -#endif // ENABLE_6DOF_CAMERA { // side view -> move selected volumes orthogonally to camera view direction Linef3 ray = mouse_ray(pos); @@ -3493,18 +3471,13 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) if (m_hover_volume_idxs.empty() && m_mouse.is_start_position_3D_defined()) { const Vec3d& orig = m_mouse.drag.start_position_3D; -#if ENABLE_6DOF_CAMERA double x = Geometry::deg2rad(pos(0) - orig(0)) * (double)TRACKBALLSIZE; double y = Geometry::deg2rad(pos(1) - orig(1)) * (double)TRACKBALLSIZE; if (wxGetApp().plater()->get_mouse3d_controller().is_running() || (wxGetApp().app_config->get("use_free_camera") == "1")) m_camera.rotate_local_around_target(Vec3d(y, x, 0.0)); else m_camera.rotate_on_sphere(x, y, wxGetApp().preset_bundle->printers.get_edited_preset().printer_technology() != ptSLA); -#else - float sign = m_camera.inverted_phi ? -1.0f : 1.0f; - m_camera.phi += sign * ((float)pos(0) - (float)orig(0)) * TRACKBALLSIZE; - m_camera.set_theta(m_camera.get_theta() - ((float)pos(1) - (float)orig(1)) * TRACKBALLSIZE, wxGetApp().preset_bundle->printers.get_edited_preset().printer_technology() != ptSLA); -#endif // ENABLE_6DOF_CAMERA + m_dirty = true; } m_mouse.drag.start_position_3D = Vec3d((double)pos(0), (double)pos(1), 0.0); @@ -3554,11 +3527,6 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) if (!evt.ShiftDown() && m_picking_enabled) deselect_all(); } -#if !ENABLE_6DOF_CAMERA - else if (evt.LeftUp() && m_mouse.dragging) - // Flips X mouse deltas if bed is upside down - m_camera.inverted_phi = (m_camera.get_dir_up()(2) < 0.0); -#endif // !ENABLE_6DOF_CAMERA else if (evt.RightUp()) { m_mouse.position = pos.cast(); @@ -4163,16 +4131,9 @@ void GLCanvas3D::_render_thumbnail_internal(ThumbnailData& thumbnail_data, bool Camera camera; camera.set_type(Camera::Ortho); -#if ENABLE_6DOF_CAMERA camera.set_scene_box(scene_bounding_box()); -#endif // ENABLE_6DOF_CAMERA -#if ENABLE_6DOF_CAMERA camera.apply_viewport(0, 0, thumbnail_data.width, thumbnail_data.height); camera.zoom_to_volumes(visible_volumes); -#else - camera.zoom_to_volumes(visible_volumes, thumbnail_data.width, thumbnail_data.height); - camera.apply_viewport(0, 0, thumbnail_data.width, thumbnail_data.height); -#endif // ENABLE_6DOF_CAMERA camera.apply_view_matrix(); double near_z = -1.0; @@ -4221,11 +4182,7 @@ void GLCanvas3D::_render_thumbnail_internal(ThumbnailData& thumbnail_data, bool glsafe(::glDisable(GL_DEPTH_TEST)); if (show_bed) -#if ENABLE_6DOF_CAMERA _render_bed(!camera.is_looking_downward(), false); -#else - _render_bed(camera.get_theta(), false); -#endif // ENABLE_6DOF_CAMERA if (transparent_background) glsafe(::glClearColor(1.0f, 1.0f, 1.0f, 1.0f)); @@ -4762,11 +4719,6 @@ void GLCanvas3D::_resize(unsigned int w, unsigned int h) // ensures that this canvas is current _set_current(); - -#if !ENABLE_6DOF_CAMERA - // updates camera - m_camera.apply_viewport(0, 0, w, h); -#endif // !ENABLE_6DOF_CAMERA } BoundingBoxf3 GLCanvas3D::_max_bounding_box(bool include_gizmos, bool include_bed_model) const @@ -4790,12 +4742,7 @@ BoundingBoxf3 GLCanvas3D::_max_bounding_box(bool include_gizmos, bool include_be #if ENABLE_THUMBNAIL_GENERATOR void GLCanvas3D::_zoom_to_box(const BoundingBoxf3& box, double margin_factor) { -#if ENABLE_6DOF_CAMERA m_camera.zoom_to_box(box, margin_factor); -#else - const Size& cnv_size = get_canvas_size(); - m_camera.zoom_to_box(box, cnv_size.get_width(), cnv_size.get_height(), margin_factor); -#endif // ENABLE_6DOF_CAMERA m_dirty = true; } #else diff --git a/src/slic3r/GUI/Mouse3DController.cpp b/src/slic3r/GUI/Mouse3DController.cpp index a6d7cbef45..2be017e540 100644 --- a/src/slic3r/GUI/Mouse3DController.cpp +++ b/src/slic3r/GUI/Mouse3DController.cpp @@ -162,17 +162,8 @@ bool Mouse3DController::State::apply(Camera& camera) if (has_rotation()) { -#if ENABLE_6DOF_CAMERA Vec3d rotation = (m_rotation_params.scale * m_rotation.queue.front()).cast(); camera.rotate_local_around_target(Vec3d(Geometry::deg2rad(rotation(0)), Geometry::deg2rad(-rotation(2)), Geometry::deg2rad(-rotation(1)))); -#else - const Vec3f& rotation = m_rotation.queue.front(); - float theta = m_rotation_params.scale * rotation(0); - float phi = m_rotation_params.scale * rotation(2); - float sign = camera.inverted_phi ? -1.0f : 1.0f; - camera.phi += sign * phi; - camera.set_theta(camera.get_theta() + theta, wxGetApp().preset_bundle->printers.get_edited_preset().printer_technology() != ptSLA); -#endif // ENABLE_6DOF_CAMERA m_rotation.queue.pop(); ret = true; } @@ -887,15 +878,9 @@ bool Mouse3DController::handle_packet_translation(const DataPacketRaw& packet) bool Mouse3DController::handle_packet_rotation(const DataPacketRaw& packet, unsigned int first_byte) { double deadzone = (double)m_state.get_rotation_deadzone(); -#if ENABLE_6DOF_CAMERA Vec3f rotation((float)convert_input(packet[first_byte + 0], packet[first_byte + 1], deadzone), (float)convert_input(packet[first_byte + 2], packet[first_byte + 3], deadzone), (float)convert_input(packet[first_byte + 4], packet[first_byte + 5], deadzone)); -#else - Vec3f rotation(-(float)convert_input(packet[first_byte + 0], packet[first_byte + 1], deadzone), - (float)convert_input(packet[first_byte + 2], packet[first_byte + 3], deadzone), - -(float)convert_input(packet[first_byte + 4], packet[first_byte + 5], deadzone)); -#endif // ENABLE_6DOF_CAMERA if (!rotation.isApprox(Vec3f::Zero())) { diff --git a/src/slic3r/GUI/Preferences.cpp b/src/slic3r/GUI/Preferences.cpp index 118ecf87ac..1299d9a48a 100644 --- a/src/slic3r/GUI/Preferences.cpp +++ b/src/slic3r/GUI/Preferences.cpp @@ -123,14 +123,12 @@ void PreferencesDialog::build() option = Option(def, "use_perspective_camera"); m_optgroup_camera->append_single_option_line(option); -#if ENABLE_6DOF_CAMERA def.label = L("Use free camera"); def.type = coBool; def.tooltip = L("If enabled, use free camera. If not enabled, use constrained camera."); def.set_default_value(new ConfigOptionBool(app_config->get("use_free_camera") == "1")); option = Option(def, "use_free_camera"); m_optgroup_camera->append_single_option_line(option); -#endif // ENABLE_6DOF_CAMERA m_optgroup_gui = std::make_shared(this, _(L("GUI"))); m_optgroup_gui->label_width = 40; diff --git a/src/slic3r/GUI/Selection.cpp b/src/slic3r/GUI/Selection.cpp index a4f5a4126d..bb81b56c0d 100644 --- a/src/slic3r/GUI/Selection.cpp +++ b/src/slic3r/GUI/Selection.cpp @@ -2005,11 +2005,7 @@ void Selection::render_sidebar_layers_hints(const std::string& sidebar_field) co const float max_y = box.max(1) + Margin; // view dependend order of rendering to keep correct transparency -#if ENABLE_6DOF_CAMERA bool camera_on_top = wxGetApp().plater()->get_camera().is_looking_downward(); -#else - bool camera_on_top = wxGetApp().plater()->get_camera().get_theta() <= 90.0f; -#endif // ENABLE_6DOF_CAMERA float z1 = camera_on_top ? min_z : max_z; float z2 = camera_on_top ? max_z : min_z; From 6914f688f8c5fc46ecc9a8578f7a093452c142fa Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Thu, 13 Feb 2020 12:43:19 +0100 Subject: [PATCH 331/336] ENABLE_BACKWARD_COMPATIBLE_RELOAD_FROM_DISK set as default --- src/libslic3r/Technologies.hpp | 3 --- src/slic3r/GUI/GUI_ObjectList.cpp | 2 -- src/slic3r/GUI/Plater.cpp | 35 ------------------------------- src/slic3r/GUI/Plater.hpp | 2 -- 4 files changed, 42 deletions(-) diff --git a/src/libslic3r/Technologies.hpp b/src/libslic3r/Technologies.hpp index 1f934b6c8d..e918ac5751 100644 --- a/src/libslic3r/Technologies.hpp +++ b/src/libslic3r/Technologies.hpp @@ -47,9 +47,6 @@ //================== #define ENABLE_2_2_0_BETA1 1 -// Enhance reload from disk to be able to work with 3mf/amf files saved with PrusaSlicer 2.1.0 and earlier -#define ENABLE_BACKWARD_COMPATIBLE_RELOAD_FROM_DISK (1 && ENABLE_2_2_0_BETA1) - // Enable showing object/instance info with labels into the 3D scene #define ENABLE_SHOW_SCENE_LABELS (1 && ENABLE_2_2_0_BETA1) diff --git a/src/slic3r/GUI/GUI_ObjectList.cpp b/src/slic3r/GUI/GUI_ObjectList.cpp index 6e5c601d3e..11eebb0de3 100644 --- a/src/slic3r/GUI/GUI_ObjectList.cpp +++ b/src/slic3r/GUI/GUI_ObjectList.cpp @@ -2270,9 +2270,7 @@ void ObjectList::split() add_settings_item(vol_item, &volume->config); } -#if ENABLE_BACKWARD_COMPATIBLE_RELOAD_FROM_DISK model_object->input_file.clear(); -#endif // ENABLE_BACKWARD_COMPATIBLE_RELOAD_FROM_DISK if (parent == item) Expand(parent); diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index d351d57936..f3f96a2df3 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -26,9 +26,7 @@ #include #include #include -#if ENABLE_BACKWARD_COMPATIBLE_RELOAD_FROM_DISK #include -#endif // ENABLE_BACKWARD_COMPATIBLE_RELOAD_FROM_DISK #include "libslic3r/libslic3r.h" #include "libslic3r/Format/STL.hpp" @@ -1790,9 +1788,7 @@ struct Plater::priv #endif // ENABLE_SHOW_SCENE_LABELS void set_current_canvas_as_dirty(); -#if ENABLE_BACKWARD_COMPATIBLE_RELOAD_FROM_DISK GLCanvas3D* get_current_canvas3D(); -#endif // ENABLE_BACKWARD_COMPATIBLE_RELOAD_FROM_DISK bool init_view_toolbar(); @@ -3256,10 +3252,8 @@ void Plater::priv::reload_from_disk() else missing_input_paths.push_back(volume->source.input_file); } -#if ENABLE_BACKWARD_COMPATIBLE_RELOAD_FROM_DISK else if (!object->input_file.empty() && !volume->name.empty()) missing_input_paths.push_back(volume->name); -#endif // ENABLE_BACKWARD_COMPATIBLE_RELOAD_FROM_DISK } std::sort(missing_input_paths.begin(), missing_input_paths.end()); @@ -3314,19 +3308,15 @@ void Plater::priv::reload_from_disk() std::sort(input_paths.begin(), input_paths.end()); input_paths.erase(std::unique(input_paths.begin(), input_paths.end()), input_paths.end()); -#if ENABLE_BACKWARD_COMPATIBLE_RELOAD_FROM_DISK std::vector fail_list; -#endif // ENABLE_BACKWARD_COMPATIBLE_RELOAD_FROM_DISK // load one file at a time for (size_t i = 0; i < input_paths.size(); ++i) { const auto& path = input_paths[i].string(); -#if ENABLE_BACKWARD_COMPATIBLE_RELOAD_FROM_DISK wxBusyCursor wait; wxBusyInfo info(_(L("Reload from: ")) + from_u8(path), q->get_current_canvas3D()->get_wxglcanvas()); -#endif // ENABLE_BACKWARD_COMPATIBLE_RELOAD_FROM_DISK Model new_model; try @@ -3350,19 +3340,10 @@ void Plater::priv::reload_from_disk() ModelObject* old_model_object = model.objects[sel_v.object_idx]; ModelVolume* old_volume = old_model_object->volumes[sel_v.volume_idx]; -#if ENABLE_BACKWARD_COMPATIBLE_RELOAD_FROM_DISK bool has_source = !old_volume->source.input_file.empty() && boost::algorithm::iequals(fs::path(old_volume->source.input_file).filename().string(), fs::path(path).filename().string()); bool has_name = !old_volume->name.empty() && boost::algorithm::iequals(old_volume->name, fs::path(path).filename().string()); if (has_source || has_name) -#else - int new_volume_idx = old_volume->source.volume_idx; - int new_object_idx = old_volume->source.object_idx; - - if (boost::algorithm::iequals(fs::path(old_volume->source.input_file).filename().string(), - fs::path(path).filename().string())) -#endif // ENABLE_BACKWARD_COMPATIBLE_RELOAD_FROM_DISK { -#if ENABLE_BACKWARD_COMPATIBLE_RELOAD_FROM_DISK int new_volume_idx = -1; int new_object_idx = -1; if (has_source) @@ -3398,17 +3379,12 @@ void Plater::priv::reload_from_disk() fail_list.push_back(from_u8(has_source ? old_volume->source.input_file : old_volume->name)); continue; } -#else - assert(new_object_idx < (int)new_model.objects.size()); -#endif // ENABLE_BACKWARD_COMPATIBLE_RELOAD_FROM_DISK ModelObject* new_model_object = new_model.objects[new_object_idx]; -#if ENABLE_BACKWARD_COMPATIBLE_RELOAD_FROM_DISK if ((new_volume_idx < 0) && ((int)new_model.objects.size() <= new_volume_idx)) { fail_list.push_back(from_u8(has_source ? old_volume->source.input_file : old_volume->name)); continue; } -#endif // ENABLE_BACKWARD_COMPATIBLE_RELOAD_FROM_DISK if (new_volume_idx < (int)new_model_object->volumes.size()) { old_model_object->add_volume(*new_model_object->volumes[new_volume_idx]); @@ -3419,9 +3395,6 @@ void Plater::priv::reload_from_disk() new_volume->set_material_id(old_volume->material_id()); new_volume->set_transformation(old_volume->get_transformation() * old_volume->source.transform); new_volume->translate(new_volume->get_transformation().get_matrix(true) * (new_volume->source.mesh_offset - old_volume->source.mesh_offset)); -#if !ENABLE_BACKWARD_COMPATIBLE_RELOAD_FROM_DISK - new_volume->source.input_file = path; -#endif // !ENABLE_BACKWARD_COMPATIBLE_RELOAD_FROM_DISK std::swap(old_model_object->volumes[sel_v.volume_idx], old_model_object->volumes.back()); old_model_object->delete_volume(old_model_object->volumes.size() - 1); old_model_object->ensure_on_bed(); @@ -3430,7 +3403,6 @@ void Plater::priv::reload_from_disk() } } -#if ENABLE_BACKWARD_COMPATIBLE_RELOAD_FROM_DISK if (!fail_list.empty()) { wxString message = _(L("Unable to reload:")) + "\n"; @@ -3441,7 +3413,6 @@ void Plater::priv::reload_from_disk() wxMessageDialog dlg(q, message, _(L("Error during reload")), wxOK | wxOK_DEFAULT | wxICON_WARNING); dlg.ShowModal(); } -#endif // ENABLE_BACKWARD_COMPATIBLE_RELOAD_FROM_DISK // update 3D scene update(); @@ -4073,12 +4044,10 @@ void Plater::priv::set_current_canvas_as_dirty() preview->set_as_dirty(); } -#if ENABLE_BACKWARD_COMPATIBLE_RELOAD_FROM_DISK GLCanvas3D* Plater::priv::get_current_canvas3D() { return (current_panel == view3D) ? view3D->get_canvas3d() : ((current_panel == preview) ? preview->get_canvas3d() : nullptr); } -#endif // ENABLE_BACKWARD_COMPATIBLE_RELOAD_FROM_DISK bool Plater::priv::init_view_toolbar() { @@ -4190,10 +4159,8 @@ bool Plater::priv::can_reload_from_disk() const const ModelVolume* volume = object->volumes[v.volume_idx]; if (!volume->source.input_file.empty()) paths.push_back(volume->source.input_file); -#if ENABLE_BACKWARD_COMPATIBLE_RELOAD_FROM_DISK else if (!object->input_file.empty() && !volume->name.empty()) paths.push_back(volume->name); -#endif // ENABLE_BACKWARD_COMPATIBLE_RELOAD_FROM_DISK } std::sort(paths.begin(), paths.end()); paths.erase(std::unique(paths.begin(), paths.end()), paths.end()); @@ -5507,12 +5474,10 @@ GLCanvas3D* Plater::canvas3D() return p->view3D->get_canvas3d(); } -#if ENABLE_BACKWARD_COMPATIBLE_RELOAD_FROM_DISK GLCanvas3D* Plater::get_current_canvas3D() { return p->get_current_canvas3D(); } -#endif // ENABLE_BACKWARD_COMPATIBLE_RELOAD_FROM_DISK BoundingBoxf Plater::bed_shape_bb() const { diff --git a/src/slic3r/GUI/Plater.hpp b/src/slic3r/GUI/Plater.hpp index 3c1dde0f3f..87ba3d60eb 100644 --- a/src/slic3r/GUI/Plater.hpp +++ b/src/slic3r/GUI/Plater.hpp @@ -250,9 +250,7 @@ public: int get_selected_object_idx(); bool is_single_full_object_selection() const; GLCanvas3D* canvas3D(); -#if ENABLE_BACKWARD_COMPATIBLE_RELOAD_FROM_DISK GLCanvas3D* get_current_canvas3D(); -#endif // ENABLE_BACKWARD_COMPATIBLE_RELOAD_FROM_DISK BoundingBoxf bed_shape_bb() const; void set_current_canvas_as_dirty(); From 4a59a45d512827175bf70b4d1791f46232e747db Mon Sep 17 00:00:00 2001 From: Enrico Turri Date: Thu, 13 Feb 2020 13:24:52 +0100 Subject: [PATCH 332/336] ENABLE_SHOW_SCENE_LABELS set as default --- src/libslic3r/GCode.cpp | 4 ---- src/libslic3r/GCode.hpp | 2 -- src/libslic3r/Technologies.hpp | 2 -- src/slic3r/GUI/GLCanvas3D.cpp | 13 ------------- src/slic3r/GUI/GLCanvas3D.hpp | 12 ------------ src/slic3r/GUI/GUI_Preview.cpp | 2 -- src/slic3r/GUI/KBShortcutsDialog.cpp | 2 -- src/slic3r/GUI/MainFrame.cpp | 2 -- src/slic3r/GUI/Plater.cpp | 4 ---- src/slic3r/GUI/Plater.hpp | 2 -- 10 files changed, 45 deletions(-) diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index 6543bf255f..87b0c49086 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -1101,11 +1101,7 @@ static inline std::vector sort_object_instances_by_max_z(c } // Produce a vector of PrintObjects in the order of their respective ModelObjects in print.model(). -#if ENABLE_SHOW_SCENE_LABELS std::vector sort_object_instances_by_model_order(const Print& print) -#else -static inline std::vector sort_object_instances_by_model_order(const Print& print) -#endif // ENABLE_SHOW_SCENE_LABELS { // Build up map from ModelInstance* to PrintInstance* std::vector> model_instance_to_print_instance; diff --git a/src/libslic3r/GCode.hpp b/src/libslic3r/GCode.hpp index e0f16f9fd0..650fb8860c 100644 --- a/src/libslic3r/GCode.hpp +++ b/src/libslic3r/GCode.hpp @@ -418,9 +418,7 @@ private: friend class WipeTowerIntegration; }; -#if ENABLE_SHOW_SCENE_LABELS std::vector sort_object_instances_by_model_order(const Print& print); -#endif // ENABLE_SHOW_SCENE_LABELS } diff --git a/src/libslic3r/Technologies.hpp b/src/libslic3r/Technologies.hpp index e918ac5751..8ebfc3472f 100644 --- a/src/libslic3r/Technologies.hpp +++ b/src/libslic3r/Technologies.hpp @@ -47,7 +47,5 @@ //================== #define ENABLE_2_2_0_BETA1 1 -// Enable showing object/instance info with labels into the 3D scene -#define ENABLE_SHOW_SCENE_LABELS (1 && ENABLE_2_2_0_BETA1) #endif // _technologies_h_ diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 26d3b14d66..b5319a2f18 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -6,9 +6,6 @@ #include "polypartition.h" #include "libslic3r/ClipperUtils.hpp" #include "libslic3r/PrintConfig.hpp" -#if ENABLE_SHOW_SCENE_LABELS -#include "libslic3r/GCode.hpp" -#endif // ENABLE_SHOW_SCENE_LABELS #include "libslic3r/GCode/PreviewData.hpp" #if ENABLE_THUMBNAIL_GENERATOR #include "libslic3r/GCode/ThumbnailData.hpp" @@ -68,9 +65,7 @@ #include #endif // ENABLE_RENDER_STATISTICS -#if ENABLE_SHOW_SCENE_LABELS #include -#endif // ENABLE_SHOW_SCENE_LABELS static const float TRACKBALLSIZE = 0.8f; @@ -1237,7 +1232,6 @@ void GLCanvas3D::LegendTexture::render(const GLCanvas3D& canvas) const } } -#if ENABLE_SHOW_SCENE_LABELS void GLCanvas3D::Labels::render(const std::vector& sorted_instances) const { if (!m_enabled || !is_shown()) @@ -1370,7 +1364,6 @@ void GLCanvas3D::Labels::render(const std::vector& sorted_ ImGui::PopStyleVar(2); } } -#endif // ENABLE_SHOW_SCENE_LABELS wxDEFINE_EVENT(EVT_GLCANVAS_SCHEDULE_BACKGROUND_PROCESS, SimpleEvent); wxDEFINE_EVENT(EVT_GLCANVAS_OBJECT_SELECT, SimpleEvent); @@ -1441,9 +1434,7 @@ GLCanvas3D::GLCanvas3D(wxGLCanvas* canvas, Bed3D& bed, Camera& camera, GLToolbar , m_show_picking_texture(false) #endif // ENABLE_RENDER_PICKING_PASS , m_render_sla_auxiliaries(true) -#if ENABLE_SHOW_SCENE_LABELS , m_labels(*this) -#endif // ENABLE_SHOW_SCENE_LABELS { if (m_canvas != nullptr) { m_timer.SetOwner(m_canvas); @@ -2808,10 +2799,8 @@ void GLCanvas3D::on_char(wxKeyEvent& evt) case 'a': { post_event(SimpleEvent(EVT_GLCANVAS_ARRANGE)); break; } case 'B': case 'b': { zoom_to_bed(); break; } -#if ENABLE_SHOW_SCENE_LABELS case 'E': case 'e': { m_labels.show(!m_labels.is_shown()); m_dirty = true; break; } -#endif // ENABLE_SHOW_SCENE_LABELS case 'I': case 'i': { _update_camera_zoom(1.0); break; } case 'K': @@ -5045,7 +5034,6 @@ void GLCanvas3D::_render_overlays() const if ((m_layers_editing.last_object_id >= 0) && (m_layers_editing.object_max_z() > 0.0f)) m_layers_editing.render_overlay(*this); -#if ENABLE_SHOW_SCENE_LABELS const ConfigOptionBool* opt = dynamic_cast(m_config->option("complete_objects")); bool sequential_print = opt != nullptr && opt->value; std::vector sorted_instances; @@ -5056,7 +5044,6 @@ void GLCanvas3D::_render_overlays() const } } m_labels.render(sorted_instances); -#endif // ENABLE_SHOW_SCENE_LABELS glsafe(::glPopMatrix()); } diff --git a/src/slic3r/GUI/GLCanvas3D.hpp b/src/slic3r/GUI/GLCanvas3D.hpp index 21f3f012c1..9ae1278800 100644 --- a/src/slic3r/GUI/GLCanvas3D.hpp +++ b/src/slic3r/GUI/GLCanvas3D.hpp @@ -375,7 +375,6 @@ private: }; #endif // ENABLE_RENDER_STATISTICS -#if ENABLE_SHOW_SCENE_LABELS class Labels { bool m_enabled{ false }; @@ -389,7 +388,6 @@ private: bool is_shown() const { return m_shown; } void render(const std::vector& sorted_instances) const; }; -#endif // ENABLE_SHOW_SCENE_LABELS public: enum ECursorType : unsigned char @@ -468,9 +466,7 @@ private: mutable int m_imgui_undo_redo_hovered_pos{ -1 }; int m_selected_extruder; -#if ENABLE_SHOW_SCENE_LABELS Labels m_labels; -#endif // ENABLE_SHOW_SCENE_LABELS public: GLCanvas3D(wxGLCanvas* canvas, Bed3D& bed, Camera& camera, GLToolbar& view_toolbar); @@ -487,9 +483,7 @@ public: void set_as_dirty(); unsigned int get_volumes_count() const; -#if ENABLE_SHOW_SCENE_LABELS const GLVolumeCollection& get_volumes() const { return m_volumes; } -#endif // ENABLE_SHOW_SCENE_LABELS void reset_volumes(); int check_volumes_outside_state() const; @@ -501,9 +495,7 @@ public: void set_config(const DynamicPrintConfig* config); void set_process(BackgroundSlicingProcess* process); void set_model(Model* model); -#if ENABLE_SHOW_SCENE_LABELS const Model* get_model() const { return m_model; } -#endif // ENABLE_SHOW_SCENE_LABELS const Selection& get_selection() const { return m_selection; } Selection& get_selection() { return m_selection; } @@ -551,9 +543,7 @@ public: void enable_main_toolbar(bool enable); void enable_undoredo_toolbar(bool enable); void enable_dynamic_background(bool enable); -#if ENABLE_SHOW_SCENE_LABELS void enable_labels(bool enable) { m_labels.enable(enable); } -#endif // ENABLE_SHOW_SCENE_LABELS void allow_multisample(bool allow); void zoom_to_bed(); @@ -675,10 +665,8 @@ public: void mouse_up_cleanup(); -#if ENABLE_SHOW_SCENE_LABELS bool are_labels_shown() const { return m_labels.is_shown(); } void show_labels(bool show) { m_labels.show(show); } -#endif // ENABLE_SHOW_SCENE_LABELS private: bool _is_shown_on_screen() const; diff --git a/src/slic3r/GUI/GUI_Preview.cpp b/src/slic3r/GUI/GUI_Preview.cpp index 5a1cd619ca..5afdb3bb43 100644 --- a/src/slic3r/GUI/GUI_Preview.cpp +++ b/src/slic3r/GUI/GUI_Preview.cpp @@ -65,9 +65,7 @@ bool View3D::init(wxWindow* parent, Bed3D& bed, Camera& camera, GLToolbar& view_ m_canvas->enable_selection(true); m_canvas->enable_main_toolbar(true); m_canvas->enable_undoredo_toolbar(true); -#if ENABLE_SHOW_SCENE_LABELS m_canvas->enable_labels(true); -#endif // ENABLE_SHOW_SCENE_LABELS wxBoxSizer* main_sizer = new wxBoxSizer(wxVERTICAL); main_sizer->Add(m_canvas_widget, 1, wxALL | wxEXPAND, 0); diff --git a/src/slic3r/GUI/KBShortcutsDialog.cpp b/src/slic3r/GUI/KBShortcutsDialog.cpp index 30f1d9ec0b..1136381051 100644 --- a/src/slic3r/GUI/KBShortcutsDialog.cpp +++ b/src/slic3r/GUI/KBShortcutsDialog.cpp @@ -157,9 +157,7 @@ void KBShortcutsDialog::fill_shortcuts() plater_shortcuts.push_back(Shortcut("Z", L("Zoom to selected object"))); plater_shortcuts.push_back(Shortcut("I", L("Zoom in"))); plater_shortcuts.push_back(Shortcut("O", L("Zoom out"))); -#if ENABLE_SHOW_SCENE_LABELS plater_shortcuts.push_back(Shortcut("E", L("Show/Hide object/instance labels"))); -#endif // ENABLE_SHOW_SCENE_LABELS plater_shortcuts.push_back(Shortcut(ctrl+"M", L("Show/Hide 3Dconnexion devices settings dialog"))); plater_shortcuts.push_back(Shortcut("ESC", L("Unselect gizmo / Clear selection"))); #if ENABLE_RENDER_PICKING_PASS diff --git a/src/slic3r/GUI/MainFrame.cpp b/src/slic3r/GUI/MainFrame.cpp index bab831b20a..428dc283bd 100644 --- a/src/slic3r/GUI/MainFrame.cpp +++ b/src/slic3r/GUI/MainFrame.cpp @@ -672,12 +672,10 @@ void MainFrame::init_menubar() "", nullptr, [this](){return can_change_view(); }, this); append_menu_item(viewMenu, wxID_ANY, _(L("Right")) + sep + "&6", _(L("Right View")), [this](wxCommandEvent&) { select_view("right"); }, "", nullptr, [this](){return can_change_view(); }, this); -#if ENABLE_SHOW_SCENE_LABELS viewMenu->AppendSeparator(); append_menu_check_item(viewMenu, wxID_ANY, _(L("Show &labels")) + sep + "E", _(L("Show object/instance labels in 3D scene")), [this](wxCommandEvent&) { m_plater->show_view3D_labels(!m_plater->are_view3D_labels_shown()); }, this, [this]() { return m_plater->is_view3D_shown(); }, [this]() { return m_plater->are_view3D_labels_shown(); }, this); -#endif // ENABLE_SHOW_SCENE_LABELS } // Help menu diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index f3f96a2df3..72afafd320 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -1782,10 +1782,8 @@ struct Plater::priv bool is_preview_loaded() const { return preview->is_loaded(); } bool is_view3D_shown() const { return current_panel == view3D; } -#if ENABLE_SHOW_SCENE_LABELS bool are_view3D_labels_shown() const { return (current_panel == view3D) && view3D->get_canvas3d()->are_labels_shown(); } void show_view3D_labels(bool show) { if (current_panel == view3D) view3D->get_canvas3d()->show_labels(show); } -#endif // ENABLE_SHOW_SCENE_LABELS void set_current_canvas_as_dirty(); GLCanvas3D* get_current_canvas3D(); @@ -4636,10 +4634,8 @@ bool Plater::is_preview_shown() const { return p->is_preview_shown(); } bool Plater::is_preview_loaded() const { return p->is_preview_loaded(); } bool Plater::is_view3D_shown() const { return p->is_view3D_shown(); } -#if ENABLE_SHOW_SCENE_LABELS bool Plater::are_view3D_labels_shown() const { return p->are_view3D_labels_shown(); } void Plater::show_view3D_labels(bool show) { p->show_view3D_labels(show); } -#endif // ENABLE_SHOW_SCENE_LABELS void Plater::select_all() { p->select_all(); } void Plater::deselect_all() { p->deselect_all(); } diff --git a/src/slic3r/GUI/Plater.hpp b/src/slic3r/GUI/Plater.hpp index 87ba3d60eb..2e4f2ca85e 100644 --- a/src/slic3r/GUI/Plater.hpp +++ b/src/slic3r/GUI/Plater.hpp @@ -170,10 +170,8 @@ public: bool is_preview_loaded() const; bool is_view3D_shown() const; -#if ENABLE_SHOW_SCENE_LABELS bool are_view3D_labels_shown() const; void show_view3D_labels(bool show); -#endif // ENABLE_SHOW_SCENE_LABELS // Called after the Preferences dialog is closed and the program settings are saved. // Update the UI based on the current preferences. From 2f3b665ac539fc6defadef70d396cef82a7ec353 Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Thu, 13 Feb 2020 13:49:13 +0100 Subject: [PATCH 333/336] Fixup of 6d0cf16: Export hollowed STL --- src/slic3r/GUI/Plater.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 72afafd320..3171818875 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -4916,7 +4916,6 @@ void Plater::export_stl(bool extended, bool selection_only) supports_mesh = object->get_mesh(slaposSupportTree); supports_mesh.transform(mesh_trafo_inv); } - const std::vector& obj_instances = object->instances(); for (const SLAPrintObject::Instance& obj_instance : obj_instances) { @@ -4948,7 +4947,7 @@ void Plater::export_stl(bool extended, bool selection_only) } TriangleMesh inst_object_mesh = object->get_mesh_to_print(); - inst_object_mesh.translate(0.f, 0.f, -object->get_elevation()); + inst_object_mesh.transform(mesh_trafo_inv); inst_object_mesh.transform(inst_transform, is_left_handed); mesh.merge(inst_object_mesh); From 2f18101c771f19ce6963844fc758594bb47d4c74 Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Thu, 13 Feb 2020 14:18:42 +0100 Subject: [PATCH 334/336] Slightly changed hollowing gizmo title 'ing' forms were removed to match Cut gizmo --- src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp index a84fc00c21..eddc4f4d85 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp @@ -950,7 +950,7 @@ bool GLGizmoHollow::on_is_selectable() const std::string GLGizmoHollow::on_get_name() const { - return (_(L("Hollowing and drilling")) + " [H]").ToUTF8().data(); + return (_(L("Hollow and drill")) + " [H]").ToUTF8().data(); } From 1cdde9097196ff6aab2d0c226391ced58709149d Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Thu, 13 Feb 2020 14:58:17 +0100 Subject: [PATCH 335/336] Add tooltip and rename labels of hollowing params --- src/libslic3r/PrintConfig.cpp | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index 25609e923d..36d56c4c10 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -2903,7 +2903,7 @@ void PrintConfigDef::init_sla_params() def->set_default_value(new ConfigOptionBool(false)); def = this->add("hollowing_min_thickness", coFloat); - def->label = L("Hollowing thickness"); + def->label = L("Wall thickness"); def->category = L("Hollowing"); def->tooltip = L("Minimum wall thickness of a hollowed model."); def->sidetext = L("mm"); @@ -2913,7 +2913,7 @@ void PrintConfigDef::init_sla_params() def->set_default_value(new ConfigOptionFloat(3.)); def = this->add("hollowing_quality", coFloat); - def->label = L("Hollowing accuracy"); + def->label = L("Accuracy"); def->category = L("Hollowing"); def->tooltip = L("Performance vs accuracy of calculation. Lower values may produce unwanted artifacts."); def->min = 0; @@ -2922,9 +2922,15 @@ void PrintConfigDef::init_sla_params() def->set_default_value(new ConfigOptionFloat(0.5)); def = this->add("hollowing_closing_distance", coFloat); - def->label = L("Hollowing closing distance"); + def->label = L("Closing distance"); def->category = L("Hollowing"); - def->tooltip = "";//L(""); + def->tooltip = L( + "Hollowing is done in two steps: first, an imaginary interior is " + "calculated deeper (offset plus the closing distance) in the object and " + "then it's inflated back to the specified offset. A greater closing " + "distance makes the interior more rounded. At zero, the interior will " + "resemble the exterior the most."); + def->sidetext = L("mm"); def->min = 0; def->max = 10; def->mode = comExpert; From f8c5855d559e175f28464d574c9173ef175368a8 Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Thu, 13 Feb 2020 15:55:36 +0100 Subject: [PATCH 336/336] Hollowing 'accuracy' and 'closing distance' are only shown in the hollowing gizmo when the respective mode is active --- src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp | 47 ++++++++++++++----------- 1 file changed, 27 insertions(+), 20 deletions(-) diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp index eddc4f4d85..31dd919a71 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp @@ -676,6 +676,7 @@ void GLGizmoHollow::on_render_input_window(float x, float y, float bottom_limit) bool first_run = true; // This is a hack to redraw the button when all points are removed, // so it is not delayed until the background process finishes. + ConfigOptionMode current_mode = wxGetApp().get_mode(); std::vector opts_keys = {"hollowing_min_thickness", "hollowing_quality", "hollowing_closing_distance"}; auto opts = get_config_options(opts_keys); @@ -688,11 +689,13 @@ void GLGizmoHollow::on_render_input_window(float x, float y, float bottom_limit) float quality = quality_cfg->value; double quality_min = opts[1].second->min; double quality_max = opts[1].second->max; + ConfigOptionMode quality_mode = opts[1].second->mode; auto* closing_d_cfg = static_cast(opts[2].first); float closing_d = closing_d_cfg->value; double closing_d_min = opts[2].second->min; double closing_d_max = opts[2].second->max; + ConfigOptionMode closing_d_mode = opts[2].second->mode; m_desc["offset"] = _(opts[0].second->label).ToUTF8() + wxString(":"); m_desc["quality"] = _(opts[1].second->label).ToUTF8() + wxString(":"); @@ -754,29 +757,33 @@ RENDER_AGAIN: bool slider_edited = ImGui::IsItemEdited(); // someone is dragging the slider bool slider_released = ImGui::IsItemDeactivatedAfterEdit(); // someone has just released the slider - m_imgui->text(m_desc.at("quality")); - ImGui::SameLine(settings_sliders_left); - ImGui::SliderFloat(" ", &quality, quality_min, quality_max, "%.1f"); - if (ImGui::IsItemHovered()) { - ImGui::BeginTooltip(); - ImGui::TextUnformatted(_(opts[1].second->tooltip).ToUTF8()); - ImGui::EndTooltip(); + if (current_mode >= quality_mode) { + m_imgui->text(m_desc.at("quality")); + ImGui::SameLine(settings_sliders_left); + ImGui::SliderFloat(" ", &quality, quality_min, quality_max, "%.1f"); + if (ImGui::IsItemHovered()) { + ImGui::BeginTooltip(); + ImGui::TextUnformatted(_(opts[1].second->tooltip).ToUTF8()); + ImGui::EndTooltip(); + } + slider_clicked |= ImGui::IsItemClicked(); + slider_edited |= ImGui::IsItemEdited(); + slider_released |= ImGui::IsItemDeactivatedAfterEdit(); } - slider_clicked |= ImGui::IsItemClicked(); - slider_edited |= ImGui::IsItemEdited(); - slider_released |= ImGui::IsItemDeactivatedAfterEdit(); - m_imgui->text(m_desc.at("closing_distance")); - ImGui::SameLine(settings_sliders_left); - ImGui::SliderFloat(" ", &closing_d, closing_d_min, closing_d_max, "%.1f"); - if (ImGui::IsItemHovered()) { - ImGui::BeginTooltip(); - ImGui::TextUnformatted(_(opts[2].second->tooltip).ToUTF8()); - ImGui::EndTooltip(); + if (current_mode >= closing_d_mode) { + m_imgui->text(m_desc.at("closing_distance")); + ImGui::SameLine(settings_sliders_left); + ImGui::SliderFloat(" ", &closing_d, closing_d_min, closing_d_max, "%.1f"); + if (ImGui::IsItemHovered()) { + ImGui::BeginTooltip(); + ImGui::TextUnformatted(_(opts[2].second->tooltip).ToUTF8()); + ImGui::EndTooltip(); + } + slider_clicked |= ImGui::IsItemClicked(); + slider_edited |= ImGui::IsItemEdited(); + slider_released |= ImGui::IsItemDeactivatedAfterEdit(); } - slider_clicked |= ImGui::IsItemClicked(); - slider_edited |= ImGui::IsItemEdited(); - slider_released |= ImGui::IsItemDeactivatedAfterEdit(); if (slider_clicked) { m_offset_stash = offset;