-
Compteur de contenus
12 247 -
Inscription
-
Dernière visite
-
Jours gagnés
209
Type de contenu
Profils
Forums
Calendrier
Blogs
Tout ce qui a été posté par (gile)
-
ActiveSelectionSet
-
Il y a 10 types de personnes dans le monde : celles qui comptent en binaire et les autres
(gile) a répondu à un(e) sujet de (gile) dans Débuter en LISP
Au temps pour moi, tu as tout à fait raison. -
Il y a 10 types de personnes dans le monde : celles qui comptent en binaire et les autres
(gile) a répondu à un(e) sujet de (gile) dans Débuter en LISP
Je ne comprends pas ce que tu veux dire. Comment tu récupères la valeur de droite dans 33554579 avec AND ? Après, pour voir si ce n'est pas DuBloc, on peut préférer utiliser : (boole 1 33554432 n) à : (logand 2 (lsh n -24))... -
J'en ai une sous le coude qui renvoie aussi les points dans le SCG et qui ne me semble pas du tout ridicule en terme de performances. mais je sens que si je ne la poste pas, je vais me faire doubler...
-
Quand on veut faire un jeu de sélection en VBA (ou, si on est maso, en "pur vlisp') il faut créer un objet SelectionSet nommé et l'ajouter à la collection des jeux de sélection du dessin. Cette collection a une capacité limitée à 128 objets. Quand en vlisp on appelle vla-get-ActiveSelection le jeu de sélection courant est automatiquement ajouté à cette collection (avec un nom incrémenté comme les blocs ou les groupes anonymes, j'imagine) et, si on ne le supprime pas explicitement avec vla-Delete, restera dans la collection pendant toute la session. Et, quand la coupe collection est pleine, ça déborde plante. Un exemple sur cette page, permet de voir la différence entre VBA et .NET. En .NET (comme en LISP), il n'est ni besoin de nommer le jeu de sélection, ni de l'ajouter à une collection, ni de le supprimer quand on n'en plus besoin. Au passage on voit clairement que VB .NET est plus proche de C# que de de VBA.
-
@Fraid Juste deux petites remarques, si je peux me permettre : 1. il me semble qu'on peut tout simplement faire : (vla-put-Color obj 252) 2. quand on utilise : vla-get-ActiveSelectionSet (plus généralement un jeu de sélection COM) il est préférable de le supprimer avec vla-Delete. Le nombre de jeu de sélection actifs est limité à 128, avec AutoLISP (vanilla) le jeu est supprimé en même temps que la variable à laquelle il est assigné, mais avec COM, il faut le faire explicitement. (if (ssget) (progn (vlax-for obj (setq ss (vla-get-activeselectionset acdc)) (vla-put-color obj 252) (vla-put-Linetype obj (load-line-type "CACHE" "acad.lin")) ) (vla-delete ss) ) )
-
La fonction qui répond au challenge : private static Point2d[] GetPlinePoints(ObjectId id) { using (var tr = new OpenCloseTransaction()) { var pline = (Polyline)tr.GetObject(id, OpenMode.ForRead); var result = new Point2d[pline.NumberOfVertices]; for (int i = 0; i < result.Length; i++) { result[i] = pline.GetPoint2dAt(i); } return result; } } Une commande de test pour sélectionner la polyligne et choisir le nombre d'itération pour le 'benchmark'. [CommandMethod("TEST")] public static void Test() { var doc = AcAp.DocumentManager.MdiActiveDocument; var db = doc.Database; var ed = doc.Editor; var entOpts = new PromptEntityOptions("\nSélectionnez une polyligne: "); entOpts.SetRejectMessage("\nL'objet séléctionné n'est pas une polyligne."); entOpts.AddAllowedClass(typeof(Polyline), true); var entRes = ed.GetEntity(entOpts); if (entRes.Status != PromptStatus.OK) return; var id = entRes.ObjectId; var kwOpts = new PromptKeywordOptions("\nChoisissez le nombre d'itérations [64/512/4096/32768]: ", "64 512 4096 32768"); var kwRes = ed.GetKeywords(kwOpts); if (kwRes.Status != PromptStatus.OK) return; int nb = int.Parse(kwRes.StringResult); var sw = new System.Diagnostics.Stopwatch(); sw.Start(); for (int i = 0; i < nb; i++) { GetPlinePoints(id); } sw.Stop(); ed.WriteMessage($"\nElapsed milliseconds {sw.ElapsedMilliseconds} for {nb} iterations"); } Attaché, un ZIP à débloquer contenant la DLL à charger dans AutoCAD avec NETLOAD. GetPointListChallenge.zip
-
Si tu veux jouer, il faut respecter les consignes Poly.Coordinates renvoie un Variant (array of doubles) de type [x0, y0, x1, y1, x2, y2, ...] et il s'agit ici de renvoyer une liste points. En LISP un "point" est une liste de 2 ou 3 nombres réels (double), l'équivalent VBA est un Variant (array of doubles) de 2 ou 3 doubles. Il faudrait donc que la fonction renvoie un Variant (array of Variants (array of doubles)). C'est exactement ce que fait la routine LISP donnée par Fraid. PS : J'ai fait quelques essais en .NET et on ne joue définitivement pas dans la même cour en terme de rapidité, c'est environ 20 fois plus rapide que le LISP.
-
Salut, À ma connaissance on ne peut appeler la commande SCU de manière transparente. Par contre on peut appeler de manière transparente la variable système SNAPANG mais celle-ci demande d'enter l'angle au clavier.
-
Salut, Pour pouvoir faire des comparaisons, il faut que les fonctions soient similaires. Tu devrais préciser la "signature" de la fonction à définir : argument(s) et type de retour, par exemple en AutoLISP l'argument serait le ename ou le vla-object de la polyligne et le type de retour une liste de "points". Je précise ça parce que si la fonction nécessite de sélectionner la polyligne toute comparaison en terme de rapidité devient caduque. PS : ce type de fonction a été fait tellement de fois, j'ai retrouvé sur CADxp des messages dans lesquels je montre 6 façons différentes en "pur AutoLISP".
-
Il y a 10 types de personnes dans le monde : celles qui comptent en binaire et les autres
(gile) a répondu à un(e) sujet de (gile) dans Débuter en LISP
Salut, Je ne m'étais jamais penché sur cette question, mais @Luna a fait tout le boulot en décortiquant le code 440. Si on regarde les notation binaires en terme d'octets, on note que l'octet le plus à gauche contient l'information ByBlock et l'octet le plus à droite la valeur de la transparence (plus exactement de l'opacité avec 255 pour opaque à 100%). On obtient cette valeur de la même façon qu'on obtient la valeur du bleu dans les couleurs RGB en décalant de 24 vers la gauche pour éliminer tous les octets de gauche puis en revenant de 24 bits vers la droite : (lsh (lsh 33554687 24) -24) renvoie 255 (soit 100% d'opacité ou 0% de transparence). Donc, pour savoir si on est en ByBlock, on récupère la valeur de l'octet le plus à gauche en le décalant de 24 bits vers la droite : (lsh 16777216 -24) renvoie 1 pour ByBlock et 2 pour toutes les autres valeurs. Comme on a vu que la transparence exprime en pourcentage l'inverse de l'opacité, soit la valeur de l'octet de droite sur 255, on peut écrire ta fonction dec_>transprency de cette façon : (defun dec->transparency (d) (if (= 1 (lsh d -24)) 100 ; Byblock (fix (/ (- 255 (lsh (lsh d 24) -24)) 2.55)) ) ) et la fonction inverse : (defun transparency->dec (transp) (if (= transp 100) ; ByBlock (lsh 1 24) (logior (lsh 2 24) (fix (* 2.55 (- 100 transp)))) ) ) -
Il y a 10 types de personnes dans le monde : celles qui comptent en binaire et les autres
(gile) a répondu à un(e) sujet de (gile) dans Débuter en LISP
5. Codes binaires dans les listes DXF et filtres de sélection (c'était un oubli, c'est réparé) AutoCAD utilise aussi les codes binaires pour stocker certaines informations dans des groupes DXF, notamment le groupe 70. Pour les polylignes "allégées" (LWPOLYLINE), ce groupe 70 stocke la propriété "fermée" (Closed) avec le code binaire 1 ainsi que la "génération de type de ligne" (Plinegen) avec le code binaire 128. On retrouve ces deux codes (à côté de plusieurs autres) pour les objets POLYLINE avec le même type de propriétés. Le code binaire 1 est aussi utilisé avec les objets SPLINE pour la même propriété Closed. Dans les filtres de sélections on peut utiliser deux opérateurs pour filtrer suivant des codes binaires : "&" et "&=". Le premier "&" filtrera les objets pour lesquels un AND logique entre la valeur du code de groupe de l'entité et celle du filtre est différente de 0. '((0 . *POLYLINE) (-4 . "&") (70 . 1)) filtrera tout type de polyligne fermée (allégée, 2d ou 3d) quelle que soit la valeur de la "génération de type de ligne". Le second "&=" filtrera les objets pour lesquels un AND logique entre la valeur du code de groupe de l'entité et celle du filtre est égale à la valeur du filtre (cet opérateur est équivalent au précédent si le filtre ne contient qu'un code binaire). '((0 . "POLYLINE") (-4 . "&=") (70 . 9)) filtrera les polylignes 3d (8) fermées (1). -
@Luna, pour rebondir sur la pertinente remarque de @Olivier Eckmann, revois ce sujet et l'opérateur bitwise AND dans les filtres de sélection, je te laisse chercher...
-
Fenetre Presentation dans Espace objet
(gile) a répondu à un(e) sujet de chris32 dans AutoCAD 2020-2024
@lili2006@PHILPHIL C'est peut-être moi qui ait mal compris, mais le LISP de Bred fait exactement l'inverse de celui que j'ai proposé : il crée des fenêtres de présentation à partir de cadres dans l'espace objet. Or il m'a semblé que la demande était de créer des cadres dans l'espace objet correspondant à des fenêtres existant dans l'espace papier. -
Fenetre Presentation dans Espace objet
(gile) a répondu à un(e) sujet de chris32 dans AutoCAD 2020-2024
Salut, Une réponse en LISP. Ça ne correspond peut-être pas exactement à ton cahier des charges (qui est plutôt exigeant) mais libre à toi de peaufiner cette routine. Lancer VP2MS et sélectionner la fenêtre. (defun c:vp2ms (/ ent center width height pts) (if (and (setq ent (car (entsel "\nSélectionnez une fenêtre: "))) (= (cdr (assoc 0 (entget ent))) "VIEWPORT") ) (progn (setq center (getpropertyvalue ent "CenterPoint") width (/ (getpropertyvalue ent "Width") 2.) height (/ (getpropertyvalue ent "Height") 2.) ) (command-s "_.mspace") (setvar 'cvport (getpropertyvalue ent "Number")) (entmake (append (list (cons 0 "LWPOLYLINE") (cons 100 "AcDbEntity") (cons 410 "Model") (cons 8 "VIEWPORTS") (cons 100 "AcDbPolyline") (cons 90 4) (cons 70 1) ) (setq pts (mapcar '(lambda (p) (cons 10 (trans (trans p 3 2) 2 0)) ) (list (list (- (car center) width) (- (cadr center) height)) (list (+ (car center) width) (- (cadr center) height)) (list (+ (car center) width) (+ (cadr center) height)) (list (- (car center) width) (+ (cadr center) height)) ) ) ) ) ) (entmake (list (cons 0 "TEXT") (cons 100 "AcDbEntity") (cons 410 "Model") (cons 8 "VIEWPORTS") (cons 100 "AcDbText") (car pts) (cons 40 (getvar 'textsize)) (cons 1 (getvar 'ctab)) (cons 7 (getvar 'textstyle)) ) ) (command-s "_.pspace") ) ) (princ) ) -
Salut, Vérifie que l'objet sélection est bien une référence de bloc avant de cherche à obtenir le nom de la définition du bloc. (if (and (= (cdr (assoc 0 (entget ent))) "INSERT") (= (getpropertyvalue ent "BlockTableRecord/Name") "01_BA_Rupteur") ) ... )
-
J'imagine que tu as vu ça dans le code source de la page web. Ce que tu vois dans ce "code source" n'est pas ce que j'ai écrit dans Visual Studio, c'est ce qu'à généré Visual Studio à la compilation. En bref, quand tu crées un un nouveau WebForm (avec ou sans page maitre) dans Visual Studio, deux fichiers sont automatiquement créés : un fichier .aspx dans lequel on définit l'apparence de la page avec des balises html et asp (pour les contrôles) et, si besoin des scripts JavaScript ; et un autre fichier .aspx.cs dans lequel une classe est prévue pour écrire le "code behind", autrement dit le fonctionnement des contrôles aspx exécuté côté serveur. C'est la même chose que pour une application WPF (CF ci-dessus), Visual Studio crée automatiquement un fichier .xaml et un fichier .xaml.cs pour le code behind. Le code de la page en aspx dans Visual Studio : <%@ Page Title="" Language="C#" MasterPageFile="~/GileCAD.Master" AutoEventWireup="true" CodeBehind="DimensionsArc.aspx.cs" Inherits="gileCAD.WebForm12" %> <asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server"> </asp:Content> <asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="server"> <script type="text/javascript"> function resetOutput() { ["<%= txtAngle.ClientID %>", "<%= txtArc.ClientID %>", "<%= txtCorde.ClientID %>", "<%= txtFleche.ClientID %>", "<%= txtRayon.ClientID %>"] .forEach((id) => { document.getElementById(id).value = ""; }) } </script> <p id="titre"> Dimensions dans un arc de cercle </p> <div id="dimArcImage"> <asp:TextBox runat="server" ID="txtArc" ClientIDMode="Static" CssClass="output txtArc" Enabled="true" /> <asp:TextBox runat="server" ID="txtCorde" ClientIDMode="Static" CssClass="output txtCorde" Enabled="false" /> <asp:TextBox runat="server" ID="txtAngle" ClientIDMode="Static" CssClass="output txtAngle" Enabled="false" /> <asp:TextBox runat="server" ID="txtFleche" ClientIDMode="Static" CssClass="output txtFleche" Enabled="false" /> <asp:TextBox runat="server" ID="txtRayon" ClientIDMode="Static" CssClass="output txtRayon" Enabled="false" /> <asp:DropDownList runat="server" ID="cboDimension1" CssClass="ddl ddlDim1" onchange="resetOutput()"> <asp:ListItem>Angle</asp:ListItem> <asp:ListItem>Arc</asp:ListItem> <asp:ListItem>Corde</asp:ListItem> <asp:ListItem>Flèche</asp:ListItem> <asp:ListItem>Rayon</asp:ListItem> </asp:DropDownList> <asp:DropDownList runat="server" ID="cboDimension2" CssClass="ddl ddlDim2" onchange="resetOutput()"> <asp:ListItem>Angle</asp:ListItem> <asp:ListItem>Arc</asp:ListItem> <asp:ListItem>Corde</asp:ListItem> <asp:ListItem>Flèche</asp:ListItem> <asp:ListItem>Rayon</asp:ListItem> </asp:DropDownList> <asp:TextBox runat="server" ID="txtDimension1" CssClass="input txtDim1" /> <asp:TextBox runat="server" ID="txtDimension2" CssClass="input txtDim2" /> <asp:Button runat="server" ID="btnCalcul" CssClass="btnCalcul" Text="Calculer" OnClick="btnCalculer_Click" /> <asp:Label runat="server" ID="lblPrecision" CssClass="lblPrecision" Text="Précision :" /> <asp:DropDownList runat="server" ID="ddlPrecision" CssClass="ddl ddlPrecision" AutoPostBack="true" OnSelectedIndexChanged="btnCalculer_Click"> <asp:ListItem Selected="True">0</asp:ListItem> <asp:ListItem>0.0</asp:ListItem> <asp:ListItem>0.00</asp:ListItem> <asp:ListItem>0.000</asp:ListItem> <asp:ListItem>0.0000</asp:ListItem> </asp:DropDownList> </div> </asp:Content>
-
Très certainement, il doit y avoir une dizaine d'années que j'ai fait ça à partir d'exemples glanés dans des tutoriels et depuis, j'ai ajouté des couches sans chercher vraiment à optimiser... En tous cas, merci pour la remarque. Je ne pense pas qu'il soit très judicieux que je publie les codes de cette page web (trop de liens avec le reste du site), mais, pour ceux que ça intéresse, voici ceux d'une application WPF similaire (plus l'exécutable en fichier joint). Le code XAML qui décrit la fenêtre (pendant du HTML/CSS) : <Window x:Class="DimensionsArc.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:DimensionsArc" mc:Ignorable="d" Title="Dimensions dans l'arc de cercle" Height="562" Width="836" ResizeMode="NoResize"> <Window.CommandBindings> <CommandBinding Command="{x:Static local:MainWindow.CalculCmd}" Executed="CalculCmdExecuted" CanExecute="CalculCmdCanExecute" /> </Window.CommandBindings> <Grid Height="533" Width="830"> <Grid.Background> <ImageBrush ImageSource="DimensionsArc.png" Stretch="None" /> </Grid.Background> <Label Content="Précision :" HorizontalAlignment="Left" Margin="50,54,0,0" VerticalAlignment="Top"/> <ComboBox HorizontalAlignment="Left" Margin="118,58,0,0" VerticalAlignment="Top" Width="70" ItemsSource="{Binding Precisions}" SelectedValue="{Binding Format}"/> <TextBlock Margin="429,30,301,470" VerticalAlignment="Center" HorizontalAlignment="Center" Width="60" Background="#FDF6E3" Foreground="#268BD2" TextAlignment="Center" Text="{Binding Arc}" /> <TextBlock Margin="483,128,247,372" VerticalAlignment="Center" HorizontalAlignment="Center" Width="60" Background="#FDF6E3" Foreground="#268BD2" TextAlignment="Center" Text="{Binding Fleche}"/> <TextBlock Margin="425,237,305,263" VerticalAlignment="Center" HorizontalAlignment="Center" Width="60" Background="#FDF6E3" Foreground="#268BD2" TextAlignment="Center" Text="{Binding Corde}"/> <TextBlock Margin="425,312,305,188" VerticalAlignment="Center" HorizontalAlignment="Center" Width="60" Background="#FDF6E3" Foreground="#268BD2" TextAlignment="Center" Text="{Binding Angle}"/> <TextBlock Margin="592,348,138,152" VerticalAlignment="Center" HorizontalAlignment="Center" Width="60" Background="#FDF6E3" Foreground="#268BD2" TextAlignment="Center" Text="{Binding Rayon}"/> <Label Margin="46,309,0,0" VerticalAlignment="Top" HorizontalAlignment="Left" Width="225"> Entrer deux valeurs pour lancer le calcul </Label> <ComboBox Margin="50,348,0,0" VerticalAlignment="Top" HorizontalAlignment="Left" Width="110" ItemsSource="{Binding Dimensions}" SelectedIndex="{Binding TypeDimension1}"/> <ComboBox Margin="50,387,0,0" VerticalAlignment="Top" HorizontalAlignment="Left" Width="110" ItemsSource="{Binding Dimensions}" SelectedIndex="{Binding TypeDimension2}"/> <TextBox Margin="176,349,0,0" VerticalAlignment="Top" HorizontalAlignment="Left" Width="60" TextAlignment="Right" Text="{Binding Dimension1, UpdateSourceTrigger=PropertyChanged}"/> <TextBox Margin="176,388,0,0" VerticalAlignment="Top" HorizontalAlignment="Left" Width="60" TextAlignment="Right" Text="{Binding Dimension2, UpdateSourceTrigger=PropertyChanged}"/> <Button Margin="50,445,0,0" VerticalAlignment="Top" HorizontalAlignment="Left" Width="75" Command="{x:Static local:MainWindow.CalculCmd}">Calculer</Button> </Grid> </Window> Le 'code behind' (C#) avec les calculs : using System.ComponentModel; using System.Linq; using System.Windows; using System.Windows.Input; using static System.Math; namespace DimensionsArc { public enum TypeDimension { Angle, Arc, Corde, Fleche, Rayon } /// <summary> /// Logique d'interaction pour MainWindow.xaml /// </summary> public partial class MainWindow : Window, INotifyPropertyChanged { #region INotifyPropertyChanged public event PropertyChangedEventHandler PropertyChanged; private void NotifyPropertyChanged(string propertyName) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } #endregion; public MainWindow() { InitializeComponent(); DataContext = this; } double angle, arc, corde, fleche, rayon, dim1, dim2; string dimension1, dimension2, format = "0"; bool validDimension1, validDimension2; TypeDimension typeDimension1 = TypeDimension.Corde; TypeDimension typeDimension2 = TypeDimension.Fleche; #region Propriétés (Binding) public string Angle { get { return Degres(angle).ToString(format) + "°"; } set { angle = Radians(double.Parse(value.TrimEnd('°'))); NotifyPropertyChanged(nameof(Angle)); } } public string Arc { get { return arc.ToString(format); } set { arc = double.Parse(value); NotifyPropertyChanged(nameof(Arc)); } } public string Corde { get { return corde.ToString(format); } set { corde = double.Parse(value); NotifyPropertyChanged(nameof(Corde)); } } public string Fleche { get { return fleche.ToString(format); } set { fleche = double.Parse(value); NotifyPropertyChanged(nameof(Fleche)); } } public string Rayon { get { return rayon.ToString(format); } set { rayon = double.Parse(value); NotifyPropertyChanged(nameof(Rayon)); } } public string[] Precisions => new[] { "0", "0.0", "0.00", "0.000", "0.0000" }; public string Format { get { return format; } set { format = value; NotifyPropertyChanged(nameof(Format)); Calculer(); } } public string[] Dimensions => new[] { "Angle (°)", "Longueur d'arc", "Corde", "Flèche", "Rayon" }; public int TypeDimension1 { get { return (int)typeDimension1; } set { typeDimension1 = (TypeDimension)value; Reset(); NotifyPropertyChanged(nameof(TypeDimension1)); } } public int TypeDimension2 { get { return (int)typeDimension2; } set { typeDimension2 = (TypeDimension)value; Reset(); NotifyPropertyChanged(nameof(TypeDimension2)); } } public string Dimension1 { get { return dimension1; } set { dimension1 = value; validDimension1 = double.TryParse(dimension1, out dim1) && 0.0 < dim1 && (typeDimension1 != TypeDimension.Angle || dim1 < 360.0); NotifyPropertyChanged(nameof(Dimension1)); } } public string Dimension2 { get { return dimension2; } set { dimension2 = value; validDimension2 = double.TryParse(dimension2, out dim2) && 0.0 < dim2 && (typeDimension2 != TypeDimension.Angle || dim2 < 360.0); NotifyPropertyChanged(nameof(Dimension2)); } } private void Reset() => Angle = Arc = Corde = Fleche = Rayon = "0"; #endregion #region Command (Binding) public static RoutedCommand CalculCmd = new RoutedCommand(); private void CalculCmdExecuted(object sender, ExecutedRoutedEventArgs e) => Calculer(); private void CalculCmdCanExecute(object sender, CanExecuteRoutedEventArgs e) => e.CanExecute = typeDimension1 != typeDimension2 && validDimension1 && validDimension2; #endregion #region Calculs private void Calculer() { switch (typeDimension1) { case TypeDimension.Angle: angle = Radians(dim1); switch (typeDimension2) { case TypeDimension.Rayon: rayon = dim2; CalculerAngleRayon(); break; case TypeDimension.Arc: arc = dim2; CalculerAngleArc(); break; case TypeDimension.Corde: corde = dim2; CalculerAngleCorde(); break; case TypeDimension.Fleche: fleche = dim2; CalculerAngleFleche(); break; } break; case TypeDimension.Arc: arc = dim1; switch (typeDimension2) { case TypeDimension.Angle: angle = Radians(dim2); CalculerAngleArc(); break; case TypeDimension.Corde: corde = dim2; CalculerArcCorde(); break; case TypeDimension.Fleche: fleche = dim2; CalculerArcFleche(); break; case TypeDimension.Rayon: rayon = dim2; CalculerArcRayon(); break; } break; case TypeDimension.Corde: corde = dim1; switch (typeDimension2) { case TypeDimension.Angle: angle = Radians(dim2); CalculerAngleCorde(); break; case TypeDimension.Arc: arc = dim2; CalculerArcCorde(); break; case TypeDimension.Fleche: fleche = dim2; CalculerCordeFleche(); break; case TypeDimension.Rayon: rayon = dim2; CalculerCordeRayon(); break; } break; case TypeDimension.Fleche: fleche = dim1; switch (typeDimension2) { case TypeDimension.Angle: angle = Radians(dim2); CalculerAngleFleche(); break; case TypeDimension.Arc: arc = dim2; CalculerArcFleche(); break; case TypeDimension.Corde: corde = dim2; CalculerCordeFleche(); break; case TypeDimension.Rayon: rayon = dim2; CalculerFlecheRayon(); break; } break; case TypeDimension.Rayon: rayon = dim1; switch (typeDimension2) { case TypeDimension.Angle: angle = Radians(dim2); CalculerAngleRayon(); break; case TypeDimension.Arc: arc = dim2; CalculerArcRayon(); break; case TypeDimension.Corde: corde = dim2; CalculerCordeRayon(); break; case TypeDimension.Fleche: fleche = dim2; CalculerFlecheRayon(); break; } break; } // affichage des résultats dans la page. var values = new[] { angle, arc, corde, fleche, rayon }; if (values.Any(v => double.IsNaN(v))) { Reset(); } else { Arc = arc.ToString(Format); Corde = corde.ToString(Format); Fleche = fleche.ToString(Format); Rayon = rayon.ToString(Format); Angle = Degres(angle).ToString(Format) + "°"; } } private double Radians(double degres) => degres * PI / 180.0; private double Degres(double radians) => radians * 180.0 / PI; private void CalculerAngleRayon() { arc = angle * rayon; double demiCorde = rayon * Sin(angle * 0.5); corde = 2.0 * demiCorde; fleche = demiCorde * Sin(angle * 0.25); } private void CalculerAngleFleche() { double demiCorde = fleche / Tan(angle * 0.25); corde = 2.0 * demiCorde; rayon = demiCorde / Sin(angle * 0.5); arc = angle * rayon; } private void CalculerAngleCorde() { double demiCorde = corde * 0.5; rayon = demiCorde / Sin(angle * 0.5); fleche = demiCorde * Tan(angle * 0.25); arc = angle * rayon; } private void CalculerAngleArc() { rayon = arc / angle; double demiCorde = rayon * Sin(angle * 0.5); corde = 2.0 * demiCorde; fleche = demiCorde * Tan(angle * 0.25); } private void CalculerFlecheRayon() { double apotheme = rayon - fleche; corde = 2 * Sqrt(rayon * rayon - apotheme * apotheme); angle = 2.0 * Acos(apotheme / rayon); arc = angle * rayon; } private void CalculerCordeRayon() { double demiCorde = corde * 0.5; fleche = rayon - Sqrt(rayon * rayon - demiCorde * demiCorde); angle = 2.0 * Asin(demiCorde / rayon); arc = angle * rayon; } private void CalculerCordeFleche() { double demiCorde = corde * 0.5; angle = 4.0 * Atan2(fleche, demiCorde); rayon = demiCorde / Sin(angle * 0.5); arc = angle * rayon; } private void CalculerArcRayon() { if (2.0 * PI * rayon < arc) { corde = double.NaN; fleche = double.NaN; angle = double.NaN; } else { angle = arc / rayon; corde = 2.0 * rayon * Sin(angle * 0.5); fleche = rayon - rayon * Cos(angle * 0.5); } } private void CalculerArcFleche() { if (0.36230568 * arc < fleche) //(1.138216853 * arc < fleche * PI) { rayon = double.NaN; corde = double.NaN; angle = double.NaN; } else { double k = 2.0 * fleche / arc; double a = 2.0 * k; for (int i = 0; i < 8; i++) { a -= (Cos(a) + k * a - 1.0) / (-Sin(a) + k); } angle = 2.0 * a; rayon = arc / angle; corde = 2.0 * rayon * Sin(a); } } private void CalculerArcCorde() { if (arc <= corde) { rayon = double.NaN; fleche = double.NaN; angle = double.NaN; } else { double k = corde / arc; double a = Sqrt(6.0 - 6.0 * k); for (int i = 0; i < 8; i++) { a -= (Sin(a) - k * a) / (Cos(a) - k); } angle = 2.0 * a; rayon = arc / angle; fleche = rayon - rayon * Cos(a); } } #endregion } } DimensionsArc.zip
-
Merci à vous. @Fraid Je suis vraiment débutant en programmation Web. Je n'ai jamais fait que ce petit site et quelques services web pour tester. J'ai utilisé très peu de JavaScript (trois fonctions dans la page maitre pour changer de thème et une autre dans cette page pour remettre à zéro les résultats quand une liste déroulante est modifiée). Le framework ASP .NET permet des trucs intéressants que j'ai essayé d'utiliser comme l'utilisation d'une "page maitre" et de "pages de contenu" mais le véritable intérêt, c'est la programmation côté serveur (il faut que l'hébergeur permette l'utilisation de ASP .NET). Tous les calculs sont faits en C# dans un fichier .cs séparé (code behind) exactement comme on le fait avec une application Windows ou WPF. Ici ça ne représente pas énormément de code (environ 300 lignes avec les commentaires), mais on peut utiliser toute la puissance de .NET sans que le client n'ait à installer .NET (cette page web est utilisable depuis MAC ou Linux -il risque d'y avoir des problèmes de taille d'affichage avec Android). Et en plus, on fait tout depuis Visual Studio.
-
METTRE LES HACHURES DERRIERE COTES DEVANT
(gile) a répondu à un(e) sujet de PHILPHIL dans Routines LISP
Salut, J'avais proposé un truc qui utilise l'ordre de tracé dans cette réponse. -
Salut, Ce coup ci, rien à voir avec AutoCAD, juste un peu de géométrie. J'ai voulu m'essayer un peu plus sérieusement à ASP .NET (de la programmation web "côté serveur") avec une nouvelle page sur gileCAD qui permet de déterminer les différents dimensions d'un arc de cercle en en spécifiant deux. Côté "vue" (HTML/CSS), placer les composants sur une image depuis le CSS est presque aussi pénible faire une boite de dialogue en DCL. Le wysiwyg de Visual Studio ne fonctionne pas vraiment et j'ai du tout faire par tâtonnements. Je n'ai pu tester que sur Firefox et Edge (IE ne prends pas en charge certaines fonctionnalités du CSS). Côté "programme", j'étais bien plus à l'aise, on fait tout en C# .NET.
-
Salut, Je n'ai pas vraiment suivi ce sujet, mais je me suis souvenu qu'il y a quelques temps déjà j'avais fait : AddVtx&DelVtx en LISP sur cette page et AVX et DVX en .NET sur cette page.
-
Salut, Tu parles de SCU (système de coordonnées) ou de vues ? Parce que le ViewCube, comme son nom l'indique, c'est pour changer de vue. Pour changer de vue (orthogonales et iso), tu peux utiliser le LISP vues_pavé sur cette page.
-
Joli !
-
Inspecter ou modifier un dwg sans ouvrir Autocad en C# ?
(gile) a répondu à un(e) sujet de Fraid dans ObjectARX/DBX, C++, .NET, RealDWG
Quand tu parles d'ObjectDbx, tu parles bien d'ouvrir des fichiers DWG "en mémoire" (pas dans l'éditeur) depuis une session AutoCAD (il y a bien une session AutoCAD ouverte) ? Si c'est le cas, bien sûr qu'on peut le faire en créant une nouvelle instance de Database avec laquelle on "lit le fichier DWG" (Database.ReadDwgFile).
