DraftSight: silný CAD brzy také pro Linux

28. 12. 2010
Doba čtení: 4 minuty

Sdílet

Ilustrační obrázek
Autor: Depositphotos – stori
Ilustrační obrázek
Letošní rok představila společnost Dassault System novou CAD aplikaci pod názvem DraftSight. Jedná se o free software, který můžete po bezplatné registraci používat pro domácí i komerční využití. Má DraftSight ambice stát se nejpoužívanějším CADem a zakousnout se do krku Autocadu LT a jeho mnoha klonům?

 Dosud byla do světa vypuštěna verze pro Windows a Mac OS X, navíc v kompletní české lokalizaci. Dobrá zpráva je, že vydání linuxové verze tvůrci slíbili do konce roku 2010, nicméně do té doby můžete program používat pod aplikací Wine – funguje hladce. DraftSight tedy bude dostupný nativně pro všechny operační systémy což je (nejen) v daném segmentu velmi neobvyklé a může to znamenat pro šíření a vývoj velkou konkurenční výhodu. A komu by měl konkurovat? Především bych měl říci, že se jedná o obecný 2D CAD a jeho přímými rivaly jsou AutoCad, ProgeCad, Bricscad, Doublecad a další. Jeho použití lze tedy nalézt napříč všemi technickými obory, avšak abyste z něj měli silný CAD nástroj, je vhodné disponovat vlastní databázi bloků, což samozřejmě platí pro jakýkoliv CAD.

Všestranná kompatibilita

Podporovanými formáty souborů jsou *.dwg a *.dxf. V obou případech program poskytuje kompatibilitu se soubory z archaické verze R12 až po nejnovější verzi 2010. Otevřete tedy jak výkresy z vašeho nejstaršího archivu, tak i výkresy z nejnovějších CAD aplikací.

Uživatelské prostředí aneb tak, jak to máme rádi

Po jednoduché instalaci, kterou zvládne i laik, můžeme přistoupit k prvnímu spuštění. Program zaregistrujeme zadáním e-mailové adresy a poté na nás vykoukne poměrně sympatické prostředí, které působí neokoukaně a nově, přesto ho však dobře známe. V horní části obrazovky nalezneme roletkové menu, pod ním panely nástrojů, kterým dominuje nastavení hladin. Kreslicí a editační nástroje nalezneme defautně po stranách obrazovky. Vlevo pak vidíme známý panel vlastností. Ve spodní části obrazovky nalezneme neodmyslitelný příkazový řádek, přepínače modelu a rozvržení (tzv. sheetů) a přepínače ortogonálního zobrazení, uchopovacího módu apod.

Ano, některé ikony příkazů mají sice odlišný vzhled, než jsme zvyklí, nicméně jsou poměrně pěkné a logické. Skladba příkazů na panelech je již dle standardních zvyklostí a nemělo by vás nic překvapit. Zkrátka ani DraftSight v tomto ohledu nešel vlastní cestou a vsadil na zažité schéma, které uživatelé znají z AutoCadu. Sice si tvůrci v této disciplíně nepřipíší bod za novátorství, nicméně na druhou stranu žádný bod neztratí za nepřehlednost, ba naopak.

Přednastavení na tisíc způsobů

Volby programu se provádí v přehledném stromovém dialogu. Bez nadsázky mohu prohlásit, že v něm najdete stejné nebo větší možností přednastavení než-li je tomu u konkurentů. Ti z vás, kteří mají rádi přizpůsobení „rýsovacího prkna“ do puntíku, se mohou do sytosti realizovat. Měnit můžete barevnost rýsovacích pomůcek, editovat příkazy, nastavovat podpůrné cesty souborů, přidávat aliasy příkazů, měnit uživatelské rozhraní a mnoho dalšího. Velmi zajímavým prvkem je např. funkce Mouse Gestures, která umožňuje nastavit „gesto“ myší. Tzn. klik pravým tlačítkem při současném pohybu myší, a tím aktivovat preferovaný příkaz.

