<!DOCTYPE html>
<html class="no-js">
    <head>
        <!-- Basic Page Needs
        ================================================== -->
        <meta charset="utf-8">
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
        <link rel="icon" type="image/png" href="images/favicon.ico">
        <title>Capella MBSE Tool - Download</title>
        <meta name="description" content="Capella is an Open Source MBSE tool that implements the Arcadia method. It is a comprehensive, extensible and field-proven MBSE solution.">
        <meta name="keywords" content="">
        <meta name="author" content="">
        <!-- Mobile Specific Metas
        ================================================== -->
        <meta name="format-detection" content="telephone=no">
        <meta name="viewport" content="width=device-width, initial-scale=1">

        <!-- Template CSS Files
        ================================================== -->
        <!-- Twitter Bootstrs CSS -->
        <link rel="stylesheet" href="css/bootstrap.min.css">
        <!-- animate css -->
        <link rel="stylesheet" href="css/animate.css">
        <link rel="stylesheet" href="css/jquery.fancybox.css">
        <!-- template main css file -->
        <link rel="stylesheet" href="css/main.css">
        <!-- responsive css -->
        <link rel="stylesheet" href="css/responsive.css">
		<link rel="stylesheet" href="css/latofonts.css">
		
        <script src="https://use.fontawesome.com/b51f77a16a.js"></script>

        <!-- Cookie content -->
        <link rel="stylesheet" type="text/css" href="//www.eclipse.org/eclipse.org-common/themes/solstice/public/stylesheets/vendor/cookieconsent/cookieconsent.min.css" />
        <script src="//www.eclipse.org/eclipse.org-common/themes/solstice/public/javascript/vendor/cookieconsent/default.min.js"></script>

        <!-- Eclipse Foundation Google Tag Manager -->
		<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
		new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
		j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
		'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
		})(window,document,'script','dataLayer','GTM-5WLCZXC');</script>
		<!-- End Google Tag Manager -->

        <!-- Template Javascript Files
        ================================================== -->
		<!-- Angular -->
		<base href="/capella/">
		<script src="js/angular-1.7.8.min.js"></script>
		<script src="angular/capella.js"></script>

        <!-- modernizr js -->
        <script src="js/vendor/modernizr-2.6.2.min.js"></script>
        <!-- jquery -->
        <script src="js/jquery-3.4.1.min.js"></script>
        <script src="js/popper-1.14.3.min.js"></script>
        <!-- bootstrap js -->
        <script src="js/bootstrap.min.js"></script>
        <!-- wow js -->
        <script src="js/wow.min.js"></script>
        <!-- template main js -->
        <script src="js/main.js"></script>
    </head>
    <body ng-app="capella" data-deferred-cloak>
    	<!--
        ==================================================
        Header Section
        ================================================== -->
    	<ng-include src="'angular/blocks/header.html'"></ng-include>
        <!--
        ==================================================
        Intro Section
        ================================================== -->
        <section class="hero-area dwnld">
            <div class="container">
                <div class="row">
                    <div class="col-md-12 text-center">
                        <div class="block wow fadeInUp" data-wow-delay=".3s">
                            <section class="cd-intro">
                                <h1 class="wow fadeInUp animated" data-wow-delay=".4s" >
                                	Download
                                </h1>
                            </section> <!-- cd-intro -->
                            <h2 class="wow fadeInUp animated" data-wow-delay=".6s" >Get the latest Eclipse Capella tool release and related extensions</h2>
                        </div>
                    </div>
                </div>
            </div>
        </section><!--/#intro_banner-->

        <!--
        ==================================================
        Main Content
        ================================================== -->

		<!-- Capella Download -->
        <section id="capellaDwnld" class="text-center">
            <div class="container">
                <h2 class="title wow fadeInDown" data-wow-delay=".3s">Capella</h2>
                <div id="capellaMainLink" class="row">
                	<p class="wow fadeInDown" data-wow-delay=".5s">Open source MBSE tool to create system, software or hardware architectures</p>
					<br/>
				</div>
			</div>

		</section> <!-- #capellaDwnld -->

 		<!-- Main Capella Download Links -->
		 <section id="capellaResources" class="bg_indigo text-center next-section">
            <p class="txt_white text-center"><span class="caret">&nbsp; </span></p>
            <div class="container">
                <div class="row">
                    <div class="col-sm-4 col-xs-12 wow fadeInLeft animated">
                        <figure class="wow fadeInLeft animated" data-wow-duration="300ms" data-wow-delay="0ms">
                        	<div id="capellaPlatformLinks">
                                <h4 class="txt_white">Other Platforms</h4><br>
                            </div>
                        </figure>
                    </div>
                    <div class="col-sm-4 col-xs-12 wow fadeInLeft animated">
                        <figure class="wow fadeInLeft animated" data-wow-duration="300ms" data-wow-delay="300ms">
                            <div>
                                <h4 class="txt_white">Resources</h4><br>
           	     				<p><a class="wow fadeInUp animated" data-wow-delay=".2s" href="https://wiki.eclipse.org/Capella/Installation_Guide#Capella_Installation" target="_blank">Installation <i class="fa fa-external-link" aria-hidden="true"></i></a></p>
           	     				<p><a class="wow fadeInUp animated" data-wow-delay=".3s" href="getstarted.html" target="_blank">Getting Started <i class="fa fa-external-link" aria-hidden="true"></i></a></p>
           	     				<p><a class="wow fadeInUp animated" data-wow-delay=".4s" href="https://github.com/eclipse/capella" target="_blank">Source Code <i class="fa fa-github" aria-hidden="true"></i></a></p>
								<p><a class="wow fadeInUp animated" data-wow-delay=".5s" href="support.html" target="_self">Documentation <i class="fa fa-fexternal-link" aria-hidden="true"></i></a></p>
								<p><a class="wow fadeInUp animated" data-wow-delay=".6s" href="https://github.com/eclipse/capella/wiki" target="_blank">Nightly Versions** <i class="fa fa-external-link" aria-hidden="true"></i></a></p>
								<p><a class="wow fadeInUp animated" data-wow-delay=".7s" href="https://github.com/eclipse/capella/releases" target="_blank">Previous Versions <i class="fa fa-external-link" aria-hidden="true"></i></a></p>
                            </div>
                        </figure>
                    </div>
                    <div class="col-sm-4 col-xs-12 wow fadeInLeft animated">
                        <figure class="wow fadeInLeft animated" data-wow-duration="300ms" data-wow-delay="300ms">
                            <div>
                                <h4 class="txt_white">Sample Models</h4><br>
                                <p class="txt_white wow fadeInUp animated" data-wow-delay=".3s">Level-crossing Traffic Control<br>
                                    <a href="https://download.eclipse.org/capella/samples/1.4.0/LevelCrossingTrafficControl.zip" onClick="ga('send', 'event', 'Capella', '1.4.x', 'ATM');">EN <i class="fa fa-download" aria-hidden="true"></i></a> -
                                    <a href="https://download.eclipse.org/capella/samples/1.4.0/LevelCrossingTrafficControl_fr.zip" onClick="ga('send', 'event', 'Capella', '1.4.x', 'ATM');">FR <i class="fa fa-download" aria-hidden="true"></i></a>
                                </p>
                                <p class="txt_white wow fadeInUp animated" data-wow-delay=".3s">In-Flight Entertainment (IFE)<br>
                                    <a href="https://download.eclipse.org/capella/samples/1.4.0/InFlightEntertainmentSystem.zip" onClick="ga('send', 'event', 'Capella', '1.4.x', 'IFE');">EN <i class="fa fa-download" aria-hidden="true"></i></a> - 
                                    <a href="resources/doc/IFE_XHTML_DocGen_1.4.0_for_capella_1.4.0/output/index.html" target="_blank">Doc <i class="fa fa-html5" aria-hidden="true"></i></a>
                                </p>
           	     				<p><a class="wow fadeInUp animated" data-wow-delay=".3s" href="http://download.eclipse.org/capella/samples/?d" target="_blank">Samples for Older Releases <i class="fa fa-external-link" aria-hidden="true"></i></a></p>
           	     			</div>
                        </figure>
                    </div>
                    <div class="clearfix"> </div>
                    <br>
                    <p class="small txt_white wow fadeInUp animated" data-wow-delay=".6s"><em>(*) Mac and Linux versions have not been field-tested.</em></p>
                    <p class="small txt_white wow fadeInUp animated" data-wow-delay=".7s"><em>(**) Nightly versions integrate the latest developments to test before official releases.</em></p>
                    <p class="small txt_white wow fadeInUp animated" data-wow-delay=".7s"><em>Do not hesitate to provide your feedback on the forum.</em></p>
                </div>
            </div>
		</section> <!-- #capellaResources -->


		<!-- Capella Add-Ons -->
        <section id="capellaExtensions" class="bg_lightest_grey text-center">
            <div class="container">
                <h2 class="title wow fadeInDown" data-wow-delay=".3s">Capella Add-ons</h2>
                <div class="row">
                    <p class="wow fadeInDown" data-wow-delay=".5s">To install Capella extensions have a look to the <a href="https://wiki.eclipse.org/Capella/Extensions/Installation_Guide#Installation_Procedure" target="_blank">installation procedure</a></p>
                    <br>
                </div>
                <div class="row">
                	<div class="col-sm-6 col-xs-12 wow fadeInLeft animated">
                        <figure class="wow fadeInLeft animated" data-wow-duration="300ms" data-wow-delay="300ms">
                            <div>
                                <h4>Extensions</h4><br>
                                <div id="capella-addons"></div>
                            </div>
                        </figure>
                    </div>
                    <div class="col-sm-6 col-xs-12 wow fadeInLeft animated">
                        <figure class="wow fadeInLeft animated" data-wow-duration="300ms" data-wow-delay="300ms">
                            <div>
                                <h4>Viewpoints</h4><br>
                                <div id="capella-basic"></div>
                            </div>
                        </figure>
                    </div>                    
                </div>
                <p><a class="wow fadeInDown btn btn-default" data-wow-delay=".6s" href="addons.html">More add-ons</a></p>
                
        </div>


		</section> <!-- #capellaExtensions -->

		<!-- Capella Studio -->
        <section id="capellaStudio" class="text-center">
            <div class="container">
                <h2 class="title wow fadeInDown" data-wow-delay=".3s">Capella Studio</h2>
                <div id="capellaStudioMainLink" class="row">
                	<p class="wow fadeInDown" data-wow-delay=".5s">Open source SDK to develop Capella add-ons</p>
                	<p class="wow fadeInDown" data-wow-delay=".6s"><em>Capella Studio doesn't contain Capella </em></p>
                    <br>
				</div>
			</div>
		</section> <!-- #capellaStudio -->

		<!-- Main Capella Studio Download Links -->
        <section id="capellaStudioResources" class="bg_indigo text-center next-section">
        <p class="txt_white text-center"><span class="caret">&nbsp; </span></p>
            <div class="container">
                <div class="row">
                    <div class="col-sm-6 col-xs-12 wow fadeInLeft animated">
                        <figure class="wow fadeInLeft animated" data-wow-duration="300ms" data-wow-delay="0ms">
                        	<div id="capellaStudioPlatformLinks">
                                <h4 class="txt_white">Other Platforms</h4><br>
                            </div>
                        </figure>
                    </div>
                    <div class="col-sm-6 col-xs-12 wow fadeInLeft animated">
                        <figure class="wow fadeInLeft animated" data-wow-duration="300ms" data-wow-delay="300ms">
                            <div>
                                <h4 class="txt_white">Resources</h4><br>
           	     				<p><a class="wow fadeInUp animated" data-wow-delay=".6s" href="https://wiki.eclipse.org/Capella/Studio" target="_blank">Documentation <i class="fa fa-external-link" aria-hidden="true"></i></a></p>
								<p><a class="wow fadeInUp animated" data-wow-delay=".6s" href="https://ci.eclipse.org/capella/view/Capella%20Studio/" target="_blank">Source Code <i class="fa fa-external-link" aria-hidden="true"></i></a></p>
								<p><a class="wow fadeInUp animated" data-wow-delay=".6s" href="https://download.eclipse.org/capella/capellastudio/products/nightly/?d" target="_blank">Nightly Versions** <i class="fa fa-external-link" aria-hidden="true"></i></a></p>
								<p><a class="wow fadeInUp animated" data-wow-delay=".6s" href="https://download.eclipse.org/capella/capellastudio/products/release/?d" target="_blank">Previous Versions <i class="fa fa-external-link" aria-hidden="true"></i></a></p>
                            </div>
                        </figure>
                    </div>
                    <div class="clearfix"> </div>
                    <br>
                    <p class="small txt_white wow fadeInUp animated" data-wow-delay=".6s"><em>(*) Mac and Linux versions have not been field-tested.</em></p>
                    <p class="small txt_white wow fadeInUp animated" data-wow-delay=".7s"><em>(**) Nightly versions integrate the latest developments to test before official releases.</em></p>
                    <p class="small txt_white wow fadeInUp animated" data-wow-delay=".7s"><em>Do not hesitate to provide your feedback on the forum.</em></p>
                </div>
            </div>
		</section> <!-- #capellaResources -->

			<script>

                    function updateMainLink(mainLinkId, data, product) {
                        let mainId = "windows";
						let title = "Get {0} {1} for {2} {3}".format(product.name, product.version, data.lang[mainId].text, data.lang["main"].text);
                        let mainLink = '<p><a class="wow fadeInUp animated btn btn-default animated" data-wow-delay=".6s" href="{0}" style="visibility: visible; animation-delay: 0.6s; animation-name: fadeInUp;" onClick="ga(\'send\', \'event\', \'{1}\', \'{2}\', \'{3}\');"><i class="fa fa-download" aria-hidden="true"></i> {4}</a></p>'.format(product.links[mainId].main, product.key, data.versionBranch, data.lang[mainId].key, title);
                        document.getElementById(mainLinkId).innerHTML += mainLink;
                    }

                    function updatePlatformLinks(platformLinksId, data, product) {
                        let lis = Object.keys(product.links).map(function (k) {
                            let link = product.links[k];
                            let linkss = Object.keys(link).map(function (key) { return '<a href="{0}" onClick="ga(\'send\', \'event\', \'{1}\', \'{2}\', \'{3}\');">{4}</a>'.format(link[key], product.key, data.versionBranch, data.lang[k].key, data.lang[key].text);  }).join(" - ");
                            return '<p class="txt_white wow fadeInUp animated" data-wow-delay=".4s"><i class="{0}" aria-hidden="true"></i> {1}<br/>{2}</p>'.format(data.lang[k].icon, data.lang[k].text, linkss);
                        }).join("");
                        document.getElementById(platformLinksId).innerHTML += lis;
                    }

                    function updateAddonLinks(data) {
                        let addons = "";
                        let basic = "";
                        let filteredAddons = data.addons.filter(function (a) { return a.showOnMainPage; });
                        for (i in filteredAddons) {
                            let addon = filteredAddons[i];
                            let keys = Object.keys(addon.download);
                            let links = keys.map(function(k) {
                                let icon = ""; //data.lang[k].icon ? `<i class="pl-2 ${data.lang[k].icon}" aria-hidden="true"></i>` : "";
                                return '<a href="{0}" onClick="ga(\'send\', \'event\', \'Capella\', \'{1}\', \'{2}\');">{3}{4}</a>'.format(addon.download[k], data.versionBranch, addon.key, data.lang[k].text, icon);
                            }).join(" - ");
                            
							let header = [];
							if (addon.contact) {
								header.push('Contact: '+addon.contact);
							}
							if (addon.licence) {
								header.push('License: '+addon.licence);
							}
							header=header.join(" - ");
							let information = '<p><i>{0}</i></p><p>{1}</p>'.format(header, addon.description);
							
							let compatible = addon.compatibleWithCurrentVersion === false ? '<button role="button" class="fa fa-exclamation-triangle btn-link btn-xs alert-compatibility" data-toggle="tooltip" data-placement="bottom" title="{0}" ></button>'.format(data.lang.compatibility.text) : "";
							let information2 = '<button role="button" class="fa fa-info-circle btn-link btn-xs " data-toggle="popover" data-trigger="focus" data-placement="bottom" title="{0}" data-content="{1}"></button>'.format(addon.name, information);
							
							let result = '<p class="wow fadeInUp animated" data-wow-delay=".3s">{0} {1}<br/><span class="small pl-2">{2}{3}</span></p><br/>'.format(addon.name, information2, compatible, links);

                            if (!addon.isViewpoint) {
                                addons += result;
                            } else {
                                basic += result;
                            }
                      }
                      document.getElementById("capella-addons").innerHTML = addons;
                      document.getElementById("capella-basic").innerHTML = basic;
					  
					  $('[data-toggle="popover"]').popover( { html: true, container: 'body' });
					  $('[data-toggle="tooltip"]').tooltip();
                    }

                   $.getJSON('json/downloads.json', function(data) {

                        updateMainLink("capellaMainLink", data, data.capella);
                        updatePlatformLinks("capellaPlatformLinks", data, data.capella);

                        updateMainLink("capellaStudioMainLink", data, data.capellaStudio);
                        updatePlatformLinks("capellaStudioPlatformLinks", data, data.capellaStudio);

                        updateAddonLinks(data);

                  });
              </script>

         <!-- Need Help Section -->
        <section class="text-center bg_lightest_grey">
            <div class="container">
                <div class="row">
                    <h2 class="title wow fadeInDown" data-wow-delay=".3s" data-wow-duration="500ms">Need Help?</h2>
                    <br>
                </div>
                <div class="row">
                	<div class="col-md-offset-2 col-md-4 wow fadeInLeft animated">
						<p>Use the public forum to communicate with <br>the Capella worldwide community</p>
                        <p><a class="wow fadeInUp animated btn btn-default animated" data-wow-delay=".6s" href="https://www.eclipse.org/forums/index.php/i/11/" target="_blank">Capella Forum</a></p>
                    </div>
                    <div class="col-md-4 wow fadeInUp animated animated">
                        <p>Discover the services provided by <br>the Capella ecosystem</p>
                        <p><a class="wow fadeInUp animated btn btn-default animated" data-wow-delay=".6s" href="services.html">Professional Services</a></p>
                    </div>
                </div>
            </div>
        </section>

		<div id="back-to-top" data-spy="affix" data-offset-top="100"
			class="back-to-top hidden-xs hidden-sm affix-top">
			<button class="btn btn-default" title="Back to Top">
				<i class="fa fa-caret-up"></i>
			</button>
		</div>
		<script type="text/javascript">
		// Back to top
			jQuery('#back-to-top').on('click', function() {
				jQuery("html, body").animate({
					scrollTop : 0
				}, 500);
				return false;
			});
		</script>

        <!--
        ==================================================
        Footer Section
        ================================================== -->
        <ng-include src="'angular/blocks/footer.html'"></ng-include>
        <script async src="js/googleAnalytics.js" ></script>
    </body>
</html>