Uživatelské funkce

Základní kreslicí a editační nástroje (kreslení a modifikace entit), fungují bezproblémově a netřeba se u nich pozastavovat. Správce hladin je také dobře zpracovaný, nechybí zde ani možnost vypnutí hladiny pouze v daném výřezu. Ve správci najdeme také filtr hladin, ovšem nečekejte, že zadáním parametrů filtru bude vše fungovat. Vlastně žádné parametry filtru zadávat netřeba, hladiny příslušející zvolenému filtru musíte tak jako tak přiřadit akcí drag&drop. Jinak je však práce s hladinami bezproblémová a nic jsem při ní nepostrádal.

Tvorba a editace bloků probíhá bez problémů, chybí mi však nějaký správce bloků, který by sjednotil uživatelskou databázi a umožnil by vkládání bloků ve sjednoceném přehledném rozhraní. Pro rychlý přístup k databázím bloků je tedy nejlepším řešením přidání vlastního panelu nástrojů (program podporuje *.mnu, *xml,*.cui, *.mnp) a vkládat bloky klasicky přes ikony. Budiž vadou na kráse, že program nepodporuje dynamické bloky.

Samozřejmostí jsou obsáhlé kótovací nástroje, pomůcky pro měření, přednastavení USS (v DraftSight pod názvem CCS), tvorba tabulek či šrafů. Nakonec nesmím zapomenout na možnost připojení externích referencí k výkresu, máme na výběr z formátů *.dwg, *.bmp, *.jpeg, *.tiff a další. Postrádal jsem pouze možnost připojit soubor *.pdf, který zatím v nabídce připojení chybí.

Nepostradatelnými pomocníky jsou také nástroje pro správu výkresu, tzn. čištění, kontrola chyb či obnovení poškozeného výkresu. Uchováte tak výkres v dobré kondici a minimalizujete tím riziko ztráty vašich dat a tedy i drahocenného ča­su.

linux_sprava_tip

Tisk a export výkresu

Tiskový dialog je přehledně zpracovaný a nemám mu téměř co vytknout. Tisk probíhá dle tabulek stylů *.ctb, tedy osvědčený způsob. Snad jen „další možnosti“ tisku mohly být obsaženy v základním dialogu, zbytečně je uživatel nucen dělat klik myší navíc. Také se mi nelíbí, že přednastavení tisku (typ tiskárny, papír) se uloží až po vytištění výkresu, není tedy možné jej provést předem.

Shrnutí

Je zřejmé, že DraftSight je silný hráč, který může nalézt uplatnění i na profesionální úrovni. Jeho hlavní síla je nejen v bezplatné dostupnosti, ale také v plné funkčnosti a dobré stabilitě. Za zmínku stojí také webová uživatelská komunita, pro kterou tvůrci připravují informace, návody, cvičení, ukázky… V každém případě, pokud hledáte CAD s co nejlepším poměrem výkon/cena, není co řešit.

Autor článku

Autor je autorizoaným technikem v oboru technika prostředí staveb, specializace zdravotní technika a zabývá se CAD systémy.

'; document.getElementById('outstream-iframe').onload = function () { setupIframe(); } replayScreen = document.getElementById('iinfoOutstreamReplay'); iinfoOutstreamPosition = document.getElementById('iinfoOutstreamPosition'); outstreamContainer = document.getElementsByClassName('outstream-container')[0]; setupReplayScreen(); } function setupIframe() { outstreamDocument = document.getElementById('outstream-iframe').contentWindow.document; let el = outstreamDocument.createElement('style'); outstreamDocument.head.appendChild(el); el.innerText = "#adContainer>div:nth-of-type(1),#adContainer>div:nth-of-type(1) > iframe { width: 99% !important;height: 99% !important;max-width: 100%;}#videoContent,body{ width:100vw;height:100vh}body{ font-family:'Helvetica Neue',Arial,sans-serif}#videoContent{ overflow:hidden;background:#000}#adMuteBtn{ width:35px;height:35px;border:0;background:0 0;display:none;position:absolute;fill:rgba(230,230,230,1);bottom:-5px;right:25px}"; videoContent = outstreamDocument.getElementById('contentElement'); videoContent.style.display = 'none'; videoContent.volume = 1; videoContent.muted = false; if ( location.href.indexOf('rejstriky.finance.cz') !== -1 || location.href.indexOf('finance-rejstrik') !== -1 || location.href.indexOf('firmy.euro.cz') !== -1 || location.href.indexOf('euro-rejstrik') !== -1 || location.href.indexOf('/rejstrik/') !== -1 || location.href.indexOf('/rejstrik-firem/') !== -1) { outstreamDirectPlayed = true; soundAllowed = true; iinfoVastUrlIndex = 0; } if (!outstreamDirectPlayed) { console.log('OUTSTREAM direct'); setUpIMA(true); } else { if (soundAllowed) { const playPromise = videoContent.play(); if (playPromise !== undefined) { playPromise.then(function () { console.log('OUTSTREAM sound allowed'); setUpIMA(false); }).catch(function () { console.log('OUTSTREAM sound forbidden'); renderBanner(); }); } } else { renderBanner(); } } } function getWrapper() { let articleWrapper = document.querySelector('.rs-outstream-placeholder'); // Outstream Placeholder from RedSys manipulation if (articleWrapper && articleWrapper.style.display !== 'block') { articleWrapper.innerHTML = ""; articleWrapper.style.display = 'block'; } // Don't render OutStream on homepages if (articleWrapper === null) { if (document.querySelector('body.p-index')) { return null; } } if (articleWrapper === null) { articleWrapper = document.getElementById('iinfo-outstream'); } if (articleWrapper === null) { articleWrapper = document.querySelector('.layout-main__content .detail__article p:nth-of-type(6)'); } if (articleWrapper === null) { // Euro, Autobible, Zdravi articleWrapper = document.querySelector('.o-article .o-article__text p:nth-of-type(6)'); } if (articleWrapper === null) { articleWrapper = document.getElementById('sidebar'); } if (!articleWrapper) { console.error("Outstream wrapper of article was not found."); } return articleWrapper; } function setupDimensions() { outstreamWidth = Math.min(iinfoOutstreamPosition.offsetWidth, 480); outstreamHeight = Math.min(iinfoOutstreamPosition.offsetHeight, 320); } /** * Sets up IMA ad display container, ads loader, and makes an ad request. */ function setUpIMA(direct) { google.ima.settings.setDisableCustomPlaybackForIOS10Plus(true); google.ima.settings.setLocale('cs'); google.ima.settings.setNumRedirects(10); // Create the ad display container. createAdDisplayContainer(); // Create ads loader. adsLoader = new google.ima.AdsLoader(adDisplayContainer); // Listen and respond to ads loaded and error events. adsLoader.addEventListener( google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, onAdsManagerLoaded, false); adsLoader.addEventListener( google.ima.AdErrorEvent.Type.AD_ERROR, onAdError, false); // An event listener to tell the SDK that our content video // is completed so the SDK can play any post-roll ads. const contentEndedListener = function () { adsLoader.contentComplete(); }; videoContent.onended = contentEndedListener; // Request video ads. const adsRequest = new google.ima.AdsRequest(); if (direct) { adsRequest.adTagUrl = directVast; console.log('Outstream DIRECT CAMPAING advert: ' + directVast); videoContent.muted = true; videoContent.volume = 0; outstreamDirectPlayed = true; } else { adsRequest.adTagUrl = iinfoVastUrls[iinfoVastUrlIndex]; console.log('Outstream advert: ' + iinfoVastUrls[iinfoVastUrlIndex]); videoContent.muted = false; videoContent.volume = 1; } // Specify the linear and nonlinear slot sizes. This helps the SDK to // select the correct creative if multiple are returned. // adsRequest.linearAdSlotWidth = outstreamWidth; // adsRequest.linearAdSlotHeight = outstreamHeight; adsRequest.nonLinearAdSlotWidth = 0; adsRequest.nonLinearAdSlotHeight = 0; adsLoader.requestAds(adsRequest); } function setupReplayScreen() { replayScreen.addEventListener('click', function () { iinfoOutstreamPosition.remove(); iinfoVastUrlIndex = 0; outstreamInit(); }); } /** * Sets the 'adContainer' div as the IMA ad display container. */ function createAdDisplayContainer() { // We assume the adContainer is the DOM id of the element that will house // the ads. outstreamDocument.getElementById('videoContent').style.display = 'none'; adDisplayContainer = new google.ima.AdDisplayContainer( outstreamDocument.getElementById('adContainer'), videoContent); } function unmuteAdvert() { adVolume = !adVolume; if (adVolume) { adsManager.setVolume(0.3); outstreamDocument.getElementById('adMuteBtn').innerHTML = ''; } else { adsManager.setVolume(0); outstreamDocument.getElementById('adMuteBtn').innerHTML = ''; } } /** * Loads the video content and initializes IMA ad playback. */ function playAds() { // Initialize the container. Must be done through a user action on mobile // devices. videoContent.load(); adDisplayContainer.initialize(); // setupDimensions(); try { // Initialize the ads manager. Ad rules playlist will start at this time. adsManager.init(1920, 1080, google.ima.ViewMode.NORMAL); // Call play to start showing the ad. Single video and overlay ads will // start at this time; the call will be ignored for ad rules. adsManager.start(); // window.addEventListener('resize', function (event) { // if (adsManager) { // setupDimensions(); // adsManager.resize(outstreamWidth, outstreamHeight, google.ima.ViewMode.NORMAL); // } // }); } catch (adError) { // An error may be thrown if there was a problem with the VAST response. // videoContent.play(); } } /** * Handles the ad manager loading and sets ad event listeners. * @param { !google.ima.AdsManagerLoadedEvent } adsManagerLoadedEvent */ function onAdsManagerLoaded(adsManagerLoadedEvent) { // Get the ads manager. const adsRenderingSettings = new google.ima.AdsRenderingSettings(); adsRenderingSettings.restoreCustomPlaybackStateOnAdBreakComplete = true; adsRenderingSettings.loadVideoTimeout = 12000; // videoContent should be set to the content video element. adsManager = adsManagerLoadedEvent.getAdsManager(videoContent, adsRenderingSettings); // Add listeners to the required events. adsManager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, onAdError); adsManager.addEventListener( google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED, onContentPauseRequested); adsManager.addEventListener( google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED, onContentResumeRequested); adsManager.addEventListener( google.ima.AdEvent.Type.ALL_ADS_COMPLETED, onAdEvent); // Listen to any additional events, if necessary. adsManager.addEventListener(google.ima.AdEvent.Type.LOADED, onAdEvent); adsManager.addEventListener(google.ima.AdEvent.Type.STARTED, onAdEvent); adsManager.addEventListener(google.ima.AdEvent.Type.COMPLETE, onAdEvent); playAds(); } /** * Handles actions taken in response to ad events. * @param { !google.ima.AdEvent } adEvent */ function onAdEvent(adEvent) { // Retrieve the ad from the event. Some events (for example, // ALL_ADS_COMPLETED) don't have ad object associated. const ad = adEvent.getAd(); console.log('Outstream event: ' + adEvent.type); switch (adEvent.type) { case google.ima.AdEvent.Type.LOADED: // This is the first event sent for an ad - it is possible to // determine whether the ad is a video ad or an overlay. if (!ad.isLinear()) { // Position AdDisplayContainer correctly for overlay. // Use ad.width and ad.height. videoContent.play(); } outstreamDocument.getElementById('adContainer').style.width = '100%'; outstreamDocument.getElementById('adContainer').style.maxWidth = '640px'; outstreamDocument.getElementById('adContainer').style.height = '360px'; break; case google.ima.AdEvent.Type.STARTED: window.addEventListener('scroll', onActiveView); // This event indicates the ad has started - the video player // can adjust the UI, for example display a pause button and // remaining time. if (ad.isLinear()) { // For a linear ad, a timer can be started to poll for // the remaining time. intervalTimer = setInterval( function () { // Example: const remainingTime = adsManager.getRemainingTime(); // adsManager.pause(); }, 300); // every 300ms } outstreamDocument.getElementById('adMuteBtn').style.display = 'block'; break; case google.ima.AdEvent.Type.ALL_ADS_COMPLETED: if (ad.isLinear()) { clearInterval(intervalTimer); } if (outstreamLastError === 303) { if (isBanner) { renderBanner(); } else { replayScreen.style.display = 'flex'; } } break; case google.ima.AdEvent.Type.COMPLETE: // This event indicates the ad has finished - the video player // can perform appropriate UI actions, such as removing the timer for // remaining time detection. if (ad.isLinear()) { clearInterval(intervalTimer); } if (isBanner) { renderBanner(); } else { replayScreen.style.display = 'flex'; } break; } } /** * Handles ad errors. * @param { !google.ima.AdErrorEvent } adErrorEvent */ function onAdError(adErrorEvent) { // Handle the error logging. console.log(adErrorEvent.getError()); outstreamLastError = adErrorEvent.getError().getErrorCode(); if (!loadNext()) { renderBanner(); } } function renderBanner() { if (isBanner) { console.log('Outstream: Render Banner'); iinfoOutstreamPosition.innerHTML = ""; iinfoOutstreamPosition.style.height = "330px"; iinfoOutstreamPosition.appendChild(bannerDiv); } else { console.log('Outstream: Banner is not set'); } } function loadNext() { iinfoVastUrlIndex++; if (iinfoVastUrlIndex < iinfoVastUrls.length) { iinfoOutstreamPosition.remove(); outstreamInit(); } else { return false; } adVolume = 1; return true; } /** * Pauses video content and sets up ad UI. */ function onContentPauseRequested() { videoContent.pause(); // This function is where you should setup UI for showing ads (for example, // display ad timer countdown, disable seeking and more.) // setupUIForAds(); } /** * Resumes video content and removes ad UI. */ function onContentResumeRequested() { videoContent.play(); // This function is where you should ensure that your UI is ready // to play content. It is the responsibility of the Publisher to // implement this function when necessary. // setupUIForContent(); } function onActiveView() { if (outstreamContainer) { const containerOffset = outstreamContainer.getBoundingClientRect(); const windowHeight = window.innerHeight; if (containerOffset.top < windowHeight/1 && containerOffset.bottom > 0.0) { if (outstreamPaused) { adsManager.resume(); outstreamPaused = false; } return true; } else { if (!outstreamPaused) { adsManager.pause(); outstreamPaused = true; } } } return false; } let outstreamInitInterval; if (typeof cpexPackage !== "undefined") { outstreamInitInterval = setInterval(tryToInitializeOutstream, 100); } else { const wrapper = getWrapper(); if (wrapper) { let outstreamInitialized = false; window.addEventListener('scroll', () => { if (!outstreamInitialized) { const containerOffset = wrapper.getBoundingClientRect(); const windowHeight = window.innerHeight; if (containerOffset.top < windowHeight / 1 && containerOffset.bottom > 0.0) { outstreamInit(); outstreamInitialized = true; } } }); } } function tryToInitializeOutstream() { const wrapper = getWrapper(); if (wrapper) { const containerOffset = wrapper.getBoundingClientRect(); const windowHeight = window.innerHeight; if (containerOffset.top < windowHeight / 1 && containerOffset.bottom > 0.0) { if (cpexPackage.adserver.displayed) { clearInterval(outstreamInitInterval); outstreamInit(); } } } else { clearInterval(outstreamInitInterval); } } }
OSZAR »